diff options
author | Narayan Kamath <narayan@google.com> | 2013-10-22 12:54:30 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-10-22 12:54:31 +0000 |
commit | 02545911b6caa33f9ab6ba30c88f2b8197be2a31 (patch) | |
tree | 73378e7789f5643fd27bd4cc97183d6629c3113e | |
parent | 68c2ec9e0acdb3214b7fb91dbab8c9fab8736817 (diff) | |
parent | 70dce01b47b7ef16f67b6bd17ee66fca72b42ef1 (diff) | |
download | tagsoup-02545911b6caa33f9ab6ba30c88f2b8197be2a31.tar.gz |
Merge "Update tagsoup to 1.2.1"idea133-weekly-releaseidea133
-rw-r--r-- | CHANGES | 309 | ||||
-rw-r--r-- | LICENSE (renamed from src/org/ccil/cowan/tagsoup/LICENSE) | 0 | ||||
-rw-r--r-- | MODULE_LICENSE_APACHE2 (renamed from src/org/ccil/cowan/tagsoup/MODULE_LICENSE_APACHE2) | 0 | ||||
-rw-r--r-- | README | 357 | ||||
-rw-r--r-- | README.android | 11 | ||||
-rw-r--r-- | TODO | 18 | ||||
-rw-r--r-- | build.xml | 160 | ||||
-rw-r--r-- | definitions/html.stml | 249 | ||||
-rw-r--r-- | definitions/html.tssl | 2762 | ||||
-rw-r--r-- | src/org/ccil/cowan/tagsoup/GOOGLE_README.txt | 8 | ||||
-rw-r--r-- | src/org/ccil/cowan/tagsoup/HTMLScanner.java | 153 | ||||
-rw-r--r-- | src/org/ccil/cowan/tagsoup/HTMLSchema.java | 824 | ||||
-rw-r--r-- | src/org/ccil/cowan/tagsoup/Parser.java | 2 | ||||
-rw-r--r-- | stml/stml.rnc | 49 | ||||
-rw-r--r-- | stml/stml.xslt | 150 | ||||
-rw-r--r-- | templates/org/ccil/cowan/tagsoup/HTMLModels.java | 31 | ||||
-rw-r--r-- | templates/org/ccil/cowan/tagsoup/HTMLScanner.java | 486 | ||||
-rw-r--r-- | templates/org/ccil/cowan/tagsoup/HTMLSchema.java | 38 | ||||
-rw-r--r-- | tssl/tssl-models.xslt | 47 | ||||
-rw-r--r-- | tssl/tssl-validate.xslt | 40 | ||||
-rw-r--r-- | tssl/tssl.rnc | 75 | ||||
-rw-r--r-- | tssl/tssl.xslt | 220 |
22 files changed, 5521 insertions, 468 deletions
@@ -0,0 +1,309 @@ +Changes from 1.2 to 1.2.1 +========================= +Match DOCTYPE case-blind +Extend PushbackReader's size for oddball cases like & followed by CR +Leo Sutic's 2x-4x speedup by precompiling HTMLScanner table + +Changes from 1.1.3 to 1.2 +========================= +Changed license to Apache 2.0 +Bogon default model is now ANY, not EMPTY +Support new DOCTYPE output switches --doctype-system and --doctype-public +Support new XML declaration output switches --standalone and --version +New --norootbogons switch makes bogons children of the root +Don't resolve entity references in attribute values unless semicolon-terminated +Support character entities above U+FFFF +Add character entities from the 2007-12-14 draft of xml-entity-names +Call SAX events startPrefixMapping and endPrefixMapping to report prefixes +Clean up newline processing, shrinking html.stml considerably +Allow link elements in the body as well as the head, to avoid excess bodies +Allow tables inside paragraphs +Allow cells and forms in thead and tfoot elements without intervening tr element +The span element is no longer restartable +Support non-standard elements bgsound, blink, canvas, comment, listing, + marquee, nobr, ruby, rbc, rtc, rb, rt, rp, wbr, xmp +In HTML mode, boolean attributes like checked are output in minimized form +Correctly handle runs of less-than characters +Suppress all but the first DOCTYPE declaration +Modify PI targets containing colons to have underscores instead +The case of element tags is now canonicalized to the schema +PI targets are no longer forced to lower case + +Changes from 1.1.2 to 1.1.3 +=========================== +Allow Parser.set* methods to accept null +Allow setting the LexicalHandler feature to be null + in both cases means "use default behavior" + +Changes from 1.1.1 to 1.1.2 +=========================== +Setting CDATAElementsFeature didn't really set CDATAElements instance variable + +Changes from 1.1 to 1.1.1 +========================= +Removed lexical handler calls to startCDATA/endCDATA from CDATA element handling +Added lexical handler calls to startCDATA/endCDATA from CDATA section handling +Added CDATAElementsFeature, the programmatic equivalent of the --nocdata switch + +Changes from 1.0.5 to 1.1 +========================= +Add Tatu Saloranta's JAXP support package + +Changes from 1.0.4 to 1.0.5 +=========================== +Major repairs to comment scanning +Skip leading BOM +Comment out debugging code in PYXWriter +Allow &#X as well as &#x +Add net.sf.saxon to list of supported XSLT engines + +Changes from 1.0.4 to 1.0.3 +=========================== +Certain options were mutually exclusive that should not have been +Blocked XML declaration from specifying an encoding of "" +--method=html was not doing the right thing + +Changes from 1.0.3 to 1.0.2 +=========================== +Fixed build file to use Java target version 1.4 +Fixed --version switch to print the right thing + +Changes from 1.0.1 to 1.0.2 +=========================== +Version attribute default value removed from html element +Leading and trailing hyphens now trimmed properly from comments +Added --output-encoding switch to control encoding +If output encoding is Unicode, don't generate character references +Whitespace compressed and junk stripped from public identifiers + +Changes from 1.0 to 1.0.1 +========================= +Added ignorableWhitespaceFeature and --ignorable to report ignorable whitespace + Patch due to David Pashley +Insert spaces to break up -- in comments +Change bogus chars in publicids to spaces +--lexical switch now outputs DOCTYPE if there is one +Remove unnecessary blank line after XML declaration + +Changes from 1.0rc9 to 1.0 +========================== +Added feature to control restartability + Patch due to Nikita Zhuk +Added corresponding --norestart switch in CommandLine +Made translate-colons feature actually work + +Changes from 1.0rc8 to 1.0rc9 +============================= +If there is a publicid but no systemid, set systemid to "" + +Changes from 1.0rc7 to 1.0rc8 +============================= +Fixed paper-bag bug (source didn't match binary in release) + +Changes from 1.0rc6 to 1.0rc7 +============================= +LexicalHandler now gets DOCTYPE information (publicid and systemid) + Patch due to Mike Bremford +HTMLScanner now reports more useful debug output when not commented out + Patch due to Mike Bremford +Change "<memberOfAny>" to exclude "<root>" pseudo-element + This prevents "script" from being output as a root +The shared HTMLParser object has been eliminated + +Changes from 1.0rc5 to 1.0rc6 +============================= +If namespaceFeature is false, uri and localname are passed as empty strings +The namespacePrefixesFeature is now always false +Command line switch --nons no longer affects namespacePrefixesFeature +Command line switch --html now implies --nons +XMLWriter is now told directly to use the schema's URI as default namespace +XMLWriter now takes the element name from the qname if localname is empty + +Changes from 1.0rc4 to 1.0rc5 +============================= +The --nodefault switch now removes only default attributes, not all of them +Added --nocolons switch and translate-colons feature to convert ":" + in names to "_" (thus suppressing namespaces other than the basic one) +The root element can be unknown without problem +Empty <script/> and <style/> tags now work +Added all standard SAX2 features to feature hashtable +Reimplemented namespacePrefixes feature (broken since 1.0rc3) + +Changes from 1.0rc3 to 1.0rc4 +============================= +Remove trailing ? from processing instructions (in case the input is XHTML) +Added Javadocs for all SAX standard and TagSoup-specific features and properties +Fixed termination conditions for entity/character references +Fixed EOF-pushback bug that was generating bogus 񥔵 references +Added Parser feature and --nodefaults switch to ignore default attribute values +Added support for SAX Locator +Updated AFL license to version 3.0 +Scanner buffer size increases as needed, allowing large attribute values +Look for various XSLT implementations as available (still fails in raw 5.0) +Clean up handling of XML empty tags and SGML minimized end-tags +Support proper options and help message internally +Use Hashtable in CommandLine class instead of HashMap +Do proper buffering of InputStream and Reader +Clean up content model of noframes element +Removed htmlMode in XMLWriter +Added support for XSLT output options METHOD=html and OMIT_XML_DECLARATION=yes +Command line option --html sets both of these +Wrote simple validator for TSSL schemas (tssl/tssl-validator.xslt) +Removed various validity problems in html.tssl +When processing a start-tag, don't restart elements that aren't in the new + element's content model +Remove bogus double param in tssl.xslt + +Changes from 1.0rc2 to 1.0rc3 +============================= +Convert CR and CRLF to LF in comments and PIs +Force empty elements to close immediately +Match close tags of CDATA elements more precisely (but case-blind) +Process switches on the command line +Man page available + +Changes from 1.0rc1 to 1.0rc2 +============================= +Isolated & and &# now don't crash parser +TagSoup no longer depends on /dev/stdin existing +Refactored Parser class, removing main method to new CommandLine class +Changes to content models of form, button, table, and tr elements in html.tssl +'</scr' + 'ipt>' in a script element no longer terminates it +Introduced "uncloseability" of form and table elements +"pyxin" property specifies that input is in PYX format +Correctly cope with unexpected characters around colons, also with multiple colons +Correctly output comments with "--" in them (by adding a space) + +Changes from 0.10.2 to 1.0rc1 +============================= +Script can now appear anywhere +Switch -nocdata correctly implemented +Eliminated useless M_n constants in Schema +Introduced <memberofAny> and <isRoot> as alternatives to + <memberOf> in TSSL +Allow prefixes in element names +Attributes are now normalized +Expanded public API for Element and ElementType +Javadoc improved + +Changes from 0.10.1 to 0.10.2 +============================= +Removed misfeature whereby > terminated a tag even inside quotes +Added licensing language to XSLT scripts, RELAX NG schemas +Removed long-standing mishandling of entity references in attributes +Cleaned up logic for converting junky strings to proper XML Names +Correctly handle empty tag that has no whitespace or attributes +Restore correct 0.9.3 handling of an apparent end-tag in a CDATA element +Added script element to content model of head element + +Changes from 0.9.7 to 0.10.1 (there is no 0.10.0): +================================================== +Convert to XSLT configuration exclusively; + Perl code and tab-separated tables are gone +Remove xmlns:* attributes +Append "_" to attribute names ending in ":" +Don't prepend "_" to an attribute name starting in "_" +Handle namespace prefixes in attributes: + "xml" prefix is handled correctly + other prefixes are mapped to "urn:x-prefix:foo" +Ignore XML declarations +-Dnocdata=true turns off F_CDATA on script and style elements +Fixed off-by-one errors in character references that made them uninterpreted +Start-tags ending in a minimized attribute are no longer being dropped +XML empty tags are now supported (though slashes are still allowed in + unquoted attribute values) + +Changes from 0.9.6 to 0.9.7: +============================ +Upgraded AFL to version 2.1 +Passed through newlines in character content (very old bug) + +Changes from 0.9.5 to 0.9.6: +============================ +Script element can appear directly in body +">" terminates a start-tag even inside a quoted attribute, + to protect against unbalanced quotes +"_" is prepended to attributes that don't begin with a letter +Remove "xmlns" attributes from the input +All standard features can now be set + (although there is no effect from doing so) +New "bogons-empty" feature can be set to false to give bogons + content model of ANY rather than EMPTY; + -Dany switch sets this feature to false +TSSL now has an explicit group element to declare an element group +STML is a new XML format for modeling state-table changes +License updated to AFL 2.1 + +Changes from 0.9.4 to 0.9.5: +============================ +S in the statetable now means \r and \n and \t as well as space + (as was always intended; brain fart!) +Ins and del elements are now allowed everywhere +TSSL now correctly supports attributes that are legal on all elements + +Changes from 0.9.3 to 0.9.4: +============================ +Fixed paper-bag bug that revealed attribute type BOOLEAN to applications. +Obsolete ABSTRACT removed in favor of README. +Improved implementation of CDATA restart after bogus end-tag. +Allowed hyphen, underscore, and period in names as well as colon. +First cut at TagSoup Schema Language -- doesn't do anything yet. +Support CDATA sections on input. +Don't generate built-in entities within CDATA elements. + +Changes from 0.9.2 to 0.9.3: +============================ +Convenience main program "tagsoup" in bin directory. +Begin to integrate tests. +Introduced BOOLEAN type (currently just converted to NMTOKEN). +Features that actually work are now named constants in Parser. +Double root elements are really gone now. +ID attributes weren't being removed from restarted elements. +Fixed a bug that made unknown elements disappear in some cases. +Parser is now safely reusable. +PYXWriter and XMLWriter now implement LexicalHandler. +Parser reports comments, startCDATA, and endCDATA events to a LexicalHandler. +ScanHandler methods now throw only SAXException, not also IOException. +-Dlexical=true switch sets the ContentHandler as a LexicalHandler as well + (XMLWriter prints comments, ignores CDATA sections; PYXWriter ignores all). +-Dreuse=true switch reuses a single Parser object (no great speed gain). +We now disallow an a element as the child of another a element. +An empty input is now treated as zero-length character content. +HTMLWriter is gone in favor of an extended XMLWriter with get/setHTMLMode methods. +CDATA elements only terminaate with matching end-tags (thanks to Sebastien Bardoux). + +Changes from 0.9.1 to 0.9.2: +============================ +No longer inserts bogus ; after unknown entity reference without ;. +Consecutive entity references now work correctly. +Setting namespaces and namespace-prefixes methods now works. +-Dnons=true option turns off namespace and prefix. +New feature http://www.ccil.org/~cowan/tagsoup/features/ignore-bogons" + suppresses unknown start-tags (any end-tag will be automatically ignored). +-Dnobogons=true option turns ignore-bogons on. +Suppress unknown and/or empty initial start-tag always + (prevents double root element). +Schema now allows style as an inline element, like script. +Schema now allows tr as a child of table to avoid problems with embedded tables. +Clear Parser instance variables to make Parsers properly reusable. + +Changes from 0.9 to 0.9.1: +========================== +Incorporated patch for -jar support by Joseph Walton. +Incorporated patch for Megginson XMLWriter support by Joseph Walton. +Changed existing XMLWriter to HTMLWriter. +Rewrote Parsermain for better features, removed Tester class. +-Dnewline=true removed, now implied by -DHTML=true. +-Dfiles=true now used to generate separate outputs (old Tester behavior) + with extension xhtml (removing any old extension). +Fixed nasty bug in HTMLScanner that was failing to fix unusual entities. +Don't attempt to smash whitespace to spaces any more. + +Changes from 0.8 to 0.9: +======================== +Ant-ified by Martin Rademacher. +Don't suppress colons in element names. +Entity problems fixed (I hope). +Can now set namespace and namespace-prefixes features (without effect). +Properly templatize HTMLModels.java. +Attributes are no longer in the HTML namespace. diff --git a/src/org/ccil/cowan/tagsoup/LICENSE b/LICENSE index 261eeb9..261eeb9 100644 --- a/src/org/ccil/cowan/tagsoup/LICENSE +++ b/LICENSE diff --git a/src/org/ccil/cowan/tagsoup/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2 index e69de29..e69de29 100644 --- a/src/org/ccil/cowan/tagsoup/MODULE_LICENSE_APACHE2 +++ b/MODULE_LICENSE_APACHE2 @@ -0,0 +1,357 @@ + TagSoup - Just Keep On Truckin' + + Introduction + + This is the home page of TagSoup, a SAX-compliant parser written in + Java that, instead of parsing well-formed or valid XML, parses HTML as + it is found in the wild: [1]poor, nasty and brutish, though quite often + far from short. TagSoup is designed for people who have to process this + stuff using some semblance of a rational application design. By + providing a SAX interface, it allows standard XML tools to be applied + to even the worst HTML. TagSoup also includes a command-line processor + that reads HTML files and can generate either clean HTML or well-formed + XML that is a close approximation to XHTML. + + This is also the README file packaged with TagSoup. + + TagSoup is free and Open Source software. As of version 1.2, it is + licensed under the [2]Apache License, Version 2.0, which allows + proprietary re-use as well as use with GPL 3.0 or GPL 2.0-or-later + projects. (If anyone needs a GPL 2.0 license for a GPL 2.0-only + project, feel free to ask.) + + Warning: TagSoup will not build on stock Java 5.x or 6.x! + + Due to a bug in the versions of Xalan shipped with Java 5.x and 6.x, + TagSoup will not build out of the box. You need to retrieve [3]Saxon + 6.5.5, which does not have the bug. Unpack the zipfile in an empty + directory and copy the saxon.jar and saxon-xml-apis.jar files to + $ANT_HOME/lib. The Ant build process for TagSoup will then notice that + Saxon is available and use it instead. + + TagSoup 1.2 released + + There are a great many changes, most of them fixes for long-standing + bugs, in this release. Only the most important are listed here; for the + rest, see the CHANGES file in the source distribution. Very special + thanks to Jojo Dijamco, whose intensive efforts at debugging made this + release a usable upgrade rather than a useless mass of undetected bugs. + * As noted above, I have changed the license to Apache 2.0. + * The default content model for bogons (unknown elements) is now ANY + rather than EMPTY. This is a breaking change, which I have done + only because there was so much demand for it. It can be undone on + the command line with the --emptybogons switch, or programmatically + with parser.setFeature(Parser.emptyBogonsFeature, true). + * The processing of entity references in attribute values has finally + been fixed to do what browsers do. That is, a reference is only + recognized if it is properly terminated by a semicolon; otherwise + it is treated as plain text. This means that URIs like + foo?cdown=32&cup=42 are no longer seen as containing an instance of + the )U character (whose name happens to be cup). + * Several new switches have been added: + + --doctype-system and --doctype-public force a DOCTYPE + declaration to be output and allow setting the system and + public identifiers. + + --standalone and --version allow control of the XML + declaration that is output. (Note that TagSoup's XML output is + always version 1.0, even if you use --version=1.1.) + + --norootbogons causes unknown elements not to be allowed as + the document root element. Instead, they are made children of + the default root element (the html element for HTML). + * The TagSoup core now supports character entities with values above + U+FFFF. As a consequence, the HTML schema now supports all 2,210 + standard character entities from the [4]2007-12-14 draft of XML + Entity Definitions for Characters, except the 94 which require more + than one Unicode character to represent. + * The SAX events startPrefixMapping and endPrefixMapping are now + being reported for all cases of foreign elements and attributes. + * All bugs around newline processing on Windows should now be gone. + * A number of content models have been loosened to allow elements to + appear in new and non-standard (but commonly found) places. In + particular, tables are now allowed inside paragraphs, against the + letter of the W3C specification. + * Since the span element is intended for fine control of appearance + using CSS, it should never have been a restartable element. This + very long-standing bug has now been fixed. + * The following non-standard elements are now at least partly + supported: bgsound, blink, canvas, comment, listing, marquee, nobr, + rbc, rb, rp, rtc, rt, ruby, wbr, xmp. + * In HTML output mode, boolean attributes like checked are now output + as such, rather than in XML style as checked="checked". + * Runs of < characters such as << and <<< are now handled correctly + in text rather than being transformed into extremely bogus + start-tags. + + [5]Download the TagSoup 1.2 jar file here. It's about 87K long. + [6]Download the full TagSoup 1.2 source here. If you don't have zip, + you can use jar to unpack it. + [7]Download the current CHANGES file here. + + TagSoup 1.1 released + + TagSoup 1.1 adds Tatu Saloranta's JAXP support for TagSoup. To use + TagSoup within the JAXP framework (which is not something I necessarily + recommend, but it is part of the Java XML platform), you can create a + SAXParser by calling + org.ccil.cowan.tagsoup.jaxp.SAXParserImpl.newInstance(). You can also + set the system property javax.xml.parsers.SAXParserFactory to + org.ccil.cowan.tagsoup.jaxp.SAXFactoryImpl, but be aware that doing + this will cause all JAXP-based XML parsing to go through TagSoup, which + is a Bad Thing if your application also reads XML documents. + + What TagSoup does + + TagSoup is designed as a parser, not a whole application; it isn't + intended to permanently clean up bad HTML, as [8]HTML Tidy does, only + to parse it on the fly. Therefore, it does not convert presentation + HTML to CSS or anything similar. It does guarantee well-structured + results: tags will wind up properly nested, default attributes will + appear appropriately, and so on. + + The semantics of TagSoup are as far as practical those of actual HTML + browsers. In particular, never, never will it throw any sort of syntax + error: the TagSoup motto is [9]"Just Keep On Truckin'". But there's + much, much more. For example, if the first tag is LI, it will supply + the application with enclosing HTML, BODY, and UL tags. Why UL? Because + that's what browsers assume in this situation. For the same reason, + overlapping tags are correctly restarted whenever possible: text like: +This is <B>bold, <I>bold italic, </b>italic, </i>normal text + + gets correctly rewritten as: +This is <b>bold, <i>bold italic, </i></b><i>italic, </i>normal text. + + By intention, TagSoup is small and fast. It does not depend on the + existence of any framework other than SAX, and should be able to work + with any framework that can accept SAX parsers. In particular, [10]XOM + is known to work. + + You can replace the low-level HTML scanner with one based on Sean + McGrath's [11]PYX format (very close to James Clark's ESIS format). You + can also supply an AutoDetector that peeks at the incoming byte stream + and guesses a character encoding for it. Otherwise, the platform + default is used. If you need an autodetector of character sets, + consider trying to adapt the [12]Mozilla one; if you succeed, let me + know. + + Note: TagSoup in Java 1.1 + + If you go through the TagSoup source and replace all references to + HashMap with Hashtable and recompile, TagSoup will work fine in Java + 1.1 VMs. Thanks to Thorbjørn Vinne for this discovery. + + The TSaxon XSLT-for-HTML processor + + [13]I am also distributing [14]TSaxon, a repackaging of version 6.5.5 + of Michael Kay's Saxon XSLT version 1.0 implementation that includes + TagSoup. TSaxon is a drop-in replacement for Saxon, and can be used to + process either HTML or XML documents with XSLT stylesheets. + + TagSoup as a stand-alone program + + It is possible to run TagSoup as a program by saying java -jar + tagsoup-1.0.1 [option ...] [file ...]. Files mentioned on the command + line will be parsed individually. If no files are specified, the + standard input is read. + + The following options are understood: + + --files + Output into individual files, with html extensions changed to + xhtml. Otherwise, all output is sent to the standard output. + + --html + Output is in clean HTML: the XML declaration is suppressed, as + are end-tags for the known empty elements. + + --omit-xml-declaration + The XML declaration is suppressed. + + --method=html + End-tags for the known empty HTML elements are suppressed. + + --doctype-system=systemid + Forces the output of a DOCTYPE declaration with the specified + systemid. + + --doctype-public=publicid + Forces the output of a DOCTYPE declaration with the specified + publicid. + + --version=version + Sets the version string in the XML declaration. + + --standalone=[yes|no] + Sets the standalone declaration to yes or no. + + --pyx + Output is in PYX format. + + --pyxin + Input is in PYXoid format (need not be well-formed). + + --nons + Namespaces are suppressed. Normally, all elements are in the + XHTML 1.x namespace, and all attributes are in no namespace. + + --nobogons + Bogons (unknown elements) are suppressed. + + --nodefaults + suppress default attribute values + + --nocolons + change explicit colons in element and attribute names to + underscores + + --norestart + don't restart any normally restartable elements + + --ignorable + output whitespace in elements with element-only content + + --emptybogons + Bogons are given a content model of EMPTY rather than ANY. + + --any + Bogons are given a content model of ANY rather than EMPTY + (default). + + --norootbogons + Don't allow bogons to be root elements; make them subordinate to + the root. + + --lexical + Pass through HTML comments and DOCTYPE declarations. Has no + effect when output is in PYX format. + + --reuse + Reuse a single instance of TagSoup parser throughout. Normally, + a new one is instantiated for each input file. + + --nocdata + Change the content models of the script and style elements to + treat them as ordinary #PCDATA (text-only) elements, as in + XHTML, rather than with the special CDATA content model. + + --encoding=encoding + Specify the input encoding. The default is the Java platform + default. + + --output-encoding=encoding + Specify the output encoding. The default is the Java platform + default. + + --help + Print help. + + --version + Print the version number. + + SAX features and properties + + TagSoup supports the following SAX features in addition to the standard + ones: + + http://www.ccil.org/~cowan/tagsoup/features/ignore-bogons + A value of "true" indicates that the parser will ignore unknown + elements. + + http://www.ccil.org/~cowan/tagsoup/features/bogons-empty + A value of "true" indicates that the parser will give unknown + elements a content model of EMPTY; a value of "false", a content + model of ANY. + + http://www.ccil.org/~cowan/tagsoup/features/root-bogons + A value of "true" indicates that the parser will allow unknown + elements to be the root of the output document. + + http://www.ccil.org/~cowan/tagsoup/features/default-attributes + A value of "true" indicates that the parser will return default + attribute values for missing attributes that have default + values. + + http://www.ccil.org/~cowan/tagsoup/features/translate-colons + A value of "true" indicates that the parser will translate + colons into underscores in names. + + http://www.ccil.org/~cowan/tagsoup/features/restart-elements + A value of "true" indicates that the parser will attempt to + restart the restartable elements. + + http://www.ccil.org/~cowan/tagsoup/features/ignorable-whitespace + A value of "true" indicates that the parser will transmit + whitespace in element-only content via the SAX + ignorableWhitespace callback. Normally this is not done, because + HTML is an SGML application and SGML suppresses such whitespace. + + http://www.ccil.org/~cowan/tagsoup/features/cdata-elements + A value of "true" indicates that the parser will process the + script and style elements (or any elements with type='cdata' in + the TSSL schema) as SGML CDATA elements (that is, no markup is + recognized except the matching end-tag). + + TagSoup supports the following SAX properties in addition to the + standard ones: + + http://www.ccil.org/~cowan/tagsoup/properties/scanner + Specifies the Scanner object this parser uses. + + http://www.ccil.org/~cowan/tagsoup/properties/schema + Specifies the Schema object this parser uses. + + http://www.ccil.org/~cowan/tagsoup/properties/auto-detector + Specifies the AutoDetector (for encoding detection) this parser + uses. + + More information + + I gave a presentation (a nocturne, so it's not on the schedule) at + [15]Extreme Markup Languages 2004 about TagSoup, updated from the one + presented in 2002 at the New York City XML SIG and at XML 2002. This is + the main high-level documentation about how TagSoup works. Formats: + [16]OpenDocument [17]Powerpoint [18]PDF. + + I also had people add [19]"evil" HTML to a large poster so that I could + [20]clean it up; View Source is probably more useful than ordinary + browsing. The original instructions were: + + SOUPE DE BALISES (BE EVIL)! + Ecritez une balise ouvrante (sans attributs) + ou fermante HTML ici, s.v.p. + + There is a [21]tagsoup-friends mailing list hosted at [22]Yahoo Groups. + You can [23]join via the Web, or by sending a blank email to + [24]tagsoup-friends-subscribe@yahoogroups.com. The [25]archives are + open to all. + + Online TagSoup processing for publicly accessible HTML documents is now + [26]available courtesy of Leigh Dodds. + +References + + 1. http://oregonstate.edu/instruct/phl302/texts/hobbes/leviathan-c.html + 2. http://opensource.org/licenses/apache2.0.php + 3. http://prdownloads.sourceforge.net/saxon/saxon6-5-5.zip + 4. http://www.w3.org/TR/2007/WD-xml-entity-names-20071214 + 5. http://home.ccil.org/~cowan/XML/tagsoup/tagsoup-1.2.jar + 6. http://home.ccil.org/~cowan/XML/tagsoup/tagsoup-1.2-src.zip + 7. http://home.ccil.org/~cowan/XML/tagsoup/CHANGES + 8. http://tidy.sf.net/ + 9. http://www.crumbmuseum.com/truckin.html + 10. http://www.cafeconleche.org/XOM + 11. http://gnosis.cx/publish/programming/xml_matters_17.html + 12. http://jchardet.sourceforge.net/ + 13. http://www.ccil.org/~cowan + 14. http://home.ccil.org/~cowan/XML/tagsoup/tsaxon + 15. http://www.extrememarkup.com/extreme/2004 + 16. http://home.ccil.org/~cowan/XML/tagsoup/tagsoup.odp + 17. http://home.ccil.org/~cowan/XML/tagsoup/tagsoup.ppt + 18. http://home.ccil.org/~cowan/XML/tagsoup/tagsoup.pdf + 19. http://home.ccil.org/~cowan/XML/tagsoup/extreme.html + 20. http://home.ccil.org/~cowan/XML/tagsoup/extreme.xhtml + 21. http://groups.yahoo.com/group/tagsoup-friends + 22. http://groups.yahoo.com/ + 23. http://groups.yahoo.com/group/tagsoup-friends/join + 24. mailto:tagsoup-friends-subscribe@yahoogroups.com + 25. http://groups.yahoo.com/group/tagsoup-friends/messages + 26. http://xmlarmyknife.org/docs/xhtml/tagsoup/ diff --git a/README.android b/README.android new file mode 100644 index 0000000..a296375 --- /dev/null +++ b/README.android @@ -0,0 +1,11 @@ +This is TagSoup 1.2.1, downloaded from http://ccil.org/~cowan/XML/tagsoup/ + +To get the java files included here: +- download tagsoup +- unzip it +- cd into the tagsoup directory +- Install saxon 6.5.5 and copy saxon.jar and saxon-xml-apis.jar files to $ANT_HOME/lib +- run ant +- copy the files in src/java and tmp/src + +Updated on Oct 21, 2013 from tagsoup 1.2. @@ -0,0 +1,18 @@ +Consider having elements that suppress reopening +Handle namespace declarations semi-properly +Squelch namespaces better in --nons mode +Clean systemids as well as publicids + +Notice: It's quite possible that none of these features will ever be +implemented. If you'd like to implement one yourself, feel free to send +me a patch. + +Flag added parent elements with a special attribute +Allow case sensitivity as a standard feature +Make use of the pseudo-comment in a script element to suppress close-tag detection +Allow inline cruft in table bodies and rows + (Don't break up tables, ever?) + (Don't break up forms, ever, either?) +Suppress start-tags for some restartable elements if the element + is already on the stack (<b><b> is the same as <b>) +Combine consecutive body elements diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..1aa21d4 --- /dev/null +++ b/build.xml @@ -0,0 +1,160 @@ +<!-- +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +--> + +<project name="tagsoup" default="dist"> + + <!-- generic properties --> + <property file="etc/build/build.properties"/> + <!-- additional tasks --> + <taskdef file="etc/build/taskdefs.txt" classpath="bin"/> + + <available property="transformer.factory" + classname="com.icl.saxon.TransformerFactoryImpl" + value="com.icl.saxon.TransformerFactoryImpl"/> + <available property="transformer.factory" + classname="net.sf.saxon.TransformerFactoryImpl" + value="net.sf.saxon.TransformerFactoryImpl"/> + <available property="transformer.factory" + classname="org.apache.xalan.processor.TransformerFactoryImpl" + value="org.apache.xalan.processor.TransformerFactoryImpl"/> + <available property="transformer.factory" + classname="com.sun.org.apache.xalan.processor.TransformerFactoryImpl" + value="com.sun.org.apache.xalan.processor.TransformerFactoryImpl"/> + + <!-- some folder settings --> + <property name="bin" value="bin"/> + <property name="src" value="src"/> + <property name="build" value="build"/> + <property name="dist" value="dist"/> + <property name="docs" value="docs"/> + <property name="tmp" value="tmp"/> + + + <!-- initialize project --> + <target name="init" description="Init project."> + <tstamp/> + </target> + + + <!-- ensure needed folders are available --> + <target name="prepare" description="Set up folders."> + <mkdir dir="${build}"/> + <mkdir dir="${tmp}"/> + </target> + + <!-- Build a distribution jar file --> + <target name="dist" depends="init,compile" + description="Build a binary distribution file."> + <antcall target="jar-release"> + <param name="buildDir" value="build"/> + <param name="version" value="${tagsoup.version}"/> + </antcall> + </target> + + + <target name="jar-release" depends="init" + description="Build a release jar file."> + <mkdir dir="${dist}/lib" /> + <jar jarfile="${dist}/lib/tagsoup-${tagsoup.version}.jar" basedir="${buildDir}"> + <manifest> + <attribute name="Version" value="${tagsoup.version}"/> + <attribute name="Main-Class" value="org.ccil.cowan.tagsoup.CommandLine"/> + </manifest> + </jar> + </target> + + + <!-- compile java sources --> + <target name="compile" depends="init,prepare,build-parser" + description="Compile java classes."> + <javac source="1.4" target="1.4" srcdir="${src}/java" destdir="${build}" deprecation="on" verbose="off" debug="on"> + <src path="${src}/java"/> + <src path="${tmp}/src"/> + </javac> + </target> + +<!-- prepare generation of the parser classes based on the definition files --> + <target depends="init,prepare" description="Prepare generation of parser classes." name="prepare-parser"> + + <echo> + Using ${transformer.factory} as the TransformerFactory + </echo> + + <xslt in="${src}/definitions/html.tssl" out="${tmp}/HTMLModels.i" +style="tssl/tssl-models.xslt"> + <factory name="${transformer.factory}"/> + </xslt> + <xslt in="${src}/definitions/html.tssl" out="${tmp}/HTMLSchema.i" +style="tssl/tssl.xslt"> + <factory name="${transformer.factory}"/> + </xslt> + <xslt in="${src}/definitions/html.stml" out="${tmp}/HTMLScanner.i" +style="stml/stml.xslt"> + <factory name="${transformer.factory}"/> + </xslt> + </target> + + + + <!-- patch the parser class files --> + <target name="build-parser" depends="prepare-parser" + description="Generate parser class files."> + <property name="parser.pkg-path" value="org/ccil/cowan/tagsoup"/> + <mkdir dir="${tmp}/src/${parser.pkg-path}"/> + <antcall target="patch-file"> + <param name="file-pref" value="HTMLModels"/> + <param name="token" value="MODEL_DEFINITIONS"/> + </antcall> + <antcall target="patch-file"> + <param name="file-pref" value="HTMLSchema"/> + <param name="token" value="SCHEMA_CALLS"/> + </antcall> + <antcall target="patch-file"> + <param name="file-pref" value="HTMLScanner"/> + <param name="token" value="STATE_TABLE"/> + </antcall> + </target> + + + <!-- patch one parser class file --> + <target name="patch-file" depends="" description="Patch a parser class file."> + <copy file="${src}/templates/${parser.pkg-path}/${file-pref}.java" toDir="${tmp}/src/${parser.pkg-path}"/> + <loadfile property="patch" srcFile="${tmp}/${file-pref}.i"/> + <replace file="${tmp}/src/${parser.pkg-path}/${file-pref}.java" token="@@${token}@@" value="${patch}"/> + </target> + + <!-- clean up the mess --> + <target name="clean" description="Clean up folders."> + <delete dir="${build}"/> + <delete dir="${tmp}"/> + <delete dir="${docs}"/> + <delete dir="${dist}"/> + </target> + + + <!-- generate javadoc for the java classes --> + <target name="docs-api" depends="init" + description="Generate javadoc documentation."> + <mkdir dir="${docs}/api"/> + <javadoc packagenames="org.*" + sourcepath="${src}/java" destdir="${docs}/api" + use="true" + windowtitle="TagSoup ${tagsoup.version} API"> + <doctitle><![CDATA[<h1>TagSoup Package Documentation</h1>]]></doctitle> + <bottom><![CDATA[<em>Licence</em>: <strong>Academic Free License 3.0</strong> and/or <strong>GPL 2.0</strong>]]></bottom> + </javadoc> + </target> + +</project> diff --git a/definitions/html.stml b/definitions/html.stml new file mode 100644 index 0000000..4cab973 --- /dev/null +++ b/definitions/html.stml @@ -0,0 +1,249 @@ +<!-- +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +--> + +<statetable xmlns='http://www.ccil.org/~cowan/XML/tagsoup/stml' + version='1.0'> + + <symbol id='EOF'/> + <symbol id='S'/> + <symbol id='default'/> + + <action id='A_ADUP'/> + <action id='A_ADUP_SAVE'/> + <action id='A_ADUP_STAGC'/> + <action id='A_ANAME'/> + <action id='A_ANAME_ADUP_STAGC'/> + <action id='A_AVAL'/> + <action id='A_AVAL_STAGC'/> + <action id='A_CDATA'/> + <action id='A_CMNT'/> + <action id='A_DECL'/> + <action id='A_ENTITY'/> + <action id='A_ENTITY_START'/> + <action id='A_ETAG'/> + <action id='A_EMPTYTAG'/> + <action id='A_ANAME_ADUP'/> + <action id='A_GI'/> + <action id='A_GI_STAGC'/> + <action id='A_LT'/> + <action id='A_LT_PCDATA'/> + <action id='A_MINUS'/> + <action id='A_MINUS2'/> + <action id='A_MINUS3'/> + <action id='A_PCDATA'/> + <action id='A_PI'/> + <action id='A_PITARGET'/> + <action id='A_PITARGET_PI'/> + <action id='A_SAVE'/> + <action id='A_SKIP'/> + <action id='A_SP'/> + <action id='A_STAGC'/> + <action id='A_UNGET'/> + <action id='A_UNSAVE_PCDATA'/> + + <state id='S_ANAME'> + <tr symbol='default' action='A_SAVE' newstate='S_ANAME'/> + <tr char='=' action='A_ANAME' newstate='S_AVAL'/> + <tr char='>' action='A_ANAME_ADUP_STAGC' newstate='S_PCDATA'/> + <tr char='/' action='A_ANAME_ADUP' newstate='S_EMPTYTAG'/> + <tr symbol='EOF' action='A_ANAME_ADUP_STAGC' newstate='S_DONE'/> + <tr symbol='S' action='A_ANAME' newstate='S_EQ'/> + </state> + <state id='S_APOS'> + <tr symbol='default' action='A_SAVE' newstate='S_APOS'/> + <tr char=''' action='A_AVAL' newstate='S_TAGWS'/> + <tr symbol='EOF' action='A_AVAL_STAGC' newstate='S_DONE'/> + <tr symbol='S' action='A_SP' newstate='S_APOS'/> + </state> + <state id='S_AVAL'> + <tr symbol='default' action='A_SAVE' newstate='S_STAGC'/> + <tr char='"' action='A_SKIP' newstate='S_QUOT'/> + <tr char=''' action='A_SKIP' newstate='S_APOS'/> + <tr char='>' action='A_AVAL_STAGC' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_AVAL_STAGC' newstate='S_DONE'/> + <tr symbol='S' action='A_SKIP' newstate='S_AVAL'/> + </state> + <state id='S_CDATA'> + <tr symbol='default' action='A_SAVE' newstate='S_CDATA'/> + <tr char='<' action='A_SAVE' newstate='S_CDATA2'/> + <tr symbol='EOF' action='A_PCDATA' newstate='S_DONE'/> + </state> + <state id='S_CDATA2'> + <tr symbol='default' action='A_SAVE' newstate='S_CDATA'/> + <tr char='/' action='A_UNSAVE_PCDATA' newstate='S_ETAG'/> + <tr symbol='EOF' action='A_UNSAVE_PCDATA' newstate='S_DONE'/> + </state> + <state id='S_COM'> + <tr symbol='default' action='A_SAVE' newstate='S_COM2'/> + <tr char='-' action='A_SKIP' newstate='S_COM2'/> + <tr symbol='EOF' action='A_CMNT' newstate='S_DONE'/> + </state> + <state id='S_COM2'> + <tr symbol='default' action='A_SAVE' newstate='S_COM2'/> + <tr char='-' action='A_SKIP' newstate='S_COM3'/> + <tr symbol='EOF' action='A_CMNT' newstate='S_DONE'/> + </state> + <state id='S_COM3'> + <tr symbol='default' action='A_MINUS' newstate='S_COM2'/> + <tr char='-' action='A_SKIP' newstate='S_COM4'/> + <tr symbol='EOF' action='A_CMNT' newstate='S_DONE'/> + </state> + <state id='S_COM4'> + <tr symbol='default' action='A_MINUS2' newstate='S_COM2'/> + <tr char='-' action='A_MINUS3' newstate='S_COM4'/> + <tr char='>' action='A_CMNT' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_CMNT' newstate='S_DONE'/> + </state> + <state id='S_DECL'> + <tr symbol='default' action='A_SAVE' newstate='S_DECL2'/> + <tr char='-' action='A_SKIP' newstate='S_COM'/> + <tr char='[' action='A_SKIP' newstate='S_BB'/> + <tr char='>' action='A_SKIP' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_DECL2'> + <tr symbol='default' action='A_SAVE' newstate='S_DECL2'/> + <tr char='>' action='A_DECL' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_ENT'> + <tr symbol='default' action='A_ENTITY' newstate='S_ENT'/> + <tr symbol='EOF' action='A_ENTITY' newstate='S_DONE'/> + </state> + <state id='S_EQ'> + <tr symbol='default' action='A_ADUP_SAVE' newstate='S_ANAME'/> + <tr char='=' action='A_SKIP' newstate='S_AVAL'/> + <tr char='>' action='A_ADUP_STAGC' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_ADUP_STAGC' newstate='S_DONE'/> + <tr symbol='S' action='A_SKIP' newstate='S_EQ'/> + </state> + <state id='S_ETAG'> + <tr symbol='default' action='A_SAVE' newstate='S_ETAG'/> + <tr char='>' action='A_ETAG' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_ETAG' newstate='S_DONE'/> + <tr symbol='S' action='A_SKIP' newstate='S_ETAG'/> + </state> + <state id='S_GI'> + <tr symbol='default' action='A_SAVE' newstate='S_GI'/> + <tr char='/' action='A_SKIP' newstate='S_EMPTYTAG'/> + <tr char='>' action='A_GI_STAGC' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + <tr symbol='S' action='A_GI' newstate='S_TAGWS'/> + </state> + <state id='S_NCR'> + <tr symbol='default' action='A_ENTITY' newstate='S_NCR'/> + <tr symbol='EOF' action='A_ENTITY' newstate='S_DONE'/> + </state> + <state id='S_XNCR'> + <tr symbol='default' action='A_ENTITY' newstate='S_XNCR'/> + <tr symbol='EOF' action='A_ENTITY' newstate='S_DONE'/> + </state> + <state id='S_PCDATA'> + <tr symbol='default' action='A_SAVE' newstate='S_PCDATA'/> + <tr char='&' action='A_ENTITY_START' newstate='S_ENT'/> + <tr char='<' action='A_PCDATA' newstate='S_TAG'/> + <tr symbol='EOF' action='A_PCDATA' newstate='S_DONE'/> + </state> + <state id='S_PI'> + <tr symbol='default' action='A_SAVE' newstate='S_PI'/> + <tr char='>' action='A_PI' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_PI' newstate='S_DONE'/> + </state> + <state id='S_PITARGET'> + <tr symbol='default' action='A_SAVE' newstate='S_PITARGET'/> + <tr char='>' action='A_PITARGET_PI' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_PITARGET_PI' newstate='S_DONE'/> + <tr symbol='S' action='A_PITARGET' newstate='S_PI'/> + </state> + <state id='S_QUOT'> + <tr symbol='default' action='A_SAVE' newstate='S_QUOT'/> + <tr char='"' action='A_AVAL' newstate='S_TAGWS'/> + <tr symbol='EOF' action='A_AVAL_STAGC' newstate='S_DONE'/> + <tr symbol='S' action='A_SP' newstate='S_QUOT'/> + </state> + <state id='S_STAGC'> + <tr symbol='default' action='A_SAVE' newstate='S_STAGC'/> + <tr char='>' action='A_AVAL_STAGC' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_AVAL_STAGC' newstate='S_DONE'/> + <tr symbol='S' action='A_AVAL' newstate='S_TAGWS'/> + </state> + <state id='S_TAG'> + <tr symbol='default' action='A_SAVE' newstate='S_GI'/> + <tr char='!' action='A_SKIP' newstate='S_DECL'/> + <tr char='/' action='A_SKIP' newstate='S_ETAG'/> + <tr char='?' action='A_SKIP' newstate='S_PITARGET'/> + <tr char='<' action='A_SAVE' newstate='S_TAG'/> + <tr symbol='EOF' action='A_LT_PCDATA' newstate='S_DONE'/> + <tr symbol='S' action='A_LT' newstate='S_PCDATA'/> + </state> + <state id='S_TAGWS'> + <tr symbol='default' action='A_SAVE' newstate='S_ANAME'/> + <tr char='/' action='A_SKIP' newstate='S_EMPTYTAG'/> + <tr char='>' action='A_STAGC' newstate='S_PCDATA'/> + <tr symbol='EOF' action='A_STAGC' newstate='S_DONE'/> + <tr symbol='S' action='A_SKIP' newstate='S_TAGWS'/> + </state> + <state id='S_EMPTYTAG'> + <tr symbol='S' action='A_SKIP' newstate='S_TAGWS'/> + <tr symbol='default' action='A_SAVE' newstate='S_ANAME'/> + <tr char='>' action='A_EMPTYTAG' newstate='S_PCDATA'/> + </state> + <state id='S_BB'> + <tr char='C' action='A_SKIP' newstate='S_BBC'/> + <tr symbol='default' action='A_SKIP' newstate='S_DECL'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_BBC'> + <tr char='D' action='A_SKIP' newstate='S_BBCD'/> + <tr symbol='default' action='A_SKIP' newstate='S_DECL'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_BBCD'> + <tr char='A' action='A_SKIP' newstate='S_BBCDA'/> + <tr symbol='default' action='A_SKIP' newstate='S_DECL'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_BBCDA'> + <tr char='T' action='A_SKIP' newstate='S_BBCDAT'/> + <tr symbol='default' action='A_SKIP' newstate='S_DECL'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_BBCDAT'> + <tr char='A' action='A_SKIP' newstate='S_BBCDATA'/> + <tr symbol='default' action='A_SKIP' newstate='S_DECL'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_BBCDATA'> + <tr char='[' action='A_SKIP' newstate='S_CDSECT'/> + <tr symbol='default' action='A_SKIP' newstate='S_DECL'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_CDSECT'> + <tr char=']' action='A_SAVE' newstate='S_CDSECT1'/> + <tr symbol='default' action='A_SAVE' newstate='S_CDSECT'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_CDSECT1'> + <tr char=']' action='A_SAVE' newstate='S_CDSECT2'/> + <tr symbol='default' action='A_SAVE' newstate='S_CDSECT'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_CDSECT2'> + <tr char='>' action='A_CDATA' newstate='S_PCDATA'/> + <tr symbol='default' action='A_SAVE' newstate='S_CDSECT'/> + <tr symbol='EOF' action='A_SKIP' newstate='S_DONE'/> + </state> + <state id='S_DONE'/> +</statetable> diff --git a/definitions/html.tssl b/definitions/html.tssl new file mode 100644 index 0000000..7207862 --- /dev/null +++ b/definitions/html.tssl @@ -0,0 +1,2762 @@ +<!-- +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +--> + +<schema xmlns='http://www.ccil.org/~cowan/XML/tagsoup/tssl' + ns='http://www.w3.org/1999/xhtml' name='html' + prefix='html' version='1.0'> + + <entity name='Aacgr' codepoint='0386'/> + <entity name='aacgr' codepoint='03AC'/> + <entity name='Aacute' codepoint='00C1'/> + <entity name='aacute' codepoint='00E1'/> + <entity name='Abreve' codepoint='0102'/> + <entity name='abreve' codepoint='0103'/> + <entity name='ac' codepoint='223E'/> + <entity name='acd' codepoint='223F'/> + <entity name='Acirc' codepoint='00C2'/> + <entity name='acirc' codepoint='00E2'/> + <entity name='acute' codepoint='00B4'/> + <entity name='Acy' codepoint='0410'/> + <entity name='acy' codepoint='0430'/> + <entity name='AElig' codepoint='00C6'/> + <entity name='aelig' codepoint='00E6'/> + <entity name='af' codepoint='2061'/> + <entity name='Afr' codepoint='1D504'/> + <entity name='afr' codepoint='1D51E'/> + <entity name='Agr' codepoint='0391'/> + <entity name='agr' codepoint='03B1'/> + <entity name='Agrave' codepoint='00C0'/> + <entity name='agrave' codepoint='00E0'/> + <entity name='alefsym' codepoint='2135'/> + <entity name='aleph' codepoint='2135'/> + <entity name='Alpha' codepoint='0391'/> + <entity name='alpha' codepoint='03B1'/> + <entity name='Amacr' codepoint='0100'/> + <entity name='amacr' codepoint='0101'/> + <entity name='amalg' codepoint='2A3F'/> + <entity name='amp' codepoint='0026'/> + <entity name='and' codepoint='2227'/> + <entity name='And' codepoint='2A53'/> + <entity name='andand' codepoint='2A55'/> + <entity name='andd' codepoint='2A5C'/> + <entity name='andslope' codepoint='2A58'/> + <entity name='andv' codepoint='2A5A'/> + <entity name='ang' codepoint='2220'/> + <entity name='ange' codepoint='29A4'/> + <entity name='angle' codepoint='2220'/> + <entity name='angmsd' codepoint='2221'/> + <entity name='angmsdaa' codepoint='29A8'/> + <entity name='angmsdab' codepoint='29A9'/> + <entity name='angmsdac' codepoint='29AA'/> + <entity name='angmsdad' codepoint='29AB'/> + <entity name='angmsdae' codepoint='29AC'/> + <entity name='angmsdaf' codepoint='29AD'/> + <entity name='angmsdag' codepoint='29AE'/> + <entity name='angmsdah' codepoint='29AF'/> + <entity name='angrt' codepoint='221F'/> + <entity name='angrtvb' codepoint='22BE'/> + <entity name='angrtvbd' codepoint='299D'/> + <entity name='angsph' codepoint='2222'/> + <entity name='angst' codepoint='212B'/> + <entity name='angzarr' codepoint='237C'/> + <entity name='Aogon' codepoint='0104'/> + <entity name='aogon' codepoint='0105'/> + <entity name='Aopf' codepoint='1D538'/> + <entity name='aopf' codepoint='1D552'/> + <entity name='ap' codepoint='2248'/> + <entity name='apacir' codepoint='2A6F'/> + <entity name='ape' codepoint='224A'/> + <entity name='apE' codepoint='2A70'/> + <entity name='apid' codepoint='224B'/> + <entity name='apos' codepoint='0027'/> + <entity name='ApplyFunction' codepoint='2061'/> + <entity name='approx' codepoint='2248'/> + <entity name='approxeq' codepoint='224A'/> + <entity name='Aring' codepoint='00C5'/> + <entity name='aring' codepoint='00E5'/> + <entity name='Ascr' codepoint='1D49C'/> + <entity name='ascr' codepoint='1D4B6'/> + <entity name='Assign' codepoint='2254'/> + <entity name='ast' codepoint='002A'/> + <entity name='asymp' codepoint='2248'/> + <entity name='asympeq' codepoint='224D'/> + <entity name='Atilde' codepoint='00C3'/> + <entity name='atilde' codepoint='00E3'/> + <entity name='Auml' codepoint='00C4'/> + <entity name='auml' codepoint='00E4'/> + <entity name='awconint' codepoint='2233'/> + <entity name='awint' codepoint='2A11'/> + <entity name='b.alpha' codepoint='1D6C2'/> + <entity name='b.beta' codepoint='1D6C3'/> + <entity name='b.chi' codepoint='1D6D8'/> + <entity name='b.Delta' codepoint='1D6AB'/> + <entity name='b.delta' codepoint='1D6C5'/> + <entity name='b.epsi' codepoint='1D6C6'/> + <entity name='b.epsiv' codepoint='1D6DC'/> + <entity name='b.eta' codepoint='1D6C8'/> + <entity name='b.Gamma' codepoint='1D6AA'/> + <entity name='b.gamma' codepoint='1D6C4'/> + <entity name='b.Gammad' codepoint='1D7CA'/> + <entity name='b.gammad' codepoint='1D7CB'/> + <entity name='b.iota' codepoint='1D6CA'/> + <entity name='b.kappa' codepoint='1D6CB'/> + <entity name='b.kappav' codepoint='1D6DE'/> + <entity name='b.Lambda' codepoint='1D6B2'/> + <entity name='b.lambda' codepoint='1D6CC'/> + <entity name='b.mu' codepoint='1D6CD'/> + <entity name='b.nu' codepoint='1D6CE'/> + <entity name='b.Omega' codepoint='1D6C0'/> + <entity name='b.omega' codepoint='1D6DA'/> + <entity name='b.Phi' codepoint='1D6BD'/> + <entity name='b.phi' codepoint='1D6D7'/> + <entity name='b.phiv' codepoint='1D6DF'/> + <entity name='b.Pi' codepoint='1D6B7'/> + <entity name='b.pi' codepoint='1D6D1'/> + <entity name='b.piv' codepoint='1D6E1'/> + <entity name='b.Psi' codepoint='1D6BF'/> + <entity name='b.psi' codepoint='1D6D9'/> + <entity name='b.rho' codepoint='1D6D2'/> + <entity name='b.rhov' codepoint='1D6E0'/> + <entity name='b.Sigma' codepoint='1D6BA'/> + <entity name='b.sigma' codepoint='1D6D4'/> + <entity name='b.sigmav' codepoint='1D6D3'/> + <entity name='b.tau' codepoint='1D6D5'/> + <entity name='b.Theta' codepoint='1D6AF'/> + <entity name='b.thetas' codepoint='1D6C9'/> + <entity name='b.thetav' codepoint='1D6DD'/> + <entity name='b.Upsi' codepoint='1D6BC'/> + <entity name='b.upsi' codepoint='1D6D6'/> + <entity name='b.Xi' codepoint='1D6B5'/> + <entity name='b.xi' codepoint='1D6CF'/> + <entity name='b.zeta' codepoint='1D6C7'/> + <entity name='backcong' codepoint='224C'/> + <entity name='backepsilon' codepoint='03F6'/> + <entity name='backprime' codepoint='2035'/> + <entity name='backsim' codepoint='223D'/> + <entity name='backsimeq' codepoint='22CD'/> + <entity name='Backslash' codepoint='2216'/> + <entity name='Barv' codepoint='2AE7'/> + <entity name='barvee' codepoint='22BD'/> + <entity name='barwed' codepoint='2305'/> + <entity name='Barwed' codepoint='2306'/> + <entity name='barwedge' codepoint='2305'/> + <entity name='bbrk' codepoint='23B5'/> + <entity name='bbrktbrk' codepoint='23B6'/> + <entity name='bcong' codepoint='224C'/> + <entity name='Bcy' codepoint='0411'/> + <entity name='bcy' codepoint='0431'/> + <entity name='bdquo' codepoint='201E'/> + <entity name='becaus' codepoint='2235'/> + <entity name='because' codepoint='2235'/> + <entity name='bemptyv' codepoint='29B0'/> + <entity name='bepsi' codepoint='03F6'/> + <entity name='bernou' codepoint='212C'/> + <entity name='Bernoullis' codepoint='212C'/> + <entity name='Beta' codepoint='0392'/> + <entity name='beta' codepoint='03B2'/> + <entity name='beth' codepoint='2136'/> + <entity name='between' codepoint='226C'/> + <entity name='Bfr' codepoint='1D505'/> + <entity name='bfr' codepoint='1D51F'/> + <entity name='Bgr' codepoint='0392'/> + <entity name='bgr' codepoint='03B2'/> + <entity name='bigcap' codepoint='22C2'/> + <entity name='bigcirc' codepoint='25EF'/> + <entity name='bigcup' codepoint='22C3'/> + <entity name='bigodot' codepoint='2A00'/> + <entity name='bigoplus' codepoint='2A01'/> + <entity name='bigotimes' codepoint='2A02'/> + <entity name='bigsqcup' codepoint='2A06'/> + <entity name='bigstar' codepoint='2605'/> + <entity name='bigtriangledown' codepoint='25BD'/> + <entity name='bigtriangleup' codepoint='25B3'/> + <entity name='biguplus' codepoint='2A04'/> + <entity name='bigvee' codepoint='22C1'/> + <entity name='bigwedge' codepoint='22C0'/> + <entity name='bkarow' codepoint='290D'/> + <entity name='blacklozenge' codepoint='29EB'/> + <entity name='blacksquare' codepoint='25AA'/> + <entity name='blacktriangle' codepoint='25B4'/> + <entity name='blacktriangledown' codepoint='25BE'/> + <entity name='blacktriangleleft' codepoint='25C2'/> + <entity name='blacktriangleright' codepoint='25B8'/> + <entity name='blank' codepoint='2423'/> + <entity name='blk12' codepoint='2592'/> + <entity name='blk14' codepoint='2591'/> + <entity name='blk34' codepoint='2593'/> + <entity name='block' codepoint='2588'/> + <entity name='bnot' codepoint='2310'/> + <entity name='bNot' codepoint='2AED'/> + <entity name='Bopf' codepoint='1D539'/> + <entity name='bopf' codepoint='1D553'/> + <entity name='bot' codepoint='22A5'/> + <entity name='bottom' codepoint='22A5'/> + <entity name='bowtie' codepoint='22C8'/> + <entity name='boxbox' codepoint='29C9'/> + <entity name='boxdl' codepoint='2510'/> + <entity name='boxdL' codepoint='2555'/> + <entity name='boxDl' codepoint='2556'/> + <entity name='boxDL' codepoint='2557'/> + <entity name='boxdr' codepoint='250C'/> + <entity name='boxdR' codepoint='2552'/> + <entity name='boxDr' codepoint='2553'/> + <entity name='boxDR' codepoint='2554'/> + <entity name='boxh' codepoint='2500'/> + <entity name='boxH' codepoint='2550'/> + <entity name='boxhd' codepoint='252C'/> + <entity name='boxHd' codepoint='2564'/> + <entity name='boxhD' codepoint='2565'/> + <entity name='boxHD' codepoint='2566'/> + <entity name='boxhu' codepoint='2534'/> + <entity name='boxHu' codepoint='2567'/> + <entity name='boxhU' codepoint='2568'/> + <entity name='boxHU' codepoint='2569'/> + <entity name='boxminus' codepoint='229F'/> + <entity name='boxplus' codepoint='229E'/> + <entity name='boxtimes' codepoint='22A0'/> + <entity name='boxul' codepoint='2518'/> + <entity name='boxuL' codepoint='255B'/> + <entity name='boxUl' codepoint='255C'/> + <entity name='boxUL' codepoint='255D'/> + <entity name='boxur' codepoint='2514'/> + <entity name='boxuR' codepoint='2558'/> + <entity name='boxUr' codepoint='2559'/> + <entity name='boxUR' codepoint='255A'/> + <entity name='boxv' codepoint='2502'/> + <entity name='boxV' codepoint='2551'/> + <entity name='boxvh' codepoint='253C'/> + <entity name='boxvH' codepoint='256A'/> + <entity name='boxVh' codepoint='256B'/> + <entity name='boxVH' codepoint='256C'/> + <entity name='boxvl' codepoint='2524'/> + <entity name='boxvL' codepoint='2561'/> + <entity name='boxVl' codepoint='2562'/> + <entity name='boxVL' codepoint='2563'/> + <entity name='boxvr' codepoint='251C'/> + <entity name='boxvR' codepoint='255E'/> + <entity name='boxVr' codepoint='255F'/> + <entity name='boxVR' codepoint='2560'/> + <entity name='bprime' codepoint='2035'/> + <entity name='breve' codepoint='02D8'/> + <entity name='brvbar' codepoint='00A6'/> + <entity name='Bscr' codepoint='212C'/> + <entity name='bscr' codepoint='1D4B7'/> + <entity name='bsemi' codepoint='204F'/> + <entity name='bsim' codepoint='223D'/> + <entity name='bsime' codepoint='22CD'/> + <entity name='bsol' codepoint='005C'/> + <entity name='bsolb' codepoint='29C5'/> + <entity name='bull' codepoint='2022'/> + <entity name='bullet' codepoint='2022'/> + <entity name='bump' codepoint='224E'/> + <entity name='bumpe' codepoint='224F'/> + <entity name='bumpE' codepoint='2AAE'/> + <entity name='Bumpeq' codepoint='224E'/> + <entity name='bumpeq' codepoint='224F'/> + <entity name='Cacute' codepoint='0106'/> + <entity name='cacute' codepoint='0107'/> + <entity name='cap' codepoint='2229'/> + <entity name='Cap' codepoint='22D2'/> + <entity name='capand' codepoint='2A44'/> + <entity name='capbrcup' codepoint='2A49'/> + <entity name='capcap' codepoint='2A4B'/> + <entity name='capcup' codepoint='2A47'/> + <entity name='capdot' codepoint='2A40'/> + <entity name='CapitalDifferentialD' codepoint='2145'/> + <entity name='caret' codepoint='2041'/> + <entity name='caron' codepoint='02C7'/> + <entity name='Cayleys' codepoint='212D'/> + <entity name='ccaps' codepoint='2A4D'/> + <entity name='Ccaron' codepoint='010C'/> + <entity name='ccaron' codepoint='010D'/> + <entity name='Ccedil' codepoint='00C7'/> + <entity name='ccedil' codepoint='00E7'/> + <entity name='Ccirc' codepoint='0108'/> + <entity name='ccirc' codepoint='0109'/> + <entity name='Cconint' codepoint='2230'/> + <entity name='ccups' codepoint='2A4C'/> + <entity name='ccupssm' codepoint='2A50'/> + <entity name='Cdot' codepoint='010A'/> + <entity name='cdot' codepoint='010B'/> + <entity name='cedil' codepoint='00B8'/> + <entity name='Cedilla' codepoint='00B8'/> + <entity name='cemptyv' codepoint='29B2'/> + <entity name='cent' codepoint='00A2'/> + <entity name='centerdot' codepoint='00B7'/> + <entity name='Cfr' codepoint='212D'/> + <entity name='cfr' codepoint='1D520'/> + <entity name='CHcy' codepoint='0427'/> + <entity name='chcy' codepoint='0447'/> + <entity name='check' codepoint='2713'/> + <entity name='checkmark' codepoint='2713'/> + <entity name='Chi' codepoint='03A7'/> + <entity name='chi' codepoint='03C7'/> + <entity name='cir' codepoint='25CB'/> + <entity name='circ' codepoint='02C6'/> + <entity name='circeq' codepoint='2257'/> + <entity name='circlearrowleft' codepoint='21BA'/> + <entity name='circlearrowright' codepoint='21BB'/> + <entity name='circledast' codepoint='229B'/> + <entity name='circledcirc' codepoint='229A'/> + <entity name='circleddash' codepoint='229D'/> + <entity name='CircleDot' codepoint='2299'/> + <entity name='circledR' codepoint='00AE'/> + <entity name='circledS' codepoint='24C8'/> + <entity name='CircleMinus' codepoint='2296'/> + <entity name='CirclePlus' codepoint='2295'/> + <entity name='CircleTimes' codepoint='2297'/> + <entity name='cire' codepoint='2257'/> + <entity name='cirE' codepoint='29C3'/> + <entity name='cirfnint' codepoint='2A10'/> + <entity name='cirmid' codepoint='2AEF'/> + <entity name='cirscir' codepoint='29C2'/> + <entity name='ClockwiseContourIntegral' codepoint='2232'/> + <entity name='CloseCurlyDoubleQuote' codepoint='201D'/> + <entity name='CloseCurlyQuote' codepoint='2019'/> + <entity name='clubs' codepoint='2663'/> + <entity name='clubsuit' codepoint='2663'/> + <entity name='colon' codepoint='003A'/> + <entity name='Colon' codepoint='2237'/> + <entity name='colone' codepoint='2254'/> + <entity name='Colone' codepoint='2A74'/> + <entity name='coloneq' codepoint='2254'/> + <entity name='comma' codepoint='002C'/> + <entity name='commat' codepoint='0040'/> + <entity name='comp' codepoint='2201'/> + <entity name='compfn' codepoint='2218'/> + <entity name='complement' codepoint='2201'/> + <entity name='complexes' codepoint='2102'/> + <entity name='cong' codepoint='2245'/> + <entity name='congdot' codepoint='2A6D'/> + <entity name='Congruent' codepoint='2261'/> + <entity name='conint' codepoint='222E'/> + <entity name='Conint' codepoint='222F'/> + <entity name='ContourIntegral' codepoint='222E'/> + <entity name='Copf' codepoint='2102'/> + <entity name='copf' codepoint='1D554'/> + <entity name='coprod' codepoint='2210'/> + <entity name='Coproduct' codepoint='2210'/> + <entity name='copy' codepoint='00A9'/> + <entity name='copysr' codepoint='2117'/> + <entity name='CounterClockwiseContourIntegral' codepoint='2233'/> + <entity name='crarr' codepoint='21B5'/> + <entity name='cross' codepoint='2717'/> + <entity name='Cross' codepoint='2A2F'/> + <entity name='Cscr' codepoint='1D49E'/> + <entity name='cscr' codepoint='1D4B8'/> + <entity name='csub' codepoint='2ACF'/> + <entity name='csube' codepoint='2AD1'/> + <entity name='csup' codepoint='2AD0'/> + <entity name='csupe' codepoint='2AD2'/> + <entity name='ctdot' codepoint='22EF'/> + <entity name='cudarrl' codepoint='2938'/> + <entity name='cudarrr' codepoint='2935'/> + <entity name='cuepr' codepoint='22DE'/> + <entity name='cuesc' codepoint='22DF'/> + <entity name='cularr' codepoint='21B6'/> + <entity name='cularrp' codepoint='293D'/> + <entity name='cup' codepoint='222A'/> + <entity name='Cup' codepoint='22D3'/> + <entity name='cupbrcap' codepoint='2A48'/> + <entity name='CupCap' codepoint='224D'/> + <entity name='cupcap' codepoint='2A46'/> + <entity name='cupcup' codepoint='2A4A'/> + <entity name='cupdot' codepoint='228D'/> + <entity name='cupor' codepoint='2A45'/> + <entity name='curarr' codepoint='21B7'/> + <entity name='curarrm' codepoint='293C'/> + <entity name='curlyeqprec' codepoint='22DE'/> + <entity name='curlyeqsucc' codepoint='22DF'/> + <entity name='curlyvee' codepoint='22CE'/> + <entity name='curlywedge' codepoint='22CF'/> + <entity name='curren' codepoint='00A4'/> + <entity name='curvearrowleft' codepoint='21B6'/> + <entity name='curvearrowright' codepoint='21B7'/> + <entity name='cuvee' codepoint='22CE'/> + <entity name='cuwed' codepoint='22CF'/> + <entity name='cwconint' codepoint='2232'/> + <entity name='cwint' codepoint='2231'/> + <entity name='cylcty' codepoint='232D'/> + <entity name='dagger' codepoint='2020'/> + <entity name='Dagger' codepoint='2021'/> + <entity name='daleth' codepoint='2138'/> + <entity name='darr' codepoint='2193'/> + <entity name='Darr' codepoint='21A1'/> + <entity name='dArr' codepoint='21D3'/> + <entity name='dash' codepoint='2010'/> + <entity name='dashv' codepoint='22A3'/> + <entity name='Dashv' codepoint='2AE4'/> + <entity name='dbkarow' codepoint='290F'/> + <entity name='dblac' codepoint='02DD'/> + <entity name='Dcaron' codepoint='010E'/> + <entity name='dcaron' codepoint='010F'/> + <entity name='Dcy' codepoint='0414'/> + <entity name='dcy' codepoint='0434'/> + <entity name='DD' codepoint='2145'/> + <entity name='dd' codepoint='2146'/> + <entity name='ddagger' codepoint='2021'/> + <entity name='ddarr' codepoint='21CA'/> + <entity name='DDotrahd' codepoint='2911'/> + <entity name='ddotseq' codepoint='2A77'/> + <entity name='deg' codepoint='00B0'/> + <entity name='Del' codepoint='2207'/> + <entity name='Delta' codepoint='0394'/> + <entity name='delta' codepoint='03B4'/> + <entity name='demptyv' codepoint='29B1'/> + <entity name='dfisht' codepoint='297F'/> + <entity name='Dfr' codepoint='1D507'/> + <entity name='dfr' codepoint='1D521'/> + <entity name='Dgr' codepoint='0394'/> + <entity name='dgr' codepoint='03B4'/> + <entity name='dHar' codepoint='2965'/> + <entity name='dharl' codepoint='21C3'/> + <entity name='dharr' codepoint='21C2'/> + <entity name='DiacriticalAcute' codepoint='00B4'/> + <entity name='DiacriticalDot' codepoint='02D9'/> + <entity name='DiacriticalDoubleAcute' codepoint='02DD'/> + <entity name='DiacriticalGrave' codepoint='0060'/> + <entity name='DiacriticalTilde' codepoint='02DC'/> + <entity name='diam' codepoint='22C4'/> + <entity name='diamond' codepoint='22C4'/> + <entity name='diamondsuit' codepoint='2666'/> + <entity name='diams' codepoint='2666'/> + <entity name='die' codepoint='00A8'/> + <entity name='DifferentialD' codepoint='2146'/> + <entity name='digamma' codepoint='03DD'/> + <entity name='disin' codepoint='22F2'/> + <entity name='div' codepoint='00F7'/> + <entity name='divide' codepoint='00F7'/> + <entity name='divideontimes' codepoint='22C7'/> + <entity name='divonx' codepoint='22C7'/> + <entity name='DJcy' codepoint='0402'/> + <entity name='djcy' codepoint='0452'/> + <entity name='dlcorn' codepoint='231E'/> + <entity name='dlcrop' codepoint='230D'/> + <entity name='dollar' codepoint='0024'/> + <entity name='Dopf' codepoint='1D53B'/> + <entity name='dopf' codepoint='1D555'/> + <entity name='Dot' codepoint='00A8'/> + <entity name='dot' codepoint='02D9'/> + <entity name='doteq' codepoint='2250'/> + <entity name='doteqdot' codepoint='2251'/> + <entity name='DotEqual' codepoint='2250'/> + <entity name='dotminus' codepoint='2238'/> + <entity name='dotplus' codepoint='2214'/> + <entity name='dotsquare' codepoint='22A1'/> + <entity name='doublebarwedge' codepoint='2306'/> + <entity name='DoubleContourIntegral' codepoint='222F'/> + <entity name='DoubleDot' codepoint='00A8'/> + <entity name='DoubleDownArrow' codepoint='21D3'/> + <entity name='DoubleLeftArrow' codepoint='21D0'/> + <entity name='DoubleLeftRightArrow' codepoint='21D4'/> + <entity name='DoubleLeftTee' codepoint='2AE4'/> + <entity name='DoubleLongLeftArrow' codepoint='27F8'/> + <entity name='DoubleLongLeftRightArrow' codepoint='27FA'/> + <entity name='DoubleLongRightArrow' codepoint='27F9'/> + <entity name='DoubleRightArrow' codepoint='21D2'/> + <entity name='DoubleRightTee' codepoint='22A8'/> + <entity name='DoubleUpArrow' codepoint='21D1'/> + <entity name='DoubleUpDownArrow' codepoint='21D5'/> + <entity name='DoubleVerticalBar' codepoint='2225'/> + <entity name='downarrow' codepoint='2193'/> + <entity name='Downarrow' codepoint='21D3'/> + <entity name='DownArrowBar' codepoint='2913'/> + <entity name='DownArrowUpArrow' codepoint='21F5'/> + <entity name='downdownarrows' codepoint='21CA'/> + <entity name='downharpoonleft' codepoint='21C3'/> + <entity name='downharpoonright' codepoint='21C2'/> + <entity name='DownLeftRightVector' codepoint='2950'/> + <entity name='DownLeftTeeVector' codepoint='295E'/> + <entity name='DownLeftVector' codepoint='21BD'/> + <entity name='DownLeftVectorBar' codepoint='2956'/> + <entity name='DownRightTeeVector' codepoint='295F'/> + <entity name='DownRightVector' codepoint='21C1'/> + <entity name='DownRightVectorBar' codepoint='2957'/> + <entity name='DownTee' codepoint='22A4'/> + <entity name='DownTeeArrow' codepoint='21A7'/> + <entity name='drbkarow' codepoint='2910'/> + <entity name='drcorn' codepoint='231F'/> + <entity name='drcrop' codepoint='230C'/> + <entity name='Dscr' codepoint='1D49F'/> + <entity name='dscr' codepoint='1D4B9'/> + <entity name='DScy' codepoint='0405'/> + <entity name='dscy' codepoint='0455'/> + <entity name='dsol' codepoint='29F6'/> + <entity name='Dstrok' codepoint='0110'/> + <entity name='dstrok' codepoint='0111'/> + <entity name='dtdot' codepoint='22F1'/> + <entity name='dtri' codepoint='25BF'/> + <entity name='dtrif' codepoint='25BE'/> + <entity name='duarr' codepoint='21F5'/> + <entity name='duhar' codepoint='296F'/> + <entity name='dwangle' codepoint='29A6'/> + <entity name='DZcy' codepoint='040F'/> + <entity name='dzcy' codepoint='045F'/> + <entity name='dzigrarr' codepoint='27FF'/> + <entity name='Eacgr' codepoint='0388'/> + <entity name='eacgr' codepoint='03AD'/> + <entity name='Eacute' codepoint='00C9'/> + <entity name='eacute' codepoint='00E9'/> + <entity name='easter' codepoint='2A6E'/> + <entity name='Ecaron' codepoint='011A'/> + <entity name='ecaron' codepoint='011B'/> + <entity name='ecir' codepoint='2256'/> + <entity name='Ecirc' codepoint='00CA'/> + <entity name='ecirc' codepoint='00EA'/> + <entity name='ecolon' codepoint='2255'/> + <entity name='Ecy' codepoint='042D'/> + <entity name='ecy' codepoint='044D'/> + <entity name='eDDot' codepoint='2A77'/> + <entity name='Edot' codepoint='0116'/> + <entity name='edot' codepoint='0117'/> + <entity name='eDot' codepoint='2251'/> + <entity name='ee' codepoint='2147'/> + <entity name='EEacgr' codepoint='0389'/> + <entity name='eeacgr' codepoint='03AE'/> + <entity name='EEgr' codepoint='0397'/> + <entity name='eegr' codepoint='03B7'/> + <entity name='efDot' codepoint='2252'/> + <entity name='Efr' codepoint='1D508'/> + <entity name='efr' codepoint='1D522'/> + <entity name='eg' codepoint='2A9A'/> + <entity name='Egr' codepoint='0395'/> + <entity name='egr' codepoint='03B5'/> + <entity name='Egrave' codepoint='00C8'/> + <entity name='egrave' codepoint='00E8'/> + <entity name='egs' codepoint='2A96'/> + <entity name='egsdot' codepoint='2A98'/> + <entity name='el' codepoint='2A99'/> + <entity name='Element' codepoint='2208'/> + <entity name='elinters' codepoint='23E7'/> + <entity name='ell' codepoint='2113'/> + <entity name='els' codepoint='2A95'/> + <entity name='elsdot' codepoint='2A97'/> + <entity name='Emacr' codepoint='0112'/> + <entity name='emacr' codepoint='0113'/> + <entity name='empty' codepoint='2205'/> + <entity name='emptyset' codepoint='2205'/> + <entity name='EmptySmallSquare' codepoint='25FB'/> + <entity name='emptyv' codepoint='2205'/> + <entity name='EmptyVerySmallSquare' codepoint='25AB'/> + <entity name='emsp' codepoint='2003'/> + <entity name='emsp13' codepoint='2004'/> + <entity name='emsp14' codepoint='2005'/> + <entity name='ENG' codepoint='014A'/> + <entity name='eng' codepoint='014B'/> + <entity name='ensp' codepoint='2002'/> + <entity name='Eogon' codepoint='0118'/> + <entity name='eogon' codepoint='0119'/> + <entity name='Eopf' codepoint='1D53C'/> + <entity name='eopf' codepoint='1D556'/> + <entity name='epar' codepoint='22D5'/> + <entity name='eparsl' codepoint='29E3'/> + <entity name='eplus' codepoint='2A71'/> + <entity name='epsi' codepoint='03F5'/> + <entity name='Epsilon' codepoint='0395'/> + <entity name='epsilon' codepoint='03B5'/> + <entity name='epsiv' codepoint='03B5'/> + <entity name='eqcirc' codepoint='2256'/> + <entity name='eqcolon' codepoint='2255'/> + <entity name='eqsim' codepoint='2242'/> + <entity name='eqslantgtr' codepoint='2A96'/> + <entity name='eqslantless' codepoint='2A95'/> + <entity name='Equal' codepoint='2A75'/> + <entity name='equals' codepoint='003D'/> + <entity name='EqualTilde' codepoint='2242'/> + <entity name='equest' codepoint='225F'/> + <entity name='Equilibrium' codepoint='21CC'/> + <entity name='equiv' codepoint='2261'/> + <entity name='equivDD' codepoint='2A78'/> + <entity name='eqvparsl' codepoint='29E5'/> + <entity name='erarr' codepoint='2971'/> + <entity name='erDot' codepoint='2253'/> + <entity name='escr' codepoint='212F'/> + <entity name='Escr' codepoint='2130'/> + <entity name='esdot' codepoint='2250'/> + <entity name='esim' codepoint='2242'/> + <entity name='Esim' codepoint='2A73'/> + <entity name='Eta' codepoint='0397'/> + <entity name='eta' codepoint='03B7'/> + <entity name='ETH' codepoint='00D0'/> + <entity name='eth' codepoint='00F0'/> + <entity name='Euml' codepoint='00CB'/> + <entity name='euml' codepoint='00EB'/> + <entity name='euro' codepoint='20AC'/> + <entity name='excl' codepoint='0021'/> + <entity name='exist' codepoint='2203'/> + <entity name='Exists' codepoint='2203'/> + <entity name='expectation' codepoint='2130'/> + <entity name='exponentiale' codepoint='2147'/> + <entity name='fallingdotseq' codepoint='2252'/> + <entity name='Fcy' codepoint='0424'/> + <entity name='fcy' codepoint='0444'/> + <entity name='female' codepoint='2640'/> + <entity name='ffilig' codepoint='FB03'/> + <entity name='fflig' codepoint='FB00'/> + <entity name='ffllig' codepoint='FB04'/> + <entity name='Ffr' codepoint='1D509'/> + <entity name='ffr' codepoint='1D523'/> + <entity name='filig' codepoint='FB01'/> + <entity name='FilledSmallSquare' codepoint='25FC'/> + <entity name='FilledVerySmallSquare' codepoint='25AA'/> + <entity name='flat' codepoint='266D'/> + <entity name='fllig' codepoint='FB02'/> + <entity name='fltns' codepoint='25B1'/> + <entity name='fnof' codepoint='0192'/> + <entity name='Fopf' codepoint='1D53D'/> + <entity name='fopf' codepoint='1D557'/> + <entity name='forall' codepoint='2200'/> + <entity name='fork' codepoint='22D4'/> + <entity name='forkv' codepoint='2AD9'/> + <entity name='Fouriertrf' codepoint='2131'/> + <entity name='fpartint' codepoint='2A0D'/> + <entity name='frac12' codepoint='00BD'/> + <entity name='frac13' codepoint='2153'/> + <entity name='frac14' codepoint='00BC'/> + <entity name='frac15' codepoint='2155'/> + <entity name='frac16' codepoint='2159'/> + <entity name='frac18' codepoint='215B'/> + <entity name='frac23' codepoint='2154'/> + <entity name='frac25' codepoint='2156'/> + <entity name='frac34' codepoint='00BE'/> + <entity name='frac35' codepoint='2157'/> + <entity name='frac38' codepoint='215C'/> + <entity name='frac45' codepoint='2158'/> + <entity name='frac56' codepoint='215A'/> + <entity name='frac58' codepoint='215D'/> + <entity name='frac78' codepoint='215E'/> + <entity name='frasl' codepoint='2044'/> + <entity name='frown' codepoint='2322'/> + <entity name='Fscr' codepoint='2131'/> + <entity name='fscr' codepoint='1D4BB'/> + <entity name='gacute' codepoint='01F5'/> + <entity name='Gamma' codepoint='0393'/> + <entity name='gamma' codepoint='03B3'/> + <entity name='Gammad' codepoint='03DC'/> + <entity name='gammad' codepoint='03DD'/> + <entity name='gap' codepoint='2A86'/> + <entity name='Gbreve' codepoint='011E'/> + <entity name='gbreve' codepoint='011F'/> + <entity name='Gcedil' codepoint='0122'/> + <entity name='Gcirc' codepoint='011C'/> + <entity name='gcirc' codepoint='011D'/> + <entity name='Gcy' codepoint='0413'/> + <entity name='gcy' codepoint='0433'/> + <entity name='Gdot' codepoint='0120'/> + <entity name='gdot' codepoint='0121'/> + <entity name='ge' codepoint='2265'/> + <entity name='gE' codepoint='2267'/> + <entity name='gel' codepoint='22DB'/> + <entity name='gEl' codepoint='2A8C'/> + <entity name='geq' codepoint='2265'/> + <entity name='geqq' codepoint='2267'/> + <entity name='geqslant' codepoint='2A7E'/> + <entity name='ges' codepoint='2A7E'/> + <entity name='gescc' codepoint='2AA9'/> + <entity name='gesdot' codepoint='2A80'/> + <entity name='gesdoto' codepoint='2A82'/> + <entity name='gesdotol' codepoint='2A84'/> + <entity name='gesles' codepoint='2A94'/> + <entity name='Gfr' codepoint='1D50A'/> + <entity name='gfr' codepoint='1D524'/> + <entity name='gg' codepoint='226B'/> + <entity name='Gg' codepoint='22D9'/> + <entity name='ggg' codepoint='22D9'/> + <entity name='Ggr' codepoint='0393'/> + <entity name='ggr' codepoint='03B3'/> + <entity name='gimel' codepoint='2137'/> + <entity name='GJcy' codepoint='0403'/> + <entity name='gjcy' codepoint='0453'/> + <entity name='gl' codepoint='2277'/> + <entity name='gla' codepoint='2AA5'/> + <entity name='glE' codepoint='2A92'/> + <entity name='glj' codepoint='2AA4'/> + <entity name='gnap' codepoint='2A8A'/> + <entity name='gnapprox' codepoint='2A8A'/> + <entity name='gnE' codepoint='2269'/> + <entity name='gne' codepoint='2A88'/> + <entity name='gneq' codepoint='2A88'/> + <entity name='gneqq' codepoint='2269'/> + <entity name='gnsim' codepoint='22E7'/> + <entity name='Gopf' codepoint='1D53E'/> + <entity name='gopf' codepoint='1D558'/> + <entity name='grave' codepoint='0060'/> + <entity name='GreaterEqual' codepoint='2265'/> + <entity name='GreaterEqualLess' codepoint='22DB'/> + <entity name='GreaterFullEqual' codepoint='2267'/> + <entity name='GreaterGreater' codepoint='2AA2'/> + <entity name='GreaterLess' codepoint='2277'/> + <entity name='GreaterSlantEqual' codepoint='2A7E'/> + <entity name='GreaterTilde' codepoint='2273'/> + <entity name='gscr' codepoint='210A'/> + <entity name='Gscr' codepoint='1D4A2'/> + <entity name='gsim' codepoint='2273'/> + <entity name='gsime' codepoint='2A8E'/> + <entity name='gsiml' codepoint='2A90'/> + <entity name='gt' codepoint='003E'/> + <entity name='Gt' codepoint='226B'/> + <entity name='gtcc' codepoint='2AA7'/> + <entity name='gtcir' codepoint='2A7A'/> + <entity name='gtdot' codepoint='22D7'/> + <entity name='gtlPar' codepoint='2995'/> + <entity name='gtquest' codepoint='2A7C'/> + <entity name='gtrapprox' codepoint='2A86'/> + <entity name='gtrarr' codepoint='2978'/> + <entity name='gtrdot' codepoint='22D7'/> + <entity name='gtreqless' codepoint='22DB'/> + <entity name='gtreqqless' codepoint='2A8C'/> + <entity name='gtrless' codepoint='2277'/> + <entity name='gtrsim' codepoint='2273'/> + <entity name='Hacek' codepoint='02C7'/> + <entity name='hairsp' codepoint='200A'/> + <entity name='half' codepoint='00BD'/> + <entity name='hamilt' codepoint='210B'/> + <entity name='HARDcy' codepoint='042A'/> + <entity name='hardcy' codepoint='044A'/> + <entity name='harr' codepoint='2194'/> + <entity name='hArr' codepoint='21D4'/> + <entity name='harrcir' codepoint='2948'/> + <entity name='harrw' codepoint='21AD'/> + <entity name='Hat' codepoint='005E'/> + <entity name='hbar' codepoint='210F'/> + <entity name='Hcirc' codepoint='0124'/> + <entity name='hcirc' codepoint='0125'/> + <entity name='hearts' codepoint='2665'/> + <entity name='heartsuit' codepoint='2665'/> + <entity name='hellip' codepoint='2026'/> + <entity name='hercon' codepoint='22B9'/> + <entity name='Hfr' codepoint='210C'/> + <entity name='hfr' codepoint='1D525'/> + <entity name='HilbertSpace' codepoint='210B'/> + <entity name='hksearow' codepoint='2925'/> + <entity name='hkswarow' codepoint='2926'/> + <entity name='hoarr' codepoint='21FF'/> + <entity name='homtht' codepoint='223B'/> + <entity name='hookleftarrow' codepoint='21A9'/> + <entity name='hookrightarrow' codepoint='21AA'/> + <entity name='Hopf' codepoint='210D'/> + <entity name='hopf' codepoint='1D559'/> + <entity name='horbar' codepoint='2015'/> + <entity name='HorizontalLine' codepoint='2500'/> + <entity name='Hscr' codepoint='210B'/> + <entity name='hscr' codepoint='1D4BD'/> + <entity name='hslash' codepoint='210F'/> + <entity name='Hstrok' codepoint='0126'/> + <entity name='hstrok' codepoint='0127'/> + <entity name='HumpDownHump' codepoint='224E'/> + <entity name='HumpEqual' codepoint='224F'/> + <entity name='hybull' codepoint='2043'/> + <entity name='hyphen' codepoint='2010'/> + <entity name='Iacgr' codepoint='038A'/> + <entity name='iacgr' codepoint='03AF'/> + <entity name='Iacute' codepoint='00CD'/> + <entity name='iacute' codepoint='00ED'/> + <entity name='ic' codepoint='2063'/> + <entity name='Icirc' codepoint='00CE'/> + <entity name='icirc' codepoint='00EE'/> + <entity name='Icy' codepoint='0418'/> + <entity name='icy' codepoint='0438'/> + <entity name='idiagr' codepoint='0390'/> + <entity name='Idigr' codepoint='03AA'/> + <entity name='idigr' codepoint='03CA'/> + <entity name='Idot' codepoint='0130'/> + <entity name='IEcy' codepoint='0415'/> + <entity name='iecy' codepoint='0435'/> + <entity name='iexcl' codepoint='00A1'/> + <entity name='iff' codepoint='21D4'/> + <entity name='Ifr' codepoint='2111'/> + <entity name='ifr' codepoint='1D526'/> + <entity name='Igr' codepoint='0399'/> + <entity name='igr' codepoint='03B9'/> + <entity name='Igrave' codepoint='00CC'/> + <entity name='igrave' codepoint='00EC'/> + <entity name='ii' codepoint='2148'/> + <entity name='iiiint' codepoint='2A0C'/> + <entity name='iiint' codepoint='222D'/> + <entity name='iinfin' codepoint='29DC'/> + <entity name='iiota' codepoint='2129'/> + <entity name='IJlig' codepoint='0132'/> + <entity name='ijlig' codepoint='0133'/> + <entity name='Im' codepoint='2111'/> + <entity name='Imacr' codepoint='012A'/> + <entity name='imacr' codepoint='012B'/> + <entity name='image' codepoint='2111'/> + <entity name='ImaginaryI' codepoint='2148'/> + <entity name='imagline' codepoint='2110'/> + <entity name='imagpart' codepoint='2111'/> + <entity name='imath' codepoint='0131'/> + <entity name='imof' codepoint='22B7'/> + <entity name='imped' codepoint='01B5'/> + <entity name='Implies' codepoint='21D2'/> + <entity name='in' codepoint='2208'/> + <entity name='incare' codepoint='2105'/> + <entity name='infin' codepoint='221E'/> + <entity name='infintie' codepoint='29DD'/> + <entity name='inodot' codepoint='0131'/> + <entity name='int' codepoint='222B'/> + <entity name='Int' codepoint='222C'/> + <entity name='intcal' codepoint='22BA'/> + <entity name='integers' codepoint='2124'/> + <entity name='Integral' codepoint='222B'/> + <entity name='intercal' codepoint='22BA'/> + <entity name='Intersection' codepoint='22C2'/> + <entity name='intlarhk' codepoint='2A17'/> + <entity name='intprod' codepoint='2A3C'/> + <entity name='InvisibleComma' codepoint='2063'/> + <entity name='InvisibleTimes' codepoint='2062'/> + <entity name='IOcy' codepoint='0401'/> + <entity name='iocy' codepoint='0451'/> + <entity name='Iogon' codepoint='012E'/> + <entity name='iogon' codepoint='012F'/> + <entity name='Iopf' codepoint='1D540'/> + <entity name='iopf' codepoint='1D55A'/> + <entity name='Iota' codepoint='0399'/> + <entity name='iota' codepoint='03B9'/> + <entity name='iprod' codepoint='2A3C'/> + <entity name='iquest' codepoint='00BF'/> + <entity name='Iscr' codepoint='2110'/> + <entity name='iscr' codepoint='1D4BE'/> + <entity name='isin' codepoint='2208'/> + <entity name='isindot' codepoint='22F5'/> + <entity name='isinE' codepoint='22F9'/> + <entity name='isins' codepoint='22F4'/> + <entity name='isinsv' codepoint='22F3'/> + <entity name='isinv' codepoint='2208'/> + <entity name='it' codepoint='2062'/> + <entity name='Itilde' codepoint='0128'/> + <entity name='itilde' codepoint='0129'/> + <entity name='Iukcy' codepoint='0406'/> + <entity name='iukcy' codepoint='0456'/> + <entity name='Iuml' codepoint='00CF'/> + <entity name='iuml' codepoint='00EF'/> + <entity name='Jcirc' codepoint='0134'/> + <entity name='jcirc' codepoint='0135'/> + <entity name='Jcy' codepoint='0419'/> + <entity name='jcy' codepoint='0439'/> + <entity name='Jfr' codepoint='1D50D'/> + <entity name='jfr' codepoint='1D527'/> + <entity name='jmath' codepoint='0237'/> + <entity name='Jopf' codepoint='1D541'/> + <entity name='jopf' codepoint='1D55B'/> + <entity name='Jscr' codepoint='1D4A5'/> + <entity name='jscr' codepoint='1D4BF'/> + <entity name='Jsercy' codepoint='0408'/> + <entity name='jsercy' codepoint='0458'/> + <entity name='Jukcy' codepoint='0404'/> + <entity name='jukcy' codepoint='0454'/> + <entity name='Kappa' codepoint='039A'/> + <entity name='kappa' codepoint='03BA'/> + <entity name='kappav' codepoint='03F0'/> + <entity name='Kcedil' codepoint='0136'/> + <entity name='kcedil' codepoint='0137'/> + <entity name='Kcy' codepoint='041A'/> + <entity name='kcy' codepoint='043A'/> + <entity name='Kfr' codepoint='1D50E'/> + <entity name='kfr' codepoint='1D528'/> + <entity name='Kgr' codepoint='039A'/> + <entity name='kgr' codepoint='03BA'/> + <entity name='kgreen' codepoint='0138'/> + <entity name='KHcy' codepoint='0425'/> + <entity name='khcy' codepoint='0445'/> + <entity name='KHgr' codepoint='03A7'/> + <entity name='khgr' codepoint='03C7'/> + <entity name='KJcy' codepoint='040C'/> + <entity name='kjcy' codepoint='045C'/> + <entity name='Kopf' codepoint='1D542'/> + <entity name='kopf' codepoint='1D55C'/> + <entity name='Kscr' codepoint='1D4A6'/> + <entity name='kscr' codepoint='1D4C0'/> + <entity name='lAarr' codepoint='21DA'/> + <entity name='Lacute' codepoint='0139'/> + <entity name='lacute' codepoint='013A'/> + <entity name='laemptyv' codepoint='29B4'/> + <entity name='lagran' codepoint='2112'/> + <entity name='Lambda' codepoint='039B'/> + <entity name='lambda' codepoint='03BB'/> + <entity name='lang' codepoint='2329'/> + <entity name='Lang' codepoint='27EA'/> + <entity name='langd' codepoint='2991'/> + <entity name='langle' codepoint='2329'/> + <entity name='lap' codepoint='2A85'/> + <entity name='Laplacetrf' codepoint='2112'/> + <entity name='laquo' codepoint='00AB'/> + <entity name='larr' codepoint='2190'/> + <entity name='Larr' codepoint='219E'/> + <entity name='lArr' codepoint='21D0'/> + <entity name='larrb' codepoint='21E4'/> + <entity name='larrbfs' codepoint='291F'/> + <entity name='larrfs' codepoint='291D'/> + <entity name='larrhk' codepoint='21A9'/> + <entity name='larrlp' codepoint='21AB'/> + <entity name='larrpl' codepoint='2939'/> + <entity name='larrsim' codepoint='2973'/> + <entity name='larrtl' codepoint='21A2'/> + <entity name='lat' codepoint='2AAB'/> + <entity name='latail' codepoint='2919'/> + <entity name='lAtail' codepoint='291B'/> + <entity name='late' codepoint='2AAD'/> + <entity name='lbarr' codepoint='290C'/> + <entity name='lBarr' codepoint='290E'/> + <entity name='lbbrk' codepoint='2997'/> + <entity name='lbrace' codepoint='007B'/> + <entity name='lbrack' codepoint='005B'/> + <entity name='lbrke' codepoint='298B'/> + <entity name='lbrksld' codepoint='298F'/> + <entity name='lbrkslu' codepoint='298D'/> + <entity name='Lcaron' codepoint='013D'/> + <entity name='lcaron' codepoint='013E'/> + <entity name='Lcedil' codepoint='013B'/> + <entity name='lcedil' codepoint='013C'/> + <entity name='lceil' codepoint='2308'/> + <entity name='lcub' codepoint='007B'/> + <entity name='Lcy' codepoint='041B'/> + <entity name='lcy' codepoint='043B'/> + <entity name='ldca' codepoint='2936'/> + <entity name='ldquo' codepoint='201C'/> + <entity name='ldquor' codepoint='201E'/> + <entity name='ldrdhar' codepoint='2967'/> + <entity name='ldrushar' codepoint='294B'/> + <entity name='ldsh' codepoint='21B2'/> + <entity name='le' codepoint='2264'/> + <entity name='lE' codepoint='2266'/> + <entity name='LeftAngleBracket' codepoint='2329'/> + <entity name='leftarrow' codepoint='2190'/> + <entity name='Leftarrow' codepoint='21D0'/> + <entity name='LeftArrowBar' codepoint='21E4'/> + <entity name='LeftArrowRightArrow' codepoint='21C6'/> + <entity name='leftarrowtail' codepoint='21A2'/> + <entity name='LeftCeiling' codepoint='2308'/> + <entity name='LeftDoubleBracket' codepoint='27E6'/> + <entity name='LeftDownTeeVector' codepoint='2961'/> + <entity name='LeftDownVector' codepoint='21C3'/> + <entity name='LeftDownVectorBar' codepoint='2959'/> + <entity name='LeftFloor' codepoint='230A'/> + <entity name='leftharpoondown' codepoint='21BD'/> + <entity name='leftharpoonup' codepoint='21BC'/> + <entity name='leftleftarrows' codepoint='21C7'/> + <entity name='leftrightarrow' codepoint='2194'/> + <entity name='Leftrightarrow' codepoint='21D4'/> + <entity name='leftrightarrows' codepoint='21C6'/> + <entity name='leftrightharpoons' codepoint='21CB'/> + <entity name='leftrightsquigarrow' codepoint='21AD'/> + <entity name='LeftRightVector' codepoint='294E'/> + <entity name='LeftTee' codepoint='22A3'/> + <entity name='LeftTeeArrow' codepoint='21A4'/> + <entity name='LeftTeeVector' codepoint='295A'/> + <entity name='leftthreetimes' codepoint='22CB'/> + <entity name='LeftTriangle' codepoint='22B2'/> + <entity name='LeftTriangleBar' codepoint='29CF'/> + <entity name='LeftTriangleEqual' codepoint='22B4'/> + <entity name='LeftUpDownVector' codepoint='2951'/> + <entity name='LeftUpTeeVector' codepoint='2960'/> + <entity name='LeftUpVector' codepoint='21BF'/> + <entity name='LeftUpVectorBar' codepoint='2958'/> + <entity name='LeftVector' codepoint='21BC'/> + <entity name='LeftVectorBar' codepoint='2952'/> + <entity name='leg' codepoint='22DA'/> + <entity name='lEg' codepoint='2A8B'/> + <entity name='leq' codepoint='2264'/> + <entity name='leqq' codepoint='2266'/> + <entity name='leqslant' codepoint='2A7D'/> + <entity name='les' codepoint='2A7D'/> + <entity name='lescc' codepoint='2AA8'/> + <entity name='lesdot' codepoint='2A7F'/> + <entity name='lesdoto' codepoint='2A81'/> + <entity name='lesdotor' codepoint='2A83'/> + <entity name='lesges' codepoint='2A93'/> + <entity name='lessapprox' codepoint='2A85'/> + <entity name='lessdot' codepoint='22D6'/> + <entity name='lesseqgtr' codepoint='22DA'/> + <entity name='lesseqqgtr' codepoint='2A8B'/> + <entity name='LessEqualGreater' codepoint='22DA'/> + <entity name='LessFullEqual' codepoint='2266'/> + <entity name='LessGreater' codepoint='2276'/> + <entity name='lessgtr' codepoint='2276'/> + <entity name='LessLess' codepoint='2AA1'/> + <entity name='lesssim' codepoint='2272'/> + <entity name='LessSlantEqual' codepoint='2A7D'/> + <entity name='LessTilde' codepoint='2272'/> + <entity name='lfisht' codepoint='297C'/> + <entity name='lfloor' codepoint='230A'/> + <entity name='Lfr' codepoint='1D50F'/> + <entity name='lfr' codepoint='1D529'/> + <entity name='lg' codepoint='2276'/> + <entity name='lgE' codepoint='2A91'/> + <entity name='Lgr' codepoint='039B'/> + <entity name='lgr' codepoint='03BB'/> + <entity name='lHar' codepoint='2962'/> + <entity name='lhard' codepoint='21BD'/> + <entity name='lharu' codepoint='21BC'/> + <entity name='lharul' codepoint='296A'/> + <entity name='lhblk' codepoint='2584'/> + <entity name='LJcy' codepoint='0409'/> + <entity name='ljcy' codepoint='0459'/> + <entity name='ll' codepoint='226A'/> + <entity name='Ll' codepoint='22D8'/> + <entity name='llarr' codepoint='21C7'/> + <entity name='llcorner' codepoint='231E'/> + <entity name='Lleftarrow' codepoint='21DA'/> + <entity name='llhard' codepoint='296B'/> + <entity name='lltri' codepoint='25FA'/> + <entity name='Lmidot' codepoint='013F'/> + <entity name='lmidot' codepoint='0140'/> + <entity name='lmoust' codepoint='23B0'/> + <entity name='lmoustache' codepoint='23B0'/> + <entity name='lnap' codepoint='2A89'/> + <entity name='lnapprox' codepoint='2A89'/> + <entity name='lnE' codepoint='2268'/> + <entity name='lne' codepoint='2A87'/> + <entity name='lneq' codepoint='2A87'/> + <entity name='lneqq' codepoint='2268'/> + <entity name='lnsim' codepoint='22E6'/> + <entity name='loang' codepoint='27EC'/> + <entity name='loarr' codepoint='21FD'/> + <entity name='lobrk' codepoint='27E6'/> + <entity name='longleftarrow' codepoint='27F5'/> + <entity name='Longleftarrow' codepoint='27F8'/> + <entity name='longleftrightarrow' codepoint='27F7'/> + <entity name='Longleftrightarrow' codepoint='27FA'/> + <entity name='longmapsto' codepoint='27FC'/> + <entity name='longrightarrow' codepoint='27F6'/> + <entity name='Longrightarrow' codepoint='27F9'/> + <entity name='looparrowleft' codepoint='21AB'/> + <entity name='looparrowright' codepoint='21AC'/> + <entity name='lopar' codepoint='2985'/> + <entity name='Lopf' codepoint='1D543'/> + <entity name='lopf' codepoint='1D55D'/> + <entity name='loplus' codepoint='2A2D'/> + <entity name='lotimes' codepoint='2A34'/> + <entity name='lowast' codepoint='2217'/> + <entity name='lowbar' codepoint='005F'/> + <entity name='LowerLeftArrow' codepoint='2199'/> + <entity name='LowerRightArrow' codepoint='2198'/> + <entity name='loz' codepoint='25CA'/> + <entity name='lozenge' codepoint='25CA'/> + <entity name='lozf' codepoint='29EB'/> + <entity name='lpar' codepoint='0028'/> + <entity name='lparlt' codepoint='2993'/> + <entity name='lrarr' codepoint='21C6'/> + <entity name='lrcorner' codepoint='231F'/> + <entity name='lrhar' codepoint='21CB'/> + <entity name='lrhard' codepoint='296D'/> + <entity name='lrm' codepoint='200E'/> + <entity name='lrtri' codepoint='22BF'/> + <entity name='lsaquo' codepoint='2039'/> + <entity name='Lscr' codepoint='2112'/> + <entity name='lscr' codepoint='1D4C1'/> + <entity name='lsh' codepoint='21B0'/> + <entity name='lsim' codepoint='2272'/> + <entity name='lsime' codepoint='2A8D'/> + <entity name='lsimg' codepoint='2A8F'/> + <entity name='lsqb' codepoint='005B'/> + <entity name='lsquo' codepoint='2018'/> + <entity name='lsquor' codepoint='201A'/> + <entity name='Lstrok' codepoint='0141'/> + <entity name='lstrok' codepoint='0142'/> + <entity name='lt' codepoint='003C'/> + <entity name='Lt' codepoint='226A'/> + <entity name='ltcc' codepoint='2AA6'/> + <entity name='ltcir' codepoint='2A79'/> + <entity name='ltdot' codepoint='22D6'/> + <entity name='lthree' codepoint='22CB'/> + <entity name='ltimes' codepoint='22C9'/> + <entity name='ltlarr' codepoint='2976'/> + <entity name='ltquest' codepoint='2A7B'/> + <entity name='ltri' codepoint='25C3'/> + <entity name='ltrie' codepoint='22B4'/> + <entity name='ltrif' codepoint='25C2'/> + <entity name='ltrPar' codepoint='2996'/> + <entity name='lurdshar' codepoint='294A'/> + <entity name='luruhar' codepoint='2966'/> + <entity name='macr' codepoint='00AF'/> + <entity name='male' codepoint='2642'/> + <entity name='malt' codepoint='2720'/> + <entity name='maltese' codepoint='2720'/> + <entity name='map' codepoint='21A6'/> + <entity name='Map' codepoint='2905'/> + <entity name='mapsto' codepoint='21A6'/> + <entity name='mapstodown' codepoint='21A7'/> + <entity name='mapstoleft' codepoint='21A4'/> + <entity name='mapstoup' codepoint='21A5'/> + <entity name='marker' codepoint='25AE'/> + <entity name='mcomma' codepoint='2A29'/> + <entity name='Mcy' codepoint='041C'/> + <entity name='mcy' codepoint='043C'/> + <entity name='mdash' codepoint='2014'/> + <entity name='mDDot' codepoint='223A'/> + <entity name='measuredangle' codepoint='2221'/> + <entity name='MediumSpace' codepoint='205F'/> + <entity name='Mellintrf' codepoint='2133'/> + <entity name='Mfr' codepoint='1D510'/> + <entity name='mfr' codepoint='1D52A'/> + <entity name='Mgr' codepoint='039C'/> + <entity name='mgr' codepoint='03BC'/> + <entity name='mho' codepoint='2127'/> + <entity name='micro' codepoint='00B5'/> + <entity name='mid' codepoint='2223'/> + <entity name='midast' codepoint='002A'/> + <entity name='midcir' codepoint='2AF0'/> + <entity name='middot' codepoint='00B7'/> + <entity name='minus' codepoint='2212'/> + <entity name='minusb' codepoint='229F'/> + <entity name='minusd' codepoint='2238'/> + <entity name='minusdu' codepoint='2A2A'/> + <entity name='MinusPlus' codepoint='2213'/> + <entity name='mlcp' codepoint='2ADB'/> + <entity name='mldr' codepoint='2026'/> + <entity name='mnplus' codepoint='2213'/> + <entity name='models' codepoint='22A7'/> + <entity name='Mopf' codepoint='1D544'/> + <entity name='mopf' codepoint='1D55E'/> + <entity name='mp' codepoint='2213'/> + <entity name='Mscr' codepoint='2133'/> + <entity name='mscr' codepoint='1D4C2'/> + <entity name='mstpos' codepoint='223E'/> + <entity name='Mu' codepoint='039C'/> + <entity name='mu' codepoint='03BC'/> + <entity name='multimap' codepoint='22B8'/> + <entity name='mumap' codepoint='22B8'/> + <entity name='nabla' codepoint='2207'/> + <entity name='Nacute' codepoint='0143'/> + <entity name='nacute' codepoint='0144'/> + <entity name='nap' codepoint='2249'/> + <entity name='napos' codepoint='0149'/> + <entity name='napprox' codepoint='2249'/> + <entity name='natur' codepoint='266E'/> + <entity name='natural' codepoint='266E'/> + <entity name='naturals' codepoint='2115'/> + <entity name='nbsp' codepoint='00A0'/> + <entity name='ncap' codepoint='2A43'/> + <entity name='Ncaron' codepoint='0147'/> + <entity name='ncaron' codepoint='0148'/> + <entity name='Ncedil' codepoint='0145'/> + <entity name='ncedil' codepoint='0146'/> + <entity name='ncong' codepoint='2247'/> + <entity name='ncup' codepoint='2A42'/> + <entity name='Ncy' codepoint='041D'/> + <entity name='ncy' codepoint='043D'/> + <entity name='ndash' codepoint='2013'/> + <entity name='ne' codepoint='2260'/> + <entity name='nearhk' codepoint='2924'/> + <entity name='nearr' codepoint='2197'/> + <entity name='neArr' codepoint='21D7'/> + <entity name='nearrow' codepoint='2197'/> + <entity name='NegativeMediumSpace' codepoint='200B'/> + <entity name='NegativeThickSpace' codepoint='200B'/> + <entity name='NegativeThinSpace' codepoint='200B'/> + <entity name='NegativeVeryThinSpace' codepoint='200B'/> + <entity name='nequiv' codepoint='2262'/> + <entity name='nesear' codepoint='2928'/> + <entity name='NestedGreaterGreater' codepoint='226B'/> + <entity name='NestedLessLess' codepoint='226A'/> + <entity name='NewLine' codepoint='000A'/> + <entity name='nexist' codepoint='2204'/> + <entity name='nexists' codepoint='2204'/> + <entity name='Nfr' codepoint='1D511'/> + <entity name='nfr' codepoint='1D52B'/> + <entity name='nge' codepoint='2271'/> + <entity name='ngeq' codepoint='2271'/> + <entity name='Ngr' codepoint='039D'/> + <entity name='ngr' codepoint='03BD'/> + <entity name='ngsim' codepoint='2275'/> + <entity name='ngt' codepoint='226F'/> + <entity name='ngtr' codepoint='226F'/> + <entity name='nharr' codepoint='21AE'/> + <entity name='nhArr' codepoint='21CE'/> + <entity name='nhpar' codepoint='2AF2'/> + <entity name='ni' codepoint='220B'/> + <entity name='nis' codepoint='22FC'/> + <entity name='nisd' codepoint='22FA'/> + <entity name='niv' codepoint='220B'/> + <entity name='NJcy' codepoint='040A'/> + <entity name='njcy' codepoint='045A'/> + <entity name='nlarr' codepoint='219A'/> + <entity name='nlArr' codepoint='21CD'/> + <entity name='nldr' codepoint='2025'/> + <entity name='nle' codepoint='2270'/> + <entity name='nleftarrow' codepoint='219A'/> + <entity name='nLeftarrow' codepoint='21CD'/> + <entity name='nleftrightarrow' codepoint='21AE'/> + <entity name='nLeftrightarrow' codepoint='21CE'/> + <entity name='nleq' codepoint='2270'/> + <entity name='nless' codepoint='226E'/> + <entity name='nlsim' codepoint='2274'/> + <entity name='nlt' codepoint='226E'/> + <entity name='nltri' codepoint='22EA'/> + <entity name='nltrie' codepoint='22EC'/> + <entity name='nmid' codepoint='2224'/> + <entity name='NoBreak' codepoint='2060'/> + <entity name='NonBreakingSpace' codepoint='00A0'/> + <entity name='Nopf' codepoint='2115'/> + <entity name='nopf' codepoint='1D55F'/> + <entity name='not' codepoint='00AC'/> + <entity name='Not' codepoint='2AEC'/> + <entity name='NotCongruent' codepoint='2262'/> + <entity name='NotCupCap' codepoint='226D'/> + <entity name='NotDoubleVerticalBar' codepoint='2226'/> + <entity name='NotElement' codepoint='2209'/> + <entity name='NotEqual' codepoint='2260'/> + <entity name='NotExists' codepoint='2204'/> + <entity name='NotGreater' codepoint='226F'/> + <entity name='NotGreaterEqual' codepoint='2271'/> + <entity name='NotGreaterLess' codepoint='2279'/> + <entity name='NotGreaterTilde' codepoint='2275'/> + <entity name='notin' codepoint='2209'/> + <entity name='notinva' codepoint='2209'/> + <entity name='notinvb' codepoint='22F7'/> + <entity name='notinvc' codepoint='22F6'/> + <entity name='NotLeftTriangle' codepoint='22EA'/> + <entity name='NotLeftTriangleEqual' codepoint='22EC'/> + <entity name='NotLess' codepoint='226E'/> + <entity name='NotLessEqual' codepoint='2270'/> + <entity name='NotLessGreater' codepoint='2278'/> + <entity name='NotLessTilde' codepoint='2274'/> + <entity name='notni' codepoint='220C'/> + <entity name='notniva' codepoint='220C'/> + <entity name='notnivb' codepoint='22FE'/> + <entity name='notnivc' codepoint='22FD'/> + <entity name='NotPrecedes' codepoint='2280'/> + <entity name='NotPrecedesSlantEqual' codepoint='22E0'/> + <entity name='NotReverseElement' codepoint='220C'/> + <entity name='NotRightTriangle' codepoint='22EB'/> + <entity name='NotRightTriangleEqual' codepoint='22ED'/> + <entity name='NotSquareSubsetEqual' codepoint='22E2'/> + <entity name='NotSquareSupersetEqual' codepoint='22E3'/> + <entity name='NotSubsetEqual' codepoint='2288'/> + <entity name='NotSucceeds' codepoint='2281'/> + <entity name='NotSucceedsSlantEqual' codepoint='22E1'/> + <entity name='NotSupersetEqual' codepoint='2289'/> + <entity name='NotTilde' codepoint='2241'/> + <entity name='NotTildeEqual' codepoint='2244'/> + <entity name='NotTildeFullEqual' codepoint='2247'/> + <entity name='NotTildeTilde' codepoint='2249'/> + <entity name='NotVerticalBar' codepoint='2224'/> + <entity name='npar' codepoint='2226'/> + <entity name='nparallel' codepoint='2226'/> + <entity name='npolint' codepoint='2A14'/> + <entity name='npr' codepoint='2280'/> + <entity name='nprcue' codepoint='22E0'/> + <entity name='nprec' codepoint='2280'/> + <entity name='nrarr' codepoint='219B'/> + <entity name='nrArr' codepoint='21CF'/> + <entity name='nrightarrow' codepoint='219B'/> + <entity name='nRightarrow' codepoint='21CF'/> + <entity name='nrtri' codepoint='22EB'/> + <entity name='nrtrie' codepoint='22ED'/> + <entity name='nsc' codepoint='2281'/> + <entity name='nsccue' codepoint='22E1'/> + <entity name='Nscr' codepoint='1D4A9'/> + <entity name='nscr' codepoint='1D4C3'/> + <entity name='nshortmid' codepoint='2224'/> + <entity name='nshortparallel' codepoint='2226'/> + <entity name='nsim' codepoint='2241'/> + <entity name='nsime' codepoint='2244'/> + <entity name='nsimeq' codepoint='2244'/> + <entity name='nsmid' codepoint='2224'/> + <entity name='nspar' codepoint='2226'/> + <entity name='nsqsube' codepoint='22E2'/> + <entity name='nsqsupe' codepoint='22E3'/> + <entity name='nsub' codepoint='2284'/> + <entity name='nsube' codepoint='2288'/> + <entity name='nsubseteq' codepoint='2288'/> + <entity name='nsucc' codepoint='2281'/> + <entity name='nsup' codepoint='2285'/> + <entity name='nsupe' codepoint='2289'/> + <entity name='nsupseteq' codepoint='2289'/> + <entity name='ntgl' codepoint='2279'/> + <entity name='Ntilde' codepoint='00D1'/> + <entity name='ntilde' codepoint='00F1'/> + <entity name='ntlg' codepoint='2278'/> + <entity name='ntriangleleft' codepoint='22EA'/> + <entity name='ntrianglelefteq' codepoint='22EC'/> + <entity name='ntriangleright' codepoint='22EB'/> + <entity name='ntrianglerighteq' codepoint='22ED'/> + <entity name='Nu' codepoint='039D'/> + <entity name='nu' codepoint='03BD'/> + <entity name='num' codepoint='0023'/> + <entity name='numero' codepoint='2116'/> + <entity name='numsp' codepoint='2007'/> + <entity name='nvdash' codepoint='22AC'/> + <entity name='nvDash' codepoint='22AD'/> + <entity name='nVdash' codepoint='22AE'/> + <entity name='nVDash' codepoint='22AF'/> + <entity name='nvHarr' codepoint='2904'/> + <entity name='nvinfin' codepoint='29DE'/> + <entity name='nvlArr' codepoint='2902'/> + <entity name='nvrArr' codepoint='2903'/> + <entity name='nwarhk' codepoint='2923'/> + <entity name='nwarr' codepoint='2196'/> + <entity name='nwArr' codepoint='21D6'/> + <entity name='nwarrow' codepoint='2196'/> + <entity name='nwnear' codepoint='2927'/> + <entity name='Oacgr' codepoint='038C'/> + <entity name='oacgr' codepoint='03CC'/> + <entity name='Oacute' codepoint='00D3'/> + <entity name='oacute' codepoint='00F3'/> + <entity name='oast' codepoint='229B'/> + <entity name='ocir' codepoint='229A'/> + <entity name='Ocirc' codepoint='00D4'/> + <entity name='ocirc' codepoint='00F4'/> + <entity name='Ocy' codepoint='041E'/> + <entity name='ocy' codepoint='043E'/> + <entity name='odash' codepoint='229D'/> + <entity name='Odblac' codepoint='0150'/> + <entity name='odblac' codepoint='0151'/> + <entity name='odiv' codepoint='2A38'/> + <entity name='odot' codepoint='2299'/> + <entity name='odsold' codepoint='29BC'/> + <entity name='OElig' codepoint='0152'/> + <entity name='oelig' codepoint='0153'/> + <entity name='ofcir' codepoint='29BF'/> + <entity name='Ofr' codepoint='1D512'/> + <entity name='ofr' codepoint='1D52C'/> + <entity name='ogon' codepoint='02DB'/> + <entity name='Ogr' codepoint='039F'/> + <entity name='ogr' codepoint='03BF'/> + <entity name='Ograve' codepoint='00D2'/> + <entity name='ograve' codepoint='00F2'/> + <entity name='ogt' codepoint='29C1'/> + <entity name='OHacgr' codepoint='038F'/> + <entity name='ohacgr' codepoint='03CE'/> + <entity name='ohbar' codepoint='29B5'/> + <entity name='OHgr' codepoint='03A9'/> + <entity name='ohgr' codepoint='03C9'/> + <entity name='ohm' codepoint='2126'/> + <entity name='oint' codepoint='222E'/> + <entity name='olarr' codepoint='21BA'/> + <entity name='olcir' codepoint='29BE'/> + <entity name='olcross' codepoint='29BB'/> + <entity name='oline' codepoint='203E'/> + <entity name='olt' codepoint='29C0'/> + <entity name='Omacr' codepoint='014C'/> + <entity name='omacr' codepoint='014D'/> + <entity name='Omega' codepoint='03A9'/> + <entity name='omega' codepoint='03C9'/> + <entity name='Omicron' codepoint='039F'/> + <entity name='omicron' codepoint='03BF'/> + <entity name='omid' codepoint='29B6'/> + <entity name='ominus' codepoint='2296'/> + <entity name='Oopf' codepoint='1D546'/> + <entity name='oopf' codepoint='1D560'/> + <entity name='opar' codepoint='29B7'/> + <entity name='OpenCurlyDoubleQuote' codepoint='201C'/> + <entity name='OpenCurlyQuote' codepoint='2018'/> + <entity name='operp' codepoint='29B9'/> + <entity name='oplus' codepoint='2295'/> + <entity name='or' codepoint='2228'/> + <entity name='Or' codepoint='2A54'/> + <entity name='orarr' codepoint='21BB'/> + <entity name='ord' codepoint='2A5D'/> + <entity name='order' codepoint='2134'/> + <entity name='orderof' codepoint='2134'/> + <entity name='ordf' codepoint='00AA'/> + <entity name='ordm' codepoint='00BA'/> + <entity name='origof' codepoint='22B6'/> + <entity name='oror' codepoint='2A56'/> + <entity name='orslope' codepoint='2A57'/> + <entity name='orv' codepoint='2A5B'/> + <entity name='oS' codepoint='24C8'/> + <entity name='oscr' codepoint='2134'/> + <entity name='Oscr' codepoint='1D4AA'/> + <entity name='Oslash' codepoint='00D8'/> + <entity name='oslash' codepoint='00F8'/> + <entity name='osol' codepoint='2298'/> + <entity name='Otilde' codepoint='00D5'/> + <entity name='otilde' codepoint='00F5'/> + <entity name='otimes' codepoint='2297'/> + <entity name='Otimes' codepoint='2A37'/> + <entity name='otimesas' codepoint='2A36'/> + <entity name='Ouml' codepoint='00D6'/> + <entity name='ouml' codepoint='00F6'/> + <entity name='ovbar' codepoint='233D'/> + <entity name='OverBar' codepoint='00AF'/> + <entity name='OverBrace' codepoint='FE37'/> + <entity name='OverBracket' codepoint='23B4'/> + <entity name='OverParenthesis' codepoint='FE35'/> + <entity name='par' codepoint='2225'/> + <entity name='para' codepoint='00B6'/> + <entity name='parallel' codepoint='2225'/> + <entity name='parsim' codepoint='2AF3'/> + <entity name='parsl' codepoint='2AFD'/> + <entity name='part' codepoint='2202'/> + <entity name='PartialD' codepoint='2202'/> + <entity name='Pcy' codepoint='041F'/> + <entity name='pcy' codepoint='043F'/> + <entity name='percnt' codepoint='0025'/> + <entity name='period' codepoint='002E'/> + <entity name='permil' codepoint='2030'/> + <entity name='perp' codepoint='22A5'/> + <entity name='pertenk' codepoint='2031'/> + <entity name='Pfr' codepoint='1D513'/> + <entity name='pfr' codepoint='1D52D'/> + <entity name='Pgr' codepoint='03A0'/> + <entity name='pgr' codepoint='03C0'/> + <entity name='PHgr' codepoint='03A6'/> + <entity name='phgr' codepoint='03C6'/> + <entity name='Phi' codepoint='03A6'/> + <entity name='phi' codepoint='03D5'/> + <entity name='phiv' codepoint='03C6'/> + <entity name='phmmat' codepoint='2133'/> + <entity name='phone' codepoint='260E'/> + <entity name='Pi' codepoint='03A0'/> + <entity name='pi' codepoint='03C0'/> + <entity name='pitchfork' codepoint='22D4'/> + <entity name='piv' codepoint='03D6'/> + <entity name='planck' codepoint='210F'/> + <entity name='planckh' codepoint='210E'/> + <entity name='plankv' codepoint='210F'/> + <entity name='plus' codepoint='002B'/> + <entity name='plusacir' codepoint='2A23'/> + <entity name='plusb' codepoint='229E'/> + <entity name='pluscir' codepoint='2A22'/> + <entity name='plusdo' codepoint='2214'/> + <entity name='plusdu' codepoint='2A25'/> + <entity name='pluse' codepoint='2A72'/> + <entity name='PlusMinus' codepoint='00B1'/> + <entity name='plusmn' codepoint='00B1'/> + <entity name='plussim' codepoint='2A26'/> + <entity name='plustwo' codepoint='2A27'/> + <entity name='pm' codepoint='00B1'/> + <entity name='Poincareplane' codepoint='210C'/> + <entity name='pointint' codepoint='2A15'/> + <entity name='Popf' codepoint='2119'/> + <entity name='popf' codepoint='1D561'/> + <entity name='pound' codepoint='00A3'/> + <entity name='pr' codepoint='227A'/> + <entity name='Pr' codepoint='2ABB'/> + <entity name='prap' codepoint='2AB7'/> + <entity name='prcue' codepoint='227C'/> + <entity name='pre' codepoint='2AAF'/> + <entity name='prE' codepoint='2AB3'/> + <entity name='prec' codepoint='227A'/> + <entity name='precapprox' codepoint='2AB7'/> + <entity name='preccurlyeq' codepoint='227C'/> + <entity name='Precedes' codepoint='227A'/> + <entity name='PrecedesEqual' codepoint='2AAF'/> + <entity name='PrecedesSlantEqual' codepoint='227C'/> + <entity name='PrecedesTilde' codepoint='227E'/> + <entity name='preceq' codepoint='2AAF'/> + <entity name='precnapprox' codepoint='2AB9'/> + <entity name='precneqq' codepoint='2AB5'/> + <entity name='precnsim' codepoint='22E8'/> + <entity name='precsim' codepoint='227E'/> + <entity name='prime' codepoint='2032'/> + <entity name='Prime' codepoint='2033'/> + <entity name='primes' codepoint='2119'/> + <entity name='prnap' codepoint='2AB9'/> + <entity name='prnE' codepoint='2AB5'/> + <entity name='prnsim' codepoint='22E8'/> + <entity name='prod' codepoint='220F'/> + <entity name='Product' codepoint='220F'/> + <entity name='profalar' codepoint='232E'/> + <entity name='profline' codepoint='2312'/> + <entity name='profsurf' codepoint='2313'/> + <entity name='prop' codepoint='221D'/> + <entity name='Proportion' codepoint='2237'/> + <entity name='Proportional' codepoint='221D'/> + <entity name='propto' codepoint='221D'/> + <entity name='prsim' codepoint='227E'/> + <entity name='prurel' codepoint='22B0'/> + <entity name='Pscr' codepoint='1D4AB'/> + <entity name='pscr' codepoint='1D4C5'/> + <entity name='PSgr' codepoint='03A8'/> + <entity name='psgr' codepoint='03C8'/> + <entity name='Psi' codepoint='03A8'/> + <entity name='psi' codepoint='03C8'/> + <entity name='puncsp' codepoint='2008'/> + <entity name='Qfr' codepoint='1D514'/> + <entity name='qfr' codepoint='1D52E'/> + <entity name='qint' codepoint='2A0C'/> + <entity name='Qopf' codepoint='211A'/> + <entity name='qopf' codepoint='1D562'/> + <entity name='qprime' codepoint='2057'/> + <entity name='Qscr' codepoint='1D4AC'/> + <entity name='qscr' codepoint='1D4C6'/> + <entity name='quaternions' codepoint='210D'/> + <entity name='quatint' codepoint='2A16'/> + <entity name='quest' codepoint='003F'/> + <entity name='questeq' codepoint='225F'/> + <entity name='quot' codepoint='0022'/> + <entity name='rAarr' codepoint='21DB'/> + <entity name='race' codepoint='29DA'/> + <entity name='Racute' codepoint='0154'/> + <entity name='racute' codepoint='0155'/> + <entity name='radic' codepoint='221A'/> + <entity name='raemptyv' codepoint='29B3'/> + <entity name='rang' codepoint='232A'/> + <entity name='Rang' codepoint='27EB'/> + <entity name='rangd' codepoint='2992'/> + <entity name='range' codepoint='29A5'/> + <entity name='rangle' codepoint='232A'/> + <entity name='raquo' codepoint='00BB'/> + <entity name='rarr' codepoint='2192'/> + <entity name='Rarr' codepoint='21A0'/> + <entity name='rArr' codepoint='21D2'/> + <entity name='rarrap' codepoint='2975'/> + <entity name='rarrb' codepoint='21E5'/> + <entity name='rarrbfs' codepoint='2920'/> + <entity name='rarrc' codepoint='2933'/> + <entity name='rarrfs' codepoint='291E'/> + <entity name='rarrhk' codepoint='21AA'/> + <entity name='rarrlp' codepoint='21AC'/> + <entity name='rarrpl' codepoint='2945'/> + <entity name='rarrsim' codepoint='2974'/> + <entity name='rarrtl' codepoint='21A3'/> + <entity name='Rarrtl' codepoint='2916'/> + <entity name='rarrw' codepoint='219D'/> + <entity name='ratail' codepoint='291A'/> + <entity name='rAtail' codepoint='291C'/> + <entity name='ratio' codepoint='2236'/> + <entity name='rationals' codepoint='211A'/> + <entity name='rbarr' codepoint='290D'/> + <entity name='rBarr' codepoint='290F'/> + <entity name='RBarr' codepoint='2910'/> + <entity name='rbbrk' codepoint='2998'/> + <entity name='rbrace' codepoint='007D'/> + <entity name='rbrack' codepoint='005D'/> + <entity name='rbrke' codepoint='298C'/> + <entity name='rbrksld' codepoint='298E'/> + <entity name='rbrkslu' codepoint='2990'/> + <entity name='Rcaron' codepoint='0158'/> + <entity name='rcaron' codepoint='0159'/> + <entity name='Rcedil' codepoint='0156'/> + <entity name='rcedil' codepoint='0157'/> + <entity name='rceil' codepoint='2309'/> + <entity name='rcub' codepoint='007D'/> + <entity name='Rcy' codepoint='0420'/> + <entity name='rcy' codepoint='0440'/> + <entity name='rdca' codepoint='2937'/> + <entity name='rdldhar' codepoint='2969'/> + <entity name='rdquo' codepoint='201D'/> + <entity name='rdquor' codepoint='201D'/> + <entity name='rdsh' codepoint='21B3'/> + <entity name='Re' codepoint='211C'/> + <entity name='real' codepoint='211C'/> + <entity name='realine' codepoint='211B'/> + <entity name='realpart' codepoint='211C'/> + <entity name='reals' codepoint='211D'/> + <entity name='rect' codepoint='25AD'/> + <entity name='reg' codepoint='00AE'/> + <entity name='ReverseElement' codepoint='220B'/> + <entity name='ReverseEquilibrium' codepoint='21CB'/> + <entity name='ReverseUpEquilibrium' codepoint='296F'/> + <entity name='rfisht' codepoint='297D'/> + <entity name='rfloor' codepoint='230B'/> + <entity name='Rfr' codepoint='211C'/> + <entity name='rfr' codepoint='1D52F'/> + <entity name='Rgr' codepoint='03A1'/> + <entity name='rgr' codepoint='03C1'/> + <entity name='rHar' codepoint='2964'/> + <entity name='rhard' codepoint='21C1'/> + <entity name='rharu' codepoint='21C0'/> + <entity name='rharul' codepoint='296C'/> + <entity name='Rho' codepoint='03A1'/> + <entity name='rho' codepoint='03C1'/> + <entity name='rhov' codepoint='03F1'/> + <entity name='RightAngleBracket' codepoint='232A'/> + <entity name='rightarrow' codepoint='2192'/> + <entity name='Rightarrow' codepoint='21D2'/> + <entity name='RightArrowBar' codepoint='21E5'/> + <entity name='RightArrowLeftArrow' codepoint='21C4'/> + <entity name='rightarrowtail' codepoint='21A3'/> + <entity name='RightCeiling' codepoint='2309'/> + <entity name='RightDoubleBracket' codepoint='27E7'/> + <entity name='RightDownTeeVector' codepoint='295D'/> + <entity name='RightDownVector' codepoint='21C2'/> + <entity name='RightDownVectorBar' codepoint='2955'/> + <entity name='RightFloor' codepoint='230B'/> + <entity name='rightharpoondown' codepoint='21C1'/> + <entity name='rightharpoonup' codepoint='21C0'/> + <entity name='rightleftarrows' codepoint='21C4'/> + <entity name='rightleftharpoons' codepoint='21CC'/> + <entity name='rightrightarrows' codepoint='21C9'/> + <entity name='rightsquigarrow' codepoint='219D'/> + <entity name='RightTee' codepoint='22A2'/> + <entity name='RightTeeArrow' codepoint='21A6'/> + <entity name='RightTeeVector' codepoint='295B'/> + <entity name='rightthreetimes' codepoint='22CC'/> + <entity name='RightTriangle' codepoint='22B3'/> + <entity name='RightTriangleBar' codepoint='29D0'/> + <entity name='RightTriangleEqual' codepoint='22B5'/> + <entity name='RightUpDownVector' codepoint='294F'/> + <entity name='RightUpTeeVector' codepoint='295C'/> + <entity name='RightUpVector' codepoint='21BE'/> + <entity name='RightUpVectorBar' codepoint='2954'/> + <entity name='RightVector' codepoint='21C0'/> + <entity name='RightVectorBar' codepoint='2953'/> + <entity name='ring' codepoint='02DA'/> + <entity name='risingdotseq' codepoint='2253'/> + <entity name='rlarr' codepoint='21C4'/> + <entity name='rlhar' codepoint='21CC'/> + <entity name='rlm' codepoint='200F'/> + <entity name='rmoust' codepoint='23B1'/> + <entity name='rmoustache' codepoint='23B1'/> + <entity name='rnmid' codepoint='2AEE'/> + <entity name='roang' codepoint='27ED'/> + <entity name='roarr' codepoint='21FE'/> + <entity name='robrk' codepoint='27E7'/> + <entity name='ropar' codepoint='2986'/> + <entity name='Ropf' codepoint='211D'/> + <entity name='ropf' codepoint='1D563'/> + <entity name='roplus' codepoint='2A2E'/> + <entity name='rotimes' codepoint='2A35'/> + <entity name='RoundImplies' codepoint='2970'/> + <entity name='rpar' codepoint='0029'/> + <entity name='rpargt' codepoint='2994'/> + <entity name='rppolint' codepoint='2A12'/> + <entity name='rrarr' codepoint='21C9'/> + <entity name='Rrightarrow' codepoint='21DB'/> + <entity name='rsaquo' codepoint='203A'/> + <entity name='Rscr' codepoint='211B'/> + <entity name='rscr' codepoint='1D4C7'/> + <entity name='rsh' codepoint='21B1'/> + <entity name='rsqb' codepoint='005D'/> + <entity name='rsquo' codepoint='2019'/> + <entity name='rsquor' codepoint='2019'/> + <entity name='rthree' codepoint='22CC'/> + <entity name='rtimes' codepoint='22CA'/> + <entity name='rtri' codepoint='25B9'/> + <entity name='rtrie' codepoint='22B5'/> + <entity name='rtrif' codepoint='25B8'/> + <entity name='rtriltri' codepoint='29CE'/> + <entity name='RuleDelayed' codepoint='29F4'/> + <entity name='ruluhar' codepoint='2968'/> + <entity name='rx' codepoint='211E'/> + <entity name='Sacute' codepoint='015A'/> + <entity name='sacute' codepoint='015B'/> + <entity name='sbquo' codepoint='201A'/> + <entity name='sc' codepoint='227B'/> + <entity name='Sc' codepoint='2ABC'/> + <entity name='scap' codepoint='2AB8'/> + <entity name='Scaron' codepoint='0160'/> + <entity name='scaron' codepoint='0161'/> + <entity name='sccue' codepoint='227D'/> + <entity name='sce' codepoint='2AB0'/> + <entity name='scE' codepoint='2AB4'/> + <entity name='Scedil' codepoint='015E'/> + <entity name='scedil' codepoint='015F'/> + <entity name='Scirc' codepoint='015C'/> + <entity name='scirc' codepoint='015D'/> + <entity name='scnap' codepoint='2ABA'/> + <entity name='scnE' codepoint='2AB6'/> + <entity name='scnsim' codepoint='22E9'/> + <entity name='scpolint' codepoint='2A13'/> + <entity name='scsim' codepoint='227F'/> + <entity name='Scy' codepoint='0421'/> + <entity name='scy' codepoint='0441'/> + <entity name='sdot' codepoint='22C5'/> + <entity name='sdotb' codepoint='22A1'/> + <entity name='sdote' codepoint='2A66'/> + <entity name='searhk' codepoint='2925'/> + <entity name='searr' codepoint='2198'/> + <entity name='seArr' codepoint='21D8'/> + <entity name='searrow' codepoint='2198'/> + <entity name='sect' codepoint='00A7'/> + <entity name='semi' codepoint='003B'/> + <entity name='seswar' codepoint='2929'/> + <entity name='setminus' codepoint='2216'/> + <entity name='setmn' codepoint='2216'/> + <entity name='sext' codepoint='2736'/> + <entity name='sfgr' codepoint='03C2'/> + <entity name='Sfr' codepoint='1D516'/> + <entity name='sfr' codepoint='1D530'/> + <entity name='sfrown' codepoint='2322'/> + <entity name='Sgr' codepoint='03A3'/> + <entity name='sgr' codepoint='03C3'/> + <entity name='sharp' codepoint='266F'/> + <entity name='SHCHcy' codepoint='0429'/> + <entity name='shchcy' codepoint='0449'/> + <entity name='SHcy' codepoint='0428'/> + <entity name='shcy' codepoint='0448'/> + <entity name='ShortDownArrow' codepoint='2193'/> + <entity name='ShortLeftArrow' codepoint='2190'/> + <entity name='shortmid' codepoint='2223'/> + <entity name='shortparallel' codepoint='2225'/> + <entity name='ShortRightArrow' codepoint='2192'/> + <entity name='ShortUpArrow' codepoint='2191'/> + <entity name='shy' codepoint='00AD'/> + <entity name='Sigma' codepoint='03A3'/> + <entity name='sigma' codepoint='03C3'/> + <entity name='sigmaf' codepoint='03C2'/> + <entity name='sigmav' codepoint='03C2'/> + <entity name='sim' codepoint='223C'/> + <entity name='simdot' codepoint='2A6A'/> + <entity name='sime' codepoint='2243'/> + <entity name='simeq' codepoint='2243'/> + <entity name='simg' codepoint='2A9E'/> + <entity name='simgE' codepoint='2AA0'/> + <entity name='siml' codepoint='2A9D'/> + <entity name='simlE' codepoint='2A9F'/> + <entity name='simne' codepoint='2246'/> + <entity name='simplus' codepoint='2A24'/> + <entity name='simrarr' codepoint='2972'/> + <entity name='slarr' codepoint='2190'/> + <entity name='SmallCircle' codepoint='2218'/> + <entity name='smallsetminus' codepoint='2216'/> + <entity name='smashp' codepoint='2A33'/> + <entity name='smeparsl' codepoint='29E4'/> + <entity name='smid' codepoint='2223'/> + <entity name='smile' codepoint='2323'/> + <entity name='smt' codepoint='2AAA'/> + <entity name='smte' codepoint='2AAC'/> + <entity name='SOFTcy' codepoint='042C'/> + <entity name='softcy' codepoint='044C'/> + <entity name='sol' codepoint='002F'/> + <entity name='solb' codepoint='29C4'/> + <entity name='solbar' codepoint='233F'/> + <entity name='Sopf' codepoint='1D54A'/> + <entity name='sopf' codepoint='1D564'/> + <entity name='spades' codepoint='2660'/> + <entity name='spadesuit' codepoint='2660'/> + <entity name='spar' codepoint='2225'/> + <entity name='sqcap' codepoint='2293'/> + <entity name='sqcup' codepoint='2294'/> + <entity name='Sqrt' codepoint='221A'/> + <entity name='sqsub' codepoint='228F'/> + <entity name='sqsube' codepoint='2291'/> + <entity name='sqsubset' codepoint='228F'/> + <entity name='sqsubseteq' codepoint='2291'/> + <entity name='sqsup' codepoint='2290'/> + <entity name='sqsupe' codepoint='2292'/> + <entity name='sqsupset' codepoint='2290'/> + <entity name='sqsupseteq' codepoint='2292'/> + <entity name='squ' codepoint='25A1'/> + <entity name='square' codepoint='25A1'/> + <entity name='SquareIntersection' codepoint='2293'/> + <entity name='SquareSubset' codepoint='228F'/> + <entity name='SquareSubsetEqual' codepoint='2291'/> + <entity name='SquareSuperset' codepoint='2290'/> + <entity name='SquareSupersetEqual' codepoint='2292'/> + <entity name='SquareUnion' codepoint='2294'/> + <entity name='squarf' codepoint='25AA'/> + <entity name='squf' codepoint='25AA'/> + <entity name='srarr' codepoint='2192'/> + <entity name='Sscr' codepoint='1D4AE'/> + <entity name='sscr' codepoint='1D4C8'/> + <entity name='ssetmn' codepoint='2216'/> + <entity name='ssmile' codepoint='2323'/> + <entity name='sstarf' codepoint='22C6'/> + <entity name='Star' codepoint='22C6'/> + <entity name='star' codepoint='2606'/> + <entity name='starf' codepoint='2605'/> + <entity name='straightepsilon' codepoint='03F5'/> + <entity name='straightphi' codepoint='03D5'/> + <entity name='strns' codepoint='00AF'/> + <entity name='sub' codepoint='2282'/> + <entity name='Sub' codepoint='22D0'/> + <entity name='subdot' codepoint='2ABD'/> + <entity name='sube' codepoint='2286'/> + <entity name='subE' codepoint='2AC5'/> + <entity name='subedot' codepoint='2AC3'/> + <entity name='submult' codepoint='2AC1'/> + <entity name='subne' codepoint='228A'/> + <entity name='subnE' codepoint='2ACB'/> + <entity name='subplus' codepoint='2ABF'/> + <entity name='subrarr' codepoint='2979'/> + <entity name='subset' codepoint='2282'/> + <entity name='Subset' codepoint='22D0'/> + <entity name='subseteq' codepoint='2286'/> + <entity name='subseteqq' codepoint='2AC5'/> + <entity name='SubsetEqual' codepoint='2286'/> + <entity name='subsetneq' codepoint='228A'/> + <entity name='subsetneqq' codepoint='2ACB'/> + <entity name='subsim' codepoint='2AC7'/> + <entity name='subsub' codepoint='2AD5'/> + <entity name='subsup' codepoint='2AD3'/> + <entity name='succ' codepoint='227B'/> + <entity name='succapprox' codepoint='2AB8'/> + <entity name='succcurlyeq' codepoint='227D'/> + <entity name='Succeeds' codepoint='227B'/> + <entity name='SucceedsEqual' codepoint='2AB0'/> + <entity name='SucceedsSlantEqual' codepoint='227D'/> + <entity name='SucceedsTilde' codepoint='227F'/> + <entity name='succeq' codepoint='2AB0'/> + <entity name='succnapprox' codepoint='2ABA'/> + <entity name='succneqq' codepoint='2AB6'/> + <entity name='succnsim' codepoint='22E9'/> + <entity name='succsim' codepoint='227F'/> + <entity name='SuchThat' codepoint='220B'/> + <entity name='sum' codepoint='2211'/> + <entity name='sung' codepoint='266A'/> + <entity name='sup' codepoint='2283'/> + <entity name='Sup' codepoint='22D1'/> + <entity name='sup1' codepoint='00B9'/> + <entity name='sup2' codepoint='00B2'/> + <entity name='sup3' codepoint='00B3'/> + <entity name='supdot' codepoint='2ABE'/> + <entity name='supdsub' codepoint='2AD8'/> + <entity name='supe' codepoint='2287'/> + <entity name='supE' codepoint='2AC6'/> + <entity name='supedot' codepoint='2AC4'/> + <entity name='Superset' codepoint='2283'/> + <entity name='SupersetEqual' codepoint='2287'/> + <entity name='suphsub' codepoint='2AD7'/> + <entity name='suplarr' codepoint='297B'/> + <entity name='supmult' codepoint='2AC2'/> + <entity name='supne' codepoint='228B'/> + <entity name='supnE' codepoint='2ACC'/> + <entity name='supplus' codepoint='2AC0'/> + <entity name='supset' codepoint='2283'/> + <entity name='Supset' codepoint='22D1'/> + <entity name='supseteq' codepoint='2287'/> + <entity name='supseteqq' codepoint='2AC6'/> + <entity name='supsetneq' codepoint='228B'/> + <entity name='supsetneqq' codepoint='2ACC'/> + <entity name='supsim' codepoint='2AC8'/> + <entity name='supsub' codepoint='2AD4'/> + <entity name='supsup' codepoint='2AD6'/> + <entity name='swarhk' codepoint='2926'/> + <entity name='swarr' codepoint='2199'/> + <entity name='swArr' codepoint='21D9'/> + <entity name='swarrow' codepoint='2199'/> + <entity name='swnwar' codepoint='292A'/> + <entity name='szlig' codepoint='00DF'/> + <entity name='Tab' codepoint='0009'/> + <entity name='target' codepoint='2316'/> + <entity name='Tau' codepoint='03A4'/> + <entity name='tau' codepoint='03C4'/> + <entity name='tbrk' codepoint='23B4'/> + <entity name='Tcaron' codepoint='0164'/> + <entity name='tcaron' codepoint='0165'/> + <entity name='Tcedil' codepoint='0162'/> + <entity name='tcedil' codepoint='0163'/> + <entity name='Tcy' codepoint='0422'/> + <entity name='tcy' codepoint='0442'/> + <entity name='telrec' codepoint='2315'/> + <entity name='Tfr' codepoint='1D517'/> + <entity name='tfr' codepoint='1D531'/> + <entity name='Tgr' codepoint='03A4'/> + <entity name='tgr' codepoint='03C4'/> + <entity name='there4' codepoint='2234'/> + <entity name='therefore' codepoint='2234'/> + <entity name='Theta' codepoint='0398'/> + <entity name='theta' codepoint='03B8'/> + <entity name='thetasym' codepoint='03D1'/> + <entity name='thetav' codepoint='03D1'/> + <entity name='THgr' codepoint='0398'/> + <entity name='thgr' codepoint='03B8'/> + <entity name='thickapprox' codepoint='2248'/> + <entity name='thicksim' codepoint='223C'/> + <entity name='thinsp' codepoint='2009'/> + <entity name='ThinSpace' codepoint='2009'/> + <entity name='thkap' codepoint='2248'/> + <entity name='thksim' codepoint='223C'/> + <entity name='THORN' codepoint='00DE'/> + <entity name='thorn' codepoint='00FE'/> + <entity name='tilde' codepoint='02DC'/> + <entity name='Tilde' codepoint='223C'/> + <entity name='TildeEqual' codepoint='2243'/> + <entity name='TildeFullEqual' codepoint='2245'/> + <entity name='TildeTilde' codepoint='2248'/> + <entity name='times' codepoint='00D7'/> + <entity name='timesb' codepoint='22A0'/> + <entity name='timesbar' codepoint='2A31'/> + <entity name='timesd' codepoint='2A30'/> + <entity name='tint' codepoint='222D'/> + <entity name='toea' codepoint='2928'/> + <entity name='top' codepoint='22A4'/> + <entity name='topbot' codepoint='2336'/> + <entity name='topcir' codepoint='2AF1'/> + <entity name='Topf' codepoint='1D54B'/> + <entity name='topf' codepoint='1D565'/> + <entity name='topfork' codepoint='2ADA'/> + <entity name='tosa' codepoint='2929'/> + <entity name='tprime' codepoint='2034'/> + <entity name='trade' codepoint='2122'/> + <entity name='triangle' codepoint='25B5'/> + <entity name='triangledown' codepoint='25BF'/> + <entity name='triangleleft' codepoint='25C3'/> + <entity name='trianglelefteq' codepoint='22B4'/> + <entity name='triangleq' codepoint='225C'/> + <entity name='triangleright' codepoint='25B9'/> + <entity name='trianglerighteq' codepoint='22B5'/> + <entity name='tridot' codepoint='25EC'/> + <entity name='trie' codepoint='225C'/> + <entity name='triminus' codepoint='2A3A'/> + <entity name='triplus' codepoint='2A39'/> + <entity name='trisb' codepoint='29CD'/> + <entity name='tritime' codepoint='2A3B'/> + <entity name='trpezium' codepoint='23E2'/> + <entity name='Tscr' codepoint='1D4AF'/> + <entity name='tscr' codepoint='1D4C9'/> + <entity name='TScy' codepoint='0426'/> + <entity name='tscy' codepoint='0446'/> + <entity name='TSHcy' codepoint='040B'/> + <entity name='tshcy' codepoint='045B'/> + <entity name='Tstrok' codepoint='0166'/> + <entity name='tstrok' codepoint='0167'/> + <entity name='twixt' codepoint='226C'/> + <entity name='twoheadleftarrow' codepoint='219E'/> + <entity name='twoheadrightarrow' codepoint='21A0'/> + <entity name='Uacgr' codepoint='038E'/> + <entity name='uacgr' codepoint='03CD'/> + <entity name='Uacute' codepoint='00DA'/> + <entity name='uacute' codepoint='00FA'/> + <entity name='uarr' codepoint='2191'/> + <entity name='Uarr' codepoint='219F'/> + <entity name='uArr' codepoint='21D1'/> + <entity name='Uarrocir' codepoint='2949'/> + <entity name='Ubrcy' codepoint='040E'/> + <entity name='ubrcy' codepoint='045E'/> + <entity name='Ubreve' codepoint='016C'/> + <entity name='ubreve' codepoint='016D'/> + <entity name='Ucirc' codepoint='00DB'/> + <entity name='ucirc' codepoint='00FB'/> + <entity name='Ucy' codepoint='0423'/> + <entity name='ucy' codepoint='0443'/> + <entity name='udarr' codepoint='21C5'/> + <entity name='Udblac' codepoint='0170'/> + <entity name='udblac' codepoint='0171'/> + <entity name='udhar' codepoint='296E'/> + <entity name='udiagr' codepoint='03B0'/> + <entity name='Udigr' codepoint='03AB'/> + <entity name='udigr' codepoint='03CB'/> + <entity name='ufisht' codepoint='297E'/> + <entity name='Ufr' codepoint='1D518'/> + <entity name='ufr' codepoint='1D532'/> + <entity name='Ugr' codepoint='03A5'/> + <entity name='ugr' codepoint='03C5'/> + <entity name='Ugrave' codepoint='00D9'/> + <entity name='ugrave' codepoint='00F9'/> + <entity name='uHar' codepoint='2963'/> + <entity name='uharl' codepoint='21BF'/> + <entity name='uharr' codepoint='21BE'/> + <entity name='uhblk' codepoint='2580'/> + <entity name='ulcorn' codepoint='231C'/> + <entity name='ulcorner' codepoint='231C'/> + <entity name='ulcrop' codepoint='230F'/> + <entity name='ultri' codepoint='25F8'/> + <entity name='Umacr' codepoint='016A'/> + <entity name='umacr' codepoint='016B'/> + <entity name='uml' codepoint='00A8'/> + <entity name='UnderBrace' codepoint='FE38'/> + <entity name='UnderBracket' codepoint='23B5'/> + <entity name='UnderParenthesis' codepoint='FE36'/> + <entity name='Union' codepoint='22C3'/> + <entity name='UnionPlus' codepoint='228E'/> + <entity name='Uogon' codepoint='0172'/> + <entity name='uogon' codepoint='0173'/> + <entity name='Uopf' codepoint='1D54C'/> + <entity name='uopf' codepoint='1D566'/> + <entity name='uparrow' codepoint='2191'/> + <entity name='Uparrow' codepoint='21D1'/> + <entity name='UpArrowBar' codepoint='2912'/> + <entity name='UpArrowDownArrow' codepoint='21C5'/> + <entity name='updownarrow' codepoint='2195'/> + <entity name='Updownarrow' codepoint='21D5'/> + <entity name='UpEquilibrium' codepoint='296E'/> + <entity name='upharpoonleft' codepoint='21BF'/> + <entity name='upharpoonright' codepoint='21BE'/> + <entity name='uplus' codepoint='228E'/> + <entity name='UpperLeftArrow' codepoint='2196'/> + <entity name='UpperRightArrow' codepoint='2197'/> + <entity name='upsi' codepoint='03C5'/> + <entity name='Upsi' codepoint='03D2'/> + <entity name='upsih' codepoint='03D2'/> + <entity name='Upsilon' codepoint='03A5'/> + <entity name='upsilon' codepoint='03C5'/> + <entity name='UpTee' codepoint='22A5'/> + <entity name='UpTeeArrow' codepoint='21A5'/> + <entity name='upuparrows' codepoint='21C8'/> + <entity name='urcorn' codepoint='231D'/> + <entity name='urcorner' codepoint='231D'/> + <entity name='urcrop' codepoint='230E'/> + <entity name='Uring' codepoint='016E'/> + <entity name='uring' codepoint='016F'/> + <entity name='urtri' codepoint='25F9'/> + <entity name='Uscr' codepoint='1D4B0'/> + <entity name='uscr' codepoint='1D4CA'/> + <entity name='utdot' codepoint='22F0'/> + <entity name='Utilde' codepoint='0168'/> + <entity name='utilde' codepoint='0169'/> + <entity name='utri' codepoint='25B5'/> + <entity name='utrif' codepoint='25B4'/> + <entity name='uuarr' codepoint='21C8'/> + <entity name='Uuml' codepoint='00DC'/> + <entity name='uuml' codepoint='00FC'/> + <entity name='uwangle' codepoint='29A7'/> + <entity name='vangrt' codepoint='299C'/> + <entity name='varepsilon' codepoint='03B5'/> + <entity name='varkappa' codepoint='03F0'/> + <entity name='varnothing' codepoint='2205'/> + <entity name='varphi' codepoint='03C6'/> + <entity name='varpi' codepoint='03D6'/> + <entity name='varpropto' codepoint='221D'/> + <entity name='varr' codepoint='2195'/> + <entity name='vArr' codepoint='21D5'/> + <entity name='varrho' codepoint='03F1'/> + <entity name='varsigma' codepoint='03C2'/> + <entity name='vartheta' codepoint='03D1'/> + <entity name='vartriangleleft' codepoint='22B2'/> + <entity name='vartriangleright' codepoint='22B3'/> + <entity name='vBar' codepoint='2AE8'/> + <entity name='Vbar' codepoint='2AEB'/> + <entity name='vBarv' codepoint='2AE9'/> + <entity name='Vcy' codepoint='0412'/> + <entity name='vcy' codepoint='0432'/> + <entity name='vdash' codepoint='22A2'/> + <entity name='vDash' codepoint='22A8'/> + <entity name='Vdash' codepoint='22A9'/> + <entity name='VDash' codepoint='22AB'/> + <entity name='Vdashl' codepoint='2AE6'/> + <entity name='vee' codepoint='2228'/> + <entity name='Vee' codepoint='22C1'/> + <entity name='veebar' codepoint='22BB'/> + <entity name='veeeq' codepoint='225A'/> + <entity name='vellip' codepoint='22EE'/> + <entity name='verbar' codepoint='007C'/> + <entity name='Verbar' codepoint='2016'/> + <entity name='vert' codepoint='007C'/> + <entity name='Vert' codepoint='2016'/> + <entity name='VerticalBar' codepoint='2223'/> + <entity name='VerticalLine' codepoint='007C'/> + <entity name='VerticalSeparator' codepoint='2758'/> + <entity name='VerticalTilde' codepoint='2240'/> + <entity name='VeryThinSpace' codepoint='200A'/> + <entity name='Vfr' codepoint='1D519'/> + <entity name='vfr' codepoint='1D533'/> + <entity name='vltri' codepoint='22B2'/> + <entity name='Vopf' codepoint='1D54D'/> + <entity name='vopf' codepoint='1D567'/> + <entity name='vprop' codepoint='221D'/> + <entity name='vrtri' codepoint='22B3'/> + <entity name='Vscr' codepoint='1D4B1'/> + <entity name='vscr' codepoint='1D4CB'/> + <entity name='Vvdash' codepoint='22AA'/> + <entity name='vzigzag' codepoint='299A'/> + <entity name='Wcirc' codepoint='0174'/> + <entity name='wcirc' codepoint='0175'/> + <entity name='wedbar' codepoint='2A5F'/> + <entity name='wedge' codepoint='2227'/> + <entity name='Wedge' codepoint='22C0'/> + <entity name='wedgeq' codepoint='2259'/> + <entity name='weierp' codepoint='2118'/> + <entity name='Wfr' codepoint='1D51A'/> + <entity name='wfr' codepoint='1D534'/> + <entity name='Wopf' codepoint='1D54E'/> + <entity name='wopf' codepoint='1D568'/> + <entity name='wp' codepoint='2118'/> + <entity name='wr' codepoint='2240'/> + <entity name='wreath' codepoint='2240'/> + <entity name='Wscr' codepoint='1D4B2'/> + <entity name='wscr' codepoint='1D4CC'/> + <entity name='xcap' codepoint='22C2'/> + <entity name='xcirc' codepoint='25EF'/> + <entity name='xcup' codepoint='22C3'/> + <entity name='xdtri' codepoint='25BD'/> + <entity name='Xfr' codepoint='1D51B'/> + <entity name='xfr' codepoint='1D535'/> + <entity name='Xgr' codepoint='039E'/> + <entity name='xgr' codepoint='03BE'/> + <entity name='xharr' codepoint='27F7'/> + <entity name='xhArr' codepoint='27FA'/> + <entity name='Xi' codepoint='039E'/> + <entity name='xi' codepoint='03BE'/> + <entity name='xlarr' codepoint='27F5'/> + <entity name='xlArr' codepoint='27F8'/> + <entity name='xmap' codepoint='27FC'/> + <entity name='xnis' codepoint='22FB'/> + <entity name='xodot' codepoint='2A00'/> + <entity name='Xopf' codepoint='1D54F'/> + <entity name='xopf' codepoint='1D569'/> + <entity name='xoplus' codepoint='2A01'/> + <entity name='xotime' codepoint='2A02'/> + <entity name='xrarr' codepoint='27F6'/> + <entity name='xrArr' codepoint='27F9'/> + <entity name='Xscr' codepoint='1D4B3'/> + <entity name='xscr' codepoint='1D4CD'/> + <entity name='xsqcup' codepoint='2A06'/> + <entity name='xuplus' codepoint='2A04'/> + <entity name='xutri' codepoint='25B3'/> + <entity name='xvee' codepoint='22C1'/> + <entity name='xwedge' codepoint='22C0'/> + <entity name='Yacute' codepoint='00DD'/> + <entity name='yacute' codepoint='00FD'/> + <entity name='YAcy' codepoint='042F'/> + <entity name='yacy' codepoint='044F'/> + <entity name='Ycirc' codepoint='0176'/> + <entity name='ycirc' codepoint='0177'/> + <entity name='Ycy' codepoint='042B'/> + <entity name='ycy' codepoint='044B'/> + <entity name='yen' codepoint='00A5'/> + <entity name='Yfr' codepoint='1D51C'/> + <entity name='yfr' codepoint='1D536'/> + <entity name='YIcy' codepoint='0407'/> + <entity name='yicy' codepoint='0457'/> + <entity name='Yopf' codepoint='1D550'/> + <entity name='yopf' codepoint='1D56A'/> + <entity name='Yscr' codepoint='1D4B4'/> + <entity name='yscr' codepoint='1D4CE'/> + <entity name='YUcy' codepoint='042E'/> + <entity name='yucy' codepoint='044E'/> + <entity name='yuml' codepoint='00FF'/> + <entity name='Yuml' codepoint='0178'/> + <entity name='Zacute' codepoint='0179'/> + <entity name='zacute' codepoint='017A'/> + <entity name='Zcaron' codepoint='017D'/> + <entity name='zcaron' codepoint='017E'/> + <entity name='Zcy' codepoint='0417'/> + <entity name='zcy' codepoint='0437'/> + <entity name='Zdot' codepoint='017B'/> + <entity name='zdot' codepoint='017C'/> + <entity name='zeetrf' codepoint='2128'/> + <entity name='ZeroWidthSpace' codepoint='200B'/> + <entity name='Zeta' codepoint='0396'/> + <entity name='zeta' codepoint='03B6'/> + <entity name='Zfr' codepoint='2128'/> + <entity name='zfr' codepoint='1D537'/> + <entity name='Zgr' codepoint='0396'/> + <entity name='zgr' codepoint='03B6'/> + <entity name='ZHcy' codepoint='0416'/> + <entity name='zhcy' codepoint='0436'/> + <entity name='zigrarr' codepoint='21DD'/> + <entity name='Zopf' codepoint='2124'/> + <entity name='zopf' codepoint='1D56B'/> + <entity name='Zscr' codepoint='1D4B5'/> + <entity name='zscr' codepoint='1D4CF'/> + <entity name='zwj' codepoint='200D'/> + <entity name='zwnj' codepoint='200C'/> + + <group id='M_AREA'/> + <group id='M_BLOCK'/> + <group id='M_BLOCKINLINE'/> + <group id='M_BODY'/> + <group id='M_CELL'/> + <group id='M_COL'/> + <group id='M_DEF'/> + <group id='M_FORM'/> + <group id='M_FRAME'/> + <group id='M_HEAD'/> + <group id='M_HTML'/> + <group id='M_INLINE'/> + <group id='M_LEGEND'/> + <group id='M_LI'/> + <group id='M_NOLINK'/> + <group id='M_OPTION'/> + <group id='M_OPTIONS'/> + <group id='M_P'/> + <group id='M_PARAM'/> + <group id='M_TABLE'/> + <group id='M_TABULAR'/> + <group id='M_TR'/> + <element name='html' type='element'> + <isRoot/> + <contains group='M_HTML'/> + <element name='body' type='mixed' text-parent='true'> + <memberOf group='M_HTML'/> + <memberOf group='M_BODY'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <element name='a' type='mixed'> + <memberOf group='M_INLINE'/> + <contains group='M_NOLINK'/> + <attribute name='hreflang' type='NMTOKEN' /> + <attribute name='shape' default='rect'/> + <attribute name='tabindex' type='NMTOKEN' /> + </element> + <element name='abbr' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='acronym' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='address' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <contains group='M_P'/> + </element> + <element name='applet' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_PARAM'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='b' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='basefont' type='empty'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + </element> + <element name='bdo' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='big' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='blink' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='blockquote' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + </element> + <element name='br' type='empty'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <attribute name='clear' default='none'/> + </element> + <element name='canvas' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='center' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + </element> + <element name='cite' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='code' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='comment' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='del' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_BLOCKINLINE'/> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + </element> + <element name='dfn' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='dir' type='element'> + <memberOf group='M_BLOCK'/> + <contains group='M_LI'/> + <attribute name='compact' type='BOOLEAN' /> + </element> + <element name='div' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='dl' type='element'> + <memberOf group='M_BLOCK'/> + <contains group='M_DEF'/> + <attribute name='compact' type='BOOLEAN' /> + <element name='dd' type='mixed'> + <memberOf group='M_DEF'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + </element> + <element name='dt' type='mixed'> + <memberOf group='M_DEF'/> + <contains group='M_INLINE'/> + </element> + </element> + <element name='em' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='font' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='form' closeMode='unclosable' type='mixed'> + <memberOf group='M_BLOCK'/> + <memberOf group='M_FORM'/> + <contains group='M_INLINE'/> + <contains group='M_NOLINK'/> + <contains group='M_BLOCK'/> + <contains group='M_TR'/> + <contains group='M_CELL'/> + <attribute name='enctype' default='application/x-www-form-urlencoded'/> + <attribute name='method' default='get'/> + <element name='button' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='disabled' type='BOOLEAN' /> + <attribute name='tabindex' type='NMTOKEN' /> + <attribute name='type' default='submit'/> + </element> + <element name='fieldset' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_LEGEND'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <element name='legend' type='mixed'> + <memberOf group='M_LEGEND'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + </element> + <element name='input' type='empty'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='checked' type='BOOLEAN' /> + <attribute name='disabled' type='BOOLEAN' /> + <attribute name='ismap' type='BOOLEAN' /> + <attribute name='maxlength' type='NMTOKEN' /> + <attribute name='readonly' type='BOOLEAN' /> + <attribute name='tabindex' type='NMTOKEN' /> + <attribute name='type' default='text'/> + </element> + <element name='label' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + <attribute name='for' type='IDREF' /> + </element> + <element name='select' type='element'> + <memberOf group='M_INLINE'/> + <contains group='M_OPTIONS'/> + <attribute name='disabled' type='BOOLEAN' /> + <attribute name='multiple' type='BOOLEAN' /> + <attribute name='size' type='NMTOKEN' /> + <attribute name='tabindex' type='NMTOKEN' /> + <element name='optgroup' type='element'> + <memberOf group='M_OPTIONS'/> + <contains group='M_OPTIONS'/> + <attribute name='disabled' type='BOOLEAN' /> + </element> + <element name='option' type='string'> + <memberOf group='M_OPTION'/> + <memberOf group='M_OPTIONS'/> + <attribute name='disabled' type='BOOLEAN' /> + <attribute name='selected' type='BOOLEAN' /> + </element> + </element> + <element name='textarea' type='string'> + <memberOf group='M_INLINE'/> + <attribute name='cols' type='NMTOKEN' /> + <attribute name='disabled' type='BOOLEAN' /> + <attribute name='readonly' type='BOOLEAN' /> + <attribute name='rows' type='NMTOKEN' /> + <attribute name='tabindex' type='NMTOKEN' /> + </element> + </element> + <element name='h1' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='h2' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='h3' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='h4' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='h5' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='h6' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='hr' type='empty'> + <memberOf group='M_BLOCK'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='noshade' type='BOOLEAN' /> + </element> + <element name='i' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='iframe' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='frameborder' default='1'/> + <attribute name='scrolling' default='auto'/> + </element> + <element name='img' type='empty'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='ismap' type='BOOLEAN' /> + </element> + <element name='ins' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + </element> + <element name='kbd' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='map' type='element'> + <memberOf group='M_INLINE'/> + <contains group='M_BLOCK'/> + <contains group='M_AREA'/> + <element name='area' type='empty'> + <memberOf group='M_AREA'/> + <attribute name='nohref' type='BOOLEAN' /> + <attribute name='shape' default='rect'/> + <attribute name='tabindex' type='NMTOKEN' /> + </element> + </element> + <element name='menu' type='element'> + <memberOf group='M_BLOCK'/> + <contains group='M_LI'/> + <attribute name='compact' type='BOOLEAN' /> + </element> + <element name='marquee' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + <attribute name='width' type='NMTOKEN' /> + </element> + <element name='nobr' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='wbr' type='empty'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + </element> + <element name='noscript' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + </element> + <element name='object' type='mixed'> + <memberOf group='M_HEAD'/> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_PARAM'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='declare' type='BOOLEAN' /> + <attribute name='tabindex' type='NMTOKEN' /> + <element name='param' type='empty'> + <memberOf group='M_PARAM'/> + <attribute name='valuetype' default='data'/> + </element> + </element> + <element name='ol' type='element'> + <memberOf group='M_BLOCK'/> + <contains group='M_LI'/> + <attribute name='compact' type='BOOLEAN' /> + <attribute name='start' type='NMTOKEN' /> + </element> + <element name='p' type='mixed'> + <memberOf group='M_BLOCK'/> + <memberOf group='M_P'/> + <contains group='M_INLINE'/> + <contains group='M_TABLE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='pre' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='width' type='NMTOKEN' /> + </element> + <element name='listing' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + </element> + <element name='xmp' type='mixed'> + <memberOf group='M_BLOCK'/> + <contains group='M_INLINE'/> + <attribute name='width' type='NMTOKEN' /> + </element> + <element name='q' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='ruby' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='rbc' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='rtc' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='rb' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='rt' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + <attribute name='rbspan' default='1'/> + </element> + <element name='rp' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='s' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='samp' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='small' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='span' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='strike' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='strong' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='sub' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='sup' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='table' closeMode='unclosable' type='element'> + <memberOf group='M_BLOCK'/> + <memberOf group='M_TABLE'/> + <contains group='M_FORM'/> + <contains group='M_TABULAR'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='frame' type='NMTOKEN' /> + <attribute name='rules' type='NMTOKEN' /> + <element name='caption' type='mixed'> + <memberOf group='M_TABULAR'/> + <contains group='M_INLINE'/> + <attribute name='align' type='NMTOKEN' /> + </element> + <element name='col' type='empty'> + <memberOf group='M_COL'/> + <memberOf group='M_TABULAR'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='span' default='1'/> + <attribute name='valign' type='NMTOKEN' /> + </element> + <element name='colgroup' type='element'> + <memberOf group='M_TABULAR'/> + <contains group='M_COL'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='span' default='1'/> + <attribute name='valign' type='NMTOKEN' /> + </element> + <element name='tbody' type='element'> + <memberOf group='M_TABULAR'/> + <contains group='M_TR'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='valign' type='NMTOKEN' /> + <element name='tr' type='element'> + <memberOf group='M_TR'/> + <memberOf group='M_TABULAR'/> + <contains group='M_FORM'/> + <contains group='M_CELL'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='valign' type='NMTOKEN' /> + <element name='td' type='mixed'> + <memberOf group='M_CELL'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='colspan' default='1'/> + <attribute name='headers' type='IDREFS' /> + <attribute name='nowrap' type='BOOLEAN' /> + <attribute name='rowspan' default='1'/> + <attribute name='scope' type='NMTOKEN' /> + <attribute name='valign' type='NMTOKEN' /> + </element> + <element name='th' type='mixed'> + <memberOf group='M_CELL'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='colspan' default='1'/> + <attribute name='headers' type='IDREFS' /> + <attribute name='nowrap' type='BOOLEAN' /> + <attribute name='rowspan' default='1'/> + <attribute name='scope' type='NMTOKEN' /> + <attribute name='valign' type='NMTOKEN' /> + </element> + </element> + </element> + <element name='tfoot' type='element'> + <memberOf group='M_TABULAR'/> + <contains group='M_TR'/> + <contains group='M_FORM'/> + <contains group='M_CELL'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='valign' type='NMTOKEN' /> + </element> + <element name='thead' type='element'> + <memberOf group='M_TABULAR'/> + <contains group='M_TR'/> + <contains group='M_FORM'/> + <contains group='M_CELL'/> + <attribute name='align' type='NMTOKEN' /> + <attribute name='valign' type='NMTOKEN' /> + </element> + </element> + <element name='tt' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='u' closeMode='restartable' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + <element name='ul' type='element'> + <memberOf group='M_BLOCK'/> + <contains group='M_LI'/> + <attribute name='compact' type='BOOLEAN' /> + <attribute name='type' type='NMTOKEN' /> + <element name='li' type='mixed'> + <memberOf group='M_LI'/> + <contains group='M_INLINE'/> + <contains group='M_BLOCK'/> + <attribute name='value' type='NMTOKEN' /> + </element> + </element> + <element name='var' type='mixed'> + <memberOf group='M_INLINE'/> + <memberOf group='M_NOLINK'/> + <contains group='M_INLINE'/> + </element> + </element> + <element name='frameset' type='element'> + <memberOf group='M_FRAME'/> + <memberOf group='M_HTML'/> + <contains group='M_FRAME'/> + <element name='frame' type='empty'> + <memberOf group='M_FRAME'/> + <attribute name='frameborder' default='1'/> + <attribute name='noresize' type='BOOLEAN' /> + <attribute name='scrolling' default='auto'/> + </element> + </element> + <element name='head' type='element'> + <memberOf group='M_HTML'/> + <contains group='M_HEAD'/> + <element name='base' type='empty'> + <memberOf group='M_HEAD'/> + </element> + <element name='isindex' type='empty'> + <memberOf group='M_HEAD'/> + </element> + <element name='link' type='empty'> + <memberOf group='M_HEAD'/> + <memberOf group='M_INLINE'/> + <attribute name='hreflang' type='NMTOKEN' /> + </element> + <element name='meta' type='empty'> + <memberOf group='M_HEAD'/> + <attribute name='http-equiv' type='NMTOKEN' /> + <attribute name='name' type='NMTOKEN' /> + </element> + <element name='style' type='cdata'> + <memberOf group='M_HEAD'/> + <memberOf group='M_INLINE'/> + </element> + <element name='title' type='string'> + <memberOf group='M_HEAD'/> + </element> + <element name='bgsound' type='empty'> + <memberOf group='M_HEAD'/> + </element> + </element> + <element name='noframes' type='element'> + <memberOf group='M_BLOCK'/> + <memberOf group='M_HTML'/> + <memberOf group='M_FRAME'/> + <contains group='M_BODY'/> + <contains group='M_BLOCK'/> + <contains group='M_INLINE'/> + </element> + <element name='script' type='cdata'> + <memberOfAny/> + <attribute name='defer' type='BOOLEAN' /> + </element> + </element> + <attribute name='class' type='NMTOKEN' /> + <attribute name='dir' type='NMTOKEN' /> + <attribute name='id' type='ID' /> + <attribute name='lang' type='NMTOKEN' /> +</schema> diff --git a/src/org/ccil/cowan/tagsoup/GOOGLE_README.txt b/src/org/ccil/cowan/tagsoup/GOOGLE_README.txt deleted file mode 100644 index 7462b7a..0000000 --- a/src/org/ccil/cowan/tagsoup/GOOGLE_README.txt +++ /dev/null @@ -1,8 +0,0 @@ -This is TagSoup 1.2, downloaded from http://home.ccil.org/~cowan/XML/tagsoup/. - -To get the java files included here: -- download tagsoup -- unzip it -- cd into the tagsoup directory -- run ant -- copy the files in src/java and tmp/src
\ No newline at end of file diff --git a/src/org/ccil/cowan/tagsoup/HTMLScanner.java b/src/org/ccil/cowan/tagsoup/HTMLScanner.java index f5980ee..70c12c4 100644 --- a/src/org/ccil/cowan/tagsoup/HTMLScanner.java +++ b/src/org/ccil/cowan/tagsoup/HTMLScanner.java @@ -109,8 +109,8 @@ public class HTMLScanner implements Scanner, Locator { S_APOS, ' ', A_SP, S_APOS, S_APOS, '\n', A_SP, S_APOS, S_APOS, '\t', A_SP, S_APOS, - S_AVAL, '\'', A_SKIP, S_APOS, S_AVAL, '"', A_SKIP, S_QUOT, + S_AVAL, '\'', A_SKIP, S_APOS, S_AVAL, '>', A_AVAL_STAGC, S_PCDATA, S_AVAL, 0, A_SAVE, S_STAGC, S_AVAL, -1, A_AVAL_STAGC, S_DONE, @@ -164,8 +164,8 @@ public class HTMLScanner implements Scanner, Locator { S_COM4, 0, A_MINUS2, S_COM2, S_COM4, -1, A_CMNT, S_DONE, S_DECL, '-', A_SKIP, S_COM, - S_DECL, '[', A_SKIP, S_BB, S_DECL, '>', A_SKIP, S_PCDATA, + S_DECL, '[', A_SKIP, S_BB, S_DECL, 0, A_SAVE, S_DECL2, S_DECL, -1, A_SKIP, S_DONE, S_DECL2, '>', A_DECL, S_PCDATA, @@ -226,9 +226,9 @@ public class HTMLScanner implements Scanner, Locator { S_STAGC, '\n', A_AVAL, S_TAGWS, S_STAGC, '\t', A_AVAL, S_TAGWS, S_TAG, '!', A_SKIP, S_DECL, - S_TAG, '?', A_SKIP, S_PITARGET, S_TAG, '/', A_SKIP, S_ETAG, S_TAG, '<', A_SAVE, S_TAG, + S_TAG, '?', A_SKIP, S_PITARGET, S_TAG, 0, A_SAVE, S_GI, S_TAG, -1, A_LT_PCDATA, S_DONE, S_TAG, ' ', A_LT, S_PCDATA, @@ -268,6 +268,76 @@ public class HTMLScanner implements Scanner, Locator { 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0x017E, 0x0178}; + /** + * Index into the state table for [state][input character - 2]. + * The state table consists of 4-entry runs on the form + * { current state, input character, action, next state }. + * We precompute the index into the state table for all possible + * { current state, input character } and store the result in + * the statetableIndex array. Since only some input characters + * are present in the state table, we only do the computation for + * characters 0 to the highest character value in the state table. + * An input character of -2 is used to cover all other characters + * as -2 is guaranteed not to match any input character entry + * in the state table. + * + * <p>When doing lookups, the input character should first be tested + * to be in the range [-1 (inclusive), statetableIndexMaxChar (exclusive)]. + * if it isn't use -2 as the input character. + * + * <p>Finally, add 2 to the input character to cover for the fact that + * Java doesn't support negative array indexes. Then look up + * the value in the statetableIndex. If the value is -1, then + * no action or next state was found for the { state, input } that + * you had. If it isn't -1, then action = statetable[value + 2] and + * next state = statetable[value + 3]. That is, the value points + * to the start of the answer 4-tuple in the statetable. + */ + static short[][] statetableIndex; + /** + * The highest character value seen in the statetable. + * See the doc comment for statetableIndex to see how this + * is used. + */ + static int statetableIndexMaxChar; + static { + int maxState = -1; + int maxChar = -1; + for (int i = 0; i < statetable.length; i += 4) { + if (statetable[i] > maxState) { + maxState = statetable[i]; + } + if (statetable[i + 1] > maxChar) { + maxChar = statetable[i + 1]; + } + } + statetableIndexMaxChar = maxChar + 1; + + statetableIndex = new short[maxState + 1][maxChar + 3]; + for (int theState = 0; theState <= maxState; ++theState) { + for (int ch = -2; ch <= maxChar; ++ch) { + int hit = -1; + int action = 0; + for (int i = 0; i < statetable.length; i += 4) { + if (theState != statetable[i]) { + if (action != 0) break; + continue; + } + if (statetable[i+1] == 0) { + hit = i; + action = statetable[i+2]; + } + else if (statetable[i+1] == ch) { + hit = i; + action = statetable[i+2]; + break; + } + } + statetableIndex[theState][ch + 2] = (short) hit; + } + } + } + // Compensate for bug in PushbackReader that allows // pushing back EOF. private void unread(PushbackReader r, int c) throws IOException { @@ -313,14 +383,11 @@ public class HTMLScanner implements Scanner, Locator { public void scan(Reader r0, ScanHandler h) throws IOException, SAXException { theState = S_PCDATA; PushbackReader r; - if (r0 instanceof PushbackReader) { - r = (PushbackReader)r0; - } - else if (r0 instanceof BufferedReader) { - r = new PushbackReader(r0); + if (r0 instanceof BufferedReader) { + r = new PushbackReader(r0, 5); } else { - r = new PushbackReader(new BufferedReader(r0, 200)); + r = new PushbackReader(new BufferedReader(r0), 5); } int firstChar = r.read(); // Remove any leading BOM @@ -351,62 +418,54 @@ public class HTMLScanner implements Scanner, Locator { if (!(ch >= 0x20 || ch == '\n' || ch == '\t' || ch == -1)) continue; // Search state table + int adjCh = (ch >= -1 && ch < statetableIndexMaxChar) ? ch : -2; + int statetableRow = statetableIndex[theState][adjCh + 2]; int action = 0; - for (int i = 0; i < statetable.length; i += 4) { - if (theState != statetable[i]) { - if (action != 0) break; - continue; - } - if (statetable[i+1] == 0) { - action = statetable[i+2]; - theNextState = statetable[i+3]; - } - else if (statetable[i+1] == ch) { - action = statetable[i+2]; - theNextState = statetable[i+3]; - break; - } + if (statetableRow != -1) { + action = statetable[statetableRow + 2]; + theNextState = statetable[statetableRow + 3]; } + // System.err.println("In " + debug_statenames[theState] + " got " + nicechar(ch) + " doing " + debug_actionnames[action] + " then " + debug_statenames[theNextState]); switch (action) { case 0: throw new Error( -"HTMLScanner can't cope with " + Integer.toString(ch) + " in state " + -Integer.toString(theState)); - case A_ADUP: + "HTMLScanner can't cope with " + Integer.toString(ch) + " in state " + + Integer.toString(theState)); + case A_ADUP: h.adup(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_ADUP_SAVE: + case A_ADUP_SAVE: h.adup(theOutputBuffer, 0, theSize); theSize = 0; save(ch, h); break; - case A_ADUP_STAGC: + case A_ADUP_STAGC: h.adup(theOutputBuffer, 0, theSize); theSize = 0; h.stagc(theOutputBuffer, 0, theSize); break; - case A_ANAME: + case A_ANAME: h.aname(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_ANAME_ADUP: + case A_ANAME_ADUP: h.aname(theOutputBuffer, 0, theSize); theSize = 0; h.adup(theOutputBuffer, 0, theSize); break; - case A_ANAME_ADUP_STAGC: + case A_ANAME_ADUP_STAGC: h.aname(theOutputBuffer, 0, theSize); theSize = 0; h.adup(theOutputBuffer, 0, theSize); h.stagc(theOutputBuffer, 0, theSize); break; - case A_AVAL: + case A_AVAL: h.aval(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_AVAL_STAGC: + case A_AVAL_STAGC: h.aval(theOutputBuffer, 0, theSize); theSize = 0; h.stagc(theOutputBuffer, 0, theSize); @@ -489,15 +548,15 @@ Integer.toString(theState)); } theNextState = S_PCDATA; break; - case A_ETAG: + case A_ETAG: h.etag(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_DECL: + case A_DECL: h.decl(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_GI: + case A_GI: h.gi(theOutputBuffer, 0, theSize); theSize = 0; break; @@ -506,7 +565,7 @@ Integer.toString(theState)); theSize = 0; h.stagc(theOutputBuffer, 0, theSize); break; - case A_LT: + case A_LT: mark(); save('<', h); save(ch, h); @@ -517,7 +576,7 @@ Integer.toString(theState)); h.pcdata(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_PCDATA: + case A_PCDATA: mark(); h.pcdata(theOutputBuffer, 0, theSize); theSize = 0; @@ -539,29 +598,29 @@ Integer.toString(theState)); save('-', h); save(ch, h); break; - case A_PI: + case A_PI: mark(); h.pi(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_PITARGET: + case A_PITARGET: h.pitarget(theOutputBuffer, 0, theSize); theSize = 0; break; - case A_PITARGET_PI: + case A_PITARGET_PI: h.pitarget(theOutputBuffer, 0, theSize); theSize = 0; h.pi(theOutputBuffer, 0, theSize); break; - case A_SAVE: + case A_SAVE: save(ch, h); break; - case A_SKIP: + case A_SKIP: break; - case A_SP: + case A_SP: save(' ', h); break; - case A_STAGC: + case A_STAGC: h.stagc(theOutputBuffer, 0, theSize); theSize = 0; break; @@ -576,7 +635,7 @@ Integer.toString(theState)); unread(r, ch); theCurrentColumn--; break; - case A_UNSAVE_PCDATA: + case A_UNSAVE_PCDATA: if (theSize > 0) theSize--; h.pcdata(theOutputBuffer, 0, theSize); theSize = 0; @@ -617,7 +676,7 @@ Integer.toString(theState)); else { // Grow the buffer size char[] newOutputBuffer = new char[theOutputBuffer.length * 2]; - System.arraycopy(theOutputBuffer, 0, newOutputBuffer, 0, theSize+1); + System.arraycopy(theOutputBuffer, 0, newOutputBuffer, 0, theSize+1); theOutputBuffer = newOutputBuffer; } } diff --git a/src/org/ccil/cowan/tagsoup/HTMLSchema.java b/src/org/ccil/cowan/tagsoup/HTMLSchema.java index 9b46a68..90c7a52 100644 --- a/src/org/ccil/cowan/tagsoup/HTMLSchema.java +++ b/src/org/ccil/cowan/tagsoup/HTMLSchema.java @@ -776,38 +776,38 @@ public class HTMLSchema extends Schema implements HTMLModels { attribute("var", "lang", "NMTOKEN", null); attribute("wbr", "lang", "NMTOKEN", null); attribute("xmp", "lang", "NMTOKEN", null); - entity("aacgr", 0x03AC); entity("Aacgr", 0x0386); - entity("aacute", 0x00E1); + entity("aacgr", 0x03AC); entity("Aacute", 0x00C1); - entity("abreve", 0x0103); + entity("aacute", 0x00E1); entity("Abreve", 0x0102); + entity("abreve", 0x0103); entity("ac", 0x223E); entity("acd", 0x223F); - entity("acirc", 0x00E2); entity("Acirc", 0x00C2); + entity("acirc", 0x00E2); entity("acute", 0x00B4); - entity("acy", 0x0430); entity("Acy", 0x0410); - entity("aelig", 0x00E6); + entity("acy", 0x0430); entity("AElig", 0x00C6); + entity("aelig", 0x00E6); entity("af", 0x2061); - entity("afr", 0x1D51E); entity("Afr", 0x1D504); - entity("agr", 0x03B1); + entity("afr", 0x1D51E); entity("Agr", 0x0391); - entity("agrave", 0x00E0); + entity("agr", 0x03B1); entity("Agrave", 0x00C0); + entity("agrave", 0x00E0); entity("alefsym", 0x2135); entity("aleph", 0x2135); - entity("alpha", 0x03B1); entity("Alpha", 0x0391); - entity("amacr", 0x0101); + entity("alpha", 0x03B1); entity("Amacr", 0x0100); + entity("amacr", 0x0101); entity("amalg", 0x2A3F); entity("amp", 0x0026); - entity("and", 0x2227); entity("And", 0x2A53); + entity("and", 0x2227); entity("andand", 0x2A55); entity("andd", 0x2A5C); entity("andslope", 0x2A58); @@ -830,75 +830,75 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("angsph", 0x2222); entity("angst", 0x212B); entity("angzarr", 0x237C); - entity("aogon", 0x0105); entity("Aogon", 0x0104); - entity("aopf", 0x1D552); + entity("aogon", 0x0105); entity("Aopf", 0x1D538); + entity("aopf", 0x1D552); entity("ap", 0x2248); entity("apacir", 0x2A6F); - entity("ape", 0x224A); entity("apE", 0x2A70); + entity("ape", 0x224A); entity("apid", 0x224B); entity("apos", 0x0027); entity("ApplyFunction", 0x2061); entity("approx", 0x2248); entity("approxeq", 0x224A); - entity("aring", 0x00E5); entity("Aring", 0x00C5); - entity("ascr", 0x1D4B6); + entity("aring", 0x00E5); entity("Ascr", 0x1D49C); + entity("ascr", 0x1D4B6); entity("Assign", 0x2254); entity("ast", 0x002A); entity("asymp", 0x2248); entity("asympeq", 0x224D); - entity("atilde", 0x00E3); entity("Atilde", 0x00C3); - entity("auml", 0x00E4); + entity("atilde", 0x00E3); entity("Auml", 0x00C4); + entity("auml", 0x00E4); entity("awconint", 0x2233); entity("awint", 0x2A11); entity("b.alpha", 0x1D6C2); entity("b.beta", 0x1D6C3); entity("b.chi", 0x1D6D8); - entity("b.delta", 0x1D6C5); entity("b.Delta", 0x1D6AB); + entity("b.delta", 0x1D6C5); entity("b.epsi", 0x1D6C6); entity("b.epsiv", 0x1D6DC); entity("b.eta", 0x1D6C8); - entity("b.gamma", 0x1D6C4); entity("b.Gamma", 0x1D6AA); - entity("b.gammad", 0x1D7CB); + entity("b.gamma", 0x1D6C4); entity("b.Gammad", 0x1D7CA); + entity("b.gammad", 0x1D7CB); entity("b.iota", 0x1D6CA); entity("b.kappa", 0x1D6CB); entity("b.kappav", 0x1D6DE); - entity("b.lambda", 0x1D6CC); entity("b.Lambda", 0x1D6B2); + entity("b.lambda", 0x1D6CC); entity("b.mu", 0x1D6CD); entity("b.nu", 0x1D6CE); - entity("b.omega", 0x1D6DA); entity("b.Omega", 0x1D6C0); - entity("b.phi", 0x1D6D7); + entity("b.omega", 0x1D6DA); entity("b.Phi", 0x1D6BD); + entity("b.phi", 0x1D6D7); entity("b.phiv", 0x1D6DF); - entity("b.pi", 0x1D6D1); entity("b.Pi", 0x1D6B7); + entity("b.pi", 0x1D6D1); entity("b.piv", 0x1D6E1); - entity("b.psi", 0x1D6D9); entity("b.Psi", 0x1D6BF); + entity("b.psi", 0x1D6D9); entity("b.rho", 0x1D6D2); entity("b.rhov", 0x1D6E0); - entity("b.sigma", 0x1D6D4); entity("b.Sigma", 0x1D6BA); + entity("b.sigma", 0x1D6D4); entity("b.sigmav", 0x1D6D3); entity("b.tau", 0x1D6D5); entity("b.Theta", 0x1D6AF); entity("b.thetas", 0x1D6C9); entity("b.thetav", 0x1D6DD); - entity("b.upsi", 0x1D6D6); entity("b.Upsi", 0x1D6BC); - entity("b.xi", 0x1D6CF); + entity("b.upsi", 0x1D6D6); entity("b.Xi", 0x1D6B5); + entity("b.xi", 0x1D6CF); entity("b.zeta", 0x1D6C7); entity("backcong", 0x224C); entity("backepsilon", 0x03F6); @@ -908,14 +908,14 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("Backslash", 0x2216); entity("Barv", 0x2AE7); entity("barvee", 0x22BD); - entity("barwed", 0x2305); entity("Barwed", 0x2306); + entity("barwed", 0x2305); entity("barwedge", 0x2305); entity("bbrk", 0x23B5); entity("bbrktbrk", 0x23B6); entity("bcong", 0x224C); - entity("bcy", 0x0431); entity("Bcy", 0x0411); + entity("bcy", 0x0431); entity("bdquo", 0x201E); entity("becaus", 0x2235); entity("because", 0x2235); @@ -923,14 +923,14 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("bepsi", 0x03F6); entity("bernou", 0x212C); entity("Bernoullis", 0x212C); - entity("beta", 0x03B2); entity("Beta", 0x0392); + entity("beta", 0x03B2); entity("beth", 0x2136); entity("between", 0x226C); - entity("bfr", 0x1D51F); entity("Bfr", 0x1D505); - entity("bgr", 0x03B2); + entity("bfr", 0x1D51F); entity("Bgr", 0x0392); + entity("bgr", 0x03B2); entity("bigcap", 0x22C2); entity("bigcirc", 0x25EF); entity("bigcup", 0x22C3); @@ -956,62 +956,62 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("blk14", 0x2591); entity("blk34", 0x2593); entity("block", 0x2588); - entity("bnot", 0x2310); entity("bNot", 0x2AED); - entity("bopf", 0x1D553); + entity("bnot", 0x2310); entity("Bopf", 0x1D539); + entity("bopf", 0x1D553); entity("bot", 0x22A5); entity("bottom", 0x22A5); entity("bowtie", 0x22C8); entity("boxbox", 0x29C9); - entity("boxdl", 0x2510); - entity("boxdL", 0x2555); - entity("boxDl", 0x2556); entity("boxDL", 0x2557); - entity("boxdr", 0x250C); - entity("boxdR", 0x2552); - entity("boxDr", 0x2553); + entity("boxDl", 0x2556); + entity("boxdL", 0x2555); + entity("boxdl", 0x2510); entity("boxDR", 0x2554); - entity("boxh", 0x2500); + entity("boxDr", 0x2553); + entity("boxdR", 0x2552); + entity("boxdr", 0x250C); entity("boxH", 0x2550); - entity("boxhd", 0x252C); - entity("boxhD", 0x2565); - entity("boxHd", 0x2564); + entity("boxh", 0x2500); entity("boxHD", 0x2566); - entity("boxhu", 0x2534); - entity("boxhU", 0x2568); - entity("boxHu", 0x2567); + entity("boxHd", 0x2564); + entity("boxhD", 0x2565); + entity("boxhd", 0x252C); entity("boxHU", 0x2569); + entity("boxHu", 0x2567); + entity("boxhU", 0x2568); + entity("boxhu", 0x2534); entity("boxminus", 0x229F); entity("boxplus", 0x229E); entity("boxtimes", 0x22A0); - entity("boxul", 0x2518); - entity("boxuL", 0x255B); - entity("boxUl", 0x255C); entity("boxUL", 0x255D); - entity("boxur", 0x2514); - entity("boxuR", 0x2558); - entity("boxUr", 0x2559); + entity("boxUl", 0x255C); + entity("boxuL", 0x255B); + entity("boxul", 0x2518); entity("boxUR", 0x255A); - entity("boxv", 0x2502); + entity("boxUr", 0x2559); + entity("boxuR", 0x2558); + entity("boxur", 0x2514); entity("boxV", 0x2551); - entity("boxvh", 0x253C); - entity("boxvH", 0x256A); - entity("boxVh", 0x256B); + entity("boxv", 0x2502); entity("boxVH", 0x256C); - entity("boxvl", 0x2524); - entity("boxvL", 0x2561); - entity("boxVl", 0x2562); + entity("boxVh", 0x256B); + entity("boxvH", 0x256A); + entity("boxvh", 0x253C); entity("boxVL", 0x2563); - entity("boxvr", 0x251C); - entity("boxvR", 0x255E); - entity("boxVr", 0x255F); + entity("boxVl", 0x2562); + entity("boxvL", 0x2561); + entity("boxvl", 0x2524); entity("boxVR", 0x2560); + entity("boxVr", 0x255F); + entity("boxvR", 0x255E); + entity("boxvr", 0x251C); entity("bprime", 0x2035); entity("breve", 0x02D8); entity("brvbar", 0x00A6); - entity("bscr", 0x1D4B7); entity("Bscr", 0x212C); + entity("bscr", 0x1D4B7); entity("bsemi", 0x204F); entity("bsim", 0x223D); entity("bsime", 0x22CD); @@ -1020,14 +1020,14 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("bull", 0x2022); entity("bullet", 0x2022); entity("bump", 0x224E); - entity("bumpe", 0x224F); entity("bumpE", 0x2AAE); - entity("bumpeq", 0x224F); + entity("bumpe", 0x224F); entity("Bumpeq", 0x224E); - entity("cacute", 0x0107); + entity("bumpeq", 0x224F); entity("Cacute", 0x0106); - entity("cap", 0x2229); + entity("cacute", 0x0107); entity("Cap", 0x22D2); + entity("cap", 0x2229); entity("capand", 0x2A44); entity("capbrcup", 0x2A49); entity("capcap", 0x2A4B); @@ -1038,30 +1038,30 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("caron", 0x02C7); entity("Cayleys", 0x212D); entity("ccaps", 0x2A4D); - entity("ccaron", 0x010D); entity("Ccaron", 0x010C); - entity("ccedil", 0x00E7); + entity("ccaron", 0x010D); entity("Ccedil", 0x00C7); - entity("ccirc", 0x0109); + entity("ccedil", 0x00E7); entity("Ccirc", 0x0108); + entity("ccirc", 0x0109); entity("Cconint", 0x2230); entity("ccups", 0x2A4C); entity("ccupssm", 0x2A50); - entity("cdot", 0x010B); entity("Cdot", 0x010A); + entity("cdot", 0x010B); entity("cedil", 0x00B8); entity("Cedilla", 0x00B8); entity("cemptyv", 0x29B2); entity("cent", 0x00A2); entity("centerdot", 0x00B7); - entity("cfr", 0x1D520); entity("Cfr", 0x212D); - entity("chcy", 0x0447); + entity("cfr", 0x1D520); entity("CHcy", 0x0427); + entity("chcy", 0x0447); entity("check", 0x2713); entity("checkmark", 0x2713); - entity("chi", 0x03C7); entity("Chi", 0x03A7); + entity("chi", 0x03C7); entity("cir", 0x25CB); entity("circ", 0x02C6); entity("circeq", 0x2257); @@ -1076,8 +1076,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("CircleMinus", 0x2296); entity("CirclePlus", 0x2295); entity("CircleTimes", 0x2297); - entity("cire", 0x2257); entity("cirE", 0x29C3); + entity("cire", 0x2257); entity("cirfnint", 0x2A10); entity("cirmid", 0x2AEF); entity("cirscir", 0x29C2); @@ -1086,10 +1086,10 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("CloseCurlyQuote", 0x2019); entity("clubs", 0x2663); entity("clubsuit", 0x2663); - entity("colon", 0x003A); entity("Colon", 0x2237); - entity("colone", 0x2254); + entity("colon", 0x003A); entity("Colone", 0x2A74); + entity("colone", 0x2254); entity("coloneq", 0x2254); entity("comma", 0x002C); entity("commat", 0x0040); @@ -1100,21 +1100,21 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("cong", 0x2245); entity("congdot", 0x2A6D); entity("Congruent", 0x2261); - entity("conint", 0x222E); entity("Conint", 0x222F); + entity("conint", 0x222E); entity("ContourIntegral", 0x222E); - entity("copf", 0x1D554); entity("Copf", 0x2102); + entity("copf", 0x1D554); entity("coprod", 0x2210); entity("Coproduct", 0x2210); entity("copy", 0x00A9); entity("copysr", 0x2117); entity("CounterClockwiseContourIntegral", 0x2233); entity("crarr", 0x21B5); - entity("cross", 0x2717); entity("Cross", 0x2A2F); - entity("cscr", 0x1D4B8); + entity("cross", 0x2717); entity("Cscr", 0x1D49E); + entity("cscr", 0x1D4B8); entity("csub", 0x2ACF); entity("csube", 0x2AD1); entity("csup", 0x2AD0); @@ -1126,11 +1126,11 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("cuesc", 0x22DF); entity("cularr", 0x21B6); entity("cularrp", 0x293D); - entity("cup", 0x222A); entity("Cup", 0x22D3); + entity("cup", 0x222A); entity("cupbrcap", 0x2A48); - entity("cupcap", 0x2A46); entity("CupCap", 0x224D); + entity("cupcap", 0x2A46); entity("cupcup", 0x2A4A); entity("cupdot", 0x228D); entity("cupor", 0x2A45); @@ -1148,37 +1148,37 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("cwconint", 0x2232); entity("cwint", 0x2231); entity("cylcty", 0x232D); - entity("dagger", 0x2020); entity("Dagger", 0x2021); + entity("dagger", 0x2020); entity("daleth", 0x2138); - entity("darr", 0x2193); - entity("dArr", 0x21D3); entity("Darr", 0x21A1); + entity("dArr", 0x21D3); + entity("darr", 0x2193); entity("dash", 0x2010); - entity("dashv", 0x22A3); entity("Dashv", 0x2AE4); + entity("dashv", 0x22A3); entity("dbkarow", 0x290F); entity("dblac", 0x02DD); - entity("dcaron", 0x010F); entity("Dcaron", 0x010E); - entity("dcy", 0x0434); + entity("dcaron", 0x010F); entity("Dcy", 0x0414); - entity("dd", 0x2146); + entity("dcy", 0x0434); entity("DD", 0x2145); + entity("dd", 0x2146); entity("ddagger", 0x2021); entity("ddarr", 0x21CA); entity("DDotrahd", 0x2911); entity("ddotseq", 0x2A77); entity("deg", 0x00B0); entity("Del", 0x2207); - entity("delta", 0x03B4); entity("Delta", 0x0394); + entity("delta", 0x03B4); entity("demptyv", 0x29B1); entity("dfisht", 0x297F); - entity("dfr", 0x1D521); entity("Dfr", 0x1D507); - entity("dgr", 0x03B4); + entity("dfr", 0x1D521); entity("Dgr", 0x0394); + entity("dgr", 0x03B4); entity("dHar", 0x2965); entity("dharl", 0x21C3); entity("dharr", 0x21C2); @@ -1199,15 +1199,15 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("divide", 0x00F7); entity("divideontimes", 0x22C7); entity("divonx", 0x22C7); - entity("djcy", 0x0452); entity("DJcy", 0x0402); + entity("djcy", 0x0452); entity("dlcorn", 0x231E); entity("dlcrop", 0x230D); entity("dollar", 0x0024); - entity("dopf", 0x1D555); entity("Dopf", 0x1D53B); - entity("dot", 0x02D9); + entity("dopf", 0x1D555); entity("Dot", 0x00A8); + entity("dot", 0x02D9); entity("doteq", 0x2250); entity("doteqdot", 0x2251); entity("DotEqual", 0x2250); @@ -1229,8 +1229,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("DoubleUpArrow", 0x21D1); entity("DoubleUpDownArrow", 0x21D5); entity("DoubleVerticalBar", 0x2225); - entity("downarrow", 0x2193); entity("Downarrow", 0x21D3); + entity("downarrow", 0x2193); entity("DownArrowBar", 0x2913); entity("DownArrowUpArrow", 0x21F5); entity("downdownarrows", 0x21CA); @@ -1248,52 +1248,52 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("drbkarow", 0x2910); entity("drcorn", 0x231F); entity("drcrop", 0x230C); - entity("dscr", 0x1D4B9); entity("Dscr", 0x1D49F); - entity("dscy", 0x0455); + entity("dscr", 0x1D4B9); entity("DScy", 0x0405); + entity("dscy", 0x0455); entity("dsol", 0x29F6); - entity("dstrok", 0x0111); entity("Dstrok", 0x0110); + entity("dstrok", 0x0111); entity("dtdot", 0x22F1); entity("dtri", 0x25BF); entity("dtrif", 0x25BE); entity("duarr", 0x21F5); entity("duhar", 0x296F); entity("dwangle", 0x29A6); - entity("dzcy", 0x045F); entity("DZcy", 0x040F); + entity("dzcy", 0x045F); entity("dzigrarr", 0x27FF); - entity("eacgr", 0x03AD); entity("Eacgr", 0x0388); - entity("eacute", 0x00E9); + entity("eacgr", 0x03AD); entity("Eacute", 0x00C9); + entity("eacute", 0x00E9); entity("easter", 0x2A6E); - entity("ecaron", 0x011B); entity("Ecaron", 0x011A); + entity("ecaron", 0x011B); entity("ecir", 0x2256); - entity("ecirc", 0x00EA); entity("Ecirc", 0x00CA); + entity("ecirc", 0x00EA); entity("ecolon", 0x2255); - entity("ecy", 0x044D); entity("Ecy", 0x042D); + entity("ecy", 0x044D); entity("eDDot", 0x2A77); - entity("edot", 0x0117); - entity("eDot", 0x2251); entity("Edot", 0x0116); + entity("eDot", 0x2251); + entity("edot", 0x0117); entity("ee", 0x2147); - entity("eeacgr", 0x03AE); entity("EEacgr", 0x0389); - entity("eegr", 0x03B7); + entity("eeacgr", 0x03AE); entity("EEgr", 0x0397); + entity("eegr", 0x03B7); entity("efDot", 0x2252); - entity("efr", 0x1D522); entity("Efr", 0x1D508); + entity("efr", 0x1D522); entity("eg", 0x2A9A); - entity("egr", 0x03B5); entity("Egr", 0x0395); - entity("egrave", 0x00E8); + entity("egr", 0x03B5); entity("Egrave", 0x00C8); + entity("egrave", 0x00E8); entity("egs", 0x2A96); entity("egsdot", 0x2A98); entity("el", 0x2A99); @@ -1302,8 +1302,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("ell", 0x2113); entity("els", 0x2A95); entity("elsdot", 0x2A97); - entity("emacr", 0x0113); entity("Emacr", 0x0112); + entity("emacr", 0x0113); entity("empty", 0x2205); entity("emptyset", 0x2205); entity("EmptySmallSquare", 0x25FB); @@ -1312,19 +1312,19 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("emsp", 0x2003); entity("emsp13", 0x2004); entity("emsp14", 0x2005); - entity("eng", 0x014B); entity("ENG", 0x014A); + entity("eng", 0x014B); entity("ensp", 0x2002); - entity("eogon", 0x0119); entity("Eogon", 0x0118); - entity("eopf", 0x1D556); + entity("eogon", 0x0119); entity("Eopf", 0x1D53C); + entity("eopf", 0x1D556); entity("epar", 0x22D5); entity("eparsl", 0x29E3); entity("eplus", 0x2A71); entity("epsi", 0x03F5); - entity("epsilon", 0x03B5); entity("Epsilon", 0x0395); + entity("epsilon", 0x03B5); entity("epsiv", 0x03B5); entity("eqcirc", 0x2256); entity("eqcolon", 0x2255); @@ -1341,17 +1341,17 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("eqvparsl", 0x29E5); entity("erarr", 0x2971); entity("erDot", 0x2253); - entity("escr", 0x212F); entity("Escr", 0x2130); + entity("escr", 0x212F); entity("esdot", 0x2250); - entity("esim", 0x2242); entity("Esim", 0x2A73); - entity("eta", 0x03B7); + entity("esim", 0x2242); entity("Eta", 0x0397); - entity("eth", 0x00F0); + entity("eta", 0x03B7); entity("ETH", 0x00D0); - entity("euml", 0x00EB); + entity("eth", 0x00F0); entity("Euml", 0x00CB); + entity("euml", 0x00EB); entity("euro", 0x20AC); entity("excl", 0x0021); entity("exist", 0x2203); @@ -1359,14 +1359,14 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("expectation", 0x2130); entity("exponentiale", 0x2147); entity("fallingdotseq", 0x2252); - entity("fcy", 0x0444); entity("Fcy", 0x0424); + entity("fcy", 0x0444); entity("female", 0x2640); entity("ffilig", 0xFB03); entity("fflig", 0xFB00); entity("ffllig", 0xFB04); - entity("ffr", 0x1D523); entity("Ffr", 0x1D509); + entity("ffr", 0x1D523); entity("filig", 0xFB01); entity("FilledSmallSquare", 0x25FC); entity("FilledVerySmallSquare", 0x25AA); @@ -1374,8 +1374,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("fllig", 0xFB02); entity("fltns", 0x25B1); entity("fnof", 0x0192); - entity("fopf", 0x1D557); entity("Fopf", 0x1D53D); + entity("fopf", 0x1D557); entity("forall", 0x2200); entity("fork", 0x22D4); entity("forkv", 0x2AD9); @@ -1398,27 +1398,27 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("frac78", 0x215E); entity("frasl", 0x2044); entity("frown", 0x2322); - entity("fscr", 0x1D4BB); entity("Fscr", 0x2131); + entity("fscr", 0x1D4BB); entity("gacute", 0x01F5); - entity("gamma", 0x03B3); entity("Gamma", 0x0393); - entity("gammad", 0x03DD); + entity("gamma", 0x03B3); entity("Gammad", 0x03DC); + entity("gammad", 0x03DD); entity("gap", 0x2A86); - entity("gbreve", 0x011F); entity("Gbreve", 0x011E); + entity("gbreve", 0x011F); entity("Gcedil", 0x0122); - entity("gcirc", 0x011D); entity("Gcirc", 0x011C); - entity("gcy", 0x0433); + entity("gcirc", 0x011D); entity("Gcy", 0x0413); - entity("gdot", 0x0121); + entity("gcy", 0x0433); entity("Gdot", 0x0120); - entity("ge", 0x2265); + entity("gdot", 0x0121); entity("gE", 0x2267); - entity("gel", 0x22DB); + entity("ge", 0x2265); entity("gEl", 0x2A8C); + entity("gel", 0x22DB); entity("geq", 0x2265); entity("geqq", 0x2267); entity("geqslant", 0x2A7E); @@ -1428,29 +1428,29 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("gesdoto", 0x2A82); entity("gesdotol", 0x2A84); entity("gesles", 0x2A94); - entity("gfr", 0x1D524); entity("Gfr", 0x1D50A); - entity("gg", 0x226B); + entity("gfr", 0x1D524); entity("Gg", 0x22D9); + entity("gg", 0x226B); entity("ggg", 0x22D9); - entity("ggr", 0x03B3); entity("Ggr", 0x0393); + entity("ggr", 0x03B3); entity("gimel", 0x2137); - entity("gjcy", 0x0453); entity("GJcy", 0x0403); + entity("gjcy", 0x0453); entity("gl", 0x2277); entity("gla", 0x2AA5); entity("glE", 0x2A92); entity("glj", 0x2AA4); entity("gnap", 0x2A8A); entity("gnapprox", 0x2A8A); - entity("gne", 0x2A88); entity("gnE", 0x2269); + entity("gne", 0x2A88); entity("gneq", 0x2A88); entity("gneqq", 0x2269); entity("gnsim", 0x22E7); - entity("gopf", 0x1D558); entity("Gopf", 0x1D53E); + entity("gopf", 0x1D558); entity("grave", 0x0060); entity("GreaterEqual", 0x2265); entity("GreaterEqualLess", 0x22DB); @@ -1459,13 +1459,13 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("GreaterLess", 0x2277); entity("GreaterSlantEqual", 0x2A7E); entity("GreaterTilde", 0x2273); - entity("gscr", 0x210A); entity("Gscr", 0x1D4A2); + entity("gscr", 0x210A); entity("gsim", 0x2273); entity("gsime", 0x2A8E); entity("gsiml", 0x2A90); - entity("gt", 0x003E); entity("Gt", 0x226B); + entity("gt", 0x003E); entity("gtcc", 0x2AA7); entity("gtcir", 0x2A7A); entity("gtdot", 0x22D7); @@ -1482,22 +1482,22 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("hairsp", 0x200A); entity("half", 0x00BD); entity("hamilt", 0x210B); - entity("hardcy", 0x044A); entity("HARDcy", 0x042A); - entity("harr", 0x2194); + entity("hardcy", 0x044A); entity("hArr", 0x21D4); + entity("harr", 0x2194); entity("harrcir", 0x2948); entity("harrw", 0x21AD); entity("Hat", 0x005E); entity("hbar", 0x210F); - entity("hcirc", 0x0125); entity("Hcirc", 0x0124); + entity("hcirc", 0x0125); entity("hearts", 0x2665); entity("heartsuit", 0x2665); entity("hellip", 0x2026); entity("hercon", 0x22B9); - entity("hfr", 0x1D525); entity("Hfr", 0x210C); + entity("hfr", 0x1D525); entity("HilbertSpace", 0x210B); entity("hksearow", 0x2925); entity("hkswarow", 0x2926); @@ -1505,52 +1505,52 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("homtht", 0x223B); entity("hookleftarrow", 0x21A9); entity("hookrightarrow", 0x21AA); - entity("hopf", 0x1D559); entity("Hopf", 0x210D); + entity("hopf", 0x1D559); entity("horbar", 0x2015); entity("HorizontalLine", 0x2500); - entity("hscr", 0x1D4BD); entity("Hscr", 0x210B); + entity("hscr", 0x1D4BD); entity("hslash", 0x210F); - entity("hstrok", 0x0127); entity("Hstrok", 0x0126); + entity("hstrok", 0x0127); entity("HumpDownHump", 0x224E); entity("HumpEqual", 0x224F); entity("hybull", 0x2043); entity("hyphen", 0x2010); - entity("iacgr", 0x03AF); entity("Iacgr", 0x038A); - entity("iacute", 0x00ED); + entity("iacgr", 0x03AF); entity("Iacute", 0x00CD); + entity("iacute", 0x00ED); entity("ic", 0x2063); - entity("icirc", 0x00EE); entity("Icirc", 0x00CE); - entity("icy", 0x0438); + entity("icirc", 0x00EE); entity("Icy", 0x0418); + entity("icy", 0x0438); entity("idiagr", 0x0390); - entity("idigr", 0x03CA); entity("Idigr", 0x03AA); + entity("idigr", 0x03CA); entity("Idot", 0x0130); - entity("iecy", 0x0435); entity("IEcy", 0x0415); + entity("iecy", 0x0435); entity("iexcl", 0x00A1); entity("iff", 0x21D4); - entity("ifr", 0x1D526); entity("Ifr", 0x2111); - entity("igr", 0x03B9); + entity("ifr", 0x1D526); entity("Igr", 0x0399); - entity("igrave", 0x00EC); + entity("igr", 0x03B9); entity("Igrave", 0x00CC); + entity("igrave", 0x00EC); entity("ii", 0x2148); entity("iiiint", 0x2A0C); entity("iiint", 0x222D); entity("iinfin", 0x29DC); entity("iiota", 0x2129); - entity("ijlig", 0x0133); entity("IJlig", 0x0132); + entity("ijlig", 0x0133); entity("Im", 0x2111); - entity("imacr", 0x012B); entity("Imacr", 0x012A); + entity("imacr", 0x012B); entity("image", 0x2111); entity("ImaginaryI", 0x2148); entity("imagline", 0x2110); @@ -1564,8 +1564,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("infin", 0x221E); entity("infintie", 0x29DD); entity("inodot", 0x0131); - entity("int", 0x222B); entity("Int", 0x222C); + entity("int", 0x222B); entity("intcal", 0x22BA); entity("integers", 0x2124); entity("Integral", 0x222B); @@ -1575,18 +1575,18 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("intprod", 0x2A3C); entity("InvisibleComma", 0x2063); entity("InvisibleTimes", 0x2062); - entity("iocy", 0x0451); entity("IOcy", 0x0401); - entity("iogon", 0x012F); + entity("iocy", 0x0451); entity("Iogon", 0x012E); - entity("iopf", 0x1D55A); + entity("iogon", 0x012F); entity("Iopf", 0x1D540); - entity("iota", 0x03B9); + entity("iopf", 0x1D55A); entity("Iota", 0x0399); + entity("iota", 0x03B9); entity("iprod", 0x2A3C); entity("iquest", 0x00BF); - entity("iscr", 0x1D4BE); entity("Iscr", 0x2110); + entity("iscr", 0x1D4BE); entity("isin", 0x2208); entity("isindot", 0x22F5); entity("isinE", 0x22F9); @@ -1594,66 +1594,66 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("isinsv", 0x22F3); entity("isinv", 0x2208); entity("it", 0x2062); - entity("itilde", 0x0129); entity("Itilde", 0x0128); - entity("iukcy", 0x0456); + entity("itilde", 0x0129); entity("Iukcy", 0x0406); - entity("iuml", 0x00EF); + entity("iukcy", 0x0456); entity("Iuml", 0x00CF); - entity("jcirc", 0x0135); + entity("iuml", 0x00EF); entity("Jcirc", 0x0134); - entity("jcy", 0x0439); + entity("jcirc", 0x0135); entity("Jcy", 0x0419); - entity("jfr", 0x1D527); + entity("jcy", 0x0439); entity("Jfr", 0x1D50D); + entity("jfr", 0x1D527); entity("jmath", 0x0237); - entity("jopf", 0x1D55B); entity("Jopf", 0x1D541); - entity("jscr", 0x1D4BF); + entity("jopf", 0x1D55B); entity("Jscr", 0x1D4A5); - entity("jsercy", 0x0458); + entity("jscr", 0x1D4BF); entity("Jsercy", 0x0408); - entity("jukcy", 0x0454); + entity("jsercy", 0x0458); entity("Jukcy", 0x0404); - entity("kappa", 0x03BA); + entity("jukcy", 0x0454); entity("Kappa", 0x039A); + entity("kappa", 0x03BA); entity("kappav", 0x03F0); - entity("kcedil", 0x0137); entity("Kcedil", 0x0136); - entity("kcy", 0x043A); + entity("kcedil", 0x0137); entity("Kcy", 0x041A); - entity("kfr", 0x1D528); + entity("kcy", 0x043A); entity("Kfr", 0x1D50E); - entity("kgr", 0x03BA); + entity("kfr", 0x1D528); entity("Kgr", 0x039A); + entity("kgr", 0x03BA); entity("kgreen", 0x0138); - entity("khcy", 0x0445); entity("KHcy", 0x0425); - entity("khgr", 0x03C7); + entity("khcy", 0x0445); entity("KHgr", 0x03A7); - entity("kjcy", 0x045C); + entity("khgr", 0x03C7); entity("KJcy", 0x040C); - entity("kopf", 0x1D55C); + entity("kjcy", 0x045C); entity("Kopf", 0x1D542); - entity("kscr", 0x1D4C0); + entity("kopf", 0x1D55C); entity("Kscr", 0x1D4A6); + entity("kscr", 0x1D4C0); entity("lAarr", 0x21DA); - entity("lacute", 0x013A); entity("Lacute", 0x0139); + entity("lacute", 0x013A); entity("laemptyv", 0x29B4); entity("lagran", 0x2112); - entity("lambda", 0x03BB); entity("Lambda", 0x039B); - entity("lang", 0x2329); + entity("lambda", 0x03BB); entity("Lang", 0x27EA); + entity("lang", 0x2329); entity("langd", 0x2991); entity("langle", 0x2329); entity("lap", 0x2A85); entity("Laplacetrf", 0x2112); entity("laquo", 0x00AB); - entity("larr", 0x2190); - entity("lArr", 0x21D0); entity("Larr", 0x219E); + entity("lArr", 0x21D0); + entity("larr", 0x2190); entity("larrb", 0x21E4); entity("larrbfs", 0x291F); entity("larrfs", 0x291D); @@ -1663,36 +1663,36 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("larrsim", 0x2973); entity("larrtl", 0x21A2); entity("lat", 0x2AAB); - entity("latail", 0x2919); entity("lAtail", 0x291B); + entity("latail", 0x2919); entity("late", 0x2AAD); - entity("lbarr", 0x290C); entity("lBarr", 0x290E); + entity("lbarr", 0x290C); entity("lbbrk", 0x2997); entity("lbrace", 0x007B); entity("lbrack", 0x005B); entity("lbrke", 0x298B); entity("lbrksld", 0x298F); entity("lbrkslu", 0x298D); - entity("lcaron", 0x013E); entity("Lcaron", 0x013D); - entity("lcedil", 0x013C); + entity("lcaron", 0x013E); entity("Lcedil", 0x013B); + entity("lcedil", 0x013C); entity("lceil", 0x2308); entity("lcub", 0x007B); - entity("lcy", 0x043B); entity("Lcy", 0x041B); + entity("lcy", 0x043B); entity("ldca", 0x2936); entity("ldquo", 0x201C); entity("ldquor", 0x201E); entity("ldrdhar", 0x2967); entity("ldrushar", 0x294B); entity("ldsh", 0x21B2); - entity("le", 0x2264); entity("lE", 0x2266); + entity("le", 0x2264); entity("LeftAngleBracket", 0x2329); - entity("leftarrow", 0x2190); entity("Leftarrow", 0x21D0); + entity("leftarrow", 0x2190); entity("LeftArrowBar", 0x21E4); entity("LeftArrowRightArrow", 0x21C6); entity("leftarrowtail", 0x21A2); @@ -1705,8 +1705,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("leftharpoondown", 0x21BD); entity("leftharpoonup", 0x21BC); entity("leftleftarrows", 0x21C7); - entity("leftrightarrow", 0x2194); entity("Leftrightarrow", 0x21D4); + entity("leftrightarrow", 0x2194); entity("leftrightarrows", 0x21C6); entity("leftrightharpoons", 0x21CB); entity("leftrightsquigarrow", 0x21AD); @@ -1724,8 +1724,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("LeftUpVectorBar", 0x2958); entity("LeftVector", 0x21BC); entity("LeftVectorBar", 0x2952); - entity("leg", 0x22DA); entity("lEg", 0x2A8B); + entity("leg", 0x22DA); entity("leq", 0x2264); entity("leqq", 0x2266); entity("leqslant", 0x2A7D); @@ -1749,52 +1749,52 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("LessTilde", 0x2272); entity("lfisht", 0x297C); entity("lfloor", 0x230A); - entity("lfr", 0x1D529); entity("Lfr", 0x1D50F); + entity("lfr", 0x1D529); entity("lg", 0x2276); entity("lgE", 0x2A91); - entity("lgr", 0x03BB); entity("Lgr", 0x039B); + entity("lgr", 0x03BB); entity("lHar", 0x2962); entity("lhard", 0x21BD); entity("lharu", 0x21BC); entity("lharul", 0x296A); entity("lhblk", 0x2584); - entity("ljcy", 0x0459); entity("LJcy", 0x0409); - entity("ll", 0x226A); + entity("ljcy", 0x0459); entity("Ll", 0x22D8); + entity("ll", 0x226A); entity("llarr", 0x21C7); entity("llcorner", 0x231E); entity("Lleftarrow", 0x21DA); entity("llhard", 0x296B); entity("lltri", 0x25FA); - entity("lmidot", 0x0140); entity("Lmidot", 0x013F); + entity("lmidot", 0x0140); entity("lmoust", 0x23B0); entity("lmoustache", 0x23B0); entity("lnap", 0x2A89); entity("lnapprox", 0x2A89); - entity("lne", 0x2A87); entity("lnE", 0x2268); + entity("lne", 0x2A87); entity("lneq", 0x2A87); entity("lneqq", 0x2268); entity("lnsim", 0x22E6); entity("loang", 0x27EC); entity("loarr", 0x21FD); entity("lobrk", 0x27E6); - entity("longleftarrow", 0x27F5); entity("Longleftarrow", 0x27F8); - entity("longleftrightarrow", 0x27F7); + entity("longleftarrow", 0x27F5); entity("Longleftrightarrow", 0x27FA); + entity("longleftrightarrow", 0x27F7); entity("longmapsto", 0x27FC); - entity("longrightarrow", 0x27F6); entity("Longrightarrow", 0x27F9); + entity("longrightarrow", 0x27F6); entity("looparrowleft", 0x21AB); entity("looparrowright", 0x21AC); entity("lopar", 0x2985); - entity("lopf", 0x1D55D); entity("Lopf", 0x1D543); + entity("lopf", 0x1D55D); entity("loplus", 0x2A2D); entity("lotimes", 0x2A34); entity("lowast", 0x2217); @@ -1813,8 +1813,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("lrm", 0x200E); entity("lrtri", 0x22BF); entity("lsaquo", 0x2039); - entity("lscr", 0x1D4C1); entity("Lscr", 0x2112); + entity("lscr", 0x1D4C1); entity("lsh", 0x21B0); entity("lsim", 0x2272); entity("lsime", 0x2A8D); @@ -1822,10 +1822,10 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("lsqb", 0x005B); entity("lsquo", 0x2018); entity("lsquor", 0x201A); - entity("lstrok", 0x0142); entity("Lstrok", 0x0141); - entity("lt", 0x003C); + entity("lstrok", 0x0142); entity("Lt", 0x226A); + entity("lt", 0x003C); entity("ltcc", 0x2AA6); entity("ltcir", 0x2A79); entity("ltdot", 0x22D6); @@ -1843,25 +1843,25 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("male", 0x2642); entity("malt", 0x2720); entity("maltese", 0x2720); - entity("map", 0x21A6); entity("Map", 0x2905); + entity("map", 0x21A6); entity("mapsto", 0x21A6); entity("mapstodown", 0x21A7); entity("mapstoleft", 0x21A4); entity("mapstoup", 0x21A5); entity("marker", 0x25AE); entity("mcomma", 0x2A29); - entity("mcy", 0x043C); entity("Mcy", 0x041C); + entity("mcy", 0x043C); entity("mdash", 0x2014); entity("mDDot", 0x223A); entity("measuredangle", 0x2221); entity("MediumSpace", 0x205F); entity("Mellintrf", 0x2133); - entity("mfr", 0x1D52A); entity("Mfr", 0x1D510); - entity("mgr", 0x03BC); + entity("mfr", 0x1D52A); entity("Mgr", 0x039C); + entity("mgr", 0x03BC); entity("mho", 0x2127); entity("micro", 0x00B5); entity("mid", 0x2223); @@ -1877,19 +1877,19 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("mldr", 0x2026); entity("mnplus", 0x2213); entity("models", 0x22A7); - entity("mopf", 0x1D55E); entity("Mopf", 0x1D544); + entity("mopf", 0x1D55E); entity("mp", 0x2213); - entity("mscr", 0x1D4C2); entity("Mscr", 0x2133); + entity("mscr", 0x1D4C2); entity("mstpos", 0x223E); - entity("mu", 0x03BC); entity("Mu", 0x039C); + entity("mu", 0x03BC); entity("multimap", 0x22B8); entity("mumap", 0x22B8); entity("nabla", 0x2207); - entity("nacute", 0x0144); entity("Nacute", 0x0143); + entity("nacute", 0x0144); entity("nap", 0x2249); entity("napos", 0x0149); entity("napprox", 0x2249); @@ -1898,19 +1898,19 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("naturals", 0x2115); entity("nbsp", 0x00A0); entity("ncap", 0x2A43); - entity("ncaron", 0x0148); entity("Ncaron", 0x0147); - entity("ncedil", 0x0146); + entity("ncaron", 0x0148); entity("Ncedil", 0x0145); + entity("ncedil", 0x0146); entity("ncong", 0x2247); entity("ncup", 0x2A42); - entity("ncy", 0x043D); entity("Ncy", 0x041D); + entity("ncy", 0x043D); entity("ndash", 0x2013); entity("ne", 0x2260); entity("nearhk", 0x2924); - entity("nearr", 0x2197); entity("neArr", 0x21D7); + entity("nearr", 0x2197); entity("nearrow", 0x2197); entity("NegativeMediumSpace", 0x200B); entity("NegativeThickSpace", 0x200B); @@ -1923,32 +1923,32 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("NewLine", 0x000A); entity("nexist", 0x2204); entity("nexists", 0x2204); - entity("nfr", 0x1D52B); entity("Nfr", 0x1D511); + entity("nfr", 0x1D52B); entity("nge", 0x2271); entity("ngeq", 0x2271); - entity("ngr", 0x03BD); entity("Ngr", 0x039D); + entity("ngr", 0x03BD); entity("ngsim", 0x2275); entity("ngt", 0x226F); entity("ngtr", 0x226F); - entity("nharr", 0x21AE); entity("nhArr", 0x21CE); + entity("nharr", 0x21AE); entity("nhpar", 0x2AF2); entity("ni", 0x220B); entity("nis", 0x22FC); entity("nisd", 0x22FA); entity("niv", 0x220B); - entity("njcy", 0x045A); entity("NJcy", 0x040A); - entity("nlarr", 0x219A); + entity("njcy", 0x045A); entity("nlArr", 0x21CD); + entity("nlarr", 0x219A); entity("nldr", 0x2025); entity("nle", 0x2270); - entity("nleftarrow", 0x219A); entity("nLeftarrow", 0x21CD); - entity("nleftrightarrow", 0x21AE); + entity("nleftarrow", 0x219A); entity("nLeftrightarrow", 0x21CE); + entity("nleftrightarrow", 0x21AE); entity("nleq", 0x2270); entity("nless", 0x226E); entity("nlsim", 0x2274); @@ -1958,10 +1958,10 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("nmid", 0x2224); entity("NoBreak", 0x2060); entity("NonBreakingSpace", 0x00A0); - entity("nopf", 0x1D55F); entity("Nopf", 0x2115); - entity("not", 0x00AC); + entity("nopf", 0x1D55F); entity("Not", 0x2AEC); + entity("not", 0x00AC); entity("NotCongruent", 0x2262); entity("NotCupCap", 0x226D); entity("NotDoubleVerticalBar", 0x2226); @@ -2008,16 +2008,16 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("npr", 0x2280); entity("nprcue", 0x22E0); entity("nprec", 0x2280); - entity("nrarr", 0x219B); entity("nrArr", 0x21CF); - entity("nrightarrow", 0x219B); + entity("nrarr", 0x219B); entity("nRightarrow", 0x21CF); + entity("nrightarrow", 0x219B); entity("nrtri", 0x22EB); entity("nrtrie", 0x22ED); entity("nsc", 0x2281); entity("nsccue", 0x22E1); - entity("nscr", 0x1D4C3); entity("Nscr", 0x1D4A9); + entity("nscr", 0x1D4C3); entity("nshortmid", 0x2224); entity("nshortparallel", 0x2226); entity("nsim", 0x2241); @@ -2035,63 +2035,63 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("nsupe", 0x2289); entity("nsupseteq", 0x2289); entity("ntgl", 0x2279); - entity("ntilde", 0x00F1); entity("Ntilde", 0x00D1); + entity("ntilde", 0x00F1); entity("ntlg", 0x2278); entity("ntriangleleft", 0x22EA); entity("ntrianglelefteq", 0x22EC); entity("ntriangleright", 0x22EB); entity("ntrianglerighteq", 0x22ED); - entity("nu", 0x03BD); entity("Nu", 0x039D); + entity("nu", 0x03BD); entity("num", 0x0023); entity("numero", 0x2116); entity("numsp", 0x2007); - entity("nvdash", 0x22AC); - entity("nvDash", 0x22AD); - entity("nVdash", 0x22AE); entity("nVDash", 0x22AF); + entity("nVdash", 0x22AE); + entity("nvDash", 0x22AD); + entity("nvdash", 0x22AC); entity("nvHarr", 0x2904); entity("nvinfin", 0x29DE); entity("nvlArr", 0x2902); entity("nvrArr", 0x2903); entity("nwarhk", 0x2923); - entity("nwarr", 0x2196); entity("nwArr", 0x21D6); + entity("nwarr", 0x2196); entity("nwarrow", 0x2196); entity("nwnear", 0x2927); - entity("oacgr", 0x03CC); entity("Oacgr", 0x038C); - entity("oacute", 0x00F3); + entity("oacgr", 0x03CC); entity("Oacute", 0x00D3); + entity("oacute", 0x00F3); entity("oast", 0x229B); entity("ocir", 0x229A); - entity("ocirc", 0x00F4); entity("Ocirc", 0x00D4); - entity("ocy", 0x043E); + entity("ocirc", 0x00F4); entity("Ocy", 0x041E); + entity("ocy", 0x043E); entity("odash", 0x229D); - entity("odblac", 0x0151); entity("Odblac", 0x0150); + entity("odblac", 0x0151); entity("odiv", 0x2A38); entity("odot", 0x2299); entity("odsold", 0x29BC); - entity("oelig", 0x0153); entity("OElig", 0x0152); + entity("oelig", 0x0153); entity("ofcir", 0x29BF); - entity("ofr", 0x1D52C); entity("Ofr", 0x1D512); + entity("ofr", 0x1D52C); entity("ogon", 0x02DB); - entity("ogr", 0x03BF); entity("Ogr", 0x039F); - entity("ograve", 0x00F2); + entity("ogr", 0x03BF); entity("Ograve", 0x00D2); + entity("ograve", 0x00F2); entity("ogt", 0x29C1); - entity("ohacgr", 0x03CE); entity("OHacgr", 0x038F); + entity("ohacgr", 0x03CE); entity("ohbar", 0x29B5); - entity("ohgr", 0x03C9); entity("OHgr", 0x03A9); + entity("ohgr", 0x03C9); entity("ohm", 0x2126); entity("oint", 0x222E); entity("olarr", 0x21BA); @@ -2099,23 +2099,23 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("olcross", 0x29BB); entity("oline", 0x203E); entity("olt", 0x29C0); - entity("omacr", 0x014D); entity("Omacr", 0x014C); - entity("omega", 0x03C9); + entity("omacr", 0x014D); entity("Omega", 0x03A9); - entity("omicron", 0x03BF); + entity("omega", 0x03C9); entity("Omicron", 0x039F); + entity("omicron", 0x03BF); entity("omid", 0x29B6); entity("ominus", 0x2296); - entity("oopf", 0x1D560); entity("Oopf", 0x1D546); + entity("oopf", 0x1D560); entity("opar", 0x29B7); entity("OpenCurlyDoubleQuote", 0x201C); entity("OpenCurlyQuote", 0x2018); entity("operp", 0x29B9); entity("oplus", 0x2295); - entity("or", 0x2228); entity("Or", 0x2A54); + entity("or", 0x2228); entity("orarr", 0x21BB); entity("ord", 0x2A5D); entity("order", 0x2134); @@ -2127,18 +2127,18 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("orslope", 0x2A57); entity("orv", 0x2A5B); entity("oS", 0x24C8); - entity("oscr", 0x2134); entity("Oscr", 0x1D4AA); - entity("oslash", 0x00F8); + entity("oscr", 0x2134); entity("Oslash", 0x00D8); + entity("oslash", 0x00F8); entity("osol", 0x2298); - entity("otilde", 0x00F5); entity("Otilde", 0x00D5); - entity("otimes", 0x2297); + entity("otilde", 0x00F5); entity("Otimes", 0x2A37); + entity("otimes", 0x2297); entity("otimesas", 0x2A36); - entity("ouml", 0x00F6); entity("Ouml", 0x00D6); + entity("ouml", 0x00F6); entity("ovbar", 0x233D); entity("OverBar", 0x00AF); entity("OverBrace", 0xFE37); @@ -2151,26 +2151,26 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("parsl", 0x2AFD); entity("part", 0x2202); entity("PartialD", 0x2202); - entity("pcy", 0x043F); entity("Pcy", 0x041F); + entity("pcy", 0x043F); entity("percnt", 0x0025); entity("period", 0x002E); entity("permil", 0x2030); entity("perp", 0x22A5); entity("pertenk", 0x2031); - entity("pfr", 0x1D52D); entity("Pfr", 0x1D513); - entity("pgr", 0x03C0); + entity("pfr", 0x1D52D); entity("Pgr", 0x03A0); - entity("phgr", 0x03C6); + entity("pgr", 0x03C0); entity("PHgr", 0x03A6); - entity("phi", 0x03D5); + entity("phgr", 0x03C6); entity("Phi", 0x03A6); + entity("phi", 0x03D5); entity("phiv", 0x03C6); entity("phmmat", 0x2133); entity("phone", 0x260E); - entity("pi", 0x03C0); entity("Pi", 0x03A0); + entity("pi", 0x03C0); entity("pitchfork", 0x22D4); entity("piv", 0x03D6); entity("planck", 0x210F); @@ -2190,15 +2190,15 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("pm", 0x00B1); entity("Poincareplane", 0x210C); entity("pointint", 0x2A15); - entity("popf", 0x1D561); entity("Popf", 0x2119); + entity("popf", 0x1D561); entity("pound", 0x00A3); - entity("pr", 0x227A); entity("Pr", 0x2ABB); + entity("pr", 0x227A); entity("prap", 0x2AB7); entity("prcue", 0x227C); - entity("pre", 0x2AAF); entity("prE", 0x2AB3); + entity("pre", 0x2AAF); entity("prec", 0x227A); entity("precapprox", 0x2AB7); entity("preccurlyeq", 0x227C); @@ -2211,8 +2211,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("precneqq", 0x2AB5); entity("precnsim", 0x22E8); entity("precsim", 0x227E); - entity("prime", 0x2032); entity("Prime", 0x2033); + entity("prime", 0x2032); entity("primes", 0x2119); entity("prnap", 0x2AB9); entity("prnE", 0x2AB5); @@ -2228,21 +2228,21 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("propto", 0x221D); entity("prsim", 0x227E); entity("prurel", 0x22B0); - entity("pscr", 0x1D4C5); entity("Pscr", 0x1D4AB); - entity("psgr", 0x03C8); + entity("pscr", 0x1D4C5); entity("PSgr", 0x03A8); - entity("psi", 0x03C8); + entity("psgr", 0x03C8); entity("Psi", 0x03A8); + entity("psi", 0x03C8); entity("puncsp", 0x2008); - entity("qfr", 0x1D52E); entity("Qfr", 0x1D514); + entity("qfr", 0x1D52E); entity("qint", 0x2A0C); - entity("qopf", 0x1D562); entity("Qopf", 0x211A); + entity("qopf", 0x1D562); entity("qprime", 0x2057); - entity("qscr", 0x1D4C6); entity("Qscr", 0x1D4AC); + entity("qscr", 0x1D4C6); entity("quaternions", 0x210D); entity("quatint", 0x2A16); entity("quest", 0x003F); @@ -2250,19 +2250,19 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("quot", 0x0022); entity("rAarr", 0x21DB); entity("race", 0x29DA); - entity("racute", 0x0155); entity("Racute", 0x0154); + entity("racute", 0x0155); entity("radic", 0x221A); entity("raemptyv", 0x29B3); - entity("rang", 0x232A); entity("Rang", 0x27EB); + entity("rang", 0x232A); entity("rangd", 0x2992); entity("range", 0x29A5); entity("rangle", 0x232A); entity("raquo", 0x00BB); - entity("rarr", 0x2192); - entity("rArr", 0x21D2); entity("Rarr", 0x21A0); + entity("rArr", 0x21D2); + entity("rarr", 0x2192); entity("rarrap", 0x2975); entity("rarrb", 0x21E5); entity("rarrbfs", 0x2920); @@ -2272,30 +2272,30 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("rarrlp", 0x21AC); entity("rarrpl", 0x2945); entity("rarrsim", 0x2974); - entity("rarrtl", 0x21A3); entity("Rarrtl", 0x2916); + entity("rarrtl", 0x21A3); entity("rarrw", 0x219D); - entity("ratail", 0x291A); entity("rAtail", 0x291C); + entity("ratail", 0x291A); entity("ratio", 0x2236); entity("rationals", 0x211A); - entity("rbarr", 0x290D); - entity("rBarr", 0x290F); entity("RBarr", 0x2910); + entity("rBarr", 0x290F); + entity("rbarr", 0x290D); entity("rbbrk", 0x2998); entity("rbrace", 0x007D); entity("rbrack", 0x005D); entity("rbrke", 0x298C); entity("rbrksld", 0x298E); entity("rbrkslu", 0x2990); - entity("rcaron", 0x0159); entity("Rcaron", 0x0158); - entity("rcedil", 0x0157); + entity("rcaron", 0x0159); entity("Rcedil", 0x0156); + entity("rcedil", 0x0157); entity("rceil", 0x2309); entity("rcub", 0x007D); - entity("rcy", 0x0440); entity("Rcy", 0x0420); + entity("rcy", 0x0440); entity("rdca", 0x2937); entity("rdldhar", 0x2969); entity("rdquo", 0x201D); @@ -2313,20 +2313,20 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("ReverseUpEquilibrium", 0x296F); entity("rfisht", 0x297D); entity("rfloor", 0x230B); - entity("rfr", 0x1D52F); entity("Rfr", 0x211C); - entity("rgr", 0x03C1); + entity("rfr", 0x1D52F); entity("Rgr", 0x03A1); + entity("rgr", 0x03C1); entity("rHar", 0x2964); entity("rhard", 0x21C1); entity("rharu", 0x21C0); entity("rharul", 0x296C); - entity("rho", 0x03C1); entity("Rho", 0x03A1); + entity("rho", 0x03C1); entity("rhov", 0x03F1); entity("RightAngleBracket", 0x232A); - entity("rightarrow", 0x2192); entity("Rightarrow", 0x21D2); + entity("rightarrow", 0x2192); entity("RightArrowBar", 0x21E5); entity("RightArrowLeftArrow", 0x21C4); entity("rightarrowtail", 0x21A3); @@ -2367,8 +2367,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("roarr", 0x21FE); entity("robrk", 0x27E7); entity("ropar", 0x2986); - entity("ropf", 0x1D563); entity("Ropf", 0x211D); + entity("ropf", 0x1D563); entity("roplus", 0x2A2E); entity("rotimes", 0x2A35); entity("RoundImplies", 0x2970); @@ -2378,8 +2378,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("rrarr", 0x21C9); entity("Rrightarrow", 0x21DB); entity("rsaquo", 0x203A); - entity("rscr", 0x1D4C7); entity("Rscr", 0x211B); + entity("rscr", 0x1D4C7); entity("rsh", 0x21B1); entity("rsqb", 0x005D); entity("rsquo", 0x2019); @@ -2393,34 +2393,34 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("RuleDelayed", 0x29F4); entity("ruluhar", 0x2968); entity("rx", 0x211E); - entity("sacute", 0x015B); entity("Sacute", 0x015A); + entity("sacute", 0x015B); entity("sbquo", 0x201A); - entity("sc", 0x227B); entity("Sc", 0x2ABC); + entity("sc", 0x227B); entity("scap", 0x2AB8); - entity("scaron", 0x0161); entity("Scaron", 0x0160); + entity("scaron", 0x0161); entity("sccue", 0x227D); - entity("sce", 0x2AB0); entity("scE", 0x2AB4); - entity("scedil", 0x015F); + entity("sce", 0x2AB0); entity("Scedil", 0x015E); - entity("scirc", 0x015D); + entity("scedil", 0x015F); entity("Scirc", 0x015C); + entity("scirc", 0x015D); entity("scnap", 0x2ABA); entity("scnE", 0x2AB6); entity("scnsim", 0x22E9); entity("scpolint", 0x2A13); entity("scsim", 0x227F); - entity("scy", 0x0441); entity("Scy", 0x0421); + entity("scy", 0x0441); entity("sdot", 0x22C5); entity("sdotb", 0x22A1); entity("sdote", 0x2A66); entity("searhk", 0x2925); - entity("searr", 0x2198); entity("seArr", 0x21D8); + entity("searr", 0x2198); entity("searrow", 0x2198); entity("sect", 0x00A7); entity("semi", 0x003B); @@ -2429,16 +2429,16 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("setmn", 0x2216); entity("sext", 0x2736); entity("sfgr", 0x03C2); - entity("sfr", 0x1D530); entity("Sfr", 0x1D516); + entity("sfr", 0x1D530); entity("sfrown", 0x2322); - entity("sgr", 0x03C3); entity("Sgr", 0x03A3); + entity("sgr", 0x03C3); entity("sharp", 0x266F); - entity("shchcy", 0x0449); entity("SHCHcy", 0x0429); - entity("shcy", 0x0448); + entity("shchcy", 0x0449); entity("SHcy", 0x0428); + entity("shcy", 0x0448); entity("ShortDownArrow", 0x2193); entity("ShortLeftArrow", 0x2190); entity("shortmid", 0x2223); @@ -2446,8 +2446,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("ShortRightArrow", 0x2192); entity("ShortUpArrow", 0x2191); entity("shy", 0x00AD); - entity("sigma", 0x03C3); entity("Sigma", 0x03A3); + entity("sigma", 0x03C3); entity("sigmaf", 0x03C2); entity("sigmav", 0x03C2); entity("sim", 0x223C); @@ -2470,13 +2470,13 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("smile", 0x2323); entity("smt", 0x2AAA); entity("smte", 0x2AAC); - entity("softcy", 0x044C); entity("SOFTcy", 0x042C); + entity("softcy", 0x044C); entity("sol", 0x002F); entity("solb", 0x29C4); entity("solbar", 0x233F); - entity("sopf", 0x1D564); entity("Sopf", 0x1D54A); + entity("sopf", 0x1D564); entity("spades", 0x2660); entity("spadesuit", 0x2660); entity("spar", 0x2225); @@ -2502,30 +2502,30 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("squarf", 0x25AA); entity("squf", 0x25AA); entity("srarr", 0x2192); - entity("sscr", 0x1D4C8); entity("Sscr", 0x1D4AE); + entity("sscr", 0x1D4C8); entity("ssetmn", 0x2216); entity("ssmile", 0x2323); entity("sstarf", 0x22C6); - entity("star", 0x2606); entity("Star", 0x22C6); + entity("star", 0x2606); entity("starf", 0x2605); entity("straightepsilon", 0x03F5); entity("straightphi", 0x03D5); entity("strns", 0x00AF); - entity("sub", 0x2282); entity("Sub", 0x22D0); + entity("sub", 0x2282); entity("subdot", 0x2ABD); - entity("sube", 0x2286); entity("subE", 0x2AC5); + entity("sube", 0x2286); entity("subedot", 0x2AC3); entity("submult", 0x2AC1); - entity("subne", 0x228A); entity("subnE", 0x2ACB); + entity("subne", 0x228A); entity("subplus", 0x2ABF); entity("subrarr", 0x2979); - entity("subset", 0x2282); entity("Subset", 0x22D0); + entity("subset", 0x2282); entity("subseteq", 0x2286); entity("subseteqq", 0x2AC5); entity("SubsetEqual", 0x2286); @@ -2549,26 +2549,26 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("SuchThat", 0x220B); entity("sum", 0x2211); entity("sung", 0x266A); - entity("sup", 0x2283); entity("Sup", 0x22D1); + entity("sup", 0x2283); entity("sup1", 0x00B9); entity("sup2", 0x00B2); entity("sup3", 0x00B3); entity("supdot", 0x2ABE); entity("supdsub", 0x2AD8); - entity("supe", 0x2287); entity("supE", 0x2AC6); + entity("supe", 0x2287); entity("supedot", 0x2AC4); entity("Superset", 0x2283); entity("SupersetEqual", 0x2287); entity("suphsub", 0x2AD7); entity("suplarr", 0x297B); entity("supmult", 0x2AC2); - entity("supne", 0x228B); entity("supnE", 0x2ACC); + entity("supne", 0x228B); entity("supplus", 0x2AC0); - entity("supset", 0x2283); entity("Supset", 0x22D1); + entity("supset", 0x2283); entity("supseteq", 0x2287); entity("supseteqq", 0x2AC6); entity("supsetneq", 0x228B); @@ -2577,45 +2577,45 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("supsub", 0x2AD4); entity("supsup", 0x2AD6); entity("swarhk", 0x2926); - entity("swarr", 0x2199); entity("swArr", 0x21D9); + entity("swarr", 0x2199); entity("swarrow", 0x2199); entity("swnwar", 0x292A); entity("szlig", 0x00DF); entity("Tab", 0x0009); entity("target", 0x2316); - entity("tau", 0x03C4); entity("Tau", 0x03A4); + entity("tau", 0x03C4); entity("tbrk", 0x23B4); - entity("tcaron", 0x0165); entity("Tcaron", 0x0164); - entity("tcedil", 0x0163); + entity("tcaron", 0x0165); entity("Tcedil", 0x0162); - entity("tcy", 0x0442); + entity("tcedil", 0x0163); entity("Tcy", 0x0422); + entity("tcy", 0x0442); entity("telrec", 0x2315); - entity("tfr", 0x1D531); entity("Tfr", 0x1D517); - entity("tgr", 0x03C4); + entity("tfr", 0x1D531); entity("Tgr", 0x03A4); + entity("tgr", 0x03C4); entity("there4", 0x2234); entity("therefore", 0x2234); - entity("theta", 0x03B8); entity("Theta", 0x0398); + entity("theta", 0x03B8); entity("thetasym", 0x03D1); entity("thetav", 0x03D1); - entity("thgr", 0x03B8); entity("THgr", 0x0398); + entity("thgr", 0x03B8); entity("thickapprox", 0x2248); entity("thicksim", 0x223C); entity("thinsp", 0x2009); entity("ThinSpace", 0x2009); entity("thkap", 0x2248); entity("thksim", 0x223C); - entity("thorn", 0x00FE); entity("THORN", 0x00DE); - entity("tilde", 0x02DC); + entity("thorn", 0x00FE); entity("Tilde", 0x223C); + entity("tilde", 0x02DC); entity("TildeEqual", 0x2243); entity("TildeFullEqual", 0x2245); entity("TildeTilde", 0x2248); @@ -2628,8 +2628,8 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("top", 0x22A4); entity("topbot", 0x2336); entity("topcir", 0x2AF1); - entity("topf", 0x1D565); entity("Topf", 0x1D54B); + entity("topf", 0x1D565); entity("topfork", 0x2ADA); entity("tosa", 0x2929); entity("tprime", 0x2034); @@ -2648,47 +2648,47 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("trisb", 0x29CD); entity("tritime", 0x2A3B); entity("trpezium", 0x23E2); - entity("tscr", 0x1D4C9); entity("Tscr", 0x1D4AF); - entity("tscy", 0x0446); + entity("tscr", 0x1D4C9); entity("TScy", 0x0426); - entity("tshcy", 0x045B); + entity("tscy", 0x0446); entity("TSHcy", 0x040B); - entity("tstrok", 0x0167); + entity("tshcy", 0x045B); entity("Tstrok", 0x0166); + entity("tstrok", 0x0167); entity("twixt", 0x226C); entity("twoheadleftarrow", 0x219E); entity("twoheadrightarrow", 0x21A0); - entity("uacgr", 0x03CD); entity("Uacgr", 0x038E); - entity("uacute", 0x00FA); + entity("uacgr", 0x03CD); entity("Uacute", 0x00DA); - entity("uarr", 0x2191); - entity("uArr", 0x21D1); + entity("uacute", 0x00FA); entity("Uarr", 0x219F); + entity("uArr", 0x21D1); + entity("uarr", 0x2191); entity("Uarrocir", 0x2949); - entity("ubrcy", 0x045E); entity("Ubrcy", 0x040E); - entity("ubreve", 0x016D); + entity("ubrcy", 0x045E); entity("Ubreve", 0x016C); - entity("ucirc", 0x00FB); + entity("ubreve", 0x016D); entity("Ucirc", 0x00DB); - entity("ucy", 0x0443); + entity("ucirc", 0x00FB); entity("Ucy", 0x0423); + entity("ucy", 0x0443); entity("udarr", 0x21C5); - entity("udblac", 0x0171); entity("Udblac", 0x0170); + entity("udblac", 0x0171); entity("udhar", 0x296E); entity("udiagr", 0x03B0); - entity("udigr", 0x03CB); entity("Udigr", 0x03AB); + entity("udigr", 0x03CB); entity("ufisht", 0x297E); - entity("ufr", 0x1D532); entity("Ufr", 0x1D518); - entity("ugr", 0x03C5); + entity("ufr", 0x1D532); entity("Ugr", 0x03A5); - entity("ugrave", 0x00F9); + entity("ugr", 0x03C5); entity("Ugrave", 0x00D9); + entity("ugrave", 0x00F9); entity("uHar", 0x2963); entity("uharl", 0x21BF); entity("uharr", 0x21BE); @@ -2697,54 +2697,54 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("ulcorner", 0x231C); entity("ulcrop", 0x230F); entity("ultri", 0x25F8); - entity("umacr", 0x016B); entity("Umacr", 0x016A); + entity("umacr", 0x016B); entity("uml", 0x00A8); entity("UnderBrace", 0xFE38); entity("UnderBracket", 0x23B5); entity("UnderParenthesis", 0xFE36); entity("Union", 0x22C3); entity("UnionPlus", 0x228E); - entity("uogon", 0x0173); entity("Uogon", 0x0172); - entity("uopf", 0x1D566); + entity("uogon", 0x0173); entity("Uopf", 0x1D54C); - entity("uparrow", 0x2191); + entity("uopf", 0x1D566); entity("Uparrow", 0x21D1); + entity("uparrow", 0x2191); entity("UpArrowBar", 0x2912); entity("UpArrowDownArrow", 0x21C5); - entity("updownarrow", 0x2195); entity("Updownarrow", 0x21D5); + entity("updownarrow", 0x2195); entity("UpEquilibrium", 0x296E); entity("upharpoonleft", 0x21BF); entity("upharpoonright", 0x21BE); entity("uplus", 0x228E); entity("UpperLeftArrow", 0x2196); entity("UpperRightArrow", 0x2197); - entity("upsi", 0x03C5); entity("Upsi", 0x03D2); + entity("upsi", 0x03C5); entity("upsih", 0x03D2); - entity("upsilon", 0x03C5); entity("Upsilon", 0x03A5); + entity("upsilon", 0x03C5); entity("UpTee", 0x22A5); entity("UpTeeArrow", 0x21A5); entity("upuparrows", 0x21C8); entity("urcorn", 0x231D); entity("urcorner", 0x231D); entity("urcrop", 0x230E); - entity("uring", 0x016F); entity("Uring", 0x016E); + entity("uring", 0x016F); entity("urtri", 0x25F9); - entity("uscr", 0x1D4CA); entity("Uscr", 0x1D4B0); + entity("uscr", 0x1D4CA); entity("utdot", 0x22F0); - entity("utilde", 0x0169); entity("Utilde", 0x0168); + entity("utilde", 0x0169); entity("utri", 0x25B5); entity("utrif", 0x25B4); entity("uuarr", 0x21C8); - entity("uuml", 0x00FC); entity("Uuml", 0x00DC); + entity("uuml", 0x00FC); entity("uwangle", 0x29A7); entity("vangrt", 0x299C); entity("varepsilon", 0x03B5); @@ -2753,138 +2753,138 @@ public class HTMLSchema extends Schema implements HTMLModels { entity("varphi", 0x03C6); entity("varpi", 0x03D6); entity("varpropto", 0x221D); - entity("varr", 0x2195); entity("vArr", 0x21D5); + entity("varr", 0x2195); entity("varrho", 0x03F1); entity("varsigma", 0x03C2); entity("vartheta", 0x03D1); entity("vartriangleleft", 0x22B2); entity("vartriangleright", 0x22B3); - entity("vBar", 0x2AE8); entity("Vbar", 0x2AEB); + entity("vBar", 0x2AE8); entity("vBarv", 0x2AE9); - entity("vcy", 0x0432); entity("Vcy", 0x0412); - entity("vdash", 0x22A2); - entity("vDash", 0x22A8); - entity("Vdash", 0x22A9); + entity("vcy", 0x0432); entity("VDash", 0x22AB); + entity("Vdash", 0x22A9); + entity("vDash", 0x22A8); + entity("vdash", 0x22A2); entity("Vdashl", 0x2AE6); - entity("vee", 0x2228); entity("Vee", 0x22C1); + entity("vee", 0x2228); entity("veebar", 0x22BB); entity("veeeq", 0x225A); entity("vellip", 0x22EE); - entity("verbar", 0x007C); entity("Verbar", 0x2016); - entity("vert", 0x007C); + entity("verbar", 0x007C); entity("Vert", 0x2016); + entity("vert", 0x007C); entity("VerticalBar", 0x2223); entity("VerticalLine", 0x007C); entity("VerticalSeparator", 0x2758); entity("VerticalTilde", 0x2240); entity("VeryThinSpace", 0x200A); - entity("vfr", 0x1D533); entity("Vfr", 0x1D519); + entity("vfr", 0x1D533); entity("vltri", 0x22B2); - entity("vopf", 0x1D567); entity("Vopf", 0x1D54D); + entity("vopf", 0x1D567); entity("vprop", 0x221D); entity("vrtri", 0x22B3); - entity("vscr", 0x1D4CB); entity("Vscr", 0x1D4B1); + entity("vscr", 0x1D4CB); entity("Vvdash", 0x22AA); entity("vzigzag", 0x299A); - entity("wcirc", 0x0175); entity("Wcirc", 0x0174); + entity("wcirc", 0x0175); entity("wedbar", 0x2A5F); - entity("wedge", 0x2227); entity("Wedge", 0x22C0); + entity("wedge", 0x2227); entity("wedgeq", 0x2259); entity("weierp", 0x2118); - entity("wfr", 0x1D534); entity("Wfr", 0x1D51A); - entity("wopf", 0x1D568); + entity("wfr", 0x1D534); entity("Wopf", 0x1D54E); + entity("wopf", 0x1D568); entity("wp", 0x2118); entity("wr", 0x2240); entity("wreath", 0x2240); - entity("wscr", 0x1D4CC); entity("Wscr", 0x1D4B2); + entity("wscr", 0x1D4CC); entity("xcap", 0x22C2); entity("xcirc", 0x25EF); entity("xcup", 0x22C3); entity("xdtri", 0x25BD); - entity("xfr", 0x1D535); entity("Xfr", 0x1D51B); - entity("xgr", 0x03BE); + entity("xfr", 0x1D535); entity("Xgr", 0x039E); - entity("xharr", 0x27F7); + entity("xgr", 0x03BE); entity("xhArr", 0x27FA); - entity("xi", 0x03BE); + entity("xharr", 0x27F7); entity("Xi", 0x039E); - entity("xlarr", 0x27F5); + entity("xi", 0x03BE); entity("xlArr", 0x27F8); + entity("xlarr", 0x27F5); entity("xmap", 0x27FC); entity("xnis", 0x22FB); entity("xodot", 0x2A00); - entity("xopf", 0x1D569); entity("Xopf", 0x1D54F); + entity("xopf", 0x1D569); entity("xoplus", 0x2A01); entity("xotime", 0x2A02); - entity("xrarr", 0x27F6); entity("xrArr", 0x27F9); - entity("xscr", 0x1D4CD); + entity("xrarr", 0x27F6); entity("Xscr", 0x1D4B3); + entity("xscr", 0x1D4CD); entity("xsqcup", 0x2A06); entity("xuplus", 0x2A04); entity("xutri", 0x25B3); entity("xvee", 0x22C1); entity("xwedge", 0x22C0); - entity("yacute", 0x00FD); entity("Yacute", 0x00DD); - entity("yacy", 0x044F); + entity("yacute", 0x00FD); entity("YAcy", 0x042F); - entity("ycirc", 0x0177); + entity("yacy", 0x044F); entity("Ycirc", 0x0176); - entity("ycy", 0x044B); + entity("ycirc", 0x0177); entity("Ycy", 0x042B); + entity("ycy", 0x044B); entity("yen", 0x00A5); - entity("yfr", 0x1D536); entity("Yfr", 0x1D51C); - entity("yicy", 0x0457); + entity("yfr", 0x1D536); entity("YIcy", 0x0407); - entity("yopf", 0x1D56A); + entity("yicy", 0x0457); entity("Yopf", 0x1D550); - entity("yscr", 0x1D4CE); + entity("yopf", 0x1D56A); entity("Yscr", 0x1D4B4); - entity("yucy", 0x044E); + entity("yscr", 0x1D4CE); entity("YUcy", 0x042E); - entity("yuml", 0x00FF); + entity("yucy", 0x044E); entity("Yuml", 0x0178); - entity("zacute", 0x017A); + entity("yuml", 0x00FF); entity("Zacute", 0x0179); - entity("zcaron", 0x017E); + entity("zacute", 0x017A); entity("Zcaron", 0x017D); - entity("zcy", 0x0437); + entity("zcaron", 0x017E); entity("Zcy", 0x0417); - entity("zdot", 0x017C); + entity("zcy", 0x0437); entity("Zdot", 0x017B); + entity("zdot", 0x017C); entity("zeetrf", 0x2128); entity("ZeroWidthSpace", 0x200B); - entity("zeta", 0x03B6); entity("Zeta", 0x0396); - entity("zfr", 0x1D537); + entity("zeta", 0x03B6); entity("Zfr", 0x2128); - entity("zgr", 0x03B6); + entity("zfr", 0x1D537); entity("Zgr", 0x0396); - entity("zhcy", 0x0436); + entity("zgr", 0x03B6); entity("ZHcy", 0x0416); + entity("zhcy", 0x0436); entity("zigrarr", 0x21DD); - entity("zopf", 0x1D56B); entity("Zopf", 0x2124); - entity("zscr", 0x1D4CF); + entity("zopf", 0x1D56B); entity("Zscr", 0x1D4B5); + entity("zscr", 0x1D4CF); entity("zwj", 0x200D); entity("zwnj", 0x200C); diff --git a/src/org/ccil/cowan/tagsoup/Parser.java b/src/org/ccil/cowan/tagsoup/Parser.java index 0997f23..41b5517 100644 --- a/src/org/ccil/cowan/tagsoup/Parser.java +++ b/src/org/ccil/cowan/tagsoup/Parser.java @@ -834,7 +834,7 @@ public class Parser extends DefaultHandler implements ScanHandler, XMLReader, Le String systemid = null; String publicid = null; String[] v = split(s); - if (v.length > 0 && "DOCTYPE".equals(v[0])) { + if (v.length > 0 && "DOCTYPE".equalsIgnoreCase(v[0])) { if (theDoctypeIsPresent) return; // one doctype only! theDoctypeIsPresent = true; if (v.length > 1) { diff --git a/stml/stml.rnc b/stml/stml.rnc new file mode 100644 index 0000000..b767640 --- /dev/null +++ b/stml/stml.rnc @@ -0,0 +1,49 @@ +# This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +# +# TagSoup is licensed under the Apache License, +# Version 2.0. You may obtain a copy of this license at +# http://www.apache.org/licenses/LICENSE-2.0 . You may also have +# additional legal rights not granted by this license. +# +# TagSoup is distributed in the hope that it will be useful, but +# unless required by applicable law or agreed to in writing, TagSoup +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +# OF ANY KIND, either express or implied; not even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# State Table Markup Language +default namespace = "http://www.ccil.org/~cowan/XML/tagsoup/stml" +start = statetable + +## Root element +statetable = element statetable { + attribute version {"1.0"}, + attribute id {xsd:ID}?, + symbol*, + action+, + state+ + } + +## A symbol specifies a non-character input to the state machine +symbol = element symbol { + attribute id {xsd:ID} + } + +## An action is the name for what the state machine does +action = element action { + attribute id {xsd:ID} + } + +## A state specifies an internal state of the machine +state = element state { + attribute id {xsd:ID}, + tr* + } + +## A tr specifies a state transition +tr = element tr { + (attribute symbol {xsd:IDREF} | + attribute char {xsd:string {length = "1"}}), + attribute action {xsd:IDREF}, + attribute newstate {xsd:IDREF} + } diff --git a/stml/stml.xslt b/stml/stml.xslt new file mode 100644 index 0000000..4cc6c9d --- /dev/null +++ b/stml/stml.xslt @@ -0,0 +1,150 @@ +<!-- +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +--> + +<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:stml="http://www.ccil.org/~cowan/XML/tagsoup/stml" + version="1.0"> + + <xsl:output method="text"/> + + <xsl:strip-space elements="*"/> + + <!-- The main template. Generates declarations for states and + actions, then the statetable itself, and then a comment (used for + manual checking) listing all the actions compactly. --> + <xsl:template match="stml:statetable"> + <xsl:apply-templates select="stml:state"> + <xsl:sort select="@id"/> + </xsl:apply-templates> + + <xsl:apply-templates select="stml:action"> + <xsl:sort select="@id"/> + </xsl:apply-templates> + + <xsl:text>	private static int[] statetable = {
</xsl:text> + <xsl:apply-templates select="stml:state/stml:tr"> + <xsl:sort select="../@id"/> + <xsl:sort select="@symbol"/> + <xsl:sort select="@char"/> + </xsl:apply-templates> + <xsl:text>
	};
</xsl:text> + + <xsl:text>	private static final String[] debug_actionnames = { ""</xsl:text> + <xsl:apply-templates select="stml:action" mode="debug"> + <xsl:sort select="@id"/> + </xsl:apply-templates> + <xsl:text>};
</xsl:text> + + <xsl:text>	private static final String[] debug_statenames = { ""</xsl:text> + <xsl:apply-templates select="stml:state" mode="debug"> + <xsl:sort select="@id"/> + </xsl:apply-templates> + <xsl:text>};
</xsl:text> + + <xsl:text>
</xsl:text> + </xsl:template> + + <!-- Generate a single state declaration. --> + <xsl:template match="stml:state"> + <xsl:text>	private static final int </xsl:text> + <xsl:value-of select="@id"/> + <xsl:text> = </xsl:text> + <xsl:value-of select="position()"/> + <xsl:text>;
</xsl:text> + </xsl:template> + + <!-- Generate a single action declaration. --> + <xsl:template match="stml:action"> + <xsl:text>	private static final int </xsl:text> + <xsl:value-of select="@id"/> + <xsl:text> = </xsl:text> + <xsl:value-of select="position()"/> + <xsl:text>;
</xsl:text> + </xsl:template> + + <!-- Generate a single row of the statetable. --> + <xsl:template match="stml:tr"> + <xsl:choose> + <xsl:when test="@symbol = 'EOF'"> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" select=""-1""/> + </xsl:call-template> + </xsl:when> + <xsl:when test="@symbol = 'LF'"> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" select=""'\n'""/> + </xsl:call-template> + </xsl:when> + <xsl:when test="@symbol = 'default'"> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" select=""0""/> + </xsl:call-template> + </xsl:when> + <xsl:when test="@char = "'""> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" select=""'\''""/> + </xsl:call-template> + </xsl:when> + <xsl:when test="@symbol = 'S'"> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" select=""' '""/> + </xsl:call-template> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" select=""'\n'""/> + </xsl:call-template> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" select=""'\t'""/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="dump-tr"> + <xsl:with-param name="char" + select="concat("'", @char, "'")"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- This is a subroutine used to do the actual printing. --> + <xsl:template name="dump-tr"> + <xsl:param name="char"/> + <xsl:text>		</xsl:text> + <xsl:value-of select="../@id"/> + <xsl:text>, </xsl:text> + <xsl:value-of select="$char"/> + <xsl:text>, </xsl:text> + <xsl:value-of select="@action"/> + <xsl:text>, </xsl:text> + <xsl:value-of select="@newstate"/> + <xsl:text>,
</xsl:text> + </xsl:template> + + <!-- Generate a single action name in the "Actions:" comment. + The mode is used to keep XSLT from confusing this with the + regular actions template that does the action declarations. --> + <xsl:template match="stml:action" mode="debug"> + <xsl:text>, "</xsl:text> + <xsl:value-of select="@id"/> + <xsl:text>"</xsl:text> + </xsl:template> + + <!-- Generate a single stat debug name. --> + <xsl:template match="stml:state" mode="debug"> + <xsl:text>, "</xsl:text> + <xsl:value-of select="@id"/> + <xsl:text>"</xsl:text> + </xsl:template> + +</xsl:transform> diff --git a/templates/org/ccil/cowan/tagsoup/HTMLModels.java b/templates/org/ccil/cowan/tagsoup/HTMLModels.java new file mode 100644 index 0000000..e982bcf --- /dev/null +++ b/templates/org/ccil/cowan/tagsoup/HTMLModels.java @@ -0,0 +1,31 @@ +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// +// +// Defines models for HTMLSchema + +/** +This interface contains generated constants representing HTML content +models. Logically, it is part of HTMLSchema, but it is more +convenient to generate the constants into a separate interface. +*/ + +package org.ccil.cowan.tagsoup; +public interface HTMLModels { + + // Start of model definitions + @@MODEL_DEFINITIONS@@ + + // End of model definitions + + } diff --git a/templates/org/ccil/cowan/tagsoup/HTMLScanner.java b/templates/org/ccil/cowan/tagsoup/HTMLScanner.java new file mode 100644 index 0000000..23cb332 --- /dev/null +++ b/templates/org/ccil/cowan/tagsoup/HTMLScanner.java @@ -0,0 +1,486 @@ +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// +// +package org.ccil.cowan.tagsoup; +import java.io.*; +import org.xml.sax.SAXException; +import org.xml.sax.Locator; + +/** +This class implements a table-driven scanner for HTML, allowing for lots of +defects. It implements the Scanner interface, which accepts a Reader +object to fetch characters from and a ScanHandler object to report lexical +events to. +*/ + +public class HTMLScanner implements Scanner, Locator { + + // Start of state table + @@STATE_TABLE@@ + // End of state table + + private String thePublicid; // Locator state + private String theSystemid; + private int theLastLine; + private int theLastColumn; + private int theCurrentLine; + private int theCurrentColumn; + + int theState; // Current state + int theNextState; // Next state + char[] theOutputBuffer = new char[200]; // Output buffer + int theSize; // Current buffer size + int[] theWinMap = { // Windows chars map + 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0x017D, 0xFFFD, + 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0x017E, 0x0178}; + + /** + * Index into the state table for [state][input character - 2]. + * The state table consists of 4-entry runs on the form + * { current state, input character, action, next state }. + * We precompute the index into the state table for all possible + * { current state, input character } and store the result in + * the statetableIndex array. Since only some input characters + * are present in the state table, we only do the computation for + * characters 0 to the highest character value in the state table. + * An input character of -2 is used to cover all other characters + * as -2 is guaranteed not to match any input character entry + * in the state table. + * + * <p>When doing lookups, the input character should first be tested + * to be in the range [-1 (inclusive), statetableIndexMaxChar (exclusive)]. + * if it isn't use -2 as the input character. + * + * <p>Finally, add 2 to the input character to cover for the fact that + * Java doesn't support negative array indexes. Then look up + * the value in the statetableIndex. If the value is -1, then + * no action or next state was found for the { state, input } that + * you had. If it isn't -1, then action = statetable[value + 2] and + * next state = statetable[value + 3]. That is, the value points + * to the start of the answer 4-tuple in the statetable. + */ + static short[][] statetableIndex; + /** + * The highest character value seen in the statetable. + * See the doc comment for statetableIndex to see how this + * is used. + */ + static int statetableIndexMaxChar; + static { + int maxState = -1; + int maxChar = -1; + for (int i = 0; i < statetable.length; i += 4) { + if (statetable[i] > maxState) { + maxState = statetable[i]; + } + if (statetable[i + 1] > maxChar) { + maxChar = statetable[i + 1]; + } + } + statetableIndexMaxChar = maxChar + 1; + + statetableIndex = new short[maxState + 1][maxChar + 3]; + for (int theState = 0; theState <= maxState; ++theState) { + for (int ch = -2; ch <= maxChar; ++ch) { + int hit = -1; + int action = 0; + for (int i = 0; i < statetable.length; i += 4) { + if (theState != statetable[i]) { + if (action != 0) break; + continue; + } + if (statetable[i+1] == 0) { + hit = i; + action = statetable[i+2]; + } + else if (statetable[i+1] == ch) { + hit = i; + action = statetable[i+2]; + break; + } + } + statetableIndex[theState][ch + 2] = (short) hit; + } + } + } + + // Compensate for bug in PushbackReader that allows + // pushing back EOF. + private void unread(PushbackReader r, int c) throws IOException { + if (c != -1) r.unread(c); + } + + // Locator implementation + + public int getLineNumber() { + return theLastLine; + } + public int getColumnNumber() { + return theLastColumn; + } + public String getPublicId() { + return thePublicid; + } + public String getSystemId() { + return theSystemid; + } + + + // Scanner implementation + + /** + Reset document locator, supplying systemid and publicid. + @param systemid System id + @param publicid Public id + */ + + public void resetDocumentLocator(String publicid, String systemid) { + thePublicid = publicid; + theSystemid = systemid; + theLastLine = theLastColumn = theCurrentLine = theCurrentColumn = 0; + } + + /** + Scan HTML source, reporting lexical events. + @param r0 Reader that provides characters + @param h ScanHandler that accepts lexical events. + */ + + public void scan(Reader r0, ScanHandler h) throws IOException, SAXException { + theState = S_PCDATA; + PushbackReader r; + if (r0 instanceof BufferedReader) { + r = new PushbackReader(r0, 5); + } + else { + r = new PushbackReader(new BufferedReader(r0), 5); + } + + int firstChar = r.read(); // Remove any leading BOM + if (firstChar != '\uFEFF') unread(r, firstChar); + + while (theState != S_DONE) { + int ch = r.read(); + + // Process control characters + if (ch >= 0x80 && ch <= 0x9F) ch = theWinMap[ch-0x80]; + + if (ch == '\r') { + ch = r.read(); // expect LF next + if (ch != '\n') { + unread(r, ch); // nope + ch = '\n'; + } + } + + if (ch == '\n') { + theCurrentLine++; + theCurrentColumn = 0; + } + else { + theCurrentColumn++; + } + + if (!(ch >= 0x20 || ch == '\n' || ch == '\t' || ch == -1)) continue; + + // Search state table + int adjCh = (ch >= -1 && ch < statetableIndexMaxChar) ? ch : -2; + int statetableRow = statetableIndex[theState][adjCh + 2]; + int action = 0; + if (statetableRow != -1) { + action = statetable[statetableRow + 2]; + theNextState = statetable[statetableRow + 3]; + } + +// System.err.println("In " + debug_statenames[theState] + " got " + nicechar(ch) + " doing " + debug_actionnames[action] + " then " + debug_statenames[theNextState]); + switch (action) { + case 0: + throw new Error( + "HTMLScanner can't cope with " + Integer.toString(ch) + " in state " + + Integer.toString(theState)); + case A_ADUP: + h.adup(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_ADUP_SAVE: + h.adup(theOutputBuffer, 0, theSize); + theSize = 0; + save(ch, h); + break; + case A_ADUP_STAGC: + h.adup(theOutputBuffer, 0, theSize); + theSize = 0; + h.stagc(theOutputBuffer, 0, theSize); + break; + case A_ANAME: + h.aname(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_ANAME_ADUP: + h.aname(theOutputBuffer, 0, theSize); + theSize = 0; + h.adup(theOutputBuffer, 0, theSize); + break; + case A_ANAME_ADUP_STAGC: + h.aname(theOutputBuffer, 0, theSize); + theSize = 0; + h.adup(theOutputBuffer, 0, theSize); + h.stagc(theOutputBuffer, 0, theSize); + break; + case A_AVAL: + h.aval(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_AVAL_STAGC: + h.aval(theOutputBuffer, 0, theSize); + theSize = 0; + h.stagc(theOutputBuffer, 0, theSize); + break; + case A_CDATA: + mark(); + // suppress the final "]]" in the buffer + if (theSize > 1) theSize -= 2; + h.pcdata(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_ENTITY_START: + h.pcdata(theOutputBuffer, 0, theSize); + theSize = 0; + save(ch, h); + break; + case A_ENTITY: + mark(); + char ch1 = (char)ch; +// System.out.println("Got " + ch1 + " in state " + ((theState == S_ENT) ? "S_ENT" : ((theState == S_NCR) ? "S_NCR" : "UNK"))); + if (theState == S_ENT && ch1 == '#') { + theNextState = S_NCR; + save(ch, h); + break; + } + else if (theState == S_NCR && (ch1 == 'x' || ch1 == 'X')) { + theNextState = S_XNCR; + save(ch, h); + break; + } + else if (theState == S_ENT && Character.isLetterOrDigit(ch1)) { + save(ch, h); + break; + } + else if (theState == S_NCR && Character.isDigit(ch1)) { + save(ch, h); + break; + } + else if (theState == S_XNCR && (Character.isDigit(ch1) || "abcdefABCDEF".indexOf(ch1) != -1)) { + save(ch, h); + break; + } + + // The whole entity reference has been collected +// System.err.println("%%" + new String(theOutputBuffer, 0, theSize)); + h.entity(theOutputBuffer, 1, theSize - 1); + int ent = h.getEntity(); +// System.err.println("%% value = " + ent); + if (ent != 0) { + theSize = 0; + if (ent >= 0x80 && ent <= 0x9F) { + ent = theWinMap[ent-0x80]; + } + if (ent < 0x20) { + // Control becomes space + ent = 0x20; + } + else if (ent >= 0xD800 && ent <= 0xDFFF) { + // Surrogates get dropped + ent = 0; + } + else if (ent <= 0xFFFF) { + // BMP character + save(ent, h); + } + else { + // Astral converted to two surrogates + ent -= 0x10000; + save((ent>>10) + 0xD800, h); + save((ent&0x3FF) + 0xDC00, h); + } + if (ch != ';') { + unread(r, ch); + theCurrentColumn--; + } + } + else { + unread(r, ch); + theCurrentColumn--; + } + theNextState = S_PCDATA; + break; + case A_ETAG: + h.etag(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_DECL: + h.decl(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_GI: + h.gi(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_GI_STAGC: + h.gi(theOutputBuffer, 0, theSize); + theSize = 0; + h.stagc(theOutputBuffer, 0, theSize); + break; + case A_LT: + mark(); + save('<', h); + save(ch, h); + break; + case A_LT_PCDATA: + mark(); + save('<', h); + h.pcdata(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_PCDATA: + mark(); + h.pcdata(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_CMNT: + mark(); + h.cmnt(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_MINUS3: + save('-', h); + save(' ', h); + break; + case A_MINUS2: + save('-', h); + save(' ', h); + // fall through into A_MINUS + case A_MINUS: + save('-', h); + save(ch, h); + break; + case A_PI: + mark(); + h.pi(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_PITARGET: + h.pitarget(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_PITARGET_PI: + h.pitarget(theOutputBuffer, 0, theSize); + theSize = 0; + h.pi(theOutputBuffer, 0, theSize); + break; + case A_SAVE: + save(ch, h); + break; + case A_SKIP: + break; + case A_SP: + save(' ', h); + break; + case A_STAGC: + h.stagc(theOutputBuffer, 0, theSize); + theSize = 0; + break; + case A_EMPTYTAG: + mark(); +// System.err.println("%%% Empty tag seen"); + if (theSize > 0) h.gi(theOutputBuffer, 0, theSize); + theSize = 0; + h.stage(theOutputBuffer, 0, theSize); + break; + case A_UNGET: + unread(r, ch); + theCurrentColumn--; + break; + case A_UNSAVE_PCDATA: + if (theSize > 0) theSize--; + h.pcdata(theOutputBuffer, 0, theSize); + theSize = 0; + break; + default: + throw new Error("Can't process state " + action); + } + theState = theNextState; + } + h.eof(theOutputBuffer, 0, 0); + } + + /** + * Mark the current scan position as a "point of interest" - start of a tag, + * cdata, processing instruction etc. + */ + + private void mark() { + theLastColumn = theCurrentColumn; + theLastLine = theCurrentLine; + } + + /** + A callback for the ScanHandler that allows it to force + the lexer state to CDATA content (no markup is recognized except + the end of element. + */ + + public void startCDATA() { theNextState = S_CDATA; } + + private void save(int ch, ScanHandler h) throws IOException, SAXException { + if (theSize >= theOutputBuffer.length - 20) { + if (theState == S_PCDATA || theState == S_CDATA) { + // Return a buffer-sized chunk of PCDATA + h.pcdata(theOutputBuffer, 0, theSize); + theSize = 0; + } + else { + // Grow the buffer size + char[] newOutputBuffer = new char[theOutputBuffer.length * 2]; + System.arraycopy(theOutputBuffer, 0, newOutputBuffer, 0, theSize+1); + theOutputBuffer = newOutputBuffer; + } + } + theOutputBuffer[theSize++] = (char)ch; + } + + /** + Test procedure. Reads HTML from the standard input and writes + PYX to the standard output. + */ + + public static void main(String[] argv) throws IOException, SAXException { + Scanner s = new HTMLScanner(); + Reader r = new InputStreamReader(System.in, "UTF-8"); + Writer w = new OutputStreamWriter(System.out, "UTF-8"); + PYXWriter pw = new PYXWriter(w); + s.scan(r, pw); + w.close(); + } + + + private static String nicechar(int in) { + if (in == '\n') return "\\n"; + if (in < 32) return "0x"+Integer.toHexString(in); + return "'"+((char)in)+"'"; + } + + } diff --git a/templates/org/ccil/cowan/tagsoup/HTMLSchema.java b/templates/org/ccil/cowan/tagsoup/HTMLSchema.java new file mode 100644 index 0000000..8def657 --- /dev/null +++ b/templates/org/ccil/cowan/tagsoup/HTMLSchema.java @@ -0,0 +1,38 @@ +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// +// +/** +This class provides a Schema that has been preinitialized with HTML +elements, attributes, and character entity declarations. All the declarations +normally provided with HTML 4.01 are given, plus some that are IE-specific +and NS4-specific. Attribute declarations of type CDATA with no default +value are not included. +*/ + +package org.ccil.cowan.tagsoup; +public class HTMLSchema extends Schema implements HTMLModels { + + /** + Returns a newly constructed HTMLSchema object independent of + any existing ones. + */ + + public HTMLSchema() { + // Start of Schema calls + @@SCHEMA_CALLS@@ + // End of Schema calls + } + + + } diff --git a/tssl/tssl-models.xslt b/tssl/tssl-models.xslt new file mode 100644 index 0000000..6a983b4 --- /dev/null +++ b/tssl/tssl-models.xslt @@ -0,0 +1,47 @@ +<!-- Generate Java code to be inserted into HTMLModels.java. --> + +<!-- +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +--> + +<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:tssl="http://www.ccil.org/~cowan/XML/tagsoup/tssl" + version="1.0"> + + <xsl:output method="text"/> + + <xsl:strip-space elements="*"/> + + <!-- The main template. We are going to generate Java constant + definitions for the groups in the file. --> + <xsl:template match="tssl:schema"> + <xsl:apply-templates select="tssl:group"> + <xsl:sort select="@id"/> + </xsl:apply-templates> + </xsl:template> + + <!-- Generate a declaration for a single group. --> + <xsl:template match="tssl:group" name="tssl:group"> + <xsl:param name="id" select="@id"/> + <xsl:param name="number" select="position()"/> + <xsl:text>	public static final int </xsl:text> + <xsl:value-of select="$id"/> + <xsl:text> = 1 << </xsl:text> + <xsl:value-of select="$number"/> + <xsl:text>;
</xsl:text> + </xsl:template> + +</xsl:transform> diff --git a/tssl/tssl-validate.xslt b/tssl/tssl-validate.xslt new file mode 100644 index 0000000..81faab5 --- /dev/null +++ b/tssl/tssl-validate.xslt @@ -0,0 +1,40 @@ +<!-- Generate complaints if the schema is invalid in some way. --> + +<!-- +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +--> + +<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:tssl="http://www.ccil.org/~cowan/XML/tagsoup/tssl" + version="1.0"> + + <xsl:output method="text"/> + + <xsl:strip-space elements="*"/> + + <!-- Generates a report if an element does not belong to at least + one of the groups that its parent element contains. --> + <xsl:template match="tssl:element/tssl:element"> + <xsl:if test="not(tssl:memberOfAny) and not(tssl:memberOf/@group = ../tssl:contains/@group)"> + <xsl:value-of select="@name"/> + <xsl:text> is not in the content model of </xsl:text> + <xsl:value-of select="../@name"/> + <xsl:text>
</xsl:text> + </xsl:if> + <xsl:apply-templates/> + </xsl:template> + + + +</xsl:transform> diff --git a/tssl/tssl.rnc b/tssl/tssl.rnc new file mode 100644 index 0000000..4443073 --- /dev/null +++ b/tssl/tssl.rnc @@ -0,0 +1,75 @@ +# This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +# +# TagSoup is licensed under the Apache License, +# Version 2.0. You may obtain a copy of this license at +# http://www.apache.org/licenses/LICENSE-2.0 . You may also have +# additional legal rights not granted by this license. +# +# TagSoup is distributed in the hope that it will be useful, but +# unless required by applicable law or agreed to in writing, TagSoup +# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +# OF ANY KIND, either express or implied; not even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +default namespace = "http://www.ccil.org/~cowan/XML/tagsoup/tssl" + +start = schema + +## A TSSL schema has a namespace, which is applied to the elements by default, +## and a name, which is used solely for documentation. It contains entity +## definitions, a root element, and attributes to be applied to all elements. +schema = element schema { + attribute ns {xsd:anyURI}, + attribute prefix {xsd:NCName}, + attribute name {xsd:NCName}, + attribute version {"1.0"}, + entity*, + group+, + \element, + \attribute* + } + +## An entity has a name and a Unicode codepoint in hex. +entity = element entity { + attribute name {xsd:NCName}, + attribute codepoint {xsd:string} + } + +## A group is a named group of elements. Every element belongs to one +## or more groups and has a content model consisting of one or more groups. +group = element group { + attribute id {xsd:ID} + } + +## An element has a name and a namespace (currently ignored). +## It can have any of several types of content and can be restartable +## or not. The element is also a member of one or more model groups +## (with arbitrary names), and can contain as children zero or more +## model groups. Elements also have attributes and "natural" children. +\element = element element { + attribute ns {xsd:anyURI}?, + attribute name {xsd:NCName}, + attribute type {type}, + attribute closeMode { "unclosable" | "restartable" }?, + attribute text-parent { "true" | "false" }?, + (element memberOf { attribute group {xsd:IDREF}}+ | + element isRoot { empty} | + element memberOfAny { empty }), + element contains { attribute group {xsd:IDREF}}*, + \attribute*, + \element* + } + +## Here are the attribute types: + +type = "element" | "any" | "empty" | "mixed" | "string" | "cdata" + +## An attribute has a name and a namespace (currently not supported). +## It also has an optional type and an optional default value. +\attribute = element attribute { + attribute ns {xsd:anyURI}?, + attribute name {xsd:NCName}, + attribute type {"ID" | "IDREF" | "IDREFS" | "NMTOKEN" | "BOOLEAN"}?, + attribute default {xsd:string}? + } + diff --git a/tssl/tssl.xslt b/tssl/tssl.xslt new file mode 100644 index 0000000..a25be10 --- /dev/null +++ b/tssl/tssl.xslt @@ -0,0 +1,220 @@ +<!-- Generate Java code to be inserted into HTMLSchema.java. --> + +<!-- +// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. +// +// TagSoup is licensed under the Apache License, +// Version 2.0. You may obtain a copy of this license at +// http://www.apache.org/licenses/LICENSE-2.0 . You may also have +// additional legal rights not granted by this license. +// +// TagSoup is distributed in the hope that it will be useful, but +// unless required by applicable law or agreed to in writing, TagSoup +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied; not even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +--> + +<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:tssl="http://www.ccil.org/~cowan/XML/tagsoup/tssl" + version="1.0"> + + <xsl:output method="text"/> + + <xsl:strip-space elements="*"/> + + <!-- The main template. This generates calls on the Schema routines + setURI(), setPrefix(), elementType(), parent(), attribute(), + and entity() in that order. Several special cases are + handled by template calls. --> + <xsl:template match="tssl:schema"> + <!-- setURI() --> + <xsl:text>		setURI("</xsl:text> + <xsl:value-of select="@ns"/> + <xsl:text>");
</xsl:text> + <!-- setPrefix() --> + <xsl:text>		setPrefix("</xsl:text> + <xsl:value-of select="@prefix"/> + <xsl:text>");
</xsl:text> + <!-- elementType() special cases --> + <xsl:text>		elementType("<pcdata>", M_EMPTY, M_PCDATA, 0);
</xsl:text> + <xsl:text>		elementType("<root>", </xsl:text> + <xsl:apply-templates select="tssl:element/tssl:isRoot"/> + <xsl:text>, M_EMPTY, 0);
</xsl:text> + <!-- elementType() main loop --> + <xsl:apply-templates select="//tssl:element"> + <xsl:sort select="@name"/> + </xsl:apply-templates> + <!-- parent() special cases --> + <xsl:call-template name="parent"> + <xsl:with-param name="elem" select="'<pcdata>'"/> + <xsl:with-param name="parent" select="//tssl:element[@text-parent='true']/@name"/> + </xsl:call-template> + <xsl:call-template name="parent"> + <xsl:with-param name="elem" select="tssl:element/@name"/> + <xsl:with-param name="parent" select="'<root>'"/> + </xsl:call-template> + <!-- parent() main loop --> + <xsl:apply-templates select="//tssl:element/tssl:element" mode="parent"> + <xsl:sort select="@name"/> + </xsl:apply-templates> + <xsl:apply-templates select="//tssl:element/tssl:attribute"> + <xsl:sort select="../@name"/> + <xsl:sort select="@name"/> + </xsl:apply-templates> + <!-- attribute() main loop --> + <xsl:apply-templates select="tssl:attribute"> + <xsl:sort select="@name"/> + </xsl:apply-templates> + <!-- entity() main loop --> + <xsl:apply-templates select="tssl:entity"> + <xsl:sort select="@name"/> + </xsl:apply-templates> + </xsl:template> + + <!-- Generates a single call to elementType(). --> + <xsl:template match="tssl:element"> + <xsl:text>		elementType("</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>", </xsl:text> + <xsl:choose> + <xsl:when test="@type = 'element'"> + <xsl:apply-templates select="tssl:contains"/> + </xsl:when> + <xsl:when test="@type = 'string'"> + <xsl:text>M_PCDATA</xsl:text> + </xsl:when> + <xsl:when test="@type = 'mixed'"> + <xsl:text>M_PCDATA|</xsl:text> + <xsl:apply-templates select="tssl:contains"/> + </xsl:when> + <xsl:when test="@type = 'empty'"> + <xsl:text>M_EMPTY</xsl:text> + </xsl:when> + <xsl:when test="@type = 'any'"> + <xsl:text>M_ANY</xsl:text> + </xsl:when> + <xsl:when test="@type = 'cdata'"> + <xsl:text>M_PCDATA</xsl:text> + </xsl:when> + </xsl:choose> + <xsl:text>, </xsl:text> + <xsl:apply-templates select="tssl:memberOf"/> + <xsl:apply-templates select="tssl:memberOfAny"/> + <xsl:apply-templates select="tssl:isRoot"/> + <xsl:text>, </xsl:text> + <xsl:choose> + <xsl:when test="@type = 'cdata'"> + <xsl:text>F_CDATA</xsl:text> + </xsl:when> + <xsl:when test="@closeMode = 'restartable'"> + <xsl:text>F_RESTART</xsl:text> + </xsl:when> + <xsl:when test="@closeMode = 'unclosable'"> + <xsl:text>F_NOFORCE</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text>0</xsl:text> + </xsl:otherwise> + </xsl:choose> + <xsl:text>);
</xsl:text> + </xsl:template> + + <!-- Applied from tssl:element to generate the contains argument. --> + <xsl:template match="tssl:contains"> + <xsl:value-of select="@group"/> + <xsl:if test="position() != last()"> + <xsl:text>|</xsl:text> + </xsl:if> + </xsl:template> + + <!-- Applied from tssl:element to generate the memberOf argument. --> + <xsl:template match="tssl:memberOf"> + <xsl:value-of select="@group"/> + <xsl:if test="position() != last()"> + <xsl:text>|</xsl:text> + </xsl:if> + </xsl:template> + + <!-- Applied from tssl:element to handle memberOfAny. --> + <xsl:template match="tssl:memberOfAny"> + <xsl:text>M_ANY & ~M_ROOT</xsl:text> + </xsl:template> + + <!-- Applied from tssl:element to handle isRoot. --> + <xsl:template match="tssl:isRoot"> + <xsl:text>M_ROOT</xsl:text> + </xsl:template> + + <!-- Generates a single call to parent(). The mode is used to prevent XSLT + from getting confused and generating elementType calls instead. --> + <xsl:template match="tssl:element/tssl:element" name="parent" mode="parent"> + <xsl:param name="elem" select="@name"/> + <xsl:param name="parent" select="../@name"/> + <xsl:text>		parent("</xsl:text> + <xsl:value-of select="$elem"/> + <xsl:text>", "</xsl:text> + <xsl:value-of select="$parent"/> + <xsl:text>");
</xsl:text> + </xsl:template> + + <!-- Generates a single call to attribute(). --> + <xsl:template match="tssl:element/tssl:attribute" name="tssl:attribute"> + <xsl:param name="elem" select="../@name"/> + <xsl:param name="attr" select="@name"/> + <xsl:param name="type" select="@type"/> + <xsl:param name="default" select="@default"/> + <xsl:text>		attribute("</xsl:text> + <xsl:value-of select="$elem"/> + <xsl:text>", "</xsl:text> + <xsl:value-of select="$attr"/> + <xsl:text>", "</xsl:text> + <xsl:choose> + <xsl:when test="$type"> + <xsl:value-of select="$type"/> + </xsl:when> + <xsl:when test="not($type)"> + <xsl:text>CDATA</xsl:text> + </xsl:when> + </xsl:choose> + <xsl:text>", </xsl:text> + <xsl:choose> + <xsl:when test="$default"> + <xsl:text>"</xsl:text> + <xsl:value-of select="$default"/> + <xsl:text>"</xsl:text> + </xsl:when> + <xsl:when test="not($default)"> + <xsl:text>null</xsl:text> + </xsl:when> + </xsl:choose> + <xsl:text>);
</xsl:text> + </xsl:template> + + <!-- Generates calls to attribute() (using the above template) + based on the global attribute definitions. --> + <xsl:template match="tssl:schema/tssl:attribute"> + <xsl:variable name="attr" select="@name"/> + <xsl:variable name="type" select="@type"/> + <xsl:variable name="default" select="@default"/> + <xsl:for-each select="//tssl:element"> + <xsl:sort select="@name"/> + <xsl:call-template name="tssl:attribute"> + <xsl:with-param name="elem" select="@name"/> + <xsl:with-param name="attr" select="$attr"/> + <xsl:with-param name="type" select="$type"/> + <xsl:with-param name="default" select="$default"/> + </xsl:call-template> + </xsl:for-each> + </xsl:template> + + <!-- Generates a single call to entity(). --> + <xsl:template match="tssl:entity"> + <xsl:text>		entity("</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>", 0x</xsl:text> + <xsl:value-of select="@codepoint"/> + <xsl:text>);
</xsl:text> + </xsl:template> + +</xsl:transform> |