diff options
author | Luboš Luňák <l.lunak@suse.cz> | 2011-11-30 14:48:53 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@suse.cz> | 2011-11-30 16:11:45 +0100 |
commit | c56e4ab6675a83da09bfbe69bf63f6a4cedcb566 (patch) | |
tree | 6bad27a0ae9a58cc59c759f047e003e04ae07ba3 | |
parent | 53c9a92cc82baaabd05b182152541e0c7d2bd3d0 (diff) |
export all sub/superscripts LO can handle to docx mathml
-rw-r--r-- | starmath/source/ooxmlexport.cxx | 71 |
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 ); } } |