Added frac command. Sould solve tdf#137234.
Change-Id: I78dcd06a30b93c441dd5983711603f184d20c63b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105255
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/starmath/inc/parse.hxx b/starmath/inc/parse.hxx
index 4f1e302..e62f855 100644
--- a/starmath/inc/parse.hxx
+++ b/starmath/inc/parse.hxx
@@ -116,6 +116,7 @@ class SmParser
std::unique_ptr<SmBracebodyNode> DoBracebody(bool bIsLeftRight);
std::unique_ptr<SmTextNode> DoFunction();
std::unique_ptr<SmTableNode> DoBinom();
std::unique_ptr<SmBinVerNode> DoFrac();
std::unique_ptr<SmStructureNode> DoStack();
std::unique_ptr<SmStructureNode> DoMatrix();
std::unique_ptr<SmSpecialNode> DoSpecial();
diff --git a/starmath/inc/strings.hrc b/starmath/inc/strings.hrc
index 7cd2c73..b9377ef 100644
--- a/starmath/inc/strings.hrc
+++ b/starmath/inc/strings.hrc
@@ -35,6 +35,7 @@
#define RID_XSYMDIVIDEY_HELP NC_("RID_XSYMDIVIDEY_HELP", "Division (Slash)" )
#define RID_XDIVY_HELP NC_("RID_XDIVY_HELP", "Division (÷)" )
#define RID_XOVERY_HELP NC_("RID_XOVERY_HELP", "Division (Fraction)" )
#define RID_FRACXY_HELP NC_("RID_FRACXY_HELP", "Fraction" )
#define RID_XODIVIDEY_HELP NC_("RID_XODIVIDEY_HELP", "Circled Slash" )
#define RID_XODOTY_HELP NC_("RID_XODOTY_HELP", "Circled Dot" )
#define RID_XOMINUSY_HELP NC_("RID_XOMINUSY_HELP", "Circled Minus" )
diff --git a/starmath/inc/strings.hxx b/starmath/inc/strings.hxx
index 17de135..c38419b 100644
--- a/starmath/inc/strings.hxx
+++ b/starmath/inc/strings.hxx
@@ -25,6 +25,7 @@
#define RID_XSYMDIVIDEY "<?> / <?> "
#define RID_XDIVY "<?> div <?> "
#define RID_XOVERY "{<?>} over {<?>} "
#define RID_FRACXY "frac {<?>} {<?>} "
#define RID_XODIVIDEY "<?> odivide <?> "
#define RID_XODOTY "<?> odot <?> "
#define RID_XOMINUSY "<?> ominus <?> "
diff --git a/starmath/inc/token.hxx b/starmath/inc/token.hxx
index f17d527..4153b91 100644
--- a/starmath/inc/token.hxx
+++ b/starmath/inc/token.hxx
@@ -56,7 +56,7 @@ enum SmTokenType
TEND, TSPECIAL, TNONE, TESCAPE, TUNKNOWN,
TBLANK, TSBLANK, TPLACE, TNOSPACE, TDOTSDOWN,
TNEWLINE, TDOTSAXIS, TDOTSLOW, TDOTSVERT, TBACKEPSILON,
TDOTSDIAG, TDOTSUP,
TDOTSDIAG, TDOTSUP, TFRAC,
// Basic
TPLUS, TMINUS, TMULTIPLY, TDIVIDEBY, // +-*/
TGT, TLT, TGE, TLE, // > < >= <=
diff --git a/starmath/qa/extras/mmlimport-test.cxx b/starmath/qa/extras/mmlimport-test.cxx
index 279dbd5..4b20478 100644
--- a/starmath/qa/extras/mmlimport-test.cxx
+++ b/starmath/qa/extras/mmlimport-test.cxx
@@ -148,14 +148,14 @@ void Test::testtdf99556()
void Test::testTdf103430()
{
loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/tdf103430.mml"));
CPPUNIT_ASSERT_EQUAL(OUString("{ { nitalic d ^ 2 nitalic color blue y } over { nitalic d font sans bold italic color red x } }"),
CPPUNIT_ASSERT_EQUAL(OUString("frac { { nitalic d ^ 2 nitalic color blue y } } { { nitalic d font sans bold italic color red x } }"),
mxDocShell->GetText());
}
void Test::testTdf103500()
{
loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/tdf103500.mml"));
CPPUNIT_ASSERT_EQUAL(OUString("{ { int csup b csub a { { 1 over x } ` nitalic d x } } = { intd csup b csub a { { 1 over y } ` nitalic d y } } }"),
CPPUNIT_ASSERT_EQUAL(OUString("{ { int csup b csub a { frac { 1 } { x } ` nitalic d x } } = { intd csup b csub a { frac { 1 } { y } ` nitalic d y } } }"),
mxDocShell->GetText());
}
diff --git a/starmath/source/ElementsDockingWindow.cxx b/starmath/source/ElementsDockingWindow.cxx
index 1e2f295..8850ca4 100644
--- a/starmath/source/ElementsDockingWindow.cxx
+++ b/starmath/source/ElementsDockingWindow.cxx
@@ -63,6 +63,7 @@ const SmElementDescr SmElementsControl::m_aUnaryBinaryOperatorsList[] =
{RID_XPLUSY, RID_XPLUSY_HELP}, {RID_XMINUSY, RID_XMINUSY_HELP},
{RID_XCDOTY, RID_XCDOTY_HELP}, {RID_XTIMESY, RID_XTIMESY_HELP},
{RID_XSYMTIMESY, RID_XSYMTIMESY_HELP}, {RID_XOVERY, RID_XOVERY_HELP},
{RID_FRACXY, RID_FRACXY_HELP},
{RID_XDIVY, RID_XDIVY_HELP}, {RID_XSYMDIVIDEY, RID_XSYMDIVIDEY_HELP},
{RID_XOPLUSY, RID_XOPLUSY_HELP}, {RID_XOMINUSY, RID_XOMINUSY_HELP},
{RID_XODOTY, RID_XODOTY_HELP}, {RID_XOTIMESY, RID_XOTIMESY_HELP},
diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx
index 6700afa..db56d3c 100644
--- a/starmath/source/mathmlimport.cxx
+++ b/starmath/source/mathmlimport.cxx
@@ -2084,7 +2084,7 @@ void SmXMLFracContext_Impl::endFastElement(sal_Int32 )
SmToken aToken;
aToken.cMathChar = '\0';
aToken.eType = TOVER;
aToken.eType = TFRAC;
std::unique_ptr<SmStructureNode> pSNode(new SmBinVerNode(aToken));
std::unique_ptr<SmNode> pOper(new SmRectangleNode(aToken));
std::unique_ptr<SmNode> pSecond = popOrZero(rNodeStack);
diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx
index 13898f6..598ec12 100644
--- a/starmath/source/parse.cxx
+++ b/starmath/source/parse.cxx
@@ -130,6 +130,7 @@ const SmTokenTableEntry aTokenTable[] =
{ "font", TFONT, '\0', TG::FontAttr, 5},
{ "forall", TFORALL, MS_FORALL, TG::Standalone, 5},
{ "fourier", TFOURIER, MS_FOURIER, TG::Standalone, 5},
{ "frac", TFRAC, '\0', TG::NONE, 0},
{ "from", TFROM, '\0', TG::Limit, 0},
{ "func", TFUNC, '\0', TG::Function, 5},
{ "ge", TGE, MS_GE, TG::Relation, 0},
@@ -1745,6 +1746,9 @@ std::unique_ptr<SmNode> SmParser::DoTerm(bool bGroupNumberIdent)
case TBINOM:
return DoBinom();
case TFRAC:
return DoFrac();
case TSTACK:
return DoStack();
@@ -2403,6 +2407,22 @@ std::unique_ptr<SmTableNode> SmParser::DoBinom()
return xSNode;
}
std::unique_ptr<SmBinVerNode> SmParser::DoFrac()
{
DepthProtect aDepthGuard(m_nParseDepth);
if (aDepthGuard.TooDeep()) throw std::range_error("parser depth limit");
std::unique_ptr<SmBinVerNode> xSNode = std::make_unique<SmBinVerNode>(m_aCurToken);
std::unique_ptr<SmNode> xOper = std::make_unique<SmRectangleNode>(m_aCurToken);
NextToken();
auto xFirst = DoSum();
auto xSecond = DoSum();
xSNode->SetSubNodes(std::move(xFirst), std::move(xOper), std::move(xSecond));
return xSNode;
}
std::unique_ptr<SmStructureNode> SmParser::DoStack()
{
DepthProtect aDepthGuard(m_nParseDepth);
diff --git a/starmath/source/visitors.cxx b/starmath/source/visitors.cxx
index f6e030b..9b8ac0d 100644
--- a/starmath/source/visitors.cxx
+++ b/starmath/source/visitors.cxx
@@ -2280,13 +2280,23 @@ void SmNodeToTextVisitor::Visit( SmBinHorNode* pNode )
void SmNodeToTextVisitor::Visit( SmBinVerNode* pNode )
{
SmNode *pNum = pNode->GetSubNode( 0 ),
*pDenom = pNode->GetSubNode( 2 );
Append( "{ " );
LineToText( pNum );
Append( "over" );
LineToText( pDenom );
Append( "} " );
if( pNode->GetToken().eType == TOVER ){
SmNode *pNum = pNode->GetSubNode( 0 ),
*pDenom = pNode->GetSubNode( 2 );
Append( "{ " );
LineToText( pNum );
Append( "over" );
LineToText( pDenom );
Append( "} " );
} else{
SmNode *pNum = pNode->GetSubNode( 0 ),
*pDenom = pNode->GetSubNode( 2 );
Append( "frac {" );
LineToText( pNum );
Append( "} {" );
LineToText( pDenom );
Append( "}" );
}
}
void SmNodeToTextVisitor::Visit( SmBinDiagonalNode* pNode )