Files
DocumentServer-v-9.2.0/sdkjs/word/Math/mathText.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

1570 lines
52 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
// Import
var g_oTextMeasurer = AscCommon.g_oTextMeasurer;
// Таблица соответствия кодов ASCII (десятичные, соответствующие восьмеричные, шестнадцатиричные, двоичные, ASCII коды )
// http://www.dpva.info/Guide/GuideMathematics/GuideMathematicsNumericalSystems/TableCodeEquivalent/
var DIV_CENT = 0.1386;
var StartTextElement = 0x2B1A; // Cambria Math
var MathTextInfo_MathText = 1;
var MathTextInfo_SpecialOperator = 2;
var MathTextInfo_NormalText = 3;
function CMathSize()
{
this.Type = MATH_SIZE;
this.width = 0;
this.height = 0;
this.ascent = 0;
}
CMathSize.prototype.SetZero = function()
{
this.width = 0;
this.descent = 0;
this.ascent = 0;
}
CMathSize.prototype.Set = function(size)
{
this.width = size.width;
this.height = size.height;
this.ascent = size.ascent;
};
/**
* @extends {AscWord.CRunElementBase}
* @constructor
*/
function CMathBaseText()
{
AscWord.CRunElementBase.call(this);
this.Type = null;
this.bJDraw = false;
this.value = null;
this.bUpdateGaps = true;
this.bEmptyGapLeft = false;
this.bEmptyGapRight = false;
this.ParaMath = null;
this.Parent = null;
this.Flags = 0;
this.size = new CMathSize();
this.Width = 0; // special for Run размер буквы без Gaps
// в действительности это поле не должно использоваться, нужно использовать функциии GetWidth, Get_Width_2 ,GetWidthVisible
this.pos = new CMathPosition();
this.GapLeft = 0;
this.GapRight = 0;
}
CMathBaseText.prototype = Object.create(AscWord.CRunElementBase.prototype);
CMathBaseText.prototype.constructor = CMathBaseText;
CMathBaseText.prototype.GetWidth = function() // работаем через функцию, т.к. поля GapLeft и GapRight могут измениться из-за изменения переноса, а пересчет (Measure) в этом случае не прийдет
{
var Width = this.size.width;
if(this.bEmptyGapLeft == false)
Width += this.GapLeft;
if(this.bEmptyGapRight == false)
Width += this.GapRight;
return (Width * AscWord.TEXTWIDTH_DIVIDER) | 0;
};
CMathBaseText.prototype.Get_Width2 = function() // работаем через функцию, т.к. поля GapLeft и GapRight могут измениться из-за изменения переноса, а пересчет (Measure) в этом случае не прийдет
{
return ( (this.size.width + this.GapLeft + this.GapRight)* AscWord.TEXTWIDTH_DIVIDER ) | 0;
};
CMathBaseText.prototype.GetWidthVisible = function()
{
var Width = this.size.width;
if(this.bEmptyGapLeft == false)
Width += this.GapLeft;
if(this.bEmptyGapRight == false)
Width += this.GapRight;
return Width;
};
CMathBaseText.prototype.Update_StateGapLeft = function(bState)
{
this.bEmptyGapLeft = bState;
};
CMathBaseText.prototype.Update_StateGapRight = function(bState)
{
this.bEmptyGapRight = bState;
};
CMathBaseText.prototype.GetLocationOfLetter = function()
{
var pos = new CMathPosition();
pos.x = this.pos.x;
pos.y = this.pos.y;
return pos;
};
CMathBaseText.prototype.IsPlaceholder = function()
{
return this.Type == para_Math_Placeholder;
};
CMathBaseText.prototype.IsJustDraw = function()
{
return false;
};
// For ParaRun
CMathBaseText.prototype.IsPunctuation = function()
{
var bPunc = 1 === AscCommon.g_aPunctuation[this.value],
bMathSign = this.value == 0x2217 || this.value == 0x2212;
return bPunc || bMathSign;
};
CMathBaseText.prototype.IsNBSP = function()
{
return false;
};
CMathBaseText.prototype.CanAddNumbering = function()
{
return true;
};
CMathBaseText.prototype.Draw_Elements = function(PDSE) // эта функция необходима для Draw_Elements основания Nary, когда в основании находится только JustDraw элемент
{
var PosLine = this.ParaMath.GetLinePosition(PDSE.Line, PDSE.Range);
this.Draw(PosLine.x, PosLine.y, PDSE.Graphics);
};
CMathBaseText.prototype.SetUpdateGaps = function(bUpd)
{
this.bUpdateGaps = bUpd;
};
CMathBaseText.prototype.IsNeedUpdateGaps = function()
{
return this.bUpdateGaps;
};
CMathBaseText.prototype.ToSearchElement = function(oProps)
{
return null;
};
/**
*
* @param bJDraw
* @constructor
* @extends {CMathBaseText}
*/
function CMathText(bJDraw)
{
CMathBaseText.call(this);
this.Type = para_Math_Text;
this.bJDraw = (undefined === bJDraw ? false : bJDraw);
this.RecalcInfo =
{
StyleCode: null,
bAccentIJ: false,
bSpaceSpecial: false,
bApostrophe: false,
bSpecialOperator: false
};
this.rasterOffsetX = 0;
this.rasterOffsetY = 0;
this.FontSlot = AscWord.fontslot_ASCII;
// TO DO
// убрать
/*this.transform =
{
sx: 1,
shy: 0,
shx: 0,
sy: 1
};*/
}
CMathText.prototype = Object.create(CMathBaseText.prototype);
CMathText.prototype.constructor = CMathText;
CMathText.prototype.add = function(code)
{
this.value = code;
if (AscFonts.IsCheckSymbols)
AscFonts.FontPickerByCharacter.getFontBySymbol(this.value);
if( this.private_Is_BreakOperator(code) )
this.Type = para_Math_BreakOperator;
};
CMathText.prototype.addTxt = function(txt)
{
var code = txt.charCodeAt(0);
this.add(code);
};
CMathText.prototype.getCodeChr = function()
{
return this.value;
};
CMathText.prototype.private_getCode = function()
{
var code = this.value;
var bNormal = this.bJDraw ? null : this.Parent.IsNormalText();
if(this.Type === para_Math_Placeholder || this.bJDraw || bNormal)
return code;
var Compiled_MPrp = this.Parent.GetCompiled_ScrStyles();
var bAccent = this.Parent.IsAccent();
var bCapitale = (code > 0x0040 && code < 0x005B),
bSmall = (code > 0x0060 && code < 0x007b),
bDigit = (code > 0x002F && code < 0x003A);
var bCapGreek = (code > 0x0390 && code < 0x03AA),
bSmallGreek = (code > 0x03B0 && code < 0x03CA);
var Scr = Compiled_MPrp.scr,
Sty = Compiled_MPrp.sty;
// Mathematical Alphanumeric Characters
// http://www.w3.org/TR/2014/REC-xml-entity-names-20140410/Overview.html#alphabets
if (code == 0x2061) // \funcapply
code = 8196;
else if(code == 0x2A) // "*"
code = 0x2217;
else if(code == 0x2D) // "-"
code = 0x2212;
else if(!bNormal && code == 0x27) // " ' "
code = 0x2032;
else if(Scr == TXT_ROMAN)
{
if(Sty == STY_ITALIC)
{
if(code == 0x68) // h
code = 0x210E;
/*else if((code == 0x69 && bAccent) || code == 0x131) // "i" with dot || "i" dotless plain => "i" dotless italic
code = 0x1D6A4;
else if((code == 0x6A && bAccent) ||code == 0x237) // "j" with dot || "j" dotless plain => "j" dotless italic
code = 0x1D6A5;*/
else if(code == 0x69 && bAccent)
code = 2835;
else if(code == 0x6A && bAccent)
code = 2836;
else if(bCapitale)
code = code + 0x1D3F3;
else if(bSmall)
code = code + 0x1D3ED;
else if(code == 0x3F4) // Capital THETA special
code = 0x1D6F3;
else if(code == 0x2207) // Capital NABLA
code = 0x1D6FB;
else if(bCapGreek)
code = code + 0x1D351;
else if(bSmallGreek)
code = code + 0x1D34B;
else if(code == 0x2202) // PARTIAL DIFFERENTIAL
code = 0x1D715;
else if(code == 0x3F5) // small EPSILON
code = 0x1D716;
else if(code == 0x3D1) // small THETA
code = 0x1D717;
else if(code == 0x3F0) // small KAPPA
code = 0x1D718;
else if(code == 0x3D5) // small PHI
code = 0x1D719;
else if(code == 0x3F1) // small RHO
code = 0x1D71A;
else if(code == 0x3D6) // small PI
code = 0x1D71B;
}
else if(Sty == STY_BI)
{
if(code == 0x69 && bAccent)
code = 2841;
else if(code == 0x6A && bAccent)
code = 2842;
else if(bCapitale)
code = code + 0x1D427;
else if(bSmall)
code = code + 0x1D421;
else if(bDigit)
code = code + 0x1D79E;
else if(code == 0x3F4) // Capital THETA special
code = 0x1D72D;
else if(code == 0x2207) // Capital NABLA
code = 0x1D735;
else if(bCapGreek)
code = code + 0x1D38B;
else if(bSmallGreek)
code = code + 0x1D385;
else if(code == 0x2202) // PARTIAL DIFFERENTIAL
code = 0x1D74F;
else if(code == 0x3F5) // small EPSILON
code = 0x1D750;
else if(code == 0x3D1) // small THETA
code = 0x1D751;
else if(code == 0x3F0) // small KAPPA
code = 0x1D752;
else if(code == 0x3D5) // small PHI
code = 0x1D753;
else if(code == 0x3F1) // small RHO
code = 0x1D754;
else if(code == 0x3D6) // small PI
code = 0x1D755;
}
else if(Sty == STY_BOLD)
{
if(code == 0x69 && bAccent)
code = 2829;
else if(code == 0x6A && bAccent)
code = 2830;
else if(bCapitale)
code = code + 0x1D3BF;
else if(bSmall)
code = code + 0x1D3B9;
else if(bDigit)
code = code + 0x1D79E;
else if(code == 0x3F4) // Capital THETA special
code = 0x1D6B9;
else if(code == 0x2207) // Capital NABLA
code = 0x1D6C1;
else if(bCapGreek)
code = code + 0x1D317;
else if(bSmallGreek)
code = code + 0x1D311;
else if(code == 0x2202) // PARTIAL DIFFERENTIAL
code = 0x1D6DB;
else if(code == 0x3F5) // small EPSILON
code = 0x1D6DC;
else if(code == 0x3D1) // small THETA
code = 0x1D6DD;
else if(code == 0x3F0) // small KAPPA
code = 0x1D6DE;
else if(code == 0x3D5) // small PHI
code = 0x1D6DF;
else if(code == 0x3F1) // small RHO
code = 0x1D6E0;
else if(code == 0x3D6) // small PI
code = 0x1D6E1;
else if(code == 0x3DC) // CAPITAL DIGAMMA
code = 0x1D7CA;
else if(code == 0x3DD) // SMALL DIGAMMA
code = 0x1D7CB;
}
else // PLAIN
{
if(bAccent)
{
/*if(code == 0x69) // "i" with dot => "i" dotless plain
code = 0x131;
else if(code == 0x6A) // "j" with dot => "j" dotless plain
code = 0x237;*/
if(code == 0x69 && bAccent)
code = 199;
else if(code == 0x6A && bAccent)
code = 2828;
}
}
}
else if(Scr == TXT_DOUBLE_STRUCK)
{
if(code == 0x69 && bAccent)
code = 2851;
else if(code == 0x6A && bAccent)
code = 2852;
else if(code == 0x43) // C
code = 0x2102;
else if(code == 0x48) // H
code = 0x210D;
else if(code == 0x4E) // N
code = 0x2115;
else if(code == 0x50) // P
code = 0x2119;
else if(code == 0x51) // Q
code = 0x211A;
else if(code == 0x52) // R
code = 0x211D;
else if(code == 0x5A) // Z
code = 0x2124;
else if(bCapitale)
code = code + 0x1D4F7;
else if(bSmall)
code = code + 0x1D4F1;
else if(bDigit)
code = code + 0x1D7A8;
// arabic mathematical symbols
else if(code == 0x628)
code = 0x1EEA1;
else if(code == 0x062C)
code = 0x1EEA2;
else if(code == 0x062F)
code = 0x1EEA3;
else if(code == 0x0648)
code = 0x1EEA5;
else if(code == 0x0632)
code = 0x1EEA6;
else if(code == 0x062D)
code = 0x1EEA7;
else if(code == 0x0637)
code = 0x1EEA8;
else if(code == 0x064A)
code = 0x1EEA9;
else if(code == 0x0644)
code = 0x1EEAB;
else if(code == 0x0645)
code = 0x1EEAC;
else if(code == 0x0646)
code = 0x1EEAD;
else if(code == 0x0633)
code = 0x1EEAE;
else if(code == 0x0639)
code = 0x1EEAF;
else if(code == 0x0641)
code = 0x1EEB0;
else if(code == 0x0635)
code = 0x1EEB1;
else if(code == 0x0642)
code = 0x1EEB2;
else if(code == 0x0631)
code = 0x1EEB3;
else if(code == 0x0634)
code = 0x1EEB4;
else if(code == 0x062A)
code = 0x1EEB5;
else if(code == 0x062B)
code = 0x1EEB6;
else if(code == 0x062E)
code = 0x1EEB7;
else if(code == 0x0630)
code = 0x1EEB8;
else if(code == 0x0636)
code = 0x1EEB9;
else if(code == 0x0638)
code = 0x1EEBA;
else if(code == 0x063A)
code = 0x1EEBB;
}
else if(Scr == TXT_MONOSPACE)
{
if(code == 0x69 && bAccent)
code = 4547;
else if(code == 0x6A && bAccent)
code = 4548;
else if(bCapitale)
code = code + 0x1D62F;
else if(bSmall)
code = code + 0x1D629;
else if(bDigit)
code = code + 0x1D7C6;
}
else if(Scr == TXT_FRAKTUR)
{
if(Sty == STY_BOLD ||Sty == STY_BI)
{
if(code == 0x69 && bAccent)
code = 2849;
else if(code == 0x6A && bAccent)
code = 2850;
else if(bCapitale)
code = code + 0x1D52B;
else if(bSmall)
code = code + 0x1D525;
}
else
{
if(code == 0x69 && bAccent)
code = 2847;
else if(code == 0x6A && bAccent)
code = 2848;
else if(code == 0x43) // C
code = 0x212D;
else if(code == 0x48) // H
code = 0x210C;
else if(code == 0x49) // I
code = 0x2111;
else if(code == 0x52) // R
code = 0x211C;
else if(code == 0x5A) // Z
code = 0x2128;
else if(bCapitale)
code = code + 0x1D4C3;
else if(bSmall)
code = code + 0x1D4BD;
}
}
else if(Scr == TXT_SANS_SERIF)
{
if(Sty == STY_ITALIC)
{
if(code == 0x69 && bAccent)
code = 2857;
else if(code == 0x6A && bAccent)
code = 2858;
else if(bCapitale)
code = code + 0x1D5C7;
else if(bSmall)
code = code + 0x1D5C1;
else if(bDigit)
code = code + 0x1D7B2;
}
else if(Sty == STY_BOLD)
{
if(code == 0x69 && bAccent)
code = 2855;
else if(code == 0x6A && bAccent)
code = 2856;
else if(bCapitale)
code = code + 0x1D593;
else if(bSmall)
code = code + 0x1D58D;
else if(bDigit)
code = code + 0x1D7BC;
else if(code == 0x3F4) // Capital THETA special
code = 0x1D767;
else if(code == 0x2207) // Capital NABLA
code = 0x1D76F;
else if(bCapGreek)
code = code + 0x1D3C5;
else if(bSmallGreek)
code = code + 0x1D3BF;
else if(code == 0x2202) // PARTIAL DIFFERENTIAL
code = 0x1D789;
else if(code == 0x3F5) // small EPSILON
code = 0x1D78A;
else if(code == 0x3D1) // small THETA
code = 0x1D78B;
else if(code == 0x3F0) // small KAPPA
code = 0x1D78C;
else if(code == 0x3D5) // small PHI
code = 0x1D78D;
else if(code == 0x3F1) // small RHO
code = 0x1D78E;
else if(code == 0x3D6) // small PI
code = 0x1D78F;
}
else if(Sty == STY_BI)
{
if(code == 0x69 && bAccent)
code = 2859;
else if(code == 0x6A && bAccent)
code = 2860;
else if(bCapitale)
code = code + 0x1D5FB;
else if(bSmall)
code = code + 0x1D5F5;
else if(bDigit)
code = code + 0x1D7BC;
else if(code == 0x3F4) // Capital THETA special
code = 0x1D7A1;
else if(code == 0x2207) // Capital NABLA
code = 0x1D7A9;
else if(bCapGreek)
code = code + 0x1D3FF;
else if(bSmallGreek)
code = code + 0x1D3F9;
else if(code == 0x2202) // PARTIAL DIFFERENTIAL
code = 0x1D7C3;
else if(code == 0x3F5) // small EPSILON
code = 0x1D7C4;
else if(code == 0x3D1) // small THETA
code = 0x11D7C5;
else if(code == 0x3F0) // small KAPPA
code = 0x1D7C6;
else if(code == 0x3D5) // small PHI
code = 0x1D7C7;
else if(code == 0x3F1) // small RHO
code = 0x1D7C8;
else if(code == 0x3D6) // small PI
code = 0x1D7C9;
}
else
{
if(code == 0x69 && bAccent)
code = 2853;
else if(code == 0x6A && bAccent)
code = 2854;
else if(bCapitale)
code = code + 0x1D55F;
else if(bSmall)
code = code + 0x1D559;
else if(bDigit)
code = code + 0x1D7B2;
}
}
else if(Scr == TXT_SCRIPT)
{
if(Sty == STY_ITALIC || Sty == STY_PLAIN)
{
if(code == 0x69 && bAccent)
code = 2843;
else if(code == 0x6A && bAccent)
code = 2844;
else if(code == 0x42) // B
code = 0x212C;
else if(code == 0x45) // E
code = 0x2130;
else if(code == 0x46) // F
code = 0x2131;
else if(code == 0x48) // H
code = 0x210B;
else if(code == 0x49) // I
code = 0x2110;
else if(code == 0x4C) // L
code = 0x2112;
else if(code == 0x4D) // M
code = 0x2133;
else if(code == 0x52) // R
code = 0x211B;
else if(code == 0x65) // e
code = 0x212F;
else if(code == 0x67) // g
code = 0x210A;
else if(code == 0x6F) // o
code = 0x2134;
else if(bCapitale)
code = code + 0x1D45B;
else if(bSmall)
code = code + 0x1D455;
}
else
{
if(code == 0x69 && bAccent)
code = 2845;
else if(code == 0x6A && bAccent)
code = 2846;
else if(bCapitale)
code = code + 0x1D48F;
else if(bSmall)
code = code + 0x1D489;
}
}
return code;
};
CMathText.prototype.SetPlaceholder = function()
{
this.Type = para_Math_Placeholder;
this.value = StartTextElement;
};
CMathText.prototype.IsAccent = function ()
{
return AscMath.MathLiterals.accent.SearchU[String.fromCharCode(this.value)] != undefined;
}
CMathText.prototype.Measure = function(oMeasure, TextPr, InfoMathText)
{
/*
var metricsTxt = g_oTextMeasurer.Measure2Code(letter);
var _width = metricsTxt.Width;
height = g_oTextMeasurer.GetHeight();
*/
var metricsTxt;
// measure
if(this.bJDraw)
{
// Font выставляется на соответствующей функции SetFont в родительском классе (в общем случае в CMathBase)
this.RecalcInfo.StyleCode = this.value;
metricsTxt = oMeasure.Measure2Code(this.value);
}
else
{
var ascent, width, height, descent;
var letter = this.private_getCode();
this.FontSlot = InfoMathText.GetFontSlot(letter); // возвращает AscWord.fontslot_ASCII || AscWord.fontslot_EastAsia || AscWord.fontslot_CS || AscWord.fontslot_HAnsi
// в не математическом тексте i и j не подменяются на i и j без точек
var bAccentIJ = !InfoMathText.bNormalText && this.Parent.IsAccent() && (this.value == 0x69 || this.value == 0x6A);
this.RecalcInfo.StyleCode = letter;
this.RecalcInfo.bAccentIJ = bAccentIJ;
var bApostrophe = 1 == q_Math_Apostrophe[letter] && this.bJDraw == false;
if(bAccentIJ)
oMeasure.SetStringGid(true);
else if( InfoMathText.NeedUpdateFont(letter, this.FontSlot, this.IsPlaceholder(), bApostrophe) )
{
if (this.Parent.Pr.SmallCaps || this.Parent.Pr.Caps)
{
let symbol;
if (this.Parent.Pr.SmallCaps || this.Parent.Pr.Caps)
{
symbol = String.fromCharCode(this.value).toUpperCase();
}
letter = symbol.charCodeAt(0);
this.RecalcInfo.StyleCode = letter;
InfoMathText.bApostrophe = false;
var FontKoef = InfoMathText.GetFontKoef(this.FontSlot);
g_oTextMeasurer.SetFontSlot(this.FontSlot, FontKoef);
}
else
{
g_oTextMeasurer.SetFont(InfoMathText.Font);
}
//g_oTextMeasurer.SetTextPr(InfoTextPr.CurrentTextPr, InfoTextPr.Theme);
}
else if(InfoMathText.CurrType == MathTextInfo_NormalText)
{
letter = this.value;
this.RecalcInfo.StyleCode = letter;
InfoMathText.bApostrophe = false;
var FontKoef = InfoMathText.GetFontKoef(this.FontSlot);
g_oTextMeasurer.SetFontSlot(this.FontSlot, FontKoef);
}
this.RecalcInfo.bApostrophe = InfoMathText.bApostrophe;
this.RecalcInfo.bSpaceSpecial = letter == 0x2061;
metricsTxt = oMeasure.MeasureCode(letter);
if(bAccentIJ)
oMeasure.SetStringGid(false);
}
if(this.RecalcInfo.bApostrophe)
{
width = metricsTxt.Width;
height = metricsTxt.Height;
InfoMathText.NeedUpdateFont(0x1D44E, this.FontSlot, false, false); // a
g_oTextMeasurer.SetFont(InfoMathText.Font);
var metricsA = oMeasure.MeasureCode(0x1D44E); // a
this.rasterOffsetY = metricsA.Height - metricsTxt.Ascent; // смещение для позиции
ascent = metricsA.Height;
}
// else if(this.RecalcInfo.bSpaceSpecial) // show funcapply
// {
// width = 0;
// height = 0;
// ascent = 0;
// }
else
{
// смещения
this.rasterOffsetX = metricsTxt.rasterOffsetX;
this.rasterOffsetY = metricsTxt.rasterOffsetY;
ascent = metricsTxt.Ascent;
descent = (metricsTxt.Height - metricsTxt.Ascent);
height = ascent + descent;
if(this.bJDraw)
width = metricsTxt.WidthG;
else
width = metricsTxt.Width;
}
this.size.width = width;
this.size.height = height;
this.size.ascent = ascent;
this.Width = (this.size.width * AscWord.TEXTWIDTH_DIVIDER) | 0;
};
CMathText.prototype.PreRecalc = function(Parent, ParaMath)
{
this.ParaMath = ParaMath;
if(!this.bJDraw)
this.Parent = Parent;
else
this.Parent = null;
this.bUpdateGaps = false;
};
CMathText.prototype.Draw = function(x, y, pGraphics, InfoTextPr)
{
// bug 46069
// 0x200C has a non-empty glyph in CambriaMath
if (this.value === 0x200C)
return;
// CMathText may not always have a parent (base of CNary etc.)
if (this.Parent && this.Parent.getYOffset)
y -= this.Parent.getYOffset();
var X = this.pos.x + x,
Y = this.pos.y + y;
if(this.bEmptyGapLeft == false)
X += this.GapLeft;
/*var tx = 0;
var ty = 0;
var x = (X*sy - Y*shx - tx*sy)/(sx*sy- shy*shx);
var y = (Y - x*shy - ty*shx)/sy;*/
/*var invert = new CMatrix();
invert.sx = this.transform.sx;
invert.sy = this.transform.sy;
invert.shx = this.transform.shx;
invert.shy = this.transform.shy;
invert.tx = 0;
invert.ty = 0;
invert.Invert();
var xx = invert.TransformPointX(X, Y);
var yy = invert.TransformPointY(X, Y);
var sx = this.transform.sx, shx = this.transform.shx,
shy = this.transform.shy, sy = this.transform.sy;
pGraphics.transform(sx, shy, shx, sy, 0, 0);*/
if (pGraphics.m_bIsTextDrawer)
{
pGraphics.CheckAddNewPath(X, Y, this);
}
if(this.bJDraw)
{
pGraphics.FillTextCode(X, Y, this.RecalcInfo.StyleCode); //на отрисовку символа отправляем положение baseLine
}
else if(this.RecalcInfo.bSpaceSpecial == false)
{
if( InfoTextPr.NeedUpdateFont(this.RecalcInfo.StyleCode, this.FontSlot, this.IsPlaceholder(), this.RecalcInfo.bApostrophe) )
{
pGraphics.SetFont(InfoTextPr.Font);
//pGraphics.SetTextPr(InfoTextPr.CurrentTextPr, InfoTextPr.Theme);
}
else if(InfoTextPr.CurrType == MathTextInfo_NormalText)
{
var FontKoef = InfoTextPr.GetFontKoef(this.FontSlot);
pGraphics.SetFontSlot(this.FontSlot, FontKoef);
}
if (this.RecalcInfo.bAccentIJ)
{
pGraphics.tg(this.RecalcInfo.StyleCode, X, Y);
}
else if (Asc.editor.ShowParaMarks && (this.value === 8195 || this.value === 8194 || this.value === 160))
{
let widthOfCircle = g_oTextMeasurer.MeasureCode(176).Width / 2;
pGraphics.FillTextCode(X + this.size.width / 2 - widthOfCircle, Y, 176);
pGraphics.FillTextCode(X, Y, this.value);
}
else if (Asc.editor.ShowParaMarks && this.value === 8197) //draw \thicksp
{
// for some reason, word does not use a Unicode character for "Four-Per-Em Space", but a drawn rectangle
pGraphics.FillTextCode(X + this.size.width, Y, this.value)
let heightOfRect = this.size.width * 3;
let penW = 0.02;
let nWidth = this.size.width;
let nShrinkWidth = nWidth * 0.9;
let nPadding = (nWidth - nShrinkWidth) / 2;
let x1 = X + nPadding;
let x2 = X + nShrinkWidth + nPadding;
let y1 = Y;
let y2 = y - heightOfRect;
pGraphics.drawHorLine(0, y1, x1, x2, penW);
pGraphics.drawHorLine(0, y2, x1, x2, penW);
pGraphics.drawVerLine(0, x1, y1, y2, penW);
pGraphics.drawVerLine(0, x2, y1, y2, penW);
}
else
{
let strOriginal = String.fromCharCode(this.value);
let strUpper = strOriginal.toUpperCase();
let strLower = strOriginal.toLowerCase();
let nUpperStr = strUpper.charCodeAt(0);
let nLowerStr = strLower.charCodeAt(0);
if (InfoTextPr.TextPr.Caps && nUpperStr !== this.value)
{
pGraphics.FillTextCode(X, Y, nUpperStr);
}
else if (InfoTextPr.TextPr.SmallCaps
&& this.value !== nUpperStr
&& this.value === nLowerStr)
{
pGraphics.SetFontSlot(this.FontSlot, smallcaps_Koef);
pGraphics.FillTextCode(X, Y, nUpperStr);
}
else
{
// на отрисовку символа отправляем положение baseLine
pGraphics.FillTextCode(X, Y, this.RecalcInfo.StyleCode);
}
}
}
};
CMathText.prototype.setPosition = function(pos)
{
if(this.RecalcInfo.bApostrophe == true)
{
this.pos.x = pos.x;
this.pos.y = pos.y - this.rasterOffsetY;
}
else if (this.bJDraw == false) // for text
{
this.pos.x = pos.x;
this.pos.y = pos.y;
}
else // for symbol only drawing
{
this.pos.x = pos.x - this.rasterOffsetX;
this.pos.y = pos.y - this.rasterOffsetY + this.size.ascent;
}
};
CMathText.prototype.GetLocationOfLetter = function()
{
var pos = new CMathPosition();
if(this.RecalcInfo.bApostrophe)
{
pos.x = this.pos.x;
pos.y = this.pos.y - this.size.ascent;
}
else
{
pos.x = this.pos.x;
pos.y = this.pos.y;
}
return pos;
};
/**
* Get first find parent typeof CMathContent or MathBase
* @return {*}
*/
CMathText.prototype.GetMathBaseFirst = function()
{
return this.Parent.GetMathBaseFirst();
};
CMathText.prototype.Is_InclineLetter = function()
{
var code = this.value;
var bCapitale = (code > 0x0040 && code < 0x005B),
bSmall = (code > 0x0060 && code < 0x007b) || code == 0x131 || code == 0x237;
var bCapGreek = (code > 0x0390 && code < 0x03AA),
bSmallGreek = (code > 0x03B0 && code < 0x03CA);
var bAlphabet = bCapitale || bSmall || bCapGreek || bSmallGreek;
var MPrp = this.Parent.GetCompiled_ScrStyles();
var bRomanSerif = (MPrp.sty == STY_BI || MPrp.sty == STY_ITALIC) && (MPrp.scr == TXT_ROMAN || MPrp.scr == TXT_SANS_SERIF),
bScript = MPrp.scr == TXT_SCRIPT;
return bAlphabet && (bRomanSerif || bScript);
};
CMathText.prototype.IsJustDraw = function()
{
return this.bJDraw;
};
CMathText.prototype.relate = function(Parent)
{
this.Parent = Parent;
};
CMathText.prototype.IsAlignPoint = function()
{
return false;
};
CMathText.prototype.IsMathText = function()
{
return true;
};
CMathText.prototype.IsCombiningMark = function()
{
return AscWord.isCombiningMark(this.value);
};
CMathText.prototype.IsBreakOperator = function ()
{
return this.private_Is_BreakOperator(this.value);
};
CMathText.prototype.private_Is_BreakOperator = function(val)
{
var rOper = q_Math_BreakOperators[val];
return rOper == 1 || rOper == 2;
};
CMathText.prototype.Is_CompareOperator = function()
{
return q_Math_BreakOperators[this.value] == 2;
};
CMathText.prototype.Is_LeftBracket = function()
{
return this.value == 0x28 || this.value == 0x7B || this.value == 0x5B || this.value == 0x27E8 || this.value == 0x230A || this.value == 0x2308 || this.value == 0x27E6 || this.value == 0x2329;
};
CMathText.prototype.Is_RightBracket = function()
{
return this.value == 0x29 || this.value == 0x7D || this.value == 0x5D || this.value == 0x27E9 || this.value == 0x230B || this.value == 0x2309 || this.value == 0x27E7 || this.value == 0x232A;
};
CMathText.prototype.IsNBSP = function()
{
let strValue = String.fromCharCode(this.value);
return AscMath.MathLiterals.space.SearchU(strValue);
};
CMathText.prototype.SetParent = function (oParent)
{
if (!oParent)
return;
this.Parent = oParent;
}
////
CMathText.prototype.setCoeffTransform = function(sx, shx, shy, sy)
{
this.transform = {sx: sx, shx: shx, shy: shy, sy: sy};
//здесь надо будет по-другому считать размер, после трансформации размер будет выставляться в g_oTextMeasurer
//
//MathControl.pGraph.transform(sx, shy, shx, sy, 0, 0);
this.applyTransformation();
};
CMathText.prototype.applyTransformation = function()
{
var sx = this.transform.sx, shx = this.transform.shx,
shy = this.transform.shy, sy = this.transform.sy;
sy = (sy < 0) ? -sy : sy;
this.size.width = this.size.width*sx + (-1)*this.size.width*shx;
this.size.height = this.size.height*sy + this.size.height*shy;
this.size.ascent = this.size.ascent*(sy + shy);
this.size.descent = this.size.descent*(sy + shy);
this.size.center = this.size.center*(sy + shy);
};
CMathText.prototype.Copy = function()
{
var NewLetter = new CMathText(this.bJDraw);
NewLetter.Type = this.Type;
NewLetter.value = this.value;
return NewLetter;
};
CMathText.prototype.Write_ToBinary = function(Writer)
{
// Пишем тип дла раза, 1 раз для общей функции чтения, второй раз
// для разделения обычного MathText от PlaceHolder
Writer.WriteLong(this.Type);
// Long : Type
// Long : value
Writer.WriteLong(this.Type);
Writer.WriteLong(this.value) ;
};
CMathText.prototype.Read_FromBinary = function(Reader)
{
this.Type = Reader.GetLong();
this.value = Reader.GetLong();
if (AscFonts.IsCheckSymbols)
AscFonts.FontPickerByCharacter.getFontBySymbol(this.value);
};
CMathText.prototype.GetFontSlot = function()
{
return this.FontSlot;
};
CMathText.prototype.ToSearchElement = function(oProps)
{
var nCodePoint = this.value;
if (undefined === nCodePoint || null === nCodePoint)
return null;
if (oProps.IsMatchCase())
return new AscCommonWord.CSearchTextItemChar(String.fromCodePoint(nCodePoint).toLowerCase().codePointAt(0));
return new AscCommonWord.CSearchTextItemChar(nCodePoint);
};
CMathText.prototype.GetTextOfElement = function(oMathText)
{
oMathText = new AscMath.MathTextAndStyles(oMathText);
if (this.value && this.value !== 11034)
{
let strValue = AscCommon.encodeSurrogateChar(this.value);
if (oMathText.IsLaTeX())
{
let strMath = AscMath.SymbolsToLaTeX[strValue];
if (strMath)
strValue = strMath;
}
let oText = new AscMath.MathText(strValue, this.Parent)
oMathText.AddText(oText);
}
return oMathText;
};
CMathText.prototype.GetCodePoint = function()
{
return this.value;
};
/*CMathText.prototype.Recalculate_Reset = function(StartRange, StartLine, PRS)
{
var bNotUpdate = PRS !== null && PRS!== undefined && PRS.bFastRecalculate == true;
if(bNotUpdate == false)
{
this.StartLine = StartLine;
this.StartRange = StartRange;
this.protected_ClearLines();
}
};
CMathText.prototype.Recalculate_Range = function(PRS, ParaPr, Depth)
{
var CurLine = PRS.Line - this.StartLine;
var CurRange = ( 0 === CurLine ? PRS.Range - this.StartRange : PRS.Range );
var RangeStartPos = this.protected_AddRange(CurLine, CurRange);
this.protected_FillRange(CurLine, CurRange, RangeStartPos, RangeEndPos);
};*/
/**
*
* @constructor
* @extends {CMathBaseText}
*/
function CMathAmp()
{
CMathBaseText.call(this);
this.bAlignPoint = false;
this.Type = para_Math_Ampersand;
this.value = 0x26;
if (AscFonts.IsCheckSymbols)
AscFonts.FontPickerByCharacter.getFontBySymbol(this.value);
this.AmpText = new CMathText(false);
this.AmpText.add(this.value);
}
CMathAmp.prototype = Object.create(CMathBaseText.prototype);
CMathAmp.prototype.constructor = CMathAmp;
CMathAmp.prototype.Measure = function(oMeasure, TextPr, InfoMathText)
{
this.bAlignPoint = InfoMathText.bEqArray == true && InfoMathText.bNormalText == false;
this.AmpText.Measure(oMeasure, TextPr, InfoMathText);
if(this.bAlignPoint)
{
this.size.width = 0;
this.size.ascent = 0;
this.size.height = 0;
}
else
{
this.size.width = this.AmpText.size.width;
this.size.height = this.AmpText.size.height;
this.size.ascent = this.AmpText.size.ascent;
}
this.Width = (this.size.width * AscWord.TEXTWIDTH_DIVIDER) | 0;
};
CMathAmp.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI)
{
this.Parent = Parent;
this.AmpText.PreRecalc(Parent, ParaMath, ArgSize, RPI);
this.bUpdateGaps = false;
};
CMathAmp.prototype.getCodeChr = function()
{
var code = null;
if(!this.bAlignPoint)
code = this.AmpText.getCodeChr();
return code;
};
CMathAmp.prototype.IsMathText = function()
{
return !this.bAlignPoint;
};
CMathAmp.prototype.setPosition = function(pos)
{
this.pos.x = pos.x;
this.pos.y = pos.y;
if(this.bAlignPoint == false)
this.AmpText.setPosition(pos);
};
CMathAmp.prototype.relate = function(Parent)
{
this.Parent = Parent;
this.AmpText.relate(Parent);
};
CMathAmp.prototype.Draw = function(x, y, pGraphics, InfoTextPr)
{
if(this.bAlignPoint == false)
this.AmpText.Draw(x + this.GapLeft, y, pGraphics, InfoTextPr);
else if(Asc.editor.ShowParaMarks) // показать метки выравнивания, если включена отметка о знаках параграфа
{
var X = x + this.pos.x + this.GetWidthVisible(),
Y = y + this.pos.y,
Y2 = y + this.pos.y - this.AmpText.size.height;
pGraphics.drawVerLine(0, X, Y, Y2, 0.1);
}
};
CMathAmp.prototype.Is_InclineLetter = function()
{
return false;
};
CMathAmp.prototype.IsAlignPoint = function()
{
return this.bAlignPoint;
};
CMathAmp.prototype.Copy = function()
{
return new CMathAmp();
};
CMathAmp.prototype.SetParent = function (oParent)
{
if (!oParent)
return;
this.Parent = oParent;
}
CMathAmp.prototype.Write_ToBinary = function(Writer)
{
// Long : Type
Writer.WriteLong( this.Type );
};
CMathAmp.prototype.Read_FromBinary = function(Reader)
{
};
CMathAmp.prototype.GetTextOfElement = function(oMathText)
{
oMathText = new AscMath.MathTextAndStyles(oMathText);
let strAmp = this.bAlignPoint ? "" : "&";
let oAmpText = new AscMath.MathText(strAmp, this.Parent ? this.Parent : oMathText.GetFirstStyle());
oMathText.AddText(oAmpText);
return oMathText;
};
function CMathInfoTextPr(InfoTextPr)
{
this.CurrType = -1; // в первый раз Font всегда выставляем
this.TextPr = InfoTextPr.TextPr;
this.ArgSize = InfoTextPr.ArgSize;
this.bApostrophe = false;
this.Font =
{
FontFamily: {Name: "Cambria Math", Index : -1},
FontSize: this.TextPr.FontSize,
Italic: false,
Bold: false
};
this.bNormalText = InfoTextPr.bNormalText;
this.bEqArray = InfoTextPr.bEqArray;
this.RFontsCompare = [];
// скопируем эти свойства для SetFontSlot
// для SpecialOperator нужны уже скомпилированные для мат текста текстовые настройки, поэтому важно эи свойства скопировать именно здесь, а не передавать в MathText обычные текст. настройки
this.RFontsCompare[AscWord.fontslot_ASCII] = undefined !== this.TextPr.RFonts.Ascii && this.TextPr.RFonts.Ascii.Name == "Cambria Math";
this.RFontsCompare[AscWord.fontslot_HAnsi] = undefined !== this.TextPr.RFonts.HAnsi && this.TextPr.RFonts.HAnsi.Name == "Cambria Math";
this.RFontsCompare[AscWord.fontslot_CS] = undefined !== this.TextPr.RFonts.CS && this.TextPr.RFonts.CS.Name == "Cambria Math";
this.RFontsCompare[AscWord.fontslot_EastAsia] = undefined !== this.TextPr.RFonts.EastAsia && this.TextPr.RFonts.EastAsia.Name == "Cambria Math";
}
CMathInfoTextPr.prototype.NeedUpdateFont = function(code, fontSlot, IsPlaceholder, IsApostrophe)
{
var NeedUpdateFont = false;
var bMathText = this.bNormalText == false || IsPlaceholder === true;
var Type;
if(bMathText && (this.RFontsCompare[fontSlot] == true || IsPlaceholder))
Type = MathTextInfo_MathText;
else if(bMathText && this.RFontsCompare[fontSlot] == false && true === this.IsSpecilalOperator(code))
Type = MathTextInfo_SpecialOperator;
else
Type = MathTextInfo_NormalText;
var ArgSize = this.ArgSize;
// CurrType -1 or MathTextInfo_NormalText
if(this.CurrType !== MathTextInfo_MathText && this.CurrType !== MathTextInfo_SpecialOperator && Type !== MathTextInfo_NormalText)
{
NeedUpdateFont = true;
}
this.CurrType = Type;
if(this.bApostrophe !== IsApostrophe && this.ArgSize < 0 && Type !== MathTextInfo_NormalText)
{
ArgSize = IsApostrophe == true ? 1 : this.ArgSize;
this.bApostrophe = IsApostrophe;
NeedUpdateFont = true;
}
if(NeedUpdateFont == true)
{
var FontSize = this.private_GetFontSize(fontSlot);
var coeff = MatGetKoeffArgSize(FontSize, ArgSize);
this.Font.FontSize = FontSize*coeff;
}
return NeedUpdateFont;
};
CMathInfoTextPr.prototype.private_GetFontSize = function(fontSlot)
{
return fontSlot == AscWord.fontslot_CS ? this.TextPr.FontSizeCS : this.TextPr.FontSize;
};
CMathInfoTextPr.prototype.GetFontKoef = function(fontSlot)
{
var FontSize = this.private_GetFontSize(fontSlot);
return MatGetKoeffArgSize(FontSize, this.ArgSize);
};
CMathInfoTextPr.prototype.GetFontSlot = function(code)
{
return AscWord.GetFontSlotByTextPr(code, this.TextPr);
};
CMathInfoTextPr.prototype.IsSpecilalOperator = function(val)
{
var bSpecialOperator = false;
// символы из интервала val >= 0x2E2 && val <= 0x36F есть, как правило, в шрифтах и используют именно их, а не заменяют символами из Cambria Math
if(val >= 0x2190 && val <= 0x21E9)
{
bSpecialOperator = q_Math_Arrows[val] !== 0;
}
else if(val >= 0x21F4 && val <= 0x22FF)
{
bSpecialOperator = q_Math_SpecialEquals[val] !== 0;
}
else if(val >= 0x2701 && val <= 0x299A)
{
bSpecialOperator = val !== 0x2981;
}
else if(val >= 0x29F4 && val <= 0x2AFF)
{
bSpecialOperator = val !== 0x2AE1 && val !== 0x2AF1;
}
else
{
bSpecialOperator = q_Math_SpecialSymbols[val] == 1;
}
return bSpecialOperator;
};
var q_Math_Arrows =
{
0x21B4: 0, 0x21B5: 0, 0x21B8: 0, 0x21B9: 0
};
var q_Math_SpecialEquals =
{
0x2205: 0, 0x220E: 0, 0x221F: 0, 0x2220: 0, 0x2221: 0, 0x2222: 0, 0x223F: 0, 0x22BE: 0, 0x22BF: 0, 0x22A4: 0
};
var q_Math_SpecialSymbols =
{
0x0021: 1, 0x0023: 1, 0x0028: 1, 0x0029: 1, 0x002A: 1, 0x002B: 1, 0x002C: 1, 0x002D: 1, 0x002E: 1, 0x002F: 1,
0x003A: 1, 0x003B: 1, 0x003C: 1, 0x003D: 1, 0x003E: 1, 0x003F: 1, 0x005B: 1, 0x005C: 1, 0x005D: 1, 0x005E: 1,
0x005F: 1, 0x007B: 1, 0x007C: 1, 0x007D: 1, 0x007E: 1, 0x00A1: 1, 0x00AC: 1, 0x00B1: 1, 0x00B7: 1, 0X00BF: 1,
0x00D7: 1, 0x00F7: 1, 0x2010: 1, 0x2012: 1, 0x2013: 1, 0x2014: 1, 0x2016: 1, 0x2020: 1, 0x2021: 1, 0x2022: 1,
0x2026: 1, 0x2140: 1, 0x2145: 1, 0x2146: 1, 0x2147: 1, 0x2148: 1, 0x2149: 1,
0x2305: 1, 0x2306: 1, 0x2308: 1, 0x2309: 1, 0x230A: 1, 0x230B: 1, 0x231C: 1, 0x231D: 1, 0x231E: 1, 0x231F: 1,
0x2322: 1, 0x2323: 1, 0x2329: 1, 0x232A: 1, 0x233D: 1, 0x233F: 1, 0x23B0: 1, 0x23B1: 1,
0x29B6: 1, 0x29B7: 1, 0x29B8: 1, 0x29B9: 1, 0x29C0: 1, 0x29C1: 1, 0x29C4: 1, 0x29C5: 1, 0x29C6: 1, 0x29C7: 1,
0x29C8: 1, 0x29CE: 1, 0x29CF: 1, 0x29D0: 1, 0x29D1: 1, 0x29D2: 1, 0x29D3: 1, 0x29D4: 1, 0x29D5: 1, 0x29D6: 1,
0x29D7: 1, 0x29D8: 1, 0x29D9: 1, 0x29DA: 1, 0x29DB: 1, 0x29DF: 1, 0x29E1: 1, 0x29E2: 1, 0x29E3: 1, 0x29E4: 1,
0x29E5: 1, 0x29E6: 1, 0x29EB: 1, 0x3014: 1, 0x3015: 1, 0x3016: 1, 0x3017: 1,
0x1DC0: 1, 0x1DC1: 1, 0x1DC2: 1, 0x1DC3: 1
};
var q_Math_Apostrophe =
{
0x2032: 1, 0x2033: 1, 0x2034 : 1, 0x2057: 1
};
var q_Math_BreakOperators =
{
0x002A: 1, 0x002B: 1, 0x002D: 1, 0x002F: 1,0x003C: 2, 0x003D: 2,
0x003E: 2, 0x005C: 1, 0x00B1: 1, 0x2190: 2, 0x2191: 2, 0x2192: 2,
0x2193: 2,
0x2194: 2, 0x2195: 2, 0x2196: 2, 0x2197: 2,0x2198: 2, 0x2199: 2,
0x219A: 2, 0x219B: 2, 0x219C: 2, 0x219D: 2,0x219E: 2, 0x219F: 2,
0x21A0: 2, 0x21A1: 2, 0x21A2: 2, 0x21A3: 2, 0x21A4: 2, 0x21A5: 2,
0x21A6: 2, 0x21A7: 2, 0x21A8: 2, 0x21A9: 2, 0x21AA: 2, 0x21AB: 2,
0x21AC: 2, 0x21AD: 2, 0x21AE: 2, 0x21AF: 2, 0x21B0: 2, 0x21B1: 2,
0x21B2: 2, 0x21B3: 2,
// check
0x21B6: 2, 0x21B7: 2, 0x21BA: 2, 0x21BB: 2, 0x21BC: 2, 0x21BD: 2,
0x21BE: 2, 0x21BF: 2, 0x21C0: 2, 0x21C1: 2, 0x21C2: 2, 0x21C3: 2,
0x21C4: 2, 0x21C5: 2, 0x21C6: 2, 0x21C7: 2, 0x21C8: 2, 0x21C9: 2,
0x21CA: 2, 0x21CB: 2, 0x21CC: 2, 0x21CD: 2, 0x21CE: 2, 0x21CF: 2,
0x21D0: 2, 0x21D1: 2, 0x21D2: 2, 0x21D3: 2, 0x21D4: 2, 0x21D5: 2,
0x21D6: 2, 0x21D7: 2, 0x21D8: 2, 0x21D9: 2, 0x21DA: 2, 0x21DB: 2,
0x21DC: 2, 0x21DD: 2, 0x21DE: 2, 0x21DF: 2, 0x21E0: 2, 0x21E1: 2,
0x21E2: 2, 0x21E3: 2, 0x21E4: 2, 0x21E5: 2, 0x21E6: 2, 0x21E7: 2,
0x21E8: 2, 0x21E9: 2, 0x21F4: 2, 0x21F5: 2, 0x21F6: 2, 0x21F7: 2,
0x21F8: 2, 0x21F9: 2, 0x21FA: 2, 0x21FB: 2, 0x21FC: 2, 0x21FD: 2,
0x21FE: 2, 0x21FF: 2, 0x2208: 2, 0x2209: 2, 0x220A: 2, 0x220B: 2,
0x220C: 2, 0x220D: 2, 0x2212: 1, 0x2213: 1, 0x2214: 1, 0x2215: 1,
0x2216: 1, 0x2217: 1, 0x2218: 1, 0x2219: 1, 0x221D: 2, 0x2223: 2,
0x2224: 2, 0x2225: 2, 0x2226: 2, 0x2227: 1, 0x2228: 1, 0x2229: 1,
0x222A: 1, 0x2234: 2, 0x2235: 2, 0x2236: 2, 0x2237: 2, 0x2238: 1,
0x2239: 2, 0x223A: 1, 0x223B: 2, 0x223C: 2, 0x223D: 2, 0x223E: 2,
0x2240: 1, 0x2241: 2, 0x2242: 2, 0x2243: 2, 0x2244: 2, 0x2245: 2,
0x2246: 2, 0x2247: 2, 0x2248: 2, 0x2249: 2, 0x224A: 2, 0x224B: 2,
0x224C: 2, 0x224D: 2, 0x224E: 2, 0x224F: 2, 0x2250: 2, 0x2251: 2,
0x2252: 2, 0x2253: 2, 0x2254: 2, 0x2255: 2, 0x2256: 2, 0x2257: 2,
0x2258: 2, 0x2259: 2, 0x225A: 2, 0x225B: 2, 0x225C: 2, 0x225D: 2,
0x225E: 2, 0x225F: 2, 0x2260: 2, 0x2261: 2, 0x2262: 2, 0x2263: 2,
0x2264: 2, 0x2265: 2, 0x2266: 2, 0x2267: 2, 0x2268: 2, 0x2269: 2,
0x226A: 2, 0x226B: 2, 0x226C: 2, 0x226D: 2, 0x226E: 2, 0x226F: 2,
0x2270: 2, 0x2271: 2, 0x2272: 2, 0x2273: 2, 0x2274: 2, 0x2275: 2,
0x2276: 2, 0x2277: 2, 0x2278: 2, 0x2279: 2, 0x227A: 2, 0x227B: 2,
0x227C: 2, 0x227D: 2, 0x227E: 2, 0x227F: 2, 0x2280: 2, 0x2281: 2,
0x2282: 2, 0x2283: 2, 0x2284: 2, 0x2285: 2, 0x2286: 2, 0x2287: 2,
0x2288: 2, 0x2289: 2, 0x228A: 2, 0x228B: 2, 0x228C: 1, 0x228D: 1,
0x228E: 1, 0x228F: 2, 0x2290: 2, 0x2291: 2, 0x2292: 2, 0x2293: 1,
0x2294: 1, 0x2295: 1, 0x2296: 1, 0x2297: 1, 0x2298: 1, 0x2299: 1,
0x229A: 1, 0x229B: 1, 0x229C: 1, 0x229D: 1, 0x229E: 1, 0x229F: 1,
0x22A0: 1, 0x22A1: 1, 0x22A2: 2, 0x22A3: 2, 0x22A5: 2, 0x22A6: 2,
0x22A7: 2, 0x22A8: 2, 0x22A9: 2, 0x22AA: 2, 0x22AB: 2, 0x22AC: 2,
0x22AD: 2, 0x22AE: 2, 0x22AF: 2, 0x22B0: 2, 0x22B1: 2, 0x22B2: 2,
0x22B3: 2, 0x22B4: 2, 0x22B5: 2, 0x22B6: 2, 0x22B7: 2, 0x22B8: 2,
0x22B9: 2, 0x22BA: 1, 0x22BB: 1, 0x22BC: 1, 0x22BD: 1, 0x22C4: 1,
0x22C5: 1, 0x22C6: 1, 0x22C7: 1, 0x22C8: 2, 0x22C9: 1, 0x22CA: 1,
0x22CB: 1, 0x22CC: 1, 0x22CD: 2, 0x22CE: 1, 0x22CF: 1, 0x22D0: 2,
0x22D1: 2, 0x22D2: 1, 0x22D3: 1, 0x22D4: 2,
0x22D5: 2, 0x22D6: 2, 0x22D7: 2, 0x22D8: 2, 0x22D9: 2, 0x22DA: 2,
0x22DB: 2, 0x22DC: 2, 0x22DD: 2, 0x22DE: 2, 0x22DF: 2, 0x22E0: 2,
0x22E1: 2, 0x22E2: 2, 0x22E3: 2, 0x22E4: 2, 0x22E5: 2, 0x22E6: 2,
0x22E7: 2, 0x22E8: 2, 0x22E9: 2, 0x22EA: 2, 0x22EB: 2, 0x22EC: 2,
0x22ED: 2, 0x22EE: 2, 0x22EF: 2, 0x22F0: 2, 0x22F1: 2, 0x22F2: 2,
0x22F3: 2, 0x22F4: 2, 0x22F5: 2, 0x22F6: 2, 0x22F7: 2, 0x22F8: 2,
0x22F9: 2, 0x22FA: 2, 0x22FB: 2, 0x22FC: 2, 0x22FD: 2, 0x22FE: 2,
0x22FF: 2, 0x2305: 1, 0x2306: 1, 0x2322: 2, 0x2323: 2, 0x233D: 1,
0x233F: 2, 0x23B0: 2, 0x23B1: 2, 0x25B3: 1, 0x25CA: 1, 0x25CB: 1,
0x27D1: 1, 0x27D2: 2, 0x27D3: 2, 0x27D4: 2, 0x27DA: 2, 0x27DB: 2,
0x27DC: 2, 0x27DD: 2, 0x27DE: 2, 0x27DF: 2, 0x27E0: 1, 0x27E1: 1,
0x27E2: 1, 0x27E3: 1, 0x27E4: 1, 0x27E5: 1, 0x27F0: 2, 0x27F1: 2,
0x27F2: 2, 0x27F3: 2, 0x27F4: 2,
//end check
0x27F5: 2, 0x27F6: 2, 0x27F7: 2, 0x27F8: 2, 0x27F9: 2, 0x27FA: 2,
0x27FB: 2, 0x27FC: 2, 0x27FD: 2, 0x27FE: 2, 0x27FF: 2, 0x2900: 2,
0x2901: 2, 0x2902: 2, 0x2903: 2, 0x2904: 2, 0x2905: 2, 0x2906: 2,
0x2907: 2, 0x2908: 2, 0x2909: 2, 0x290A: 2, 0x290B: 2, 0x290C: 2,
0x290D: 2, 0x290E: 2, 0x290F: 2, 0x2910: 2, 0x2911: 2, 0x2912: 2,
0x2913: 2, 0x2914: 2, 0x2915: 2, 0x2916: 2, 0x2917: 2, 0x2918: 2,
0x2919: 2, 0x291A: 2, 0x291B: 2, 0x291C: 2, 0x291D: 2, 0x291E: 2,
0x291F: 2, 0x2920: 2, 0x2921: 2, 0x2922: 2, 0x2923: 2, 0x2924: 2,
0x2925: 2, 0x2926: 2, 0x2927: 2, 0x2928: 2, 0x2929: 2, 0x292A: 2,
0x292B: 2, 0x292C: 2, 0x292D: 2, 0x292E: 2, 0x292F: 2, 0x2930: 2,
0x2931: 2, 0x2932: 2, 0x2933: 2, 0x2934: 2, 0x2935: 2, 0x2936: 2,
0x2937: 2, 0x2938: 2, 0x2939: 2, 0x293A: 2, 0x293B: 2, 0x293C: 2,
0x293D: 2, 0x293E: 2, 0x293F: 2, 0x2940: 2, 0x2941: 2, 0x2942: 2,
0x2943: 2, 0x2944: 2, 0x2945: 2, 0x2946: 2, 0x2947: 2, 0x2948: 2,
0x2949: 2, 0x294A: 2, 0x294B: 2, 0x294C: 2, 0x294D: 2, 0x294E: 2,
0x294F: 2, 0x2950: 2, 0x2951: 2, 0x2952: 2, 0x2953: 2, 0x2954: 2,
0x2955: 2, 0x2956: 2, 0x2957: 2, 0x2958: 2, 0x2959: 2, 0x295A: 2,
0x295B: 2, 0x295C: 2, 0x295D: 2, 0x295E: 2, 0x295F: 2, 0x2960: 2,
0x2961: 2, 0x2962: 2, 0x2963: 2, 0x2964: 2, 0x2965: 2, 0x2966: 2,
0x2967: 2, 0x2968: 2, 0x2969: 2, 0x296A: 2, 0x296B: 2, 0x296C: 2,
0x296D: 2, 0x296E: 2, 0x296F: 2, 0x2970: 2, 0x2971: 2, 0x2972: 2,
0x2973: 2, 0x2974: 2, 0x2975: 2, 0x2976: 2, 0x2977: 2, 0x2978: 2,
0x2979: 2, 0x297A: 2, 0x297B: 2, 0x2A52: 1, 0x2A53: 1, 0x2A54: 1,
0x2A55: 1, 0x2A56: 1, 0x2A57: 1, 0x2A58: 1, 0x2A59: 1, 0x2A5A: 1,
0x2A5B: 1, 0x2A5C: 1, 0x2A5D: 1, 0x2A5E: 1, 0x2A5F: 1, 0x2A60: 1,
0x2A61: 1, 0x2A62: 1, 0x2A63: 1, 0x2A64: 1, 0x2A65: 1, 0x2A66: 2,
0x2A67: 2, 0x2A68: 2, 0x2A69: 2, 0x2A6A: 2, 0x2A6B: 2, 0x2A6C: 2,
0x2A6D: 2, 0x2A6E: 2, 0x2A6F: 2, 0x2A70: 2, 0x2A71: 1, 0x2A72: 1,
0x2A73: 2, 0x2A74: 2, 0x2A75: 2, 0x2A76: 2, 0x2A77: 2, 0x2A78: 2,
0x2A79: 2, 0x2A7A: 2, 0x2A7B: 2, 0x2A7C: 2, 0x2A7D: 2, 0x2A7E: 2,
0x2A7F: 2, 0x2A80: 2, 0x2A81: 2, 0x2A82: 2, 0x2A83: 2, 0x2A84: 2,
0x2A85: 2, 0x2A86: 2, 0x2A87: 2, 0x2A88: 2, 0x2A89: 2, 0x2A8A: 2,
0x2A8B: 2, 0x2A8C: 2, 0x2A8D: 2, 0x2A8E: 2, 0x2A8F: 2, 0x2A90: 2,
0x2A91: 2, 0x2A92: 2, 0x2A93: 2, 0x2A94: 2, 0x2A95: 2, 0x2A96: 2,
0x2A97: 2, 0x2A98: 2, 0x2A99: 2, 0x2A9A: 2, 0x2A9B: 2, 0x2A9C: 2,
0x2A9D: 2, 0x2A9E: 2, 0x2A9F: 2, 0x2AA0: 2, 0x2AA1: 2, 0x2AA2: 2,
0x2AA3: 2, 0x2AA4: 2, 0x2AA5: 2, 0x2AA6: 2, 0x2AA7: 2, 0x2AA8: 2,
0x2AA9: 2, 0x2AAA: 2, 0x2AAB: 2, 0x2AAC: 2, 0x2AAD: 2, 0x2AAE: 2,
0x2AAF: 2, 0x2AB0: 2, 0x2AB1: 2, 0x2AB2: 2, 0x2AB3: 2, 0x2AB4: 2,
0x2AB5: 2, 0x2AB6: 2, 0x2AB7: 2, 0x2AB8: 2, 0x2AB9: 2, 0x2ABA: 2,
0x2ABB: 2, 0x2ABC: 2, 0x2ABD: 2, 0x2ABE: 2, 0x2ABF: 2, 0x2AC0: 2,
0x2AC1: 2, 0x2AC2: 2, 0x2AC3: 2, 0x2AC4: 2, 0x2AC5: 2, 0x2AC6: 2,
0x2AC7: 2, 0x2AC8: 2, 0x2AC9: 2, 0x2ACA: 2, 0x2ACB: 2, 0x2ACC: 2,
0x2ACD: 2, 0x2ACE: 2, 0x2ACF: 2, 0x2AD0: 2, 0x2AD1: 2, 0x2AD2: 2,
0x2AD3: 2, 0x2AD4: 2, 0x2AD5: 2, 0x2AD6: 2, 0x2AD7: 2, 0x2AD8: 2,
0x2AD9: 2, 0x2ADA: 2, 0x2ADB: 2, 0x2ADC: 2, 0x2ADD: 2,
0x00D7: 1, 0x00F7: 1
};
//--------------------------------------------------------export----------------------------------------------------
window['AscWord'] = window['AscWord'] || {};
window['AscWord'].CMathText = CMathText;
window['AscWord'].CMathAmp = CMathAmp;