diff --git a/Makefile.fetch b/Makefile.fetch index e743d62..7c1f0c1 100644 --- a/Makefile.fetch +++ b/Makefile.fetch @@ -192,6 +192,7 @@ $(WORKDIR)/download: $(BUILDDIR)/config_host.mk $(SRCDIR)/download.lst $(SRCDIR) $(call fetch_Optional,MOZ,$(MOZ_ZIP_LIB)) \ $(call fetch_Optional,MOZ,$(MOZ_ZIP_RUNTIME)) \ ,$(call fetch_Download_item,http://dev-www.libreoffice.org/mozilla,$(item),no-sum)) + $(call fetch_Download_item,http://www.w3.org/2003/entities/2007xml,$(W3C_UNICODE),no-sum) @mkdir -p $(dir $@) && touch $@ # vim: set noet sw=4 ts=4: diff --git a/download.lst b/download.lst index 9d73b8d..e90ed50 100644 --- a/download.lst +++ b/download.lst @@ -94,3 +94,5 @@ export ZLIB_TARBALL := 2ab442d169156f34c379c968f3f482dd-zlib-1.2.7.tar.bz2 export MOZ_ZIP_INC := $(OS)$(COM)$(CPU)inc.zip export MOZ_ZIP_LIB := $(OS)$(COM)$(CPU)lib.zip export MOZ_ZIP_RUNTIME := $(OS)$(COM)$(CPU)runtime.zip + +export W3C_UNICODE := unicode.xml diff --git a/starmath/Library_sm.mk b/starmath/Library_sm.mk index a56e439..da06517 100644 --- a/starmath/Library_sm.mk +++ b/starmath/Library_sm.mk @@ -64,6 +64,7 @@ $(eval $(call gb_Library_add_exception_objects,sm,\ starmath/source/document \ starmath/source/edit \ starmath/source/format \ + starmath/source/operatorDictionary \ starmath/source/mathmlexport \ starmath/source/mathmlimport \ starmath/source/mathtype \ diff --git a/starmath/source/extractOperators.xsl b/starmath/source/extractOperators.xsl new file mode 100644 index 0000000..0a181ba --- /dev/null +++ b/starmath/source/extractOperators.xsl @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + opDict[ + + ] = + + ; + + + + + diff --git a/starmath/source/generateOperatorDictionary.sh b/starmath/source/generateOperatorDictionary.sh new file mode 100644 index 0000000..d2a89dd --- /dev/null +++ b/starmath/source/generateOperatorDictionary.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# +# 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 script extracts the list of operators from unicode.xml, with a boolean +# indicating whether at least one form (prefix, infix, postfix) is stretchy. + +# Download unicode.xml if it does not exist yet. +if [ ! -f unicode.xml ]; then + wget http://www.w3.org/2003/entities/2007xml/unicode.xml -O unicode.xml +fi + +# Extract the list of operators. +# "grep -v '-'" excludes multichar entries (e.g. "||"). +# "uniq" excludes duplicate lines (two forms with the same stretchy value) +xsltproc extractOperators.xsl unicode.xml | grep opDict | \ +sed s/U0/0x/ | grep -v '-' | uniq > tmp1.txt + +# Although it is rare, some entries may have at this point two stretchy values +# (false and true). We want to know if the operator has at least one stretchy +# form, so we keep only the line that sets the value to 'true'. +sed s/false/true/ tmp1.txt | uniq --repeated | \ +sed s/true/false/ > tmp2.txt +diff -U1 tmp1.txt tmp2.txt | grep '\-opDict' | \ +sed "s/\-//" | sed "s/opDict/ opDict/" > tmp3.txt + +# Add header and footer +echo '/* This file has been automatically generated. Do not edit. */ + +#include +#include +::std::unordered_map< sal_Unicode, bool > opDict; + +void initOperatorDictionary() +{ + static bool bInitialized = false; + if (bInitialized) + return; + bInitialized = true;' > operatorDictionary.cxx +cat tmp3.txt >> operatorDictionary.cxx +echo '}' >> operatorDictionary.cxx + +# Remove temporary files. +rm -f tmp*.txt diff --git a/starmath/source/mathmlexport.cxx b/starmath/source/mathmlexport.cxx index 1dd1634..e9f7a2d 100644 --- a/starmath/source/mathmlexport.cxx +++ b/starmath/source/mathmlexport.cxx @@ -67,6 +67,7 @@ #include #include "mathmlexport.hxx" +#include "operatorDictionary.hxx" #include #include #include @@ -588,6 +589,9 @@ sal_uInt32 SmXMLExport::exportDoc(enum XMLTokenEnum eClass) rList.AddAttribute(GetNamespaceMap().GetAttrNameByKey(XML_NAMESPACE_MATH_IDX), GetNamespaceMap().GetNameByKey( XML_NAMESPACE_MATH_IDX)); + // Initialize the Operator Dictionary + initOperatorDictionary(); + //I think we need something like ImplExportEntities(); _ExportContent(); GetDocHandler()->endDocument(); @@ -912,24 +916,7 @@ void SmXMLExport::ExportMath(const SmNode *pNode, int /*nLevel*/) const SmMathSymbolNode *pTemp = static_cast(pNode); SvXMLElementExport *pMath = 0; - if (pNode->GetType() == NMATH || pNode->GetType() == NGLYPH_SPECIAL) - { - // Export NMATH and NGLYPH_SPECIAL symbols as elements - pMath = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, XML_MO, sal_True, sal_False); - } - else - { - // Export NMATHIDENT and NPLACE symbols as elements: - // - These math symbols should not be drawn slanted. Hence we should - // attach a mathvariant="normal" attribute to single-char elements - // that are not mathematical alphanumeric symbol. For simplicity and to - // work around browser limitations, we always attach such an attribute. - // - The MathML specification suggests to use empty elements as - // placeholders but they won't be visible in most MathML rendering - // engines so let's use an empty square for NPLACE instead. - AddAttribute(XML_NAMESPACE_MATH, XML_MATHVARIANT, XML_NORMAL); - pMath = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, XML_MI, sal_True, sal_False); - } + pMath = new SvXMLElementExport(*this, XML_NAMESPACE_MATH, XML_MO, sal_True, sal_False); sal_Unicode nArse[2]; nArse[0] = pTemp->GetText()[0]; sal_Unicode cTmp = ConvertMathToMathML( nArse[0] ); @@ -1545,6 +1532,7 @@ void SmXMLExport::ExportNodes(const SmNode *pNode, int nLevel) case NTEXT: ExportText(pNode, nLevel); break; + case NSPECIAL: //NSPECIAL requires some sort of Entity preservation in the XML engine. case NGLYPH_SPECIAL: case NMATH: { @@ -1552,17 +1540,15 @@ void SmXMLExport::ExportNodes(const SmNode *pNode, int nLevel) const SmTextNode *pTemp = static_cast< const SmTextNode * >(pNode); if (!pTemp->GetText().isEmpty()) cTmp = ConvertMathToMathML( pTemp->GetText()[0] ); - if (cTmp == 0) + if (cTmp == 0 || + (pNode->GetType() == NSPECIAL && opDict.count(cTmp) == 0)) { - // no conversion to MathML implemented -> export it as text - // thus at least it will not vanish into nothing + // No conversion to MathML implemented or not an operator. + // Export this as an element. ExportText(pNode, nLevel); } else { - //To fully handle generic MathML we need to implement the full - //operator dictionary, we will generate MathML with explicit - //stretchiness for now. sal_Int16 nLength = GetAttrList().getLength(); sal_Bool bAddStretch=sal_True; for ( sal_Int16 i = 0; i < nLength; i++ ) @@ -1580,16 +1566,32 @@ void SmXMLExport::ExportNodes(const SmNode *pNode, int nLevel) } if (bAddStretch) { - AddAttribute(XML_NAMESPACE_MATH, XML_STRETCHY, XML_FALSE); + // There is not any explicit stretchy attribute + // specified so we will just consider the operator + // non-stretchy. + if (opDict.count(cTmp) == 1 && opDict[cTmp]) + { + // The operator has at least one stretchy form. + // Let's attach an explicit stretchy="false" to + // prevent it from stretching. + AddAttribute(XML_NAMESPACE_MATH, XML_STRETCHY, + XML_FALSE); + } } ExportMath(pNode, nLevel); } } break; - case NSPECIAL: //NSPECIAL requires some sort of Entity preservation in the XML engine. case NMATHIDENT : case NPLACE: - ExportMath(pNode, nLevel); + // Export NMATHIDENT and NPLACE symbols as elements: + // - These math symbols should not be drawn slanted. Hence we should + // attach a mathvariant="normal" attribute to single-char + // elements that are not mathematical alphanumeric symbol. + // - The MathML specification suggests to use empty elements as + // placeholders but they won't be visible in most MathML rendering + // engines so let's use an empty square for NPLACE instead. + ExportText(pNode, nLevel); break; case NBINHOR: ExportBinaryHorizontal(pNode, nLevel); diff --git a/starmath/source/operatorDictionary.cxx b/starmath/source/operatorDictionary.cxx new file mode 100644 index 0000000..454d100 --- /dev/null +++ b/starmath/source/operatorDictionary.cxx @@ -0,0 +1,1041 @@ +/* This file has been automatically generated. Do not edit. */ + +#include +#include +::std::unordered_map< sal_Unicode, bool > opDict; + +void initOperatorDictionary() +{ + static bool bInitialized = false; + if (bInitialized) + return; + bInitialized = true; + opDict[0x0021] = false; + opDict[0x0025] = false; + opDict[0x0026] = false; + opDict[0x0027] = false; + opDict[0x0028] = true; + opDict[0x0029] = true; + opDict[0x002A] = false; + opDict[0x002B] = false; + opDict[0x002C] = false; + opDict[0x002D] = false; + opDict[0x002E] = false; + opDict[0x002F] = false; + opDict[0x003A] = false; + opDict[0x003B] = false; + opDict[0x003C] = false; + opDict[0x003D] = false; + opDict[0x003E] = false; + opDict[0x003F] = false; + opDict[0x0040] = false; + opDict[0x005B] = true; + opDict[0x005C] = false; + opDict[0x005D] = true; + opDict[0x005E] = true; + opDict[0x005F] = true; + opDict[0x0060] = false; + opDict[0x007B] = true; + opDict[0x007C] = true; + opDict[0x007D] = true; + opDict[0x007E] = true; + opDict[0x00A8] = false; + opDict[0x00AC] = false; + opDict[0x00AF] = true; + opDict[0x00B0] = false; + opDict[0x00B1] = false; + opDict[0x00B4] = false; + opDict[0x00B7] = false; + opDict[0x00B8] = false; + opDict[0x00D7] = false; + opDict[0x00F7] = false; + opDict[0x02C6] = true; + opDict[0x02C7] = true; + opDict[0x02C9] = true; + opDict[0x02CA] = false; + opDict[0x02CB] = false; + opDict[0x02CD] = true; + opDict[0x02D8] = false; + opDict[0x02D9] = false; + opDict[0x02DA] = false; + opDict[0x02DC] = true; + opDict[0x02DD] = false; + opDict[0x02F7] = true; + opDict[0x0302] = true; + opDict[0x0311] = false; + opDict[0x03F6] = false; + opDict[0x2016] = true; + opDict[0x2018] = false; + opDict[0x2019] = false; + opDict[0x201C] = false; + opDict[0x201D] = false; + opDict[0x2022] = false; + opDict[0x2026] = false; + opDict[0x2032] = false; + opDict[0x203E] = true; + opDict[0x2044] = true; + opDict[0x2061] = false; + opDict[0x2062] = false; + opDict[0x2063] = false; + opDict[0x2064] = false; + opDict[0x20DB] = false; + opDict[0x20DC] = false; + opDict[0x2145] = false; + opDict[0x2146] = false; + opDict[0x2190] = true; + opDict[0x2191] = true; + opDict[0x2192] = true; + opDict[0x2193] = true; + opDict[0x2194] = true; + opDict[0x2195] = true; + opDict[0x2196] = true; + opDict[0x2197] = true; + opDict[0x2198] = true; + opDict[0x2199] = true; + opDict[0x219A] = false; + opDict[0x219B] = false; + opDict[0x219C] = true; + opDict[0x219D] = true; + opDict[0x219E] = true; + opDict[0x219F] = true; + opDict[0x21A0] = true; + opDict[0x21A1] = true; + opDict[0x21A2] = true; + opDict[0x21A3] = true; + opDict[0x21A4] = true; + opDict[0x21A5] = true; + opDict[0x21A6] = true; + opDict[0x21A7] = true; + opDict[0x21A8] = true; + opDict[0x21A9] = true; + opDict[0x21AA] = true; + opDict[0x21AB] = true; + opDict[0x21AC] = true; + opDict[0x21AD] = true; + opDict[0x21AE] = false; + opDict[0x21AF] = true; + opDict[0x21B0] = true; + opDict[0x21B1] = true; + opDict[0x21B2] = true; + opDict[0x21B3] = true; + opDict[0x21B4] = true; + opDict[0x21B5] = true; + opDict[0x21B6] = false; + opDict[0x21B7] = false; + opDict[0x21B8] = false; + opDict[0x21B9] = true; + opDict[0x21BA] = false; + opDict[0x21BB] = false; + opDict[0x21BC] = true; + opDict[0x21BD] = true; + opDict[0x21BE] = true; + opDict[0x21BF] = true; + opDict[0x21C0] = true; + opDict[0x21C1] = true; + opDict[0x21C2] = true; + opDict[0x21C3] = true; + opDict[0x21C4] = true; + opDict[0x21C5] = true; + opDict[0x21C6] = true; + opDict[0x21C7] = true; + opDict[0x21C8] = true; + opDict[0x21C9] = true; + opDict[0x21CA] = true; + opDict[0x21CB] = true; + opDict[0x21CC] = true; + opDict[0x21CD] = false; + opDict[0x21CE] = false; + opDict[0x21CF] = false; + opDict[0x21D0] = true; + opDict[0x21D1] = true; + opDict[0x21D2] = true; + opDict[0x21D3] = true; + opDict[0x21D4] = true; + opDict[0x21D5] = true; + opDict[0x21D6] = true; + opDict[0x21D7] = true; + opDict[0x21D8] = true; + opDict[0x21D9] = true; + opDict[0x21DA] = true; + opDict[0x21DB] = true; + opDict[0x21DC] = true; + opDict[0x21DD] = true; + opDict[0x21DE] = false; + opDict[0x21DF] = false; + opDict[0x21E0] = true; + opDict[0x21E1] = true; + opDict[0x21E2] = true; + opDict[0x21E3] = true; + opDict[0x21E4] = true; + opDict[0x21E5] = true; + opDict[0x21E6] = true; + opDict[0x21E7] = true; + opDict[0x21E8] = true; + opDict[0x21E9] = true; + opDict[0x21EA] = true; + opDict[0x21EB] = true; + opDict[0x21EC] = true; + opDict[0x21ED] = true; + opDict[0x21EE] = true; + opDict[0x21EF] = true; + opDict[0x21F0] = true; + opDict[0x21F1] = false; + opDict[0x21F2] = false; + opDict[0x21F3] = true; + opDict[0x21F4] = false; + opDict[0x21F5] = true; + opDict[0x21F6] = true; + opDict[0x21F7] = false; + opDict[0x21F8] = false; + opDict[0x21F9] = false; + opDict[0x21FA] = false; + opDict[0x21FB] = false; + opDict[0x21FC] = false; + opDict[0x21FD] = true; + opDict[0x21FE] = true; + opDict[0x21FF] = true; + opDict[0x2200] = false; + opDict[0x2201] = false; + opDict[0x2202] = false; + opDict[0x2203] = false; + opDict[0x2204] = false; + opDict[0x2206] = false; + opDict[0x2207] = false; + opDict[0x2208] = false; + opDict[0x2209] = false; + opDict[0x220A] = false; + opDict[0x220B] = false; + opDict[0x220C] = false; + opDict[0x220D] = false; + opDict[0x220E] = false; + opDict[0x220F] = false; + opDict[0x2210] = false; + opDict[0x2211] = false; + opDict[0x2212] = false; + opDict[0x2213] = false; + opDict[0x2214] = false; + opDict[0x2215] = true; + opDict[0x2216] = false; + opDict[0x2217] = false; + opDict[0x2218] = false; + opDict[0x2219] = false; + opDict[0x221A] = true; + opDict[0x221B] = false; + opDict[0x221C] = false; + opDict[0x221D] = false; + opDict[0x221F] = false; + opDict[0x2220] = false; + opDict[0x2221] = false; + opDict[0x2222] = false; + opDict[0x2223] = false; + opDict[0x2224] = false; + opDict[0x2225] = false; + opDict[0x2226] = false; + opDict[0x2227] = false; + opDict[0x2228] = false; + opDict[0x2229] = false; + opDict[0x222A] = false; + opDict[0x222B] = false; + opDict[0x222C] = false; + opDict[0x222D] = false; + opDict[0x222E] = false; + opDict[0x222F] = false; + opDict[0x2230] = false; + opDict[0x2231] = false; + opDict[0x2232] = false; + opDict[0x2233] = false; + opDict[0x2234] = false; + opDict[0x2235] = false; + opDict[0x2236] = false; + opDict[0x2237] = false; + opDict[0x2238] = false; + opDict[0x2239] = false; + opDict[0x223A] = false; + opDict[0x223B] = false; + opDict[0x223C] = false; + opDict[0x223D] = false; + opDict[0x223E] = false; + opDict[0x223F] = false; + opDict[0x2240] = false; + opDict[0x2241] = false; + opDict[0x2242] = false; + opDict[0x2243] = false; + opDict[0x2244] = false; + opDict[0x2245] = false; + opDict[0x2246] = false; + opDict[0x2247] = false; + opDict[0x2248] = false; + opDict[0x2249] = false; + opDict[0x224A] = false; + opDict[0x224B] = false; + opDict[0x224C] = false; + opDict[0x224D] = false; + opDict[0x224E] = false; + opDict[0x224F] = false; + opDict[0x2250] = false; + opDict[0x2251] = false; + opDict[0x2252] = false; + opDict[0x2253] = false; + opDict[0x2254] = false; + opDict[0x2255] = false; + opDict[0x2256] = false; + opDict[0x2257] = false; + opDict[0x2258] = false; + opDict[0x2259] = false; + opDict[0x225A] = false; + opDict[0x225C] = false; + opDict[0x225D] = false; + opDict[0x225E] = false; + opDict[0x225F] = false; + opDict[0x2260] = false; + opDict[0x2261] = false; + opDict[0x2262] = false; + opDict[0x2263] = false; + opDict[0x2264] = false; + opDict[0x2265] = false; + opDict[0x2266] = false; + opDict[0x2267] = false; + opDict[0x2268] = false; + opDict[0x2269] = false; + opDict[0x226A] = false; + opDict[0x226B] = false; + opDict[0x226C] = false; + opDict[0x226D] = false; + opDict[0x226E] = false; + opDict[0x226F] = false; + opDict[0x2270] = false; + opDict[0x2271] = false; + opDict[0x2272] = false; + opDict[0x2273] = false; + opDict[0x2274] = false; + opDict[0x2275] = false; + opDict[0x2276] = false; + opDict[0x2277] = false; + opDict[0x2278] = false; + opDict[0x2279] = false; + opDict[0x227A] = false; + opDict[0x227B] = false; + opDict[0x227C] = false; + opDict[0x227D] = false; + opDict[0x227E] = false; + opDict[0x227F] = false; + opDict[0x2280] = false; + opDict[0x2281] = false; + opDict[0x2282] = false; + opDict[0x2283] = false; + opDict[0x2284] = false; + opDict[0x2285] = false; + opDict[0x2286] = false; + opDict[0x2287] = false; + opDict[0x2288] = false; + opDict[0x2289] = false; + opDict[0x228A] = false; + opDict[0x228B] = false; + opDict[0x228C] = false; + opDict[0x228D] = false; + opDict[0x228E] = false; + opDict[0x228F] = false; + opDict[0x2290] = false; + opDict[0x2291] = false; + opDict[0x2292] = false; + opDict[0x2293] = false; + opDict[0x2294] = false; + opDict[0x2295] = false; + opDict[0x2296] = false; + opDict[0x2297] = false; + opDict[0x2298] = false; + opDict[0x2299] = false; + opDict[0x229A] = false; + opDict[0x229B] = false; + opDict[0x229C] = false; + opDict[0x229D] = false; + opDict[0x229E] = false; + opDict[0x229F] = false; + opDict[0x22A0] = false; + opDict[0x22A1] = false; + opDict[0x22A2] = false; + opDict[0x22A3] = false; + opDict[0x22A4] = false; + opDict[0x22A5] = false; + opDict[0x22A6] = false; + opDict[0x22A7] = false; + opDict[0x22A8] = false; + opDict[0x22A9] = false; + opDict[0x22AA] = false; + opDict[0x22AB] = false; + opDict[0x22AC] = false; + opDict[0x22AD] = false; + opDict[0x22AE] = false; + opDict[0x22AF] = false; + opDict[0x22B0] = false; + opDict[0x22B1] = false; + opDict[0x22B2] = false; + opDict[0x22B3] = false; + opDict[0x22B4] = false; + opDict[0x22B5] = false; + opDict[0x22B6] = false; + opDict[0x22B7] = false; + opDict[0x22B8] = false; + opDict[0x22B9] = false; + opDict[0x22BA] = false; + opDict[0x22BB] = false; + opDict[0x22BC] = false; + opDict[0x22BD] = false; + opDict[0x22BE] = false; + opDict[0x22BF] = false; + opDict[0x22C0] = false; + opDict[0x22C1] = false; + opDict[0x22C2] = false; + opDict[0x22C3] = false; + opDict[0x22C4] = false; + opDict[0x22C5] = false; + opDict[0x22C6] = false; + opDict[0x22C7] = false; + opDict[0x22C8] = false; + opDict[0x22C9] = false; + opDict[0x22CA] = false; + opDict[0x22CB] = false; + opDict[0x22CC] = false; + opDict[0x22CD] = false; + opDict[0x22CE] = false; + opDict[0x22CF] = false; + opDict[0x22D0] = false; + opDict[0x22D1] = false; + opDict[0x22D2] = false; + opDict[0x22D3] = false; + opDict[0x22D4] = false; + opDict[0x22D5] = false; + opDict[0x22D6] = false; + opDict[0x22D7] = false; + opDict[0x22D8] = false; + opDict[0x22D9] = false; + opDict[0x22DA] = false; + opDict[0x22DB] = false; + opDict[0x22DC] = false; + opDict[0x22DD] = false; + opDict[0x22DE] = false; + opDict[0x22DF] = false; + opDict[0x22E0] = false; + opDict[0x22E1] = false; + opDict[0x22E2] = false; + opDict[0x22E3] = false; + opDict[0x22E4] = false; + opDict[0x22E5] = false; + opDict[0x22E6] = false; + opDict[0x22E7] = false; + opDict[0x22E8] = false; + opDict[0x22E9] = false; + opDict[0x22EA] = false; + opDict[0x22EB] = false; + opDict[0x22EC] = false; + opDict[0x22ED] = false; + opDict[0x22EE] = false; + opDict[0x22EF] = false; + opDict[0x22F0] = false; + opDict[0x22F1] = false; + opDict[0x22F2] = false; + opDict[0x22F3] = false; + opDict[0x22F4] = false; + opDict[0x22F5] = false; + opDict[0x22F6] = false; + opDict[0x22F7] = false; + opDict[0x22F8] = false; + opDict[0x22F9] = false; + opDict[0x22FA] = false; + opDict[0x22FB] = false; + opDict[0x22FC] = false; + opDict[0x22FD] = false; + opDict[0x22FE] = false; + opDict[0x22FF] = false; + opDict[0x2308] = true; + opDict[0x2309] = true; + opDict[0x230A] = true; + opDict[0x230B] = true; + opDict[0x23B4] = true; + opDict[0x23B5] = true; + opDict[0x23DC] = true; + opDict[0x23DD] = true; + opDict[0x23DE] = true; + opDict[0x23DF] = true; + opDict[0x23E0] = true; + opDict[0x23E1] = true; + opDict[0x25A0] = false; + opDict[0x25A1] = false; + opDict[0x25AA] = false; + opDict[0x25AB] = false; + opDict[0x25AD] = false; + opDict[0x25AE] = false; + opDict[0x25AF] = false; + opDict[0x25B0] = false; + opDict[0x25B1] = false; + opDict[0x25B2] = false; + opDict[0x25B3] = false; + opDict[0x25B4] = false; + opDict[0x25B5] = false; + opDict[0x25B6] = false; + opDict[0x25B7] = false; + opDict[0x25B8] = false; + opDict[0x25B9] = false; + opDict[0x25BC] = false; + opDict[0x25BD] = false; + opDict[0x25BE] = false; + opDict[0x25BF] = false; + opDict[0x25C0] = false; + opDict[0x25C1] = false; + opDict[0x25C2] = false; + opDict[0x25C3] = false; + opDict[0x25C4] = false; + opDict[0x25C5] = false; + opDict[0x25C6] = false; + opDict[0x25C7] = false; + opDict[0x25C8] = false; + opDict[0x25C9] = false; + opDict[0x25CC] = false; + opDict[0x25CD] = false; + opDict[0x25CE] = false; + opDict[0x25CF] = false; + opDict[0x25D6] = false; + opDict[0x25D7] = false; + opDict[0x25E6] = false; + opDict[0x266D] = false; + opDict[0x266E] = false; + opDict[0x266F] = false; + opDict[0x2758] = false; + opDict[0x2772] = true; + opDict[0x2773] = true; + opDict[0x27E6] = true; + opDict[0x27E7] = true; + opDict[0x27E8] = true; + opDict[0x27E9] = true; + opDict[0x27EA] = true; + opDict[0x27EB] = true; + opDict[0x27EC] = true; + opDict[0x27ED] = true; + opDict[0x27EE] = true; + opDict[0x27EF] = true; + opDict[0x27F0] = true; + opDict[0x27F1] = true; + opDict[0x27F5] = true; + opDict[0x27F6] = true; + opDict[0x27F7] = true; + opDict[0x27F8] = true; + opDict[0x27F9] = true; + opDict[0x27FA] = true; + opDict[0x27FB] = true; + opDict[0x27FC] = true; + opDict[0x27FD] = true; + opDict[0x27FE] = true; + opDict[0x27FF] = true; + opDict[0x2900] = false; + opDict[0x2901] = false; + opDict[0x2902] = false; + opDict[0x2903] = false; + opDict[0x2904] = false; + opDict[0x2905] = false; + opDict[0x2906] = false; + opDict[0x2907] = false; + opDict[0x2908] = false; + opDict[0x2909] = false; + opDict[0x290A] = true; + opDict[0x290B] = true; + opDict[0x290C] = true; + opDict[0x290D] = true; + opDict[0x290E] = true; + opDict[0x290F] = true; + opDict[0x2910] = true; + opDict[0x2911] = false; + opDict[0x2912] = true; + opDict[0x2913] = true; + opDict[0x2914] = false; + opDict[0x2915] = false; + opDict[0x2916] = false; + opDict[0x2917] = false; + opDict[0x2918] = false; + opDict[0x2919] = false; + opDict[0x291A] = false; + opDict[0x291B] = false; + opDict[0x291C] = false; + opDict[0x291D] = false; + opDict[0x291E] = false; + opDict[0x291F] = false; + opDict[0x2920] = false; + opDict[0x2921] = true; + opDict[0x2922] = true; + opDict[0x2923] = false; + opDict[0x2924] = false; + opDict[0x2925] = false; + opDict[0x2926] = false; + opDict[0x2927] = false; + opDict[0x2928] = false; + opDict[0x2929] = false; + opDict[0x292A] = false; + opDict[0x292B] = false; + opDict[0x292C] = false; + opDict[0x292D] = false; + opDict[0x292E] = false; + opDict[0x292F] = false; + opDict[0x2930] = false; + opDict[0x2931] = false; + opDict[0x2932] = false; + opDict[0x2933] = false; + opDict[0x2934] = false; + opDict[0x2935] = false; + opDict[0x2936] = false; + opDict[0x2937] = false; + opDict[0x2938] = false; + opDict[0x2939] = false; + opDict[0x293A] = false; + opDict[0x293B] = false; + opDict[0x293C] = false; + opDict[0x293D] = false; + opDict[0x293E] = false; + opDict[0x293F] = false; + opDict[0x2940] = false; + opDict[0x2941] = false; + opDict[0x2942] = false; + opDict[0x2943] = false; + opDict[0x2944] = false; + opDict[0x2945] = false; + opDict[0x2946] = false; + opDict[0x2947] = false; + opDict[0x2948] = false; + opDict[0x2949] = false; + opDict[0x294A] = false; + opDict[0x294B] = false; + opDict[0x294C] = false; + opDict[0x294D] = false; + opDict[0x294E] = true; + opDict[0x294F] = true; + opDict[0x2950] = true; + opDict[0x2951] = true; + opDict[0x2952] = true; + opDict[0x2953] = true; + opDict[0x2954] = true; + opDict[0x2955] = true; + opDict[0x2956] = true; + opDict[0x2957] = true; + opDict[0x2958] = true; + opDict[0x2959] = true; + opDict[0x295A] = true; + opDict[0x295B] = true; + opDict[0x295C] = true; + opDict[0x295D] = true; + opDict[0x295E] = true; + opDict[0x295F] = true; + opDict[0x2960] = true; + opDict[0x2961] = true; + opDict[0x2962] = false; + opDict[0x2963] = false; + opDict[0x2964] = false; + opDict[0x2965] = false; + opDict[0x2966] = false; + opDict[0x2967] = false; + opDict[0x2968] = false; + opDict[0x2969] = false; + opDict[0x296A] = false; + opDict[0x296B] = false; + opDict[0x296C] = false; + opDict[0x296D] = false; + opDict[0x296E] = true; + opDict[0x296F] = true; + opDict[0x2970] = false; + opDict[0x2971] = false; + opDict[0x2972] = false; + opDict[0x2973] = false; + opDict[0x2974] = false; + opDict[0x2975] = false; + opDict[0x2976] = false; + opDict[0x2977] = false; + opDict[0x2978] = false; + opDict[0x2979] = false; + opDict[0x297A] = false; + opDict[0x297B] = false; + opDict[0x297C] = false; + opDict[0x297D] = false; + opDict[0x297E] = false; + opDict[0x297F] = false; + opDict[0x2980] = true; + opDict[0x2981] = false; + opDict[0x2982] = false; + opDict[0x2983] = true; + opDict[0x2984] = true; + opDict[0x2985] = true; + opDict[0x2986] = true; + opDict[0x2987] = true; + opDict[0x2988] = true; + opDict[0x2989] = true; + opDict[0x298A] = true; + opDict[0x298B] = true; + opDict[0x298C] = true; + opDict[0x298D] = true; + opDict[0x298E] = true; + opDict[0x298F] = true; + opDict[0x2990] = true; + opDict[0x2991] = true; + opDict[0x2992] = true; + opDict[0x2993] = true; + opDict[0x2994] = true; + opDict[0x2995] = true; + opDict[0x2996] = true; + opDict[0x2997] = true; + opDict[0x2998] = true; + opDict[0x2999] = false; + opDict[0x299A] = false; + opDict[0x299B] = false; + opDict[0x299C] = false; + opDict[0x299D] = false; + opDict[0x299E] = false; + opDict[0x299F] = false; + opDict[0x29A0] = false; + opDict[0x29A1] = false; + opDict[0x29A2] = false; + opDict[0x29A3] = false; + opDict[0x29A4] = false; + opDict[0x29A5] = false; + opDict[0x29A6] = false; + opDict[0x29A7] = false; + opDict[0x29A8] = false; + opDict[0x29A9] = false; + opDict[0x29AA] = false; + opDict[0x29AB] = false; + opDict[0x29AC] = false; + opDict[0x29AD] = false; + opDict[0x29AE] = false; + opDict[0x29AF] = false; + opDict[0x29B0] = false; + opDict[0x29B1] = false; + opDict[0x29B2] = false; + opDict[0x29B3] = false; + opDict[0x29B4] = false; + opDict[0x29B5] = false; + opDict[0x29B6] = false; + opDict[0x29B7] = false; + opDict[0x29B8] = false; + opDict[0x29B9] = false; + opDict[0x29BA] = false; + opDict[0x29BB] = false; + opDict[0x29BC] = false; + opDict[0x29BD] = false; + opDict[0x29BE] = false; + opDict[0x29BF] = false; + opDict[0x29C0] = false; + opDict[0x29C1] = false; + opDict[0x29C2] = false; + opDict[0x29C3] = false; + opDict[0x29C4] = false; + opDict[0x29C5] = false; + opDict[0x29C6] = false; + opDict[0x29C7] = false; + opDict[0x29C8] = false; + opDict[0x29C9] = false; + opDict[0x29CA] = false; + opDict[0x29CB] = false; + opDict[0x29CC] = false; + opDict[0x29CD] = false; + opDict[0x29CE] = false; + opDict[0x29CF] = false; + opDict[0x29D0] = false; + opDict[0x29D1] = false; + opDict[0x29D2] = false; + opDict[0x29D3] = false; + opDict[0x29D4] = false; + opDict[0x29D5] = false; + opDict[0x29D6] = false; + opDict[0x29D7] = false; + opDict[0x29D8] = false; + opDict[0x29D9] = false; + opDict[0x29DB] = false; + opDict[0x29DC] = false; + opDict[0x29DD] = false; + opDict[0x29DE] = false; + opDict[0x29DF] = false; + opDict[0x29E0] = false; + opDict[0x29E1] = false; + opDict[0x29E2] = false; + opDict[0x29E3] = false; + opDict[0x29E4] = false; + opDict[0x29E5] = false; + opDict[0x29E6] = false; + opDict[0x29E7] = false; + opDict[0x29E8] = false; + opDict[0x29E9] = false; + opDict[0x29EA] = false; + opDict[0x29EB] = false; + opDict[0x29EC] = false; + opDict[0x29ED] = false; + opDict[0x29EE] = false; + opDict[0x29EF] = false; + opDict[0x29F0] = false; + opDict[0x29F1] = false; + opDict[0x29F2] = false; + opDict[0x29F3] = false; + opDict[0x29F4] = false; + opDict[0x29F5] = false; + opDict[0x29F6] = false; + opDict[0x29F7] = false; + opDict[0x29F8] = false; + opDict[0x29F9] = false; + opDict[0x29FA] = false; + opDict[0x29FB] = false; + opDict[0x29FC] = true; + opDict[0x29FD] = true; + opDict[0x29FE] = false; + opDict[0x29FF] = false; + opDict[0x2A00] = false; + opDict[0x2A01] = false; + opDict[0x2A02] = false; + opDict[0x2A03] = false; + opDict[0x2A04] = false; + opDict[0x2A05] = false; + opDict[0x2A06] = false; + opDict[0x2A07] = false; + opDict[0x2A08] = false; + opDict[0x2A09] = false; + opDict[0x2A0A] = false; + opDict[0x2A0B] = false; + opDict[0x2A0C] = false; + opDict[0x2A0D] = false; + opDict[0x2A0E] = false; + opDict[0x2A0F] = false; + opDict[0x2A10] = false; + opDict[0x2A11] = false; + opDict[0x2A12] = false; + opDict[0x2A13] = false; + opDict[0x2A14] = false; + opDict[0x2A15] = false; + opDict[0x2A16] = false; + opDict[0x2A17] = false; + opDict[0x2A18] = false; + opDict[0x2A19] = false; + opDict[0x2A1A] = false; + opDict[0x2A1B] = false; + opDict[0x2A1C] = false; + opDict[0x2A1D] = false; + opDict[0x2A1E] = false; + opDict[0x2A1F] = false; + opDict[0x2A20] = false; + opDict[0x2A21] = false; + opDict[0x2A22] = false; + opDict[0x2A23] = false; + opDict[0x2A24] = false; + opDict[0x2A25] = false; + opDict[0x2A26] = false; + opDict[0x2A27] = false; + opDict[0x2A28] = false; + opDict[0x2A29] = false; + opDict[0x2A2A] = false; + opDict[0x2A2B] = false; + opDict[0x2A2C] = false; + opDict[0x2A2D] = false; + opDict[0x2A2E] = false; + opDict[0x2A2F] = false; + opDict[0x2A30] = false; + opDict[0x2A31] = false; + opDict[0x2A32] = false; + opDict[0x2A33] = false; + opDict[0x2A34] = false; + opDict[0x2A35] = false; + opDict[0x2A36] = false; + opDict[0x2A37] = false; + opDict[0x2A38] = false; + opDict[0x2A39] = false; + opDict[0x2A3A] = false; + opDict[0x2A3B] = false; + opDict[0x2A3C] = false; + opDict[0x2A3D] = false; + opDict[0x2A3E] = false; + opDict[0x2A3F] = false; + opDict[0x2A40] = false; + opDict[0x2A41] = false; + opDict[0x2A42] = false; + opDict[0x2A43] = false; + opDict[0x2A44] = false; + opDict[0x2A45] = false; + opDict[0x2A46] = false; + opDict[0x2A47] = false; + opDict[0x2A48] = false; + opDict[0x2A49] = false; + opDict[0x2A4A] = false; + opDict[0x2A4B] = false; + opDict[0x2A4C] = false; + opDict[0x2A4D] = false; + opDict[0x2A4E] = false; + opDict[0x2A4F] = false; + opDict[0x2A50] = false; + opDict[0x2A51] = false; + opDict[0x2A52] = false; + opDict[0x2A53] = false; + opDict[0x2A54] = false; + opDict[0x2A55] = false; + opDict[0x2A56] = false; + opDict[0x2A57] = false; + opDict[0x2A58] = false; + opDict[0x2A59] = false; + opDict[0x2A5A] = false; + opDict[0x2A5B] = false; + opDict[0x2A5C] = false; + opDict[0x2A5D] = false; + opDict[0x2A5E] = false; + opDict[0x2A5F] = false; + opDict[0x2A60] = false; + opDict[0x2A61] = false; + opDict[0x2A62] = false; + opDict[0x2A63] = false; + opDict[0x2A64] = false; + opDict[0x2A65] = false; + opDict[0x2A66] = false; + opDict[0x2A67] = false; + opDict[0x2A68] = false; + opDict[0x2A69] = false; + opDict[0x2A6A] = false; + opDict[0x2A6B] = false; + opDict[0x2A6C] = false; + opDict[0x2A6D] = false; + opDict[0x2A6E] = false; + opDict[0x2A6F] = false; + opDict[0x2A70] = false; + opDict[0x2A71] = false; + opDict[0x2A72] = false; + opDict[0x2A73] = false; + opDict[0x2A74] = false; + opDict[0x2A75] = false; + opDict[0x2A76] = false; + opDict[0x2A77] = false; + opDict[0x2A78] = false; + opDict[0x2A79] = false; + opDict[0x2A7A] = false; + opDict[0x2A7B] = false; + opDict[0x2A7C] = false; + opDict[0x2A7D] = false; + opDict[0x2A7E] = false; + opDict[0x2A7F] = false; + opDict[0x2A80] = false; + opDict[0x2A81] = false; + opDict[0x2A82] = false; + opDict[0x2A83] = false; + opDict[0x2A84] = false; + opDict[0x2A85] = false; + opDict[0x2A86] = false; + opDict[0x2A87] = false; + opDict[0x2A88] = false; + opDict[0x2A89] = false; + opDict[0x2A8A] = false; + opDict[0x2A8B] = false; + opDict[0x2A8C] = false; + opDict[0x2A8D] = false; + opDict[0x2A8E] = false; + opDict[0x2A8F] = false; + opDict[0x2A90] = false; + opDict[0x2A91] = false; + opDict[0x2A92] = false; + opDict[0x2A93] = false; + opDict[0x2A94] = false; + opDict[0x2A95] = false; + opDict[0x2A96] = false; + opDict[0x2A97] = false; + opDict[0x2A98] = false; + opDict[0x2A99] = false; + opDict[0x2A9A] = false; + opDict[0x2A9B] = false; + opDict[0x2A9C] = false; + opDict[0x2A9D] = false; + opDict[0x2A9E] = false; + opDict[0x2A9F] = false; + opDict[0x2AA0] = false; + opDict[0x2AA1] = false; + opDict[0x2AA2] = false; + opDict[0x2AA3] = false; + opDict[0x2AA4] = false; + opDict[0x2AA5] = false; + opDict[0x2AA6] = false; + opDict[0x2AA7] = false; + opDict[0x2AA8] = false; + opDict[0x2AA9] = false; + opDict[0x2AAA] = false; + opDict[0x2AAB] = false; + opDict[0x2AAC] = false; + opDict[0x2AAD] = false; + opDict[0x2AAE] = false; + opDict[0x2AAF] = false; + opDict[0x2AB0] = false; + opDict[0x2AB1] = false; + opDict[0x2AB2] = false; + opDict[0x2AB3] = false; + opDict[0x2AB4] = false; + opDict[0x2AB5] = false; + opDict[0x2AB6] = false; + opDict[0x2AB7] = false; + opDict[0x2AB8] = false; + opDict[0x2AB9] = false; + opDict[0x2ABA] = false; + opDict[0x2ABB] = false; + opDict[0x2ABC] = false; + opDict[0x2ABD] = false; + opDict[0x2ABE] = false; + opDict[0x2ABF] = false; + opDict[0x2AC0] = false; + opDict[0x2AC1] = false; + opDict[0x2AC2] = false; + opDict[0x2AC3] = false; + opDict[0x2AC4] = false; + opDict[0x2AC5] = false; + opDict[0x2AC6] = false; + opDict[0x2AC7] = false; + opDict[0x2AC8] = false; + opDict[0x2AC9] = false; + opDict[0x2ACA] = false; + opDict[0x2ACB] = false; + opDict[0x2ACC] = false; + opDict[0x2ACD] = false; + opDict[0x2ACE] = false; + opDict[0x2ACF] = false; + opDict[0x2AD0] = false; + opDict[0x2AD1] = false; + opDict[0x2AD2] = false; + opDict[0x2AD3] = false; + opDict[0x2AD4] = false; + opDict[0x2AD5] = false; + opDict[0x2AD6] = false; + opDict[0x2AD7] = false; + opDict[0x2AD8] = false; + opDict[0x2AD9] = false; + opDict[0x2ADA] = false; + opDict[0x2ADB] = false; + opDict[0x2ADD] = false; + opDict[0x2ADE] = false; + opDict[0x2ADF] = false; + opDict[0x2AE0] = false; + opDict[0x2AE1] = false; + opDict[0x2AE2] = false; + opDict[0x2AE3] = false; + opDict[0x2AE4] = false; + opDict[0x2AE5] = false; + opDict[0x2AE6] = false; + opDict[0x2AE7] = false; + opDict[0x2AE8] = false; + opDict[0x2AE9] = false; + opDict[0x2AEA] = false; + opDict[0x2AEB] = false; + opDict[0x2AEC] = false; + opDict[0x2AED] = false; + opDict[0x2AEE] = false; + opDict[0x2AEF] = false; + opDict[0x2AF0] = false; + opDict[0x2AF1] = false; + opDict[0x2AF2] = false; + opDict[0x2AF3] = false; + opDict[0x2AF4] = false; + opDict[0x2AF5] = false; + opDict[0x2AF6] = false; + opDict[0x2AF7] = false; + opDict[0x2AF8] = false; + opDict[0x2AF9] = false; + opDict[0x2AFA] = false; + opDict[0x2AFB] = false; + opDict[0x2AFC] = false; + opDict[0x2AFD] = false; + opDict[0x2AFE] = false; + opDict[0x2AFF] = false; + opDict[0x2B45] = true; + opDict[0x2B46] = true; +} diff --git a/starmath/source/operatorDictionary.hxx b/starmath/source/operatorDictionary.hxx new file mode 100644 index 0000000..a558897 --- /dev/null +++ b/starmath/source/operatorDictionary.hxx @@ -0,0 +1,53 @@ +/* -*- 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 _OPERATORDICTIONARY_HXX_ +#define _OPERATORDICTIONARY_HXX_ + +#include +#include + +// The MathML recommendation contains an Operator Dictionary: +// +// http://www.w3.org/TR/MathML/appendixc.html +// +// Our Operator Dictionary is generated from the "XML Entity Definitions for +// Characters" recommendation. It is relatively big (more than one thousand +// entries) and so we use a hash table for fast access. +// +// Currently, we only use a restricted subset to +// +// - know whether a character is an operator. This is used for NSPECIAL %xxxx +// commands. +// - know whether an operator has a stretchy form (prefix, infix, postfix). +// This is used to attach an explicit stretchy="false" attribute if we don't +// want it to stretch. +// +// Hence the keys of the hash table are the Unicode values of the operators and +// the values are booleans indicating whether operators have at least one +// stretchy form. +// +// See also fdo#66279. +// +void initOperatorDictionary(); +extern ::std::unordered_map< sal_Unicode, bool > opDict; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */