1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_STARMATH_SOURCE_MATHTYPE_HXX
#define INCLUDED_STARMATH_SOURCE_MATHTYPE_HXX
#include <rtl/ustring.hxx>
#include <rtl/ustrbuf.hxx>
#include <set>
#include <vector>
class SfxMedium;
class SmMatrixNode;
class SmNode;
class SotStorage;
class SvStream;
class MathTypeFont
{
public:
sal_uInt8 nTface;
sal_uInt8 nStyle;
MathTypeFont() : nTface(0),nStyle(0) {}
explicit MathTypeFont(sal_uInt8 nFace) : nTface(nFace),nStyle(0) {}
void AppendStyleToText(OUString &rS);
};
struct LessMathTypeFont
{
bool operator() (const MathTypeFont &rValue1,
const MathTypeFont &rValue2) const
{
return rValue1.nTface < rValue2.nTface;
}
};
typedef ::std::set< MathTypeFont, LessMathTypeFont > MathTypeFontSet;
class MathType
{
public:
explicit MathType(OUStringBuffer &rIn)
: nVersion(0)
, pS(nullptr)
, rRet(rIn)
, pTree(nullptr)
, nHAlign(0)
, nPendingAttributes(0)
, nInsertion(0)
, nLSize(0)
, nDSize(0)
, nCurSize(0)
, nLastSize(0)
, nSpec(0)
, bIsReInterpBrace(false)
, nPostSup(0)
, nPostlSup(0)
, nTypeFace(0)
{
Init();
}
MathType(OUStringBuffer &rIn,SmNode *pIn)
: nVersion(0)
, pS(nullptr)
, rRet(rIn)
, pTree(pIn)
, nHAlign(2)
, nPendingAttributes(0)
, nInsertion(0)
, nLSize(0)
, nDSize(0)
, nCurSize(0)
, nLastSize(0)
, nSpec(0)
, bIsReInterpBrace(false)
, nPostSup(0)
, nPostlSup(0)
, nTypeFace(0)
{
Init();
}
bool Parse(SotStorage* pStor);
bool Parse(SvStream* pStream);
bool ConvertFromStarMath( SfxMedium& rMedium );
private:
/*Ver 2 Header*/
sal_uInt8 nVersion;
SvStream* pS;
void Init();
bool HandleRecords(int nLevel, sal_uInt8 nSelector =0xFF,
sal_uInt8 nVariation =0xFF, int nRows =0, int nCols =0);
bool HandleSize(sal_Int16 nLSize, sal_Int16 nDSize, int &rSetSize);
void HandleAlign(sal_uInt8 nHAlign, int &rSetAlign);
bool HandlePile(int &rSetAlign, int nLevel, sal_uInt8 nSelector, sal_uInt8 nVariation);
bool HandleMatrix(int nLevel, sal_uInt8 nSelector, sal_uInt8 nVariarion);
void HandleMatrixSeparator(int nMatrixRows, int nMatrixCols, int &rCurCol, int &rCurRow);
bool HandleTemplate(int nLevel, sal_uInt8 &rSelector, sal_uInt8 &rVariation,
sal_Int32 &rLastTemplateBracket);
void HandleEmblishments();
void HandleSetSize();
bool HandleChar(sal_Int32 &rTextStart, int &rSetSize, int nLevel,
sal_uInt8 nTag, sal_uInt8 nSelector, sal_uInt8 nVariation, bool bSilent);
void HandleNudge();
static int xfLMOVE(sal_uInt8 nTest) {return nTest&0x80;}
static int xfAUTO(sal_uInt8 nTest) {return nTest&0x10;}
static int xfEMBELL(sal_uInt8 nTest) {return nTest&0x20;}
static int xfNULL(sal_uInt8 nTest) {return nTest&0x10;}
void HandleNodes(SmNode *pNode,int nLevel);
int StartTemplate(sal_uInt16 nSelector,sal_uInt16 nVariation=0);
void EndTemplate(int nOldPendingAttributes);
void HandleSmMatrix(SmMatrixNode *pMatrix,int nLevel);
void HandleTable(SmNode *pNode,int nLevel);
void HandleRoot(SmNode *pNode,int nLevel);
void HandleSubSupScript(SmNode *pNode,int nLevel);
sal_uInt8 HandleCScript(SmNode *pNode,SmNode *pContent,int nLevel,
sal_uInt64 *pPos=nullptr,bool bTest=true);
void HandleFractions(SmNode *pNode,int nLevel);
void HandleBrace(SmNode *pNode,int nLevel);
void HandleVerticalBrace(SmNode *pNode,int nLevel);
void HandleOperator(SmNode *pNode,int nLevel);
bool HandleLim(SmNode *pNode,int nLevel);
void HandleMAlign(SmNode *pNode,int nLevel);
void HandleMath(SmNode *pNode);
void HandleText(SmNode *pNode);
void HandleAttributes(SmNode *pNode,int nLevel);
void TypeFaceToString(OUString &rRet,sal_uInt8 nFace);
OUStringBuffer &rRet;
SmNode *pTree;
sal_uInt8 nHAlign;
int nPendingAttributes;
sal_uInt64 nInsertion;
std::vector<sal_Int16> aSizeTable;
sal_Int16 nLSize;
sal_Int16 nDSize;
sal_Int16 nCurSize;
sal_Int16 nLastSize;
sal_uInt8 nSpec;
bool bIsReInterpBrace;
OUString sPost;
sal_Int32 nPostSup;
sal_Int32 nPostlSup;
sal_uInt8 nTypeFace;
MathTypeFontSet aUserStyles;
enum MTOKENS {END,LINE,CHAR,TMPL,PILE,MATRIX,EMBEL,RULER,FONT,SIZE};
enum MTEMPLATES
{
tmANGLE,tmPAREN,tmBRACE,tmBRACK,tmBAR,tmDBAR,tmFLOOR,tmCEILING,
tmLBLB,tmRBRB,tmRBLB,tmLBRP,tmLPRB,tmROOT,tmFRACT,tmSCRIPT,tmUBAR,
tmOBAR,tmLARROW,tmRARROW,tmBARROW,tmSINT,tmDINT,tmTINT,tmSSINT,
tmDSINT,tmTSINT,tmUHBRACE,tmLHBRACE,tmSUM,tmISUM,tmPROD,tmIPROD,
tmCOPROD,tmICOPROD,tmUNION,tmIUNION,tmINTER,tmIINTER,tmLIM,tmLDIV,
tmSLFRACT,tmINTOP,tmSUMOP,tmLSCRIPT,tmDIRAC,tmUARROW,tmOARROW,
tmOARC
};
public:
static bool LookupChar(sal_Unicode nChar,OUStringBuffer &rRet,
sal_uInt8 nVersion,sal_uInt8 nTypeFace=0);
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|