summaryrefslogtreecommitdiff
path: root/starmath
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@suse.cz>2011-11-30 14:48:53 +0100
committerLuboš Luňák <l.lunak@suse.cz>2011-11-30 16:11:45 +0100
commitc56e4ab6675a83da09bfbe69bf63f6a4cedcb566 (patch)
tree6bad27a0ae9a58cc59c759f047e003e04ae07ba3 /starmath
parent53c9a92cc82baaabd05b182152541e0c7d2bd3d0 (diff)
export all sub/superscripts LO can handle to docx mathml
Diffstat (limited to 'starmath')
-rw-r--r--starmath/source/ooxmlexport.cxx71
1 files changed, 60 insertions, 11 deletions
diff --git a/starmath/source/ooxmlexport.cxx b/starmath/source/ooxmlexport.cxx
index 1bab1f266ccd..d3d7c058816e 100644
--- a/starmath/source/ooxmlexport.cxx
+++ b/starmath/source/ooxmlexport.cxx
@@ -546,18 +546,24 @@ void SmOoxmlExport::HandleSubSupScript( const SmSubSupNode* pNode, int nLevel )
| ( pNode->GetSubSup( RSUP ) != NULL ? ( 1 << RSUP ) : 0 )
| ( pNode->GetSubSup( LSUB ) != NULL ? ( 1 << LSUB ) : 0 )
| ( pNode->GetSubSup( LSUP ) != NULL ? ( 1 << LSUP ) : 0 );
- if( flags == 0 ) // none
- return;
HandleSubSupScriptInternal( pNode, nLevel, flags );
}
void SmOoxmlExport::HandleSubSupScriptInternal( const SmSubSupNode* pNode, int nLevel, int flags )
{
- if( flags == ( 1 << RSUP | 1 << RSUB ))
+// docx 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_pSerializer->startElementNS( XML_m, XML_sSubSup, FSEND );
m_pSerializer->startElementNS( XML_m, XML_e, FSEND );
- HandleNode( pNode->GetBody(), nLevel + 1 );
+ flags &= ~( 1 << RSUP | 1 << RSUB );
+ if( flags == 0 )
+ HandleNode( pNode->GetBody(), nLevel + 1 );
+ else
+ HandleSubSupScriptInternal( pNode, nLevel, flags );
m_pSerializer->endElementNS( XML_m, XML_e );
m_pSerializer->startElementNS( XML_m, XML_sub, FSEND );
HandleNode( pNode->GetSubSup( RSUB ), nLevel + 1 );
@@ -567,29 +573,37 @@ void SmOoxmlExport::HandleSubSupScriptInternal( const SmSubSupNode* pNode, int n
m_pSerializer->endElementNS( XML_m, XML_sup );
m_pSerializer->endElementNS( XML_m, XML_sSubSup );
}
- else if( flags == 1 << RSUB )
+ else if(( flags & ( 1 << RSUB )) == 1 << RSUB )
{ // m:sSub
m_pSerializer->startElementNS( XML_m, XML_sSub, FSEND );
m_pSerializer->startElementNS( XML_m, XML_e, FSEND );
- HandleNode( pNode->GetBody(), nLevel + 1 );
+ flags &= ~( 1 << RSUB );
+ if( flags == 0 )
+ HandleNode( pNode->GetBody(), nLevel + 1 );
+ else
+ HandleSubSupScriptInternal( pNode, nLevel, flags );
m_pSerializer->endElementNS( XML_m, XML_e );
m_pSerializer->startElementNS( XML_m, XML_sub, FSEND );
HandleNode( pNode->GetSubSup( RSUB ), nLevel + 1 );
m_pSerializer->endElementNS( XML_m, XML_sub );
m_pSerializer->endElementNS( XML_m, XML_sSub );
}
- else if( flags == 1 << RSUP )
+ else if(( flags & ( 1 << RSUP )) == 1 << RSUP )
{ // m:sSup
m_pSerializer->startElementNS( XML_m, XML_sSup, FSEND );
m_pSerializer->startElementNS( XML_m, XML_e, FSEND );
- HandleNode( pNode->GetBody(), nLevel + 1 );
+ flags &= ~( 1 << RSUP );
+ if( flags == 0 )
+ HandleNode( pNode->GetBody(), nLevel + 1 );
+ else
+ HandleSubSupScriptInternal( pNode, nLevel, flags );
m_pSerializer->endElementNS( XML_m, XML_e );
m_pSerializer->startElementNS( XML_m, XML_sup, FSEND );
HandleNode( pNode->GetSubSup( RSUP ), nLevel + 1 );
m_pSerializer->endElementNS( XML_m, XML_sup );
m_pSerializer->endElementNS( XML_m, XML_sSup );
}
- else if( flags == ( 1 << LSUP | 1 << LSUB ))
+ else if(( flags & ( 1 << LSUP | 1 << LSUB )) == ( 1 << LSUP | 1 << LSUB ))
{ // m:sPre
m_pSerializer->startElementNS( XML_m, XML_sPre, FSEND );
m_pSerializer->startElementNS( XML_m, XML_sub, FSEND );
@@ -599,14 +613,49 @@ void SmOoxmlExport::HandleSubSupScriptInternal( const SmSubSupNode* pNode, int n
HandleNode( pNode->GetSubSup( LSUP ), nLevel + 1 );
m_pSerializer->endElementNS( XML_m, XML_sup );
m_pSerializer->startElementNS( XML_m, XML_e, FSEND );
- HandleNode( pNode->GetBody(), nLevel + 1 );
+ flags &= ~( 1 << LSUP | 1 << LSUB );
+ if( flags == 0 )
+ HandleNode( pNode->GetBody(), nLevel + 1 );
+ else
+ HandleSubSupScriptInternal( pNode, nLevel, flags );
m_pSerializer->endElementNS( XML_m, XML_e );
m_pSerializer->endElementNS( XML_m, XML_sPre );
}
+ else if(( flags & ( 1 << CSUB )) == ( 1 << CSUB ))
+ { // m:limLow looks like a good element for central superscript
+ m_pSerializer->startElementNS( XML_m, XML_limLow, FSEND );
+ m_pSerializer->startElementNS( XML_m, XML_e, FSEND );
+ flags &= ~( 1 << CSUB );
+ if( flags == 0 )
+ HandleNode( pNode->GetBody(), nLevel + 1 );
+ else
+ HandleSubSupScriptInternal( pNode, nLevel, flags );
+ m_pSerializer->endElementNS( XML_m, XML_e );
+ m_pSerializer->startElementNS( XML_m, XML_lim, FSEND );
+ HandleNode( pNode->GetSubSup( CSUB ), nLevel + 1 );
+ m_pSerializer->endElementNS( XML_m, XML_lim );
+ m_pSerializer->endElementNS( XML_m, XML_limLow );
+ }
+ else if(( flags & ( 1 << CSUP )) == ( 1 << CSUP ))
+ { // m:limUpp looks like a good element for central superscript
+ m_pSerializer->startElementNS( XML_m, XML_limUpp, FSEND );
+ m_pSerializer->startElementNS( XML_m, XML_e, FSEND );
+ flags &= ~( 1 << CSUP );
+ if( flags == 0 )
+ HandleNode( pNode->GetBody(), nLevel + 1 );
+ else
+ HandleSubSupScriptInternal( pNode, nLevel, flags );
+ m_pSerializer->endElementNS( XML_m, XML_e );
+ m_pSerializer->startElementNS( XML_m, XML_lim, FSEND );
+ HandleNode( pNode->GetSubSup( CSUP ), nLevel + 1 );
+ m_pSerializer->endElementNS( XML_m, XML_lim );
+ m_pSerializer->endElementNS( XML_m, XML_limUpp );
+ }
else
{
OSL_FAIL( "Unhandled sub/sup combination" );
- HandleAllSubNodes( pNode, nLevel );
+ // TODO do not do anything, this should be probably an assert()
+ // HandleAllSubNodes( pNode, nLevel );
}
}