diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2012-07-27 11:09:57 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-07-27 11:54:57 +0200 |
commit | 2f91b691e523385ff6350ea3524c7f795820612d (patch) | |
tree | bd56a8f0f3ebd812f1aa4fa8fa4b275225f019bb /starmath/source/wordexportbase.cxx | |
parent | ebacc340796a6a99d363bd3f04c72106db7d6f7a (diff) |
factor out common code of SmOoxmlExport and SmRtfExport to SmWordExportBase
Change-Id: I63ce6c57faf8568776d24ba1e8b13bd11b6c5532
Diffstat (limited to 'starmath/source/wordexportbase.cxx')
-rw-r--r-- | starmath/source/wordexportbase.cxx | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/starmath/source/wordexportbase.cxx b/starmath/source/wordexportbase.cxx new file mode 100644 index 000000000000..9f5e54bd182f --- /dev/null +++ b/starmath/source/wordexportbase.cxx @@ -0,0 +1,212 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License or as specified alternatively below. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * Major Contributor(s): + * Copyright (C) 2011 Lubos Lunak <l.lunak@suse.cz> (initial developer) + * + * All Rights Reserved. + * + * For minor contributions see the git repository. + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + + +#include "wordexportbase.hxx" + +#include <rtl/oustringostreaminserter.hxx> + +SmWordExportBase::SmWordExportBase( const SmNode* pIn ) +: m_pTree( pIn ) +{ +} + +SmWordExportBase::~SmWordExportBase() +{ +} + +void SmWordExportBase::HandleNode( const SmNode* pNode, int nLevel ) +{ + SAL_INFO( "starmath.wordbase", "Node: " << nLevel << " " << int( pNode->GetType()) << " " << pNode->GetNumSubNodes()); + switch(pNode->GetType()) + { + case NATTRIBUT: + HandleAttribute( static_cast< const SmAttributNode* >( pNode ), nLevel ); + break; + case NTEXT: + HandleText(pNode,nLevel); + break; + case NVERTICAL_BRACE: + HandleVerticalBrace( static_cast< const SmVerticalBraceNode* >( pNode ), nLevel ); + break; + case NBRACE: + HandleBrace( static_cast< const SmBraceNode* >( pNode ), nLevel ); + break; + case NOPER: + HandleOperator( static_cast< const SmOperNode* >( pNode ), nLevel ); + break; + case NUNHOR: + HandleUnaryOperation( static_cast< const SmUnHorNode* >( pNode ), nLevel ); + break; + case NBINHOR: + HandleBinaryOperation( static_cast< const SmBinHorNode* >( pNode ), nLevel ); + break; + case NBINVER: + HandleFractions(pNode,nLevel); + break; + case NROOT: + HandleRoot( static_cast< const SmRootNode* >( pNode ), nLevel ); + break; + case NSPECIAL: + { + const SmTextNode* pText= static_cast< const SmTextNode* >( pNode ); + //if the token str and the result text are the same then this + //is to be seen as text, else assume its a mathchar + if (pText->GetText() == pText->GetToken().aText) + HandleText(pText,nLevel); + else + HandleMath(pText,nLevel); + break; + } + case NMATH: + HandleMath(pNode,nLevel); + break; + case NSUBSUP: + HandleSubSupScript( static_cast< const SmSubSupNode* >( pNode ), nLevel ); + break; + case NEXPRESSION: + HandleAllSubNodes( pNode, nLevel ); + break; + case NTABLE: + //Root Node, PILE equivalent, i.e. vertical stack + HandleTable(pNode,nLevel); + break; + case NMATRIX: + HandleMatrix( static_cast< const SmMatrixNode* >( pNode ), nLevel ); + break; + case NLINE: + { +// TODO + HandleAllSubNodes( pNode, nLevel ); + } + break; +#if 0 + case NALIGN: + HandleMAlign(pNode,nLevel); + break; +#endif + case NPLACE: + // explicitly do nothing, MSOffice treats that as a placeholder if item is missing + break; + case NBLANK: + HandleBlank(); + break; + default: + HandleAllSubNodes( pNode, nLevel ); + break; + } +} + +//Root Node, PILE equivalent, i.e. vertical stack +void SmWordExportBase::HandleTable( const SmNode* pNode, int nLevel ) +{ + //The root of the starmath is a table, if + //we convert this them each iteration of + //conversion from starmath to Word will + //add an extra unnecessary level to the + //Word output stack which would grow + //without bound in a multi step conversion + if( nLevel || pNode->GetNumSubNodes() > 1 ) + HandleVerticalStack( pNode, nLevel ); + else + HandleAllSubNodes( pNode, nLevel ); +} + +void SmWordExportBase::HandleAllSubNodes( const SmNode* pNode, int nLevel ) +{ + int size = pNode->GetNumSubNodes(); + for( int i = 0; + i < size; + ++i ) + { +// TODO remove when all types of nodes are handled properly + if( pNode->GetSubNode( i ) == NULL ) + { + OSL_FAIL( "Subnode is NULL, parent node not handled properly" ); + continue; + } + HandleNode( pNode->GetSubNode( i ), nLevel + 1 ); + } +} + +void SmWordExportBase::HandleUnaryOperation( const SmUnHorNode* pNode, int nLevel ) +{ + // update HandleMath() when adding new items + SAL_INFO( "starmath.wordbase", "Unary: " << int( pNode->GetToken().eType )); + +// Avoid MSVC warning C4065: switch statement contains 'default' but no 'case' labels +// switch( pNode->GetToken().eType ) +// { +// default: + HandleAllSubNodes( pNode, nLevel ); +// break; +// } +} + +void SmWordExportBase::HandleBinaryOperation( const SmBinHorNode* pNode, int nLevel ) +{ + SAL_INFO( "starmath.wordbase", "Binary: " << int( pNode->Symbol()->GetToken().eType )); + // update HandleMath() when adding new items + switch( pNode->Symbol()->GetToken().eType ) + { + case TDIVIDEBY: + return HandleFractions( pNode, nLevel, "lin" ); + default: + HandleAllSubNodes( pNode, nLevel ); + break; + } +} + +void SmWordExportBase::HandleMath( const SmNode* pNode, int nLevel ) +{ + SAL_INFO( "starmath.wordbase", "Math: " << int( pNode->GetToken().eType )); + switch( pNode->GetToken().eType ) + { + case TDIVIDEBY: + case TACUTE: + // these are handled elsewhere, e.g. when handling BINHOR + OSL_ASSERT( false ); + default: + HandleText( pNode, nLevel ); + break; + } +} + +void SmWordExportBase::HandleSubSupScript( const SmSubSupNode* pNode, int nLevel ) +{ + // set flags to a bitfield of which sub/sup items exists + int flags = ( pNode->GetSubSup( CSUB ) != NULL ? ( 1 << CSUB ) : 0 ) + | ( pNode->GetSubSup( CSUP ) != NULL ? ( 1 << CSUP ) : 0 ) + | ( pNode->GetSubSup( RSUB ) != NULL ? ( 1 << RSUB ) : 0 ) + | ( pNode->GetSubSup( RSUP ) != NULL ? ( 1 << RSUP ) : 0 ) + | ( pNode->GetSubSup( LSUB ) != NULL ? ( 1 << LSUB ) : 0 ) + | ( pNode->GetSubSup( LSUP ) != NULL ? ( 1 << LSUP ) : 0 ); + HandleSubSupScriptInternal( pNode, nLevel, flags ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |