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: */