summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--starmath/source/rtfexport.cxx119
1 files changed, 115 insertions, 4 deletions
diff --git a/starmath/source/rtfexport.cxx b/starmath/source/rtfexport.cxx
index 32c441a70d30..2031fe05c876 100644
--- a/starmath/source/rtfexport.cxx
+++ b/starmath/source/rtfexport.cxx
@@ -86,6 +86,9 @@ void SmRtfExport::HandleNode(const SmNode* pNode, int nLevel)
case NMATH:
HandleMath(pNode, nLevel);
break;
+ case NSUBSUP:
+ HandleSubSupScript(static_cast<const SmSubSupNode*>(pNode), nLevel);
+ break;
case NEXPRESSION:
HandleAllSubNodes(pNode, nLevel);
break;
@@ -381,14 +384,122 @@ void SmRtfExport::HandleOperator(const SmOperNode* pNode, int nLevel)
}
}
-void SmRtfExport::HandleSubSupScript(const SmSubSupNode* /*pNode*/, int /*nLevel*/)
+void SmRtfExport::HandleSubSupScript(const SmSubSupNode* pNode, int nLevel)
{
- SAL_INFO("starmath.rtf", "TODO: " << OSL_THIS_FUNC);
+ // set flags to a bitfield of which sub/sup items exists
+ int flags = (pNode->GetSubSup(CSUB) ? (1 << CSUB) : 0)
+ | (pNode->GetSubSup(CSUP) ? (1 << CSUP) : 0)
+ | (pNode->GetSubSup(RSUB) ? (1 << RSUB) : 0)
+ | (pNode->GetSubSup(RSUP) ? (1 << RSUP) : 0)
+ | (pNode->GetSubSup(LSUB) ? (1 << LSUB) : 0)
+ | (pNode->GetSubSup(LSUP) ? (1 << LSUP) : 0);
+ HandleSubSupScriptInternal(pNode, nLevel, flags);
}
-void SmRtfExport::HandleSubSupScriptInternal(const SmSubSupNode* /*pNode*/, int /*nLevel*/, int /*flags*/)
+void SmRtfExport::HandleSubSupScriptInternal(const SmSubSupNode* pNode, int nLevel, int flags)
{
- SAL_INFO("starmath.rtf", "TODO: " << OSL_THIS_FUNC);
+// rtf supports only a certain combination of sub/super scripts, but LO can have any,
+// so try to merge it using several tags if necessary
+ if (flags == 0) // none
+ return;
+ if ((flags & (1 << RSUP | 1 << RSUB)) == (1 << RSUP | 1 << RSUB))
+ { // m:sSubSup
+ m_pBuffer->append("{\\msSubSup ");
+ m_pBuffer->append("{\\me ");
+ flags &= ~(1 << RSUP | 1 << RSUB);
+ if (flags == 0)
+ HandleNode(pNode->GetBody(), nLevel + 1);
+ else
+ HandleSubSupScriptInternal(pNode, nLevel, flags);
+ m_pBuffer->append("}"); // me
+ m_pBuffer->append("{\\msub ");
+ HandleNode(pNode->GetSubSup(RSUB), nLevel + 1);
+ m_pBuffer->append("}"); // msub
+ m_pBuffer->append("{\\msup ");
+ HandleNode(pNode->GetSubSup(RSUP ), nLevel + 1);
+ m_pBuffer->append("}"); // msup
+ m_pBuffer->append("}"); // msubSup
+ }
+ else if ((flags & (1 << RSUB)) == 1 << RSUB)
+ { // m:sSub
+ m_pBuffer->append("{\\msSub ");
+ m_pBuffer->append("{\\me ");
+ flags &= ~(1 << RSUB);
+ if (flags == 0)
+ HandleNode(pNode->GetBody(), nLevel + 1);
+ else
+ HandleSubSupScriptInternal(pNode, nLevel, flags);
+ m_pBuffer->append("}"); // me
+ m_pBuffer->append("{\\msub ");
+ HandleNode(pNode->GetSubSup(RSUB), nLevel + 1);
+ m_pBuffer->append("}"); // msub
+ m_pBuffer->append("}"); // msSub
+ }
+ else if ((flags & (1 << RSUP)) == 1 << RSUP)
+ { // m:sSup
+ m_pBuffer->append("{\\msSup ");
+ m_pBuffer->append("{\\me ");
+ flags &= ~(1 << RSUP);
+ if (flags == 0)
+ HandleNode(pNode->GetBody(), nLevel + 1);
+ else
+ HandleSubSupScriptInternal(pNode, nLevel, flags);
+ m_pBuffer->append("}"); // me
+ m_pBuffer->append("{\\msup ");
+ HandleNode(pNode->GetSubSup(RSUP), nLevel + 1);
+ m_pBuffer->append("}"); // msup
+ m_pBuffer->append("}"); // msSup
+ }
+ else if ((flags & (1 << LSUP | 1 << LSUB)) == (1 << LSUP | 1 << LSUB))
+ { // m:sPre
+ m_pBuffer->append("{\\msPre ");
+ m_pBuffer->append("{\\msub ");
+ HandleNode(pNode->GetSubSup(LSUB ), nLevel + 1);
+ m_pBuffer->append("}"); // msub
+ m_pBuffer->append("{\\msup ");
+ HandleNode(pNode->GetSubSup(LSUP), nLevel + 1);
+ m_pBuffer->append("}"); // msup
+ m_pBuffer->append("{\\me ");
+ flags &= ~(1 << LSUP | 1 << LSUB);
+ if (flags == 0)
+ HandleNode(pNode->GetBody(), nLevel + 1);
+ else
+ HandleSubSupScriptInternal(pNode, nLevel, flags);
+ m_pBuffer->append("}"); // me
+ m_pBuffer->append("}"); // msPre
+ }
+ else if ((flags & (1 << CSUB)) == (1 << CSUB))
+ { // m:limLow looks like a good element for central superscript
+ m_pBuffer->append("{\\mlimLow ");
+ m_pBuffer->append("{\\me ");
+ flags &= ~(1 << CSUB);
+ if (flags == 0)
+ HandleNode(pNode->GetBody(), nLevel + 1);
+ else
+ HandleSubSupScriptInternal(pNode, nLevel, flags);
+ m_pBuffer->append("}"); // me
+ m_pBuffer->append("{\\mlim ");
+ HandleNode(pNode->GetSubSup(CSUB), nLevel + 1);
+ m_pBuffer->append("}"); // mlim
+ m_pBuffer->append("}"); // mlimLow
+ }
+ else if ((flags & (1 << CSUP)) == (1 << CSUP))
+ { // m:limUpp looks like a good element for central superscript
+ m_pBuffer->append("{\\mlimUpp ");
+ m_pBuffer->append("{\\me ");
+ flags &= ~(1 << CSUP);
+ if (flags == 0)
+ HandleNode(pNode->GetBody(), nLevel + 1);
+ else
+ HandleSubSupScriptInternal(pNode, nLevel, flags);
+ m_pBuffer->append("}"); // me
+ m_pBuffer->append("{\\mlim ");
+ HandleNode(pNode->GetSubSup(CSUP), nLevel + 1);
+ m_pBuffer->append("}"); // mlim
+ m_pBuffer->append("}"); // mlimUpp
+ }
+ else
+ SAL_INFO("starmath.rtf", "TODO: " << OSL_THIS_FUNC << " unhandled subsup type");
}
void SmRtfExport::HandleMatrix(const SmMatrixNode* pNode, int nLevel)