/* * (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"; /** @enum {number} */ var c_oAscMathType = { //---------------------------------------------------------------------------------------------------------------------- Symbol_pm : 0x00000000, Symbol_infinity : 0x00000001, Symbol_equals : 0x00000002, Symbol_neq : 0x00000003, Symbol_about : 0x00000004, Symbol_times : 0x00000005, Symbol_div : 0x00000006, Symbol_factorial : 0x00000007, Symbol_propto : 0x00000008, Symbol_less : 0x00000009, Symbol_ll : 0x0000000a, Symbol_greater : 0x0000000b, Symbol_gg : 0x0000000c, Symbol_leq : 0x0000000d, Symbol_geq : 0x0000000e, Symbol_mp : 0x0000000f, Symbol_cong : 0x00000010, Symbol_approx : 0x00000011, Symbol_equiv : 0x00000012, Symbol_forall : 0x00000013, Symbol_additional : 0x00000014, Symbol_partial : 0x00000015, Symbol_sqrt : 0x00000016, Symbol_cbrt : 0x00000017, Symbol_qdrt : 0x00000018, Symbol_cup : 0x00000019, Symbol_cap : 0x0000001a, Symbol_emptyset : 0x0000001b, Symbol_percent : 0x0000001c, Symbol_degree : 0x0000001d, Symbol_fahrenheit : 0x0000001e, Symbol_celsius : 0x0000001f, Symbol_inc : 0x00000020, Symbol_nabla : 0x00000021, Symbol_exists : 0x00000022, Symbol_notexists : 0x00000023, Symbol_in : 0x00000024, Symbol_ni : 0x00000025, Symbol_leftarrow : 0x00000026, Symbol_uparrow : 0x00000027, Symbol_rightarrow : 0x00000028, Symbol_downarrow : 0x00000029, Symbol_leftrightarrow : 0x0000002a, Symbol_therefore : 0x0000002b, Symbol_plus : 0x0000002c, Symbol_minus : 0x0000002d, Symbol_not : 0x0000002e, Symbol_ast : 0x0000002f, Symbol_bullet : 0x00000030, Symbol_vdots : 0x00000031, Symbol_cdots : 0x00000032, Symbol_rddots : 0x00000033, Symbol_ddots : 0x00000034, Symbol_aleph : 0x00000035, Symbol_beth : 0x00000036, Symbol_QED : 0x00000037, Symbol_alpha : 0x00010000, Symbol_beta : 0x00010001, Symbol_gamma : 0x00010002, Symbol_delta : 0x00010003, Symbol_varepsilon : 0x00010004, Symbol_epsilon : 0x00010005, Symbol_zeta : 0x00010006, Symbol_eta : 0x00010007, Symbol_theta : 0x00010008, Symbol_vartheta : 0x00010009, Symbol_iota : 0x0001000a, Symbol_kappa : 0x0001000b, Symbol_lambda : 0x0001000c, Symbol_mu : 0x0001000d, Symbol_nu : 0x0001000e, Symbol_xsi : 0x0001000f, Symbol_o : 0x00010010, Symbol_pi : 0x00010011, Symbol_varpi : 0x00010012, Symbol_rho : 0x00010013, Symbol_varrho : 0x00010014, Symbol_sigma : 0x00010015, Symbol_varsigma : 0x00010016, Symbol_tau : 0x00010017, Symbol_upsilon : 0x00010018, Symbol_varphi : 0x00010019, Symbol_phi : 0x0001001a, Symbol_chi : 0x0001001b, Symbol_psi : 0x0001001c, Symbol_omega : 0x0001001d, Symbol_Alpha : 0x00020000, Symbol_Beta : 0x00020001, Symbol_Gamma : 0x00020002, Symbol_Delta : 0x00020003, Symbol_Epsilon : 0x00020004, Symbol_Zeta : 0x00020005, Symbol_Eta : 0x00020006, Symbol_Theta : 0x00020007, Symbol_Iota : 0x00020008, Symbol_Kappa : 0x00020009, Symbol_Lambda : 0x0002000a, Symbol_Mu : 0x0002000b, Symbol_Nu : 0x0002000c, Symbol_Xsi : 0x0002000d, Symbol_O : 0x0002000e, Symbol_Pi : 0x0002000f, Symbol_Rho : 0x00020010, Symbol_Sigma : 0x00020011, Symbol_Tau : 0x00020012, Symbol_Upsilon : 0x00020013, Symbol_Phi : 0x00020014, Symbol_Chi : 0x00020015, Symbol_Psi : 0x00020016, Symbol_Omega : 0x00020017, //---------------------------------------------------------------------------------------------------------------------- FractionVertical : 0x01000000, FractionDiagonal : 0x01000001, FractionHorizontal : 0x01000002, FractionSmall : 0x01000003, FractionDifferential_1 : 0x01010000, FractionDifferential_2 : 0x01010001, FractionDifferential_3 : 0x01010002, FractionDifferential_4 : 0x01010003, FractionPi_2 : 0x01010004, //---------------------------------------------------------------------------------------------------------------------- ScriptSup : 0x02000000, ScriptSub : 0x02000001, ScriptSubSup : 0x02000002, ScriptSubSupLeft : 0x02000003, ScriptCustom_1 : 0x02010000, ScriptCustom_2 : 0x02010001, ScriptCustom_3 : 0x02010002, ScriptCustom_4 : 0x02010003, //---------------------------------------------------------------------------------------------------------------------- RadicalSqrt : 0x03000000, RadicalRoot_n : 0x03000001, RadicalRoot_2 : 0x03000002, RadicalRoot_3 : 0x03000003, RadicalCustom_1 : 0x03010000, RadicalCustom_2 : 0x03010001, //---------------------------------------------------------------------------------------------------------------------- Integral : 0x04000000, IntegralSubSup : 0x04000001, IntegralCenterSubSup : 0x04000002, IntegralDouble : 0x04000003, IntegralDoubleSubSup : 0x04000004, IntegralDoubleCenterSubSup : 0x04000005, IntegralTriple : 0x04000006, IntegralTripleSubSup : 0x04000007, IntegralTripleCenterSubSup : 0x04000008, IntegralOriented : 0x04010000, IntegralOrientedSubSup : 0x04010001, IntegralOrientedCenterSubSup : 0x04010002, IntegralOrientedDouble : 0x04010003, IntegralOrientedDoubleSubSup : 0x04010004, IntegralOrientedDoubleCenterSubSup : 0x04010005, IntegralOrientedTriple : 0x04010006, IntegralOrientedTripleSubSup : 0x04010007, IntegralOrientedTripleCenterSubSup : 0x04010008, Integral_dx : 0x04020000, Integral_dy : 0x04020001, Integral_dtheta : 0x04020002, //---------------------------------------------------------------------------------------------------------------------- LargeOperator_Sum : 0x05000000, LargeOperator_Sum_CenterSubSup : 0x05000001, LargeOperator_Sum_SubSup : 0x05000002, LargeOperator_Sum_CenterSub : 0x05000003, LargeOperator_Sum_Sub : 0x05000004, LargeOperator_Prod : 0x05010000, LargeOperator_Prod_CenterSubSup : 0x05010001, LargeOperator_Prod_SubSup : 0x05010002, LargeOperator_Prod_CenterSub : 0x05010003, LargeOperator_Prod_Sub : 0x05010004, LargeOperator_CoProd : 0x05010005, LargeOperator_CoProd_CenterSubSup : 0x05010006, LargeOperator_CoProd_SubSup : 0x05010007, LargeOperator_CoProd_CenterSub : 0x05010008, LargeOperator_CoProd_Sub : 0x05010009, LargeOperator_Union : 0x05020000, LargeOperator_Union_CenterSubSup : 0x05020001, LargeOperator_Union_SubSup : 0x05020002, LargeOperator_Union_CenterSub : 0x05020003, LargeOperator_Union_Sub : 0x05020004, LargeOperator_Intersection : 0x05020005, LargeOperator_Intersection_CenterSubSup : 0x05020006, LargeOperator_Intersection_SubSup : 0x05020007, LargeOperator_Intersection_CenterSub : 0x05020008, LargeOperator_Intersection_Sub : 0x05020009, LargeOperator_Disjunction : 0x05030000, LargeOperator_Disjunction_CenterSubSup : 0x05030001, LargeOperator_Disjunction_SubSup : 0x05030002, LargeOperator_Disjunction_CenterSub : 0x05030003, LargeOperator_Disjunction_Sub : 0x05030004, LargeOperator_Conjunction : 0x05030005, LargeOperator_Conjunction_CenterSubSup : 0x05030006, LargeOperator_Conjunction_SubSup : 0x05030007, LargeOperator_Conjunction_CenterSub : 0x05030008, LargeOperator_Conjunction_Sub : 0x05030009, LargeOperator_Custom_1 : 0x05040000, LargeOperator_Custom_2 : 0x05040001, LargeOperator_Custom_3 : 0x05040002, LargeOperator_Custom_4 : 0x05040003, LargeOperator_Custom_5 : 0x05040004, //---------------------------------------------------------------------------------------------------------------------- Bracket_Round : 0x06000000, Bracket_Square : 0x06000001, Bracket_Curve : 0x06000002, Bracket_Angle : 0x06000003, Bracket_LowLim : 0x06000004, Bracket_UppLim : 0x06000005, Bracket_Line : 0x06000006, Bracket_LineDouble : 0x06000007, Bracket_Square_OpenOpen : 0x06000008, Bracket_Square_CloseClose : 0x06000009, Bracket_Square_CloseOpen : 0x0600000a, Bracket_SquareDouble : 0x0600000b, Bracket_Round_Delimiter_2 : 0x06010000, Bracket_Curve_Delimiter_2 : 0x06010001, Bracket_Angle_Delimiter_2 : 0x06010002, Bracket_Angle_Delimiter_3 : 0x06010003, Bracket_Round_OpenNone : 0x06020000, Bracket_Round_NoneOpen : 0x06020001, Bracket_Square_OpenNone : 0x06020002, Bracket_Square_NoneOpen : 0x06020003, Bracket_Curve_OpenNone : 0x06020004, Bracket_Curve_NoneOpen : 0x06020005, Bracket_Angle_OpenNone : 0x06020006, Bracket_Angle_NoneOpen : 0x06020007, Bracket_LowLim_OpenNone : 0x06020008, Bracket_LowLim_NoneNone : 0x06020009, Bracket_UppLim_OpenNone : 0x0602000a, Bracket_UppLim_NoneOpen : 0x0602000b, Bracket_Line_OpenNone : 0x0602000c, Bracket_Line_NoneOpen : 0x0602000d, Bracket_LineDouble_OpenNone : 0x0602000e, Bracket_LineDouble_NoneOpen : 0x0602000f, Bracket_SquareDouble_OpenNone : 0x06020010, Bracket_SquareDouble_NoneOpen : 0x06020011, Bracket_Custom_1 : 0x06030000, Bracket_Custom_2 : 0x06030001, Bracket_Custom_3 : 0x06030002, Bracket_Custom_4 : 0x06030003, Bracket_Custom_5 : 0x06040000, Bracket_Custom_6 : 0x06040001, Bracket_Custom_7 : 0x06040002, //---------------------------------------------------------------------------------------------------------------------- Function_Sin : 0x07000000, Function_Cos : 0x07000001, Function_Tan : 0x07000002, Function_Csc : 0x07000003, Function_Sec : 0x07000004, Function_Cot : 0x07000005, Function_1_Sin : 0x07010000, Function_1_Cos : 0x07010001, Function_1_Tan : 0x07010002, Function_1_Csc : 0x07010003, Function_1_Sec : 0x07010004, Function_1_Cot : 0x07010005, Function_Sinh : 0x07020000, Function_Cosh : 0x07020001, Function_Tanh : 0x07020002, Function_Csch : 0x07020003, Function_Sech : 0x07020004, Function_Coth : 0x07020005, Function_1_Sinh : 0x07030000, Function_1_Cosh : 0x07030001, Function_1_Tanh : 0x07030002, Function_1_Csch : 0x07030003, Function_1_Sech : 0x07030004, Function_1_Coth : 0x07030005, Function_Custom_1 : 0x07040000, Function_Custom_2 : 0x07040001, Function_Custom_3 : 0x07040002, //---------------------------------------------------------------------------------------------------------------------- Accent_Dot : 0x08000000, Accent_DDot : 0x08000001, Accent_DDDot : 0x08000002, Accent_Hat : 0x08000003, Accent_Check : 0x08000004, Accent_Accent : 0x08000005, Accent_Grave : 0x08000006, Accent_Smile : 0x08000007, Accent_Tilde : 0x08000008, Accent_Bar : 0x08000009, Accent_DoubleBar : 0x0800000a, Accent_CurveBracketTop : 0x0800000b, Accent_CurveBracketBot : 0x0800000c, Accent_GroupTop : 0x0800000d, Accent_GroupBot : 0x0800000e, Accent_ArrowL : 0x0800000f, Accent_ArrowR : 0x08000010, Accent_ArrowD : 0x08000011, Accent_HarpoonL : 0x08000012, Accent_HarpoonR : 0x08000013, Accent_BorderBox : 0x08010000, Accent_BorderBoxCustom : 0x08010001, Accent_BarTop : 0x08020000, Accent_BarBot : 0x08020001, Accent_Custom_1 : 0x08030000, Accent_Custom_2 : 0x08030001, Accent_Custom_3 : 0x08030002, //---------------------------------------------------------------------------------------------------------------------- LimitLog_LogBase : 0x09000000, LimitLog_Log : 0x09000001, LimitLog_Lim : 0x09000002, LimitLog_Min : 0x09000003, LimitLog_Max : 0x09000004, LimitLog_Ln : 0x09000005, LimitLog_Custom_1 : 0x09010000, LimitLog_Custom_2 : 0x09010001, //---------------------------------------------------------------------------------------------------------------------- Operator_ColonEquals : 0x0a000000, Operator_EqualsEquals : 0x0a000001, Operator_PlusEquals : 0x0a000002, Operator_MinusEquals : 0x0a000003, Operator_Definition : 0x0a000004, Operator_UnitOfMeasure : 0x0a000005, Operator_DeltaEquals : 0x0a000006, Operator_ArrowL_Top : 0x0a010000, Operator_ArrowR_Top : 0x0a010001, Operator_ArrowL_Bot : 0x0a010002, Operator_ArrowR_Bot : 0x0a010003, Operator_DoubleArrowL_Top : 0x0a010004, Operator_DoubleArrowR_Top : 0x0a010005, Operator_DoubleArrowL_Bot : 0x0a010006, Operator_DoubleArrowR_Bot : 0x0a010007, Operator_ArrowD_Top : 0x0a010008, Operator_ArrowD_Bot : 0x0a010009, Operator_DoubleArrowD_Top : 0x0a01000a, Operator_DoubleArrowD_Bot : 0x0a01000b, Operator_Custom_1 : 0x0a020000, Operator_Custom_2 : 0x0a020001, //---------------------------------------------------------------------------------------------------------------------- Matrix_1_2 : 0x0b000000, Matrix_2_1 : 0x0b000001, Matrix_1_3 : 0x0b000002, Matrix_3_1 : 0x0b000003, Matrix_2_2 : 0x0b000004, Matrix_2_3 : 0x0b000005, Matrix_3_2 : 0x0b000006, Matrix_3_3 : 0x0b000007, Matrix_Dots_Center : 0x0b010000, Matrix_Dots_Baseline : 0x0b010001, Matrix_Dots_Vertical : 0x0b010002, Matrix_Dots_Diagonal : 0x0b010003, Matrix_Identity_2 : 0x0b020000, Matrix_Identity_2_NoZeros : 0x0b020001, Matrix_Identity_3 : 0x0b020002, Matrix_Identity_3_NoZeros : 0x0b020003, Matrix_2_2_RoundBracket : 0x0b030000, Matrix_2_2_SquareBracket : 0x0b030001, Matrix_2_2_LineBracket : 0x0b030002, Matrix_2_2_DLineBracket : 0x0b030003, Matrix_Flat_Round : 0x0b040000, Matrix_Flat_Square : 0x0b040001, //---------------------------------------------------------------------------------------------------------------------- Default_Text : 0x0c000000 }; function CRPI() { this.bDecreasedComp = false; this.bInline = false; this.bChangeInline = false; this.bNaryInline = false; /*для CDegreeSupSub внутри N-арного оператора, этот флаг необходим, чтобы итераторы максимально близко друг к другу расположить*/ this.bEqArray = false; /*для амперсанда*/ this.bMathFunc = false; this.bRecalcCtrPrp = false; // пересчет ctrPrp нужен, когда на Undo и тп изменился размер первого Run, а ctrPrp уже для мат объектов пересчитались this.bCorrect_ConvertFontSize = false; this.bSmallFraction = false; } CRPI.prototype.MergeMathInfo = function(MathInfo) { this.bInline = MathInfo.bInline || (MathInfo.bInternalRanges == true && MathInfo.bStartRanges == false); this.bRecalcCtrPrp = MathInfo.bRecalcCtrPrp; this.bChangeInline = MathInfo.bChangeInline; this.bCorrect_ConvertFontSize = MathInfo.bCorrect_ConvertFontSize; }; function CMathPointInfo() { this.x = 0; this.y = 0; this.bEven = true; this.CurrPoint = 0; this.InfoPoints = {}; } CMathPointInfo.prototype.SetInfoPoints = function(InfoPoints) { this.InfoPoints.GWidths = InfoPoints.GWidths; this.InfoPoints.GPoints = InfoPoints.GPoints; this.InfoPoints.ContentPoints = InfoPoints.ContentPoints.Widths; this.InfoPoints.GMaxDimWidths = InfoPoints.GMaxDimWidths; }; CMathPointInfo.prototype.NextAlignRange = function() { if(this.bEven) this.bEven = false; else { this.CurrPoint++; this.bEven = true; } }; CMathPointInfo.prototype.GetAlign = function() { var align = 0; if(this.bEven) { var alignEven, alignGeneral, alignOdd; var Len = this.InfoPoints.ContentPoints.length, Point = this.InfoPoints.ContentPoints[this.CurrPoint]; var GWidth = this.InfoPoints.GWidths[this.CurrPoint], GPoint = this.InfoPoints.GPoints[this.CurrPoint]; if(this.CurrPoint == Len - 1 && Point.odd == -1) // то есть последняя точка четная, выравнивание по центру { var GMaxDimWidth = this.InfoPoints.GMaxDimWidths[this.CurrPoint]; alignGeneral = (GMaxDimWidth - Point.even)/2; alignEven = 0; } else { alignGeneral = (GWidth - GPoint.even - GPoint.odd)/2; alignEven = GPoint.even - Point.even; } if(this.CurrPoint > 0) { var PrevGenPoint = this.InfoPoints.GPoints[this.CurrPoint-1], PrevGenWidth = this.InfoPoints.GWidths[this.CurrPoint-1], PrevPoint = this.InfoPoints.ContentPoints[this.CurrPoint-1]; var alignPrevGen = (PrevGenWidth - PrevGenPoint.even - PrevGenPoint.odd)/2; alignOdd = alignPrevGen + PrevGenPoint.odd - PrevPoint.odd; } else alignOdd = 0; align = alignGeneral + alignEven + alignOdd; } return align; }; function CInfoPoints() { this.GWidths = null; this.GPoints = null; this.GMaxDimWidths = null; this.ContentPoints = new AmperWidths(); } CInfoPoints.prototype.SetDefault = function() { this.GWidths = null; this.GPoints = null; this.GMaxDimWidths = null; this.ContentPoints.SetDefault(); }; function CMathPosInfo() { this.CurRange = -1; this.CurLine = -1; this.DispositionOpers = null; } function CMathPosition() { this.x = 0; this.y = 0; } CMathPosition.prototype.Set = function(Pos) { this.x = Pos.x; this.y = Pos.y; }; function AmperWidths() { this.bEven = true; // является ли текущая точка нечетной this.Widths = []; } AmperWidths.prototype.UpdatePoint = function(value) { var len = this.Widths.length; if(len == 0) { // дефолтное значение bEven true, для случая если первый элемент в контенте будет Ampersand var NewPoint = new CMathPoint(); NewPoint.even = value; this.Widths.push(NewPoint); this.bEven = true; } else { if(this.bEven) this.Widths[len-1].even += value; else this.Widths[len-1].odd += value; } }; AmperWidths.prototype.AddNewAlignRange = function() { var len = this.Widths.length; if(!this.bEven || len == 0) { var NewPoint = new CMathPoint(); NewPoint.even = 0; this.Widths.push(NewPoint); } if(this.bEven) { len = this.Widths.length; this.Widths[len-1].odd = 0; } this.bEven = !this.bEven; }; AmperWidths.prototype.SetDefault = function() { this.bEven = true; this.Widths.length = 0; }; function CGeneralObjectGaps(Left, Right) { this.left = Left; this.right = Right; } function CGaps(oSign, oEqual, oZeroOper, oLett) { this.sign = oSign; this.equal = oEqual; this.zeroOper = oZeroOper; this.letters = oLett; } function CCoeffGaps() { var LeftSign = new CGaps(0.52, 0.26, 0, 0.52), RightSign = new CGaps(0.49, 0, 0, 0.49); this.Sign = new CGeneralObjectGaps(LeftSign, RightSign); var LeftMult = new CGaps(0, 0, 0, 0.46), RightMult = new CGaps(0, 0, 0, 0.49); this.Mult = new CGeneralObjectGaps(LeftMult, RightMult); var LeftEqual = new CGaps(0, 0, 0, 0.7), RightEqual = new CGaps(0, 0, 0, 0.5); this.Equal = new CGeneralObjectGaps(LeftEqual, RightEqual); var LeftDefault = new CGaps(0, 0, 0, 0), RightDefault = new CGaps(0, 0, 0, 0); this.Default = new CGeneralObjectGaps(LeftDefault, RightDefault); } CCoeffGaps.prototype = { getCoeff: function(codeCurr, codeLR , direct) // obj - либо codeChar, либо мат объект { var operator = null; if(this.checkEqualSign(codeCurr)) operator = this.Equal; else if(this.checkOperSign(codeCurr)) operator = this.Sign; else if(codeCurr == 0x2A) operator = this.Mult; else operator = this.Default; var part = direct == -1 ? operator.left : operator.right; var coeff = 0; if(codeLR == -1) // мат объект coeff = part.letters; else if(this.checkOperSign(codeLR)) coeff = part.sign; else if(this.checkEqualSign(codeLR)) coeff = part.equal; else if(this.checkZeroSign(codeLR, direct)) coeff = part.zeroOper; else coeff = part.letters; return coeff; }, checkOperSign: function(code) // "+", "-", "±", "∓", "×", "÷" { var PLUS = 0x2B, MINUS = 0x2D, PLUS_MINUS = 0xB1, MINUS_PLUS = 0x2213, MULTIPLICATION = 0xD7, DIVISION = 0xF7; return code == PLUS || code == MINUS || code == PLUS_MINUS || code == MINUS_PLUS || code == MULTIPLICATION || code == DIVISION; }, checkEqualSign: function(code) { var COMPARE = code == 0x3C || code == 0x3E; // LESS, GREATER var ARROWS = (code >= 0x2190 && code <= 0x21B3) || (code == 0x21B6) || (code == 0x21B7) || (code >= 0x21BA && code <= 0x21E9) || (code >=0x21F4 && code <= 0x21FF); var INTERSECTION = code >= 0x2223 && code <= 0x222A; var EQUALS = code == 0x3D || (code >= 0x2234 && code <= 0x22BD) || (code >= 0x22C4 && code <= 0x22FF); var ARR_FISHES = (code >= 0x27DA && code <= 0x27E5) || (code >= 0x27EC && code <= 0x297F); var TRIANGLE_SYMB = code >= 0x29CE && code <= 0x29D7; var OTH_SYMB = code == 0x29DF || (code >= 0x29E1 && code <= 0x29E7) || (code >= 0x29F4 && code <= 0x29F8) || (code >= 0x2A22 && code <= 0x2AF0) || (code >= 0x2AF2 && code <= 0x2AFB) || code == 0x2AFD || code == 0x2AFE; return COMPARE || ARROWS || INTERSECTION || EQUALS || ARR_FISHES || TRIANGLE_SYMB || OTH_SYMB; }, checkZeroSign: function(code, direct) // "*", "/", "\" { var MULT = 0x2A, DIVISION = 0x2F, B_SLASH = 0x5C; var bOper = code == MULT || code == DIVISION || code == B_SLASH; var bLeftBracket = direct == -1 && (code == 0x28 || code == 0x5B || code == 0x7B); var bRightBracket = direct == 1 && (code == 0x29 || code == 0x5D || code == 0x7D); return bOper || bLeftBracket || bRightBracket; } }; var COEFF_GAPS = new CCoeffGaps(); function CMathArgSize() { this.value = undefined; } CMathArgSize.prototype = { Decrease: function() { if(this.value == undefined) this.value = 0; if( this.value > -2 ) this.value--; return this.value; }, Increase: function() { if(this.value == undefined) this.value = 0; if(this.value < 2) this.value++; return this.value; }, Set: function(ArgSize) { this.value = ArgSize.value; }, GetValue: function() { return this.value; }, SetValue: function(val) { if(val === null || val === undefined) this.value = undefined; else if(val < - 2) this.value = -2; else if(val > 2) this.value = 2; else this.value = val; }, Copy: function() { var ArgSize = new CMathArgSize(); ArgSize.value = this.value; return ArgSize; }, Merge: function(ArgSize) { if(this.value == undefined) this.value = 0; if(ArgSize.value == undefined) ArgSize.value = 0; this.SetValue(this.value + ArgSize.value); }, Can_Decrease: function() { return this.value !== -2; }, Can_Increase: function() { return this.value == -1 || this.value == -2; }, Can_SimpleIncrease: function() { return this.value !== 2; }, Is_Init: function() { return this.value !== undefined; }, Write_ToBinary: function(Writer) { if(this.value == undefined) { Writer.WriteBool(true); } else { Writer.WriteBool(false); Writer.WriteLong(this.value); } }, Read_FromBinary: function(Reader) { if(Reader.GetBool() == false) { this.value = Reader.GetLong(); } else { this.value = undefined; } } }; function CMathGapsInfo(argSize) { this.argSize = argSize; // argSize выставляем один раз для всего контента this.Left = null; // элемент слева this.Current = null; // текущий элемент this.LeftFontSize = null; this.CurrentFontSize = null; this.bUpdate = false; } CMathGapsInfo.prototype = { setGaps: function(Current, CurrentFontSize) { this.updateCurrentObject(Current, CurrentFontSize); this.updateGaps(); }, updateCurrentObject: function(Current, CurrentFontSize) { this.Left = this.Current; this.LeftFontSize = this.CurrentFontSize; this.Current = Current; this.CurrentFontSize = CurrentFontSize; }, updateGaps: function() { if(this.argSize < 0) { this.Current.GapLeft = 0; if(this.Left !== null) this.Left.GapRight = 0; } else { var leftCoeff = 0, /// for Current Object rightCoeff = 0; /// for Left Object var leftCode; if(this.Current.IsMathText()) { var currCode = this.Current.getCodeChr(); if(this.Left !== null) { if(this.Left.Type == para_Math_Composition) { rightCoeff = this.getGapsMComp(this.Left, 1); leftCoeff = COEFF_GAPS.getCoeff(currCode, -1, -1); if(leftCoeff > rightCoeff) leftCoeff -= rightCoeff; } else if(this.Left.IsMathText()) { leftCode = this.Left.getCodeChr(); leftCoeff = COEFF_GAPS.getCoeff(currCode, leftCode, -1); rightCoeff = COEFF_GAPS.getCoeff(leftCode, currCode, 1); } } else this.Current.GapLeft = 0; } else if(this.Current.Type == para_Math_Composition) { leftCoeff = this.getGapsMComp(this.Current, -1); if(this.Left !== null) { if(this.Left.Type == para_Math_Composition) { rightCoeff = this.getGapsMComp(this.Left, 1); if(rightCoeff/2 > leftCoeff) rightCoeff -= leftCoeff; else rightCoeff /= 2; if(leftCoeff < rightCoeff/2) leftCoeff = rightCoeff/2; else leftCoeff -= rightCoeff/2; } else if(this.Left.IsMathText()) { leftCode = this.Left.getCodeChr(); rightCoeff = COEFF_GAPS.getCoeff(leftCode, -1, 1); if(rightCoeff > leftCoeff) rightCoeff -= leftCoeff; } } else leftCoeff = 0; } var LGapSign = 0.1513*this.CurrentFontSize; this.Current.GapLeft = (leftCoeff*LGapSign*100 | 0)/100; // если ни один случай не выполнился, выставляем "нулевые" gaps (default): необходимо, если что-то удалили и объект стал первый или последним в контенте if(this.Left !== null) { var RGapSign = 0.1513*this.LeftFontSize; this.Left.GapRight = (rightCoeff*RGapSign*100 | 0)/100; } } }, getGapsMComp: function(MComp, direct) { var kind = MComp.kind; var checkGap = this.checkGapKind(MComp); var bNeedGap = !checkGap.bEmptyGaps && !checkGap.bChildGaps; var coeffLeft = 0.001, coeffRight = 0; // for checkGap.bEmptyGaps //var bDegree = kind == MATH_DEGREE || kind == MATH_DEGREESubSup; var bDegree = kind == MATH_DEGREE; if(checkGap.bChildGaps) { if(bDegree) { coeffLeft = 0.03; if(MComp.IsPlhIterator()) coeffRight = 0.12; else coeffRight = 0.16; } var gapsChild = MComp.getGapsInside(this); coeffLeft = coeffLeft < gapsChild.left ? gapsChild.left : coeffLeft; coeffRight = coeffRight < gapsChild.right ? gapsChild.right : coeffRight; } else if(bNeedGap) { coeffLeft = 0.4; coeffRight = 0.3; } return direct == -1 ? coeffLeft : coeffRight; }, checkGapKind: function(Comp) { var kind = Comp.kind; var bEmptyGaps = kind == MATH_MATRIX /*|| (kind == MATH_DELIMITER && Comp.Is_EmptyGaps())*/, bChildGaps = kind == MATH_DEGREE || kind == MATH_DEGREESubSup || kind == MATH_ACCENT || kind == MATH_RADICAL || kind == MATH_LIMIT || kind == MATH_BORDER_BOX; return {bEmptyGaps: bEmptyGaps, bChildGaps: bChildGaps}; } }; function CMPrp() { this.sty = undefined; this.scr = undefined; this.nor = undefined; this.aln = undefined; this.brk = undefined; this.lit = undefined; // Default /*this.sty = STY_ITALIC; this.scr = TXT_ROMAN; this.nor = false; this.aln = false; this.brk = false; this.lit = false;*/ // TXT_NORMAL // если normal == false, то берем TextPrp отсюда (в wRunPrp bold/italic не учитываем, выставляем отсюда) // если normal == true, то их Word не учитывает и берет TextPr из wRunPrp // TXT_PLAIN // если plain == true // буквы берутся обычные, не специальные для Cambria Math : то есть как для TXT_NORMAL // отличие от TXT_NORMAL w:rPrp в этом случае не учитываются ! } CMPrp.prototype = { Is_Empty: function() { return undefined === this.sty && undefined === this.scr && undefined === this.nor && undefined === this.aln && undefined === this.brk && undefined === this.lit; }, Set_Pr: function(Pr) { if(Pr.sty !== undefined) this.sty = Pr.sty; if(Pr.scr !== undefined) this.scr = Pr.scr; if(Pr.nor !== undefined) this.nor = Pr.nor; if(Pr.aln !== undefined) this.aln = Pr.aln; if(Pr.lit !== undefined) this.lit = Pr.lit; if(Pr.brk !== undefined) { this.brk = new CMathBreak(); this.brk.Set_FromObject(Pr.brk); } }, GetTxtPrp: function() { var textPrp = new CTextPr(); if(this.sty == undefined) { textPrp.Italic = true; textPrp.Bold = false; } else { textPrp.Italic = this.sty == STY_BI || this.sty == STY_ITALIC; textPrp.Bold = this.sty == STY_BI || this.sty == STY_BOLD; } return textPrp; }, IsEqual: function (oMPrp) { return oMPrp.aln === this.aln && oMPrp.lit === this.lit && oMPrp.nor === this.nor && oMPrp.sty === this.sty && oMPrp.scr === this.scr && ( oMPrp.brk === undefined && this.brk === undefined || oMPrp.brk !== undefined && this.brk !== undefined && oMPrp.brk.IsEqual(this.brk) ) }, Copy: function() { var NewMPrp = new CMPrp(); NewMPrp.aln = this.aln; NewMPrp.lit = this.lit; NewMPrp.nor = this.nor; NewMPrp.sty = this.sty; NewMPrp.scr = this.scr; if(this.brk !== undefined) NewMPrp.brk = this.brk.Copy(); return NewMPrp; }, IsBreak: function() { return this.brk !== undefined; }, Get_AlignBrk: function() { return this.brk !== undefined ? this.brk.Get_AlignBrk() : null; }, Get_AlnAt: function() { return this.brk != undefined ? this.brk.Get_AlnAt() : undefined; }, GetCompiled_ScrStyles : function() { var nor = this.nor == undefined ? false : this.nor; var scr = this.scr == undefined ? TXT_ROMAN : this.scr; var sty = this.sty == undefined ? STY_ITALIC : this.sty; return {nor: nor, scr: scr, sty: sty}; }, SetStyle: function(Bold, Italic) /// из ctrPrp получить style для MathPrp { if(Bold == true && Italic == true) this.sty = STY_BI; else if(Italic == true) this.sty = STY_ITALIC; else if(Bold == true) this.sty = STY_BOLD; else if(Bold == false && Italic == false) this.sty = STY_PLAIN; else this.sty = undefined; }, GetBoldItalic: function() { var Object = { Italic: undefined, Bold: undefined }; if(this.sty == STY_BI) { Object.Bold = true; } else if(this.sty == STY_BOLD) { Object.Bold = true; Object.Italic = false; } return Object; }, Displace_Break: function(isForward) { if(this.brk !== undefined) { this.brk.Displace(isForward); } }, Apply_AlnAt: function(alnAt) { if(this.brk !== undefined) { this.brk.Apply_AlnAt(alnAt); } }, Insert_ForcedBreak: function(AlnAt) { if(this.brk == undefined) this.brk = new CMathBreak(); this.brk.Apply_AlnAt(AlnAt); }, Delete_ForcedBreak: function() { this.brk = undefined; } }; CMPrp.prototype.Write_ToBinary = function(Writer) { var StartPos = Writer.GetCurPosition(); Writer.Skip(4); var Flags = 0; if (undefined != this.aln) { Writer.WriteBool(this.aln); Flags |= 1; } if (undefined != this.brk) { this.brk.Write_ToBinary(Writer); Flags |= 2; } if (undefined != this.lit) { Writer.WriteBool(this.lit); Flags |= 4; } if (undefined != this.nor) { Writer.WriteBool(this.nor); Flags |= 8; } if (undefined != this.scr) { Writer.WriteLong(this.scr); Flags |= 16; } if (undefined != this.sty) { Writer.WriteLong(this.sty); Flags |= 32; } var EndPos = Writer.GetCurPosition(); Writer.Seek(StartPos); Writer.WriteLong(Flags); Writer.Seek(EndPos); }; CMPrp.prototype.Read_FromBinary = function(Reader) { var Flags = Reader.GetLong(); if (Flags & 1) this.aln = Reader.GetBool(); if (Flags & 2) { this.brk = new CMathBreak(); this.brk.Read_FromBinary(Reader); } if (Flags & 4) this.lit = Reader.GetBool(); if (Flags & 8) this.nor = Reader.GetBool(); if (Flags & 16) this.scr = Reader.GetLong(); if (Flags & 32) this.sty = Reader.GetLong(); }; /** * * @constructor * @extends {CParagraphContentWithParagraphLikeContent} */ function CMathContent() { CParagraphContentWithParagraphLikeContent.call(this); this.Id = AscCommon.g_oIdCounter.Get_NewId(); this.Content = []; // array of mathElem this.Type = para_Math_Content; this.CurPos = 0; this.pos = new CMathPosition(); // относительная позиция // Properties this.ParaMath = null; this.ArgSize = new CMathArgSize(); this.Compiled_ArgSz = new CMathArgSize(); this.CtrPrp = new CTextPr(); // for EqArray this.InfoPoints = new CInfoPoints(); /////////////// this.Bounds = new CMathBounds(); this.plhHide = false; this.bRoot = false; this.bOneLine = false; ////////////////// this.Selection = { StartPos: 0, EndPos: 0, Use: false }; this.RecalcInfo = { TextPr: true, bEqArray: false, bChangeInfoPoints: false, Measure: true }; this.NearPosArray = []; this.ParentElement = null; this.size = new CMathSize(); this.m_oContentChanges = new AscCommon.CContentChanges(); // список изменений(добавление/удаление элементов) // Добавляем данный класс в таблицу Id (обязательно в конце конструктора) AscCommon.g_oTableId.Add( this, this.Id ); } CMathContent.prototype = Object.create(CParagraphContentWithParagraphLikeContent.prototype); CMathContent.prototype.constructor = CMathContent; CMathContent.prototype.init = function() { }; CMathContent.prototype.addElementToContent = function(obj) { this.Internal_Content_Add(this.Content.length, obj, false); this.CurPos = this.Content.length-1; }; CMathContent.prototype.SetPlaceholder = function() { this.Remove_FromContent(0, this.Content.length); var oRun = new ParaRun(null, true); oRun.AddMathPlaceholder(); this.addElementToContent(oRun); this.RemoveSelection(); this.MoveCursorToEndPos(); }; ////////////////////////////////////// CMathContent.prototype.PreRecalc = function(Parent, ParaMath, ArgSize, RPI) { this.ParaMath = ParaMath; if(Parent !== null) { this.bRoot = false; this.Parent = Parent; } if(ArgSize !== null && ArgSize !== undefined) { this.Compiled_ArgSz.value = this.ArgSize.value; this.Compiled_ArgSz.Merge(ArgSize); } var lng = this.Content.length; var GapsInfo = new CMathGapsInfo(this.Compiled_ArgSz.value); if(!this.bRoot) this.RecalcInfo.bEqArray = this.Parent.IsEqArray(); for(var pos = 0; pos < lng; pos++) { if(this.Content[pos].Type == para_Math_Composition) { this.Content[pos].PreRecalc(this, ParaMath, this.Compiled_ArgSz, RPI, GapsInfo); } else if(this.Content[pos].Type == para_Math_Run) this.Content[pos].Math_PreRecalc(this, ParaMath, this.Compiled_ArgSz, RPI, GapsInfo); } if(GapsInfo.Current !== null) GapsInfo.Current.GapRight = 0; }; CMathContent.prototype.Math_UpdateGaps = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); var GapsInfo = new CMathGapsInfo(this.Compiled_ArgSz.value); if(StartPos !== undefined && EndPos !== undefined && CurLine < this.protected_GetLinesCount()) { if(CurLine > 0 && StartPos !== EndPos) // выставим объект, который будет Left для первого элемента в текущей строке { var EndPosPrev = this.protected_GetRangeEndPos(CurLine - 1, CurRange); this.Content[EndPosPrev].UpdLastElementForGaps(_CurLine - 1, _CurRange, GapsInfo); } for(var Pos = StartPos; Pos <= EndPos; Pos++) { this.Content[Pos].Math_UpdateGaps(_CurLine, _CurRange, GapsInfo); } } }; CMathContent.prototype.IsEqArray = function() { return this.RecalcInfo.bEqArray; }; CMathContent.prototype.Get_WidthPoints = function() { return this.InfoPoints.ContentPoints; }; CMathContent.prototype.ShiftPage = function(Dx) { this.Bounds.ShiftPage(Dx); for(var Pos = 0; Pos < this.Content.length; Pos++) { if(this.Content[Pos].Type === para_Math_Composition) this.Content[Pos].ShiftPage(Dx); } }; CMathContent.prototype.Get_CompiledArgSize = function() { return this.Compiled_ArgSz; }; CMathContent.prototype.getGapsInside = function(GapsInfo) // учитываем gaps внутренних объектов { var gaps = {left: 0, right: 0}; var bFirstComp = false, bLastComp = false; var len = this.Content.length; if(len > 1) { var bFRunEmpty = this.Content[0].Is_Empty(); bFirstComp = bFRunEmpty && this.Content[1].Type == para_Math_Composition; // первый всегда идет Run var bLastRunEmpty = this.Content[len - 1].Is_Empty(); // т.к. после мат. объекта стоит пустой Run bLastComp = bLastRunEmpty && this.Content[len - 2].Type == para_Math_Composition; } var checkGap; if(bFirstComp) { checkGap = GapsInfo.checkGapKind(this.Content[1]); if(!checkGap.bChildGaps) { gaps.left = GapsInfo.getGapsMComp(this.Content[1], -1); } } if(bLastComp) { checkGap = GapsInfo.checkGapKind(this.Content[len - 1]); if(!checkGap.bChildGaps) { gaps.right = GapsInfo.getGapsMComp(this.Content[len - 2], 1); } } return gaps; }; CMathContent.prototype.draw = function(x, y, pGraphics, PDSE) { var StartPos, EndPos; if(this.bRoot) { var CurLine = PDSE.Line - this.StartLine; var CurRange = ( 0 === CurLine ? PDSE.Range - this.StartRange : PDSE.Range ); StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); } else { StartPos = 0; EndPos = this.Content.length - 1; } var bHidePlh = this.plhHide && this.IsPlaceholder(); if( !bHidePlh ) { for(var i = StartPos; i <= EndPos;i++) { if(this.Content[i].Type == para_Math_Composition) { this.Content[i].draw(x, y, pGraphics, PDSE); } else this.Content[i].Draw_Elements(PDSE); } } }; CMathContent.prototype.Draw_Elements = function(PDSE) { var StartPos, EndPos; if(this.protected_GetLinesCount() > 0) { var CurLine = PDSE.Line - this.StartLine; var CurRange = ( 0 === CurLine ? PDSE.Range - this.StartRange : PDSE.Range ); StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); } else { StartPos = 0; EndPos = this.Content.length - 1; } var bHidePlh = this.plhHide && this.IsPlaceholder(); if( !bHidePlh ) { for(var CurPos = StartPos; CurPos <= EndPos;CurPos++) this.Content[CurPos].Draw_Elements(PDSE); } }; CMathContent.prototype.setCtrPrp = function(oPr) { if (!oPr) return; History.Add(new CChangesMathContentTextPr(this, this.CtrPrp, oPr)); this.CtrPrp = oPr; }; CMathContent.prototype.Is_InclineLetter = function() { var result = false; if(this.Content.length == 1) result = this.Content[0].Math_Is_InclineLetter(); return result; }; CMathContent.prototype.IsPlaceholder = function() { var bPlh = false; if(this.Content.length == 1) bPlh = this.Content[0].IsPlaceholder(); return bPlh; }; CMathContent.prototype.Can_GetSelection = function() { var bPlh = false; if(this.Content.length == 1) bPlh = this.Content[0].IsPlaceholder(); return bPlh || this.bRoot == false; }; CMathContent.prototype.IsJustDraw = function() { return false; }; CMathContent.prototype.ApplyPoints = function(WidthsPoints, Points, MaxDimWidths) { this.InfoPoints.GWidths = WidthsPoints; this.InfoPoints.GPoints = Points; this.InfoPoints.GMaxDimWidths = MaxDimWidths; // точки выравнивания данного контента содержатся в ContentPoints var PosInfo = new CMathPointInfo(); PosInfo.SetInfoPoints(this.InfoPoints); this.size.width = 0; for(var i = 0 ; i < this.Content.length; i++) { if(this.Content[i].Type === para_Math_Run) { this.Content[i].ApplyPoints(PosInfo); } this.size.width += this.Content[i].size.width; } this.Bounds.SetWidth(0, 0, this.size.width); }; CMathContent.prototype.UpdateBoundsPosInfo = function(PRSA, _CurLine, _CurRange, _CurPage) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); this.Bounds.SetGenPos(CurLine, CurRange, PRSA); this.Bounds.SetPage(CurLine, CurRange, _CurPage); for(var Pos = StartPos; Pos <= EndPos; Pos++) { if(this.Content[Pos].Type == para_Math_Composition) this.Content[Pos].UpdateBoundsPosInfo(PRSA, _CurLine, _CurRange, _CurPage); } }; CMathContent.prototype.setPosition = function(pos, PosInfo) { var Line = PosInfo.CurLine, Range = PosInfo.CurRange; var CurLine = Line - this.StartLine; var CurRange = ( 0 === CurLine ? Range - this.StartRange : Range ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); if(this.RecalcInfo.bEqArray) { var PosInfoEqq = new CMathPointInfo(); PosInfoEqq.SetInfoPoints(this.InfoPoints); pos.x += PosInfoEqq.GetAlign(); } this.pos.x = pos.x; this.pos.y = pos.y; this.Bounds.SetPos(CurLine, CurRange, this.pos); for(var Pos = StartPos; Pos <= EndPos; Pos++) { if(this.Content[Pos].Type == para_Math_Run) this.Content[Pos].Math_SetPosition(pos, PosInfo); else this.Content[Pos].setPosition(pos, PosInfo); } }; CMathContent.prototype.Shift_Range = function(Dx, Dy, _CurLine, _CurRange, _CurPage) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); this.Bounds.ShiftPos(CurLine, CurRange, Dx, Dy); CParagraphContentWithParagraphLikeContent.prototype.Shift_Range.call(this, Dx, Dy, _CurLine, _CurRange, _CurPage); }; CMathContent.prototype.SetParent = function(Parent, ParaMath) { this.Parent = Parent; this.ParaMath = ParaMath; }; CMathContent.prototype.CheckRunContent = function(fCheck, oStartPos, oEndPos, nDepth, oCurrentPos, isForward) { if (undefined === isForward) isForward = true; let nStartPos = oStartPos && oStartPos.GetDepth() >= nDepth ? oStartPos.Get(nDepth) : 0; let nEndPos = oEndPos && oEndPos.GetDepth() >= nDepth ? oEndPos.Get(nDepth) : this.Content.length - 1; if (isForward) { for (var nPos = nStartPos; nPos <= nEndPos; ++nPos) { let _s = oStartPos && nPos === nStartPos ? oStartPos : null; let _e = oEndPos && nPos === nEndPos ? oEndPos : null; if (oCurrentPos) oCurrentPos.Update(nPos, nDepth); if (!this.Content[nPos]) return false; if (this.Content[nPos].CheckRunContent(fCheck, _s, _e, nDepth + 1, oCurrentPos, isForward)) return true; } } else { for (var nPos = nEndPos; nPos >= nStartPos; --nPos) { let _s = oStartPos && nPos === nStartPos ? oStartPos : null; let _e = oEndPos && nPos === nEndPos ? oEndPos : null; if (oCurrentPos) oCurrentPos.Update(nPos, nDepth); if (!this.Content[nPos]) return false; if (this.Content[nPos].CheckRunContent(fCheck, _s, _e, nDepth + 1, oCurrentPos, isForward)) return true; } } }; /** * Get first find parent typeof CMathContent or MathBase * @return {*} */ CMathContent.prototype.GetMathBaseFirst = function() { return this; }; ///// properties ///// CMathContent.prototype.hidePlaceholder = function(flag) { this.plhHide = flag; }; ///////// RunPrp, CtrPrp CMathContent.prototype.Get_FirstTextPr = function() { return this.Content[0].Get_FirstTextPr(); }; CMathContent.prototype.getFirstRPrp = function() { return this.Content[0].Get_CompiledPr(true); }; CMathContent.prototype.GetCtrPrp = function() // for placeholder { if (this.CtrPrp) return this.CtrPrp; var ctrPrp = this.CtrPrp; if(!this.bRoot) ctrPrp.Merge( this.Parent.Get_CompiledCtrPrp_2() ); return ctrPrp; }; CMathContent.prototype.Is_FromDocument = function() { return (this.ParaMath && this.ParaMath.Paragraph && this.ParaMath.Paragraph.bFromDocument); }; CMathContent.prototype.IsAccent = function() { var result = false; if(!this.bRoot) result = this.Parent.IsAccent(); return result; }; //////////////////////// /// For Para Math CMathContent.prototype.GetParent = function() { return this.Parent ? this.Parent.GetParent() : null; }; CMathContent.prototype.SetArgSize = function(val) { AscCommon.History.Add(new CChangesMathContentArgSize(this, this.ArgSize.GetValue(), val)); this.ArgSize.SetValue(val); }; CMathContent.prototype.GetArgSize = function() { return this.ArgSize.value; }; ///////// Перемещение //////////// // Поиск позиции, селект CMathContent.prototype.IsSelectedAll = function(Props) { var bFirst = false, bEnd = false; if(this.Selection.StartPos == 0 && this.Selection.EndPos == this.Content.length - 1) { if(this.Content[this.Selection.StartPos].Type == para_Math_Run) bFirst = this.Content[this.Selection.StartPos].IsSelectedAll(Props); else bFirst = true; if(this.Content[this.Selection.EndPos].Type == para_Math_Run) bEnd = this.Content[this.Selection.EndPos].IsSelectedAll(Props); else bEnd = true; } return bFirst && bEnd; }; /////////////////////// CMathContent.prototype.Get_Id = function() { return this.GetId(); }; CMathContent.prototype.GetId = function() { return this.Id; }; CMathContent.prototype.private_CorrectContent = function() { var len = this.Content.length; var EmptyRun = null; var RPr = null; var CurrPos = 0; while(CurrPos < len) { var Current = this.Content[CurrPos]; var bLeftRun = CurrPos > 0 ? this.Content[CurrPos-1].Type == para_Math_Run : false, bRightRun = CurrPos < len - 1 ? this.Content[CurrPos + 1].Type === para_Math_Run : false; var bCurrComp = Current.Type == para_Math_Composition, bCurrEmptyRun = Current.Type == para_Math_Run && Current.Is_Empty(); var bDeleteEmptyRun = bCurrEmptyRun && (bLeftRun || bRightRun); if(bCurrComp && !bLeftRun) { EmptyRun = new ParaRun(null, true); EmptyRun.Set_RFont_ForMathRun(); RPr = Current.Get_CtrPrp(false); EmptyRun.Apply_Pr(RPr); this.Internal_Content_Add(CurrPos, EmptyRun); CurrPos += 2; } else if(bDeleteEmptyRun && false == Current.Is_CheckingNearestPos()) // если NearPosArray не нулевой длины, то это вызов происходит на InsertContent, не удаляем пустые Run { var tempPos = this.CurPos; this.Remove_FromContent(CurrPos, 1); if (tempPos === CurrPos) { if (bLeftRun) { this.CurPos = CurrPos - 1; this.Content[this.CurPos].MoveCursorToEndPos(false); } else { this.Content[this.CurPos].MoveCursorToStartPos(); } } } else { CurrPos++; } len = this.Content.length; } if(len > 1) { if(this.Content[len - 1].Type == para_Math_Composition) { EmptyRun = new ParaRun(null, true); EmptyRun.Set_RFont_ForMathRun(); RPr = this.Content[len - 1].Get_CtrPrp(false); EmptyRun.Apply_Pr(RPr); this.Internal_Content_Add(CurrPos, EmptyRun); } } }; CMathContent.prototype.Correct_Content = function(bInnerCorrection) { if (true === bInnerCorrection) { for (var nPos = 0, nCount = this.Content.length; nPos < nCount; nPos++) { if (para_Math_Composition === this.Content[nPos].Type) this.Content[nPos].Correct_Content(true); } } this.private_CorrectContent(); // Если в контенте ничего нет, тогда добавляем пустой ран if (this.Content.length < 1) { var NewMathRun = new ParaRun(null, true); NewMathRun.Set_RFont_ForMathRun(); this.Add_ToContent(0, NewMathRun); } // Если единственный элемент данного контента ран и он пустой, заполняем его плейсхолдером if (1 === this.Content.length && para_Math_Run === this.Content[0].Type && true === this.Content[0].Is_Empty()) { this.Content[0].AddMathPlaceholder(); } // Возможна ситуация, когда у нас остались лишние плейсхолдеры (либо их слишком много, либо они вообще не нужны) if (true !== this.IsPlaceholder()) { var isEmptyContent = true; for (var nPos = 0, nCount = this.Content.length; nPos < nCount; ++nPos) { if (para_Math_Run === this.Content[nPos].Type) { this.Content[nPos].RemoveMathPlaceholder(); if (false === this.Content[nPos].Is_Empty()) isEmptyContent = false; } else { isEmptyContent = false; } } if (isEmptyContent) this.SetPlaceholder(); } if (this.CurPos >= this.Content.length) this.CurPos = this.Content.length - 1; if (this.CurPos < 0) this.CurPos = 0; }; CMathContent.prototype.Correct_ContentPos = function(nDirection) { var nCurPos = this.CurPos; if (nCurPos < 0) { this.CurPos = 0; this.Content[0].MoveCursorToStartPos(); } else if (nCurPos > this.Content.length - 1) { this.CurPos = this.Content.length - 1; this.Content[this.CurPos].MoveCursorToEndPos(); } else if (para_Math_Run !== this.Content[nCurPos].Type) { if (nDirection > 0) { this.CurPos = nCurPos + 1; this.Content[this.CurPos].MoveCursorToStartPos(); } else { this.CurPos = nCurPos - 1; this.Content[this.CurPos].MoveCursorToEndPos(); } } }; /// функции для работы с курсором CMathContent.prototype.Cursor_Is_Start = function() { var result = false; if( !this.Is_Empty() ) { if(this.CurPos == 0) result = this.Content[0].Cursor_Is_Start(); } return result; }; CMathContent.prototype.Cursor_Is_End = function() { var result = false; if(!this.Is_Empty()) { var len = this.Content.length - 1; if(this.CurPos == len) { result = this.Content[len].Cursor_Is_End(); } } return result; }; ////////////////////////////////////// ///////////////////////// // Text Properties /////////////// CMathContent.prototype.Get_TextPr = function(ContentPos, Depth) { var pos = ContentPos.Get(Depth); var TextPr; if(true !== this.bRoot && this.IsPlaceholder()) TextPr = this.Parent.Get_CtrPrp(true); else TextPr = this.Content[pos].Get_TextPr(ContentPos, Depth + 1); return TextPr; }; CMathContent.prototype.GetDirectTextPr = function() { let textPr = null; if (this.IsPlaceholder()) { // ничего не делаем } else if (this.Selection.Use) { let startPos = this.Selection.StartPos; let endPos = this.Selection.EndPos; if (startPos > endPos) { startPos = this.Selection.EndPos; endPos = this.Selection.StartPos; } for (let pos = startPos; pos <= endPos; ++pos) { let curTextPr = this.Content[pos].GetDirectTextPr(false); if (!curTextPr) continue; if (!textPr) textPr = curTextPr.Copy(); else textPr = textPr.Compare(curTextPr); } if (!textPr) textPr = this.Parent.Get_CtrPrp(); } else { let pos = this.CurPos; if (0 <= pos && pos < this.Content.length) textPr = this.Content[pos].GetDirectTextPr(); } if (this.Parent) { if (!textPr) textPr = this.Parent.Get_CtrPrp(); else textPr = this.Parent.Get_CtrPrp().Copy().Compare(textPr); } return textPr; }; CMathContent.prototype.Get_ParentCtrRunPr = function(bCopy) { return this.Parent.Get_CtrPrp(bCopy); }; CMathContent.prototype.Get_CompiledTextPr = function(Copy, bAll) { var TextPr = null; if(true !== this.bRoot && this.IsPlaceholder()) { TextPr = this.Parent.Get_CompiledCtrPrp_2(); } else if (this.Selection.Use || bAll == true) { var StartPos, EndPos; if(bAll == true) { StartPos = 0; EndPos = this.Content.length - 1; } else { StartPos = this.Selection.StartPos; EndPos = this.Selection.EndPos; if ( StartPos > EndPos ) { StartPos = this.Selection.EndPos; EndPos = this.Selection.StartPos; } } // пропускаем пустые рана только для случая, когда есть селект while ( null === TextPr && StartPos <= EndPos ) { var bComp = this.Content[StartPos].Type == para_Math_Composition, bEmptyRun = this.Content[StartPos].Type == para_Math_Run && true === this.Content[StartPos].IsSelectionEmpty(); if(bComp || !bEmptyRun || bAll) //пропускаем пустые Run TextPr = this.Content[StartPos].Get_CompiledTextPr(true); StartPos++; } while(this.Content[EndPos].Type == para_Math_Run && true === this.Content[EndPos].IsSelectionEmpty() && StartPos < EndPos + 1 && bAll == false) //пропускаем пустые Run { EndPos--; } for ( var CurPos = StartPos; CurPos < EndPos + 1; CurPos++ ) { //var CurTextPr = this.Content[CurPos].Get_CompiledPr(false); var CurTextPr = this.Content[CurPos].Get_CompiledTextPr(false); if ( null !== CurTextPr ) TextPr = TextPr.Compare( CurTextPr ); } } else { var CurPos = this.CurPos; if ( CurPos >= 0 && CurPos < this.Content.length ) TextPr = this.Content[CurPos].Get_CompiledTextPr(Copy); } return TextPr; }; CMathContent.prototype.GetMathTextPrForMenu = function(ContentPos, Depth) { var pos = ContentPos.Get(Depth); return this.Content[pos].GetMathTextPrForMenu(ContentPos, Depth + 1); }; CMathContent.prototype.Apply_TextPr = function(TextPr, IncFontSize, ApplyToAll, StartPos, EndPos) { if ( true === ApplyToAll ) { for ( var i = 0; i < this.Content.length; i++ ) this.Content[i].Apply_TextPr( TextPr, IncFontSize, true ); } else { var StartPos, EndPos, bMenu = false; if(StartPos !== undefined && EndPos !== undefined) { StartPos = StartPos; EndPos = EndPos; bMenu = true; } else { StartPos = this.Selection.StartPos; EndPos = this.Selection.EndPos; } var NewRuns; var LRun, CRun, RRun; var bSelectOneElement = this.Selection.Use && StartPos == EndPos; var FirstPos = this.Selection.Use ? Math.min(StartPos, EndPos) : this.CurPos; if(FirstPos == 0 && this.bRoot) this.ParaMath.SetRecalcCtrPrp(this.Content[0]); if( ( !this.Selection.Use && !bMenu ) || (bSelectOneElement && this.Content[StartPos].Type == para_Math_Run) ) // TextPr меняем только в одном Run { var Pos = !this.Selection.Use ? this.CurPos : StartPos; NewRuns = this.Content[Pos].Apply_TextPr(TextPr, IncFontSize, false); LRun = NewRuns[0]; CRun = NewRuns[1]; RRun = NewRuns[2]; var CRunPos = Pos; if(LRun !== null) { this.Internal_Content_Add(Pos+1, CRun); CRunPos = Pos + 1; } if(RRun !== null) { this.Internal_Content_Add(CRunPos+1, RRun); } this.CurPos = CRunPos; this.Selection.StartPos = CRunPos; this.Selection.EndPos = CRunPos; } else if(bSelectOneElement && this.Content[StartPos].Type == para_Math_Composition) // заселекчен только один мат. объект { this.Content[StartPos].Apply_TextPr(TextPr, IncFontSize, true); } else { if(StartPos > EndPos) { var temp = StartPos; StartPos = EndPos; EndPos = temp; } for(var i = StartPos + 1; i < EndPos; i++) this.Content[i].Apply_TextPr(TextPr, IncFontSize, true ); if(this.Content[EndPos].Type == para_Math_Run) { NewRuns = this.Content[EndPos].Apply_TextPr(TextPr, IncFontSize, false); // LRun - null CRun = NewRuns[1]; RRun = NewRuns[2]; if(RRun !== null) { this.Internal_Content_Add(EndPos+1, RRun); } } else this.Content[EndPos].Apply_TextPr(TextPr, IncFontSize, true); if(this.Content[StartPos].Type == para_Math_Run) { NewRuns = this.Content[StartPos].Apply_TextPr(TextPr, IncFontSize, false); LRun = NewRuns[0]; CRun = NewRuns[1]; // RRun - null if(LRun !== null) { this.Internal_Content_Add(StartPos+1, CRun); } } else this.Content[StartPos].Apply_TextPr(TextPr, IncFontSize, true); var bStartComposition = this.Content[StartPos].Type == para_Math_Composition || (this.Content[StartPos].Is_Empty() && this.Content[StartPos + 1].Type == para_Math_Composition); var bEndCompostion = this.Content[EndPos].Type == para_Math_Composition || (this.Content[EndPos].Is_Empty() && this.Content[EndPos - 1].Type == para_Math_Composition); if(!bStartComposition) { if(this.Selection.StartPos < this.Selection.EndPos && true === this.Content[this.Selection.StartPos].IsSelectionEmpty(true) ) this.Selection.StartPos++; else if (this.Selection.EndPos < this.Selection.StartPos && true === this.Content[this.Selection.EndPos].IsSelectionEmpty(true) ) this.Selection.EndPos++; } if(!bEndCompostion) { if(this.Selection.StartPos < this.Selection.EndPos && true === this.Content[this.Selection.EndPos].IsSelectionEmpty(true) ) this.Selection.EndPos--; else if (this.Selection.EndPos < this.Selection.StartPos && true === this.Content[this.Selection.StartPos].IsSelectionEmpty(true) ) this.Selection.StartPos--; } } } }; CMathContent.prototype.Set_MathTextPr2 = function(TextPr, MathPr, bAll, StartPos, Count) { if(bAll) { StartPos = 0; Count = this.Content.length - 1; } if(Count < 0 || StartPos + Count > this.Content.length - 1) return; for(var pos = StartPos; pos <= StartPos + Count; pos++) this.Content[pos].Set_MathTextPr2(TextPr, MathPr, true); }; CMathContent.prototype.IsNormalTextInRuns = function() { var flag = true; if(this.Selection.Use) { var StartPos = this.Selection.StartPos, EndPos = this.Selection.EndPos; if ( StartPos > EndPos ) { StartPos = this.Selection.EndPos; EndPos = this.Selection.StartPos; } for(var i = StartPos; i < EndPos+1; i++) { var curr = this.Content[i], currType = curr.Type; if(currType == para_Math_Composition || (currType == para_Math_Run && false == curr.IsNormalText())) { flag = false; break; } } } else flag = false; return flag; }; CMathContent.prototype.Internal_Content_Add = function(Pos, Item, bUpdatePosition) { Item.Set_ParaMath(this.ParaMath); if (Item.SetParagraph) Item.SetParagraph(this.Paragraph); Item.Parent = this; Item.Recalc_RunsCompiledPr(); AscCommon.History.Add(new CChangesMathContentAddItem(this, Pos, [Item])); this.Content.splice(Pos, 0, Item); this.private_UpdatePosOnAdd(Pos, bUpdatePosition); }; CMathContent.prototype.private_UpdatePosOnAdd = function(Pos, bUpdatePosition) { if(bUpdatePosition !== false) { if ( this.CurPos >= Pos ) this.CurPos++; if ( this.Selection.StartPos >= Pos ) this.Selection.StartPos++; if ( this.Selection.EndPos >= Pos ) this.Selection.EndPos++; this.private_CorrectSelectionPos(); this.private_CorrectCurPos(); } // Обновляем позиции в NearestPos var NearPosLen = this.NearPosArray.length; for ( var Index = 0; Index < NearPosLen; Index++ ) { var HyperNearPos = this.NearPosArray[Index]; var ContentPos = HyperNearPos.NearPos.ContentPos; var Depth = HyperNearPos.Depth; if (ContentPos.Data[Depth] >= Pos) ContentPos.Data[Depth]++; } }; CMathContent.prototype.private_CorrectSelectionPos = function() { this.Selection.StartPos = Math.max(0, Math.min(this.Content.length - 1, this.Selection.StartPos)); this.Selection.EndPos = Math.max(0, Math.min(this.Content.length - 1, this.Selection.EndPos)); }; CMathContent.prototype.private_CorrectCurPos = function() { if (this.Content.length <= 0) { this.CurPos = 0; return; } if (this.CurPos > this.Content.length - 1) { this.CurPos = this.Content.length - 1; if (para_Math_Run === this.Content[this.CurPos].Type) this.Content[this.CurPos].MoveCursorToEndPos(false); } if (this.CurPos < 0) { this.CurPos = this.Content.length - 1; if (para_Math_Run === this.Content[this.CurPos].Type) this.Content[this.CurPos].MoveCursorToStartPos(); } }; CMathContent.prototype.Correct_ContentCurPos = function() { this.private_CorrectCurPos(); for(var Pos = 0; Pos < this.Content.length; Pos++) { if(this.Content[Pos].Type == para_Math_Composition) this.Content[Pos].Correct_ContentCurPos(); } }; CMathContent.prototype.SplitContent = function(NewContent, ContentPos, Depth) { var Pos = ContentPos.Get(Depth); if(para_Math_Run === this.Content[Pos].Type) { var NewRun = this.Content[Pos].Split(ContentPos, Depth+1); NewContent.Add_ToContent(0, NewRun); var len = this.Content.length; if(Pos < len - 1) { NewContent.Concat_ToEnd( this.Content.slice(Pos + 1) ); this.Remove_FromContent(Pos+1, len - Pos - 1); } } else { NewContent.Add_ToContent(0, new ParaRun(this.Paragraph, true)); } }; CMathContent.prototype.Add_ToContent = function(Pos, Item) { if (Item && para_Run === Item.Type) { var MathRun = new ParaRun(Item.GetParagraph(), true); this.Internal_Content_Add(Pos, MathRun); } else { this.Internal_Content_Add(Pos, Item); } }; CMathContent.prototype.Concat_ToEnd = function(NewItems) { this.ConcatToContent(2, NewItems); }; CMathContent.prototype.ConcatToContent = function(Pos, NewItems) { if (NewItems != undefined && NewItems.length > 0) { var Count = NewItems.length; for (var i = 0; i < Count; i++) { NewItems[i].Set_ParaMath(this.ParaMath); NewItems[i].Parent = this; NewItems[i].Recalc_RunsCompiledPr(); } AscCommon.History.Add(new CChangesMathContentAddItem(this, Pos, NewItems)); var Array_start = this.Content.slice(0, Pos); var Array_end = this.Content.slice(Pos); this.Content = Array_start.concat(NewItems, Array_end); } }; CMathContent.prototype.Remove_FromContent = function(Pos, Count) { if (Count <= 0) return; var DeletedItems = this.Content.splice(Pos, Count); AscCommon.History.Add(new CChangesMathContentRemoveItem(this, Pos, DeletedItems)); // Обновим текущую позицию if (this.CurPos > Pos + Count) this.CurPos -= Count; else if (this.CurPos > Pos) this.CurPos = Pos; this.private_CorrectCurPos(); this.private_UpdatePosOnRemove(Pos, Count); }; CMathContent.prototype.Remove_Content = function(Pos, Count) { this.Remove_FromContent(Pos, Count); }; CMathContent.prototype.private_UpdatePosOnRemove = function(Pos, Count) { // Обновим начало и конец селекта if (true === this.Selection.Use) { if (this.Selection.StartPos <= this.Selection.EndPos) { if (this.Selection.StartPos > Pos + Count) this.Selection.StartPos -= Count; else if (this.Selection.StartPos > Pos) this.Selection.StartPos = Pos; if (this.Selection.EndPos >= Pos + Count) this.Selection.EndPos -= Count; else if (this.Selection.EndPos >= Pos) this.Selection.EndPos = Math.max(0, Pos - 1); } else { if (this.Selection.StartPos >= Pos + Count) this.Selection.StartPos -= Count; else if (this.Selection.StartPos >= Pos) this.Selection.StartPos = Math.max(0, Pos - 1); if (this.Selection.EndPos > Pos + Count) this.Selection.EndPos -= Count; else if (this.Selection.EndPos > Pos) this.Selection.EndPos = Pos; } this.Selection.StartPos = Math.min(this.Content.length - 1, Math.max(0, this.Selection.StartPos)); this.Selection.EndPos = Math.min(this.Content.length - 1, Math.max(0, this.Selection.EndPos)); } // Обновляем позиции в NearestPos var NearPosLen = this.NearPosArray.length; for (var Index = 0; Index < NearPosLen; Index++) { var HyperNearPos = this.NearPosArray[Index]; var ContentPos = HyperNearPos.NearPos.ContentPos; var Depth = HyperNearPos.Depth; if (ContentPos.Data[Depth] > Pos + Count) ContentPos.Data[Depth] -= Count; else if (ContentPos.Data[Depth] > Pos) ContentPos.Data[Depth] = Math.max(0 , Pos); } }; CMathContent.prototype.Get_Default_TPrp = function() { return this.ParaMath.Get_Default_TPrp(); }; ///////////////////////// CMathContent.prototype.Is_Empty = function() { return this.Content.length == 0; }; CMathContent.prototype.Copy = function(Selected, oPr) { var NewContent = new CMathContent(); this.CopyTo(NewContent, Selected, oPr); return NewContent; }; CMathContent.prototype.CopyTo = function(OtherContent, Selected, oPr) { var nStartPos, nEndPos; if(true === Selected) { if(this.Selection.StartPos < this.Selection.EndPos) { nStartPos = this.Selection.StartPos; nEndPos = this.Selection.EndPos; } else { nStartPos = this.Selection.EndPos; nEndPos = this.Selection.StartPos; } } else { nStartPos = 0; nEndPos = this.Content.length - 1; } OtherContent.plHid = this.plhHide; OtherContent.SetArgSize(this.ArgSize.GetValue()); for(var nPos = nStartPos; nPos <= nEndPos; nPos++) { var oElement; if(this.Content[nPos].Type == para_Math_Run) oElement = this.Content[nPos].Copy(Selected, oPr); else oElement = this.Content[nPos].Copy(false, oPr); OtherContent.Internal_Content_Add(OtherContent.Content.length, oElement); } if(oPr && oPr.Comparison) { oPr.Comparison.checkReviewInfoOfCopiedElements(OtherContent, OtherContent); } }; CMathContent.prototype.getElem = function(nNum) { return this.Content[nNum]; }; CMathContent.prototype.GetLastElement = function() { var pos = this.Content.length - 1; while(this.Content[pos].Type == para_Math_Run && this.Content[pos].Is_Empty() && pos > 0) { pos--; } var last = this.Content[pos].Type == para_Math_Run ? this.Content[pos] : this.Content[pos].GetLastElement(); return last; }; CMathContent.prototype.GetFirstElement = function() { var pos = 0; while(this.Content[pos].Type == para_Math_Run && this.Content[pos].Is_Empty() && pos < this.Content.length - 1) { pos++; } var first = this.Content[pos].Type == para_Math_Run ? this.Content[pos] : this.Content[pos].GetFirstElement(); return first; }; //////////////////////////////////////////////////////////////// CMathContent.prototype.Write_ToBinary2 = function(Writer) { Writer.WriteLong(AscDFH.historyitem_type_MathContent); // Long : Id Writer.WriteString2(this.Id); }; CMathContent.prototype.Read_FromBinary2 = function(Reader) { // Long : Id this.Id = Reader.GetString2(); }; CMathContent.prototype.Refresh_RecalcData = function() { if(this.ParaMath !== null) this.ParaMath.Refresh_RecalcData(); // Refresh_RecalcData сообщает родительскому классу, что у него произошли изменения, нужно пересчитать }; CMathContent.prototype.InsertMathContent = function(oMathContent, nPos, isSelect) { if (!oMathContent || !oMathContent.Content) return; if (!this.ParaMath || !this.ParaMath.Paragraph) isSelect = false; if (undefined === nPos) nPos = this.CurPos; let nCount = oMathContent.Content.length; for (let nIndex = 0; nIndex < nCount; ++nIndex) { let oElement = oMathContent.Content[nIndex]; this.AddToContent(nPos + nIndex, oElement, true); if (isSelect) oElement.SelectAll(1); else oElement.RemoveSelection(); } let newPos = nPos + nCount + 1; if (this.Content[newPos]) this.Content[newPos].MoveCursorToStartPos(); else this.Content[--newPos].MoveCursorToEndPos(); if (isSelect) { this.Selection.Use = true; this.Selection.StartPos = nPos; this.Selection.EndPos = nPos + nCount - 1; this.CurPos = newPos; if (!this.bRoot) this.ParentElement.Select_MathContent(this); else this.ParaMath.bSelectionUse = true; this.ParaMath.SelectThisElement(1, true); } else { this.ParaMath.SetThisElementCurrent(); this.RemoveSelection(); if (!this.bRoot) this.ParentElement.SetCurrentMathContent(this); this.CurPos = newPos; } this.Correct_Content(true); this.Correct_ContentPos(-1); }; CMathContent.prototype.Set_ParaMath = function(ParaMath, Parent) { this.Parent = Parent; this.ParaMath = ParaMath; for (var Index = 0, Count = this.Content.length; Index < Count; Index++) { this.Content[Index].Set_ParaMath(ParaMath, this); } }; CMathContent.prototype.Load_FromMenu = function(Type, Paragraph, TextPr, oSelectedContent) { this.Paragraph = Paragraph; var Pr = { ctrPrp : TextPr ? TextPr.Copy() : new CTextPr() }; Pr.ctrPrp.Italic = true; Pr.ctrPrp.RFonts.SetAll("Cambria Math", -1); var MainType = Type >> 24; if (MainType === c_oAscMathMainType.Symbol) this.private_LoadFromMenuSymbol(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Fraction) this.private_LoadFromMenuFraction(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Script) this.private_LoadFromMenuScript(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Radical) this.private_LoadFromMenuRadical(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Integral) this.private_LoadFromMenuIntegral(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.LargeOperator) this.private_LoadFromMenuLargeOperator(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Bracket) this.private_LoadFromMenuBracket(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Function) this.private_LoadFromMenuFunction(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Accent) this.private_LoadFromMenuAccent(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.LimitLog) this.private_LoadFromMenuLimitLog(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Operator) this.private_LoadFromMenuOperator(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Matrix) this.private_LoadFromMenuMatrix(Type, Pr, oSelectedContent); else if (MainType === c_oAscMathMainType.Empty_Content) this.private_LoadFromMenuDefaultText(Type, Pr, oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuSymbol = function(Type, Pr) { var Code = -1; switch (Type) { case c_oAscMathType.Symbol_pm : Code = 0x00B1; break; case c_oAscMathType.Symbol_infinity : Code = 0x221E; break; case c_oAscMathType.Symbol_equals : Code = 0x003D; break; case c_oAscMathType.Symbol_neq : Code = 0x2260; break; case c_oAscMathType.Symbol_about : Code = 0x007E; break; case c_oAscMathType.Symbol_times : Code = 0x00D7; break; case c_oAscMathType.Symbol_div : Code = 0x00F7; break; case c_oAscMathType.Symbol_factorial : Code = 0x0021; break; case c_oAscMathType.Symbol_propto : Code = 0x221D; break; case c_oAscMathType.Symbol_less : Code = 0x003C; break; case c_oAscMathType.Symbol_ll : Code = 0x226A; break; case c_oAscMathType.Symbol_greater : Code = 0x003E; break; case c_oAscMathType.Symbol_gg : Code = 0x226B; break; case c_oAscMathType.Symbol_leq : Code = 0x2264; break; case c_oAscMathType.Symbol_geq : Code = 0x2265; break; case c_oAscMathType.Symbol_mp : Code = 0x2213; break; case c_oAscMathType.Symbol_cong : Code = 0x2245; break; case c_oAscMathType.Symbol_approx : Code = 0x2248; break; case c_oAscMathType.Symbol_equiv : Code = 0x2261; break; case c_oAscMathType.Symbol_forall : Code = 0x2200; break; case c_oAscMathType.Symbol_additional : Code = 0x2201; break; case c_oAscMathType.Symbol_partial : Code = 0x1D715; break; case c_oAscMathType.Symbol_sqrt : Code = 0x221A; break; case c_oAscMathType.Symbol_cbrt : Code = 0x221B; break; case c_oAscMathType.Symbol_qdrt : Code = 0x221C; break; case c_oAscMathType.Symbol_cup : Code = 0x222A; break; case c_oAscMathType.Symbol_cap : Code = 0x2229; break; case c_oAscMathType.Symbol_emptyset : Code = 0x2205; break; case c_oAscMathType.Symbol_percent : Code = 0x0025; break; case c_oAscMathType.Symbol_degree : Code = 0x00B0; break; case c_oAscMathType.Symbol_fahrenheit : Code = 0x2109; break; case c_oAscMathType.Symbol_celsius : Code = 0x2103; break; case c_oAscMathType.Symbol_inc : Code = 0x2206; break; case c_oAscMathType.Symbol_nabla : Code = 0x2207; break; case c_oAscMathType.Symbol_exists : Code = 0x2203; break; case c_oAscMathType.Symbol_notexists : Code = 0x2204; break; case c_oAscMathType.Symbol_in : Code = 0x2208; break; case c_oAscMathType.Symbol_ni : Code = 0x220B; break; case c_oAscMathType.Symbol_leftarrow : Code = 0x2190; break; case c_oAscMathType.Symbol_uparrow : Code = 0x2191; break; case c_oAscMathType.Symbol_rightarrow : Code = 0x2192; break; case c_oAscMathType.Symbol_downarrow : Code = 0x2193; break; case c_oAscMathType.Symbol_leftrightarrow : Code = 0x2194; break; case c_oAscMathType.Symbol_therefore : Code = 0x2234; break; case c_oAscMathType.Symbol_plus : Code = 0x002B; break; case c_oAscMathType.Symbol_minus : Code = 0x2212; break; case c_oAscMathType.Symbol_not : Code = 0x00AC; break; case c_oAscMathType.Symbol_ast : Code = 0x2217; break; case c_oAscMathType.Symbol_bullet : Code = 0x2219; break; case c_oAscMathType.Symbol_vdots : Code = 0x22EE; break; case c_oAscMathType.Symbol_cdots : Code = 0x22EF; break; case c_oAscMathType.Symbol_rddots : Code = 0x22F0; break; case c_oAscMathType.Symbol_ddots : Code = 0x22F1; break; case c_oAscMathType.Symbol_aleph : Code = 0x2135; break; case c_oAscMathType.Symbol_beth : Code = 0x2136; break; case c_oAscMathType.Symbol_QED : Code = 0x220E; break; case c_oAscMathType.Symbol_alpha : Code = 0x03B1; break; case c_oAscMathType.Symbol_beta : Code = 0x03B2; break; case c_oAscMathType.Symbol_gamma : Code = 0x03B3; break; case c_oAscMathType.Symbol_delta : Code = 0x03B4; break; case c_oAscMathType.Symbol_varepsilon : Code = 0x03B5; break; case c_oAscMathType.Symbol_epsilon : Code = 0x03F5; break; case c_oAscMathType.Symbol_zeta : Code = 0x03B6; break; case c_oAscMathType.Symbol_eta : Code = 0x03B7; break; case c_oAscMathType.Symbol_theta : Code = 0x03B8; break; case c_oAscMathType.Symbol_vartheta : Code = 0x03D1; break; case c_oAscMathType.Symbol_iota : Code = 0x03B9; break; case c_oAscMathType.Symbol_kappa : Code = 0x03BA; break; case c_oAscMathType.Symbol_lambda : Code = 0x03BB; break; case c_oAscMathType.Symbol_mu : Code = 0x03BC; break; case c_oAscMathType.Symbol_nu : Code = 0x03BD; break; case c_oAscMathType.Symbol_xsi : Code = 0x03BE; break; case c_oAscMathType.Symbol_o : Code = 0x03BF; break; case c_oAscMathType.Symbol_pi : Code = 0x03C0; break; case c_oAscMathType.Symbol_varpi : Code = 0x03D6; break; case c_oAscMathType.Symbol_rho : Code = 0x03C1; break; case c_oAscMathType.Symbol_varrho : Code = 0x03F1; break; case c_oAscMathType.Symbol_sigma : Code = 0x03C3; break; case c_oAscMathType.Symbol_varsigma : Code = 0x03C2; break; case c_oAscMathType.Symbol_tau : Code = 0x03C4; break; case c_oAscMathType.Symbol_upsilon : Code = 0x03C5; break; case c_oAscMathType.Symbol_varphi : Code = 0x03C6; break; case c_oAscMathType.Symbol_phi : Code = 0x03D5; break; case c_oAscMathType.Symbol_chi : Code = 0x03C7; break; case c_oAscMathType.Symbol_psi : Code = 0x03C8; break; case c_oAscMathType.Symbol_omega : Code = 0x03C9; break; case c_oAscMathType.Symbol_Alpha : Code = 0x0391; break; case c_oAscMathType.Symbol_Beta : Code = 0x0392; break; case c_oAscMathType.Symbol_Gamma : Code = 0x0393; break; case c_oAscMathType.Symbol_Delta : Code = 0x0394; break; case c_oAscMathType.Symbol_Epsilon : Code = 0x0395; break; case c_oAscMathType.Symbol_Zeta : Code = 0x0396; break; case c_oAscMathType.Symbol_Eta : Code = 0x0397; break; case c_oAscMathType.Symbol_Theta : Code = 0x0398; break; case c_oAscMathType.Symbol_Iota : Code = 0x0399; break; case c_oAscMathType.Symbol_Kappa : Code = 0x039A; break; case c_oAscMathType.Symbol_Lambda : Code = 0x039B; break; case c_oAscMathType.Symbol_Mu : Code = 0x039C; break; case c_oAscMathType.Symbol_Nu : Code = 0x039D; break; case c_oAscMathType.Symbol_Xsi : Code = 0x039E; break; case c_oAscMathType.Symbol_O : Code = 0x039F; break; case c_oAscMathType.Symbol_Pi : Code = 0x03A0; break; case c_oAscMathType.Symbol_Rho : Code = 0x03A1; break; case c_oAscMathType.Symbol_Sigma : Code = 0x03A3; break; case c_oAscMathType.Symbol_Tau : Code = 0x03A4; break; case c_oAscMathType.Symbol_Upsilon : Code = 0x03A5; break; case c_oAscMathType.Symbol_Phi : Code = 0x03A6; break; case c_oAscMathType.Symbol_Chi : Code = 0x03A7; break; case c_oAscMathType.Symbol_Psi : Code = 0x03A8; break; case c_oAscMathType.Symbol_Omega : Code = 0x03A9; break; default: return; } if (this.Content.length <= 0) this.Correct_Content(); let mathPr = undefined; if (this.Content.length > 0 && this.Content[this.CurPos].Type == para_Math_Run && this.IsSelectionEmpty() == true) // находимся в Run, селект отсутствует mathPr = this.Content[this.CurPos].GetMathPr(); this.Add_Symbol(Code, Pr.ctrPrp, mathPr); }; CMathContent.prototype.private_LoadFromMenuFraction = function(Type, Pr, oSelectedContent) { var oFraction = null; switch (Type) { case c_oAscMathType.FractionVertical : oFraction = this.Add_Fraction(Pr, null, null); break; case c_oAscMathType.FractionDiagonal : oFraction = this.Add_Fraction({ctrPrp : Pr.ctrPrp, type : SKEWED_FRACTION}, null, null); break; case c_oAscMathType.FractionHorizontal : oFraction = this.Add_Fraction({ctrPrp : Pr.ctrPrp, type : LINEAR_FRACTION}, null, null); break; case c_oAscMathType.FractionSmall: var oBox = new CBox(Pr); this.Add_Element(oBox); var BoxMathContent = oBox.getBase(); BoxMathContent.SetArgSize(-1); oFraction = BoxMathContent.Add_Fraction(Pr, null, null); oBox.Correct_Content(true); oBox.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.FractionDifferential_1 : oFraction = this.Add_Fraction(Pr, "dx", "dy"); break; case c_oAscMathType.FractionDifferential_2 : oFraction = this.Add_Fraction(Pr, String.fromCharCode(916) + "y", String.fromCharCode(916) + "x"); break; case c_oAscMathType.FractionDifferential_3 : oFraction = this.Add_Fraction(Pr, String.fromCharCode(8706) + "y", String.fromCharCode(8706) + "x"); break; case c_oAscMathType.FractionDifferential_4 : oFraction = this.Add_Fraction(Pr, String.fromCharCode(948) + "y", String.fromCharCode(948) + "x"); break; case c_oAscMathType.FractionPi_2 : oFraction = this.Add_Fraction(Pr, String.fromCharCode(960), "2"); break; } if (oFraction) { oFraction.Correct_Content(true); oFraction.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oFraction && oSelectedContent) oFraction.getNumeratorMathContent().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuScript = function(Type, Pr, oSelectedContent) { var oScript = null; switch (Type) { case c_oAscMathType.ScriptSup : oScript = this.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, null, null, null); break; case c_oAscMathType.ScriptSub : oScript = this.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUBSCRIPT}, null, null, null); break; case c_oAscMathType.ScriptSubSup : oScript = this.Add_Script(true, {ctrPrp : Pr.ctrPrp, type : DEGREE_SubSup}, null, null, null); break; case c_oAscMathType.ScriptSubSupLeft : oScript = this.Add_Script(true, {ctrPrp : Pr.ctrPrp, type : DEGREE_PreSubSup}, null, null, null); break; case c_oAscMathType.ScriptCustom_1: Pr.type = DEGREE_SUBSCRIPT; var Script = this.Add_Script(false, Pr, "x", null, null); var SubMathContent = Script.getLowerIterator(); Pr.type = DEGREE_SUPERSCRIPT; SubMathContent.Add_Script(false, Pr, "y", "2", null); Script.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.ScriptCustom_2 : oScript = this.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "e", "-i" + String.fromCharCode(969) + "t", null); break; case c_oAscMathType.ScriptCustom_3 : oScript = this.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "x", "2", null); break; case c_oAscMathType.ScriptCustom_4 : oScript = this.Add_Script(true, {ctrPrp : Pr.ctrPrp, type : DEGREE_PreSubSup}, "Y", "n", "1"); break; } if (oScript) { oScript.Correct_Content(true); oScript.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oScript && oSelectedContent) oScript.getBase().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuRadical = function(Type, Pr, oSelectedContent) { var oRadical = null; switch (Type) { case c_oAscMathType.RadicalSqrt: Pr.type = SQUARE_RADICAL; Pr.degHide = true; oRadical = this.Add_Radical(Pr, null, null); break; case c_oAscMathType.RadicalRoot_n: Pr.type = DEGREE_RADICAL; oRadical = this.Add_Radical(Pr, null, null); break; case c_oAscMathType.RadicalRoot_2: Pr.type = DEGREE_RADICAL; oRadical = this.Add_Radical(Pr, null, "2"); break; case c_oAscMathType.RadicalRoot_3: Pr.type = DEGREE_RADICAL; oRadical = this.Add_Radical(Pr, null, "3"); break; case c_oAscMathType.RadicalCustom_1: var Fraction = this.Add_Fraction(Pr, null, null); var NumMathContent = Fraction.getNumeratorMathContent(); var DenMathContent = Fraction.getDenominatorMathContent(); NumMathContent.Add_Text("-b" + String.fromCharCode(177), this.Paragraph); Pr.type = SQUARE_RADICAL; Pr.degHide = true; var Radical = NumMathContent.Add_Radical(Pr, null, null); var oRadicalBase = Radical.getBase(); oRadicalBase.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "b", "2", null); oRadicalBase.Add_Text("-4ac", this.Paragraph); DenMathContent.Add_Text("2a", this.Paragraph); Fraction.Correct_Content(true); Fraction.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.RadicalCustom_2: Pr.type = SQUARE_RADICAL; Pr.degHide = true; oRadical = this.Add_Radical(Pr, null, null); var BaseMathContent = oRadical.getBase(); var ScriptPr = {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}; BaseMathContent.Add_Script(false, ScriptPr, "a", "2", null); BaseMathContent.Add_Text("+", this.Paragraph); BaseMathContent.Add_Script(false, ScriptPr, "b", "2", null); break; } if (oRadical) { oRadical.Correct_Content(true); oRadical.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oRadical && oSelectedContent) oRadical.getBase().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuIntegral = function(Type, Pr, oSelectedContent) { var oIntegral = null, oBox; switch(Type) { case c_oAscMathType.Integral : oIntegral = this.Add_Integral(1, false, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralSubSup : oIntegral = this.Add_Integral(1, false, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralCenterSubSup : oIntegral = this.Add_Integral(1, false, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralDouble : oIntegral = this.Add_Integral(2, false, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralDoubleSubSup : oIntegral = this.Add_Integral(2, false, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralDoubleCenterSubSup : oIntegral = this.Add_Integral(2, false, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralTriple : oIntegral = this.Add_Integral(3, false, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralTripleSubSup : oIntegral = this.Add_Integral(3, false, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralTripleCenterSubSup : oIntegral = this.Add_Integral(3, false, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOriented : oIntegral = this.Add_Integral(1, true, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedSubSup : oIntegral = this.Add_Integral(1, true, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedCenterSubSup : oIntegral = this.Add_Integral(1, true, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedDouble : oIntegral = this.Add_Integral(2, true, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedDoubleSubSup : oIntegral = this.Add_Integral(2, true, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedDoubleCenterSubSup : oIntegral = this.Add_Integral(2, true, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedTriple : oIntegral = this.Add_Integral(3, true, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedTripleSubSup : oIntegral = this.Add_Integral(3, true, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.IntegralOrientedTripleCenterSubSup : oIntegral = this.Add_Integral(3, true, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.Integral_dx: Pr.diff = 1; oBox = this.Add_Box(Pr, "dx"); oBox.Correct_Content(true); oBox.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Integral_dy: Pr.diff = 1; oBox = this.Add_Box(Pr, "dy"); oBox.Correct_Content(true); oBox.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Integral_dtheta: Pr.diff = 1; oBox = this.Add_Box(Pr, "d" + String.fromCharCode(952)); oBox.Correct_Content(true); oBox.Apply_TextPr(Pr.ctrPrp, undefined, true); break; } if (oIntegral) { oIntegral.Correct_Content(true); oIntegral.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oIntegral && oSelectedContent) oIntegral.getBase().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuLargeOperator = function(Type, Pr, oSelectedContent) { var oOperator = null; switch(Type) { case c_oAscMathType.LargeOperator_Sum : oOperator = this.Add_LargeOperator(1, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Sum_CenterSubSup : oOperator = this.Add_LargeOperator(1, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Sum_SubSup : oOperator = this.Add_LargeOperator(1, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Sum_CenterSub : oOperator = this.Add_LargeOperator(1, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Sum_Sub : oOperator = this.Add_LargeOperator(1, NARY_SubSup, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Prod : oOperator = this.Add_LargeOperator(2, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Prod_CenterSubSup : oOperator = this.Add_LargeOperator(2, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Prod_SubSup : oOperator = this.Add_LargeOperator(2, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Prod_CenterSub : oOperator = this.Add_LargeOperator(2, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Prod_Sub : oOperator = this.Add_LargeOperator(2, NARY_SubSup, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_CoProd : oOperator = this.Add_LargeOperator(3, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_CoProd_CenterSubSup : oOperator = this.Add_LargeOperator(3, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_CoProd_SubSup : oOperator = this.Add_LargeOperator(3, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_CoProd_CenterSub : oOperator = this.Add_LargeOperator(3, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_CoProd_Sub : oOperator = this.Add_LargeOperator(3, NARY_SubSup, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Union : oOperator = this.Add_LargeOperator(4, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Union_CenterSubSup : oOperator = this.Add_LargeOperator(4, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Union_SubSup : oOperator = this.Add_LargeOperator(4, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Union_CenterSub : oOperator = this.Add_LargeOperator(4, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Union_Sub : oOperator = this.Add_LargeOperator(4, NARY_SubSup, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Intersection : oOperator = this.Add_LargeOperator(5, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Intersection_CenterSubSup : oOperator = this.Add_LargeOperator(5, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Intersection_SubSup : oOperator = this.Add_LargeOperator(5, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Intersection_CenterSub : oOperator = this.Add_LargeOperator(5, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Intersection_Sub : oOperator = this.Add_LargeOperator(5, NARY_SubSup, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Disjunction : oOperator = this.Add_LargeOperator(6, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Disjunction_CenterSubSup : oOperator = this.Add_LargeOperator(6, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Disjunction_SubSup : oOperator = this.Add_LargeOperator(6, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Disjunction_CenterSub : oOperator = this.Add_LargeOperator(6, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Disjunction_Sub : oOperator = this.Add_LargeOperator(6, NARY_SubSup, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Conjunction : oOperator = this.Add_LargeOperator(7, NARY_UndOvr, true, true, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Conjunction_CenterSubSup : oOperator = this.Add_LargeOperator(7, NARY_UndOvr, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Conjunction_SubSup : oOperator = this.Add_LargeOperator(7, NARY_SubSup, false, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Conjunction_CenterSub : oOperator = this.Add_LargeOperator(7, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Conjunction_Sub : oOperator = this.Add_LargeOperator(7, NARY_SubSup, true, false, Pr.ctrPrp, null, null, null); break; case c_oAscMathType.LargeOperator_Custom_1: var Sum = this.Add_LargeOperator(1, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, "k"); var BaseMathContent = Sum.getBaseMathContent(); var Delimiter = BaseMathContent.Add_Delimiter({ctrPrp : Pr.ctrPrp, column : 1}, 1, [null]); var DelimiterMathContent = Delimiter.getElementMathContent(0); DelimiterMathContent.Add_Fraction({ctrPrp: Pr.ctrPrp, type : NO_BAR_FRACTION}, "n", "k"); Sum.Correct_Content(true); Sum.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.LargeOperator_Custom_2: var Sum = this.Add_LargeOperator(1, NARY_UndOvr, false, false, Pr.ctrPrp, null, "n", "i=0"); Sum.Correct_Content(true); Sum.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.LargeOperator_Custom_3: var Sum = this.Add_LargeOperator(1, NARY_UndOvr, true, false, Pr.ctrPrp, null, null, null); var SubMathContent = Sum.getSubMathContent(); SubMathContent.Add_EqArray({ctrPrp: Pr.ctrPrp, row : 2}, 2, ["0≤ i ≤ m", "0< j < n"]); var BaseMathContent = Sum.getBaseMathContent(); BaseMathContent.Add_Text("P", this.Paragraph); BaseMathContent.Add_Delimiter({ctrPrp : Pr.ctrPrp, column : 1}, 1, ["i, j"]); Sum.Correct_Content(true); Sum.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.LargeOperator_Custom_4: var Prod = this.Add_LargeOperator(2, NARY_UndOvr, false, false, Pr.ctrPrp, null, "n", "k=1"); var BaseMathContent = Prod.getBaseMathContent(); BaseMathContent.Add_Script(false, {ctrPrp: Pr.ctrPrp, type : DEGREE_SUBSCRIPT}, "A", null, "k"); Prod.Correct_Content(true); Prod.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.LargeOperator_Custom_5: var Union = this.Add_LargeOperator(4, NARY_UndOvr, false, false, Pr.ctrPrp, null, "m", "n=1"); var BaseMathContent = Union.getBaseMathContent(); var Delimiter = BaseMathContent.Add_Delimiter({ctrPrp : Pr.ctrPrp, column : 1}, 1, [null]); BaseMathContent = Delimiter.getElementMathContent(0); BaseMathContent.Add_Script(false, {ctrPrp: Pr.ctrPrp, type : DEGREE_SUBSCRIPT}, "X", null, "n"); BaseMathContent.Add_Text(String.fromCharCode(8745), this.Paragraph); BaseMathContent.Add_Script(false, {ctrPrp: Pr.ctrPrp, type : DEGREE_SUBSCRIPT}, "Y", null, "n"); Union.Correct_Content(true); Union.Apply_TextPr(Pr.ctrPrp, undefined, true); break; } if (oOperator) { oOperator.Correct_Content(true); oOperator.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oOperator && oSelectedContent) oOperator.getBase().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuBracket = function(Type, Pr, oSelectedContent) { var oBracket = null; var oFraction = null; switch(Type) { case c_oAscMathType.Bracket_Round : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], null, null); break; case c_oAscMathType.Bracket_Square : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 91, 93); break; case c_oAscMathType.Bracket_Curve : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 123, 125); break; case c_oAscMathType.Bracket_Angle : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 10216, 10217); break; case c_oAscMathType.Bracket_LowLim : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 0x230A, 0x230B); break; case c_oAscMathType.Bracket_UppLim : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 0x2308, 0x2309); break; case c_oAscMathType.Bracket_Line : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 124, 124); break; case c_oAscMathType.Bracket_LineDouble : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 8214, 8214); break; case c_oAscMathType.Bracket_Square_OpenOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 91, 91); break; case c_oAscMathType.Bracket_Square_CloseClose : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 93, 93); break; case c_oAscMathType.Bracket_Square_CloseOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 93, 91); break; case c_oAscMathType.Bracket_SquareDouble : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 10214, 10215); break; case c_oAscMathType.Bracket_Round_Delimiter_2 : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 2, [null, null], null, null); break; case c_oAscMathType.Bracket_Curve_Delimiter_2 : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 2, [null, null], 123, 125); break; case c_oAscMathType.Bracket_Angle_Delimiter_2 : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 2, [null, null], 10216, 10217); break; case c_oAscMathType.Bracket_Angle_Delimiter_3 : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 3, [null, null, null], 10216, 10217); break; case c_oAscMathType.Bracket_Round_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], null, -1); break; case c_oAscMathType.Bracket_Round_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, null); break; case c_oAscMathType.Bracket_Square_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 91, -1); break; case c_oAscMathType.Bracket_Square_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 93); break; case c_oAscMathType.Bracket_Curve_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 123, -1); break; case c_oAscMathType.Bracket_Curve_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 125); break; case c_oAscMathType.Bracket_Angle_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 10216, -1); break; case c_oAscMathType.Bracket_Angle_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 10217); break; case c_oAscMathType.Bracket_LowLim_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 0x230A, -1); break; case c_oAscMathType.Bracket_LowLim_NoneNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 0x230B); break; case c_oAscMathType.Bracket_UppLim_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 0x2308, -1); break; case c_oAscMathType.Bracket_UppLim_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 0x2309); break; case c_oAscMathType.Bracket_Line_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 124, -1); break; case c_oAscMathType.Bracket_Line_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 124); break; case c_oAscMathType.Bracket_LineDouble_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 8214, -1); break; case c_oAscMathType.Bracket_LineDouble_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 8214); break; case c_oAscMathType.Bracket_SquareDouble_OpenNone : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 10214, -1); break; case c_oAscMathType.Bracket_SquareDouble_NoneOpen : oBracket = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], -1, 10215); break; case c_oAscMathType.Bracket_Custom_1: var Delimiter = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 123, -1); var BaseMathContent = Delimiter.getElementMathContent(0); oBracket = BaseMathContent.Add_EqArray({ctrPrp : Pr.ctrPrp, row : 2}, 2, [null, null]); Delimiter.Correct_Content(true); Delimiter.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Bracket_Custom_2: var Delimiter = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 123, -1); var BaseMathContent = Delimiter.getElementMathContent(0); oBracket = BaseMathContent.Add_EqArray({ctrPrp : Pr.ctrPrp, row : 3}, 3, [null, null, null]); Delimiter.Correct_Content(true); Delimiter.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Bracket_Custom_3: oFraction = this.Add_Fraction({ctrPrp : Pr.ctrPrp, type : NO_BAR_FRACTION}, null, null); oFraction.Correct_Content(true); oFraction.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Bracket_Custom_4: var Delimiter = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], null, null); var BaseMathContent = Delimiter.getElementMathContent(0); oFraction = BaseMathContent.Add_Fraction({ctrPrp : Pr.ctrPrp, type : NO_BAR_FRACTION}, null, null); Delimiter.Correct_Content(true); Delimiter.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Bracket_Custom_5: this.Add_Text("f", this.Paragraph); this.Add_DelimiterEx(Pr.ctrPrp, 1, ["x"], null, null); this.Add_Text("=", this.Paragraph); var Delimiter = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 123, -1); var BaseMathContent = Delimiter.getElementMathContent(0); oBracket = BaseMathContent.Add_EqArray({ctrPrp : Pr.ctrPrp, row : 2}, 2, ["-x, &x<0", "x, &x" + String.fromCharCode(8805) + "0"]); break; case c_oAscMathType.Bracket_Custom_6: var Delimiter = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], null, null); var BaseMathContent = Delimiter.getElementMathContent(0); BaseMathContent.Add_Fraction({ctrPrp : Pr.ctrPrp, type : NO_BAR_FRACTION}, "n", "k"); Delimiter.Correct_Content(true); Delimiter.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Bracket_Custom_7: var Delimiter = this.Add_DelimiterEx(Pr.ctrPrp, 1, [null], 10216, 10217); var BaseMathContent = Delimiter.getElementMathContent(0); BaseMathContent.Add_Fraction({ctrPrp : Pr.ctrPrp, type : NO_BAR_FRACTION}, "n", "k"); Delimiter.Correct_Content(true); Delimiter.Apply_TextPr(Pr.ctrPrp, undefined, true); break; } if (oBracket) { oBracket.Correct_Content(true); oBracket.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oBracket && oSelectedContent) oBracket.getElementMathContent(0).private_FillSelectedContent(oSelectedContent); else if (oFraction && oSelectedContent) oFraction.getNumeratorMathContent().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuFunction = function(Type, Pr, oSelectedContent) { var oFunction = null; switch(Type) { case c_oAscMathType.Function_Sin : oFunction = this.Add_Function(Pr, "sin", null); break; case c_oAscMathType.Function_Cos : oFunction = this.Add_Function(Pr, "cos", null); break; case c_oAscMathType.Function_Tan : oFunction = this.Add_Function(Pr, "tan", null); break; case c_oAscMathType.Function_Csc : oFunction = this.Add_Function(Pr, "csc", null); break; case c_oAscMathType.Function_Sec : oFunction = this.Add_Function(Pr, "sec", null); break; case c_oAscMathType.Function_Cot : oFunction = this.Add_Function(Pr, "cot", null); break; case c_oAscMathType.Function_1_Sin : oFunction = this.Add_Function_1(Pr, "sin", null); break; case c_oAscMathType.Function_1_Cos : oFunction = this.Add_Function_1(Pr, "cos", null); break; case c_oAscMathType.Function_1_Tan : oFunction = this.Add_Function_1(Pr, "tan", null); break; case c_oAscMathType.Function_1_Csc : oFunction = this.Add_Function_1(Pr, "csc", null); break; case c_oAscMathType.Function_1_Sec : oFunction = this.Add_Function_1(Pr, "sec", null); break; case c_oAscMathType.Function_1_Cot : oFunction = this.Add_Function_1(Pr, "cot", null); break; case c_oAscMathType.Function_Sinh : oFunction = this.Add_Function(Pr, "sinh", null); break; case c_oAscMathType.Function_Cosh : oFunction = this.Add_Function(Pr, "cosh", null); break; case c_oAscMathType.Function_Tanh : oFunction = this.Add_Function(Pr, "tanh", null); break; case c_oAscMathType.Function_Csch : oFunction = this.Add_Function(Pr, "csch", null); break; case c_oAscMathType.Function_Sech : oFunction = this.Add_Function(Pr, "sech", null); break; case c_oAscMathType.Function_Coth : oFunction = this.Add_Function(Pr, "coth", null); break; case c_oAscMathType.Function_1_Sinh : oFunction = this.Add_Function_1(Pr, "sinh", null); break; case c_oAscMathType.Function_1_Cosh : oFunction = this.Add_Function_1(Pr, "cosh", null); break; case c_oAscMathType.Function_1_Tanh : oFunction = this.Add_Function_1(Pr, "tanh", null); break; case c_oAscMathType.Function_1_Csch : oFunction = this.Add_Function_1(Pr, "csch", null); break; case c_oAscMathType.Function_1_Sech : oFunction = this.Add_Function_1(Pr, "sech", null); break; case c_oAscMathType.Function_1_Coth : oFunction = this.Add_Function_1(Pr, "coth", null); break; case c_oAscMathType.Function_Custom_1 : oFunction = this.Add_Function(Pr, "sin", String.fromCharCode(952)); break; case c_oAscMathType.Function_Custom_2 : oFunction = this.Add_Function(Pr, "cos", "2x"); break; case c_oAscMathType.Function_Custom_3: var Theta = String.fromCharCode(952); let oFunc = this.Add_Function(Pr, "tan", Theta); oFunc.Apply_TextPr(Pr.ctrPrp, undefined, true); this.Add_Symbol(61, Pr.ctrPrp); var Fraction = this.Add_Fraction(Pr, null, null); var NumMathContent = Fraction.getNumeratorMathContent(); var DenMathContent = Fraction.getDenominatorMathContent(); NumMathContent.Add_Function(Pr, "sin", Theta); DenMathContent.Add_Function(Pr, "cos", Theta); this.Add_Element(new ParaRun(this.Paragraph, true)); Fraction.Apply_TextPr(Pr.ctrPrp, undefined, true); break; } if (oFunction) { oFunction.Correct_Content(true); oFunction.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oFunction && oSelectedContent) oFunction.getArgument().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuAccent = function(Type, Pr, oSelectedContent) { var oAccent = null; switch(Type) { case c_oAscMathType.Accent_Dot : oAccent = this.Add_Accent(Pr.ctrPrp, 775, null); break; case c_oAscMathType.Accent_DDot : oAccent = this.Add_Accent(Pr.ctrPrp, 776, null); break; case c_oAscMathType.Accent_DDDot : oAccent = this.Add_Accent(Pr.ctrPrp, 8411, null); break; case c_oAscMathType.Accent_Hat : oAccent = this.Add_Accent(Pr.ctrPrp, null, null); break; case c_oAscMathType.Accent_Check : oAccent = this.Add_Accent(Pr.ctrPrp, 780, null); break; case c_oAscMathType.Accent_Accent : oAccent = this.Add_Accent(Pr.ctrPrp, 769, null); break; case c_oAscMathType.Accent_Grave : oAccent = this.Add_Accent(Pr.ctrPrp, 768, null); break; case c_oAscMathType.Accent_Smile : oAccent = this.Add_Accent(Pr.ctrPrp, 774, null); break; case c_oAscMathType.Accent_Tilde : oAccent = this.Add_Accent(Pr.ctrPrp, 771, null); break; case c_oAscMathType.Accent_Bar : oAccent = this.Add_Accent(Pr.ctrPrp, 773, null); break; case c_oAscMathType.Accent_DoubleBar : oAccent = this.Add_Accent(Pr.ctrPrp, 831, null); break; case c_oAscMathType.Accent_CurveBracketTop : oAccent = this.Add_GroupCharacter({ctrPrp : Pr.ctrPrp, chr : 9182, pos : VJUST_TOP, vertJc : VJUST_BOT}, null ); break; case c_oAscMathType.Accent_CurveBracketBot : oAccent = this.Add_GroupCharacter({ctrPrp : Pr.ctrPrp}, null ); break; case c_oAscMathType.Accent_GroupTop: var Limit = this.Add_Limit({ctrPrp : Pr.ctrPrp, type : LIMIT_UP}, null, null); var MathContent = Limit.getFName(); oAccent = MathContent.Add_GroupCharacter({ctrPrp : Pr.ctrPrp, chr : 9182, pos : VJUST_TOP, vertJc : VJUST_BOT}, null ); Limit.Correct_Content(true); Limit.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Accent_GroupBot: var Limit = this.Add_Limit({ctrPrp : Pr.ctrPrp, type : LIMIT_LOW}, null, null); var MathContent = Limit.getFName(); oAccent = MathContent.Add_GroupCharacter({ctrPrp : Pr.ctrPrp}, null ); Limit.Correct_Content(true); Limit.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Accent_ArrowL : oAccent = this.Add_Accent(Pr.ctrPrp, 8406, null); break; case c_oAscMathType.Accent_ArrowR : oAccent = this.Add_Accent(Pr.ctrPrp, 8407, null); break; case c_oAscMathType.Accent_ArrowD : oAccent = this.Add_Accent(Pr.ctrPrp, 8417, null); break; case c_oAscMathType.Accent_HarpoonL : oAccent = this.Add_Accent(Pr.ctrPrp, 8400, null); break; case c_oAscMathType.Accent_HarpoonR : oAccent = this.Add_Accent(Pr.ctrPrp, 8401, null); break; case c_oAscMathType.Accent_BorderBox: oAccent = this.Add_BorderBox(Pr, null); break; case c_oAscMathType.Accent_BorderBoxCustom : var BorderBox = this.Add_BorderBox(Pr, null); var MathContent = BorderBox.getBase(); MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "a", "2", null); MathContent.Add_Text("=", this.Paragraph); MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "b", "2", null); MathContent.Add_Text("+", this.Paragraph); MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "c", "2", null); BorderBox.Correct_Content(true); BorderBox.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Accent_BarTop : oAccent = this.Add_Bar({ctrPrp : Pr.ctrPrp, pos : LOCATION_TOP}, null); break; case c_oAscMathType.Accent_BarBot : oAccent = this.Add_Bar({ctrPrp : Pr.ctrPrp, pos : LOCATION_BOT}, null); break; case c_oAscMathType.Accent_Custom_1 : var oBar = this.Add_Bar({ctrPrp : Pr.ctrPrp, pos : LOCATION_TOP}, "A"); oBar.Correct_Content(true); oBar.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Accent_Custom_2 : var oBar = this.Add_Bar({ctrPrp : Pr.ctrPrp, pos : LOCATION_TOP}, "ABC"); oBar.Correct_Content(true); oBar.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.Accent_Custom_3 : var oBar = this.Add_Bar({ctrPrp : Pr.ctrPrp, pos : LOCATION_TOP}, "x" + String.fromCharCode(8853) + "y"); oBar.Correct_Content(true); oBar.Apply_TextPr(Pr.ctrPrp, undefined, true); break; } if (oAccent) { oAccent.Correct_Content(true); oAccent.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oAccent && oSelectedContent) oAccent.getBase().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuLimitLog = function(Type, Pr, oSelectedContent) { var oFunction = null; switch(Type) { case c_oAscMathType.LimitLog_LogBase: oFunction = this.Add_Function(Pr, null, null); var MathContent = oFunction.getFName(); var Script = MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUBSCRIPT}, null, null, null); MathContent = Script.getBase(); MathContent.Add_Text("log", this.Paragraph, STY_PLAIN); break; case c_oAscMathType.LimitLog_Log: oFunction = this.Add_Function(Pr, "log", null); break; case c_oAscMathType.LimitLog_Lim: oFunction = this.Add_FunctionWithLimit(Pr, "lim", null, null); break; case c_oAscMathType.LimitLog_Min: oFunction = this.Add_FunctionWithLimit(Pr, "min", null, null); break; case c_oAscMathType.LimitLog_Max: oFunction = this.Add_FunctionWithLimit(Pr, "max", null, null); break; case c_oAscMathType.LimitLog_Ln : oFunction = this.Add_Function(Pr, "ln", null); break; case c_oAscMathType.LimitLog_Custom_1: var Function = this.Add_FunctionWithLimit(Pr, "lim", "n" + String.fromCharCode(8594,8734), null); var MathContent = Function.getArgument(); var Script = MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, null, "n", null); MathContent = Script.getBase(); var Delimiter = MathContent.Add_Delimiter({ctrPrp : Pr.ctrPrp, column : 1}, 1, [null]); MathContent = Delimiter.getElementMathContent(0); MathContent.Add_Text("1+", this.Paragraph); MathContent.Add_Fraction({ctrPrp : Pr.ctrPrp}, "1", "n"); Function.Correct_Content(true); Function.Apply_TextPr(Pr.ctrPrp, undefined, true); break; case c_oAscMathType.LimitLog_Custom_2: var Function = this.Add_FunctionWithLimit(Pr, "max", "0" + String.fromCharCode(8804) + "x" + String.fromCharCode(8804) + "1", null); var MathContent = Function.getArgument(); MathContent.Add_Text("x", this.Paragraph); var Script = MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "e", null, null); MathContent = Script.getUpperIterator(); MathContent.Add_Text("-", this.Paragraph); MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, "x", "2", null); Function.Correct_Content(true); Function.Apply_TextPr(Pr.ctrPrp, undefined, true); break; } if (oFunction) { oFunction.Correct_Content(true); oFunction.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oFunction && oSelectedContent) oFunction.getArgument().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuOperator = function(Type, Pr, oSelectedContent) { var oAccent = null, oBox; switch(Type) { case c_oAscMathType.Operator_ColonEquals : oBox = this.Add_Box({ctrPrp : Pr.ctrPrp, opEmu : 1}, String.fromCharCode(0x2254)); break; case c_oAscMathType.Operator_EqualsEquals : oBox = this.Add_Box({ctrPrp : Pr.ctrPrp, opEmu : 1}, "=="); break; case c_oAscMathType.Operator_PlusEquals : oBox = this.Add_Box({ctrPrp : Pr.ctrPrp, opEmu : 1}, "+="); break; case c_oAscMathType.Operator_MinusEquals : oBox = this.Add_Box({ctrPrp : Pr.ctrPrp, opEmu : 1}, "-="); break; case c_oAscMathType.Operator_Definition : oBox = this.Add_Box({ctrPrp : Pr.ctrPrp, opEmu : 1}, String.fromCharCode(8797)); break; case c_oAscMathType.Operator_UnitOfMeasure : oBox = this.Add_Box({ctrPrp : Pr.ctrPrp, opEmu : 1}, String.fromCharCode(8798)); break; case c_oAscMathType.Operator_DeltaEquals : oBox = this.Add_Box({ctrPrp : Pr.ctrPrp, opEmu : 1}, String.fromCharCode(8796)); break; case c_oAscMathType.Operator_ArrowL_Top : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_TOP, 8592, null); break; case c_oAscMathType.Operator_ArrowR_Top : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_TOP, 8594, null); break; case c_oAscMathType.Operator_ArrowL_Bot : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8592, null); break; case c_oAscMathType.Operator_ArrowR_Bot : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8594, null); break; case c_oAscMathType.Operator_DoubleArrowL_Top : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_TOP, 8656, null); break; case c_oAscMathType.Operator_DoubleArrowR_Top : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_TOP, 8658, null); break; case c_oAscMathType.Operator_DoubleArrowL_Bot : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8656, null); break; case c_oAscMathType.Operator_DoubleArrowR_Bot : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8658, null); break; case c_oAscMathType.Operator_ArrowD_Top : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_TOP, 8596, null); break; case c_oAscMathType.Operator_ArrowD_Bot : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8596, null); break; case c_oAscMathType.Operator_DoubleArrowD_Top : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_TOP, 8660, null); break; case c_oAscMathType.Operator_DoubleArrowD_Bot : oAccent = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8660, null); break; case c_oAscMathType.Operator_Custom_1 : oBox = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8594, "yields"); break; case c_oAscMathType.Operator_Custom_2 : oBox = this.Add_BoxWithGroupChar({ctrPrp : Pr.ctrPrp, opEmu : 1}, VJUST_BOT, 8594, String.fromCharCode(8710)); break; } if (oAccent) { oAccent.Correct_Content(true); oAccent.Apply_TextPr(Pr.ctrPrp, undefined, true); } else if (oBox) { oBox.Correct_Content(true); oBox.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oAccent && oSelectedContent) oAccent.getBase().private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuMatrix = function(Type, Pr, oSelectedContent) { var oMatrix = null, lMatrix; switch(Type) { case c_oAscMathType.Matrix_1_2: oMatrix = this.Add_Matrix(Pr.ctrPrp, 1, 2, false, []); break; case c_oAscMathType.Matrix_2_1: oMatrix = this.Add_Matrix(Pr.ctrPrp, 2, 1, false, []); break; case c_oAscMathType.Matrix_1_3: oMatrix = this.Add_Matrix(Pr.ctrPrp, 1, 3, false, []); break; case c_oAscMathType.Matrix_3_1: oMatrix = this.Add_Matrix(Pr.ctrPrp, 3, 1, false, []); break; case c_oAscMathType.Matrix_2_2: oMatrix = this.Add_Matrix(Pr.ctrPrp, 2, 2, false, []); break; case c_oAscMathType.Matrix_2_3: oMatrix = this.Add_Matrix(Pr.ctrPrp, 2, 3, false, []); break; case c_oAscMathType.Matrix_3_2: oMatrix = this.Add_Matrix(Pr.ctrPrp, 3, 2, false, []); break; case c_oAscMathType.Matrix_3_3: oMatrix = this.Add_Matrix(Pr.ctrPrp, 3, 3, false, []); break; case c_oAscMathType.Matrix_Dots_Center: this.Add_Symbol(8943, Pr.ctrPrp); break; case c_oAscMathType.Matrix_Dots_Baseline: this.Add_Symbol(8230, Pr.ctrPrp); break; case c_oAscMathType.Matrix_Dots_Vertical: this.Add_Symbol(8942, Pr.ctrPrp); break; case c_oAscMathType.Matrix_Dots_Diagonal: this.Add_Symbol(8945, Pr.ctrPrp); break; case c_oAscMathType.Matrix_Identity_2 : lMatrix = this.Add_Matrix(Pr.ctrPrp, 2, 2, false, ["1", "0", "0", "1"]); break; case c_oAscMathType.Matrix_Identity_2_NoZeros : lMatrix = this.Add_Matrix(Pr.ctrPrp, 2, 2, true, ["1", null, null, "1"]); break; case c_oAscMathType.Matrix_Identity_3 : lMatrix = this.Add_Matrix(Pr.ctrPrp, 3, 3, false, ["1", "0", "0", "0", "1", "0", "0", "0", "1"]); break; case c_oAscMathType.Matrix_Identity_3_NoZeros : lMatrix = this.Add_Matrix(Pr.ctrPrp, 3, 3, true, ["1", null, null, null, "1", null, null, null, "1"]); break; case c_oAscMathType.Matrix_2_2_RoundBracket : oMatrix = this.Add_MatrixWithBrackets(null, null, Pr.ctrPrp, 2, 2, false, []); break; case c_oAscMathType.Matrix_2_2_SquareBracket : oMatrix = this.Add_MatrixWithBrackets( 91, 93, Pr.ctrPrp, 2, 2, false, []); break; case c_oAscMathType.Matrix_2_2_LineBracket : oMatrix = this.Add_MatrixWithBrackets( 124, 124, Pr.ctrPrp, 2, 2, false, []); break; case c_oAscMathType.Matrix_2_2_DLineBracket : oMatrix = this.Add_MatrixWithBrackets(8214, 8214, Pr.ctrPrp, 2, 2, false, []); break; case c_oAscMathType.Matrix_Flat_Round : lMatrix = this.Add_MatrixWithBrackets(null, null, Pr.ctrPrp, 3, 3, false, [null, String.fromCharCode(8943), null, String.fromCharCode(8942), String.fromCharCode(8945), String.fromCharCode(8942), null, String.fromCharCode(8943), null]); break; case c_oAscMathType.Matrix_Flat_Square : lMatrix = this.Add_MatrixWithBrackets( 91, 93, Pr.ctrPrp, 3, 3, false, [null, String.fromCharCode(8943), null, String.fromCharCode(8942), String.fromCharCode(8945), String.fromCharCode(8942), null, String.fromCharCode(8943), null]); break; } if (oMatrix) { oMatrix.Correct_Content(true); oMatrix.Apply_TextPr(Pr.ctrPrp, undefined, true); } else if (lMatrix) { lMatrix.Correct_Content(true); lMatrix.Apply_TextPr(Pr.ctrPrp, undefined, true); } if (oMatrix) oMatrix.getContentElement(0, 0).private_FillSelectedContent(oSelectedContent); }; CMathContent.prototype.private_LoadFromMenuDefaultText = function(Type, Pr, oSelectedContent) { if (oSelectedContent) this.private_FillSelectedContent(oSelectedContent, Pr); }; CMathContent.prototype.private_FillSelectedContent = function(oSelectedContent, Pr) { if (oSelectedContent instanceof ParaMath) { oSelectedContent.Root.CopyTo(this, false); } else if (oSelectedContent) { this.Add_Text(oSelectedContent, this.Paragraph); if (Pr && Pr.ctrPrp) this.Apply_TextPr(Pr.ctrPrp, undefined, true); } }; CMathContent.prototype.Add_Element = function(Element) { this.Internal_Content_Add(this.CurPos, Element, false); this.CurPos++; }; /** * If text grouped by style * @param text * @param paragraph * @param mathStyle * @param oAdditionalData */ CMathContent.prototype.AddGroupedByStyleText = function (text, paragraph, mathStyle, oAdditionalData) { let oMathRun = new AscWord.CRun(paragraph, true); AscWord.TextToMathRunElements(text, function(item) { oMathRun.private_AddItemToRun(oMathRun.State.ContentPos, item); }); if (mathStyle) oMathRun.Math_Apply_Style(mathStyle); if (oAdditionalData) { if (oAdditionalData.IsAdditionalStyleData()) oMathRun.SetPr(oAdditionalData.GetAdditionalStyleData()); if (oAdditionalData.reviewData.reviewInfo) { oMathRun.SetReviewTypeWithInfo( oAdditionalData.reviewData.reviewType, oAdditionalData.reviewData.reviewInfo ); } } oMathRun.Set_RFont_ForMathRun(); this.AddToContent(this.Content.length, oMathRun, false); this.CurPos = this.Content.length; }; CMathContent.prototype.Add_Text = function(text, paragraph, mathStyle, oAdditionalData) { if (!text) return; let oMathRun = this.Content[this.Content.length - 1]; if (oMathRun && oMathRun.Content.length === 0 && this.Content.length > 1) { this.Content.splice(this.Content.length - 1, 1); oMathRun = this.Content[this.Content.length - 1]; } if (!oMathRun || !(oMathRun instanceof AscWord.Run) || (oAdditionalData && !oAdditionalData.IsStyleEqual(oMathRun))) oMathRun = new AscWord.Run(undefined, true); AscWord.TextToMathRunElements(text, function(item) { oMathRun.private_AddItemToRun(oMathRun.State.ContentPos, item); if (oAdditionalData) oMathRun.SetMathMetaData(oAdditionalData.metaData); }); if (this.Content[this.Content.length - 1] === oMathRun) return true; if (oAdditionalData) { if (oAdditionalData.IsAdditionalStyleData()) oMathRun.SetPr(oAdditionalData.GetAdditionalStyleData()); if (oAdditionalData.reviewData.reviewInfo) { oMathRun.SetReviewTypeWithInfo( oAdditionalData.reviewData.reviewType, oAdditionalData.reviewData.reviewInfo ); } if (oAdditionalData.mathPrp) { oMathRun.Set_MathPr(oAdditionalData.mathPrp); } } if (mathStyle !== undefined) oMathRun.Math_Apply_Style(mathStyle); oMathRun.Set_RFont_ForMathRun(); if (this.Content[this.Content.length - 1] !== oMathRun) { this.AddToContent(this.Content.length, oMathRun, false); this.CurPos = this.Content.length; } }; CMathContent.prototype.Add_ToPrevParaRun = function(text) { let run = this.Content[this.Content.length - 1]; let isAdd = false; if (!run) { run = new AscWord.CRun(undefined, true); isAdd = true; } let nCount = this.Content.length; AscWord.TextToMathRunElements(text, function(item) { run.Add(item, true); }); let nCurrentCount = this.Content.length - nCount; if (nCurrentCount === 0) return true; } CMathContent.prototype.Add_TextOnPos = function(nPos, sText, MathStyle) { if (!sText) return; let oMathRun = new AscWord.CRun(undefined, true); AscWord.TextToMathRunElements(sText, function(item) { oMathRun.Add(item, true); }); oMathRun.Set_RFont_ForMathRun(); if (undefined !== MathStyle && null !== MathStyle) oMathRun.Math_Apply_Style(MathStyle); this.Internal_Content_Add(nPos, oMathRun, false); this.CurPos++; }; CMathContent.prototype.IsAddTextInLastParaRun = function(oMathStyle) { if (this.Content.length > 0) { let oLastContent = this.Content[this.Content.length - 1]; if ( oLastContent instanceof ParaRun && !oLastContent.IsPlaceholder() && (oMathStyle && oLastContent.Pr.Is_Equal(oMathStyle)) ) return true; } return false } CMathContent.prototype.IsLastParaRunEmpty = function() { if (this.Content.length > 0) { let oLastContent = this.Content[this.Content.length - 1]; if (oLastContent instanceof ParaRun && oLastContent.Is_Empty()) return true; } return false } /** * * @param {object} nPos * @param {MathTextAndStyles} oMathText */ CMathContent.prototype.Add_MathStyleText = function(nPos, oMathText) { let arrContent = oMathText.arr; for (let nCounter = 0; nCounter < arrContent.length; nCounter++) { let oCurrentElement = arrContent[nCounter]; let MathRun; if (oCurrentElement instanceof AscMath.MathText) { let strElement = oCurrentElement.GetText(); let MathStyle = oCurrentElement.GetAdditionalData(); MathRun = new ParaRun(this.Paragraph, true); for (let nCharPos = 0, nTextLen = strElement.length; nCharPos < nTextLen; nCharPos++) { let oText = null; if (0x0026 == strElement.charCodeAt(nCharPos)) oText = new CMathAmp(); else { oText = new CMathText(false); oText.addTxt(strElement[nCharPos]); } MathRun.Add(oText); } MathRun.Set_RFont_ForMathRun(); if (MathStyle instanceof AscMath.MathTextAdditionalData) MathRun.Apply_Pr(MathStyle.GetAdditionalStyleData()); this.Internal_Content_Add(nPos.pos, MathRun, false); this.CurPos++; nPos.pos++; } else if (oCurrentElement instanceof AscMath.MathTextAndStyles) { this.Add_MathStyleText(nPos, oCurrentElement); } else { this.Add_TextOnPos(nPos.pos, oCurrentElement, this.Paragraph); nPos.pos++; } } }; CMathContent.prototype.Add_Symbol = function(Code, TextPr, MathPr) { var MathRun = new ParaRun(this.Paragraph, true); var Symbol = new CMathText(false); Symbol.add(Code); MathRun.Add(Symbol, true); if(TextPr !== undefined) MathRun.Apply_Pr(TextPr); if(MathPr !== undefined) MathRun.Set_MathPr(MathPr); this.Internal_Content_Add(this.CurPos, MathRun, false); this.CurPos++; }; CMathContent.prototype.Add_Fraction = function(Pr, NumText, DenText) { var Fraction = new CFraction(Pr); this.Add_Element(Fraction); var DenMathContent = Fraction.getDenominatorMathContent(); DenMathContent.Add_Text(DenText, this.Paragraph); var NumMathContent = Fraction.getNumeratorMathContent(); NumMathContent.Add_Text(NumText, this.Paragraph); return Fraction; }; CMathContent.prototype.Add_Script = function(bSubSup, Pr, BaseText, SupText, SubText) { var Script = null; if (bSubSup) Script = new CDegreeSubSup(Pr); else Script = new CDegree(Pr); this.Add_Element(Script); var MathContent = Script.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); MathContent = Script.getUpperIterator(); MathContent.Add_Text(SupText, this.Paragraph); MathContent = Script.getLowerIterator(); MathContent.Add_Text(SubText, this.Paragraph); return Script; }; CMathContent.prototype.Add_Radical = function(Pr, BaseText, DegreeText) { var Radical = new CRadical(Pr); this.Add_Element(Radical); var MathContent = Radical.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); MathContent = Radical.getDegree(); MathContent.Add_Text(DegreeText, this.Paragraph); return Radical; }; CMathContent.prototype.Add_NAry = function(Pr, BaseText, SupText, SubText) { var NAry = new CNary(Pr); this.Add_Element(NAry); var MathContent = NAry.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); MathContent = NAry.getSubMathContent(); MathContent.Add_Text(SubText, this.Paragraph); MathContent = NAry.getSupMathContent(); MathContent.Add_Text(SupText, this.Paragraph); return NAry; }; CMathContent.prototype.Add_Integral = function(Dim, bOriented, limLoc, supHide, subHide, ctrPr, BaseText, SupText, SubText) { var Pr = {ctrPrp : ctrPr}; if (null !== limLoc) Pr.limLoc = limLoc; if (null !== supHide) Pr.supHide = supHide; if (null !== subHide) Pr.subHide = subHide; var chr = null; switch(Dim) { case 3: chr = (bOriented ? 8752 : 8749); break; case 2: chr = (bOriented ? 8751 : 8748); break; default: case 1: chr = (bOriented ? 8750 : null); break; } if (null !== chr) Pr.chr = chr; return this.Add_NAry(Pr, BaseText, SupText, SubText); }; CMathContent.prototype.Add_LargeOperator = function(Type, limLoc, supHide, subHide, ctrPr, BaseText, SupText, SubText) { var Pr = {ctrPrp : ctrPr}; if (null !== limLoc) Pr.limLoc = limLoc; if (null !== supHide) Pr.supHide = supHide; if (null !== subHide) Pr.subHide = subHide; var chr = null; switch(Type) { default: case 1: chr = 8721; break; case 2: chr = 8719; break; case 3: chr = 8720; break; case 4: chr = 8899; break; case 5: chr = 8898; break; case 6: chr = 8897; break; case 7: chr = 8896; break; } if (null !== chr) Pr.chr = chr; return this.Add_NAry(Pr, BaseText, SupText, SubText); }; CMathContent.prototype.Add_Delimiter = function(Pr, Count, aText) { var Del = new CDelimiter(Pr); this.Add_Element(Del); for (var Index = 0; Index < Count; Index++) { var MathContent = Del.getElementMathContent(Index); MathContent.Add_Text(aText[Index], this.Paragraph); } return Del; }; CMathContent.prototype.Add_DelimiterEx = function(ctrPr, Count, aText, begChr, endChr) { var Pr = { ctrPrp : ctrPr, column : Count, begChr : begChr, endChr : endChr }; return this.Add_Delimiter(Pr, Count, aText); }; CMathContent.prototype.Add_EqArray = function(Pr, Count, aText) { var EqArray = new CEqArray(Pr); this.Add_Element(EqArray); for (var Index = 0; Index < Count; Index++) { var MathContent = EqArray.getElementMathContent(Index); MathContent.Add_Text(aText[Index], this.Paragraph); } return EqArray; }; CMathContent.prototype.Add_Box = function(Pr, BaseText) { var Box = new CBox(Pr); this.Add_Element(Box); var MathContent = Box.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); return Box; }; CMathContent.prototype.Add_BoxWithGroupChar = function(BoxPr, GroupPos, GroupChr, BaseText) { var Box = this.Add_Box(BoxPr, null); var MathContent = Box.getBase(); var oGroup = null; if (GroupPos === VJUST_TOP) oGroup = MathContent.Add_GroupCharacter({ctrPrp : BoxPr.ctrPrp, pos : GroupPos, chr : GroupChr}, BaseText); else oGroup = MathContent.Add_GroupCharacter({ctrPrp : BoxPr.ctrPrp, vertJc : GroupPos, chr : GroupChr}, BaseText); return oGroup; }; CMathContent.prototype.Add_BorderBox = function(Pr, BaseText) { var Box = new CBorderBox(Pr); this.Add_Element(Box); var MathContent = Box.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); return Box; }; CMathContent.prototype.Add_Bar = function(Pr, BaseText) { var Bar = new CBar(Pr); this.Add_Element(Bar); var MathContent = Bar.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); return Bar; }; CMathContent.prototype.Add_Function = function(Pr, FName, BaseText) { var MathFunc = new CMathFunc(Pr); this.Add_Element(MathFunc); var MathContent = MathFunc.getFName(); MathContent.Add_Text(FName, this.Paragraph, STY_PLAIN); MathContent = MathFunc.getArgument(); MathContent.Add_Text(BaseText, this.Paragraph); return MathFunc; }; CMathContent.prototype.Add_Function_1 = function(Pr, FName, BaseText) { var MathFunc = new CMathFunc(Pr); this.Add_Element(MathFunc); MathFunc.SetParagraph(this.Paragraph); var MathContent = MathFunc.getFName(); var Script = MathContent.Add_Script(false, {ctrPrp : Pr.ctrPrp, type : DEGREE_SUPERSCRIPT}, null, "-1", null); MathContent = Script.getBase(); MathContent.Add_Text(FName, this.Paragraph, STY_PLAIN); MathContent = MathFunc.getArgument(); MathContent.Add_Text(BaseText, this.Paragraph); return MathFunc; }; CMathContent.prototype.Add_FunctionWithLimit = function(Pr, FName, LimitText, BaseText) { var MathFunc = new CMathFunc(Pr); this.Add_Element(MathFunc); MathFunc.SetParagraph(this.Paragraph); var MathContent = MathFunc.getFName(); var Limit = MathContent.Add_Limit({ctrPrp : Pr.ctrPrp, type : LIMIT_LOW}, null, LimitText); MathContent = Limit.getFName(); MathContent.Add_Text(FName, this.Paragraph, STY_PLAIN); MathContent = MathFunc.getArgument(); MathContent.Add_Text(BaseText, this.Paragraph); return MathFunc; }; CMathContent.prototype.Add_FunctionWithTypeLimit = function(Pr, FName, LimitText, BaseText, LIMIT_TYPE) { var MathFunc = new CMathFunc(Pr); this.Add_Element(MathFunc); MathFunc.SetParagraph(this.Paragraph); var MathContent = MathFunc.getFName(); var Limit = MathContent.Add_Limit({ctrPrp : Pr.ctrPrp, type : LIMIT_TYPE}, null, LimitText); MathContent = Limit.getFName(); MathContent.Add_Text(FName, this.Paragraph, STY_PLAIN); MathContent = MathFunc.getArgument(); MathContent.Add_Text(BaseText, this.Paragraph); return MathFunc; }; CMathContent.prototype.Add_Accent = function(ctrPr, chr, BaseText) { var Pr = { ctrPrp : ctrPr, chr : chr }; var Accent = new CAccent(Pr); this.Add_Element(Accent); var MathContent = Accent.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); return Accent; }; CMathContent.prototype.Add_GroupCharacter = function(Pr, BaseText) { var Group = new CGroupCharacter(Pr); this.Add_Element(Group); var MathContent = Group.getBase(); MathContent.Add_Text(BaseText, this.Paragraph); return Group; }; CMathContent.prototype.Add_Limit = function(Pr, BaseText, LimitText) { var Limit = new CLimit(Pr); this.Add_Element(Limit); var MathContent = Limit.getFName(); MathContent.Add_Text(BaseText, this.Paragraph); MathContent = Limit.getIterator(); MathContent.Add_Text(LimitText, this.Paragraph); return Limit; }; CMathContent.prototype.Add_Matrix = function(ctrPr, RowsCount, ColsCount, plcHide, aText) { var Pr = { ctrPrp : ctrPr, row : RowsCount, mcs : [{count : ColsCount, mcJc : MCJC_CENTER}], plcHide : plcHide }; var Matrix = new CMathMatrix(Pr); this.Add_Element(Matrix); for (var RowIndex = 0; RowIndex < RowsCount; RowIndex++) { for (var ColIndex = 0; ColIndex < ColsCount; ColIndex++) { var MathContent = Matrix.getContentElement(RowIndex, ColIndex); MathContent.Add_Text(aText[RowIndex * ColsCount + ColIndex], this.Paragraph); } } return Matrix; }; CMathContent.prototype.Add_MatrixWithBrackets = function(begChr, endChr, ctrPr, RowsCount, ColsCount, plcHide, aText) { var Delimiter = this.Add_DelimiterEx(ctrPr, 1, [null], begChr, endChr); var MathContent = Delimiter.getElementMathContent(0); return MathContent.Add_Matrix(ctrPr, RowsCount, ColsCount, plcHide, aText); }; CMathContent.prototype.recalculateCursorPosition = function(positionCalculator, isCurrent) { let line = positionCalculator.line; let range = positionCalculator.range; let rangeInfo = this.getRangePos(line, range); let rangeStart = rangeInfo[0]; let rangeEnd = rangeInfo[1]; for (var pos = rangeStart; pos <= rangeEnd; ++pos) { this.Content[pos].recalculateCursorPosition(positionCalculator, isCurrent && pos === this.CurPos); } }; CMathContent.prototype.getParagraphContentPosByXY = function(searchState) { searchState.reset(); CParagraphContentWithParagraphLikeContent.prototype.getParagraphContentPosByXY.call(this, searchState); }; CMathContent.prototype.GetCurrentParaPos = function(align) { if (this.CurPos >= 0 && this.CurPos < this.Content.length) return this.Content[this.CurPos].GetCurrentParaPos(align); return new CParaPos(this.StartRange, this.StartLine, 0, 0); }; CMathContent.prototype.Get_ParaContentPos = function(bSelection, bStart, ContentPos, bUseCorrection) { if (true === bUseCorrection && true === bSelection) { var nPos = false !== bStart ? this.Selection.StartPos : this.Selection.EndPos; if (para_Math_Run !== this.Content[nPos].Type && (this.Selection.StartPos !== this.Selection.EndPos || true !== this.Content[nPos].Is_InnerSelection()) && ((true === bStart && nPos > 0) || (true !== bStart && nPos < this.Content.length - 1))) { if (true === bStart && nPos > 0) { ContentPos.Add(nPos - 1); this.Content[nPos - 1].Get_EndPos(false, ContentPos, ContentPos.GetDepth() + 1); } else { ContentPos.Add(nPos + 1); this.Content[nPos + 1].Get_StartPos(ContentPos, ContentPos.GetDepth() + 1); } } else { ContentPos.Add(nPos); if (undefined !== this.Content[nPos]) this.Content[nPos].Get_ParaContentPos(bSelection, bStart, ContentPos, bUseCorrection); } } else { var nPos = (true !== bSelection ? this.CurPos : (false !== bStart ? this.Selection.StartPos : this.Selection.EndPos)); nPos = Math.max(0, Math.min(nPos, this.Content.length - 1)); ContentPos.Add(nPos); if (undefined !== this.Content[nPos]) this.Content[nPos].Get_ParaContentPos(bSelection, bStart, ContentPos, bUseCorrection); } }; CMathContent.prototype.Set_ParaContentPos = function(ContentPos, Depth) { var CurPos = ContentPos.Get(Depth); // Делаем такие проверки, потому что после совместного редактирования, позиция может остаться старой, а // контент измениться. if (undefined === CurPos || CurPos < 0) { this.CurPos = 0; if (this.Content[this.CurPos]) this.Content[this.CurPos].MoveCursorToStartPos(); } else if (CurPos > this.Content.length - 1) { this.CurPos = this.Content.length - 1; if (this.Content[this.CurPos]) this.Content[this.CurPos].MoveCursorToEndPos(false); } else { this.CurPos = CurPos; if (this.Content[this.CurPos]) this.Content[this.CurPos].Set_ParaContentPos(ContentPos, Depth + 1); } }; CMathContent.prototype.IsSelectionEmpty = function() { if (true !== this.Selection.Use) return true; if (this.Selection.StartPos === this.Selection.EndPos) return this.Content[this.Selection.StartPos].IsSelectionEmpty(); return false; }; CMathContent.prototype.GetSelectContent = function(isAll) { if (true === isAll) { return {Content : this, Start : 0, End : this.Content.length - 1}; } else if (false === this.Selection.Use) { if (this.Content.length - 1 >= this.CurPos && para_Math_Composition === this.Content[this.CurPos].Type) return this.Content[this.CurPos].GetSelectContent(); else return {Content : this, Start : this.CurPos, End : this.CurPos}; } else { var StartPos = this.Selection.StartPos; var EndPos = this.Selection.EndPos; if (StartPos > EndPos) { StartPos = this.Selection.EndPos; EndPos = this.Selection.StartPos; } if (StartPos === EndPos && para_Math_Composition === this.Content[StartPos].Type && true === this.Content[StartPos].Is_InnerSelection()) return this.Content[StartPos].GetSelectContent(); return {Content : this, Start : StartPos, End : EndPos}; } }; CMathContent.prototype.Get_LeftPos = function(SearchPos, ContentPos, Depth, UseContentPos) { if ((this.IsPlaceholder() && UseContentPos) || true !== this.ParentElement.Is_ContentUse(this)) return false; if (false === UseContentPos && para_Math_Run === this.Content[this.Content.length - 1].Type) { // При переходе в новый контент встаем в его конец var CurPos = this.Content.length - 1; SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; return true; } var CurPos = UseContentPos ? ContentPos.Get(Depth) : this.Content.length - 1; SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_LeftPos(SearchPos, ContentPos, Depth + 1, UseContentPos); if (true === SearchPos.Found) return true; CurPos--; if (true === UseContentPos && para_Math_Composition === this.Content[CurPos + 1].Type) { // При выходе из формулы встаем в конец рана SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; return true; } while (CurPos >= 0) { SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_LeftPos(SearchPos, ContentPos, Depth + 1, false); if (true === SearchPos.Found) return true; CurPos--; } if (UseContentPos && !this.IsStartPos(ContentPos, Depth)) { SearchPos.Pos.Update(0, Depth); this.Content[0].Get_StartPos(SearchPos.Pos, Depth + 1); SearchPos.Found = true; return true; } return false; }; CMathContent.prototype.Get_RightPos = function(SearchPos, ContentPos, Depth, UseContentPos, StepEnd) { if ((this.IsPlaceholder() && UseContentPos) || true !== this.ParentElement.Is_ContentUse(this)) return false; if (false === UseContentPos && para_Math_Run === this.Content[0].Type) { // При переходе в новый контент встаем в его начало SearchPos.Pos.Update(0, Depth); this.Content[0].Get_StartPos(SearchPos.Pos, Depth + 1); SearchPos.Found = true; return true; } var CurPos = true === UseContentPos ? ContentPos.Get(Depth) : 0; var Count = this.Content.length; SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_RightPos(SearchPos, ContentPos, Depth + 1, UseContentPos, StepEnd); if (true === SearchPos.Found) return true; CurPos++; if (true === UseContentPos && para_Math_Composition === this.Content[CurPos - 1].Type) { // При выходе из формулы встаем в начало рана SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_StartPos(SearchPos.Pos, Depth + 1); SearchPos.Found = true; return true; } while (CurPos < Count) { SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_RightPos(SearchPos, ContentPos, Depth + 1, false, StepEnd); if (true === SearchPos.Found) return true; CurPos++; } if (UseContentPos && !this.IsEndPos(ContentPos, Depth)) { SearchPos.Pos.Update(Count - 1, Depth); this.Content[Count - 1].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; return true; } return false; }; CMathContent.prototype.Get_WordStartPos = function(SearchPos, ContentPos, Depth, UseContentPos, StepStart) { if (true !== this.ParentElement.Is_ContentUse(this)) return false; if (false === UseContentPos && para_Math_Run === this.Content[this.Content.length - 1].Type) { // При переходе в новый контент встаем в его конец var CurPos = this.Content.length - 1; SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } var CurPos = true === UseContentPos ? ContentPos.Get(Depth) : this.Content.length - 1; this.Content[CurPos].Get_WordStartPos(SearchPos, ContentPos, Depth + 1, UseContentPos, StepStart); if (true === SearchPos.UpdatePos) SearchPos.Pos.Update( CurPos, Depth ); if (true === SearchPos.Found) return; CurPos--; var bStepStartRun = false; if (true === UseContentPos && para_Math_Composition === this.Content[CurPos + 1].Type) { // При выходе из формулы встаем в конец рана SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } else if (para_Math_Run === this.Content[CurPos + 1].Type && true === SearchPos.Shift) bStepStartRun = true; while (CurPos >= 0) { if (true !== bStepStartRun || para_Math_Run === this.Content[CurPos].Type) { var OldUpdatePos = SearchPos.UpdatePos; if (this.Content[CurPos].Type !== 49) { SearchPos.Pos.Update(CurPos - 1, Depth); this.Content[CurPos - 1].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return; } else { this.Content[CurPos].Get_WordStartPos(SearchPos, ContentPos, Depth + 1, false, StepStart); if (true === SearchPos.UpdatePos) SearchPos.Pos.Update(CurPos, Depth); else SearchPos.UpdatePos = OldUpdatePos; if (true === SearchPos.Found) return; if (true === SearchPos.Shift) bStepStartRun = true; } } else { // Встаем в начало рана перед формулой SearchPos.Pos.Update(CurPos + 1, Depth); this.Content[CurPos + 1].Get_StartPos(SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } CurPos--; } if (UseContentPos && !this.IsStartPos(ContentPos, Depth)) { // Перед выходом из контента встаем в его начало SearchPos.Pos.Update(0, Depth); this.Content[0].Get_StartPos(SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } }; CMathContent.prototype.Get_WordEndPos = function(SearchPos, ContentPos, Depth, UseContentPos, StepEnd) { if (true !== this.ParentElement.Is_ContentUse(this)) return false; if (false === UseContentPos && para_Math_Run === this.Content[0].Type) { // При переходе в новый контент встаем в его начало SearchPos.Pos.Update(0, Depth); this.Content[0].Get_StartPos(SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } var CurPos = true === UseContentPos ? ContentPos.Get(Depth) : 0; var Count = this.Content.length; this.Content[CurPos].Get_WordEndPos(SearchPos, ContentPos, Depth + 1, UseContentPos, StepEnd); if (true === SearchPos.UpdatePos) SearchPos.Pos.Update(CurPos, Depth); if (true === SearchPos.Found) return; CurPos++; var bStepEndRun = false; if (true === UseContentPos && para_Math_Composition === this.Content[CurPos - 1].Type) { // При выходе из формулы встаем в начало рана SearchPos.Pos.Update(CurPos, Depth); this.Content[CurPos].Get_StartPos(SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } else if (para_Math_Run === this.Content[CurPos - 1].Type && true === SearchPos.Shift) bStepEndRun = true; while (CurPos < Count) { if (true !== bStepEndRun || para_Math_Run === this.Content[CurPos].Type) { var OldUpdatePos = SearchPos.UpdatePos; if (this.Content[CurPos].Type !== 49) { //this.Content[CurPos].Get_WordEndPos(SearchPos, ContentPos, Depth + 1, false, false); SearchPos.Pos.Update(CurPos+1, Depth); SearchPos.Pos.Update(0, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return; } else { this.Content[CurPos].Get_WordEndPos(SearchPos, ContentPos, Depth + 1, false, StepEnd); if (true === SearchPos.UpdatePos) SearchPos.Pos.Update(CurPos, Depth); else SearchPos.UpdatePos = OldUpdatePos; if (true === SearchPos.Found) return; if (true === SearchPos.Shift) bStepEndRun = true; } } else { SearchPos.Pos.Update(CurPos - 1, Depth); this.Content[CurPos - 1].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } CurPos++; } if (UseContentPos && !this.IsEndPos(ContentPos, Depth)) { SearchPos.Pos.Update(Count - 1, Depth); this.Content[Count - 1].Get_EndPos(false, SearchPos.Pos, Depth + 1); SearchPos.Found = true; SearchPos.UpdatePos = true; return true; } }; CMathContent.prototype.Get_StartPos = function(ContentPos, Depth) { ContentPos.Update(0, Depth); this.Content[0].Get_StartPos(ContentPos, Depth + 1); }; CMathContent.prototype.Get_EndPos = function(BehindEnd, ContentPos, Depth) { var nLastPos = this.Content.length - 1; ContentPos.Update(nLastPos, Depth); if(undefined !== this.Content[nLastPos]) this.Content[nLastPos].Get_EndPos(BehindEnd, ContentPos, Depth + 1); }; CMathContent.prototype.Draw_HighLights = function(drawState) { if (!this.bRoot && this.Parent && true !== this.ParentElement.Is_ContentUse(this)) return; let rangeInfo = this.getRangePos(drawState.Line, drawState.Range); let rangeStart = rangeInfo[0]; let rangeEnd = rangeInfo[1]; let Y0 = drawState.Y0; let Y1 = drawState.Y1; // TODO: Переделать тут. На самом деле если первый (в корне) непустой элемент идет с заливкой, то Word заливает всю формулу let bounds = this.Get_LineBound(drawState.Line, drawState.Range); if (!this.bRoot || !this.Content.length || !this.Content[rangeStart].IsShade()) { Y0 = bounds.Y; Y1 = bounds.Y + bounds.H; } drawState.X = bounds.X; for (let pos = rangeStart; pos <= rangeEnd; ++pos) { drawState.Y0 = Y0; drawState.Y1 = Y1; this.Content[pos].Draw_HighLights(drawState); } }; CMathContent.prototype.Draw_Lines = function(PDSL) { var CurLine = PDSL.Line - this.StartLine; var CurRange = ( 0 === CurLine ? PDSL.Range - this.StartRange : PDSL.Range ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); var Bound = this.Get_LineBound(PDSL.Line, PDSL.Range); var Baseline = Bound.Y + Bound.Asc; PDSL.Baseline = Baseline; PDSL.X = Bound.X; for ( var CurPos = StartPos; CurPos <= EndPos; CurPos++ ) { this.Content[CurPos].Draw_Lines(PDSL); PDSL.Baseline = Baseline; } }; CMathContent.prototype.RemoveSelection = function() { var StartPos = this.Selection.StartPos; var EndPos = this.Selection.EndPos; if (StartPos > EndPos) { StartPos = this.Selection.EndPos; EndPos = this.Selection.StartPos; } StartPos = Math.max(0, StartPos); EndPos = Math.min(this.Content.length - 1, EndPos); for (var nPos = StartPos; nPos <= EndPos; nPos++) { this.Content[nPos].RemoveSelection(); } this.Selection.Use = false; this.Selection.StartPos = 0; this.Selection.EndPos = 0; }; CMathContent.prototype.SelectAll = function(Direction) { this.Selection.Use = true; if (Direction < 0) { this.Selection.StartPos = this.Content.length - 1; this.Selection.EndPos = 0; } else { this.Selection.StartPos = 0; this.Selection.EndPos = this.Content.length - 1; } for (var nPos = 0, nCount = this.Content.length; nPos < nCount; nPos++) { this.Content[nPos].SelectAll(Direction); } }; CMathContent.prototype.drawSelectionInRange = function(line, range, drawSelectionState) { let rangeInfo = this.getRangePos(line, range); let rangeStart = rangeInfo[0]; let rangeEnd = rangeInfo[1]; let selectionStart = this.Selection.StartPos; let selectionEnd = this.Selection.EndPos; if (selectionStart > selectionEnd) { selectionStart = this.Selection.EndPos; selectionEnd = this.Selection.StartPos; } if (!this.bRoot) { let bounds = this.Get_LineBound(line, range); drawSelectionState.y = bounds.Y; drawSelectionState.h = bounds.H; } for (var pos = rangeStart; pos <= rangeEnd; ++pos) { let item = this.Content[pos]; let isSelected = this.Selection.Use && selectionStart <= pos && pos <= selectionEnd; if (para_Math_Composition !== item.Type || (isSelected && selectionStart === selectionEnd)) item.drawSelectionInRange(line, range, drawSelectionState); else drawSelectionState.handleMathElement(item, isSelected); } }; CMathContent.prototype.SelectElementByPos = function(nPos) { this.Selection.Use = true; this.Selection.StartPos = nPos; this.Selection.EndPos = nPos; this.Content[nPos].SelectAll(); this.Correct_Selection(); if (!this.bRoot) this.ParentElement.Select_MathContent(this); else this.ParaMath.bSelectionUse = true; }; CMathContent.prototype.Select_Element = function(Element, bWhole) { var nPos = -1; for(var nCurPos = 0, nCount = this.Content.length; nCurPos < nCount; nCurPos++) { if (this.Content[nCurPos] === Element) { nPos = nCurPos; break; } } if (-1 !== nPos) { this.Selection.Use = true; this.Selection.StartPos = nPos; this.Selection.EndPos = nPos; if (bWhole) this.Correct_Selection(); if (!this.bRoot) this.ParentElement.Select_MathContent(this); else this.ParaMath.bSelectionUse = true; } }; CMathContent.prototype.SetCurrentElement = function(oElement) { for(var nPos = 0, nCount = this.Content.length; nPos < nCount; ++nPos) { if (this.Content[nPos] === oElement) { this.CurPos = nPos; if (!this.bRoot) this.ParentElement.SetCurrentMathContent(this); break; } } }; CMathContent.prototype.Correct_Selection = function() { if (true !== this.Selection.Use) return; // Здесь мы делаем так, чтобы селект всегда начинался и заканчивался в ране. // Предполагается, что контент скорректирован верно до выполнения данной функции. var nContentLen = this.Content.length; var nStartPos = Math.max(0, Math.min(this.Selection.StartPos, nContentLen - 1)); var nEndPos = Math.max(0, Math.min(this.Selection.EndPos, nContentLen - 1)); if (nStartPos > nEndPos) { var nTemp = nStartPos; nStartPos = nEndPos; nEndPos = nTemp; } var oStartElement = this.Content[nStartPos]; if (para_Math_Run !== oStartElement.Type) { // Предыдущий элемент должен быть раном this.Selection.StartPos = nStartPos - 1; this.Content[this.Selection.StartPos].Set_SelectionAtEndPos(); } var oEndElement = this.Content[nEndPos]; if (para_Math_Run !== oEndElement.Type) { // Следующий элемент должен быть раном this.Selection.EndPos = nEndPos + 1; this.Content[this.Selection.EndPos].Set_SelectionAtStartPos(); } }; CMathContent.prototype.Create_FontMap = function(Map) { // ArgSize компилируется только тогда, когда выставлены все ссылки на родительские классы for (var nIndex = 0, nCount = this.Content.length; nIndex < nCount; nIndex++) this.Content[nIndex].Create_FontMap(Map); }; CMathContent.prototype.Get_AllFontNames = function(AllFonts) { for (var nIndex = 0, nCount = this.Content.length; nIndex < nCount; nIndex++) this.Content[nIndex].Get_AllFontNames(AllFonts); }; CMathContent.prototype.Selection_CheckParaContentPos = function(ContentPos, Depth, bStart, bEnd) { var CurPos = ContentPos.Get(Depth); var bStartPos = this.Selection.StartPos, bEndPos = this.Selection.EndPos; if(bStartPos > bEndPos) { var temp = bStartPos; bStartPos = bEndPos; bEndPos = temp; } if(bStartPos < CurPos) bStart = false; if(CurPos < bEndPos) bEnd = false; if(bStart === false && bEnd === false) return true; else if((bStartPos <= CurPos || bStart === false) && (CurPos <= bEndPos || bEnd === false)) return this.Content[CurPos].Selection_CheckParaContentPos(ContentPos, Depth + 1, bStart, bEnd); return false; }; CMathContent.prototype.Check_NearestPos = function(ParaNearPos, Depth) { var HyperNearPos = new CParagraphElementNearPos(); HyperNearPos.NearPos = ParaNearPos.NearPos; HyperNearPos.Depth = Depth; this.NearPosArray.push(HyperNearPos); ParaNearPos.Classes.push(this); var CurPos = ParaNearPos.NearPos.ContentPos.Get(Depth); this.Content[CurPos].Check_NearestPos(ParaNearPos, Depth + 1); }; CMathContent.prototype.Recalculate_Range = function(PRS, ParaPr, Depth) { this.bOneLine = PRS.bMath_OneLine; // для неинлайн формул: // у операторов, находяхщихся на этом уровне (в Run) приоритет выше, чем у внутренних операторов (внутри мат объектов) // возможен только принудительный разрыв var bOnlyForcedBreak = PRS.bOnlyForcedBreak; var bNoOneBreakOperator = PRS.bNoOneBreakOperator; var CurLine = PRS.Line - this.StartLine; var CurRange = ( 0 === CurLine ? PRS.Range - this.StartRange : PRS.Range ); var ContentLen = this.Content.length; var RangeStartPos = this.protected_AddRange(CurLine, CurRange); var RangeEndPos = ContentLen - 1; if(this.RecalcInfo.bEqArray) this.InfoPoints.SetDefault(); var ascent = 0, descent = 0; this.size.width = 0; var bInline = this.ParaMath.Is_Inline(); var bOperBefore = this.ParaMath.Is_BrkBinBefore(); // true - оператор находится в начале строки, false - оператор находится в конце строки // для внутристроковой формулы : начало формулы - начало нового слова if(this.bRoot && bInline && true == this.IsStartRange(PRS.Line, PRS.Range) && PRS.Ranges.length == 0) { PRS.Update_CurPos(0, Depth); PRS.Update_CurPos(0, Depth+1); // нулевой элемент всегда Run PRS.Set_LineBreakPos(0); if(PRS.Word == true) { PRS.FirstItemOnLine = false; PRS.X += PRS.SpaceLen + PRS.WordLen; PRS.Word = false; PRS.EmptyLine = false; PRS.EmptyLineWithBreak = false; PRS.SpaceLen = 0; PRS.WordLen = 0; PRS.TextOnLine = true; PRS.XRange = PRS.X; } } var bCurInsideOper = false; for(var Pos = RangeStartPos; Pos < ContentLen; Pos++) { var Item = this.Content[Pos], Type = Item.Type; PRS.bEndRunToContent = Pos == ContentLen - 1; // для однострочных мат объектов обновляем CurLine и CurRange, Run в этом случае не могут разбиваться на несколько строк if (this.bOneLine || (0 === Pos && 0 === CurLine && 0 === CurRange ) || Pos !== RangeStartPos) Item.Recalculate_Reset( PRS.Range, PRS.Line, PRS ); PRS.Update_CurPos( Pos, Depth ); if(this.bOneLine == true) // контент занимает всегда(!) одну строку { Item.Recalculate_Range_OneLine(PRS, ParaPr, Depth + 1); if(this.RecalcInfo.bEqArray && Type == para_Math_Composition) this.InfoPoints.ContentPoints.UpdatePoint(this.Content[Pos].size.width); this.size.width += Item.size.width; if(ascent < Item.size.ascent) ascent = Item.size.ascent; if(descent < Item.size.height - Item.size.ascent) descent = Item.size.height - Item.size.ascent; this.size.ascent = ascent; this.size.height = ascent + descent; } else if(bOnlyForcedBreak == true) { if(Type == para_Math_Run) { if(true === Item.Is_StartForcedBreakOperator()) { Item.Recalculate_Range(PRS, ParaPr, Depth + 1); } else { Item.Recalculate_Range_OneLine(PRS, ParaPr, Depth + 1); PRS.WordLen += Item.size.width; } } else { Item.Recalculate_Range(PRS, ParaPr, Depth + 1); if(Item.kind == MATH_BOX && true == Item.IsForcedBreak()) { this.private_ForceBreakBox(PRS, Item.size.width); } } if(PRS.NewRange == false && PRS.X + PRS.WordLen + PRS.SpaceLen > PRS.XEnd) { PRS.NewRange = true; PRS.MoveToLBP = true; } } else // контент может занимать несколько строк { // запомним позицию конца Run перед тем как зайдем во внутр мат объект (конечная позиция Run может измениться при пересчете внутр мат объекта) var _Depth = PRS.PosEndRun.Depth; var PrevLastPos = PRS.PosEndRun.Get(_Depth-1), LastPos = PRS.PosEndRun.Get(_Depth); var PrevWord = PRS.Word, MathFirstItem = PRS.MathFirstItem; PRS.bInsideOper = false; Item.Recalculate_Range(PRS, ParaPr, Depth + 1); if(Type == para_Math_Composition) { // перед мат объектом идет box break_operator и он не является первым элементом в строке if(Item.kind == MATH_BOX) { PRS.MathFirstItem = MathFirstItem; if(true == Item.IsForcedBreak()) { this.private_ForceBreakBox(PRS, Item, _Depth, PrevLastPos, LastPos); // _Depth, PrevLastPos, LastPos запоминаем до пересчета, поэтому передаем эти параметры в функцию PRS.bBreakBox = true; } else if(true == Item.IsOperatorEmulator()) { this.private_BoxOperEmulator(PRS, Item, _Depth, PrevLastPos, LastPos); // _Depth, PrevLastPos, LastPos запоминаем до пересчета, поэтому передаем эти параметры в функцию PRS.bBreakBox = true; } else { PRS.WordLen += Item.size.width; PRS.Word = true; if(PRS.X + PRS.SpaceLen + PRS.WordLen > PRS.XEnd) { if (PRS.FirstItemOnLine == false) { PRS.MoveToLBP = true; PRS.NewRange = true; this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange); } else { PRS.bMathWordLarge = true; } } } PRS.MathFirstItem = false; } else { // Слово не убирается в отрезке. Переносим слово в следующий отрезок // FirstItemOnLine == false - слово оказалось не единственным элементом в промежутке, делаем перенос if(PRS.X + PRS.SpaceLen + PRS.WordLen > PRS.XEnd) { if (PRS.FirstItemOnLine == false) { PRS.MoveToLBP = true; PRS.NewRange = true; this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange); } else { PRS.bMathWordLarge = true; } } // обновляем BreakPos на конец Run, т.к. внутри мат объекта BreakPos может измениться на if(true !== Word) // обновляем только в том случае, если Word = false, иначе можем здесь перебить корректный LineBreakPos if(bCurInsideOper == true && PrevWord == false && bOperBefore == false && bNoOneBreakOperator == false && PRS.bInsideOper == false) { // обновим : начало нового слова - конец предыдущего Run PRS.Update_CurPos(PrevLastPos, _Depth-1); PRS.Set_LineBreakPos(LastPos); if(PRS.NewRange == true) // делаем возврат к предыдущему оператору PRS.MoveToLBP = true; } PRS.Word = true; } if(PRS.NewRange == false && 0 === CurRange && 0 === CurLine) { var PrevRecalcInfo = PRS.RunRecalcInfoLast, NumberingAdd; if(null === PrevRecalcInfo) NumberingAdd = true; else NumberingAdd = PrevRecalcInfo.NumberingAdd; if(NumberingAdd && PRS.RunRecalcInfoLast) { PRS.X = PRS.Recalculate_Numbering(Item, this, ParaPr, PRS.X); PRS.RunRecalcInfoLast.NumberingAdd = false; PRS.RunRecalcInfoLast.NumberingUse = true; PRS.RunRecalcInfoLast.NumberingItem = PRS.Paragraph.Numbering; } } } else { if(PRS.MathFirstItem == true && false == Item.IsEmptyRange(PRS.Line, PRS.Range)) { PRS.MathFirstItem = false; } var CheckWrapIndent = PRS.bFirstLine == true ? PRS.X - PRS.XRange > PRS.WrapIndent : true; if(PRS.bInsideOper == true && CheckWrapIndent == true) { PRS.bOnlyForcedBreak = true; } } bCurInsideOper = bCurInsideOper || PRS.bInsideOper; } if ( true === PRS.NewRange ) { RangeEndPos = Pos; break; } } PRS.bInsideOper = PRS.bInsideOper || bCurInsideOper; PRS.bOnlyForcedBreak = bOnlyForcedBreak; if ( Pos >= ContentLen ) { RangeEndPos = Pos - 1; } var bSingleBarFraction = false; for(var Pos = 0; Pos < ContentLen; Pos++) { if(this.Content[Pos].kind == MATH_FRACTION && this.Content[Pos].Pr.type == BAR_FRACTION) { if(bSingleBarFraction) { bSingleBarFraction = false; break; } bSingleBarFraction = true; } else if( !(this.Content[Pos].Type == para_Math_Run && true == this.Content[Pos].Is_Empty()) ) // не пустой Run, другой мат объект { bSingleBarFraction = false; break; } } PRS.bSingleBarFraction = bSingleBarFraction; this.protected_FillRange(CurLine, CurRange, RangeStartPos, RangeEndPos); }; CMathContent.prototype.private_ForceBreakBox = function(PRS, Box, _Depth, PrevLastPos, LastPos) { var BoxLen = Box.size.width; if(true == PRS.MathFirstItem) { PRS.WordLen += BoxLen; } else { if(true === this.ParaMath.Is_BrkBinBefore()) { PRS.X += PRS.SpaceLen + PRS.WordLen; PRS.Update_CurPos(PrevLastPos, _Depth-1); PRS.Set_LineBreakPos(LastPos); this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange); PRS.MoveToLBP = true; PRS.NewRange = true; } else { PRS.Word = false; PRS.bForcedBreak = true; PRS.WordLen += BoxLen; } } }; CMathContent.prototype.private_BoxOperEmulator = function(PRS, Box, _Depth, PrevLastPos, LastPos) { var BoxLen = Box.size.width, BoxGapRight = Box.GapRight; var CheckWrapIndent = PRS.bFirstLine == true ? PRS.X - PRS.XRange > PRS.WrapIndent : true; var bOperBefore = this.ParaMath.Is_BrkBinBefore() == true; var bOnlyForcedBreakBefore = bOperBefore == true && PRS.MathFirstItem == false, bOnlyforcedBreakAfter = bOperBefore == false; if(CheckWrapIndent == true && (bOnlyForcedBreakBefore || bOnlyforcedBreakAfter)) { PRS.bOnlyForcedBreak = true; } var bOverXEnd; if(bOperBefore) // оператор находится в начале строки { bOverXEnd = PRS.X + PRS.WordLen + PRS.SpaceLen > PRS.XEnd; if(true == PRS.MathFirstItem) { PRS.WordLen += PRS.SpaceLen + PRS.WordLen + BoxLen; } else if(PRS.FirstItemOnLine == false && bOverXEnd) { PRS.MoveToLBP = true; PRS.NewRange = true; this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange); } else { PRS.X += PRS.SpaceLen + PRS.WordLen; // обновим : начало нового слова - конец предыдущего Run PRS.bInsideOper = true; PRS.FirstItemOnLine = false; PRS.Update_CurPos(PrevLastPos, _Depth-1); PRS.Set_LineBreakPos(LastPos); PRS.SpaceLen = BoxLen; PRS.WordLen = 0; PRS.Word = true; } } else { bOverXEnd = PRS.X + PRS.SpaceLen + PRS.WordLen + BoxLen - BoxGapRight > PRS.XEnd; PRS.OperGapRight = BoxGapRight; // Слово не убирается в отрезке. Переносим слово в следующий отрезок // FirstItemOnLine == false - слово оказалось не единственным элементом в промежутке, делаем перенос if(PRS.FirstItemOnLine == false && bOverXEnd) { PRS.MoveToLBP = true; PRS.NewRange = true; this.ParaMath.UpdateWidthLine(PRS, PRS.X - PRS.XRange); } else { PRS.bInsideOper = true; } PRS.X += PRS.SpaceLen + PRS.WordLen + BoxLen; PRS.SpaceLen = 0; PRS.WordLen = 0; PRS.Word = false; PRS.FirstItemOnLine = false; } }; CMathContent.prototype.Math_Set_EmptyRange = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var RangeStartPos = this.protected_AddRange(CurLine, CurRange); var RangeEndPos = RangeStartPos; this.protected_FillRange(CurLine, CurRange, RangeStartPos, RangeEndPos); this.Content[RangeStartPos].Math_Set_EmptyRange(_CurLine, _CurRange); }; CMathContent.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; if(this.Content.length > 0) this.Content[0].Recalculate_Reset(StartRange, StartLine, PRS); this.protected_ClearLines(); } }; CMathContent.prototype.IsEmptyRange = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); var bEmpty = true; if(StartPos == EndPos) { bEmpty = this.Content[StartPos].IsEmptyRange(_CurLine, _CurRange); } else { var Pos = StartPos; while(Pos <= EndPos) { if(false == this.Content[Pos].IsEmptyRange(_CurLine, _CurRange)) { bEmpty = false; break; } Pos++; } } return bEmpty; }; CMathContent.prototype.Displace_BreakOperator = function(isForward, bBrkBefore, CountOperators) { var Pos = this.CurPos; if (this.Content[Pos].Type == para_Math_Run) { var bApplyBreak = this.Content[Pos].Displace_BreakOperator(isForward, bBrkBefore, CountOperators); var NewPos = bBrkBefore ? Pos + 1 : Pos - 1; if (this.Content[NewPos] && bApplyBreak == false && (this.Content[NewPos].Type == para_Math_Run || this.Content[NewPos].kind == MATH_BOX)) { this.Content[NewPos].Displace_BreakOperator(isForward, bBrkBefore, CountOperators); } } else { this.Content[Pos].Displace_BreakOperator(isForward, bBrkBefore, CountOperators); } }; CMathContent.prototype.Recalculate_Range_Width = function(PRSC, _CurLine, _CurRange) { var RangeW = PRSC.Range.W; var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); for ( var CurPos = StartPos; CurPos <= EndPos; CurPos++ ) { this.Content[CurPos].Recalculate_Range_Width( PRSC, _CurLine, _CurRange ); } this.Bounds.SetWidth(CurLine, CurRange, PRSC.Range.W - RangeW); }; CMathContent.prototype.recalculateAllSize = function(textMeasurer) { var ascent = 0, descent = 0; this.size.width = 0; if (this.RecalcInfo.bEqArray) this.InfoPoints.SetDefault(); for (let pos = 0, count = this.Content.length; pos < count; ++pos) { let item = this.Content[pos]; if (para_Math_Run === item.Type) { item.Math_RecalculateContent(); } else { item.recalculateAllSize(textMeasurer); if (this.RecalcInfo.bEqArray) this.InfoPoints.ContentPoints.UpdatePoint(item.size.width); } this.size.width += item.size.width; if (ascent < item.size.ascent) ascent = item.size.ascent; if (descent < item.size.height - item.size.ascent) descent = item.size.height - item.size.ascent; this.size.ascent = ascent; this.size.height = ascent + descent; } }; CMathContent.prototype.RecalculateMinMaxContentWidth = function(MinMax) { for (let pos = 0, count = this.Content.length; pos < count; ++pos) { this.Content[pos].RecalculateMinMaxContentWidth(MinMax); } }; CMathContent.prototype.Recalculate_LineMetrics = function(PRS, ParaPr, _CurLine, _CurRange, ContentMetrics) { var CurLine = _CurLine - this.StartLine; var CurRange = (0 === CurLine ? _CurRange - this.StartRange : _CurRange); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); if(PRS.bFastRecalculate === false) { this.Bounds.Reset(CurLine, CurRange); } var NewContentMetrics = new CMathBoundsMeasures(); for(var Pos = StartPos; Pos <= EndPos; Pos++) { var Item = this.Content[Pos]; Item.Recalculate_LineMetrics(PRS, ParaPr, _CurLine, _CurRange, NewContentMetrics); } this.Bounds.UpdateMetrics(CurLine, CurRange, NewContentMetrics); ContentMetrics.UpdateMetrics(NewContentMetrics); }; CMathContent.prototype.Math_UpdateLineMetrics = function(PRS, ParaPr) { this.Content[0].Math_UpdateLineMetrics(PRS, ParaPr); // this.Content[0] - Run }; CMathContent.prototype.UpdateOperators = function(_CurLine, _CurRange, bEmptyGapLeft, bEmptyGapRight) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); for(var Pos = StartPos; Pos <= EndPos; Pos++) { var _bEmptyGapLeft = bEmptyGapLeft && Pos == StartPos, _bEmptyGapRight = bEmptyGapRight && Pos == EndPos; this.Content[Pos].UpdateOperators(_CurLine, _CurRange, _bEmptyGapLeft, _bEmptyGapRight); } }; CMathContent.prototype.Get_Bounds = function() { return this.Bounds.Get_Bounds(); }; CMathContent.prototype.Get_LineBound = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine, CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); return this.Bounds.Get_LineBound(CurLine, CurRange); }; CMathContent.prototype.GetPos = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine, CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); return this.Bounds.GetPos(CurLine, CurRange); }; CMathContent.prototype.GetWidth = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine, CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); return this.Bounds.GetWidth(CurLine, CurRange); }; CMathContent.prototype.GetAscent = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine, CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); return this.Bounds.GetAscent(CurLine, CurRange); }; CMathContent.prototype.GetDescent = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine, CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); return this.Bounds.GetDescent(CurLine, CurRange); }; CMathContent.prototype.Get_StartRangePos = function(_CurLine, _CurRange, SearchPos, Depth, bStartPos) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var StartPos = this.protected_GetRangeStartPos(CurLine, CurRange); var CurPos = this.CurPos; var Result; var bStart = this.bRoot ? CurRange == 0 : bStartPos; if(this.Content[CurPos].Type == para_Math_Composition && bStartPos !== true) { bStart = bStart && CurPos == StartPos; Result = this.Content[CurPos].Get_StartRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, bStart); // пытаемся встать в начало внутреннего контента if ( true === Result ) { SearchPos.Pos.Update( CurPos, Depth ); } else if(this.bRoot && CurPos !== StartPos) { if(this.Content[StartPos].Type == para_Math_Composition) Result = this.Content[StartPos].Get_StartRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, true); else Result = this.Content[StartPos].Math_Get_StartRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, true); if ( true === Result ) SearchPos.Pos.Update(StartPos, Depth); } } else { if(this.bRoot && CurLine == 0) { bStart = bStart && StartPos < CurPos; } if(this.Content[StartPos].Type == para_Math_Composition) Result = this.Content[StartPos].Get_StartRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, bStart); // может произойти, если мат объект разбивается на строки else Result = this.Content[StartPos].Math_Get_StartRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, bStart); if ( true === Result ) SearchPos.Pos.Update(StartPos, Depth ); } return Result; }; CMathContent.prototype.Get_EndRangePos = function(_CurLine, _CurRange, SearchPos, Depth, bEndPos) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); var CurPos = this.CurPos; var Result; var bLastRange = CurRange == this.protected_GetRangesCount(CurLine) - 1; var bEnd = this.bRoot ? bLastRange : bEndPos; if(this.Content[CurPos].Type == para_Math_Composition && bEndPos !== true) { Result = this.Content[CurPos].Get_EndRangePos(_CurLine, _CurRange, SearchPos, Depth + 1); // пытаемся встать в конец внутреннего контента if ( true === Result ) { SearchPos.Pos.Update( CurPos, Depth ); } else if(this.bRoot && CurPos !== EndPos) { if(this.Content[EndPos].Type == para_Math_Composition) Result = this.Content[EndPos].Get_EndRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, true); else Result = this.Content[EndPos].Math_Get_EndRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, true); if ( true === Result ) SearchPos.Pos.Update(EndPos, Depth ); } } else { bEnd = this.bRoot && bLastRange ? true /*иначе после того как встанем после формулы перед знаком параграфа, на следующем End встанем перед формулой*/ : bEnd || CurPos < EndPos; if(this.Content[EndPos].Type == para_Math_Composition) Result = this.Content[EndPos].Get_EndRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, bEnd); // может произойти, если мат объект разбивается на строки else Result = this.Content[EndPos].Math_Get_EndRangePos(_CurLine, _CurRange, SearchPos, Depth + 1, bEnd); if ( true === Result ) SearchPos.Pos.Update(EndPos, Depth ); } return Result; }; CMathContent.prototype.Math_Is_End = function(_CurLine, _CurRange) { var CurLine = _CurLine - this.StartLine; var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange ); var EndPos = this.protected_GetRangeEndPos(CurLine, CurRange); var Len = this.Content.length; var result = false; if(EndPos == Len - 1 && EndPos >= 0) //TODO check: EndPos >= 0 { result = this.Content[Len - 1].Math_Is_End(_CurLine, _CurRange); } return result; }; CMathContent.prototype.Get_AlignBrk = function(_CurLine, bBrkBefore) { var AlnAt = null; var CurLine = _CurLine - this.StartLine; var RangesCount = this.protected_GetRangesCount(CurLine - 1); var EndPos = this.protected_GetRangeEndPos(CurLine - 1, RangesCount - 1); if(CurLine !== 0) // получаем смещение до расчета Recalculate_Range { var bEndRun = this.Content[EndPos].Type == para_Math_Run && true == this.Content[EndPos].Math_Is_End(_CurLine - 1, RangesCount - 1), bNextBox = EndPos < this.Content.length - 1 && this.Content[EndPos + 1].kind == MATH_BOX; var bCheckNextBox = bEndRun == true && bNextBox == true && bBrkBefore == true; var bRunEmptyRange = this.Content[EndPos].Type == para_Math_Run && this.Content[EndPos].IsEmptyRange(_CurLine - 1, RangesCount - 1), bPrevBox = EndPos > 0 && this.Content[EndPos - 1].kind == MATH_BOX; var bCheckPrevNextBox = bRunEmptyRange == true && bPrevBox == true && bBrkBefore == false; if(bCheckPrevNextBox) { AlnAt = this.Content[EndPos - 1].Get_AlignBrk(_CurLine, bBrkBefore); } else if(bCheckNextBox) { AlnAt = this.Content[EndPos + 1].Get_AlignBrk(_CurLine, bBrkBefore); } else { AlnAt = this.Content[EndPos].Get_AlignBrk(_CurLine, bBrkBefore); } } return AlnAt; }; CMathContent.prototype.IsStartRange = function(Line, Range) { return Line - this.StartLine == 0 && Range - this.StartRange == 0; }; CMathContent.prototype.IsStartLine = function(Line) { return Line == this.StartLine; }; CMathContent.prototype.GetSelectDirection = function() { if (true !== this.Selection.Use) return 0; if (this.Selection.StartPos < this.Selection.EndPos) return 1; else if (this.Selection.StartPos > this.Selection.EndPos) return -1; return this.Content[this.Selection.StartPos].GetSelectDirection(); }; CMathContent.prototype.MoveCursorToStartPos = function() { this.CurPos = 0; this.Content[0].MoveCursorToStartPos(); }; CMathContent.prototype.MoveCursorToEndPos = function(SelectFromEnd) { this.CurPos = this.Content.length - 1; this.Content[this.CurPos].MoveCursorToEndPos(SelectFromEnd); }; CMathContent.prototype.Check_Composition = function() { var Pos = this.private_FindCurrentPosInContent(); return Pos !== null && this.Content[Pos].Type == para_Math_Composition; }; CMathContent.prototype.Can_ModifyForcedBreak = function(Pr) { var Pos = this.private_GetPosRunForForcedBreak(); if(Pos !== null && this.bOneLine == false) { var bBreakOperator = this.Content[Pos].Check_ForcedBreak(); var CurrentRun = this.Content[Pos]; var bCanCheckNearsRun = bBreakOperator == false && false == CurrentRun.IsSelectionUse(); var bPrevItem = bCanCheckNearsRun && Pos > 0 && true == CurrentRun.Cursor_Is_Start(), bNextItem = bCanCheckNearsRun && Pos < this.Content.length - 1 && true == CurrentRun.Cursor_Is_End(); var bPrevRun = bPrevItem && this.Content[Pos - 1].Type == para_Math_Run, bNextRun = bNextItem && this.Content[Pos + 1].Type == para_Math_Run; if(bBreakOperator) { this.Content[Pos].Math_Can_ModidyForcedBreak(Pr); } else if(bPrevRun) { this.Content[Pos - 1].Math_Can_ModidyForcedBreak(Pr, true, false); } else if(bNextRun) { this.Content[Pos + 1].Math_Can_ModidyForcedBreak(Pr, false, true); } } }; CMathContent.prototype.private_GetPosRunForForcedBreak = function() { var Pos = null; if(true === this.Selection.Use) { var StartPos = this.Selection.StartPos, EndPos = this.Selection.EndPos; if ( StartPos > EndPos ) { StartPos = this.Selection.EndPos; EndPos = this.Selection.StartPos; } var bHaveSelectedItem = false; for(var CurPos = StartPos; CurPos <= EndPos; CurPos++) { var Item = this.Content[CurPos]; var bSelect = true !== Item.IsSelectionEmpty(), bSelectRun = bSelect == true && Item.Type == para_Math_Run, bSelectComp = bSelect == true && Item.Type == para_Math_Composition; var bSelectManyRuns = bSelectRun && bHaveSelectedItem; if(bSelectComp || bSelectManyRuns) { Pos = null; break; } if(bSelectRun) { bHaveSelectedItem = true; Pos = CurPos; } } } else { Pos = this.CurPos; } return Pos; }; CMathContent.prototype.private_FindCurrentPosInContent = function() { var Pos = null; if(true === this.Selection.Use) { var StartPos = this.Selection.StartPos, EndPos = this.Selection.EndPos; if ( StartPos > EndPos ) { StartPos = this.Selection.EndPos; EndPos = this.Selection.StartPos; } var bComposition = false; for(var CurPos = StartPos; CurPos <= EndPos; CurPos++) { var Item = this.Content[CurPos]; if(Item.Type == para_Math_Run && true !== Item.IsSelectionEmpty()) { Pos = bComposition == true ? null : CurPos; break; } else if(Item.Type == para_Math_Composition) { if(bComposition == true) { Pos = null; break; } else { Pos = CurPos; bComposition = true; } } } } else { this.private_CorrectCurPos(); Pos = this.CurPos; } return Pos; }; CMathContent.prototype.Is_CurrentContent = function() { var Pos = this.private_FindCurrentPosInContent(); return Pos == null || this.Content[Pos].Type == para_Math_Run; }; CMathContent.prototype.Set_MenuProps = function(Props) { var Pos = this.private_FindCurrentPosInContent(); if(true == this.Is_CurrentContent()) { this.Apply_MenuProps(Props, Pos); } else if(false == this.private_IsMenuPropsForContent(Props.Action) && true == this.Content[Pos].Can_ApplyMenuPropsToObject()) { // не нужно проходиться по вложенным элементам // 1. уже применили изменения, продожать нет необходимости // 2. потому что могут совпать типы текущего элемента и вложенного и тогда изменения применятся к обоим элементам if(false === this.Delete_ItemToContentThroughInterface(Props, Pos)) // try to delete { this.Content[Pos].Apply_MenuProps(Props); } } else { this.Content[Pos].Set_MenuProps(Props); } }; CMathContent.prototype.Apply_MenuProps = function(Props, Pos) { var ArgSize, NewArgSize; if (Props.Action & c_oMathMenuAction.IncreaseArgumentSize) { if (true === this.Parent.Can_ModifyArgSize() && true == this.Compiled_ArgSz.Can_Increase() && true == this.ArgSize.Can_SimpleIncrease()) { ArgSize = this.ArgSize.GetValue(); NewArgSize = this.ArgSize.Increase(); AscCommon.History.Add(new CChangesMathContentArgSize(this, ArgSize, NewArgSize)); this.Recalc_RunsCompiledPr(); } } else if (Props.Action & c_oMathMenuAction.DecreaseArgumentSize) { if (true === this.Parent.Can_ModifyArgSize() && true == this.Compiled_ArgSz.Can_Decrease() && true == this.ArgSize.Can_Decrease()) { ArgSize = this.ArgSize.GetValue(); NewArgSize = this.ArgSize.Decrease(); AscCommon.History.Add(new CChangesMathContentArgSize(this, ArgSize, NewArgSize)); this.Recalc_RunsCompiledPr(); } } var Run; if (Pos !== null && Props.Action & c_oMathMenuAction.InsertForcedBreak) { Run = this.private_Get_RunForForcedBreak(Pos); Run.Set_MathForcedBreak(true); } else if (Pos !== null && Props.Action & c_oMathMenuAction.DeleteForcedBreak) { Run = this.private_Get_RunForForcedBreak(Pos); Run.Set_MathForcedBreak(false); } }; CMathContent.prototype.private_Get_RunForForcedBreak = function(Pos) { var CurrentRun = this.Content[Pos]; var bCurrentForcedBreak = this.Content[Pos].Type == para_Math_Run && true == CurrentRun.Check_ForcedBreak(), bPrevForcedBreak = Pos > 0 && true == CurrentRun.Cursor_Is_Start(), bNextForcedBreak = Pos < this.Content.length && true == CurrentRun.Cursor_Is_End(); var Run = null; if(bCurrentForcedBreak) { Run = this.Content[Pos]; var NewRun = Run.Math_SplitRunForcedBreak(); if(NewRun !== null) { this.Internal_Content_Add(Pos+1, NewRun, true); Run = NewRun; } } else if(bPrevForcedBreak) { Run = this.Content[Pos - 1]; } else if(bNextForcedBreak) { Run = this.Content[Pos + 1]; } return Run; }; CMathContent.prototype.Delete_ItemToContentThroughInterface = function(Props, Pos) { var bDelete = false; var Item = this.Content[Pos]; if(Item.kind == MATH_DEGREESubSup && Item.Pr.type == DEGREE_SubSup && Props.Type == Asc.c_oAscMathInterfaceType.Script) { if(Props.ScriptType == Asc.c_oAscMathInterfaceScript.Sup) { this.private_AddModifiedDegree(Pos, DEGREE_SUPERSCRIPT); bDelete = true; } else if(Props.ScriptType == Asc.c_oAscMathInterfaceScript.Sub) { this.private_AddModifiedDegree(Pos, DEGREE_SUBSCRIPT); bDelete = true; } } var RemoveChar = Props.Action & c_oMathMenuAction.RemoveAccentCharacter && Item.kind == MATH_ACCENT, RemoveBar = Props.Action & c_oMathMenuAction.RemoveBar && Item.kind == MATH_BAR, RemoveScript = Props.Type == Asc.c_oAscMathInterfaceType.Script && Props.ScriptType == Asc.c_oAscMathInterfaceScript.None && (Item.kind == MATH_DEGREESubSup || Item.kind == MATH_DEGREE), RemoveLimit = Props.Type == Asc.c_oAscMathInterfaceType.Limit && Props.Pos == Asc.c_oAscMathInterfaceLimitPos.None && Item.kind === MATH_LIMIT, RemoveMatrix = Props.Type == Asc.c_oAscMathInterfaceType.Matrix && this.Content[Pos].Is_DeletedItem(Props.Action), RemoveEqArray = Props.Type == Asc.c_oAscMathInterfaceType.EqArray && this.Content[Pos].Is_DeletedItem(Props.Action), RemoveDelimiter = Props.Action & c_oMathMenuAction.RemoveDelimiter && Item.kind == MATH_DELIMITER, RemoveGroupChar = Props.Type == Asc.c_oAscMathInterfaceType.GroupChar && Props.Pos == Asc.c_oAscMathInterfaceGroupCharPos.None && Item.kind == MATH_GROUP_CHARACTER, RemoveRadical = Props.Action & c_oMathMenuAction.RemoveRadical && Item.kind == MATH_RADICAL; if(RemoveChar || RemoveBar || RemoveScript || RemoveLimit || RemoveMatrix || RemoveEqArray || RemoveDelimiter || RemoveGroupChar || RemoveRadical) { var Items = this.Content[Pos].Get_DeletedItemsThroughInterface(); if(Items == null) // такого не должно произойти return; this.Remove_FromContent(Pos, 1); this.ConcatToContent(Pos, Items); this.Correct_Content(); bDelete = true; } return bDelete; }; CMathContent.prototype.private_AddModifiedDegree = function(Pos, Type) { var DegreeSubSup = this.Content[Pos]; var Base = DegreeSubSup.getBase(); var Iterator = Type == DEGREE_SUBSCRIPT ? DegreeSubSup.getLowerIterator() : DegreeSubSup.getUpperIterator(); var Degree = new CDegree({type: Type}, false); this.Remove_FromContent(Pos, 1); this.Add_ToContent(Pos, Degree); var oBase = Degree.getBase(), oIterator = Degree.getIterator(); oBase.Concat_ToEnd(Base.Content); oIterator.Concat_ToEnd(Iterator.Content); }; CMathContent.prototype.Get_MenuProps = function() { var Pr = new CMathMenuBase(); var Pos = this.private_FindCurrentPosInContent(); if(Pos !== null && this.Content[Pos].Type == para_Math_Composition) { Pr = this.Content[Pos].Get_MenuProps(); } else { this.Can_ModifyForcedBreak(Pr); } return Pr; }; CMathContent.prototype.private_IsMenuPropsForContent = function(Action) { // данные изменения могут прийти для любого типа изменений var bInsertForcedBreak = Action & c_oMathMenuAction.InsertForcedBreak, bDeleteForcedBreak = Action & c_oMathMenuAction.DeleteForcedBreak, bIncreaseArgSize = Action & c_oMathMenuAction.IncreaseArgumentSize, bDecreaseArgSize = Action & c_oMathMenuAction.DecreaseArgumentSize; return bDecreaseArgSize || bIncreaseArgSize || bInsertForcedBreak || bDeleteForcedBreak; }; CMathContent.prototype.SplitSelectedContent = function() { if (this.Content.length < 1) return; if (this.Selection.StartPos > this.Selection.EndPos) { let intTemp = this.Selection.StartPos; this.Selection.StartPos = this.Selection.EndPos; this.Selection.EndPos = intTemp; } if (this.Selection.StartPos !== this.Selection.EndPos) { this.SplitSelectedContentPos(this.Selection.StartPos); this.SplitSelectedContentPos(this.Selection.EndPos); } else { this.SplitSelectedContentPos(this.Selection.StartPos); } }; CMathContent.prototype.SplitSelectedContentPos = function(pos) { let oContent = this.Content[pos]; let isStart = this.Selection.StartPos === pos; if (oContent) { if (oContent.Type === 49) { if (oContent.Selection.StartPos > oContent.Selection.EndPos) { var intTemp = oContent.Selection.StartPos; oContent.Selection.StartPos = oContent.Selection.EndPos; oContent.Selection.EndPos = intTemp; } if (oContent.Selection.StartPos !== 0 && oContent.Selection.StartPos <= oContent.Content.length - 1) { let oPrevContent = oContent.Split_Run(oContent.Selection.StartPos); this.Add_ToContent(this.Selection.StartPos + 1, oPrevContent); this.Selection.StartPos += 1; this.Selection.EndPos += 1; if (oPrevContent.Selection.EndPos !== oPrevContent.Content.length) { let oNextContent = oPrevContent.Split_Run(oPrevContent.Selection.EndPos); this.Add_ToContent(this.Selection.EndPos + 1, oNextContent); } } else if (oContent.Selection.StartPos === oContent.Selection.EndPos && isStart) { this.Selection.StartPos += 1; } if (oContent.Selection.EndPos !== oContent.Content.length && oContent.Selection.EndPos <= oContent.Content.length - 1) { let oNextContent = oContent.Split_Run(oContent.Selection.EndPos); this.Add_ToContent(this.Selection.EndPos + 1, oNextContent); } else if (oContent.Selection.StartPos === oContent.Selection.EndPos && !isStart) { this.Selection.EndPos -= 1; } } } }; CMathContent.prototype.AddDataFromFlatMathTextAndStyles = function (arrData) { for (let i = 0; i < arrData.length; i++) { this.Add_Text( arrData[i].text, this.Paragraph, undefined, arrData[i].additionalMathData ); } }; CMathContent.prototype.ConvertContentView = function(intStart, intEnd, nInputType, isToLinear) { if (this.Content.length === 0) return; let MathText = new AscMath.MathTextAndStyles(nInputType); if (intStart >= 0 && intEnd <= this.Content.length) { let intCount = (intEnd - intStart) + 1; for (let i = intStart, j = 0; i <= intEnd; i++) { let oElement = this.Content[i]; if (undefined !== oElement) MathText.Add(oElement, false); } if (MathText.IsEmpty()) return; if ((isToLinear || undefined === nInputType || null === nInputType)) { let arrContentAfterConvert = this.SplitContentByPos(intStart + intCount); this.Remove_FromContent(intStart, intCount); let nStartPos = this.Content.length; this.AddDataFromFlatMathTextAndStyles(MathText.Flat()) let nEndPos = this.Content.length - 1; this.ConcatToContent(this.Content.length, arrContentAfterConvert); // select only converted content this.CurPos = nEndPos; this.Selection.Use = true; this.Selection.StartPos = nStartPos; this.Selection.EndPos = nEndPos; this.State.ContentPos = nEndPos; for (let i = nStartPos; i <= nEndPos; i++) { this.Content[i].SelectAll(1); } } else { let oTempContent = new CMathContent(); if (nInputType === Asc.c_oAscMathInputType.Unicode) AscMath.CUnicodeConverter(MathText, oTempContent); else if (nInputType === Asc.c_oAscMathInputType.LaTeX) AscMath.ConvertLaTeXToTokensList(MathText, oTempContent); this.Remove_FromContent(intStart, intCount); this.RemoveSelection(); for (let i = 0; i < oTempContent.Content.length; i++) { this.Add_ToContent(intStart + i, oTempContent.Content[i], false); this.Content[intStart + i].SelectAll(); if (i === 0) { this.Selection.Use = true; this.Selection.StartPos = intStart + i; this.Selection.EndPos = intStart + i; } else { this.Selection.EndPos = intStart + i; } } this.Correct_Content(true) this.Correct_Selection(); } } }; CMathContent.prototype.SplitContentByPos = function (nPos, isCurPos) { let oCurrentObj = this.Content[nPos]; let nCursorPos = oCurrentObj instanceof ParaRun ? oCurrentObj.State.ContentPos : null; let arrContent = []; if (nCursorPos !== null && nCursorPos < oCurrentObj.Content.length) { if (oCurrentObj.Split_Run) { let oNewRun = oCurrentObj.Split_Run(nCursorPos); arrContent.push(oNewRun); } else { // контент в котором мы находимся не является ParaRun // значит делить не нужно т.к мы в обертке - выходим и отменяем автокоррекцию return false; } } for (let i = isCurPos ? nPos + 1 : nPos; i < this.Content.length; i++) { arrContent.push(this.Content[i].Copy()); } let nStartPos = isCurPos ? nPos + 1 : nPos; let nEndPos = isCurPos ? nPos - 1 : nPos; if (nStartPos < this.Content.length) this.Remove_FromContent(nStartPos, this.Content.length - nEndPos); return arrContent; }; CMathContent.prototype.ProcessingOldEquationConvert = function () { for (let i = 0; i < this.Content.length; i++) { this.Content[i].ProcessingOldEquationConvert(); } }; CMathContent.prototype.Process_AutoCorrect = function(oElement) { if (!AscMath.GetAutoConvertation()) return; let logicDocument = this.GetLogicDocument(); let nInputType = logicDocument ? logicDocument. Api.getMathInputType() : Asc.c_oAscMathInputType.Unicode; AscCommon.ExecuteEditorAction({description : AscDFH.historydescription_Document_AutoCorrectMath}, function() { if (nInputType === 0) AscMath.StartAutoCorrectionMath(this); }, logicDocument, this ); }; CMathContent.prototype.GetLastContent = function () { let oContent = this; while (oContent && oContent.Content && oContent.Content.length > 0) { oContent = oContent.Content[oContent.Content.length - 1]; } return oContent; } CMathContent.prototype.GetLastTextElement = function () { let oContent = this.GetLastContent(); if (oContent) return String.fromCharCode(oContent.value); } CMathContent.prototype.AddContentForAutoCorrection = function(arrNewElements, isCurPosChange) { if (arrNewElements.length < 1) return; this.ConcatToContent( isCurPosChange ? this.CurPos + 1 : this.CurPos, arrNewElements); }; CMathContent.prototype.IsLastElement = function (type) { if (this.Content.length === 0) return let oLastElement = this.Content[this.Content.length - 1]; if (oLastElement.Type === 49) return oLastElement.MathAutocorrection_IsLastElement(type); return false; }; CMathContent.prototype.Clear_ContentChanges = function() { this.m_oContentChanges.Clear(); }; CMathContent.prototype.Add_ContentChanges = function(Changes) { this.m_oContentChanges.Add(Changes); }; CMathContent.prototype.Refresh_ContentChanges = function() { this.m_oContentChanges.Refresh(); }; CMathContent.prototype.haveMixedContent = function(isLaTeX) { let isOperator = 0; let isNormalText = 0; let isCustomContent = 0; let nMathContent = 0; let isSpace = 0; for (let i = 0; i < this.Content.length; i++) { let oCurrentContent = this.Content[i]; if (oCurrentContent instanceof ParaRun) { if (oCurrentContent.IsContainMathOperators()) isOperator = 1; if (oCurrentContent.IsContainNormalText()) isNormalText = 1; if (oCurrentContent.IsContainSpaces()) isSpace = 1; // if (oCurrentContent.Content.length > 0) // nMathContent++; } else { nMathContent++; if (isLaTeX && oCurrentContent instanceof CDelimiter) return false; if (isCustomContent || oCurrentContent instanceof CFraction || oCurrentContent instanceof CDegree || oCurrentContent instanceof CDegreeSubSup || oCurrentContent instanceof CLimit || oCurrentContent instanceof CMathFunc ) return true; } if (isOperator + isNormalText + isSpace > 1 || (!isLaTeX && nMathContent > 1)) return true; } return false; }; CMathContent.prototype.GetTextOfElement = function(oMathText, isDefaultText) { oMathText = new AscMath.MathTextAndStyles(oMathText, isDefaultText); const checkIsNotOperatorOrBracket = function (symbol) { if (!symbol) return true; let isNotOperatorOrBracket = true; for (let i = 0; i < symbol.length; i++) { isNotOperatorOrBracket = !AscMath.MathLiterals.operator.SearchU(symbol[i]) && !AscMath.MathLiterals.lrBrackets.SearchU(symbol[i]) && !AscMath.MathLiterals.rBrackets.SearchU(symbol[i]) && !AscMath.MathLiterals.lBrackets.SearchU(symbol[i]) && !AscMath.MathLiterals.space.SearchU(symbol[i]) if (!isNotOperatorOrBracket) return false; } return isNotOperatorOrBracket; } // refactor this to normal methods for (let i = 0; i < this.Content.length; i++) { oMathText.Add(this.Content[i], false); if (!oMathText.IsLaTeX()) { if (!(this.Content[i] instanceof ParaRun)) // если текущий элемент математический объект { if (this.Content[i + 1] && !(this.Content[i + 1] instanceof ParaRun)) // если след эл. мат. объект { oMathText.AddText(new AscMath.MathText(" ", this.Content[i])); } else if (this.Content[i + 1] && (this.Content[i + 1] instanceof ParaRun) && this.Content[i + 2] && !(this.Content[i + 2] instanceof ParaRun)) { let strText = this.Content[i + 1].GetTextOfElement().GetText(); if (checkIsNotOperatorOrBracket(strText[0])) oMathText.AddText(new AscMath.MathText(" ", this.Content[i])); } else if (this.Content[i + 1] && this.Content[i + 1] instanceof ParaRun && !(this.Content[i] instanceof CDelimiter) ) // если след элемент текстовый блок { let strText = this.Content[i + 1].GetTextOfElement().GetText(); if (!this.Content[i + 1].Is_Empty() && checkIsNotOperatorOrBracket(strText[0])) oMathText.AddText(new AscMath.MathText(" ", this.Content[i])); } } else if (this.Content[i] instanceof ParaRun) { if (this.Content[i + 1] && !(this.Content[i+1] instanceof ParaRun) && !(this.Content[i+1] instanceof CDelimiter || this.Content[i+1] instanceof CMathFunc || this.Content[i+1] instanceof CEqArray)) { let strText = this.Content[i].GetTextOfElement().GetText(); if (checkIsNotOperatorOrBracket(strText) && !this.Content[i].Is_Empty()) oMathText.AddText(new AscMath.MathText(" ", this.Content[i])); } } } } return oMathText; }; CMathContent.prototype.GetTextContent = function(bSelectedText, isLaTeX) { if (undefined === isLaTeX || null === isLaTeX) isLaTeX = false; let nStartPos = 0; let nEndPos = this.Content.length - 1; let oMathText = new AscMath.MathTextAndStyles(isLaTeX); if (bSelectedText) { nStartPos = this.Selection.Use == true ? Math.min(this.Selection.StartPos, this.Selection.EndPos) : this.CurPos.ContentPos; nEndPos = this.Selection.Use == true ? Math.max(this.Selection.StartPos, this.Selection.EndPos) : this.CurPos.ContentPos; } for (let i = nStartPos; i <= nEndPos; i++) { let oElement = this.Content[i]; oMathText.Add(oElement, false, false, bSelectedText); } let strContent = oMathText.GetText(); return {str: strContent, content: oMathText}; }; var g_DefaultAutoCorrectMathFuncs = [ 'arcsin', 'asin', 'sin', 'arcsinh', 'asinh', 'sinh', 'arcsec', 'sec', 'asec', 'arcsech', 'asech','sech', 'arccos', 'acos', 'cos', 'arccosh','acosh', 'cosh', 'arccsc', 'acsc', 'csc', 'arccsch', 'acsch', 'csch', 'arctan', 'atan', 'tan', 'arctanh', 'atanh', 'tanh', 'arccot', 'acot', 'cot', 'arccoth', 'acoth', 'coth', 'arg', 'det', 'exp', 'inf', 'lim', 'min', 'def', 'dim', 'gcd', 'ker', 'log', 'Pr', 'deg', 'erf', 'hom', 'lg', 'ln', 'max', 'sup' ]; var g_DefaultAutoCorrectMathSymbolsList = [ ['!!', 0x203C], ['...', 0x2026], ['::', 0x2237], [':=', 0x2254], ['/<', 0x226E], ['/>', 0x226F], ['/=', 0x2260], ['~=', 0x2245], ['-+', 0x2213], ['+-', 0x00B1], ['<<', 0x226A], ['<=', 0x2264], ['->', 0x2192], ['>=', 0x2265], ['>>', 0x226B], ['\\above', 0x2534], ['\\acute', 0x0301], ['\\aleph', 0x2135], ['\\alpha', 0x03B1], ['\\Alpha', 0x0391], ['\\amalg', 0x2210], ['\\angle', 0x2220], ['\\aoint', 0x222E], ['/\\approx', 0x2249], ['\\approx', 0x2248], ['\\asmash', 0x2B06], ['\\ast', 0x2217], ['/\\asymp', 0x226D], ['\\asymp', 0x224D], ['\\atop', 0x00A6], ['\\bar', 0x0305], ['\\Bar', 0x033F], ['\\because', 0x2235], ['\\begin', 0x3016], ['\\below', 0x252C], ['\\bet', 0x2136], ['\\beta', 0x03B2], ['\\Beta', 0x0392], ['\\beth', 0x2136], ['\\bigcap', 0x22C2], ['\\bigcup', 0x22C3], ['\\bigodot', 0x2A00], ['\\bigoplus', 0x2A01], ['\\bigotimes', 0x2A02], ['\\bigsqcup', 0x2A06], ['\\biguplus', 0x2A04], ['\\bigvee', 0x22C1], ['\\bigwedge', 0x22C0], ['\\binomial',[0x0028, 0x0061, 0x002B, 0x0062, 0x0029, 0x005E, 0x006E, 0x003D, 0x2211, 0x005F, 0x0028, 0x006B, 0x003D, 0x0030, 0x0029, 0x005E, 0x006E, 0x0020, 0x2592, 0x0028, 0x006E, 0x00A6, 0x006B, 0x0029, 0x0061, 0x005E, 0x006B, 0x0020, 0x0062, 0x005E, 0x0028, 0x006E, 0x002D, 0x006B, 0x0029]], ['\\bot', 0x22A5], ['\\bowtie', 0x22C8], ['\\box', 0x25A1], ['\\boxdot', 0x22A1], ['\\boxminus', 0x229F], ['\\boxplus', 0x229E], ['\\bra', 0x27E8], ['\\break', 0x2936], ['\\breve', 0x0306], ['\\bullet', 0x2219], ['\\cap', 0x2229], ['\\cbrt', 0x221B], ['\\cases', 0x24B8], ['\\cdot', 0x22C5], ['\\cdots', 0x22EF], ['\\check', 0x030C], ['\\chi', 0x03C7], ['\\Chi', 0x03A7], ['\\circ', 0x2218], ['\\close', 0x2524], ['\\clubsuit', 0x2663], ['\\coint', 0x2232], ['/\\cong', 0x2247], ['\\cong', 0x2245], ['\\coprod', 0x2210], ['\\cup', 0x222A], ['\\dalet', 0x2138], ['\\daleth', 0x2138], ['\\dashv', 0x22A3], ['\\dd', 0x2146], ['\\Dd', 0x2145], ['\\ddddot', 0x20DC], ['\\dddot', 0x20DB], ['\\ddot', 0x0308], ['\\ddots', 0x22F1], ['\\defeq', 0x225D], ['\\degc', 0x2103], ['\\degf', 0x2109], ['\\degree', 0x00B0], ['\\delta', 0x03B4], ['\\Delta', 0x0394], ['\\Deltaeq', 0x225C], ['\\diamond', 0x22C4], ['\\diamondsuit', 0x2662], ['\\div', 0x00F7], ['\\dot', 0x0307], ['\\doteq', 0x2250], ['\\dots', 0x2026], ['\\doublea', 0x1D552], ['\\doubleA', 0x1D538], ['\\doubleb', 0x1D553], ['\\doubleB', 0x1D539], ['\\doublec', 0x1D554], ['\\doubleC', 0x2102], ['\\doubled', 0x1D555], ['\\doubleD', 0x1D53B], ['\\doublee', 0x1D556], ['\\doubleE', 0x1D53C], ['\\doublef', 0x1D557], ['\\doubleF', 0x1D53D], ['\\doubleg', 0x1D558], ['\\doubleG', 0x1D53E], ['\\doubleh', 0x1D559], ['\\doubleH', 0x210D], ['\\doublei', 0x1D55A], ['\\doubleI', 0x1D540], ['\\doublej', 0x1D55B], ['\\doubleJ', 0x1D541], ['\\doublek', 0x1D55C], ['\\doubleK', 0x1D542], ['\\doublel', 0x1D55D], ['\\doubleL', 0x1D543], ['\\doublem', 0x1D55E], ['\\doubleM', 0x1D544], ['\\doublen', 0x1D55F], ['\\doubleN', 0x2115], ['\\doubleo', 0x1D560], ['\\doubleO', 0x1D546], ['\\doublep', 0x1D561], ['\\doubleP', 0x2119], ['\\doubleq', 0x1D562], ['\\doubleQ', 0x211A], ['\\doubler', 0x1D563], ['\\doubleR', 0x211D], ['\\doubles', 0x1D564], ['\\doubleS', 0x1D54A], ['\\doublet', 0x1D565], ['\\doubleT', 0x1D54B], ['\\doubleu', 0x1D566], ['\\doubleU', 0x1D54C], ['\\doublev', 0x1D567], ['\\doubleV', 0x1D54D], ['\\doublew', 0x1D568], ['\\doubleW', 0x1D54E], ['\\doublex', 0x1D569], ['\\doubleX', 0x1D54F], ['\\doubley', 0x1D56A], ['\\doubleY', 0x1D550], ['\\doublez', 0x1D56B], ['\\doubleZ', 0x2124], ['\\downarrow', 0x2193], ['\\Downarrow', 0x21D3], ['\\dsmash', 0x2B07], ['\\ee', 0x2147], ['\\ell', 0x2113], ['\\emptyset', 0x2205], ['\\emsp', 0x2003], ['\\end', 0x3017], ['\\ensp', 0x2002], ['\\epsilon', 0x03F5], ['\\Epsilon', 0x0395], ['\\eqarray', 0x2588], ['/\\equiv', 0x2262], ['\\equiv', 0x2261], ['\\eta', 0x03B7], ['\\Eta', 0x0397], ['/\\exists', 0x2204], ['\\exists', 0x2203], ['\\forall', 0x2200], ['\\fraktura', 0x1D51E], ['\\frakturA', 0x1D504], ['\\frakturb', 0x1D51F], ['\\frakturB', 0x1D505], ['\\frakturc', 0x1D520], ['\\frakturC', 0x212D], ['\\frakturd', 0x1D521], ['\\frakturD', 0x1D507], ['\\frakture', 0x1D522], ['\\frakturE', 0x1D508], ['\\frakturf', 0x1D523], ['\\frakturF', 0x1D509], ['\\frakturg', 0x1D524], ['\\frakturG', 0x1D50A], ['\\frakturh', 0x1D525], ['\\frakturH', 0x210C], ['\\frakturi', 0x1D526], ['\\frakturI', 0x2111], ['\\frakturj', 0x1D527], ['\\frakturJ', 0x1D50D], ['\\frakturk', 0x1D528], ['\\frakturK', 0x1D50E], ['\\frakturl', 0x1D529], ['\\frakturL', 0x1D50F], ['\\frakturm', 0x1D52A], ['\\frakturM', 0x1D510], ['\\frakturn', 0x1D52B], ['\\frakturN', 0x1D511], ['\\frakturo', 0x1D52C], ['\\frakturO', 0x1D512], ['\\frakturp', 0x1D52D], ['\\frakturP', 0x1D513], ['\\frakturq', 0x1D52E], ['\\frakturQ', 0x1D514], ['\\frakturr', 0x1D52F], ['\\frakturR', 0x211C], ['\\frakturs', 0x1D530], ['\\frakturS', 0x1D516], ['\\frakturt', 0x1D531], ['\\frakturT', 0x1D517], ['\\frakturu', 0x1D532], ['\\frakturU', 0x1D518], ['\\frakturv', 0x1D533], ['\\frakturV', 0x1D519], ['\\frakturw', 0x1D534], ['\\frakturW', 0x1D51A], ['\\frakturx', 0x1D535], ['\\frakturX', 0x1D51B], ['\\fraktury', 0x1D536], ['\\frakturY', 0x1D51C], ['\\frakturz', 0x1D537], ['\\frakturZ', 0x2128], ['\\frown', 0x2311], ['\\funcapply', 0x2061], ['\\G', 0x0393], ['\\gamma', 0x03B3], ['\\Gamma', 0x0393], ['/\\ge', 0x2271], ['\\ge', 0x2265], ['\\geq', 0x2265], ['\\gets', 0x2190], ['/\\gtrless', 0x2279], ['\\gtrless', 0x2277], ['\\gg', 0x226B], ['\\gimel', 0x2137], ['\\grave', 0x0300], ['\\hairsp', 0x200A], ['\\hat', 0x0302], ['\\hbar', 0x210F], ['\\heartsuit', 0x2661], ['\\hookleftarrow', 0x21A9], ['\\hookrightarrow', 0x21AA], ['\\hphantom', 0x2B04], ['\\hsmash', 0x2B0C], ['\\hvec', 0x20D1], ['\\identitymatrix', [0x0028, 0x25A0, 0x0028, 0x0031, 0x0026, 0x0030, 0x0026, 0x0030, 0x0040, 0x0030, 0x0026, 0x0031, 0x0026, 0x0030, 0x0040, 0x0030, 0x0026, 0x0030, 0x0026, 0x0031, 0x0029, 0x0029]], ['\\ii', 0x2148], ['\\iiint', 0x222D], ['\\iint', 0x222C], ['\\iiiint', 0x2A0C], ['\\Im', 0x2111], ['\\imath', 0x0131], ['/\\in', 0x2209], ['\\in', 0x2208], ['\\inc', 0x2206], ['\\infty', 0x221E], ['\\int', 0x222B], ['\\integral', [0x0031, 0x002F, 0x0032, 0x03C0, 0x0020, 0x222B, 0x005F, 0x0030, 0x005E, 0x0032, 0x03C0, 0x0020, 0x2592, 0x2146, 0x03B8, 0x002F, 0x0028, 0x0061, 0x002B, 0x0062, 0x0020, 0x0073, 0x0069, 0x006E, 0x0020, 0x03B8, 0x0029, 0x003D, 0x0031, 0x002F, 0x221A, 0x0028, 0x0061, 0x005E, 0x0032, 0x002D, 0x0062, 0x005E, 0x0032, 0x0029]], ['\\iota', 0x03B9], ['\\Iota', 0x0399], ['\\itimes', 0x2062], ['\\j', [0x004A, 0x0061, 0x0079]], ['\\jj', 0x2149], ['\\jmath', 0x0237], ['\\kappa', 0x03BA], ['\\Kappa', 0x039A], ['\\ket', 0x27E9], ['\\lambda', 0x03BB], ['\\Lambda', 0x039B], ['\\langle', 0x2329], ['\\lbbrack', 0x27E6], ['\\lbrace', 0x007B], ['\\lbrack', 0x005B], ['\\lceil', 0x2308], ['\\ldiv', 0x2215], ['\\ldivide', 0x2215], ['\\ldots', 0x2026], ['/\\le', 0x2270], ['\\le', 0x2264], ['\\left', 0x251C], ['\\leftarrow', 0x2190], ['\\Leftarrow', 0x21D0], ['\\leftharpoondown', 0x21BD], ['\\leftharpoonup', 0x21BC], ['\\leftrightarrow', 0x2194], ['\\Leftrightarrow', 0x21D4], ['\\leq', 0x2264], ['/\\lessgtr', 0x2278], ['\\lessgtr', 0x2276], ['\\lfloor', 0x230A], ['\\lhvec', 0x20D0], ['\\limit', [0x006C, 0x0069, 0x006D, 0x005F, 0x0028, 0x006E, 0x2192, 0x221E, 0x0029, 0x2061, 0x3016, 0x0028, 0x0031, 0x002B, 0x0031, 0x002F, 0x006E, 0x0029, 0x005E, 0x006E, 0x3017, 0x003D, 0x0065]], ['\\ll', 0x226A], ['\\lmoust', 0x23B0], ['\\Longleftarrow', 0x27F8], ['\\Longleftrightarrow', 0x27FA], ['\\Longrightarrow', 0x27F9], ['\\lrhar', 0x21CB], ['\\lvec', 0x20D6], ['\\mapsto', 0x21A6], ['\\matrix', 0x25A0], ['\\medsp', 0x205F], ['\\mid', 0x2223], ['\\middle', 0x24DC], ['\\models', 0x22A8], ['\\mp', 0x2213], ['\\mu', 0x03BC], ['\\Mu', 0x039C], ['\\nabla', 0x2207], ['\\naryand', 0x2592], ['\\nbsp', 0x00A0], ['\\ne', 0x2260], ['\\nearrow', 0x2197], ['\\neq', 0x2260], ['/\\ni', 0x220C], ['\\ni', 0x220B], ['\\norm', 0x2016], ['\\notcontain', 0x220C], ['\\notelement', 0x2209], ['\\notin', 0x2209], ['\\nu', 0x03BD], ['\\Nu', 0x039D], ['\\nwarrow', 0x2196], ['\\o', 0x03BF], ['\\O', 0x039F], ['\\odot', 0x2299], ['\\of', 0x2592], ['\\oiiint', 0x2230], ['\\oiint', 0x222F], ['\\oint', 0x222E], ['\\omega', 0x03C9], ['\\Omega', 0x03A9], ['\\ominus', 0x2296], ['\\open', 0x251C], ['\\oplus', 0x2295], ['\\otimes', 0x2297], ['\\over', 0x002F], ['\\overbar', 0x00AF], ['\\overbrace', 0x23DE], ['\\overbracket', 0x23B4], ['\\overline', 0x00AF], ['\\overparen', 0x23DC], ['\\overshell', 0x23E0], ['\\parallel', 0x2225], ['\\partial', 0x2202], ['\\pmatrix', 0x24A8], ['\\perp', 0x22A5], ['\\phantom', 0x27E1], ['\\phi', 0x03D5], ['\\Phi', 0x03A6], ['\\pi', 0x03C0], ['\\Pi', 0x03A0], ['\\pm', 0x00B1], ['\\pppprime', 0x2057], ['\\ppprime', 0x2034], ['\\pprime', 0x2033], ['/\\prec', 0x2280], ['\\prec', 0x227A], ['/\\preceq', 0x22E0], ['\\preceq', 0x227C], ['\\prime', 0x2032], ['\\prod', 0x220F], ['\\propto', 0x221D], ['\\psi', 0x03C8], ['\\Psi', 0x03A8], ['\\qdrt', 0x221C], ['\\quadratic', [0x0078, 0x003d, 0x0028, 0x002d, 0x0062, 0x00B1, 0x221A, 0x0028, 0x0062, 0x005e, 0x0032, 0x002d, 0x0034, 0x0061, 0x0063, 0x0029, 0x0029, 0x002f, 0x0032, 0x0061]], ['\\rangle', 0x232A], ['\\Rangle', 0x27EB], ['\\ratio', 0x2236], ['\\rbrace', 0x007D], ['\\rbrack', 0x005D], ['\\Rbrack', 0x27E7], ['\\rceil', 0x2309], ['\\rddots', 0x22F0], ['\\Re', 0x211C], ['\\rect', 0x25AD], ['\\rfloor', 0x230B], ['\\rho', 0x03C1], ['\\Rho', 0x03A1], ['\\rhvec', 0x20D1], ['\\right', 0x2524], ['\\rightarrow', 0x2192], ['\\Rightarrow', 0x21D2], ['\\rightharpoondown', 0x21C1], ['\\rightharpoonup', 0x21C0], ['\\rmoust', 0x23B1], ['\\root', 0x24AD], ['\\scripta', 0x1D4B6], ['\\scriptA', 0x1D49C], ['\\scriptb', 0x1D4B7], ['\\scriptB', 0x212C], ['\\scriptc', 0x1D4B8], ['\\scriptC', 0x1D49E], ['\\scriptd', 0x1D4B9], ['\\scriptD', 0x1D49F], ['\\scripte', 0x212F], ['\\scriptE', 0x2130], ['\\scriptf', 0x1D4BB], ['\\scriptF', 0x2131], ['\\scriptg', 0x210A], ['\\scriptG', 0x1D4A2], ['\\scripth', 0x1D4BD], ['\\scriptH', 0x210B], ['\\scripti', 0x1D4BE], ['\\scriptI', 0x2110], ['\\scriptj', 0x1D4BF], ['\\scriptJ', 0x1D4A5], ['\\scriptk', 0x1D4C0], ['\\scriptK', 0x1D4A6], ['\\scriptl', 0x2113], ['\\scriptL', 0x2112], ['\\scriptm', 0x1D4C2], ['\\scriptM', 0x2133], ['\\scriptn', 0x1D4C3], ['\\scriptN', 0x1D4A9], ['\\scripto', 0x2134], ['\\scriptO', 0x1D4AA], ['\\scriptp', 0x1D4C5], ['\\scriptP', 0x1D4AB], ['\\scriptq', 0x1D4C6], ['\\scriptQ', 0x1D4AC], ['\\scriptr', 0x1D4C7], ['\\scriptR', 0x211B], ['\\scripts', 0x1D4C8], ['\\scriptS', 0x1D4AE], ['\\scriptt', 0x1D4C9], ['\\scriptT', 0x1D4AF], ['\\scriptu', 0x1D4CA], ['\\scriptU', 0x1D4B0], ['\\scriptv', 0x1D4CB], ['\\scriptV', 0x1D4B1], ['\\scriptw', 0x1D4CC], ['\\scriptW', 0x1D4B2], ['\\scriptx', 0x1D4CD], ['\\scriptX', 0x1D4B3], ['\\scripty', 0x1D4CE], ['\\scriptY', 0x1D4B4], ['\\scriptz', 0x1D4CF], ['\\scriptZ', 0x1D4B5], ['\\sdiv', 0x2044], ['\\sdivide', 0x2044], ['\\searrow', 0x2198], ['\\setminus', 0x2216], ['\\sigma', 0x03C3], ['\\Sigma', 0x03A3], ['/\\sim', 0x2241], ['\\sim', 0x223C], ['/\\simeq', 0x2244], ['\\simeq', 0x2243], ['\\smash', 0x2B0D], ['\\smile', 0x2323], ['\\spadesuit', 0x2660], ['\\sqcap', 0x2293], ['\\sqcup', 0x2294], ['\\sqrt', 0x221A], ['/\\sqsubseteq', 0x22E2], ['\\sqsubseteq', 0x2291], ['/\\sqsuperseteq', 0x22E3], ['\\sqsuperseteq', 0x2292], ['/\\sqsupseteq', 0x22E3], ['\\sqsupseteq', 0x2292], ['\\star', 0x22C6], ['/\\subset', 0x2284], ['\\subset', 0x2282], ['/\\subseteq', 0x2288], ['\\subseteq', 0x2286], ['/\\succ', 0x2281], ['\\succ', 0x227B], ['/\\succeq', 0x22E1], ['\\succeq', 0x227D], ['\\sum', 0x2211], ['/\\supset', 0x2285], ['\\supset', 0x2283], ['/\\superset', 0x2285], ['\\superset', 0x2283], ['/\\superseteq', 0x2289], ['\\superseteq', 0x2287], ['/\\supseteq', 0x2289], ['\\supseteq', 0x2287], ['\\swarrow', 0x2199], ['\\tau', 0x03C4], ['\\Tau', 0x03A4], ['\\therefore', 0x2234], ['\\theta', 0x03B8], ['\\Theta', 0x0398], ['\\thicksp', 0x2005], ['\\thinsp', 0x2006], ['\\tilde', 0x0303], ['\\times', 0x00D7], ['\\to', 0x2192], ['\\top', 0x22A4], ['\\tvec', 0x20E1], ['\\ubar', 0x0332], ['\\Ubar', 0x0333], ['\\underbar', 0x2581], ['\\underbrace', 0x23DF], ['\\underbracket', 0x23B5], ['\\underline', 0x25B1], ['\\underparen', 0x23DD], ['\\uparrow', 0x2191], ['\\Uparrow', 0x21D1], ['\\updownarrow', 0x2195], ['\\Updownarrow', 0x21D5], ['\\uplus', 0x228E], ['\\upsilon', 0x03C5], ['\\Upsilon', 0x03A5], ['\\varepsilon', 0x03B5], ['\\varphi', 0x03C6], ['\\varpi', 0x03D6], ['\\varrho', 0x03F1], ['\\varsigma', 0x03C2], ['\\vartheta', 0x03D1], ['\\vbar', 0x2502], ['\\vdash', 0x22A2], ['\\vdots', 0x22EE], ['\\vec', 0x20D7], ['\\vee', 0x2228], ['\\vert', 0x007C], ['\\Vert', 0x2016], ['\\Vmatrix', 0x24A9], ['\\vphantom', 0x21F3], ['\\vthicksp', 0x2004], ['\\wedge', 0x2227], ['\\wp', 0x2118], ['\\wr', 0x2240], ['\\xi', 0x03BE], ['\\Xi', 0x039E], ['\\zeta', 0x03B6], ['\\Zeta', 0x0396], ['\\zwnj', 0x200C], ['\\zwsp', 0x200B] ]; var g_AutoCorrectMathSymbols = JSON.parse(JSON.stringify(g_DefaultAutoCorrectMathSymbolsList)); var g_AutoCorrectMathFuncs = JSON.parse(JSON.stringify(g_DefaultAutoCorrectMathFuncs)); var g_AutoCorrectMathsList = { DefaultAutoCorrectMathSymbolsList : g_DefaultAutoCorrectMathSymbolsList, AutoCorrectMathSymbols : g_AutoCorrectMathSymbols, DefaultAutoCorrectMathFuncs : g_DefaultAutoCorrectMathFuncs, AutoCorrectMathFuncs : g_AutoCorrectMathFuncs }; //--------------------------------------------------------export---------------------------------------------------- window['AscCommonWord'] = window['AscCommonWord'] || {}; window['AscCommonWord'].CMathContent = CMathContent; window['AscCommonWord'].g_AutoCorrectMathsList = g_AutoCorrectMathsList;