LCOV - code coverage report
Current view: top level - starmath/source - wordexportbase.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 74 82 90.2 %
Date: 2015-06-13 12:38:46 Functions: 11 12 91.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : 
      11             : #include "wordexportbase.hxx"
      12             : 
      13          99 : SmWordExportBase::SmWordExportBase(const SmNode* pIn)
      14          99 :     : m_pTree(pIn)
      15             : {
      16          99 : }
      17             : 
      18          99 : SmWordExportBase::~SmWordExportBase()
      19             : {
      20          99 : }
      21             : 
      22        1290 : void SmWordExportBase::HandleNode(const SmNode* pNode, int nLevel)
      23             : {
      24             :     SAL_INFO("starmath.wordbase", "Node: " << nLevel << " " << int(pNode->GetType()) << " " << pNode->GetNumSubNodes());
      25        1290 :     switch (pNode->GetType())
      26             :     {
      27             :     case NATTRIBUT:
      28          28 :         HandleAttribute(static_cast< const SmAttributNode* >(pNode), nLevel);
      29          28 :         break;
      30             :     case NTEXT:
      31         540 :         HandleText(pNode,nLevel);
      32         540 :         break;
      33             :     case NVERTICAL_BRACE:
      34           4 :         HandleVerticalBrace(static_cast< const SmVerticalBraceNode* >(pNode), nLevel);
      35           4 :         break;
      36             :     case NBRACE:
      37          57 :         HandleBrace(static_cast< const SmBraceNode* >(pNode), nLevel);
      38          57 :         break;
      39             :     case NOPER:
      40          20 :         HandleOperator(static_cast< const SmOperNode* >(pNode), nLevel);
      41          20 :         break;
      42             :     case NUNHOR:
      43           9 :         HandleUnaryOperation(static_cast< const SmUnHorNode* >(pNode), nLevel);
      44           9 :         break;
      45             :     case NBINHOR:
      46          98 :         HandleBinaryOperation(static_cast< const SmBinHorNode* >(pNode), nLevel);
      47          98 :         break;
      48             :     case NBINVER:
      49          32 :         HandleFractions(pNode,nLevel);
      50          32 :         break;
      51             :     case NROOT:
      52          10 :         HandleRoot(static_cast< const SmRootNode* >(pNode), nLevel);
      53          10 :         break;
      54             :     case NSPECIAL:
      55             :     {
      56           0 :         const SmTextNode* pText= static_cast< const SmTextNode* >(pNode);
      57             :         //if the token str and the result text are the same then this
      58             :         //is to be seen as text, else assume it's a mathchar
      59           0 :         if (pText->GetText() == pText->GetToken().aText)
      60           0 :             HandleText(pText,nLevel);
      61             :         else
      62           0 :             HandleMath(pText,nLevel);
      63           0 :         break;
      64             :     }
      65             :     case NMATH:
      66             :     case NMATHIDENT:
      67         110 :         HandleMath(pNode,nLevel);
      68         110 :         break;
      69             :     case NSUBSUP:
      70          75 :         HandleSubSupScript(static_cast< const SmSubSupNode* >(pNode), nLevel);
      71          75 :         break;
      72             :     case NEXPRESSION:
      73          82 :         HandleAllSubNodes(pNode, nLevel);
      74          82 :         break;
      75             :     case NTABLE:
      76             :         //Root Node, PILE equivalent, i.e. vertical stack
      77         111 :         HandleTable(pNode,nLevel);
      78         111 :         break;
      79             :     case NMATRIX:
      80           2 :         HandleMatrix(static_cast< const SmMatrixNode* >(pNode), nLevel);
      81           2 :         break;
      82             :     case NLINE:
      83             :     {
      84             : // TODO
      85          99 :         HandleAllSubNodes(pNode, nLevel);
      86             :     }
      87          99 :     break;
      88             : #if 0
      89             :     case NALIGN:
      90             :         HandleMAlign(pNode,nLevel);
      91             :         break;
      92             : #endif
      93             :     case NPLACE:
      94             :         // explicitly do nothing, MSOffice treats that as a placeholder if item is missing
      95          10 :         break;
      96             :     case NBLANK:
      97           0 :         HandleBlank();
      98           0 :         break;
      99             :     default:
     100           3 :         HandleAllSubNodes(pNode, nLevel);
     101           3 :         break;
     102             :     }
     103        1290 : }
     104             : 
     105             : //Root Node, PILE equivalent, i.e. vertical stack
     106         111 : void SmWordExportBase::HandleTable(const SmNode* pNode, int nLevel)
     107             : {
     108             :     //The root of the starmath is a table, if
     109             :     //we convert this them each iteration of
     110             :     //conversion from starmath to Word will
     111             :     //add an extra unnecessary level to the
     112             :     //Word output stack which would grow
     113             :     //without bound in a multi step conversion
     114         111 :     if (nLevel || pNode->GetNumSubNodes() > 1)
     115          12 :         HandleVerticalStack(pNode, nLevel);
     116             :     else
     117          99 :         HandleAllSubNodes(pNode, nLevel);
     118         111 : }
     119             : 
     120         388 : void SmWordExportBase::HandleAllSubNodes(const SmNode* pNode, int nLevel)
     121             : {
     122         388 :     int size = pNode->GetNumSubNodes();
     123        1148 :     for (int i = 0;
     124             :             i < size;
     125             :             ++i)
     126             :     {
     127             : // TODO remove when all types of nodes are handled properly
     128         760 :         if (pNode->GetSubNode(i) == NULL)
     129             :         {
     130             :             SAL_WARN("starmath.wordbase", "Subnode is NULL, parent node not handled properly");
     131           0 :             continue;
     132             :         }
     133         760 :         HandleNode(pNode->GetSubNode(i), nLevel + 1);
     134             :     }
     135         388 : }
     136             : 
     137           9 : void SmWordExportBase::HandleUnaryOperation(const SmUnHorNode* pNode, int nLevel)
     138             : {
     139             :     // update HandleMath() when adding new items
     140             :     SAL_INFO("starmath.wordbase", "Unary: " << int(pNode->GetToken().eType));
     141             : 
     142             : // Avoid MSVC warning C4065: switch statement contains 'default' but no 'case' labels
     143             : //    switch( pNode->GetToken().eType )
     144             : //    {
     145             : //        default:
     146           9 :     HandleAllSubNodes(pNode, nLevel);
     147             : //            break;
     148             : //    }
     149           9 : }
     150             : 
     151          98 : void SmWordExportBase::HandleBinaryOperation(const SmBinHorNode* pNode, int nLevel)
     152             : {
     153             :     SAL_INFO("starmath.wordbase", "Binary: " << int(pNode->Symbol()->GetToken().eType));
     154             :     // update HandleMath() when adding new items
     155          98 :     switch (pNode->Symbol()->GetToken().eType)
     156             :     {
     157             :     case TDIVIDEBY:
     158         100 :         return HandleFractions(pNode, nLevel, "lin");
     159             :     default:
     160          96 :         HandleAllSubNodes(pNode, nLevel);
     161          96 :         break;
     162             :     }
     163             : }
     164             : 
     165         110 : void SmWordExportBase::HandleMath(const SmNode* pNode, int nLevel)
     166             : {
     167             :     SAL_INFO("starmath.wordbase", "Math: " << int(pNode->GetToken().eType));
     168         110 :     switch (pNode->GetToken().eType)
     169             :     {
     170             :     case TDIVIDEBY:
     171             :     case TACUTE:
     172             :         OSL_ASSERT(false);
     173             :     // the above are handled elsewhere, e.g. when handling BINHOR
     174             :     default:
     175         110 :         HandleText(pNode, nLevel);
     176         110 :         break;
     177             :     }
     178         110 : }
     179             : 
     180          75 : void SmWordExportBase::HandleSubSupScript(const SmSubSupNode* pNode, int nLevel)
     181             : {
     182             :     // set flags to a bitfield of which sub/sup items exists
     183          75 :     int flags = (pNode->GetSubSup(CSUB) != NULL ? (1 << CSUB) : 0)
     184          75 :                 | (pNode->GetSubSup(CSUP) != NULL ? (1 << CSUP) : 0)
     185          75 :                 | (pNode->GetSubSup(RSUB) != NULL ? (1 << RSUB) : 0)
     186          75 :                 | (pNode->GetSubSup(RSUP) != NULL ? (1 << RSUP) : 0)
     187          75 :                 | (pNode->GetSubSup(LSUB) != NULL ? (1 << LSUB) : 0)
     188          75 :                 | (pNode->GetSubSup(LSUP) != NULL ? (1 << LSUP) : 0);
     189          75 :     HandleSubSupScriptInternal(pNode, nLevel, flags);
     190         117 : }
     191             : 
     192             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11