Commit 37c0541a authored by Sergey.Tsarkov's avatar Sergey.Tsarkov Committed by Alexander.Trofimov

автозамена в формулах

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@60978 954022d7-b5bf-4e40-9824-e11837661b57
parent 5f4e2bbc
......@@ -4288,29 +4288,31 @@ CMathContent.prototype.Process_AutoCorrect = function(ActionElement)
History.Create_NewPoint();
var bCursorStepRight = false;
// Смотрим возможно ли выполнить автозамену, если нет, тогда пробуем произвести автозамену пропуская последний символ
// Смотрим возможно ли выполнить автозамену, если нет, тогда пробуем произвести автозамену пропуская последний символ
var CanMakeAutoCorrect = this.private_CanAutoCorrectText(AutoCorrectEngine, false);
if (false === CanMakeAutoCorrect)
{
// Пробуем произвести автозамену без последнего добавленного символа
if (0x20 === ActionElement.value)
CanMakeAutoCorrect = this.private_CanAutoCorrectText(AutoCorrectEngine, true);
else
{
AutoCorrectEngine.Elements.splice(AutoCorrectEngine.Elements.length - 1, 1);
CanMakeAutoCorrect = this.private_CanAutoCorrectText(AutoCorrectEngine, false);
bCursorStepRight = true;
}
// Пробуем произвести автозамену без последнего добавленного символа
if (0x20 === ActionElement.value)
CanMakeAutoCorrect = this.private_CanAutoCorrectText(AutoCorrectEngine, true);
else
{
AutoCorrectEngine.Elements.splice(AutoCorrectEngine.Elements.length - 1, 1);
CanMakeAutoCorrect = this.private_CanAutoCorrectText(AutoCorrectEngine, false);
bCursorStepRight = true;
}
}
// Пробуем сделать формульную автозамену
if (false === CanMakeAutoCorrect)
{
CanMakeAutoCorrect = this.private_CanAutoCorrectEquation(AutoCorrectEngine);
var CanMakeAutoCorrectEquation = false;
//if (CanMakeAutoCorrect || (0x28 != ActionElement.value && 0x29 != ActionElement.value && 0x5E!= ActionElement.value && 0x5F!= ActionElement.value && 0x5C!= ActionElement.value /*&& 0x2B!= ActionElement.value*/))
// CanMakeAutoCorrectEquation = this.private_CanAutoCorrectEquation(AutoCorrectEngine, CanMakeAutoCorrect, bCursorStepRight);
}
if (true === CanMakeAutoCorrect)
if (true === CanMakeAutoCorrect || true === CanMakeAutoCorrectEquation)
{
var ElementsCount = AutoCorrectEngine.Elements.length;
var LastElement = null;
......@@ -4371,6 +4373,19 @@ CMathContent.prototype.private_NeedAutoCorrect = function(ActionElement)
return false;
};
CMathContent.prototype.private_CanAutoCorrect = function(AutoCorrectionEngine, bSkipLast)
{
var CanMakeAutoCorrect = false;
var ActionElement = AutoCorrectionEngine.Element;
var ElementsCount = AutoCorrectionEngine.Elements.length;
for (var i=ElementsCount-1; i>=0; i--)
{
}
};
CMathContent.prototype.private_CanAutoCorrectText = function(AutoCorrectionEngine, bSkipLast)
{
var IndexAdd = (true === bSkipLast ? 1 : 0);
......@@ -4436,6 +4451,7 @@ CMathContent.prototype.private_CanAutoCorrectText = function(AutoCorrectionEngin
MathRun.Add(ReplaceText, true);
}
AutoCorrectionEngine.Type = this.CorrectTextToEquation(ReplaceText);
AutoCorrectionEngine.RemoveCount = RemoveCount;
AutoCorrectionEngine.ReplaceContent.push(MathRun);
......@@ -4444,10 +4460,25 @@ CMathContent.prototype.private_CanAutoCorrectText = function(AutoCorrectionEngin
return Result;
};
CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionEngine)
CMathContent.prototype.CorrectTextToEquation = function(Text)
{
var ElementsCount = AutoCorrectionEngine.Elements.length;
var Type = null;
switch (Text.value)
{
case 0x25A0: Type = MATH_MATRIX;
case 0x25AD: Type = MATH_BORDER_BOX;
case 0x27E1: Type = MATH_PHANTOM;
case 0x25A1: Type = MATH_BOX;
case 0x033F: Type = MATH_BAR;
}
return Type;
};
CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionEngine, CanMakeAutoCorrect, bCursorStepRight)
{
var ElementsCount = AutoCorrectionEngine.Elements.length;
if (CanMakeAutoCorrect)
ElementsCount = ElementsCount - AutoCorrectionEngine.RemoveCount;
if (ElementsCount < 2)
return false;
......@@ -4456,18 +4487,161 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
// Пробел в начале пропускаем
var Element = AutoCorrectionEngine.Elements[CurPos];
var bOpenBrk = false;
var bCloseBrk = false;
var Type = null;
var oCurElem = AutoCorrectionEngine.Elements[ElementsCount];
var BrAccount = new CMathBracketAcc();
if (' ' === Element.Text)
CurPos--;
{
//проверка открытых и закрытых скобок
for (var i=ElementsCount-1; i>=0; i--)
{
oCurElem = AutoCorrectionEngine.Elements[i];
if (')' === oCurElem.Text )
{
BrAccount.Counter++;
//if (!bCloseBrk)
//{
bCloseBrk = true;
BrAccount.RPos = i;
//}
}
if ('(' === oCurElem.Text && !bCloseBrk)
return;
else if ('(' === oCurElem.Text && bCloseBrk)
{
BrAccount.Counter--;
bOpenBrk = true;
BrAccount.LPos = i;
}
else if (oCurElem.Text)
{
switch(oCurElem.Text.charCodeAt(0))
{
case 0x25A0: AutoCorrectionEngine.Type = MATH_MATRIX;break;
case 0x25AD: AutoCorrectionEngine.Type = MATH_BORDER_BOX;break;
case 0x27E1: AutoCorrectionEngine.Type = MATH_PHANTOM;break;
case 0x25A1: AutoCorrectionEngine.Type = MATH_BOX;break;
case 0x033F: AutoCorrectionEngine.Type = MATH_BAR;break;
case 0x221A: AutoCorrectionEngine.Type = MATH_RADICAL;break;
case 0x2211: AutoCorrectionEngine.Type = MATH_NARY;break;
}
if (AutoCorrectionEngine.Type)
break;
}
}
//если это пробел не в скобках оставляем его
if (!bOpenBrk || (bOpenBrk && bCloseBrk))
CurPos--;
}
if ( AutoCorrectionEngine.Type == MATH_MATRIX && bOpenBrk && bCloseBrk && BrAccount.Counter == 0)
{
var arrContent = [];
var col = 0;
var row = 0;
var nContent = 0;
var mcs = [];
arrContent[row] = [];
arrContent[row][col] = "";
mcs[0] = {count: 1, mcJc: 0};
for (var i=BrAccount.LPos+1; i<BrAccount.RPos; i++)
{
oCurElem = AutoCorrectionEngine.Elements[i];
if ( '&' === oCurElem.Text || '@' === oCurElem.Text)
{
nContent = 0;
if ('&' === oCurElem.Text)
{
col++;
if (col+1 > mcs[0].count)
mcs[0] = {count: col+1, mcJc: 0};
arrContent[row][col] = "";
}
else if ('@' === oCurElem.Text)
{
row++;
col = 0;
//mcs[row] = {count: 1, mcJc: 0};
arrContent[row] = [];
arrContent[row][col] = "";
}
}
else
{
var Element;
if (oCurElem.Text)
Element = oCurElem.Text;
else
Element = oCurElem.Element;
arrContent[row][col] = arrContent[row][col] + oCurElem.Text;
nContent++;
}
}
var props = new CMathMatrixPr();
props.row = row+1;
props.mcs = mcs;
props.ctrPrp = AutoCorrectionEngine.TextPr.Copy();
var Matrix = new CMathMatrix(props);
for (var i=0; i<arrContent.length; i++)
for (var j=0; j<arrContent[i].length; j++)
{
var Elem = Matrix.getElement(i,j);
var MathRun = new ParaRun(this.ParaMath.Paragraph, true);
MathRun.Set_Pr(AutoCorrectionEngine.TextPr.Copy());
MathRun.Set_MathPr(AutoCorrectionEngine.MathPr.Copy());
var MathText = new CMathText();
var text = arrContent[i][j];
for(var l=0; l<text.length; l++)
{
MathText.add(text[l].charCodeAt(0));
MathRun.Add_ToContent(l, MathText);
}
Elem.Internal_Content_Add(0, MathRun);
}
AutoCorrectionEngine.RemoveCount = BrAccount.RPos - BrAccount.LPos + 2 + 1;
AutoCorrectionEngine.ReplaceContent.push(Matrix);
return true;
}
//var AutoCorrectEngineEq = new CMathAutoCorrectEngine(AutoCorrectionEngine.ActionElement);
//if (bOpenBrk && bCloseBrk)
// AutoCorrectEngineEq.Type = MATH_DELIMITER;
bOpenBrk = false;
bCloseBrk = false;
while (CurPos >= 0)
{
var Element = AutoCorrectionEngine.Elements[CurPos];
if (undefined === Element.Text)
TempElements.splice(0, 0, Element);
else if ('(' === Element.Text)
{
if (!bCloseBrk)
return false;
if (bOpenBrk)
break;
TempElements.splice(0, 0, Element);
bOpenBrk = true;
}
else if (')' === Element.Text)
{
TempElements.splice(0, 0, Element);
bCloseBrk = true;
}
else if ('/' === Element.Text)
{
AutoCorrectionEngine.Type = MATH_FRACTION;
......@@ -4490,14 +4664,18 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
CurPos--;
break;
}
else if (g_aMathAutoCorrectTriggerCharCodes[Element.Text.charCodeAt(0)])
else if (g_aMathAutoCorrectTriggerCharCodes[Element.Text.charCodeAt(0)] && bOpenBrk && bCloseBrk)
return false;
else if (q_aMathAutoCorrectControlCharCodes[Element.Text.charCodeAt(0)])
break;
else
TempElements.splice(0, 0, Element);
CurPos--;
}
bOpenBrk = false;
bCloseBrk = false;
var TempElements2 = [];
while (CurPos >= 0)
{
......@@ -4505,9 +4683,19 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
if (undefined === Element.Text)
TempElements2.splice(0, 0, Element);
else if ('(' === Element.Text)
{
if (!bCloseBrk)
break;//return false;
if (bOpenBrk)
break;
TempElements2.splice(0, 0, Element);
bOpenBrk = true;
}
else if (')' === Element.Text)
{
TempElements2.splice(0, 0, Element);
bCloseBrk = true;
}
else if ('_' === Element.Text)
{
if (TempElements2.length == 0)
......@@ -4529,7 +4717,26 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
CurPos--;
break;
}
else if (g_aMathAutoCorrectTriggerCharCodes[Element.Text.charCodeAt(0)])
/*else if ( 0x25AD === Element.Text.charCodeAt(0) ) //borderbox
{
AutoCorrectionEngine.Type = MATH_BORDER_BOX;
CurPos--;
break;
}
else if ( 0x25A1 === Element.Text.charCodeAt(0) ) //box
{
AutoCorrectionEngine.Type = MATH_BOX;
CurPos--;
break;
}*/
else if (q_aMathAutoCorrectControlAggregationCodes[Element.Text.charCodeAt(0)]) //sum
{
AutoCorrectionEngine.chr = Element.Text;
AutoCorrectionEngine.Type = MATH_NARY;
CurPos--;
break;
}
else if (g_aMathAutoCorrectTriggerCharCodes[Element.Text.charCodeAt(0)] && bOpenBrk && bCloseBrk)
break;
else
TempElements2.splice(0, 0, Element);
......@@ -4540,13 +4747,34 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
var TempElements3 = [];
if (AutoCorrectionEngine.Type == MATH_DEGREESubSup)
{
while (CurPos >= 0)
while (CurPos >= 0)
{
var Element = AutoCorrectionEngine.Elements[CurPos];
if (undefined === Element.Text)
TempElements3.splice(0, 0, Element);
else if ('(' === Element.Text)
{
if (!bCloseBrk)
return false;
if (bOpenBrk)
break;
TempElements3.splice(0, 0, Element);
bOpenBrk = true;
}
else if (')' === Element.Text)
{
TempElements3.splice(0, 0, Element);
bCloseBrk = true;
}
else if (g_aMathAutoCorrectTriggerCharCodes[Element.Text.charCodeAt(0)])
break;
else if (q_aMathAutoCorrectControlAggregationCodes[Element.Text.charCodeAt(0)]) //sum
{
AutoCorrectionEngine.chr = Element.Text;
AutoCorrectionEngine.Type = MATH_NARY;
CurPos--;
break;
}
else
TempElements3.splice(0, 0, Element);
......@@ -4556,6 +4784,7 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
if (AutoCorrectionEngine.Type == MATH_FRACTION)
{
if (TempElements2.length > 0)
{
var props = new CMathFractionPr();
......@@ -4569,15 +4798,18 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
this.PackTextToContent(NumMathContent, TempElements, AutoCorrectionEngine);
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.push(Fraction);
AutoCorrectionEngine.ReplaceContent.unshift(Fraction);
return true;
}
}
else if (AutoCorrectionEngine.Type == MATH_DEGREE)
{
//if (TempElements2.length > 0)
//{
if (TempElements2.length > 0)
{
//this.ReplaceAutoCorrect(AutoCorrectionEngine, bCursorStepRight);
var props = new CMathDegreePr();
props.ctrPrp = AutoCorrectionEngine.TextPr.Copy();
props.type = AutoCorrectionEngine.Kind;
......@@ -4589,11 +4821,14 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
this.PackTextToContent(BaseContent, TempElements2, AutoCorrectionEngine);
this.PackTextToContent(IterContent, TempElements, AutoCorrectionEngine);
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.push(oDegree);
if (CanMakeAutoCorrect)
AutoCorrectionEngine.RemoveCount += ElementsCount - CurPos - 1;
else
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.unshift(oDegree);
return true;
//}
}
}
else if (AutoCorrectionEngine.Type == MATH_DEGREESubSup)
{
......@@ -4622,18 +4857,90 @@ CMathContent.prototype.private_CanAutoCorrectEquation = function(AutoCorrectionE
this.PackTextToContent(BaseContent, TempElements3, AutoCorrectionEngine);
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.push(oDegree);
AutoCorrectionEngine.ReplaceContent.unshift(oDegree);
return true;
}
}
else if (AutoCorrectionEngine.Type == MATH_RADICAL)
{
var props = new CMathRadicalPr();
props.degHide = 1;
props.ctrPrp = AutoCorrectionEngine.TextPr.Copy();
var Radical = new CRadical(props);
var Base = Radical.getBase();
var Degree = Radical.getDegree();
this.PackTextToContent(Base, TempElements, AutoCorrectionEngine);
//this.PackTextToContent(NumMathContent, TempElements, AutoCorrectionEngine);
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.unshift(Radical);
return true;
}
else if (AutoCorrectionEngine.Type == MATH_BORDER_BOX)
{
var props = {};
props.ctrPrp = AutoCorrectionEngine.TextPr.Copy();
var BorderBox = new CBorderBox(props);
var Base = BorderBox.getBase();
this.PackTextToContent(Base, TempElements, AutoCorrectionEngine);
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.unshift(BorderBox);
return true;
}
else if (AutoCorrectionEngine.Type == MATH_BOX)
{
var props = {};
props.ctrPrp = AutoCorrectionEngine.TextPr.Copy();
var Box = new CBox(props);
var Base = Box.getBase();
this.PackTextToContent(Base, TempElements, AutoCorrectionEngine);
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.unshift(Box);
return true;
}
else if (AutoCorrectionEngine.Type == MATH_NARY)
{
var props = {};
props.ctrPrp = AutoCorrectionEngine.TextPr.Copy();
props.chr = AutoCorrectionEngine.chr.charCodeAt(0);
var oNary = new CNary(props);
var oSub = oNary.getLowerIterator();
var oSup = oNary.getUpperIterator();
var oBase = oNary.getBase();
if (TempElements.Type == DEGREE_SUPERSCRIPT)
{
this.PackTextToContent(oSub, TempElements2, AutoCorrectionEngine);
this.PackTextToContent(oSup, TempElements, AutoCorrectionEngine);
}
else if (TempElements.Type == DEGREE_SUBSCRIPT)
{
this.PackTextToContent(oSub, TempElements, AutoCorrectionEngine);
this.PackTextToContent(oSup, TempElements2, AutoCorrectionEngine);
}
AutoCorrectionEngine.RemoveCount = ElementsCount - CurPos - 1;
AutoCorrectionEngine.ReplaceContent.unshift(oNary);
return true;
}
return false;
};
CMathContent.prototype.PackTextToContent = function(Element, TempElements, AutoCorrectionEngine)
{
var len = TempElements.length;
if (len > 1)
if (len > 1 && TempElements[0].Text)
if (TempElements[0].Text === '(' && TempElements[len-1].Text === ')')
{
TempElements.splice(len-1,1);
......@@ -4659,7 +4966,60 @@ CMathContent.prototype.PackTextToContent = function(Element, TempElements, AutoC
}
}
};
CMathContent.prototype.ReplaceAutoCorrect = function(AutoCorrectEngine, bCursorStepRight)
{
var ElementsCount = AutoCorrectEngine.Elements.length;
var LastElement = null;
var FirstElement = AutoCorrectEngine.Elements[ElementsCount - 1];
var FirstElementPos = FirstElement.ElementPos;
FirstElement.Pos++;
for (var nPos = 0, nCount = AutoCorrectEngine.RemoveCount; nPos < nCount; nPos++)
{
LastElement = AutoCorrectEngine.Elements[ElementsCount - nPos - 1];
if (undefined !== LastElement.Run)
{
if (FirstElement.Run === LastElement.Run)
FirstElement.Pos--;
LastElement.Run.Remove_FromContent(LastElement.Pos, 1);
}
else
{
this.Remove_FromContent(LastElement.ElementPos, 1);
FirstElementPos--;
}
}
var NewRun = FirstElement.Run.Split2(FirstElement.Pos);
this.Internal_Content_Add(FirstElementPos + 1, NewRun, false);
var NewElementsCount = AutoCorrectEngine.ReplaceContent.length;
for (var nPos = 0; nPos < NewElementsCount; nPos++)
{
this.Internal_Content_Add(nPos + FirstElementPos + 1, AutoCorrectEngine.ReplaceContent[nPos], false);
}
this.CurPos = FirstElementPos + NewElementsCount + 1;
this.Content[this.CurPos].Cursor_MoveToStartPos();
if (true === bCursorStepRight)
{
// TODO: Переделать через функцию в ране
if (this.Content[this.CurPos].Content.length >= 1)
this.Content[this.CurPos].State.ContentPos = 1;
}
};
function CMathBracketAcc()
{
this.LBracket = false;
this.RBracket = false;
this.Counter = 0;
this.LPos = -1;
this.RPos = -1;
}
function CMathAutoCorrectEngine(Element)
{
this.ActionElement = Element; // Элемент на которотом срабатывает автодополнение
......@@ -4911,6 +5271,7 @@ var g_aAutoCorrectMathSymbols =
['\\ii', 0x2148],
['\\iiint', 0x222D],
['\\iint', 0x222C],
['\\iiiint', 0x2A0C],
['\\Im', 0x2111],
['\\in', 0x2208],
['\\inc', 0x2206],
......@@ -5149,7 +5510,17 @@ var g_aAutoCorrectMathSymbols =
['>=', 0x2265],
['>>', 0x226B]
];
var q_aMathAutoCorrectControlCharCodes =
{
0x221A : 1, 0x25AD : 1, 0x25A1 : 1
};
var q_aMathAutoCorrectControlAggregationCodes =
{
0x2211 : 1, 0x220F : 1, 0x2210 : 1, 0x22C0 : 1, 0x2233 : 1,
0x22C1 : 1, 0x22C3 : 1, 0x2A06 : 1, 0x2A04 : 1, 0x2A00 : 1,
0x2A01 : 1, 0x2A02 : 1, 0x222B : 1, 0x222C : 1, 0x222D : 1,
0x2A0C : 1, 0x222E : 1, 0x222F : 1, 0x2230 : 1, 0x2232 : 1
};
var g_aMathAutoCorrectTriggerCharCodes =
{
0x20 : 1, 0x21 : 1, 0x22 : 1, 0x23 : 1, 0x24 : 1, 0x25 : 1, 0x26 : 1,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment