summaryrefslogtreecommitdiff
path: root/starmath/source/mathmlimport.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'starmath/source/mathmlimport.cxx')
-rw-r--r--starmath/source/mathmlimport.cxx61
1 files changed, 53 insertions, 8 deletions
diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx
index db56d3ced2da..587ba3ca6458 100644
--- a/starmath/source/mathmlimport.cxx
+++ b/starmath/source/mathmlimport.cxx
@@ -72,6 +72,7 @@ one go*/
#include <unomodel.hxx>
#include <utility.hxx>
#include <visitors.hxx>
+#include <starmathdatabase.hxx>
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
@@ -1043,11 +1044,13 @@ class SmXMLFencedContext_Impl : public SmXMLRowContext_Impl
protected:
sal_Unicode cBegin;
sal_Unicode cEnd;
+ bool bIsStretchy;
public:
SmXMLFencedContext_Impl(SmXMLImport &rImport)
- : SmXMLRowContext_Impl(rImport),
- cBegin('('), cEnd(')') {}
+ : SmXMLRowContext_Impl(rImport)
+ , cBegin('('), cEnd(')')
+ , bIsStretchy(false) {}
void SAL_CALL startFastElement(sal_Int32 nElement, const uno::Reference< xml::sax::XFastAttributeList > & xAttrList ) override;
void SAL_CALL endFastElement(sal_Int32 nElement) override;
@@ -1070,6 +1073,9 @@ void SmXMLFencedContext_Impl::startFastElement(sal_Int32 /*nElement*/, const uno
case XML_CLOSE:
cEnd = sValue[0];
break;
+ case XML_STRETCHY:
+ bIsStretchy = sValue == GetXMLToken(XML_TRUE);
+ break;
default:
XMLOFF_WARN_UNKNOWN("starmath", aIter);
/*Go to superclass*/
@@ -1086,18 +1092,18 @@ void SmXMLFencedContext_Impl::endFastElement(sal_Int32 /*nElement*/)
aToken.aText = ",";
aToken.nLevel = 5;
- aToken.eType = TLPARENT;
- aToken.cMathChar = cBegin;
std::unique_ptr<SmStructureNode> pSNode(new SmBraceNode(aToken));
+ if( bIsStretchy ) aToken = starmathdatabase::Identify_PrefixPostfix_SmXMLOperatorContext_Impl( cBegin );
+ else aToken = starmathdatabase::Identify_Prefix_SmXMLOperatorContext_Impl( cBegin );
+ if( aToken.eType == TERROR ) aToken = SmToken( TLPARENT, MS_LPARENT, "(", TG::LBrace, 5 );
std::unique_ptr<SmNode> pLeft(new SmMathSymbolNode(aToken));
-
- aToken.cMathChar = cEnd;
- aToken.eType = TRPARENT;
+ if( bIsStretchy ) aToken = starmathdatabase::Identify_PrefixPostfix_SmXMLOperatorContext_Impl( cEnd );
+ else aToken = starmathdatabase::Identify_Postfix_SmXMLOperatorContext_Impl( cEnd );
+ if( aToken.eType == TERROR ) aToken = SmToken( TRPARENT, MS_RPARENT, ")", TG::LBrace, 5 );
std::unique_ptr<SmNode> pRight(new SmMathSymbolNode(aToken));
SmNodeArray aRelationArray;
SmNodeStack &rNodeStack = GetSmImport().GetNodeStack();
-
aToken.cMathChar = '\0';
aToken.eType = TIDENT;
@@ -1120,6 +1126,8 @@ void SmXMLFencedContext_Impl::endFastElement(sal_Int32 /*nElement*/)
pSNode->SetSubNodes(std::move(pLeft), std::move(pBody), std::move(pRight));
+ // mfenced is always scalable. Stretchy keyword is not official, but in case of been in there
+ // can be used as a hint.
pSNode->SetScaleMode(SmScaleMode::Height);
GetSmImport().GetNodeStack().push_front(std::move(pSNode));
}
@@ -1375,6 +1383,10 @@ class SmXMLOperatorContext_Impl : public SmXMLImportContext
{
SmXMLTokenAttrHelper maTokenAttrHelper;
bool bIsStretchy;
+ bool bIsFenced;
+ bool isPrefix;
+ bool isInfix;
+ bool isPostfix;
SmToken aToken;
public:
@@ -1382,6 +1394,10 @@ public:
: SmXMLImportContext(rImport)
, maTokenAttrHelper(*this)
, bIsStretchy(false)
+ , bIsFenced(false)
+ , isPrefix(false)
+ , isInfix(false)
+ , isPostfix(false)
{
aToken.eType = TSPECIAL;
aToken.nLevel = 5;
@@ -1397,6 +1413,25 @@ public:
void SmXMLOperatorContext_Impl::TCharacters(const OUString &rChars)
{
aToken.cMathChar = rChars[0];
+ SmToken bToken;
+ if( bIsFenced ){
+ if( bIsStretchy )
+ {
+ if( isPrefix ) bToken = starmathdatabase::Identify_Prefix_SmXMLOperatorContext_Impl( aToken.cMathChar );
+ else if( isInfix ) bToken = SmToken( TMLINE, MS_VERTLINE, "mline", TG::NONE, 0 );
+ else if( isPostfix ) bToken = starmathdatabase::Identify_Postfix_SmXMLOperatorContext_Impl( aToken.cMathChar );
+ else bToken = starmathdatabase::Identify_PrefixPostfix_SmXMLOperatorContext_Impl( aToken.cMathChar );
+ }
+ else
+ {
+ if( isPrefix ) bToken = starmathdatabase::Identify_Prefix_SmXMLOperatorContext_Impl( aToken.cMathChar );
+ else if( isInfix ) bToken = SmToken( TMLINE, MS_VERTLINE, "mline", TG::NONE, 0 );
+ else if( isPostfix ) bToken = starmathdatabase::Identify_Postfix_SmXMLOperatorContext_Impl( aToken.cMathChar );
+ else bToken = starmathdatabase::Identify_PrefixPostfix_SmXMLOperatorContext_Impl( aToken.cMathChar );
+ }
+ }
+ else bToken = starmathdatabase::Identify_SmXMLOperatorContext_Impl( aToken.cMathChar, bIsStretchy );
+ if( bToken.eType != TERROR ) aToken = bToken;
}
void SmXMLOperatorContext_Impl::endFastElement(sal_Int32 )
@@ -1428,6 +1463,14 @@ void SmXMLOperatorContext_Impl::startFastElement(sal_Int32 /*nElement*/, const u
case XML_STRETCHY:
bIsStretchy = sValue == GetXMLToken(XML_TRUE);
break;
+ case XML_FENCE:
+ bIsFenced = sValue == GetXMLToken(XML_TRUE);
+ break;
+ case XML_FORM:
+ isPrefix = sValue == GetXMLToken(XML_PREFIX); // <
+ isInfix = sValue == GetXMLToken(XML_INFIX); // |
+ isPostfix = sValue == GetXMLToken(XML_POSTFIX); // >
+ break;
default:
XMLOFF_WARN_UNKNOWN("starmath", aIter);
break;
@@ -2229,12 +2272,14 @@ void SmXMLRowContext_Impl::endFastElement(sal_Int32 )
aToken.cMathChar = MS_LBRACE;
aToken.nLevel = 5;
aToken.eType = TLGROUP;
+ aToken.nGroup = TG::NONE;
aToken.aText = "{";
aRelationArray[0] = new SmLineNode(aToken);
aToken.cMathChar = MS_RBRACE;
aToken.nLevel = 0;
aToken.eType = TRGROUP;
+ aToken.nGroup = TG::NONE;
aToken.aText = "}";
aRelationArray[1] = new SmLineNode(aToken);
}