diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /testing/web-platform/tests/tools/html5lib | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'testing/web-platform/tests/tools/html5lib')
191 files changed, 102955 insertions, 0 deletions
diff --git a/testing/web-platform/tests/tools/html5lib/.gitignore b/testing/web-platform/tests/tools/html5lib/.gitignore new file mode 100644 index 000000000..73d97fec0 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/.gitignore @@ -0,0 +1,20 @@ +# Because we never want compiled Python +__pycache__/ +*.pyc + +# Ignore stuff produced by distutils +/build/ +/dist/ +/MANIFEST + +# Generated by parse.py -p +stats.prof + +# From cover (esp. in combination with nose) +.coverage + +# Because tox's data is inherently local +/.tox/ + +# We have no interest in built Sphinx files +/doc/_build diff --git a/testing/web-platform/tests/tools/html5lib/.gitmodules b/testing/web-platform/tests/tools/html5lib/.gitmodules new file mode 100644 index 000000000..dbca47032 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/.gitmodules @@ -0,0 +1,3 @@ +[submodule "testdata"] + path = html5lib/tests/testdata + url = https://github.com/html5lib/html5lib-tests.git diff --git a/testing/web-platform/tests/tools/html5lib/.travis.yml b/testing/web-platform/tests/tools/html5lib/.travis.yml new file mode 100644 index 000000000..dd3130019 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/.travis.yml @@ -0,0 +1,37 @@ +language: python +python: + - "2.6" + - "2.7" + - "3.2" + - "3.3" + - "3.4" + - "pypy" + +env: + - USE_OPTIONAL=true + - USE_OPTIONAL=false + +matrix: + exclude: + - python: "2.7" + env: USE_OPTIONAL=false + - python: "3.4" + env: USE_OPTIONAL=false + include: + - python: "2.7" + env: USE_OPTIONAL=false FLAKE=true + - python: "3.4" + env: USE_OPTIONAL=false FLAKE=true + +before_install: + - git submodule update --init --recursive + +install: + - bash requirements-install.sh + +script: + - nosetests + - bash flake8-run.sh + +after_script: + - python debug-info.py diff --git a/testing/web-platform/tests/tools/html5lib/AUTHORS.rst b/testing/web-platform/tests/tools/html5lib/AUTHORS.rst new file mode 100644 index 000000000..4148a6ed2 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/AUTHORS.rst @@ -0,0 +1,34 @@ +Credits +======= + +``html5lib`` is written and maintained by: + +- James Graham +- Geoffrey Sneddon +- Åukasz Langa + + +Patches and suggestions +----------------------- +(In chronological order, by first commit:) + +- Anne van Kesteren +- Lachlan Hunt +- lantis63 +- Sam Ruby +- Tim Fletcher +- Thomas Broyer +- Mark Pilgrim +- Philip Taylor +- Ryan King +- Edward Z. Yang +- fantasai +- Philip Jägenstedt +- Ms2ger +- Andy Wingo +- Andreas Madsack +- Karim Valiev +- Mohammad Taha Jahangir +- Juan Carlos Garcia Segovia +- Mike West +- Marc DM diff --git a/testing/web-platform/tests/tools/html5lib/CHANGES.rst b/testing/web-platform/tests/tools/html5lib/CHANGES.rst new file mode 100644 index 000000000..1431b3c9b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/CHANGES.rst @@ -0,0 +1,171 @@ +Change Log +---------- + +0.9999 +~~~~~~ + +Released on XXX, 2014 + +* XXX + + +0.999 +~~~~~ + +Released on December 23, 2013 + +* Fix #127: add work-around for CPython issue #20007: .read(0) on + http.client.HTTPResponse drops the rest of the content. + +* Fix #115: lxml treewalker can now deal with fragments containing, at + their root level, text nodes with non-ASCII characters on Python 2. + + +0.99 +~~~~ + +Released on September 10, 2013 + +* No library changes from 1.0b3; released as 0.99 as pip has changed + behaviour from 1.4 to avoid installing pre-release versions per + PEP 440. + + +1.0b3 +~~~~~ + +Released on July 24, 2013 + +* Removed ``RecursiveTreeWalker`` from ``treewalkers._base``. Any + implementation using it should be moved to + ``NonRecursiveTreeWalker``, as everything bundled with html5lib has + for years. + +* Fix #67 so that ``BufferedStream`` to correctly returns a bytes + object, thereby fixing any case where html5lib is passed a + non-seekable RawIOBase-like object. + + +1.0b2 +~~~~~ + +Released on June 27, 2013 + +* Removed reordering of attributes within the serializer. There is now + an ``alphabetical_attributes`` option which preserves the previous + behaviour through a new filter. This allows attribute order to be + preserved through html5lib if the tree builder preserves order. + +* Removed ``dom2sax`` from DOM treebuilders. It has been replaced by + ``treeadapters.sax.to_sax`` which is generic and supports any + treewalker; it also resolves all known bugs with ``dom2sax``. + +* Fix treewalker assertions on hitting bytes strings on + Python 2. Previous to 1.0b1, treewalkers coped with mixed + bytes/unicode data on Python 2; this reintroduces this prior + behaviour on Python 2. Behaviour is unchanged on Python 3. + + +1.0b1 +~~~~~ + +Released on May 17, 2013 + +* Implementation updated to implement the `HTML specification + <http://www.whatwg.org/specs/web-apps/current-work/>`_ as of 5th May + 2013 (`SVN <http://svn.whatwg.org/webapps/>`_ revision r7867). + +* Python 3.2+ supported in a single codebase using the ``six`` library. + +* Removed support for Python 2.5 and older. + +* Removed the deprecated Beautiful Soup 3 treebuilder. + ``beautifulsoup4`` can use ``html5lib`` as a parser instead. Note that + since it doesn't support namespaces, foreign content like SVG and + MathML is parsed incorrectly. + +* Removed ``simpletree`` from the package. The default tree builder is + now ``etree`` (using the ``xml.etree.cElementTree`` implementation if + available, and ``xml.etree.ElementTree`` otherwise). + +* Removed the ``XHTMLSerializer`` as it never actually guaranteed its + output was well-formed XML, and hence provided little of use. + +* Removed default DOM treebuilder, so ``html5lib.treebuilders.dom`` is no + longer supported. ``html5lib.treebuilders.getTreeBuilder("dom")`` will + return the default DOM treebuilder, which uses ``xml.dom.minidom``. + +* Optional heuristic character encoding detection now based on + ``charade`` for Python 2.6 - 3.3 compatibility. + +* Optional ``Genshi`` treewalker support fixed. + +* Many bugfixes, including: + + * #33: null in attribute value breaks XML AttValue; + + * #4: nested, indirect descendant, <button> causes infinite loop; + + * `Google Code 215 + <http://code.google.com/p/html5lib/issues/detail?id=215>`_: Properly + detect seekable streams; + + * `Google Code 206 + <http://code.google.com/p/html5lib/issues/detail?id=206>`_: add + support for <video preload=...>, <audio preload=...>; + + * `Google Code 205 + <http://code.google.com/p/html5lib/issues/detail?id=205>`_: add + support for <video poster=...>; + + * `Google Code 202 + <http://code.google.com/p/html5lib/issues/detail?id=202>`_: Unicode + file breaks InputStream. + +* Source code is now mostly PEP 8 compliant. + +* Test harness has been improved and now depends on ``nose``. + +* Documentation updated and moved to http://html5lib.readthedocs.org/. + + +0.95 +~~~~ + +Released on February 11, 2012 + + +0.90 +~~~~ + +Released on January 17, 2010 + + +0.11.1 +~~~~~~ + +Released on June 12, 2008 + + +0.11 +~~~~ + +Released on June 10, 2008 + + +0.10 +~~~~ + +Released on October 7, 2007 + + +0.9 +~~~ + +Released on March 11, 2007 + + +0.2 +~~~ + +Released on January 8, 2007 diff --git a/testing/web-platform/tests/tools/html5lib/CONTRIBUTING.rst b/testing/web-platform/tests/tools/html5lib/CONTRIBUTING.rst new file mode 100644 index 000000000..8c5e19853 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/CONTRIBUTING.rst @@ -0,0 +1,60 @@ +Contributing +============ + +Pull requests are more than welcome — both to the library and to the +documentation. Some useful information: + +- We aim to follow PEP 8 in the library, but ignoring the + 79-character-per-line limit, instead following a soft limit of 99, + but allowing lines over this where it is the readable thing to do. + +- We aim to follow PEP 257 for all docstrings, and make them properly + parseable by Sphinx while generating API documentation. + +- We keep ``pyflakes`` reporting no errors or warnings at all times. + +- We keep the master branch passing all tests at all times on all + supported versions. + +`Travis CI <https://travis-ci.org/html5lib/html5lib-python/>`_ is run +against all pull requests and should enforce all of the above. + +We use `Opera Critic <https://critic.hoppipolla.co.uk/>`_ as an external +code-review tool, which uses your GitHub login to authenticate. You'll +get email notifications for issues raised in the review. + + +Patch submission guidelines +--------------------------- + +- **Create a new Git branch specific to your change.** Do not put + multiple fixes/features in the same pull request. If you find an + unrelated bug, create a distinct branch and submit a separate pull + request for the bugfix. This makes life much easier for maintainers + and will speed up merging your patches. + +- **Write a test** whenever possible. Following existing tests is often + easiest, and a good way to tell whether the feature you're modifying + is easily testable. + +- **Make sure documentation is updated.** Keep docstrings current, and + if necessary, update the Sphinx documentation in ``doc/``. + +- **Add a changelog entry** at the top of ``CHANGES.rst`` following + existing entries' styles. + +- **Run tests with tox** if possible, to make sure your changes are + compatible with all supported Python versions. + +- **Squash commits** before submitting the pull request so that a single + commit contains the entire change, and only that change (see the first + bullet). + +- **Don't rebase after creating the pull request.** Merge with upstream, + if necessary, and use ``git commit --fixup`` for fixing issues raised + in a Critic review or by a failing Travis build. The reviewer will + squash and rebase your pull request while accepting it. Even though + GitHub won't recognize the pull request as accepted, the squashed + commits will properly specify you as the author. + +- **Attribute yourself** in ``AUTHORS.rst``. diff --git a/testing/web-platform/tests/tools/html5lib/LICENSE b/testing/web-platform/tests/tools/html5lib/LICENSE new file mode 100644 index 000000000..c87fa7a00 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2006-2013 James Graham and other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/testing/web-platform/tests/tools/html5lib/MANIFEST.in b/testing/web-platform/tests/tools/html5lib/MANIFEST.in new file mode 100644 index 000000000..1edd0b7de --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/MANIFEST.in @@ -0,0 +1,6 @@ +include LICENSE +include CHANGES.rst +include README.rst +include requirements*.txt +graft html5lib/tests/testdata +recursive-include html5lib/tests *.py diff --git a/testing/web-platform/tests/tools/html5lib/README.rst b/testing/web-platform/tests/tools/html5lib/README.rst new file mode 100644 index 000000000..9e0a0f740 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/README.rst @@ -0,0 +1,157 @@ +html5lib +======== + +.. image:: https://travis-ci.org/html5lib/html5lib-python.png?branch=master + :target: https://travis-ci.org/html5lib/html5lib-python + +html5lib is a pure-python library for parsing HTML. It is designed to +conform to the WHATWG HTML specification, as is implemented by all major +web browsers. + + +Usage +----- + +Simple usage follows this pattern: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + document = html5lib.parse(f) + +or: + +.. code-block:: python + + import html5lib + document = html5lib.parse("<p>Hello World!") + +By default, the ``document`` will be an ``xml.etree`` element instance. +Whenever possible, html5lib chooses the accelerated ``ElementTree`` +implementation (i.e. ``xml.etree.cElementTree`` on Python 2.x). + +Two other tree types are supported: ``xml.dom.minidom`` and +``lxml.etree``. To use an alternative format, specify the name of +a treebuilder: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + lxml_etree_document = html5lib.parse(f, treebuilder="lxml") + +When using with ``urllib2`` (Python 2), the charset from HTTP should be +pass into html5lib as follows: + +.. code-block:: python + + from contextlib import closing + from urllib2 import urlopen + import html5lib + + with closing(urlopen("http://example.com/")) as f: + document = html5lib.parse(f, encoding=f.info().getparam("charset")) + +When using with ``urllib.request`` (Python 3), the charset from HTTP +should be pass into html5lib as follows: + +.. code-block:: python + + from urllib.request import urlopen + import html5lib + + with urlopen("http://example.com/") as f: + document = html5lib.parse(f, encoding=f.info().get_content_charset()) + +To have more control over the parser, create a parser object explicitly. +For instance, to make the parser raise exceptions on parse errors, use: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + parser = html5lib.HTMLParser(strict=True) + document = parser.parse(f) + +When you're instantiating parser objects explicitly, pass a treebuilder +class as the ``tree`` keyword argument to use an alternative document +format: + +.. code-block:: python + + import html5lib + parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder("dom")) + minidom_document = parser.parse("<p>Hello World!") + +More documentation is available at http://html5lib.readthedocs.org/. + + +Installation +------------ + +html5lib works on CPython 2.6+, CPython 3.2+ and PyPy. To install it, +use: + +.. code-block:: bash + + $ pip install html5lib + + +Optional Dependencies +--------------------- + +The following third-party libraries may be used for additional +functionality: + +- ``datrie`` can be used to improve parsing performance (though in + almost all cases the improvement is marginal); + +- ``lxml`` is supported as a tree format (for both building and + walking) under CPython (but *not* PyPy where it is known to cause + segfaults); + +- ``genshi`` has a treewalker (but not builder); and + +- ``charade`` can be used as a fallback when character encoding cannot + be determined; ``chardet``, from which it was forked, can also be used + on Python 2. + +- ``ordereddict`` can be used under Python 2.6 + (``collections.OrderedDict`` is used instead on later versions) to + serialize attributes in alphabetical order. + + +Bugs +---- + +Please report any bugs on the `issue tracker +<https://github.com/html5lib/html5lib-python/issues>`_. + + +Tests +----- + +Unit tests require the ``nose`` library and can be run using the +``nosetests`` command in the root directory; ``ordereddict`` is +required under Python 2.6. All should pass. + +Test data are contained in a separate `html5lib-tests +<https://github.com/html5lib/html5lib-tests>`_ repository and included +as a submodule, thus for git checkouts they must be initialized:: + + $ git submodule init + $ git submodule update + +If you have all compatible Python implementations available on your +system, you can run tests on all of them using the ``tox`` utility, +which can be found on PyPI. + + +Questions? +---------- + +There's a mailing list available for support on Google Groups, +`html5lib-discuss <http://groups.google.com/group/html5lib-discuss>`_, +though you may get a quicker response asking on IRC in `#whatwg on +irc.freenode.net <http://wiki.whatwg.org/wiki/IRC>`_. diff --git a/testing/web-platform/tests/tools/html5lib/debug-info.py b/testing/web-platform/tests/tools/html5lib/debug-info.py new file mode 100644 index 000000000..b5d2bb6a3 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/debug-info.py @@ -0,0 +1,37 @@ +from __future__ import print_function, unicode_literals + +import platform +import sys + + +info = { + "impl": platform.python_implementation(), + "version": platform.python_version(), + "revision": platform.python_revision(), + "maxunicode": sys.maxunicode, + "maxsize": sys.maxsize +} + +search_modules = ["charade", "chardet", "datrie", "genshi", "html5lib", "lxml", "six"] +found_modules = [] + +for m in search_modules: + try: + __import__(m) + except ImportError: + pass + else: + found_modules.append(m) + +info["modules"] = ", ".join(found_modules) + + +print("""html5lib debug info: + +Python %(version)s (revision: %(revision)s) +Implementation: %(impl)s + +sys.maxunicode: %(maxunicode)X +sys.maxsize: %(maxsize)X + +Installed modules: %(modules)s""" % info) diff --git a/testing/web-platform/tests/tools/html5lib/doc/Makefile b/testing/web-platform/tests/tools/html5lib/doc/Makefile new file mode 100644 index 000000000..e0e58667e --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make <target>' where <target> is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/html5lib.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/html5lib.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/html5lib" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/html5lib" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/testing/web-platform/tests/tools/html5lib/doc/changes.rst b/testing/web-platform/tests/tools/html5lib/doc/changes.rst new file mode 100644 index 000000000..ded3b705d --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/changes.rst @@ -0,0 +1,3 @@ +.. :changelog: + +.. include:: ../CHANGES.rst diff --git a/testing/web-platform/tests/tools/html5lib/doc/conf.py b/testing/web-platform/tests/tools/html5lib/doc/conf.py new file mode 100644 index 000000000..434f21c42 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/conf.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# html5lib documentation build configuration file, created by +# sphinx-quickstart on Wed May 8 00:04:49 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'html5lib' +copyright = '2006 - 2013, James Graham, Geoffrey Sneddon, and contributors' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.0' +# The full version, including alpha/beta/rc tags. +sys.path.append(os.path.abspath('..')) +from html5lib import __version__ +release = __version__ + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = 'en' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build', 'theme'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# "<project> v<release> documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a <link> tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'html5libdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'html5lib.tex', 'html5lib Documentation', + 'James Graham, Geoffrey Sneddon, and contributors', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'html5lib', 'html5lib Documentation', + ['James Graham, Geoffrey Sneddon, and contributors'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'html5lib', 'html5lib Documentation', + 'James Graham, Geoffrey Sneddon, and contributors', 'html5lib', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + +class CExtMock(object): + """Required for autodoc on readthedocs.org where you cannot build C extensions.""" + def __init__(self, *args, **kwargs): + pass + + def __call__(self, *args, **kwargs): + return CExtMock() + + @classmethod + def __getattr__(cls, name): + if name in ('__file__', '__path__'): + return '/dev/null' + else: + return CExtMock() + +try: + import lxml # flake8: noqa +except ImportError: + sys.modules['lxml'] = CExtMock() + sys.modules['lxml.etree'] = CExtMock() + print("warning: lxml modules mocked.") + +try: + import genshi # flake8: noqa +except ImportError: + sys.modules['genshi'] = CExtMock() + sys.modules['genshi.core'] = CExtMock() + print("warning: genshi modules mocked.") diff --git a/testing/web-platform/tests/tools/html5lib/doc/html5lib.filters.rst b/testing/web-platform/tests/tools/html5lib/doc/html5lib.filters.rst new file mode 100644 index 000000000..1fda38a73 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/html5lib.filters.rst @@ -0,0 +1,59 @@ +filters Package +=============== + +:mod:`_base` Module +------------------- + +.. automodule:: html5lib.filters._base + :members: + :undoc-members: + :show-inheritance: + +:mod:`alphabeticalattributes` Module +------------------------------------ + +.. automodule:: html5lib.filters.alphabeticalattributes + :members: + :undoc-members: + :show-inheritance: + +:mod:`inject_meta_charset` Module +--------------------------------- + +.. automodule:: html5lib.filters.inject_meta_charset + :members: + :undoc-members: + :show-inheritance: + +:mod:`lint` Module +------------------ + +.. automodule:: html5lib.filters.lint + :members: + :undoc-members: + :show-inheritance: + +:mod:`optionaltags` Module +-------------------------- + +.. automodule:: html5lib.filters.optionaltags + :members: + :undoc-members: + :show-inheritance: + +:mod:`sanitizer` Module +----------------------- + +.. automodule:: html5lib.filters.sanitizer + :members: + :undoc-members: + :show-inheritance: + +:mod:`whitespace` Module +------------------------ + +.. automodule:: html5lib.filters.whitespace + :members: + :undoc-members: + :show-inheritance: + diff --git a/testing/web-platform/tests/tools/html5lib/doc/html5lib.rst b/testing/web-platform/tests/tools/html5lib/doc/html5lib.rst new file mode 100644 index 000000000..d4ed12b46 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/html5lib.rst @@ -0,0 +1,77 @@ +html5lib Package +================ + +:mod:`html5lib` Package +----------------------- + +.. automodule:: html5lib.__init__ + :members: + :undoc-members: + :show-inheritance: + +:mod:`constants` Module +----------------------- + +.. automodule:: html5lib.constants + :members: + :undoc-members: + :show-inheritance: + +:mod:`html5parser` Module +------------------------- + +.. automodule:: html5lib.html5parser + :members: + :undoc-members: + :show-inheritance: + +:mod:`ihatexml` Module +---------------------- + +.. automodule:: html5lib.ihatexml + :members: + :undoc-members: + :show-inheritance: + +:mod:`inputstream` Module +------------------------- + +.. automodule:: html5lib.inputstream + :members: + :undoc-members: + :show-inheritance: + +:mod:`sanitizer` Module +----------------------- + +.. automodule:: html5lib.sanitizer + :members: + :undoc-members: + :show-inheritance: + +:mod:`tokenizer` Module +----------------------- + +.. automodule:: html5lib.tokenizer + :members: + :undoc-members: + :show-inheritance: + +:mod:`utils` Module +------------------- + +.. automodule:: html5lib.utils + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + + html5lib.filters + html5lib.serializer + html5lib.treebuilders + html5lib.treewalkers + diff --git a/testing/web-platform/tests/tools/html5lib/doc/html5lib.serializer.rst b/testing/web-platform/tests/tools/html5lib/doc/html5lib.serializer.rst new file mode 100644 index 000000000..fa9547421 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/html5lib.serializer.rst @@ -0,0 +1,19 @@ +serializer Package +================== + +:mod:`serializer` Package +------------------------- + +.. automodule:: html5lib.serializer + :members: + :undoc-members: + :show-inheritance: + +:mod:`htmlserializer` Module +---------------------------- + +.. automodule:: html5lib.serializer.htmlserializer + :members: + :undoc-members: + :show-inheritance: + diff --git a/testing/web-platform/tests/tools/html5lib/doc/html5lib.treebuilders.rst b/testing/web-platform/tests/tools/html5lib/doc/html5lib.treebuilders.rst new file mode 100644 index 000000000..991198394 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/html5lib.treebuilders.rst @@ -0,0 +1,43 @@ +treebuilders Package +==================== + +:mod:`treebuilders` Package +--------------------------- + +.. automodule:: html5lib.treebuilders + :members: + :undoc-members: + :show-inheritance: + +:mod:`_base` Module +------------------- + +.. automodule:: html5lib.treebuilders._base + :members: + :undoc-members: + :show-inheritance: + +:mod:`dom` Module +----------------- + +.. automodule:: html5lib.treebuilders.dom + :members: + :undoc-members: + :show-inheritance: + +:mod:`etree` Module +------------------- + +.. automodule:: html5lib.treebuilders.etree + :members: + :undoc-members: + :show-inheritance: + +:mod:`etree_lxml` Module +------------------------ + +.. automodule:: html5lib.treebuilders.etree_lxml + :members: + :undoc-members: + :show-inheritance: + diff --git a/testing/web-platform/tests/tools/html5lib/doc/html5lib.treewalkers.rst b/testing/web-platform/tests/tools/html5lib/doc/html5lib.treewalkers.rst new file mode 100644 index 000000000..80595e2d7 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/html5lib.treewalkers.rst @@ -0,0 +1,59 @@ +treewalkers Package +=================== + +:mod:`treewalkers` Package +-------------------------- + +.. automodule:: html5lib.treewalkers + :members: + :undoc-members: + :show-inheritance: + +:mod:`_base` Module +------------------- + +.. automodule:: html5lib.treewalkers._base + :members: + :undoc-members: + :show-inheritance: + +:mod:`dom` Module +----------------- + +.. automodule:: html5lib.treewalkers.dom + :members: + :undoc-members: + :show-inheritance: + +:mod:`etree` Module +------------------- + +.. automodule:: html5lib.treewalkers.etree + :members: + :undoc-members: + :show-inheritance: + +:mod:`genshistream` Module +-------------------------- + +.. automodule:: html5lib.treewalkers.genshistream + :members: + :undoc-members: + :show-inheritance: + +:mod:`lxmletree` Module +----------------------- + +.. automodule:: html5lib.treewalkers.lxmletree + :members: + :undoc-members: + :show-inheritance: + +:mod:`pulldom` Module +--------------------- + +.. automodule:: html5lib.treewalkers.pulldom + :members: + :undoc-members: + :show-inheritance: + diff --git a/testing/web-platform/tests/tools/html5lib/doc/index.rst b/testing/web-platform/tests/tools/html5lib/doc/index.rst new file mode 100644 index 000000000..ca2e1b969 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/index.rst @@ -0,0 +1,21 @@ +Overview +======== + +.. include:: ../README.rst + :start-line: 6 + +.. toctree:: + :maxdepth: 2 + + movingparts + changes + License <license> + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/testing/web-platform/tests/tools/html5lib/doc/license.rst b/testing/web-platform/tests/tools/html5lib/doc/license.rst new file mode 100644 index 000000000..7e6291f3b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/license.rst @@ -0,0 +1,4 @@ +License +======= + +.. include:: ../LICENSE diff --git a/testing/web-platform/tests/tools/html5lib/doc/make.bat b/testing/web-platform/tests/tools/html5lib/doc/make.bat new file mode 100644 index 000000000..e88c769ce --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/make.bat @@ -0,0 +1,242 @@ +@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+ set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+ :help
+ echo.Please use `make ^<target^>` where ^<target^> is one of
+ echo. html to make standalone HTML files
+ echo. dirhtml to make HTML files named index.html in directories
+ echo. singlehtml to make a single large HTML file
+ echo. pickle to make pickle files
+ echo. json to make JSON files
+ echo. htmlhelp to make HTML files and a HTML help project
+ echo. qthelp to make HTML files and a qthelp project
+ echo. devhelp to make HTML files and a Devhelp project
+ echo. epub to make an epub
+ echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+ echo. text to make text files
+ echo. man to make manual pages
+ echo. texinfo to make Texinfo files
+ echo. gettext to make PO message catalogs
+ echo. changes to make an overview over all changed/added/deprecated items
+ echo. xml to make Docutils-native XML files
+ echo. pseudoxml to make pseudoxml-XML files for display purposes
+ echo. linkcheck to check all external links for integrity
+ echo. doctest to run all doctests embedded in the documentation if enabled
+ goto end
+)
+
+if "%1" == "clean" (
+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+ del /q /s %BUILDDIR%\*
+ goto end
+)
+
+
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+if "%1" == "html" (
+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+ goto end
+)
+
+if "%1" == "dirhtml" (
+ %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+ goto end
+)
+
+if "%1" == "singlehtml" (
+ %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+ goto end
+)
+
+if "%1" == "pickle" (
+ %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the pickle files.
+ goto end
+)
+
+if "%1" == "json" (
+ %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the JSON files.
+ goto end
+)
+
+if "%1" == "htmlhelp" (
+ %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+ goto end
+)
+
+if "%1" == "qthelp" (
+ %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+ echo.^> qcollectiongenerator %BUILDDIR%\qthelp\html5lib.qhcp
+ echo.To view the help file:
+ echo.^> assistant -collectionFile %BUILDDIR%\qthelp\html5lib.ghc
+ goto end
+)
+
+if "%1" == "devhelp" (
+ %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished.
+ goto end
+)
+
+if "%1" == "epub" (
+ %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The epub file is in %BUILDDIR%/epub.
+ goto end
+)
+
+if "%1" == "latex" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "latexpdf" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf
+ cd %BUILDDIR%/..
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "latexpdfja" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf-ja
+ cd %BUILDDIR%/..
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "text" (
+ %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The text files are in %BUILDDIR%/text.
+ goto end
+)
+
+if "%1" == "man" (
+ %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The manual pages are in %BUILDDIR%/man.
+ goto end
+)
+
+if "%1" == "texinfo" (
+ %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+ goto end
+)
+
+if "%1" == "gettext" (
+ %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+ goto end
+)
+
+if "%1" == "changes" (
+ %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.The overview file is in %BUILDDIR%/changes.
+ goto end
+)
+
+if "%1" == "linkcheck" (
+ %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+ goto end
+)
+
+if "%1" == "doctest" (
+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+ goto end
+)
+
+if "%1" == "xml" (
+ %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The XML files are in %BUILDDIR%/xml.
+ goto end
+)
+
+if "%1" == "pseudoxml" (
+ %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
+ goto end
+)
+
+:end
diff --git a/testing/web-platform/tests/tools/html5lib/doc/modules.rst b/testing/web-platform/tests/tools/html5lib/doc/modules.rst new file mode 100644 index 000000000..59fbcc86b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/modules.rst @@ -0,0 +1,7 @@ +html5lib +======== + +.. toctree:: + :maxdepth: 4 + + html5lib diff --git a/testing/web-platform/tests/tools/html5lib/doc/movingparts.rst b/testing/web-platform/tests/tools/html5lib/doc/movingparts.rst new file mode 100644 index 000000000..36539785a --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/doc/movingparts.rst @@ -0,0 +1,209 @@ +The moving parts +================ + +html5lib consists of a number of components, which are responsible for +handling its features. + + +Tree builders +------------- + +The parser reads HTML by tokenizing the content and building a tree that +the user can later access. There are three main types of trees that +html5lib can build: + +* ``etree`` - this is the default; builds a tree based on ``xml.etree``, + which can be found in the standard library. Whenever possible, the + accelerated ``ElementTree`` implementation (i.e. + ``xml.etree.cElementTree`` on Python 2.x) is used. + +* ``dom`` - builds a tree based on ``xml.dom.minidom``. + +* ``lxml.etree`` - uses lxml's implementation of the ``ElementTree`` + API. The performance gains are relatively small compared to using the + accelerated ``ElementTree`` module. + +You can specify the builder by name when using the shorthand API: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + lxml_etree_document = html5lib.parse(f, treebuilder="lxml") + +When instantiating a parser object, you have to pass a tree builder +class in the ``tree`` keyword attribute: + +.. code-block:: python + + import html5lib + parser = html5lib.HTMLParser(tree=SomeTreeBuilder) + document = parser.parse("<p>Hello World!") + +To get a builder class by name, use the ``getTreeBuilder`` function: + +.. code-block:: python + + import html5lib + parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder("dom")) + minidom_document = parser.parse("<p>Hello World!") + +The implementation of builders can be found in `html5lib/treebuilders/ +<https://github.com/html5lib/html5lib-python/tree/master/html5lib/treebuilders>`_. + + +Tree walkers +------------ + +Once a tree is ready, you can work on it either manually, or using +a tree walker, which provides a streaming view of the tree. html5lib +provides walkers for all three supported types of trees (``etree``, +``dom`` and ``lxml``). + +The implementation of walkers can be found in `html5lib/treewalkers/ +<https://github.com/html5lib/html5lib-python/tree/master/html5lib/treewalkers>`_. + +Walkers make consuming HTML easier. html5lib uses them to provide you +with has a couple of handy tools. + + +HTMLSerializer +~~~~~~~~~~~~~~ + +The serializer lets you write HTML back as a stream of bytes. + +.. code-block:: pycon + + >>> import html5lib + >>> element = html5lib.parse('<p xml:lang="pl">Witam wszystkich') + >>> walker = html5lib.getTreeWalker("etree") + >>> stream = walker(element) + >>> s = html5lib.serializer.HTMLSerializer() + >>> output = s.serialize(stream) + >>> for item in output: + ... print("%r" % item) + '<p' + ' ' + 'xml:lang' + '=' + 'pl' + '>' + 'Witam wszystkich' + +You can customize the serializer behaviour in a variety of ways, consult +the :class:`~html5lib.serializer.htmlserializer.HTMLSerializer` +documentation. + + +Filters +~~~~~~~ + +You can alter the stream content with filters provided by html5lib: + +* :class:`alphabeticalattributes.Filter + <html5lib.filters.alphabeticalattributes.Filter>` sorts attributes on + tags to be in alphabetical order + +* :class:`inject_meta_charset.Filter + <html5lib.filters.inject_meta_charset.Filter>` sets a user-specified + encoding in the correct ``<meta>`` tag in the ``<head>`` section of + the document + +* :class:`lint.Filter <html5lib.filters.lint.Filter>` raises + ``LintError`` exceptions on invalid tag and attribute names, invalid + PCDATA, etc. + +* :class:`optionaltags.Filter <html5lib.filters.optionaltags.Filter>` + removes tags from the stream which are not necessary to produce valid + HTML + +* :class:`sanitizer.Filter <html5lib.filters.sanitizer.Filter>` removes + unsafe markup and CSS. Elements that are known to be safe are passed + through and the rest is converted to visible text. The default + configuration of the sanitizer follows the `WHATWG Sanitization Rules + <http://wiki.whatwg.org/wiki/Sanitization_rules>`_. + +* :class:`whitespace.Filter <html5lib.filters.whitespace.Filter>` + collapses all whitespace characters to single spaces unless they're in + ``<pre/>`` or ``textarea`` tags. + +To use a filter, simply wrap it around a stream: + +.. code-block:: python + + >>> import html5lib + >>> from html5lib.filters import sanitizer + >>> dom = html5lib.parse("<p><script>alert('Boo!')", treebuilder="dom") + >>> walker = html5lib.getTreeWalker("dom") + >>> stream = walker(dom) + >>> sane_stream = sanitizer.Filter(stream) clean_stream = sanitizer.Filter(stream) + + +Tree adapters +------------- + +Used to translate one type of tree to another. More documentation +pending, sorry. + + +Encoding discovery +------------------ + +Parsed trees are always Unicode. However a large variety of input +encodings are supported. The encoding of the document is determined in +the following way: + +* The encoding may be explicitly specified by passing the name of the + encoding as the encoding parameter to the + :meth:`~html5lib.html5parser.HTMLParser.parse` method on + ``HTMLParser`` objects. + +* If no encoding is specified, the parser will attempt to detect the + encoding from a ``<meta>`` element in the first 512 bytes of the + document (this is only a partial implementation of the current HTML + 5 specification). + +* If no encoding can be found and the chardet library is available, an + attempt will be made to sniff the encoding from the byte pattern. + +* If all else fails, the default encoding will be used. This is usually + `Windows-1252 <http://en.wikipedia.org/wiki/Windows-1252>`_, which is + a common fallback used by Web browsers. + + +Tokenizers +---------- + +The part of the parser responsible for translating a raw input stream +into meaningful tokens is the tokenizer. Currently html5lib provides +two. + +To set up a tokenizer, simply pass it when instantiating +a :class:`~html5lib.html5parser.HTMLParser`: + +.. code-block:: python + + import html5lib + from html5lib import sanitizer + + p = html5lib.HTMLParser(tokenizer=sanitizer.HTMLSanitizer) + p.parse("<p>Surprise!<script>alert('Boo!');</script>") + +HTMLTokenizer +~~~~~~~~~~~~~ + +This is the default tokenizer, the heart of html5lib. The implementation +can be found in `html5lib/tokenizer.py +<https://github.com/html5lib/html5lib-python/blob/master/html5lib/tokenizer.py>`_. + +HTMLSanitizer +~~~~~~~~~~~~~ + +This is a tokenizer that removes unsafe markup and CSS styles from the +input. Elements that are known to be safe are passed through and the +rest is converted to visible text. The default configuration of the +sanitizer follows the `WHATWG Sanitization Rules +<http://wiki.whatwg.org/wiki/Sanitization_rules>`_. + +The implementation can be found in `html5lib/sanitizer.py +<https://github.com/html5lib/html5lib-python/blob/master/html5lib/sanitizer.py>`_. diff --git a/testing/web-platform/tests/tools/html5lib/flake8-run.sh b/testing/web-platform/tests/tools/html5lib/flake8-run.sh new file mode 100755 index 000000000..d1a587d35 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/flake8-run.sh @@ -0,0 +1,14 @@ +#!/bin/bash -e + +if [[ ! -x $(which flake8) ]]; then + echo "fatal: flake8 not found on $PATH. Exiting." + exit 1 +fi + +if [[ $TRAVIS != "true" || $FLAKE == "true" ]]; then + find html5lib/ -name '*.py' -and -not -name 'constants.py' -print0 | xargs -0 flake8 --ignore=E501 + flake1=$? + flake8 --max-line-length=99 --ignore=E126 html5lib/constants.py + flake2=$? + exit $[$flake1 || $flake2] +fi diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/__init__.py new file mode 100644 index 000000000..a67a652b9 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/__init__.py @@ -0,0 +1,23 @@ +""" +HTML parsing library based on the WHATWG "HTML5" +specification. The parser is designed to be compatible with existing +HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage: + +import html5lib +f = open("my_document.html") +tree = html5lib.parse(f) +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] +__version__ = "0.9999-dev" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/constants.py b/testing/web-platform/tests/tools/html5lib/html5lib/constants.py new file mode 100644 index 000000000..e7089846d --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/constants.py @@ -0,0 +1,3104 @@ +from __future__ import absolute_import, division, unicode_literals + +import string +import gettext +_ = gettext.gettext + +EOF = None + +E = { + "null-character": + _("Null character in input stream, replaced with U+FFFD."), + "invalid-codepoint": + _("Invalid codepoint in stream."), + "incorrectly-placed-solidus": + _("Solidus (/) incorrectly placed in tag."), + "incorrect-cr-newline-entity": + _("Incorrect CR newline entity, replaced with LF."), + "illegal-windows-1252-entity": + _("Entity used with illegal number (windows-1252 reference)."), + "cant-convert-numeric-entity": + _("Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x)."), + "illegal-codepoint-for-numeric-entity": + _("Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x."), + "numeric-entity-without-semicolon": + _("Numeric entity didn't end with ';'."), + "expected-numeric-entity-but-got-eof": + _("Numeric entity expected. Got end of file instead."), + "expected-numeric-entity": + _("Numeric entity expected but none found."), + "named-entity-without-semicolon": + _("Named entity didn't end with ';'."), + "expected-named-entity": + _("Named entity expected. Got none."), + "attributes-in-end-tag": + _("End tag contains unexpected attributes."), + 'self-closing-flag-on-end-tag': + _("End tag contains unexpected self-closing flag."), + "expected-tag-name-but-got-right-bracket": + _("Expected tag name. Got '>' instead."), + "expected-tag-name-but-got-question-mark": + _("Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)"), + "expected-tag-name": + _("Expected tag name. Got something else instead"), + "expected-closing-tag-but-got-right-bracket": + _("Expected closing tag. Got '>' instead. Ignoring '</>'."), + "expected-closing-tag-but-got-eof": + _("Expected closing tag. Unexpected end of file."), + "expected-closing-tag-but-got-char": + _("Expected closing tag. Unexpected character '%(data)s' found."), + "eof-in-tag-name": + _("Unexpected end of file in the tag name."), + "expected-attribute-name-but-got-eof": + _("Unexpected end of file. Expected attribute name instead."), + "eof-in-attribute-name": + _("Unexpected end of file in attribute name."), + "invalid-character-in-attribute-name": + _("Invalid character in attribute name"), + "duplicate-attribute": + _("Dropped duplicate attribute on tag."), + "expected-end-of-tag-name-but-got-eof": + _("Unexpected end of file. Expected = or end of tag."), + "expected-attribute-value-but-got-eof": + _("Unexpected end of file. Expected attribute value."), + "expected-attribute-value-but-got-right-bracket": + _("Expected attribute value. Got '>' instead."), + 'equals-in-unquoted-attribute-value': + _("Unexpected = in unquoted attribute"), + 'unexpected-character-in-unquoted-attribute-value': + _("Unexpected character in unquoted attribute"), + "invalid-character-after-attribute-name": + _("Unexpected character after attribute name."), + "unexpected-character-after-attribute-value": + _("Unexpected character after attribute value."), + "eof-in-attribute-value-double-quote": + _("Unexpected end of file in attribute value (\")."), + "eof-in-attribute-value-single-quote": + _("Unexpected end of file in attribute value (')."), + "eof-in-attribute-value-no-quotes": + _("Unexpected end of file in attribute value."), + "unexpected-EOF-after-solidus-in-tag": + _("Unexpected end of file in tag. Expected >"), + "unexpected-character-after-solidus-in-tag": + _("Unexpected character after / in tag. Expected >"), + "expected-dashes-or-doctype": + _("Expected '--' or 'DOCTYPE'. Not found."), + "unexpected-bang-after-double-dash-in-comment": + _("Unexpected ! after -- in comment"), + "unexpected-space-after-double-dash-in-comment": + _("Unexpected space after -- in comment"), + "incorrect-comment": + _("Incorrect comment."), + "eof-in-comment": + _("Unexpected end of file in comment."), + "eof-in-comment-end-dash": + _("Unexpected end of file in comment (-)"), + "unexpected-dash-after-double-dash-in-comment": + _("Unexpected '-' after '--' found in comment."), + "eof-in-comment-double-dash": + _("Unexpected end of file in comment (--)."), + "eof-in-comment-end-space-state": + _("Unexpected end of file in comment."), + "eof-in-comment-end-bang-state": + _("Unexpected end of file in comment."), + "unexpected-char-in-comment": + _("Unexpected character in comment found."), + "need-space-after-doctype": + _("No space after literal string 'DOCTYPE'."), + "expected-doctype-name-but-got-right-bracket": + _("Unexpected > character. Expected DOCTYPE name."), + "expected-doctype-name-but-got-eof": + _("Unexpected end of file. Expected DOCTYPE name."), + "eof-in-doctype-name": + _("Unexpected end of file in DOCTYPE name."), + "eof-in-doctype": + _("Unexpected end of file in DOCTYPE."), + "expected-space-or-right-bracket-in-doctype": + _("Expected space or '>'. Got '%(data)s'"), + "unexpected-end-of-doctype": + _("Unexpected end of DOCTYPE."), + "unexpected-char-in-doctype": + _("Unexpected character in DOCTYPE."), + "eof-in-innerhtml": + _("XXX innerHTML EOF"), + "unexpected-doctype": + _("Unexpected DOCTYPE. Ignored."), + "non-html-root": + _("html needs to be the first start tag."), + "expected-doctype-but-got-eof": + _("Unexpected End of file. Expected DOCTYPE."), + "unknown-doctype": + _("Erroneous DOCTYPE."), + "expected-doctype-but-got-chars": + _("Unexpected non-space characters. Expected DOCTYPE."), + "expected-doctype-but-got-start-tag": + _("Unexpected start tag (%(name)s). Expected DOCTYPE."), + "expected-doctype-but-got-end-tag": + _("Unexpected end tag (%(name)s). Expected DOCTYPE."), + "end-tag-after-implied-root": + _("Unexpected end tag (%(name)s) after the (implied) root element."), + "expected-named-closing-tag-but-got-eof": + _("Unexpected end of file. Expected end tag (%(name)s)."), + "two-heads-are-not-better-than-one": + _("Unexpected start tag head in existing head. Ignored."), + "unexpected-end-tag": + _("Unexpected end tag (%(name)s). Ignored."), + "unexpected-start-tag-out-of-my-head": + _("Unexpected start tag (%(name)s) that can be in head. Moved."), + "unexpected-start-tag": + _("Unexpected start tag (%(name)s)."), + "missing-end-tag": + _("Missing end tag (%(name)s)."), + "missing-end-tags": + _("Missing end tags (%(name)s)."), + "unexpected-start-tag-implies-end-tag": + _("Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s)."), + "unexpected-start-tag-treated-as": + _("Unexpected start tag (%(originalName)s). Treated as %(newName)s."), + "deprecated-tag": + _("Unexpected start tag %(name)s. Don't use it!"), + "unexpected-start-tag-ignored": + _("Unexpected start tag %(name)s. Ignored."), + "expected-one-end-tag-but-got-another": + _("Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s)."), + "end-tag-too-early": + _("End tag (%(name)s) seen too early. Expected other end tag."), + "end-tag-too-early-named": + _("Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s)."), + "end-tag-too-early-ignored": + _("End tag (%(name)s) seen too early. Ignored."), + "adoption-agency-1.1": + _("End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm."), + "adoption-agency-1.2": + _("End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm."), + "adoption-agency-1.3": + _("End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm."), + "adoption-agency-4.4": + _("End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm."), + "unexpected-end-tag-treated-as": + _("Unexpected end tag (%(originalName)s). Treated as %(newName)s."), + "no-end-tag": + _("This element (%(name)s) has no end tag."), + "unexpected-implied-end-tag-in-table": + _("Unexpected implied end tag (%(name)s) in the table phase."), + "unexpected-implied-end-tag-in-table-body": + _("Unexpected implied end tag (%(name)s) in the table body phase."), + "unexpected-char-implies-table-voodoo": + _("Unexpected non-space characters in " + "table context caused voodoo mode."), + "unexpected-hidden-input-in-table": + _("Unexpected input with type hidden in table context."), + "unexpected-form-in-table": + _("Unexpected form in table context."), + "unexpected-start-tag-implies-table-voodoo": + _("Unexpected start tag (%(name)s) in " + "table context caused voodoo mode."), + "unexpected-end-tag-implies-table-voodoo": + _("Unexpected end tag (%(name)s) in " + "table context caused voodoo mode."), + "unexpected-cell-in-table-body": + _("Unexpected table cell start tag (%(name)s) " + "in the table body phase."), + "unexpected-cell-end-tag": + _("Got table cell end tag (%(name)s) " + "while required end tags are missing."), + "unexpected-end-tag-in-table-body": + _("Unexpected end tag (%(name)s) in the table body phase. Ignored."), + "unexpected-implied-end-tag-in-table-row": + _("Unexpected implied end tag (%(name)s) in the table row phase."), + "unexpected-end-tag-in-table-row": + _("Unexpected end tag (%(name)s) in the table row phase. Ignored."), + "unexpected-select-in-select": + _("Unexpected select start tag in the select phase " + "treated as select end tag."), + "unexpected-input-in-select": + _("Unexpected input start tag in the select phase."), + "unexpected-start-tag-in-select": + _("Unexpected start tag token (%(name)s in the select phase. " + "Ignored."), + "unexpected-end-tag-in-select": + _("Unexpected end tag (%(name)s) in the select phase. Ignored."), + "unexpected-table-element-start-tag-in-select-in-table": + _("Unexpected table element start tag (%(name)s) in the select in table phase."), + "unexpected-table-element-end-tag-in-select-in-table": + _("Unexpected table element end tag (%(name)s) in the select in table phase."), + "unexpected-char-after-body": + _("Unexpected non-space characters in the after body phase."), + "unexpected-start-tag-after-body": + _("Unexpected start tag token (%(name)s)" + " in the after body phase."), + "unexpected-end-tag-after-body": + _("Unexpected end tag token (%(name)s)" + " in the after body phase."), + "unexpected-char-in-frameset": + _("Unexpected characters in the frameset phase. Characters ignored."), + "unexpected-start-tag-in-frameset": + _("Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored."), + "unexpected-frameset-in-frameset-innerhtml": + _("Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML)."), + "unexpected-end-tag-in-frameset": + _("Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored."), + "unexpected-char-after-frameset": + _("Unexpected non-space characters in the " + "after frameset phase. Ignored."), + "unexpected-start-tag-after-frameset": + _("Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored."), + "unexpected-end-tag-after-frameset": + _("Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored."), + "unexpected-end-tag-after-body-innerhtml": + _("Unexpected end tag after body(innerHtml)"), + "expected-eof-but-got-char": + _("Unexpected non-space characters. Expected end of file."), + "expected-eof-but-got-start-tag": + _("Unexpected start tag (%(name)s)" + ". Expected end of file."), + "expected-eof-but-got-end-tag": + _("Unexpected end tag (%(name)s)" + ". Expected end of file."), + "eof-in-table": + _("Unexpected end of file. Expected table content."), + "eof-in-select": + _("Unexpected end of file. Expected select content."), + "eof-in-frameset": + _("Unexpected end of file. Expected frameset content."), + "eof-in-script-in-script": + _("Unexpected end of file. Expected script content."), + "eof-in-foreign-lands": + _("Unexpected end of file. Expected foreign content"), + "non-void-element-with-trailing-solidus": + _("Trailing solidus not allowed on element %(name)s"), + "unexpected-html-element-in-foreign-content": + _("Element %(name)s not allowed in a non-html context"), + "unexpected-end-tag-before-html": + _("Unexpected end tag (%(name)s) before html."), + "XXX-undefined-error": + _("Undefined error (this sucks and should be fixed)"), +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset(( + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +)) + +formattingElements = frozenset(( + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +)) + +specialElements = frozenset(( + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +)) + +htmlIntegrationPointElements = frozenset(( + (namespaces["mathml"], "annotaion-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +)) + +mathmlTextIntegrationPointElements = frozenset(( + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +)) + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset(( + "\t", + "\n", + "\u000C", + " ", + "\r" +)) + +tableInsertModeElements = frozenset(( + "table", + "tbody", + "tfoot", + "thead", + "tr" +)) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset(( + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +)) + +cdataElements = frozenset(('title', 'textarea')) + +rcdataElements = frozenset(( + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +)) + +booleanAttributes = { + "": frozenset(("irrelevant",)), + "style": frozenset(("scoped",)), + "img": frozenset(("ismap",)), + "audio": frozenset(("autoplay", "controls")), + "video": frozenset(("autoplay", "controls")), + "script": frozenset(("defer", "async")), + "details": frozenset(("open",)), + "datagrid": frozenset(("multiple", "disabled")), + "command": frozenset(("hidden", "disabled", "checked", "default")), + "hr": frozenset(("noshade")), + "menu": frozenset(("autosubmit",)), + "fieldset": frozenset(("disabled", "readonly")), + "option": frozenset(("disabled", "readonly", "selected")), + "optgroup": frozenset(("disabled", "readonly")), + "button": frozenset(("disabled", "autofocus")), + "input": frozenset(("disabled", "readonly", "required", "autofocus", "checked", "ismap")), + "select": frozenset(("disabled", "readonly", "autofocus", "multiple")), + "output": frozenset(("disabled", "readonly")), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(('lt;', 'gt;', 'amp;', 'apos;', 'quot;')) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +encodings = { + '437': 'cp437', + '850': 'cp850', + '852': 'cp852', + '855': 'cp855', + '857': 'cp857', + '860': 'cp860', + '861': 'cp861', + '862': 'cp862', + '863': 'cp863', + '865': 'cp865', + '866': 'cp866', + '869': 'cp869', + 'ansix341968': 'ascii', + 'ansix341986': 'ascii', + 'arabic': 'iso8859-6', + 'ascii': 'ascii', + 'asmo708': 'iso8859-6', + 'big5': 'big5', + 'big5hkscs': 'big5hkscs', + 'chinese': 'gbk', + 'cp037': 'cp037', + 'cp1026': 'cp1026', + 'cp154': 'ptcp154', + 'cp367': 'ascii', + 'cp424': 'cp424', + 'cp437': 'cp437', + 'cp500': 'cp500', + 'cp775': 'cp775', + 'cp819': 'windows-1252', + 'cp850': 'cp850', + 'cp852': 'cp852', + 'cp855': 'cp855', + 'cp857': 'cp857', + 'cp860': 'cp860', + 'cp861': 'cp861', + 'cp862': 'cp862', + 'cp863': 'cp863', + 'cp864': 'cp864', + 'cp865': 'cp865', + 'cp866': 'cp866', + 'cp869': 'cp869', + 'cp936': 'gbk', + 'cpgr': 'cp869', + 'cpis': 'cp861', + 'csascii': 'ascii', + 'csbig5': 'big5', + 'cseuckr': 'cp949', + 'cseucpkdfmtjapanese': 'euc_jp', + 'csgb2312': 'gbk', + 'cshproman8': 'hp-roman8', + 'csibm037': 'cp037', + 'csibm1026': 'cp1026', + 'csibm424': 'cp424', + 'csibm500': 'cp500', + 'csibm855': 'cp855', + 'csibm857': 'cp857', + 'csibm860': 'cp860', + 'csibm861': 'cp861', + 'csibm863': 'cp863', + 'csibm864': 'cp864', + 'csibm865': 'cp865', + 'csibm866': 'cp866', + 'csibm869': 'cp869', + 'csiso2022jp': 'iso2022_jp', + 'csiso2022jp2': 'iso2022_jp_2', + 'csiso2022kr': 'iso2022_kr', + 'csiso58gb231280': 'gbk', + 'csisolatin1': 'windows-1252', + 'csisolatin2': 'iso8859-2', + 'csisolatin3': 'iso8859-3', + 'csisolatin4': 'iso8859-4', + 'csisolatin5': 'windows-1254', + 'csisolatin6': 'iso8859-10', + 'csisolatinarabic': 'iso8859-6', + 'csisolatincyrillic': 'iso8859-5', + 'csisolatingreek': 'iso8859-7', + 'csisolatinhebrew': 'iso8859-8', + 'cskoi8r': 'koi8-r', + 'csksc56011987': 'cp949', + 'cspc775baltic': 'cp775', + 'cspc850multilingual': 'cp850', + 'cspc862latinhebrew': 'cp862', + 'cspc8codepage437': 'cp437', + 'cspcp852': 'cp852', + 'csptcp154': 'ptcp154', + 'csshiftjis': 'shift_jis', + 'csunicode11utf7': 'utf-7', + 'cyrillic': 'iso8859-5', + 'cyrillicasian': 'ptcp154', + 'ebcdiccpbe': 'cp500', + 'ebcdiccpca': 'cp037', + 'ebcdiccpch': 'cp500', + 'ebcdiccphe': 'cp424', + 'ebcdiccpnl': 'cp037', + 'ebcdiccpus': 'cp037', + 'ebcdiccpwt': 'cp037', + 'ecma114': 'iso8859-6', + 'ecma118': 'iso8859-7', + 'elot928': 'iso8859-7', + 'eucjp': 'euc_jp', + 'euckr': 'cp949', + 'extendedunixcodepackedformatforjapanese': 'euc_jp', + 'gb18030': 'gb18030', + 'gb2312': 'gbk', + 'gb231280': 'gbk', + 'gbk': 'gbk', + 'greek': 'iso8859-7', + 'greek8': 'iso8859-7', + 'hebrew': 'iso8859-8', + 'hproman8': 'hp-roman8', + 'hzgb2312': 'hz', + 'ibm037': 'cp037', + 'ibm1026': 'cp1026', + 'ibm367': 'ascii', + 'ibm424': 'cp424', + 'ibm437': 'cp437', + 'ibm500': 'cp500', + 'ibm775': 'cp775', + 'ibm819': 'windows-1252', + 'ibm850': 'cp850', + 'ibm852': 'cp852', + 'ibm855': 'cp855', + 'ibm857': 'cp857', + 'ibm860': 'cp860', + 'ibm861': 'cp861', + 'ibm862': 'cp862', + 'ibm863': 'cp863', + 'ibm864': 'cp864', + 'ibm865': 'cp865', + 'ibm866': 'cp866', + 'ibm869': 'cp869', + 'iso2022jp': 'iso2022_jp', + 'iso2022jp2': 'iso2022_jp_2', + 'iso2022kr': 'iso2022_kr', + 'iso646irv1991': 'ascii', + 'iso646us': 'ascii', + 'iso88591': 'windows-1252', + 'iso885910': 'iso8859-10', + 'iso8859101992': 'iso8859-10', + 'iso885911987': 'windows-1252', + 'iso885913': 'iso8859-13', + 'iso885914': 'iso8859-14', + 'iso8859141998': 'iso8859-14', + 'iso885915': 'iso8859-15', + 'iso885916': 'iso8859-16', + 'iso8859162001': 'iso8859-16', + 'iso88592': 'iso8859-2', + 'iso885921987': 'iso8859-2', + 'iso88593': 'iso8859-3', + 'iso885931988': 'iso8859-3', + 'iso88594': 'iso8859-4', + 'iso885941988': 'iso8859-4', + 'iso88595': 'iso8859-5', + 'iso885951988': 'iso8859-5', + 'iso88596': 'iso8859-6', + 'iso885961987': 'iso8859-6', + 'iso88597': 'iso8859-7', + 'iso885971987': 'iso8859-7', + 'iso88598': 'iso8859-8', + 'iso885981988': 'iso8859-8', + 'iso88599': 'windows-1254', + 'iso885991989': 'windows-1254', + 'isoceltic': 'iso8859-14', + 'isoir100': 'windows-1252', + 'isoir101': 'iso8859-2', + 'isoir109': 'iso8859-3', + 'isoir110': 'iso8859-4', + 'isoir126': 'iso8859-7', + 'isoir127': 'iso8859-6', + 'isoir138': 'iso8859-8', + 'isoir144': 'iso8859-5', + 'isoir148': 'windows-1254', + 'isoir149': 'cp949', + 'isoir157': 'iso8859-10', + 'isoir199': 'iso8859-14', + 'isoir226': 'iso8859-16', + 'isoir58': 'gbk', + 'isoir6': 'ascii', + 'koi8r': 'koi8-r', + 'koi8u': 'koi8-u', + 'korean': 'cp949', + 'ksc5601': 'cp949', + 'ksc56011987': 'cp949', + 'ksc56011989': 'cp949', + 'l1': 'windows-1252', + 'l10': 'iso8859-16', + 'l2': 'iso8859-2', + 'l3': 'iso8859-3', + 'l4': 'iso8859-4', + 'l5': 'windows-1254', + 'l6': 'iso8859-10', + 'l8': 'iso8859-14', + 'latin1': 'windows-1252', + 'latin10': 'iso8859-16', + 'latin2': 'iso8859-2', + 'latin3': 'iso8859-3', + 'latin4': 'iso8859-4', + 'latin5': 'windows-1254', + 'latin6': 'iso8859-10', + 'latin8': 'iso8859-14', + 'latin9': 'iso8859-15', + 'ms936': 'gbk', + 'mskanji': 'shift_jis', + 'pt154': 'ptcp154', + 'ptcp154': 'ptcp154', + 'r8': 'hp-roman8', + 'roman8': 'hp-roman8', + 'shiftjis': 'shift_jis', + 'tis620': 'cp874', + 'unicode11utf7': 'utf-7', + 'us': 'ascii', + 'usascii': 'ascii', + 'utf16': 'utf-16', + 'utf16be': 'utf-16-be', + 'utf16le': 'utf-16-le', + 'utf8': 'utf-8', + 'windows1250': 'cp1250', + 'windows1251': 'cp1251', + 'windows1252': 'cp1252', + 'windows1253': 'cp1253', + 'windows1254': 'cp1254', + 'windows1255': 'cp1255', + 'windows1256': 'cp1256', + 'windows1257': 'cp1257', + 'windows1258': 'cp1258', + 'windows936': 'gbk', + 'x-x-big5': 'big5'} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset((tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"])) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + pass + + +class ReparseException(Exception): + pass diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/__init__.py diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/_base.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/_base.py new file mode 100644 index 000000000..c7dbaed0f --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/_base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/alphabeticalattributes.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 000000000..fed6996c1 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,20 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict + + +class Filter(_base.Filter): + def __iter__(self): + for token in _base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=lambda x: x[0]): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/inject_meta_charset.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/inject_meta_charset.py new file mode 100644 index 000000000..ca33b70b5 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,65 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base + + +class Filter(_base.Filter): + def __init__(self, source, encoding): + _base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in _base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/lint.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/lint.py new file mode 100644 index 000000000..7cc99a4ba --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from gettext import gettext +_ = gettext + +from . import _base +from ..constants import cdataElements, rcdataElements, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class LintError(Exception): + pass + + +class Filter(_base.Filter): + def __iter__(self): + open_elements = [] + contentModelFlag = "PCDATA" + for token in _base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + name = token["name"] + if contentModelFlag != "PCDATA": + raise LintError(_("StartTag not in PCDATA content model flag: %(tag)s") % {"tag": name}) + if not isinstance(name, str): + raise LintError(_("Tag name is not a string: %(tag)r") % {"tag": name}) + if not name: + raise LintError(_("Empty tag name")) + if type == "StartTag" and name in voidElements: + raise LintError(_("Void element reported as StartTag token: %(tag)s") % {"tag": name}) + elif type == "EmptyTag" and name not in voidElements: + raise LintError(_("Non-void element reported as EmptyTag token: %(tag)s") % {"tag": token["name"]}) + if type == "StartTag": + open_elements.append(name) + for name, value in token["data"]: + if not isinstance(name, str): + raise LintError(_("Attribute name is not a string: %(name)r") % {"name": name}) + if not name: + raise LintError(_("Empty attribute name")) + if not isinstance(value, str): + raise LintError(_("Attribute value is not a string: %(value)r") % {"value": value}) + if name in cdataElements: + contentModelFlag = "CDATA" + elif name in rcdataElements: + contentModelFlag = "RCDATA" + elif name == "plaintext": + contentModelFlag = "PLAINTEXT" + + elif type == "EndTag": + name = token["name"] + if not isinstance(name, str): + raise LintError(_("Tag name is not a string: %(tag)r") % {"tag": name}) + if not name: + raise LintError(_("Empty tag name")) + if name in voidElements: + raise LintError(_("Void element reported as EndTag token: %(tag)s") % {"tag": name}) + start_name = open_elements.pop() + if start_name != name: + raise LintError(_("EndTag (%(end)s) does not match StartTag (%(start)s)") % {"end": name, "start": start_name}) + contentModelFlag = "PCDATA" + + elif type == "Comment": + if contentModelFlag != "PCDATA": + raise LintError(_("Comment not in PCDATA content model flag")) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + if not isinstance(data, str): + raise LintError(_("Attribute name is not a string: %(name)r") % {"name": data}) + if not data: + raise LintError(_("%(type)s token with empty data") % {"type": type}) + if type == "SpaceCharacters": + data = data.strip(spaceCharacters) + if data: + raise LintError(_("Non-space character(s) found in SpaceCharacters token: %(token)r") % {"token": data}) + + elif type == "Doctype": + name = token["name"] + if contentModelFlag != "PCDATA": + raise LintError(_("Doctype not in PCDATA content model flag: %(name)s") % {"name": name}) + if not isinstance(name, str): + raise LintError(_("Tag name is not a string: %(tag)r") % {"tag": name}) + # XXX: what to do with token["data"] ? + + elif type in ("ParseError", "SerializeError"): + pass + + else: + raise LintError(_("Unknown token type: %(type)s") % {"type": type}) + + yield token diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/optionaltags.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/optionaltags.py new file mode 100644 index 000000000..fefe0b309 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/optionaltags.py @@ -0,0 +1,205 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base + + +class Filter(_base.Filter): + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceeded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceeded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an <code>optgroup</code> + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/sanitizer.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/sanitizer.py new file mode 100644 index 000000000..b206b54e7 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/sanitizer.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import _base +from ..sanitizer import HTMLSanitizerMixin + + +class Filter(_base.Filter, HTMLSanitizerMixin): + def __iter__(self): + for token in _base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/filters/whitespace.py b/testing/web-platform/tests/tools/html5lib/html5lib/filters/whitespace.py new file mode 100644 index 000000000..dfc60eebd --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import _base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(_base.Filter): + + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in _base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/html5parser.py b/testing/web-platform/tests/tools/html5lib/html5lib/html5parser.py new file mode 100644 index 000000000..5b9ce7d72 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/html5parser.py @@ -0,0 +1,2723 @@ +from __future__ import absolute_import, division, unicode_literals +from six import with_metaclass + +import types + +from . import inputstream +from . import tokenizer + +from . import treebuilders +from .treebuilders._base import Marker + +from . import utils +from . import constants +from .constants import spaceCharacters, asciiUpper2Lower +from .constants import specialElements +from .constants import headingElements +from .constants import cdataElements, rcdataElements +from .constants import tokenTypes, ReparseException, namespaces +from .constants import htmlIntegrationPointElements, mathmlTextIntegrationPointElements +from .constants import adjustForeignAttributes as adjustForeignAttributesMap + + +def parse(doc, treebuilder="etree", encoding=None, + namespaceHTMLElements=True): + """Parse a string or file-like object into a tree""" + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, encoding=encoding) + + +def parseFragment(doc, container="div", treebuilder="etree", encoding=None, + namespaceHTMLElements=True): + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, encoding=encoding) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser. Generates a tree structure from a stream of (possibly + malformed) HTML""" + + def __init__(self, tree=None, tokenizer=tokenizer.HTMLTokenizer, + strict=False, namespaceHTMLElements=True, debug=False): + """ + strict - raise an exception when a parse error is encountered + + tree - a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + tokenizer - a class that provides a stream of tokens to the treebuilder. + This may be replaced for e.g. a sanitizer which converts some tags to + text + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.tokenizer_class = tokenizer + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", + encoding=None, parseMeta=True, useChardet=True, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.tokenizer = self.tokenizer_class(stream, encoding=encoding, + parseMeta=parseMeta, + useChardet=useChardet, + parser=self, **kwargs) + self.reset() + + while True: + try: + self.mainLoop() + break + except ReparseException: + self.reset() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """The name of the character encoding + that was used to decode the input stream, + or :obj:`None` if that is not determined yet. + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0] + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + new_token = token + while new_token is not None: + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and token["selfClosing"] + and not token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, encoding=None, parseMeta=True, useChardet=True): + """Parse a HTML document into a well-formed tree + + stream - a filelike object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + """ + self._parse(stream, innerHTML=False, encoding=encoding, + parseMeta=parseMeta, useChardet=useChardet) + return self.tree.getDocument() + + def parseFragment(self, stream, container="div", encoding=None, + parseMeta=False, useChardet=True): + """Parse a HTML fragment into a well-formed tree fragment + + container - name of the element we're setting the innerHTML property + if set to None, default to 'div' + + stream - a filelike object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + """ + self._parse(stream, True, container=container, encoding=encoding) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars={}): + # XXX The idea is to make errorcode mandatory. + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError + + def normalizeToken(self, token): + """ HTML5 specific normalizations to the token stream """ + + if token["type"] == tokenTypes["StartTag"]: + token["data"] = dict(token["data"][::-1]) + + return token + + def adjustMathMLAttributes(self, token): + replacements = {"definitionurl": "definitionURL"} + for k, v in replacements.items(): + if k in token["data"]: + token["data"][v] = token["data"][k] + del token["data"][k] + + def adjustSVGAttributes(self, token): + replacements = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" + } + for originalName in list(token["data"].keys()): + if originalName in replacements: + svgName = replacements[originalName] + token["data"][svgName] = token["data"][originalName] + del token["data"][originalName] + + def adjustForeignAttributes(self, token): + replacements = adjustForeignAttributesMap + + for originalName in token["data"].keys(): + if originalName in replacements: + foreignName = replacements[originalName] + token["data"][foreignName] = token["data"][originalName] + del token["data"][originalName] + + def reparseTokenNormal(self, token): + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + """Generic RCDATA/RAWTEXT Parsing algorithm + contentType - RCDATA or RAWTEXT + """ + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + constants.tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in constants.tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" + or publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) + or publicId in + ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") + or publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None + or systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) + or publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noscript", "noframes", "style"), self.startTagNoScriptNoFramesStyle), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self. endTagHandler = utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoScriptNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + # XXX If we implement a parser for which scripting is disabled we need to + # implement this phase. + # + # class InHeadNoScriptPhase(Phase): + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Keep a ref to this for special handling of whitespace in <pre> + self.processSpaceCharactersNonPre = self.processSpaceCharacters + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "noframes", "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "details", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + (("noembed", "noframes", "noscript"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + if node1.name != node2.name or node1.namespace != node2.namespace: + return False + elif len(node1.attributes) != len(node2.attributes): + return False + else: + attributes1 = sorted(node1.attributes.items()) + attributes2 = sorted(node2.attributes.items()) + for attr1, attr2 in zip(attributes1, attributes2): + if attr1 != attr2: + return False + return True + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") + and not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharacters(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 + or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing=token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"expectedName": "body", "gotName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + # XXX "inHeadNoscript": InHeadNoScriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/ihatexml.py b/testing/web-platform/tests/tools/html5lib/html5lib/ihatexml.py new file mode 100644 index 000000000..0fc79308e --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/ihatexml.py @@ -0,0 +1,285 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\-\'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, replaceChars=None, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name, namespace=None): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for i in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/inputstream.py b/testing/web-platform/tests/tools/html5lib/html5lib/inputstream.py new file mode 100644 index 000000000..9e03b9313 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/inputstream.py @@ -0,0 +1,886 @@ +from __future__ import absolute_import, division, unicode_literals +from six import text_type +from six.moves import http_client + +import codecs +import re + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import encodings, ReparseException +from . import utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +try: + from io import BufferedIOBase +except ImportError: + class BufferedIOBase(object): + pass + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + +invalid_unicode_re = re.compile("[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uD800-\uDFFF\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]") + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, encoding=None, parseMeta=True, chardet=True): + if isinstance(source, http_client.HTTPResponse): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + if encoding is not None: + raise TypeError("Cannot explicitly set an encoding with a unicode string") + + return HTMLUnicodeInputStream(source) + else: + return HTMLBinaryInputStream(source, encoding, parseMeta, chardet) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + parseMeta - Look for a <meta> element containing encoding information + + """ + + # Craziness + if len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + self.replaceCharactersRegexp = re.compile("[\uD800-\uDFFF]") + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + self.replaceCharactersRegexp = re.compile("([\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF])") + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = ("utf-8", "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + self.reportCharacterErrors(data) + + # Replace invalid characters + # Note U+0000 is dealt with in the tokenizer + data = self.replaceCharactersRegexp.sub("\ufffd", data) + + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for i in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, encoding=None, parseMeta=True, chardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + parseMeta - Look for a <meta> element containing encoding information + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + self.charEncoding = (codecName(encoding), "certain") + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 512 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Encoding to use if no other information can be found + self.defaultEncoding = "windows-1252" + + # Detect encoding iff no explicit "transport level" encoding is supplied + if (self.charEncoding[0] is None): + self.charEncoding = self.detectEncoding(parseMeta, chardet) + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = codecs.getreader(self.charEncoding[0])(self.rawStream, + 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: + stream = BufferedStream(stream) + + return stream + + def detectEncoding(self, parseMeta=True, chardet=True): + # First look for a BOM + # This will also read past the BOM if present + encoding = self.detectBOM() + confidence = "certain" + # If there is no BOM need to look for meta elements with encoding + # information + if encoding is None and parseMeta: + encoding = self.detectEncodingMeta() + confidence = "tentative" + # Guess with chardet, if avaliable + if encoding is None and chardet: + confidence = "tentative" + try: + try: + from charade.universaldetector import UniversalDetector + except ImportError: + from chardet.universaldetector import UniversalDetector + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = detector.result['encoding'] + self.rawStream.seek(0) + except ImportError: + pass + # If all else fails use the default encoding + if encoding is None: + confidence = "tentative" + encoding = self.defaultEncoding + + # Substitute for equivalent encodings: + encodingSub = {"iso-8859-1": "windows-1252"} + + if encoding.lower() in encodingSub: + encoding = encodingSub[encoding.lower()] + + return encoding, confidence + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = codecName(newEncoding) + if newEncoding in ("utf-16", "utf-16-be", "utf-16-le"): + newEncoding = "utf-8" + if newEncoding is None: + return + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.reset() + self.charEncoding = (newEncoding, "certain") + raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16-le', codecs.BOM_UTF16_BE: 'utf-16-be', + codecs.BOM_UTF32_LE: 'utf-32-le', codecs.BOM_UTF32_BE: 'utf-32-be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + self.rawStream.seek(encoding and seek or 0) + + return encoding + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding in ("utf-16", "utf-16-be", "utf-16-le"): + encoding = "utf-8" + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for byte in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = codecName(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = codecName(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def codecName(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, bytes): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + if encoding: + canonicalName = ascii_punctuation_re.sub("", encoding).lower() + return encodings.get(canonicalName, None) + else: + return None diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/sanitizer.py b/testing/web-platform/tests/tools/html5lib/html5lib/sanitizer.py new file mode 100644 index 000000000..469d9b40c --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/sanitizer.py @@ -0,0 +1,271 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from .tokenizer import HTMLTokenizer +from .constants import tokenTypes + + +class HTMLSanitizerMixin(object): + """ sanitization of XHTML+MathML+SVG and of inline style attributes.""" + + acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', + 'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button', + 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', + 'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn', + 'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset', + 'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1', + 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', 'ins', + 'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter', + 'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option', + 'p', 'pre', 'progress', 'q', 's', 'samp', 'section', 'select', + 'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', + 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot', + 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video'] + + mathml_elements = ['maction', 'math', 'merror', 'mfrac', 'mi', + 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', + 'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub', + 'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', + 'munderover', 'none'] + + svg_elements = ['a', 'animate', 'animateColor', 'animateMotion', + 'animateTransform', 'clipPath', 'circle', 'defs', 'desc', 'ellipse', + 'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern', + 'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph', + 'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect', + 'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use'] + + acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey', + 'action', 'align', 'alt', 'autocomplete', 'autofocus', 'axis', + 'background', 'balance', 'bgcolor', 'bgproperties', 'border', + 'bordercolor', 'bordercolordark', 'bordercolorlight', 'bottompadding', + 'cellpadding', 'cellspacing', 'ch', 'challenge', 'char', 'charoff', + 'choff', 'charset', 'checked', 'cite', 'class', 'clear', 'color', + 'cols', 'colspan', 'compact', 'contenteditable', 'controls', 'coords', + 'data', 'datafld', 'datapagesize', 'datasrc', 'datetime', 'default', + 'delay', 'dir', 'disabled', 'draggable', 'dynsrc', 'enctype', 'end', + 'face', 'for', 'form', 'frame', 'galleryimg', 'gutter', 'headers', + 'height', 'hidefocus', 'hidden', 'high', 'href', 'hreflang', 'hspace', + 'icon', 'id', 'inputmode', 'ismap', 'keytype', 'label', 'leftspacing', + 'lang', 'list', 'longdesc', 'loop', 'loopcount', 'loopend', + 'loopstart', 'low', 'lowsrc', 'max', 'maxlength', 'media', 'method', + 'min', 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'open', + 'optimum', 'pattern', 'ping', 'point-size', 'poster', 'pqg', 'preload', + 'prompt', 'radiogroup', 'readonly', 'rel', 'repeat-max', 'repeat-min', + 'replace', 'required', 'rev', 'rightspacing', 'rows', 'rowspan', + 'rules', 'scope', 'selected', 'shape', 'size', 'span', 'src', 'start', + 'step', 'style', 'summary', 'suppress', 'tabindex', 'target', + 'template', 'title', 'toppadding', 'type', 'unselectable', 'usemap', + 'urn', 'valign', 'value', 'variable', 'volume', 'vspace', 'vrml', + 'width', 'wrap', 'xml:lang'] + + mathml_attributes = ['actiontype', 'align', 'columnalign', 'columnalign', + 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'depth', + 'display', 'displaystyle', 'equalcolumns', 'equalrows', 'fence', + 'fontstyle', 'fontweight', 'frame', 'height', 'linethickness', 'lspace', + 'mathbackground', 'mathcolor', 'mathvariant', 'mathvariant', 'maxsize', + 'minsize', 'other', 'rowalign', 'rowalign', 'rowalign', 'rowlines', + 'rowspacing', 'rowspan', 'rspace', 'scriptlevel', 'selection', + 'separator', 'stretchy', 'width', 'width', 'xlink:href', 'xlink:show', + 'xlink:type', 'xmlns', 'xmlns:xlink'] + + svg_attributes = ['accent-height', 'accumulate', 'additive', 'alphabetic', + 'arabic-form', 'ascent', 'attributeName', 'attributeType', + 'baseProfile', 'bbox', 'begin', 'by', 'calcMode', 'cap-height', + 'class', 'clip-path', 'color', 'color-rendering', 'content', 'cx', + 'cy', 'd', 'dx', 'dy', 'descent', 'display', 'dur', 'end', 'fill', + 'fill-opacity', 'fill-rule', 'font-family', 'font-size', + 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'from', + 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'gradientUnits', 'hanging', + 'height', 'horiz-adv-x', 'horiz-origin-x', 'id', 'ideographic', 'k', + 'keyPoints', 'keySplines', 'keyTimes', 'lang', 'marker-end', + 'marker-mid', 'marker-start', 'markerHeight', 'markerUnits', + 'markerWidth', 'mathematical', 'max', 'min', 'name', 'offset', + 'opacity', 'orient', 'origin', 'overline-position', + 'overline-thickness', 'panose-1', 'path', 'pathLength', 'points', + 'preserveAspectRatio', 'r', 'refX', 'refY', 'repeatCount', + 'repeatDur', 'requiredExtensions', 'requiredFeatures', 'restart', + 'rotate', 'rx', 'ry', 'slope', 'stemh', 'stemv', 'stop-color', + 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', + 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', + 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', + 'stroke-width', 'systemLanguage', 'target', 'text-anchor', 'to', + 'transform', 'type', 'u1', 'u2', 'underline-position', + 'underline-thickness', 'unicode', 'unicode-range', 'units-per-em', + 'values', 'version', 'viewBox', 'visibility', 'width', 'widths', 'x', + 'x-height', 'x1', 'x2', 'xlink:actuate', 'xlink:arcrole', + 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type', + 'xml:base', 'xml:lang', 'xml:space', 'xmlns', 'xmlns:xlink', 'y', + 'y1', 'y2', 'zoomAndPan'] + + attr_val_is_uri = ['href', 'src', 'cite', 'action', 'longdesc', 'poster', + 'xlink:href', 'xml:base'] + + svg_attr_val_allows_ref = ['clip-path', 'color-profile', 'cursor', 'fill', + 'filter', 'marker', 'marker-start', 'marker-mid', 'marker-end', + 'mask', 'stroke'] + + svg_allow_local_href = ['altGlyph', 'animate', 'animateColor', + 'animateMotion', 'animateTransform', 'cursor', 'feImage', 'filter', + 'linearGradient', 'pattern', 'radialGradient', 'textpath', 'tref', + 'set', 'use'] + + acceptable_css_properties = ['azimuth', 'background-color', + 'border-bottom-color', 'border-collapse', 'border-color', + 'border-left-color', 'border-right-color', 'border-top-color', 'clear', + 'color', 'cursor', 'direction', 'display', 'elevation', 'float', 'font', + 'font-family', 'font-size', 'font-style', 'font-variant', 'font-weight', + 'height', 'letter-spacing', 'line-height', 'overflow', 'pause', + 'pause-after', 'pause-before', 'pitch', 'pitch-range', 'richness', + 'speak', 'speak-header', 'speak-numeral', 'speak-punctuation', + 'speech-rate', 'stress', 'text-align', 'text-decoration', 'text-indent', + 'unicode-bidi', 'vertical-align', 'voice-family', 'volume', + 'white-space', 'width'] + + acceptable_css_keywords = ['auto', 'aqua', 'black', 'block', 'blue', + 'bold', 'both', 'bottom', 'brown', 'center', 'collapse', 'dashed', + 'dotted', 'fuchsia', 'gray', 'green', '!important', 'italic', 'left', + 'lime', 'maroon', 'medium', 'none', 'navy', 'normal', 'nowrap', 'olive', + 'pointer', 'purple', 'red', 'right', 'solid', 'silver', 'teal', 'top', + 'transparent', 'underline', 'white', 'yellow'] + + acceptable_svg_properties = ['fill', 'fill-opacity', 'fill-rule', + 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin', + 'stroke-opacity'] + + acceptable_protocols = ['ed2k', 'ftp', 'http', 'https', 'irc', + 'mailto', 'news', 'gopher', 'nntp', 'telnet', 'webcal', + 'xmpp', 'callto', 'feed', 'urn', 'aim', 'rsync', 'tag', + 'ssh', 'sftp', 'rtsp', 'afs'] + + # subclasses may define their own versions of these constants + allowed_elements = acceptable_elements + mathml_elements + svg_elements + allowed_attributes = acceptable_attributes + mathml_attributes + svg_attributes + allowed_css_properties = acceptable_css_properties + allowed_css_keywords = acceptable_css_keywords + allowed_svg_properties = acceptable_svg_properties + allowed_protocols = acceptable_protocols + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all # attributes not in ALLOWED_ATTRIBUTES. Style + # attributes are parsed, and a restricted set, # specified by + # ALLOWED_CSS_PROPERTIES and ALLOWED_CSS_KEYWORDS, are allowed through. + # attributes in ATTR_VAL_IS_URI are scanned, and only URI schemes specified + # in ALLOWED_PROTOCOLS are allowed. + # + # sanitize_html('<script> do_nasty_stuff() </script>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in list(tokenTypes.keys()): + token_type = tokenTypes[token_type] + + if token_type in (tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]): + if token["name"] in self.allowed_elements: + return self.allowed_token(token, token_type) + else: + return self.disallowed_token(token, token_type) + elif token_type == tokenTypes["Comment"]: + pass + else: + return token + + def allowed_token(self, token, token_type): + if "data" in token: + attrs = dict([(name, val) for name, val in + token["data"][::-1] + if name in self.allowed_attributes]) + for attr in self.attr_val_is_uri: + if attr not in attrs: + continue + val_unescaped = re.sub("[`\000-\040\177-\240\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + if (re.match("^[a-z0-9][-+.a-z0-9]*:", val_unescaped) and + (val_unescaped.split(':')[0] not in + self.allowed_protocols)): + del attrs[attr] + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + 'xlink:href' in attrs and re.search('^\s*[^#\s].*', + attrs['xlink:href'])): + del attrs['xlink:href'] + if 'style' in attrs: + attrs['style'] = self.sanitize_css(attrs['style']) + token["data"] = [[name, val] for name, val in list(attrs.items())] + return token + + def disallowed_token(self, token, token_type): + if token_type == tokenTypes["EndTag"]: + token["data"] = "</%s>" % token["name"] + elif token["data"]: + attrs = ''.join([' %s="%s"' % (k, escape(v)) for k, v in token["data"]]) + token["data"] = "<%s%s>" % (token["name"], attrs) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + if token["type"] in list(tokenTypes.keys()): + token["type"] = "Characters" + else: + token["type"] = tokenTypes["Characters"] + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile('url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match("""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match("^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall("([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.acceptable_css_keywords and \ + not re.match("^(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) + + +class HTMLSanitizer(HTMLTokenizer, HTMLSanitizerMixin): + def __init__(self, stream, encoding=None, parseMeta=True, useChardet=True, + lowercaseElementName=False, lowercaseAttrName=False, parser=None): + # Change case matching defaults as we only output lowercase html anyway + # This solution doesn't seem ideal... + HTMLTokenizer.__init__(self, stream, encoding, parseMeta, useChardet, + lowercaseElementName, lowercaseAttrName, parser=parser) + + def __iter__(self): + for token in HTMLTokenizer.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/serializer/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/serializer/__init__.py new file mode 100644 index 000000000..8380839a6 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/serializer/__init__.py @@ -0,0 +1,16 @@ +from __future__ import absolute_import, division, unicode_literals + +from .. import treewalkers + +from .htmlserializer import HTMLSerializer + + +def serialize(input, tree="etree", format="html", encoding=None, + **serializer_opts): + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + if format == "html": + s = HTMLSerializer(**serializer_opts) + else: + raise ValueError("type must be html") + return s.render(walker(input), encoding) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/serializer/htmlserializer.py b/testing/web-platform/tests/tools/html5lib/html5lib/serializer/htmlserializer.py new file mode 100644 index 000000000..4a891ff56 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/serializer/htmlserializer.py @@ -0,0 +1,320 @@ +from __future__ import absolute_import, division, unicode_literals +from six import text_type + +import gettext +_ = gettext.gettext + +try: + from functools import reduce +except ImportError: + pass + +from ..constants import voidElements, booleanAttributes, spaceCharacters +from ..constants import rcdataElements, entities, xmlEntities +from .. import utils +from xml.sax.saxutils import escape + +spaceCharacters = "".join(spaceCharacters) + +try: + from codecs import register_error, xmlcharrefreplace_errors +except ImportError: + unicode_encode_errors = "strict" +else: + unicode_encode_errors = "htmlentityreplace" + + encode_entity_map = {} + is_ucs4 = len("\U0010FFFF") == 1 + for k, v in list(entities.items()): + # skip multi-character entities + if ((is_ucs4 and len(v) > 1) or + (not is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if v not in encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + encode_entity_map[v] = k + + def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + + register_error(unicode_encode_errors, htmlentityreplace_errors) + + del register_error + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = False + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + alphabetical_attributes = False + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "omit_optional_tags", "minimize_boolean_attributes", + "use_trailing_solidus", "space_before_trailing_solidus", + "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", + "alphabetical_attributes", "inject_meta_charset", + "strip_whitespace", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer. + + Keyword options (default given first unless specified) include: + + inject_meta_charset=True|False + Whether it insert a meta element to define the character set of the + document. + quote_attr_values=True|False + Whether to quote attribute values that don't require quoting + per HTML5 parsing rules. + quote_char=u'"'|u"'" + Use given quote character for attribute quoting. Default is to + use double quote unless attribute value contains a double quote, + in which case single quotes are used instead. + escape_lt_in_attrs=False|True + Whether to escape < in attribute values. + escape_rcdata=False|True + Whether to escape characters that need to be escaped within normal + elements within rcdata elements such as style. + resolve_entities=True|False + Whether to resolve named character entities that appear in the + source tree. The XML predefined entities < > & " ' + are unaffected by this setting. + strip_whitespace=False|True + Whether to remove semantically meaningless whitespace. (This + compresses all whitespace to a single space except within pre.) + minimize_boolean_attributes=True|False + Shortens boolean attributes to give just the attribute value, + for example <input disabled="disabled"> becomes <input disabled>. + use_trailing_solidus=False|True + Includes a close-tag slash at the end of the start tag of void + elements (empty elements whose end tag is forbidden). E.g. <hr/>. + space_before_trailing_solidus=True|False + Places a space immediately before the closing slash in a tag + using a trailing solidus. E.g. <hr />. Requires use_trailing_solidus. + sanitize=False|True + Strip all unsafe or unknown constructs from output. + See `html5lib user documentation`_ + omit_optional_tags=True|False + Omit start/end tags that are optional. + alphabetical_attributes=False|True + Reorder attributes to be in alphabetical order. + + .. _html5lib user documentation: http://code.google.com/p/html5lib/wiki/UserDocumentation + """ + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, unicode_encode_errors) + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + self.encoding = encoding + in_cdata = False + self.errors = [] + + if encoding and self.inject_meta_charset: + from ..filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from ..filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from ..filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from ..filters.optionaltags import Filter + treewalker = Filter(treewalker) + # Alphabetical attributes must be last, as other filters + # could add attributes and alter the order + if self.alphabetical_attributes: + from ..filters.alphabeticalattributes import Filter + treewalker = Filter(treewalker) + + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError(_("System identifer contains both single and double quote characters")) + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError(_("Unexpected </ in CDATA")) + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError(_("Unexpected child element of a CDATA element")) + for (attr_namespace, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) + and k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values or not v: + quote_attr = True + else: + quote_attr = reduce(lambda x, y: x or (y in v), + spaceCharacters + ">\"'=", False) + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError(_("Unexpected child element of a CDATA element")) + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError(_("Comment contains --")) + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if key not in entities: + self.serializeError(_("Entity %s not recognized" % name)) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +def SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/README b/testing/web-platform/tests/tools/html5lib/html5lib/tests/README new file mode 100644 index 000000000..c564b6836 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/README @@ -0,0 +1 @@ +Each testcase file can be run through nose (using ``nosetests``).
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/__init__.py new file mode 100644 index 000000000..b8ce2de32 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/__init__.py @@ -0,0 +1 @@ +from __future__ import absolute_import, division, unicode_literals diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/mockParser.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/mockParser.py new file mode 100644 index 000000000..ef31527e8 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/mockParser.py @@ -0,0 +1,41 @@ +from __future__ import absolute_import, division, unicode_literals + +import sys +import os + +if __name__ == '__main__': + # Allow us to import from the src directory + os.chdir(os.path.split(os.path.abspath(__file__))[0]) + sys.path.insert(0, os.path.abspath(os.path.join(os.pardir, "src"))) + +from html5lib.tokenizer import HTMLTokenizer + + +class HTMLParser(object): + """ Fake parser to test tokenizer output """ + def parse(self, stream, output=True): + tokenizer = HTMLTokenizer(stream) + for token in tokenizer: + if output: + print(token) + +if __name__ == "__main__": + x = HTMLParser() + if len(sys.argv) > 1: + if len(sys.argv) > 2: + import hotshot + import hotshot.stats + prof = hotshot.Profile('stats.prof') + prof.runcall(x.parse, sys.argv[1], False) + prof.close() + stats = hotshot.stats.load('stats.prof') + stats.strip_dirs() + stats.sort_stats('time') + stats.print_stats() + else: + x.parse(sys.argv[1]) + else: + print("""Usage: python mockParser.py filename [stats] + If stats is specified the hotshots profiler will run and output the + stats instead. + """) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/performance/concatenation.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/performance/concatenation.py new file mode 100644 index 000000000..a1465036e --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/performance/concatenation.py @@ -0,0 +1,36 @@ +from __future__ import absolute_import, division, unicode_literals + + +def f1(): + x = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + y = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + z = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + x += y + z + + +def f2(): + x = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + y = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + z = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + x = x + y + z + + +def f3(): + x = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + y = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + z = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + x = "".join((x, y, z)) + + +def f4(): + x = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + y = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + z = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" + x = "%s%s%s" % (x, y, z) + +import timeit +for x in range(4): + statement = "f%s" % (x + 1) + t = timeit.Timer(statement, "from __main__ import " + statement) + r = t.repeat(3, 1000000) + print(r, min(r)) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/support.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/support.py new file mode 100644 index 000000000..41f2d2a07 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/support.py @@ -0,0 +1,177 @@ +from __future__ import absolute_import, division, unicode_literals + +import os +import sys +import codecs +import glob +import xml.sax.handler + +base_path = os.path.split(__file__)[0] + +test_dir = os.path.join(base_path, 'testdata') +sys.path.insert(0, os.path.abspath(os.path.join(base_path, + os.path.pardir, + os.path.pardir))) + +from html5lib import treebuilders +del base_path + +# Build a dict of avaliable trees +treeTypes = {"DOM": treebuilders.getTreeBuilder("dom")} + +# Try whatever etree implementations are avaliable from a list that are +#"supposed" to work +try: + import xml.etree.ElementTree as ElementTree + treeTypes['ElementTree'] = treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True) +except ImportError: + try: + import elementtree.ElementTree as ElementTree + treeTypes['ElementTree'] = treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True) + except ImportError: + pass + +try: + import xml.etree.cElementTree as cElementTree + treeTypes['cElementTree'] = treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True) +except ImportError: + try: + import cElementTree + treeTypes['cElementTree'] = treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True) + except ImportError: + pass + +try: + import lxml.etree as lxml # flake8: noqa +except ImportError: + pass +else: + treeTypes['lxml'] = treebuilders.getTreeBuilder("lxml") + + +def get_data_files(subdirectory, files='*.dat'): + return glob.glob(os.path.join(test_dir, subdirectory, files)) + + +class DefaultDict(dict): + def __init__(self, default, *args, **kwargs): + self.default = default + dict.__init__(self, *args, **kwargs) + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +class TestData(object): + def __init__(self, filename, newTestHeading="data", encoding="utf8"): + if encoding is None: + self.f = open(filename, mode="rb") + else: + self.f = codecs.open(filename, encoding=encoding) + self.encoding = encoding + self.newTestHeading = newTestHeading + + def __del__(self): + self.f.close() + + def __iter__(self): + data = DefaultDict(None) + key = None + for line in self.f: + heading = self.isSectionHeading(line) + if heading: + if data and heading == self.newTestHeading: + # Remove trailing newline + data[key] = data[key][:-1] + yield self.normaliseOutput(data) + data = DefaultDict(None) + key = heading + data[key] = "" if self.encoding else b"" + elif key is not None: + data[key] += line + if data: + yield self.normaliseOutput(data) + + def isSectionHeading(self, line): + """If the current heading is a test section heading return the heading, + otherwise return False""" + # print(line) + if line.startswith("#" if self.encoding else b"#"): + return line[1:].strip() + else: + return False + + def normaliseOutput(self, data): + # Remove trailing newlines + for key, value in data.items(): + if value.endswith("\n" if self.encoding else b"\n"): + data[key] = value[:-1] + return data + + +def convert(stripChars): + def convertData(data): + """convert the output of str(document) to the format used in the testcases""" + data = data.split("\n") + rv = [] + for line in data: + if line.startswith("|"): + rv.append(line[stripChars:]) + else: + rv.append(line) + return "\n".join(rv) + return convertData + +convertExpected = convert(2) + + +def errorMessage(input, expected, actual): + msg = ("Input:\n%s\nExpected:\n%s\nRecieved\n%s\n" % + (repr(input), repr(expected), repr(actual))) + if sys.version_info.major == 2: + msg = msg.encode("ascii", "backslashreplace") + return msg + + +class TracingSaxHandler(xml.sax.handler.ContentHandler): + def __init__(self): + xml.sax.handler.ContentHandler.__init__(self) + self.visited = [] + + def startDocument(self): + self.visited.append('startDocument') + + def endDocument(self): + self.visited.append('endDocument') + + def startPrefixMapping(self, prefix, uri): + # These are ignored as their order is not guaranteed + pass + + def endPrefixMapping(self, prefix): + # These are ignored as their order is not guaranteed + pass + + def startElement(self, name, attrs): + self.visited.append(('startElement', name, attrs)) + + def endElement(self, name): + self.visited.append(('endElement', name)) + + def startElementNS(self, name, qname, attrs): + self.visited.append(('startElementNS', name, qname, dict(attrs))) + + def endElementNS(self, name, qname): + self.visited.append(('endElementNS', name, qname)) + + def characters(self, content): + self.visited.append(('characters', content)) + + def ignorableWhitespace(self, whitespace): + self.visited.append(('ignorableWhitespace', whitespace)) + + def processingInstruction(self, target, data): + self.visited.append(('processingInstruction', target, data)) + + def skippedEntity(self, name): + self.visited.append(('skippedEntity', name)) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_encoding.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_encoding.py new file mode 100644 index 000000000..d774ce0f6 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_encoding.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals + +import os +import unittest + +try: + unittest.TestCase.assertEqual +except AttributeError: + unittest.TestCase.assertEqual = unittest.TestCase.assertEquals + +from .support import get_data_files, TestData, test_dir, errorMessage +from html5lib import HTMLParser, inputstream + + +class Html5EncodingTestCase(unittest.TestCase): + def test_codec_name_a(self): + self.assertEqual(inputstream.codecName("utf-8"), "utf-8") + + def test_codec_name_b(self): + self.assertEqual(inputstream.codecName("utf8"), "utf-8") + + def test_codec_name_c(self): + self.assertEqual(inputstream.codecName(" utf8 "), "utf-8") + + def test_codec_name_d(self): + self.assertEqual(inputstream.codecName("ISO_8859--1"), "windows-1252") + + +def runParserEncodingTest(data, encoding): + p = HTMLParser() + assert p.documentEncoding is None + p.parse(data, useChardet=False) + encoding = encoding.lower().decode("ascii") + + assert encoding == p.documentEncoding, errorMessage(data, encoding, p.documentEncoding) + + +def runPreScanEncodingTest(data, encoding): + stream = inputstream.HTMLBinaryInputStream(data, chardet=False) + encoding = encoding.lower().decode("ascii") + + # Very crude way to ignore irrelevant tests + if len(data) > stream.numBytesMeta: + return + + assert encoding == stream.charEncoding[0], errorMessage(data, encoding, stream.charEncoding[0]) + + +def test_encoding(): + for filename in get_data_files("encoding"): + tests = TestData(filename, b"data", encoding=None) + for idx, test in enumerate(tests): + yield (runParserEncodingTest, test[b'data'], test[b'encoding']) + yield (runPreScanEncodingTest, test[b'data'], test[b'encoding']) + +try: + try: + import charade # flake8: noqa + except ImportError: + import chardet # flake8: noqa +except ImportError: + print("charade/chardet not found, skipping chardet tests") +else: + def test_chardet(): + with open(os.path.join(test_dir, "encoding" , "chardet", "test_big5.txt"), "rb") as fp: + encoding = inputstream.HTMLInputStream(fp.read()).charEncoding + assert encoding[0].lower() == "big5" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_parser.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_parser.py new file mode 100644 index 000000000..230cdb42d --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_parser.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import, division, unicode_literals + +import os +import sys +import traceback +import warnings +import re + +warnings.simplefilter("error") + +from .support import get_data_files +from .support import TestData, convert, convertExpected, treeTypes +from html5lib import html5parser, constants + +# Run the parse error checks +checkParseErrors = False + +# XXX - There should just be one function here but for some reason the testcase +# format differs from the treedump format by a single space character + + +def convertTreeDump(data): + return "\n".join(convert(3)(data).split("\n")[1:]) + +namespaceExpected = re.compile(r"^(\s*)<(\S+)>", re.M).sub + + +def runParserTest(innerHTML, input, expected, errors, treeClass, + namespaceHTMLElements): + with warnings.catch_warnings(record=True) as caughtWarnings: + warnings.simplefilter("always") + p = html5parser.HTMLParser(tree=treeClass, + namespaceHTMLElements=namespaceHTMLElements) + + try: + if innerHTML: + document = p.parseFragment(input, innerHTML) + else: + document = p.parse(input) + except: + errorMsg = "\n".join(["\n\nInput:", input, "\nExpected:", expected, + "\nTraceback:", traceback.format_exc()]) + assert False, errorMsg + + otherWarnings = [x for x in caughtWarnings + if not issubclass(x.category, constants.DataLossWarning)] + assert len(otherWarnings) == 0, [(x.category, x.message) for x in otherWarnings] + if len(caughtWarnings): + return + + output = convertTreeDump(p.tree.testSerializer(document)) + + expected = convertExpected(expected) + if namespaceHTMLElements: + expected = namespaceExpected(r"\1<html \2>", expected) + + errorMsg = "\n".join(["\n\nInput:", input, "\nExpected:", expected, + "\nReceived:", output]) + assert expected == output, errorMsg + + errStr = [] + for (line, col), errorcode, datavars in p.errors: + assert isinstance(datavars, dict), "%s, %s" % (errorcode, repr(datavars)) + errStr.append("Line: %i Col: %i %s" % (line, col, + constants.E[errorcode] % datavars)) + + errorMsg2 = "\n".join(["\n\nInput:", input, + "\nExpected errors (" + str(len(errors)) + "):\n" + "\n".join(errors), + "\nActual errors (" + str(len(p.errors)) + "):\n" + "\n".join(errStr)]) + if checkParseErrors: + assert len(p.errors) == len(errors), errorMsg2 + + +def test_parser(): + sys.stderr.write('Testing tree builders ' + " ".join(list(treeTypes.keys())) + "\n") + files = get_data_files('tree-construction') + + for filename in files: + testName = os.path.basename(filename).replace(".dat", "") + if testName in ("template",): + continue + + tests = TestData(filename, "data") + + for index, test in enumerate(tests): + input, errors, innerHTML, expected = [test[key] for key in + ('data', 'errors', + 'document-fragment', + 'document')] + if errors: + errors = errors.split("\n") + + for treeName, treeCls in treeTypes.items(): + for namespaceHTMLElements in (True, False): + yield (runParserTest, innerHTML, input, expected, errors, treeCls, + namespaceHTMLElements) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_parser2.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_parser2.py new file mode 100644 index 000000000..20bbdf317 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_parser2.py @@ -0,0 +1,64 @@ +from __future__ import absolute_import, division, unicode_literals + +import io + +from . import support # flake8: noqa +from html5lib import html5parser +from html5lib.constants import namespaces +from html5lib import treebuilders + +import unittest + +# tests that aren't autogenerated from text files + + +class MoreParserTests(unittest.TestCase): + + def setUp(self): + self.dom_tree = treebuilders.getTreeBuilder("dom") + + def test_assertDoctypeCloneable(self): + parser = html5parser.HTMLParser(tree=self.dom_tree) + doc = parser.parse('<!DOCTYPE HTML>') + self.assertTrue(doc.cloneNode(True)) + + def test_line_counter(self): + # http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4a2f26d5c0 + parser = html5parser.HTMLParser(tree=self.dom_tree) + parser.parse("<pre>\nx\n>\n</pre>") + + def test_namespace_html_elements_0_dom(self): + parser = html5parser.HTMLParser(tree=self.dom_tree, namespaceHTMLElements=True) + doc = parser.parse("<html></html>") + self.assertTrue(doc.childNodes[0].namespaceURI == namespaces["html"]) + + def test_namespace_html_elements_1_dom(self): + parser = html5parser.HTMLParser(tree=self.dom_tree, namespaceHTMLElements=False) + doc = parser.parse("<html></html>") + self.assertTrue(doc.childNodes[0].namespaceURI is None) + + def test_namespace_html_elements_0_etree(self): + parser = html5parser.HTMLParser(namespaceHTMLElements=True) + doc = parser.parse("<html></html>") + self.assertTrue(list(doc)[0].tag == "{%s}html" % (namespaces["html"],)) + + def test_namespace_html_elements_1_etree(self): + parser = html5parser.HTMLParser(namespaceHTMLElements=False) + doc = parser.parse("<html></html>") + self.assertTrue(list(doc)[0].tag == "html") + + def test_unicode_file(self): + parser = html5parser.HTMLParser() + parser.parse(io.StringIO("a")) + + +def buildTestSuite(): + return unittest.defaultTestLoader.loadTestsFromName(__name__) + + +def main(): + buildTestSuite() + unittest.main() + +if __name__ == '__main__': + main() diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_sanitizer.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_sanitizer.py new file mode 100644 index 000000000..1cc687dfc --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_sanitizer.py @@ -0,0 +1,105 @@ +from __future__ import absolute_import, division, unicode_literals + +try: + import json +except ImportError: + import simplejson as json + +from html5lib import html5parser, sanitizer, constants, treebuilders + + +def toxmlFactory(): + tree = treebuilders.getTreeBuilder("etree") + + def toxml(element): + # encode/decode roundtrip required for Python 2.6 compatibility + result_bytes = tree.implementation.tostring(element, encoding="utf-8") + return result_bytes.decode("utf-8") + + return toxml + + +def runSanitizerTest(name, expected, input, toxml=None): + if toxml is None: + toxml = toxmlFactory() + expected = ''.join([toxml(token) for token in html5parser.HTMLParser(). + parseFragment(expected)]) + expected = json.loads(json.dumps(expected)) + assert expected == sanitize_html(input) + + +def sanitize_html(stream, toxml=None): + if toxml is None: + toxml = toxmlFactory() + return ''.join([toxml(token) for token in + html5parser.HTMLParser(tokenizer=sanitizer.HTMLSanitizer). + parseFragment(stream)]) + + +def test_should_handle_astral_plane_characters(): + assert '<html:p xmlns:html="http://www.w3.org/1999/xhtml">\U0001d4b5 \U0001d538</html:p>' == sanitize_html("<p>𝒵 𝔸</p>") + + +def test_sanitizer(): + toxml = toxmlFactory() + for tag_name in sanitizer.HTMLSanitizer.allowed_elements: + if tag_name in ['caption', 'col', 'colgroup', 'optgroup', 'option', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr']: + continue # TODO + if tag_name != tag_name.lower(): + continue # TODO + if tag_name == 'image': + yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name, + "<img title=\"1\"/>foo <bad>bar</bad> baz", + "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name), + toxml) + elif tag_name == 'br': + yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name, + "<br title=\"1\"/>foo <bad>bar</bad> baz<br/>", + "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name), + toxml) + elif tag_name in constants.voidElements: + yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name, + "<%s title=\"1\"/>foo <bad>bar</bad> baz" % tag_name, + "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name), + toxml) + else: + yield (runSanitizerTest, "test_should_allow_%s_tag" % tag_name, + "<%s title=\"1\">foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name), + "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name), + toxml) + + for tag_name in sanitizer.HTMLSanitizer.allowed_elements: + tag_name = tag_name.upper() + yield (runSanitizerTest, "test_should_forbid_%s_tag" % tag_name, + "<%s title=\"1\">foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name), + "<%s title='1'>foo <bad>bar</bad> baz</%s>" % (tag_name, tag_name), + toxml) + + for attribute_name in sanitizer.HTMLSanitizer.allowed_attributes: + if attribute_name != attribute_name.lower(): + continue # TODO + if attribute_name == 'style': + continue + yield (runSanitizerTest, "test_should_allow_%s_attribute" % attribute_name, + "<p %s=\"foo\">foo <bad>bar</bad> baz</p>" % attribute_name, + "<p %s='foo'>foo <bad>bar</bad> baz</p>" % attribute_name, + toxml) + + for attribute_name in sanitizer.HTMLSanitizer.allowed_attributes: + attribute_name = attribute_name.upper() + yield (runSanitizerTest, "test_should_forbid_%s_attribute" % attribute_name, + "<p>foo <bad>bar</bad> baz</p>", + "<p %s='display: none;'>foo <bad>bar</bad> baz</p>" % attribute_name, + toxml) + + for protocol in sanitizer.HTMLSanitizer.allowed_protocols: + yield (runSanitizerTest, "test_should_allow_%s_uris" % protocol, + "<a href=\"%s\">foo</a>" % protocol, + """<a href="%s">foo</a>""" % protocol, + toxml) + + for protocol in sanitizer.HTMLSanitizer.allowed_protocols: + yield (runSanitizerTest, "test_should_allow_uppercase_%s_uris" % protocol, + "<a href=\"%s\">foo</a>" % protocol, + """<a href="%s">foo</a>""" % protocol, + toxml) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_serializer.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_serializer.py new file mode 100644 index 000000000..3c37feff7 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_serializer.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import, division, unicode_literals + +import json +import unittest + +from .support import get_data_files + +try: + unittest.TestCase.assertEqual +except AttributeError: + unittest.TestCase.assertEqual = unittest.TestCase.assertEquals + +import html5lib +from html5lib import constants +from html5lib.serializer import HTMLSerializer, serialize +from html5lib.treewalkers._base import TreeWalker + +optionals_loaded = [] + +try: + from lxml import etree + optionals_loaded.append("lxml") +except ImportError: + pass + +default_namespace = constants.namespaces["html"] + + +class JsonWalker(TreeWalker): + def __iter__(self): + for token in self.tree: + type = token[0] + if type == "StartTag": + if len(token) == 4: + namespace, name, attrib = token[1:4] + else: + namespace = default_namespace + name, attrib = token[1:3] + yield self.startTag(namespace, name, self._convertAttrib(attrib)) + elif type == "EndTag": + if len(token) == 3: + namespace, name = token[1:3] + else: + namespace = default_namespace + name = token[1] + yield self.endTag(namespace, name) + elif type == "EmptyTag": + if len(token) == 4: + namespace, name, attrib = token[1:] + else: + namespace = default_namespace + name, attrib = token[1:] + for token in self.emptyTag(namespace, name, self._convertAttrib(attrib)): + yield token + elif type == "Comment": + yield self.comment(token[1]) + elif type in ("Characters", "SpaceCharacters"): + for token in self.text(token[1]): + yield token + elif type == "Doctype": + if len(token) == 4: + yield self.doctype(token[1], token[2], token[3]) + elif len(token) == 3: + yield self.doctype(token[1], token[2]) + else: + yield self.doctype(token[1]) + else: + raise ValueError("Unknown token type: " + type) + + def _convertAttrib(self, attribs): + """html5lib tree-walkers use a dict of (namespace, name): value for + attributes, but JSON cannot represent this. Convert from the format + in the serializer tests (a list of dicts with "namespace", "name", + and "value" as keys) to html5lib's tree-walker format.""" + attrs = {} + for attrib in attribs: + name = (attrib["namespace"], attrib["name"]) + assert(name not in attrs) + attrs[name] = attrib["value"] + return attrs + + +def serialize_html(input, options): + options = dict([(str(k), v) for k, v in options.items()]) + stream = JsonWalker(input) + serializer = HTMLSerializer(alphabetical_attributes=True, **options) + return serializer.render(stream, options.get("encoding", None)) + + +def runSerializerTest(input, expected, options): + encoding = options.get("encoding", None) + + if encoding: + encode = lambda x: x.encode(encoding) + expected = list(map(encode, expected)) + + result = serialize_html(input, options) + if len(expected) == 1: + assert expected[0] == result, "Expected:\n%s\nActual:\n%s\nOptions:\n%s" % (expected[0], result, str(options)) + elif result not in expected: + assert False, "Expected: %s, Received: %s" % (expected, result) + + +class EncodingTestCase(unittest.TestCase): + def throwsWithLatin1(self, input): + self.assertRaises(UnicodeEncodeError, serialize_html, input, {"encoding": "iso-8859-1"}) + + def testDoctypeName(self): + self.throwsWithLatin1([["Doctype", "\u0101"]]) + + def testDoctypePublicId(self): + self.throwsWithLatin1([["Doctype", "potato", "\u0101"]]) + + def testDoctypeSystemId(self): + self.throwsWithLatin1([["Doctype", "potato", "potato", "\u0101"]]) + + def testCdataCharacters(self): + runSerializerTest([["StartTag", "http://www.w3.org/1999/xhtml", "style", {}], ["Characters", "\u0101"]], + ["<style>ā"], {"encoding": "iso-8859-1"}) + + def testCharacters(self): + runSerializerTest([["Characters", "\u0101"]], + ["ā"], {"encoding": "iso-8859-1"}) + + def testStartTagName(self): + self.throwsWithLatin1([["StartTag", "http://www.w3.org/1999/xhtml", "\u0101", []]]) + + def testEmptyTagName(self): + self.throwsWithLatin1([["EmptyTag", "http://www.w3.org/1999/xhtml", "\u0101", []]]) + + def testAttributeName(self): + self.throwsWithLatin1([["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": None, "name": "\u0101", "value": "potato"}]]]) + + def testAttributeValue(self): + runSerializerTest([["StartTag", "http://www.w3.org/1999/xhtml", "span", + [{"namespace": None, "name": "potato", "value": "\u0101"}]]], + ["<span potato=ā>"], {"encoding": "iso-8859-1"}) + + def testEndTagName(self): + self.throwsWithLatin1([["EndTag", "http://www.w3.org/1999/xhtml", "\u0101"]]) + + def testComment(self): + self.throwsWithLatin1([["Comment", "\u0101"]]) + + +if "lxml" in optionals_loaded: + class LxmlTestCase(unittest.TestCase): + def setUp(self): + self.parser = etree.XMLParser(resolve_entities=False) + self.treewalker = html5lib.getTreeWalker("lxml") + self.serializer = HTMLSerializer() + + def testEntityReplacement(self): + doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>β</html>""" + tree = etree.fromstring(doc, parser=self.parser).getroottree() + result = serialize(tree, tree="lxml", omit_optional_tags=False) + self.assertEqual("""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>\u03B2</html>""", result) + + def testEntityXML(self): + doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>></html>""" + tree = etree.fromstring(doc, parser=self.parser).getroottree() + result = serialize(tree, tree="lxml", omit_optional_tags=False) + self.assertEqual("""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>></html>""", result) + + def testEntityNoResolve(self): + doc = """<!DOCTYPE html SYSTEM "about:legacy-compat"><html>β</html>""" + tree = etree.fromstring(doc, parser=self.parser).getroottree() + result = serialize(tree, tree="lxml", omit_optional_tags=False, + resolve_entities=False) + self.assertEqual("""<!DOCTYPE html SYSTEM "about:legacy-compat"><html>β</html>""", result) + + +def test_serializer(): + for filename in get_data_files('serializer', '*.test'): + with open(filename) as fp: + tests = json.load(fp) + for index, test in enumerate(tests['tests']): + yield runSerializerTest, test["input"], test["expected"], test.get("options", {}) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_stream.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_stream.py new file mode 100644 index 000000000..2a876c1db --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_stream.py @@ -0,0 +1,183 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import support # flake8: noqa +import unittest +import codecs +from io import BytesIO + +from six.moves import http_client + +from html5lib.inputstream import (BufferedStream, HTMLInputStream, + HTMLUnicodeInputStream, HTMLBinaryInputStream) + +class BufferedStreamTest(unittest.TestCase): + def test_basic(self): + s = b"abc" + fp = BufferedStream(BytesIO(s)) + read = fp.read(10) + assert read == s + + def test_read_length(self): + fp = BufferedStream(BytesIO(b"abcdef")) + read1 = fp.read(1) + assert read1 == b"a" + read2 = fp.read(2) + assert read2 == b"bc" + read3 = fp.read(3) + assert read3 == b"def" + read4 = fp.read(4) + assert read4 == b"" + + def test_tell(self): + fp = BufferedStream(BytesIO(b"abcdef")) + read1 = fp.read(1) + assert fp.tell() == 1 + read2 = fp.read(2) + assert fp.tell() == 3 + read3 = fp.read(3) + assert fp.tell() == 6 + read4 = fp.read(4) + assert fp.tell() == 6 + + def test_seek(self): + fp = BufferedStream(BytesIO(b"abcdef")) + read1 = fp.read(1) + assert read1 == b"a" + fp.seek(0) + read2 = fp.read(1) + assert read2 == b"a" + read3 = fp.read(2) + assert read3 == b"bc" + fp.seek(2) + read4 = fp.read(2) + assert read4 == b"cd" + fp.seek(4) + read5 = fp.read(2) + assert read5 == b"ef" + + def test_seek_tell(self): + fp = BufferedStream(BytesIO(b"abcdef")) + read1 = fp.read(1) + assert fp.tell() == 1 + fp.seek(0) + read2 = fp.read(1) + assert fp.tell() == 1 + read3 = fp.read(2) + assert fp.tell() == 3 + fp.seek(2) + read4 = fp.read(2) + assert fp.tell() == 4 + fp.seek(4) + read5 = fp.read(2) + assert fp.tell() == 6 + + +class HTMLUnicodeInputStreamShortChunk(HTMLUnicodeInputStream): + _defaultChunkSize = 2 + + +class HTMLBinaryInputStreamShortChunk(HTMLBinaryInputStream): + _defaultChunkSize = 2 + + +class HTMLInputStreamTest(unittest.TestCase): + + def test_char_ascii(self): + stream = HTMLInputStream(b"'", encoding='ascii') + self.assertEqual(stream.charEncoding[0], 'ascii') + self.assertEqual(stream.char(), "'") + + def test_char_utf8(self): + stream = HTMLInputStream('\u2018'.encode('utf-8'), encoding='utf-8') + self.assertEqual(stream.charEncoding[0], 'utf-8') + self.assertEqual(stream.char(), '\u2018') + + def test_char_win1252(self): + stream = HTMLInputStream("\xa9\xf1\u2019".encode('windows-1252')) + self.assertEqual(stream.charEncoding[0], 'windows-1252') + self.assertEqual(stream.char(), "\xa9") + self.assertEqual(stream.char(), "\xf1") + self.assertEqual(stream.char(), "\u2019") + + def test_bom(self): + stream = HTMLInputStream(codecs.BOM_UTF8 + b"'") + self.assertEqual(stream.charEncoding[0], 'utf-8') + self.assertEqual(stream.char(), "'") + + def test_utf_16(self): + stream = HTMLInputStream((' ' * 1025).encode('utf-16')) + self.assertTrue(stream.charEncoding[0] in ['utf-16-le', 'utf-16-be'], stream.charEncoding) + self.assertEqual(len(stream.charsUntil(' ', True)), 1025) + + def test_newlines(self): + stream = HTMLBinaryInputStreamShortChunk(codecs.BOM_UTF8 + b"a\nbb\r\nccc\rddddxe") + self.assertEqual(stream.position(), (1, 0)) + self.assertEqual(stream.charsUntil('c'), "a\nbb\n") + self.assertEqual(stream.position(), (3, 0)) + self.assertEqual(stream.charsUntil('x'), "ccc\ndddd") + self.assertEqual(stream.position(), (4, 4)) + self.assertEqual(stream.charsUntil('e'), "x") + self.assertEqual(stream.position(), (4, 5)) + + def test_newlines2(self): + size = HTMLUnicodeInputStream._defaultChunkSize + stream = HTMLInputStream("\r" * size + "\n") + self.assertEqual(stream.charsUntil('x'), "\n" * size) + + def test_position(self): + stream = HTMLBinaryInputStreamShortChunk(codecs.BOM_UTF8 + b"a\nbb\nccc\nddde\nf\ngh") + self.assertEqual(stream.position(), (1, 0)) + self.assertEqual(stream.charsUntil('c'), "a\nbb\n") + self.assertEqual(stream.position(), (3, 0)) + stream.unget("\n") + self.assertEqual(stream.position(), (2, 2)) + self.assertEqual(stream.charsUntil('c'), "\n") + self.assertEqual(stream.position(), (3, 0)) + stream.unget("\n") + self.assertEqual(stream.position(), (2, 2)) + self.assertEqual(stream.char(), "\n") + self.assertEqual(stream.position(), (3, 0)) + self.assertEqual(stream.charsUntil('e'), "ccc\nddd") + self.assertEqual(stream.position(), (4, 3)) + self.assertEqual(stream.charsUntil('h'), "e\nf\ng") + self.assertEqual(stream.position(), (6, 1)) + + def test_position2(self): + stream = HTMLUnicodeInputStreamShortChunk("abc\nd") + self.assertEqual(stream.position(), (1, 0)) + self.assertEqual(stream.char(), "a") + self.assertEqual(stream.position(), (1, 1)) + self.assertEqual(stream.char(), "b") + self.assertEqual(stream.position(), (1, 2)) + self.assertEqual(stream.char(), "c") + self.assertEqual(stream.position(), (1, 3)) + self.assertEqual(stream.char(), "\n") + self.assertEqual(stream.position(), (2, 0)) + self.assertEqual(stream.char(), "d") + self.assertEqual(stream.position(), (2, 1)) + + def test_python_issue_20007(self): + """ + Make sure we have a work-around for Python bug #20007 + http://bugs.python.org/issue20007 + """ + class FakeSocket(object): + def makefile(self, _mode, _bufsize=None): + return BytesIO(b"HTTP/1.1 200 Ok\r\n\r\nText") + + source = http_client.HTTPResponse(FakeSocket()) + source.begin() + stream = HTMLInputStream(source) + self.assertEqual(stream.charsUntil(" "), "Text") + + +def buildTestSuite(): + return unittest.defaultTestLoader.loadTestsFromName(__name__) + + +def main(): + buildTestSuite() + unittest.main() + +if __name__ == '__main__': + main() diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_tokenizer.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_tokenizer.py new file mode 100644 index 000000000..90315ab35 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_tokenizer.py @@ -0,0 +1,188 @@ +from __future__ import absolute_import, division, unicode_literals + +import json +import warnings +import re + +from .support import get_data_files + +from html5lib.tokenizer import HTMLTokenizer +from html5lib import constants + + +class TokenizerTestParser(object): + def __init__(self, initialState, lastStartTag=None): + self.tokenizer = HTMLTokenizer + self._state = initialState + self._lastStartTag = lastStartTag + + def parse(self, stream, encoding=None, innerHTML=False): + tokenizer = self.tokenizer(stream, encoding) + self.outputTokens = [] + + tokenizer.state = getattr(tokenizer, self._state) + if self._lastStartTag is not None: + tokenizer.currentToken = {"type": "startTag", + "name": self._lastStartTag} + + types = dict((v, k) for k, v in constants.tokenTypes.items()) + for token in tokenizer: + getattr(self, 'process%s' % types[token["type"]])(token) + + return self.outputTokens + + def processDoctype(self, token): + self.outputTokens.append(["DOCTYPE", token["name"], token["publicId"], + token["systemId"], token["correct"]]) + + def processStartTag(self, token): + self.outputTokens.append(["StartTag", token["name"], + dict(token["data"][::-1]), token["selfClosing"]]) + + def processEmptyTag(self, token): + if token["name"] not in constants.voidElements: + self.outputTokens.append("ParseError") + self.outputTokens.append(["StartTag", token["name"], dict(token["data"][::-1])]) + + def processEndTag(self, token): + self.outputTokens.append(["EndTag", token["name"], + token["selfClosing"]]) + + def processComment(self, token): + self.outputTokens.append(["Comment", token["data"]]) + + def processSpaceCharacters(self, token): + self.outputTokens.append(["Character", token["data"]]) + self.processSpaceCharacters = self.processCharacters + + def processCharacters(self, token): + self.outputTokens.append(["Character", token["data"]]) + + def processEOF(self, token): + pass + + def processParseError(self, token): + self.outputTokens.append(["ParseError", token["data"]]) + + +def concatenateCharacterTokens(tokens): + outputTokens = [] + for token in tokens: + if "ParseError" not in token and token[0] == "Character": + if (outputTokens and "ParseError" not in outputTokens[-1] and + outputTokens[-1][0] == "Character"): + outputTokens[-1][1] += token[1] + else: + outputTokens.append(token) + else: + outputTokens.append(token) + return outputTokens + + +def normalizeTokens(tokens): + # TODO: convert tests to reflect arrays + for i, token in enumerate(tokens): + if token[0] == 'ParseError': + tokens[i] = token[0] + return tokens + + +def tokensMatch(expectedTokens, receivedTokens, ignoreErrorOrder, + ignoreErrors=False): + """Test whether the test has passed or failed + + If the ignoreErrorOrder flag is set to true we don't test the relative + positions of parse errors and non parse errors + """ + checkSelfClosing = False + for token in expectedTokens: + if (token[0] == "StartTag" and len(token) == 4 + or token[0] == "EndTag" and len(token) == 3): + checkSelfClosing = True + break + + if not checkSelfClosing: + for token in receivedTokens: + if token[0] == "StartTag" or token[0] == "EndTag": + token.pop() + + if not ignoreErrorOrder and not ignoreErrors: + return expectedTokens == receivedTokens + else: + # Sort the tokens into two groups; non-parse errors and parse errors + tokens = {"expected": [[], []], "received": [[], []]} + for tokenType, tokenList in zip(list(tokens.keys()), + (expectedTokens, receivedTokens)): + for token in tokenList: + if token != "ParseError": + tokens[tokenType][0].append(token) + else: + if not ignoreErrors: + tokens[tokenType][1].append(token) + return tokens["expected"] == tokens["received"] + + +def unescape(test): + def decode(inp): + return inp.encode("utf-8").decode("unicode-escape") + + test["input"] = decode(test["input"]) + for token in test["output"]: + if token == "ParseError": + continue + else: + token[1] = decode(token[1]) + if len(token) > 2: + for key, value in token[2]: + del token[2][key] + token[2][decode(key)] = decode(value) + return test + + +def runTokenizerTest(test): + warnings.resetwarnings() + warnings.simplefilter("error") + + expected = concatenateCharacterTokens(test['output']) + if 'lastStartTag' not in test: + test['lastStartTag'] = None + parser = TokenizerTestParser(test['initialState'], + test['lastStartTag']) + tokens = parser.parse(test['input']) + tokens = concatenateCharacterTokens(tokens) + received = normalizeTokens(tokens) + errorMsg = "\n".join(["\n\nInitial state:", + test['initialState'], + "\nInput:", test['input'], + "\nExpected:", repr(expected), + "\nreceived:", repr(tokens)]) + errorMsg = errorMsg + ignoreErrorOrder = test.get('ignoreErrorOrder', False) + assert tokensMatch(expected, received, ignoreErrorOrder, True), errorMsg + + +def _doCapitalize(match): + return match.group(1).upper() + +_capitalizeRe = re.compile(r"\W+(\w)").sub + + +def capitalize(s): + s = s.lower() + s = _capitalizeRe(_doCapitalize, s) + return s + + +def testTokenizer(): + for filename in get_data_files('tokenizer', '*.test'): + with open(filename) as fp: + tests = json.load(fp) + if 'tests' in tests: + for index, test in enumerate(tests['tests']): + if 'initialStates' not in test: + test["initialStates"] = ["Data state"] + if 'doubleEscaped' in test: + test = unescape(test) + for initialState in test["initialStates"]: + test["initialState"] = capitalize(initialState) + yield runTokenizerTest, test diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_treeadapters.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_treeadapters.py new file mode 100644 index 000000000..5f38b6c33 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_treeadapters.py @@ -0,0 +1,40 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import support # flake8: noqa + +import html5lib +from html5lib.treeadapters import sax +from html5lib.treewalkers import getTreeWalker + + +def test_to_sax(): + handler = support.TracingSaxHandler() + tree = html5lib.parse("""<html xml:lang="en"> + <title>Directory Listing</title> + <a href="/"><b/></p> + """, treebuilder="etree") + walker = getTreeWalker("etree") + sax.to_sax(walker(tree), handler) + expected = [ + 'startDocument', + ('startElementNS', ('http://www.w3.org/1999/xhtml', 'html'), + 'html', {(None, 'xml:lang'): 'en'}), + ('startElementNS', ('http://www.w3.org/1999/xhtml', 'head'), 'head', {}), + ('startElementNS', ('http://www.w3.org/1999/xhtml', 'title'), 'title', {}), + ('characters', 'Directory Listing'), + ('endElementNS', ('http://www.w3.org/1999/xhtml', 'title'), 'title'), + ('characters', '\n '), + ('endElementNS', ('http://www.w3.org/1999/xhtml', 'head'), 'head'), + ('startElementNS', ('http://www.w3.org/1999/xhtml', 'body'), 'body', {}), + ('startElementNS', ('http://www.w3.org/1999/xhtml', 'a'), 'a', {(None, 'href'): '/'}), + ('startElementNS', ('http://www.w3.org/1999/xhtml', 'b'), 'b', {}), + ('startElementNS', ('http://www.w3.org/1999/xhtml', 'p'), 'p', {}), + ('endElementNS', ('http://www.w3.org/1999/xhtml', 'p'), 'p'), + ('characters', '\n '), + ('endElementNS', ('http://www.w3.org/1999/xhtml', 'b'), 'b'), + ('endElementNS', ('http://www.w3.org/1999/xhtml', 'a'), 'a'), + ('endElementNS', ('http://www.w3.org/1999/xhtml', 'body'), 'body'), + ('endElementNS', ('http://www.w3.org/1999/xhtml', 'html'), 'html'), + 'endDocument', + ] + assert expected == handler.visited diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_treewalkers.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_treewalkers.py new file mode 100644 index 000000000..b7756035c --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_treewalkers.py @@ -0,0 +1,353 @@ +from __future__ import absolute_import, division, unicode_literals + +import os +import sys +import unittest +import warnings +from difflib import unified_diff + +try: + unittest.TestCase.assertEqual +except AttributeError: + unittest.TestCase.assertEqual = unittest.TestCase.assertEquals + +from .support import get_data_files, TestData, convertExpected + +from html5lib import html5parser, treewalkers, treebuilders, constants + + +def PullDOMAdapter(node): + from xml.dom import Node + from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, COMMENT, CHARACTERS + + if node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + for childNode in node.childNodes: + for event in PullDOMAdapter(childNode): + yield event + + elif node.nodeType == Node.DOCUMENT_TYPE_NODE: + raise NotImplementedError("DOCTYPE nodes are not supported by PullDOM") + + elif node.nodeType == Node.COMMENT_NODE: + yield COMMENT, node + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + yield CHARACTERS, node + + elif node.nodeType == Node.ELEMENT_NODE: + yield START_ELEMENT, node + for childNode in node.childNodes: + for event in PullDOMAdapter(childNode): + yield event + yield END_ELEMENT, node + + else: + raise NotImplementedError("Node type not supported: " + str(node.nodeType)) + +treeTypes = { + "DOM": {"builder": treebuilders.getTreeBuilder("dom"), + "walker": treewalkers.getTreeWalker("dom")}, + "PullDOM": {"builder": treebuilders.getTreeBuilder("dom"), + "adapter": PullDOMAdapter, + "walker": treewalkers.getTreeWalker("pulldom")}, +} + +# Try whatever etree implementations are available from a list that are +#"supposed" to work +try: + import xml.etree.ElementTree as ElementTree +except ImportError: + pass +else: + treeTypes['ElementTree'] = \ + {"builder": treebuilders.getTreeBuilder("etree", ElementTree), + "walker": treewalkers.getTreeWalker("etree", ElementTree)} + +try: + import xml.etree.cElementTree as ElementTree +except ImportError: + pass +else: + treeTypes['cElementTree'] = \ + {"builder": treebuilders.getTreeBuilder("etree", ElementTree), + "walker": treewalkers.getTreeWalker("etree", ElementTree)} + + +try: + import lxml.etree as ElementTree # flake8: noqa +except ImportError: + pass +else: + treeTypes['lxml_native'] = \ + {"builder": treebuilders.getTreeBuilder("lxml"), + "walker": treewalkers.getTreeWalker("lxml")} + + +try: + from genshi.core import QName, Attrs + from genshi.core import START, END, TEXT, COMMENT, DOCTYPE +except ImportError: + pass +else: + def GenshiAdapter(tree): + text = None + for token in treewalkers.getTreeWalker("dom")(tree): + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + if text is None: + text = token["data"] + else: + text += token["data"] + elif text is not None: + yield TEXT, text, (None, -1, -1) + text = None + + if type in ("StartTag", "EmptyTag"): + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) + for attr, value in token["data"].items()]) + yield (START, (QName(name), attrs), (None, -1, -1)) + if type == "EmptyTag": + type = "EndTag" + + if type == "EndTag": + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + + yield END, QName(name), (None, -1, -1) + + elif type == "Comment": + yield COMMENT, token["data"], (None, -1, -1) + + elif type == "Doctype": + yield DOCTYPE, (token["name"], token["publicId"], + token["systemId"]), (None, -1, -1) + + else: + pass # FIXME: What to do? + + if text is not None: + yield TEXT, text, (None, -1, -1) + + treeTypes["genshi"] = \ + {"builder": treebuilders.getTreeBuilder("dom"), + "adapter": GenshiAdapter, + "walker": treewalkers.getTreeWalker("genshi")} + + +def concatenateCharacterTokens(tokens): + charactersToken = None + for token in tokens: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + if charactersToken is None: + charactersToken = {"type": "Characters", "data": token["data"]} + else: + charactersToken["data"] += token["data"] + else: + if charactersToken is not None: + yield charactersToken + charactersToken = None + yield token + if charactersToken is not None: + yield charactersToken + + +def convertTokens(tokens): + output = [] + indent = 0 + for token in concatenateCharacterTokens(tokens): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + if (token["namespace"] and + token["namespace"] != constants.namespaces["html"]): + if token["namespace"] in constants.prefixes: + name = constants.prefixes[token["namespace"]] + else: + name = token["namespace"] + name += " " + token["name"] + else: + name = token["name"] + output.append("%s<%s>" % (" " * indent, name)) + indent += 2 + attrs = token["data"] + if attrs: + # TODO: Remove this if statement, attrs should always exist + for (namespace, name), value in sorted(attrs.items()): + if namespace: + if namespace in constants.prefixes: + outputname = constants.prefixes[namespace] + else: + outputname = namespace + outputname += " " + name + else: + outputname = name + output.append("%s%s=\"%s\"" % (" " * indent, outputname, value)) + if type == "EmptyTag": + indent -= 2 + elif type == "EndTag": + indent -= 2 + elif type == "Comment": + output.append("%s<!-- %s -->" % (" " * indent, token["data"])) + elif type == "Doctype": + if token["name"]: + if token["publicId"]: + output.append("""%s<!DOCTYPE %s "%s" "%s">""" % + (" " * indent, token["name"], + token["publicId"], + token["systemId"] and token["systemId"] or "")) + elif token["systemId"]: + output.append("""%s<!DOCTYPE %s "" "%s">""" % + (" " * indent, token["name"], + token["systemId"])) + else: + output.append("%s<!DOCTYPE %s>" % (" " * indent, + token["name"])) + else: + output.append("%s<!DOCTYPE >" % (" " * indent,)) + elif type in ("Characters", "SpaceCharacters"): + output.append("%s\"%s\"" % (" " * indent, token["data"])) + else: + pass # TODO: what to do with errors? + return "\n".join(output) + +import re +attrlist = re.compile(r"^(\s+)\w+=.*(\n\1\w+=.*)+", re.M) + + +def sortattrs(x): + lines = x.group(0).split("\n") + lines.sort() + return "\n".join(lines) + + +class TokenTestCase(unittest.TestCase): + def test_all_tokens(self): + expected = [ + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'}, + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'head'}, + {'data': {}, 'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'head'}, + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, + {'data': 'a', 'type': 'Characters'}, + {'data': {}, 'type': 'StartTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, + {'data': 'b', 'type': 'Characters'}, + {'data': {}, 'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, + {'data': 'c', 'type': 'Characters'}, + {'data': {}, 'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, + {'data': {}, 'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} + ] + for treeName, treeCls in treeTypes.items(): + p = html5parser.HTMLParser(tree=treeCls["builder"]) + document = p.parse("<html><head></head><body>a<div>b</div>c</body></html>") + document = treeCls.get("adapter", lambda x: x)(document) + output = treeCls["walker"](document) + for expectedToken, outputToken in zip(expected, output): + self.assertEqual(expectedToken, outputToken) + + +def runTreewalkerTest(innerHTML, input, expected, errors, treeClass): + warnings.resetwarnings() + warnings.simplefilter("error") + try: + p = html5parser.HTMLParser(tree=treeClass["builder"]) + if innerHTML: + document = p.parseFragment(input, innerHTML) + else: + document = p.parse(input) + except constants.DataLossWarning: + # Ignore testcases we know we don't pass + return + + document = treeClass.get("adapter", lambda x: x)(document) + try: + output = convertTokens(treeClass["walker"](document)) + output = attrlist.sub(sortattrs, output) + expected = attrlist.sub(sortattrs, convertExpected(expected)) + diff = "".join(unified_diff([line + "\n" for line in expected.splitlines()], + [line + "\n" for line in output.splitlines()], + "Expected", "Received")) + assert expected == output, "\n".join([ + "", "Input:", input, + "", "Expected:", expected, + "", "Received:", output, + "", "Diff:", diff, + ]) + except NotImplementedError: + pass # Amnesty for those that confess... + + +def test_treewalker(): + sys.stdout.write('Testing tree walkers ' + " ".join(list(treeTypes.keys())) + "\n") + + for treeName, treeCls in treeTypes.items(): + files = get_data_files('tree-construction') + for filename in files: + testName = os.path.basename(filename).replace(".dat", "") + if testName in ("template",): + continue + + tests = TestData(filename, "data") + + for index, test in enumerate(tests): + (input, errors, + innerHTML, expected) = [test[key] for key in ("data", "errors", + "document-fragment", + "document")] + errors = errors.split("\n") + yield runTreewalkerTest, innerHTML, input, expected, errors, treeCls + + +def set_attribute_on_first_child(docfrag, name, value, treeName): + """naively sets an attribute on the first child of the document + fragment passed in""" + setter = {'ElementTree': lambda d: d[0].set, + 'DOM': lambda d: d.firstChild.setAttribute} + setter['cElementTree'] = setter['ElementTree'] + try: + setter.get(treeName, setter['DOM'])(docfrag)(name, value) + except AttributeError: + setter['ElementTree'](docfrag)(name, value) + + +def runTreewalkerEditTest(intext, expected, attrs_to_add, tree): + """tests what happens when we add attributes to the intext""" + treeName, treeClass = tree + parser = html5parser.HTMLParser(tree=treeClass["builder"]) + document = parser.parseFragment(intext) + for nom, val in attrs_to_add: + set_attribute_on_first_child(document, nom, val, treeName) + + document = treeClass.get("adapter", lambda x: x)(document) + output = convertTokens(treeClass["walker"](document)) + output = attrlist.sub(sortattrs, output) + if not output in expected: + raise AssertionError("TreewalkerEditTest: %s\nExpected:\n%s\nReceived:\n%s" % (treeName, expected, output)) + + +def test_treewalker_six_mix(): + """Str/Unicode mix. If str attrs added to tree""" + + # On Python 2.x string literals are of type str. Unless, like this + # file, the programmer imports unicode_literals from __future__. + # In that case, string literals become objects of type unicode. + + # This test simulates a Py2 user, modifying attributes on a document + # fragment but not using the u'' syntax nor importing unicode_literals + sm_tests = [ + ('<a href="http://example.com">Example</a>', + [(str('class'), str('test123'))], + '<a>\n class="test123"\n href="http://example.com"\n "Example"'), + + ('<link href="http://example.com/cow">', + [(str('rel'), str('alternate'))], + '<link>\n href="http://example.com/cow"\n rel="alternate"\n "Example"') + ] + + for tree in treeTypes.items(): + for intext, attrs, expected in sm_tests: + yield runTreewalkerEditTest, intext, expected, attrs, tree diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_whitespace_filter.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_whitespace_filter.py new file mode 100644 index 000000000..9ed27fd6a --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/test_whitespace_filter.py @@ -0,0 +1,133 @@ +from __future__ import absolute_import, division, unicode_literals + +import unittest + +from html5lib.filters.whitespace import Filter +from html5lib.constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +try: + unittest.TestCase.assertEqual +except AttributeError: + unittest.TestCase.assertEqual = unittest.TestCase.assertEquals + + +class TestCase(unittest.TestCase): + def runTest(self, input, expected): + output = list(Filter(input)) + errorMsg = "\n".join(["\n\nInput:", str(input), + "\nExpected:", str(expected), + "\nReceived:", str(output)]) + self.assertEqual(output, expected, errorMsg) + + def runTestUnmodifiedOutput(self, input): + self.runTest(input, input) + + def testPhrasingElements(self): + self.runTestUnmodifiedOutput( + [{"type": "Characters", "data": "This is a "}, + {"type": "StartTag", "name": "span", "data": []}, + {"type": "Characters", "data": "phrase"}, + {"type": "EndTag", "name": "span", "data": []}, + {"type": "SpaceCharacters", "data": " "}, + {"type": "Characters", "data": "with"}, + {"type": "SpaceCharacters", "data": " "}, + {"type": "StartTag", "name": "em", "data": []}, + {"type": "Characters", "data": "emphasised text"}, + {"type": "EndTag", "name": "em", "data": []}, + {"type": "Characters", "data": " and an "}, + {"type": "StartTag", "name": "img", "data": [["alt", "image"]]}, + {"type": "Characters", "data": "."}]) + + def testLeadingWhitespace(self): + self.runTest( + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "SpaceCharacters", "data": spaceCharacters}, + {"type": "Characters", "data": "foo"}, + {"type": "EndTag", "name": "p", "data": []}], + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "SpaceCharacters", "data": " "}, + {"type": "Characters", "data": "foo"}, + {"type": "EndTag", "name": "p", "data": []}]) + + def testLeadingWhitespaceAsCharacters(self): + self.runTest( + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": spaceCharacters + "foo"}, + {"type": "EndTag", "name": "p", "data": []}], + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": " foo"}, + {"type": "EndTag", "name": "p", "data": []}]) + + def testTrailingWhitespace(self): + self.runTest( + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": "foo"}, + {"type": "SpaceCharacters", "data": spaceCharacters}, + {"type": "EndTag", "name": "p", "data": []}], + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": "foo"}, + {"type": "SpaceCharacters", "data": " "}, + {"type": "EndTag", "name": "p", "data": []}]) + + def testTrailingWhitespaceAsCharacters(self): + self.runTest( + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": "foo" + spaceCharacters}, + {"type": "EndTag", "name": "p", "data": []}], + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": "foo "}, + {"type": "EndTag", "name": "p", "data": []}]) + + def testWhitespace(self): + self.runTest( + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": "foo" + spaceCharacters + "bar"}, + {"type": "EndTag", "name": "p", "data": []}], + [{"type": "StartTag", "name": "p", "data": []}, + {"type": "Characters", "data": "foo bar"}, + {"type": "EndTag", "name": "p", "data": []}]) + + def testLeadingWhitespaceInPre(self): + self.runTestUnmodifiedOutput( + [{"type": "StartTag", "name": "pre", "data": []}, + {"type": "SpaceCharacters", "data": spaceCharacters}, + {"type": "Characters", "data": "foo"}, + {"type": "EndTag", "name": "pre", "data": []}]) + + def testLeadingWhitespaceAsCharactersInPre(self): + self.runTestUnmodifiedOutput( + [{"type": "StartTag", "name": "pre", "data": []}, + {"type": "Characters", "data": spaceCharacters + "foo"}, + {"type": "EndTag", "name": "pre", "data": []}]) + + def testTrailingWhitespaceInPre(self): + self.runTestUnmodifiedOutput( + [{"type": "StartTag", "name": "pre", "data": []}, + {"type": "Characters", "data": "foo"}, + {"type": "SpaceCharacters", "data": spaceCharacters}, + {"type": "EndTag", "name": "pre", "data": []}]) + + def testTrailingWhitespaceAsCharactersInPre(self): + self.runTestUnmodifiedOutput( + [{"type": "StartTag", "name": "pre", "data": []}, + {"type": "Characters", "data": "foo" + spaceCharacters}, + {"type": "EndTag", "name": "pre", "data": []}]) + + def testWhitespaceInPre(self): + self.runTestUnmodifiedOutput( + [{"type": "StartTag", "name": "pre", "data": []}, + {"type": "Characters", "data": "foo" + spaceCharacters + "bar"}, + {"type": "EndTag", "name": "pre", "data": []}]) + + +def buildTestSuite(): + return unittest.defaultTestLoader.loadTestsFromName(__name__) + + +def main(): + buildTestSuite() + unittest.main() + +if __name__ == "__main__": + main() diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/AUTHORS.rst b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/AUTHORS.rst new file mode 100644 index 000000000..4a7de17ad --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/AUTHORS.rst @@ -0,0 +1,34 @@ +Credits +======= + +The ``html5lib`` test data is maintained by: + +- James Graham +- Geoffrey Sneddon + + +Contributors +------------ + +- Adam Barth +- Andi Sidwell +- Anne van Kesteren +- David Flanagan +- Edward Z. Yang +- Geoffrey Sneddon +- Henri Sivonen +- Ian Hickson +- Jacques Distler +- James Graham +- Lachlan Hunt +- lantis63 +- Mark Pilgrim +- Mats Palmgren +- Ms2ger +- Nolan Waite +- Philip Taylor +- Rafael Weinstein +- Ryan King +- Sam Ruby +- Simon Pieters +- Thomas Broyer diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/LICENSE b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/LICENSE new file mode 100644 index 000000000..8812371b4 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2006-2013 James Graham, Geoffrey Sneddon, and +other contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/chardet/test_big5.txt b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/chardet/test_big5.txt new file mode 100644 index 000000000..91074c98d --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/chardet/test_big5.txt @@ -0,0 +1,51 @@ +¦Ñ¤l¡m¹D¼w¸g¡n ²Ä¤@~¥|¤Q³¹ + +¦Ñ¤l¹D¸g + +²Ä¤@³¹ + +¹D¥i¹D¡A«D±`¹D¡C¦W¥i¦W¡A«D±`¦W¡CµL¡A¦W¤Ñ¦a¤§©l¡Q¦³¡A¦W¸Uª«¤§¥À¡C +¬G±`µL¡A±ý¥HÆ[¨ä§®¡F±`¦³¡A±ý¥HÆ[¨äéu¡C¦¹¨âªÌ¡A¦P¥X¦Ó²§¦W¡A¦P¿×¤§ +¥È¡C¥È¤§¤S¥È¡A²³§®¤§ªù¡C + +²Ä¤G³¹ + +¤Ñ¤U¬Òª¾¬ü¤§¬°¬ü¡A´µ´c¨o¡Q¬Òª¾µ½¤§¬°µ½¡A´µ¤£µ½¨o¡C¬G¦³µL¬Û¥Í¡AÃø +©ö¬Û¦¨¡Aªøµu¬Û§Î¡A°ª¤U¬Û¶É¡AµÁn¬Û©M¡A«e«á¬ÛÀH¡C¬O¥H¸t¤H³B¡uµL¬° +¡v¤§¨Æ¡A¦æ¡u¤£¨¥¡v¤§±Ð¡C¸Uª«§@²j¦Ó¤£Ãã¡A¥Í¦Ó¤£¦³¡A¬°¦Ó¤£«î¡A¥\¦¨ +¦Ó¥±©~¡C¤Ò°ß¥±©~¡A¬O¥H¤£¥h¡C + +²Ä¤T³¹ + +¤£©|½å¡A¨Ï¥Á¤£ª§¡Q¤£¶QÃø±o¤§³f¡A¨Ï¥Á¤£¬°µs¡Q¤£¨£¥i±ý¡A¨Ï¥Á¤ß¤£¶Ã +¡C¬O¥H¡u¸t¤H¡v¤§ªv¡Aµê¨ä¤ß¡A¹ê¨ä¸¡¡A®z¨ä§Ó¡A±j¨ä°©¡C±`¨Ï¥ÁµLª¾µL +±ý¡C¨Ï¤Ò´¼ªÌ¤£´±¬°¤]¡C¬°¡uµL¬°¡v¡A«hµL¤£ªv¡C + +²Ä¥|³¹ + +¡u¹D¡v¨R¡A¦Ó¥Î¤§©Î¤£¬Õ¡C²W¤¼¡A¦ü¸Uª«¤§©v¡Q®À¨ä¾U¡A¸Ñ¨ä¯É¡A©M¨ä¥ú +¡A¦P¨ä¹Ð¡Q´ï¤¼¦ü©Î¦s¡C§^¤£ª¾½Ö¤§¤l¡H¶H«Ò¤§¥ý¡C + +²Ä¤³¹ + +¤Ñ¦a¤£¤¯¡A¥H¸Uª«¬°¯ìª¯¡Q¸t¤H¤£¤¯¡A¥H¦Ê©m¬°¯ìª¯¡C¤Ñ¦a¤§¶¡¡A¨äµSéÑ +õþ¥G¡Hµê¦Ó¤£©}¡A°Ê¦Ó·U¥X¡C¦h¨¥¼Æ½a¡A¤£¦p¦u¤¤¡C + +²Ä¤»³¹ + +¨¦¯«¤£¦º¡A¬O¿×¥È¦É¡C¥È¦É¤§ªù¡A¬O¿×¤Ñ¦a®Ú¡CºøºøY¦s¡A¥Î¤§¤£¶Ô¡C + +²Ä¤C³¹ + +¤Ñªø¦a¤[¡C¤Ñ¦a©Ò¥H¯àªø¥B¤[ªÌ¡A¥H¨ä¤£¦Û¥Í¡A¬G¯àªø¤[¡C¬O¥H¸t¤H«á¨ä +¨¦Ó¨¥ý¡A¥~¨ä¨¦Ó¨¦s¡C«D¥H¨äµL¨p¨¸¡H¬G¯à¦¨¨ä¨p¡C + +²Ä¤K³¹ + +¤Wµ½Y¤ô¡C¤ôµ½§Q¸Uª«¦Ó¤£ª§¡C³B²³¤H¤§©Ò´c¡A¬G´X©ó¹D¡C©~µ½¦a¡A¤ßµ½ +²W¡A»Pµ½¤¯¡A¨¥µ½«H¡A¬Fµ½ªv¡A¨Æµ½¯à¡A°Êµ½®É¡C¤Ò°ß¤£ª§¡A¬GµL¤×¡C + +²Ä¤E³¹ + +«ù¦Ó¬Õ¤§¡A¤£¦p¨ä¤w¡Q´¢¦Ó¾U¤§¡A¤£¥iªø«O¡Cª÷¥Éº¡°ó¡A²ö¤§¯à¦u¡Q´I¶Q +¦Óź¡A¦Û¿ò¨ä©S¡C¥\¹E¨°h¡A¤Ñ¤§¹D¡C diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/test-yahoo-jp.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/test-yahoo-jp.dat new file mode 100644 index 000000000..3c25ecb2b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/test-yahoo-jp.dat @@ -0,0 +1,10 @@ +#data +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> +<!--京--> +<title>Yahoo! JAPAN</title> +<meta name="description" content="日本最大級ã®ãƒãƒ¼ã‚¿ãƒ«ã‚µã‚¤ãƒˆã€‚検索ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã€ãƒ¡ãƒ¼ãƒ«ã€ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã€ã‚·ãƒ§ãƒƒãƒ”ングã€ãªã©80以上ã®ã‚µãƒ¼ãƒ“スを展開。ã‚ãªãŸã®ç”Ÿæ´»ã‚’より豊ã‹ã«ã™ã‚‹ã€Œãƒ©ã‚¤ãƒ•・エンジンã€ã‚’目指ã—ã¦ã„ãã¾ã™ã€‚"> +<style type="text/css" media="all"> +#encoding +euc_jp diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/tests1.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/tests1.dat new file mode 100644 index 000000000..5b585e735 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/tests1.dat @@ -0,0 +1,394 @@ +#data +<!DOCTYPE HTML> +<!-- (control test - for the other tests to work, this should pass - you may have to set your defaults appropriately) --> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta charset="ISO-8859-1"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta charset='iso8859-2'> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta charset=iso8859-2> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta +charset=iso8859-2> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<metacharset=iso8859-2> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> +<!-- XXX this is a tough one, not sure how to do this one, unless we explictly do content= processing --> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta content="text/html; charset=iso8859-2" http-equiv="Content-Type"> +<!-- XXX this is a tough one, not sure how to do this one, unless we explictly do content= processing --> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta http-equiv="Content-Type" content=text/html; charset=iso8859-2> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta http-equiv="Content-Type content="text/html; charset=iso8859-2"> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta http-equiv="Content-Type " content="text/html; charset=iso8859-2"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta content="text/html; charset=iso8859-2" http-equiv="Content-Type "> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta http-equiv="Content-Type>" content="text/html; charset=iso8859-2"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta content="text/html; charset=iso8859-2" http-equiv="Content-Type>"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta http-equiv="Content-Style-Type" content="text/html; charset=iso8859-2"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta content="text/html; charset=iso8859-2" http-equiv="Content-Style-Type"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta name="Content-Style-Type" content="text/html; charset=iso8859-2"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta content="text/html; charset=iso8859-2" name="Content-Style-Type"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta content="text/html; charset=iso8859-2"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta content=" text/html; charset = iso8859-2 "> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta content=" +text/html; charset=iso8859-2 +" http-equiv="Content-Type"> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta charset=" +iso8859-2 +"> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta charset= +iso8859-2 +> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta charset="iso8859-2> +<p>"</p> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta charset=iso8859-2"> +<p>"</p> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta " charset=iso8859-2> +<p>"</p> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta test" charset=iso8859-2> +<p>"</p> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta test=" charset=iso8859-2> +<p>"</p> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta test="' charset=iso8859-2> +<p>"'</p> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta test='" charset=iso8859-2> +<p>'"</p> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta test="" charset=iso8859-2> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta test=x" charset=iso8859-2> +<p>"</p> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<head></head><p title="x> +<meta test=x" charset=iso8859-2> +<p>"</p> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<head></head><p title="x> +<meta test=x charset=iso8859-2> +<p>"</p> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<head></head><p title="x> +<meta charset=iso8859-2> +<p>"</p> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<head></head><p title="x>"> +<meta charset=iso8859-2> +<p>"</p> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta charset="ISO-8859-1"> +<meta charset="iso8859-2"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<meta charset="iso8859-2"> +<meta charset="ISO-8859-1"> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<!--<meta charset="ISO-8859-1">--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<!--<meta charset="iso8859-2">--> +<meta charset="ISO-8859-1"> +#encoding +Windows-1252 + +#data +<!DOCTYPE HTML> +<!-- Starts with UTF-8 BOM --> +#encoding +UTF-8 + +#data +<!DOCTYPE HTML> +<meta charset="ISO-8859-1"> +<!-- Starts with UTF-8 BOM --> +#encoding +UTF-8 + +#data +<!-- 511 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 512 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 1024 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 1025 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 2048 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 2049 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 4096 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 4097 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 8192 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- 8193 characters xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz--> +<meta charset="iso8859-2"> +#encoding +iso8859-2 + +#data +<!-- multi-script test --> +<script>alert('step 1 of 3 ("þ")')</script> +<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --> +<script>alert('step 2 of 3 ("þ")')</script> +<meta charset="iso8859-2"> +<script>alert('step 3 of 3 ("þ")')</script> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<script>document.write('<meta charset="ISO-8859-' + '2">')</script> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<script>document.write('<meta charset="iso8859-2">')</script> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<script type="text/plain"><meta charset="iso8859-2"></script> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<style type="text/plain"><meta charset="iso8859-2"></style> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<p><meta charset="iso8859-2"></p> +#encoding +iso8859-2 + +#data +<!DOCTYPE HTML> +<meta charset="bogus"> +<meta charset="iso8859-2"> +#encoding +iso8859-2 diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/tests2.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/tests2.dat new file mode 100644 index 000000000..eee44984d --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/encoding/tests2.dat @@ -0,0 +1,115 @@ +#data +<meta +#encoding +windows-1252 + +#data +< +#encoding +windows-1252 + +#data +<! +#encoding +windows-1252 + +#data +<meta charset = " +#encoding +windows-1252 + +#data +<meta charset=euc_jp +#encoding +windows-1252 + +#data +<meta <meta charset='euc_jp'> +#encoding +euc_jp + +#data +<meta charset = 'euc_jp'> +#encoding +euc_jp + +#data +<!-- --> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +#encoding +utf-8 + +#data +<!-- --> +<meta http-equiv="Content-Type" content="text/html; charset=utf +#encoding +windows-1252 + +#data +<meta http-equiv="Content-Type<meta charset="utf-8"> +#encoding +windows-1252 + +#data +<meta http-equiv="Content-Type" content="text/html; charset='utf-8'"> +#encoding +utf-8 + +#data +<meta http-equiv="Content-Type" content="text/html; charset='utf-8"> +#encoding +windows-1252 + +#data +<meta +#encoding +windows-1252 + +#data +<meta charset = +#encoding +windows-1252 + +#data +<meta charset= utf-8 +> +#encoding +utf-8 + +#data +<meta content = "text/html; +#encoding +windows-1252 + +#data +<meta charset="UTF-16"> +#encoding +utf-8 + +#data +<meta charset="UTF-16LE"> +#encoding +utf-8 + +#data +<meta charset="UTF-16BE"> +#encoding +utf-8 + +#data +<html a=ñ> +<meta charset="utf-8"> +#encoding +utf-8 + +#data +<html ñ> +<meta charset="utf-8"> +#encoding +utf-8 + +#data +<html>ñ +<meta charset="utf-8"> +#encoding +utf-8 diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/sanitizer/tests1.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/sanitizer/tests1.dat new file mode 100644 index 000000000..c741cb8c6 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/sanitizer/tests1.dat @@ -0,0 +1,501 @@ +[ + { + "name": "IE_Comments", + "input": "<!--[if gte IE 4]><script>alert('XSS');</script><![endif]-->", + "output": "" + }, + + { + "name": "IE_Comments_2", + "input": "<![if !IE 5]><script>alert('XSS');</script><![endif]>", + "output": "<script>alert('XSS');</script>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "allow_colons_in_path_component", + "input": "<a href=\"./this:that\">foo</a>", + "output": "<a href='./this:that'>foo</a>" + }, + + { + "name": "background_attribute", + "input": "<div background=\"javascript:alert('XSS')\"></div>", + "output": "<div/>", + "xhtml": "<div></div>", + "rexml": "<div></div>" + }, + + { + "name": "bgsound", + "input": "<bgsound src=\"javascript:alert('XSS');\" />", + "output": "<bgsound src=\"javascript:alert('XSS');\"/>", + "rexml": "<bgsound src=\"javascript:alert('XSS');\"></bgsound>" + }, + + { + "name": "div_background_image_unicode_encoded", + "input": "<div style=\"background-image:\u00a5\u00a2\u006C\u0028'\u006a\u0061\u00a6\u0061\u00a3\u0063\u00a2\u0069\u00a0\u00a4\u003a\u0061\u006c\u0065\u00a2\u00a4\u0028.1027\u0058.1053\u0053\u0027\u0029'\u0029\">foo</div>", + "output": "<div style=''>foo</div>" + }, + + { + "name": "div_expression", + "input": "<div style=\"width: expression(alert('XSS'));\">foo</div>", + "output": "<div style=''>foo</div>" + }, + + { + "name": "double_open_angle_brackets", + "input": "<img src=http://ha.ckers.org/scriptlet.html <", + "output": "<img src='http://ha.ckers.org/scriptlet.html'>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "double_open_angle_brackets_2", + "input": "<script src=http://ha.ckers.org/scriptlet.html <", + "output": "<script src=\"http://ha.ckers.org/scriptlet.html\" <=\"\">", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "grave_accents", + "input": "<img src=`javascript:alert('XSS')` />", + "output": "<img/>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "img_dynsrc_lowsrc", + "input": "<img dynsrc=\"javascript:alert('XSS')\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "img_vbscript", + "input": "<img src='vbscript:msgbox(\"XSS\")' />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "input_image", + "input": "<input type=\"image\" src=\"javascript:alert('XSS');\" />", + "output": "<input type='image'/>", + "rexml": "<input type='image' />" + }, + + { + "name": "link_stylesheets", + "input": "<link rel=\"stylesheet\" href=\"javascript:alert('XSS');\" />", + "output": "<link rel=\"stylesheet\" href=\"javascript:alert('XSS');\"/>", + "rexml": "<link href=\"javascript:alert('XSS');\" rel=\"stylesheet\"/>" + }, + + { + "name": "link_stylesheets_2", + "input": "<link rel=\"stylesheet\" href=\"http://ha.ckers.org/xss.css\" />", + "output": "<link rel=\"stylesheet\" href=\"http://ha.ckers.org/xss.css\"/>", + "rexml": "<link href=\"http://ha.ckers.org/xss.css\" rel=\"stylesheet\"/>" + }, + + { + "name": "list_style_image", + "input": "<li style=\"list-style-image: url(javascript:alert('XSS'))\">foo</li>", + "output": "<li style=''>foo</li>" + }, + + { + "name": "no_closing_script_tags", + "input": "<script src=http://ha.ckers.org/xss.js?<b>", + "output": "<script src=\"http://ha.ckers.org/xss.js?&lt;b\">", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "non_alpha_non_digit", + "input": "<script/XSS src=\"http://ha.ckers.org/xss.js\"></script>", + "output": "<script XSS=\"\" src=\"http://ha.ckers.org/xss.js\"></script>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "non_alpha_non_digit_2", + "input": "<a onclick!\\#$%&()*~+-_.,:;?@[/|\\]^`=alert(\"XSS\")>foo</a>", + "output": "<a>foo</a>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "non_alpha_non_digit_3", + "input": "<img/src=\"http://ha.ckers.org/xss.js\"/>", + "output": "<img src='http://ha.ckers.org/xss.js'/>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "non_alpha_non_digit_II", + "input": "<a href!\\#$%&()*~+-_.,:;?@[/|]^`=alert('XSS')>foo</a>", + "output": "<a>foo</a>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "non_alpha_non_digit_III", + "input": "<a/href=\"javascript:alert('XSS');\">foo</a>", + "output": "<a>foo</a>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "platypus", + "input": "<a href=\"http://www.ragingplatypus.com/\" style=\"display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:1; background-color:black; background-image:url(http://www.ragingplatypus.com/i/cam-full.jpg); background-x:center; background-y:center; background-repeat:repeat;\">never trust your upstream platypus</a>", + "output": "<a href='http://www.ragingplatypus.com/' style='display: block; width: 100%; height: 100%; background-color: black; background-x: center; background-y: center;'>never trust your upstream platypus</a>" + }, + + { + "name": "protocol_resolution_in_script_tag", + "input": "<script src=//ha.ckers.org/.j></script>", + "output": "<script src=\"//ha.ckers.org/.j\"></script>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_allow_anchors", + "input": "<a href='foo' onclick='bar'><script>baz</script></a>", + "output": "<a href='foo'><script>baz</script></a>" + }, + + { + "name": "should_allow_image_alt_attribute", + "input": "<img alt='foo' onclick='bar' />", + "output": "<img alt='foo'/>", + "rexml": "<img alt='foo' />" + }, + + { + "name": "should_allow_image_height_attribute", + "input": "<img height='foo' onclick='bar' />", + "output": "<img height='foo'/>", + "rexml": "<img height='foo' />" + }, + + { + "name": "should_allow_image_src_attribute", + "input": "<img src='foo' onclick='bar' />", + "output": "<img src='foo'/>", + "rexml": "<img src='foo' />" + }, + + { + "name": "should_allow_image_width_attribute", + "input": "<img width='foo' onclick='bar' />", + "output": "<img width='foo'/>", + "rexml": "<img width='foo' />" + }, + + { + "name": "should_handle_blank_text", + "input": "", + "output": "" + }, + + { + "name": "should_handle_malformed_image_tags", + "input": "<img \"\"\"><script>alert(\"XSS\")</script>\">", + "output": "<img/><script>alert(\"XSS\")</script>\">", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_handle_non_html", + "input": "abc", + "output": "abc" + }, + + { + "name": "should_not_fall_for_ridiculous_hack", + "input": "<img\nsrc\n=\n\"\nj\na\nv\na\ns\nc\nr\ni\np\nt\n:\na\nl\ne\nr\nt\n(\n'\nX\nS\nS\n'\n)\n\"\n />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_0", + "input": "<img src=\"javascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_1", + "input": "<img src=javascript:alert('XSS') />", + "output": "<img/>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_not_fall_for_xss_image_hack_10", + "input": "<img src=\"jav
ascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_11", + "input": "<img src=\"jav
ascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_12", + "input": "<img src=\"  javascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_13", + "input": "<img src=\" javascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_14", + "input": "<img src=\" javascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_2", + "input": "<img src=\"JaVaScRiPt:alert('XSS')\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_3", + "input": "<img src='javascript:alert("XSS")' />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_4", + "input": "<img src='javascript:alert(String.fromCharCode(88,83,83))' />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_5", + "input": "<img src='javascript:alert('XSS')' />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_6", + "input": "<img src='javascript:alert('XSS')' />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_7", + "input": "<img src='javascript:alert('XSS')' />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_8", + "input": "<img src=\"jav\tascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_not_fall_for_xss_image_hack_9", + "input": "<img src=\"jav	ascript:alert('XSS');\" />", + "output": "<img/>", + "rexml": "<img />" + }, + + { + "name": "should_sanitize_half_open_scripts", + "input": "<img src=\"javascript:alert('XSS')\"", + "output": "<img/>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_sanitize_invalid_script_tag", + "input": "<script/XSS SRC=\"http://ha.ckers.org/xss.js\"></script>", + "output": "<script XSS=\"\" SRC=\"http://ha.ckers.org/xss.js\"></script>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_sanitize_script_tag_with_multiple_open_brackets", + "input": "<<script>alert(\"XSS\");//<</script>", + "output": "<<script>alert(\"XSS\");//<</script>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_sanitize_script_tag_with_multiple_open_brackets_2", + "input": "<iframe src=http://ha.ckers.org/scriptlet.html\n<", + "output": "<iframe src=\"http://ha.ckers.org/scriptlet.html\" <=\"\">", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_sanitize_tag_broken_up_by_null", + "input": "<scr\u0000ipt>alert(\"XSS\")</scr\u0000ipt>", + "output": "<scr\ufffdipt>alert(\"XSS\")</scr\ufffdipt>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_sanitize_unclosed_script", + "input": "<script src=http://ha.ckers.org/xss.js?<b>", + "output": "<script src=\"http://ha.ckers.org/xss.js?&lt;b\">", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "should_strip_href_attribute_in_a_with_bad_protocols", + "input": "<a href=\"javascript:XSS\" title=\"1\">boo</a>", + "output": "<a title='1'>boo</a>" + }, + + { + "name": "should_strip_href_attribute_in_a_with_bad_protocols_and_whitespace", + "input": "<a href=\" javascript:XSS\" title=\"1\">boo</a>", + "output": "<a title='1'>boo</a>" + }, + + { + "name": "should_strip_src_attribute_in_img_with_bad_protocols", + "input": "<img src=\"javascript:XSS\" title=\"1\">boo</img>", + "output": "<img title='1'/>boo", + "rexml": "<img title='1' />" + }, + + { + "name": "should_strip_src_attribute_in_img_with_bad_protocols_and_whitespace", + "input": "<img src=\" javascript:XSS\" title=\"1\">boo</img>", + "output": "<img title='1'/>boo", + "rexml": "<img title='1' />" + }, + + { + "name": "xml_base", + "input": "<div xml:base=\"javascript:alert('XSS');//\">foo</div>", + "output": "<div>foo</div>" + }, + + { + "name": "xul", + "input": "<p style=\"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\">fubar</p>", + "output": "<p style=''>fubar</p>" + }, + + { + "name": "quotes_in_attributes", + "input": "<img src='foo' title='\"foo\" bar' />", + "rexml": "<img src='foo' title='\"foo\" bar' />", + "output": "<img title='"foo" bar' src='foo'/>" + }, + + { + "name": "uri_refs_in_svg_attributes", + "input": "<rect fill='url(#foo)' />", + "rexml": "<rect fill='url(#foo)'></rect>", + "xhtml": "<rect fill='url(#foo)'></rect>", + "output": "<rect fill='url(#foo)'/>" + }, + + { + "name": "absolute_uri_refs_in_svg_attributes", + "input": "<rect fill='url(http://bad.com/) #fff' />", + "rexml": "<rect fill=' #fff'></rect>", + "xhtml": "<rect fill=' #fff'></rect>", + "output": "<rect fill=' #fff'/>" + }, + + { + "name": "uri_ref_with_space_in svg_attribute", + "input": "<rect fill='url(\n#foo)' />", + "rexml": "<rect fill='url(\n#foo)'></rect>", + "xhtml": "<rect fill='url(\n#foo)'></rect>", + "output": "<rect fill='url(\n#foo)'/>" + }, + + { + "name": "absolute_uri_ref_with_space_in svg_attribute", + "input": "<rect fill=\"url(\nhttp://bad.com/)\" />", + "rexml": "<rect fill=' '></rect>", + "xhtml": "<rect fill=' '></rect>", + "output": "<rect fill=' '/>" + }, + + { + "name": "allow_html5_image_tag", + "input": "<image src='foo' />", + "rexml": "<image src=\"foo\"></image>", + "output": "<image src=\"foo\"/>" + }, + + { + "name": "style_attr_end_with_nothing", + "input": "<div style=\"color: blue\" />", + "output": "<div style='color: blue;'/>", + "xhtml": "<div style='color: blue;'></div>", + "rexml": "<div style='color: blue;'></div>" + }, + + { + "name": "style_attr_end_with_space", + "input": "<div style=\"color: blue \" />", + "output": "<div style='color: blue ;'/>", + "xhtml": "<div style='color: blue ;'></div>", + "rexml": "<div style='color: blue ;'></div>" + }, + + { + "name": "style_attr_end_with_semicolon", + "input": "<div style=\"color: blue;\" />", + "output": "<div style='color: blue;'/>", + "xhtml": "<div style='color: blue;'></div>", + "rexml": "<div style='color: blue;'></div>" + }, + + { + "name": "style_attr_end_with_semicolon_space", + "input": "<div style=\"color: blue; \" />", + "output": "<div style='color: blue;'/>", + "xhtml": "<div style='color: blue;'></div>", + "rexml": "<div style='color: blue;'></div>" + }, + + { + "name": "attributes_with_embedded_quotes", + "input": "<img src=doesntexist.jpg\"'onerror=\"alert(1) />", + "output": "<img src='doesntexist.jpg"'onerror="alert(1)'/>", + "rexml": "Ill-formed XHTML!" + }, + + { + "name": "attributes_with_embedded_quotes_II", + "input": "<img src=notthere.jpg\"\"onerror=\"alert(2) />", + "output": "<img src='notthere.jpg""onerror="alert(2)'/>", + "rexml": "Ill-formed XHTML!" + } +] diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/core.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/core.test new file mode 100644 index 000000000..c0b4222d2 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/core.test @@ -0,0 +1,125 @@ +{"tests": [
+
+{"description": "proper attribute value escaping",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "test \"with\" ""}]]],
+ "expected": ["<span title='test \"with\" &quot;'>"]
+},
+
+{"description": "proper attribute value non-quoting",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"}]]],
+ "expected": ["<span title=foo>"],
+ "xhtml": ["<span title=\"foo\">"]
+},
+
+{"description": "proper attribute value non-quoting (with <)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo<bar"}]]],
+ "expected": ["<span title=foo<bar>"],
+ "xhtml": ["<span title=\"foo<bar\">"]
+},
+
+{"description": "proper attribute value quoting (with =)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo=bar"}]]],
+ "expected": ["<span title=\"foo=bar\">"]
+},
+
+{"description": "proper attribute value quoting (with >)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo>bar"}]]],
+ "expected": ["<span title=\"foo>bar\">"]
+},
+
+{"description": "proper attribute value quoting (with \")",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\"bar"}]]],
+ "expected": ["<span title='foo\"bar'>"]
+},
+
+{"description": "proper attribute value quoting (with ')",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar"}]]],
+ "expected": ["<span title=\"foo'bar\">"]
+},
+
+{"description": "proper attribute value quoting (with both \" and ')",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar\"baz"}]]],
+ "expected": ["<span title=\"foo'bar"baz\">"]
+},
+
+{"description": "proper attribute value quoting (with space)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo bar"}]]],
+ "expected": ["<span title=\"foo bar\">"]
+},
+
+{"description": "proper attribute value quoting (with tab)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\tbar"}]]],
+ "expected": ["<span title=\"foo\tbar\">"]
+},
+
+{"description": "proper attribute value quoting (with LF)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\nbar"}]]],
+ "expected": ["<span title=\"foo\nbar\">"]
+},
+
+{"description": "proper attribute value quoting (with CR)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\rbar"}]]],
+ "expected": ["<span title=\"foo\rbar\">"]
+},
+
+{"description": "proper attribute value non-quoting (with linetab)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\u000Bbar"}]]],
+ "expected": ["<span title=foo\u000Bbar>"],
+ "xhtml": ["<span title=\"foo\u000Bbar\">"]
+},
+
+{"description": "proper attribute value quoting (with form feed)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\u000Cbar"}]]],
+ "expected": ["<span title=\"foo\u000Cbar\">"]
+},
+
+{"description": "void element (as EmptyTag token)",
+ "input": [["EmptyTag", "img", {}]],
+ "expected": ["<img>"],
+ "xhtml": ["<img />"]
+},
+
+{"description": "void element (as StartTag token)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "img", {}]],
+ "expected": ["<img>"],
+ "xhtml": ["<img />"]
+},
+
+{"description": "doctype in error",
+ "input": [["Doctype", "foo"]],
+ "expected": ["<!DOCTYPE foo>"]
+},
+
+{"description": "character data",
+ "options": {"encoding":"utf-8"},
+ "input": [["Characters", "a<b>c&d"]],
+ "expected": ["a<b>c&d"]
+},
+
+{"description": "rcdata",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "script", {}], ["Characters", "a<b>c&d"]],
+ "expected": ["<script>a<b>c&d"],
+ "xhtml": ["<script>a<b>c&d"]
+},
+
+{"description": "doctype",
+ "input": [["Doctype", "HTML"]],
+ "expected": ["<!DOCTYPE HTML>"]
+},
+
+{"description": "HTML 4.01 DOCTYPE",
+ "input": [["Doctype", "HTML", "-//W3C//DTD HTML 4.01//EN", "http://www.w3.org/TR/html4/strict.dtd"]],
+ "expected": ["<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">"]
+},
+
+{"description": "HTML 4.01 DOCTYPE without system identifer",
+ "input": [["Doctype", "HTML", "-//W3C//DTD HTML 4.01//EN"]],
+ "expected": ["<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">"]
+},
+
+{"description": "IBM DOCTYPE without public identifer",
+ "input": [["Doctype", "html", "", "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"]],
+ "expected": ["<!DOCTYPE html SYSTEM \"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd\">"]
+}
+
+]}
diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/injectmeta.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/injectmeta.test new file mode 100644 index 000000000..feaaa44f8 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/injectmeta.test @@ -0,0 +1,66 @@ +{"tests": [
+
+{"description": "no encoding",
+ "options": {"inject_meta_charset": true},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": [""],
+ "xhtml": ["<head></head>"]
+},
+
+{"description": "empytag head",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta charset=utf-8>"],
+ "xhtml": ["<head><meta charset=\"utf-8\" /></head>"]
+},
+
+{"description": "head w/title",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["StartTag", "http://www.w3.org/1999/xhtml","title",{}], ["Characters", "foo"],["EndTag", "http://www.w3.org/1999/xhtml", "title"], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta charset=utf-8><title>foo</title>"],
+ "xhtml": ["<head><meta charset=\"utf-8\" /><title>foo</title></head>"]
+},
+
+{"description": "head w/meta-charset",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EmptyTag","meta",[{"namespace": null, "name": "charset", "value": "ascii"}]], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta charset=utf-8>"],
+ "xhtml": ["<head><meta charset=\"utf-8\" /></head>"]
+},
+
+{"description": "head w/ two meta-charset",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EmptyTag","meta",[{"namespace": null, "name": "charset", "value": "ascii"}]], ["EmptyTag","meta",[{"namespace": null, "name": "charset", "value": "ascii"}]], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta charset=utf-8><meta charset=utf-8>", "<head><meta charset=utf-8><meta charset=ascii>"],
+ "xhtml": ["<head><meta charset=\"utf-8\" /><meta charset=\"utf-8\" /></head>", "<head><meta charset=\"utf-8\" /><meta charset=\"ascii\" /></head>"]
+},
+
+{"description": "head w/robots",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EmptyTag","meta",[{"namespace": null, "name": "name", "value": "robots"},{"namespace": null, "name": "content", "value": "noindex"}]], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta charset=utf-8><meta content=noindex name=robots>"],
+ "xhtml": ["<head><meta charset=\"utf-8\" /><meta content=\"noindex\" name=\"robots\" /></head>"]
+},
+
+{"description": "head w/robots & charset",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EmptyTag","meta",[{"namespace": null, "name": "name", "value": "robots"},{"namespace": null, "name": "content", "value": "noindex"}]], ["EmptyTag","meta",[{"namespace": null, "name": "charset", "value": "ascii"}]], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta content=noindex name=robots><meta charset=utf-8>"],
+ "xhtml": ["<head><meta content=\"noindex\" name=\"robots\" /><meta charset=\"utf-8\" /></head>"]
+},
+
+{"description": "head w/ charset in http-equiv content-type",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EmptyTag","meta",[{"namespace": null, "name": "http-equiv", "value": "content-type"}, {"namespace": null, "name": "content", "value": "text/html; charset=ascii"}]], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta content=\"text/html; charset=utf-8\" http-equiv=content-type>"],
+ "xhtml": ["<head><meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\" /></head>"]
+},
+
+{"description": "head w/robots & charset in http-equiv content-type",
+ "options": {"inject_meta_charset": true, "encoding":"utf-8"},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EmptyTag","meta",[{"namespace": null, "name": "name", "value": "robots"},{"namespace": null, "name": "content", "value": "noindex"}]], ["EmptyTag","meta",[{"namespace": null, "name": "http-equiv", "value": "content-type"}, {"namespace": null, "name": "content", "value": "text/html; charset=ascii"}]], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": ["<meta content=noindex name=robots><meta content=\"text/html; charset=utf-8\" http-equiv=content-type>"],
+ "xhtml": ["<head><meta content=\"noindex\" name=\"robots\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\" /></head>"]
+}
+
+]}
diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/optionaltags.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/optionaltags.test new file mode 100644 index 000000000..80a5edf89 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/optionaltags.test @@ -0,0 +1,965 @@ +{"tests": [
+
+{"description": "html start-tag followed by text, with attributes",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "html", [{"namespace": null, "name": "lang", "value": "en"}]], ["Characters", "foo"]],
+ "expected": ["<html lang=en>foo"]
+},
+
+
+
+{"description": "html start-tag followed by comment",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "html", {}], ["Comment", "foo"]],
+ "expected": ["<html><!--foo-->"]
+},
+
+{"description": "html start-tag followed by space character",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "html", {}], ["Characters", " foo"]],
+ "expected": ["<html> foo"]
+},
+
+{"description": "html start-tag followed by text",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "html", {}], ["Characters", "foo"]],
+ "expected": ["foo"]
+},
+
+{"description": "html start-tag followed by start-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "html", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "html start-tag followed by end-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "html", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "html start-tag at EOF (shouldn't ever happen?!)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "html", {}]],
+ "expected": [""]
+},
+
+
+
+{"description": "html end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "html"], ["Comment", "foo"]],
+ "expected": ["</html><!--foo-->"]
+},
+
+{"description": "html end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "html"], ["Characters", " foo"]],
+ "expected": ["</html> foo"]
+},
+
+{"description": "html end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "html"], ["Characters", "foo"]],
+ "expected": ["foo"]
+},
+
+{"description": "html end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "html"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "html end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "html"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "html end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "html"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "head start-tag followed by comment",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["Comment", "foo"]],
+ "expected": ["<head><!--foo-->"]
+},
+
+{"description": "head start-tag followed by space character",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["Characters", " foo"]],
+ "expected": ["<head> foo"]
+},
+
+{"description": "head start-tag followed by text",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["Characters", "foo"]],
+ "expected": ["<head>foo"]
+},
+
+{"description": "head start-tag followed by start-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "head start-tag followed by end-tag (shouldn't ever happen?!)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["<head></foo>", "</foo>"]
+},
+
+{"description": "empty head element",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": [""]
+},
+
+{"description": "head start-tag followed by empty-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}], ["EmptyTag", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "head start-tag at EOF (shouldn't ever happen?!)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "head", {}]],
+ "expected": ["<head>", ""]
+},
+
+
+
+{"description": "head end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "head"], ["Comment", "foo"]],
+ "expected": ["</head><!--foo-->"]
+},
+
+{"description": "head end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "head"], ["Characters", " foo"]],
+ "expected": ["</head> foo"]
+},
+
+{"description": "head end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "head"], ["Characters", "foo"]],
+ "expected": ["foo"]
+},
+
+{"description": "head end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "head"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "head end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "head"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "head end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "head"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "body start-tag followed by comment",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "body", {}], ["Comment", "foo"]],
+ "expected": ["<body><!--foo-->"]
+},
+
+{"description": "body start-tag followed by space character",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "body", {}], ["Characters", " foo"]],
+ "expected": ["<body> foo"]
+},
+
+{"description": "body start-tag followed by text",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "body", {}], ["Characters", "foo"]],
+ "expected": ["foo"]
+},
+
+{"description": "body start-tag followed by start-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "body", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "body start-tag followed by end-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "body", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "body start-tag at EOF (shouldn't ever happen?!)",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "body", {}]],
+ "expected": [""]
+},
+
+
+
+{"description": "body end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "body"], ["Comment", "foo"]],
+ "expected": ["</body><!--foo-->"]
+},
+
+{"description": "body end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "body"], ["Characters", " foo"]],
+ "expected": ["</body> foo"]
+},
+
+{"description": "body end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "body"], ["Characters", "foo"]],
+ "expected": ["foo"]
+},
+
+{"description": "body end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "body"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "body end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "body"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "body end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "body"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "li end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "li"], ["Comment", "foo"]],
+ "expected": ["</li><!--foo-->"]
+},
+
+{"description": "li end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "li"], ["Characters", " foo"]],
+ "expected": ["</li> foo"]
+},
+
+{"description": "li end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "li"], ["Characters", "foo"]],
+ "expected": ["</li>foo"]
+},
+
+{"description": "li end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "li"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</li><foo>"]
+},
+
+{"description": "li end-tag followed by li start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "li"], ["StartTag", "http://www.w3.org/1999/xhtml", "li", {}]],
+ "expected": ["<li>"]
+},
+
+{"description": "li end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "li"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "li end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "li"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "dt end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"], ["Comment", "foo"]],
+ "expected": ["</dt><!--foo-->"]
+},
+
+{"description": "dt end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"], ["Characters", " foo"]],
+ "expected": ["</dt> foo"]
+},
+
+{"description": "dt end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"], ["Characters", "foo"]],
+ "expected": ["</dt>foo"]
+},
+
+{"description": "dt end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</dt><foo>"]
+},
+
+{"description": "dt end-tag followed by dt start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"], ["StartTag", "http://www.w3.org/1999/xhtml", "dt", {}]],
+ "expected": ["<dt>"]
+},
+
+{"description": "dt end-tag followed by dd start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"], ["StartTag", "http://www.w3.org/1999/xhtml", "dd", {}]],
+ "expected": ["<dd>"]
+},
+
+{"description": "dt end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</dt></foo>"]
+},
+
+{"description": "dt end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dt"]],
+ "expected": ["</dt>"]
+},
+
+
+
+
+{"description": "dd end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"], ["Comment", "foo"]],
+ "expected": ["</dd><!--foo-->"]
+},
+
+{"description": "dd end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"], ["Characters", " foo"]],
+ "expected": ["</dd> foo"]
+},
+
+{"description": "dd end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"], ["Characters", "foo"]],
+ "expected": ["</dd>foo"]
+},
+
+{"description": "dd end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</dd><foo>"]
+},
+
+{"description": "dd end-tag followed by dd start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"], ["StartTag", "http://www.w3.org/1999/xhtml", "dd", {}]],
+ "expected": ["<dd>"]
+},
+
+{"description": "dd end-tag followed by dt start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"], ["StartTag", "http://www.w3.org/1999/xhtml", "dt", {}]],
+ "expected": ["<dt>"]
+},
+
+{"description": "dd end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "dd end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "dd"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "p end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["Comment", "foo"]],
+ "expected": ["</p><!--foo-->"]
+},
+
+{"description": "p end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["Characters", " foo"]],
+ "expected": ["</p> foo"]
+},
+
+{"description": "p end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["Characters", "foo"]],
+ "expected": ["</p>foo"]
+},
+
+{"description": "p end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</p><foo>"]
+},
+
+{"description": "p end-tag followed by address start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "address", {}]],
+ "expected": ["<address>"]
+},
+
+{"description": "p end-tag followed by article start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "article", {}]],
+ "expected": ["<article>"]
+},
+
+{"description": "p end-tag followed by aside start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "aside", {}]],
+ "expected": ["<aside>"]
+},
+
+{"description": "p end-tag followed by blockquote start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "blockquote", {}]],
+ "expected": ["<blockquote>"]
+},
+
+{"description": "p end-tag followed by datagrid start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "datagrid", {}]],
+ "expected": ["<datagrid>"]
+},
+
+{"description": "p end-tag followed by dialog start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "dialog", {}]],
+ "expected": ["<dialog>"]
+},
+
+{"description": "p end-tag followed by dir start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "dir", {}]],
+ "expected": ["<dir>"]
+},
+
+{"description": "p end-tag followed by div start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "div", {}]],
+ "expected": ["<div>"]
+},
+
+{"description": "p end-tag followed by dl start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "dl", {}]],
+ "expected": ["<dl>"]
+},
+
+{"description": "p end-tag followed by fieldset start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "fieldset", {}]],
+ "expected": ["<fieldset>"]
+},
+
+{"description": "p end-tag followed by footer start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "footer", {}]],
+ "expected": ["<footer>"]
+},
+
+{"description": "p end-tag followed by form start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "form", {}]],
+ "expected": ["<form>"]
+},
+
+{"description": "p end-tag followed by h1 start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "h1", {}]],
+ "expected": ["<h1>"]
+},
+
+{"description": "p end-tag followed by h2 start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "h2", {}]],
+ "expected": ["<h2>"]
+},
+
+{"description": "p end-tag followed by h3 start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "h3", {}]],
+ "expected": ["<h3>"]
+},
+
+{"description": "p end-tag followed by h4 start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "h4", {}]],
+ "expected": ["<h4>"]
+},
+
+{"description": "p end-tag followed by h5 start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "h5", {}]],
+ "expected": ["<h5>"]
+},
+
+{"description": "p end-tag followed by h6 start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "h6", {}]],
+ "expected": ["<h6>"]
+},
+
+{"description": "p end-tag followed by header start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "header", {}]],
+ "expected": ["<header>"]
+},
+
+{"description": "p end-tag followed by hr empty-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["EmptyTag", "hr", {}]],
+ "expected": ["<hr>"]
+},
+
+{"description": "p end-tag followed by menu start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "menu", {}]],
+ "expected": ["<menu>"]
+},
+
+{"description": "p end-tag followed by nav start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "nav", {}]],
+ "expected": ["<nav>"]
+},
+
+{"description": "p end-tag followed by ol start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "ol", {}]],
+ "expected": ["<ol>"]
+},
+
+{"description": "p end-tag followed by p start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "p", {}]],
+ "expected": ["<p>"]
+},
+
+{"description": "p end-tag followed by pre start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "pre", {}]],
+ "expected": ["<pre>"]
+},
+
+{"description": "p end-tag followed by section start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "section", {}]],
+ "expected": ["<section>"]
+},
+
+{"description": "p end-tag followed by table start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "table", {}]],
+ "expected": ["<table>"]
+},
+
+{"description": "p end-tag followed by ul start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["StartTag", "http://www.w3.org/1999/xhtml", "ul", {}]],
+ "expected": ["<ul>"]
+},
+
+{"description": "p end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "p end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "p"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "optgroup end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "optgroup"], ["Comment", "foo"]],
+ "expected": ["</optgroup><!--foo-->"]
+},
+
+{"description": "optgroup end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "optgroup"], ["Characters", " foo"]],
+ "expected": ["</optgroup> foo"]
+},
+
+{"description": "optgroup end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "optgroup"], ["Characters", "foo"]],
+ "expected": ["</optgroup>foo"]
+},
+
+{"description": "optgroup end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "optgroup"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</optgroup><foo>"]
+},
+
+{"description": "optgroup end-tag followed by optgroup start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "optgroup"], ["StartTag", "http://www.w3.org/1999/xhtml", "optgroup", {}]],
+ "expected": ["<optgroup>"]
+},
+
+{"description": "optgroup end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "optgroup"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "optgroup end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "optgroup"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "option end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"], ["Comment", "foo"]],
+ "expected": ["</option><!--foo-->"]
+},
+
+{"description": "option end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"], ["Characters", " foo"]],
+ "expected": ["</option> foo"]
+},
+
+{"description": "option end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"], ["Characters", "foo"]],
+ "expected": ["</option>foo"]
+},
+
+{"description": "option end-tag followed by optgroup start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"], ["StartTag", "http://www.w3.org/1999/xhtml", "optgroup", {}]],
+ "expected": ["<optgroup>"]
+},
+
+{"description": "option end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</option><foo>"]
+},
+
+{"description": "option end-tag followed by option start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"], ["StartTag", "http://www.w3.org/1999/xhtml", "option", {}]],
+ "expected": ["<option>"]
+},
+
+{"description": "option end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "option end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "option"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "colgroup start-tag followed by comment",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}], ["Comment", "foo"]],
+ "expected": ["<colgroup><!--foo-->"]
+},
+
+{"description": "colgroup start-tag followed by space character",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}], ["Characters", " foo"]],
+ "expected": ["<colgroup> foo"]
+},
+
+{"description": "colgroup start-tag followed by text",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}], ["Characters", "foo"]],
+ "expected": ["<colgroup>foo"]
+},
+
+{"description": "colgroup start-tag followed by start-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<colgroup><foo>"]
+},
+
+{"description": "first colgroup in a table with a col child",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "table", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}], ["EmptyTag", "col", {}]],
+ "expected": ["<table><col>"]
+},
+
+{"description": "colgroup with a col child, following another colgroup",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "colgroup"], ["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "col", {}]],
+ "expected": ["</colgroup><col>", "<colgroup><col>"]
+},
+
+{"description": "colgroup start-tag followed by end-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["<colgroup></foo>"]
+},
+
+{"description": "colgroup start-tag at EOF",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "colgroup", {}]],
+ "expected": ["<colgroup>"]
+},
+
+
+
+{"description": "colgroup end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "colgroup"], ["Comment", "foo"]],
+ "expected": ["</colgroup><!--foo-->"]
+},
+
+{"description": "colgroup end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "colgroup"], ["Characters", " foo"]],
+ "expected": ["</colgroup> foo"]
+},
+
+{"description": "colgroup end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "colgroup"], ["Characters", "foo"]],
+ "expected": ["foo"]
+},
+
+{"description": "colgroup end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "colgroup"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<foo>"]
+},
+
+{"description": "colgroup end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "colgroup"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "colgroup end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "colgroup"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "thead end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["Comment", "foo"]],
+ "expected": ["</thead><!--foo-->"]
+},
+
+{"description": "thead end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["Characters", " foo"]],
+ "expected": ["</thead> foo"]
+},
+
+{"description": "thead end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["Characters", "foo"]],
+ "expected": ["</thead>foo"]
+},
+
+{"description": "thead end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</thead><foo>"]
+},
+
+{"description": "thead end-tag followed by tbody start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}]],
+ "expected": ["<tbody>"]
+},
+
+{"description": "thead end-tag followed by tfoot start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["StartTag", "http://www.w3.org/1999/xhtml", "tfoot", {}]],
+ "expected": ["<tfoot>"]
+},
+
+{"description": "thead end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</thead></foo>"]
+},
+
+{"description": "thead end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"]],
+ "expected": ["</thead>"]
+},
+
+
+
+
+{"description": "tbody start-tag followed by comment",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["Comment", "foo"]],
+ "expected": ["<tbody><!--foo-->"]
+},
+
+{"description": "tbody start-tag followed by space character",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["Characters", " foo"]],
+ "expected": ["<tbody> foo"]
+},
+
+{"description": "tbody start-tag followed by text",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["Characters", "foo"]],
+ "expected": ["<tbody>foo"]
+},
+
+{"description": "tbody start-tag followed by start-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["<tbody><foo>"]
+},
+
+{"description": "first tbody in a table with a tr child",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "table", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "tr", {}]],
+ "expected": ["<table><tr>"]
+},
+
+{"description": "tbody with a tr child, following another tbody",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "tr", {}]],
+ "expected": ["<tbody><tr>", "</tbody><tr>"]
+},
+
+{"description": "tbody with a tr child, following a thead",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "thead"], ["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "tr", {}]],
+ "expected": ["<tbody><tr>", "</thead><tr>"]
+},
+
+{"description": "tbody with a tr child, following a tfoot",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"], ["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["StartTag", "http://www.w3.org/1999/xhtml", "tr", {}]],
+ "expected": ["<tbody><tr>", "</tfoot><tr>"]
+},
+
+{"description": "tbody start-tag followed by end-tag",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["<tbody></foo>"]
+},
+
+{"description": "tbody start-tag at EOF",
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}]],
+ "expected": ["<tbody>"]
+},
+
+
+
+{"description": "tbody end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["Comment", "foo"]],
+ "expected": ["</tbody><!--foo-->"]
+},
+
+{"description": "tbody end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["Characters", " foo"]],
+ "expected": ["</tbody> foo"]
+},
+
+{"description": "tbody end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["Characters", "foo"]],
+ "expected": ["</tbody>foo"]
+},
+
+{"description": "tbody end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</tbody><foo>"]
+},
+
+{"description": "tbody end-tag followed by tbody start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}]],
+ "expected": ["<tbody>", "</tbody>"]
+},
+
+{"description": "tbody end-tag followed by tfoot start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["StartTag", "http://www.w3.org/1999/xhtml", "tfoot", {}]],
+ "expected": ["<tfoot>"]
+},
+
+{"description": "tbody end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "tbody end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tbody"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "tfoot end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"], ["Comment", "foo"]],
+ "expected": ["</tfoot><!--foo-->"]
+},
+
+{"description": "tfoot end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"], ["Characters", " foo"]],
+ "expected": ["</tfoot> foo"]
+},
+
+{"description": "tfoot end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"], ["Characters", "foo"]],
+ "expected": ["</tfoot>foo"]
+},
+
+{"description": "tfoot end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</tfoot><foo>"]
+},
+
+{"description": "tfoot end-tag followed by tbody start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"], ["StartTag", "http://www.w3.org/1999/xhtml", "tbody", {}]],
+ "expected": ["<tbody>", "</tfoot>"]
+},
+
+{"description": "tfoot end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "tfoot end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tfoot"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "tr end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tr"], ["Comment", "foo"]],
+ "expected": ["</tr><!--foo-->"]
+},
+
+{"description": "tr end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tr"], ["Characters", " foo"]],
+ "expected": ["</tr> foo"]
+},
+
+{"description": "tr end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tr"], ["Characters", "foo"]],
+ "expected": ["</tr>foo"]
+},
+
+{"description": "tr end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tr"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</tr><foo>"]
+},
+
+{"description": "tr end-tag followed by tr start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tr"], ["StartTag", "http://www.w3.org/1999/xhtml", "tr", {}]],
+ "expected": ["<tr>", "</tr>"]
+},
+
+{"description": "tr end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tr"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "tr end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "tr"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "td end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"], ["Comment", "foo"]],
+ "expected": ["</td><!--foo-->"]
+},
+
+{"description": "td end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"], ["Characters", " foo"]],
+ "expected": ["</td> foo"]
+},
+
+{"description": "td end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"], ["Characters", "foo"]],
+ "expected": ["</td>foo"]
+},
+
+{"description": "td end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</td><foo>"]
+},
+
+{"description": "td end-tag followed by td start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"], ["StartTag", "http://www.w3.org/1999/xhtml", "td", {}]],
+ "expected": ["<td>", "</td>"]
+},
+
+{"description": "td end-tag followed by th start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"], ["StartTag", "http://www.w3.org/1999/xhtml", "th", {}]],
+ "expected": ["<th>", "</td>"]
+},
+
+{"description": "td end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "td end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "td"]],
+ "expected": [""]
+},
+
+
+
+
+{"description": "th end-tag followed by comment",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "th"], ["Comment", "foo"]],
+ "expected": ["</th><!--foo-->"]
+},
+
+{"description": "th end-tag followed by space character",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "th"], ["Characters", " foo"]],
+ "expected": ["</th> foo"]
+},
+
+{"description": "th end-tag followed by text",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "th"], ["Characters", "foo"]],
+ "expected": ["</th>foo"]
+},
+
+{"description": "th end-tag followed by start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "th"], ["StartTag", "http://www.w3.org/1999/xhtml", "foo", {}]],
+ "expected": ["</th><foo>"]
+},
+
+{"description": "th end-tag followed by th start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "th"], ["StartTag", "http://www.w3.org/1999/xhtml", "th", {}]],
+ "expected": ["<th>", "</th>"]
+},
+
+{"description": "th end-tag followed by td start-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "th"], ["StartTag", "http://www.w3.org/1999/xhtml", "td", {}]],
+ "expected": ["<td>", "</th>"]
+},
+
+{"description": "th end-tag followed by end-tag",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml", "th"], ["EndTag", "http://www.w3.org/1999/xhtml", "foo"]],
+ "expected": ["</foo>"]
+},
+
+{"description": "th end-tag at EOF",
+ "input": [["EndTag", "http://www.w3.org/1999/xhtml" , "th"]],
+ "expected": [""]
+}
+
+]}
diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/options.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/options.test new file mode 100644 index 000000000..6f342dd3f --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/options.test @@ -0,0 +1,60 @@ +{"tests":[ + +{"description": "quote_char=\"'\"", + "options": {"quote_char": "'"}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "test 'with' quote_char"}]]], + "expected": ["<span title='test 'with' quote_char'>"] +}, + +{"description": "quote_attr_values=true", + "options": {"quote_attr_values": true}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "button", [{"namespace": null, "name": "disabled", "value" :"disabled"}]]], + "expected": ["<button disabled>"], + "xhtml": ["<button disabled=\"disabled\">"] +}, + +{"description": "quote_attr_values=true with irrelevant", + "options": {"quote_attr_values": true}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "div", [{"namespace": null, "name": "irrelevant", "value" :"irrelevant"}]]], + "expected": ["<div irrelevant>"], + "xhtml": ["<div irrelevant=\"irrelevant\">"] +}, + +{"description": "use_trailing_solidus=true with void element", + "options": {"use_trailing_solidus": true}, + "input": [["EmptyTag", "img", {}]], + "expected": ["<img />"] +}, + +{"description": "use_trailing_solidus=true with non-void element", + "options": {"use_trailing_solidus": true}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "div", {}]], + "expected": ["<div>"] +}, + +{"description": "minimize_boolean_attributes=false", + "options": {"minimize_boolean_attributes": false}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "div", [{"namespace": null, "name": "irrelevant", "value" :"irrelevant"}]]], + "expected": ["<div irrelevant=irrelevant>"], + "xhtml": ["<div irrelevant=\"irrelevant\">"] +}, + +{"description": "minimize_boolean_attributes=false with empty value", + "options": {"minimize_boolean_attributes": false}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "div", [{"namespace": null, "name": "irrelevant", "value" :""}]]], + "expected": ["<div irrelevant=\"\">"] +}, + +{"description": "escape less than signs in attribute values", + "options": {"escape_lt_in_attrs": true}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "a", [{"namespace": null, "name": "title", "value": "a<b>c&d"}]]], + "expected": ["<a title=\"a<b>c&d\">"] +}, + +{"description": "rcdata", + "options": {"escape_rcdata": true}, + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "script", {}], ["Characters", "a<b>c&d"]], + "expected": ["<script>a<b>c&d"] +} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/whitespace.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/whitespace.test new file mode 100644 index 000000000..e5d050d3b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/serializer/whitespace.test @@ -0,0 +1,51 @@ +{"tests": [
+
+{"description": "bare text with leading spaces",
+ "options": {"strip_whitespace": true},
+ "input": [["Characters", "\t\r\n\u000C foo"]],
+ "expected": [" foo"]
+},
+
+{"description": "bare text with trailing spaces",
+ "options": {"strip_whitespace": true},
+ "input": [["Characters", "foo \t\r\n\u000C"]],
+ "expected": ["foo "]
+},
+
+{"description": "bare text with inner spaces",
+ "options": {"strip_whitespace": true},
+ "input": [["Characters", "foo \t\r\n\u000C bar"]],
+ "expected": ["foo bar"]
+},
+
+{"description": "text within <pre>",
+ "options": {"strip_whitespace": true},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "pre", {}], ["Characters", "\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C"], ["EndTag", "http://www.w3.org/1999/xhtml", "pre"]],
+ "expected": ["<pre>\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C</pre>"]
+},
+
+{"description": "text within <pre>, with inner markup",
+ "options": {"strip_whitespace": true},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "pre", {}], ["Characters", "\t\r\n\u000C fo"], ["StartTag", "http://www.w3.org/1999/xhtml", "span", {}], ["Characters", "o \t\r\n\u000C b"], ["EndTag", "http://www.w3.org/1999/xhtml", "span"], ["Characters", "ar \t\r\n\u000C"], ["EndTag", "http://www.w3.org/1999/xhtml", "pre"]],
+ "expected": ["<pre>\t\r\n\u000C fo<span>o \t\r\n\u000C b</span>ar \t\r\n\u000C</pre>"]
+},
+
+{"description": "text within <textarea>",
+ "options": {"strip_whitespace": true},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "textarea", {}], ["Characters", "\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C"], ["EndTag", "http://www.w3.org/1999/xhtml", "textarea"]],
+ "expected": ["<textarea>\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C</textarea>"]
+},
+
+{"description": "text within <script>",
+ "options": {"strip_whitespace": true},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "script", {}], ["Characters", "\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C"], ["EndTag", "http://www.w3.org/1999/xhtml", "script"]],
+ "expected": ["<script>\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C</script>"]
+},
+
+{"description": "text within <style>",
+ "options": {"strip_whitespace": true},
+ "input": [["StartTag", "http://www.w3.org/1999/xhtml", "style", {}], ["Characters", "\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C"], ["EndTag", "http://www.w3.org/1999/xhtml", "style"]],
+ "expected": ["<style>\t\r\n\u000C foo \t\r\n\u000C bar \t\r\n\u000C</style>"]
+}
+
+]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/sniffer/htmlOrFeed.json b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/sniffer/htmlOrFeed.json new file mode 100644 index 000000000..c1506dbcd --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/sniffer/htmlOrFeed.json @@ -0,0 +1,43 @@ +[ + {"type": "text/html", "input": ""}, + {"type": "text/html", "input": "<!---->"}, + {"type": "text/html", "input": "<!--asdfaslkjdf;laksjdf as;dkfjsd-->"}, + {"type": "text/html", "input": "<!"}, + {"type": "text/html", "input": "\t"}, + {"type": "text/html", "input": "<!>"}, + {"type": "text/html", "input": "<?"}, + {"type": "text/html", "input": "<??>"}, + {"type": "application/rss+xml", "input": "<rss"}, + {"type": "application/atom+xml", "input": "<feed"}, + {"type": "text/html", "input": "<html"}, + {"type": "text/html", "input": "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>302 Found</title>\n</head><body>\n<h1>Found</h1>\n<p>The document has moved <a href=\"http://feeds.feedburner.com/gofug\">here</a>.</p>\n</body></html>\n"}, + {"type": "text/html", "input": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\r\n<HTML><HEAD>\r\n <link rel=\"stylesheet\" type=\"text/css\" href=\"http://cache.blogads.com/289619328/feed.css\" /><link rel=\"stylesheet\" type=\"text/css\" href=\"http://cache.blogads.com/431602649/feed.css\" />\r\n<link rel=\"stylesheet\" type=\"text/css\" href=\"http://cache.blogads.com/382549546/feed.css\" />\r\n<link rel=\"stylesheet\" type=\"text/css\" href=\"http://cache.blogads.com/314618017/feed.css\" /><META http-equiv=\"expires\" content="}, + {"type": "text/html", "input": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n<html>\r\n<head>\r\n<title>Xiaxue - Chicken pie blogger.</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"><style type=\"text/css\">\r\n<style type=\"text/css\">\r\n<!--\r\nbody {\r\n background-color: #FFF2F2;\r\n}\r\n.style1 {font-family: Georgia, \"Times New Roman\", Times, serif}\r\n.style2 {\r\n color: #8a567c;\r\n font-size: 14px;\r\n font-family: Georgia, \"Times New Roman\", Times, serif;\r\n}\r"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\r\n<head> \r\n<title>Google Operating System</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\r\n<meta name=\"Description\" content=\"Unofficial news and tips about Google. A blog that watches Google's latest developments and the attempts to move your operating system online.\" />\r\n<meta name=\"generator\" c"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\r\n<head>\r\n <title>Assimilated Press</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\r\n<meta name=\"MSSmartTagsPreventParsing\" content=\"true\" />\r\n<meta name=\"generator\" content=\"Blogger\" />\r\n<link rel=\"alternate\" type=\"application/atom+xml\" title=\"Assimilated Press - Atom\" href=\"http://assimila"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\r\n<head>\r\n <title>PostSecret</title>\r\n<META name=\"keywords\" Content=\"secrets, postcard, secret, postcards, postsecret, postsecrets,online confessional, post secret, post secrets, artomatic, post a secret\"><META name=\"discription\" Content=\"See a Secret...Share a Secret\"> <meta http-equiv=\"Content-Type\" content=\"te"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>\n <head>\n \n <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>\n <meta content='true' name='MSSmartTagsPreventParsing'/>\n <meta content='blogger' name='generator'/>\n <link rel=\"alternate\" typ"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"ja\">\n<head profile=\"http://gmpg.org/xfn/11\"> \n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /> \n<title> CMS Lever</title><link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"http://s.wordpress.com/wp-content/themes/pub/twenty-eight/2813.css\"/>\n<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS 2.0\" h"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"en\"><head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<title> Park Avenue Peerage</title>\t<meta name=\"generator\" content=\"WordPress.com\" />\t<!-- feeds -->\n\t<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS 2.0\" href=\"http://parkavenuepeerage.wordpress.com/feed/\" />\t<link rel=\"pingback\" href="}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"ja\"><head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<title> \u884c\u96f2\u6d41\u6c34 -like a floating clouds and running water-</title>\t<meta name=\"generator\" content=\"WordPress.com\" />\t<!-- feeds -->\n\t<link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS 2.0\" href=\"http://shw4.wordpress.com/feed/\" />\t<li"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<meta name=\"generator\" content=\"http://www.typepad.com/\" />\n<title>Go Fug Yourself</title><link rel=\"stylesheet\" href=\"http://gofugyourself.typepad.com/go_fug_yourself/styles.css\" type=\"text/css\" />\n<link rel=\"alternate\" type=\"application/atom+xml\" title=\"Atom\" "}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"en\"><head profile=\"http://gmpg.org/xfn/11\">\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><title> Ladies…</title><meta name=\"generator\" content=\"WordPress.com\" /> <!-- leave this for stats --><link rel=\"stylesheet\" href=\"http://s.wordpress.com/wp-content/themes/default/style.css?1\" type=\"tex"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n<head>\r\n <title>The Sartorialist</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\r\n<meta name=\"MSSmartTagsPreventParsing\" content=\"true\" />\r\n<meta name=\"generator\" content=\"Blogger\" />\r\n<link rel=\"alternate\" type=\"application/atom+xml\" title=\"The Sartorialist - Atom\" href=\"http://thesartorialist.blogspot"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\" />\n<meta name=\"generator\" content=\"http://www.typepad.com/\" />\n<title>Creating Passionate Users</title><link rel=\"stylesheet\" href=\"http://headrush.typepad.com/creating_passionate_users/styles.css\" type=\"text/css\" />\n<link rel=\"alternate\" type"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" id=\"sixapart-standard\">\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<meta name=\"generator\" content=\"http://www.typepad.com/\" />\n\t\n\t\n <meta name=\"keywords\" content=\"marketing, blog, seth, ideas, respect, permission\" />\n <meta name=\"description\" content=\"Seth Godin's riffs on marketing, respect, and the "}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\t\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" id=\"sixapart-standard\">\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<meta name=\"generator\" content=\"http://www.typepad.com/\" />\n\t\n\t\n \n <meta name=\"description\" content=\" Western Civilization hangs in the balance. This blog is part of the solution,the cure. Get your heads out of the sand and Fight the G"}, + {"type": "text/html", "input": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=pahrefhttpwwwfeedburnercomtarget_blankimgsrchttpwwwfeedburnercomfbimagespubpowered_by_fbgifaltPoweredbyFeedBurnerstyleborder0ap\" />\n<title> From Under the Rotunda</title>\n<link rel=\"stylesheet\" href=\"http://s.wordpress.com/wp-content/themes/pub/andreas04/style.css\" type=\"text/css\""}, + {"type": "application/atom+xml", "input": "<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href=\"http://www.blogger.com/styles/atom.css\" type=\"text/css\"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-10861780</id><updated>2007-07-27T12:38:50.888-07:00</updated><title type='text'>Official Google Blog</title><link rel='alternate' type='text/html' href='http://googleblog.blogspot.com/'/><link rel='next' type='application/atom+xml' href='http://googleblog.blogs"}, + {"type": "application/rss+xml", "input": "<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-10861780</atom:id><lastBuildDate>Fri, 27 Jul 2007 19:38:50 +0000</lastBuildDate><title>Official Google Blog</title><description/><link>http://googleblog.blogspot.com/</link><managingEditor>Eric Case</managingEditor><generator>Blogger</generator><openSearch:totalResults>729</openSearch:totalResults><openSearc"}, + {"type": "application/rss+xml", "input": "<?xml version=\"1.0\" encoding=\"pahrefhttpwwwfeedburnercomtarget_blankimgsrchttpwwwfeedburnercomfbimagespubpowered_by_fbgifaltPoweredbyFeedBurnerstyleborder0ap\"?>\n<!-- generator=\"wordpress/MU\" -->\n<rss version=\"2.0\"\n\txmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n\txmlns:wfw=\"http://wellformedweb.org/CommentAPI/\"\n\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\t><channel>\n\t<title>From Under the Rotunda</title>\n\t<link>http://dannybernardi.wordpress.com</link>\n\t<description>The Monographs of Danny Ber"}, + {"type": "application/rss+xml", "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- generator=\"wordpress/MU\" -->\n<rss version=\"2.0\"\n\txmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n\txmlns:wfw=\"http://wellformedweb.org/CommentAPI/\"\n\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\t><channel>\n\t<title>CMS Lever</title>\n\t<link>http://kanaguri.wordpress.com</link>\n\t<description>CMS\u306e\u6c17\u306b\u306a\u3063\u305f\u3053\u3068</description>\n\t<pubDate>Wed, 18 Jul 2007 21:26:22 +0000</pubDate>\n\t<generator>http://wordpress.org/?v=MU</generator>\n\t<language>ja</languag"}, + {"type": "application/atom+xml", "input": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:thr=\"http://purl.org/syndication/thread/1.0\">\n <title>Atlas Shrugs</title>\n <link rel=\"self\" type=\"application/atom+xml\" href=\"http://atlasshrugs2000.typepad.com/atlas_shrugs/atom.xml\" />\n <link rel=\"alternate\" type=\"text/html\" href=\"http://atlasshrugs2000.typepad.com/atlas_shrugs/\" />\n <id>tag:typepad.com,2003:weblog-132946</id>\n <updated>2007-08-15T16:07:34-04"}, + {"type": "application/atom+xml", "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/atom10full.xsl\" type=\"text/xsl\" media=\"screen\"?><?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/itemcontent.css\" type=\"text/css\" media=\"screen\"?><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:thr=\"http://purl.org/syndication/thread/1.0\" xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\">\r\n <title>Creating Passionate Users</title>\r\n "}, + {"type": "application/atom+xml", "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/atom10full.xsl\" type=\"text/xsl\" media=\"screen\"?><?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/itemcontent.css\" type=\"text/css\" media=\"screen\"?><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\">\r\n <title>Seth's Blog</title>\r\n <link rel=\"alternate\" type=\"text/html\" href=\"http://sethgodin.typepad.com/seths_blog/\" />\r\n <link rel=\"s"}, + {"type": "application/atom+xml", "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/atom10full.xsl\" type=\"text/xsl\" media=\"screen\"?><?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/itemcontent.css\" type=\"text/css\" media=\"screen\"?><feed xmlns=\"http://www.w3.org/2005/Atom\" xmlns:openSearch=\"http://a9.com/-/spec/opensearchrss/1.0/\" xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\"><id>tag:blogger.com,1999:blog-32454861</id><updated>2007-07-31T21:44:09.867+02:00</upd"}, + {"type": "application/atom+xml", "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/atomfull.xsl\" type=\"text/xsl\" media=\"screen\"?><?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/itemcontent.css\" type=\"text/css\" media=\"screen\"?><feed xmlns=\"http://purl.org/atom/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" version=\"0.3\">\r\n <title>Go Fug Yourself</title>\r\n <link rel=\"alternate\" type=\"text/html\" href=\"http://go"}, + {"type": "application/rss+xml", "input": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/rss2full.xsl\" type=\"text/xsl\" media=\"screen\"?><?xml-stylesheet href=\"http://feeds.feedburner.com/~d/styles/itemcontent.css\" type=\"text/css\" media=\"screen\"?><rss xmlns:creativeCommons=\"http://backend.userland.com/creativeCommonsRssModule\" xmlns:feedburner=\"http://rssnamespace.org/feedburner/ext/1.0\" version=\"2.0\"><channel><title>Google Operating System</title><link>http://googlesystem.blogspot.com/</link>"}, + {"type": "application/rss+xml", "input": "<?xml version=\"1.0\" encoding=\"\"?>\n<!-- generator=\"wordpress/MU\" -->\n<rss version=\"2.0\"\n\txmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n\txmlns:wfw=\"http://wellformedweb.org/CommentAPI/\"\n\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\t><channel>\n\t<title>Nunublog</title>\n\t<link>http://nunubh.wordpress.com</link>\n\t<description>Just Newbie Blog!</description>\n\t<pubDate>Mon, 09 Jul 2007 18:54:09 +0000</pubDate>\n\t<generator>http://wordpress.org/?v=MU</generator>\n\t<language>id</language>\n\t\t\t<item>\n\t\t<ti"}, + {"type": "text/html", "input": "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\r\n<HEAD>\r\n<TITLE>Design*Sponge</TITLE><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\r\n<meta name=\"MSSmartTagsPreventParsing\" content=\"true\" />\r\n<meta name=\"generator\" content=\"Blogger\" />\r\n<link rel=\"alternate\" type=\"application/atom+xml\" title=\"Design*Sponge - Atom\" href=\"http://designsponge.blogspot.com/feeds/posts/default\" />\r\n<link rel=\"alternate\" type=\"application/rss+xml\" title=\"Design*Sponge - RSS\" href="}, + {"type": "text/html", "input": "<HTML>\n<HEAD>\n<TITLE>Moved Temporarily</TITLE>\n</HEAD>\n<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n<H1>Moved Temporarily</H1>\nThe document has moved <A HREF=\"http://feeds.feedburner.com/thesecretdiaryofstevejobs\">here</A>.\n</BODY>\n</HTML>\n"} +]
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/README.md b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/README.md new file mode 100644 index 000000000..4218c26bb --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/README.md @@ -0,0 +1,104 @@ +Tokenizer tests +=============== + +The test format is [JSON](http://www.json.org/). This has the advantage +that the syntax allows backward-compatible extensions to the tests and +the disadvantage that it is relatively verbose. + +Basic Structure +--------------- + + {"tests": [ +     {"description": "Test description", +     "input": "input_string", +     "output": [expected_output_tokens], +     "initialStates": [initial_states], +     "lastStartTag": last_start_tag, +     "ignoreErrorOrder": ignore_error_order +     } + ]} + +Multiple tests per file are allowed simply by adding more objects to the +"tests" list. + +`description`, `input` and `output` are always present. The other values +are optional. + +### Test set-up + +`test.input` is a string containing the characters to pass to the +tokenizer. Specifically, it represents the characters of the **input +stream**, and so implementations are expected to perform the processing +described in the spec's **Preprocessing the input stream** section +before feeding the result to the tokenizer. + +If `test.doubleEscaped` is present and `true`, then `test.input` is not +quite as described above. Instead, it must first be subjected to another +round of unescaping (i.e., in addition to any unescaping involved in the +JSON import), and the result of *that* represents the characters of the +input stream. Currently, the only unescaping required by this option is +to convert each sequence of the form \\uHHHH (where H is a hex digit) +into the corresponding Unicode code point. (Note that this option also +affects the interpretation of `test.output`.) + +`test.initialStates` is a list of strings, each being the name of a +tokenizer state. The test should be run once for each string, using it +to set the tokenizer's initial state for that run. If +`test.initialStates` is omitted, it defaults to `["data state"]`. + +`test.lastStartTag` is a lowercase string that should be used as "the +tag name of the last start tag to have been emitted from this +tokenizer", referenced in the spec's definition of **appropriate end tag +token**. If it is omitted, it is treated as if "no start tag has been +emitted from this tokenizer". + +### Test results + +`test.output` is a list of tokens, ordered with the first produced by +the tokenizer the first (leftmost) in the list. The list must mach the +**complete** list of tokens that the tokenizer should produce. Valid +tokens are: + + ["DOCTYPE", name, public_id, system_id, correctness] + ["StartTag", name, {attributes}*, true*] + ["StartTag", name, {attributes}] + ["EndTag", name] + ["Comment", data] + ["Character", data] + "ParseError" + +`public_id` and `system_id` are either strings or `null`. `correctness` +is either `true` or `false`; `true` corresponds to the force-quirks flag +being false, and vice-versa. + +When the self-closing flag is set, the `StartTag` array has `true` as +its fourth entry. When the flag is not set, the array has only three +entries for backwards compatibility. + +All adjacent character tokens are coalesced into a single +`["Character", data]` token. + +If `test.doubleEscaped` is present and `true`, then every string within +`test.output` must be further unescaped (as described above) before +comparing with the tokenizer's output. + +`test.ignoreErrorOrder` is a boolean value indicating that the order of +`ParseError` tokens relative to other tokens in the output stream is +unimportant, and implementations should ignore such differences between +their output and `expected_output_tokens`. (This is used for errors +emitted by the input stream preprocessing stage, since it is useful to +test that code but it is undefined when the errors occur). If it is +omitted, it defaults to `false`. + +xmlViolation tests +------------------ + +`tokenizer/xmlViolation.test` differs from the above in a couple of +ways: + +- The name of the single member of the top-level JSON object is + "xmlViolationTests" instead of "tests". +- Each test's expected output assumes that implementation is applying + the tweaks given in the spec's "Coercing an HTML DOM into an + infoset" section. + diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/contentModelFlags.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/contentModelFlags.test new file mode 100644 index 000000000..89b8170c6 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/contentModelFlags.test @@ -0,0 +1,81 @@ +{"tests": [ + +{"description":"PLAINTEXT content model flag", +"initialStates":["PLAINTEXT state"], +"lastStartTag":"plaintext", +"input":"<head>&body;", +"output":[["Character", "<head>&body;"]]}, + +{"description":"End tag closing RCDATA or RAWTEXT", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo</xmp>", +"output":[["Character", "foo"], ["EndTag", "xmp"]]}, + +{"description":"End tag closing RCDATA or RAWTEXT (case-insensitivity)", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo</xMp>", +"output":[["Character", "foo"], ["EndTag", "xmp"]]}, + +{"description":"End tag closing RCDATA or RAWTEXT (ending with space)", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo</xmp ", +"output":[["Character", "foo"], "ParseError"]}, + +{"description":"End tag closing RCDATA or RAWTEXT (ending with EOF)", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo</xmp", +"output":[["Character", "foo</xmp"]]}, + +{"description":"End tag closing RCDATA or RAWTEXT (ending with slash)", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo</xmp/", +"output":[["Character", "foo"], "ParseError"]}, + +{"description":"End tag not closing RCDATA or RAWTEXT (ending with left-angle-bracket)", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo</xmp<", +"output":[["Character", "foo</xmp<"]]}, + +{"description":"End tag with incorrect name in RCDATA or RAWTEXT", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"</foo>bar</xmp>", +"output":[["Character", "</foo>bar"], ["EndTag", "xmp"]]}, + +{"description":"Partial end tags leading straight into partial end tags", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"</xmp</xmp</xmp>", +"output":[["Character", "</xmp</xmp"], ["EndTag", "xmp"]]}, + +{"description":"End tag with incorrect name in RCDATA or RAWTEXT (starting like correct name)", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"</foo>bar</xmpaar>", +"output":[["Character", "</foo>bar</xmpaar>"]]}, + +{"description":"End tag closing RCDATA or RAWTEXT, switching back to PCDATA", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo</xmp></baz>", +"output":[["Character", "foo"], ["EndTag", "xmp"], ["EndTag", "baz"]]}, + +{"description":"RAWTEXT w/ something looking like an entity", +"initialStates":["RAWTEXT state"], +"lastStartTag":"xmp", +"input":"&foo;", +"output":[["Character", "&foo;"]]}, + +{"description":"RCDATA w/ an entity", +"initialStates":["RCDATA state"], +"lastStartTag":"textarea", +"input":"<", +"output":[["Character", "<"]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/domjs.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/domjs.test new file mode 100644 index 000000000..8f1e42f35 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/domjs.test @@ -0,0 +1,96 @@ +{ + "tests": [ + { + "description":"CR in bogus comment state", + "input":"<?\u000d", + "output":["ParseError", ["Comment", "?\u000a"]] + }, + { + "description":"CRLF in bogus comment state", + "input":"<?\u000d\u000a", + "output":["ParseError", ["Comment", "?\u000a"]] + }, + { + "description":"CRLFLF in bogus comment state", + "input":"<?\u000d\u000a\u000a", + "output":["ParseError", ["Comment", "?\u000a\u000a"]] + }, + { + "description":"NUL in RCDATA and RAWTEXT", + "doubleEscaped":true, + "initialStates":["RCDATA state", "RAWTEXT state"], + "input":"\\u0000", + "output":["ParseError", ["Character", "\\uFFFD"]] + }, + { + "description":"leading U+FEFF must pass through", + "doubleEscaped":true, + "input":"\\uFEFFfoo\\uFEFFbar", + "output":[["Character", "\\uFEFFfoo\\uFEFFbar"]] + }, + { + "description":"Non BMP-charref in in RCDATA", + "initialStates":["RCDATA state"], + "input":"≂̸", + "output":[["Character", "\u2242\u0338"]] + }, + { + "description":"Bad charref in in RCDATA", + "initialStates":["RCDATA state"], + "input":"&NotEqualTild;", + "output":["ParseError", ["Character", "&NotEqualTild;"]] + }, + { + "description":"lowercase endtags in RCDATA and RAWTEXT", + "initialStates":["RCDATA state", "RAWTEXT state"], + "lastStartTag":"xmp", + "input":"</XMP>", + "output":[["EndTag","xmp"]] + }, + { + "description":"bad endtag in RCDATA and RAWTEXT", + "initialStates":["RCDATA state", "RAWTEXT state"], + "lastStartTag":"xmp", + "input":"</ XMP>", + "output":[["Character","</ XMP>"]] + }, + { + "description":"bad endtag in RCDATA and RAWTEXT", + "initialStates":["RCDATA state", "RAWTEXT state"], + "lastStartTag":"xmp", + "input":"</xm>", + "output":[["Character","</xm>"]] + }, + { + "description":"bad endtag in RCDATA and RAWTEXT", + "initialStates":["RCDATA state", "RAWTEXT state"], + "lastStartTag":"xmp", + "input":"</xm ", + "output":[["Character","</xm "]] + }, + { + "description":"bad endtag in RCDATA and RAWTEXT", + "initialStates":["RCDATA state", "RAWTEXT state"], + "lastStartTag":"xmp", + "input":"</xm/", + "output":[["Character","</xm/"]] + }, + { + "description":"Non BMP-charref in attribute", + "input":"<p id=\"≂̸\">", + "output":[["StartTag", "p", {"id":"\u2242\u0338"}]] + }, + { + "description":"--!NUL in comment ", + "doubleEscaped":true, + "input":"<!----!\\u0000-->", + "output":["ParseError", "ParseError", ["Comment", "--!\\uFFFD"]] + }, + { + "description":"space EOF after doctype ", + "input":"<!DOCTYPE html ", + "output":["ParseError", ["DOCTYPE", "html", null, null , false]] + } + + ] +} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/entities.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/entities.test new file mode 100644 index 000000000..27b85a1cd --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/entities.test @@ -0,0 +1,283 @@ +{"tests": [ + +{"description": "Undefined named entity in attribute value ending in semicolon and whose name starts with a known entity name.", +"input":"<h a='¬i;'>", +"output": [["StartTag", "h", {"a": "¬i;"}]]}, + +{"description": "Entity name followed by the equals sign in an attribute value.", +"input":"<h a='&lang='>", +"output": [["StartTag", "h", {"a": "&lang="}]]}, + +{"description": "CR as numeric entity", +"input":"
", +"output": ["ParseError", ["Character", "\r"]]}, + +{"description": "CR as hexadecimal numeric entity", +"input":"
", +"output": ["ParseError", ["Character", "\r"]]}, + +{"description": "Windows-1252 EURO SIGN numeric entity.", +"input":"€", +"output": ["ParseError", ["Character", "\u20AC"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u0081"]]}, + +{"description": "Windows-1252 SINGLE LOW-9 QUOTATION MARK numeric entity.", +"input":"‚", +"output": ["ParseError", ["Character", "\u201A"]]}, + +{"description": "Windows-1252 LATIN SMALL LETTER F WITH HOOK numeric entity.", +"input":"ƒ", +"output": ["ParseError", ["Character", "\u0192"]]}, + +{"description": "Windows-1252 DOUBLE LOW-9 QUOTATION MARK numeric entity.", +"input":"„", +"output": ["ParseError", ["Character", "\u201E"]]}, + +{"description": "Windows-1252 HORIZONTAL ELLIPSIS numeric entity.", +"input":"…", +"output": ["ParseError", ["Character", "\u2026"]]}, + +{"description": "Windows-1252 DAGGER numeric entity.", +"input":"†", +"output": ["ParseError", ["Character", "\u2020"]]}, + +{"description": "Windows-1252 DOUBLE DAGGER numeric entity.", +"input":"‡", +"output": ["ParseError", ["Character", "\u2021"]]}, + +{"description": "Windows-1252 MODIFIER LETTER CIRCUMFLEX ACCENT numeric entity.", +"input":"ˆ", +"output": ["ParseError", ["Character", "\u02C6"]]}, + +{"description": "Windows-1252 PER MILLE SIGN numeric entity.", +"input":"‰", +"output": ["ParseError", ["Character", "\u2030"]]}, + +{"description": "Windows-1252 LATIN CAPITAL LETTER S WITH CARON numeric entity.", +"input":"Š", +"output": ["ParseError", ["Character", "\u0160"]]}, + +{"description": "Windows-1252 SINGLE LEFT-POINTING ANGLE QUOTATION MARK numeric entity.", +"input":"‹", +"output": ["ParseError", ["Character", "\u2039"]]}, + +{"description": "Windows-1252 LATIN CAPITAL LIGATURE OE numeric entity.", +"input":"Œ", +"output": ["ParseError", ["Character", "\u0152"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u008D"]]}, + +{"description": "Windows-1252 LATIN CAPITAL LETTER Z WITH CARON numeric entity.", +"input":"Ž", +"output": ["ParseError", ["Character", "\u017D"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u008F"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u0090"]]}, + +{"description": "Windows-1252 LEFT SINGLE QUOTATION MARK numeric entity.", +"input":"‘", +"output": ["ParseError", ["Character", "\u2018"]]}, + +{"description": "Windows-1252 RIGHT SINGLE QUOTATION MARK numeric entity.", +"input":"’", +"output": ["ParseError", ["Character", "\u2019"]]}, + +{"description": "Windows-1252 LEFT DOUBLE QUOTATION MARK numeric entity.", +"input":"“", +"output": ["ParseError", ["Character", "\u201C"]]}, + +{"description": "Windows-1252 RIGHT DOUBLE QUOTATION MARK numeric entity.", +"input":"”", +"output": ["ParseError", ["Character", "\u201D"]]}, + +{"description": "Windows-1252 BULLET numeric entity.", +"input":"•", +"output": ["ParseError", ["Character", "\u2022"]]}, + +{"description": "Windows-1252 EN DASH numeric entity.", +"input":"–", +"output": ["ParseError", ["Character", "\u2013"]]}, + +{"description": "Windows-1252 EM DASH numeric entity.", +"input":"—", +"output": ["ParseError", ["Character", "\u2014"]]}, + +{"description": "Windows-1252 SMALL TILDE numeric entity.", +"input":"˜", +"output": ["ParseError", ["Character", "\u02DC"]]}, + +{"description": "Windows-1252 TRADE MARK SIGN numeric entity.", +"input":"™", +"output": ["ParseError", ["Character", "\u2122"]]}, + +{"description": "Windows-1252 LATIN SMALL LETTER S WITH CARON numeric entity.", +"input":"š", +"output": ["ParseError", ["Character", "\u0161"]]}, + +{"description": "Windows-1252 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK numeric entity.", +"input":"›", +"output": ["ParseError", ["Character", "\u203A"]]}, + +{"description": "Windows-1252 LATIN SMALL LIGATURE OE numeric entity.", +"input":"œ", +"output": ["ParseError", ["Character", "\u0153"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u009D"]]}, + +{"description": "Windows-1252 EURO SIGN hexadecimal numeric entity.", +"input":"€", +"output": ["ParseError", ["Character", "\u20AC"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u0081"]]}, + +{"description": "Windows-1252 SINGLE LOW-9 QUOTATION MARK hexadecimal numeric entity.", +"input":"‚", +"output": ["ParseError", ["Character", "\u201A"]]}, + +{"description": "Windows-1252 LATIN SMALL LETTER F WITH HOOK hexadecimal numeric entity.", +"input":"ƒ", +"output": ["ParseError", ["Character", "\u0192"]]}, + +{"description": "Windows-1252 DOUBLE LOW-9 QUOTATION MARK hexadecimal numeric entity.", +"input":"„", +"output": ["ParseError", ["Character", "\u201E"]]}, + +{"description": "Windows-1252 HORIZONTAL ELLIPSIS hexadecimal numeric entity.", +"input":"…", +"output": ["ParseError", ["Character", "\u2026"]]}, + +{"description": "Windows-1252 DAGGER hexadecimal numeric entity.", +"input":"†", +"output": ["ParseError", ["Character", "\u2020"]]}, + +{"description": "Windows-1252 DOUBLE DAGGER hexadecimal numeric entity.", +"input":"‡", +"output": ["ParseError", ["Character", "\u2021"]]}, + +{"description": "Windows-1252 MODIFIER LETTER CIRCUMFLEX ACCENT hexadecimal numeric entity.", +"input":"ˆ", +"output": ["ParseError", ["Character", "\u02C6"]]}, + +{"description": "Windows-1252 PER MILLE SIGN hexadecimal numeric entity.", +"input":"‰", +"output": ["ParseError", ["Character", "\u2030"]]}, + +{"description": "Windows-1252 LATIN CAPITAL LETTER S WITH CARON hexadecimal numeric entity.", +"input":"Š", +"output": ["ParseError", ["Character", "\u0160"]]}, + +{"description": "Windows-1252 SINGLE LEFT-POINTING ANGLE QUOTATION MARK hexadecimal numeric entity.", +"input":"‹", +"output": ["ParseError", ["Character", "\u2039"]]}, + +{"description": "Windows-1252 LATIN CAPITAL LIGATURE OE hexadecimal numeric entity.", +"input":"Œ", +"output": ["ParseError", ["Character", "\u0152"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u008D"]]}, + +{"description": "Windows-1252 LATIN CAPITAL LETTER Z WITH CARON hexadecimal numeric entity.", +"input":"Ž", +"output": ["ParseError", ["Character", "\u017D"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u008F"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u0090"]]}, + +{"description": "Windows-1252 LEFT SINGLE QUOTATION MARK hexadecimal numeric entity.", +"input":"‘", +"output": ["ParseError", ["Character", "\u2018"]]}, + +{"description": "Windows-1252 RIGHT SINGLE QUOTATION MARK hexadecimal numeric entity.", +"input":"’", +"output": ["ParseError", ["Character", "\u2019"]]}, + +{"description": "Windows-1252 LEFT DOUBLE QUOTATION MARK hexadecimal numeric entity.", +"input":"“", +"output": ["ParseError", ["Character", "\u201C"]]}, + +{"description": "Windows-1252 RIGHT DOUBLE QUOTATION MARK hexadecimal numeric entity.", +"input":"”", +"output": ["ParseError", ["Character", "\u201D"]]}, + +{"description": "Windows-1252 BULLET hexadecimal numeric entity.", +"input":"•", +"output": ["ParseError", ["Character", "\u2022"]]}, + +{"description": "Windows-1252 EN DASH hexadecimal numeric entity.", +"input":"–", +"output": ["ParseError", ["Character", "\u2013"]]}, + +{"description": "Windows-1252 EM DASH hexadecimal numeric entity.", +"input":"—", +"output": ["ParseError", ["Character", "\u2014"]]}, + +{"description": "Windows-1252 SMALL TILDE hexadecimal numeric entity.", +"input":"˜", +"output": ["ParseError", ["Character", "\u02DC"]]}, + +{"description": "Windows-1252 TRADE MARK SIGN hexadecimal numeric entity.", +"input":"™", +"output": ["ParseError", ["Character", "\u2122"]]}, + +{"description": "Windows-1252 LATIN SMALL LETTER S WITH CARON hexadecimal numeric entity.", +"input":"š", +"output": ["ParseError", ["Character", "\u0161"]]}, + +{"description": "Windows-1252 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK hexadecimal numeric entity.", +"input":"›", +"output": ["ParseError", ["Character", "\u203A"]]}, + +{"description": "Windows-1252 LATIN SMALL LIGATURE OE hexadecimal numeric entity.", +"input":"œ", +"output": ["ParseError", ["Character", "\u0153"]]}, + +{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.", +"input":"", +"output": ["ParseError", ["Character", "\u009D"]]}, + +{"description": "Windows-1252 LATIN SMALL LETTER Z WITH CARON hexadecimal numeric entity.", +"input":"ž", +"output": ["ParseError", ["Character", "\u017E"]]}, + +{"description": "Windows-1252 LATIN CAPITAL LETTER Y WITH DIAERESIS hexadecimal numeric entity.", +"input":"Ÿ", +"output": ["ParseError", ["Character", "\u0178"]]}, + +{"description": "Decimal numeric entity followed by hex character a.", +"input":"aa", +"output": ["ParseError", ["Character", "aa"]]}, + +{"description": "Decimal numeric entity followed by hex character A.", +"input":"aA", +"output": ["ParseError", ["Character", "aA"]]}, + +{"description": "Decimal numeric entity followed by hex character f.", +"input":"af", +"output": ["ParseError", ["Character", "af"]]}, + +{"description": "Decimal numeric entity followed by hex character A.", +"input":"aF", +"output": ["ParseError", ["Character", "aF"]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/escapeFlag.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/escapeFlag.test new file mode 100644 index 000000000..18cb4309e --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/escapeFlag.test @@ -0,0 +1,33 @@ +{"tests": [ + +{"description":"Commented close tag in RCDATA or RAWTEXT", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo<!--</xmp>--></xmp>", +"output":[["Character", "foo<!--"], ["EndTag", "xmp"], ["Character", "-->"], ["EndTag", "xmp"]]}, + +{"description":"Bogus comment in RCDATA or RAWTEXT", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo<!-->baz</xmp>", +"output":[["Character", "foo<!-->baz"], ["EndTag", "xmp"]]}, + +{"description":"End tag surrounded by bogus comment in RCDATA or RAWTEXT", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo<!--></xmp><!-->baz</xmp>", +"output":[["Character", "foo<!-->"], ["EndTag", "xmp"], "ParseError", ["Comment", ""], ["Character", "baz"], ["EndTag", "xmp"]]}, + +{"description":"Commented entities in RCDATA", +"initialStates":["RCDATA state"], +"lastStartTag":"xmp", +"input":" & <!-- & --> & </xmp>", +"output":[["Character", " & <!-- & --> & "], ["EndTag", "xmp"]]}, + +{"description":"Incorrect comment ending sequences in RCDATA or RAWTEXT", +"initialStates":["RCDATA state", "RAWTEXT state"], +"lastStartTag":"xmp", +"input":"foo<!-- x --x>x-- >x--!>x--<></xmp>", +"output":[["Character", "foo<!-- x --x>x-- >x--!>x--<>"], ["EndTag", "xmp"]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/namedEntities.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/namedEntities.test new file mode 100644 index 000000000..14db2ede0 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/namedEntities.test @@ -0,0 +1,42210 @@ +{ + "tests": [ + { + "input": "Æ", + "description": "Named entity: AElig without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c6" + ] + ] + }, + { + "input": "Æ", + "description": "Named entity: AElig; with a semi-colon", + "output": [ + [ + "Character", + "\u00c6" + ] + ] + }, + { + "input": "&", + "description": "Named entity: AMP without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "&" + ] + ] + }, + { + "input": "&", + "description": "Named entity: AMP; with a semi-colon", + "output": [ + [ + "Character", + "&" + ] + ] + }, + { + "input": "Á", + "description": "Named entity: Aacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c1" + ] + ] + }, + { + "input": "Á", + "description": "Named entity: Aacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00c1" + ] + ] + }, + { + "input": "&Abreve", + "description": "Bad named entity: Abreve without a semi-colon", + "output": [ + [ + "Character", + "&Abreve" + ] + ] + }, + { + "input": "Ă", + "description": "Named entity: Abreve; with a semi-colon", + "output": [ + [ + "Character", + "\u0102" + ] + ] + }, + { + "input": "Â", + "description": "Named entity: Acirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c2" + ] + ] + }, + { + "input": "Â", + "description": "Named entity: Acirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00c2" + ] + ] + }, + { + "input": "&Acy", + "description": "Bad named entity: Acy without a semi-colon", + "output": [ + [ + "Character", + "&Acy" + ] + ] + }, + { + "input": "А", + "description": "Named entity: Acy; with a semi-colon", + "output": [ + [ + "Character", + "\u0410" + ] + ] + }, + { + "input": "&Afr", + "description": "Bad named entity: Afr without a semi-colon", + "output": [ + [ + "Character", + "&Afr" + ] + ] + }, + { + "input": "𝔄", + "description": "Named entity: Afr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd04" + ] + ] + }, + { + "input": "À", + "description": "Named entity: Agrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c0" + ] + ] + }, + { + "input": "À", + "description": "Named entity: Agrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00c0" + ] + ] + }, + { + "input": "&Alpha", + "description": "Bad named entity: Alpha without a semi-colon", + "output": [ + [ + "Character", + "&Alpha" + ] + ] + }, + { + "input": "Α", + "description": "Named entity: Alpha; with a semi-colon", + "output": [ + [ + "Character", + "\u0391" + ] + ] + }, + { + "input": "&Amacr", + "description": "Bad named entity: Amacr without a semi-colon", + "output": [ + [ + "Character", + "&Amacr" + ] + ] + }, + { + "input": "Ā", + "description": "Named entity: Amacr; with a semi-colon", + "output": [ + [ + "Character", + "\u0100" + ] + ] + }, + { + "input": "&And", + "description": "Bad named entity: And without a semi-colon", + "output": [ + [ + "Character", + "&And" + ] + ] + }, + { + "input": "⩓", + "description": "Named entity: And; with a semi-colon", + "output": [ + [ + "Character", + "\u2a53" + ] + ] + }, + { + "input": "&Aogon", + "description": "Bad named entity: Aogon without a semi-colon", + "output": [ + [ + "Character", + "&Aogon" + ] + ] + }, + { + "input": "Ą", + "description": "Named entity: Aogon; with a semi-colon", + "output": [ + [ + "Character", + "\u0104" + ] + ] + }, + { + "input": "&Aopf", + "description": "Bad named entity: Aopf without a semi-colon", + "output": [ + [ + "Character", + "&Aopf" + ] + ] + }, + { + "input": "𝔸", + "description": "Named entity: Aopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd38" + ] + ] + }, + { + "input": "&ApplyFunction", + "description": "Bad named entity: ApplyFunction without a semi-colon", + "output": [ + [ + "Character", + "&ApplyFunction" + ] + ] + }, + { + "input": "⁡", + "description": "Named entity: ApplyFunction; with a semi-colon", + "output": [ + [ + "Character", + "\u2061" + ] + ] + }, + { + "input": "Å", + "description": "Named entity: Aring without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c5" + ] + ] + }, + { + "input": "Å", + "description": "Named entity: Aring; with a semi-colon", + "output": [ + [ + "Character", + "\u00c5" + ] + ] + }, + { + "input": "&Ascr", + "description": "Bad named entity: Ascr without a semi-colon", + "output": [ + [ + "Character", + "&Ascr" + ] + ] + }, + { + "input": "𝒜", + "description": "Named entity: Ascr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udc9c" + ] + ] + }, + { + "input": "&Assign", + "description": "Bad named entity: Assign without a semi-colon", + "output": [ + [ + "Character", + "&Assign" + ] + ] + }, + { + "input": "≔", + "description": "Named entity: Assign; with a semi-colon", + "output": [ + [ + "Character", + "\u2254" + ] + ] + }, + { + "input": "Ã", + "description": "Named entity: Atilde without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c3" + ] + ] + }, + { + "input": "Ã", + "description": "Named entity: Atilde; with a semi-colon", + "output": [ + [ + "Character", + "\u00c3" + ] + ] + }, + { + "input": "Ä", + "description": "Named entity: Auml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c4" + ] + ] + }, + { + "input": "Ä", + "description": "Named entity: Auml; with a semi-colon", + "output": [ + [ + "Character", + "\u00c4" + ] + ] + }, + { + "input": "&Backslash", + "description": "Bad named entity: Backslash without a semi-colon", + "output": [ + [ + "Character", + "&Backslash" + ] + ] + }, + { + "input": "∖", + "description": "Named entity: Backslash; with a semi-colon", + "output": [ + [ + "Character", + "\u2216" + ] + ] + }, + { + "input": "&Barv", + "description": "Bad named entity: Barv without a semi-colon", + "output": [ + [ + "Character", + "&Barv" + ] + ] + }, + { + "input": "⫧", + "description": "Named entity: Barv; with a semi-colon", + "output": [ + [ + "Character", + "\u2ae7" + ] + ] + }, + { + "input": "&Barwed", + "description": "Bad named entity: Barwed without a semi-colon", + "output": [ + [ + "Character", + "&Barwed" + ] + ] + }, + { + "input": "⌆", + "description": "Named entity: Barwed; with a semi-colon", + "output": [ + [ + "Character", + "\u2306" + ] + ] + }, + { + "input": "&Bcy", + "description": "Bad named entity: Bcy without a semi-colon", + "output": [ + [ + "Character", + "&Bcy" + ] + ] + }, + { + "input": "Б", + "description": "Named entity: Bcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0411" + ] + ] + }, + { + "input": "&Because", + "description": "Bad named entity: Because without a semi-colon", + "output": [ + [ + "Character", + "&Because" + ] + ] + }, + { + "input": "∵", + "description": "Named entity: Because; with a semi-colon", + "output": [ + [ + "Character", + "\u2235" + ] + ] + }, + { + "input": "&Bernoullis", + "description": "Bad named entity: Bernoullis without a semi-colon", + "output": [ + [ + "Character", + "&Bernoullis" + ] + ] + }, + { + "input": "ℬ", + "description": "Named entity: Bernoullis; with a semi-colon", + "output": [ + [ + "Character", + "\u212c" + ] + ] + }, + { + "input": "&Beta", + "description": "Bad named entity: Beta without a semi-colon", + "output": [ + [ + "Character", + "&Beta" + ] + ] + }, + { + "input": "Β", + "description": "Named entity: Beta; with a semi-colon", + "output": [ + [ + "Character", + "\u0392" + ] + ] + }, + { + "input": "&Bfr", + "description": "Bad named entity: Bfr without a semi-colon", + "output": [ + [ + "Character", + "&Bfr" + ] + ] + }, + { + "input": "𝔅", + "description": "Named entity: Bfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd05" + ] + ] + }, + { + "input": "&Bopf", + "description": "Bad named entity: Bopf without a semi-colon", + "output": [ + [ + "Character", + "&Bopf" + ] + ] + }, + { + "input": "𝔹", + "description": "Named entity: Bopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd39" + ] + ] + }, + { + "input": "&Breve", + "description": "Bad named entity: Breve without a semi-colon", + "output": [ + [ + "Character", + "&Breve" + ] + ] + }, + { + "input": "˘", + "description": "Named entity: Breve; with a semi-colon", + "output": [ + [ + "Character", + "\u02d8" + ] + ] + }, + { + "input": "&Bscr", + "description": "Bad named entity: Bscr without a semi-colon", + "output": [ + [ + "Character", + "&Bscr" + ] + ] + }, + { + "input": "ℬ", + "description": "Named entity: Bscr; with a semi-colon", + "output": [ + [ + "Character", + "\u212c" + ] + ] + }, + { + "input": "&Bumpeq", + "description": "Bad named entity: Bumpeq without a semi-colon", + "output": [ + [ + "Character", + "&Bumpeq" + ] + ] + }, + { + "input": "≎", + "description": "Named entity: Bumpeq; with a semi-colon", + "output": [ + [ + "Character", + "\u224e" + ] + ] + }, + { + "input": "&CHcy", + "description": "Bad named entity: CHcy without a semi-colon", + "output": [ + [ + "Character", + "&CHcy" + ] + ] + }, + { + "input": "Ч", + "description": "Named entity: CHcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0427" + ] + ] + }, + { + "input": "©", + "description": "Named entity: COPY without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a9" + ] + ] + }, + { + "input": "©", + "description": "Named entity: COPY; with a semi-colon", + "output": [ + [ + "Character", + "\u00a9" + ] + ] + }, + { + "input": "&Cacute", + "description": "Bad named entity: Cacute without a semi-colon", + "output": [ + [ + "Character", + "&Cacute" + ] + ] + }, + { + "input": "Ć", + "description": "Named entity: Cacute; with a semi-colon", + "output": [ + [ + "Character", + "\u0106" + ] + ] + }, + { + "input": "&Cap", + "description": "Bad named entity: Cap without a semi-colon", + "output": [ + [ + "Character", + "&Cap" + ] + ] + }, + { + "input": "⋒", + "description": "Named entity: Cap; with a semi-colon", + "output": [ + [ + "Character", + "\u22d2" + ] + ] + }, + { + "input": "&CapitalDifferentialD", + "description": "Bad named entity: CapitalDifferentialD without a semi-colon", + "output": [ + [ + "Character", + "&CapitalDifferentialD" + ] + ] + }, + { + "input": "ⅅ", + "description": "Named entity: CapitalDifferentialD; with a semi-colon", + "output": [ + [ + "Character", + "\u2145" + ] + ] + }, + { + "input": "&Cayleys", + "description": "Bad named entity: Cayleys without a semi-colon", + "output": [ + [ + "Character", + "&Cayleys" + ] + ] + }, + { + "input": "ℭ", + "description": "Named entity: Cayleys; with a semi-colon", + "output": [ + [ + "Character", + "\u212d" + ] + ] + }, + { + "input": "&Ccaron", + "description": "Bad named entity: Ccaron without a semi-colon", + "output": [ + [ + "Character", + "&Ccaron" + ] + ] + }, + { + "input": "Č", + "description": "Named entity: Ccaron; with a semi-colon", + "output": [ + [ + "Character", + "\u010c" + ] + ] + }, + { + "input": "Ç", + "description": "Named entity: Ccedil without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c7" + ] + ] + }, + { + "input": "Ç", + "description": "Named entity: Ccedil; with a semi-colon", + "output": [ + [ + "Character", + "\u00c7" + ] + ] + }, + { + "input": "&Ccirc", + "description": "Bad named entity: Ccirc without a semi-colon", + "output": [ + [ + "Character", + "&Ccirc" + ] + ] + }, + { + "input": "Ĉ", + "description": "Named entity: Ccirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0108" + ] + ] + }, + { + "input": "&Cconint", + "description": "Bad named entity: Cconint without a semi-colon", + "output": [ + [ + "Character", + "&Cconint" + ] + ] + }, + { + "input": "∰", + "description": "Named entity: Cconint; with a semi-colon", + "output": [ + [ + "Character", + "\u2230" + ] + ] + }, + { + "input": "&Cdot", + "description": "Bad named entity: Cdot without a semi-colon", + "output": [ + [ + "Character", + "&Cdot" + ] + ] + }, + { + "input": "Ċ", + "description": "Named entity: Cdot; with a semi-colon", + "output": [ + [ + "Character", + "\u010a" + ] + ] + }, + { + "input": "&Cedilla", + "description": "Bad named entity: Cedilla without a semi-colon", + "output": [ + [ + "Character", + "&Cedilla" + ] + ] + }, + { + "input": "¸", + "description": "Named entity: Cedilla; with a semi-colon", + "output": [ + [ + "Character", + "\u00b8" + ] + ] + }, + { + "input": "&CenterDot", + "description": "Bad named entity: CenterDot without a semi-colon", + "output": [ + [ + "Character", + "&CenterDot" + ] + ] + }, + { + "input": "·", + "description": "Named entity: CenterDot; with a semi-colon", + "output": [ + [ + "Character", + "\u00b7" + ] + ] + }, + { + "input": "&Cfr", + "description": "Bad named entity: Cfr without a semi-colon", + "output": [ + [ + "Character", + "&Cfr" + ] + ] + }, + { + "input": "ℭ", + "description": "Named entity: Cfr; with a semi-colon", + "output": [ + [ + "Character", + "\u212d" + ] + ] + }, + { + "input": "&Chi", + "description": "Bad named entity: Chi without a semi-colon", + "output": [ + [ + "Character", + "&Chi" + ] + ] + }, + { + "input": "Χ", + "description": "Named entity: Chi; with a semi-colon", + "output": [ + [ + "Character", + "\u03a7" + ] + ] + }, + { + "input": "&CircleDot", + "description": "Bad named entity: CircleDot without a semi-colon", + "output": [ + [ + "Character", + "&CircleDot" + ] + ] + }, + { + "input": "⊙", + "description": "Named entity: CircleDot; with a semi-colon", + "output": [ + [ + "Character", + "\u2299" + ] + ] + }, + { + "input": "&CircleMinus", + "description": "Bad named entity: CircleMinus without a semi-colon", + "output": [ + [ + "Character", + "&CircleMinus" + ] + ] + }, + { + "input": "⊖", + "description": "Named entity: CircleMinus; with a semi-colon", + "output": [ + [ + "Character", + "\u2296" + ] + ] + }, + { + "input": "&CirclePlus", + "description": "Bad named entity: CirclePlus without a semi-colon", + "output": [ + [ + "Character", + "&CirclePlus" + ] + ] + }, + { + "input": "⊕", + "description": "Named entity: CirclePlus; with a semi-colon", + "output": [ + [ + "Character", + "\u2295" + ] + ] + }, + { + "input": "&CircleTimes", + "description": "Bad named entity: CircleTimes without a semi-colon", + "output": [ + [ + "Character", + "&CircleTimes" + ] + ] + }, + { + "input": "⊗", + "description": "Named entity: CircleTimes; with a semi-colon", + "output": [ + [ + "Character", + "\u2297" + ] + ] + }, + { + "input": "&ClockwiseContourIntegral", + "description": "Bad named entity: ClockwiseContourIntegral without a semi-colon", + "output": [ + [ + "Character", + "&ClockwiseContourIntegral" + ] + ] + }, + { + "input": "∲", + "description": "Named entity: ClockwiseContourIntegral; with a semi-colon", + "output": [ + [ + "Character", + "\u2232" + ] + ] + }, + { + "input": "&CloseCurlyDoubleQuote", + "description": "Bad named entity: CloseCurlyDoubleQuote without a semi-colon", + "output": [ + [ + "Character", + "&CloseCurlyDoubleQuote" + ] + ] + }, + { + "input": "”", + "description": "Named entity: CloseCurlyDoubleQuote; with a semi-colon", + "output": [ + [ + "Character", + "\u201d" + ] + ] + }, + { + "input": "&CloseCurlyQuote", + "description": "Bad named entity: CloseCurlyQuote without a semi-colon", + "output": [ + [ + "Character", + "&CloseCurlyQuote" + ] + ] + }, + { + "input": "’", + "description": "Named entity: CloseCurlyQuote; with a semi-colon", + "output": [ + [ + "Character", + "\u2019" + ] + ] + }, + { + "input": "&Colon", + "description": "Bad named entity: Colon without a semi-colon", + "output": [ + [ + "Character", + "&Colon" + ] + ] + }, + { + "input": "∷", + "description": "Named entity: Colon; with a semi-colon", + "output": [ + [ + "Character", + "\u2237" + ] + ] + }, + { + "input": "&Colone", + "description": "Bad named entity: Colone without a semi-colon", + "output": [ + [ + "Character", + "&Colone" + ] + ] + }, + { + "input": "⩴", + "description": "Named entity: Colone; with a semi-colon", + "output": [ + [ + "Character", + "\u2a74" + ] + ] + }, + { + "input": "&Congruent", + "description": "Bad named entity: Congruent without a semi-colon", + "output": [ + [ + "Character", + "&Congruent" + ] + ] + }, + { + "input": "≡", + "description": "Named entity: Congruent; with a semi-colon", + "output": [ + [ + "Character", + "\u2261" + ] + ] + }, + { + "input": "&Conint", + "description": "Bad named entity: Conint without a semi-colon", + "output": [ + [ + "Character", + "&Conint" + ] + ] + }, + { + "input": "∯", + "description": "Named entity: Conint; with a semi-colon", + "output": [ + [ + "Character", + "\u222f" + ] + ] + }, + { + "input": "&ContourIntegral", + "description": "Bad named entity: ContourIntegral without a semi-colon", + "output": [ + [ + "Character", + "&ContourIntegral" + ] + ] + }, + { + "input": "∮", + "description": "Named entity: ContourIntegral; with a semi-colon", + "output": [ + [ + "Character", + "\u222e" + ] + ] + }, + { + "input": "&Copf", + "description": "Bad named entity: Copf without a semi-colon", + "output": [ + [ + "Character", + "&Copf" + ] + ] + }, + { + "input": "ℂ", + "description": "Named entity: Copf; with a semi-colon", + "output": [ + [ + "Character", + "\u2102" + ] + ] + }, + { + "input": "&Coproduct", + "description": "Bad named entity: Coproduct without a semi-colon", + "output": [ + [ + "Character", + "&Coproduct" + ] + ] + }, + { + "input": "∐", + "description": "Named entity: Coproduct; with a semi-colon", + "output": [ + [ + "Character", + "\u2210" + ] + ] + }, + { + "input": "&CounterClockwiseContourIntegral", + "description": "Bad named entity: CounterClockwiseContourIntegral without a semi-colon", + "output": [ + [ + "Character", + "&CounterClockwiseContourIntegral" + ] + ] + }, + { + "input": "∳", + "description": "Named entity: CounterClockwiseContourIntegral; with a semi-colon", + "output": [ + [ + "Character", + "\u2233" + ] + ] + }, + { + "input": "&Cross", + "description": "Bad named entity: Cross without a semi-colon", + "output": [ + [ + "Character", + "&Cross" + ] + ] + }, + { + "input": "⨯", + "description": "Named entity: Cross; with a semi-colon", + "output": [ + [ + "Character", + "\u2a2f" + ] + ] + }, + { + "input": "&Cscr", + "description": "Bad named entity: Cscr without a semi-colon", + "output": [ + [ + "Character", + "&Cscr" + ] + ] + }, + { + "input": "𝒞", + "description": "Named entity: Cscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udc9e" + ] + ] + }, + { + "input": "&Cup", + "description": "Bad named entity: Cup without a semi-colon", + "output": [ + [ + "Character", + "&Cup" + ] + ] + }, + { + "input": "⋓", + "description": "Named entity: Cup; with a semi-colon", + "output": [ + [ + "Character", + "\u22d3" + ] + ] + }, + { + "input": "&CupCap", + "description": "Bad named entity: CupCap without a semi-colon", + "output": [ + [ + "Character", + "&CupCap" + ] + ] + }, + { + "input": "≍", + "description": "Named entity: CupCap; with a semi-colon", + "output": [ + [ + "Character", + "\u224d" + ] + ] + }, + { + "input": "&DD", + "description": "Bad named entity: DD without a semi-colon", + "output": [ + [ + "Character", + "&DD" + ] + ] + }, + { + "input": "ⅅ", + "description": "Named entity: DD; with a semi-colon", + "output": [ + [ + "Character", + "\u2145" + ] + ] + }, + { + "input": "&DDotrahd", + "description": "Bad named entity: DDotrahd without a semi-colon", + "output": [ + [ + "Character", + "&DDotrahd" + ] + ] + }, + { + "input": "⤑", + "description": "Named entity: DDotrahd; with a semi-colon", + "output": [ + [ + "Character", + "\u2911" + ] + ] + }, + { + "input": "&DJcy", + "description": "Bad named entity: DJcy without a semi-colon", + "output": [ + [ + "Character", + "&DJcy" + ] + ] + }, + { + "input": "Ђ", + "description": "Named entity: DJcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0402" + ] + ] + }, + { + "input": "&DScy", + "description": "Bad named entity: DScy without a semi-colon", + "output": [ + [ + "Character", + "&DScy" + ] + ] + }, + { + "input": "Ѕ", + "description": "Named entity: DScy; with a semi-colon", + "output": [ + [ + "Character", + "\u0405" + ] + ] + }, + { + "input": "&DZcy", + "description": "Bad named entity: DZcy without a semi-colon", + "output": [ + [ + "Character", + "&DZcy" + ] + ] + }, + { + "input": "Џ", + "description": "Named entity: DZcy; with a semi-colon", + "output": [ + [ + "Character", + "\u040f" + ] + ] + }, + { + "input": "&Dagger", + "description": "Bad named entity: Dagger without a semi-colon", + "output": [ + [ + "Character", + "&Dagger" + ] + ] + }, + { + "input": "‡", + "description": "Named entity: Dagger; with a semi-colon", + "output": [ + [ + "Character", + "\u2021" + ] + ] + }, + { + "input": "&Darr", + "description": "Bad named entity: Darr without a semi-colon", + "output": [ + [ + "Character", + "&Darr" + ] + ] + }, + { + "input": "↡", + "description": "Named entity: Darr; with a semi-colon", + "output": [ + [ + "Character", + "\u21a1" + ] + ] + }, + { + "input": "&Dashv", + "description": "Bad named entity: Dashv without a semi-colon", + "output": [ + [ + "Character", + "&Dashv" + ] + ] + }, + { + "input": "⫤", + "description": "Named entity: Dashv; with a semi-colon", + "output": [ + [ + "Character", + "\u2ae4" + ] + ] + }, + { + "input": "&Dcaron", + "description": "Bad named entity: Dcaron without a semi-colon", + "output": [ + [ + "Character", + "&Dcaron" + ] + ] + }, + { + "input": "Ď", + "description": "Named entity: Dcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u010e" + ] + ] + }, + { + "input": "&Dcy", + "description": "Bad named entity: Dcy without a semi-colon", + "output": [ + [ + "Character", + "&Dcy" + ] + ] + }, + { + "input": "Д", + "description": "Named entity: Dcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0414" + ] + ] + }, + { + "input": "&Del", + "description": "Bad named entity: Del without a semi-colon", + "output": [ + [ + "Character", + "&Del" + ] + ] + }, + { + "input": "∇", + "description": "Named entity: Del; with a semi-colon", + "output": [ + [ + "Character", + "\u2207" + ] + ] + }, + { + "input": "&Delta", + "description": "Bad named entity: Delta without a semi-colon", + "output": [ + [ + "Character", + "&Delta" + ] + ] + }, + { + "input": "Δ", + "description": "Named entity: Delta; with a semi-colon", + "output": [ + [ + "Character", + "\u0394" + ] + ] + }, + { + "input": "&Dfr", + "description": "Bad named entity: Dfr without a semi-colon", + "output": [ + [ + "Character", + "&Dfr" + ] + ] + }, + { + "input": "𝔇", + "description": "Named entity: Dfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd07" + ] + ] + }, + { + "input": "&DiacriticalAcute", + "description": "Bad named entity: DiacriticalAcute without a semi-colon", + "output": [ + [ + "Character", + "&DiacriticalAcute" + ] + ] + }, + { + "input": "´", + "description": "Named entity: DiacriticalAcute; with a semi-colon", + "output": [ + [ + "Character", + "\u00b4" + ] + ] + }, + { + "input": "&DiacriticalDot", + "description": "Bad named entity: DiacriticalDot without a semi-colon", + "output": [ + [ + "Character", + "&DiacriticalDot" + ] + ] + }, + { + "input": "˙", + "description": "Named entity: DiacriticalDot; with a semi-colon", + "output": [ + [ + "Character", + "\u02d9" + ] + ] + }, + { + "input": "&DiacriticalDoubleAcute", + "description": "Bad named entity: DiacriticalDoubleAcute without a semi-colon", + "output": [ + [ + "Character", + "&DiacriticalDoubleAcute" + ] + ] + }, + { + "input": "˝", + "description": "Named entity: DiacriticalDoubleAcute; with a semi-colon", + "output": [ + [ + "Character", + "\u02dd" + ] + ] + }, + { + "input": "&DiacriticalGrave", + "description": "Bad named entity: DiacriticalGrave without a semi-colon", + "output": [ + [ + "Character", + "&DiacriticalGrave" + ] + ] + }, + { + "input": "`", + "description": "Named entity: DiacriticalGrave; with a semi-colon", + "output": [ + [ + "Character", + "`" + ] + ] + }, + { + "input": "&DiacriticalTilde", + "description": "Bad named entity: DiacriticalTilde without a semi-colon", + "output": [ + [ + "Character", + "&DiacriticalTilde" + ] + ] + }, + { + "input": "˜", + "description": "Named entity: DiacriticalTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u02dc" + ] + ] + }, + { + "input": "&Diamond", + "description": "Bad named entity: Diamond without a semi-colon", + "output": [ + [ + "Character", + "&Diamond" + ] + ] + }, + { + "input": "⋄", + "description": "Named entity: Diamond; with a semi-colon", + "output": [ + [ + "Character", + "\u22c4" + ] + ] + }, + { + "input": "&DifferentialD", + "description": "Bad named entity: DifferentialD without a semi-colon", + "output": [ + [ + "Character", + "&DifferentialD" + ] + ] + }, + { + "input": "ⅆ", + "description": "Named entity: DifferentialD; with a semi-colon", + "output": [ + [ + "Character", + "\u2146" + ] + ] + }, + { + "input": "&Dopf", + "description": "Bad named entity: Dopf without a semi-colon", + "output": [ + [ + "Character", + "&Dopf" + ] + ] + }, + { + "input": "𝔻", + "description": "Named entity: Dopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd3b" + ] + ] + }, + { + "input": "&Dot", + "description": "Bad named entity: Dot without a semi-colon", + "output": [ + [ + "Character", + "&Dot" + ] + ] + }, + { + "input": "¨", + "description": "Named entity: Dot; with a semi-colon", + "output": [ + [ + "Character", + "\u00a8" + ] + ] + }, + { + "input": "&DotDot", + "description": "Bad named entity: DotDot without a semi-colon", + "output": [ + [ + "Character", + "&DotDot" + ] + ] + }, + { + "input": "⃜", + "description": "Named entity: DotDot; with a semi-colon", + "output": [ + [ + "Character", + "\u20dc" + ] + ] + }, + { + "input": "&DotEqual", + "description": "Bad named entity: DotEqual without a semi-colon", + "output": [ + [ + "Character", + "&DotEqual" + ] + ] + }, + { + "input": "≐", + "description": "Named entity: DotEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2250" + ] + ] + }, + { + "input": "&DoubleContourIntegral", + "description": "Bad named entity: DoubleContourIntegral without a semi-colon", + "output": [ + [ + "Character", + "&DoubleContourIntegral" + ] + ] + }, + { + "input": "∯", + "description": "Named entity: DoubleContourIntegral; with a semi-colon", + "output": [ + [ + "Character", + "\u222f" + ] + ] + }, + { + "input": "&DoubleDot", + "description": "Bad named entity: DoubleDot without a semi-colon", + "output": [ + [ + "Character", + "&DoubleDot" + ] + ] + }, + { + "input": "¨", + "description": "Named entity: DoubleDot; with a semi-colon", + "output": [ + [ + "Character", + "\u00a8" + ] + ] + }, + { + "input": "&DoubleDownArrow", + "description": "Bad named entity: DoubleDownArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleDownArrow" + ] + ] + }, + { + "input": "⇓", + "description": "Named entity: DoubleDownArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d3" + ] + ] + }, + { + "input": "&DoubleLeftArrow", + "description": "Bad named entity: DoubleLeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleLeftArrow" + ] + ] + }, + { + "input": "⇐", + "description": "Named entity: DoubleLeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d0" + ] + ] + }, + { + "input": "&DoubleLeftRightArrow", + "description": "Bad named entity: DoubleLeftRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleLeftRightArrow" + ] + ] + }, + { + "input": "⇔", + "description": "Named entity: DoubleLeftRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d4" + ] + ] + }, + { + "input": "&DoubleLeftTee", + "description": "Bad named entity: DoubleLeftTee without a semi-colon", + "output": [ + [ + "Character", + "&DoubleLeftTee" + ] + ] + }, + { + "input": "⫤", + "description": "Named entity: DoubleLeftTee; with a semi-colon", + "output": [ + [ + "Character", + "\u2ae4" + ] + ] + }, + { + "input": "&DoubleLongLeftArrow", + "description": "Bad named entity: DoubleLongLeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleLongLeftArrow" + ] + ] + }, + { + "input": "⟸", + "description": "Named entity: DoubleLongLeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f8" + ] + ] + }, + { + "input": "&DoubleLongLeftRightArrow", + "description": "Bad named entity: DoubleLongLeftRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleLongLeftRightArrow" + ] + ] + }, + { + "input": "⟺", + "description": "Named entity: DoubleLongLeftRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27fa" + ] + ] + }, + { + "input": "&DoubleLongRightArrow", + "description": "Bad named entity: DoubleLongRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleLongRightArrow" + ] + ] + }, + { + "input": "⟹", + "description": "Named entity: DoubleLongRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f9" + ] + ] + }, + { + "input": "&DoubleRightArrow", + "description": "Bad named entity: DoubleRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleRightArrow" + ] + ] + }, + { + "input": "⇒", + "description": "Named entity: DoubleRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d2" + ] + ] + }, + { + "input": "&DoubleRightTee", + "description": "Bad named entity: DoubleRightTee without a semi-colon", + "output": [ + [ + "Character", + "&DoubleRightTee" + ] + ] + }, + { + "input": "⊨", + "description": "Named entity: DoubleRightTee; with a semi-colon", + "output": [ + [ + "Character", + "\u22a8" + ] + ] + }, + { + "input": "&DoubleUpArrow", + "description": "Bad named entity: DoubleUpArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleUpArrow" + ] + ] + }, + { + "input": "⇑", + "description": "Named entity: DoubleUpArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d1" + ] + ] + }, + { + "input": "&DoubleUpDownArrow", + "description": "Bad named entity: DoubleUpDownArrow without a semi-colon", + "output": [ + [ + "Character", + "&DoubleUpDownArrow" + ] + ] + }, + { + "input": "⇕", + "description": "Named entity: DoubleUpDownArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d5" + ] + ] + }, + { + "input": "&DoubleVerticalBar", + "description": "Bad named entity: DoubleVerticalBar without a semi-colon", + "output": [ + [ + "Character", + "&DoubleVerticalBar" + ] + ] + }, + { + "input": "∥", + "description": "Named entity: DoubleVerticalBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2225" + ] + ] + }, + { + "input": "&DownArrow", + "description": "Bad named entity: DownArrow without a semi-colon", + "output": [ + [ + "Character", + "&DownArrow" + ] + ] + }, + { + "input": "↓", + "description": "Named entity: DownArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2193" + ] + ] + }, + { + "input": "&DownArrowBar", + "description": "Bad named entity: DownArrowBar without a semi-colon", + "output": [ + [ + "Character", + "&DownArrowBar" + ] + ] + }, + { + "input": "⤓", + "description": "Named entity: DownArrowBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2913" + ] + ] + }, + { + "input": "&DownArrowUpArrow", + "description": "Bad named entity: DownArrowUpArrow without a semi-colon", + "output": [ + [ + "Character", + "&DownArrowUpArrow" + ] + ] + }, + { + "input": "⇵", + "description": "Named entity: DownArrowUpArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21f5" + ] + ] + }, + { + "input": "&DownBreve", + "description": "Bad named entity: DownBreve without a semi-colon", + "output": [ + [ + "Character", + "&DownBreve" + ] + ] + }, + { + "input": "̑", + "description": "Named entity: DownBreve; with a semi-colon", + "output": [ + [ + "Character", + "\u0311" + ] + ] + }, + { + "input": "&DownLeftRightVector", + "description": "Bad named entity: DownLeftRightVector without a semi-colon", + "output": [ + [ + "Character", + "&DownLeftRightVector" + ] + ] + }, + { + "input": "⥐", + "description": "Named entity: DownLeftRightVector; with a semi-colon", + "output": [ + [ + "Character", + "\u2950" + ] + ] + }, + { + "input": "&DownLeftTeeVector", + "description": "Bad named entity: DownLeftTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&DownLeftTeeVector" + ] + ] + }, + { + "input": "⥞", + "description": "Named entity: DownLeftTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u295e" + ] + ] + }, + { + "input": "&DownLeftVector", + "description": "Bad named entity: DownLeftVector without a semi-colon", + "output": [ + [ + "Character", + "&DownLeftVector" + ] + ] + }, + { + "input": "↽", + "description": "Named entity: DownLeftVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21bd" + ] + ] + }, + { + "input": "&DownLeftVectorBar", + "description": "Bad named entity: DownLeftVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&DownLeftVectorBar" + ] + ] + }, + { + "input": "⥖", + "description": "Named entity: DownLeftVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2956" + ] + ] + }, + { + "input": "&DownRightTeeVector", + "description": "Bad named entity: DownRightTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&DownRightTeeVector" + ] + ] + }, + { + "input": "⥟", + "description": "Named entity: DownRightTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u295f" + ] + ] + }, + { + "input": "&DownRightVector", + "description": "Bad named entity: DownRightVector without a semi-colon", + "output": [ + [ + "Character", + "&DownRightVector" + ] + ] + }, + { + "input": "⇁", + "description": "Named entity: DownRightVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21c1" + ] + ] + }, + { + "input": "&DownRightVectorBar", + "description": "Bad named entity: DownRightVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&DownRightVectorBar" + ] + ] + }, + { + "input": "⥗", + "description": "Named entity: DownRightVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2957" + ] + ] + }, + { + "input": "&DownTee", + "description": "Bad named entity: DownTee without a semi-colon", + "output": [ + [ + "Character", + "&DownTee" + ] + ] + }, + { + "input": "⊤", + "description": "Named entity: DownTee; with a semi-colon", + "output": [ + [ + "Character", + "\u22a4" + ] + ] + }, + { + "input": "&DownTeeArrow", + "description": "Bad named entity: DownTeeArrow without a semi-colon", + "output": [ + [ + "Character", + "&DownTeeArrow" + ] + ] + }, + { + "input": "↧", + "description": "Named entity: DownTeeArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21a7" + ] + ] + }, + { + "input": "&Downarrow", + "description": "Bad named entity: Downarrow without a semi-colon", + "output": [ + [ + "Character", + "&Downarrow" + ] + ] + }, + { + "input": "⇓", + "description": "Named entity: Downarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d3" + ] + ] + }, + { + "input": "&Dscr", + "description": "Bad named entity: Dscr without a semi-colon", + "output": [ + [ + "Character", + "&Dscr" + ] + ] + }, + { + "input": "𝒟", + "description": "Named entity: Dscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udc9f" + ] + ] + }, + { + "input": "&Dstrok", + "description": "Bad named entity: Dstrok without a semi-colon", + "output": [ + [ + "Character", + "&Dstrok" + ] + ] + }, + { + "input": "Đ", + "description": "Named entity: Dstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0110" + ] + ] + }, + { + "input": "&ENG", + "description": "Bad named entity: ENG without a semi-colon", + "output": [ + [ + "Character", + "&ENG" + ] + ] + }, + { + "input": "Ŋ", + "description": "Named entity: ENG; with a semi-colon", + "output": [ + [ + "Character", + "\u014a" + ] + ] + }, + { + "input": "Ð", + "description": "Named entity: ETH without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d0" + ] + ] + }, + { + "input": "Ð", + "description": "Named entity: ETH; with a semi-colon", + "output": [ + [ + "Character", + "\u00d0" + ] + ] + }, + { + "input": "É", + "description": "Named entity: Eacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c9" + ] + ] + }, + { + "input": "É", + "description": "Named entity: Eacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00c9" + ] + ] + }, + { + "input": "&Ecaron", + "description": "Bad named entity: Ecaron without a semi-colon", + "output": [ + [ + "Character", + "&Ecaron" + ] + ] + }, + { + "input": "Ě", + "description": "Named entity: Ecaron; with a semi-colon", + "output": [ + [ + "Character", + "\u011a" + ] + ] + }, + { + "input": "Ê", + "description": "Named entity: Ecirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ca" + ] + ] + }, + { + "input": "Ê", + "description": "Named entity: Ecirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00ca" + ] + ] + }, + { + "input": "&Ecy", + "description": "Bad named entity: Ecy without a semi-colon", + "output": [ + [ + "Character", + "&Ecy" + ] + ] + }, + { + "input": "Э", + "description": "Named entity: Ecy; with a semi-colon", + "output": [ + [ + "Character", + "\u042d" + ] + ] + }, + { + "input": "&Edot", + "description": "Bad named entity: Edot without a semi-colon", + "output": [ + [ + "Character", + "&Edot" + ] + ] + }, + { + "input": "Ė", + "description": "Named entity: Edot; with a semi-colon", + "output": [ + [ + "Character", + "\u0116" + ] + ] + }, + { + "input": "&Efr", + "description": "Bad named entity: Efr without a semi-colon", + "output": [ + [ + "Character", + "&Efr" + ] + ] + }, + { + "input": "𝔈", + "description": "Named entity: Efr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd08" + ] + ] + }, + { + "input": "È", + "description": "Named entity: Egrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00c8" + ] + ] + }, + { + "input": "È", + "description": "Named entity: Egrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00c8" + ] + ] + }, + { + "input": "&Element", + "description": "Bad named entity: Element without a semi-colon", + "output": [ + [ + "Character", + "&Element" + ] + ] + }, + { + "input": "∈", + "description": "Named entity: Element; with a semi-colon", + "output": [ + [ + "Character", + "\u2208" + ] + ] + }, + { + "input": "&Emacr", + "description": "Bad named entity: Emacr without a semi-colon", + "output": [ + [ + "Character", + "&Emacr" + ] + ] + }, + { + "input": "Ē", + "description": "Named entity: Emacr; with a semi-colon", + "output": [ + [ + "Character", + "\u0112" + ] + ] + }, + { + "input": "&EmptySmallSquare", + "description": "Bad named entity: EmptySmallSquare without a semi-colon", + "output": [ + [ + "Character", + "&EmptySmallSquare" + ] + ] + }, + { + "input": "◻", + "description": "Named entity: EmptySmallSquare; with a semi-colon", + "output": [ + [ + "Character", + "\u25fb" + ] + ] + }, + { + "input": "&EmptyVerySmallSquare", + "description": "Bad named entity: EmptyVerySmallSquare without a semi-colon", + "output": [ + [ + "Character", + "&EmptyVerySmallSquare" + ] + ] + }, + { + "input": "▫", + "description": "Named entity: EmptyVerySmallSquare; with a semi-colon", + "output": [ + [ + "Character", + "\u25ab" + ] + ] + }, + { + "input": "&Eogon", + "description": "Bad named entity: Eogon without a semi-colon", + "output": [ + [ + "Character", + "&Eogon" + ] + ] + }, + { + "input": "Ę", + "description": "Named entity: Eogon; with a semi-colon", + "output": [ + [ + "Character", + "\u0118" + ] + ] + }, + { + "input": "&Eopf", + "description": "Bad named entity: Eopf without a semi-colon", + "output": [ + [ + "Character", + "&Eopf" + ] + ] + }, + { + "input": "𝔼", + "description": "Named entity: Eopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd3c" + ] + ] + }, + { + "input": "&Epsilon", + "description": "Bad named entity: Epsilon without a semi-colon", + "output": [ + [ + "Character", + "&Epsilon" + ] + ] + }, + { + "input": "Ε", + "description": "Named entity: Epsilon; with a semi-colon", + "output": [ + [ + "Character", + "\u0395" + ] + ] + }, + { + "input": "&Equal", + "description": "Bad named entity: Equal without a semi-colon", + "output": [ + [ + "Character", + "&Equal" + ] + ] + }, + { + "input": "⩵", + "description": "Named entity: Equal; with a semi-colon", + "output": [ + [ + "Character", + "\u2a75" + ] + ] + }, + { + "input": "&EqualTilde", + "description": "Bad named entity: EqualTilde without a semi-colon", + "output": [ + [ + "Character", + "&EqualTilde" + ] + ] + }, + { + "input": "≂", + "description": "Named entity: EqualTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2242" + ] + ] + }, + { + "input": "&Equilibrium", + "description": "Bad named entity: Equilibrium without a semi-colon", + "output": [ + [ + "Character", + "&Equilibrium" + ] + ] + }, + { + "input": "⇌", + "description": "Named entity: Equilibrium; with a semi-colon", + "output": [ + [ + "Character", + "\u21cc" + ] + ] + }, + { + "input": "&Escr", + "description": "Bad named entity: Escr without a semi-colon", + "output": [ + [ + "Character", + "&Escr" + ] + ] + }, + { + "input": "ℰ", + "description": "Named entity: Escr; with a semi-colon", + "output": [ + [ + "Character", + "\u2130" + ] + ] + }, + { + "input": "&Esim", + "description": "Bad named entity: Esim without a semi-colon", + "output": [ + [ + "Character", + "&Esim" + ] + ] + }, + { + "input": "⩳", + "description": "Named entity: Esim; with a semi-colon", + "output": [ + [ + "Character", + "\u2a73" + ] + ] + }, + { + "input": "&Eta", + "description": "Bad named entity: Eta without a semi-colon", + "output": [ + [ + "Character", + "&Eta" + ] + ] + }, + { + "input": "Η", + "description": "Named entity: Eta; with a semi-colon", + "output": [ + [ + "Character", + "\u0397" + ] + ] + }, + { + "input": "Ë", + "description": "Named entity: Euml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00cb" + ] + ] + }, + { + "input": "Ë", + "description": "Named entity: Euml; with a semi-colon", + "output": [ + [ + "Character", + "\u00cb" + ] + ] + }, + { + "input": "&Exists", + "description": "Bad named entity: Exists without a semi-colon", + "output": [ + [ + "Character", + "&Exists" + ] + ] + }, + { + "input": "∃", + "description": "Named entity: Exists; with a semi-colon", + "output": [ + [ + "Character", + "\u2203" + ] + ] + }, + { + "input": "&ExponentialE", + "description": "Bad named entity: ExponentialE without a semi-colon", + "output": [ + [ + "Character", + "&ExponentialE" + ] + ] + }, + { + "input": "ⅇ", + "description": "Named entity: ExponentialE; with a semi-colon", + "output": [ + [ + "Character", + "\u2147" + ] + ] + }, + { + "input": "&Fcy", + "description": "Bad named entity: Fcy without a semi-colon", + "output": [ + [ + "Character", + "&Fcy" + ] + ] + }, + { + "input": "Ф", + "description": "Named entity: Fcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0424" + ] + ] + }, + { + "input": "&Ffr", + "description": "Bad named entity: Ffr without a semi-colon", + "output": [ + [ + "Character", + "&Ffr" + ] + ] + }, + { + "input": "𝔉", + "description": "Named entity: Ffr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd09" + ] + ] + }, + { + "input": "&FilledSmallSquare", + "description": "Bad named entity: FilledSmallSquare without a semi-colon", + "output": [ + [ + "Character", + "&FilledSmallSquare" + ] + ] + }, + { + "input": "◼", + "description": "Named entity: FilledSmallSquare; with a semi-colon", + "output": [ + [ + "Character", + "\u25fc" + ] + ] + }, + { + "input": "&FilledVerySmallSquare", + "description": "Bad named entity: FilledVerySmallSquare without a semi-colon", + "output": [ + [ + "Character", + "&FilledVerySmallSquare" + ] + ] + }, + { + "input": "▪", + "description": "Named entity: FilledVerySmallSquare; with a semi-colon", + "output": [ + [ + "Character", + "\u25aa" + ] + ] + }, + { + "input": "&Fopf", + "description": "Bad named entity: Fopf without a semi-colon", + "output": [ + [ + "Character", + "&Fopf" + ] + ] + }, + { + "input": "𝔽", + "description": "Named entity: Fopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd3d" + ] + ] + }, + { + "input": "&ForAll", + "description": "Bad named entity: ForAll without a semi-colon", + "output": [ + [ + "Character", + "&ForAll" + ] + ] + }, + { + "input": "∀", + "description": "Named entity: ForAll; with a semi-colon", + "output": [ + [ + "Character", + "\u2200" + ] + ] + }, + { + "input": "&Fouriertrf", + "description": "Bad named entity: Fouriertrf without a semi-colon", + "output": [ + [ + "Character", + "&Fouriertrf" + ] + ] + }, + { + "input": "ℱ", + "description": "Named entity: Fouriertrf; with a semi-colon", + "output": [ + [ + "Character", + "\u2131" + ] + ] + }, + { + "input": "&Fscr", + "description": "Bad named entity: Fscr without a semi-colon", + "output": [ + [ + "Character", + "&Fscr" + ] + ] + }, + { + "input": "ℱ", + "description": "Named entity: Fscr; with a semi-colon", + "output": [ + [ + "Character", + "\u2131" + ] + ] + }, + { + "input": "&GJcy", + "description": "Bad named entity: GJcy without a semi-colon", + "output": [ + [ + "Character", + "&GJcy" + ] + ] + }, + { + "input": "Ѓ", + "description": "Named entity: GJcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0403" + ] + ] + }, + { + "input": ">", + "description": "Named entity: GT without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + ">" + ] + ] + }, + { + "input": ">", + "description": "Named entity: GT; with a semi-colon", + "output": [ + [ + "Character", + ">" + ] + ] + }, + { + "input": "&Gamma", + "description": "Bad named entity: Gamma without a semi-colon", + "output": [ + [ + "Character", + "&Gamma" + ] + ] + }, + { + "input": "Γ", + "description": "Named entity: Gamma; with a semi-colon", + "output": [ + [ + "Character", + "\u0393" + ] + ] + }, + { + "input": "&Gammad", + "description": "Bad named entity: Gammad without a semi-colon", + "output": [ + [ + "Character", + "&Gammad" + ] + ] + }, + { + "input": "Ϝ", + "description": "Named entity: Gammad; with a semi-colon", + "output": [ + [ + "Character", + "\u03dc" + ] + ] + }, + { + "input": "&Gbreve", + "description": "Bad named entity: Gbreve without a semi-colon", + "output": [ + [ + "Character", + "&Gbreve" + ] + ] + }, + { + "input": "Ğ", + "description": "Named entity: Gbreve; with a semi-colon", + "output": [ + [ + "Character", + "\u011e" + ] + ] + }, + { + "input": "&Gcedil", + "description": "Bad named entity: Gcedil without a semi-colon", + "output": [ + [ + "Character", + "&Gcedil" + ] + ] + }, + { + "input": "Ģ", + "description": "Named entity: Gcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0122" + ] + ] + }, + { + "input": "&Gcirc", + "description": "Bad named entity: Gcirc without a semi-colon", + "output": [ + [ + "Character", + "&Gcirc" + ] + ] + }, + { + "input": "Ĝ", + "description": "Named entity: Gcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u011c" + ] + ] + }, + { + "input": "&Gcy", + "description": "Bad named entity: Gcy without a semi-colon", + "output": [ + [ + "Character", + "&Gcy" + ] + ] + }, + { + "input": "Г", + "description": "Named entity: Gcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0413" + ] + ] + }, + { + "input": "&Gdot", + "description": "Bad named entity: Gdot without a semi-colon", + "output": [ + [ + "Character", + "&Gdot" + ] + ] + }, + { + "input": "Ġ", + "description": "Named entity: Gdot; with a semi-colon", + "output": [ + [ + "Character", + "\u0120" + ] + ] + }, + { + "input": "&Gfr", + "description": "Bad named entity: Gfr without a semi-colon", + "output": [ + [ + "Character", + "&Gfr" + ] + ] + }, + { + "input": "𝔊", + "description": "Named entity: Gfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd0a" + ] + ] + }, + { + "input": "&Gg", + "description": "Bad named entity: Gg without a semi-colon", + "output": [ + [ + "Character", + "&Gg" + ] + ] + }, + { + "input": "⋙", + "description": "Named entity: Gg; with a semi-colon", + "output": [ + [ + "Character", + "\u22d9" + ] + ] + }, + { + "input": "&Gopf", + "description": "Bad named entity: Gopf without a semi-colon", + "output": [ + [ + "Character", + "&Gopf" + ] + ] + }, + { + "input": "𝔾", + "description": "Named entity: Gopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd3e" + ] + ] + }, + { + "input": "&GreaterEqual", + "description": "Bad named entity: GreaterEqual without a semi-colon", + "output": [ + [ + "Character", + "&GreaterEqual" + ] + ] + }, + { + "input": "≥", + "description": "Named entity: GreaterEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2265" + ] + ] + }, + { + "input": "&GreaterEqualLess", + "description": "Bad named entity: GreaterEqualLess without a semi-colon", + "output": [ + [ + "Character", + "&GreaterEqualLess" + ] + ] + }, + { + "input": "⋛", + "description": "Named entity: GreaterEqualLess; with a semi-colon", + "output": [ + [ + "Character", + "\u22db" + ] + ] + }, + { + "input": "&GreaterFullEqual", + "description": "Bad named entity: GreaterFullEqual without a semi-colon", + "output": [ + [ + "Character", + "&GreaterFullEqual" + ] + ] + }, + { + "input": "≧", + "description": "Named entity: GreaterFullEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2267" + ] + ] + }, + { + "input": "&GreaterGreater", + "description": "Bad named entity: GreaterGreater without a semi-colon", + "output": [ + [ + "Character", + "&GreaterGreater" + ] + ] + }, + { + "input": "⪢", + "description": "Named entity: GreaterGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa2" + ] + ] + }, + { + "input": "&GreaterLess", + "description": "Bad named entity: GreaterLess without a semi-colon", + "output": [ + [ + "Character", + "&GreaterLess" + ] + ] + }, + { + "input": "≷", + "description": "Named entity: GreaterLess; with a semi-colon", + "output": [ + [ + "Character", + "\u2277" + ] + ] + }, + { + "input": "&GreaterSlantEqual", + "description": "Bad named entity: GreaterSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&GreaterSlantEqual" + ] + ] + }, + { + "input": "⩾", + "description": "Named entity: GreaterSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7e" + ] + ] + }, + { + "input": "&GreaterTilde", + "description": "Bad named entity: GreaterTilde without a semi-colon", + "output": [ + [ + "Character", + "&GreaterTilde" + ] + ] + }, + { + "input": "≳", + "description": "Named entity: GreaterTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2273" + ] + ] + }, + { + "input": "&Gscr", + "description": "Bad named entity: Gscr without a semi-colon", + "output": [ + [ + "Character", + "&Gscr" + ] + ] + }, + { + "input": "𝒢", + "description": "Named entity: Gscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udca2" + ] + ] + }, + { + "input": "&Gt", + "description": "Bad named entity: Gt without a semi-colon", + "output": [ + [ + "Character", + "&Gt" + ] + ] + }, + { + "input": "≫", + "description": "Named entity: Gt; with a semi-colon", + "output": [ + [ + "Character", + "\u226b" + ] + ] + }, + { + "input": "&HARDcy", + "description": "Bad named entity: HARDcy without a semi-colon", + "output": [ + [ + "Character", + "&HARDcy" + ] + ] + }, + { + "input": "Ъ", + "description": "Named entity: HARDcy; with a semi-colon", + "output": [ + [ + "Character", + "\u042a" + ] + ] + }, + { + "input": "&Hacek", + "description": "Bad named entity: Hacek without a semi-colon", + "output": [ + [ + "Character", + "&Hacek" + ] + ] + }, + { + "input": "ˇ", + "description": "Named entity: Hacek; with a semi-colon", + "output": [ + [ + "Character", + "\u02c7" + ] + ] + }, + { + "input": "&Hat", + "description": "Bad named entity: Hat without a semi-colon", + "output": [ + [ + "Character", + "&Hat" + ] + ] + }, + { + "input": "^", + "description": "Named entity: Hat; with a semi-colon", + "output": [ + [ + "Character", + "^" + ] + ] + }, + { + "input": "&Hcirc", + "description": "Bad named entity: Hcirc without a semi-colon", + "output": [ + [ + "Character", + "&Hcirc" + ] + ] + }, + { + "input": "Ĥ", + "description": "Named entity: Hcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0124" + ] + ] + }, + { + "input": "&Hfr", + "description": "Bad named entity: Hfr without a semi-colon", + "output": [ + [ + "Character", + "&Hfr" + ] + ] + }, + { + "input": "ℌ", + "description": "Named entity: Hfr; with a semi-colon", + "output": [ + [ + "Character", + "\u210c" + ] + ] + }, + { + "input": "&HilbertSpace", + "description": "Bad named entity: HilbertSpace without a semi-colon", + "output": [ + [ + "Character", + "&HilbertSpace" + ] + ] + }, + { + "input": "ℋ", + "description": "Named entity: HilbertSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u210b" + ] + ] + }, + { + "input": "&Hopf", + "description": "Bad named entity: Hopf without a semi-colon", + "output": [ + [ + "Character", + "&Hopf" + ] + ] + }, + { + "input": "ℍ", + "description": "Named entity: Hopf; with a semi-colon", + "output": [ + [ + "Character", + "\u210d" + ] + ] + }, + { + "input": "&HorizontalLine", + "description": "Bad named entity: HorizontalLine without a semi-colon", + "output": [ + [ + "Character", + "&HorizontalLine" + ] + ] + }, + { + "input": "─", + "description": "Named entity: HorizontalLine; with a semi-colon", + "output": [ + [ + "Character", + "\u2500" + ] + ] + }, + { + "input": "&Hscr", + "description": "Bad named entity: Hscr without a semi-colon", + "output": [ + [ + "Character", + "&Hscr" + ] + ] + }, + { + "input": "ℋ", + "description": "Named entity: Hscr; with a semi-colon", + "output": [ + [ + "Character", + "\u210b" + ] + ] + }, + { + "input": "&Hstrok", + "description": "Bad named entity: Hstrok without a semi-colon", + "output": [ + [ + "Character", + "&Hstrok" + ] + ] + }, + { + "input": "Ħ", + "description": "Named entity: Hstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0126" + ] + ] + }, + { + "input": "&HumpDownHump", + "description": "Bad named entity: HumpDownHump without a semi-colon", + "output": [ + [ + "Character", + "&HumpDownHump" + ] + ] + }, + { + "input": "≎", + "description": "Named entity: HumpDownHump; with a semi-colon", + "output": [ + [ + "Character", + "\u224e" + ] + ] + }, + { + "input": "&HumpEqual", + "description": "Bad named entity: HumpEqual without a semi-colon", + "output": [ + [ + "Character", + "&HumpEqual" + ] + ] + }, + { + "input": "≏", + "description": "Named entity: HumpEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u224f" + ] + ] + }, + { + "input": "&IEcy", + "description": "Bad named entity: IEcy without a semi-colon", + "output": [ + [ + "Character", + "&IEcy" + ] + ] + }, + { + "input": "Е", + "description": "Named entity: IEcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0415" + ] + ] + }, + { + "input": "&IJlig", + "description": "Bad named entity: IJlig without a semi-colon", + "output": [ + [ + "Character", + "&IJlig" + ] + ] + }, + { + "input": "IJ", + "description": "Named entity: IJlig; with a semi-colon", + "output": [ + [ + "Character", + "\u0132" + ] + ] + }, + { + "input": "&IOcy", + "description": "Bad named entity: IOcy without a semi-colon", + "output": [ + [ + "Character", + "&IOcy" + ] + ] + }, + { + "input": "Ё", + "description": "Named entity: IOcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0401" + ] + ] + }, + { + "input": "Í", + "description": "Named entity: Iacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00cd" + ] + ] + }, + { + "input": "Í", + "description": "Named entity: Iacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00cd" + ] + ] + }, + { + "input": "Î", + "description": "Named entity: Icirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ce" + ] + ] + }, + { + "input": "Î", + "description": "Named entity: Icirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00ce" + ] + ] + }, + { + "input": "&Icy", + "description": "Bad named entity: Icy without a semi-colon", + "output": [ + [ + "Character", + "&Icy" + ] + ] + }, + { + "input": "И", + "description": "Named entity: Icy; with a semi-colon", + "output": [ + [ + "Character", + "\u0418" + ] + ] + }, + { + "input": "&Idot", + "description": "Bad named entity: Idot without a semi-colon", + "output": [ + [ + "Character", + "&Idot" + ] + ] + }, + { + "input": "İ", + "description": "Named entity: Idot; with a semi-colon", + "output": [ + [ + "Character", + "\u0130" + ] + ] + }, + { + "input": "&Ifr", + "description": "Bad named entity: Ifr without a semi-colon", + "output": [ + [ + "Character", + "&Ifr" + ] + ] + }, + { + "input": "ℑ", + "description": "Named entity: Ifr; with a semi-colon", + "output": [ + [ + "Character", + "\u2111" + ] + ] + }, + { + "input": "Ì", + "description": "Named entity: Igrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00cc" + ] + ] + }, + { + "input": "Ì", + "description": "Named entity: Igrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00cc" + ] + ] + }, + { + "input": "&Im", + "description": "Bad named entity: Im without a semi-colon", + "output": [ + [ + "Character", + "&Im" + ] + ] + }, + { + "input": "ℑ", + "description": "Named entity: Im; with a semi-colon", + "output": [ + [ + "Character", + "\u2111" + ] + ] + }, + { + "input": "&Imacr", + "description": "Bad named entity: Imacr without a semi-colon", + "output": [ + [ + "Character", + "&Imacr" + ] + ] + }, + { + "input": "Ī", + "description": "Named entity: Imacr; with a semi-colon", + "output": [ + [ + "Character", + "\u012a" + ] + ] + }, + { + "input": "&ImaginaryI", + "description": "Bad named entity: ImaginaryI without a semi-colon", + "output": [ + [ + "Character", + "&ImaginaryI" + ] + ] + }, + { + "input": "ⅈ", + "description": "Named entity: ImaginaryI; with a semi-colon", + "output": [ + [ + "Character", + "\u2148" + ] + ] + }, + { + "input": "&Implies", + "description": "Bad named entity: Implies without a semi-colon", + "output": [ + [ + "Character", + "&Implies" + ] + ] + }, + { + "input": "⇒", + "description": "Named entity: Implies; with a semi-colon", + "output": [ + [ + "Character", + "\u21d2" + ] + ] + }, + { + "input": "&Int", + "description": "Bad named entity: Int without a semi-colon", + "output": [ + [ + "Character", + "&Int" + ] + ] + }, + { + "input": "∬", + "description": "Named entity: Int; with a semi-colon", + "output": [ + [ + "Character", + "\u222c" + ] + ] + }, + { + "input": "&Integral", + "description": "Bad named entity: Integral without a semi-colon", + "output": [ + [ + "Character", + "&Integral" + ] + ] + }, + { + "input": "∫", + "description": "Named entity: Integral; with a semi-colon", + "output": [ + [ + "Character", + "\u222b" + ] + ] + }, + { + "input": "&Intersection", + "description": "Bad named entity: Intersection without a semi-colon", + "output": [ + [ + "Character", + "&Intersection" + ] + ] + }, + { + "input": "⋂", + "description": "Named entity: Intersection; with a semi-colon", + "output": [ + [ + "Character", + "\u22c2" + ] + ] + }, + { + "input": "&InvisibleComma", + "description": "Bad named entity: InvisibleComma without a semi-colon", + "output": [ + [ + "Character", + "&InvisibleComma" + ] + ] + }, + { + "input": "⁣", + "description": "Named entity: InvisibleComma; with a semi-colon", + "output": [ + [ + "Character", + "\u2063" + ] + ] + }, + { + "input": "&InvisibleTimes", + "description": "Bad named entity: InvisibleTimes without a semi-colon", + "output": [ + [ + "Character", + "&InvisibleTimes" + ] + ] + }, + { + "input": "⁢", + "description": "Named entity: InvisibleTimes; with a semi-colon", + "output": [ + [ + "Character", + "\u2062" + ] + ] + }, + { + "input": "&Iogon", + "description": "Bad named entity: Iogon without a semi-colon", + "output": [ + [ + "Character", + "&Iogon" + ] + ] + }, + { + "input": "Į", + "description": "Named entity: Iogon; with a semi-colon", + "output": [ + [ + "Character", + "\u012e" + ] + ] + }, + { + "input": "&Iopf", + "description": "Bad named entity: Iopf without a semi-colon", + "output": [ + [ + "Character", + "&Iopf" + ] + ] + }, + { + "input": "𝕀", + "description": "Named entity: Iopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd40" + ] + ] + }, + { + "input": "&Iota", + "description": "Bad named entity: Iota without a semi-colon", + "output": [ + [ + "Character", + "&Iota" + ] + ] + }, + { + "input": "Ι", + "description": "Named entity: Iota; with a semi-colon", + "output": [ + [ + "Character", + "\u0399" + ] + ] + }, + { + "input": "&Iscr", + "description": "Bad named entity: Iscr without a semi-colon", + "output": [ + [ + "Character", + "&Iscr" + ] + ] + }, + { + "input": "ℐ", + "description": "Named entity: Iscr; with a semi-colon", + "output": [ + [ + "Character", + "\u2110" + ] + ] + }, + { + "input": "&Itilde", + "description": "Bad named entity: Itilde without a semi-colon", + "output": [ + [ + "Character", + "&Itilde" + ] + ] + }, + { + "input": "Ĩ", + "description": "Named entity: Itilde; with a semi-colon", + "output": [ + [ + "Character", + "\u0128" + ] + ] + }, + { + "input": "&Iukcy", + "description": "Bad named entity: Iukcy without a semi-colon", + "output": [ + [ + "Character", + "&Iukcy" + ] + ] + }, + { + "input": "І", + "description": "Named entity: Iukcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0406" + ] + ] + }, + { + "input": "Ï", + "description": "Named entity: Iuml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00cf" + ] + ] + }, + { + "input": "Ï", + "description": "Named entity: Iuml; with a semi-colon", + "output": [ + [ + "Character", + "\u00cf" + ] + ] + }, + { + "input": "&Jcirc", + "description": "Bad named entity: Jcirc without a semi-colon", + "output": [ + [ + "Character", + "&Jcirc" + ] + ] + }, + { + "input": "Ĵ", + "description": "Named entity: Jcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0134" + ] + ] + }, + { + "input": "&Jcy", + "description": "Bad named entity: Jcy without a semi-colon", + "output": [ + [ + "Character", + "&Jcy" + ] + ] + }, + { + "input": "Й", + "description": "Named entity: Jcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0419" + ] + ] + }, + { + "input": "&Jfr", + "description": "Bad named entity: Jfr without a semi-colon", + "output": [ + [ + "Character", + "&Jfr" + ] + ] + }, + { + "input": "𝔍", + "description": "Named entity: Jfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd0d" + ] + ] + }, + { + "input": "&Jopf", + "description": "Bad named entity: Jopf without a semi-colon", + "output": [ + [ + "Character", + "&Jopf" + ] + ] + }, + { + "input": "𝕁", + "description": "Named entity: Jopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd41" + ] + ] + }, + { + "input": "&Jscr", + "description": "Bad named entity: Jscr without a semi-colon", + "output": [ + [ + "Character", + "&Jscr" + ] + ] + }, + { + "input": "𝒥", + "description": "Named entity: Jscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udca5" + ] + ] + }, + { + "input": "&Jsercy", + "description": "Bad named entity: Jsercy without a semi-colon", + "output": [ + [ + "Character", + "&Jsercy" + ] + ] + }, + { + "input": "Ј", + "description": "Named entity: Jsercy; with a semi-colon", + "output": [ + [ + "Character", + "\u0408" + ] + ] + }, + { + "input": "&Jukcy", + "description": "Bad named entity: Jukcy without a semi-colon", + "output": [ + [ + "Character", + "&Jukcy" + ] + ] + }, + { + "input": "Є", + "description": "Named entity: Jukcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0404" + ] + ] + }, + { + "input": "&KHcy", + "description": "Bad named entity: KHcy without a semi-colon", + "output": [ + [ + "Character", + "&KHcy" + ] + ] + }, + { + "input": "Х", + "description": "Named entity: KHcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0425" + ] + ] + }, + { + "input": "&KJcy", + "description": "Bad named entity: KJcy without a semi-colon", + "output": [ + [ + "Character", + "&KJcy" + ] + ] + }, + { + "input": "Ќ", + "description": "Named entity: KJcy; with a semi-colon", + "output": [ + [ + "Character", + "\u040c" + ] + ] + }, + { + "input": "&Kappa", + "description": "Bad named entity: Kappa without a semi-colon", + "output": [ + [ + "Character", + "&Kappa" + ] + ] + }, + { + "input": "Κ", + "description": "Named entity: Kappa; with a semi-colon", + "output": [ + [ + "Character", + "\u039a" + ] + ] + }, + { + "input": "&Kcedil", + "description": "Bad named entity: Kcedil without a semi-colon", + "output": [ + [ + "Character", + "&Kcedil" + ] + ] + }, + { + "input": "Ķ", + "description": "Named entity: Kcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0136" + ] + ] + }, + { + "input": "&Kcy", + "description": "Bad named entity: Kcy without a semi-colon", + "output": [ + [ + "Character", + "&Kcy" + ] + ] + }, + { + "input": "К", + "description": "Named entity: Kcy; with a semi-colon", + "output": [ + [ + "Character", + "\u041a" + ] + ] + }, + { + "input": "&Kfr", + "description": "Bad named entity: Kfr without a semi-colon", + "output": [ + [ + "Character", + "&Kfr" + ] + ] + }, + { + "input": "𝔎", + "description": "Named entity: Kfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd0e" + ] + ] + }, + { + "input": "&Kopf", + "description": "Bad named entity: Kopf without a semi-colon", + "output": [ + [ + "Character", + "&Kopf" + ] + ] + }, + { + "input": "𝕂", + "description": "Named entity: Kopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd42" + ] + ] + }, + { + "input": "&Kscr", + "description": "Bad named entity: Kscr without a semi-colon", + "output": [ + [ + "Character", + "&Kscr" + ] + ] + }, + { + "input": "𝒦", + "description": "Named entity: Kscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udca6" + ] + ] + }, + { + "input": "&LJcy", + "description": "Bad named entity: LJcy without a semi-colon", + "output": [ + [ + "Character", + "&LJcy" + ] + ] + }, + { + "input": "Љ", + "description": "Named entity: LJcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0409" + ] + ] + }, + { + "input": "<", + "description": "Named entity: LT without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "<" + ] + ] + }, + { + "input": "<", + "description": "Named entity: LT; with a semi-colon", + "output": [ + [ + "Character", + "<" + ] + ] + }, + { + "input": "&Lacute", + "description": "Bad named entity: Lacute without a semi-colon", + "output": [ + [ + "Character", + "&Lacute" + ] + ] + }, + { + "input": "Ĺ", + "description": "Named entity: Lacute; with a semi-colon", + "output": [ + [ + "Character", + "\u0139" + ] + ] + }, + { + "input": "&Lambda", + "description": "Bad named entity: Lambda without a semi-colon", + "output": [ + [ + "Character", + "&Lambda" + ] + ] + }, + { + "input": "Λ", + "description": "Named entity: Lambda; with a semi-colon", + "output": [ + [ + "Character", + "\u039b" + ] + ] + }, + { + "input": "&Lang", + "description": "Bad named entity: Lang without a semi-colon", + "output": [ + [ + "Character", + "&Lang" + ] + ] + }, + { + "input": "⟪", + "description": "Named entity: Lang; with a semi-colon", + "output": [ + [ + "Character", + "\u27ea" + ] + ] + }, + { + "input": "&Laplacetrf", + "description": "Bad named entity: Laplacetrf without a semi-colon", + "output": [ + [ + "Character", + "&Laplacetrf" + ] + ] + }, + { + "input": "ℒ", + "description": "Named entity: Laplacetrf; with a semi-colon", + "output": [ + [ + "Character", + "\u2112" + ] + ] + }, + { + "input": "&Larr", + "description": "Bad named entity: Larr without a semi-colon", + "output": [ + [ + "Character", + "&Larr" + ] + ] + }, + { + "input": "↞", + "description": "Named entity: Larr; with a semi-colon", + "output": [ + [ + "Character", + "\u219e" + ] + ] + }, + { + "input": "&Lcaron", + "description": "Bad named entity: Lcaron without a semi-colon", + "output": [ + [ + "Character", + "&Lcaron" + ] + ] + }, + { + "input": "Ľ", + "description": "Named entity: Lcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u013d" + ] + ] + }, + { + "input": "&Lcedil", + "description": "Bad named entity: Lcedil without a semi-colon", + "output": [ + [ + "Character", + "&Lcedil" + ] + ] + }, + { + "input": "Ļ", + "description": "Named entity: Lcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u013b" + ] + ] + }, + { + "input": "&Lcy", + "description": "Bad named entity: Lcy without a semi-colon", + "output": [ + [ + "Character", + "&Lcy" + ] + ] + }, + { + "input": "Л", + "description": "Named entity: Lcy; with a semi-colon", + "output": [ + [ + "Character", + "\u041b" + ] + ] + }, + { + "input": "&LeftAngleBracket", + "description": "Bad named entity: LeftAngleBracket without a semi-colon", + "output": [ + [ + "Character", + "&LeftAngleBracket" + ] + ] + }, + { + "input": "⟨", + "description": "Named entity: LeftAngleBracket; with a semi-colon", + "output": [ + [ + "Character", + "\u27e8" + ] + ] + }, + { + "input": "&LeftArrow", + "description": "Bad named entity: LeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&LeftArrow" + ] + ] + }, + { + "input": "←", + "description": "Named entity: LeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2190" + ] + ] + }, + { + "input": "&LeftArrowBar", + "description": "Bad named entity: LeftArrowBar without a semi-colon", + "output": [ + [ + "Character", + "&LeftArrowBar" + ] + ] + }, + { + "input": "⇤", + "description": "Named entity: LeftArrowBar; with a semi-colon", + "output": [ + [ + "Character", + "\u21e4" + ] + ] + }, + { + "input": "&LeftArrowRightArrow", + "description": "Bad named entity: LeftArrowRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&LeftArrowRightArrow" + ] + ] + }, + { + "input": "⇆", + "description": "Named entity: LeftArrowRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21c6" + ] + ] + }, + { + "input": "&LeftCeiling", + "description": "Bad named entity: LeftCeiling without a semi-colon", + "output": [ + [ + "Character", + "&LeftCeiling" + ] + ] + }, + { + "input": "⌈", + "description": "Named entity: LeftCeiling; with a semi-colon", + "output": [ + [ + "Character", + "\u2308" + ] + ] + }, + { + "input": "&LeftDoubleBracket", + "description": "Bad named entity: LeftDoubleBracket without a semi-colon", + "output": [ + [ + "Character", + "&LeftDoubleBracket" + ] + ] + }, + { + "input": "⟦", + "description": "Named entity: LeftDoubleBracket; with a semi-colon", + "output": [ + [ + "Character", + "\u27e6" + ] + ] + }, + { + "input": "&LeftDownTeeVector", + "description": "Bad named entity: LeftDownTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftDownTeeVector" + ] + ] + }, + { + "input": "⥡", + "description": "Named entity: LeftDownTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u2961" + ] + ] + }, + { + "input": "&LeftDownVector", + "description": "Bad named entity: LeftDownVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftDownVector" + ] + ] + }, + { + "input": "⇃", + "description": "Named entity: LeftDownVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21c3" + ] + ] + }, + { + "input": "&LeftDownVectorBar", + "description": "Bad named entity: LeftDownVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&LeftDownVectorBar" + ] + ] + }, + { + "input": "⥙", + "description": "Named entity: LeftDownVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2959" + ] + ] + }, + { + "input": "&LeftFloor", + "description": "Bad named entity: LeftFloor without a semi-colon", + "output": [ + [ + "Character", + "&LeftFloor" + ] + ] + }, + { + "input": "⌊", + "description": "Named entity: LeftFloor; with a semi-colon", + "output": [ + [ + "Character", + "\u230a" + ] + ] + }, + { + "input": "&LeftRightArrow", + "description": "Bad named entity: LeftRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&LeftRightArrow" + ] + ] + }, + { + "input": "↔", + "description": "Named entity: LeftRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2194" + ] + ] + }, + { + "input": "&LeftRightVector", + "description": "Bad named entity: LeftRightVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftRightVector" + ] + ] + }, + { + "input": "⥎", + "description": "Named entity: LeftRightVector; with a semi-colon", + "output": [ + [ + "Character", + "\u294e" + ] + ] + }, + { + "input": "&LeftTee", + "description": "Bad named entity: LeftTee without a semi-colon", + "output": [ + [ + "Character", + "&LeftTee" + ] + ] + }, + { + "input": "⊣", + "description": "Named entity: LeftTee; with a semi-colon", + "output": [ + [ + "Character", + "\u22a3" + ] + ] + }, + { + "input": "&LeftTeeArrow", + "description": "Bad named entity: LeftTeeArrow without a semi-colon", + "output": [ + [ + "Character", + "&LeftTeeArrow" + ] + ] + }, + { + "input": "↤", + "description": "Named entity: LeftTeeArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21a4" + ] + ] + }, + { + "input": "&LeftTeeVector", + "description": "Bad named entity: LeftTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftTeeVector" + ] + ] + }, + { + "input": "⥚", + "description": "Named entity: LeftTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u295a" + ] + ] + }, + { + "input": "&LeftTriangle", + "description": "Bad named entity: LeftTriangle without a semi-colon", + "output": [ + [ + "Character", + "&LeftTriangle" + ] + ] + }, + { + "input": "⊲", + "description": "Named entity: LeftTriangle; with a semi-colon", + "output": [ + [ + "Character", + "\u22b2" + ] + ] + }, + { + "input": "&LeftTriangleBar", + "description": "Bad named entity: LeftTriangleBar without a semi-colon", + "output": [ + [ + "Character", + "&LeftTriangleBar" + ] + ] + }, + { + "input": "⧏", + "description": "Named entity: LeftTriangleBar; with a semi-colon", + "output": [ + [ + "Character", + "\u29cf" + ] + ] + }, + { + "input": "&LeftTriangleEqual", + "description": "Bad named entity: LeftTriangleEqual without a semi-colon", + "output": [ + [ + "Character", + "&LeftTriangleEqual" + ] + ] + }, + { + "input": "⊴", + "description": "Named entity: LeftTriangleEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22b4" + ] + ] + }, + { + "input": "&LeftUpDownVector", + "description": "Bad named entity: LeftUpDownVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftUpDownVector" + ] + ] + }, + { + "input": "⥑", + "description": "Named entity: LeftUpDownVector; with a semi-colon", + "output": [ + [ + "Character", + "\u2951" + ] + ] + }, + { + "input": "&LeftUpTeeVector", + "description": "Bad named entity: LeftUpTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftUpTeeVector" + ] + ] + }, + { + "input": "⥠", + "description": "Named entity: LeftUpTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u2960" + ] + ] + }, + { + "input": "&LeftUpVector", + "description": "Bad named entity: LeftUpVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftUpVector" + ] + ] + }, + { + "input": "↿", + "description": "Named entity: LeftUpVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21bf" + ] + ] + }, + { + "input": "&LeftUpVectorBar", + "description": "Bad named entity: LeftUpVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&LeftUpVectorBar" + ] + ] + }, + { + "input": "⥘", + "description": "Named entity: LeftUpVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2958" + ] + ] + }, + { + "input": "&LeftVector", + "description": "Bad named entity: LeftVector without a semi-colon", + "output": [ + [ + "Character", + "&LeftVector" + ] + ] + }, + { + "input": "↼", + "description": "Named entity: LeftVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21bc" + ] + ] + }, + { + "input": "&LeftVectorBar", + "description": "Bad named entity: LeftVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&LeftVectorBar" + ] + ] + }, + { + "input": "⥒", + "description": "Named entity: LeftVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2952" + ] + ] + }, + { + "input": "&Leftarrow", + "description": "Bad named entity: Leftarrow without a semi-colon", + "output": [ + [ + "Character", + "&Leftarrow" + ] + ] + }, + { + "input": "⇐", + "description": "Named entity: Leftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d0" + ] + ] + }, + { + "input": "&Leftrightarrow", + "description": "Bad named entity: Leftrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&Leftrightarrow" + ] + ] + }, + { + "input": "⇔", + "description": "Named entity: Leftrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d4" + ] + ] + }, + { + "input": "&LessEqualGreater", + "description": "Bad named entity: LessEqualGreater without a semi-colon", + "output": [ + [ + "Character", + "&LessEqualGreater" + ] + ] + }, + { + "input": "⋚", + "description": "Named entity: LessEqualGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u22da" + ] + ] + }, + { + "input": "&LessFullEqual", + "description": "Bad named entity: LessFullEqual without a semi-colon", + "output": [ + [ + "Character", + "&LessFullEqual" + ] + ] + }, + { + "input": "≦", + "description": "Named entity: LessFullEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2266" + ] + ] + }, + { + "input": "&LessGreater", + "description": "Bad named entity: LessGreater without a semi-colon", + "output": [ + [ + "Character", + "&LessGreater" + ] + ] + }, + { + "input": "≶", + "description": "Named entity: LessGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u2276" + ] + ] + }, + { + "input": "&LessLess", + "description": "Bad named entity: LessLess without a semi-colon", + "output": [ + [ + "Character", + "&LessLess" + ] + ] + }, + { + "input": "⪡", + "description": "Named entity: LessLess; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa1" + ] + ] + }, + { + "input": "&LessSlantEqual", + "description": "Bad named entity: LessSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&LessSlantEqual" + ] + ] + }, + { + "input": "⩽", + "description": "Named entity: LessSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7d" + ] + ] + }, + { + "input": "&LessTilde", + "description": "Bad named entity: LessTilde without a semi-colon", + "output": [ + [ + "Character", + "&LessTilde" + ] + ] + }, + { + "input": "≲", + "description": "Named entity: LessTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2272" + ] + ] + }, + { + "input": "&Lfr", + "description": "Bad named entity: Lfr without a semi-colon", + "output": [ + [ + "Character", + "&Lfr" + ] + ] + }, + { + "input": "𝔏", + "description": "Named entity: Lfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd0f" + ] + ] + }, + { + "input": "&Ll", + "description": "Bad named entity: Ll without a semi-colon", + "output": [ + [ + "Character", + "&Ll" + ] + ] + }, + { + "input": "⋘", + "description": "Named entity: Ll; with a semi-colon", + "output": [ + [ + "Character", + "\u22d8" + ] + ] + }, + { + "input": "&Lleftarrow", + "description": "Bad named entity: Lleftarrow without a semi-colon", + "output": [ + [ + "Character", + "&Lleftarrow" + ] + ] + }, + { + "input": "⇚", + "description": "Named entity: Lleftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21da" + ] + ] + }, + { + "input": "&Lmidot", + "description": "Bad named entity: Lmidot without a semi-colon", + "output": [ + [ + "Character", + "&Lmidot" + ] + ] + }, + { + "input": "Ŀ", + "description": "Named entity: Lmidot; with a semi-colon", + "output": [ + [ + "Character", + "\u013f" + ] + ] + }, + { + "input": "&LongLeftArrow", + "description": "Bad named entity: LongLeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&LongLeftArrow" + ] + ] + }, + { + "input": "⟵", + "description": "Named entity: LongLeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f5" + ] + ] + }, + { + "input": "&LongLeftRightArrow", + "description": "Bad named entity: LongLeftRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&LongLeftRightArrow" + ] + ] + }, + { + "input": "⟷", + "description": "Named entity: LongLeftRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f7" + ] + ] + }, + { + "input": "&LongRightArrow", + "description": "Bad named entity: LongRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&LongRightArrow" + ] + ] + }, + { + "input": "⟶", + "description": "Named entity: LongRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f6" + ] + ] + }, + { + "input": "&Longleftarrow", + "description": "Bad named entity: Longleftarrow without a semi-colon", + "output": [ + [ + "Character", + "&Longleftarrow" + ] + ] + }, + { + "input": "⟸", + "description": "Named entity: Longleftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f8" + ] + ] + }, + { + "input": "&Longleftrightarrow", + "description": "Bad named entity: Longleftrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&Longleftrightarrow" + ] + ] + }, + { + "input": "⟺", + "description": "Named entity: Longleftrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27fa" + ] + ] + }, + { + "input": "&Longrightarrow", + "description": "Bad named entity: Longrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&Longrightarrow" + ] + ] + }, + { + "input": "⟹", + "description": "Named entity: Longrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f9" + ] + ] + }, + { + "input": "&Lopf", + "description": "Bad named entity: Lopf without a semi-colon", + "output": [ + [ + "Character", + "&Lopf" + ] + ] + }, + { + "input": "𝕃", + "description": "Named entity: Lopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd43" + ] + ] + }, + { + "input": "&LowerLeftArrow", + "description": "Bad named entity: LowerLeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&LowerLeftArrow" + ] + ] + }, + { + "input": "↙", + "description": "Named entity: LowerLeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2199" + ] + ] + }, + { + "input": "&LowerRightArrow", + "description": "Bad named entity: LowerRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&LowerRightArrow" + ] + ] + }, + { + "input": "↘", + "description": "Named entity: LowerRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2198" + ] + ] + }, + { + "input": "&Lscr", + "description": "Bad named entity: Lscr without a semi-colon", + "output": [ + [ + "Character", + "&Lscr" + ] + ] + }, + { + "input": "ℒ", + "description": "Named entity: Lscr; with a semi-colon", + "output": [ + [ + "Character", + "\u2112" + ] + ] + }, + { + "input": "&Lsh", + "description": "Bad named entity: Lsh without a semi-colon", + "output": [ + [ + "Character", + "&Lsh" + ] + ] + }, + { + "input": "↰", + "description": "Named entity: Lsh; with a semi-colon", + "output": [ + [ + "Character", + "\u21b0" + ] + ] + }, + { + "input": "&Lstrok", + "description": "Bad named entity: Lstrok without a semi-colon", + "output": [ + [ + "Character", + "&Lstrok" + ] + ] + }, + { + "input": "Ł", + "description": "Named entity: Lstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0141" + ] + ] + }, + { + "input": "&Lt", + "description": "Bad named entity: Lt without a semi-colon", + "output": [ + [ + "Character", + "&Lt" + ] + ] + }, + { + "input": "≪", + "description": "Named entity: Lt; with a semi-colon", + "output": [ + [ + "Character", + "\u226a" + ] + ] + }, + { + "input": "&Map", + "description": "Bad named entity: Map without a semi-colon", + "output": [ + [ + "Character", + "&Map" + ] + ] + }, + { + "input": "⤅", + "description": "Named entity: Map; with a semi-colon", + "output": [ + [ + "Character", + "\u2905" + ] + ] + }, + { + "input": "&Mcy", + "description": "Bad named entity: Mcy without a semi-colon", + "output": [ + [ + "Character", + "&Mcy" + ] + ] + }, + { + "input": "М", + "description": "Named entity: Mcy; with a semi-colon", + "output": [ + [ + "Character", + "\u041c" + ] + ] + }, + { + "input": "&MediumSpace", + "description": "Bad named entity: MediumSpace without a semi-colon", + "output": [ + [ + "Character", + "&MediumSpace" + ] + ] + }, + { + "input": " ", + "description": "Named entity: MediumSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u205f" + ] + ] + }, + { + "input": "&Mellintrf", + "description": "Bad named entity: Mellintrf without a semi-colon", + "output": [ + [ + "Character", + "&Mellintrf" + ] + ] + }, + { + "input": "ℳ", + "description": "Named entity: Mellintrf; with a semi-colon", + "output": [ + [ + "Character", + "\u2133" + ] + ] + }, + { + "input": "&Mfr", + "description": "Bad named entity: Mfr without a semi-colon", + "output": [ + [ + "Character", + "&Mfr" + ] + ] + }, + { + "input": "𝔐", + "description": "Named entity: Mfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd10" + ] + ] + }, + { + "input": "&MinusPlus", + "description": "Bad named entity: MinusPlus without a semi-colon", + "output": [ + [ + "Character", + "&MinusPlus" + ] + ] + }, + { + "input": "∓", + "description": "Named entity: MinusPlus; with a semi-colon", + "output": [ + [ + "Character", + "\u2213" + ] + ] + }, + { + "input": "&Mopf", + "description": "Bad named entity: Mopf without a semi-colon", + "output": [ + [ + "Character", + "&Mopf" + ] + ] + }, + { + "input": "𝕄", + "description": "Named entity: Mopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd44" + ] + ] + }, + { + "input": "&Mscr", + "description": "Bad named entity: Mscr without a semi-colon", + "output": [ + [ + "Character", + "&Mscr" + ] + ] + }, + { + "input": "ℳ", + "description": "Named entity: Mscr; with a semi-colon", + "output": [ + [ + "Character", + "\u2133" + ] + ] + }, + { + "input": "&Mu", + "description": "Bad named entity: Mu without a semi-colon", + "output": [ + [ + "Character", + "&Mu" + ] + ] + }, + { + "input": "Μ", + "description": "Named entity: Mu; with a semi-colon", + "output": [ + [ + "Character", + "\u039c" + ] + ] + }, + { + "input": "&NJcy", + "description": "Bad named entity: NJcy without a semi-colon", + "output": [ + [ + "Character", + "&NJcy" + ] + ] + }, + { + "input": "Њ", + "description": "Named entity: NJcy; with a semi-colon", + "output": [ + [ + "Character", + "\u040a" + ] + ] + }, + { + "input": "&Nacute", + "description": "Bad named entity: Nacute without a semi-colon", + "output": [ + [ + "Character", + "&Nacute" + ] + ] + }, + { + "input": "Ń", + "description": "Named entity: Nacute; with a semi-colon", + "output": [ + [ + "Character", + "\u0143" + ] + ] + }, + { + "input": "&Ncaron", + "description": "Bad named entity: Ncaron without a semi-colon", + "output": [ + [ + "Character", + "&Ncaron" + ] + ] + }, + { + "input": "Ň", + "description": "Named entity: Ncaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0147" + ] + ] + }, + { + "input": "&Ncedil", + "description": "Bad named entity: Ncedil without a semi-colon", + "output": [ + [ + "Character", + "&Ncedil" + ] + ] + }, + { + "input": "Ņ", + "description": "Named entity: Ncedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0145" + ] + ] + }, + { + "input": "&Ncy", + "description": "Bad named entity: Ncy without a semi-colon", + "output": [ + [ + "Character", + "&Ncy" + ] + ] + }, + { + "input": "Н", + "description": "Named entity: Ncy; with a semi-colon", + "output": [ + [ + "Character", + "\u041d" + ] + ] + }, + { + "input": "&NegativeMediumSpace", + "description": "Bad named entity: NegativeMediumSpace without a semi-colon", + "output": [ + [ + "Character", + "&NegativeMediumSpace" + ] + ] + }, + { + "input": "​", + "description": "Named entity: NegativeMediumSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u200b" + ] + ] + }, + { + "input": "&NegativeThickSpace", + "description": "Bad named entity: NegativeThickSpace without a semi-colon", + "output": [ + [ + "Character", + "&NegativeThickSpace" + ] + ] + }, + { + "input": "​", + "description": "Named entity: NegativeThickSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u200b" + ] + ] + }, + { + "input": "&NegativeThinSpace", + "description": "Bad named entity: NegativeThinSpace without a semi-colon", + "output": [ + [ + "Character", + "&NegativeThinSpace" + ] + ] + }, + { + "input": "​", + "description": "Named entity: NegativeThinSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u200b" + ] + ] + }, + { + "input": "&NegativeVeryThinSpace", + "description": "Bad named entity: NegativeVeryThinSpace without a semi-colon", + "output": [ + [ + "Character", + "&NegativeVeryThinSpace" + ] + ] + }, + { + "input": "​", + "description": "Named entity: NegativeVeryThinSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u200b" + ] + ] + }, + { + "input": "&NestedGreaterGreater", + "description": "Bad named entity: NestedGreaterGreater without a semi-colon", + "output": [ + [ + "Character", + "&NestedGreaterGreater" + ] + ] + }, + { + "input": "≫", + "description": "Named entity: NestedGreaterGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u226b" + ] + ] + }, + { + "input": "&NestedLessLess", + "description": "Bad named entity: NestedLessLess without a semi-colon", + "output": [ + [ + "Character", + "&NestedLessLess" + ] + ] + }, + { + "input": "≪", + "description": "Named entity: NestedLessLess; with a semi-colon", + "output": [ + [ + "Character", + "\u226a" + ] + ] + }, + { + "input": "&NewLine", + "description": "Bad named entity: NewLine without a semi-colon", + "output": [ + [ + "Character", + "&NewLine" + ] + ] + }, + { + "input": "
", + "description": "Named entity: NewLine; with a semi-colon", + "output": [ + [ + "Character", + "\n" + ] + ] + }, + { + "input": "&Nfr", + "description": "Bad named entity: Nfr without a semi-colon", + "output": [ + [ + "Character", + "&Nfr" + ] + ] + }, + { + "input": "𝔑", + "description": "Named entity: Nfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd11" + ] + ] + }, + { + "input": "&NoBreak", + "description": "Bad named entity: NoBreak without a semi-colon", + "output": [ + [ + "Character", + "&NoBreak" + ] + ] + }, + { + "input": "⁠", + "description": "Named entity: NoBreak; with a semi-colon", + "output": [ + [ + "Character", + "\u2060" + ] + ] + }, + { + "input": "&NonBreakingSpace", + "description": "Bad named entity: NonBreakingSpace without a semi-colon", + "output": [ + [ + "Character", + "&NonBreakingSpace" + ] + ] + }, + { + "input": " ", + "description": "Named entity: NonBreakingSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u00a0" + ] + ] + }, + { + "input": "&Nopf", + "description": "Bad named entity: Nopf without a semi-colon", + "output": [ + [ + "Character", + "&Nopf" + ] + ] + }, + { + "input": "ℕ", + "description": "Named entity: Nopf; with a semi-colon", + "output": [ + [ + "Character", + "\u2115" + ] + ] + }, + { + "input": "&Not", + "description": "Bad named entity: Not without a semi-colon", + "output": [ + [ + "Character", + "&Not" + ] + ] + }, + { + "input": "⫬", + "description": "Named entity: Not; with a semi-colon", + "output": [ + [ + "Character", + "\u2aec" + ] + ] + }, + { + "input": "&NotCongruent", + "description": "Bad named entity: NotCongruent without a semi-colon", + "output": [ + [ + "Character", + "&NotCongruent" + ] + ] + }, + { + "input": "≢", + "description": "Named entity: NotCongruent; with a semi-colon", + "output": [ + [ + "Character", + "\u2262" + ] + ] + }, + { + "input": "&NotCupCap", + "description": "Bad named entity: NotCupCap without a semi-colon", + "output": [ + [ + "Character", + "&NotCupCap" + ] + ] + }, + { + "input": "≭", + "description": "Named entity: NotCupCap; with a semi-colon", + "output": [ + [ + "Character", + "\u226d" + ] + ] + }, + { + "input": "&NotDoubleVerticalBar", + "description": "Bad named entity: NotDoubleVerticalBar without a semi-colon", + "output": [ + [ + "Character", + "&NotDoubleVerticalBar" + ] + ] + }, + { + "input": "∦", + "description": "Named entity: NotDoubleVerticalBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2226" + ] + ] + }, + { + "input": "&NotElement", + "description": "Bad named entity: NotElement without a semi-colon", + "output": [ + [ + "Character", + "&NotElement" + ] + ] + }, + { + "input": "∉", + "description": "Named entity: NotElement; with a semi-colon", + "output": [ + [ + "Character", + "\u2209" + ] + ] + }, + { + "input": "&NotEqual", + "description": "Bad named entity: NotEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotEqual" + ] + ] + }, + { + "input": "≠", + "description": "Named entity: NotEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2260" + ] + ] + }, + { + "input": "&NotEqualTilde", + "description": "Bad named entity: NotEqualTilde without a semi-colon", + "output": [ + [ + "Character", + "&NotEqualTilde" + ] + ] + }, + { + "input": "≂̸", + "description": "Named entity: NotEqualTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2242\u0338" + ] + ] + }, + { + "input": "&NotExists", + "description": "Bad named entity: NotExists without a semi-colon", + "output": [ + [ + "Character", + "&NotExists" + ] + ] + }, + { + "input": "∄", + "description": "Named entity: NotExists; with a semi-colon", + "output": [ + [ + "Character", + "\u2204" + ] + ] + }, + { + "input": "&NotGreater", + "description": "Bad named entity: NotGreater without a semi-colon", + "output": [ + [ + "Character", + "&NotGreater" + ] + ] + }, + { + "input": "≯", + "description": "Named entity: NotGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u226f" + ] + ] + }, + { + "input": "&NotGreaterEqual", + "description": "Bad named entity: NotGreaterEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotGreaterEqual" + ] + ] + }, + { + "input": "≱", + "description": "Named entity: NotGreaterEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2271" + ] + ] + }, + { + "input": "&NotGreaterFullEqual", + "description": "Bad named entity: NotGreaterFullEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotGreaterFullEqual" + ] + ] + }, + { + "input": "≧̸", + "description": "Named entity: NotGreaterFullEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2267\u0338" + ] + ] + }, + { + "input": "&NotGreaterGreater", + "description": "Bad named entity: NotGreaterGreater without a semi-colon", + "output": [ + [ + "Character", + "&NotGreaterGreater" + ] + ] + }, + { + "input": "≫̸", + "description": "Named entity: NotGreaterGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u226b\u0338" + ] + ] + }, + { + "input": "&NotGreaterLess", + "description": "Bad named entity: NotGreaterLess without a semi-colon", + "output": [ + [ + "Character", + "&NotGreaterLess" + ] + ] + }, + { + "input": "≹", + "description": "Named entity: NotGreaterLess; with a semi-colon", + "output": [ + [ + "Character", + "\u2279" + ] + ] + }, + { + "input": "&NotGreaterSlantEqual", + "description": "Bad named entity: NotGreaterSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotGreaterSlantEqual" + ] + ] + }, + { + "input": "⩾̸", + "description": "Named entity: NotGreaterSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7e\u0338" + ] + ] + }, + { + "input": "&NotGreaterTilde", + "description": "Bad named entity: NotGreaterTilde without a semi-colon", + "output": [ + [ + "Character", + "&NotGreaterTilde" + ] + ] + }, + { + "input": "≵", + "description": "Named entity: NotGreaterTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2275" + ] + ] + }, + { + "input": "&NotHumpDownHump", + "description": "Bad named entity: NotHumpDownHump without a semi-colon", + "output": [ + [ + "Character", + "&NotHumpDownHump" + ] + ] + }, + { + "input": "≎̸", + "description": "Named entity: NotHumpDownHump; with a semi-colon", + "output": [ + [ + "Character", + "\u224e\u0338" + ] + ] + }, + { + "input": "&NotHumpEqual", + "description": "Bad named entity: NotHumpEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotHumpEqual" + ] + ] + }, + { + "input": "≏̸", + "description": "Named entity: NotHumpEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u224f\u0338" + ] + ] + }, + { + "input": "&NotLeftTriangle", + "description": "Bad named entity: NotLeftTriangle without a semi-colon", + "output": [ + [ + "Character", + "&NotLeftTriangle" + ] + ] + }, + { + "input": "⋪", + "description": "Named entity: NotLeftTriangle; with a semi-colon", + "output": [ + [ + "Character", + "\u22ea" + ] + ] + }, + { + "input": "&NotLeftTriangleBar", + "description": "Bad named entity: NotLeftTriangleBar without a semi-colon", + "output": [ + [ + "Character", + "&NotLeftTriangleBar" + ] + ] + }, + { + "input": "⧏̸", + "description": "Named entity: NotLeftTriangleBar; with a semi-colon", + "output": [ + [ + "Character", + "\u29cf\u0338" + ] + ] + }, + { + "input": "&NotLeftTriangleEqual", + "description": "Bad named entity: NotLeftTriangleEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotLeftTriangleEqual" + ] + ] + }, + { + "input": "⋬", + "description": "Named entity: NotLeftTriangleEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22ec" + ] + ] + }, + { + "input": "&NotLess", + "description": "Bad named entity: NotLess without a semi-colon", + "output": [ + [ + "Character", + "&NotLess" + ] + ] + }, + { + "input": "≮", + "description": "Named entity: NotLess; with a semi-colon", + "output": [ + [ + "Character", + "\u226e" + ] + ] + }, + { + "input": "&NotLessEqual", + "description": "Bad named entity: NotLessEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotLessEqual" + ] + ] + }, + { + "input": "≰", + "description": "Named entity: NotLessEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2270" + ] + ] + }, + { + "input": "&NotLessGreater", + "description": "Bad named entity: NotLessGreater without a semi-colon", + "output": [ + [ + "Character", + "&NotLessGreater" + ] + ] + }, + { + "input": "≸", + "description": "Named entity: NotLessGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u2278" + ] + ] + }, + { + "input": "&NotLessLess", + "description": "Bad named entity: NotLessLess without a semi-colon", + "output": [ + [ + "Character", + "&NotLessLess" + ] + ] + }, + { + "input": "≪̸", + "description": "Named entity: NotLessLess; with a semi-colon", + "output": [ + [ + "Character", + "\u226a\u0338" + ] + ] + }, + { + "input": "&NotLessSlantEqual", + "description": "Bad named entity: NotLessSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotLessSlantEqual" + ] + ] + }, + { + "input": "⩽̸", + "description": "Named entity: NotLessSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7d\u0338" + ] + ] + }, + { + "input": "&NotLessTilde", + "description": "Bad named entity: NotLessTilde without a semi-colon", + "output": [ + [ + "Character", + "&NotLessTilde" + ] + ] + }, + { + "input": "≴", + "description": "Named entity: NotLessTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2274" + ] + ] + }, + { + "input": "&NotNestedGreaterGreater", + "description": "Bad named entity: NotNestedGreaterGreater without a semi-colon", + "output": [ + [ + "Character", + "&NotNestedGreaterGreater" + ] + ] + }, + { + "input": "⪢̸", + "description": "Named entity: NotNestedGreaterGreater; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa2\u0338" + ] + ] + }, + { + "input": "&NotNestedLessLess", + "description": "Bad named entity: NotNestedLessLess without a semi-colon", + "output": [ + [ + "Character", + "&NotNestedLessLess" + ] + ] + }, + { + "input": "⪡̸", + "description": "Named entity: NotNestedLessLess; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa1\u0338" + ] + ] + }, + { + "input": "&NotPrecedes", + "description": "Bad named entity: NotPrecedes without a semi-colon", + "output": [ + [ + "Character", + "&NotPrecedes" + ] + ] + }, + { + "input": "⊀", + "description": "Named entity: NotPrecedes; with a semi-colon", + "output": [ + [ + "Character", + "\u2280" + ] + ] + }, + { + "input": "&NotPrecedesEqual", + "description": "Bad named entity: NotPrecedesEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotPrecedesEqual" + ] + ] + }, + { + "input": "⪯̸", + "description": "Named entity: NotPrecedesEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2aaf\u0338" + ] + ] + }, + { + "input": "&NotPrecedesSlantEqual", + "description": "Bad named entity: NotPrecedesSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotPrecedesSlantEqual" + ] + ] + }, + { + "input": "⋠", + "description": "Named entity: NotPrecedesSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22e0" + ] + ] + }, + { + "input": "&NotReverseElement", + "description": "Bad named entity: NotReverseElement without a semi-colon", + "output": [ + [ + "Character", + "&NotReverseElement" + ] + ] + }, + { + "input": "∌", + "description": "Named entity: NotReverseElement; with a semi-colon", + "output": [ + [ + "Character", + "\u220c" + ] + ] + }, + { + "input": "&NotRightTriangle", + "description": "Bad named entity: NotRightTriangle without a semi-colon", + "output": [ + [ + "Character", + "&NotRightTriangle" + ] + ] + }, + { + "input": "⋫", + "description": "Named entity: NotRightTriangle; with a semi-colon", + "output": [ + [ + "Character", + "\u22eb" + ] + ] + }, + { + "input": "&NotRightTriangleBar", + "description": "Bad named entity: NotRightTriangleBar without a semi-colon", + "output": [ + [ + "Character", + "&NotRightTriangleBar" + ] + ] + }, + { + "input": "⧐̸", + "description": "Named entity: NotRightTriangleBar; with a semi-colon", + "output": [ + [ + "Character", + "\u29d0\u0338" + ] + ] + }, + { + "input": "&NotRightTriangleEqual", + "description": "Bad named entity: NotRightTriangleEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotRightTriangleEqual" + ] + ] + }, + { + "input": "⋭", + "description": "Named entity: NotRightTriangleEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22ed" + ] + ] + }, + { + "input": "&NotSquareSubset", + "description": "Bad named entity: NotSquareSubset without a semi-colon", + "output": [ + [ + "Character", + "&NotSquareSubset" + ] + ] + }, + { + "input": "⊏̸", + "description": "Named entity: NotSquareSubset; with a semi-colon", + "output": [ + [ + "Character", + "\u228f\u0338" + ] + ] + }, + { + "input": "&NotSquareSubsetEqual", + "description": "Bad named entity: NotSquareSubsetEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotSquareSubsetEqual" + ] + ] + }, + { + "input": "⋢", + "description": "Named entity: NotSquareSubsetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22e2" + ] + ] + }, + { + "input": "&NotSquareSuperset", + "description": "Bad named entity: NotSquareSuperset without a semi-colon", + "output": [ + [ + "Character", + "&NotSquareSuperset" + ] + ] + }, + { + "input": "⊐̸", + "description": "Named entity: NotSquareSuperset; with a semi-colon", + "output": [ + [ + "Character", + "\u2290\u0338" + ] + ] + }, + { + "input": "&NotSquareSupersetEqual", + "description": "Bad named entity: NotSquareSupersetEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotSquareSupersetEqual" + ] + ] + }, + { + "input": "⋣", + "description": "Named entity: NotSquareSupersetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22e3" + ] + ] + }, + { + "input": "&NotSubset", + "description": "Bad named entity: NotSubset without a semi-colon", + "output": [ + [ + "Character", + "&NotSubset" + ] + ] + }, + { + "input": "⊂⃒", + "description": "Named entity: NotSubset; with a semi-colon", + "output": [ + [ + "Character", + "\u2282\u20d2" + ] + ] + }, + { + "input": "&NotSubsetEqual", + "description": "Bad named entity: NotSubsetEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotSubsetEqual" + ] + ] + }, + { + "input": "⊈", + "description": "Named entity: NotSubsetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2288" + ] + ] + }, + { + "input": "&NotSucceeds", + "description": "Bad named entity: NotSucceeds without a semi-colon", + "output": [ + [ + "Character", + "&NotSucceeds" + ] + ] + }, + { + "input": "⊁", + "description": "Named entity: NotSucceeds; with a semi-colon", + "output": [ + [ + "Character", + "\u2281" + ] + ] + }, + { + "input": "&NotSucceedsEqual", + "description": "Bad named entity: NotSucceedsEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotSucceedsEqual" + ] + ] + }, + { + "input": "⪰̸", + "description": "Named entity: NotSucceedsEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab0\u0338" + ] + ] + }, + { + "input": "&NotSucceedsSlantEqual", + "description": "Bad named entity: NotSucceedsSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotSucceedsSlantEqual" + ] + ] + }, + { + "input": "⋡", + "description": "Named entity: NotSucceedsSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22e1" + ] + ] + }, + { + "input": "&NotSucceedsTilde", + "description": "Bad named entity: NotSucceedsTilde without a semi-colon", + "output": [ + [ + "Character", + "&NotSucceedsTilde" + ] + ] + }, + { + "input": "≿̸", + "description": "Named entity: NotSucceedsTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u227f\u0338" + ] + ] + }, + { + "input": "&NotSuperset", + "description": "Bad named entity: NotSuperset without a semi-colon", + "output": [ + [ + "Character", + "&NotSuperset" + ] + ] + }, + { + "input": "⊃⃒", + "description": "Named entity: NotSuperset; with a semi-colon", + "output": [ + [ + "Character", + "\u2283\u20d2" + ] + ] + }, + { + "input": "&NotSupersetEqual", + "description": "Bad named entity: NotSupersetEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotSupersetEqual" + ] + ] + }, + { + "input": "⊉", + "description": "Named entity: NotSupersetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2289" + ] + ] + }, + { + "input": "&NotTilde", + "description": "Bad named entity: NotTilde without a semi-colon", + "output": [ + [ + "Character", + "&NotTilde" + ] + ] + }, + { + "input": "≁", + "description": "Named entity: NotTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2241" + ] + ] + }, + { + "input": "&NotTildeEqual", + "description": "Bad named entity: NotTildeEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotTildeEqual" + ] + ] + }, + { + "input": "≄", + "description": "Named entity: NotTildeEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2244" + ] + ] + }, + { + "input": "&NotTildeFullEqual", + "description": "Bad named entity: NotTildeFullEqual without a semi-colon", + "output": [ + [ + "Character", + "&NotTildeFullEqual" + ] + ] + }, + { + "input": "≇", + "description": "Named entity: NotTildeFullEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2247" + ] + ] + }, + { + "input": "&NotTildeTilde", + "description": "Bad named entity: NotTildeTilde without a semi-colon", + "output": [ + [ + "Character", + "&NotTildeTilde" + ] + ] + }, + { + "input": "≉", + "description": "Named entity: NotTildeTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2249" + ] + ] + }, + { + "input": "&NotVerticalBar", + "description": "Bad named entity: NotVerticalBar without a semi-colon", + "output": [ + [ + "Character", + "&NotVerticalBar" + ] + ] + }, + { + "input": "∤", + "description": "Named entity: NotVerticalBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2224" + ] + ] + }, + { + "input": "&Nscr", + "description": "Bad named entity: Nscr without a semi-colon", + "output": [ + [ + "Character", + "&Nscr" + ] + ] + }, + { + "input": "𝒩", + "description": "Named entity: Nscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udca9" + ] + ] + }, + { + "input": "Ñ", + "description": "Named entity: Ntilde without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d1" + ] + ] + }, + { + "input": "Ñ", + "description": "Named entity: Ntilde; with a semi-colon", + "output": [ + [ + "Character", + "\u00d1" + ] + ] + }, + { + "input": "&Nu", + "description": "Bad named entity: Nu without a semi-colon", + "output": [ + [ + "Character", + "&Nu" + ] + ] + }, + { + "input": "Ν", + "description": "Named entity: Nu; with a semi-colon", + "output": [ + [ + "Character", + "\u039d" + ] + ] + }, + { + "input": "&OElig", + "description": "Bad named entity: OElig without a semi-colon", + "output": [ + [ + "Character", + "&OElig" + ] + ] + }, + { + "input": "Œ", + "description": "Named entity: OElig; with a semi-colon", + "output": [ + [ + "Character", + "\u0152" + ] + ] + }, + { + "input": "Ó", + "description": "Named entity: Oacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d3" + ] + ] + }, + { + "input": "Ó", + "description": "Named entity: Oacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00d3" + ] + ] + }, + { + "input": "Ô", + "description": "Named entity: Ocirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d4" + ] + ] + }, + { + "input": "Ô", + "description": "Named entity: Ocirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00d4" + ] + ] + }, + { + "input": "&Ocy", + "description": "Bad named entity: Ocy without a semi-colon", + "output": [ + [ + "Character", + "&Ocy" + ] + ] + }, + { + "input": "О", + "description": "Named entity: Ocy; with a semi-colon", + "output": [ + [ + "Character", + "\u041e" + ] + ] + }, + { + "input": "&Odblac", + "description": "Bad named entity: Odblac without a semi-colon", + "output": [ + [ + "Character", + "&Odblac" + ] + ] + }, + { + "input": "Ő", + "description": "Named entity: Odblac; with a semi-colon", + "output": [ + [ + "Character", + "\u0150" + ] + ] + }, + { + "input": "&Ofr", + "description": "Bad named entity: Ofr without a semi-colon", + "output": [ + [ + "Character", + "&Ofr" + ] + ] + }, + { + "input": "𝔒", + "description": "Named entity: Ofr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd12" + ] + ] + }, + { + "input": "Ò", + "description": "Named entity: Ograve without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d2" + ] + ] + }, + { + "input": "Ò", + "description": "Named entity: Ograve; with a semi-colon", + "output": [ + [ + "Character", + "\u00d2" + ] + ] + }, + { + "input": "&Omacr", + "description": "Bad named entity: Omacr without a semi-colon", + "output": [ + [ + "Character", + "&Omacr" + ] + ] + }, + { + "input": "Ō", + "description": "Named entity: Omacr; with a semi-colon", + "output": [ + [ + "Character", + "\u014c" + ] + ] + }, + { + "input": "&Omega", + "description": "Bad named entity: Omega without a semi-colon", + "output": [ + [ + "Character", + "&Omega" + ] + ] + }, + { + "input": "Ω", + "description": "Named entity: Omega; with a semi-colon", + "output": [ + [ + "Character", + "\u03a9" + ] + ] + }, + { + "input": "&Omicron", + "description": "Bad named entity: Omicron without a semi-colon", + "output": [ + [ + "Character", + "&Omicron" + ] + ] + }, + { + "input": "Ο", + "description": "Named entity: Omicron; with a semi-colon", + "output": [ + [ + "Character", + "\u039f" + ] + ] + }, + { + "input": "&Oopf", + "description": "Bad named entity: Oopf without a semi-colon", + "output": [ + [ + "Character", + "&Oopf" + ] + ] + }, + { + "input": "𝕆", + "description": "Named entity: Oopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd46" + ] + ] + }, + { + "input": "&OpenCurlyDoubleQuote", + "description": "Bad named entity: OpenCurlyDoubleQuote without a semi-colon", + "output": [ + [ + "Character", + "&OpenCurlyDoubleQuote" + ] + ] + }, + { + "input": "“", + "description": "Named entity: OpenCurlyDoubleQuote; with a semi-colon", + "output": [ + [ + "Character", + "\u201c" + ] + ] + }, + { + "input": "&OpenCurlyQuote", + "description": "Bad named entity: OpenCurlyQuote without a semi-colon", + "output": [ + [ + "Character", + "&OpenCurlyQuote" + ] + ] + }, + { + "input": "‘", + "description": "Named entity: OpenCurlyQuote; with a semi-colon", + "output": [ + [ + "Character", + "\u2018" + ] + ] + }, + { + "input": "&Or", + "description": "Bad named entity: Or without a semi-colon", + "output": [ + [ + "Character", + "&Or" + ] + ] + }, + { + "input": "⩔", + "description": "Named entity: Or; with a semi-colon", + "output": [ + [ + "Character", + "\u2a54" + ] + ] + }, + { + "input": "&Oscr", + "description": "Bad named entity: Oscr without a semi-colon", + "output": [ + [ + "Character", + "&Oscr" + ] + ] + }, + { + "input": "𝒪", + "description": "Named entity: Oscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcaa" + ] + ] + }, + { + "input": "Ø", + "description": "Named entity: Oslash without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d8" + ] + ] + }, + { + "input": "Ø", + "description": "Named entity: Oslash; with a semi-colon", + "output": [ + [ + "Character", + "\u00d8" + ] + ] + }, + { + "input": "Õ", + "description": "Named entity: Otilde without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d5" + ] + ] + }, + { + "input": "Õ", + "description": "Named entity: Otilde; with a semi-colon", + "output": [ + [ + "Character", + "\u00d5" + ] + ] + }, + { + "input": "&Otimes", + "description": "Bad named entity: Otimes without a semi-colon", + "output": [ + [ + "Character", + "&Otimes" + ] + ] + }, + { + "input": "⨷", + "description": "Named entity: Otimes; with a semi-colon", + "output": [ + [ + "Character", + "\u2a37" + ] + ] + }, + { + "input": "Ö", + "description": "Named entity: Ouml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d6" + ] + ] + }, + { + "input": "Ö", + "description": "Named entity: Ouml; with a semi-colon", + "output": [ + [ + "Character", + "\u00d6" + ] + ] + }, + { + "input": "&OverBar", + "description": "Bad named entity: OverBar without a semi-colon", + "output": [ + [ + "Character", + "&OverBar" + ] + ] + }, + { + "input": "‾", + "description": "Named entity: OverBar; with a semi-colon", + "output": [ + [ + "Character", + "\u203e" + ] + ] + }, + { + "input": "&OverBrace", + "description": "Bad named entity: OverBrace without a semi-colon", + "output": [ + [ + "Character", + "&OverBrace" + ] + ] + }, + { + "input": "⏞", + "description": "Named entity: OverBrace; with a semi-colon", + "output": [ + [ + "Character", + "\u23de" + ] + ] + }, + { + "input": "&OverBracket", + "description": "Bad named entity: OverBracket without a semi-colon", + "output": [ + [ + "Character", + "&OverBracket" + ] + ] + }, + { + "input": "⎴", + "description": "Named entity: OverBracket; with a semi-colon", + "output": [ + [ + "Character", + "\u23b4" + ] + ] + }, + { + "input": "&OverParenthesis", + "description": "Bad named entity: OverParenthesis without a semi-colon", + "output": [ + [ + "Character", + "&OverParenthesis" + ] + ] + }, + { + "input": "⏜", + "description": "Named entity: OverParenthesis; with a semi-colon", + "output": [ + [ + "Character", + "\u23dc" + ] + ] + }, + { + "input": "&PartialD", + "description": "Bad named entity: PartialD without a semi-colon", + "output": [ + [ + "Character", + "&PartialD" + ] + ] + }, + { + "input": "∂", + "description": "Named entity: PartialD; with a semi-colon", + "output": [ + [ + "Character", + "\u2202" + ] + ] + }, + { + "input": "&Pcy", + "description": "Bad named entity: Pcy without a semi-colon", + "output": [ + [ + "Character", + "&Pcy" + ] + ] + }, + { + "input": "П", + "description": "Named entity: Pcy; with a semi-colon", + "output": [ + [ + "Character", + "\u041f" + ] + ] + }, + { + "input": "&Pfr", + "description": "Bad named entity: Pfr without a semi-colon", + "output": [ + [ + "Character", + "&Pfr" + ] + ] + }, + { + "input": "𝔓", + "description": "Named entity: Pfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd13" + ] + ] + }, + { + "input": "&Phi", + "description": "Bad named entity: Phi without a semi-colon", + "output": [ + [ + "Character", + "&Phi" + ] + ] + }, + { + "input": "Φ", + "description": "Named entity: Phi; with a semi-colon", + "output": [ + [ + "Character", + "\u03a6" + ] + ] + }, + { + "input": "&Pi", + "description": "Bad named entity: Pi without a semi-colon", + "output": [ + [ + "Character", + "&Pi" + ] + ] + }, + { + "input": "Π", + "description": "Named entity: Pi; with a semi-colon", + "output": [ + [ + "Character", + "\u03a0" + ] + ] + }, + { + "input": "&PlusMinus", + "description": "Bad named entity: PlusMinus without a semi-colon", + "output": [ + [ + "Character", + "&PlusMinus" + ] + ] + }, + { + "input": "±", + "description": "Named entity: PlusMinus; with a semi-colon", + "output": [ + [ + "Character", + "\u00b1" + ] + ] + }, + { + "input": "&Poincareplane", + "description": "Bad named entity: Poincareplane without a semi-colon", + "output": [ + [ + "Character", + "&Poincareplane" + ] + ] + }, + { + "input": "ℌ", + "description": "Named entity: Poincareplane; with a semi-colon", + "output": [ + [ + "Character", + "\u210c" + ] + ] + }, + { + "input": "&Popf", + "description": "Bad named entity: Popf without a semi-colon", + "output": [ + [ + "Character", + "&Popf" + ] + ] + }, + { + "input": "ℙ", + "description": "Named entity: Popf; with a semi-colon", + "output": [ + [ + "Character", + "\u2119" + ] + ] + }, + { + "input": "&Pr", + "description": "Bad named entity: Pr without a semi-colon", + "output": [ + [ + "Character", + "&Pr" + ] + ] + }, + { + "input": "⪻", + "description": "Named entity: Pr; with a semi-colon", + "output": [ + [ + "Character", + "\u2abb" + ] + ] + }, + { + "input": "&Precedes", + "description": "Bad named entity: Precedes without a semi-colon", + "output": [ + [ + "Character", + "&Precedes" + ] + ] + }, + { + "input": "≺", + "description": "Named entity: Precedes; with a semi-colon", + "output": [ + [ + "Character", + "\u227a" + ] + ] + }, + { + "input": "&PrecedesEqual", + "description": "Bad named entity: PrecedesEqual without a semi-colon", + "output": [ + [ + "Character", + "&PrecedesEqual" + ] + ] + }, + { + "input": "⪯", + "description": "Named entity: PrecedesEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2aaf" + ] + ] + }, + { + "input": "&PrecedesSlantEqual", + "description": "Bad named entity: PrecedesSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&PrecedesSlantEqual" + ] + ] + }, + { + "input": "≼", + "description": "Named entity: PrecedesSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u227c" + ] + ] + }, + { + "input": "&PrecedesTilde", + "description": "Bad named entity: PrecedesTilde without a semi-colon", + "output": [ + [ + "Character", + "&PrecedesTilde" + ] + ] + }, + { + "input": "≾", + "description": "Named entity: PrecedesTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u227e" + ] + ] + }, + { + "input": "&Prime", + "description": "Bad named entity: Prime without a semi-colon", + "output": [ + [ + "Character", + "&Prime" + ] + ] + }, + { + "input": "″", + "description": "Named entity: Prime; with a semi-colon", + "output": [ + [ + "Character", + "\u2033" + ] + ] + }, + { + "input": "&Product", + "description": "Bad named entity: Product without a semi-colon", + "output": [ + [ + "Character", + "&Product" + ] + ] + }, + { + "input": "∏", + "description": "Named entity: Product; with a semi-colon", + "output": [ + [ + "Character", + "\u220f" + ] + ] + }, + { + "input": "&Proportion", + "description": "Bad named entity: Proportion without a semi-colon", + "output": [ + [ + "Character", + "&Proportion" + ] + ] + }, + { + "input": "∷", + "description": "Named entity: Proportion; with a semi-colon", + "output": [ + [ + "Character", + "\u2237" + ] + ] + }, + { + "input": "&Proportional", + "description": "Bad named entity: Proportional without a semi-colon", + "output": [ + [ + "Character", + "&Proportional" + ] + ] + }, + { + "input": "∝", + "description": "Named entity: Proportional; with a semi-colon", + "output": [ + [ + "Character", + "\u221d" + ] + ] + }, + { + "input": "&Pscr", + "description": "Bad named entity: Pscr without a semi-colon", + "output": [ + [ + "Character", + "&Pscr" + ] + ] + }, + { + "input": "𝒫", + "description": "Named entity: Pscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcab" + ] + ] + }, + { + "input": "&Psi", + "description": "Bad named entity: Psi without a semi-colon", + "output": [ + [ + "Character", + "&Psi" + ] + ] + }, + { + "input": "Ψ", + "description": "Named entity: Psi; with a semi-colon", + "output": [ + [ + "Character", + "\u03a8" + ] + ] + }, + { + "input": """, + "description": "Named entity: QUOT without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\"" + ] + ] + }, + { + "input": """, + "description": "Named entity: QUOT; with a semi-colon", + "output": [ + [ + "Character", + "\"" + ] + ] + }, + { + "input": "&Qfr", + "description": "Bad named entity: Qfr without a semi-colon", + "output": [ + [ + "Character", + "&Qfr" + ] + ] + }, + { + "input": "𝔔", + "description": "Named entity: Qfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd14" + ] + ] + }, + { + "input": "&Qopf", + "description": "Bad named entity: Qopf without a semi-colon", + "output": [ + [ + "Character", + "&Qopf" + ] + ] + }, + { + "input": "ℚ", + "description": "Named entity: Qopf; with a semi-colon", + "output": [ + [ + "Character", + "\u211a" + ] + ] + }, + { + "input": "&Qscr", + "description": "Bad named entity: Qscr without a semi-colon", + "output": [ + [ + "Character", + "&Qscr" + ] + ] + }, + { + "input": "𝒬", + "description": "Named entity: Qscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcac" + ] + ] + }, + { + "input": "&RBarr", + "description": "Bad named entity: RBarr without a semi-colon", + "output": [ + [ + "Character", + "&RBarr" + ] + ] + }, + { + "input": "⤐", + "description": "Named entity: RBarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2910" + ] + ] + }, + { + "input": "®", + "description": "Named entity: REG without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ae" + ] + ] + }, + { + "input": "®", + "description": "Named entity: REG; with a semi-colon", + "output": [ + [ + "Character", + "\u00ae" + ] + ] + }, + { + "input": "&Racute", + "description": "Bad named entity: Racute without a semi-colon", + "output": [ + [ + "Character", + "&Racute" + ] + ] + }, + { + "input": "Ŕ", + "description": "Named entity: Racute; with a semi-colon", + "output": [ + [ + "Character", + "\u0154" + ] + ] + }, + { + "input": "&Rang", + "description": "Bad named entity: Rang without a semi-colon", + "output": [ + [ + "Character", + "&Rang" + ] + ] + }, + { + "input": "⟫", + "description": "Named entity: Rang; with a semi-colon", + "output": [ + [ + "Character", + "\u27eb" + ] + ] + }, + { + "input": "&Rarr", + "description": "Bad named entity: Rarr without a semi-colon", + "output": [ + [ + "Character", + "&Rarr" + ] + ] + }, + { + "input": "↠", + "description": "Named entity: Rarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21a0" + ] + ] + }, + { + "input": "&Rarrtl", + "description": "Bad named entity: Rarrtl without a semi-colon", + "output": [ + [ + "Character", + "&Rarrtl" + ] + ] + }, + { + "input": "⤖", + "description": "Named entity: Rarrtl; with a semi-colon", + "output": [ + [ + "Character", + "\u2916" + ] + ] + }, + { + "input": "&Rcaron", + "description": "Bad named entity: Rcaron without a semi-colon", + "output": [ + [ + "Character", + "&Rcaron" + ] + ] + }, + { + "input": "Ř", + "description": "Named entity: Rcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0158" + ] + ] + }, + { + "input": "&Rcedil", + "description": "Bad named entity: Rcedil without a semi-colon", + "output": [ + [ + "Character", + "&Rcedil" + ] + ] + }, + { + "input": "Ŗ", + "description": "Named entity: Rcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0156" + ] + ] + }, + { + "input": "&Rcy", + "description": "Bad named entity: Rcy without a semi-colon", + "output": [ + [ + "Character", + "&Rcy" + ] + ] + }, + { + "input": "Р", + "description": "Named entity: Rcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0420" + ] + ] + }, + { + "input": "&Re", + "description": "Bad named entity: Re without a semi-colon", + "output": [ + [ + "Character", + "&Re" + ] + ] + }, + { + "input": "ℜ", + "description": "Named entity: Re; with a semi-colon", + "output": [ + [ + "Character", + "\u211c" + ] + ] + }, + { + "input": "&ReverseElement", + "description": "Bad named entity: ReverseElement without a semi-colon", + "output": [ + [ + "Character", + "&ReverseElement" + ] + ] + }, + { + "input": "∋", + "description": "Named entity: ReverseElement; with a semi-colon", + "output": [ + [ + "Character", + "\u220b" + ] + ] + }, + { + "input": "&ReverseEquilibrium", + "description": "Bad named entity: ReverseEquilibrium without a semi-colon", + "output": [ + [ + "Character", + "&ReverseEquilibrium" + ] + ] + }, + { + "input": "⇋", + "description": "Named entity: ReverseEquilibrium; with a semi-colon", + "output": [ + [ + "Character", + "\u21cb" + ] + ] + }, + { + "input": "&ReverseUpEquilibrium", + "description": "Bad named entity: ReverseUpEquilibrium without a semi-colon", + "output": [ + [ + "Character", + "&ReverseUpEquilibrium" + ] + ] + }, + { + "input": "⥯", + "description": "Named entity: ReverseUpEquilibrium; with a semi-colon", + "output": [ + [ + "Character", + "\u296f" + ] + ] + }, + { + "input": "&Rfr", + "description": "Bad named entity: Rfr without a semi-colon", + "output": [ + [ + "Character", + "&Rfr" + ] + ] + }, + { + "input": "ℜ", + "description": "Named entity: Rfr; with a semi-colon", + "output": [ + [ + "Character", + "\u211c" + ] + ] + }, + { + "input": "&Rho", + "description": "Bad named entity: Rho without a semi-colon", + "output": [ + [ + "Character", + "&Rho" + ] + ] + }, + { + "input": "Ρ", + "description": "Named entity: Rho; with a semi-colon", + "output": [ + [ + "Character", + "\u03a1" + ] + ] + }, + { + "input": "&RightAngleBracket", + "description": "Bad named entity: RightAngleBracket without a semi-colon", + "output": [ + [ + "Character", + "&RightAngleBracket" + ] + ] + }, + { + "input": "⟩", + "description": "Named entity: RightAngleBracket; with a semi-colon", + "output": [ + [ + "Character", + "\u27e9" + ] + ] + }, + { + "input": "&RightArrow", + "description": "Bad named entity: RightArrow without a semi-colon", + "output": [ + [ + "Character", + "&RightArrow" + ] + ] + }, + { + "input": "→", + "description": "Named entity: RightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2192" + ] + ] + }, + { + "input": "&RightArrowBar", + "description": "Bad named entity: RightArrowBar without a semi-colon", + "output": [ + [ + "Character", + "&RightArrowBar" + ] + ] + }, + { + "input": "⇥", + "description": "Named entity: RightArrowBar; with a semi-colon", + "output": [ + [ + "Character", + "\u21e5" + ] + ] + }, + { + "input": "&RightArrowLeftArrow", + "description": "Bad named entity: RightArrowLeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&RightArrowLeftArrow" + ] + ] + }, + { + "input": "⇄", + "description": "Named entity: RightArrowLeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21c4" + ] + ] + }, + { + "input": "&RightCeiling", + "description": "Bad named entity: RightCeiling without a semi-colon", + "output": [ + [ + "Character", + "&RightCeiling" + ] + ] + }, + { + "input": "⌉", + "description": "Named entity: RightCeiling; with a semi-colon", + "output": [ + [ + "Character", + "\u2309" + ] + ] + }, + { + "input": "&RightDoubleBracket", + "description": "Bad named entity: RightDoubleBracket without a semi-colon", + "output": [ + [ + "Character", + "&RightDoubleBracket" + ] + ] + }, + { + "input": "⟧", + "description": "Named entity: RightDoubleBracket; with a semi-colon", + "output": [ + [ + "Character", + "\u27e7" + ] + ] + }, + { + "input": "&RightDownTeeVector", + "description": "Bad named entity: RightDownTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&RightDownTeeVector" + ] + ] + }, + { + "input": "⥝", + "description": "Named entity: RightDownTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u295d" + ] + ] + }, + { + "input": "&RightDownVector", + "description": "Bad named entity: RightDownVector without a semi-colon", + "output": [ + [ + "Character", + "&RightDownVector" + ] + ] + }, + { + "input": "⇂", + "description": "Named entity: RightDownVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21c2" + ] + ] + }, + { + "input": "&RightDownVectorBar", + "description": "Bad named entity: RightDownVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&RightDownVectorBar" + ] + ] + }, + { + "input": "⥕", + "description": "Named entity: RightDownVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2955" + ] + ] + }, + { + "input": "&RightFloor", + "description": "Bad named entity: RightFloor without a semi-colon", + "output": [ + [ + "Character", + "&RightFloor" + ] + ] + }, + { + "input": "⌋", + "description": "Named entity: RightFloor; with a semi-colon", + "output": [ + [ + "Character", + "\u230b" + ] + ] + }, + { + "input": "&RightTee", + "description": "Bad named entity: RightTee without a semi-colon", + "output": [ + [ + "Character", + "&RightTee" + ] + ] + }, + { + "input": "⊢", + "description": "Named entity: RightTee; with a semi-colon", + "output": [ + [ + "Character", + "\u22a2" + ] + ] + }, + { + "input": "&RightTeeArrow", + "description": "Bad named entity: RightTeeArrow without a semi-colon", + "output": [ + [ + "Character", + "&RightTeeArrow" + ] + ] + }, + { + "input": "↦", + "description": "Named entity: RightTeeArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21a6" + ] + ] + }, + { + "input": "&RightTeeVector", + "description": "Bad named entity: RightTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&RightTeeVector" + ] + ] + }, + { + "input": "⥛", + "description": "Named entity: RightTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u295b" + ] + ] + }, + { + "input": "&RightTriangle", + "description": "Bad named entity: RightTriangle without a semi-colon", + "output": [ + [ + "Character", + "&RightTriangle" + ] + ] + }, + { + "input": "⊳", + "description": "Named entity: RightTriangle; with a semi-colon", + "output": [ + [ + "Character", + "\u22b3" + ] + ] + }, + { + "input": "&RightTriangleBar", + "description": "Bad named entity: RightTriangleBar without a semi-colon", + "output": [ + [ + "Character", + "&RightTriangleBar" + ] + ] + }, + { + "input": "⧐", + "description": "Named entity: RightTriangleBar; with a semi-colon", + "output": [ + [ + "Character", + "\u29d0" + ] + ] + }, + { + "input": "&RightTriangleEqual", + "description": "Bad named entity: RightTriangleEqual without a semi-colon", + "output": [ + [ + "Character", + "&RightTriangleEqual" + ] + ] + }, + { + "input": "⊵", + "description": "Named entity: RightTriangleEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u22b5" + ] + ] + }, + { + "input": "&RightUpDownVector", + "description": "Bad named entity: RightUpDownVector without a semi-colon", + "output": [ + [ + "Character", + "&RightUpDownVector" + ] + ] + }, + { + "input": "⥏", + "description": "Named entity: RightUpDownVector; with a semi-colon", + "output": [ + [ + "Character", + "\u294f" + ] + ] + }, + { + "input": "&RightUpTeeVector", + "description": "Bad named entity: RightUpTeeVector without a semi-colon", + "output": [ + [ + "Character", + "&RightUpTeeVector" + ] + ] + }, + { + "input": "⥜", + "description": "Named entity: RightUpTeeVector; with a semi-colon", + "output": [ + [ + "Character", + "\u295c" + ] + ] + }, + { + "input": "&RightUpVector", + "description": "Bad named entity: RightUpVector without a semi-colon", + "output": [ + [ + "Character", + "&RightUpVector" + ] + ] + }, + { + "input": "↾", + "description": "Named entity: RightUpVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21be" + ] + ] + }, + { + "input": "&RightUpVectorBar", + "description": "Bad named entity: RightUpVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&RightUpVectorBar" + ] + ] + }, + { + "input": "⥔", + "description": "Named entity: RightUpVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2954" + ] + ] + }, + { + "input": "&RightVector", + "description": "Bad named entity: RightVector without a semi-colon", + "output": [ + [ + "Character", + "&RightVector" + ] + ] + }, + { + "input": "⇀", + "description": "Named entity: RightVector; with a semi-colon", + "output": [ + [ + "Character", + "\u21c0" + ] + ] + }, + { + "input": "&RightVectorBar", + "description": "Bad named entity: RightVectorBar without a semi-colon", + "output": [ + [ + "Character", + "&RightVectorBar" + ] + ] + }, + { + "input": "⥓", + "description": "Named entity: RightVectorBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2953" + ] + ] + }, + { + "input": "&Rightarrow", + "description": "Bad named entity: Rightarrow without a semi-colon", + "output": [ + [ + "Character", + "&Rightarrow" + ] + ] + }, + { + "input": "⇒", + "description": "Named entity: Rightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d2" + ] + ] + }, + { + "input": "&Ropf", + "description": "Bad named entity: Ropf without a semi-colon", + "output": [ + [ + "Character", + "&Ropf" + ] + ] + }, + { + "input": "ℝ", + "description": "Named entity: Ropf; with a semi-colon", + "output": [ + [ + "Character", + "\u211d" + ] + ] + }, + { + "input": "&RoundImplies", + "description": "Bad named entity: RoundImplies without a semi-colon", + "output": [ + [ + "Character", + "&RoundImplies" + ] + ] + }, + { + "input": "⥰", + "description": "Named entity: RoundImplies; with a semi-colon", + "output": [ + [ + "Character", + "\u2970" + ] + ] + }, + { + "input": "&Rrightarrow", + "description": "Bad named entity: Rrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&Rrightarrow" + ] + ] + }, + { + "input": "⇛", + "description": "Named entity: Rrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21db" + ] + ] + }, + { + "input": "&Rscr", + "description": "Bad named entity: Rscr without a semi-colon", + "output": [ + [ + "Character", + "&Rscr" + ] + ] + }, + { + "input": "ℛ", + "description": "Named entity: Rscr; with a semi-colon", + "output": [ + [ + "Character", + "\u211b" + ] + ] + }, + { + "input": "&Rsh", + "description": "Bad named entity: Rsh without a semi-colon", + "output": [ + [ + "Character", + "&Rsh" + ] + ] + }, + { + "input": "↱", + "description": "Named entity: Rsh; with a semi-colon", + "output": [ + [ + "Character", + "\u21b1" + ] + ] + }, + { + "input": "&RuleDelayed", + "description": "Bad named entity: RuleDelayed without a semi-colon", + "output": [ + [ + "Character", + "&RuleDelayed" + ] + ] + }, + { + "input": "⧴", + "description": "Named entity: RuleDelayed; with a semi-colon", + "output": [ + [ + "Character", + "\u29f4" + ] + ] + }, + { + "input": "&SHCHcy", + "description": "Bad named entity: SHCHcy without a semi-colon", + "output": [ + [ + "Character", + "&SHCHcy" + ] + ] + }, + { + "input": "Щ", + "description": "Named entity: SHCHcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0429" + ] + ] + }, + { + "input": "&SHcy", + "description": "Bad named entity: SHcy without a semi-colon", + "output": [ + [ + "Character", + "&SHcy" + ] + ] + }, + { + "input": "Ш", + "description": "Named entity: SHcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0428" + ] + ] + }, + { + "input": "&SOFTcy", + "description": "Bad named entity: SOFTcy without a semi-colon", + "output": [ + [ + "Character", + "&SOFTcy" + ] + ] + }, + { + "input": "Ь", + "description": "Named entity: SOFTcy; with a semi-colon", + "output": [ + [ + "Character", + "\u042c" + ] + ] + }, + { + "input": "&Sacute", + "description": "Bad named entity: Sacute without a semi-colon", + "output": [ + [ + "Character", + "&Sacute" + ] + ] + }, + { + "input": "Ś", + "description": "Named entity: Sacute; with a semi-colon", + "output": [ + [ + "Character", + "\u015a" + ] + ] + }, + { + "input": "&Sc", + "description": "Bad named entity: Sc without a semi-colon", + "output": [ + [ + "Character", + "&Sc" + ] + ] + }, + { + "input": "⪼", + "description": "Named entity: Sc; with a semi-colon", + "output": [ + [ + "Character", + "\u2abc" + ] + ] + }, + { + "input": "&Scaron", + "description": "Bad named entity: Scaron without a semi-colon", + "output": [ + [ + "Character", + "&Scaron" + ] + ] + }, + { + "input": "Š", + "description": "Named entity: Scaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0160" + ] + ] + }, + { + "input": "&Scedil", + "description": "Bad named entity: Scedil without a semi-colon", + "output": [ + [ + "Character", + "&Scedil" + ] + ] + }, + { + "input": "Ş", + "description": "Named entity: Scedil; with a semi-colon", + "output": [ + [ + "Character", + "\u015e" + ] + ] + }, + { + "input": "&Scirc", + "description": "Bad named entity: Scirc without a semi-colon", + "output": [ + [ + "Character", + "&Scirc" + ] + ] + }, + { + "input": "Ŝ", + "description": "Named entity: Scirc; with a semi-colon", + "output": [ + [ + "Character", + "\u015c" + ] + ] + }, + { + "input": "&Scy", + "description": "Bad named entity: Scy without a semi-colon", + "output": [ + [ + "Character", + "&Scy" + ] + ] + }, + { + "input": "С", + "description": "Named entity: Scy; with a semi-colon", + "output": [ + [ + "Character", + "\u0421" + ] + ] + }, + { + "input": "&Sfr", + "description": "Bad named entity: Sfr without a semi-colon", + "output": [ + [ + "Character", + "&Sfr" + ] + ] + }, + { + "input": "𝔖", + "description": "Named entity: Sfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd16" + ] + ] + }, + { + "input": "&ShortDownArrow", + "description": "Bad named entity: ShortDownArrow without a semi-colon", + "output": [ + [ + "Character", + "&ShortDownArrow" + ] + ] + }, + { + "input": "↓", + "description": "Named entity: ShortDownArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2193" + ] + ] + }, + { + "input": "&ShortLeftArrow", + "description": "Bad named entity: ShortLeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&ShortLeftArrow" + ] + ] + }, + { + "input": "←", + "description": "Named entity: ShortLeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2190" + ] + ] + }, + { + "input": "&ShortRightArrow", + "description": "Bad named entity: ShortRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&ShortRightArrow" + ] + ] + }, + { + "input": "→", + "description": "Named entity: ShortRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2192" + ] + ] + }, + { + "input": "&ShortUpArrow", + "description": "Bad named entity: ShortUpArrow without a semi-colon", + "output": [ + [ + "Character", + "&ShortUpArrow" + ] + ] + }, + { + "input": "↑", + "description": "Named entity: ShortUpArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2191" + ] + ] + }, + { + "input": "&Sigma", + "description": "Bad named entity: Sigma without a semi-colon", + "output": [ + [ + "Character", + "&Sigma" + ] + ] + }, + { + "input": "Σ", + "description": "Named entity: Sigma; with a semi-colon", + "output": [ + [ + "Character", + "\u03a3" + ] + ] + }, + { + "input": "&SmallCircle", + "description": "Bad named entity: SmallCircle without a semi-colon", + "output": [ + [ + "Character", + "&SmallCircle" + ] + ] + }, + { + "input": "∘", + "description": "Named entity: SmallCircle; with a semi-colon", + "output": [ + [ + "Character", + "\u2218" + ] + ] + }, + { + "input": "&Sopf", + "description": "Bad named entity: Sopf without a semi-colon", + "output": [ + [ + "Character", + "&Sopf" + ] + ] + }, + { + "input": "𝕊", + "description": "Named entity: Sopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd4a" + ] + ] + }, + { + "input": "&Sqrt", + "description": "Bad named entity: Sqrt without a semi-colon", + "output": [ + [ + "Character", + "&Sqrt" + ] + ] + }, + { + "input": "√", + "description": "Named entity: Sqrt; with a semi-colon", + "output": [ + [ + "Character", + "\u221a" + ] + ] + }, + { + "input": "&Square", + "description": "Bad named entity: Square without a semi-colon", + "output": [ + [ + "Character", + "&Square" + ] + ] + }, + { + "input": "□", + "description": "Named entity: Square; with a semi-colon", + "output": [ + [ + "Character", + "\u25a1" + ] + ] + }, + { + "input": "&SquareIntersection", + "description": "Bad named entity: SquareIntersection without a semi-colon", + "output": [ + [ + "Character", + "&SquareIntersection" + ] + ] + }, + { + "input": "⊓", + "description": "Named entity: SquareIntersection; with a semi-colon", + "output": [ + [ + "Character", + "\u2293" + ] + ] + }, + { + "input": "&SquareSubset", + "description": "Bad named entity: SquareSubset without a semi-colon", + "output": [ + [ + "Character", + "&SquareSubset" + ] + ] + }, + { + "input": "⊏", + "description": "Named entity: SquareSubset; with a semi-colon", + "output": [ + [ + "Character", + "\u228f" + ] + ] + }, + { + "input": "&SquareSubsetEqual", + "description": "Bad named entity: SquareSubsetEqual without a semi-colon", + "output": [ + [ + "Character", + "&SquareSubsetEqual" + ] + ] + }, + { + "input": "⊑", + "description": "Named entity: SquareSubsetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2291" + ] + ] + }, + { + "input": "&SquareSuperset", + "description": "Bad named entity: SquareSuperset without a semi-colon", + "output": [ + [ + "Character", + "&SquareSuperset" + ] + ] + }, + { + "input": "⊐", + "description": "Named entity: SquareSuperset; with a semi-colon", + "output": [ + [ + "Character", + "\u2290" + ] + ] + }, + { + "input": "&SquareSupersetEqual", + "description": "Bad named entity: SquareSupersetEqual without a semi-colon", + "output": [ + [ + "Character", + "&SquareSupersetEqual" + ] + ] + }, + { + "input": "⊒", + "description": "Named entity: SquareSupersetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2292" + ] + ] + }, + { + "input": "&SquareUnion", + "description": "Bad named entity: SquareUnion without a semi-colon", + "output": [ + [ + "Character", + "&SquareUnion" + ] + ] + }, + { + "input": "⊔", + "description": "Named entity: SquareUnion; with a semi-colon", + "output": [ + [ + "Character", + "\u2294" + ] + ] + }, + { + "input": "&Sscr", + "description": "Bad named entity: Sscr without a semi-colon", + "output": [ + [ + "Character", + "&Sscr" + ] + ] + }, + { + "input": "𝒮", + "description": "Named entity: Sscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcae" + ] + ] + }, + { + "input": "&Star", + "description": "Bad named entity: Star without a semi-colon", + "output": [ + [ + "Character", + "&Star" + ] + ] + }, + { + "input": "⋆", + "description": "Named entity: Star; with a semi-colon", + "output": [ + [ + "Character", + "\u22c6" + ] + ] + }, + { + "input": "&Sub", + "description": "Bad named entity: Sub without a semi-colon", + "output": [ + [ + "Character", + "&Sub" + ] + ] + }, + { + "input": "⋐", + "description": "Named entity: Sub; with a semi-colon", + "output": [ + [ + "Character", + "\u22d0" + ] + ] + }, + { + "input": "&Subset", + "description": "Bad named entity: Subset without a semi-colon", + "output": [ + [ + "Character", + "&Subset" + ] + ] + }, + { + "input": "⋐", + "description": "Named entity: Subset; with a semi-colon", + "output": [ + [ + "Character", + "\u22d0" + ] + ] + }, + { + "input": "&SubsetEqual", + "description": "Bad named entity: SubsetEqual without a semi-colon", + "output": [ + [ + "Character", + "&SubsetEqual" + ] + ] + }, + { + "input": "⊆", + "description": "Named entity: SubsetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2286" + ] + ] + }, + { + "input": "&Succeeds", + "description": "Bad named entity: Succeeds without a semi-colon", + "output": [ + [ + "Character", + "&Succeeds" + ] + ] + }, + { + "input": "≻", + "description": "Named entity: Succeeds; with a semi-colon", + "output": [ + [ + "Character", + "\u227b" + ] + ] + }, + { + "input": "&SucceedsEqual", + "description": "Bad named entity: SucceedsEqual without a semi-colon", + "output": [ + [ + "Character", + "&SucceedsEqual" + ] + ] + }, + { + "input": "⪰", + "description": "Named entity: SucceedsEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab0" + ] + ] + }, + { + "input": "&SucceedsSlantEqual", + "description": "Bad named entity: SucceedsSlantEqual without a semi-colon", + "output": [ + [ + "Character", + "&SucceedsSlantEqual" + ] + ] + }, + { + "input": "≽", + "description": "Named entity: SucceedsSlantEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u227d" + ] + ] + }, + { + "input": "&SucceedsTilde", + "description": "Bad named entity: SucceedsTilde without a semi-colon", + "output": [ + [ + "Character", + "&SucceedsTilde" + ] + ] + }, + { + "input": "≿", + "description": "Named entity: SucceedsTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u227f" + ] + ] + }, + { + "input": "&SuchThat", + "description": "Bad named entity: SuchThat without a semi-colon", + "output": [ + [ + "Character", + "&SuchThat" + ] + ] + }, + { + "input": "∋", + "description": "Named entity: SuchThat; with a semi-colon", + "output": [ + [ + "Character", + "\u220b" + ] + ] + }, + { + "input": "&Sum", + "description": "Bad named entity: Sum without a semi-colon", + "output": [ + [ + "Character", + "&Sum" + ] + ] + }, + { + "input": "∑", + "description": "Named entity: Sum; with a semi-colon", + "output": [ + [ + "Character", + "\u2211" + ] + ] + }, + { + "input": "&Sup", + "description": "Bad named entity: Sup without a semi-colon", + "output": [ + [ + "Character", + "&Sup" + ] + ] + }, + { + "input": "⋑", + "description": "Named entity: Sup; with a semi-colon", + "output": [ + [ + "Character", + "\u22d1" + ] + ] + }, + { + "input": "&Superset", + "description": "Bad named entity: Superset without a semi-colon", + "output": [ + [ + "Character", + "&Superset" + ] + ] + }, + { + "input": "⊃", + "description": "Named entity: Superset; with a semi-colon", + "output": [ + [ + "Character", + "\u2283" + ] + ] + }, + { + "input": "&SupersetEqual", + "description": "Bad named entity: SupersetEqual without a semi-colon", + "output": [ + [ + "Character", + "&SupersetEqual" + ] + ] + }, + { + "input": "⊇", + "description": "Named entity: SupersetEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2287" + ] + ] + }, + { + "input": "&Supset", + "description": "Bad named entity: Supset without a semi-colon", + "output": [ + [ + "Character", + "&Supset" + ] + ] + }, + { + "input": "⋑", + "description": "Named entity: Supset; with a semi-colon", + "output": [ + [ + "Character", + "\u22d1" + ] + ] + }, + { + "input": "Þ", + "description": "Named entity: THORN without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00de" + ] + ] + }, + { + "input": "Þ", + "description": "Named entity: THORN; with a semi-colon", + "output": [ + [ + "Character", + "\u00de" + ] + ] + }, + { + "input": "&TRADE", + "description": "Bad named entity: TRADE without a semi-colon", + "output": [ + [ + "Character", + "&TRADE" + ] + ] + }, + { + "input": "™", + "description": "Named entity: TRADE; with a semi-colon", + "output": [ + [ + "Character", + "\u2122" + ] + ] + }, + { + "input": "&TSHcy", + "description": "Bad named entity: TSHcy without a semi-colon", + "output": [ + [ + "Character", + "&TSHcy" + ] + ] + }, + { + "input": "Ћ", + "description": "Named entity: TSHcy; with a semi-colon", + "output": [ + [ + "Character", + "\u040b" + ] + ] + }, + { + "input": "&TScy", + "description": "Bad named entity: TScy without a semi-colon", + "output": [ + [ + "Character", + "&TScy" + ] + ] + }, + { + "input": "Ц", + "description": "Named entity: TScy; with a semi-colon", + "output": [ + [ + "Character", + "\u0426" + ] + ] + }, + { + "input": "&Tab", + "description": "Bad named entity: Tab without a semi-colon", + "output": [ + [ + "Character", + "&Tab" + ] + ] + }, + { + "input": "	", + "description": "Named entity: Tab; with a semi-colon", + "output": [ + [ + "Character", + "\t" + ] + ] + }, + { + "input": "&Tau", + "description": "Bad named entity: Tau without a semi-colon", + "output": [ + [ + "Character", + "&Tau" + ] + ] + }, + { + "input": "Τ", + "description": "Named entity: Tau; with a semi-colon", + "output": [ + [ + "Character", + "\u03a4" + ] + ] + }, + { + "input": "&Tcaron", + "description": "Bad named entity: Tcaron without a semi-colon", + "output": [ + [ + "Character", + "&Tcaron" + ] + ] + }, + { + "input": "Ť", + "description": "Named entity: Tcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0164" + ] + ] + }, + { + "input": "&Tcedil", + "description": "Bad named entity: Tcedil without a semi-colon", + "output": [ + [ + "Character", + "&Tcedil" + ] + ] + }, + { + "input": "Ţ", + "description": "Named entity: Tcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0162" + ] + ] + }, + { + "input": "&Tcy", + "description": "Bad named entity: Tcy without a semi-colon", + "output": [ + [ + "Character", + "&Tcy" + ] + ] + }, + { + "input": "Т", + "description": "Named entity: Tcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0422" + ] + ] + }, + { + "input": "&Tfr", + "description": "Bad named entity: Tfr without a semi-colon", + "output": [ + [ + "Character", + "&Tfr" + ] + ] + }, + { + "input": "𝔗", + "description": "Named entity: Tfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd17" + ] + ] + }, + { + "input": "&Therefore", + "description": "Bad named entity: Therefore without a semi-colon", + "output": [ + [ + "Character", + "&Therefore" + ] + ] + }, + { + "input": "∴", + "description": "Named entity: Therefore; with a semi-colon", + "output": [ + [ + "Character", + "\u2234" + ] + ] + }, + { + "input": "&Theta", + "description": "Bad named entity: Theta without a semi-colon", + "output": [ + [ + "Character", + "&Theta" + ] + ] + }, + { + "input": "Θ", + "description": "Named entity: Theta; with a semi-colon", + "output": [ + [ + "Character", + "\u0398" + ] + ] + }, + { + "input": "&ThickSpace", + "description": "Bad named entity: ThickSpace without a semi-colon", + "output": [ + [ + "Character", + "&ThickSpace" + ] + ] + }, + { + "input": "  ", + "description": "Named entity: ThickSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u205f\u200a" + ] + ] + }, + { + "input": "&ThinSpace", + "description": "Bad named entity: ThinSpace without a semi-colon", + "output": [ + [ + "Character", + "&ThinSpace" + ] + ] + }, + { + "input": " ", + "description": "Named entity: ThinSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u2009" + ] + ] + }, + { + "input": "&Tilde", + "description": "Bad named entity: Tilde without a semi-colon", + "output": [ + [ + "Character", + "&Tilde" + ] + ] + }, + { + "input": "∼", + "description": "Named entity: Tilde; with a semi-colon", + "output": [ + [ + "Character", + "\u223c" + ] + ] + }, + { + "input": "&TildeEqual", + "description": "Bad named entity: TildeEqual without a semi-colon", + "output": [ + [ + "Character", + "&TildeEqual" + ] + ] + }, + { + "input": "≃", + "description": "Named entity: TildeEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2243" + ] + ] + }, + { + "input": "&TildeFullEqual", + "description": "Bad named entity: TildeFullEqual without a semi-colon", + "output": [ + [ + "Character", + "&TildeFullEqual" + ] + ] + }, + { + "input": "≅", + "description": "Named entity: TildeFullEqual; with a semi-colon", + "output": [ + [ + "Character", + "\u2245" + ] + ] + }, + { + "input": "&TildeTilde", + "description": "Bad named entity: TildeTilde without a semi-colon", + "output": [ + [ + "Character", + "&TildeTilde" + ] + ] + }, + { + "input": "≈", + "description": "Named entity: TildeTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2248" + ] + ] + }, + { + "input": "&Topf", + "description": "Bad named entity: Topf without a semi-colon", + "output": [ + [ + "Character", + "&Topf" + ] + ] + }, + { + "input": "𝕋", + "description": "Named entity: Topf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd4b" + ] + ] + }, + { + "input": "&TripleDot", + "description": "Bad named entity: TripleDot without a semi-colon", + "output": [ + [ + "Character", + "&TripleDot" + ] + ] + }, + { + "input": "⃛", + "description": "Named entity: TripleDot; with a semi-colon", + "output": [ + [ + "Character", + "\u20db" + ] + ] + }, + { + "input": "&Tscr", + "description": "Bad named entity: Tscr without a semi-colon", + "output": [ + [ + "Character", + "&Tscr" + ] + ] + }, + { + "input": "𝒯", + "description": "Named entity: Tscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcaf" + ] + ] + }, + { + "input": "&Tstrok", + "description": "Bad named entity: Tstrok without a semi-colon", + "output": [ + [ + "Character", + "&Tstrok" + ] + ] + }, + { + "input": "Ŧ", + "description": "Named entity: Tstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0166" + ] + ] + }, + { + "input": "Ú", + "description": "Named entity: Uacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00da" + ] + ] + }, + { + "input": "Ú", + "description": "Named entity: Uacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00da" + ] + ] + }, + { + "input": "&Uarr", + "description": "Bad named entity: Uarr without a semi-colon", + "output": [ + [ + "Character", + "&Uarr" + ] + ] + }, + { + "input": "↟", + "description": "Named entity: Uarr; with a semi-colon", + "output": [ + [ + "Character", + "\u219f" + ] + ] + }, + { + "input": "&Uarrocir", + "description": "Bad named entity: Uarrocir without a semi-colon", + "output": [ + [ + "Character", + "&Uarrocir" + ] + ] + }, + { + "input": "⥉", + "description": "Named entity: Uarrocir; with a semi-colon", + "output": [ + [ + "Character", + "\u2949" + ] + ] + }, + { + "input": "&Ubrcy", + "description": "Bad named entity: Ubrcy without a semi-colon", + "output": [ + [ + "Character", + "&Ubrcy" + ] + ] + }, + { + "input": "Ў", + "description": "Named entity: Ubrcy; with a semi-colon", + "output": [ + [ + "Character", + "\u040e" + ] + ] + }, + { + "input": "&Ubreve", + "description": "Bad named entity: Ubreve without a semi-colon", + "output": [ + [ + "Character", + "&Ubreve" + ] + ] + }, + { + "input": "Ŭ", + "description": "Named entity: Ubreve; with a semi-colon", + "output": [ + [ + "Character", + "\u016c" + ] + ] + }, + { + "input": "Û", + "description": "Named entity: Ucirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00db" + ] + ] + }, + { + "input": "Û", + "description": "Named entity: Ucirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00db" + ] + ] + }, + { + "input": "&Ucy", + "description": "Bad named entity: Ucy without a semi-colon", + "output": [ + [ + "Character", + "&Ucy" + ] + ] + }, + { + "input": "У", + "description": "Named entity: Ucy; with a semi-colon", + "output": [ + [ + "Character", + "\u0423" + ] + ] + }, + { + "input": "&Udblac", + "description": "Bad named entity: Udblac without a semi-colon", + "output": [ + [ + "Character", + "&Udblac" + ] + ] + }, + { + "input": "Ű", + "description": "Named entity: Udblac; with a semi-colon", + "output": [ + [ + "Character", + "\u0170" + ] + ] + }, + { + "input": "&Ufr", + "description": "Bad named entity: Ufr without a semi-colon", + "output": [ + [ + "Character", + "&Ufr" + ] + ] + }, + { + "input": "𝔘", + "description": "Named entity: Ufr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd18" + ] + ] + }, + { + "input": "Ù", + "description": "Named entity: Ugrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d9" + ] + ] + }, + { + "input": "Ù", + "description": "Named entity: Ugrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00d9" + ] + ] + }, + { + "input": "&Umacr", + "description": "Bad named entity: Umacr without a semi-colon", + "output": [ + [ + "Character", + "&Umacr" + ] + ] + }, + { + "input": "Ū", + "description": "Named entity: Umacr; with a semi-colon", + "output": [ + [ + "Character", + "\u016a" + ] + ] + }, + { + "input": "&UnderBar", + "description": "Bad named entity: UnderBar without a semi-colon", + "output": [ + [ + "Character", + "&UnderBar" + ] + ] + }, + { + "input": "_", + "description": "Named entity: UnderBar; with a semi-colon", + "output": [ + [ + "Character", + "_" + ] + ] + }, + { + "input": "&UnderBrace", + "description": "Bad named entity: UnderBrace without a semi-colon", + "output": [ + [ + "Character", + "&UnderBrace" + ] + ] + }, + { + "input": "⏟", + "description": "Named entity: UnderBrace; with a semi-colon", + "output": [ + [ + "Character", + "\u23df" + ] + ] + }, + { + "input": "&UnderBracket", + "description": "Bad named entity: UnderBracket without a semi-colon", + "output": [ + [ + "Character", + "&UnderBracket" + ] + ] + }, + { + "input": "⎵", + "description": "Named entity: UnderBracket; with a semi-colon", + "output": [ + [ + "Character", + "\u23b5" + ] + ] + }, + { + "input": "&UnderParenthesis", + "description": "Bad named entity: UnderParenthesis without a semi-colon", + "output": [ + [ + "Character", + "&UnderParenthesis" + ] + ] + }, + { + "input": "⏝", + "description": "Named entity: UnderParenthesis; with a semi-colon", + "output": [ + [ + "Character", + "\u23dd" + ] + ] + }, + { + "input": "&Union", + "description": "Bad named entity: Union without a semi-colon", + "output": [ + [ + "Character", + "&Union" + ] + ] + }, + { + "input": "⋃", + "description": "Named entity: Union; with a semi-colon", + "output": [ + [ + "Character", + "\u22c3" + ] + ] + }, + { + "input": "&UnionPlus", + "description": "Bad named entity: UnionPlus without a semi-colon", + "output": [ + [ + "Character", + "&UnionPlus" + ] + ] + }, + { + "input": "⊎", + "description": "Named entity: UnionPlus; with a semi-colon", + "output": [ + [ + "Character", + "\u228e" + ] + ] + }, + { + "input": "&Uogon", + "description": "Bad named entity: Uogon without a semi-colon", + "output": [ + [ + "Character", + "&Uogon" + ] + ] + }, + { + "input": "Ų", + "description": "Named entity: Uogon; with a semi-colon", + "output": [ + [ + "Character", + "\u0172" + ] + ] + }, + { + "input": "&Uopf", + "description": "Bad named entity: Uopf without a semi-colon", + "output": [ + [ + "Character", + "&Uopf" + ] + ] + }, + { + "input": "𝕌", + "description": "Named entity: Uopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd4c" + ] + ] + }, + { + "input": "&UpArrow", + "description": "Bad named entity: UpArrow without a semi-colon", + "output": [ + [ + "Character", + "&UpArrow" + ] + ] + }, + { + "input": "↑", + "description": "Named entity: UpArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2191" + ] + ] + }, + { + "input": "&UpArrowBar", + "description": "Bad named entity: UpArrowBar without a semi-colon", + "output": [ + [ + "Character", + "&UpArrowBar" + ] + ] + }, + { + "input": "⤒", + "description": "Named entity: UpArrowBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2912" + ] + ] + }, + { + "input": "&UpArrowDownArrow", + "description": "Bad named entity: UpArrowDownArrow without a semi-colon", + "output": [ + [ + "Character", + "&UpArrowDownArrow" + ] + ] + }, + { + "input": "⇅", + "description": "Named entity: UpArrowDownArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21c5" + ] + ] + }, + { + "input": "&UpDownArrow", + "description": "Bad named entity: UpDownArrow without a semi-colon", + "output": [ + [ + "Character", + "&UpDownArrow" + ] + ] + }, + { + "input": "↕", + "description": "Named entity: UpDownArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2195" + ] + ] + }, + { + "input": "&UpEquilibrium", + "description": "Bad named entity: UpEquilibrium without a semi-colon", + "output": [ + [ + "Character", + "&UpEquilibrium" + ] + ] + }, + { + "input": "⥮", + "description": "Named entity: UpEquilibrium; with a semi-colon", + "output": [ + [ + "Character", + "\u296e" + ] + ] + }, + { + "input": "&UpTee", + "description": "Bad named entity: UpTee without a semi-colon", + "output": [ + [ + "Character", + "&UpTee" + ] + ] + }, + { + "input": "⊥", + "description": "Named entity: UpTee; with a semi-colon", + "output": [ + [ + "Character", + "\u22a5" + ] + ] + }, + { + "input": "&UpTeeArrow", + "description": "Bad named entity: UpTeeArrow without a semi-colon", + "output": [ + [ + "Character", + "&UpTeeArrow" + ] + ] + }, + { + "input": "↥", + "description": "Named entity: UpTeeArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21a5" + ] + ] + }, + { + "input": "&Uparrow", + "description": "Bad named entity: Uparrow without a semi-colon", + "output": [ + [ + "Character", + "&Uparrow" + ] + ] + }, + { + "input": "⇑", + "description": "Named entity: Uparrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d1" + ] + ] + }, + { + "input": "&Updownarrow", + "description": "Bad named entity: Updownarrow without a semi-colon", + "output": [ + [ + "Character", + "&Updownarrow" + ] + ] + }, + { + "input": "⇕", + "description": "Named entity: Updownarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21d5" + ] + ] + }, + { + "input": "&UpperLeftArrow", + "description": "Bad named entity: UpperLeftArrow without a semi-colon", + "output": [ + [ + "Character", + "&UpperLeftArrow" + ] + ] + }, + { + "input": "↖", + "description": "Named entity: UpperLeftArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2196" + ] + ] + }, + { + "input": "&UpperRightArrow", + "description": "Bad named entity: UpperRightArrow without a semi-colon", + "output": [ + [ + "Character", + "&UpperRightArrow" + ] + ] + }, + { + "input": "↗", + "description": "Named entity: UpperRightArrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2197" + ] + ] + }, + { + "input": "&Upsi", + "description": "Bad named entity: Upsi without a semi-colon", + "output": [ + [ + "Character", + "&Upsi" + ] + ] + }, + { + "input": "ϒ", + "description": "Named entity: Upsi; with a semi-colon", + "output": [ + [ + "Character", + "\u03d2" + ] + ] + }, + { + "input": "&Upsilon", + "description": "Bad named entity: Upsilon without a semi-colon", + "output": [ + [ + "Character", + "&Upsilon" + ] + ] + }, + { + "input": "Υ", + "description": "Named entity: Upsilon; with a semi-colon", + "output": [ + [ + "Character", + "\u03a5" + ] + ] + }, + { + "input": "&Uring", + "description": "Bad named entity: Uring without a semi-colon", + "output": [ + [ + "Character", + "&Uring" + ] + ] + }, + { + "input": "Ů", + "description": "Named entity: Uring; with a semi-colon", + "output": [ + [ + "Character", + "\u016e" + ] + ] + }, + { + "input": "&Uscr", + "description": "Bad named entity: Uscr without a semi-colon", + "output": [ + [ + "Character", + "&Uscr" + ] + ] + }, + { + "input": "𝒰", + "description": "Named entity: Uscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb0" + ] + ] + }, + { + "input": "&Utilde", + "description": "Bad named entity: Utilde without a semi-colon", + "output": [ + [ + "Character", + "&Utilde" + ] + ] + }, + { + "input": "Ũ", + "description": "Named entity: Utilde; with a semi-colon", + "output": [ + [ + "Character", + "\u0168" + ] + ] + }, + { + "input": "Ü", + "description": "Named entity: Uuml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00dc" + ] + ] + }, + { + "input": "Ü", + "description": "Named entity: Uuml; with a semi-colon", + "output": [ + [ + "Character", + "\u00dc" + ] + ] + }, + { + "input": "&VDash", + "description": "Bad named entity: VDash without a semi-colon", + "output": [ + [ + "Character", + "&VDash" + ] + ] + }, + { + "input": "⊫", + "description": "Named entity: VDash; with a semi-colon", + "output": [ + [ + "Character", + "\u22ab" + ] + ] + }, + { + "input": "&Vbar", + "description": "Bad named entity: Vbar without a semi-colon", + "output": [ + [ + "Character", + "&Vbar" + ] + ] + }, + { + "input": "⫫", + "description": "Named entity: Vbar; with a semi-colon", + "output": [ + [ + "Character", + "\u2aeb" + ] + ] + }, + { + "input": "&Vcy", + "description": "Bad named entity: Vcy without a semi-colon", + "output": [ + [ + "Character", + "&Vcy" + ] + ] + }, + { + "input": "В", + "description": "Named entity: Vcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0412" + ] + ] + }, + { + "input": "&Vdash", + "description": "Bad named entity: Vdash without a semi-colon", + "output": [ + [ + "Character", + "&Vdash" + ] + ] + }, + { + "input": "⊩", + "description": "Named entity: Vdash; with a semi-colon", + "output": [ + [ + "Character", + "\u22a9" + ] + ] + }, + { + "input": "&Vdashl", + "description": "Bad named entity: Vdashl without a semi-colon", + "output": [ + [ + "Character", + "&Vdashl" + ] + ] + }, + { + "input": "⫦", + "description": "Named entity: Vdashl; with a semi-colon", + "output": [ + [ + "Character", + "\u2ae6" + ] + ] + }, + { + "input": "&Vee", + "description": "Bad named entity: Vee without a semi-colon", + "output": [ + [ + "Character", + "&Vee" + ] + ] + }, + { + "input": "⋁", + "description": "Named entity: Vee; with a semi-colon", + "output": [ + [ + "Character", + "\u22c1" + ] + ] + }, + { + "input": "&Verbar", + "description": "Bad named entity: Verbar without a semi-colon", + "output": [ + [ + "Character", + "&Verbar" + ] + ] + }, + { + "input": "‖", + "description": "Named entity: Verbar; with a semi-colon", + "output": [ + [ + "Character", + "\u2016" + ] + ] + }, + { + "input": "&Vert", + "description": "Bad named entity: Vert without a semi-colon", + "output": [ + [ + "Character", + "&Vert" + ] + ] + }, + { + "input": "‖", + "description": "Named entity: Vert; with a semi-colon", + "output": [ + [ + "Character", + "\u2016" + ] + ] + }, + { + "input": "&VerticalBar", + "description": "Bad named entity: VerticalBar without a semi-colon", + "output": [ + [ + "Character", + "&VerticalBar" + ] + ] + }, + { + "input": "∣", + "description": "Named entity: VerticalBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2223" + ] + ] + }, + { + "input": "&VerticalLine", + "description": "Bad named entity: VerticalLine without a semi-colon", + "output": [ + [ + "Character", + "&VerticalLine" + ] + ] + }, + { + "input": "|", + "description": "Named entity: VerticalLine; with a semi-colon", + "output": [ + [ + "Character", + "|" + ] + ] + }, + { + "input": "&VerticalSeparator", + "description": "Bad named entity: VerticalSeparator without a semi-colon", + "output": [ + [ + "Character", + "&VerticalSeparator" + ] + ] + }, + { + "input": "❘", + "description": "Named entity: VerticalSeparator; with a semi-colon", + "output": [ + [ + "Character", + "\u2758" + ] + ] + }, + { + "input": "&VerticalTilde", + "description": "Bad named entity: VerticalTilde without a semi-colon", + "output": [ + [ + "Character", + "&VerticalTilde" + ] + ] + }, + { + "input": "≀", + "description": "Named entity: VerticalTilde; with a semi-colon", + "output": [ + [ + "Character", + "\u2240" + ] + ] + }, + { + "input": "&VeryThinSpace", + "description": "Bad named entity: VeryThinSpace without a semi-colon", + "output": [ + [ + "Character", + "&VeryThinSpace" + ] + ] + }, + { + "input": " ", + "description": "Named entity: VeryThinSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u200a" + ] + ] + }, + { + "input": "&Vfr", + "description": "Bad named entity: Vfr without a semi-colon", + "output": [ + [ + "Character", + "&Vfr" + ] + ] + }, + { + "input": "𝔙", + "description": "Named entity: Vfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd19" + ] + ] + }, + { + "input": "&Vopf", + "description": "Bad named entity: Vopf without a semi-colon", + "output": [ + [ + "Character", + "&Vopf" + ] + ] + }, + { + "input": "𝕍", + "description": "Named entity: Vopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd4d" + ] + ] + }, + { + "input": "&Vscr", + "description": "Bad named entity: Vscr without a semi-colon", + "output": [ + [ + "Character", + "&Vscr" + ] + ] + }, + { + "input": "𝒱", + "description": "Named entity: Vscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb1" + ] + ] + }, + { + "input": "&Vvdash", + "description": "Bad named entity: Vvdash without a semi-colon", + "output": [ + [ + "Character", + "&Vvdash" + ] + ] + }, + { + "input": "⊪", + "description": "Named entity: Vvdash; with a semi-colon", + "output": [ + [ + "Character", + "\u22aa" + ] + ] + }, + { + "input": "&Wcirc", + "description": "Bad named entity: Wcirc without a semi-colon", + "output": [ + [ + "Character", + "&Wcirc" + ] + ] + }, + { + "input": "Ŵ", + "description": "Named entity: Wcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0174" + ] + ] + }, + { + "input": "&Wedge", + "description": "Bad named entity: Wedge without a semi-colon", + "output": [ + [ + "Character", + "&Wedge" + ] + ] + }, + { + "input": "⋀", + "description": "Named entity: Wedge; with a semi-colon", + "output": [ + [ + "Character", + "\u22c0" + ] + ] + }, + { + "input": "&Wfr", + "description": "Bad named entity: Wfr without a semi-colon", + "output": [ + [ + "Character", + "&Wfr" + ] + ] + }, + { + "input": "𝔚", + "description": "Named entity: Wfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd1a" + ] + ] + }, + { + "input": "&Wopf", + "description": "Bad named entity: Wopf without a semi-colon", + "output": [ + [ + "Character", + "&Wopf" + ] + ] + }, + { + "input": "𝕎", + "description": "Named entity: Wopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd4e" + ] + ] + }, + { + "input": "&Wscr", + "description": "Bad named entity: Wscr without a semi-colon", + "output": [ + [ + "Character", + "&Wscr" + ] + ] + }, + { + "input": "𝒲", + "description": "Named entity: Wscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb2" + ] + ] + }, + { + "input": "&Xfr", + "description": "Bad named entity: Xfr without a semi-colon", + "output": [ + [ + "Character", + "&Xfr" + ] + ] + }, + { + "input": "𝔛", + "description": "Named entity: Xfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd1b" + ] + ] + }, + { + "input": "&Xi", + "description": "Bad named entity: Xi without a semi-colon", + "output": [ + [ + "Character", + "&Xi" + ] + ] + }, + { + "input": "Ξ", + "description": "Named entity: Xi; with a semi-colon", + "output": [ + [ + "Character", + "\u039e" + ] + ] + }, + { + "input": "&Xopf", + "description": "Bad named entity: Xopf without a semi-colon", + "output": [ + [ + "Character", + "&Xopf" + ] + ] + }, + { + "input": "𝕏", + "description": "Named entity: Xopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd4f" + ] + ] + }, + { + "input": "&Xscr", + "description": "Bad named entity: Xscr without a semi-colon", + "output": [ + [ + "Character", + "&Xscr" + ] + ] + }, + { + "input": "𝒳", + "description": "Named entity: Xscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb3" + ] + ] + }, + { + "input": "&YAcy", + "description": "Bad named entity: YAcy without a semi-colon", + "output": [ + [ + "Character", + "&YAcy" + ] + ] + }, + { + "input": "Я", + "description": "Named entity: YAcy; with a semi-colon", + "output": [ + [ + "Character", + "\u042f" + ] + ] + }, + { + "input": "&YIcy", + "description": "Bad named entity: YIcy without a semi-colon", + "output": [ + [ + "Character", + "&YIcy" + ] + ] + }, + { + "input": "Ї", + "description": "Named entity: YIcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0407" + ] + ] + }, + { + "input": "&YUcy", + "description": "Bad named entity: YUcy without a semi-colon", + "output": [ + [ + "Character", + "&YUcy" + ] + ] + }, + { + "input": "Ю", + "description": "Named entity: YUcy; with a semi-colon", + "output": [ + [ + "Character", + "\u042e" + ] + ] + }, + { + "input": "Ý", + "description": "Named entity: Yacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00dd" + ] + ] + }, + { + "input": "Ý", + "description": "Named entity: Yacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00dd" + ] + ] + }, + { + "input": "&Ycirc", + "description": "Bad named entity: Ycirc without a semi-colon", + "output": [ + [ + "Character", + "&Ycirc" + ] + ] + }, + { + "input": "Ŷ", + "description": "Named entity: Ycirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0176" + ] + ] + }, + { + "input": "&Ycy", + "description": "Bad named entity: Ycy without a semi-colon", + "output": [ + [ + "Character", + "&Ycy" + ] + ] + }, + { + "input": "Ы", + "description": "Named entity: Ycy; with a semi-colon", + "output": [ + [ + "Character", + "\u042b" + ] + ] + }, + { + "input": "&Yfr", + "description": "Bad named entity: Yfr without a semi-colon", + "output": [ + [ + "Character", + "&Yfr" + ] + ] + }, + { + "input": "𝔜", + "description": "Named entity: Yfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd1c" + ] + ] + }, + { + "input": "&Yopf", + "description": "Bad named entity: Yopf without a semi-colon", + "output": [ + [ + "Character", + "&Yopf" + ] + ] + }, + { + "input": "𝕐", + "description": "Named entity: Yopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd50" + ] + ] + }, + { + "input": "&Yscr", + "description": "Bad named entity: Yscr without a semi-colon", + "output": [ + [ + "Character", + "&Yscr" + ] + ] + }, + { + "input": "𝒴", + "description": "Named entity: Yscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb4" + ] + ] + }, + { + "input": "&Yuml", + "description": "Bad named entity: Yuml without a semi-colon", + "output": [ + [ + "Character", + "&Yuml" + ] + ] + }, + { + "input": "Ÿ", + "description": "Named entity: Yuml; with a semi-colon", + "output": [ + [ + "Character", + "\u0178" + ] + ] + }, + { + "input": "&ZHcy", + "description": "Bad named entity: ZHcy without a semi-colon", + "output": [ + [ + "Character", + "&ZHcy" + ] + ] + }, + { + "input": "Ж", + "description": "Named entity: ZHcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0416" + ] + ] + }, + { + "input": "&Zacute", + "description": "Bad named entity: Zacute without a semi-colon", + "output": [ + [ + "Character", + "&Zacute" + ] + ] + }, + { + "input": "Ź", + "description": "Named entity: Zacute; with a semi-colon", + "output": [ + [ + "Character", + "\u0179" + ] + ] + }, + { + "input": "&Zcaron", + "description": "Bad named entity: Zcaron without a semi-colon", + "output": [ + [ + "Character", + "&Zcaron" + ] + ] + }, + { + "input": "Ž", + "description": "Named entity: Zcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u017d" + ] + ] + }, + { + "input": "&Zcy", + "description": "Bad named entity: Zcy without a semi-colon", + "output": [ + [ + "Character", + "&Zcy" + ] + ] + }, + { + "input": "З", + "description": "Named entity: Zcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0417" + ] + ] + }, + { + "input": "&Zdot", + "description": "Bad named entity: Zdot without a semi-colon", + "output": [ + [ + "Character", + "&Zdot" + ] + ] + }, + { + "input": "Ż", + "description": "Named entity: Zdot; with a semi-colon", + "output": [ + [ + "Character", + "\u017b" + ] + ] + }, + { + "input": "&ZeroWidthSpace", + "description": "Bad named entity: ZeroWidthSpace without a semi-colon", + "output": [ + [ + "Character", + "&ZeroWidthSpace" + ] + ] + }, + { + "input": "​", + "description": "Named entity: ZeroWidthSpace; with a semi-colon", + "output": [ + [ + "Character", + "\u200b" + ] + ] + }, + { + "input": "&Zeta", + "description": "Bad named entity: Zeta without a semi-colon", + "output": [ + [ + "Character", + "&Zeta" + ] + ] + }, + { + "input": "Ζ", + "description": "Named entity: Zeta; with a semi-colon", + "output": [ + [ + "Character", + "\u0396" + ] + ] + }, + { + "input": "&Zfr", + "description": "Bad named entity: Zfr without a semi-colon", + "output": [ + [ + "Character", + "&Zfr" + ] + ] + }, + { + "input": "ℨ", + "description": "Named entity: Zfr; with a semi-colon", + "output": [ + [ + "Character", + "\u2128" + ] + ] + }, + { + "input": "&Zopf", + "description": "Bad named entity: Zopf without a semi-colon", + "output": [ + [ + "Character", + "&Zopf" + ] + ] + }, + { + "input": "ℤ", + "description": "Named entity: Zopf; with a semi-colon", + "output": [ + [ + "Character", + "\u2124" + ] + ] + }, + { + "input": "&Zscr", + "description": "Bad named entity: Zscr without a semi-colon", + "output": [ + [ + "Character", + "&Zscr" + ] + ] + }, + { + "input": "𝒵", + "description": "Named entity: Zscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb5" + ] + ] + }, + { + "input": "á", + "description": "Named entity: aacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e1" + ] + ] + }, + { + "input": "á", + "description": "Named entity: aacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00e1" + ] + ] + }, + { + "input": "&abreve", + "description": "Bad named entity: abreve without a semi-colon", + "output": [ + [ + "Character", + "&abreve" + ] + ] + }, + { + "input": "ă", + "description": "Named entity: abreve; with a semi-colon", + "output": [ + [ + "Character", + "\u0103" + ] + ] + }, + { + "input": "&ac", + "description": "Bad named entity: ac without a semi-colon", + "output": [ + [ + "Character", + "&ac" + ] + ] + }, + { + "input": "∾", + "description": "Named entity: ac; with a semi-colon", + "output": [ + [ + "Character", + "\u223e" + ] + ] + }, + { + "input": "&acE", + "description": "Bad named entity: acE without a semi-colon", + "output": [ + [ + "Character", + "&acE" + ] + ] + }, + { + "input": "∾̳", + "description": "Named entity: acE; with a semi-colon", + "output": [ + [ + "Character", + "\u223e\u0333" + ] + ] + }, + { + "input": "&acd", + "description": "Bad named entity: acd without a semi-colon", + "output": [ + [ + "Character", + "&acd" + ] + ] + }, + { + "input": "∿", + "description": "Named entity: acd; with a semi-colon", + "output": [ + [ + "Character", + "\u223f" + ] + ] + }, + { + "input": "â", + "description": "Named entity: acirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e2" + ] + ] + }, + { + "input": "â", + "description": "Named entity: acirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00e2" + ] + ] + }, + { + "input": "´", + "description": "Named entity: acute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b4" + ] + ] + }, + { + "input": "´", + "description": "Named entity: acute; with a semi-colon", + "output": [ + [ + "Character", + "\u00b4" + ] + ] + }, + { + "input": "&acy", + "description": "Bad named entity: acy without a semi-colon", + "output": [ + [ + "Character", + "&acy" + ] + ] + }, + { + "input": "а", + "description": "Named entity: acy; with a semi-colon", + "output": [ + [ + "Character", + "\u0430" + ] + ] + }, + { + "input": "æ", + "description": "Named entity: aelig without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e6" + ] + ] + }, + { + "input": "æ", + "description": "Named entity: aelig; with a semi-colon", + "output": [ + [ + "Character", + "\u00e6" + ] + ] + }, + { + "input": "&af", + "description": "Bad named entity: af without a semi-colon", + "output": [ + [ + "Character", + "&af" + ] + ] + }, + { + "input": "⁡", + "description": "Named entity: af; with a semi-colon", + "output": [ + [ + "Character", + "\u2061" + ] + ] + }, + { + "input": "&afr", + "description": "Bad named entity: afr without a semi-colon", + "output": [ + [ + "Character", + "&afr" + ] + ] + }, + { + "input": "𝔞", + "description": "Named entity: afr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd1e" + ] + ] + }, + { + "input": "à", + "description": "Named entity: agrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e0" + ] + ] + }, + { + "input": "à", + "description": "Named entity: agrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00e0" + ] + ] + }, + { + "input": "&alefsym", + "description": "Bad named entity: alefsym without a semi-colon", + "output": [ + [ + "Character", + "&alefsym" + ] + ] + }, + { + "input": "ℵ", + "description": "Named entity: alefsym; with a semi-colon", + "output": [ + [ + "Character", + "\u2135" + ] + ] + }, + { + "input": "&aleph", + "description": "Bad named entity: aleph without a semi-colon", + "output": [ + [ + "Character", + "&aleph" + ] + ] + }, + { + "input": "ℵ", + "description": "Named entity: aleph; with a semi-colon", + "output": [ + [ + "Character", + "\u2135" + ] + ] + }, + { + "input": "&alpha", + "description": "Bad named entity: alpha without a semi-colon", + "output": [ + [ + "Character", + "&alpha" + ] + ] + }, + { + "input": "α", + "description": "Named entity: alpha; with a semi-colon", + "output": [ + [ + "Character", + "\u03b1" + ] + ] + }, + { + "input": "&amacr", + "description": "Bad named entity: amacr without a semi-colon", + "output": [ + [ + "Character", + "&amacr" + ] + ] + }, + { + "input": "ā", + "description": "Named entity: amacr; with a semi-colon", + "output": [ + [ + "Character", + "\u0101" + ] + ] + }, + { + "input": "&amalg", + "description": "Bad named entity: amalg without a semi-colon", + "output": [ + [ + "Character", + "&amalg" + ] + ] + }, + { + "input": "⨿", + "description": "Named entity: amalg; with a semi-colon", + "output": [ + [ + "Character", + "\u2a3f" + ] + ] + }, + { + "input": "&", + "description": "Named entity: amp without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "&" + ] + ] + }, + { + "input": "&", + "description": "Named entity: amp; with a semi-colon", + "output": [ + [ + "Character", + "&" + ] + ] + }, + { + "input": "&and", + "description": "Bad named entity: and without a semi-colon", + "output": [ + [ + "Character", + "&and" + ] + ] + }, + { + "input": "∧", + "description": "Named entity: and; with a semi-colon", + "output": [ + [ + "Character", + "\u2227" + ] + ] + }, + { + "input": "&andand", + "description": "Bad named entity: andand without a semi-colon", + "output": [ + [ + "Character", + "&andand" + ] + ] + }, + { + "input": "⩕", + "description": "Named entity: andand; with a semi-colon", + "output": [ + [ + "Character", + "\u2a55" + ] + ] + }, + { + "input": "&andd", + "description": "Bad named entity: andd without a semi-colon", + "output": [ + [ + "Character", + "&andd" + ] + ] + }, + { + "input": "⩜", + "description": "Named entity: andd; with a semi-colon", + "output": [ + [ + "Character", + "\u2a5c" + ] + ] + }, + { + "input": "&andslope", + "description": "Bad named entity: andslope without a semi-colon", + "output": [ + [ + "Character", + "&andslope" + ] + ] + }, + { + "input": "⩘", + "description": "Named entity: andslope; with a semi-colon", + "output": [ + [ + "Character", + "\u2a58" + ] + ] + }, + { + "input": "&andv", + "description": "Bad named entity: andv without a semi-colon", + "output": [ + [ + "Character", + "&andv" + ] + ] + }, + { + "input": "⩚", + "description": "Named entity: andv; with a semi-colon", + "output": [ + [ + "Character", + "\u2a5a" + ] + ] + }, + { + "input": "&ang", + "description": "Bad named entity: ang without a semi-colon", + "output": [ + [ + "Character", + "&ang" + ] + ] + }, + { + "input": "∠", + "description": "Named entity: ang; with a semi-colon", + "output": [ + [ + "Character", + "\u2220" + ] + ] + }, + { + "input": "&ange", + "description": "Bad named entity: ange without a semi-colon", + "output": [ + [ + "Character", + "&ange" + ] + ] + }, + { + "input": "⦤", + "description": "Named entity: ange; with a semi-colon", + "output": [ + [ + "Character", + "\u29a4" + ] + ] + }, + { + "input": "&angle", + "description": "Bad named entity: angle without a semi-colon", + "output": [ + [ + "Character", + "&angle" + ] + ] + }, + { + "input": "∠", + "description": "Named entity: angle; with a semi-colon", + "output": [ + [ + "Character", + "\u2220" + ] + ] + }, + { + "input": "&angmsd", + "description": "Bad named entity: angmsd without a semi-colon", + "output": [ + [ + "Character", + "&angmsd" + ] + ] + }, + { + "input": "∡", + "description": "Named entity: angmsd; with a semi-colon", + "output": [ + [ + "Character", + "\u2221" + ] + ] + }, + { + "input": "&angmsdaa", + "description": "Bad named entity: angmsdaa without a semi-colon", + "output": [ + [ + "Character", + "&angmsdaa" + ] + ] + }, + { + "input": "⦨", + "description": "Named entity: angmsdaa; with a semi-colon", + "output": [ + [ + "Character", + "\u29a8" + ] + ] + }, + { + "input": "&angmsdab", + "description": "Bad named entity: angmsdab without a semi-colon", + "output": [ + [ + "Character", + "&angmsdab" + ] + ] + }, + { + "input": "⦩", + "description": "Named entity: angmsdab; with a semi-colon", + "output": [ + [ + "Character", + "\u29a9" + ] + ] + }, + { + "input": "&angmsdac", + "description": "Bad named entity: angmsdac without a semi-colon", + "output": [ + [ + "Character", + "&angmsdac" + ] + ] + }, + { + "input": "⦪", + "description": "Named entity: angmsdac; with a semi-colon", + "output": [ + [ + "Character", + "\u29aa" + ] + ] + }, + { + "input": "&angmsdad", + "description": "Bad named entity: angmsdad without a semi-colon", + "output": [ + [ + "Character", + "&angmsdad" + ] + ] + }, + { + "input": "⦫", + "description": "Named entity: angmsdad; with a semi-colon", + "output": [ + [ + "Character", + "\u29ab" + ] + ] + }, + { + "input": "&angmsdae", + "description": "Bad named entity: angmsdae without a semi-colon", + "output": [ + [ + "Character", + "&angmsdae" + ] + ] + }, + { + "input": "⦬", + "description": "Named entity: angmsdae; with a semi-colon", + "output": [ + [ + "Character", + "\u29ac" + ] + ] + }, + { + "input": "&angmsdaf", + "description": "Bad named entity: angmsdaf without a semi-colon", + "output": [ + [ + "Character", + "&angmsdaf" + ] + ] + }, + { + "input": "⦭", + "description": "Named entity: angmsdaf; with a semi-colon", + "output": [ + [ + "Character", + "\u29ad" + ] + ] + }, + { + "input": "&angmsdag", + "description": "Bad named entity: angmsdag without a semi-colon", + "output": [ + [ + "Character", + "&angmsdag" + ] + ] + }, + { + "input": "⦮", + "description": "Named entity: angmsdag; with a semi-colon", + "output": [ + [ + "Character", + "\u29ae" + ] + ] + }, + { + "input": "&angmsdah", + "description": "Bad named entity: angmsdah without a semi-colon", + "output": [ + [ + "Character", + "&angmsdah" + ] + ] + }, + { + "input": "⦯", + "description": "Named entity: angmsdah; with a semi-colon", + "output": [ + [ + "Character", + "\u29af" + ] + ] + }, + { + "input": "&angrt", + "description": "Bad named entity: angrt without a semi-colon", + "output": [ + [ + "Character", + "&angrt" + ] + ] + }, + { + "input": "∟", + "description": "Named entity: angrt; with a semi-colon", + "output": [ + [ + "Character", + "\u221f" + ] + ] + }, + { + "input": "&angrtvb", + "description": "Bad named entity: angrtvb without a semi-colon", + "output": [ + [ + "Character", + "&angrtvb" + ] + ] + }, + { + "input": "⊾", + "description": "Named entity: angrtvb; with a semi-colon", + "output": [ + [ + "Character", + "\u22be" + ] + ] + }, + { + "input": "&angrtvbd", + "description": "Bad named entity: angrtvbd without a semi-colon", + "output": [ + [ + "Character", + "&angrtvbd" + ] + ] + }, + { + "input": "⦝", + "description": "Named entity: angrtvbd; with a semi-colon", + "output": [ + [ + "Character", + "\u299d" + ] + ] + }, + { + "input": "&angsph", + "description": "Bad named entity: angsph without a semi-colon", + "output": [ + [ + "Character", + "&angsph" + ] + ] + }, + { + "input": "∢", + "description": "Named entity: angsph; with a semi-colon", + "output": [ + [ + "Character", + "\u2222" + ] + ] + }, + { + "input": "&angst", + "description": "Bad named entity: angst without a semi-colon", + "output": [ + [ + "Character", + "&angst" + ] + ] + }, + { + "input": "Å", + "description": "Named entity: angst; with a semi-colon", + "output": [ + [ + "Character", + "\u00c5" + ] + ] + }, + { + "input": "&angzarr", + "description": "Bad named entity: angzarr without a semi-colon", + "output": [ + [ + "Character", + "&angzarr" + ] + ] + }, + { + "input": "⍼", + "description": "Named entity: angzarr; with a semi-colon", + "output": [ + [ + "Character", + "\u237c" + ] + ] + }, + { + "input": "&aogon", + "description": "Bad named entity: aogon without a semi-colon", + "output": [ + [ + "Character", + "&aogon" + ] + ] + }, + { + "input": "ą", + "description": "Named entity: aogon; with a semi-colon", + "output": [ + [ + "Character", + "\u0105" + ] + ] + }, + { + "input": "&aopf", + "description": "Bad named entity: aopf without a semi-colon", + "output": [ + [ + "Character", + "&aopf" + ] + ] + }, + { + "input": "𝕒", + "description": "Named entity: aopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd52" + ] + ] + }, + { + "input": "&ap", + "description": "Bad named entity: ap without a semi-colon", + "output": [ + [ + "Character", + "&ap" + ] + ] + }, + { + "input": "≈", + "description": "Named entity: ap; with a semi-colon", + "output": [ + [ + "Character", + "\u2248" + ] + ] + }, + { + "input": "&apE", + "description": "Bad named entity: apE without a semi-colon", + "output": [ + [ + "Character", + "&apE" + ] + ] + }, + { + "input": "⩰", + "description": "Named entity: apE; with a semi-colon", + "output": [ + [ + "Character", + "\u2a70" + ] + ] + }, + { + "input": "&apacir", + "description": "Bad named entity: apacir without a semi-colon", + "output": [ + [ + "Character", + "&apacir" + ] + ] + }, + { + "input": "⩯", + "description": "Named entity: apacir; with a semi-colon", + "output": [ + [ + "Character", + "\u2a6f" + ] + ] + }, + { + "input": "&ape", + "description": "Bad named entity: ape without a semi-colon", + "output": [ + [ + "Character", + "&ape" + ] + ] + }, + { + "input": "≊", + "description": "Named entity: ape; with a semi-colon", + "output": [ + [ + "Character", + "\u224a" + ] + ] + }, + { + "input": "&apid", + "description": "Bad named entity: apid without a semi-colon", + "output": [ + [ + "Character", + "&apid" + ] + ] + }, + { + "input": "≋", + "description": "Named entity: apid; with a semi-colon", + "output": [ + [ + "Character", + "\u224b" + ] + ] + }, + { + "input": "&apos", + "description": "Bad named entity: apos without a semi-colon", + "output": [ + [ + "Character", + "&apos" + ] + ] + }, + { + "input": "'", + "description": "Named entity: apos; with a semi-colon", + "output": [ + [ + "Character", + "'" + ] + ] + }, + { + "input": "&approx", + "description": "Bad named entity: approx without a semi-colon", + "output": [ + [ + "Character", + "&approx" + ] + ] + }, + { + "input": "≈", + "description": "Named entity: approx; with a semi-colon", + "output": [ + [ + "Character", + "\u2248" + ] + ] + }, + { + "input": "&approxeq", + "description": "Bad named entity: approxeq without a semi-colon", + "output": [ + [ + "Character", + "&approxeq" + ] + ] + }, + { + "input": "≊", + "description": "Named entity: approxeq; with a semi-colon", + "output": [ + [ + "Character", + "\u224a" + ] + ] + }, + { + "input": "å", + "description": "Named entity: aring without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e5" + ] + ] + }, + { + "input": "å", + "description": "Named entity: aring; with a semi-colon", + "output": [ + [ + "Character", + "\u00e5" + ] + ] + }, + { + "input": "&ascr", + "description": "Bad named entity: ascr without a semi-colon", + "output": [ + [ + "Character", + "&ascr" + ] + ] + }, + { + "input": "𝒶", + "description": "Named entity: ascr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb6" + ] + ] + }, + { + "input": "&ast", + "description": "Bad named entity: ast without a semi-colon", + "output": [ + [ + "Character", + "&ast" + ] + ] + }, + { + "input": "*", + "description": "Named entity: ast; with a semi-colon", + "output": [ + [ + "Character", + "*" + ] + ] + }, + { + "input": "&asymp", + "description": "Bad named entity: asymp without a semi-colon", + "output": [ + [ + "Character", + "&asymp" + ] + ] + }, + { + "input": "≈", + "description": "Named entity: asymp; with a semi-colon", + "output": [ + [ + "Character", + "\u2248" + ] + ] + }, + { + "input": "&asympeq", + "description": "Bad named entity: asympeq without a semi-colon", + "output": [ + [ + "Character", + "&asympeq" + ] + ] + }, + { + "input": "≍", + "description": "Named entity: asympeq; with a semi-colon", + "output": [ + [ + "Character", + "\u224d" + ] + ] + }, + { + "input": "ã", + "description": "Named entity: atilde without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e3" + ] + ] + }, + { + "input": "ã", + "description": "Named entity: atilde; with a semi-colon", + "output": [ + [ + "Character", + "\u00e3" + ] + ] + }, + { + "input": "ä", + "description": "Named entity: auml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e4" + ] + ] + }, + { + "input": "ä", + "description": "Named entity: auml; with a semi-colon", + "output": [ + [ + "Character", + "\u00e4" + ] + ] + }, + { + "input": "&awconint", + "description": "Bad named entity: awconint without a semi-colon", + "output": [ + [ + "Character", + "&awconint" + ] + ] + }, + { + "input": "∳", + "description": "Named entity: awconint; with a semi-colon", + "output": [ + [ + "Character", + "\u2233" + ] + ] + }, + { + "input": "&awint", + "description": "Bad named entity: awint without a semi-colon", + "output": [ + [ + "Character", + "&awint" + ] + ] + }, + { + "input": "⨑", + "description": "Named entity: awint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a11" + ] + ] + }, + { + "input": "&bNot", + "description": "Bad named entity: bNot without a semi-colon", + "output": [ + [ + "Character", + "&bNot" + ] + ] + }, + { + "input": "⫭", + "description": "Named entity: bNot; with a semi-colon", + "output": [ + [ + "Character", + "\u2aed" + ] + ] + }, + { + "input": "&backcong", + "description": "Bad named entity: backcong without a semi-colon", + "output": [ + [ + "Character", + "&backcong" + ] + ] + }, + { + "input": "≌", + "description": "Named entity: backcong; with a semi-colon", + "output": [ + [ + "Character", + "\u224c" + ] + ] + }, + { + "input": "&backepsilon", + "description": "Bad named entity: backepsilon without a semi-colon", + "output": [ + [ + "Character", + "&backepsilon" + ] + ] + }, + { + "input": "϶", + "description": "Named entity: backepsilon; with a semi-colon", + "output": [ + [ + "Character", + "\u03f6" + ] + ] + }, + { + "input": "&backprime", + "description": "Bad named entity: backprime without a semi-colon", + "output": [ + [ + "Character", + "&backprime" + ] + ] + }, + { + "input": "‵", + "description": "Named entity: backprime; with a semi-colon", + "output": [ + [ + "Character", + "\u2035" + ] + ] + }, + { + "input": "&backsim", + "description": "Bad named entity: backsim without a semi-colon", + "output": [ + [ + "Character", + "&backsim" + ] + ] + }, + { + "input": "∽", + "description": "Named entity: backsim; with a semi-colon", + "output": [ + [ + "Character", + "\u223d" + ] + ] + }, + { + "input": "&backsimeq", + "description": "Bad named entity: backsimeq without a semi-colon", + "output": [ + [ + "Character", + "&backsimeq" + ] + ] + }, + { + "input": "⋍", + "description": "Named entity: backsimeq; with a semi-colon", + "output": [ + [ + "Character", + "\u22cd" + ] + ] + }, + { + "input": "&barvee", + "description": "Bad named entity: barvee without a semi-colon", + "output": [ + [ + "Character", + "&barvee" + ] + ] + }, + { + "input": "⊽", + "description": "Named entity: barvee; with a semi-colon", + "output": [ + [ + "Character", + "\u22bd" + ] + ] + }, + { + "input": "&barwed", + "description": "Bad named entity: barwed without a semi-colon", + "output": [ + [ + "Character", + "&barwed" + ] + ] + }, + { + "input": "⌅", + "description": "Named entity: barwed; with a semi-colon", + "output": [ + [ + "Character", + "\u2305" + ] + ] + }, + { + "input": "&barwedge", + "description": "Bad named entity: barwedge without a semi-colon", + "output": [ + [ + "Character", + "&barwedge" + ] + ] + }, + { + "input": "⌅", + "description": "Named entity: barwedge; with a semi-colon", + "output": [ + [ + "Character", + "\u2305" + ] + ] + }, + { + "input": "&bbrk", + "description": "Bad named entity: bbrk without a semi-colon", + "output": [ + [ + "Character", + "&bbrk" + ] + ] + }, + { + "input": "⎵", + "description": "Named entity: bbrk; with a semi-colon", + "output": [ + [ + "Character", + "\u23b5" + ] + ] + }, + { + "input": "&bbrktbrk", + "description": "Bad named entity: bbrktbrk without a semi-colon", + "output": [ + [ + "Character", + "&bbrktbrk" + ] + ] + }, + { + "input": "⎶", + "description": "Named entity: bbrktbrk; with a semi-colon", + "output": [ + [ + "Character", + "\u23b6" + ] + ] + }, + { + "input": "&bcong", + "description": "Bad named entity: bcong without a semi-colon", + "output": [ + [ + "Character", + "&bcong" + ] + ] + }, + { + "input": "≌", + "description": "Named entity: bcong; with a semi-colon", + "output": [ + [ + "Character", + "\u224c" + ] + ] + }, + { + "input": "&bcy", + "description": "Bad named entity: bcy without a semi-colon", + "output": [ + [ + "Character", + "&bcy" + ] + ] + }, + { + "input": "б", + "description": "Named entity: bcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0431" + ] + ] + }, + { + "input": "&bdquo", + "description": "Bad named entity: bdquo without a semi-colon", + "output": [ + [ + "Character", + "&bdquo" + ] + ] + }, + { + "input": "„", + "description": "Named entity: bdquo; with a semi-colon", + "output": [ + [ + "Character", + "\u201e" + ] + ] + }, + { + "input": "&becaus", + "description": "Bad named entity: becaus without a semi-colon", + "output": [ + [ + "Character", + "&becaus" + ] + ] + }, + { + "input": "∵", + "description": "Named entity: becaus; with a semi-colon", + "output": [ + [ + "Character", + "\u2235" + ] + ] + }, + { + "input": "&because", + "description": "Bad named entity: because without a semi-colon", + "output": [ + [ + "Character", + "&because" + ] + ] + }, + { + "input": "∵", + "description": "Named entity: because; with a semi-colon", + "output": [ + [ + "Character", + "\u2235" + ] + ] + }, + { + "input": "&bemptyv", + "description": "Bad named entity: bemptyv without a semi-colon", + "output": [ + [ + "Character", + "&bemptyv" + ] + ] + }, + { + "input": "⦰", + "description": "Named entity: bemptyv; with a semi-colon", + "output": [ + [ + "Character", + "\u29b0" + ] + ] + }, + { + "input": "&bepsi", + "description": "Bad named entity: bepsi without a semi-colon", + "output": [ + [ + "Character", + "&bepsi" + ] + ] + }, + { + "input": "϶", + "description": "Named entity: bepsi; with a semi-colon", + "output": [ + [ + "Character", + "\u03f6" + ] + ] + }, + { + "input": "&bernou", + "description": "Bad named entity: bernou without a semi-colon", + "output": [ + [ + "Character", + "&bernou" + ] + ] + }, + { + "input": "ℬ", + "description": "Named entity: bernou; with a semi-colon", + "output": [ + [ + "Character", + "\u212c" + ] + ] + }, + { + "input": "&beta", + "description": "Bad named entity: beta without a semi-colon", + "output": [ + [ + "Character", + "&beta" + ] + ] + }, + { + "input": "β", + "description": "Named entity: beta; with a semi-colon", + "output": [ + [ + "Character", + "\u03b2" + ] + ] + }, + { + "input": "&beth", + "description": "Bad named entity: beth without a semi-colon", + "output": [ + [ + "Character", + "&beth" + ] + ] + }, + { + "input": "ℶ", + "description": "Named entity: beth; with a semi-colon", + "output": [ + [ + "Character", + "\u2136" + ] + ] + }, + { + "input": "&between", + "description": "Bad named entity: between without a semi-colon", + "output": [ + [ + "Character", + "&between" + ] + ] + }, + { + "input": "≬", + "description": "Named entity: between; with a semi-colon", + "output": [ + [ + "Character", + "\u226c" + ] + ] + }, + { + "input": "&bfr", + "description": "Bad named entity: bfr without a semi-colon", + "output": [ + [ + "Character", + "&bfr" + ] + ] + }, + { + "input": "𝔟", + "description": "Named entity: bfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd1f" + ] + ] + }, + { + "input": "&bigcap", + "description": "Bad named entity: bigcap without a semi-colon", + "output": [ + [ + "Character", + "&bigcap" + ] + ] + }, + { + "input": "⋂", + "description": "Named entity: bigcap; with a semi-colon", + "output": [ + [ + "Character", + "\u22c2" + ] + ] + }, + { + "input": "&bigcirc", + "description": "Bad named entity: bigcirc without a semi-colon", + "output": [ + [ + "Character", + "&bigcirc" + ] + ] + }, + { + "input": "◯", + "description": "Named entity: bigcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u25ef" + ] + ] + }, + { + "input": "&bigcup", + "description": "Bad named entity: bigcup without a semi-colon", + "output": [ + [ + "Character", + "&bigcup" + ] + ] + }, + { + "input": "⋃", + "description": "Named entity: bigcup; with a semi-colon", + "output": [ + [ + "Character", + "\u22c3" + ] + ] + }, + { + "input": "&bigodot", + "description": "Bad named entity: bigodot without a semi-colon", + "output": [ + [ + "Character", + "&bigodot" + ] + ] + }, + { + "input": "⨀", + "description": "Named entity: bigodot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a00" + ] + ] + }, + { + "input": "&bigoplus", + "description": "Bad named entity: bigoplus without a semi-colon", + "output": [ + [ + "Character", + "&bigoplus" + ] + ] + }, + { + "input": "⨁", + "description": "Named entity: bigoplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a01" + ] + ] + }, + { + "input": "&bigotimes", + "description": "Bad named entity: bigotimes without a semi-colon", + "output": [ + [ + "Character", + "&bigotimes" + ] + ] + }, + { + "input": "⨂", + "description": "Named entity: bigotimes; with a semi-colon", + "output": [ + [ + "Character", + "\u2a02" + ] + ] + }, + { + "input": "&bigsqcup", + "description": "Bad named entity: bigsqcup without a semi-colon", + "output": [ + [ + "Character", + "&bigsqcup" + ] + ] + }, + { + "input": "⨆", + "description": "Named entity: bigsqcup; with a semi-colon", + "output": [ + [ + "Character", + "\u2a06" + ] + ] + }, + { + "input": "&bigstar", + "description": "Bad named entity: bigstar without a semi-colon", + "output": [ + [ + "Character", + "&bigstar" + ] + ] + }, + { + "input": "★", + "description": "Named entity: bigstar; with a semi-colon", + "output": [ + [ + "Character", + "\u2605" + ] + ] + }, + { + "input": "&bigtriangledown", + "description": "Bad named entity: bigtriangledown without a semi-colon", + "output": [ + [ + "Character", + "&bigtriangledown" + ] + ] + }, + { + "input": "▽", + "description": "Named entity: bigtriangledown; with a semi-colon", + "output": [ + [ + "Character", + "\u25bd" + ] + ] + }, + { + "input": "&bigtriangleup", + "description": "Bad named entity: bigtriangleup without a semi-colon", + "output": [ + [ + "Character", + "&bigtriangleup" + ] + ] + }, + { + "input": "△", + "description": "Named entity: bigtriangleup; with a semi-colon", + "output": [ + [ + "Character", + "\u25b3" + ] + ] + }, + { + "input": "&biguplus", + "description": "Bad named entity: biguplus without a semi-colon", + "output": [ + [ + "Character", + "&biguplus" + ] + ] + }, + { + "input": "⨄", + "description": "Named entity: biguplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a04" + ] + ] + }, + { + "input": "&bigvee", + "description": "Bad named entity: bigvee without a semi-colon", + "output": [ + [ + "Character", + "&bigvee" + ] + ] + }, + { + "input": "⋁", + "description": "Named entity: bigvee; with a semi-colon", + "output": [ + [ + "Character", + "\u22c1" + ] + ] + }, + { + "input": "&bigwedge", + "description": "Bad named entity: bigwedge without a semi-colon", + "output": [ + [ + "Character", + "&bigwedge" + ] + ] + }, + { + "input": "⋀", + "description": "Named entity: bigwedge; with a semi-colon", + "output": [ + [ + "Character", + "\u22c0" + ] + ] + }, + { + "input": "&bkarow", + "description": "Bad named entity: bkarow without a semi-colon", + "output": [ + [ + "Character", + "&bkarow" + ] + ] + }, + { + "input": "⤍", + "description": "Named entity: bkarow; with a semi-colon", + "output": [ + [ + "Character", + "\u290d" + ] + ] + }, + { + "input": "&blacklozenge", + "description": "Bad named entity: blacklozenge without a semi-colon", + "output": [ + [ + "Character", + "&blacklozenge" + ] + ] + }, + { + "input": "⧫", + "description": "Named entity: blacklozenge; with a semi-colon", + "output": [ + [ + "Character", + "\u29eb" + ] + ] + }, + { + "input": "&blacksquare", + "description": "Bad named entity: blacksquare without a semi-colon", + "output": [ + [ + "Character", + "&blacksquare" + ] + ] + }, + { + "input": "▪", + "description": "Named entity: blacksquare; with a semi-colon", + "output": [ + [ + "Character", + "\u25aa" + ] + ] + }, + { + "input": "&blacktriangle", + "description": "Bad named entity: blacktriangle without a semi-colon", + "output": [ + [ + "Character", + "&blacktriangle" + ] + ] + }, + { + "input": "▴", + "description": "Named entity: blacktriangle; with a semi-colon", + "output": [ + [ + "Character", + "\u25b4" + ] + ] + }, + { + "input": "&blacktriangledown", + "description": "Bad named entity: blacktriangledown without a semi-colon", + "output": [ + [ + "Character", + "&blacktriangledown" + ] + ] + }, + { + "input": "▾", + "description": "Named entity: blacktriangledown; with a semi-colon", + "output": [ + [ + "Character", + "\u25be" + ] + ] + }, + { + "input": "&blacktriangleleft", + "description": "Bad named entity: blacktriangleleft without a semi-colon", + "output": [ + [ + "Character", + "&blacktriangleleft" + ] + ] + }, + { + "input": "◂", + "description": "Named entity: blacktriangleleft; with a semi-colon", + "output": [ + [ + "Character", + "\u25c2" + ] + ] + }, + { + "input": "&blacktriangleright", + "description": "Bad named entity: blacktriangleright without a semi-colon", + "output": [ + [ + "Character", + "&blacktriangleright" + ] + ] + }, + { + "input": "▸", + "description": "Named entity: blacktriangleright; with a semi-colon", + "output": [ + [ + "Character", + "\u25b8" + ] + ] + }, + { + "input": "&blank", + "description": "Bad named entity: blank without a semi-colon", + "output": [ + [ + "Character", + "&blank" + ] + ] + }, + { + "input": "␣", + "description": "Named entity: blank; with a semi-colon", + "output": [ + [ + "Character", + "\u2423" + ] + ] + }, + { + "input": "&blk12", + "description": "Bad named entity: blk12 without a semi-colon", + "output": [ + [ + "Character", + "&blk12" + ] + ] + }, + { + "input": "▒", + "description": "Named entity: blk12; with a semi-colon", + "output": [ + [ + "Character", + "\u2592" + ] + ] + }, + { + "input": "&blk14", + "description": "Bad named entity: blk14 without a semi-colon", + "output": [ + [ + "Character", + "&blk14" + ] + ] + }, + { + "input": "░", + "description": "Named entity: blk14; with a semi-colon", + "output": [ + [ + "Character", + "\u2591" + ] + ] + }, + { + "input": "&blk34", + "description": "Bad named entity: blk34 without a semi-colon", + "output": [ + [ + "Character", + "&blk34" + ] + ] + }, + { + "input": "▓", + "description": "Named entity: blk34; with a semi-colon", + "output": [ + [ + "Character", + "\u2593" + ] + ] + }, + { + "input": "&block", + "description": "Bad named entity: block without a semi-colon", + "output": [ + [ + "Character", + "&block" + ] + ] + }, + { + "input": "█", + "description": "Named entity: block; with a semi-colon", + "output": [ + [ + "Character", + "\u2588" + ] + ] + }, + { + "input": "&bne", + "description": "Bad named entity: bne without a semi-colon", + "output": [ + [ + "Character", + "&bne" + ] + ] + }, + { + "input": "=⃥", + "description": "Named entity: bne; with a semi-colon", + "output": [ + [ + "Character", + "=\u20e5" + ] + ] + }, + { + "input": "&bnequiv", + "description": "Bad named entity: bnequiv without a semi-colon", + "output": [ + [ + "Character", + "&bnequiv" + ] + ] + }, + { + "input": "≡⃥", + "description": "Named entity: bnequiv; with a semi-colon", + "output": [ + [ + "Character", + "\u2261\u20e5" + ] + ] + }, + { + "input": "&bnot", + "description": "Bad named entity: bnot without a semi-colon", + "output": [ + [ + "Character", + "&bnot" + ] + ] + }, + { + "input": "⌐", + "description": "Named entity: bnot; with a semi-colon", + "output": [ + [ + "Character", + "\u2310" + ] + ] + }, + { + "input": "&bopf", + "description": "Bad named entity: bopf without a semi-colon", + "output": [ + [ + "Character", + "&bopf" + ] + ] + }, + { + "input": "𝕓", + "description": "Named entity: bopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd53" + ] + ] + }, + { + "input": "&bot", + "description": "Bad named entity: bot without a semi-colon", + "output": [ + [ + "Character", + "&bot" + ] + ] + }, + { + "input": "⊥", + "description": "Named entity: bot; with a semi-colon", + "output": [ + [ + "Character", + "\u22a5" + ] + ] + }, + { + "input": "&bottom", + "description": "Bad named entity: bottom without a semi-colon", + "output": [ + [ + "Character", + "&bottom" + ] + ] + }, + { + "input": "⊥", + "description": "Named entity: bottom; with a semi-colon", + "output": [ + [ + "Character", + "\u22a5" + ] + ] + }, + { + "input": "&bowtie", + "description": "Bad named entity: bowtie without a semi-colon", + "output": [ + [ + "Character", + "&bowtie" + ] + ] + }, + { + "input": "⋈", + "description": "Named entity: bowtie; with a semi-colon", + "output": [ + [ + "Character", + "\u22c8" + ] + ] + }, + { + "input": "&boxDL", + "description": "Bad named entity: boxDL without a semi-colon", + "output": [ + [ + "Character", + "&boxDL" + ] + ] + }, + { + "input": "╗", + "description": "Named entity: boxDL; with a semi-colon", + "output": [ + [ + "Character", + "\u2557" + ] + ] + }, + { + "input": "&boxDR", + "description": "Bad named entity: boxDR without a semi-colon", + "output": [ + [ + "Character", + "&boxDR" + ] + ] + }, + { + "input": "╔", + "description": "Named entity: boxDR; with a semi-colon", + "output": [ + [ + "Character", + "\u2554" + ] + ] + }, + { + "input": "&boxDl", + "description": "Bad named entity: boxDl without a semi-colon", + "output": [ + [ + "Character", + "&boxDl" + ] + ] + }, + { + "input": "╖", + "description": "Named entity: boxDl; with a semi-colon", + "output": [ + [ + "Character", + "\u2556" + ] + ] + }, + { + "input": "&boxDr", + "description": "Bad named entity: boxDr without a semi-colon", + "output": [ + [ + "Character", + "&boxDr" + ] + ] + }, + { + "input": "╓", + "description": "Named entity: boxDr; with a semi-colon", + "output": [ + [ + "Character", + "\u2553" + ] + ] + }, + { + "input": "&boxH", + "description": "Bad named entity: boxH without a semi-colon", + "output": [ + [ + "Character", + "&boxH" + ] + ] + }, + { + "input": "═", + "description": "Named entity: boxH; with a semi-colon", + "output": [ + [ + "Character", + "\u2550" + ] + ] + }, + { + "input": "&boxHD", + "description": "Bad named entity: boxHD without a semi-colon", + "output": [ + [ + "Character", + "&boxHD" + ] + ] + }, + { + "input": "╦", + "description": "Named entity: boxHD; with a semi-colon", + "output": [ + [ + "Character", + "\u2566" + ] + ] + }, + { + "input": "&boxHU", + "description": "Bad named entity: boxHU without a semi-colon", + "output": [ + [ + "Character", + "&boxHU" + ] + ] + }, + { + "input": "╩", + "description": "Named entity: boxHU; with a semi-colon", + "output": [ + [ + "Character", + "\u2569" + ] + ] + }, + { + "input": "&boxHd", + "description": "Bad named entity: boxHd without a semi-colon", + "output": [ + [ + "Character", + "&boxHd" + ] + ] + }, + { + "input": "╤", + "description": "Named entity: boxHd; with a semi-colon", + "output": [ + [ + "Character", + "\u2564" + ] + ] + }, + { + "input": "&boxHu", + "description": "Bad named entity: boxHu without a semi-colon", + "output": [ + [ + "Character", + "&boxHu" + ] + ] + }, + { + "input": "╧", + "description": "Named entity: boxHu; with a semi-colon", + "output": [ + [ + "Character", + "\u2567" + ] + ] + }, + { + "input": "&boxUL", + "description": "Bad named entity: boxUL without a semi-colon", + "output": [ + [ + "Character", + "&boxUL" + ] + ] + }, + { + "input": "╝", + "description": "Named entity: boxUL; with a semi-colon", + "output": [ + [ + "Character", + "\u255d" + ] + ] + }, + { + "input": "&boxUR", + "description": "Bad named entity: boxUR without a semi-colon", + "output": [ + [ + "Character", + "&boxUR" + ] + ] + }, + { + "input": "╚", + "description": "Named entity: boxUR; with a semi-colon", + "output": [ + [ + "Character", + "\u255a" + ] + ] + }, + { + "input": "&boxUl", + "description": "Bad named entity: boxUl without a semi-colon", + "output": [ + [ + "Character", + "&boxUl" + ] + ] + }, + { + "input": "╜", + "description": "Named entity: boxUl; with a semi-colon", + "output": [ + [ + "Character", + "\u255c" + ] + ] + }, + { + "input": "&boxUr", + "description": "Bad named entity: boxUr without a semi-colon", + "output": [ + [ + "Character", + "&boxUr" + ] + ] + }, + { + "input": "╙", + "description": "Named entity: boxUr; with a semi-colon", + "output": [ + [ + "Character", + "\u2559" + ] + ] + }, + { + "input": "&boxV", + "description": "Bad named entity: boxV without a semi-colon", + "output": [ + [ + "Character", + "&boxV" + ] + ] + }, + { + "input": "║", + "description": "Named entity: boxV; with a semi-colon", + "output": [ + [ + "Character", + "\u2551" + ] + ] + }, + { + "input": "&boxVH", + "description": "Bad named entity: boxVH without a semi-colon", + "output": [ + [ + "Character", + "&boxVH" + ] + ] + }, + { + "input": "╬", + "description": "Named entity: boxVH; with a semi-colon", + "output": [ + [ + "Character", + "\u256c" + ] + ] + }, + { + "input": "&boxVL", + "description": "Bad named entity: boxVL without a semi-colon", + "output": [ + [ + "Character", + "&boxVL" + ] + ] + }, + { + "input": "╣", + "description": "Named entity: boxVL; with a semi-colon", + "output": [ + [ + "Character", + "\u2563" + ] + ] + }, + { + "input": "&boxVR", + "description": "Bad named entity: boxVR without a semi-colon", + "output": [ + [ + "Character", + "&boxVR" + ] + ] + }, + { + "input": "╠", + "description": "Named entity: boxVR; with a semi-colon", + "output": [ + [ + "Character", + "\u2560" + ] + ] + }, + { + "input": "&boxVh", + "description": "Bad named entity: boxVh without a semi-colon", + "output": [ + [ + "Character", + "&boxVh" + ] + ] + }, + { + "input": "╫", + "description": "Named entity: boxVh; with a semi-colon", + "output": [ + [ + "Character", + "\u256b" + ] + ] + }, + { + "input": "&boxVl", + "description": "Bad named entity: boxVl without a semi-colon", + "output": [ + [ + "Character", + "&boxVl" + ] + ] + }, + { + "input": "╢", + "description": "Named entity: boxVl; with a semi-colon", + "output": [ + [ + "Character", + "\u2562" + ] + ] + }, + { + "input": "&boxVr", + "description": "Bad named entity: boxVr without a semi-colon", + "output": [ + [ + "Character", + "&boxVr" + ] + ] + }, + { + "input": "╟", + "description": "Named entity: boxVr; with a semi-colon", + "output": [ + [ + "Character", + "\u255f" + ] + ] + }, + { + "input": "&boxbox", + "description": "Bad named entity: boxbox without a semi-colon", + "output": [ + [ + "Character", + "&boxbox" + ] + ] + }, + { + "input": "⧉", + "description": "Named entity: boxbox; with a semi-colon", + "output": [ + [ + "Character", + "\u29c9" + ] + ] + }, + { + "input": "&boxdL", + "description": "Bad named entity: boxdL without a semi-colon", + "output": [ + [ + "Character", + "&boxdL" + ] + ] + }, + { + "input": "╕", + "description": "Named entity: boxdL; with a semi-colon", + "output": [ + [ + "Character", + "\u2555" + ] + ] + }, + { + "input": "&boxdR", + "description": "Bad named entity: boxdR without a semi-colon", + "output": [ + [ + "Character", + "&boxdR" + ] + ] + }, + { + "input": "╒", + "description": "Named entity: boxdR; with a semi-colon", + "output": [ + [ + "Character", + "\u2552" + ] + ] + }, + { + "input": "&boxdl", + "description": "Bad named entity: boxdl without a semi-colon", + "output": [ + [ + "Character", + "&boxdl" + ] + ] + }, + { + "input": "┐", + "description": "Named entity: boxdl; with a semi-colon", + "output": [ + [ + "Character", + "\u2510" + ] + ] + }, + { + "input": "&boxdr", + "description": "Bad named entity: boxdr without a semi-colon", + "output": [ + [ + "Character", + "&boxdr" + ] + ] + }, + { + "input": "┌", + "description": "Named entity: boxdr; with a semi-colon", + "output": [ + [ + "Character", + "\u250c" + ] + ] + }, + { + "input": "&boxh", + "description": "Bad named entity: boxh without a semi-colon", + "output": [ + [ + "Character", + "&boxh" + ] + ] + }, + { + "input": "─", + "description": "Named entity: boxh; with a semi-colon", + "output": [ + [ + "Character", + "\u2500" + ] + ] + }, + { + "input": "&boxhD", + "description": "Bad named entity: boxhD without a semi-colon", + "output": [ + [ + "Character", + "&boxhD" + ] + ] + }, + { + "input": "╥", + "description": "Named entity: boxhD; with a semi-colon", + "output": [ + [ + "Character", + "\u2565" + ] + ] + }, + { + "input": "&boxhU", + "description": "Bad named entity: boxhU without a semi-colon", + "output": [ + [ + "Character", + "&boxhU" + ] + ] + }, + { + "input": "╨", + "description": "Named entity: boxhU; with a semi-colon", + "output": [ + [ + "Character", + "\u2568" + ] + ] + }, + { + "input": "&boxhd", + "description": "Bad named entity: boxhd without a semi-colon", + "output": [ + [ + "Character", + "&boxhd" + ] + ] + }, + { + "input": "┬", + "description": "Named entity: boxhd; with a semi-colon", + "output": [ + [ + "Character", + "\u252c" + ] + ] + }, + { + "input": "&boxhu", + "description": "Bad named entity: boxhu without a semi-colon", + "output": [ + [ + "Character", + "&boxhu" + ] + ] + }, + { + "input": "┴", + "description": "Named entity: boxhu; with a semi-colon", + "output": [ + [ + "Character", + "\u2534" + ] + ] + }, + { + "input": "&boxminus", + "description": "Bad named entity: boxminus without a semi-colon", + "output": [ + [ + "Character", + "&boxminus" + ] + ] + }, + { + "input": "⊟", + "description": "Named entity: boxminus; with a semi-colon", + "output": [ + [ + "Character", + "\u229f" + ] + ] + }, + { + "input": "&boxplus", + "description": "Bad named entity: boxplus without a semi-colon", + "output": [ + [ + "Character", + "&boxplus" + ] + ] + }, + { + "input": "⊞", + "description": "Named entity: boxplus; with a semi-colon", + "output": [ + [ + "Character", + "\u229e" + ] + ] + }, + { + "input": "&boxtimes", + "description": "Bad named entity: boxtimes without a semi-colon", + "output": [ + [ + "Character", + "&boxtimes" + ] + ] + }, + { + "input": "⊠", + "description": "Named entity: boxtimes; with a semi-colon", + "output": [ + [ + "Character", + "\u22a0" + ] + ] + }, + { + "input": "&boxuL", + "description": "Bad named entity: boxuL without a semi-colon", + "output": [ + [ + "Character", + "&boxuL" + ] + ] + }, + { + "input": "╛", + "description": "Named entity: boxuL; with a semi-colon", + "output": [ + [ + "Character", + "\u255b" + ] + ] + }, + { + "input": "&boxuR", + "description": "Bad named entity: boxuR without a semi-colon", + "output": [ + [ + "Character", + "&boxuR" + ] + ] + }, + { + "input": "╘", + "description": "Named entity: boxuR; with a semi-colon", + "output": [ + [ + "Character", + "\u2558" + ] + ] + }, + { + "input": "&boxul", + "description": "Bad named entity: boxul without a semi-colon", + "output": [ + [ + "Character", + "&boxul" + ] + ] + }, + { + "input": "┘", + "description": "Named entity: boxul; with a semi-colon", + "output": [ + [ + "Character", + "\u2518" + ] + ] + }, + { + "input": "&boxur", + "description": "Bad named entity: boxur without a semi-colon", + "output": [ + [ + "Character", + "&boxur" + ] + ] + }, + { + "input": "└", + "description": "Named entity: boxur; with a semi-colon", + "output": [ + [ + "Character", + "\u2514" + ] + ] + }, + { + "input": "&boxv", + "description": "Bad named entity: boxv without a semi-colon", + "output": [ + [ + "Character", + "&boxv" + ] + ] + }, + { + "input": "│", + "description": "Named entity: boxv; with a semi-colon", + "output": [ + [ + "Character", + "\u2502" + ] + ] + }, + { + "input": "&boxvH", + "description": "Bad named entity: boxvH without a semi-colon", + "output": [ + [ + "Character", + "&boxvH" + ] + ] + }, + { + "input": "╪", + "description": "Named entity: boxvH; with a semi-colon", + "output": [ + [ + "Character", + "\u256a" + ] + ] + }, + { + "input": "&boxvL", + "description": "Bad named entity: boxvL without a semi-colon", + "output": [ + [ + "Character", + "&boxvL" + ] + ] + }, + { + "input": "╡", + "description": "Named entity: boxvL; with a semi-colon", + "output": [ + [ + "Character", + "\u2561" + ] + ] + }, + { + "input": "&boxvR", + "description": "Bad named entity: boxvR without a semi-colon", + "output": [ + [ + "Character", + "&boxvR" + ] + ] + }, + { + "input": "╞", + "description": "Named entity: boxvR; with a semi-colon", + "output": [ + [ + "Character", + "\u255e" + ] + ] + }, + { + "input": "&boxvh", + "description": "Bad named entity: boxvh without a semi-colon", + "output": [ + [ + "Character", + "&boxvh" + ] + ] + }, + { + "input": "┼", + "description": "Named entity: boxvh; with a semi-colon", + "output": [ + [ + "Character", + "\u253c" + ] + ] + }, + { + "input": "&boxvl", + "description": "Bad named entity: boxvl without a semi-colon", + "output": [ + [ + "Character", + "&boxvl" + ] + ] + }, + { + "input": "┤", + "description": "Named entity: boxvl; with a semi-colon", + "output": [ + [ + "Character", + "\u2524" + ] + ] + }, + { + "input": "&boxvr", + "description": "Bad named entity: boxvr without a semi-colon", + "output": [ + [ + "Character", + "&boxvr" + ] + ] + }, + { + "input": "├", + "description": "Named entity: boxvr; with a semi-colon", + "output": [ + [ + "Character", + "\u251c" + ] + ] + }, + { + "input": "&bprime", + "description": "Bad named entity: bprime without a semi-colon", + "output": [ + [ + "Character", + "&bprime" + ] + ] + }, + { + "input": "‵", + "description": "Named entity: bprime; with a semi-colon", + "output": [ + [ + "Character", + "\u2035" + ] + ] + }, + { + "input": "&breve", + "description": "Bad named entity: breve without a semi-colon", + "output": [ + [ + "Character", + "&breve" + ] + ] + }, + { + "input": "˘", + "description": "Named entity: breve; with a semi-colon", + "output": [ + [ + "Character", + "\u02d8" + ] + ] + }, + { + "input": "¦", + "description": "Named entity: brvbar without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a6" + ] + ] + }, + { + "input": "¦", + "description": "Named entity: brvbar; with a semi-colon", + "output": [ + [ + "Character", + "\u00a6" + ] + ] + }, + { + "input": "&bscr", + "description": "Bad named entity: bscr without a semi-colon", + "output": [ + [ + "Character", + "&bscr" + ] + ] + }, + { + "input": "𝒷", + "description": "Named entity: bscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb7" + ] + ] + }, + { + "input": "&bsemi", + "description": "Bad named entity: bsemi without a semi-colon", + "output": [ + [ + "Character", + "&bsemi" + ] + ] + }, + { + "input": "⁏", + "description": "Named entity: bsemi; with a semi-colon", + "output": [ + [ + "Character", + "\u204f" + ] + ] + }, + { + "input": "&bsim", + "description": "Bad named entity: bsim without a semi-colon", + "output": [ + [ + "Character", + "&bsim" + ] + ] + }, + { + "input": "∽", + "description": "Named entity: bsim; with a semi-colon", + "output": [ + [ + "Character", + "\u223d" + ] + ] + }, + { + "input": "&bsime", + "description": "Bad named entity: bsime without a semi-colon", + "output": [ + [ + "Character", + "&bsime" + ] + ] + }, + { + "input": "⋍", + "description": "Named entity: bsime; with a semi-colon", + "output": [ + [ + "Character", + "\u22cd" + ] + ] + }, + { + "input": "&bsol", + "description": "Bad named entity: bsol without a semi-colon", + "output": [ + [ + "Character", + "&bsol" + ] + ] + }, + { + "input": "\", + "description": "Named entity: bsol; with a semi-colon", + "output": [ + [ + "Character", + "\\" + ] + ] + }, + { + "input": "&bsolb", + "description": "Bad named entity: bsolb without a semi-colon", + "output": [ + [ + "Character", + "&bsolb" + ] + ] + }, + { + "input": "⧅", + "description": "Named entity: bsolb; with a semi-colon", + "output": [ + [ + "Character", + "\u29c5" + ] + ] + }, + { + "input": "&bsolhsub", + "description": "Bad named entity: bsolhsub without a semi-colon", + "output": [ + [ + "Character", + "&bsolhsub" + ] + ] + }, + { + "input": "⟈", + "description": "Named entity: bsolhsub; with a semi-colon", + "output": [ + [ + "Character", + "\u27c8" + ] + ] + }, + { + "input": "&bull", + "description": "Bad named entity: bull without a semi-colon", + "output": [ + [ + "Character", + "&bull" + ] + ] + }, + { + "input": "•", + "description": "Named entity: bull; with a semi-colon", + "output": [ + [ + "Character", + "\u2022" + ] + ] + }, + { + "input": "&bullet", + "description": "Bad named entity: bullet without a semi-colon", + "output": [ + [ + "Character", + "&bullet" + ] + ] + }, + { + "input": "•", + "description": "Named entity: bullet; with a semi-colon", + "output": [ + [ + "Character", + "\u2022" + ] + ] + }, + { + "input": "&bump", + "description": "Bad named entity: bump without a semi-colon", + "output": [ + [ + "Character", + "&bump" + ] + ] + }, + { + "input": "≎", + "description": "Named entity: bump; with a semi-colon", + "output": [ + [ + "Character", + "\u224e" + ] + ] + }, + { + "input": "&bumpE", + "description": "Bad named entity: bumpE without a semi-colon", + "output": [ + [ + "Character", + "&bumpE" + ] + ] + }, + { + "input": "⪮", + "description": "Named entity: bumpE; with a semi-colon", + "output": [ + [ + "Character", + "\u2aae" + ] + ] + }, + { + "input": "&bumpe", + "description": "Bad named entity: bumpe without a semi-colon", + "output": [ + [ + "Character", + "&bumpe" + ] + ] + }, + { + "input": "≏", + "description": "Named entity: bumpe; with a semi-colon", + "output": [ + [ + "Character", + "\u224f" + ] + ] + }, + { + "input": "&bumpeq", + "description": "Bad named entity: bumpeq without a semi-colon", + "output": [ + [ + "Character", + "&bumpeq" + ] + ] + }, + { + "input": "≏", + "description": "Named entity: bumpeq; with a semi-colon", + "output": [ + [ + "Character", + "\u224f" + ] + ] + }, + { + "input": "&cacute", + "description": "Bad named entity: cacute without a semi-colon", + "output": [ + [ + "Character", + "&cacute" + ] + ] + }, + { + "input": "ć", + "description": "Named entity: cacute; with a semi-colon", + "output": [ + [ + "Character", + "\u0107" + ] + ] + }, + { + "input": "&cap", + "description": "Bad named entity: cap without a semi-colon", + "output": [ + [ + "Character", + "&cap" + ] + ] + }, + { + "input": "∩", + "description": "Named entity: cap; with a semi-colon", + "output": [ + [ + "Character", + "\u2229" + ] + ] + }, + { + "input": "&capand", + "description": "Bad named entity: capand without a semi-colon", + "output": [ + [ + "Character", + "&capand" + ] + ] + }, + { + "input": "⩄", + "description": "Named entity: capand; with a semi-colon", + "output": [ + [ + "Character", + "\u2a44" + ] + ] + }, + { + "input": "&capbrcup", + "description": "Bad named entity: capbrcup without a semi-colon", + "output": [ + [ + "Character", + "&capbrcup" + ] + ] + }, + { + "input": "⩉", + "description": "Named entity: capbrcup; with a semi-colon", + "output": [ + [ + "Character", + "\u2a49" + ] + ] + }, + { + "input": "&capcap", + "description": "Bad named entity: capcap without a semi-colon", + "output": [ + [ + "Character", + "&capcap" + ] + ] + }, + { + "input": "⩋", + "description": "Named entity: capcap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a4b" + ] + ] + }, + { + "input": "&capcup", + "description": "Bad named entity: capcup without a semi-colon", + "output": [ + [ + "Character", + "&capcup" + ] + ] + }, + { + "input": "⩇", + "description": "Named entity: capcup; with a semi-colon", + "output": [ + [ + "Character", + "\u2a47" + ] + ] + }, + { + "input": "&capdot", + "description": "Bad named entity: capdot without a semi-colon", + "output": [ + [ + "Character", + "&capdot" + ] + ] + }, + { + "input": "⩀", + "description": "Named entity: capdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a40" + ] + ] + }, + { + "input": "&caps", + "description": "Bad named entity: caps without a semi-colon", + "output": [ + [ + "Character", + "&caps" + ] + ] + }, + { + "input": "∩︀", + "description": "Named entity: caps; with a semi-colon", + "output": [ + [ + "Character", + "\u2229\ufe00" + ] + ] + }, + { + "input": "&caret", + "description": "Bad named entity: caret without a semi-colon", + "output": [ + [ + "Character", + "&caret" + ] + ] + }, + { + "input": "⁁", + "description": "Named entity: caret; with a semi-colon", + "output": [ + [ + "Character", + "\u2041" + ] + ] + }, + { + "input": "&caron", + "description": "Bad named entity: caron without a semi-colon", + "output": [ + [ + "Character", + "&caron" + ] + ] + }, + { + "input": "ˇ", + "description": "Named entity: caron; with a semi-colon", + "output": [ + [ + "Character", + "\u02c7" + ] + ] + }, + { + "input": "&ccaps", + "description": "Bad named entity: ccaps without a semi-colon", + "output": [ + [ + "Character", + "&ccaps" + ] + ] + }, + { + "input": "⩍", + "description": "Named entity: ccaps; with a semi-colon", + "output": [ + [ + "Character", + "\u2a4d" + ] + ] + }, + { + "input": "&ccaron", + "description": "Bad named entity: ccaron without a semi-colon", + "output": [ + [ + "Character", + "&ccaron" + ] + ] + }, + { + "input": "č", + "description": "Named entity: ccaron; with a semi-colon", + "output": [ + [ + "Character", + "\u010d" + ] + ] + }, + { + "input": "ç", + "description": "Named entity: ccedil without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e7" + ] + ] + }, + { + "input": "ç", + "description": "Named entity: ccedil; with a semi-colon", + "output": [ + [ + "Character", + "\u00e7" + ] + ] + }, + { + "input": "&ccirc", + "description": "Bad named entity: ccirc without a semi-colon", + "output": [ + [ + "Character", + "&ccirc" + ] + ] + }, + { + "input": "ĉ", + "description": "Named entity: ccirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0109" + ] + ] + }, + { + "input": "&ccups", + "description": "Bad named entity: ccups without a semi-colon", + "output": [ + [ + "Character", + "&ccups" + ] + ] + }, + { + "input": "⩌", + "description": "Named entity: ccups; with a semi-colon", + "output": [ + [ + "Character", + "\u2a4c" + ] + ] + }, + { + "input": "&ccupssm", + "description": "Bad named entity: ccupssm without a semi-colon", + "output": [ + [ + "Character", + "&ccupssm" + ] + ] + }, + { + "input": "⩐", + "description": "Named entity: ccupssm; with a semi-colon", + "output": [ + [ + "Character", + "\u2a50" + ] + ] + }, + { + "input": "&cdot", + "description": "Bad named entity: cdot without a semi-colon", + "output": [ + [ + "Character", + "&cdot" + ] + ] + }, + { + "input": "ċ", + "description": "Named entity: cdot; with a semi-colon", + "output": [ + [ + "Character", + "\u010b" + ] + ] + }, + { + "input": "¸", + "description": "Named entity: cedil without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b8" + ] + ] + }, + { + "input": "¸", + "description": "Named entity: cedil; with a semi-colon", + "output": [ + [ + "Character", + "\u00b8" + ] + ] + }, + { + "input": "&cemptyv", + "description": "Bad named entity: cemptyv without a semi-colon", + "output": [ + [ + "Character", + "&cemptyv" + ] + ] + }, + { + "input": "⦲", + "description": "Named entity: cemptyv; with a semi-colon", + "output": [ + [ + "Character", + "\u29b2" + ] + ] + }, + { + "input": "¢", + "description": "Named entity: cent without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a2" + ] + ] + }, + { + "input": "¢", + "description": "Named entity: cent; with a semi-colon", + "output": [ + [ + "Character", + "\u00a2" + ] + ] + }, + { + "input": "·", + "description": "Named entity: centerdot; with a semi-colon", + "output": [ + [ + "Character", + "\u00b7" + ] + ] + }, + { + "input": "&cfr", + "description": "Bad named entity: cfr without a semi-colon", + "output": [ + [ + "Character", + "&cfr" + ] + ] + }, + { + "input": "𝔠", + "description": "Named entity: cfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd20" + ] + ] + }, + { + "input": "&chcy", + "description": "Bad named entity: chcy without a semi-colon", + "output": [ + [ + "Character", + "&chcy" + ] + ] + }, + { + "input": "ч", + "description": "Named entity: chcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0447" + ] + ] + }, + { + "input": "&check", + "description": "Bad named entity: check without a semi-colon", + "output": [ + [ + "Character", + "&check" + ] + ] + }, + { + "input": "✓", + "description": "Named entity: check; with a semi-colon", + "output": [ + [ + "Character", + "\u2713" + ] + ] + }, + { + "input": "&checkmark", + "description": "Bad named entity: checkmark without a semi-colon", + "output": [ + [ + "Character", + "&checkmark" + ] + ] + }, + { + "input": "✓", + "description": "Named entity: checkmark; with a semi-colon", + "output": [ + [ + "Character", + "\u2713" + ] + ] + }, + { + "input": "&chi", + "description": "Bad named entity: chi without a semi-colon", + "output": [ + [ + "Character", + "&chi" + ] + ] + }, + { + "input": "χ", + "description": "Named entity: chi; with a semi-colon", + "output": [ + [ + "Character", + "\u03c7" + ] + ] + }, + { + "input": "&cir", + "description": "Bad named entity: cir without a semi-colon", + "output": [ + [ + "Character", + "&cir" + ] + ] + }, + { + "input": "○", + "description": "Named entity: cir; with a semi-colon", + "output": [ + [ + "Character", + "\u25cb" + ] + ] + }, + { + "input": "&cirE", + "description": "Bad named entity: cirE without a semi-colon", + "output": [ + [ + "Character", + "&cirE" + ] + ] + }, + { + "input": "⧃", + "description": "Named entity: cirE; with a semi-colon", + "output": [ + [ + "Character", + "\u29c3" + ] + ] + }, + { + "input": "&circ", + "description": "Bad named entity: circ without a semi-colon", + "output": [ + [ + "Character", + "&circ" + ] + ] + }, + { + "input": "ˆ", + "description": "Named entity: circ; with a semi-colon", + "output": [ + [ + "Character", + "\u02c6" + ] + ] + }, + { + "input": "&circeq", + "description": "Bad named entity: circeq without a semi-colon", + "output": [ + [ + "Character", + "&circeq" + ] + ] + }, + { + "input": "≗", + "description": "Named entity: circeq; with a semi-colon", + "output": [ + [ + "Character", + "\u2257" + ] + ] + }, + { + "input": "&circlearrowleft", + "description": "Bad named entity: circlearrowleft without a semi-colon", + "output": [ + [ + "Character", + "&circlearrowleft" + ] + ] + }, + { + "input": "↺", + "description": "Named entity: circlearrowleft; with a semi-colon", + "output": [ + [ + "Character", + "\u21ba" + ] + ] + }, + { + "input": "&circlearrowright", + "description": "Bad named entity: circlearrowright without a semi-colon", + "output": [ + [ + "Character", + "&circlearrowright" + ] + ] + }, + { + "input": "↻", + "description": "Named entity: circlearrowright; with a semi-colon", + "output": [ + [ + "Character", + "\u21bb" + ] + ] + }, + { + "input": "&circledR", + "description": "Bad named entity: circledR without a semi-colon", + "output": [ + [ + "Character", + "&circledR" + ] + ] + }, + { + "input": "®", + "description": "Named entity: circledR; with a semi-colon", + "output": [ + [ + "Character", + "\u00ae" + ] + ] + }, + { + "input": "&circledS", + "description": "Bad named entity: circledS without a semi-colon", + "output": [ + [ + "Character", + "&circledS" + ] + ] + }, + { + "input": "Ⓢ", + "description": "Named entity: circledS; with a semi-colon", + "output": [ + [ + "Character", + "\u24c8" + ] + ] + }, + { + "input": "&circledast", + "description": "Bad named entity: circledast without a semi-colon", + "output": [ + [ + "Character", + "&circledast" + ] + ] + }, + { + "input": "⊛", + "description": "Named entity: circledast; with a semi-colon", + "output": [ + [ + "Character", + "\u229b" + ] + ] + }, + { + "input": "&circledcirc", + "description": "Bad named entity: circledcirc without a semi-colon", + "output": [ + [ + "Character", + "&circledcirc" + ] + ] + }, + { + "input": "⊚", + "description": "Named entity: circledcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u229a" + ] + ] + }, + { + "input": "&circleddash", + "description": "Bad named entity: circleddash without a semi-colon", + "output": [ + [ + "Character", + "&circleddash" + ] + ] + }, + { + "input": "⊝", + "description": "Named entity: circleddash; with a semi-colon", + "output": [ + [ + "Character", + "\u229d" + ] + ] + }, + { + "input": "&cire", + "description": "Bad named entity: cire without a semi-colon", + "output": [ + [ + "Character", + "&cire" + ] + ] + }, + { + "input": "≗", + "description": "Named entity: cire; with a semi-colon", + "output": [ + [ + "Character", + "\u2257" + ] + ] + }, + { + "input": "&cirfnint", + "description": "Bad named entity: cirfnint without a semi-colon", + "output": [ + [ + "Character", + "&cirfnint" + ] + ] + }, + { + "input": "⨐", + "description": "Named entity: cirfnint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a10" + ] + ] + }, + { + "input": "&cirmid", + "description": "Bad named entity: cirmid without a semi-colon", + "output": [ + [ + "Character", + "&cirmid" + ] + ] + }, + { + "input": "⫯", + "description": "Named entity: cirmid; with a semi-colon", + "output": [ + [ + "Character", + "\u2aef" + ] + ] + }, + { + "input": "&cirscir", + "description": "Bad named entity: cirscir without a semi-colon", + "output": [ + [ + "Character", + "&cirscir" + ] + ] + }, + { + "input": "⧂", + "description": "Named entity: cirscir; with a semi-colon", + "output": [ + [ + "Character", + "\u29c2" + ] + ] + }, + { + "input": "&clubs", + "description": "Bad named entity: clubs without a semi-colon", + "output": [ + [ + "Character", + "&clubs" + ] + ] + }, + { + "input": "♣", + "description": "Named entity: clubs; with a semi-colon", + "output": [ + [ + "Character", + "\u2663" + ] + ] + }, + { + "input": "&clubsuit", + "description": "Bad named entity: clubsuit without a semi-colon", + "output": [ + [ + "Character", + "&clubsuit" + ] + ] + }, + { + "input": "♣", + "description": "Named entity: clubsuit; with a semi-colon", + "output": [ + [ + "Character", + "\u2663" + ] + ] + }, + { + "input": "&colon", + "description": "Bad named entity: colon without a semi-colon", + "output": [ + [ + "Character", + "&colon" + ] + ] + }, + { + "input": ":", + "description": "Named entity: colon; with a semi-colon", + "output": [ + [ + "Character", + ":" + ] + ] + }, + { + "input": "&colone", + "description": "Bad named entity: colone without a semi-colon", + "output": [ + [ + "Character", + "&colone" + ] + ] + }, + { + "input": "≔", + "description": "Named entity: colone; with a semi-colon", + "output": [ + [ + "Character", + "\u2254" + ] + ] + }, + { + "input": "&coloneq", + "description": "Bad named entity: coloneq without a semi-colon", + "output": [ + [ + "Character", + "&coloneq" + ] + ] + }, + { + "input": "≔", + "description": "Named entity: coloneq; with a semi-colon", + "output": [ + [ + "Character", + "\u2254" + ] + ] + }, + { + "input": "&comma", + "description": "Bad named entity: comma without a semi-colon", + "output": [ + [ + "Character", + "&comma" + ] + ] + }, + { + "input": ",", + "description": "Named entity: comma; with a semi-colon", + "output": [ + [ + "Character", + "," + ] + ] + }, + { + "input": "&commat", + "description": "Bad named entity: commat without a semi-colon", + "output": [ + [ + "Character", + "&commat" + ] + ] + }, + { + "input": "@", + "description": "Named entity: commat; with a semi-colon", + "output": [ + [ + "Character", + "@" + ] + ] + }, + { + "input": "&comp", + "description": "Bad named entity: comp without a semi-colon", + "output": [ + [ + "Character", + "&comp" + ] + ] + }, + { + "input": "∁", + "description": "Named entity: comp; with a semi-colon", + "output": [ + [ + "Character", + "\u2201" + ] + ] + }, + { + "input": "&compfn", + "description": "Bad named entity: compfn without a semi-colon", + "output": [ + [ + "Character", + "&compfn" + ] + ] + }, + { + "input": "∘", + "description": "Named entity: compfn; with a semi-colon", + "output": [ + [ + "Character", + "\u2218" + ] + ] + }, + { + "input": "&complement", + "description": "Bad named entity: complement without a semi-colon", + "output": [ + [ + "Character", + "&complement" + ] + ] + }, + { + "input": "∁", + "description": "Named entity: complement; with a semi-colon", + "output": [ + [ + "Character", + "\u2201" + ] + ] + }, + { + "input": "&complexes", + "description": "Bad named entity: complexes without a semi-colon", + "output": [ + [ + "Character", + "&complexes" + ] + ] + }, + { + "input": "ℂ", + "description": "Named entity: complexes; with a semi-colon", + "output": [ + [ + "Character", + "\u2102" + ] + ] + }, + { + "input": "&cong", + "description": "Bad named entity: cong without a semi-colon", + "output": [ + [ + "Character", + "&cong" + ] + ] + }, + { + "input": "≅", + "description": "Named entity: cong; with a semi-colon", + "output": [ + [ + "Character", + "\u2245" + ] + ] + }, + { + "input": "&congdot", + "description": "Bad named entity: congdot without a semi-colon", + "output": [ + [ + "Character", + "&congdot" + ] + ] + }, + { + "input": "⩭", + "description": "Named entity: congdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a6d" + ] + ] + }, + { + "input": "&conint", + "description": "Bad named entity: conint without a semi-colon", + "output": [ + [ + "Character", + "&conint" + ] + ] + }, + { + "input": "∮", + "description": "Named entity: conint; with a semi-colon", + "output": [ + [ + "Character", + "\u222e" + ] + ] + }, + { + "input": "&copf", + "description": "Bad named entity: copf without a semi-colon", + "output": [ + [ + "Character", + "&copf" + ] + ] + }, + { + "input": "𝕔", + "description": "Named entity: copf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd54" + ] + ] + }, + { + "input": "&coprod", + "description": "Bad named entity: coprod without a semi-colon", + "output": [ + [ + "Character", + "&coprod" + ] + ] + }, + { + "input": "∐", + "description": "Named entity: coprod; with a semi-colon", + "output": [ + [ + "Character", + "\u2210" + ] + ] + }, + { + "input": "©", + "description": "Named entity: copy without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a9" + ] + ] + }, + { + "input": "©", + "description": "Named entity: copy; with a semi-colon", + "output": [ + [ + "Character", + "\u00a9" + ] + ] + }, + { + "input": "℗", + "description": "Named entity: copysr; with a semi-colon", + "output": [ + [ + "Character", + "\u2117" + ] + ] + }, + { + "input": "&crarr", + "description": "Bad named entity: crarr without a semi-colon", + "output": [ + [ + "Character", + "&crarr" + ] + ] + }, + { + "input": "↵", + "description": "Named entity: crarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21b5" + ] + ] + }, + { + "input": "&cross", + "description": "Bad named entity: cross without a semi-colon", + "output": [ + [ + "Character", + "&cross" + ] + ] + }, + { + "input": "✗", + "description": "Named entity: cross; with a semi-colon", + "output": [ + [ + "Character", + "\u2717" + ] + ] + }, + { + "input": "&cscr", + "description": "Bad named entity: cscr without a semi-colon", + "output": [ + [ + "Character", + "&cscr" + ] + ] + }, + { + "input": "𝒸", + "description": "Named entity: cscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb8" + ] + ] + }, + { + "input": "&csub", + "description": "Bad named entity: csub without a semi-colon", + "output": [ + [ + "Character", + "&csub" + ] + ] + }, + { + "input": "⫏", + "description": "Named entity: csub; with a semi-colon", + "output": [ + [ + "Character", + "\u2acf" + ] + ] + }, + { + "input": "&csube", + "description": "Bad named entity: csube without a semi-colon", + "output": [ + [ + "Character", + "&csube" + ] + ] + }, + { + "input": "⫑", + "description": "Named entity: csube; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad1" + ] + ] + }, + { + "input": "&csup", + "description": "Bad named entity: csup without a semi-colon", + "output": [ + [ + "Character", + "&csup" + ] + ] + }, + { + "input": "⫐", + "description": "Named entity: csup; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad0" + ] + ] + }, + { + "input": "&csupe", + "description": "Bad named entity: csupe without a semi-colon", + "output": [ + [ + "Character", + "&csupe" + ] + ] + }, + { + "input": "⫒", + "description": "Named entity: csupe; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad2" + ] + ] + }, + { + "input": "&ctdot", + "description": "Bad named entity: ctdot without a semi-colon", + "output": [ + [ + "Character", + "&ctdot" + ] + ] + }, + { + "input": "⋯", + "description": "Named entity: ctdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22ef" + ] + ] + }, + { + "input": "&cudarrl", + "description": "Bad named entity: cudarrl without a semi-colon", + "output": [ + [ + "Character", + "&cudarrl" + ] + ] + }, + { + "input": "⤸", + "description": "Named entity: cudarrl; with a semi-colon", + "output": [ + [ + "Character", + "\u2938" + ] + ] + }, + { + "input": "&cudarrr", + "description": "Bad named entity: cudarrr without a semi-colon", + "output": [ + [ + "Character", + "&cudarrr" + ] + ] + }, + { + "input": "⤵", + "description": "Named entity: cudarrr; with a semi-colon", + "output": [ + [ + "Character", + "\u2935" + ] + ] + }, + { + "input": "&cuepr", + "description": "Bad named entity: cuepr without a semi-colon", + "output": [ + [ + "Character", + "&cuepr" + ] + ] + }, + { + "input": "⋞", + "description": "Named entity: cuepr; with a semi-colon", + "output": [ + [ + "Character", + "\u22de" + ] + ] + }, + { + "input": "&cuesc", + "description": "Bad named entity: cuesc without a semi-colon", + "output": [ + [ + "Character", + "&cuesc" + ] + ] + }, + { + "input": "⋟", + "description": "Named entity: cuesc; with a semi-colon", + "output": [ + [ + "Character", + "\u22df" + ] + ] + }, + { + "input": "&cularr", + "description": "Bad named entity: cularr without a semi-colon", + "output": [ + [ + "Character", + "&cularr" + ] + ] + }, + { + "input": "↶", + "description": "Named entity: cularr; with a semi-colon", + "output": [ + [ + "Character", + "\u21b6" + ] + ] + }, + { + "input": "&cularrp", + "description": "Bad named entity: cularrp without a semi-colon", + "output": [ + [ + "Character", + "&cularrp" + ] + ] + }, + { + "input": "⤽", + "description": "Named entity: cularrp; with a semi-colon", + "output": [ + [ + "Character", + "\u293d" + ] + ] + }, + { + "input": "&cup", + "description": "Bad named entity: cup without a semi-colon", + "output": [ + [ + "Character", + "&cup" + ] + ] + }, + { + "input": "∪", + "description": "Named entity: cup; with a semi-colon", + "output": [ + [ + "Character", + "\u222a" + ] + ] + }, + { + "input": "&cupbrcap", + "description": "Bad named entity: cupbrcap without a semi-colon", + "output": [ + [ + "Character", + "&cupbrcap" + ] + ] + }, + { + "input": "⩈", + "description": "Named entity: cupbrcap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a48" + ] + ] + }, + { + "input": "&cupcap", + "description": "Bad named entity: cupcap without a semi-colon", + "output": [ + [ + "Character", + "&cupcap" + ] + ] + }, + { + "input": "⩆", + "description": "Named entity: cupcap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a46" + ] + ] + }, + { + "input": "&cupcup", + "description": "Bad named entity: cupcup without a semi-colon", + "output": [ + [ + "Character", + "&cupcup" + ] + ] + }, + { + "input": "⩊", + "description": "Named entity: cupcup; with a semi-colon", + "output": [ + [ + "Character", + "\u2a4a" + ] + ] + }, + { + "input": "&cupdot", + "description": "Bad named entity: cupdot without a semi-colon", + "output": [ + [ + "Character", + "&cupdot" + ] + ] + }, + { + "input": "⊍", + "description": "Named entity: cupdot; with a semi-colon", + "output": [ + [ + "Character", + "\u228d" + ] + ] + }, + { + "input": "&cupor", + "description": "Bad named entity: cupor without a semi-colon", + "output": [ + [ + "Character", + "&cupor" + ] + ] + }, + { + "input": "⩅", + "description": "Named entity: cupor; with a semi-colon", + "output": [ + [ + "Character", + "\u2a45" + ] + ] + }, + { + "input": "&cups", + "description": "Bad named entity: cups without a semi-colon", + "output": [ + [ + "Character", + "&cups" + ] + ] + }, + { + "input": "∪︀", + "description": "Named entity: cups; with a semi-colon", + "output": [ + [ + "Character", + "\u222a\ufe00" + ] + ] + }, + { + "input": "&curarr", + "description": "Bad named entity: curarr without a semi-colon", + "output": [ + [ + "Character", + "&curarr" + ] + ] + }, + { + "input": "↷", + "description": "Named entity: curarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21b7" + ] + ] + }, + { + "input": "&curarrm", + "description": "Bad named entity: curarrm without a semi-colon", + "output": [ + [ + "Character", + "&curarrm" + ] + ] + }, + { + "input": "⤼", + "description": "Named entity: curarrm; with a semi-colon", + "output": [ + [ + "Character", + "\u293c" + ] + ] + }, + { + "input": "&curlyeqprec", + "description": "Bad named entity: curlyeqprec without a semi-colon", + "output": [ + [ + "Character", + "&curlyeqprec" + ] + ] + }, + { + "input": "⋞", + "description": "Named entity: curlyeqprec; with a semi-colon", + "output": [ + [ + "Character", + "\u22de" + ] + ] + }, + { + "input": "&curlyeqsucc", + "description": "Bad named entity: curlyeqsucc without a semi-colon", + "output": [ + [ + "Character", + "&curlyeqsucc" + ] + ] + }, + { + "input": "⋟", + "description": "Named entity: curlyeqsucc; with a semi-colon", + "output": [ + [ + "Character", + "\u22df" + ] + ] + }, + { + "input": "&curlyvee", + "description": "Bad named entity: curlyvee without a semi-colon", + "output": [ + [ + "Character", + "&curlyvee" + ] + ] + }, + { + "input": "⋎", + "description": "Named entity: curlyvee; with a semi-colon", + "output": [ + [ + "Character", + "\u22ce" + ] + ] + }, + { + "input": "&curlywedge", + "description": "Bad named entity: curlywedge without a semi-colon", + "output": [ + [ + "Character", + "&curlywedge" + ] + ] + }, + { + "input": "⋏", + "description": "Named entity: curlywedge; with a semi-colon", + "output": [ + [ + "Character", + "\u22cf" + ] + ] + }, + { + "input": "¤", + "description": "Named entity: curren without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a4" + ] + ] + }, + { + "input": "¤", + "description": "Named entity: curren; with a semi-colon", + "output": [ + [ + "Character", + "\u00a4" + ] + ] + }, + { + "input": "&curvearrowleft", + "description": "Bad named entity: curvearrowleft without a semi-colon", + "output": [ + [ + "Character", + "&curvearrowleft" + ] + ] + }, + { + "input": "↶", + "description": "Named entity: curvearrowleft; with a semi-colon", + "output": [ + [ + "Character", + "\u21b6" + ] + ] + }, + { + "input": "&curvearrowright", + "description": "Bad named entity: curvearrowright without a semi-colon", + "output": [ + [ + "Character", + "&curvearrowright" + ] + ] + }, + { + "input": "↷", + "description": "Named entity: curvearrowright; with a semi-colon", + "output": [ + [ + "Character", + "\u21b7" + ] + ] + }, + { + "input": "&cuvee", + "description": "Bad named entity: cuvee without a semi-colon", + "output": [ + [ + "Character", + "&cuvee" + ] + ] + }, + { + "input": "⋎", + "description": "Named entity: cuvee; with a semi-colon", + "output": [ + [ + "Character", + "\u22ce" + ] + ] + }, + { + "input": "&cuwed", + "description": "Bad named entity: cuwed without a semi-colon", + "output": [ + [ + "Character", + "&cuwed" + ] + ] + }, + { + "input": "⋏", + "description": "Named entity: cuwed; with a semi-colon", + "output": [ + [ + "Character", + "\u22cf" + ] + ] + }, + { + "input": "&cwconint", + "description": "Bad named entity: cwconint without a semi-colon", + "output": [ + [ + "Character", + "&cwconint" + ] + ] + }, + { + "input": "∲", + "description": "Named entity: cwconint; with a semi-colon", + "output": [ + [ + "Character", + "\u2232" + ] + ] + }, + { + "input": "&cwint", + "description": "Bad named entity: cwint without a semi-colon", + "output": [ + [ + "Character", + "&cwint" + ] + ] + }, + { + "input": "∱", + "description": "Named entity: cwint; with a semi-colon", + "output": [ + [ + "Character", + "\u2231" + ] + ] + }, + { + "input": "&cylcty", + "description": "Bad named entity: cylcty without a semi-colon", + "output": [ + [ + "Character", + "&cylcty" + ] + ] + }, + { + "input": "⌭", + "description": "Named entity: cylcty; with a semi-colon", + "output": [ + [ + "Character", + "\u232d" + ] + ] + }, + { + "input": "&dArr", + "description": "Bad named entity: dArr without a semi-colon", + "output": [ + [ + "Character", + "&dArr" + ] + ] + }, + { + "input": "⇓", + "description": "Named entity: dArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d3" + ] + ] + }, + { + "input": "&dHar", + "description": "Bad named entity: dHar without a semi-colon", + "output": [ + [ + "Character", + "&dHar" + ] + ] + }, + { + "input": "⥥", + "description": "Named entity: dHar; with a semi-colon", + "output": [ + [ + "Character", + "\u2965" + ] + ] + }, + { + "input": "&dagger", + "description": "Bad named entity: dagger without a semi-colon", + "output": [ + [ + "Character", + "&dagger" + ] + ] + }, + { + "input": "†", + "description": "Named entity: dagger; with a semi-colon", + "output": [ + [ + "Character", + "\u2020" + ] + ] + }, + { + "input": "&daleth", + "description": "Bad named entity: daleth without a semi-colon", + "output": [ + [ + "Character", + "&daleth" + ] + ] + }, + { + "input": "ℸ", + "description": "Named entity: daleth; with a semi-colon", + "output": [ + [ + "Character", + "\u2138" + ] + ] + }, + { + "input": "&darr", + "description": "Bad named entity: darr without a semi-colon", + "output": [ + [ + "Character", + "&darr" + ] + ] + }, + { + "input": "↓", + "description": "Named entity: darr; with a semi-colon", + "output": [ + [ + "Character", + "\u2193" + ] + ] + }, + { + "input": "&dash", + "description": "Bad named entity: dash without a semi-colon", + "output": [ + [ + "Character", + "&dash" + ] + ] + }, + { + "input": "‐", + "description": "Named entity: dash; with a semi-colon", + "output": [ + [ + "Character", + "\u2010" + ] + ] + }, + { + "input": "&dashv", + "description": "Bad named entity: dashv without a semi-colon", + "output": [ + [ + "Character", + "&dashv" + ] + ] + }, + { + "input": "⊣", + "description": "Named entity: dashv; with a semi-colon", + "output": [ + [ + "Character", + "\u22a3" + ] + ] + }, + { + "input": "&dbkarow", + "description": "Bad named entity: dbkarow without a semi-colon", + "output": [ + [ + "Character", + "&dbkarow" + ] + ] + }, + { + "input": "⤏", + "description": "Named entity: dbkarow; with a semi-colon", + "output": [ + [ + "Character", + "\u290f" + ] + ] + }, + { + "input": "&dblac", + "description": "Bad named entity: dblac without a semi-colon", + "output": [ + [ + "Character", + "&dblac" + ] + ] + }, + { + "input": "˝", + "description": "Named entity: dblac; with a semi-colon", + "output": [ + [ + "Character", + "\u02dd" + ] + ] + }, + { + "input": "&dcaron", + "description": "Bad named entity: dcaron without a semi-colon", + "output": [ + [ + "Character", + "&dcaron" + ] + ] + }, + { + "input": "ď", + "description": "Named entity: dcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u010f" + ] + ] + }, + { + "input": "&dcy", + "description": "Bad named entity: dcy without a semi-colon", + "output": [ + [ + "Character", + "&dcy" + ] + ] + }, + { + "input": "д", + "description": "Named entity: dcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0434" + ] + ] + }, + { + "input": "&dd", + "description": "Bad named entity: dd without a semi-colon", + "output": [ + [ + "Character", + "&dd" + ] + ] + }, + { + "input": "ⅆ", + "description": "Named entity: dd; with a semi-colon", + "output": [ + [ + "Character", + "\u2146" + ] + ] + }, + { + "input": "&ddagger", + "description": "Bad named entity: ddagger without a semi-colon", + "output": [ + [ + "Character", + "&ddagger" + ] + ] + }, + { + "input": "‡", + "description": "Named entity: ddagger; with a semi-colon", + "output": [ + [ + "Character", + "\u2021" + ] + ] + }, + { + "input": "&ddarr", + "description": "Bad named entity: ddarr without a semi-colon", + "output": [ + [ + "Character", + "&ddarr" + ] + ] + }, + { + "input": "⇊", + "description": "Named entity: ddarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21ca" + ] + ] + }, + { + "input": "&ddotseq", + "description": "Bad named entity: ddotseq without a semi-colon", + "output": [ + [ + "Character", + "&ddotseq" + ] + ] + }, + { + "input": "⩷", + "description": "Named entity: ddotseq; with a semi-colon", + "output": [ + [ + "Character", + "\u2a77" + ] + ] + }, + { + "input": "°", + "description": "Named entity: deg without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b0" + ] + ] + }, + { + "input": "°", + "description": "Named entity: deg; with a semi-colon", + "output": [ + [ + "Character", + "\u00b0" + ] + ] + }, + { + "input": "&delta", + "description": "Bad named entity: delta without a semi-colon", + "output": [ + [ + "Character", + "&delta" + ] + ] + }, + { + "input": "δ", + "description": "Named entity: delta; with a semi-colon", + "output": [ + [ + "Character", + "\u03b4" + ] + ] + }, + { + "input": "&demptyv", + "description": "Bad named entity: demptyv without a semi-colon", + "output": [ + [ + "Character", + "&demptyv" + ] + ] + }, + { + "input": "⦱", + "description": "Named entity: demptyv; with a semi-colon", + "output": [ + [ + "Character", + "\u29b1" + ] + ] + }, + { + "input": "&dfisht", + "description": "Bad named entity: dfisht without a semi-colon", + "output": [ + [ + "Character", + "&dfisht" + ] + ] + }, + { + "input": "⥿", + "description": "Named entity: dfisht; with a semi-colon", + "output": [ + [ + "Character", + "\u297f" + ] + ] + }, + { + "input": "&dfr", + "description": "Bad named entity: dfr without a semi-colon", + "output": [ + [ + "Character", + "&dfr" + ] + ] + }, + { + "input": "𝔡", + "description": "Named entity: dfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd21" + ] + ] + }, + { + "input": "&dharl", + "description": "Bad named entity: dharl without a semi-colon", + "output": [ + [ + "Character", + "&dharl" + ] + ] + }, + { + "input": "⇃", + "description": "Named entity: dharl; with a semi-colon", + "output": [ + [ + "Character", + "\u21c3" + ] + ] + }, + { + "input": "&dharr", + "description": "Bad named entity: dharr without a semi-colon", + "output": [ + [ + "Character", + "&dharr" + ] + ] + }, + { + "input": "⇂", + "description": "Named entity: dharr; with a semi-colon", + "output": [ + [ + "Character", + "\u21c2" + ] + ] + }, + { + "input": "&diam", + "description": "Bad named entity: diam without a semi-colon", + "output": [ + [ + "Character", + "&diam" + ] + ] + }, + { + "input": "⋄", + "description": "Named entity: diam; with a semi-colon", + "output": [ + [ + "Character", + "\u22c4" + ] + ] + }, + { + "input": "&diamond", + "description": "Bad named entity: diamond without a semi-colon", + "output": [ + [ + "Character", + "&diamond" + ] + ] + }, + { + "input": "⋄", + "description": "Named entity: diamond; with a semi-colon", + "output": [ + [ + "Character", + "\u22c4" + ] + ] + }, + { + "input": "&diamondsuit", + "description": "Bad named entity: diamondsuit without a semi-colon", + "output": [ + [ + "Character", + "&diamondsuit" + ] + ] + }, + { + "input": "♦", + "description": "Named entity: diamondsuit; with a semi-colon", + "output": [ + [ + "Character", + "\u2666" + ] + ] + }, + { + "input": "&diams", + "description": "Bad named entity: diams without a semi-colon", + "output": [ + [ + "Character", + "&diams" + ] + ] + }, + { + "input": "♦", + "description": "Named entity: diams; with a semi-colon", + "output": [ + [ + "Character", + "\u2666" + ] + ] + }, + { + "input": "&die", + "description": "Bad named entity: die without a semi-colon", + "output": [ + [ + "Character", + "&die" + ] + ] + }, + { + "input": "¨", + "description": "Named entity: die; with a semi-colon", + "output": [ + [ + "Character", + "\u00a8" + ] + ] + }, + { + "input": "&digamma", + "description": "Bad named entity: digamma without a semi-colon", + "output": [ + [ + "Character", + "&digamma" + ] + ] + }, + { + "input": "ϝ", + "description": "Named entity: digamma; with a semi-colon", + "output": [ + [ + "Character", + "\u03dd" + ] + ] + }, + { + "input": "&disin", + "description": "Bad named entity: disin without a semi-colon", + "output": [ + [ + "Character", + "&disin" + ] + ] + }, + { + "input": "⋲", + "description": "Named entity: disin; with a semi-colon", + "output": [ + [ + "Character", + "\u22f2" + ] + ] + }, + { + "input": "&div", + "description": "Bad named entity: div without a semi-colon", + "output": [ + [ + "Character", + "&div" + ] + ] + }, + { + "input": "÷", + "description": "Named entity: div; with a semi-colon", + "output": [ + [ + "Character", + "\u00f7" + ] + ] + }, + { + "input": "÷", + "description": "Named entity: divide without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f7" + ] + ] + }, + { + "input": "÷", + "description": "Named entity: divide; with a semi-colon", + "output": [ + [ + "Character", + "\u00f7" + ] + ] + }, + { + "input": "⋇", + "description": "Named entity: divideontimes; with a semi-colon", + "output": [ + [ + "Character", + "\u22c7" + ] + ] + }, + { + "input": "&divonx", + "description": "Bad named entity: divonx without a semi-colon", + "output": [ + [ + "Character", + "&divonx" + ] + ] + }, + { + "input": "⋇", + "description": "Named entity: divonx; with a semi-colon", + "output": [ + [ + "Character", + "\u22c7" + ] + ] + }, + { + "input": "&djcy", + "description": "Bad named entity: djcy without a semi-colon", + "output": [ + [ + "Character", + "&djcy" + ] + ] + }, + { + "input": "ђ", + "description": "Named entity: djcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0452" + ] + ] + }, + { + "input": "&dlcorn", + "description": "Bad named entity: dlcorn without a semi-colon", + "output": [ + [ + "Character", + "&dlcorn" + ] + ] + }, + { + "input": "⌞", + "description": "Named entity: dlcorn; with a semi-colon", + "output": [ + [ + "Character", + "\u231e" + ] + ] + }, + { + "input": "&dlcrop", + "description": "Bad named entity: dlcrop without a semi-colon", + "output": [ + [ + "Character", + "&dlcrop" + ] + ] + }, + { + "input": "⌍", + "description": "Named entity: dlcrop; with a semi-colon", + "output": [ + [ + "Character", + "\u230d" + ] + ] + }, + { + "input": "&dollar", + "description": "Bad named entity: dollar without a semi-colon", + "output": [ + [ + "Character", + "&dollar" + ] + ] + }, + { + "input": "$", + "description": "Named entity: dollar; with a semi-colon", + "output": [ + [ + "Character", + "$" + ] + ] + }, + { + "input": "&dopf", + "description": "Bad named entity: dopf without a semi-colon", + "output": [ + [ + "Character", + "&dopf" + ] + ] + }, + { + "input": "𝕕", + "description": "Named entity: dopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd55" + ] + ] + }, + { + "input": "&dot", + "description": "Bad named entity: dot without a semi-colon", + "output": [ + [ + "Character", + "&dot" + ] + ] + }, + { + "input": "˙", + "description": "Named entity: dot; with a semi-colon", + "output": [ + [ + "Character", + "\u02d9" + ] + ] + }, + { + "input": "&doteq", + "description": "Bad named entity: doteq without a semi-colon", + "output": [ + [ + "Character", + "&doteq" + ] + ] + }, + { + "input": "≐", + "description": "Named entity: doteq; with a semi-colon", + "output": [ + [ + "Character", + "\u2250" + ] + ] + }, + { + "input": "&doteqdot", + "description": "Bad named entity: doteqdot without a semi-colon", + "output": [ + [ + "Character", + "&doteqdot" + ] + ] + }, + { + "input": "≑", + "description": "Named entity: doteqdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2251" + ] + ] + }, + { + "input": "&dotminus", + "description": "Bad named entity: dotminus without a semi-colon", + "output": [ + [ + "Character", + "&dotminus" + ] + ] + }, + { + "input": "∸", + "description": "Named entity: dotminus; with a semi-colon", + "output": [ + [ + "Character", + "\u2238" + ] + ] + }, + { + "input": "&dotplus", + "description": "Bad named entity: dotplus without a semi-colon", + "output": [ + [ + "Character", + "&dotplus" + ] + ] + }, + { + "input": "∔", + "description": "Named entity: dotplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2214" + ] + ] + }, + { + "input": "&dotsquare", + "description": "Bad named entity: dotsquare without a semi-colon", + "output": [ + [ + "Character", + "&dotsquare" + ] + ] + }, + { + "input": "⊡", + "description": "Named entity: dotsquare; with a semi-colon", + "output": [ + [ + "Character", + "\u22a1" + ] + ] + }, + { + "input": "&doublebarwedge", + "description": "Bad named entity: doublebarwedge without a semi-colon", + "output": [ + [ + "Character", + "&doublebarwedge" + ] + ] + }, + { + "input": "⌆", + "description": "Named entity: doublebarwedge; with a semi-colon", + "output": [ + [ + "Character", + "\u2306" + ] + ] + }, + { + "input": "&downarrow", + "description": "Bad named entity: downarrow without a semi-colon", + "output": [ + [ + "Character", + "&downarrow" + ] + ] + }, + { + "input": "↓", + "description": "Named entity: downarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2193" + ] + ] + }, + { + "input": "&downdownarrows", + "description": "Bad named entity: downdownarrows without a semi-colon", + "output": [ + [ + "Character", + "&downdownarrows" + ] + ] + }, + { + "input": "⇊", + "description": "Named entity: downdownarrows; with a semi-colon", + "output": [ + [ + "Character", + "\u21ca" + ] + ] + }, + { + "input": "&downharpoonleft", + "description": "Bad named entity: downharpoonleft without a semi-colon", + "output": [ + [ + "Character", + "&downharpoonleft" + ] + ] + }, + { + "input": "⇃", + "description": "Named entity: downharpoonleft; with a semi-colon", + "output": [ + [ + "Character", + "\u21c3" + ] + ] + }, + { + "input": "&downharpoonright", + "description": "Bad named entity: downharpoonright without a semi-colon", + "output": [ + [ + "Character", + "&downharpoonright" + ] + ] + }, + { + "input": "⇂", + "description": "Named entity: downharpoonright; with a semi-colon", + "output": [ + [ + "Character", + "\u21c2" + ] + ] + }, + { + "input": "&drbkarow", + "description": "Bad named entity: drbkarow without a semi-colon", + "output": [ + [ + "Character", + "&drbkarow" + ] + ] + }, + { + "input": "⤐", + "description": "Named entity: drbkarow; with a semi-colon", + "output": [ + [ + "Character", + "\u2910" + ] + ] + }, + { + "input": "&drcorn", + "description": "Bad named entity: drcorn without a semi-colon", + "output": [ + [ + "Character", + "&drcorn" + ] + ] + }, + { + "input": "⌟", + "description": "Named entity: drcorn; with a semi-colon", + "output": [ + [ + "Character", + "\u231f" + ] + ] + }, + { + "input": "&drcrop", + "description": "Bad named entity: drcrop without a semi-colon", + "output": [ + [ + "Character", + "&drcrop" + ] + ] + }, + { + "input": "⌌", + "description": "Named entity: drcrop; with a semi-colon", + "output": [ + [ + "Character", + "\u230c" + ] + ] + }, + { + "input": "&dscr", + "description": "Bad named entity: dscr without a semi-colon", + "output": [ + [ + "Character", + "&dscr" + ] + ] + }, + { + "input": "𝒹", + "description": "Named entity: dscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcb9" + ] + ] + }, + { + "input": "&dscy", + "description": "Bad named entity: dscy without a semi-colon", + "output": [ + [ + "Character", + "&dscy" + ] + ] + }, + { + "input": "ѕ", + "description": "Named entity: dscy; with a semi-colon", + "output": [ + [ + "Character", + "\u0455" + ] + ] + }, + { + "input": "&dsol", + "description": "Bad named entity: dsol without a semi-colon", + "output": [ + [ + "Character", + "&dsol" + ] + ] + }, + { + "input": "⧶", + "description": "Named entity: dsol; with a semi-colon", + "output": [ + [ + "Character", + "\u29f6" + ] + ] + }, + { + "input": "&dstrok", + "description": "Bad named entity: dstrok without a semi-colon", + "output": [ + [ + "Character", + "&dstrok" + ] + ] + }, + { + "input": "đ", + "description": "Named entity: dstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0111" + ] + ] + }, + { + "input": "&dtdot", + "description": "Bad named entity: dtdot without a semi-colon", + "output": [ + [ + "Character", + "&dtdot" + ] + ] + }, + { + "input": "⋱", + "description": "Named entity: dtdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22f1" + ] + ] + }, + { + "input": "&dtri", + "description": "Bad named entity: dtri without a semi-colon", + "output": [ + [ + "Character", + "&dtri" + ] + ] + }, + { + "input": "▿", + "description": "Named entity: dtri; with a semi-colon", + "output": [ + [ + "Character", + "\u25bf" + ] + ] + }, + { + "input": "&dtrif", + "description": "Bad named entity: dtrif without a semi-colon", + "output": [ + [ + "Character", + "&dtrif" + ] + ] + }, + { + "input": "▾", + "description": "Named entity: dtrif; with a semi-colon", + "output": [ + [ + "Character", + "\u25be" + ] + ] + }, + { + "input": "&duarr", + "description": "Bad named entity: duarr without a semi-colon", + "output": [ + [ + "Character", + "&duarr" + ] + ] + }, + { + "input": "⇵", + "description": "Named entity: duarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21f5" + ] + ] + }, + { + "input": "&duhar", + "description": "Bad named entity: duhar without a semi-colon", + "output": [ + [ + "Character", + "&duhar" + ] + ] + }, + { + "input": "⥯", + "description": "Named entity: duhar; with a semi-colon", + "output": [ + [ + "Character", + "\u296f" + ] + ] + }, + { + "input": "&dwangle", + "description": "Bad named entity: dwangle without a semi-colon", + "output": [ + [ + "Character", + "&dwangle" + ] + ] + }, + { + "input": "⦦", + "description": "Named entity: dwangle; with a semi-colon", + "output": [ + [ + "Character", + "\u29a6" + ] + ] + }, + { + "input": "&dzcy", + "description": "Bad named entity: dzcy without a semi-colon", + "output": [ + [ + "Character", + "&dzcy" + ] + ] + }, + { + "input": "џ", + "description": "Named entity: dzcy; with a semi-colon", + "output": [ + [ + "Character", + "\u045f" + ] + ] + }, + { + "input": "&dzigrarr", + "description": "Bad named entity: dzigrarr without a semi-colon", + "output": [ + [ + "Character", + "&dzigrarr" + ] + ] + }, + { + "input": "⟿", + "description": "Named entity: dzigrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u27ff" + ] + ] + }, + { + "input": "&eDDot", + "description": "Bad named entity: eDDot without a semi-colon", + "output": [ + [ + "Character", + "&eDDot" + ] + ] + }, + { + "input": "⩷", + "description": "Named entity: eDDot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a77" + ] + ] + }, + { + "input": "&eDot", + "description": "Bad named entity: eDot without a semi-colon", + "output": [ + [ + "Character", + "&eDot" + ] + ] + }, + { + "input": "≑", + "description": "Named entity: eDot; with a semi-colon", + "output": [ + [ + "Character", + "\u2251" + ] + ] + }, + { + "input": "é", + "description": "Named entity: eacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e9" + ] + ] + }, + { + "input": "é", + "description": "Named entity: eacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00e9" + ] + ] + }, + { + "input": "&easter", + "description": "Bad named entity: easter without a semi-colon", + "output": [ + [ + "Character", + "&easter" + ] + ] + }, + { + "input": "⩮", + "description": "Named entity: easter; with a semi-colon", + "output": [ + [ + "Character", + "\u2a6e" + ] + ] + }, + { + "input": "&ecaron", + "description": "Bad named entity: ecaron without a semi-colon", + "output": [ + [ + "Character", + "&ecaron" + ] + ] + }, + { + "input": "ě", + "description": "Named entity: ecaron; with a semi-colon", + "output": [ + [ + "Character", + "\u011b" + ] + ] + }, + { + "input": "&ecir", + "description": "Bad named entity: ecir without a semi-colon", + "output": [ + [ + "Character", + "&ecir" + ] + ] + }, + { + "input": "≖", + "description": "Named entity: ecir; with a semi-colon", + "output": [ + [ + "Character", + "\u2256" + ] + ] + }, + { + "input": "ê", + "description": "Named entity: ecirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ea" + ] + ] + }, + { + "input": "ê", + "description": "Named entity: ecirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00ea" + ] + ] + }, + { + "input": "&ecolon", + "description": "Bad named entity: ecolon without a semi-colon", + "output": [ + [ + "Character", + "&ecolon" + ] + ] + }, + { + "input": "≕", + "description": "Named entity: ecolon; with a semi-colon", + "output": [ + [ + "Character", + "\u2255" + ] + ] + }, + { + "input": "&ecy", + "description": "Bad named entity: ecy without a semi-colon", + "output": [ + [ + "Character", + "&ecy" + ] + ] + }, + { + "input": "э", + "description": "Named entity: ecy; with a semi-colon", + "output": [ + [ + "Character", + "\u044d" + ] + ] + }, + { + "input": "&edot", + "description": "Bad named entity: edot without a semi-colon", + "output": [ + [ + "Character", + "&edot" + ] + ] + }, + { + "input": "ė", + "description": "Named entity: edot; with a semi-colon", + "output": [ + [ + "Character", + "\u0117" + ] + ] + }, + { + "input": "&ee", + "description": "Bad named entity: ee without a semi-colon", + "output": [ + [ + "Character", + "&ee" + ] + ] + }, + { + "input": "ⅇ", + "description": "Named entity: ee; with a semi-colon", + "output": [ + [ + "Character", + "\u2147" + ] + ] + }, + { + "input": "&efDot", + "description": "Bad named entity: efDot without a semi-colon", + "output": [ + [ + "Character", + "&efDot" + ] + ] + }, + { + "input": "≒", + "description": "Named entity: efDot; with a semi-colon", + "output": [ + [ + "Character", + "\u2252" + ] + ] + }, + { + "input": "&efr", + "description": "Bad named entity: efr without a semi-colon", + "output": [ + [ + "Character", + "&efr" + ] + ] + }, + { + "input": "𝔢", + "description": "Named entity: efr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd22" + ] + ] + }, + { + "input": "&eg", + "description": "Bad named entity: eg without a semi-colon", + "output": [ + [ + "Character", + "&eg" + ] + ] + }, + { + "input": "⪚", + "description": "Named entity: eg; with a semi-colon", + "output": [ + [ + "Character", + "\u2a9a" + ] + ] + }, + { + "input": "è", + "description": "Named entity: egrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00e8" + ] + ] + }, + { + "input": "è", + "description": "Named entity: egrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00e8" + ] + ] + }, + { + "input": "&egs", + "description": "Bad named entity: egs without a semi-colon", + "output": [ + [ + "Character", + "&egs" + ] + ] + }, + { + "input": "⪖", + "description": "Named entity: egs; with a semi-colon", + "output": [ + [ + "Character", + "\u2a96" + ] + ] + }, + { + "input": "&egsdot", + "description": "Bad named entity: egsdot without a semi-colon", + "output": [ + [ + "Character", + "&egsdot" + ] + ] + }, + { + "input": "⪘", + "description": "Named entity: egsdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a98" + ] + ] + }, + { + "input": "&el", + "description": "Bad named entity: el without a semi-colon", + "output": [ + [ + "Character", + "&el" + ] + ] + }, + { + "input": "⪙", + "description": "Named entity: el; with a semi-colon", + "output": [ + [ + "Character", + "\u2a99" + ] + ] + }, + { + "input": "&elinters", + "description": "Bad named entity: elinters without a semi-colon", + "output": [ + [ + "Character", + "&elinters" + ] + ] + }, + { + "input": "⏧", + "description": "Named entity: elinters; with a semi-colon", + "output": [ + [ + "Character", + "\u23e7" + ] + ] + }, + { + "input": "&ell", + "description": "Bad named entity: ell without a semi-colon", + "output": [ + [ + "Character", + "&ell" + ] + ] + }, + { + "input": "ℓ", + "description": "Named entity: ell; with a semi-colon", + "output": [ + [ + "Character", + "\u2113" + ] + ] + }, + { + "input": "&els", + "description": "Bad named entity: els without a semi-colon", + "output": [ + [ + "Character", + "&els" + ] + ] + }, + { + "input": "⪕", + "description": "Named entity: els; with a semi-colon", + "output": [ + [ + "Character", + "\u2a95" + ] + ] + }, + { + "input": "&elsdot", + "description": "Bad named entity: elsdot without a semi-colon", + "output": [ + [ + "Character", + "&elsdot" + ] + ] + }, + { + "input": "⪗", + "description": "Named entity: elsdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a97" + ] + ] + }, + { + "input": "&emacr", + "description": "Bad named entity: emacr without a semi-colon", + "output": [ + [ + "Character", + "&emacr" + ] + ] + }, + { + "input": "ē", + "description": "Named entity: emacr; with a semi-colon", + "output": [ + [ + "Character", + "\u0113" + ] + ] + }, + { + "input": "&empty", + "description": "Bad named entity: empty without a semi-colon", + "output": [ + [ + "Character", + "&empty" + ] + ] + }, + { + "input": "∅", + "description": "Named entity: empty; with a semi-colon", + "output": [ + [ + "Character", + "\u2205" + ] + ] + }, + { + "input": "&emptyset", + "description": "Bad named entity: emptyset without a semi-colon", + "output": [ + [ + "Character", + "&emptyset" + ] + ] + }, + { + "input": "∅", + "description": "Named entity: emptyset; with a semi-colon", + "output": [ + [ + "Character", + "\u2205" + ] + ] + }, + { + "input": "&emptyv", + "description": "Bad named entity: emptyv without a semi-colon", + "output": [ + [ + "Character", + "&emptyv" + ] + ] + }, + { + "input": "∅", + "description": "Named entity: emptyv; with a semi-colon", + "output": [ + [ + "Character", + "\u2205" + ] + ] + }, + { + "input": "&emsp", + "description": "Bad named entity: emsp without a semi-colon", + "output": [ + [ + "Character", + "&emsp" + ] + ] + }, + { + "input": "&emsp13", + "description": "Bad named entity: emsp13 without a semi-colon", + "output": [ + [ + "Character", + "&emsp13" + ] + ] + }, + { + "input": " ", + "description": "Named entity: emsp13; with a semi-colon", + "output": [ + [ + "Character", + "\u2004" + ] + ] + }, + { + "input": "&emsp14", + "description": "Bad named entity: emsp14 without a semi-colon", + "output": [ + [ + "Character", + "&emsp14" + ] + ] + }, + { + "input": " ", + "description": "Named entity: emsp14; with a semi-colon", + "output": [ + [ + "Character", + "\u2005" + ] + ] + }, + { + "input": " ", + "description": "Named entity: emsp; with a semi-colon", + "output": [ + [ + "Character", + "\u2003" + ] + ] + }, + { + "input": "&eng", + "description": "Bad named entity: eng without a semi-colon", + "output": [ + [ + "Character", + "&eng" + ] + ] + }, + { + "input": "ŋ", + "description": "Named entity: eng; with a semi-colon", + "output": [ + [ + "Character", + "\u014b" + ] + ] + }, + { + "input": "&ensp", + "description": "Bad named entity: ensp without a semi-colon", + "output": [ + [ + "Character", + "&ensp" + ] + ] + }, + { + "input": " ", + "description": "Named entity: ensp; with a semi-colon", + "output": [ + [ + "Character", + "\u2002" + ] + ] + }, + { + "input": "&eogon", + "description": "Bad named entity: eogon without a semi-colon", + "output": [ + [ + "Character", + "&eogon" + ] + ] + }, + { + "input": "ę", + "description": "Named entity: eogon; with a semi-colon", + "output": [ + [ + "Character", + "\u0119" + ] + ] + }, + { + "input": "&eopf", + "description": "Bad named entity: eopf without a semi-colon", + "output": [ + [ + "Character", + "&eopf" + ] + ] + }, + { + "input": "𝕖", + "description": "Named entity: eopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd56" + ] + ] + }, + { + "input": "&epar", + "description": "Bad named entity: epar without a semi-colon", + "output": [ + [ + "Character", + "&epar" + ] + ] + }, + { + "input": "⋕", + "description": "Named entity: epar; with a semi-colon", + "output": [ + [ + "Character", + "\u22d5" + ] + ] + }, + { + "input": "&eparsl", + "description": "Bad named entity: eparsl without a semi-colon", + "output": [ + [ + "Character", + "&eparsl" + ] + ] + }, + { + "input": "⧣", + "description": "Named entity: eparsl; with a semi-colon", + "output": [ + [ + "Character", + "\u29e3" + ] + ] + }, + { + "input": "&eplus", + "description": "Bad named entity: eplus without a semi-colon", + "output": [ + [ + "Character", + "&eplus" + ] + ] + }, + { + "input": "⩱", + "description": "Named entity: eplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a71" + ] + ] + }, + { + "input": "&epsi", + "description": "Bad named entity: epsi without a semi-colon", + "output": [ + [ + "Character", + "&epsi" + ] + ] + }, + { + "input": "ε", + "description": "Named entity: epsi; with a semi-colon", + "output": [ + [ + "Character", + "\u03b5" + ] + ] + }, + { + "input": "&epsilon", + "description": "Bad named entity: epsilon without a semi-colon", + "output": [ + [ + "Character", + "&epsilon" + ] + ] + }, + { + "input": "ε", + "description": "Named entity: epsilon; with a semi-colon", + "output": [ + [ + "Character", + "\u03b5" + ] + ] + }, + { + "input": "&epsiv", + "description": "Bad named entity: epsiv without a semi-colon", + "output": [ + [ + "Character", + "&epsiv" + ] + ] + }, + { + "input": "ϵ", + "description": "Named entity: epsiv; with a semi-colon", + "output": [ + [ + "Character", + "\u03f5" + ] + ] + }, + { + "input": "&eqcirc", + "description": "Bad named entity: eqcirc without a semi-colon", + "output": [ + [ + "Character", + "&eqcirc" + ] + ] + }, + { + "input": "≖", + "description": "Named entity: eqcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u2256" + ] + ] + }, + { + "input": "&eqcolon", + "description": "Bad named entity: eqcolon without a semi-colon", + "output": [ + [ + "Character", + "&eqcolon" + ] + ] + }, + { + "input": "≕", + "description": "Named entity: eqcolon; with a semi-colon", + "output": [ + [ + "Character", + "\u2255" + ] + ] + }, + { + "input": "&eqsim", + "description": "Bad named entity: eqsim without a semi-colon", + "output": [ + [ + "Character", + "&eqsim" + ] + ] + }, + { + "input": "≂", + "description": "Named entity: eqsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2242" + ] + ] + }, + { + "input": "&eqslantgtr", + "description": "Bad named entity: eqslantgtr without a semi-colon", + "output": [ + [ + "Character", + "&eqslantgtr" + ] + ] + }, + { + "input": "⪖", + "description": "Named entity: eqslantgtr; with a semi-colon", + "output": [ + [ + "Character", + "\u2a96" + ] + ] + }, + { + "input": "&eqslantless", + "description": "Bad named entity: eqslantless without a semi-colon", + "output": [ + [ + "Character", + "&eqslantless" + ] + ] + }, + { + "input": "⪕", + "description": "Named entity: eqslantless; with a semi-colon", + "output": [ + [ + "Character", + "\u2a95" + ] + ] + }, + { + "input": "&equals", + "description": "Bad named entity: equals without a semi-colon", + "output": [ + [ + "Character", + "&equals" + ] + ] + }, + { + "input": "=", + "description": "Named entity: equals; with a semi-colon", + "output": [ + [ + "Character", + "=" + ] + ] + }, + { + "input": "&equest", + "description": "Bad named entity: equest without a semi-colon", + "output": [ + [ + "Character", + "&equest" + ] + ] + }, + { + "input": "≟", + "description": "Named entity: equest; with a semi-colon", + "output": [ + [ + "Character", + "\u225f" + ] + ] + }, + { + "input": "&equiv", + "description": "Bad named entity: equiv without a semi-colon", + "output": [ + [ + "Character", + "&equiv" + ] + ] + }, + { + "input": "≡", + "description": "Named entity: equiv; with a semi-colon", + "output": [ + [ + "Character", + "\u2261" + ] + ] + }, + { + "input": "&equivDD", + "description": "Bad named entity: equivDD without a semi-colon", + "output": [ + [ + "Character", + "&equivDD" + ] + ] + }, + { + "input": "⩸", + "description": "Named entity: equivDD; with a semi-colon", + "output": [ + [ + "Character", + "\u2a78" + ] + ] + }, + { + "input": "&eqvparsl", + "description": "Bad named entity: eqvparsl without a semi-colon", + "output": [ + [ + "Character", + "&eqvparsl" + ] + ] + }, + { + "input": "⧥", + "description": "Named entity: eqvparsl; with a semi-colon", + "output": [ + [ + "Character", + "\u29e5" + ] + ] + }, + { + "input": "&erDot", + "description": "Bad named entity: erDot without a semi-colon", + "output": [ + [ + "Character", + "&erDot" + ] + ] + }, + { + "input": "≓", + "description": "Named entity: erDot; with a semi-colon", + "output": [ + [ + "Character", + "\u2253" + ] + ] + }, + { + "input": "&erarr", + "description": "Bad named entity: erarr without a semi-colon", + "output": [ + [ + "Character", + "&erarr" + ] + ] + }, + { + "input": "⥱", + "description": "Named entity: erarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2971" + ] + ] + }, + { + "input": "&escr", + "description": "Bad named entity: escr without a semi-colon", + "output": [ + [ + "Character", + "&escr" + ] + ] + }, + { + "input": "ℯ", + "description": "Named entity: escr; with a semi-colon", + "output": [ + [ + "Character", + "\u212f" + ] + ] + }, + { + "input": "&esdot", + "description": "Bad named entity: esdot without a semi-colon", + "output": [ + [ + "Character", + "&esdot" + ] + ] + }, + { + "input": "≐", + "description": "Named entity: esdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2250" + ] + ] + }, + { + "input": "&esim", + "description": "Bad named entity: esim without a semi-colon", + "output": [ + [ + "Character", + "&esim" + ] + ] + }, + { + "input": "≂", + "description": "Named entity: esim; with a semi-colon", + "output": [ + [ + "Character", + "\u2242" + ] + ] + }, + { + "input": "&eta", + "description": "Bad named entity: eta without a semi-colon", + "output": [ + [ + "Character", + "&eta" + ] + ] + }, + { + "input": "η", + "description": "Named entity: eta; with a semi-colon", + "output": [ + [ + "Character", + "\u03b7" + ] + ] + }, + { + "input": "ð", + "description": "Named entity: eth without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f0" + ] + ] + }, + { + "input": "ð", + "description": "Named entity: eth; with a semi-colon", + "output": [ + [ + "Character", + "\u00f0" + ] + ] + }, + { + "input": "ë", + "description": "Named entity: euml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00eb" + ] + ] + }, + { + "input": "ë", + "description": "Named entity: euml; with a semi-colon", + "output": [ + [ + "Character", + "\u00eb" + ] + ] + }, + { + "input": "&euro", + "description": "Bad named entity: euro without a semi-colon", + "output": [ + [ + "Character", + "&euro" + ] + ] + }, + { + "input": "€", + "description": "Named entity: euro; with a semi-colon", + "output": [ + [ + "Character", + "\u20ac" + ] + ] + }, + { + "input": "&excl", + "description": "Bad named entity: excl without a semi-colon", + "output": [ + [ + "Character", + "&excl" + ] + ] + }, + { + "input": "!", + "description": "Named entity: excl; with a semi-colon", + "output": [ + [ + "Character", + "!" + ] + ] + }, + { + "input": "&exist", + "description": "Bad named entity: exist without a semi-colon", + "output": [ + [ + "Character", + "&exist" + ] + ] + }, + { + "input": "∃", + "description": "Named entity: exist; with a semi-colon", + "output": [ + [ + "Character", + "\u2203" + ] + ] + }, + { + "input": "&expectation", + "description": "Bad named entity: expectation without a semi-colon", + "output": [ + [ + "Character", + "&expectation" + ] + ] + }, + { + "input": "ℰ", + "description": "Named entity: expectation; with a semi-colon", + "output": [ + [ + "Character", + "\u2130" + ] + ] + }, + { + "input": "&exponentiale", + "description": "Bad named entity: exponentiale without a semi-colon", + "output": [ + [ + "Character", + "&exponentiale" + ] + ] + }, + { + "input": "ⅇ", + "description": "Named entity: exponentiale; with a semi-colon", + "output": [ + [ + "Character", + "\u2147" + ] + ] + }, + { + "input": "&fallingdotseq", + "description": "Bad named entity: fallingdotseq without a semi-colon", + "output": [ + [ + "Character", + "&fallingdotseq" + ] + ] + }, + { + "input": "≒", + "description": "Named entity: fallingdotseq; with a semi-colon", + "output": [ + [ + "Character", + "\u2252" + ] + ] + }, + { + "input": "&fcy", + "description": "Bad named entity: fcy without a semi-colon", + "output": [ + [ + "Character", + "&fcy" + ] + ] + }, + { + "input": "ф", + "description": "Named entity: fcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0444" + ] + ] + }, + { + "input": "&female", + "description": "Bad named entity: female without a semi-colon", + "output": [ + [ + "Character", + "&female" + ] + ] + }, + { + "input": "♀", + "description": "Named entity: female; with a semi-colon", + "output": [ + [ + "Character", + "\u2640" + ] + ] + }, + { + "input": "&ffilig", + "description": "Bad named entity: ffilig without a semi-colon", + "output": [ + [ + "Character", + "&ffilig" + ] + ] + }, + { + "input": "ffi", + "description": "Named entity: ffilig; with a semi-colon", + "output": [ + [ + "Character", + "\ufb03" + ] + ] + }, + { + "input": "&fflig", + "description": "Bad named entity: fflig without a semi-colon", + "output": [ + [ + "Character", + "&fflig" + ] + ] + }, + { + "input": "ff", + "description": "Named entity: fflig; with a semi-colon", + "output": [ + [ + "Character", + "\ufb00" + ] + ] + }, + { + "input": "&ffllig", + "description": "Bad named entity: ffllig without a semi-colon", + "output": [ + [ + "Character", + "&ffllig" + ] + ] + }, + { + "input": "ffl", + "description": "Named entity: ffllig; with a semi-colon", + "output": [ + [ + "Character", + "\ufb04" + ] + ] + }, + { + "input": "&ffr", + "description": "Bad named entity: ffr without a semi-colon", + "output": [ + [ + "Character", + "&ffr" + ] + ] + }, + { + "input": "𝔣", + "description": "Named entity: ffr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd23" + ] + ] + }, + { + "input": "&filig", + "description": "Bad named entity: filig without a semi-colon", + "output": [ + [ + "Character", + "&filig" + ] + ] + }, + { + "input": "fi", + "description": "Named entity: filig; with a semi-colon", + "output": [ + [ + "Character", + "\ufb01" + ] + ] + }, + { + "input": "&fjlig", + "description": "Bad named entity: fjlig without a semi-colon", + "output": [ + [ + "Character", + "&fjlig" + ] + ] + }, + { + "input": "fj", + "description": "Named entity: fjlig; with a semi-colon", + "output": [ + [ + "Character", + "fj" + ] + ] + }, + { + "input": "&flat", + "description": "Bad named entity: flat without a semi-colon", + "output": [ + [ + "Character", + "&flat" + ] + ] + }, + { + "input": "♭", + "description": "Named entity: flat; with a semi-colon", + "output": [ + [ + "Character", + "\u266d" + ] + ] + }, + { + "input": "&fllig", + "description": "Bad named entity: fllig without a semi-colon", + "output": [ + [ + "Character", + "&fllig" + ] + ] + }, + { + "input": "fl", + "description": "Named entity: fllig; with a semi-colon", + "output": [ + [ + "Character", + "\ufb02" + ] + ] + }, + { + "input": "&fltns", + "description": "Bad named entity: fltns without a semi-colon", + "output": [ + [ + "Character", + "&fltns" + ] + ] + }, + { + "input": "▱", + "description": "Named entity: fltns; with a semi-colon", + "output": [ + [ + "Character", + "\u25b1" + ] + ] + }, + { + "input": "&fnof", + "description": "Bad named entity: fnof without a semi-colon", + "output": [ + [ + "Character", + "&fnof" + ] + ] + }, + { + "input": "ƒ", + "description": "Named entity: fnof; with a semi-colon", + "output": [ + [ + "Character", + "\u0192" + ] + ] + }, + { + "input": "&fopf", + "description": "Bad named entity: fopf without a semi-colon", + "output": [ + [ + "Character", + "&fopf" + ] + ] + }, + { + "input": "𝕗", + "description": "Named entity: fopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd57" + ] + ] + }, + { + "input": "&forall", + "description": "Bad named entity: forall without a semi-colon", + "output": [ + [ + "Character", + "&forall" + ] + ] + }, + { + "input": "∀", + "description": "Named entity: forall; with a semi-colon", + "output": [ + [ + "Character", + "\u2200" + ] + ] + }, + { + "input": "&fork", + "description": "Bad named entity: fork without a semi-colon", + "output": [ + [ + "Character", + "&fork" + ] + ] + }, + { + "input": "⋔", + "description": "Named entity: fork; with a semi-colon", + "output": [ + [ + "Character", + "\u22d4" + ] + ] + }, + { + "input": "&forkv", + "description": "Bad named entity: forkv without a semi-colon", + "output": [ + [ + "Character", + "&forkv" + ] + ] + }, + { + "input": "⫙", + "description": "Named entity: forkv; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad9" + ] + ] + }, + { + "input": "&fpartint", + "description": "Bad named entity: fpartint without a semi-colon", + "output": [ + [ + "Character", + "&fpartint" + ] + ] + }, + { + "input": "⨍", + "description": "Named entity: fpartint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a0d" + ] + ] + }, + { + "input": "½", + "description": "Named entity: frac12 without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00bd" + ] + ] + }, + { + "input": "½", + "description": "Named entity: frac12; with a semi-colon", + "output": [ + [ + "Character", + "\u00bd" + ] + ] + }, + { + "input": "&frac13", + "description": "Bad named entity: frac13 without a semi-colon", + "output": [ + [ + "Character", + "&frac13" + ] + ] + }, + { + "input": "⅓", + "description": "Named entity: frac13; with a semi-colon", + "output": [ + [ + "Character", + "\u2153" + ] + ] + }, + { + "input": "¼", + "description": "Named entity: frac14 without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00bc" + ] + ] + }, + { + "input": "¼", + "description": "Named entity: frac14; with a semi-colon", + "output": [ + [ + "Character", + "\u00bc" + ] + ] + }, + { + "input": "&frac15", + "description": "Bad named entity: frac15 without a semi-colon", + "output": [ + [ + "Character", + "&frac15" + ] + ] + }, + { + "input": "⅕", + "description": "Named entity: frac15; with a semi-colon", + "output": [ + [ + "Character", + "\u2155" + ] + ] + }, + { + "input": "&frac16", + "description": "Bad named entity: frac16 without a semi-colon", + "output": [ + [ + "Character", + "&frac16" + ] + ] + }, + { + "input": "⅙", + "description": "Named entity: frac16; with a semi-colon", + "output": [ + [ + "Character", + "\u2159" + ] + ] + }, + { + "input": "&frac18", + "description": "Bad named entity: frac18 without a semi-colon", + "output": [ + [ + "Character", + "&frac18" + ] + ] + }, + { + "input": "⅛", + "description": "Named entity: frac18; with a semi-colon", + "output": [ + [ + "Character", + "\u215b" + ] + ] + }, + { + "input": "&frac23", + "description": "Bad named entity: frac23 without a semi-colon", + "output": [ + [ + "Character", + "&frac23" + ] + ] + }, + { + "input": "⅔", + "description": "Named entity: frac23; with a semi-colon", + "output": [ + [ + "Character", + "\u2154" + ] + ] + }, + { + "input": "&frac25", + "description": "Bad named entity: frac25 without a semi-colon", + "output": [ + [ + "Character", + "&frac25" + ] + ] + }, + { + "input": "⅖", + "description": "Named entity: frac25; with a semi-colon", + "output": [ + [ + "Character", + "\u2156" + ] + ] + }, + { + "input": "¾", + "description": "Named entity: frac34 without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00be" + ] + ] + }, + { + "input": "¾", + "description": "Named entity: frac34; with a semi-colon", + "output": [ + [ + "Character", + "\u00be" + ] + ] + }, + { + "input": "&frac35", + "description": "Bad named entity: frac35 without a semi-colon", + "output": [ + [ + "Character", + "&frac35" + ] + ] + }, + { + "input": "⅗", + "description": "Named entity: frac35; with a semi-colon", + "output": [ + [ + "Character", + "\u2157" + ] + ] + }, + { + "input": "&frac38", + "description": "Bad named entity: frac38 without a semi-colon", + "output": [ + [ + "Character", + "&frac38" + ] + ] + }, + { + "input": "⅜", + "description": "Named entity: frac38; with a semi-colon", + "output": [ + [ + "Character", + "\u215c" + ] + ] + }, + { + "input": "&frac45", + "description": "Bad named entity: frac45 without a semi-colon", + "output": [ + [ + "Character", + "&frac45" + ] + ] + }, + { + "input": "⅘", + "description": "Named entity: frac45; with a semi-colon", + "output": [ + [ + "Character", + "\u2158" + ] + ] + }, + { + "input": "&frac56", + "description": "Bad named entity: frac56 without a semi-colon", + "output": [ + [ + "Character", + "&frac56" + ] + ] + }, + { + "input": "⅚", + "description": "Named entity: frac56; with a semi-colon", + "output": [ + [ + "Character", + "\u215a" + ] + ] + }, + { + "input": "&frac58", + "description": "Bad named entity: frac58 without a semi-colon", + "output": [ + [ + "Character", + "&frac58" + ] + ] + }, + { + "input": "⅝", + "description": "Named entity: frac58; with a semi-colon", + "output": [ + [ + "Character", + "\u215d" + ] + ] + }, + { + "input": "&frac78", + "description": "Bad named entity: frac78 without a semi-colon", + "output": [ + [ + "Character", + "&frac78" + ] + ] + }, + { + "input": "⅞", + "description": "Named entity: frac78; with a semi-colon", + "output": [ + [ + "Character", + "\u215e" + ] + ] + }, + { + "input": "&frasl", + "description": "Bad named entity: frasl without a semi-colon", + "output": [ + [ + "Character", + "&frasl" + ] + ] + }, + { + "input": "⁄", + "description": "Named entity: frasl; with a semi-colon", + "output": [ + [ + "Character", + "\u2044" + ] + ] + }, + { + "input": "&frown", + "description": "Bad named entity: frown without a semi-colon", + "output": [ + [ + "Character", + "&frown" + ] + ] + }, + { + "input": "⌢", + "description": "Named entity: frown; with a semi-colon", + "output": [ + [ + "Character", + "\u2322" + ] + ] + }, + { + "input": "&fscr", + "description": "Bad named entity: fscr without a semi-colon", + "output": [ + [ + "Character", + "&fscr" + ] + ] + }, + { + "input": "𝒻", + "description": "Named entity: fscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcbb" + ] + ] + }, + { + "input": "&gE", + "description": "Bad named entity: gE without a semi-colon", + "output": [ + [ + "Character", + "&gE" + ] + ] + }, + { + "input": "≧", + "description": "Named entity: gE; with a semi-colon", + "output": [ + [ + "Character", + "\u2267" + ] + ] + }, + { + "input": "&gEl", + "description": "Bad named entity: gEl without a semi-colon", + "output": [ + [ + "Character", + "&gEl" + ] + ] + }, + { + "input": "⪌", + "description": "Named entity: gEl; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8c" + ] + ] + }, + { + "input": "&gacute", + "description": "Bad named entity: gacute without a semi-colon", + "output": [ + [ + "Character", + "&gacute" + ] + ] + }, + { + "input": "ǵ", + "description": "Named entity: gacute; with a semi-colon", + "output": [ + [ + "Character", + "\u01f5" + ] + ] + }, + { + "input": "&gamma", + "description": "Bad named entity: gamma without a semi-colon", + "output": [ + [ + "Character", + "&gamma" + ] + ] + }, + { + "input": "γ", + "description": "Named entity: gamma; with a semi-colon", + "output": [ + [ + "Character", + "\u03b3" + ] + ] + }, + { + "input": "&gammad", + "description": "Bad named entity: gammad without a semi-colon", + "output": [ + [ + "Character", + "&gammad" + ] + ] + }, + { + "input": "ϝ", + "description": "Named entity: gammad; with a semi-colon", + "output": [ + [ + "Character", + "\u03dd" + ] + ] + }, + { + "input": "&gap", + "description": "Bad named entity: gap without a semi-colon", + "output": [ + [ + "Character", + "&gap" + ] + ] + }, + { + "input": "⪆", + "description": "Named entity: gap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a86" + ] + ] + }, + { + "input": "&gbreve", + "description": "Bad named entity: gbreve without a semi-colon", + "output": [ + [ + "Character", + "&gbreve" + ] + ] + }, + { + "input": "ğ", + "description": "Named entity: gbreve; with a semi-colon", + "output": [ + [ + "Character", + "\u011f" + ] + ] + }, + { + "input": "&gcirc", + "description": "Bad named entity: gcirc without a semi-colon", + "output": [ + [ + "Character", + "&gcirc" + ] + ] + }, + { + "input": "ĝ", + "description": "Named entity: gcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u011d" + ] + ] + }, + { + "input": "&gcy", + "description": "Bad named entity: gcy without a semi-colon", + "output": [ + [ + "Character", + "&gcy" + ] + ] + }, + { + "input": "г", + "description": "Named entity: gcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0433" + ] + ] + }, + { + "input": "&gdot", + "description": "Bad named entity: gdot without a semi-colon", + "output": [ + [ + "Character", + "&gdot" + ] + ] + }, + { + "input": "ġ", + "description": "Named entity: gdot; with a semi-colon", + "output": [ + [ + "Character", + "\u0121" + ] + ] + }, + { + "input": "&ge", + "description": "Bad named entity: ge without a semi-colon", + "output": [ + [ + "Character", + "&ge" + ] + ] + }, + { + "input": "≥", + "description": "Named entity: ge; with a semi-colon", + "output": [ + [ + "Character", + "\u2265" + ] + ] + }, + { + "input": "&gel", + "description": "Bad named entity: gel without a semi-colon", + "output": [ + [ + "Character", + "&gel" + ] + ] + }, + { + "input": "⋛", + "description": "Named entity: gel; with a semi-colon", + "output": [ + [ + "Character", + "\u22db" + ] + ] + }, + { + "input": "&geq", + "description": "Bad named entity: geq without a semi-colon", + "output": [ + [ + "Character", + "&geq" + ] + ] + }, + { + "input": "≥", + "description": "Named entity: geq; with a semi-colon", + "output": [ + [ + "Character", + "\u2265" + ] + ] + }, + { + "input": "&geqq", + "description": "Bad named entity: geqq without a semi-colon", + "output": [ + [ + "Character", + "&geqq" + ] + ] + }, + { + "input": "≧", + "description": "Named entity: geqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2267" + ] + ] + }, + { + "input": "&geqslant", + "description": "Bad named entity: geqslant without a semi-colon", + "output": [ + [ + "Character", + "&geqslant" + ] + ] + }, + { + "input": "⩾", + "description": "Named entity: geqslant; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7e" + ] + ] + }, + { + "input": "&ges", + "description": "Bad named entity: ges without a semi-colon", + "output": [ + [ + "Character", + "&ges" + ] + ] + }, + { + "input": "⩾", + "description": "Named entity: ges; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7e" + ] + ] + }, + { + "input": "&gescc", + "description": "Bad named entity: gescc without a semi-colon", + "output": [ + [ + "Character", + "&gescc" + ] + ] + }, + { + "input": "⪩", + "description": "Named entity: gescc; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa9" + ] + ] + }, + { + "input": "&gesdot", + "description": "Bad named entity: gesdot without a semi-colon", + "output": [ + [ + "Character", + "&gesdot" + ] + ] + }, + { + "input": "⪀", + "description": "Named entity: gesdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a80" + ] + ] + }, + { + "input": "&gesdoto", + "description": "Bad named entity: gesdoto without a semi-colon", + "output": [ + [ + "Character", + "&gesdoto" + ] + ] + }, + { + "input": "⪂", + "description": "Named entity: gesdoto; with a semi-colon", + "output": [ + [ + "Character", + "\u2a82" + ] + ] + }, + { + "input": "&gesdotol", + "description": "Bad named entity: gesdotol without a semi-colon", + "output": [ + [ + "Character", + "&gesdotol" + ] + ] + }, + { + "input": "⪄", + "description": "Named entity: gesdotol; with a semi-colon", + "output": [ + [ + "Character", + "\u2a84" + ] + ] + }, + { + "input": "&gesl", + "description": "Bad named entity: gesl without a semi-colon", + "output": [ + [ + "Character", + "&gesl" + ] + ] + }, + { + "input": "⋛︀", + "description": "Named entity: gesl; with a semi-colon", + "output": [ + [ + "Character", + "\u22db\ufe00" + ] + ] + }, + { + "input": "&gesles", + "description": "Bad named entity: gesles without a semi-colon", + "output": [ + [ + "Character", + "&gesles" + ] + ] + }, + { + "input": "⪔", + "description": "Named entity: gesles; with a semi-colon", + "output": [ + [ + "Character", + "\u2a94" + ] + ] + }, + { + "input": "&gfr", + "description": "Bad named entity: gfr without a semi-colon", + "output": [ + [ + "Character", + "&gfr" + ] + ] + }, + { + "input": "𝔤", + "description": "Named entity: gfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd24" + ] + ] + }, + { + "input": "&gg", + "description": "Bad named entity: gg without a semi-colon", + "output": [ + [ + "Character", + "&gg" + ] + ] + }, + { + "input": "≫", + "description": "Named entity: gg; with a semi-colon", + "output": [ + [ + "Character", + "\u226b" + ] + ] + }, + { + "input": "&ggg", + "description": "Bad named entity: ggg without a semi-colon", + "output": [ + [ + "Character", + "&ggg" + ] + ] + }, + { + "input": "⋙", + "description": "Named entity: ggg; with a semi-colon", + "output": [ + [ + "Character", + "\u22d9" + ] + ] + }, + { + "input": "&gimel", + "description": "Bad named entity: gimel without a semi-colon", + "output": [ + [ + "Character", + "&gimel" + ] + ] + }, + { + "input": "ℷ", + "description": "Named entity: gimel; with a semi-colon", + "output": [ + [ + "Character", + "\u2137" + ] + ] + }, + { + "input": "&gjcy", + "description": "Bad named entity: gjcy without a semi-colon", + "output": [ + [ + "Character", + "&gjcy" + ] + ] + }, + { + "input": "ѓ", + "description": "Named entity: gjcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0453" + ] + ] + }, + { + "input": "&gl", + "description": "Bad named entity: gl without a semi-colon", + "output": [ + [ + "Character", + "&gl" + ] + ] + }, + { + "input": "≷", + "description": "Named entity: gl; with a semi-colon", + "output": [ + [ + "Character", + "\u2277" + ] + ] + }, + { + "input": "&glE", + "description": "Bad named entity: glE without a semi-colon", + "output": [ + [ + "Character", + "&glE" + ] + ] + }, + { + "input": "⪒", + "description": "Named entity: glE; with a semi-colon", + "output": [ + [ + "Character", + "\u2a92" + ] + ] + }, + { + "input": "&gla", + "description": "Bad named entity: gla without a semi-colon", + "output": [ + [ + "Character", + "&gla" + ] + ] + }, + { + "input": "⪥", + "description": "Named entity: gla; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa5" + ] + ] + }, + { + "input": "&glj", + "description": "Bad named entity: glj without a semi-colon", + "output": [ + [ + "Character", + "&glj" + ] + ] + }, + { + "input": "⪤", + "description": "Named entity: glj; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa4" + ] + ] + }, + { + "input": "&gnE", + "description": "Bad named entity: gnE without a semi-colon", + "output": [ + [ + "Character", + "&gnE" + ] + ] + }, + { + "input": "≩", + "description": "Named entity: gnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2269" + ] + ] + }, + { + "input": "&gnap", + "description": "Bad named entity: gnap without a semi-colon", + "output": [ + [ + "Character", + "&gnap" + ] + ] + }, + { + "input": "⪊", + "description": "Named entity: gnap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8a" + ] + ] + }, + { + "input": "&gnapprox", + "description": "Bad named entity: gnapprox without a semi-colon", + "output": [ + [ + "Character", + "&gnapprox" + ] + ] + }, + { + "input": "⪊", + "description": "Named entity: gnapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8a" + ] + ] + }, + { + "input": "&gne", + "description": "Bad named entity: gne without a semi-colon", + "output": [ + [ + "Character", + "&gne" + ] + ] + }, + { + "input": "⪈", + "description": "Named entity: gne; with a semi-colon", + "output": [ + [ + "Character", + "\u2a88" + ] + ] + }, + { + "input": "&gneq", + "description": "Bad named entity: gneq without a semi-colon", + "output": [ + [ + "Character", + "&gneq" + ] + ] + }, + { + "input": "⪈", + "description": "Named entity: gneq; with a semi-colon", + "output": [ + [ + "Character", + "\u2a88" + ] + ] + }, + { + "input": "&gneqq", + "description": "Bad named entity: gneqq without a semi-colon", + "output": [ + [ + "Character", + "&gneqq" + ] + ] + }, + { + "input": "≩", + "description": "Named entity: gneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2269" + ] + ] + }, + { + "input": "&gnsim", + "description": "Bad named entity: gnsim without a semi-colon", + "output": [ + [ + "Character", + "&gnsim" + ] + ] + }, + { + "input": "⋧", + "description": "Named entity: gnsim; with a semi-colon", + "output": [ + [ + "Character", + "\u22e7" + ] + ] + }, + { + "input": "&gopf", + "description": "Bad named entity: gopf without a semi-colon", + "output": [ + [ + "Character", + "&gopf" + ] + ] + }, + { + "input": "𝕘", + "description": "Named entity: gopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd58" + ] + ] + }, + { + "input": "&grave", + "description": "Bad named entity: grave without a semi-colon", + "output": [ + [ + "Character", + "&grave" + ] + ] + }, + { + "input": "`", + "description": "Named entity: grave; with a semi-colon", + "output": [ + [ + "Character", + "`" + ] + ] + }, + { + "input": "&gscr", + "description": "Bad named entity: gscr without a semi-colon", + "output": [ + [ + "Character", + "&gscr" + ] + ] + }, + { + "input": "ℊ", + "description": "Named entity: gscr; with a semi-colon", + "output": [ + [ + "Character", + "\u210a" + ] + ] + }, + { + "input": "&gsim", + "description": "Bad named entity: gsim without a semi-colon", + "output": [ + [ + "Character", + "&gsim" + ] + ] + }, + { + "input": "≳", + "description": "Named entity: gsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2273" + ] + ] + }, + { + "input": "&gsime", + "description": "Bad named entity: gsime without a semi-colon", + "output": [ + [ + "Character", + "&gsime" + ] + ] + }, + { + "input": "⪎", + "description": "Named entity: gsime; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8e" + ] + ] + }, + { + "input": "&gsiml", + "description": "Bad named entity: gsiml without a semi-colon", + "output": [ + [ + "Character", + "&gsiml" + ] + ] + }, + { + "input": "⪐", + "description": "Named entity: gsiml; with a semi-colon", + "output": [ + [ + "Character", + "\u2a90" + ] + ] + }, + { + "input": ">", + "description": "Named entity: gt without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + ">" + ] + ] + }, + { + "input": ">", + "description": "Named entity: gt; with a semi-colon", + "output": [ + [ + "Character", + ">" + ] + ] + }, + { + "input": "⪧", + "description": "Named entity: gtcc; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa7" + ] + ] + }, + { + "input": "⩺", + "description": "Named entity: gtcir; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7a" + ] + ] + }, + { + "input": "⋗", + "description": "Named entity: gtdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22d7" + ] + ] + }, + { + "input": "⦕", + "description": "Named entity: gtlPar; with a semi-colon", + "output": [ + [ + "Character", + "\u2995" + ] + ] + }, + { + "input": "⩼", + "description": "Named entity: gtquest; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7c" + ] + ] + }, + { + "input": "⪆", + "description": "Named entity: gtrapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2a86" + ] + ] + }, + { + "input": "⥸", + "description": "Named entity: gtrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2978" + ] + ] + }, + { + "input": "⋗", + "description": "Named entity: gtrdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22d7" + ] + ] + }, + { + "input": "⋛", + "description": "Named entity: gtreqless; with a semi-colon", + "output": [ + [ + "Character", + "\u22db" + ] + ] + }, + { + "input": "⪌", + "description": "Named entity: gtreqqless; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8c" + ] + ] + }, + { + "input": "≷", + "description": "Named entity: gtrless; with a semi-colon", + "output": [ + [ + "Character", + "\u2277" + ] + ] + }, + { + "input": "≳", + "description": "Named entity: gtrsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2273" + ] + ] + }, + { + "input": "&gvertneqq", + "description": "Bad named entity: gvertneqq without a semi-colon", + "output": [ + [ + "Character", + "&gvertneqq" + ] + ] + }, + { + "input": "≩︀", + "description": "Named entity: gvertneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2269\ufe00" + ] + ] + }, + { + "input": "&gvnE", + "description": "Bad named entity: gvnE without a semi-colon", + "output": [ + [ + "Character", + "&gvnE" + ] + ] + }, + { + "input": "≩︀", + "description": "Named entity: gvnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2269\ufe00" + ] + ] + }, + { + "input": "&hArr", + "description": "Bad named entity: hArr without a semi-colon", + "output": [ + [ + "Character", + "&hArr" + ] + ] + }, + { + "input": "⇔", + "description": "Named entity: hArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d4" + ] + ] + }, + { + "input": "&hairsp", + "description": "Bad named entity: hairsp without a semi-colon", + "output": [ + [ + "Character", + "&hairsp" + ] + ] + }, + { + "input": " ", + "description": "Named entity: hairsp; with a semi-colon", + "output": [ + [ + "Character", + "\u200a" + ] + ] + }, + { + "input": "&half", + "description": "Bad named entity: half without a semi-colon", + "output": [ + [ + "Character", + "&half" + ] + ] + }, + { + "input": "½", + "description": "Named entity: half; with a semi-colon", + "output": [ + [ + "Character", + "\u00bd" + ] + ] + }, + { + "input": "&hamilt", + "description": "Bad named entity: hamilt without a semi-colon", + "output": [ + [ + "Character", + "&hamilt" + ] + ] + }, + { + "input": "ℋ", + "description": "Named entity: hamilt; with a semi-colon", + "output": [ + [ + "Character", + "\u210b" + ] + ] + }, + { + "input": "&hardcy", + "description": "Bad named entity: hardcy without a semi-colon", + "output": [ + [ + "Character", + "&hardcy" + ] + ] + }, + { + "input": "ъ", + "description": "Named entity: hardcy; with a semi-colon", + "output": [ + [ + "Character", + "\u044a" + ] + ] + }, + { + "input": "&harr", + "description": "Bad named entity: harr without a semi-colon", + "output": [ + [ + "Character", + "&harr" + ] + ] + }, + { + "input": "↔", + "description": "Named entity: harr; with a semi-colon", + "output": [ + [ + "Character", + "\u2194" + ] + ] + }, + { + "input": "&harrcir", + "description": "Bad named entity: harrcir without a semi-colon", + "output": [ + [ + "Character", + "&harrcir" + ] + ] + }, + { + "input": "⥈", + "description": "Named entity: harrcir; with a semi-colon", + "output": [ + [ + "Character", + "\u2948" + ] + ] + }, + { + "input": "&harrw", + "description": "Bad named entity: harrw without a semi-colon", + "output": [ + [ + "Character", + "&harrw" + ] + ] + }, + { + "input": "↭", + "description": "Named entity: harrw; with a semi-colon", + "output": [ + [ + "Character", + "\u21ad" + ] + ] + }, + { + "input": "&hbar", + "description": "Bad named entity: hbar without a semi-colon", + "output": [ + [ + "Character", + "&hbar" + ] + ] + }, + { + "input": "ℏ", + "description": "Named entity: hbar; with a semi-colon", + "output": [ + [ + "Character", + "\u210f" + ] + ] + }, + { + "input": "&hcirc", + "description": "Bad named entity: hcirc without a semi-colon", + "output": [ + [ + "Character", + "&hcirc" + ] + ] + }, + { + "input": "ĥ", + "description": "Named entity: hcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0125" + ] + ] + }, + { + "input": "&hearts", + "description": "Bad named entity: hearts without a semi-colon", + "output": [ + [ + "Character", + "&hearts" + ] + ] + }, + { + "input": "♥", + "description": "Named entity: hearts; with a semi-colon", + "output": [ + [ + "Character", + "\u2665" + ] + ] + }, + { + "input": "&heartsuit", + "description": "Bad named entity: heartsuit without a semi-colon", + "output": [ + [ + "Character", + "&heartsuit" + ] + ] + }, + { + "input": "♥", + "description": "Named entity: heartsuit; with a semi-colon", + "output": [ + [ + "Character", + "\u2665" + ] + ] + }, + { + "input": "&hellip", + "description": "Bad named entity: hellip without a semi-colon", + "output": [ + [ + "Character", + "&hellip" + ] + ] + }, + { + "input": "…", + "description": "Named entity: hellip; with a semi-colon", + "output": [ + [ + "Character", + "\u2026" + ] + ] + }, + { + "input": "&hercon", + "description": "Bad named entity: hercon without a semi-colon", + "output": [ + [ + "Character", + "&hercon" + ] + ] + }, + { + "input": "⊹", + "description": "Named entity: hercon; with a semi-colon", + "output": [ + [ + "Character", + "\u22b9" + ] + ] + }, + { + "input": "&hfr", + "description": "Bad named entity: hfr without a semi-colon", + "output": [ + [ + "Character", + "&hfr" + ] + ] + }, + { + "input": "𝔥", + "description": "Named entity: hfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd25" + ] + ] + }, + { + "input": "&hksearow", + "description": "Bad named entity: hksearow without a semi-colon", + "output": [ + [ + "Character", + "&hksearow" + ] + ] + }, + { + "input": "⤥", + "description": "Named entity: hksearow; with a semi-colon", + "output": [ + [ + "Character", + "\u2925" + ] + ] + }, + { + "input": "&hkswarow", + "description": "Bad named entity: hkswarow without a semi-colon", + "output": [ + [ + "Character", + "&hkswarow" + ] + ] + }, + { + "input": "⤦", + "description": "Named entity: hkswarow; with a semi-colon", + "output": [ + [ + "Character", + "\u2926" + ] + ] + }, + { + "input": "&hoarr", + "description": "Bad named entity: hoarr without a semi-colon", + "output": [ + [ + "Character", + "&hoarr" + ] + ] + }, + { + "input": "⇿", + "description": "Named entity: hoarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21ff" + ] + ] + }, + { + "input": "&homtht", + "description": "Bad named entity: homtht without a semi-colon", + "output": [ + [ + "Character", + "&homtht" + ] + ] + }, + { + "input": "∻", + "description": "Named entity: homtht; with a semi-colon", + "output": [ + [ + "Character", + "\u223b" + ] + ] + }, + { + "input": "&hookleftarrow", + "description": "Bad named entity: hookleftarrow without a semi-colon", + "output": [ + [ + "Character", + "&hookleftarrow" + ] + ] + }, + { + "input": "↩", + "description": "Named entity: hookleftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21a9" + ] + ] + }, + { + "input": "&hookrightarrow", + "description": "Bad named entity: hookrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&hookrightarrow" + ] + ] + }, + { + "input": "↪", + "description": "Named entity: hookrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21aa" + ] + ] + }, + { + "input": "&hopf", + "description": "Bad named entity: hopf without a semi-colon", + "output": [ + [ + "Character", + "&hopf" + ] + ] + }, + { + "input": "𝕙", + "description": "Named entity: hopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd59" + ] + ] + }, + { + "input": "&horbar", + "description": "Bad named entity: horbar without a semi-colon", + "output": [ + [ + "Character", + "&horbar" + ] + ] + }, + { + "input": "―", + "description": "Named entity: horbar; with a semi-colon", + "output": [ + [ + "Character", + "\u2015" + ] + ] + }, + { + "input": "&hscr", + "description": "Bad named entity: hscr without a semi-colon", + "output": [ + [ + "Character", + "&hscr" + ] + ] + }, + { + "input": "𝒽", + "description": "Named entity: hscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcbd" + ] + ] + }, + { + "input": "&hslash", + "description": "Bad named entity: hslash without a semi-colon", + "output": [ + [ + "Character", + "&hslash" + ] + ] + }, + { + "input": "ℏ", + "description": "Named entity: hslash; with a semi-colon", + "output": [ + [ + "Character", + "\u210f" + ] + ] + }, + { + "input": "&hstrok", + "description": "Bad named entity: hstrok without a semi-colon", + "output": [ + [ + "Character", + "&hstrok" + ] + ] + }, + { + "input": "ħ", + "description": "Named entity: hstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0127" + ] + ] + }, + { + "input": "&hybull", + "description": "Bad named entity: hybull without a semi-colon", + "output": [ + [ + "Character", + "&hybull" + ] + ] + }, + { + "input": "⁃", + "description": "Named entity: hybull; with a semi-colon", + "output": [ + [ + "Character", + "\u2043" + ] + ] + }, + { + "input": "&hyphen", + "description": "Bad named entity: hyphen without a semi-colon", + "output": [ + [ + "Character", + "&hyphen" + ] + ] + }, + { + "input": "‐", + "description": "Named entity: hyphen; with a semi-colon", + "output": [ + [ + "Character", + "\u2010" + ] + ] + }, + { + "input": "í", + "description": "Named entity: iacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ed" + ] + ] + }, + { + "input": "í", + "description": "Named entity: iacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00ed" + ] + ] + }, + { + "input": "&ic", + "description": "Bad named entity: ic without a semi-colon", + "output": [ + [ + "Character", + "&ic" + ] + ] + }, + { + "input": "⁣", + "description": "Named entity: ic; with a semi-colon", + "output": [ + [ + "Character", + "\u2063" + ] + ] + }, + { + "input": "î", + "description": "Named entity: icirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ee" + ] + ] + }, + { + "input": "î", + "description": "Named entity: icirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00ee" + ] + ] + }, + { + "input": "&icy", + "description": "Bad named entity: icy without a semi-colon", + "output": [ + [ + "Character", + "&icy" + ] + ] + }, + { + "input": "и", + "description": "Named entity: icy; with a semi-colon", + "output": [ + [ + "Character", + "\u0438" + ] + ] + }, + { + "input": "&iecy", + "description": "Bad named entity: iecy without a semi-colon", + "output": [ + [ + "Character", + "&iecy" + ] + ] + }, + { + "input": "е", + "description": "Named entity: iecy; with a semi-colon", + "output": [ + [ + "Character", + "\u0435" + ] + ] + }, + { + "input": "¡", + "description": "Named entity: iexcl without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a1" + ] + ] + }, + { + "input": "¡", + "description": "Named entity: iexcl; with a semi-colon", + "output": [ + [ + "Character", + "\u00a1" + ] + ] + }, + { + "input": "&iff", + "description": "Bad named entity: iff without a semi-colon", + "output": [ + [ + "Character", + "&iff" + ] + ] + }, + { + "input": "⇔", + "description": "Named entity: iff; with a semi-colon", + "output": [ + [ + "Character", + "\u21d4" + ] + ] + }, + { + "input": "&ifr", + "description": "Bad named entity: ifr without a semi-colon", + "output": [ + [ + "Character", + "&ifr" + ] + ] + }, + { + "input": "𝔦", + "description": "Named entity: ifr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd26" + ] + ] + }, + { + "input": "ì", + "description": "Named entity: igrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ec" + ] + ] + }, + { + "input": "ì", + "description": "Named entity: igrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00ec" + ] + ] + }, + { + "input": "&ii", + "description": "Bad named entity: ii without a semi-colon", + "output": [ + [ + "Character", + "&ii" + ] + ] + }, + { + "input": "ⅈ", + "description": "Named entity: ii; with a semi-colon", + "output": [ + [ + "Character", + "\u2148" + ] + ] + }, + { + "input": "&iiiint", + "description": "Bad named entity: iiiint without a semi-colon", + "output": [ + [ + "Character", + "&iiiint" + ] + ] + }, + { + "input": "⨌", + "description": "Named entity: iiiint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a0c" + ] + ] + }, + { + "input": "&iiint", + "description": "Bad named entity: iiint without a semi-colon", + "output": [ + [ + "Character", + "&iiint" + ] + ] + }, + { + "input": "∭", + "description": "Named entity: iiint; with a semi-colon", + "output": [ + [ + "Character", + "\u222d" + ] + ] + }, + { + "input": "&iinfin", + "description": "Bad named entity: iinfin without a semi-colon", + "output": [ + [ + "Character", + "&iinfin" + ] + ] + }, + { + "input": "⧜", + "description": "Named entity: iinfin; with a semi-colon", + "output": [ + [ + "Character", + "\u29dc" + ] + ] + }, + { + "input": "&iiota", + "description": "Bad named entity: iiota without a semi-colon", + "output": [ + [ + "Character", + "&iiota" + ] + ] + }, + { + "input": "℩", + "description": "Named entity: iiota; with a semi-colon", + "output": [ + [ + "Character", + "\u2129" + ] + ] + }, + { + "input": "&ijlig", + "description": "Bad named entity: ijlig without a semi-colon", + "output": [ + [ + "Character", + "&ijlig" + ] + ] + }, + { + "input": "ij", + "description": "Named entity: ijlig; with a semi-colon", + "output": [ + [ + "Character", + "\u0133" + ] + ] + }, + { + "input": "&imacr", + "description": "Bad named entity: imacr without a semi-colon", + "output": [ + [ + "Character", + "&imacr" + ] + ] + }, + { + "input": "ī", + "description": "Named entity: imacr; with a semi-colon", + "output": [ + [ + "Character", + "\u012b" + ] + ] + }, + { + "input": "&image", + "description": "Bad named entity: image without a semi-colon", + "output": [ + [ + "Character", + "&image" + ] + ] + }, + { + "input": "ℑ", + "description": "Named entity: image; with a semi-colon", + "output": [ + [ + "Character", + "\u2111" + ] + ] + }, + { + "input": "&imagline", + "description": "Bad named entity: imagline without a semi-colon", + "output": [ + [ + "Character", + "&imagline" + ] + ] + }, + { + "input": "ℐ", + "description": "Named entity: imagline; with a semi-colon", + "output": [ + [ + "Character", + "\u2110" + ] + ] + }, + { + "input": "&imagpart", + "description": "Bad named entity: imagpart without a semi-colon", + "output": [ + [ + "Character", + "&imagpart" + ] + ] + }, + { + "input": "ℑ", + "description": "Named entity: imagpart; with a semi-colon", + "output": [ + [ + "Character", + "\u2111" + ] + ] + }, + { + "input": "&imath", + "description": "Bad named entity: imath without a semi-colon", + "output": [ + [ + "Character", + "&imath" + ] + ] + }, + { + "input": "ı", + "description": "Named entity: imath; with a semi-colon", + "output": [ + [ + "Character", + "\u0131" + ] + ] + }, + { + "input": "&imof", + "description": "Bad named entity: imof without a semi-colon", + "output": [ + [ + "Character", + "&imof" + ] + ] + }, + { + "input": "⊷", + "description": "Named entity: imof; with a semi-colon", + "output": [ + [ + "Character", + "\u22b7" + ] + ] + }, + { + "input": "&imped", + "description": "Bad named entity: imped without a semi-colon", + "output": [ + [ + "Character", + "&imped" + ] + ] + }, + { + "input": "Ƶ", + "description": "Named entity: imped; with a semi-colon", + "output": [ + [ + "Character", + "\u01b5" + ] + ] + }, + { + "input": "&in", + "description": "Bad named entity: in without a semi-colon", + "output": [ + [ + "Character", + "&in" + ] + ] + }, + { + "input": "∈", + "description": "Named entity: in; with a semi-colon", + "output": [ + [ + "Character", + "\u2208" + ] + ] + }, + { + "input": "&incare", + "description": "Bad named entity: incare without a semi-colon", + "output": [ + [ + "Character", + "&incare" + ] + ] + }, + { + "input": "℅", + "description": "Named entity: incare; with a semi-colon", + "output": [ + [ + "Character", + "\u2105" + ] + ] + }, + { + "input": "&infin", + "description": "Bad named entity: infin without a semi-colon", + "output": [ + [ + "Character", + "&infin" + ] + ] + }, + { + "input": "∞", + "description": "Named entity: infin; with a semi-colon", + "output": [ + [ + "Character", + "\u221e" + ] + ] + }, + { + "input": "&infintie", + "description": "Bad named entity: infintie without a semi-colon", + "output": [ + [ + "Character", + "&infintie" + ] + ] + }, + { + "input": "⧝", + "description": "Named entity: infintie; with a semi-colon", + "output": [ + [ + "Character", + "\u29dd" + ] + ] + }, + { + "input": "&inodot", + "description": "Bad named entity: inodot without a semi-colon", + "output": [ + [ + "Character", + "&inodot" + ] + ] + }, + { + "input": "ı", + "description": "Named entity: inodot; with a semi-colon", + "output": [ + [ + "Character", + "\u0131" + ] + ] + }, + { + "input": "&int", + "description": "Bad named entity: int without a semi-colon", + "output": [ + [ + "Character", + "&int" + ] + ] + }, + { + "input": "∫", + "description": "Named entity: int; with a semi-colon", + "output": [ + [ + "Character", + "\u222b" + ] + ] + }, + { + "input": "&intcal", + "description": "Bad named entity: intcal without a semi-colon", + "output": [ + [ + "Character", + "&intcal" + ] + ] + }, + { + "input": "⊺", + "description": "Named entity: intcal; with a semi-colon", + "output": [ + [ + "Character", + "\u22ba" + ] + ] + }, + { + "input": "&integers", + "description": "Bad named entity: integers without a semi-colon", + "output": [ + [ + "Character", + "&integers" + ] + ] + }, + { + "input": "ℤ", + "description": "Named entity: integers; with a semi-colon", + "output": [ + [ + "Character", + "\u2124" + ] + ] + }, + { + "input": "&intercal", + "description": "Bad named entity: intercal without a semi-colon", + "output": [ + [ + "Character", + "&intercal" + ] + ] + }, + { + "input": "⊺", + "description": "Named entity: intercal; with a semi-colon", + "output": [ + [ + "Character", + "\u22ba" + ] + ] + }, + { + "input": "&intlarhk", + "description": "Bad named entity: intlarhk without a semi-colon", + "output": [ + [ + "Character", + "&intlarhk" + ] + ] + }, + { + "input": "⨗", + "description": "Named entity: intlarhk; with a semi-colon", + "output": [ + [ + "Character", + "\u2a17" + ] + ] + }, + { + "input": "&intprod", + "description": "Bad named entity: intprod without a semi-colon", + "output": [ + [ + "Character", + "&intprod" + ] + ] + }, + { + "input": "⨼", + "description": "Named entity: intprod; with a semi-colon", + "output": [ + [ + "Character", + "\u2a3c" + ] + ] + }, + { + "input": "&iocy", + "description": "Bad named entity: iocy without a semi-colon", + "output": [ + [ + "Character", + "&iocy" + ] + ] + }, + { + "input": "ё", + "description": "Named entity: iocy; with a semi-colon", + "output": [ + [ + "Character", + "\u0451" + ] + ] + }, + { + "input": "&iogon", + "description": "Bad named entity: iogon without a semi-colon", + "output": [ + [ + "Character", + "&iogon" + ] + ] + }, + { + "input": "į", + "description": "Named entity: iogon; with a semi-colon", + "output": [ + [ + "Character", + "\u012f" + ] + ] + }, + { + "input": "&iopf", + "description": "Bad named entity: iopf without a semi-colon", + "output": [ + [ + "Character", + "&iopf" + ] + ] + }, + { + "input": "𝕚", + "description": "Named entity: iopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd5a" + ] + ] + }, + { + "input": "&iota", + "description": "Bad named entity: iota without a semi-colon", + "output": [ + [ + "Character", + "&iota" + ] + ] + }, + { + "input": "ι", + "description": "Named entity: iota; with a semi-colon", + "output": [ + [ + "Character", + "\u03b9" + ] + ] + }, + { + "input": "&iprod", + "description": "Bad named entity: iprod without a semi-colon", + "output": [ + [ + "Character", + "&iprod" + ] + ] + }, + { + "input": "⨼", + "description": "Named entity: iprod; with a semi-colon", + "output": [ + [ + "Character", + "\u2a3c" + ] + ] + }, + { + "input": "¿", + "description": "Named entity: iquest without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00bf" + ] + ] + }, + { + "input": "¿", + "description": "Named entity: iquest; with a semi-colon", + "output": [ + [ + "Character", + "\u00bf" + ] + ] + }, + { + "input": "&iscr", + "description": "Bad named entity: iscr without a semi-colon", + "output": [ + [ + "Character", + "&iscr" + ] + ] + }, + { + "input": "𝒾", + "description": "Named entity: iscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcbe" + ] + ] + }, + { + "input": "&isin", + "description": "Bad named entity: isin without a semi-colon", + "output": [ + [ + "Character", + "&isin" + ] + ] + }, + { + "input": "∈", + "description": "Named entity: isin; with a semi-colon", + "output": [ + [ + "Character", + "\u2208" + ] + ] + }, + { + "input": "&isinE", + "description": "Bad named entity: isinE without a semi-colon", + "output": [ + [ + "Character", + "&isinE" + ] + ] + }, + { + "input": "⋹", + "description": "Named entity: isinE; with a semi-colon", + "output": [ + [ + "Character", + "\u22f9" + ] + ] + }, + { + "input": "&isindot", + "description": "Bad named entity: isindot without a semi-colon", + "output": [ + [ + "Character", + "&isindot" + ] + ] + }, + { + "input": "⋵", + "description": "Named entity: isindot; with a semi-colon", + "output": [ + [ + "Character", + "\u22f5" + ] + ] + }, + { + "input": "&isins", + "description": "Bad named entity: isins without a semi-colon", + "output": [ + [ + "Character", + "&isins" + ] + ] + }, + { + "input": "⋴", + "description": "Named entity: isins; with a semi-colon", + "output": [ + [ + "Character", + "\u22f4" + ] + ] + }, + { + "input": "&isinsv", + "description": "Bad named entity: isinsv without a semi-colon", + "output": [ + [ + "Character", + "&isinsv" + ] + ] + }, + { + "input": "⋳", + "description": "Named entity: isinsv; with a semi-colon", + "output": [ + [ + "Character", + "\u22f3" + ] + ] + }, + { + "input": "&isinv", + "description": "Bad named entity: isinv without a semi-colon", + "output": [ + [ + "Character", + "&isinv" + ] + ] + }, + { + "input": "∈", + "description": "Named entity: isinv; with a semi-colon", + "output": [ + [ + "Character", + "\u2208" + ] + ] + }, + { + "input": "&it", + "description": "Bad named entity: it without a semi-colon", + "output": [ + [ + "Character", + "&it" + ] + ] + }, + { + "input": "⁢", + "description": "Named entity: it; with a semi-colon", + "output": [ + [ + "Character", + "\u2062" + ] + ] + }, + { + "input": "&itilde", + "description": "Bad named entity: itilde without a semi-colon", + "output": [ + [ + "Character", + "&itilde" + ] + ] + }, + { + "input": "ĩ", + "description": "Named entity: itilde; with a semi-colon", + "output": [ + [ + "Character", + "\u0129" + ] + ] + }, + { + "input": "&iukcy", + "description": "Bad named entity: iukcy without a semi-colon", + "output": [ + [ + "Character", + "&iukcy" + ] + ] + }, + { + "input": "і", + "description": "Named entity: iukcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0456" + ] + ] + }, + { + "input": "ï", + "description": "Named entity: iuml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ef" + ] + ] + }, + { + "input": "ï", + "description": "Named entity: iuml; with a semi-colon", + "output": [ + [ + "Character", + "\u00ef" + ] + ] + }, + { + "input": "&jcirc", + "description": "Bad named entity: jcirc without a semi-colon", + "output": [ + [ + "Character", + "&jcirc" + ] + ] + }, + { + "input": "ĵ", + "description": "Named entity: jcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0135" + ] + ] + }, + { + "input": "&jcy", + "description": "Bad named entity: jcy without a semi-colon", + "output": [ + [ + "Character", + "&jcy" + ] + ] + }, + { + "input": "й", + "description": "Named entity: jcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0439" + ] + ] + }, + { + "input": "&jfr", + "description": "Bad named entity: jfr without a semi-colon", + "output": [ + [ + "Character", + "&jfr" + ] + ] + }, + { + "input": "𝔧", + "description": "Named entity: jfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd27" + ] + ] + }, + { + "input": "&jmath", + "description": "Bad named entity: jmath without a semi-colon", + "output": [ + [ + "Character", + "&jmath" + ] + ] + }, + { + "input": "ȷ", + "description": "Named entity: jmath; with a semi-colon", + "output": [ + [ + "Character", + "\u0237" + ] + ] + }, + { + "input": "&jopf", + "description": "Bad named entity: jopf without a semi-colon", + "output": [ + [ + "Character", + "&jopf" + ] + ] + }, + { + "input": "𝕛", + "description": "Named entity: jopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd5b" + ] + ] + }, + { + "input": "&jscr", + "description": "Bad named entity: jscr without a semi-colon", + "output": [ + [ + "Character", + "&jscr" + ] + ] + }, + { + "input": "𝒿", + "description": "Named entity: jscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcbf" + ] + ] + }, + { + "input": "&jsercy", + "description": "Bad named entity: jsercy without a semi-colon", + "output": [ + [ + "Character", + "&jsercy" + ] + ] + }, + { + "input": "ј", + "description": "Named entity: jsercy; with a semi-colon", + "output": [ + [ + "Character", + "\u0458" + ] + ] + }, + { + "input": "&jukcy", + "description": "Bad named entity: jukcy without a semi-colon", + "output": [ + [ + "Character", + "&jukcy" + ] + ] + }, + { + "input": "є", + "description": "Named entity: jukcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0454" + ] + ] + }, + { + "input": "&kappa", + "description": "Bad named entity: kappa without a semi-colon", + "output": [ + [ + "Character", + "&kappa" + ] + ] + }, + { + "input": "κ", + "description": "Named entity: kappa; with a semi-colon", + "output": [ + [ + "Character", + "\u03ba" + ] + ] + }, + { + "input": "&kappav", + "description": "Bad named entity: kappav without a semi-colon", + "output": [ + [ + "Character", + "&kappav" + ] + ] + }, + { + "input": "ϰ", + "description": "Named entity: kappav; with a semi-colon", + "output": [ + [ + "Character", + "\u03f0" + ] + ] + }, + { + "input": "&kcedil", + "description": "Bad named entity: kcedil without a semi-colon", + "output": [ + [ + "Character", + "&kcedil" + ] + ] + }, + { + "input": "ķ", + "description": "Named entity: kcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0137" + ] + ] + }, + { + "input": "&kcy", + "description": "Bad named entity: kcy without a semi-colon", + "output": [ + [ + "Character", + "&kcy" + ] + ] + }, + { + "input": "к", + "description": "Named entity: kcy; with a semi-colon", + "output": [ + [ + "Character", + "\u043a" + ] + ] + }, + { + "input": "&kfr", + "description": "Bad named entity: kfr without a semi-colon", + "output": [ + [ + "Character", + "&kfr" + ] + ] + }, + { + "input": "𝔨", + "description": "Named entity: kfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd28" + ] + ] + }, + { + "input": "&kgreen", + "description": "Bad named entity: kgreen without a semi-colon", + "output": [ + [ + "Character", + "&kgreen" + ] + ] + }, + { + "input": "ĸ", + "description": "Named entity: kgreen; with a semi-colon", + "output": [ + [ + "Character", + "\u0138" + ] + ] + }, + { + "input": "&khcy", + "description": "Bad named entity: khcy without a semi-colon", + "output": [ + [ + "Character", + "&khcy" + ] + ] + }, + { + "input": "х", + "description": "Named entity: khcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0445" + ] + ] + }, + { + "input": "&kjcy", + "description": "Bad named entity: kjcy without a semi-colon", + "output": [ + [ + "Character", + "&kjcy" + ] + ] + }, + { + "input": "ќ", + "description": "Named entity: kjcy; with a semi-colon", + "output": [ + [ + "Character", + "\u045c" + ] + ] + }, + { + "input": "&kopf", + "description": "Bad named entity: kopf without a semi-colon", + "output": [ + [ + "Character", + "&kopf" + ] + ] + }, + { + "input": "𝕜", + "description": "Named entity: kopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd5c" + ] + ] + }, + { + "input": "&kscr", + "description": "Bad named entity: kscr without a semi-colon", + "output": [ + [ + "Character", + "&kscr" + ] + ] + }, + { + "input": "𝓀", + "description": "Named entity: kscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc0" + ] + ] + }, + { + "input": "&lAarr", + "description": "Bad named entity: lAarr without a semi-colon", + "output": [ + [ + "Character", + "&lAarr" + ] + ] + }, + { + "input": "⇚", + "description": "Named entity: lAarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21da" + ] + ] + }, + { + "input": "&lArr", + "description": "Bad named entity: lArr without a semi-colon", + "output": [ + [ + "Character", + "&lArr" + ] + ] + }, + { + "input": "⇐", + "description": "Named entity: lArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d0" + ] + ] + }, + { + "input": "&lAtail", + "description": "Bad named entity: lAtail without a semi-colon", + "output": [ + [ + "Character", + "&lAtail" + ] + ] + }, + { + "input": "⤛", + "description": "Named entity: lAtail; with a semi-colon", + "output": [ + [ + "Character", + "\u291b" + ] + ] + }, + { + "input": "&lBarr", + "description": "Bad named entity: lBarr without a semi-colon", + "output": [ + [ + "Character", + "&lBarr" + ] + ] + }, + { + "input": "⤎", + "description": "Named entity: lBarr; with a semi-colon", + "output": [ + [ + "Character", + "\u290e" + ] + ] + }, + { + "input": "&lE", + "description": "Bad named entity: lE without a semi-colon", + "output": [ + [ + "Character", + "&lE" + ] + ] + }, + { + "input": "≦", + "description": "Named entity: lE; with a semi-colon", + "output": [ + [ + "Character", + "\u2266" + ] + ] + }, + { + "input": "&lEg", + "description": "Bad named entity: lEg without a semi-colon", + "output": [ + [ + "Character", + "&lEg" + ] + ] + }, + { + "input": "⪋", + "description": "Named entity: lEg; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8b" + ] + ] + }, + { + "input": "&lHar", + "description": "Bad named entity: lHar without a semi-colon", + "output": [ + [ + "Character", + "&lHar" + ] + ] + }, + { + "input": "⥢", + "description": "Named entity: lHar; with a semi-colon", + "output": [ + [ + "Character", + "\u2962" + ] + ] + }, + { + "input": "&lacute", + "description": "Bad named entity: lacute without a semi-colon", + "output": [ + [ + "Character", + "&lacute" + ] + ] + }, + { + "input": "ĺ", + "description": "Named entity: lacute; with a semi-colon", + "output": [ + [ + "Character", + "\u013a" + ] + ] + }, + { + "input": "&laemptyv", + "description": "Bad named entity: laemptyv without a semi-colon", + "output": [ + [ + "Character", + "&laemptyv" + ] + ] + }, + { + "input": "⦴", + "description": "Named entity: laemptyv; with a semi-colon", + "output": [ + [ + "Character", + "\u29b4" + ] + ] + }, + { + "input": "&lagran", + "description": "Bad named entity: lagran without a semi-colon", + "output": [ + [ + "Character", + "&lagran" + ] + ] + }, + { + "input": "ℒ", + "description": "Named entity: lagran; with a semi-colon", + "output": [ + [ + "Character", + "\u2112" + ] + ] + }, + { + "input": "&lambda", + "description": "Bad named entity: lambda without a semi-colon", + "output": [ + [ + "Character", + "&lambda" + ] + ] + }, + { + "input": "λ", + "description": "Named entity: lambda; with a semi-colon", + "output": [ + [ + "Character", + "\u03bb" + ] + ] + }, + { + "input": "&lang", + "description": "Bad named entity: lang without a semi-colon", + "output": [ + [ + "Character", + "&lang" + ] + ] + }, + { + "input": "⟨", + "description": "Named entity: lang; with a semi-colon", + "output": [ + [ + "Character", + "\u27e8" + ] + ] + }, + { + "input": "&langd", + "description": "Bad named entity: langd without a semi-colon", + "output": [ + [ + "Character", + "&langd" + ] + ] + }, + { + "input": "⦑", + "description": "Named entity: langd; with a semi-colon", + "output": [ + [ + "Character", + "\u2991" + ] + ] + }, + { + "input": "&langle", + "description": "Bad named entity: langle without a semi-colon", + "output": [ + [ + "Character", + "&langle" + ] + ] + }, + { + "input": "⟨", + "description": "Named entity: langle; with a semi-colon", + "output": [ + [ + "Character", + "\u27e8" + ] + ] + }, + { + "input": "&lap", + "description": "Bad named entity: lap without a semi-colon", + "output": [ + [ + "Character", + "&lap" + ] + ] + }, + { + "input": "⪅", + "description": "Named entity: lap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a85" + ] + ] + }, + { + "input": "«", + "description": "Named entity: laquo without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ab" + ] + ] + }, + { + "input": "«", + "description": "Named entity: laquo; with a semi-colon", + "output": [ + [ + "Character", + "\u00ab" + ] + ] + }, + { + "input": "&larr", + "description": "Bad named entity: larr without a semi-colon", + "output": [ + [ + "Character", + "&larr" + ] + ] + }, + { + "input": "←", + "description": "Named entity: larr; with a semi-colon", + "output": [ + [ + "Character", + "\u2190" + ] + ] + }, + { + "input": "&larrb", + "description": "Bad named entity: larrb without a semi-colon", + "output": [ + [ + "Character", + "&larrb" + ] + ] + }, + { + "input": "⇤", + "description": "Named entity: larrb; with a semi-colon", + "output": [ + [ + "Character", + "\u21e4" + ] + ] + }, + { + "input": "&larrbfs", + "description": "Bad named entity: larrbfs without a semi-colon", + "output": [ + [ + "Character", + "&larrbfs" + ] + ] + }, + { + "input": "⤟", + "description": "Named entity: larrbfs; with a semi-colon", + "output": [ + [ + "Character", + "\u291f" + ] + ] + }, + { + "input": "&larrfs", + "description": "Bad named entity: larrfs without a semi-colon", + "output": [ + [ + "Character", + "&larrfs" + ] + ] + }, + { + "input": "⤝", + "description": "Named entity: larrfs; with a semi-colon", + "output": [ + [ + "Character", + "\u291d" + ] + ] + }, + { + "input": "&larrhk", + "description": "Bad named entity: larrhk without a semi-colon", + "output": [ + [ + "Character", + "&larrhk" + ] + ] + }, + { + "input": "↩", + "description": "Named entity: larrhk; with a semi-colon", + "output": [ + [ + "Character", + "\u21a9" + ] + ] + }, + { + "input": "&larrlp", + "description": "Bad named entity: larrlp without a semi-colon", + "output": [ + [ + "Character", + "&larrlp" + ] + ] + }, + { + "input": "↫", + "description": "Named entity: larrlp; with a semi-colon", + "output": [ + [ + "Character", + "\u21ab" + ] + ] + }, + { + "input": "&larrpl", + "description": "Bad named entity: larrpl without a semi-colon", + "output": [ + [ + "Character", + "&larrpl" + ] + ] + }, + { + "input": "⤹", + "description": "Named entity: larrpl; with a semi-colon", + "output": [ + [ + "Character", + "\u2939" + ] + ] + }, + { + "input": "&larrsim", + "description": "Bad named entity: larrsim without a semi-colon", + "output": [ + [ + "Character", + "&larrsim" + ] + ] + }, + { + "input": "⥳", + "description": "Named entity: larrsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2973" + ] + ] + }, + { + "input": "&larrtl", + "description": "Bad named entity: larrtl without a semi-colon", + "output": [ + [ + "Character", + "&larrtl" + ] + ] + }, + { + "input": "↢", + "description": "Named entity: larrtl; with a semi-colon", + "output": [ + [ + "Character", + "\u21a2" + ] + ] + }, + { + "input": "&lat", + "description": "Bad named entity: lat without a semi-colon", + "output": [ + [ + "Character", + "&lat" + ] + ] + }, + { + "input": "⪫", + "description": "Named entity: lat; with a semi-colon", + "output": [ + [ + "Character", + "\u2aab" + ] + ] + }, + { + "input": "&latail", + "description": "Bad named entity: latail without a semi-colon", + "output": [ + [ + "Character", + "&latail" + ] + ] + }, + { + "input": "⤙", + "description": "Named entity: latail; with a semi-colon", + "output": [ + [ + "Character", + "\u2919" + ] + ] + }, + { + "input": "&late", + "description": "Bad named entity: late without a semi-colon", + "output": [ + [ + "Character", + "&late" + ] + ] + }, + { + "input": "⪭", + "description": "Named entity: late; with a semi-colon", + "output": [ + [ + "Character", + "\u2aad" + ] + ] + }, + { + "input": "&lates", + "description": "Bad named entity: lates without a semi-colon", + "output": [ + [ + "Character", + "&lates" + ] + ] + }, + { + "input": "⪭︀", + "description": "Named entity: lates; with a semi-colon", + "output": [ + [ + "Character", + "\u2aad\ufe00" + ] + ] + }, + { + "input": "&lbarr", + "description": "Bad named entity: lbarr without a semi-colon", + "output": [ + [ + "Character", + "&lbarr" + ] + ] + }, + { + "input": "⤌", + "description": "Named entity: lbarr; with a semi-colon", + "output": [ + [ + "Character", + "\u290c" + ] + ] + }, + { + "input": "&lbbrk", + "description": "Bad named entity: lbbrk without a semi-colon", + "output": [ + [ + "Character", + "&lbbrk" + ] + ] + }, + { + "input": "❲", + "description": "Named entity: lbbrk; with a semi-colon", + "output": [ + [ + "Character", + "\u2772" + ] + ] + }, + { + "input": "&lbrace", + "description": "Bad named entity: lbrace without a semi-colon", + "output": [ + [ + "Character", + "&lbrace" + ] + ] + }, + { + "input": "{", + "description": "Named entity: lbrace; with a semi-colon", + "output": [ + [ + "Character", + "{" + ] + ] + }, + { + "input": "&lbrack", + "description": "Bad named entity: lbrack without a semi-colon", + "output": [ + [ + "Character", + "&lbrack" + ] + ] + }, + { + "input": "[", + "description": "Named entity: lbrack; with a semi-colon", + "output": [ + [ + "Character", + "[" + ] + ] + }, + { + "input": "&lbrke", + "description": "Bad named entity: lbrke without a semi-colon", + "output": [ + [ + "Character", + "&lbrke" + ] + ] + }, + { + "input": "⦋", + "description": "Named entity: lbrke; with a semi-colon", + "output": [ + [ + "Character", + "\u298b" + ] + ] + }, + { + "input": "&lbrksld", + "description": "Bad named entity: lbrksld without a semi-colon", + "output": [ + [ + "Character", + "&lbrksld" + ] + ] + }, + { + "input": "⦏", + "description": "Named entity: lbrksld; with a semi-colon", + "output": [ + [ + "Character", + "\u298f" + ] + ] + }, + { + "input": "&lbrkslu", + "description": "Bad named entity: lbrkslu without a semi-colon", + "output": [ + [ + "Character", + "&lbrkslu" + ] + ] + }, + { + "input": "⦍", + "description": "Named entity: lbrkslu; with a semi-colon", + "output": [ + [ + "Character", + "\u298d" + ] + ] + }, + { + "input": "&lcaron", + "description": "Bad named entity: lcaron without a semi-colon", + "output": [ + [ + "Character", + "&lcaron" + ] + ] + }, + { + "input": "ľ", + "description": "Named entity: lcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u013e" + ] + ] + }, + { + "input": "&lcedil", + "description": "Bad named entity: lcedil without a semi-colon", + "output": [ + [ + "Character", + "&lcedil" + ] + ] + }, + { + "input": "ļ", + "description": "Named entity: lcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u013c" + ] + ] + }, + { + "input": "&lceil", + "description": "Bad named entity: lceil without a semi-colon", + "output": [ + [ + "Character", + "&lceil" + ] + ] + }, + { + "input": "⌈", + "description": "Named entity: lceil; with a semi-colon", + "output": [ + [ + "Character", + "\u2308" + ] + ] + }, + { + "input": "&lcub", + "description": "Bad named entity: lcub without a semi-colon", + "output": [ + [ + "Character", + "&lcub" + ] + ] + }, + { + "input": "{", + "description": "Named entity: lcub; with a semi-colon", + "output": [ + [ + "Character", + "{" + ] + ] + }, + { + "input": "&lcy", + "description": "Bad named entity: lcy without a semi-colon", + "output": [ + [ + "Character", + "&lcy" + ] + ] + }, + { + "input": "л", + "description": "Named entity: lcy; with a semi-colon", + "output": [ + [ + "Character", + "\u043b" + ] + ] + }, + { + "input": "&ldca", + "description": "Bad named entity: ldca without a semi-colon", + "output": [ + [ + "Character", + "&ldca" + ] + ] + }, + { + "input": "⤶", + "description": "Named entity: ldca; with a semi-colon", + "output": [ + [ + "Character", + "\u2936" + ] + ] + }, + { + "input": "&ldquo", + "description": "Bad named entity: ldquo without a semi-colon", + "output": [ + [ + "Character", + "&ldquo" + ] + ] + }, + { + "input": "“", + "description": "Named entity: ldquo; with a semi-colon", + "output": [ + [ + "Character", + "\u201c" + ] + ] + }, + { + "input": "&ldquor", + "description": "Bad named entity: ldquor without a semi-colon", + "output": [ + [ + "Character", + "&ldquor" + ] + ] + }, + { + "input": "„", + "description": "Named entity: ldquor; with a semi-colon", + "output": [ + [ + "Character", + "\u201e" + ] + ] + }, + { + "input": "&ldrdhar", + "description": "Bad named entity: ldrdhar without a semi-colon", + "output": [ + [ + "Character", + "&ldrdhar" + ] + ] + }, + { + "input": "⥧", + "description": "Named entity: ldrdhar; with a semi-colon", + "output": [ + [ + "Character", + "\u2967" + ] + ] + }, + { + "input": "&ldrushar", + "description": "Bad named entity: ldrushar without a semi-colon", + "output": [ + [ + "Character", + "&ldrushar" + ] + ] + }, + { + "input": "⥋", + "description": "Named entity: ldrushar; with a semi-colon", + "output": [ + [ + "Character", + "\u294b" + ] + ] + }, + { + "input": "&ldsh", + "description": "Bad named entity: ldsh without a semi-colon", + "output": [ + [ + "Character", + "&ldsh" + ] + ] + }, + { + "input": "↲", + "description": "Named entity: ldsh; with a semi-colon", + "output": [ + [ + "Character", + "\u21b2" + ] + ] + }, + { + "input": "&le", + "description": "Bad named entity: le without a semi-colon", + "output": [ + [ + "Character", + "&le" + ] + ] + }, + { + "input": "≤", + "description": "Named entity: le; with a semi-colon", + "output": [ + [ + "Character", + "\u2264" + ] + ] + }, + { + "input": "&leftarrow", + "description": "Bad named entity: leftarrow without a semi-colon", + "output": [ + [ + "Character", + "&leftarrow" + ] + ] + }, + { + "input": "←", + "description": "Named entity: leftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2190" + ] + ] + }, + { + "input": "&leftarrowtail", + "description": "Bad named entity: leftarrowtail without a semi-colon", + "output": [ + [ + "Character", + "&leftarrowtail" + ] + ] + }, + { + "input": "↢", + "description": "Named entity: leftarrowtail; with a semi-colon", + "output": [ + [ + "Character", + "\u21a2" + ] + ] + }, + { + "input": "&leftharpoondown", + "description": "Bad named entity: leftharpoondown without a semi-colon", + "output": [ + [ + "Character", + "&leftharpoondown" + ] + ] + }, + { + "input": "↽", + "description": "Named entity: leftharpoondown; with a semi-colon", + "output": [ + [ + "Character", + "\u21bd" + ] + ] + }, + { + "input": "&leftharpoonup", + "description": "Bad named entity: leftharpoonup without a semi-colon", + "output": [ + [ + "Character", + "&leftharpoonup" + ] + ] + }, + { + "input": "↼", + "description": "Named entity: leftharpoonup; with a semi-colon", + "output": [ + [ + "Character", + "\u21bc" + ] + ] + }, + { + "input": "&leftleftarrows", + "description": "Bad named entity: leftleftarrows without a semi-colon", + "output": [ + [ + "Character", + "&leftleftarrows" + ] + ] + }, + { + "input": "⇇", + "description": "Named entity: leftleftarrows; with a semi-colon", + "output": [ + [ + "Character", + "\u21c7" + ] + ] + }, + { + "input": "&leftrightarrow", + "description": "Bad named entity: leftrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&leftrightarrow" + ] + ] + }, + { + "input": "↔", + "description": "Named entity: leftrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2194" + ] + ] + }, + { + "input": "&leftrightarrows", + "description": "Bad named entity: leftrightarrows without a semi-colon", + "output": [ + [ + "Character", + "&leftrightarrows" + ] + ] + }, + { + "input": "⇆", + "description": "Named entity: leftrightarrows; with a semi-colon", + "output": [ + [ + "Character", + "\u21c6" + ] + ] + }, + { + "input": "&leftrightharpoons", + "description": "Bad named entity: leftrightharpoons without a semi-colon", + "output": [ + [ + "Character", + "&leftrightharpoons" + ] + ] + }, + { + "input": "⇋", + "description": "Named entity: leftrightharpoons; with a semi-colon", + "output": [ + [ + "Character", + "\u21cb" + ] + ] + }, + { + "input": "&leftrightsquigarrow", + "description": "Bad named entity: leftrightsquigarrow without a semi-colon", + "output": [ + [ + "Character", + "&leftrightsquigarrow" + ] + ] + }, + { + "input": "↭", + "description": "Named entity: leftrightsquigarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21ad" + ] + ] + }, + { + "input": "&leftthreetimes", + "description": "Bad named entity: leftthreetimes without a semi-colon", + "output": [ + [ + "Character", + "&leftthreetimes" + ] + ] + }, + { + "input": "⋋", + "description": "Named entity: leftthreetimes; with a semi-colon", + "output": [ + [ + "Character", + "\u22cb" + ] + ] + }, + { + "input": "&leg", + "description": "Bad named entity: leg without a semi-colon", + "output": [ + [ + "Character", + "&leg" + ] + ] + }, + { + "input": "⋚", + "description": "Named entity: leg; with a semi-colon", + "output": [ + [ + "Character", + "\u22da" + ] + ] + }, + { + "input": "&leq", + "description": "Bad named entity: leq without a semi-colon", + "output": [ + [ + "Character", + "&leq" + ] + ] + }, + { + "input": "≤", + "description": "Named entity: leq; with a semi-colon", + "output": [ + [ + "Character", + "\u2264" + ] + ] + }, + { + "input": "&leqq", + "description": "Bad named entity: leqq without a semi-colon", + "output": [ + [ + "Character", + "&leqq" + ] + ] + }, + { + "input": "≦", + "description": "Named entity: leqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2266" + ] + ] + }, + { + "input": "&leqslant", + "description": "Bad named entity: leqslant without a semi-colon", + "output": [ + [ + "Character", + "&leqslant" + ] + ] + }, + { + "input": "⩽", + "description": "Named entity: leqslant; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7d" + ] + ] + }, + { + "input": "&les", + "description": "Bad named entity: les without a semi-colon", + "output": [ + [ + "Character", + "&les" + ] + ] + }, + { + "input": "⩽", + "description": "Named entity: les; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7d" + ] + ] + }, + { + "input": "&lescc", + "description": "Bad named entity: lescc without a semi-colon", + "output": [ + [ + "Character", + "&lescc" + ] + ] + }, + { + "input": "⪨", + "description": "Named entity: lescc; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa8" + ] + ] + }, + { + "input": "&lesdot", + "description": "Bad named entity: lesdot without a semi-colon", + "output": [ + [ + "Character", + "&lesdot" + ] + ] + }, + { + "input": "⩿", + "description": "Named entity: lesdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7f" + ] + ] + }, + { + "input": "&lesdoto", + "description": "Bad named entity: lesdoto without a semi-colon", + "output": [ + [ + "Character", + "&lesdoto" + ] + ] + }, + { + "input": "⪁", + "description": "Named entity: lesdoto; with a semi-colon", + "output": [ + [ + "Character", + "\u2a81" + ] + ] + }, + { + "input": "&lesdotor", + "description": "Bad named entity: lesdotor without a semi-colon", + "output": [ + [ + "Character", + "&lesdotor" + ] + ] + }, + { + "input": "⪃", + "description": "Named entity: lesdotor; with a semi-colon", + "output": [ + [ + "Character", + "\u2a83" + ] + ] + }, + { + "input": "&lesg", + "description": "Bad named entity: lesg without a semi-colon", + "output": [ + [ + "Character", + "&lesg" + ] + ] + }, + { + "input": "⋚︀", + "description": "Named entity: lesg; with a semi-colon", + "output": [ + [ + "Character", + "\u22da\ufe00" + ] + ] + }, + { + "input": "&lesges", + "description": "Bad named entity: lesges without a semi-colon", + "output": [ + [ + "Character", + "&lesges" + ] + ] + }, + { + "input": "⪓", + "description": "Named entity: lesges; with a semi-colon", + "output": [ + [ + "Character", + "\u2a93" + ] + ] + }, + { + "input": "&lessapprox", + "description": "Bad named entity: lessapprox without a semi-colon", + "output": [ + [ + "Character", + "&lessapprox" + ] + ] + }, + { + "input": "⪅", + "description": "Named entity: lessapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2a85" + ] + ] + }, + { + "input": "&lessdot", + "description": "Bad named entity: lessdot without a semi-colon", + "output": [ + [ + "Character", + "&lessdot" + ] + ] + }, + { + "input": "⋖", + "description": "Named entity: lessdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22d6" + ] + ] + }, + { + "input": "&lesseqgtr", + "description": "Bad named entity: lesseqgtr without a semi-colon", + "output": [ + [ + "Character", + "&lesseqgtr" + ] + ] + }, + { + "input": "⋚", + "description": "Named entity: lesseqgtr; with a semi-colon", + "output": [ + [ + "Character", + "\u22da" + ] + ] + }, + { + "input": "&lesseqqgtr", + "description": "Bad named entity: lesseqqgtr without a semi-colon", + "output": [ + [ + "Character", + "&lesseqqgtr" + ] + ] + }, + { + "input": "⪋", + "description": "Named entity: lesseqqgtr; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8b" + ] + ] + }, + { + "input": "&lessgtr", + "description": "Bad named entity: lessgtr without a semi-colon", + "output": [ + [ + "Character", + "&lessgtr" + ] + ] + }, + { + "input": "≶", + "description": "Named entity: lessgtr; with a semi-colon", + "output": [ + [ + "Character", + "\u2276" + ] + ] + }, + { + "input": "&lesssim", + "description": "Bad named entity: lesssim without a semi-colon", + "output": [ + [ + "Character", + "&lesssim" + ] + ] + }, + { + "input": "≲", + "description": "Named entity: lesssim; with a semi-colon", + "output": [ + [ + "Character", + "\u2272" + ] + ] + }, + { + "input": "&lfisht", + "description": "Bad named entity: lfisht without a semi-colon", + "output": [ + [ + "Character", + "&lfisht" + ] + ] + }, + { + "input": "⥼", + "description": "Named entity: lfisht; with a semi-colon", + "output": [ + [ + "Character", + "\u297c" + ] + ] + }, + { + "input": "&lfloor", + "description": "Bad named entity: lfloor without a semi-colon", + "output": [ + [ + "Character", + "&lfloor" + ] + ] + }, + { + "input": "⌊", + "description": "Named entity: lfloor; with a semi-colon", + "output": [ + [ + "Character", + "\u230a" + ] + ] + }, + { + "input": "&lfr", + "description": "Bad named entity: lfr without a semi-colon", + "output": [ + [ + "Character", + "&lfr" + ] + ] + }, + { + "input": "𝔩", + "description": "Named entity: lfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd29" + ] + ] + }, + { + "input": "&lg", + "description": "Bad named entity: lg without a semi-colon", + "output": [ + [ + "Character", + "&lg" + ] + ] + }, + { + "input": "≶", + "description": "Named entity: lg; with a semi-colon", + "output": [ + [ + "Character", + "\u2276" + ] + ] + }, + { + "input": "&lgE", + "description": "Bad named entity: lgE without a semi-colon", + "output": [ + [ + "Character", + "&lgE" + ] + ] + }, + { + "input": "⪑", + "description": "Named entity: lgE; with a semi-colon", + "output": [ + [ + "Character", + "\u2a91" + ] + ] + }, + { + "input": "&lhard", + "description": "Bad named entity: lhard without a semi-colon", + "output": [ + [ + "Character", + "&lhard" + ] + ] + }, + { + "input": "↽", + "description": "Named entity: lhard; with a semi-colon", + "output": [ + [ + "Character", + "\u21bd" + ] + ] + }, + { + "input": "&lharu", + "description": "Bad named entity: lharu without a semi-colon", + "output": [ + [ + "Character", + "&lharu" + ] + ] + }, + { + "input": "↼", + "description": "Named entity: lharu; with a semi-colon", + "output": [ + [ + "Character", + "\u21bc" + ] + ] + }, + { + "input": "&lharul", + "description": "Bad named entity: lharul without a semi-colon", + "output": [ + [ + "Character", + "&lharul" + ] + ] + }, + { + "input": "⥪", + "description": "Named entity: lharul; with a semi-colon", + "output": [ + [ + "Character", + "\u296a" + ] + ] + }, + { + "input": "&lhblk", + "description": "Bad named entity: lhblk without a semi-colon", + "output": [ + [ + "Character", + "&lhblk" + ] + ] + }, + { + "input": "▄", + "description": "Named entity: lhblk; with a semi-colon", + "output": [ + [ + "Character", + "\u2584" + ] + ] + }, + { + "input": "&ljcy", + "description": "Bad named entity: ljcy without a semi-colon", + "output": [ + [ + "Character", + "&ljcy" + ] + ] + }, + { + "input": "љ", + "description": "Named entity: ljcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0459" + ] + ] + }, + { + "input": "&ll", + "description": "Bad named entity: ll without a semi-colon", + "output": [ + [ + "Character", + "&ll" + ] + ] + }, + { + "input": "≪", + "description": "Named entity: ll; with a semi-colon", + "output": [ + [ + "Character", + "\u226a" + ] + ] + }, + { + "input": "&llarr", + "description": "Bad named entity: llarr without a semi-colon", + "output": [ + [ + "Character", + "&llarr" + ] + ] + }, + { + "input": "⇇", + "description": "Named entity: llarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21c7" + ] + ] + }, + { + "input": "&llcorner", + "description": "Bad named entity: llcorner without a semi-colon", + "output": [ + [ + "Character", + "&llcorner" + ] + ] + }, + { + "input": "⌞", + "description": "Named entity: llcorner; with a semi-colon", + "output": [ + [ + "Character", + "\u231e" + ] + ] + }, + { + "input": "&llhard", + "description": "Bad named entity: llhard without a semi-colon", + "output": [ + [ + "Character", + "&llhard" + ] + ] + }, + { + "input": "⥫", + "description": "Named entity: llhard; with a semi-colon", + "output": [ + [ + "Character", + "\u296b" + ] + ] + }, + { + "input": "&lltri", + "description": "Bad named entity: lltri without a semi-colon", + "output": [ + [ + "Character", + "&lltri" + ] + ] + }, + { + "input": "◺", + "description": "Named entity: lltri; with a semi-colon", + "output": [ + [ + "Character", + "\u25fa" + ] + ] + }, + { + "input": "&lmidot", + "description": "Bad named entity: lmidot without a semi-colon", + "output": [ + [ + "Character", + "&lmidot" + ] + ] + }, + { + "input": "ŀ", + "description": "Named entity: lmidot; with a semi-colon", + "output": [ + [ + "Character", + "\u0140" + ] + ] + }, + { + "input": "&lmoust", + "description": "Bad named entity: lmoust without a semi-colon", + "output": [ + [ + "Character", + "&lmoust" + ] + ] + }, + { + "input": "⎰", + "description": "Named entity: lmoust; with a semi-colon", + "output": [ + [ + "Character", + "\u23b0" + ] + ] + }, + { + "input": "&lmoustache", + "description": "Bad named entity: lmoustache without a semi-colon", + "output": [ + [ + "Character", + "&lmoustache" + ] + ] + }, + { + "input": "⎰", + "description": "Named entity: lmoustache; with a semi-colon", + "output": [ + [ + "Character", + "\u23b0" + ] + ] + }, + { + "input": "&lnE", + "description": "Bad named entity: lnE without a semi-colon", + "output": [ + [ + "Character", + "&lnE" + ] + ] + }, + { + "input": "≨", + "description": "Named entity: lnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2268" + ] + ] + }, + { + "input": "&lnap", + "description": "Bad named entity: lnap without a semi-colon", + "output": [ + [ + "Character", + "&lnap" + ] + ] + }, + { + "input": "⪉", + "description": "Named entity: lnap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a89" + ] + ] + }, + { + "input": "&lnapprox", + "description": "Bad named entity: lnapprox without a semi-colon", + "output": [ + [ + "Character", + "&lnapprox" + ] + ] + }, + { + "input": "⪉", + "description": "Named entity: lnapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2a89" + ] + ] + }, + { + "input": "&lne", + "description": "Bad named entity: lne without a semi-colon", + "output": [ + [ + "Character", + "&lne" + ] + ] + }, + { + "input": "⪇", + "description": "Named entity: lne; with a semi-colon", + "output": [ + [ + "Character", + "\u2a87" + ] + ] + }, + { + "input": "&lneq", + "description": "Bad named entity: lneq without a semi-colon", + "output": [ + [ + "Character", + "&lneq" + ] + ] + }, + { + "input": "⪇", + "description": "Named entity: lneq; with a semi-colon", + "output": [ + [ + "Character", + "\u2a87" + ] + ] + }, + { + "input": "&lneqq", + "description": "Bad named entity: lneqq without a semi-colon", + "output": [ + [ + "Character", + "&lneqq" + ] + ] + }, + { + "input": "≨", + "description": "Named entity: lneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2268" + ] + ] + }, + { + "input": "&lnsim", + "description": "Bad named entity: lnsim without a semi-colon", + "output": [ + [ + "Character", + "&lnsim" + ] + ] + }, + { + "input": "⋦", + "description": "Named entity: lnsim; with a semi-colon", + "output": [ + [ + "Character", + "\u22e6" + ] + ] + }, + { + "input": "&loang", + "description": "Bad named entity: loang without a semi-colon", + "output": [ + [ + "Character", + "&loang" + ] + ] + }, + { + "input": "⟬", + "description": "Named entity: loang; with a semi-colon", + "output": [ + [ + "Character", + "\u27ec" + ] + ] + }, + { + "input": "&loarr", + "description": "Bad named entity: loarr without a semi-colon", + "output": [ + [ + "Character", + "&loarr" + ] + ] + }, + { + "input": "⇽", + "description": "Named entity: loarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21fd" + ] + ] + }, + { + "input": "&lobrk", + "description": "Bad named entity: lobrk without a semi-colon", + "output": [ + [ + "Character", + "&lobrk" + ] + ] + }, + { + "input": "⟦", + "description": "Named entity: lobrk; with a semi-colon", + "output": [ + [ + "Character", + "\u27e6" + ] + ] + }, + { + "input": "&longleftarrow", + "description": "Bad named entity: longleftarrow without a semi-colon", + "output": [ + [ + "Character", + "&longleftarrow" + ] + ] + }, + { + "input": "⟵", + "description": "Named entity: longleftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f5" + ] + ] + }, + { + "input": "&longleftrightarrow", + "description": "Bad named entity: longleftrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&longleftrightarrow" + ] + ] + }, + { + "input": "⟷", + "description": "Named entity: longleftrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f7" + ] + ] + }, + { + "input": "&longmapsto", + "description": "Bad named entity: longmapsto without a semi-colon", + "output": [ + [ + "Character", + "&longmapsto" + ] + ] + }, + { + "input": "⟼", + "description": "Named entity: longmapsto; with a semi-colon", + "output": [ + [ + "Character", + "\u27fc" + ] + ] + }, + { + "input": "&longrightarrow", + "description": "Bad named entity: longrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&longrightarrow" + ] + ] + }, + { + "input": "⟶", + "description": "Named entity: longrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u27f6" + ] + ] + }, + { + "input": "&looparrowleft", + "description": "Bad named entity: looparrowleft without a semi-colon", + "output": [ + [ + "Character", + "&looparrowleft" + ] + ] + }, + { + "input": "↫", + "description": "Named entity: looparrowleft; with a semi-colon", + "output": [ + [ + "Character", + "\u21ab" + ] + ] + }, + { + "input": "&looparrowright", + "description": "Bad named entity: looparrowright without a semi-colon", + "output": [ + [ + "Character", + "&looparrowright" + ] + ] + }, + { + "input": "↬", + "description": "Named entity: looparrowright; with a semi-colon", + "output": [ + [ + "Character", + "\u21ac" + ] + ] + }, + { + "input": "&lopar", + "description": "Bad named entity: lopar without a semi-colon", + "output": [ + [ + "Character", + "&lopar" + ] + ] + }, + { + "input": "⦅", + "description": "Named entity: lopar; with a semi-colon", + "output": [ + [ + "Character", + "\u2985" + ] + ] + }, + { + "input": "&lopf", + "description": "Bad named entity: lopf without a semi-colon", + "output": [ + [ + "Character", + "&lopf" + ] + ] + }, + { + "input": "𝕝", + "description": "Named entity: lopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd5d" + ] + ] + }, + { + "input": "&loplus", + "description": "Bad named entity: loplus without a semi-colon", + "output": [ + [ + "Character", + "&loplus" + ] + ] + }, + { + "input": "⨭", + "description": "Named entity: loplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a2d" + ] + ] + }, + { + "input": "&lotimes", + "description": "Bad named entity: lotimes without a semi-colon", + "output": [ + [ + "Character", + "&lotimes" + ] + ] + }, + { + "input": "⨴", + "description": "Named entity: lotimes; with a semi-colon", + "output": [ + [ + "Character", + "\u2a34" + ] + ] + }, + { + "input": "&lowast", + "description": "Bad named entity: lowast without a semi-colon", + "output": [ + [ + "Character", + "&lowast" + ] + ] + }, + { + "input": "∗", + "description": "Named entity: lowast; with a semi-colon", + "output": [ + [ + "Character", + "\u2217" + ] + ] + }, + { + "input": "&lowbar", + "description": "Bad named entity: lowbar without a semi-colon", + "output": [ + [ + "Character", + "&lowbar" + ] + ] + }, + { + "input": "_", + "description": "Named entity: lowbar; with a semi-colon", + "output": [ + [ + "Character", + "_" + ] + ] + }, + { + "input": "&loz", + "description": "Bad named entity: loz without a semi-colon", + "output": [ + [ + "Character", + "&loz" + ] + ] + }, + { + "input": "◊", + "description": "Named entity: loz; with a semi-colon", + "output": [ + [ + "Character", + "\u25ca" + ] + ] + }, + { + "input": "&lozenge", + "description": "Bad named entity: lozenge without a semi-colon", + "output": [ + [ + "Character", + "&lozenge" + ] + ] + }, + { + "input": "◊", + "description": "Named entity: lozenge; with a semi-colon", + "output": [ + [ + "Character", + "\u25ca" + ] + ] + }, + { + "input": "&lozf", + "description": "Bad named entity: lozf without a semi-colon", + "output": [ + [ + "Character", + "&lozf" + ] + ] + }, + { + "input": "⧫", + "description": "Named entity: lozf; with a semi-colon", + "output": [ + [ + "Character", + "\u29eb" + ] + ] + }, + { + "input": "&lpar", + "description": "Bad named entity: lpar without a semi-colon", + "output": [ + [ + "Character", + "&lpar" + ] + ] + }, + { + "input": "(", + "description": "Named entity: lpar; with a semi-colon", + "output": [ + [ + "Character", + "(" + ] + ] + }, + { + "input": "&lparlt", + "description": "Bad named entity: lparlt without a semi-colon", + "output": [ + [ + "Character", + "&lparlt" + ] + ] + }, + { + "input": "⦓", + "description": "Named entity: lparlt; with a semi-colon", + "output": [ + [ + "Character", + "\u2993" + ] + ] + }, + { + "input": "&lrarr", + "description": "Bad named entity: lrarr without a semi-colon", + "output": [ + [ + "Character", + "&lrarr" + ] + ] + }, + { + "input": "⇆", + "description": "Named entity: lrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21c6" + ] + ] + }, + { + "input": "&lrcorner", + "description": "Bad named entity: lrcorner without a semi-colon", + "output": [ + [ + "Character", + "&lrcorner" + ] + ] + }, + { + "input": "⌟", + "description": "Named entity: lrcorner; with a semi-colon", + "output": [ + [ + "Character", + "\u231f" + ] + ] + }, + { + "input": "&lrhar", + "description": "Bad named entity: lrhar without a semi-colon", + "output": [ + [ + "Character", + "&lrhar" + ] + ] + }, + { + "input": "⇋", + "description": "Named entity: lrhar; with a semi-colon", + "output": [ + [ + "Character", + "\u21cb" + ] + ] + }, + { + "input": "&lrhard", + "description": "Bad named entity: lrhard without a semi-colon", + "output": [ + [ + "Character", + "&lrhard" + ] + ] + }, + { + "input": "⥭", + "description": "Named entity: lrhard; with a semi-colon", + "output": [ + [ + "Character", + "\u296d" + ] + ] + }, + { + "input": "&lrm", + "description": "Bad named entity: lrm without a semi-colon", + "output": [ + [ + "Character", + "&lrm" + ] + ] + }, + { + "input": "‎", + "description": "Named entity: lrm; with a semi-colon", + "output": [ + [ + "Character", + "\u200e" + ] + ] + }, + { + "input": "&lrtri", + "description": "Bad named entity: lrtri without a semi-colon", + "output": [ + [ + "Character", + "&lrtri" + ] + ] + }, + { + "input": "⊿", + "description": "Named entity: lrtri; with a semi-colon", + "output": [ + [ + "Character", + "\u22bf" + ] + ] + }, + { + "input": "&lsaquo", + "description": "Bad named entity: lsaquo without a semi-colon", + "output": [ + [ + "Character", + "&lsaquo" + ] + ] + }, + { + "input": "‹", + "description": "Named entity: lsaquo; with a semi-colon", + "output": [ + [ + "Character", + "\u2039" + ] + ] + }, + { + "input": "&lscr", + "description": "Bad named entity: lscr without a semi-colon", + "output": [ + [ + "Character", + "&lscr" + ] + ] + }, + { + "input": "𝓁", + "description": "Named entity: lscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc1" + ] + ] + }, + { + "input": "&lsh", + "description": "Bad named entity: lsh without a semi-colon", + "output": [ + [ + "Character", + "&lsh" + ] + ] + }, + { + "input": "↰", + "description": "Named entity: lsh; with a semi-colon", + "output": [ + [ + "Character", + "\u21b0" + ] + ] + }, + { + "input": "&lsim", + "description": "Bad named entity: lsim without a semi-colon", + "output": [ + [ + "Character", + "&lsim" + ] + ] + }, + { + "input": "≲", + "description": "Named entity: lsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2272" + ] + ] + }, + { + "input": "&lsime", + "description": "Bad named entity: lsime without a semi-colon", + "output": [ + [ + "Character", + "&lsime" + ] + ] + }, + { + "input": "⪍", + "description": "Named entity: lsime; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8d" + ] + ] + }, + { + "input": "&lsimg", + "description": "Bad named entity: lsimg without a semi-colon", + "output": [ + [ + "Character", + "&lsimg" + ] + ] + }, + { + "input": "⪏", + "description": "Named entity: lsimg; with a semi-colon", + "output": [ + [ + "Character", + "\u2a8f" + ] + ] + }, + { + "input": "&lsqb", + "description": "Bad named entity: lsqb without a semi-colon", + "output": [ + [ + "Character", + "&lsqb" + ] + ] + }, + { + "input": "[", + "description": "Named entity: lsqb; with a semi-colon", + "output": [ + [ + "Character", + "[" + ] + ] + }, + { + "input": "&lsquo", + "description": "Bad named entity: lsquo without a semi-colon", + "output": [ + [ + "Character", + "&lsquo" + ] + ] + }, + { + "input": "‘", + "description": "Named entity: lsquo; with a semi-colon", + "output": [ + [ + "Character", + "\u2018" + ] + ] + }, + { + "input": "&lsquor", + "description": "Bad named entity: lsquor without a semi-colon", + "output": [ + [ + "Character", + "&lsquor" + ] + ] + }, + { + "input": "‚", + "description": "Named entity: lsquor; with a semi-colon", + "output": [ + [ + "Character", + "\u201a" + ] + ] + }, + { + "input": "&lstrok", + "description": "Bad named entity: lstrok without a semi-colon", + "output": [ + [ + "Character", + "&lstrok" + ] + ] + }, + { + "input": "ł", + "description": "Named entity: lstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0142" + ] + ] + }, + { + "input": "<", + "description": "Named entity: lt without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "<" + ] + ] + }, + { + "input": "<", + "description": "Named entity: lt; with a semi-colon", + "output": [ + [ + "Character", + "<" + ] + ] + }, + { + "input": "⪦", + "description": "Named entity: ltcc; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa6" + ] + ] + }, + { + "input": "⩹", + "description": "Named entity: ltcir; with a semi-colon", + "output": [ + [ + "Character", + "\u2a79" + ] + ] + }, + { + "input": "⋖", + "description": "Named entity: ltdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22d6" + ] + ] + }, + { + "input": "⋋", + "description": "Named entity: lthree; with a semi-colon", + "output": [ + [ + "Character", + "\u22cb" + ] + ] + }, + { + "input": "⋉", + "description": "Named entity: ltimes; with a semi-colon", + "output": [ + [ + "Character", + "\u22c9" + ] + ] + }, + { + "input": "⥶", + "description": "Named entity: ltlarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2976" + ] + ] + }, + { + "input": "⩻", + "description": "Named entity: ltquest; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7b" + ] + ] + }, + { + "input": "⦖", + "description": "Named entity: ltrPar; with a semi-colon", + "output": [ + [ + "Character", + "\u2996" + ] + ] + }, + { + "input": "◃", + "description": "Named entity: ltri; with a semi-colon", + "output": [ + [ + "Character", + "\u25c3" + ] + ] + }, + { + "input": "⊴", + "description": "Named entity: ltrie; with a semi-colon", + "output": [ + [ + "Character", + "\u22b4" + ] + ] + }, + { + "input": "◂", + "description": "Named entity: ltrif; with a semi-colon", + "output": [ + [ + "Character", + "\u25c2" + ] + ] + }, + { + "input": "&lurdshar", + "description": "Bad named entity: lurdshar without a semi-colon", + "output": [ + [ + "Character", + "&lurdshar" + ] + ] + }, + { + "input": "⥊", + "description": "Named entity: lurdshar; with a semi-colon", + "output": [ + [ + "Character", + "\u294a" + ] + ] + }, + { + "input": "&luruhar", + "description": "Bad named entity: luruhar without a semi-colon", + "output": [ + [ + "Character", + "&luruhar" + ] + ] + }, + { + "input": "⥦", + "description": "Named entity: luruhar; with a semi-colon", + "output": [ + [ + "Character", + "\u2966" + ] + ] + }, + { + "input": "&lvertneqq", + "description": "Bad named entity: lvertneqq without a semi-colon", + "output": [ + [ + "Character", + "&lvertneqq" + ] + ] + }, + { + "input": "≨︀", + "description": "Named entity: lvertneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2268\ufe00" + ] + ] + }, + { + "input": "&lvnE", + "description": "Bad named entity: lvnE without a semi-colon", + "output": [ + [ + "Character", + "&lvnE" + ] + ] + }, + { + "input": "≨︀", + "description": "Named entity: lvnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2268\ufe00" + ] + ] + }, + { + "input": "&mDDot", + "description": "Bad named entity: mDDot without a semi-colon", + "output": [ + [ + "Character", + "&mDDot" + ] + ] + }, + { + "input": "∺", + "description": "Named entity: mDDot; with a semi-colon", + "output": [ + [ + "Character", + "\u223a" + ] + ] + }, + { + "input": "¯", + "description": "Named entity: macr without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00af" + ] + ] + }, + { + "input": "¯", + "description": "Named entity: macr; with a semi-colon", + "output": [ + [ + "Character", + "\u00af" + ] + ] + }, + { + "input": "&male", + "description": "Bad named entity: male without a semi-colon", + "output": [ + [ + "Character", + "&male" + ] + ] + }, + { + "input": "♂", + "description": "Named entity: male; with a semi-colon", + "output": [ + [ + "Character", + "\u2642" + ] + ] + }, + { + "input": "&malt", + "description": "Bad named entity: malt without a semi-colon", + "output": [ + [ + "Character", + "&malt" + ] + ] + }, + { + "input": "✠", + "description": "Named entity: malt; with a semi-colon", + "output": [ + [ + "Character", + "\u2720" + ] + ] + }, + { + "input": "&maltese", + "description": "Bad named entity: maltese without a semi-colon", + "output": [ + [ + "Character", + "&maltese" + ] + ] + }, + { + "input": "✠", + "description": "Named entity: maltese; with a semi-colon", + "output": [ + [ + "Character", + "\u2720" + ] + ] + }, + { + "input": "&map", + "description": "Bad named entity: map without a semi-colon", + "output": [ + [ + "Character", + "&map" + ] + ] + }, + { + "input": "↦", + "description": "Named entity: map; with a semi-colon", + "output": [ + [ + "Character", + "\u21a6" + ] + ] + }, + { + "input": "&mapsto", + "description": "Bad named entity: mapsto without a semi-colon", + "output": [ + [ + "Character", + "&mapsto" + ] + ] + }, + { + "input": "↦", + "description": "Named entity: mapsto; with a semi-colon", + "output": [ + [ + "Character", + "\u21a6" + ] + ] + }, + { + "input": "&mapstodown", + "description": "Bad named entity: mapstodown without a semi-colon", + "output": [ + [ + "Character", + "&mapstodown" + ] + ] + }, + { + "input": "↧", + "description": "Named entity: mapstodown; with a semi-colon", + "output": [ + [ + "Character", + "\u21a7" + ] + ] + }, + { + "input": "&mapstoleft", + "description": "Bad named entity: mapstoleft without a semi-colon", + "output": [ + [ + "Character", + "&mapstoleft" + ] + ] + }, + { + "input": "↤", + "description": "Named entity: mapstoleft; with a semi-colon", + "output": [ + [ + "Character", + "\u21a4" + ] + ] + }, + { + "input": "&mapstoup", + "description": "Bad named entity: mapstoup without a semi-colon", + "output": [ + [ + "Character", + "&mapstoup" + ] + ] + }, + { + "input": "↥", + "description": "Named entity: mapstoup; with a semi-colon", + "output": [ + [ + "Character", + "\u21a5" + ] + ] + }, + { + "input": "&marker", + "description": "Bad named entity: marker without a semi-colon", + "output": [ + [ + "Character", + "&marker" + ] + ] + }, + { + "input": "▮", + "description": "Named entity: marker; with a semi-colon", + "output": [ + [ + "Character", + "\u25ae" + ] + ] + }, + { + "input": "&mcomma", + "description": "Bad named entity: mcomma without a semi-colon", + "output": [ + [ + "Character", + "&mcomma" + ] + ] + }, + { + "input": "⨩", + "description": "Named entity: mcomma; with a semi-colon", + "output": [ + [ + "Character", + "\u2a29" + ] + ] + }, + { + "input": "&mcy", + "description": "Bad named entity: mcy without a semi-colon", + "output": [ + [ + "Character", + "&mcy" + ] + ] + }, + { + "input": "м", + "description": "Named entity: mcy; with a semi-colon", + "output": [ + [ + "Character", + "\u043c" + ] + ] + }, + { + "input": "&mdash", + "description": "Bad named entity: mdash without a semi-colon", + "output": [ + [ + "Character", + "&mdash" + ] + ] + }, + { + "input": "—", + "description": "Named entity: mdash; with a semi-colon", + "output": [ + [ + "Character", + "\u2014" + ] + ] + }, + { + "input": "&measuredangle", + "description": "Bad named entity: measuredangle without a semi-colon", + "output": [ + [ + "Character", + "&measuredangle" + ] + ] + }, + { + "input": "∡", + "description": "Named entity: measuredangle; with a semi-colon", + "output": [ + [ + "Character", + "\u2221" + ] + ] + }, + { + "input": "&mfr", + "description": "Bad named entity: mfr without a semi-colon", + "output": [ + [ + "Character", + "&mfr" + ] + ] + }, + { + "input": "𝔪", + "description": "Named entity: mfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd2a" + ] + ] + }, + { + "input": "&mho", + "description": "Bad named entity: mho without a semi-colon", + "output": [ + [ + "Character", + "&mho" + ] + ] + }, + { + "input": "℧", + "description": "Named entity: mho; with a semi-colon", + "output": [ + [ + "Character", + "\u2127" + ] + ] + }, + { + "input": "µ", + "description": "Named entity: micro without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b5" + ] + ] + }, + { + "input": "µ", + "description": "Named entity: micro; with a semi-colon", + "output": [ + [ + "Character", + "\u00b5" + ] + ] + }, + { + "input": "&mid", + "description": "Bad named entity: mid without a semi-colon", + "output": [ + [ + "Character", + "&mid" + ] + ] + }, + { + "input": "∣", + "description": "Named entity: mid; with a semi-colon", + "output": [ + [ + "Character", + "\u2223" + ] + ] + }, + { + "input": "&midast", + "description": "Bad named entity: midast without a semi-colon", + "output": [ + [ + "Character", + "&midast" + ] + ] + }, + { + "input": "*", + "description": "Named entity: midast; with a semi-colon", + "output": [ + [ + "Character", + "*" + ] + ] + }, + { + "input": "&midcir", + "description": "Bad named entity: midcir without a semi-colon", + "output": [ + [ + "Character", + "&midcir" + ] + ] + }, + { + "input": "⫰", + "description": "Named entity: midcir; with a semi-colon", + "output": [ + [ + "Character", + "\u2af0" + ] + ] + }, + { + "input": "·", + "description": "Named entity: middot without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b7" + ] + ] + }, + { + "input": "·", + "description": "Named entity: middot; with a semi-colon", + "output": [ + [ + "Character", + "\u00b7" + ] + ] + }, + { + "input": "&minus", + "description": "Bad named entity: minus without a semi-colon", + "output": [ + [ + "Character", + "&minus" + ] + ] + }, + { + "input": "−", + "description": "Named entity: minus; with a semi-colon", + "output": [ + [ + "Character", + "\u2212" + ] + ] + }, + { + "input": "&minusb", + "description": "Bad named entity: minusb without a semi-colon", + "output": [ + [ + "Character", + "&minusb" + ] + ] + }, + { + "input": "⊟", + "description": "Named entity: minusb; with a semi-colon", + "output": [ + [ + "Character", + "\u229f" + ] + ] + }, + { + "input": "&minusd", + "description": "Bad named entity: minusd without a semi-colon", + "output": [ + [ + "Character", + "&minusd" + ] + ] + }, + { + "input": "∸", + "description": "Named entity: minusd; with a semi-colon", + "output": [ + [ + "Character", + "\u2238" + ] + ] + }, + { + "input": "&minusdu", + "description": "Bad named entity: minusdu without a semi-colon", + "output": [ + [ + "Character", + "&minusdu" + ] + ] + }, + { + "input": "⨪", + "description": "Named entity: minusdu; with a semi-colon", + "output": [ + [ + "Character", + "\u2a2a" + ] + ] + }, + { + "input": "&mlcp", + "description": "Bad named entity: mlcp without a semi-colon", + "output": [ + [ + "Character", + "&mlcp" + ] + ] + }, + { + "input": "⫛", + "description": "Named entity: mlcp; with a semi-colon", + "output": [ + [ + "Character", + "\u2adb" + ] + ] + }, + { + "input": "&mldr", + "description": "Bad named entity: mldr without a semi-colon", + "output": [ + [ + "Character", + "&mldr" + ] + ] + }, + { + "input": "…", + "description": "Named entity: mldr; with a semi-colon", + "output": [ + [ + "Character", + "\u2026" + ] + ] + }, + { + "input": "&mnplus", + "description": "Bad named entity: mnplus without a semi-colon", + "output": [ + [ + "Character", + "&mnplus" + ] + ] + }, + { + "input": "∓", + "description": "Named entity: mnplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2213" + ] + ] + }, + { + "input": "&models", + "description": "Bad named entity: models without a semi-colon", + "output": [ + [ + "Character", + "&models" + ] + ] + }, + { + "input": "⊧", + "description": "Named entity: models; with a semi-colon", + "output": [ + [ + "Character", + "\u22a7" + ] + ] + }, + { + "input": "&mopf", + "description": "Bad named entity: mopf without a semi-colon", + "output": [ + [ + "Character", + "&mopf" + ] + ] + }, + { + "input": "𝕞", + "description": "Named entity: mopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd5e" + ] + ] + }, + { + "input": "&mp", + "description": "Bad named entity: mp without a semi-colon", + "output": [ + [ + "Character", + "&mp" + ] + ] + }, + { + "input": "∓", + "description": "Named entity: mp; with a semi-colon", + "output": [ + [ + "Character", + "\u2213" + ] + ] + }, + { + "input": "&mscr", + "description": "Bad named entity: mscr without a semi-colon", + "output": [ + [ + "Character", + "&mscr" + ] + ] + }, + { + "input": "𝓂", + "description": "Named entity: mscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc2" + ] + ] + }, + { + "input": "&mstpos", + "description": "Bad named entity: mstpos without a semi-colon", + "output": [ + [ + "Character", + "&mstpos" + ] + ] + }, + { + "input": "∾", + "description": "Named entity: mstpos; with a semi-colon", + "output": [ + [ + "Character", + "\u223e" + ] + ] + }, + { + "input": "&mu", + "description": "Bad named entity: mu without a semi-colon", + "output": [ + [ + "Character", + "&mu" + ] + ] + }, + { + "input": "μ", + "description": "Named entity: mu; with a semi-colon", + "output": [ + [ + "Character", + "\u03bc" + ] + ] + }, + { + "input": "&multimap", + "description": "Bad named entity: multimap without a semi-colon", + "output": [ + [ + "Character", + "&multimap" + ] + ] + }, + { + "input": "⊸", + "description": "Named entity: multimap; with a semi-colon", + "output": [ + [ + "Character", + "\u22b8" + ] + ] + }, + { + "input": "&mumap", + "description": "Bad named entity: mumap without a semi-colon", + "output": [ + [ + "Character", + "&mumap" + ] + ] + }, + { + "input": "⊸", + "description": "Named entity: mumap; with a semi-colon", + "output": [ + [ + "Character", + "\u22b8" + ] + ] + }, + { + "input": "&nGg", + "description": "Bad named entity: nGg without a semi-colon", + "output": [ + [ + "Character", + "&nGg" + ] + ] + }, + { + "input": "⋙̸", + "description": "Named entity: nGg; with a semi-colon", + "output": [ + [ + "Character", + "\u22d9\u0338" + ] + ] + }, + { + "input": "&nGt", + "description": "Bad named entity: nGt without a semi-colon", + "output": [ + [ + "Character", + "&nGt" + ] + ] + }, + { + "input": "≫⃒", + "description": "Named entity: nGt; with a semi-colon", + "output": [ + [ + "Character", + "\u226b\u20d2" + ] + ] + }, + { + "input": "&nGtv", + "description": "Bad named entity: nGtv without a semi-colon", + "output": [ + [ + "Character", + "&nGtv" + ] + ] + }, + { + "input": "≫̸", + "description": "Named entity: nGtv; with a semi-colon", + "output": [ + [ + "Character", + "\u226b\u0338" + ] + ] + }, + { + "input": "&nLeftarrow", + "description": "Bad named entity: nLeftarrow without a semi-colon", + "output": [ + [ + "Character", + "&nLeftarrow" + ] + ] + }, + { + "input": "⇍", + "description": "Named entity: nLeftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21cd" + ] + ] + }, + { + "input": "&nLeftrightarrow", + "description": "Bad named entity: nLeftrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&nLeftrightarrow" + ] + ] + }, + { + "input": "⇎", + "description": "Named entity: nLeftrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21ce" + ] + ] + }, + { + "input": "&nLl", + "description": "Bad named entity: nLl without a semi-colon", + "output": [ + [ + "Character", + "&nLl" + ] + ] + }, + { + "input": "⋘̸", + "description": "Named entity: nLl; with a semi-colon", + "output": [ + [ + "Character", + "\u22d8\u0338" + ] + ] + }, + { + "input": "&nLt", + "description": "Bad named entity: nLt without a semi-colon", + "output": [ + [ + "Character", + "&nLt" + ] + ] + }, + { + "input": "≪⃒", + "description": "Named entity: nLt; with a semi-colon", + "output": [ + [ + "Character", + "\u226a\u20d2" + ] + ] + }, + { + "input": "&nLtv", + "description": "Bad named entity: nLtv without a semi-colon", + "output": [ + [ + "Character", + "&nLtv" + ] + ] + }, + { + "input": "≪̸", + "description": "Named entity: nLtv; with a semi-colon", + "output": [ + [ + "Character", + "\u226a\u0338" + ] + ] + }, + { + "input": "&nRightarrow", + "description": "Bad named entity: nRightarrow without a semi-colon", + "output": [ + [ + "Character", + "&nRightarrow" + ] + ] + }, + { + "input": "⇏", + "description": "Named entity: nRightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21cf" + ] + ] + }, + { + "input": "&nVDash", + "description": "Bad named entity: nVDash without a semi-colon", + "output": [ + [ + "Character", + "&nVDash" + ] + ] + }, + { + "input": "⊯", + "description": "Named entity: nVDash; with a semi-colon", + "output": [ + [ + "Character", + "\u22af" + ] + ] + }, + { + "input": "&nVdash", + "description": "Bad named entity: nVdash without a semi-colon", + "output": [ + [ + "Character", + "&nVdash" + ] + ] + }, + { + "input": "⊮", + "description": "Named entity: nVdash; with a semi-colon", + "output": [ + [ + "Character", + "\u22ae" + ] + ] + }, + { + "input": "&nabla", + "description": "Bad named entity: nabla without a semi-colon", + "output": [ + [ + "Character", + "&nabla" + ] + ] + }, + { + "input": "∇", + "description": "Named entity: nabla; with a semi-colon", + "output": [ + [ + "Character", + "\u2207" + ] + ] + }, + { + "input": "&nacute", + "description": "Bad named entity: nacute without a semi-colon", + "output": [ + [ + "Character", + "&nacute" + ] + ] + }, + { + "input": "ń", + "description": "Named entity: nacute; with a semi-colon", + "output": [ + [ + "Character", + "\u0144" + ] + ] + }, + { + "input": "&nang", + "description": "Bad named entity: nang without a semi-colon", + "output": [ + [ + "Character", + "&nang" + ] + ] + }, + { + "input": "∠⃒", + "description": "Named entity: nang; with a semi-colon", + "output": [ + [ + "Character", + "\u2220\u20d2" + ] + ] + }, + { + "input": "&nap", + "description": "Bad named entity: nap without a semi-colon", + "output": [ + [ + "Character", + "&nap" + ] + ] + }, + { + "input": "≉", + "description": "Named entity: nap; with a semi-colon", + "output": [ + [ + "Character", + "\u2249" + ] + ] + }, + { + "input": "&napE", + "description": "Bad named entity: napE without a semi-colon", + "output": [ + [ + "Character", + "&napE" + ] + ] + }, + { + "input": "⩰̸", + "description": "Named entity: napE; with a semi-colon", + "output": [ + [ + "Character", + "\u2a70\u0338" + ] + ] + }, + { + "input": "&napid", + "description": "Bad named entity: napid without a semi-colon", + "output": [ + [ + "Character", + "&napid" + ] + ] + }, + { + "input": "≋̸", + "description": "Named entity: napid; with a semi-colon", + "output": [ + [ + "Character", + "\u224b\u0338" + ] + ] + }, + { + "input": "&napos", + "description": "Bad named entity: napos without a semi-colon", + "output": [ + [ + "Character", + "&napos" + ] + ] + }, + { + "input": "ʼn", + "description": "Named entity: napos; with a semi-colon", + "output": [ + [ + "Character", + "\u0149" + ] + ] + }, + { + "input": "&napprox", + "description": "Bad named entity: napprox without a semi-colon", + "output": [ + [ + "Character", + "&napprox" + ] + ] + }, + { + "input": "≉", + "description": "Named entity: napprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2249" + ] + ] + }, + { + "input": "&natur", + "description": "Bad named entity: natur without a semi-colon", + "output": [ + [ + "Character", + "&natur" + ] + ] + }, + { + "input": "♮", + "description": "Named entity: natur; with a semi-colon", + "output": [ + [ + "Character", + "\u266e" + ] + ] + }, + { + "input": "&natural", + "description": "Bad named entity: natural without a semi-colon", + "output": [ + [ + "Character", + "&natural" + ] + ] + }, + { + "input": "♮", + "description": "Named entity: natural; with a semi-colon", + "output": [ + [ + "Character", + "\u266e" + ] + ] + }, + { + "input": "&naturals", + "description": "Bad named entity: naturals without a semi-colon", + "output": [ + [ + "Character", + "&naturals" + ] + ] + }, + { + "input": "ℕ", + "description": "Named entity: naturals; with a semi-colon", + "output": [ + [ + "Character", + "\u2115" + ] + ] + }, + { + "input": " ", + "description": "Named entity: nbsp without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a0" + ] + ] + }, + { + "input": " ", + "description": "Named entity: nbsp; with a semi-colon", + "output": [ + [ + "Character", + "\u00a0" + ] + ] + }, + { + "input": "&nbump", + "description": "Bad named entity: nbump without a semi-colon", + "output": [ + [ + "Character", + "&nbump" + ] + ] + }, + { + "input": "≎̸", + "description": "Named entity: nbump; with a semi-colon", + "output": [ + [ + "Character", + "\u224e\u0338" + ] + ] + }, + { + "input": "&nbumpe", + "description": "Bad named entity: nbumpe without a semi-colon", + "output": [ + [ + "Character", + "&nbumpe" + ] + ] + }, + { + "input": "≏̸", + "description": "Named entity: nbumpe; with a semi-colon", + "output": [ + [ + "Character", + "\u224f\u0338" + ] + ] + }, + { + "input": "&ncap", + "description": "Bad named entity: ncap without a semi-colon", + "output": [ + [ + "Character", + "&ncap" + ] + ] + }, + { + "input": "⩃", + "description": "Named entity: ncap; with a semi-colon", + "output": [ + [ + "Character", + "\u2a43" + ] + ] + }, + { + "input": "&ncaron", + "description": "Bad named entity: ncaron without a semi-colon", + "output": [ + [ + "Character", + "&ncaron" + ] + ] + }, + { + "input": "ň", + "description": "Named entity: ncaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0148" + ] + ] + }, + { + "input": "&ncedil", + "description": "Bad named entity: ncedil without a semi-colon", + "output": [ + [ + "Character", + "&ncedil" + ] + ] + }, + { + "input": "ņ", + "description": "Named entity: ncedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0146" + ] + ] + }, + { + "input": "&ncong", + "description": "Bad named entity: ncong without a semi-colon", + "output": [ + [ + "Character", + "&ncong" + ] + ] + }, + { + "input": "≇", + "description": "Named entity: ncong; with a semi-colon", + "output": [ + [ + "Character", + "\u2247" + ] + ] + }, + { + "input": "&ncongdot", + "description": "Bad named entity: ncongdot without a semi-colon", + "output": [ + [ + "Character", + "&ncongdot" + ] + ] + }, + { + "input": "⩭̸", + "description": "Named entity: ncongdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a6d\u0338" + ] + ] + }, + { + "input": "&ncup", + "description": "Bad named entity: ncup without a semi-colon", + "output": [ + [ + "Character", + "&ncup" + ] + ] + }, + { + "input": "⩂", + "description": "Named entity: ncup; with a semi-colon", + "output": [ + [ + "Character", + "\u2a42" + ] + ] + }, + { + "input": "&ncy", + "description": "Bad named entity: ncy without a semi-colon", + "output": [ + [ + "Character", + "&ncy" + ] + ] + }, + { + "input": "н", + "description": "Named entity: ncy; with a semi-colon", + "output": [ + [ + "Character", + "\u043d" + ] + ] + }, + { + "input": "&ndash", + "description": "Bad named entity: ndash without a semi-colon", + "output": [ + [ + "Character", + "&ndash" + ] + ] + }, + { + "input": "–", + "description": "Named entity: ndash; with a semi-colon", + "output": [ + [ + "Character", + "\u2013" + ] + ] + }, + { + "input": "&ne", + "description": "Bad named entity: ne without a semi-colon", + "output": [ + [ + "Character", + "&ne" + ] + ] + }, + { + "input": "≠", + "description": "Named entity: ne; with a semi-colon", + "output": [ + [ + "Character", + "\u2260" + ] + ] + }, + { + "input": "&neArr", + "description": "Bad named entity: neArr without a semi-colon", + "output": [ + [ + "Character", + "&neArr" + ] + ] + }, + { + "input": "⇗", + "description": "Named entity: neArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d7" + ] + ] + }, + { + "input": "&nearhk", + "description": "Bad named entity: nearhk without a semi-colon", + "output": [ + [ + "Character", + "&nearhk" + ] + ] + }, + { + "input": "⤤", + "description": "Named entity: nearhk; with a semi-colon", + "output": [ + [ + "Character", + "\u2924" + ] + ] + }, + { + "input": "&nearr", + "description": "Bad named entity: nearr without a semi-colon", + "output": [ + [ + "Character", + "&nearr" + ] + ] + }, + { + "input": "↗", + "description": "Named entity: nearr; with a semi-colon", + "output": [ + [ + "Character", + "\u2197" + ] + ] + }, + { + "input": "&nearrow", + "description": "Bad named entity: nearrow without a semi-colon", + "output": [ + [ + "Character", + "&nearrow" + ] + ] + }, + { + "input": "↗", + "description": "Named entity: nearrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2197" + ] + ] + }, + { + "input": "&nedot", + "description": "Bad named entity: nedot without a semi-colon", + "output": [ + [ + "Character", + "&nedot" + ] + ] + }, + { + "input": "≐̸", + "description": "Named entity: nedot; with a semi-colon", + "output": [ + [ + "Character", + "\u2250\u0338" + ] + ] + }, + { + "input": "&nequiv", + "description": "Bad named entity: nequiv without a semi-colon", + "output": [ + [ + "Character", + "&nequiv" + ] + ] + }, + { + "input": "≢", + "description": "Named entity: nequiv; with a semi-colon", + "output": [ + [ + "Character", + "\u2262" + ] + ] + }, + { + "input": "&nesear", + "description": "Bad named entity: nesear without a semi-colon", + "output": [ + [ + "Character", + "&nesear" + ] + ] + }, + { + "input": "⤨", + "description": "Named entity: nesear; with a semi-colon", + "output": [ + [ + "Character", + "\u2928" + ] + ] + }, + { + "input": "&nesim", + "description": "Bad named entity: nesim without a semi-colon", + "output": [ + [ + "Character", + "&nesim" + ] + ] + }, + { + "input": "≂̸", + "description": "Named entity: nesim; with a semi-colon", + "output": [ + [ + "Character", + "\u2242\u0338" + ] + ] + }, + { + "input": "&nexist", + "description": "Bad named entity: nexist without a semi-colon", + "output": [ + [ + "Character", + "&nexist" + ] + ] + }, + { + "input": "∄", + "description": "Named entity: nexist; with a semi-colon", + "output": [ + [ + "Character", + "\u2204" + ] + ] + }, + { + "input": "&nexists", + "description": "Bad named entity: nexists without a semi-colon", + "output": [ + [ + "Character", + "&nexists" + ] + ] + }, + { + "input": "∄", + "description": "Named entity: nexists; with a semi-colon", + "output": [ + [ + "Character", + "\u2204" + ] + ] + }, + { + "input": "&nfr", + "description": "Bad named entity: nfr without a semi-colon", + "output": [ + [ + "Character", + "&nfr" + ] + ] + }, + { + "input": "𝔫", + "description": "Named entity: nfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd2b" + ] + ] + }, + { + "input": "&ngE", + "description": "Bad named entity: ngE without a semi-colon", + "output": [ + [ + "Character", + "&ngE" + ] + ] + }, + { + "input": "≧̸", + "description": "Named entity: ngE; with a semi-colon", + "output": [ + [ + "Character", + "\u2267\u0338" + ] + ] + }, + { + "input": "&nge", + "description": "Bad named entity: nge without a semi-colon", + "output": [ + [ + "Character", + "&nge" + ] + ] + }, + { + "input": "≱", + "description": "Named entity: nge; with a semi-colon", + "output": [ + [ + "Character", + "\u2271" + ] + ] + }, + { + "input": "&ngeq", + "description": "Bad named entity: ngeq without a semi-colon", + "output": [ + [ + "Character", + "&ngeq" + ] + ] + }, + { + "input": "≱", + "description": "Named entity: ngeq; with a semi-colon", + "output": [ + [ + "Character", + "\u2271" + ] + ] + }, + { + "input": "&ngeqq", + "description": "Bad named entity: ngeqq without a semi-colon", + "output": [ + [ + "Character", + "&ngeqq" + ] + ] + }, + { + "input": "≧̸", + "description": "Named entity: ngeqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2267\u0338" + ] + ] + }, + { + "input": "&ngeqslant", + "description": "Bad named entity: ngeqslant without a semi-colon", + "output": [ + [ + "Character", + "&ngeqslant" + ] + ] + }, + { + "input": "⩾̸", + "description": "Named entity: ngeqslant; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7e\u0338" + ] + ] + }, + { + "input": "&nges", + "description": "Bad named entity: nges without a semi-colon", + "output": [ + [ + "Character", + "&nges" + ] + ] + }, + { + "input": "⩾̸", + "description": "Named entity: nges; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7e\u0338" + ] + ] + }, + { + "input": "&ngsim", + "description": "Bad named entity: ngsim without a semi-colon", + "output": [ + [ + "Character", + "&ngsim" + ] + ] + }, + { + "input": "≵", + "description": "Named entity: ngsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2275" + ] + ] + }, + { + "input": "&ngt", + "description": "Bad named entity: ngt without a semi-colon", + "output": [ + [ + "Character", + "&ngt" + ] + ] + }, + { + "input": "≯", + "description": "Named entity: ngt; with a semi-colon", + "output": [ + [ + "Character", + "\u226f" + ] + ] + }, + { + "input": "&ngtr", + "description": "Bad named entity: ngtr without a semi-colon", + "output": [ + [ + "Character", + "&ngtr" + ] + ] + }, + { + "input": "≯", + "description": "Named entity: ngtr; with a semi-colon", + "output": [ + [ + "Character", + "\u226f" + ] + ] + }, + { + "input": "&nhArr", + "description": "Bad named entity: nhArr without a semi-colon", + "output": [ + [ + "Character", + "&nhArr" + ] + ] + }, + { + "input": "⇎", + "description": "Named entity: nhArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21ce" + ] + ] + }, + { + "input": "&nharr", + "description": "Bad named entity: nharr without a semi-colon", + "output": [ + [ + "Character", + "&nharr" + ] + ] + }, + { + "input": "↮", + "description": "Named entity: nharr; with a semi-colon", + "output": [ + [ + "Character", + "\u21ae" + ] + ] + }, + { + "input": "&nhpar", + "description": "Bad named entity: nhpar without a semi-colon", + "output": [ + [ + "Character", + "&nhpar" + ] + ] + }, + { + "input": "⫲", + "description": "Named entity: nhpar; with a semi-colon", + "output": [ + [ + "Character", + "\u2af2" + ] + ] + }, + { + "input": "&ni", + "description": "Bad named entity: ni without a semi-colon", + "output": [ + [ + "Character", + "&ni" + ] + ] + }, + { + "input": "∋", + "description": "Named entity: ni; with a semi-colon", + "output": [ + [ + "Character", + "\u220b" + ] + ] + }, + { + "input": "&nis", + "description": "Bad named entity: nis without a semi-colon", + "output": [ + [ + "Character", + "&nis" + ] + ] + }, + { + "input": "⋼", + "description": "Named entity: nis; with a semi-colon", + "output": [ + [ + "Character", + "\u22fc" + ] + ] + }, + { + "input": "&nisd", + "description": "Bad named entity: nisd without a semi-colon", + "output": [ + [ + "Character", + "&nisd" + ] + ] + }, + { + "input": "⋺", + "description": "Named entity: nisd; with a semi-colon", + "output": [ + [ + "Character", + "\u22fa" + ] + ] + }, + { + "input": "&niv", + "description": "Bad named entity: niv without a semi-colon", + "output": [ + [ + "Character", + "&niv" + ] + ] + }, + { + "input": "∋", + "description": "Named entity: niv; with a semi-colon", + "output": [ + [ + "Character", + "\u220b" + ] + ] + }, + { + "input": "&njcy", + "description": "Bad named entity: njcy without a semi-colon", + "output": [ + [ + "Character", + "&njcy" + ] + ] + }, + { + "input": "њ", + "description": "Named entity: njcy; with a semi-colon", + "output": [ + [ + "Character", + "\u045a" + ] + ] + }, + { + "input": "&nlArr", + "description": "Bad named entity: nlArr without a semi-colon", + "output": [ + [ + "Character", + "&nlArr" + ] + ] + }, + { + "input": "⇍", + "description": "Named entity: nlArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21cd" + ] + ] + }, + { + "input": "&nlE", + "description": "Bad named entity: nlE without a semi-colon", + "output": [ + [ + "Character", + "&nlE" + ] + ] + }, + { + "input": "≦̸", + "description": "Named entity: nlE; with a semi-colon", + "output": [ + [ + "Character", + "\u2266\u0338" + ] + ] + }, + { + "input": "&nlarr", + "description": "Bad named entity: nlarr without a semi-colon", + "output": [ + [ + "Character", + "&nlarr" + ] + ] + }, + { + "input": "↚", + "description": "Named entity: nlarr; with a semi-colon", + "output": [ + [ + "Character", + "\u219a" + ] + ] + }, + { + "input": "&nldr", + "description": "Bad named entity: nldr without a semi-colon", + "output": [ + [ + "Character", + "&nldr" + ] + ] + }, + { + "input": "‥", + "description": "Named entity: nldr; with a semi-colon", + "output": [ + [ + "Character", + "\u2025" + ] + ] + }, + { + "input": "&nle", + "description": "Bad named entity: nle without a semi-colon", + "output": [ + [ + "Character", + "&nle" + ] + ] + }, + { + "input": "≰", + "description": "Named entity: nle; with a semi-colon", + "output": [ + [ + "Character", + "\u2270" + ] + ] + }, + { + "input": "&nleftarrow", + "description": "Bad named entity: nleftarrow without a semi-colon", + "output": [ + [ + "Character", + "&nleftarrow" + ] + ] + }, + { + "input": "↚", + "description": "Named entity: nleftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u219a" + ] + ] + }, + { + "input": "&nleftrightarrow", + "description": "Bad named entity: nleftrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&nleftrightarrow" + ] + ] + }, + { + "input": "↮", + "description": "Named entity: nleftrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21ae" + ] + ] + }, + { + "input": "&nleq", + "description": "Bad named entity: nleq without a semi-colon", + "output": [ + [ + "Character", + "&nleq" + ] + ] + }, + { + "input": "≰", + "description": "Named entity: nleq; with a semi-colon", + "output": [ + [ + "Character", + "\u2270" + ] + ] + }, + { + "input": "&nleqq", + "description": "Bad named entity: nleqq without a semi-colon", + "output": [ + [ + "Character", + "&nleqq" + ] + ] + }, + { + "input": "≦̸", + "description": "Named entity: nleqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2266\u0338" + ] + ] + }, + { + "input": "&nleqslant", + "description": "Bad named entity: nleqslant without a semi-colon", + "output": [ + [ + "Character", + "&nleqslant" + ] + ] + }, + { + "input": "⩽̸", + "description": "Named entity: nleqslant; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7d\u0338" + ] + ] + }, + { + "input": "&nles", + "description": "Bad named entity: nles without a semi-colon", + "output": [ + [ + "Character", + "&nles" + ] + ] + }, + { + "input": "⩽̸", + "description": "Named entity: nles; with a semi-colon", + "output": [ + [ + "Character", + "\u2a7d\u0338" + ] + ] + }, + { + "input": "&nless", + "description": "Bad named entity: nless without a semi-colon", + "output": [ + [ + "Character", + "&nless" + ] + ] + }, + { + "input": "≮", + "description": "Named entity: nless; with a semi-colon", + "output": [ + [ + "Character", + "\u226e" + ] + ] + }, + { + "input": "&nlsim", + "description": "Bad named entity: nlsim without a semi-colon", + "output": [ + [ + "Character", + "&nlsim" + ] + ] + }, + { + "input": "≴", + "description": "Named entity: nlsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2274" + ] + ] + }, + { + "input": "&nlt", + "description": "Bad named entity: nlt without a semi-colon", + "output": [ + [ + "Character", + "&nlt" + ] + ] + }, + { + "input": "≮", + "description": "Named entity: nlt; with a semi-colon", + "output": [ + [ + "Character", + "\u226e" + ] + ] + }, + { + "input": "&nltri", + "description": "Bad named entity: nltri without a semi-colon", + "output": [ + [ + "Character", + "&nltri" + ] + ] + }, + { + "input": "⋪", + "description": "Named entity: nltri; with a semi-colon", + "output": [ + [ + "Character", + "\u22ea" + ] + ] + }, + { + "input": "&nltrie", + "description": "Bad named entity: nltrie without a semi-colon", + "output": [ + [ + "Character", + "&nltrie" + ] + ] + }, + { + "input": "⋬", + "description": "Named entity: nltrie; with a semi-colon", + "output": [ + [ + "Character", + "\u22ec" + ] + ] + }, + { + "input": "&nmid", + "description": "Bad named entity: nmid without a semi-colon", + "output": [ + [ + "Character", + "&nmid" + ] + ] + }, + { + "input": "∤", + "description": "Named entity: nmid; with a semi-colon", + "output": [ + [ + "Character", + "\u2224" + ] + ] + }, + { + "input": "&nopf", + "description": "Bad named entity: nopf without a semi-colon", + "output": [ + [ + "Character", + "&nopf" + ] + ] + }, + { + "input": "𝕟", + "description": "Named entity: nopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd5f" + ] + ] + }, + { + "input": "¬", + "description": "Named entity: not without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ac" + ] + ] + }, + { + "input": "¬", + "description": "Named entity: not; with a semi-colon", + "output": [ + [ + "Character", + "\u00ac" + ] + ] + }, + { + "input": "∉", + "description": "Named entity: notin; with a semi-colon", + "output": [ + [ + "Character", + "\u2209" + ] + ] + }, + { + "input": "⋹̸", + "description": "Named entity: notinE; with a semi-colon", + "output": [ + [ + "Character", + "\u22f9\u0338" + ] + ] + }, + { + "input": "⋵̸", + "description": "Named entity: notindot; with a semi-colon", + "output": [ + [ + "Character", + "\u22f5\u0338" + ] + ] + }, + { + "input": "∉", + "description": "Named entity: notinva; with a semi-colon", + "output": [ + [ + "Character", + "\u2209" + ] + ] + }, + { + "input": "⋷", + "description": "Named entity: notinvb; with a semi-colon", + "output": [ + [ + "Character", + "\u22f7" + ] + ] + }, + { + "input": "⋶", + "description": "Named entity: notinvc; with a semi-colon", + "output": [ + [ + "Character", + "\u22f6" + ] + ] + }, + { + "input": "∌", + "description": "Named entity: notni; with a semi-colon", + "output": [ + [ + "Character", + "\u220c" + ] + ] + }, + { + "input": "∌", + "description": "Named entity: notniva; with a semi-colon", + "output": [ + [ + "Character", + "\u220c" + ] + ] + }, + { + "input": "⋾", + "description": "Named entity: notnivb; with a semi-colon", + "output": [ + [ + "Character", + "\u22fe" + ] + ] + }, + { + "input": "⋽", + "description": "Named entity: notnivc; with a semi-colon", + "output": [ + [ + "Character", + "\u22fd" + ] + ] + }, + { + "input": "&npar", + "description": "Bad named entity: npar without a semi-colon", + "output": [ + [ + "Character", + "&npar" + ] + ] + }, + { + "input": "∦", + "description": "Named entity: npar; with a semi-colon", + "output": [ + [ + "Character", + "\u2226" + ] + ] + }, + { + "input": "&nparallel", + "description": "Bad named entity: nparallel without a semi-colon", + "output": [ + [ + "Character", + "&nparallel" + ] + ] + }, + { + "input": "∦", + "description": "Named entity: nparallel; with a semi-colon", + "output": [ + [ + "Character", + "\u2226" + ] + ] + }, + { + "input": "&nparsl", + "description": "Bad named entity: nparsl without a semi-colon", + "output": [ + [ + "Character", + "&nparsl" + ] + ] + }, + { + "input": "⫽⃥", + "description": "Named entity: nparsl; with a semi-colon", + "output": [ + [ + "Character", + "\u2afd\u20e5" + ] + ] + }, + { + "input": "&npart", + "description": "Bad named entity: npart without a semi-colon", + "output": [ + [ + "Character", + "&npart" + ] + ] + }, + { + "input": "∂̸", + "description": "Named entity: npart; with a semi-colon", + "output": [ + [ + "Character", + "\u2202\u0338" + ] + ] + }, + { + "input": "&npolint", + "description": "Bad named entity: npolint without a semi-colon", + "output": [ + [ + "Character", + "&npolint" + ] + ] + }, + { + "input": "⨔", + "description": "Named entity: npolint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a14" + ] + ] + }, + { + "input": "&npr", + "description": "Bad named entity: npr without a semi-colon", + "output": [ + [ + "Character", + "&npr" + ] + ] + }, + { + "input": "⊀", + "description": "Named entity: npr; with a semi-colon", + "output": [ + [ + "Character", + "\u2280" + ] + ] + }, + { + "input": "&nprcue", + "description": "Bad named entity: nprcue without a semi-colon", + "output": [ + [ + "Character", + "&nprcue" + ] + ] + }, + { + "input": "⋠", + "description": "Named entity: nprcue; with a semi-colon", + "output": [ + [ + "Character", + "\u22e0" + ] + ] + }, + { + "input": "&npre", + "description": "Bad named entity: npre without a semi-colon", + "output": [ + [ + "Character", + "&npre" + ] + ] + }, + { + "input": "⪯̸", + "description": "Named entity: npre; with a semi-colon", + "output": [ + [ + "Character", + "\u2aaf\u0338" + ] + ] + }, + { + "input": "&nprec", + "description": "Bad named entity: nprec without a semi-colon", + "output": [ + [ + "Character", + "&nprec" + ] + ] + }, + { + "input": "⊀", + "description": "Named entity: nprec; with a semi-colon", + "output": [ + [ + "Character", + "\u2280" + ] + ] + }, + { + "input": "&npreceq", + "description": "Bad named entity: npreceq without a semi-colon", + "output": [ + [ + "Character", + "&npreceq" + ] + ] + }, + { + "input": "⪯̸", + "description": "Named entity: npreceq; with a semi-colon", + "output": [ + [ + "Character", + "\u2aaf\u0338" + ] + ] + }, + { + "input": "&nrArr", + "description": "Bad named entity: nrArr without a semi-colon", + "output": [ + [ + "Character", + "&nrArr" + ] + ] + }, + { + "input": "⇏", + "description": "Named entity: nrArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21cf" + ] + ] + }, + { + "input": "&nrarr", + "description": "Bad named entity: nrarr without a semi-colon", + "output": [ + [ + "Character", + "&nrarr" + ] + ] + }, + { + "input": "↛", + "description": "Named entity: nrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u219b" + ] + ] + }, + { + "input": "&nrarrc", + "description": "Bad named entity: nrarrc without a semi-colon", + "output": [ + [ + "Character", + "&nrarrc" + ] + ] + }, + { + "input": "⤳̸", + "description": "Named entity: nrarrc; with a semi-colon", + "output": [ + [ + "Character", + "\u2933\u0338" + ] + ] + }, + { + "input": "&nrarrw", + "description": "Bad named entity: nrarrw without a semi-colon", + "output": [ + [ + "Character", + "&nrarrw" + ] + ] + }, + { + "input": "↝̸", + "description": "Named entity: nrarrw; with a semi-colon", + "output": [ + [ + "Character", + "\u219d\u0338" + ] + ] + }, + { + "input": "&nrightarrow", + "description": "Bad named entity: nrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&nrightarrow" + ] + ] + }, + { + "input": "↛", + "description": "Named entity: nrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u219b" + ] + ] + }, + { + "input": "&nrtri", + "description": "Bad named entity: nrtri without a semi-colon", + "output": [ + [ + "Character", + "&nrtri" + ] + ] + }, + { + "input": "⋫", + "description": "Named entity: nrtri; with a semi-colon", + "output": [ + [ + "Character", + "\u22eb" + ] + ] + }, + { + "input": "&nrtrie", + "description": "Bad named entity: nrtrie without a semi-colon", + "output": [ + [ + "Character", + "&nrtrie" + ] + ] + }, + { + "input": "⋭", + "description": "Named entity: nrtrie; with a semi-colon", + "output": [ + [ + "Character", + "\u22ed" + ] + ] + }, + { + "input": "&nsc", + "description": "Bad named entity: nsc without a semi-colon", + "output": [ + [ + "Character", + "&nsc" + ] + ] + }, + { + "input": "⊁", + "description": "Named entity: nsc; with a semi-colon", + "output": [ + [ + "Character", + "\u2281" + ] + ] + }, + { + "input": "&nsccue", + "description": "Bad named entity: nsccue without a semi-colon", + "output": [ + [ + "Character", + "&nsccue" + ] + ] + }, + { + "input": "⋡", + "description": "Named entity: nsccue; with a semi-colon", + "output": [ + [ + "Character", + "\u22e1" + ] + ] + }, + { + "input": "&nsce", + "description": "Bad named entity: nsce without a semi-colon", + "output": [ + [ + "Character", + "&nsce" + ] + ] + }, + { + "input": "⪰̸", + "description": "Named entity: nsce; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab0\u0338" + ] + ] + }, + { + "input": "&nscr", + "description": "Bad named entity: nscr without a semi-colon", + "output": [ + [ + "Character", + "&nscr" + ] + ] + }, + { + "input": "𝓃", + "description": "Named entity: nscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc3" + ] + ] + }, + { + "input": "&nshortmid", + "description": "Bad named entity: nshortmid without a semi-colon", + "output": [ + [ + "Character", + "&nshortmid" + ] + ] + }, + { + "input": "∤", + "description": "Named entity: nshortmid; with a semi-colon", + "output": [ + [ + "Character", + "\u2224" + ] + ] + }, + { + "input": "&nshortparallel", + "description": "Bad named entity: nshortparallel without a semi-colon", + "output": [ + [ + "Character", + "&nshortparallel" + ] + ] + }, + { + "input": "∦", + "description": "Named entity: nshortparallel; with a semi-colon", + "output": [ + [ + "Character", + "\u2226" + ] + ] + }, + { + "input": "&nsim", + "description": "Bad named entity: nsim without a semi-colon", + "output": [ + [ + "Character", + "&nsim" + ] + ] + }, + { + "input": "≁", + "description": "Named entity: nsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2241" + ] + ] + }, + { + "input": "&nsime", + "description": "Bad named entity: nsime without a semi-colon", + "output": [ + [ + "Character", + "&nsime" + ] + ] + }, + { + "input": "≄", + "description": "Named entity: nsime; with a semi-colon", + "output": [ + [ + "Character", + "\u2244" + ] + ] + }, + { + "input": "&nsimeq", + "description": "Bad named entity: nsimeq without a semi-colon", + "output": [ + [ + "Character", + "&nsimeq" + ] + ] + }, + { + "input": "≄", + "description": "Named entity: nsimeq; with a semi-colon", + "output": [ + [ + "Character", + "\u2244" + ] + ] + }, + { + "input": "&nsmid", + "description": "Bad named entity: nsmid without a semi-colon", + "output": [ + [ + "Character", + "&nsmid" + ] + ] + }, + { + "input": "∤", + "description": "Named entity: nsmid; with a semi-colon", + "output": [ + [ + "Character", + "\u2224" + ] + ] + }, + { + "input": "&nspar", + "description": "Bad named entity: nspar without a semi-colon", + "output": [ + [ + "Character", + "&nspar" + ] + ] + }, + { + "input": "∦", + "description": "Named entity: nspar; with a semi-colon", + "output": [ + [ + "Character", + "\u2226" + ] + ] + }, + { + "input": "&nsqsube", + "description": "Bad named entity: nsqsube without a semi-colon", + "output": [ + [ + "Character", + "&nsqsube" + ] + ] + }, + { + "input": "⋢", + "description": "Named entity: nsqsube; with a semi-colon", + "output": [ + [ + "Character", + "\u22e2" + ] + ] + }, + { + "input": "&nsqsupe", + "description": "Bad named entity: nsqsupe without a semi-colon", + "output": [ + [ + "Character", + "&nsqsupe" + ] + ] + }, + { + "input": "⋣", + "description": "Named entity: nsqsupe; with a semi-colon", + "output": [ + [ + "Character", + "\u22e3" + ] + ] + }, + { + "input": "&nsub", + "description": "Bad named entity: nsub without a semi-colon", + "output": [ + [ + "Character", + "&nsub" + ] + ] + }, + { + "input": "⊄", + "description": "Named entity: nsub; with a semi-colon", + "output": [ + [ + "Character", + "\u2284" + ] + ] + }, + { + "input": "&nsubE", + "description": "Bad named entity: nsubE without a semi-colon", + "output": [ + [ + "Character", + "&nsubE" + ] + ] + }, + { + "input": "⫅̸", + "description": "Named entity: nsubE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac5\u0338" + ] + ] + }, + { + "input": "&nsube", + "description": "Bad named entity: nsube without a semi-colon", + "output": [ + [ + "Character", + "&nsube" + ] + ] + }, + { + "input": "⊈", + "description": "Named entity: nsube; with a semi-colon", + "output": [ + [ + "Character", + "\u2288" + ] + ] + }, + { + "input": "&nsubset", + "description": "Bad named entity: nsubset without a semi-colon", + "output": [ + [ + "Character", + "&nsubset" + ] + ] + }, + { + "input": "⊂⃒", + "description": "Named entity: nsubset; with a semi-colon", + "output": [ + [ + "Character", + "\u2282\u20d2" + ] + ] + }, + { + "input": "&nsubseteq", + "description": "Bad named entity: nsubseteq without a semi-colon", + "output": [ + [ + "Character", + "&nsubseteq" + ] + ] + }, + { + "input": "⊈", + "description": "Named entity: nsubseteq; with a semi-colon", + "output": [ + [ + "Character", + "\u2288" + ] + ] + }, + { + "input": "&nsubseteqq", + "description": "Bad named entity: nsubseteqq without a semi-colon", + "output": [ + [ + "Character", + "&nsubseteqq" + ] + ] + }, + { + "input": "⫅̸", + "description": "Named entity: nsubseteqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac5\u0338" + ] + ] + }, + { + "input": "&nsucc", + "description": "Bad named entity: nsucc without a semi-colon", + "output": [ + [ + "Character", + "&nsucc" + ] + ] + }, + { + "input": "⊁", + "description": "Named entity: nsucc; with a semi-colon", + "output": [ + [ + "Character", + "\u2281" + ] + ] + }, + { + "input": "&nsucceq", + "description": "Bad named entity: nsucceq without a semi-colon", + "output": [ + [ + "Character", + "&nsucceq" + ] + ] + }, + { + "input": "⪰̸", + "description": "Named entity: nsucceq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab0\u0338" + ] + ] + }, + { + "input": "&nsup", + "description": "Bad named entity: nsup without a semi-colon", + "output": [ + [ + "Character", + "&nsup" + ] + ] + }, + { + "input": "⊅", + "description": "Named entity: nsup; with a semi-colon", + "output": [ + [ + "Character", + "\u2285" + ] + ] + }, + { + "input": "&nsupE", + "description": "Bad named entity: nsupE without a semi-colon", + "output": [ + [ + "Character", + "&nsupE" + ] + ] + }, + { + "input": "⫆̸", + "description": "Named entity: nsupE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac6\u0338" + ] + ] + }, + { + "input": "&nsupe", + "description": "Bad named entity: nsupe without a semi-colon", + "output": [ + [ + "Character", + "&nsupe" + ] + ] + }, + { + "input": "⊉", + "description": "Named entity: nsupe; with a semi-colon", + "output": [ + [ + "Character", + "\u2289" + ] + ] + }, + { + "input": "&nsupset", + "description": "Bad named entity: nsupset without a semi-colon", + "output": [ + [ + "Character", + "&nsupset" + ] + ] + }, + { + "input": "⊃⃒", + "description": "Named entity: nsupset; with a semi-colon", + "output": [ + [ + "Character", + "\u2283\u20d2" + ] + ] + }, + { + "input": "&nsupseteq", + "description": "Bad named entity: nsupseteq without a semi-colon", + "output": [ + [ + "Character", + "&nsupseteq" + ] + ] + }, + { + "input": "⊉", + "description": "Named entity: nsupseteq; with a semi-colon", + "output": [ + [ + "Character", + "\u2289" + ] + ] + }, + { + "input": "&nsupseteqq", + "description": "Bad named entity: nsupseteqq without a semi-colon", + "output": [ + [ + "Character", + "&nsupseteqq" + ] + ] + }, + { + "input": "⫆̸", + "description": "Named entity: nsupseteqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac6\u0338" + ] + ] + }, + { + "input": "&ntgl", + "description": "Bad named entity: ntgl without a semi-colon", + "output": [ + [ + "Character", + "&ntgl" + ] + ] + }, + { + "input": "≹", + "description": "Named entity: ntgl; with a semi-colon", + "output": [ + [ + "Character", + "\u2279" + ] + ] + }, + { + "input": "ñ", + "description": "Named entity: ntilde without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f1" + ] + ] + }, + { + "input": "ñ", + "description": "Named entity: ntilde; with a semi-colon", + "output": [ + [ + "Character", + "\u00f1" + ] + ] + }, + { + "input": "&ntlg", + "description": "Bad named entity: ntlg without a semi-colon", + "output": [ + [ + "Character", + "&ntlg" + ] + ] + }, + { + "input": "≸", + "description": "Named entity: ntlg; with a semi-colon", + "output": [ + [ + "Character", + "\u2278" + ] + ] + }, + { + "input": "&ntriangleleft", + "description": "Bad named entity: ntriangleleft without a semi-colon", + "output": [ + [ + "Character", + "&ntriangleleft" + ] + ] + }, + { + "input": "⋪", + "description": "Named entity: ntriangleleft; with a semi-colon", + "output": [ + [ + "Character", + "\u22ea" + ] + ] + }, + { + "input": "&ntrianglelefteq", + "description": "Bad named entity: ntrianglelefteq without a semi-colon", + "output": [ + [ + "Character", + "&ntrianglelefteq" + ] + ] + }, + { + "input": "⋬", + "description": "Named entity: ntrianglelefteq; with a semi-colon", + "output": [ + [ + "Character", + "\u22ec" + ] + ] + }, + { + "input": "&ntriangleright", + "description": "Bad named entity: ntriangleright without a semi-colon", + "output": [ + [ + "Character", + "&ntriangleright" + ] + ] + }, + { + "input": "⋫", + "description": "Named entity: ntriangleright; with a semi-colon", + "output": [ + [ + "Character", + "\u22eb" + ] + ] + }, + { + "input": "&ntrianglerighteq", + "description": "Bad named entity: ntrianglerighteq without a semi-colon", + "output": [ + [ + "Character", + "&ntrianglerighteq" + ] + ] + }, + { + "input": "⋭", + "description": "Named entity: ntrianglerighteq; with a semi-colon", + "output": [ + [ + "Character", + "\u22ed" + ] + ] + }, + { + "input": "&nu", + "description": "Bad named entity: nu without a semi-colon", + "output": [ + [ + "Character", + "&nu" + ] + ] + }, + { + "input": "ν", + "description": "Named entity: nu; with a semi-colon", + "output": [ + [ + "Character", + "\u03bd" + ] + ] + }, + { + "input": "&num", + "description": "Bad named entity: num without a semi-colon", + "output": [ + [ + "Character", + "&num" + ] + ] + }, + { + "input": "#", + "description": "Named entity: num; with a semi-colon", + "output": [ + [ + "Character", + "#" + ] + ] + }, + { + "input": "&numero", + "description": "Bad named entity: numero without a semi-colon", + "output": [ + [ + "Character", + "&numero" + ] + ] + }, + { + "input": "№", + "description": "Named entity: numero; with a semi-colon", + "output": [ + [ + "Character", + "\u2116" + ] + ] + }, + { + "input": "&numsp", + "description": "Bad named entity: numsp without a semi-colon", + "output": [ + [ + "Character", + "&numsp" + ] + ] + }, + { + "input": " ", + "description": "Named entity: numsp; with a semi-colon", + "output": [ + [ + "Character", + "\u2007" + ] + ] + }, + { + "input": "&nvDash", + "description": "Bad named entity: nvDash without a semi-colon", + "output": [ + [ + "Character", + "&nvDash" + ] + ] + }, + { + "input": "⊭", + "description": "Named entity: nvDash; with a semi-colon", + "output": [ + [ + "Character", + "\u22ad" + ] + ] + }, + { + "input": "&nvHarr", + "description": "Bad named entity: nvHarr without a semi-colon", + "output": [ + [ + "Character", + "&nvHarr" + ] + ] + }, + { + "input": "⤄", + "description": "Named entity: nvHarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2904" + ] + ] + }, + { + "input": "&nvap", + "description": "Bad named entity: nvap without a semi-colon", + "output": [ + [ + "Character", + "&nvap" + ] + ] + }, + { + "input": "≍⃒", + "description": "Named entity: nvap; with a semi-colon", + "output": [ + [ + "Character", + "\u224d\u20d2" + ] + ] + }, + { + "input": "&nvdash", + "description": "Bad named entity: nvdash without a semi-colon", + "output": [ + [ + "Character", + "&nvdash" + ] + ] + }, + { + "input": "⊬", + "description": "Named entity: nvdash; with a semi-colon", + "output": [ + [ + "Character", + "\u22ac" + ] + ] + }, + { + "input": "&nvge", + "description": "Bad named entity: nvge without a semi-colon", + "output": [ + [ + "Character", + "&nvge" + ] + ] + }, + { + "input": "≥⃒", + "description": "Named entity: nvge; with a semi-colon", + "output": [ + [ + "Character", + "\u2265\u20d2" + ] + ] + }, + { + "input": "&nvgt", + "description": "Bad named entity: nvgt without a semi-colon", + "output": [ + [ + "Character", + "&nvgt" + ] + ] + }, + { + "input": ">⃒", + "description": "Named entity: nvgt; with a semi-colon", + "output": [ + [ + "Character", + ">\u20d2" + ] + ] + }, + { + "input": "&nvinfin", + "description": "Bad named entity: nvinfin without a semi-colon", + "output": [ + [ + "Character", + "&nvinfin" + ] + ] + }, + { + "input": "⧞", + "description": "Named entity: nvinfin; with a semi-colon", + "output": [ + [ + "Character", + "\u29de" + ] + ] + }, + { + "input": "&nvlArr", + "description": "Bad named entity: nvlArr without a semi-colon", + "output": [ + [ + "Character", + "&nvlArr" + ] + ] + }, + { + "input": "⤂", + "description": "Named entity: nvlArr; with a semi-colon", + "output": [ + [ + "Character", + "\u2902" + ] + ] + }, + { + "input": "&nvle", + "description": "Bad named entity: nvle without a semi-colon", + "output": [ + [ + "Character", + "&nvle" + ] + ] + }, + { + "input": "≤⃒", + "description": "Named entity: nvle; with a semi-colon", + "output": [ + [ + "Character", + "\u2264\u20d2" + ] + ] + }, + { + "input": "&nvlt", + "description": "Bad named entity: nvlt without a semi-colon", + "output": [ + [ + "Character", + "&nvlt" + ] + ] + }, + { + "input": "<⃒", + "description": "Named entity: nvlt; with a semi-colon", + "output": [ + [ + "Character", + "<\u20d2" + ] + ] + }, + { + "input": "&nvltrie", + "description": "Bad named entity: nvltrie without a semi-colon", + "output": [ + [ + "Character", + "&nvltrie" + ] + ] + }, + { + "input": "⊴⃒", + "description": "Named entity: nvltrie; with a semi-colon", + "output": [ + [ + "Character", + "\u22b4\u20d2" + ] + ] + }, + { + "input": "&nvrArr", + "description": "Bad named entity: nvrArr without a semi-colon", + "output": [ + [ + "Character", + "&nvrArr" + ] + ] + }, + { + "input": "⤃", + "description": "Named entity: nvrArr; with a semi-colon", + "output": [ + [ + "Character", + "\u2903" + ] + ] + }, + { + "input": "&nvrtrie", + "description": "Bad named entity: nvrtrie without a semi-colon", + "output": [ + [ + "Character", + "&nvrtrie" + ] + ] + }, + { + "input": "⊵⃒", + "description": "Named entity: nvrtrie; with a semi-colon", + "output": [ + [ + "Character", + "\u22b5\u20d2" + ] + ] + }, + { + "input": "&nvsim", + "description": "Bad named entity: nvsim without a semi-colon", + "output": [ + [ + "Character", + "&nvsim" + ] + ] + }, + { + "input": "∼⃒", + "description": "Named entity: nvsim; with a semi-colon", + "output": [ + [ + "Character", + "\u223c\u20d2" + ] + ] + }, + { + "input": "&nwArr", + "description": "Bad named entity: nwArr without a semi-colon", + "output": [ + [ + "Character", + "&nwArr" + ] + ] + }, + { + "input": "⇖", + "description": "Named entity: nwArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d6" + ] + ] + }, + { + "input": "&nwarhk", + "description": "Bad named entity: nwarhk without a semi-colon", + "output": [ + [ + "Character", + "&nwarhk" + ] + ] + }, + { + "input": "⤣", + "description": "Named entity: nwarhk; with a semi-colon", + "output": [ + [ + "Character", + "\u2923" + ] + ] + }, + { + "input": "&nwarr", + "description": "Bad named entity: nwarr without a semi-colon", + "output": [ + [ + "Character", + "&nwarr" + ] + ] + }, + { + "input": "↖", + "description": "Named entity: nwarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2196" + ] + ] + }, + { + "input": "&nwarrow", + "description": "Bad named entity: nwarrow without a semi-colon", + "output": [ + [ + "Character", + "&nwarrow" + ] + ] + }, + { + "input": "↖", + "description": "Named entity: nwarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2196" + ] + ] + }, + { + "input": "&nwnear", + "description": "Bad named entity: nwnear without a semi-colon", + "output": [ + [ + "Character", + "&nwnear" + ] + ] + }, + { + "input": "⤧", + "description": "Named entity: nwnear; with a semi-colon", + "output": [ + [ + "Character", + "\u2927" + ] + ] + }, + { + "input": "&oS", + "description": "Bad named entity: oS without a semi-colon", + "output": [ + [ + "Character", + "&oS" + ] + ] + }, + { + "input": "Ⓢ", + "description": "Named entity: oS; with a semi-colon", + "output": [ + [ + "Character", + "\u24c8" + ] + ] + }, + { + "input": "ó", + "description": "Named entity: oacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f3" + ] + ] + }, + { + "input": "ó", + "description": "Named entity: oacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00f3" + ] + ] + }, + { + "input": "&oast", + "description": "Bad named entity: oast without a semi-colon", + "output": [ + [ + "Character", + "&oast" + ] + ] + }, + { + "input": "⊛", + "description": "Named entity: oast; with a semi-colon", + "output": [ + [ + "Character", + "\u229b" + ] + ] + }, + { + "input": "&ocir", + "description": "Bad named entity: ocir without a semi-colon", + "output": [ + [ + "Character", + "&ocir" + ] + ] + }, + { + "input": "⊚", + "description": "Named entity: ocir; with a semi-colon", + "output": [ + [ + "Character", + "\u229a" + ] + ] + }, + { + "input": "ô", + "description": "Named entity: ocirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f4" + ] + ] + }, + { + "input": "ô", + "description": "Named entity: ocirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00f4" + ] + ] + }, + { + "input": "&ocy", + "description": "Bad named entity: ocy without a semi-colon", + "output": [ + [ + "Character", + "&ocy" + ] + ] + }, + { + "input": "о", + "description": "Named entity: ocy; with a semi-colon", + "output": [ + [ + "Character", + "\u043e" + ] + ] + }, + { + "input": "&odash", + "description": "Bad named entity: odash without a semi-colon", + "output": [ + [ + "Character", + "&odash" + ] + ] + }, + { + "input": "⊝", + "description": "Named entity: odash; with a semi-colon", + "output": [ + [ + "Character", + "\u229d" + ] + ] + }, + { + "input": "&odblac", + "description": "Bad named entity: odblac without a semi-colon", + "output": [ + [ + "Character", + "&odblac" + ] + ] + }, + { + "input": "ő", + "description": "Named entity: odblac; with a semi-colon", + "output": [ + [ + "Character", + "\u0151" + ] + ] + }, + { + "input": "&odiv", + "description": "Bad named entity: odiv without a semi-colon", + "output": [ + [ + "Character", + "&odiv" + ] + ] + }, + { + "input": "⨸", + "description": "Named entity: odiv; with a semi-colon", + "output": [ + [ + "Character", + "\u2a38" + ] + ] + }, + { + "input": "&odot", + "description": "Bad named entity: odot without a semi-colon", + "output": [ + [ + "Character", + "&odot" + ] + ] + }, + { + "input": "⊙", + "description": "Named entity: odot; with a semi-colon", + "output": [ + [ + "Character", + "\u2299" + ] + ] + }, + { + "input": "&odsold", + "description": "Bad named entity: odsold without a semi-colon", + "output": [ + [ + "Character", + "&odsold" + ] + ] + }, + { + "input": "⦼", + "description": "Named entity: odsold; with a semi-colon", + "output": [ + [ + "Character", + "\u29bc" + ] + ] + }, + { + "input": "&oelig", + "description": "Bad named entity: oelig without a semi-colon", + "output": [ + [ + "Character", + "&oelig" + ] + ] + }, + { + "input": "œ", + "description": "Named entity: oelig; with a semi-colon", + "output": [ + [ + "Character", + "\u0153" + ] + ] + }, + { + "input": "&ofcir", + "description": "Bad named entity: ofcir without a semi-colon", + "output": [ + [ + "Character", + "&ofcir" + ] + ] + }, + { + "input": "⦿", + "description": "Named entity: ofcir; with a semi-colon", + "output": [ + [ + "Character", + "\u29bf" + ] + ] + }, + { + "input": "&ofr", + "description": "Bad named entity: ofr without a semi-colon", + "output": [ + [ + "Character", + "&ofr" + ] + ] + }, + { + "input": "𝔬", + "description": "Named entity: ofr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd2c" + ] + ] + }, + { + "input": "&ogon", + "description": "Bad named entity: ogon without a semi-colon", + "output": [ + [ + "Character", + "&ogon" + ] + ] + }, + { + "input": "˛", + "description": "Named entity: ogon; with a semi-colon", + "output": [ + [ + "Character", + "\u02db" + ] + ] + }, + { + "input": "ò", + "description": "Named entity: ograve without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f2" + ] + ] + }, + { + "input": "ò", + "description": "Named entity: ograve; with a semi-colon", + "output": [ + [ + "Character", + "\u00f2" + ] + ] + }, + { + "input": "&ogt", + "description": "Bad named entity: ogt without a semi-colon", + "output": [ + [ + "Character", + "&ogt" + ] + ] + }, + { + "input": "⧁", + "description": "Named entity: ogt; with a semi-colon", + "output": [ + [ + "Character", + "\u29c1" + ] + ] + }, + { + "input": "&ohbar", + "description": "Bad named entity: ohbar without a semi-colon", + "output": [ + [ + "Character", + "&ohbar" + ] + ] + }, + { + "input": "⦵", + "description": "Named entity: ohbar; with a semi-colon", + "output": [ + [ + "Character", + "\u29b5" + ] + ] + }, + { + "input": "&ohm", + "description": "Bad named entity: ohm without a semi-colon", + "output": [ + [ + "Character", + "&ohm" + ] + ] + }, + { + "input": "Ω", + "description": "Named entity: ohm; with a semi-colon", + "output": [ + [ + "Character", + "\u03a9" + ] + ] + }, + { + "input": "&oint", + "description": "Bad named entity: oint without a semi-colon", + "output": [ + [ + "Character", + "&oint" + ] + ] + }, + { + "input": "∮", + "description": "Named entity: oint; with a semi-colon", + "output": [ + [ + "Character", + "\u222e" + ] + ] + }, + { + "input": "&olarr", + "description": "Bad named entity: olarr without a semi-colon", + "output": [ + [ + "Character", + "&olarr" + ] + ] + }, + { + "input": "↺", + "description": "Named entity: olarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21ba" + ] + ] + }, + { + "input": "&olcir", + "description": "Bad named entity: olcir without a semi-colon", + "output": [ + [ + "Character", + "&olcir" + ] + ] + }, + { + "input": "⦾", + "description": "Named entity: olcir; with a semi-colon", + "output": [ + [ + "Character", + "\u29be" + ] + ] + }, + { + "input": "&olcross", + "description": "Bad named entity: olcross without a semi-colon", + "output": [ + [ + "Character", + "&olcross" + ] + ] + }, + { + "input": "⦻", + "description": "Named entity: olcross; with a semi-colon", + "output": [ + [ + "Character", + "\u29bb" + ] + ] + }, + { + "input": "&oline", + "description": "Bad named entity: oline without a semi-colon", + "output": [ + [ + "Character", + "&oline" + ] + ] + }, + { + "input": "‾", + "description": "Named entity: oline; with a semi-colon", + "output": [ + [ + "Character", + "\u203e" + ] + ] + }, + { + "input": "&olt", + "description": "Bad named entity: olt without a semi-colon", + "output": [ + [ + "Character", + "&olt" + ] + ] + }, + { + "input": "⧀", + "description": "Named entity: olt; with a semi-colon", + "output": [ + [ + "Character", + "\u29c0" + ] + ] + }, + { + "input": "&omacr", + "description": "Bad named entity: omacr without a semi-colon", + "output": [ + [ + "Character", + "&omacr" + ] + ] + }, + { + "input": "ō", + "description": "Named entity: omacr; with a semi-colon", + "output": [ + [ + "Character", + "\u014d" + ] + ] + }, + { + "input": "&omega", + "description": "Bad named entity: omega without a semi-colon", + "output": [ + [ + "Character", + "&omega" + ] + ] + }, + { + "input": "ω", + "description": "Named entity: omega; with a semi-colon", + "output": [ + [ + "Character", + "\u03c9" + ] + ] + }, + { + "input": "&omicron", + "description": "Bad named entity: omicron without a semi-colon", + "output": [ + [ + "Character", + "&omicron" + ] + ] + }, + { + "input": "ο", + "description": "Named entity: omicron; with a semi-colon", + "output": [ + [ + "Character", + "\u03bf" + ] + ] + }, + { + "input": "&omid", + "description": "Bad named entity: omid without a semi-colon", + "output": [ + [ + "Character", + "&omid" + ] + ] + }, + { + "input": "⦶", + "description": "Named entity: omid; with a semi-colon", + "output": [ + [ + "Character", + "\u29b6" + ] + ] + }, + { + "input": "&ominus", + "description": "Bad named entity: ominus without a semi-colon", + "output": [ + [ + "Character", + "&ominus" + ] + ] + }, + { + "input": "⊖", + "description": "Named entity: ominus; with a semi-colon", + "output": [ + [ + "Character", + "\u2296" + ] + ] + }, + { + "input": "&oopf", + "description": "Bad named entity: oopf without a semi-colon", + "output": [ + [ + "Character", + "&oopf" + ] + ] + }, + { + "input": "𝕠", + "description": "Named entity: oopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd60" + ] + ] + }, + { + "input": "&opar", + "description": "Bad named entity: opar without a semi-colon", + "output": [ + [ + "Character", + "&opar" + ] + ] + }, + { + "input": "⦷", + "description": "Named entity: opar; with a semi-colon", + "output": [ + [ + "Character", + "\u29b7" + ] + ] + }, + { + "input": "&operp", + "description": "Bad named entity: operp without a semi-colon", + "output": [ + [ + "Character", + "&operp" + ] + ] + }, + { + "input": "⦹", + "description": "Named entity: operp; with a semi-colon", + "output": [ + [ + "Character", + "\u29b9" + ] + ] + }, + { + "input": "&oplus", + "description": "Bad named entity: oplus without a semi-colon", + "output": [ + [ + "Character", + "&oplus" + ] + ] + }, + { + "input": "⊕", + "description": "Named entity: oplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2295" + ] + ] + }, + { + "input": "&or", + "description": "Bad named entity: or without a semi-colon", + "output": [ + [ + "Character", + "&or" + ] + ] + }, + { + "input": "∨", + "description": "Named entity: or; with a semi-colon", + "output": [ + [ + "Character", + "\u2228" + ] + ] + }, + { + "input": "&orarr", + "description": "Bad named entity: orarr without a semi-colon", + "output": [ + [ + "Character", + "&orarr" + ] + ] + }, + { + "input": "↻", + "description": "Named entity: orarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21bb" + ] + ] + }, + { + "input": "&ord", + "description": "Bad named entity: ord without a semi-colon", + "output": [ + [ + "Character", + "&ord" + ] + ] + }, + { + "input": "⩝", + "description": "Named entity: ord; with a semi-colon", + "output": [ + [ + "Character", + "\u2a5d" + ] + ] + }, + { + "input": "&order", + "description": "Bad named entity: order without a semi-colon", + "output": [ + [ + "Character", + "&order" + ] + ] + }, + { + "input": "ℴ", + "description": "Named entity: order; with a semi-colon", + "output": [ + [ + "Character", + "\u2134" + ] + ] + }, + { + "input": "&orderof", + "description": "Bad named entity: orderof without a semi-colon", + "output": [ + [ + "Character", + "&orderof" + ] + ] + }, + { + "input": "ℴ", + "description": "Named entity: orderof; with a semi-colon", + "output": [ + [ + "Character", + "\u2134" + ] + ] + }, + { + "input": "ª", + "description": "Named entity: ordf without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00aa" + ] + ] + }, + { + "input": "ª", + "description": "Named entity: ordf; with a semi-colon", + "output": [ + [ + "Character", + "\u00aa" + ] + ] + }, + { + "input": "º", + "description": "Named entity: ordm without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ba" + ] + ] + }, + { + "input": "º", + "description": "Named entity: ordm; with a semi-colon", + "output": [ + [ + "Character", + "\u00ba" + ] + ] + }, + { + "input": "&origof", + "description": "Bad named entity: origof without a semi-colon", + "output": [ + [ + "Character", + "&origof" + ] + ] + }, + { + "input": "⊶", + "description": "Named entity: origof; with a semi-colon", + "output": [ + [ + "Character", + "\u22b6" + ] + ] + }, + { + "input": "&oror", + "description": "Bad named entity: oror without a semi-colon", + "output": [ + [ + "Character", + "&oror" + ] + ] + }, + { + "input": "⩖", + "description": "Named entity: oror; with a semi-colon", + "output": [ + [ + "Character", + "\u2a56" + ] + ] + }, + { + "input": "&orslope", + "description": "Bad named entity: orslope without a semi-colon", + "output": [ + [ + "Character", + "&orslope" + ] + ] + }, + { + "input": "⩗", + "description": "Named entity: orslope; with a semi-colon", + "output": [ + [ + "Character", + "\u2a57" + ] + ] + }, + { + "input": "&orv", + "description": "Bad named entity: orv without a semi-colon", + "output": [ + [ + "Character", + "&orv" + ] + ] + }, + { + "input": "⩛", + "description": "Named entity: orv; with a semi-colon", + "output": [ + [ + "Character", + "\u2a5b" + ] + ] + }, + { + "input": "&oscr", + "description": "Bad named entity: oscr without a semi-colon", + "output": [ + [ + "Character", + "&oscr" + ] + ] + }, + { + "input": "ℴ", + "description": "Named entity: oscr; with a semi-colon", + "output": [ + [ + "Character", + "\u2134" + ] + ] + }, + { + "input": "ø", + "description": "Named entity: oslash without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f8" + ] + ] + }, + { + "input": "ø", + "description": "Named entity: oslash; with a semi-colon", + "output": [ + [ + "Character", + "\u00f8" + ] + ] + }, + { + "input": "&osol", + "description": "Bad named entity: osol without a semi-colon", + "output": [ + [ + "Character", + "&osol" + ] + ] + }, + { + "input": "⊘", + "description": "Named entity: osol; with a semi-colon", + "output": [ + [ + "Character", + "\u2298" + ] + ] + }, + { + "input": "õ", + "description": "Named entity: otilde without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f5" + ] + ] + }, + { + "input": "õ", + "description": "Named entity: otilde; with a semi-colon", + "output": [ + [ + "Character", + "\u00f5" + ] + ] + }, + { + "input": "&otimes", + "description": "Bad named entity: otimes without a semi-colon", + "output": [ + [ + "Character", + "&otimes" + ] + ] + }, + { + "input": "⊗", + "description": "Named entity: otimes; with a semi-colon", + "output": [ + [ + "Character", + "\u2297" + ] + ] + }, + { + "input": "&otimesas", + "description": "Bad named entity: otimesas without a semi-colon", + "output": [ + [ + "Character", + "&otimesas" + ] + ] + }, + { + "input": "⨶", + "description": "Named entity: otimesas; with a semi-colon", + "output": [ + [ + "Character", + "\u2a36" + ] + ] + }, + { + "input": "ö", + "description": "Named entity: ouml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f6" + ] + ] + }, + { + "input": "ö", + "description": "Named entity: ouml; with a semi-colon", + "output": [ + [ + "Character", + "\u00f6" + ] + ] + }, + { + "input": "&ovbar", + "description": "Bad named entity: ovbar without a semi-colon", + "output": [ + [ + "Character", + "&ovbar" + ] + ] + }, + { + "input": "⌽", + "description": "Named entity: ovbar; with a semi-colon", + "output": [ + [ + "Character", + "\u233d" + ] + ] + }, + { + "input": "&par", + "description": "Bad named entity: par without a semi-colon", + "output": [ + [ + "Character", + "&par" + ] + ] + }, + { + "input": "∥", + "description": "Named entity: par; with a semi-colon", + "output": [ + [ + "Character", + "\u2225" + ] + ] + }, + { + "input": "¶", + "description": "Named entity: para without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b6" + ] + ] + }, + { + "input": "¶", + "description": "Named entity: para; with a semi-colon", + "output": [ + [ + "Character", + "\u00b6" + ] + ] + }, + { + "input": "∥", + "description": "Named entity: parallel; with a semi-colon", + "output": [ + [ + "Character", + "\u2225" + ] + ] + }, + { + "input": "&parsim", + "description": "Bad named entity: parsim without a semi-colon", + "output": [ + [ + "Character", + "&parsim" + ] + ] + }, + { + "input": "⫳", + "description": "Named entity: parsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2af3" + ] + ] + }, + { + "input": "&parsl", + "description": "Bad named entity: parsl without a semi-colon", + "output": [ + [ + "Character", + "&parsl" + ] + ] + }, + { + "input": "⫽", + "description": "Named entity: parsl; with a semi-colon", + "output": [ + [ + "Character", + "\u2afd" + ] + ] + }, + { + "input": "&part", + "description": "Bad named entity: part without a semi-colon", + "output": [ + [ + "Character", + "&part" + ] + ] + }, + { + "input": "∂", + "description": "Named entity: part; with a semi-colon", + "output": [ + [ + "Character", + "\u2202" + ] + ] + }, + { + "input": "&pcy", + "description": "Bad named entity: pcy without a semi-colon", + "output": [ + [ + "Character", + "&pcy" + ] + ] + }, + { + "input": "п", + "description": "Named entity: pcy; with a semi-colon", + "output": [ + [ + "Character", + "\u043f" + ] + ] + }, + { + "input": "&percnt", + "description": "Bad named entity: percnt without a semi-colon", + "output": [ + [ + "Character", + "&percnt" + ] + ] + }, + { + "input": "%", + "description": "Named entity: percnt; with a semi-colon", + "output": [ + [ + "Character", + "%" + ] + ] + }, + { + "input": "&period", + "description": "Bad named entity: period without a semi-colon", + "output": [ + [ + "Character", + "&period" + ] + ] + }, + { + "input": ".", + "description": "Named entity: period; with a semi-colon", + "output": [ + [ + "Character", + "." + ] + ] + }, + { + "input": "&permil", + "description": "Bad named entity: permil without a semi-colon", + "output": [ + [ + "Character", + "&permil" + ] + ] + }, + { + "input": "‰", + "description": "Named entity: permil; with a semi-colon", + "output": [ + [ + "Character", + "\u2030" + ] + ] + }, + { + "input": "&perp", + "description": "Bad named entity: perp without a semi-colon", + "output": [ + [ + "Character", + "&perp" + ] + ] + }, + { + "input": "⊥", + "description": "Named entity: perp; with a semi-colon", + "output": [ + [ + "Character", + "\u22a5" + ] + ] + }, + { + "input": "&pertenk", + "description": "Bad named entity: pertenk without a semi-colon", + "output": [ + [ + "Character", + "&pertenk" + ] + ] + }, + { + "input": "‱", + "description": "Named entity: pertenk; with a semi-colon", + "output": [ + [ + "Character", + "\u2031" + ] + ] + }, + { + "input": "&pfr", + "description": "Bad named entity: pfr without a semi-colon", + "output": [ + [ + "Character", + "&pfr" + ] + ] + }, + { + "input": "𝔭", + "description": "Named entity: pfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd2d" + ] + ] + }, + { + "input": "&phi", + "description": "Bad named entity: phi without a semi-colon", + "output": [ + [ + "Character", + "&phi" + ] + ] + }, + { + "input": "φ", + "description": "Named entity: phi; with a semi-colon", + "output": [ + [ + "Character", + "\u03c6" + ] + ] + }, + { + "input": "&phiv", + "description": "Bad named entity: phiv without a semi-colon", + "output": [ + [ + "Character", + "&phiv" + ] + ] + }, + { + "input": "ϕ", + "description": "Named entity: phiv; with a semi-colon", + "output": [ + [ + "Character", + "\u03d5" + ] + ] + }, + { + "input": "&phmmat", + "description": "Bad named entity: phmmat without a semi-colon", + "output": [ + [ + "Character", + "&phmmat" + ] + ] + }, + { + "input": "ℳ", + "description": "Named entity: phmmat; with a semi-colon", + "output": [ + [ + "Character", + "\u2133" + ] + ] + }, + { + "input": "&phone", + "description": "Bad named entity: phone without a semi-colon", + "output": [ + [ + "Character", + "&phone" + ] + ] + }, + { + "input": "☎", + "description": "Named entity: phone; with a semi-colon", + "output": [ + [ + "Character", + "\u260e" + ] + ] + }, + { + "input": "&pi", + "description": "Bad named entity: pi without a semi-colon", + "output": [ + [ + "Character", + "&pi" + ] + ] + }, + { + "input": "π", + "description": "Named entity: pi; with a semi-colon", + "output": [ + [ + "Character", + "\u03c0" + ] + ] + }, + { + "input": "&pitchfork", + "description": "Bad named entity: pitchfork without a semi-colon", + "output": [ + [ + "Character", + "&pitchfork" + ] + ] + }, + { + "input": "⋔", + "description": "Named entity: pitchfork; with a semi-colon", + "output": [ + [ + "Character", + "\u22d4" + ] + ] + }, + { + "input": "&piv", + "description": "Bad named entity: piv without a semi-colon", + "output": [ + [ + "Character", + "&piv" + ] + ] + }, + { + "input": "ϖ", + "description": "Named entity: piv; with a semi-colon", + "output": [ + [ + "Character", + "\u03d6" + ] + ] + }, + { + "input": "&planck", + "description": "Bad named entity: planck without a semi-colon", + "output": [ + [ + "Character", + "&planck" + ] + ] + }, + { + "input": "ℏ", + "description": "Named entity: planck; with a semi-colon", + "output": [ + [ + "Character", + "\u210f" + ] + ] + }, + { + "input": "&planckh", + "description": "Bad named entity: planckh without a semi-colon", + "output": [ + [ + "Character", + "&planckh" + ] + ] + }, + { + "input": "ℎ", + "description": "Named entity: planckh; with a semi-colon", + "output": [ + [ + "Character", + "\u210e" + ] + ] + }, + { + "input": "&plankv", + "description": "Bad named entity: plankv without a semi-colon", + "output": [ + [ + "Character", + "&plankv" + ] + ] + }, + { + "input": "ℏ", + "description": "Named entity: plankv; with a semi-colon", + "output": [ + [ + "Character", + "\u210f" + ] + ] + }, + { + "input": "&plus", + "description": "Bad named entity: plus without a semi-colon", + "output": [ + [ + "Character", + "&plus" + ] + ] + }, + { + "input": "+", + "description": "Named entity: plus; with a semi-colon", + "output": [ + [ + "Character", + "+" + ] + ] + }, + { + "input": "&plusacir", + "description": "Bad named entity: plusacir without a semi-colon", + "output": [ + [ + "Character", + "&plusacir" + ] + ] + }, + { + "input": "⨣", + "description": "Named entity: plusacir; with a semi-colon", + "output": [ + [ + "Character", + "\u2a23" + ] + ] + }, + { + "input": "&plusb", + "description": "Bad named entity: plusb without a semi-colon", + "output": [ + [ + "Character", + "&plusb" + ] + ] + }, + { + "input": "⊞", + "description": "Named entity: plusb; with a semi-colon", + "output": [ + [ + "Character", + "\u229e" + ] + ] + }, + { + "input": "&pluscir", + "description": "Bad named entity: pluscir without a semi-colon", + "output": [ + [ + "Character", + "&pluscir" + ] + ] + }, + { + "input": "⨢", + "description": "Named entity: pluscir; with a semi-colon", + "output": [ + [ + "Character", + "\u2a22" + ] + ] + }, + { + "input": "&plusdo", + "description": "Bad named entity: plusdo without a semi-colon", + "output": [ + [ + "Character", + "&plusdo" + ] + ] + }, + { + "input": "∔", + "description": "Named entity: plusdo; with a semi-colon", + "output": [ + [ + "Character", + "\u2214" + ] + ] + }, + { + "input": "&plusdu", + "description": "Bad named entity: plusdu without a semi-colon", + "output": [ + [ + "Character", + "&plusdu" + ] + ] + }, + { + "input": "⨥", + "description": "Named entity: plusdu; with a semi-colon", + "output": [ + [ + "Character", + "\u2a25" + ] + ] + }, + { + "input": "&pluse", + "description": "Bad named entity: pluse without a semi-colon", + "output": [ + [ + "Character", + "&pluse" + ] + ] + }, + { + "input": "⩲", + "description": "Named entity: pluse; with a semi-colon", + "output": [ + [ + "Character", + "\u2a72" + ] + ] + }, + { + "input": "±", + "description": "Named entity: plusmn without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b1" + ] + ] + }, + { + "input": "±", + "description": "Named entity: plusmn; with a semi-colon", + "output": [ + [ + "Character", + "\u00b1" + ] + ] + }, + { + "input": "&plussim", + "description": "Bad named entity: plussim without a semi-colon", + "output": [ + [ + "Character", + "&plussim" + ] + ] + }, + { + "input": "⨦", + "description": "Named entity: plussim; with a semi-colon", + "output": [ + [ + "Character", + "\u2a26" + ] + ] + }, + { + "input": "&plustwo", + "description": "Bad named entity: plustwo without a semi-colon", + "output": [ + [ + "Character", + "&plustwo" + ] + ] + }, + { + "input": "⨧", + "description": "Named entity: plustwo; with a semi-colon", + "output": [ + [ + "Character", + "\u2a27" + ] + ] + }, + { + "input": "&pm", + "description": "Bad named entity: pm without a semi-colon", + "output": [ + [ + "Character", + "&pm" + ] + ] + }, + { + "input": "±", + "description": "Named entity: pm; with a semi-colon", + "output": [ + [ + "Character", + "\u00b1" + ] + ] + }, + { + "input": "&pointint", + "description": "Bad named entity: pointint without a semi-colon", + "output": [ + [ + "Character", + "&pointint" + ] + ] + }, + { + "input": "⨕", + "description": "Named entity: pointint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a15" + ] + ] + }, + { + "input": "&popf", + "description": "Bad named entity: popf without a semi-colon", + "output": [ + [ + "Character", + "&popf" + ] + ] + }, + { + "input": "𝕡", + "description": "Named entity: popf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd61" + ] + ] + }, + { + "input": "£", + "description": "Named entity: pound without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a3" + ] + ] + }, + { + "input": "£", + "description": "Named entity: pound; with a semi-colon", + "output": [ + [ + "Character", + "\u00a3" + ] + ] + }, + { + "input": "&pr", + "description": "Bad named entity: pr without a semi-colon", + "output": [ + [ + "Character", + "&pr" + ] + ] + }, + { + "input": "≺", + "description": "Named entity: pr; with a semi-colon", + "output": [ + [ + "Character", + "\u227a" + ] + ] + }, + { + "input": "&prE", + "description": "Bad named entity: prE without a semi-colon", + "output": [ + [ + "Character", + "&prE" + ] + ] + }, + { + "input": "⪳", + "description": "Named entity: prE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab3" + ] + ] + }, + { + "input": "&prap", + "description": "Bad named entity: prap without a semi-colon", + "output": [ + [ + "Character", + "&prap" + ] + ] + }, + { + "input": "⪷", + "description": "Named entity: prap; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab7" + ] + ] + }, + { + "input": "&prcue", + "description": "Bad named entity: prcue without a semi-colon", + "output": [ + [ + "Character", + "&prcue" + ] + ] + }, + { + "input": "≼", + "description": "Named entity: prcue; with a semi-colon", + "output": [ + [ + "Character", + "\u227c" + ] + ] + }, + { + "input": "&pre", + "description": "Bad named entity: pre without a semi-colon", + "output": [ + [ + "Character", + "&pre" + ] + ] + }, + { + "input": "⪯", + "description": "Named entity: pre; with a semi-colon", + "output": [ + [ + "Character", + "\u2aaf" + ] + ] + }, + { + "input": "&prec", + "description": "Bad named entity: prec without a semi-colon", + "output": [ + [ + "Character", + "&prec" + ] + ] + }, + { + "input": "≺", + "description": "Named entity: prec; with a semi-colon", + "output": [ + [ + "Character", + "\u227a" + ] + ] + }, + { + "input": "&precapprox", + "description": "Bad named entity: precapprox without a semi-colon", + "output": [ + [ + "Character", + "&precapprox" + ] + ] + }, + { + "input": "⪷", + "description": "Named entity: precapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab7" + ] + ] + }, + { + "input": "&preccurlyeq", + "description": "Bad named entity: preccurlyeq without a semi-colon", + "output": [ + [ + "Character", + "&preccurlyeq" + ] + ] + }, + { + "input": "≼", + "description": "Named entity: preccurlyeq; with a semi-colon", + "output": [ + [ + "Character", + "\u227c" + ] + ] + }, + { + "input": "&preceq", + "description": "Bad named entity: preceq without a semi-colon", + "output": [ + [ + "Character", + "&preceq" + ] + ] + }, + { + "input": "⪯", + "description": "Named entity: preceq; with a semi-colon", + "output": [ + [ + "Character", + "\u2aaf" + ] + ] + }, + { + "input": "&precnapprox", + "description": "Bad named entity: precnapprox without a semi-colon", + "output": [ + [ + "Character", + "&precnapprox" + ] + ] + }, + { + "input": "⪹", + "description": "Named entity: precnapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab9" + ] + ] + }, + { + "input": "&precneqq", + "description": "Bad named entity: precneqq without a semi-colon", + "output": [ + [ + "Character", + "&precneqq" + ] + ] + }, + { + "input": "⪵", + "description": "Named entity: precneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab5" + ] + ] + }, + { + "input": "&precnsim", + "description": "Bad named entity: precnsim without a semi-colon", + "output": [ + [ + "Character", + "&precnsim" + ] + ] + }, + { + "input": "⋨", + "description": "Named entity: precnsim; with a semi-colon", + "output": [ + [ + "Character", + "\u22e8" + ] + ] + }, + { + "input": "&precsim", + "description": "Bad named entity: precsim without a semi-colon", + "output": [ + [ + "Character", + "&precsim" + ] + ] + }, + { + "input": "≾", + "description": "Named entity: precsim; with a semi-colon", + "output": [ + [ + "Character", + "\u227e" + ] + ] + }, + { + "input": "&prime", + "description": "Bad named entity: prime without a semi-colon", + "output": [ + [ + "Character", + "&prime" + ] + ] + }, + { + "input": "′", + "description": "Named entity: prime; with a semi-colon", + "output": [ + [ + "Character", + "\u2032" + ] + ] + }, + { + "input": "&primes", + "description": "Bad named entity: primes without a semi-colon", + "output": [ + [ + "Character", + "&primes" + ] + ] + }, + { + "input": "ℙ", + "description": "Named entity: primes; with a semi-colon", + "output": [ + [ + "Character", + "\u2119" + ] + ] + }, + { + "input": "&prnE", + "description": "Bad named entity: prnE without a semi-colon", + "output": [ + [ + "Character", + "&prnE" + ] + ] + }, + { + "input": "⪵", + "description": "Named entity: prnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab5" + ] + ] + }, + { + "input": "&prnap", + "description": "Bad named entity: prnap without a semi-colon", + "output": [ + [ + "Character", + "&prnap" + ] + ] + }, + { + "input": "⪹", + "description": "Named entity: prnap; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab9" + ] + ] + }, + { + "input": "&prnsim", + "description": "Bad named entity: prnsim without a semi-colon", + "output": [ + [ + "Character", + "&prnsim" + ] + ] + }, + { + "input": "⋨", + "description": "Named entity: prnsim; with a semi-colon", + "output": [ + [ + "Character", + "\u22e8" + ] + ] + }, + { + "input": "&prod", + "description": "Bad named entity: prod without a semi-colon", + "output": [ + [ + "Character", + "&prod" + ] + ] + }, + { + "input": "∏", + "description": "Named entity: prod; with a semi-colon", + "output": [ + [ + "Character", + "\u220f" + ] + ] + }, + { + "input": "&profalar", + "description": "Bad named entity: profalar without a semi-colon", + "output": [ + [ + "Character", + "&profalar" + ] + ] + }, + { + "input": "⌮", + "description": "Named entity: profalar; with a semi-colon", + "output": [ + [ + "Character", + "\u232e" + ] + ] + }, + { + "input": "&profline", + "description": "Bad named entity: profline without a semi-colon", + "output": [ + [ + "Character", + "&profline" + ] + ] + }, + { + "input": "⌒", + "description": "Named entity: profline; with a semi-colon", + "output": [ + [ + "Character", + "\u2312" + ] + ] + }, + { + "input": "&profsurf", + "description": "Bad named entity: profsurf without a semi-colon", + "output": [ + [ + "Character", + "&profsurf" + ] + ] + }, + { + "input": "⌓", + "description": "Named entity: profsurf; with a semi-colon", + "output": [ + [ + "Character", + "\u2313" + ] + ] + }, + { + "input": "&prop", + "description": "Bad named entity: prop without a semi-colon", + "output": [ + [ + "Character", + "&prop" + ] + ] + }, + { + "input": "∝", + "description": "Named entity: prop; with a semi-colon", + "output": [ + [ + "Character", + "\u221d" + ] + ] + }, + { + "input": "&propto", + "description": "Bad named entity: propto without a semi-colon", + "output": [ + [ + "Character", + "&propto" + ] + ] + }, + { + "input": "∝", + "description": "Named entity: propto; with a semi-colon", + "output": [ + [ + "Character", + "\u221d" + ] + ] + }, + { + "input": "&prsim", + "description": "Bad named entity: prsim without a semi-colon", + "output": [ + [ + "Character", + "&prsim" + ] + ] + }, + { + "input": "≾", + "description": "Named entity: prsim; with a semi-colon", + "output": [ + [ + "Character", + "\u227e" + ] + ] + }, + { + "input": "&prurel", + "description": "Bad named entity: prurel without a semi-colon", + "output": [ + [ + "Character", + "&prurel" + ] + ] + }, + { + "input": "⊰", + "description": "Named entity: prurel; with a semi-colon", + "output": [ + [ + "Character", + "\u22b0" + ] + ] + }, + { + "input": "&pscr", + "description": "Bad named entity: pscr without a semi-colon", + "output": [ + [ + "Character", + "&pscr" + ] + ] + }, + { + "input": "𝓅", + "description": "Named entity: pscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc5" + ] + ] + }, + { + "input": "&psi", + "description": "Bad named entity: psi without a semi-colon", + "output": [ + [ + "Character", + "&psi" + ] + ] + }, + { + "input": "ψ", + "description": "Named entity: psi; with a semi-colon", + "output": [ + [ + "Character", + "\u03c8" + ] + ] + }, + { + "input": "&puncsp", + "description": "Bad named entity: puncsp without a semi-colon", + "output": [ + [ + "Character", + "&puncsp" + ] + ] + }, + { + "input": " ", + "description": "Named entity: puncsp; with a semi-colon", + "output": [ + [ + "Character", + "\u2008" + ] + ] + }, + { + "input": "&qfr", + "description": "Bad named entity: qfr without a semi-colon", + "output": [ + [ + "Character", + "&qfr" + ] + ] + }, + { + "input": "𝔮", + "description": "Named entity: qfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd2e" + ] + ] + }, + { + "input": "&qint", + "description": "Bad named entity: qint without a semi-colon", + "output": [ + [ + "Character", + "&qint" + ] + ] + }, + { + "input": "⨌", + "description": "Named entity: qint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a0c" + ] + ] + }, + { + "input": "&qopf", + "description": "Bad named entity: qopf without a semi-colon", + "output": [ + [ + "Character", + "&qopf" + ] + ] + }, + { + "input": "𝕢", + "description": "Named entity: qopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd62" + ] + ] + }, + { + "input": "&qprime", + "description": "Bad named entity: qprime without a semi-colon", + "output": [ + [ + "Character", + "&qprime" + ] + ] + }, + { + "input": "⁗", + "description": "Named entity: qprime; with a semi-colon", + "output": [ + [ + "Character", + "\u2057" + ] + ] + }, + { + "input": "&qscr", + "description": "Bad named entity: qscr without a semi-colon", + "output": [ + [ + "Character", + "&qscr" + ] + ] + }, + { + "input": "𝓆", + "description": "Named entity: qscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc6" + ] + ] + }, + { + "input": "&quaternions", + "description": "Bad named entity: quaternions without a semi-colon", + "output": [ + [ + "Character", + "&quaternions" + ] + ] + }, + { + "input": "ℍ", + "description": "Named entity: quaternions; with a semi-colon", + "output": [ + [ + "Character", + "\u210d" + ] + ] + }, + { + "input": "&quatint", + "description": "Bad named entity: quatint without a semi-colon", + "output": [ + [ + "Character", + "&quatint" + ] + ] + }, + { + "input": "⨖", + "description": "Named entity: quatint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a16" + ] + ] + }, + { + "input": "&quest", + "description": "Bad named entity: quest without a semi-colon", + "output": [ + [ + "Character", + "&quest" + ] + ] + }, + { + "input": "?", + "description": "Named entity: quest; with a semi-colon", + "output": [ + [ + "Character", + "?" + ] + ] + }, + { + "input": "&questeq", + "description": "Bad named entity: questeq without a semi-colon", + "output": [ + [ + "Character", + "&questeq" + ] + ] + }, + { + "input": "≟", + "description": "Named entity: questeq; with a semi-colon", + "output": [ + [ + "Character", + "\u225f" + ] + ] + }, + { + "input": """, + "description": "Named entity: quot without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\"" + ] + ] + }, + { + "input": """, + "description": "Named entity: quot; with a semi-colon", + "output": [ + [ + "Character", + "\"" + ] + ] + }, + { + "input": "&rAarr", + "description": "Bad named entity: rAarr without a semi-colon", + "output": [ + [ + "Character", + "&rAarr" + ] + ] + }, + { + "input": "⇛", + "description": "Named entity: rAarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21db" + ] + ] + }, + { + "input": "&rArr", + "description": "Bad named entity: rArr without a semi-colon", + "output": [ + [ + "Character", + "&rArr" + ] + ] + }, + { + "input": "⇒", + "description": "Named entity: rArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d2" + ] + ] + }, + { + "input": "&rAtail", + "description": "Bad named entity: rAtail without a semi-colon", + "output": [ + [ + "Character", + "&rAtail" + ] + ] + }, + { + "input": "⤜", + "description": "Named entity: rAtail; with a semi-colon", + "output": [ + [ + "Character", + "\u291c" + ] + ] + }, + { + "input": "&rBarr", + "description": "Bad named entity: rBarr without a semi-colon", + "output": [ + [ + "Character", + "&rBarr" + ] + ] + }, + { + "input": "⤏", + "description": "Named entity: rBarr; with a semi-colon", + "output": [ + [ + "Character", + "\u290f" + ] + ] + }, + { + "input": "&rHar", + "description": "Bad named entity: rHar without a semi-colon", + "output": [ + [ + "Character", + "&rHar" + ] + ] + }, + { + "input": "⥤", + "description": "Named entity: rHar; with a semi-colon", + "output": [ + [ + "Character", + "\u2964" + ] + ] + }, + { + "input": "&race", + "description": "Bad named entity: race without a semi-colon", + "output": [ + [ + "Character", + "&race" + ] + ] + }, + { + "input": "∽̱", + "description": "Named entity: race; with a semi-colon", + "output": [ + [ + "Character", + "\u223d\u0331" + ] + ] + }, + { + "input": "&racute", + "description": "Bad named entity: racute without a semi-colon", + "output": [ + [ + "Character", + "&racute" + ] + ] + }, + { + "input": "ŕ", + "description": "Named entity: racute; with a semi-colon", + "output": [ + [ + "Character", + "\u0155" + ] + ] + }, + { + "input": "&radic", + "description": "Bad named entity: radic without a semi-colon", + "output": [ + [ + "Character", + "&radic" + ] + ] + }, + { + "input": "√", + "description": "Named entity: radic; with a semi-colon", + "output": [ + [ + "Character", + "\u221a" + ] + ] + }, + { + "input": "&raemptyv", + "description": "Bad named entity: raemptyv without a semi-colon", + "output": [ + [ + "Character", + "&raemptyv" + ] + ] + }, + { + "input": "⦳", + "description": "Named entity: raemptyv; with a semi-colon", + "output": [ + [ + "Character", + "\u29b3" + ] + ] + }, + { + "input": "&rang", + "description": "Bad named entity: rang without a semi-colon", + "output": [ + [ + "Character", + "&rang" + ] + ] + }, + { + "input": "⟩", + "description": "Named entity: rang; with a semi-colon", + "output": [ + [ + "Character", + "\u27e9" + ] + ] + }, + { + "input": "&rangd", + "description": "Bad named entity: rangd without a semi-colon", + "output": [ + [ + "Character", + "&rangd" + ] + ] + }, + { + "input": "⦒", + "description": "Named entity: rangd; with a semi-colon", + "output": [ + [ + "Character", + "\u2992" + ] + ] + }, + { + "input": "&range", + "description": "Bad named entity: range without a semi-colon", + "output": [ + [ + "Character", + "&range" + ] + ] + }, + { + "input": "⦥", + "description": "Named entity: range; with a semi-colon", + "output": [ + [ + "Character", + "\u29a5" + ] + ] + }, + { + "input": "&rangle", + "description": "Bad named entity: rangle without a semi-colon", + "output": [ + [ + "Character", + "&rangle" + ] + ] + }, + { + "input": "⟩", + "description": "Named entity: rangle; with a semi-colon", + "output": [ + [ + "Character", + "\u27e9" + ] + ] + }, + { + "input": "»", + "description": "Named entity: raquo without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00bb" + ] + ] + }, + { + "input": "»", + "description": "Named entity: raquo; with a semi-colon", + "output": [ + [ + "Character", + "\u00bb" + ] + ] + }, + { + "input": "&rarr", + "description": "Bad named entity: rarr without a semi-colon", + "output": [ + [ + "Character", + "&rarr" + ] + ] + }, + { + "input": "→", + "description": "Named entity: rarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2192" + ] + ] + }, + { + "input": "&rarrap", + "description": "Bad named entity: rarrap without a semi-colon", + "output": [ + [ + "Character", + "&rarrap" + ] + ] + }, + { + "input": "⥵", + "description": "Named entity: rarrap; with a semi-colon", + "output": [ + [ + "Character", + "\u2975" + ] + ] + }, + { + "input": "&rarrb", + "description": "Bad named entity: rarrb without a semi-colon", + "output": [ + [ + "Character", + "&rarrb" + ] + ] + }, + { + "input": "⇥", + "description": "Named entity: rarrb; with a semi-colon", + "output": [ + [ + "Character", + "\u21e5" + ] + ] + }, + { + "input": "&rarrbfs", + "description": "Bad named entity: rarrbfs without a semi-colon", + "output": [ + [ + "Character", + "&rarrbfs" + ] + ] + }, + { + "input": "⤠", + "description": "Named entity: rarrbfs; with a semi-colon", + "output": [ + [ + "Character", + "\u2920" + ] + ] + }, + { + "input": "&rarrc", + "description": "Bad named entity: rarrc without a semi-colon", + "output": [ + [ + "Character", + "&rarrc" + ] + ] + }, + { + "input": "⤳", + "description": "Named entity: rarrc; with a semi-colon", + "output": [ + [ + "Character", + "\u2933" + ] + ] + }, + { + "input": "&rarrfs", + "description": "Bad named entity: rarrfs without a semi-colon", + "output": [ + [ + "Character", + "&rarrfs" + ] + ] + }, + { + "input": "⤞", + "description": "Named entity: rarrfs; with a semi-colon", + "output": [ + [ + "Character", + "\u291e" + ] + ] + }, + { + "input": "&rarrhk", + "description": "Bad named entity: rarrhk without a semi-colon", + "output": [ + [ + "Character", + "&rarrhk" + ] + ] + }, + { + "input": "↪", + "description": "Named entity: rarrhk; with a semi-colon", + "output": [ + [ + "Character", + "\u21aa" + ] + ] + }, + { + "input": "&rarrlp", + "description": "Bad named entity: rarrlp without a semi-colon", + "output": [ + [ + "Character", + "&rarrlp" + ] + ] + }, + { + "input": "↬", + "description": "Named entity: rarrlp; with a semi-colon", + "output": [ + [ + "Character", + "\u21ac" + ] + ] + }, + { + "input": "&rarrpl", + "description": "Bad named entity: rarrpl without a semi-colon", + "output": [ + [ + "Character", + "&rarrpl" + ] + ] + }, + { + "input": "⥅", + "description": "Named entity: rarrpl; with a semi-colon", + "output": [ + [ + "Character", + "\u2945" + ] + ] + }, + { + "input": "&rarrsim", + "description": "Bad named entity: rarrsim without a semi-colon", + "output": [ + [ + "Character", + "&rarrsim" + ] + ] + }, + { + "input": "⥴", + "description": "Named entity: rarrsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2974" + ] + ] + }, + { + "input": "&rarrtl", + "description": "Bad named entity: rarrtl without a semi-colon", + "output": [ + [ + "Character", + "&rarrtl" + ] + ] + }, + { + "input": "↣", + "description": "Named entity: rarrtl; with a semi-colon", + "output": [ + [ + "Character", + "\u21a3" + ] + ] + }, + { + "input": "&rarrw", + "description": "Bad named entity: rarrw without a semi-colon", + "output": [ + [ + "Character", + "&rarrw" + ] + ] + }, + { + "input": "↝", + "description": "Named entity: rarrw; with a semi-colon", + "output": [ + [ + "Character", + "\u219d" + ] + ] + }, + { + "input": "&ratail", + "description": "Bad named entity: ratail without a semi-colon", + "output": [ + [ + "Character", + "&ratail" + ] + ] + }, + { + "input": "⤚", + "description": "Named entity: ratail; with a semi-colon", + "output": [ + [ + "Character", + "\u291a" + ] + ] + }, + { + "input": "&ratio", + "description": "Bad named entity: ratio without a semi-colon", + "output": [ + [ + "Character", + "&ratio" + ] + ] + }, + { + "input": "∶", + "description": "Named entity: ratio; with a semi-colon", + "output": [ + [ + "Character", + "\u2236" + ] + ] + }, + { + "input": "&rationals", + "description": "Bad named entity: rationals without a semi-colon", + "output": [ + [ + "Character", + "&rationals" + ] + ] + }, + { + "input": "ℚ", + "description": "Named entity: rationals; with a semi-colon", + "output": [ + [ + "Character", + "\u211a" + ] + ] + }, + { + "input": "&rbarr", + "description": "Bad named entity: rbarr without a semi-colon", + "output": [ + [ + "Character", + "&rbarr" + ] + ] + }, + { + "input": "⤍", + "description": "Named entity: rbarr; with a semi-colon", + "output": [ + [ + "Character", + "\u290d" + ] + ] + }, + { + "input": "&rbbrk", + "description": "Bad named entity: rbbrk without a semi-colon", + "output": [ + [ + "Character", + "&rbbrk" + ] + ] + }, + { + "input": "❳", + "description": "Named entity: rbbrk; with a semi-colon", + "output": [ + [ + "Character", + "\u2773" + ] + ] + }, + { + "input": "&rbrace", + "description": "Bad named entity: rbrace without a semi-colon", + "output": [ + [ + "Character", + "&rbrace" + ] + ] + }, + { + "input": "}", + "description": "Named entity: rbrace; with a semi-colon", + "output": [ + [ + "Character", + "}" + ] + ] + }, + { + "input": "&rbrack", + "description": "Bad named entity: rbrack without a semi-colon", + "output": [ + [ + "Character", + "&rbrack" + ] + ] + }, + { + "input": "]", + "description": "Named entity: rbrack; with a semi-colon", + "output": [ + [ + "Character", + "]" + ] + ] + }, + { + "input": "&rbrke", + "description": "Bad named entity: rbrke without a semi-colon", + "output": [ + [ + "Character", + "&rbrke" + ] + ] + }, + { + "input": "⦌", + "description": "Named entity: rbrke; with a semi-colon", + "output": [ + [ + "Character", + "\u298c" + ] + ] + }, + { + "input": "&rbrksld", + "description": "Bad named entity: rbrksld without a semi-colon", + "output": [ + [ + "Character", + "&rbrksld" + ] + ] + }, + { + "input": "⦎", + "description": "Named entity: rbrksld; with a semi-colon", + "output": [ + [ + "Character", + "\u298e" + ] + ] + }, + { + "input": "&rbrkslu", + "description": "Bad named entity: rbrkslu without a semi-colon", + "output": [ + [ + "Character", + "&rbrkslu" + ] + ] + }, + { + "input": "⦐", + "description": "Named entity: rbrkslu; with a semi-colon", + "output": [ + [ + "Character", + "\u2990" + ] + ] + }, + { + "input": "&rcaron", + "description": "Bad named entity: rcaron without a semi-colon", + "output": [ + [ + "Character", + "&rcaron" + ] + ] + }, + { + "input": "ř", + "description": "Named entity: rcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0159" + ] + ] + }, + { + "input": "&rcedil", + "description": "Bad named entity: rcedil without a semi-colon", + "output": [ + [ + "Character", + "&rcedil" + ] + ] + }, + { + "input": "ŗ", + "description": "Named entity: rcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0157" + ] + ] + }, + { + "input": "&rceil", + "description": "Bad named entity: rceil without a semi-colon", + "output": [ + [ + "Character", + "&rceil" + ] + ] + }, + { + "input": "⌉", + "description": "Named entity: rceil; with a semi-colon", + "output": [ + [ + "Character", + "\u2309" + ] + ] + }, + { + "input": "&rcub", + "description": "Bad named entity: rcub without a semi-colon", + "output": [ + [ + "Character", + "&rcub" + ] + ] + }, + { + "input": "}", + "description": "Named entity: rcub; with a semi-colon", + "output": [ + [ + "Character", + "}" + ] + ] + }, + { + "input": "&rcy", + "description": "Bad named entity: rcy without a semi-colon", + "output": [ + [ + "Character", + "&rcy" + ] + ] + }, + { + "input": "р", + "description": "Named entity: rcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0440" + ] + ] + }, + { + "input": "&rdca", + "description": "Bad named entity: rdca without a semi-colon", + "output": [ + [ + "Character", + "&rdca" + ] + ] + }, + { + "input": "⤷", + "description": "Named entity: rdca; with a semi-colon", + "output": [ + [ + "Character", + "\u2937" + ] + ] + }, + { + "input": "&rdldhar", + "description": "Bad named entity: rdldhar without a semi-colon", + "output": [ + [ + "Character", + "&rdldhar" + ] + ] + }, + { + "input": "⥩", + "description": "Named entity: rdldhar; with a semi-colon", + "output": [ + [ + "Character", + "\u2969" + ] + ] + }, + { + "input": "&rdquo", + "description": "Bad named entity: rdquo without a semi-colon", + "output": [ + [ + "Character", + "&rdquo" + ] + ] + }, + { + "input": "”", + "description": "Named entity: rdquo; with a semi-colon", + "output": [ + [ + "Character", + "\u201d" + ] + ] + }, + { + "input": "&rdquor", + "description": "Bad named entity: rdquor without a semi-colon", + "output": [ + [ + "Character", + "&rdquor" + ] + ] + }, + { + "input": "”", + "description": "Named entity: rdquor; with a semi-colon", + "output": [ + [ + "Character", + "\u201d" + ] + ] + }, + { + "input": "&rdsh", + "description": "Bad named entity: rdsh without a semi-colon", + "output": [ + [ + "Character", + "&rdsh" + ] + ] + }, + { + "input": "↳", + "description": "Named entity: rdsh; with a semi-colon", + "output": [ + [ + "Character", + "\u21b3" + ] + ] + }, + { + "input": "&real", + "description": "Bad named entity: real without a semi-colon", + "output": [ + [ + "Character", + "&real" + ] + ] + }, + { + "input": "ℜ", + "description": "Named entity: real; with a semi-colon", + "output": [ + [ + "Character", + "\u211c" + ] + ] + }, + { + "input": "&realine", + "description": "Bad named entity: realine without a semi-colon", + "output": [ + [ + "Character", + "&realine" + ] + ] + }, + { + "input": "ℛ", + "description": "Named entity: realine; with a semi-colon", + "output": [ + [ + "Character", + "\u211b" + ] + ] + }, + { + "input": "&realpart", + "description": "Bad named entity: realpart without a semi-colon", + "output": [ + [ + "Character", + "&realpart" + ] + ] + }, + { + "input": "ℜ", + "description": "Named entity: realpart; with a semi-colon", + "output": [ + [ + "Character", + "\u211c" + ] + ] + }, + { + "input": "&reals", + "description": "Bad named entity: reals without a semi-colon", + "output": [ + [ + "Character", + "&reals" + ] + ] + }, + { + "input": "ℝ", + "description": "Named entity: reals; with a semi-colon", + "output": [ + [ + "Character", + "\u211d" + ] + ] + }, + { + "input": "&rect", + "description": "Bad named entity: rect without a semi-colon", + "output": [ + [ + "Character", + "&rect" + ] + ] + }, + { + "input": "▭", + "description": "Named entity: rect; with a semi-colon", + "output": [ + [ + "Character", + "\u25ad" + ] + ] + }, + { + "input": "®", + "description": "Named entity: reg without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ae" + ] + ] + }, + { + "input": "®", + "description": "Named entity: reg; with a semi-colon", + "output": [ + [ + "Character", + "\u00ae" + ] + ] + }, + { + "input": "&rfisht", + "description": "Bad named entity: rfisht without a semi-colon", + "output": [ + [ + "Character", + "&rfisht" + ] + ] + }, + { + "input": "⥽", + "description": "Named entity: rfisht; with a semi-colon", + "output": [ + [ + "Character", + "\u297d" + ] + ] + }, + { + "input": "&rfloor", + "description": "Bad named entity: rfloor without a semi-colon", + "output": [ + [ + "Character", + "&rfloor" + ] + ] + }, + { + "input": "⌋", + "description": "Named entity: rfloor; with a semi-colon", + "output": [ + [ + "Character", + "\u230b" + ] + ] + }, + { + "input": "&rfr", + "description": "Bad named entity: rfr without a semi-colon", + "output": [ + [ + "Character", + "&rfr" + ] + ] + }, + { + "input": "𝔯", + "description": "Named entity: rfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd2f" + ] + ] + }, + { + "input": "&rhard", + "description": "Bad named entity: rhard without a semi-colon", + "output": [ + [ + "Character", + "&rhard" + ] + ] + }, + { + "input": "⇁", + "description": "Named entity: rhard; with a semi-colon", + "output": [ + [ + "Character", + "\u21c1" + ] + ] + }, + { + "input": "&rharu", + "description": "Bad named entity: rharu without a semi-colon", + "output": [ + [ + "Character", + "&rharu" + ] + ] + }, + { + "input": "⇀", + "description": "Named entity: rharu; with a semi-colon", + "output": [ + [ + "Character", + "\u21c0" + ] + ] + }, + { + "input": "&rharul", + "description": "Bad named entity: rharul without a semi-colon", + "output": [ + [ + "Character", + "&rharul" + ] + ] + }, + { + "input": "⥬", + "description": "Named entity: rharul; with a semi-colon", + "output": [ + [ + "Character", + "\u296c" + ] + ] + }, + { + "input": "&rho", + "description": "Bad named entity: rho without a semi-colon", + "output": [ + [ + "Character", + "&rho" + ] + ] + }, + { + "input": "ρ", + "description": "Named entity: rho; with a semi-colon", + "output": [ + [ + "Character", + "\u03c1" + ] + ] + }, + { + "input": "&rhov", + "description": "Bad named entity: rhov without a semi-colon", + "output": [ + [ + "Character", + "&rhov" + ] + ] + }, + { + "input": "ϱ", + "description": "Named entity: rhov; with a semi-colon", + "output": [ + [ + "Character", + "\u03f1" + ] + ] + }, + { + "input": "&rightarrow", + "description": "Bad named entity: rightarrow without a semi-colon", + "output": [ + [ + "Character", + "&rightarrow" + ] + ] + }, + { + "input": "→", + "description": "Named entity: rightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2192" + ] + ] + }, + { + "input": "&rightarrowtail", + "description": "Bad named entity: rightarrowtail without a semi-colon", + "output": [ + [ + "Character", + "&rightarrowtail" + ] + ] + }, + { + "input": "↣", + "description": "Named entity: rightarrowtail; with a semi-colon", + "output": [ + [ + "Character", + "\u21a3" + ] + ] + }, + { + "input": "&rightharpoondown", + "description": "Bad named entity: rightharpoondown without a semi-colon", + "output": [ + [ + "Character", + "&rightharpoondown" + ] + ] + }, + { + "input": "⇁", + "description": "Named entity: rightharpoondown; with a semi-colon", + "output": [ + [ + "Character", + "\u21c1" + ] + ] + }, + { + "input": "&rightharpoonup", + "description": "Bad named entity: rightharpoonup without a semi-colon", + "output": [ + [ + "Character", + "&rightharpoonup" + ] + ] + }, + { + "input": "⇀", + "description": "Named entity: rightharpoonup; with a semi-colon", + "output": [ + [ + "Character", + "\u21c0" + ] + ] + }, + { + "input": "&rightleftarrows", + "description": "Bad named entity: rightleftarrows without a semi-colon", + "output": [ + [ + "Character", + "&rightleftarrows" + ] + ] + }, + { + "input": "⇄", + "description": "Named entity: rightleftarrows; with a semi-colon", + "output": [ + [ + "Character", + "\u21c4" + ] + ] + }, + { + "input": "&rightleftharpoons", + "description": "Bad named entity: rightleftharpoons without a semi-colon", + "output": [ + [ + "Character", + "&rightleftharpoons" + ] + ] + }, + { + "input": "⇌", + "description": "Named entity: rightleftharpoons; with a semi-colon", + "output": [ + [ + "Character", + "\u21cc" + ] + ] + }, + { + "input": "&rightrightarrows", + "description": "Bad named entity: rightrightarrows without a semi-colon", + "output": [ + [ + "Character", + "&rightrightarrows" + ] + ] + }, + { + "input": "⇉", + "description": "Named entity: rightrightarrows; with a semi-colon", + "output": [ + [ + "Character", + "\u21c9" + ] + ] + }, + { + "input": "&rightsquigarrow", + "description": "Bad named entity: rightsquigarrow without a semi-colon", + "output": [ + [ + "Character", + "&rightsquigarrow" + ] + ] + }, + { + "input": "↝", + "description": "Named entity: rightsquigarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u219d" + ] + ] + }, + { + "input": "&rightthreetimes", + "description": "Bad named entity: rightthreetimes without a semi-colon", + "output": [ + [ + "Character", + "&rightthreetimes" + ] + ] + }, + { + "input": "⋌", + "description": "Named entity: rightthreetimes; with a semi-colon", + "output": [ + [ + "Character", + "\u22cc" + ] + ] + }, + { + "input": "&ring", + "description": "Bad named entity: ring without a semi-colon", + "output": [ + [ + "Character", + "&ring" + ] + ] + }, + { + "input": "˚", + "description": "Named entity: ring; with a semi-colon", + "output": [ + [ + "Character", + "\u02da" + ] + ] + }, + { + "input": "&risingdotseq", + "description": "Bad named entity: risingdotseq without a semi-colon", + "output": [ + [ + "Character", + "&risingdotseq" + ] + ] + }, + { + "input": "≓", + "description": "Named entity: risingdotseq; with a semi-colon", + "output": [ + [ + "Character", + "\u2253" + ] + ] + }, + { + "input": "&rlarr", + "description": "Bad named entity: rlarr without a semi-colon", + "output": [ + [ + "Character", + "&rlarr" + ] + ] + }, + { + "input": "⇄", + "description": "Named entity: rlarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21c4" + ] + ] + }, + { + "input": "&rlhar", + "description": "Bad named entity: rlhar without a semi-colon", + "output": [ + [ + "Character", + "&rlhar" + ] + ] + }, + { + "input": "⇌", + "description": "Named entity: rlhar; with a semi-colon", + "output": [ + [ + "Character", + "\u21cc" + ] + ] + }, + { + "input": "&rlm", + "description": "Bad named entity: rlm without a semi-colon", + "output": [ + [ + "Character", + "&rlm" + ] + ] + }, + { + "input": "‏", + "description": "Named entity: rlm; with a semi-colon", + "output": [ + [ + "Character", + "\u200f" + ] + ] + }, + { + "input": "&rmoust", + "description": "Bad named entity: rmoust without a semi-colon", + "output": [ + [ + "Character", + "&rmoust" + ] + ] + }, + { + "input": "⎱", + "description": "Named entity: rmoust; with a semi-colon", + "output": [ + [ + "Character", + "\u23b1" + ] + ] + }, + { + "input": "&rmoustache", + "description": "Bad named entity: rmoustache without a semi-colon", + "output": [ + [ + "Character", + "&rmoustache" + ] + ] + }, + { + "input": "⎱", + "description": "Named entity: rmoustache; with a semi-colon", + "output": [ + [ + "Character", + "\u23b1" + ] + ] + }, + { + "input": "&rnmid", + "description": "Bad named entity: rnmid without a semi-colon", + "output": [ + [ + "Character", + "&rnmid" + ] + ] + }, + { + "input": "⫮", + "description": "Named entity: rnmid; with a semi-colon", + "output": [ + [ + "Character", + "\u2aee" + ] + ] + }, + { + "input": "&roang", + "description": "Bad named entity: roang without a semi-colon", + "output": [ + [ + "Character", + "&roang" + ] + ] + }, + { + "input": "⟭", + "description": "Named entity: roang; with a semi-colon", + "output": [ + [ + "Character", + "\u27ed" + ] + ] + }, + { + "input": "&roarr", + "description": "Bad named entity: roarr without a semi-colon", + "output": [ + [ + "Character", + "&roarr" + ] + ] + }, + { + "input": "⇾", + "description": "Named entity: roarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21fe" + ] + ] + }, + { + "input": "&robrk", + "description": "Bad named entity: robrk without a semi-colon", + "output": [ + [ + "Character", + "&robrk" + ] + ] + }, + { + "input": "⟧", + "description": "Named entity: robrk; with a semi-colon", + "output": [ + [ + "Character", + "\u27e7" + ] + ] + }, + { + "input": "&ropar", + "description": "Bad named entity: ropar without a semi-colon", + "output": [ + [ + "Character", + "&ropar" + ] + ] + }, + { + "input": "⦆", + "description": "Named entity: ropar; with a semi-colon", + "output": [ + [ + "Character", + "\u2986" + ] + ] + }, + { + "input": "&ropf", + "description": "Bad named entity: ropf without a semi-colon", + "output": [ + [ + "Character", + "&ropf" + ] + ] + }, + { + "input": "𝕣", + "description": "Named entity: ropf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd63" + ] + ] + }, + { + "input": "&roplus", + "description": "Bad named entity: roplus without a semi-colon", + "output": [ + [ + "Character", + "&roplus" + ] + ] + }, + { + "input": "⨮", + "description": "Named entity: roplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a2e" + ] + ] + }, + { + "input": "&rotimes", + "description": "Bad named entity: rotimes without a semi-colon", + "output": [ + [ + "Character", + "&rotimes" + ] + ] + }, + { + "input": "⨵", + "description": "Named entity: rotimes; with a semi-colon", + "output": [ + [ + "Character", + "\u2a35" + ] + ] + }, + { + "input": "&rpar", + "description": "Bad named entity: rpar without a semi-colon", + "output": [ + [ + "Character", + "&rpar" + ] + ] + }, + { + "input": ")", + "description": "Named entity: rpar; with a semi-colon", + "output": [ + [ + "Character", + ")" + ] + ] + }, + { + "input": "&rpargt", + "description": "Bad named entity: rpargt without a semi-colon", + "output": [ + [ + "Character", + "&rpargt" + ] + ] + }, + { + "input": "⦔", + "description": "Named entity: rpargt; with a semi-colon", + "output": [ + [ + "Character", + "\u2994" + ] + ] + }, + { + "input": "&rppolint", + "description": "Bad named entity: rppolint without a semi-colon", + "output": [ + [ + "Character", + "&rppolint" + ] + ] + }, + { + "input": "⨒", + "description": "Named entity: rppolint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a12" + ] + ] + }, + { + "input": "&rrarr", + "description": "Bad named entity: rrarr without a semi-colon", + "output": [ + [ + "Character", + "&rrarr" + ] + ] + }, + { + "input": "⇉", + "description": "Named entity: rrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21c9" + ] + ] + }, + { + "input": "&rsaquo", + "description": "Bad named entity: rsaquo without a semi-colon", + "output": [ + [ + "Character", + "&rsaquo" + ] + ] + }, + { + "input": "›", + "description": "Named entity: rsaquo; with a semi-colon", + "output": [ + [ + "Character", + "\u203a" + ] + ] + }, + { + "input": "&rscr", + "description": "Bad named entity: rscr without a semi-colon", + "output": [ + [ + "Character", + "&rscr" + ] + ] + }, + { + "input": "𝓇", + "description": "Named entity: rscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc7" + ] + ] + }, + { + "input": "&rsh", + "description": "Bad named entity: rsh without a semi-colon", + "output": [ + [ + "Character", + "&rsh" + ] + ] + }, + { + "input": "↱", + "description": "Named entity: rsh; with a semi-colon", + "output": [ + [ + "Character", + "\u21b1" + ] + ] + }, + { + "input": "&rsqb", + "description": "Bad named entity: rsqb without a semi-colon", + "output": [ + [ + "Character", + "&rsqb" + ] + ] + }, + { + "input": "]", + "description": "Named entity: rsqb; with a semi-colon", + "output": [ + [ + "Character", + "]" + ] + ] + }, + { + "input": "&rsquo", + "description": "Bad named entity: rsquo without a semi-colon", + "output": [ + [ + "Character", + "&rsquo" + ] + ] + }, + { + "input": "’", + "description": "Named entity: rsquo; with a semi-colon", + "output": [ + [ + "Character", + "\u2019" + ] + ] + }, + { + "input": "&rsquor", + "description": "Bad named entity: rsquor without a semi-colon", + "output": [ + [ + "Character", + "&rsquor" + ] + ] + }, + { + "input": "’", + "description": "Named entity: rsquor; with a semi-colon", + "output": [ + [ + "Character", + "\u2019" + ] + ] + }, + { + "input": "&rthree", + "description": "Bad named entity: rthree without a semi-colon", + "output": [ + [ + "Character", + "&rthree" + ] + ] + }, + { + "input": "⋌", + "description": "Named entity: rthree; with a semi-colon", + "output": [ + [ + "Character", + "\u22cc" + ] + ] + }, + { + "input": "&rtimes", + "description": "Bad named entity: rtimes without a semi-colon", + "output": [ + [ + "Character", + "&rtimes" + ] + ] + }, + { + "input": "⋊", + "description": "Named entity: rtimes; with a semi-colon", + "output": [ + [ + "Character", + "\u22ca" + ] + ] + }, + { + "input": "&rtri", + "description": "Bad named entity: rtri without a semi-colon", + "output": [ + [ + "Character", + "&rtri" + ] + ] + }, + { + "input": "▹", + "description": "Named entity: rtri; with a semi-colon", + "output": [ + [ + "Character", + "\u25b9" + ] + ] + }, + { + "input": "&rtrie", + "description": "Bad named entity: rtrie without a semi-colon", + "output": [ + [ + "Character", + "&rtrie" + ] + ] + }, + { + "input": "⊵", + "description": "Named entity: rtrie; with a semi-colon", + "output": [ + [ + "Character", + "\u22b5" + ] + ] + }, + { + "input": "&rtrif", + "description": "Bad named entity: rtrif without a semi-colon", + "output": [ + [ + "Character", + "&rtrif" + ] + ] + }, + { + "input": "▸", + "description": "Named entity: rtrif; with a semi-colon", + "output": [ + [ + "Character", + "\u25b8" + ] + ] + }, + { + "input": "&rtriltri", + "description": "Bad named entity: rtriltri without a semi-colon", + "output": [ + [ + "Character", + "&rtriltri" + ] + ] + }, + { + "input": "⧎", + "description": "Named entity: rtriltri; with a semi-colon", + "output": [ + [ + "Character", + "\u29ce" + ] + ] + }, + { + "input": "&ruluhar", + "description": "Bad named entity: ruluhar without a semi-colon", + "output": [ + [ + "Character", + "&ruluhar" + ] + ] + }, + { + "input": "⥨", + "description": "Named entity: ruluhar; with a semi-colon", + "output": [ + [ + "Character", + "\u2968" + ] + ] + }, + { + "input": "&rx", + "description": "Bad named entity: rx without a semi-colon", + "output": [ + [ + "Character", + "&rx" + ] + ] + }, + { + "input": "℞", + "description": "Named entity: rx; with a semi-colon", + "output": [ + [ + "Character", + "\u211e" + ] + ] + }, + { + "input": "&sacute", + "description": "Bad named entity: sacute without a semi-colon", + "output": [ + [ + "Character", + "&sacute" + ] + ] + }, + { + "input": "ś", + "description": "Named entity: sacute; with a semi-colon", + "output": [ + [ + "Character", + "\u015b" + ] + ] + }, + { + "input": "&sbquo", + "description": "Bad named entity: sbquo without a semi-colon", + "output": [ + [ + "Character", + "&sbquo" + ] + ] + }, + { + "input": "‚", + "description": "Named entity: sbquo; with a semi-colon", + "output": [ + [ + "Character", + "\u201a" + ] + ] + }, + { + "input": "&sc", + "description": "Bad named entity: sc without a semi-colon", + "output": [ + [ + "Character", + "&sc" + ] + ] + }, + { + "input": "≻", + "description": "Named entity: sc; with a semi-colon", + "output": [ + [ + "Character", + "\u227b" + ] + ] + }, + { + "input": "&scE", + "description": "Bad named entity: scE without a semi-colon", + "output": [ + [ + "Character", + "&scE" + ] + ] + }, + { + "input": "⪴", + "description": "Named entity: scE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab4" + ] + ] + }, + { + "input": "&scap", + "description": "Bad named entity: scap without a semi-colon", + "output": [ + [ + "Character", + "&scap" + ] + ] + }, + { + "input": "⪸", + "description": "Named entity: scap; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab8" + ] + ] + }, + { + "input": "&scaron", + "description": "Bad named entity: scaron without a semi-colon", + "output": [ + [ + "Character", + "&scaron" + ] + ] + }, + { + "input": "š", + "description": "Named entity: scaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0161" + ] + ] + }, + { + "input": "&sccue", + "description": "Bad named entity: sccue without a semi-colon", + "output": [ + [ + "Character", + "&sccue" + ] + ] + }, + { + "input": "≽", + "description": "Named entity: sccue; with a semi-colon", + "output": [ + [ + "Character", + "\u227d" + ] + ] + }, + { + "input": "&sce", + "description": "Bad named entity: sce without a semi-colon", + "output": [ + [ + "Character", + "&sce" + ] + ] + }, + { + "input": "⪰", + "description": "Named entity: sce; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab0" + ] + ] + }, + { + "input": "&scedil", + "description": "Bad named entity: scedil without a semi-colon", + "output": [ + [ + "Character", + "&scedil" + ] + ] + }, + { + "input": "ş", + "description": "Named entity: scedil; with a semi-colon", + "output": [ + [ + "Character", + "\u015f" + ] + ] + }, + { + "input": "&scirc", + "description": "Bad named entity: scirc without a semi-colon", + "output": [ + [ + "Character", + "&scirc" + ] + ] + }, + { + "input": "ŝ", + "description": "Named entity: scirc; with a semi-colon", + "output": [ + [ + "Character", + "\u015d" + ] + ] + }, + { + "input": "&scnE", + "description": "Bad named entity: scnE without a semi-colon", + "output": [ + [ + "Character", + "&scnE" + ] + ] + }, + { + "input": "⪶", + "description": "Named entity: scnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab6" + ] + ] + }, + { + "input": "&scnap", + "description": "Bad named entity: scnap without a semi-colon", + "output": [ + [ + "Character", + "&scnap" + ] + ] + }, + { + "input": "⪺", + "description": "Named entity: scnap; with a semi-colon", + "output": [ + [ + "Character", + "\u2aba" + ] + ] + }, + { + "input": "&scnsim", + "description": "Bad named entity: scnsim without a semi-colon", + "output": [ + [ + "Character", + "&scnsim" + ] + ] + }, + { + "input": "⋩", + "description": "Named entity: scnsim; with a semi-colon", + "output": [ + [ + "Character", + "\u22e9" + ] + ] + }, + { + "input": "&scpolint", + "description": "Bad named entity: scpolint without a semi-colon", + "output": [ + [ + "Character", + "&scpolint" + ] + ] + }, + { + "input": "⨓", + "description": "Named entity: scpolint; with a semi-colon", + "output": [ + [ + "Character", + "\u2a13" + ] + ] + }, + { + "input": "&scsim", + "description": "Bad named entity: scsim without a semi-colon", + "output": [ + [ + "Character", + "&scsim" + ] + ] + }, + { + "input": "≿", + "description": "Named entity: scsim; with a semi-colon", + "output": [ + [ + "Character", + "\u227f" + ] + ] + }, + { + "input": "&scy", + "description": "Bad named entity: scy without a semi-colon", + "output": [ + [ + "Character", + "&scy" + ] + ] + }, + { + "input": "с", + "description": "Named entity: scy; with a semi-colon", + "output": [ + [ + "Character", + "\u0441" + ] + ] + }, + { + "input": "&sdot", + "description": "Bad named entity: sdot without a semi-colon", + "output": [ + [ + "Character", + "&sdot" + ] + ] + }, + { + "input": "⋅", + "description": "Named entity: sdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22c5" + ] + ] + }, + { + "input": "&sdotb", + "description": "Bad named entity: sdotb without a semi-colon", + "output": [ + [ + "Character", + "&sdotb" + ] + ] + }, + { + "input": "⊡", + "description": "Named entity: sdotb; with a semi-colon", + "output": [ + [ + "Character", + "\u22a1" + ] + ] + }, + { + "input": "&sdote", + "description": "Bad named entity: sdote without a semi-colon", + "output": [ + [ + "Character", + "&sdote" + ] + ] + }, + { + "input": "⩦", + "description": "Named entity: sdote; with a semi-colon", + "output": [ + [ + "Character", + "\u2a66" + ] + ] + }, + { + "input": "&seArr", + "description": "Bad named entity: seArr without a semi-colon", + "output": [ + [ + "Character", + "&seArr" + ] + ] + }, + { + "input": "⇘", + "description": "Named entity: seArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d8" + ] + ] + }, + { + "input": "&searhk", + "description": "Bad named entity: searhk without a semi-colon", + "output": [ + [ + "Character", + "&searhk" + ] + ] + }, + { + "input": "⤥", + "description": "Named entity: searhk; with a semi-colon", + "output": [ + [ + "Character", + "\u2925" + ] + ] + }, + { + "input": "&searr", + "description": "Bad named entity: searr without a semi-colon", + "output": [ + [ + "Character", + "&searr" + ] + ] + }, + { + "input": "↘", + "description": "Named entity: searr; with a semi-colon", + "output": [ + [ + "Character", + "\u2198" + ] + ] + }, + { + "input": "&searrow", + "description": "Bad named entity: searrow without a semi-colon", + "output": [ + [ + "Character", + "&searrow" + ] + ] + }, + { + "input": "↘", + "description": "Named entity: searrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2198" + ] + ] + }, + { + "input": "§", + "description": "Named entity: sect without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a7" + ] + ] + }, + { + "input": "§", + "description": "Named entity: sect; with a semi-colon", + "output": [ + [ + "Character", + "\u00a7" + ] + ] + }, + { + "input": "&semi", + "description": "Bad named entity: semi without a semi-colon", + "output": [ + [ + "Character", + "&semi" + ] + ] + }, + { + "input": ";", + "description": "Named entity: semi; with a semi-colon", + "output": [ + [ + "Character", + ";" + ] + ] + }, + { + "input": "&seswar", + "description": "Bad named entity: seswar without a semi-colon", + "output": [ + [ + "Character", + "&seswar" + ] + ] + }, + { + "input": "⤩", + "description": "Named entity: seswar; with a semi-colon", + "output": [ + [ + "Character", + "\u2929" + ] + ] + }, + { + "input": "&setminus", + "description": "Bad named entity: setminus without a semi-colon", + "output": [ + [ + "Character", + "&setminus" + ] + ] + }, + { + "input": "∖", + "description": "Named entity: setminus; with a semi-colon", + "output": [ + [ + "Character", + "\u2216" + ] + ] + }, + { + "input": "&setmn", + "description": "Bad named entity: setmn without a semi-colon", + "output": [ + [ + "Character", + "&setmn" + ] + ] + }, + { + "input": "∖", + "description": "Named entity: setmn; with a semi-colon", + "output": [ + [ + "Character", + "\u2216" + ] + ] + }, + { + "input": "&sext", + "description": "Bad named entity: sext without a semi-colon", + "output": [ + [ + "Character", + "&sext" + ] + ] + }, + { + "input": "✶", + "description": "Named entity: sext; with a semi-colon", + "output": [ + [ + "Character", + "\u2736" + ] + ] + }, + { + "input": "&sfr", + "description": "Bad named entity: sfr without a semi-colon", + "output": [ + [ + "Character", + "&sfr" + ] + ] + }, + { + "input": "𝔰", + "description": "Named entity: sfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd30" + ] + ] + }, + { + "input": "&sfrown", + "description": "Bad named entity: sfrown without a semi-colon", + "output": [ + [ + "Character", + "&sfrown" + ] + ] + }, + { + "input": "⌢", + "description": "Named entity: sfrown; with a semi-colon", + "output": [ + [ + "Character", + "\u2322" + ] + ] + }, + { + "input": "&sharp", + "description": "Bad named entity: sharp without a semi-colon", + "output": [ + [ + "Character", + "&sharp" + ] + ] + }, + { + "input": "♯", + "description": "Named entity: sharp; with a semi-colon", + "output": [ + [ + "Character", + "\u266f" + ] + ] + }, + { + "input": "&shchcy", + "description": "Bad named entity: shchcy without a semi-colon", + "output": [ + [ + "Character", + "&shchcy" + ] + ] + }, + { + "input": "щ", + "description": "Named entity: shchcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0449" + ] + ] + }, + { + "input": "&shcy", + "description": "Bad named entity: shcy without a semi-colon", + "output": [ + [ + "Character", + "&shcy" + ] + ] + }, + { + "input": "ш", + "description": "Named entity: shcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0448" + ] + ] + }, + { + "input": "&shortmid", + "description": "Bad named entity: shortmid without a semi-colon", + "output": [ + [ + "Character", + "&shortmid" + ] + ] + }, + { + "input": "∣", + "description": "Named entity: shortmid; with a semi-colon", + "output": [ + [ + "Character", + "\u2223" + ] + ] + }, + { + "input": "&shortparallel", + "description": "Bad named entity: shortparallel without a semi-colon", + "output": [ + [ + "Character", + "&shortparallel" + ] + ] + }, + { + "input": "∥", + "description": "Named entity: shortparallel; with a semi-colon", + "output": [ + [ + "Character", + "\u2225" + ] + ] + }, + { + "input": "­", + "description": "Named entity: shy without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ad" + ] + ] + }, + { + "input": "­", + "description": "Named entity: shy; with a semi-colon", + "output": [ + [ + "Character", + "\u00ad" + ] + ] + }, + { + "input": "&sigma", + "description": "Bad named entity: sigma without a semi-colon", + "output": [ + [ + "Character", + "&sigma" + ] + ] + }, + { + "input": "σ", + "description": "Named entity: sigma; with a semi-colon", + "output": [ + [ + "Character", + "\u03c3" + ] + ] + }, + { + "input": "&sigmaf", + "description": "Bad named entity: sigmaf without a semi-colon", + "output": [ + [ + "Character", + "&sigmaf" + ] + ] + }, + { + "input": "ς", + "description": "Named entity: sigmaf; with a semi-colon", + "output": [ + [ + "Character", + "\u03c2" + ] + ] + }, + { + "input": "&sigmav", + "description": "Bad named entity: sigmav without a semi-colon", + "output": [ + [ + "Character", + "&sigmav" + ] + ] + }, + { + "input": "ς", + "description": "Named entity: sigmav; with a semi-colon", + "output": [ + [ + "Character", + "\u03c2" + ] + ] + }, + { + "input": "&sim", + "description": "Bad named entity: sim without a semi-colon", + "output": [ + [ + "Character", + "&sim" + ] + ] + }, + { + "input": "∼", + "description": "Named entity: sim; with a semi-colon", + "output": [ + [ + "Character", + "\u223c" + ] + ] + }, + { + "input": "&simdot", + "description": "Bad named entity: simdot without a semi-colon", + "output": [ + [ + "Character", + "&simdot" + ] + ] + }, + { + "input": "⩪", + "description": "Named entity: simdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a6a" + ] + ] + }, + { + "input": "&sime", + "description": "Bad named entity: sime without a semi-colon", + "output": [ + [ + "Character", + "&sime" + ] + ] + }, + { + "input": "≃", + "description": "Named entity: sime; with a semi-colon", + "output": [ + [ + "Character", + "\u2243" + ] + ] + }, + { + "input": "&simeq", + "description": "Bad named entity: simeq without a semi-colon", + "output": [ + [ + "Character", + "&simeq" + ] + ] + }, + { + "input": "≃", + "description": "Named entity: simeq; with a semi-colon", + "output": [ + [ + "Character", + "\u2243" + ] + ] + }, + { + "input": "&simg", + "description": "Bad named entity: simg without a semi-colon", + "output": [ + [ + "Character", + "&simg" + ] + ] + }, + { + "input": "⪞", + "description": "Named entity: simg; with a semi-colon", + "output": [ + [ + "Character", + "\u2a9e" + ] + ] + }, + { + "input": "&simgE", + "description": "Bad named entity: simgE without a semi-colon", + "output": [ + [ + "Character", + "&simgE" + ] + ] + }, + { + "input": "⪠", + "description": "Named entity: simgE; with a semi-colon", + "output": [ + [ + "Character", + "\u2aa0" + ] + ] + }, + { + "input": "&siml", + "description": "Bad named entity: siml without a semi-colon", + "output": [ + [ + "Character", + "&siml" + ] + ] + }, + { + "input": "⪝", + "description": "Named entity: siml; with a semi-colon", + "output": [ + [ + "Character", + "\u2a9d" + ] + ] + }, + { + "input": "&simlE", + "description": "Bad named entity: simlE without a semi-colon", + "output": [ + [ + "Character", + "&simlE" + ] + ] + }, + { + "input": "⪟", + "description": "Named entity: simlE; with a semi-colon", + "output": [ + [ + "Character", + "\u2a9f" + ] + ] + }, + { + "input": "&simne", + "description": "Bad named entity: simne without a semi-colon", + "output": [ + [ + "Character", + "&simne" + ] + ] + }, + { + "input": "≆", + "description": "Named entity: simne; with a semi-colon", + "output": [ + [ + "Character", + "\u2246" + ] + ] + }, + { + "input": "&simplus", + "description": "Bad named entity: simplus without a semi-colon", + "output": [ + [ + "Character", + "&simplus" + ] + ] + }, + { + "input": "⨤", + "description": "Named entity: simplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a24" + ] + ] + }, + { + "input": "&simrarr", + "description": "Bad named entity: simrarr without a semi-colon", + "output": [ + [ + "Character", + "&simrarr" + ] + ] + }, + { + "input": "⥲", + "description": "Named entity: simrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2972" + ] + ] + }, + { + "input": "&slarr", + "description": "Bad named entity: slarr without a semi-colon", + "output": [ + [ + "Character", + "&slarr" + ] + ] + }, + { + "input": "←", + "description": "Named entity: slarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2190" + ] + ] + }, + { + "input": "&smallsetminus", + "description": "Bad named entity: smallsetminus without a semi-colon", + "output": [ + [ + "Character", + "&smallsetminus" + ] + ] + }, + { + "input": "∖", + "description": "Named entity: smallsetminus; with a semi-colon", + "output": [ + [ + "Character", + "\u2216" + ] + ] + }, + { + "input": "&smashp", + "description": "Bad named entity: smashp without a semi-colon", + "output": [ + [ + "Character", + "&smashp" + ] + ] + }, + { + "input": "⨳", + "description": "Named entity: smashp; with a semi-colon", + "output": [ + [ + "Character", + "\u2a33" + ] + ] + }, + { + "input": "&smeparsl", + "description": "Bad named entity: smeparsl without a semi-colon", + "output": [ + [ + "Character", + "&smeparsl" + ] + ] + }, + { + "input": "⧤", + "description": "Named entity: smeparsl; with a semi-colon", + "output": [ + [ + "Character", + "\u29e4" + ] + ] + }, + { + "input": "&smid", + "description": "Bad named entity: smid without a semi-colon", + "output": [ + [ + "Character", + "&smid" + ] + ] + }, + { + "input": "∣", + "description": "Named entity: smid; with a semi-colon", + "output": [ + [ + "Character", + "\u2223" + ] + ] + }, + { + "input": "&smile", + "description": "Bad named entity: smile without a semi-colon", + "output": [ + [ + "Character", + "&smile" + ] + ] + }, + { + "input": "⌣", + "description": "Named entity: smile; with a semi-colon", + "output": [ + [ + "Character", + "\u2323" + ] + ] + }, + { + "input": "&smt", + "description": "Bad named entity: smt without a semi-colon", + "output": [ + [ + "Character", + "&smt" + ] + ] + }, + { + "input": "⪪", + "description": "Named entity: smt; with a semi-colon", + "output": [ + [ + "Character", + "\u2aaa" + ] + ] + }, + { + "input": "&smte", + "description": "Bad named entity: smte without a semi-colon", + "output": [ + [ + "Character", + "&smte" + ] + ] + }, + { + "input": "⪬", + "description": "Named entity: smte; with a semi-colon", + "output": [ + [ + "Character", + "\u2aac" + ] + ] + }, + { + "input": "&smtes", + "description": "Bad named entity: smtes without a semi-colon", + "output": [ + [ + "Character", + "&smtes" + ] + ] + }, + { + "input": "⪬︀", + "description": "Named entity: smtes; with a semi-colon", + "output": [ + [ + "Character", + "\u2aac\ufe00" + ] + ] + }, + { + "input": "&softcy", + "description": "Bad named entity: softcy without a semi-colon", + "output": [ + [ + "Character", + "&softcy" + ] + ] + }, + { + "input": "ь", + "description": "Named entity: softcy; with a semi-colon", + "output": [ + [ + "Character", + "\u044c" + ] + ] + }, + { + "input": "&sol", + "description": "Bad named entity: sol without a semi-colon", + "output": [ + [ + "Character", + "&sol" + ] + ] + }, + { + "input": "/", + "description": "Named entity: sol; with a semi-colon", + "output": [ + [ + "Character", + "/" + ] + ] + }, + { + "input": "&solb", + "description": "Bad named entity: solb without a semi-colon", + "output": [ + [ + "Character", + "&solb" + ] + ] + }, + { + "input": "⧄", + "description": "Named entity: solb; with a semi-colon", + "output": [ + [ + "Character", + "\u29c4" + ] + ] + }, + { + "input": "&solbar", + "description": "Bad named entity: solbar without a semi-colon", + "output": [ + [ + "Character", + "&solbar" + ] + ] + }, + { + "input": "⌿", + "description": "Named entity: solbar; with a semi-colon", + "output": [ + [ + "Character", + "\u233f" + ] + ] + }, + { + "input": "&sopf", + "description": "Bad named entity: sopf without a semi-colon", + "output": [ + [ + "Character", + "&sopf" + ] + ] + }, + { + "input": "𝕤", + "description": "Named entity: sopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd64" + ] + ] + }, + { + "input": "&spades", + "description": "Bad named entity: spades without a semi-colon", + "output": [ + [ + "Character", + "&spades" + ] + ] + }, + { + "input": "♠", + "description": "Named entity: spades; with a semi-colon", + "output": [ + [ + "Character", + "\u2660" + ] + ] + }, + { + "input": "&spadesuit", + "description": "Bad named entity: spadesuit without a semi-colon", + "output": [ + [ + "Character", + "&spadesuit" + ] + ] + }, + { + "input": "♠", + "description": "Named entity: spadesuit; with a semi-colon", + "output": [ + [ + "Character", + "\u2660" + ] + ] + }, + { + "input": "&spar", + "description": "Bad named entity: spar without a semi-colon", + "output": [ + [ + "Character", + "&spar" + ] + ] + }, + { + "input": "∥", + "description": "Named entity: spar; with a semi-colon", + "output": [ + [ + "Character", + "\u2225" + ] + ] + }, + { + "input": "&sqcap", + "description": "Bad named entity: sqcap without a semi-colon", + "output": [ + [ + "Character", + "&sqcap" + ] + ] + }, + { + "input": "⊓", + "description": "Named entity: sqcap; with a semi-colon", + "output": [ + [ + "Character", + "\u2293" + ] + ] + }, + { + "input": "&sqcaps", + "description": "Bad named entity: sqcaps without a semi-colon", + "output": [ + [ + "Character", + "&sqcaps" + ] + ] + }, + { + "input": "⊓︀", + "description": "Named entity: sqcaps; with a semi-colon", + "output": [ + [ + "Character", + "\u2293\ufe00" + ] + ] + }, + { + "input": "&sqcup", + "description": "Bad named entity: sqcup without a semi-colon", + "output": [ + [ + "Character", + "&sqcup" + ] + ] + }, + { + "input": "⊔", + "description": "Named entity: sqcup; with a semi-colon", + "output": [ + [ + "Character", + "\u2294" + ] + ] + }, + { + "input": "&sqcups", + "description": "Bad named entity: sqcups without a semi-colon", + "output": [ + [ + "Character", + "&sqcups" + ] + ] + }, + { + "input": "⊔︀", + "description": "Named entity: sqcups; with a semi-colon", + "output": [ + [ + "Character", + "\u2294\ufe00" + ] + ] + }, + { + "input": "&sqsub", + "description": "Bad named entity: sqsub without a semi-colon", + "output": [ + [ + "Character", + "&sqsub" + ] + ] + }, + { + "input": "⊏", + "description": "Named entity: sqsub; with a semi-colon", + "output": [ + [ + "Character", + "\u228f" + ] + ] + }, + { + "input": "&sqsube", + "description": "Bad named entity: sqsube without a semi-colon", + "output": [ + [ + "Character", + "&sqsube" + ] + ] + }, + { + "input": "⊑", + "description": "Named entity: sqsube; with a semi-colon", + "output": [ + [ + "Character", + "\u2291" + ] + ] + }, + { + "input": "&sqsubset", + "description": "Bad named entity: sqsubset without a semi-colon", + "output": [ + [ + "Character", + "&sqsubset" + ] + ] + }, + { + "input": "⊏", + "description": "Named entity: sqsubset; with a semi-colon", + "output": [ + [ + "Character", + "\u228f" + ] + ] + }, + { + "input": "&sqsubseteq", + "description": "Bad named entity: sqsubseteq without a semi-colon", + "output": [ + [ + "Character", + "&sqsubseteq" + ] + ] + }, + { + "input": "⊑", + "description": "Named entity: sqsubseteq; with a semi-colon", + "output": [ + [ + "Character", + "\u2291" + ] + ] + }, + { + "input": "&sqsup", + "description": "Bad named entity: sqsup without a semi-colon", + "output": [ + [ + "Character", + "&sqsup" + ] + ] + }, + { + "input": "⊐", + "description": "Named entity: sqsup; with a semi-colon", + "output": [ + [ + "Character", + "\u2290" + ] + ] + }, + { + "input": "&sqsupe", + "description": "Bad named entity: sqsupe without a semi-colon", + "output": [ + [ + "Character", + "&sqsupe" + ] + ] + }, + { + "input": "⊒", + "description": "Named entity: sqsupe; with a semi-colon", + "output": [ + [ + "Character", + "\u2292" + ] + ] + }, + { + "input": "&sqsupset", + "description": "Bad named entity: sqsupset without a semi-colon", + "output": [ + [ + "Character", + "&sqsupset" + ] + ] + }, + { + "input": "⊐", + "description": "Named entity: sqsupset; with a semi-colon", + "output": [ + [ + "Character", + "\u2290" + ] + ] + }, + { + "input": "&sqsupseteq", + "description": "Bad named entity: sqsupseteq without a semi-colon", + "output": [ + [ + "Character", + "&sqsupseteq" + ] + ] + }, + { + "input": "⊒", + "description": "Named entity: sqsupseteq; with a semi-colon", + "output": [ + [ + "Character", + "\u2292" + ] + ] + }, + { + "input": "&squ", + "description": "Bad named entity: squ without a semi-colon", + "output": [ + [ + "Character", + "&squ" + ] + ] + }, + { + "input": "□", + "description": "Named entity: squ; with a semi-colon", + "output": [ + [ + "Character", + "\u25a1" + ] + ] + }, + { + "input": "&square", + "description": "Bad named entity: square without a semi-colon", + "output": [ + [ + "Character", + "&square" + ] + ] + }, + { + "input": "□", + "description": "Named entity: square; with a semi-colon", + "output": [ + [ + "Character", + "\u25a1" + ] + ] + }, + { + "input": "&squarf", + "description": "Bad named entity: squarf without a semi-colon", + "output": [ + [ + "Character", + "&squarf" + ] + ] + }, + { + "input": "▪", + "description": "Named entity: squarf; with a semi-colon", + "output": [ + [ + "Character", + "\u25aa" + ] + ] + }, + { + "input": "&squf", + "description": "Bad named entity: squf without a semi-colon", + "output": [ + [ + "Character", + "&squf" + ] + ] + }, + { + "input": "▪", + "description": "Named entity: squf; with a semi-colon", + "output": [ + [ + "Character", + "\u25aa" + ] + ] + }, + { + "input": "&srarr", + "description": "Bad named entity: srarr without a semi-colon", + "output": [ + [ + "Character", + "&srarr" + ] + ] + }, + { + "input": "→", + "description": "Named entity: srarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2192" + ] + ] + }, + { + "input": "&sscr", + "description": "Bad named entity: sscr without a semi-colon", + "output": [ + [ + "Character", + "&sscr" + ] + ] + }, + { + "input": "𝓈", + "description": "Named entity: sscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc8" + ] + ] + }, + { + "input": "&ssetmn", + "description": "Bad named entity: ssetmn without a semi-colon", + "output": [ + [ + "Character", + "&ssetmn" + ] + ] + }, + { + "input": "∖", + "description": "Named entity: ssetmn; with a semi-colon", + "output": [ + [ + "Character", + "\u2216" + ] + ] + }, + { + "input": "&ssmile", + "description": "Bad named entity: ssmile without a semi-colon", + "output": [ + [ + "Character", + "&ssmile" + ] + ] + }, + { + "input": "⌣", + "description": "Named entity: ssmile; with a semi-colon", + "output": [ + [ + "Character", + "\u2323" + ] + ] + }, + { + "input": "&sstarf", + "description": "Bad named entity: sstarf without a semi-colon", + "output": [ + [ + "Character", + "&sstarf" + ] + ] + }, + { + "input": "⋆", + "description": "Named entity: sstarf; with a semi-colon", + "output": [ + [ + "Character", + "\u22c6" + ] + ] + }, + { + "input": "&star", + "description": "Bad named entity: star without a semi-colon", + "output": [ + [ + "Character", + "&star" + ] + ] + }, + { + "input": "☆", + "description": "Named entity: star; with a semi-colon", + "output": [ + [ + "Character", + "\u2606" + ] + ] + }, + { + "input": "&starf", + "description": "Bad named entity: starf without a semi-colon", + "output": [ + [ + "Character", + "&starf" + ] + ] + }, + { + "input": "★", + "description": "Named entity: starf; with a semi-colon", + "output": [ + [ + "Character", + "\u2605" + ] + ] + }, + { + "input": "&straightepsilon", + "description": "Bad named entity: straightepsilon without a semi-colon", + "output": [ + [ + "Character", + "&straightepsilon" + ] + ] + }, + { + "input": "ϵ", + "description": "Named entity: straightepsilon; with a semi-colon", + "output": [ + [ + "Character", + "\u03f5" + ] + ] + }, + { + "input": "&straightphi", + "description": "Bad named entity: straightphi without a semi-colon", + "output": [ + [ + "Character", + "&straightphi" + ] + ] + }, + { + "input": "ϕ", + "description": "Named entity: straightphi; with a semi-colon", + "output": [ + [ + "Character", + "\u03d5" + ] + ] + }, + { + "input": "&strns", + "description": "Bad named entity: strns without a semi-colon", + "output": [ + [ + "Character", + "&strns" + ] + ] + }, + { + "input": "¯", + "description": "Named entity: strns; with a semi-colon", + "output": [ + [ + "Character", + "\u00af" + ] + ] + }, + { + "input": "&sub", + "description": "Bad named entity: sub without a semi-colon", + "output": [ + [ + "Character", + "&sub" + ] + ] + }, + { + "input": "⊂", + "description": "Named entity: sub; with a semi-colon", + "output": [ + [ + "Character", + "\u2282" + ] + ] + }, + { + "input": "&subE", + "description": "Bad named entity: subE without a semi-colon", + "output": [ + [ + "Character", + "&subE" + ] + ] + }, + { + "input": "⫅", + "description": "Named entity: subE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac5" + ] + ] + }, + { + "input": "&subdot", + "description": "Bad named entity: subdot without a semi-colon", + "output": [ + [ + "Character", + "&subdot" + ] + ] + }, + { + "input": "⪽", + "description": "Named entity: subdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2abd" + ] + ] + }, + { + "input": "&sube", + "description": "Bad named entity: sube without a semi-colon", + "output": [ + [ + "Character", + "&sube" + ] + ] + }, + { + "input": "⊆", + "description": "Named entity: sube; with a semi-colon", + "output": [ + [ + "Character", + "\u2286" + ] + ] + }, + { + "input": "&subedot", + "description": "Bad named entity: subedot without a semi-colon", + "output": [ + [ + "Character", + "&subedot" + ] + ] + }, + { + "input": "⫃", + "description": "Named entity: subedot; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac3" + ] + ] + }, + { + "input": "&submult", + "description": "Bad named entity: submult without a semi-colon", + "output": [ + [ + "Character", + "&submult" + ] + ] + }, + { + "input": "⫁", + "description": "Named entity: submult; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac1" + ] + ] + }, + { + "input": "&subnE", + "description": "Bad named entity: subnE without a semi-colon", + "output": [ + [ + "Character", + "&subnE" + ] + ] + }, + { + "input": "⫋", + "description": "Named entity: subnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2acb" + ] + ] + }, + { + "input": "&subne", + "description": "Bad named entity: subne without a semi-colon", + "output": [ + [ + "Character", + "&subne" + ] + ] + }, + { + "input": "⊊", + "description": "Named entity: subne; with a semi-colon", + "output": [ + [ + "Character", + "\u228a" + ] + ] + }, + { + "input": "&subplus", + "description": "Bad named entity: subplus without a semi-colon", + "output": [ + [ + "Character", + "&subplus" + ] + ] + }, + { + "input": "⪿", + "description": "Named entity: subplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2abf" + ] + ] + }, + { + "input": "&subrarr", + "description": "Bad named entity: subrarr without a semi-colon", + "output": [ + [ + "Character", + "&subrarr" + ] + ] + }, + { + "input": "⥹", + "description": "Named entity: subrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2979" + ] + ] + }, + { + "input": "&subset", + "description": "Bad named entity: subset without a semi-colon", + "output": [ + [ + "Character", + "&subset" + ] + ] + }, + { + "input": "⊂", + "description": "Named entity: subset; with a semi-colon", + "output": [ + [ + "Character", + "\u2282" + ] + ] + }, + { + "input": "&subseteq", + "description": "Bad named entity: subseteq without a semi-colon", + "output": [ + [ + "Character", + "&subseteq" + ] + ] + }, + { + "input": "⊆", + "description": "Named entity: subseteq; with a semi-colon", + "output": [ + [ + "Character", + "\u2286" + ] + ] + }, + { + "input": "&subseteqq", + "description": "Bad named entity: subseteqq without a semi-colon", + "output": [ + [ + "Character", + "&subseteqq" + ] + ] + }, + { + "input": "⫅", + "description": "Named entity: subseteqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac5" + ] + ] + }, + { + "input": "&subsetneq", + "description": "Bad named entity: subsetneq without a semi-colon", + "output": [ + [ + "Character", + "&subsetneq" + ] + ] + }, + { + "input": "⊊", + "description": "Named entity: subsetneq; with a semi-colon", + "output": [ + [ + "Character", + "\u228a" + ] + ] + }, + { + "input": "&subsetneqq", + "description": "Bad named entity: subsetneqq without a semi-colon", + "output": [ + [ + "Character", + "&subsetneqq" + ] + ] + }, + { + "input": "⫋", + "description": "Named entity: subsetneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2acb" + ] + ] + }, + { + "input": "&subsim", + "description": "Bad named entity: subsim without a semi-colon", + "output": [ + [ + "Character", + "&subsim" + ] + ] + }, + { + "input": "⫇", + "description": "Named entity: subsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac7" + ] + ] + }, + { + "input": "&subsub", + "description": "Bad named entity: subsub without a semi-colon", + "output": [ + [ + "Character", + "&subsub" + ] + ] + }, + { + "input": "⫕", + "description": "Named entity: subsub; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad5" + ] + ] + }, + { + "input": "&subsup", + "description": "Bad named entity: subsup without a semi-colon", + "output": [ + [ + "Character", + "&subsup" + ] + ] + }, + { + "input": "⫓", + "description": "Named entity: subsup; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad3" + ] + ] + }, + { + "input": "&succ", + "description": "Bad named entity: succ without a semi-colon", + "output": [ + [ + "Character", + "&succ" + ] + ] + }, + { + "input": "≻", + "description": "Named entity: succ; with a semi-colon", + "output": [ + [ + "Character", + "\u227b" + ] + ] + }, + { + "input": "&succapprox", + "description": "Bad named entity: succapprox without a semi-colon", + "output": [ + [ + "Character", + "&succapprox" + ] + ] + }, + { + "input": "⪸", + "description": "Named entity: succapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab8" + ] + ] + }, + { + "input": "&succcurlyeq", + "description": "Bad named entity: succcurlyeq without a semi-colon", + "output": [ + [ + "Character", + "&succcurlyeq" + ] + ] + }, + { + "input": "≽", + "description": "Named entity: succcurlyeq; with a semi-colon", + "output": [ + [ + "Character", + "\u227d" + ] + ] + }, + { + "input": "&succeq", + "description": "Bad named entity: succeq without a semi-colon", + "output": [ + [ + "Character", + "&succeq" + ] + ] + }, + { + "input": "⪰", + "description": "Named entity: succeq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab0" + ] + ] + }, + { + "input": "&succnapprox", + "description": "Bad named entity: succnapprox without a semi-colon", + "output": [ + [ + "Character", + "&succnapprox" + ] + ] + }, + { + "input": "⪺", + "description": "Named entity: succnapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2aba" + ] + ] + }, + { + "input": "&succneqq", + "description": "Bad named entity: succneqq without a semi-colon", + "output": [ + [ + "Character", + "&succneqq" + ] + ] + }, + { + "input": "⪶", + "description": "Named entity: succneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ab6" + ] + ] + }, + { + "input": "&succnsim", + "description": "Bad named entity: succnsim without a semi-colon", + "output": [ + [ + "Character", + "&succnsim" + ] + ] + }, + { + "input": "⋩", + "description": "Named entity: succnsim; with a semi-colon", + "output": [ + [ + "Character", + "\u22e9" + ] + ] + }, + { + "input": "&succsim", + "description": "Bad named entity: succsim without a semi-colon", + "output": [ + [ + "Character", + "&succsim" + ] + ] + }, + { + "input": "≿", + "description": "Named entity: succsim; with a semi-colon", + "output": [ + [ + "Character", + "\u227f" + ] + ] + }, + { + "input": "&sum", + "description": "Bad named entity: sum without a semi-colon", + "output": [ + [ + "Character", + "&sum" + ] + ] + }, + { + "input": "∑", + "description": "Named entity: sum; with a semi-colon", + "output": [ + [ + "Character", + "\u2211" + ] + ] + }, + { + "input": "&sung", + "description": "Bad named entity: sung without a semi-colon", + "output": [ + [ + "Character", + "&sung" + ] + ] + }, + { + "input": "♪", + "description": "Named entity: sung; with a semi-colon", + "output": [ + [ + "Character", + "\u266a" + ] + ] + }, + { + "input": "&sup", + "description": "Bad named entity: sup without a semi-colon", + "output": [ + [ + "Character", + "&sup" + ] + ] + }, + { + "input": "¹", + "description": "Named entity: sup1 without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b9" + ] + ] + }, + { + "input": "¹", + "description": "Named entity: sup1; with a semi-colon", + "output": [ + [ + "Character", + "\u00b9" + ] + ] + }, + { + "input": "²", + "description": "Named entity: sup2 without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b2" + ] + ] + }, + { + "input": "²", + "description": "Named entity: sup2; with a semi-colon", + "output": [ + [ + "Character", + "\u00b2" + ] + ] + }, + { + "input": "³", + "description": "Named entity: sup3 without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00b3" + ] + ] + }, + { + "input": "³", + "description": "Named entity: sup3; with a semi-colon", + "output": [ + [ + "Character", + "\u00b3" + ] + ] + }, + { + "input": "⊃", + "description": "Named entity: sup; with a semi-colon", + "output": [ + [ + "Character", + "\u2283" + ] + ] + }, + { + "input": "&supE", + "description": "Bad named entity: supE without a semi-colon", + "output": [ + [ + "Character", + "&supE" + ] + ] + }, + { + "input": "⫆", + "description": "Named entity: supE; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac6" + ] + ] + }, + { + "input": "&supdot", + "description": "Bad named entity: supdot without a semi-colon", + "output": [ + [ + "Character", + "&supdot" + ] + ] + }, + { + "input": "⪾", + "description": "Named entity: supdot; with a semi-colon", + "output": [ + [ + "Character", + "\u2abe" + ] + ] + }, + { + "input": "&supdsub", + "description": "Bad named entity: supdsub without a semi-colon", + "output": [ + [ + "Character", + "&supdsub" + ] + ] + }, + { + "input": "⫘", + "description": "Named entity: supdsub; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad8" + ] + ] + }, + { + "input": "&supe", + "description": "Bad named entity: supe without a semi-colon", + "output": [ + [ + "Character", + "&supe" + ] + ] + }, + { + "input": "⊇", + "description": "Named entity: supe; with a semi-colon", + "output": [ + [ + "Character", + "\u2287" + ] + ] + }, + { + "input": "&supedot", + "description": "Bad named entity: supedot without a semi-colon", + "output": [ + [ + "Character", + "&supedot" + ] + ] + }, + { + "input": "⫄", + "description": "Named entity: supedot; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac4" + ] + ] + }, + { + "input": "&suphsol", + "description": "Bad named entity: suphsol without a semi-colon", + "output": [ + [ + "Character", + "&suphsol" + ] + ] + }, + { + "input": "⟉", + "description": "Named entity: suphsol; with a semi-colon", + "output": [ + [ + "Character", + "\u27c9" + ] + ] + }, + { + "input": "&suphsub", + "description": "Bad named entity: suphsub without a semi-colon", + "output": [ + [ + "Character", + "&suphsub" + ] + ] + }, + { + "input": "⫗", + "description": "Named entity: suphsub; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad7" + ] + ] + }, + { + "input": "&suplarr", + "description": "Bad named entity: suplarr without a semi-colon", + "output": [ + [ + "Character", + "&suplarr" + ] + ] + }, + { + "input": "⥻", + "description": "Named entity: suplarr; with a semi-colon", + "output": [ + [ + "Character", + "\u297b" + ] + ] + }, + { + "input": "&supmult", + "description": "Bad named entity: supmult without a semi-colon", + "output": [ + [ + "Character", + "&supmult" + ] + ] + }, + { + "input": "⫂", + "description": "Named entity: supmult; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac2" + ] + ] + }, + { + "input": "&supnE", + "description": "Bad named entity: supnE without a semi-colon", + "output": [ + [ + "Character", + "&supnE" + ] + ] + }, + { + "input": "⫌", + "description": "Named entity: supnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2acc" + ] + ] + }, + { + "input": "&supne", + "description": "Bad named entity: supne without a semi-colon", + "output": [ + [ + "Character", + "&supne" + ] + ] + }, + { + "input": "⊋", + "description": "Named entity: supne; with a semi-colon", + "output": [ + [ + "Character", + "\u228b" + ] + ] + }, + { + "input": "&supplus", + "description": "Bad named entity: supplus without a semi-colon", + "output": [ + [ + "Character", + "&supplus" + ] + ] + }, + { + "input": "⫀", + "description": "Named entity: supplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac0" + ] + ] + }, + { + "input": "&supset", + "description": "Bad named entity: supset without a semi-colon", + "output": [ + [ + "Character", + "&supset" + ] + ] + }, + { + "input": "⊃", + "description": "Named entity: supset; with a semi-colon", + "output": [ + [ + "Character", + "\u2283" + ] + ] + }, + { + "input": "&supseteq", + "description": "Bad named entity: supseteq without a semi-colon", + "output": [ + [ + "Character", + "&supseteq" + ] + ] + }, + { + "input": "⊇", + "description": "Named entity: supseteq; with a semi-colon", + "output": [ + [ + "Character", + "\u2287" + ] + ] + }, + { + "input": "&supseteqq", + "description": "Bad named entity: supseteqq without a semi-colon", + "output": [ + [ + "Character", + "&supseteqq" + ] + ] + }, + { + "input": "⫆", + "description": "Named entity: supseteqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac6" + ] + ] + }, + { + "input": "&supsetneq", + "description": "Bad named entity: supsetneq without a semi-colon", + "output": [ + [ + "Character", + "&supsetneq" + ] + ] + }, + { + "input": "⊋", + "description": "Named entity: supsetneq; with a semi-colon", + "output": [ + [ + "Character", + "\u228b" + ] + ] + }, + { + "input": "&supsetneqq", + "description": "Bad named entity: supsetneqq without a semi-colon", + "output": [ + [ + "Character", + "&supsetneqq" + ] + ] + }, + { + "input": "⫌", + "description": "Named entity: supsetneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2acc" + ] + ] + }, + { + "input": "&supsim", + "description": "Bad named entity: supsim without a semi-colon", + "output": [ + [ + "Character", + "&supsim" + ] + ] + }, + { + "input": "⫈", + "description": "Named entity: supsim; with a semi-colon", + "output": [ + [ + "Character", + "\u2ac8" + ] + ] + }, + { + "input": "&supsub", + "description": "Bad named entity: supsub without a semi-colon", + "output": [ + [ + "Character", + "&supsub" + ] + ] + }, + { + "input": "⫔", + "description": "Named entity: supsub; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad4" + ] + ] + }, + { + "input": "&supsup", + "description": "Bad named entity: supsup without a semi-colon", + "output": [ + [ + "Character", + "&supsup" + ] + ] + }, + { + "input": "⫖", + "description": "Named entity: supsup; with a semi-colon", + "output": [ + [ + "Character", + "\u2ad6" + ] + ] + }, + { + "input": "&swArr", + "description": "Bad named entity: swArr without a semi-colon", + "output": [ + [ + "Character", + "&swArr" + ] + ] + }, + { + "input": "⇙", + "description": "Named entity: swArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d9" + ] + ] + }, + { + "input": "&swarhk", + "description": "Bad named entity: swarhk without a semi-colon", + "output": [ + [ + "Character", + "&swarhk" + ] + ] + }, + { + "input": "⤦", + "description": "Named entity: swarhk; with a semi-colon", + "output": [ + [ + "Character", + "\u2926" + ] + ] + }, + { + "input": "&swarr", + "description": "Bad named entity: swarr without a semi-colon", + "output": [ + [ + "Character", + "&swarr" + ] + ] + }, + { + "input": "↙", + "description": "Named entity: swarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2199" + ] + ] + }, + { + "input": "&swarrow", + "description": "Bad named entity: swarrow without a semi-colon", + "output": [ + [ + "Character", + "&swarrow" + ] + ] + }, + { + "input": "↙", + "description": "Named entity: swarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2199" + ] + ] + }, + { + "input": "&swnwar", + "description": "Bad named entity: swnwar without a semi-colon", + "output": [ + [ + "Character", + "&swnwar" + ] + ] + }, + { + "input": "⤪", + "description": "Named entity: swnwar; with a semi-colon", + "output": [ + [ + "Character", + "\u292a" + ] + ] + }, + { + "input": "ß", + "description": "Named entity: szlig without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00df" + ] + ] + }, + { + "input": "ß", + "description": "Named entity: szlig; with a semi-colon", + "output": [ + [ + "Character", + "\u00df" + ] + ] + }, + { + "input": "&target", + "description": "Bad named entity: target without a semi-colon", + "output": [ + [ + "Character", + "&target" + ] + ] + }, + { + "input": "⌖", + "description": "Named entity: target; with a semi-colon", + "output": [ + [ + "Character", + "\u2316" + ] + ] + }, + { + "input": "&tau", + "description": "Bad named entity: tau without a semi-colon", + "output": [ + [ + "Character", + "&tau" + ] + ] + }, + { + "input": "τ", + "description": "Named entity: tau; with a semi-colon", + "output": [ + [ + "Character", + "\u03c4" + ] + ] + }, + { + "input": "&tbrk", + "description": "Bad named entity: tbrk without a semi-colon", + "output": [ + [ + "Character", + "&tbrk" + ] + ] + }, + { + "input": "⎴", + "description": "Named entity: tbrk; with a semi-colon", + "output": [ + [ + "Character", + "\u23b4" + ] + ] + }, + { + "input": "&tcaron", + "description": "Bad named entity: tcaron without a semi-colon", + "output": [ + [ + "Character", + "&tcaron" + ] + ] + }, + { + "input": "ť", + "description": "Named entity: tcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u0165" + ] + ] + }, + { + "input": "&tcedil", + "description": "Bad named entity: tcedil without a semi-colon", + "output": [ + [ + "Character", + "&tcedil" + ] + ] + }, + { + "input": "ţ", + "description": "Named entity: tcedil; with a semi-colon", + "output": [ + [ + "Character", + "\u0163" + ] + ] + }, + { + "input": "&tcy", + "description": "Bad named entity: tcy without a semi-colon", + "output": [ + [ + "Character", + "&tcy" + ] + ] + }, + { + "input": "т", + "description": "Named entity: tcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0442" + ] + ] + }, + { + "input": "&tdot", + "description": "Bad named entity: tdot without a semi-colon", + "output": [ + [ + "Character", + "&tdot" + ] + ] + }, + { + "input": "⃛", + "description": "Named entity: tdot; with a semi-colon", + "output": [ + [ + "Character", + "\u20db" + ] + ] + }, + { + "input": "&telrec", + "description": "Bad named entity: telrec without a semi-colon", + "output": [ + [ + "Character", + "&telrec" + ] + ] + }, + { + "input": "⌕", + "description": "Named entity: telrec; with a semi-colon", + "output": [ + [ + "Character", + "\u2315" + ] + ] + }, + { + "input": "&tfr", + "description": "Bad named entity: tfr without a semi-colon", + "output": [ + [ + "Character", + "&tfr" + ] + ] + }, + { + "input": "𝔱", + "description": "Named entity: tfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd31" + ] + ] + }, + { + "input": "&there4", + "description": "Bad named entity: there4 without a semi-colon", + "output": [ + [ + "Character", + "&there4" + ] + ] + }, + { + "input": "∴", + "description": "Named entity: there4; with a semi-colon", + "output": [ + [ + "Character", + "\u2234" + ] + ] + }, + { + "input": "&therefore", + "description": "Bad named entity: therefore without a semi-colon", + "output": [ + [ + "Character", + "&therefore" + ] + ] + }, + { + "input": "∴", + "description": "Named entity: therefore; with a semi-colon", + "output": [ + [ + "Character", + "\u2234" + ] + ] + }, + { + "input": "&theta", + "description": "Bad named entity: theta without a semi-colon", + "output": [ + [ + "Character", + "&theta" + ] + ] + }, + { + "input": "θ", + "description": "Named entity: theta; with a semi-colon", + "output": [ + [ + "Character", + "\u03b8" + ] + ] + }, + { + "input": "&thetasym", + "description": "Bad named entity: thetasym without a semi-colon", + "output": [ + [ + "Character", + "&thetasym" + ] + ] + }, + { + "input": "ϑ", + "description": "Named entity: thetasym; with a semi-colon", + "output": [ + [ + "Character", + "\u03d1" + ] + ] + }, + { + "input": "&thetav", + "description": "Bad named entity: thetav without a semi-colon", + "output": [ + [ + "Character", + "&thetav" + ] + ] + }, + { + "input": "ϑ", + "description": "Named entity: thetav; with a semi-colon", + "output": [ + [ + "Character", + "\u03d1" + ] + ] + }, + { + "input": "&thickapprox", + "description": "Bad named entity: thickapprox without a semi-colon", + "output": [ + [ + "Character", + "&thickapprox" + ] + ] + }, + { + "input": "≈", + "description": "Named entity: thickapprox; with a semi-colon", + "output": [ + [ + "Character", + "\u2248" + ] + ] + }, + { + "input": "&thicksim", + "description": "Bad named entity: thicksim without a semi-colon", + "output": [ + [ + "Character", + "&thicksim" + ] + ] + }, + { + "input": "∼", + "description": "Named entity: thicksim; with a semi-colon", + "output": [ + [ + "Character", + "\u223c" + ] + ] + }, + { + "input": "&thinsp", + "description": "Bad named entity: thinsp without a semi-colon", + "output": [ + [ + "Character", + "&thinsp" + ] + ] + }, + { + "input": " ", + "description": "Named entity: thinsp; with a semi-colon", + "output": [ + [ + "Character", + "\u2009" + ] + ] + }, + { + "input": "&thkap", + "description": "Bad named entity: thkap without a semi-colon", + "output": [ + [ + "Character", + "&thkap" + ] + ] + }, + { + "input": "≈", + "description": "Named entity: thkap; with a semi-colon", + "output": [ + [ + "Character", + "\u2248" + ] + ] + }, + { + "input": "&thksim", + "description": "Bad named entity: thksim without a semi-colon", + "output": [ + [ + "Character", + "&thksim" + ] + ] + }, + { + "input": "∼", + "description": "Named entity: thksim; with a semi-colon", + "output": [ + [ + "Character", + "\u223c" + ] + ] + }, + { + "input": "þ", + "description": "Named entity: thorn without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00fe" + ] + ] + }, + { + "input": "þ", + "description": "Named entity: thorn; with a semi-colon", + "output": [ + [ + "Character", + "\u00fe" + ] + ] + }, + { + "input": "&tilde", + "description": "Bad named entity: tilde without a semi-colon", + "output": [ + [ + "Character", + "&tilde" + ] + ] + }, + { + "input": "˜", + "description": "Named entity: tilde; with a semi-colon", + "output": [ + [ + "Character", + "\u02dc" + ] + ] + }, + { + "input": "×", + "description": "Named entity: times without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00d7" + ] + ] + }, + { + "input": "×", + "description": "Named entity: times; with a semi-colon", + "output": [ + [ + "Character", + "\u00d7" + ] + ] + }, + { + "input": "⊠", + "description": "Named entity: timesb; with a semi-colon", + "output": [ + [ + "Character", + "\u22a0" + ] + ] + }, + { + "input": "⨱", + "description": "Named entity: timesbar; with a semi-colon", + "output": [ + [ + "Character", + "\u2a31" + ] + ] + }, + { + "input": "⨰", + "description": "Named entity: timesd; with a semi-colon", + "output": [ + [ + "Character", + "\u2a30" + ] + ] + }, + { + "input": "&tint", + "description": "Bad named entity: tint without a semi-colon", + "output": [ + [ + "Character", + "&tint" + ] + ] + }, + { + "input": "∭", + "description": "Named entity: tint; with a semi-colon", + "output": [ + [ + "Character", + "\u222d" + ] + ] + }, + { + "input": "&toea", + "description": "Bad named entity: toea without a semi-colon", + "output": [ + [ + "Character", + "&toea" + ] + ] + }, + { + "input": "⤨", + "description": "Named entity: toea; with a semi-colon", + "output": [ + [ + "Character", + "\u2928" + ] + ] + }, + { + "input": "&top", + "description": "Bad named entity: top without a semi-colon", + "output": [ + [ + "Character", + "&top" + ] + ] + }, + { + "input": "⊤", + "description": "Named entity: top; with a semi-colon", + "output": [ + [ + "Character", + "\u22a4" + ] + ] + }, + { + "input": "&topbot", + "description": "Bad named entity: topbot without a semi-colon", + "output": [ + [ + "Character", + "&topbot" + ] + ] + }, + { + "input": "⌶", + "description": "Named entity: topbot; with a semi-colon", + "output": [ + [ + "Character", + "\u2336" + ] + ] + }, + { + "input": "&topcir", + "description": "Bad named entity: topcir without a semi-colon", + "output": [ + [ + "Character", + "&topcir" + ] + ] + }, + { + "input": "⫱", + "description": "Named entity: topcir; with a semi-colon", + "output": [ + [ + "Character", + "\u2af1" + ] + ] + }, + { + "input": "&topf", + "description": "Bad named entity: topf without a semi-colon", + "output": [ + [ + "Character", + "&topf" + ] + ] + }, + { + "input": "𝕥", + "description": "Named entity: topf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd65" + ] + ] + }, + { + "input": "&topfork", + "description": "Bad named entity: topfork without a semi-colon", + "output": [ + [ + "Character", + "&topfork" + ] + ] + }, + { + "input": "⫚", + "description": "Named entity: topfork; with a semi-colon", + "output": [ + [ + "Character", + "\u2ada" + ] + ] + }, + { + "input": "&tosa", + "description": "Bad named entity: tosa without a semi-colon", + "output": [ + [ + "Character", + "&tosa" + ] + ] + }, + { + "input": "⤩", + "description": "Named entity: tosa; with a semi-colon", + "output": [ + [ + "Character", + "\u2929" + ] + ] + }, + { + "input": "&tprime", + "description": "Bad named entity: tprime without a semi-colon", + "output": [ + [ + "Character", + "&tprime" + ] + ] + }, + { + "input": "‴", + "description": "Named entity: tprime; with a semi-colon", + "output": [ + [ + "Character", + "\u2034" + ] + ] + }, + { + "input": "&trade", + "description": "Bad named entity: trade without a semi-colon", + "output": [ + [ + "Character", + "&trade" + ] + ] + }, + { + "input": "™", + "description": "Named entity: trade; with a semi-colon", + "output": [ + [ + "Character", + "\u2122" + ] + ] + }, + { + "input": "&triangle", + "description": "Bad named entity: triangle without a semi-colon", + "output": [ + [ + "Character", + "&triangle" + ] + ] + }, + { + "input": "▵", + "description": "Named entity: triangle; with a semi-colon", + "output": [ + [ + "Character", + "\u25b5" + ] + ] + }, + { + "input": "&triangledown", + "description": "Bad named entity: triangledown without a semi-colon", + "output": [ + [ + "Character", + "&triangledown" + ] + ] + }, + { + "input": "▿", + "description": "Named entity: triangledown; with a semi-colon", + "output": [ + [ + "Character", + "\u25bf" + ] + ] + }, + { + "input": "&triangleleft", + "description": "Bad named entity: triangleleft without a semi-colon", + "output": [ + [ + "Character", + "&triangleleft" + ] + ] + }, + { + "input": "◃", + "description": "Named entity: triangleleft; with a semi-colon", + "output": [ + [ + "Character", + "\u25c3" + ] + ] + }, + { + "input": "&trianglelefteq", + "description": "Bad named entity: trianglelefteq without a semi-colon", + "output": [ + [ + "Character", + "&trianglelefteq" + ] + ] + }, + { + "input": "⊴", + "description": "Named entity: trianglelefteq; with a semi-colon", + "output": [ + [ + "Character", + "\u22b4" + ] + ] + }, + { + "input": "&triangleq", + "description": "Bad named entity: triangleq without a semi-colon", + "output": [ + [ + "Character", + "&triangleq" + ] + ] + }, + { + "input": "≜", + "description": "Named entity: triangleq; with a semi-colon", + "output": [ + [ + "Character", + "\u225c" + ] + ] + }, + { + "input": "&triangleright", + "description": "Bad named entity: triangleright without a semi-colon", + "output": [ + [ + "Character", + "&triangleright" + ] + ] + }, + { + "input": "▹", + "description": "Named entity: triangleright; with a semi-colon", + "output": [ + [ + "Character", + "\u25b9" + ] + ] + }, + { + "input": "&trianglerighteq", + "description": "Bad named entity: trianglerighteq without a semi-colon", + "output": [ + [ + "Character", + "&trianglerighteq" + ] + ] + }, + { + "input": "⊵", + "description": "Named entity: trianglerighteq; with a semi-colon", + "output": [ + [ + "Character", + "\u22b5" + ] + ] + }, + { + "input": "&tridot", + "description": "Bad named entity: tridot without a semi-colon", + "output": [ + [ + "Character", + "&tridot" + ] + ] + }, + { + "input": "◬", + "description": "Named entity: tridot; with a semi-colon", + "output": [ + [ + "Character", + "\u25ec" + ] + ] + }, + { + "input": "&trie", + "description": "Bad named entity: trie without a semi-colon", + "output": [ + [ + "Character", + "&trie" + ] + ] + }, + { + "input": "≜", + "description": "Named entity: trie; with a semi-colon", + "output": [ + [ + "Character", + "\u225c" + ] + ] + }, + { + "input": "&triminus", + "description": "Bad named entity: triminus without a semi-colon", + "output": [ + [ + "Character", + "&triminus" + ] + ] + }, + { + "input": "⨺", + "description": "Named entity: triminus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a3a" + ] + ] + }, + { + "input": "&triplus", + "description": "Bad named entity: triplus without a semi-colon", + "output": [ + [ + "Character", + "&triplus" + ] + ] + }, + { + "input": "⨹", + "description": "Named entity: triplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a39" + ] + ] + }, + { + "input": "&trisb", + "description": "Bad named entity: trisb without a semi-colon", + "output": [ + [ + "Character", + "&trisb" + ] + ] + }, + { + "input": "⧍", + "description": "Named entity: trisb; with a semi-colon", + "output": [ + [ + "Character", + "\u29cd" + ] + ] + }, + { + "input": "&tritime", + "description": "Bad named entity: tritime without a semi-colon", + "output": [ + [ + "Character", + "&tritime" + ] + ] + }, + { + "input": "⨻", + "description": "Named entity: tritime; with a semi-colon", + "output": [ + [ + "Character", + "\u2a3b" + ] + ] + }, + { + "input": "&trpezium", + "description": "Bad named entity: trpezium without a semi-colon", + "output": [ + [ + "Character", + "&trpezium" + ] + ] + }, + { + "input": "⏢", + "description": "Named entity: trpezium; with a semi-colon", + "output": [ + [ + "Character", + "\u23e2" + ] + ] + }, + { + "input": "&tscr", + "description": "Bad named entity: tscr without a semi-colon", + "output": [ + [ + "Character", + "&tscr" + ] + ] + }, + { + "input": "𝓉", + "description": "Named entity: tscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcc9" + ] + ] + }, + { + "input": "&tscy", + "description": "Bad named entity: tscy without a semi-colon", + "output": [ + [ + "Character", + "&tscy" + ] + ] + }, + { + "input": "ц", + "description": "Named entity: tscy; with a semi-colon", + "output": [ + [ + "Character", + "\u0446" + ] + ] + }, + { + "input": "&tshcy", + "description": "Bad named entity: tshcy without a semi-colon", + "output": [ + [ + "Character", + "&tshcy" + ] + ] + }, + { + "input": "ћ", + "description": "Named entity: tshcy; with a semi-colon", + "output": [ + [ + "Character", + "\u045b" + ] + ] + }, + { + "input": "&tstrok", + "description": "Bad named entity: tstrok without a semi-colon", + "output": [ + [ + "Character", + "&tstrok" + ] + ] + }, + { + "input": "ŧ", + "description": "Named entity: tstrok; with a semi-colon", + "output": [ + [ + "Character", + "\u0167" + ] + ] + }, + { + "input": "&twixt", + "description": "Bad named entity: twixt without a semi-colon", + "output": [ + [ + "Character", + "&twixt" + ] + ] + }, + { + "input": "≬", + "description": "Named entity: twixt; with a semi-colon", + "output": [ + [ + "Character", + "\u226c" + ] + ] + }, + { + "input": "&twoheadleftarrow", + "description": "Bad named entity: twoheadleftarrow without a semi-colon", + "output": [ + [ + "Character", + "&twoheadleftarrow" + ] + ] + }, + { + "input": "↞", + "description": "Named entity: twoheadleftarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u219e" + ] + ] + }, + { + "input": "&twoheadrightarrow", + "description": "Bad named entity: twoheadrightarrow without a semi-colon", + "output": [ + [ + "Character", + "&twoheadrightarrow" + ] + ] + }, + { + "input": "↠", + "description": "Named entity: twoheadrightarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u21a0" + ] + ] + }, + { + "input": "&uArr", + "description": "Bad named entity: uArr without a semi-colon", + "output": [ + [ + "Character", + "&uArr" + ] + ] + }, + { + "input": "⇑", + "description": "Named entity: uArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d1" + ] + ] + }, + { + "input": "&uHar", + "description": "Bad named entity: uHar without a semi-colon", + "output": [ + [ + "Character", + "&uHar" + ] + ] + }, + { + "input": "⥣", + "description": "Named entity: uHar; with a semi-colon", + "output": [ + [ + "Character", + "\u2963" + ] + ] + }, + { + "input": "ú", + "description": "Named entity: uacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00fa" + ] + ] + }, + { + "input": "ú", + "description": "Named entity: uacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00fa" + ] + ] + }, + { + "input": "&uarr", + "description": "Bad named entity: uarr without a semi-colon", + "output": [ + [ + "Character", + "&uarr" + ] + ] + }, + { + "input": "↑", + "description": "Named entity: uarr; with a semi-colon", + "output": [ + [ + "Character", + "\u2191" + ] + ] + }, + { + "input": "&ubrcy", + "description": "Bad named entity: ubrcy without a semi-colon", + "output": [ + [ + "Character", + "&ubrcy" + ] + ] + }, + { + "input": "ў", + "description": "Named entity: ubrcy; with a semi-colon", + "output": [ + [ + "Character", + "\u045e" + ] + ] + }, + { + "input": "&ubreve", + "description": "Bad named entity: ubreve without a semi-colon", + "output": [ + [ + "Character", + "&ubreve" + ] + ] + }, + { + "input": "ŭ", + "description": "Named entity: ubreve; with a semi-colon", + "output": [ + [ + "Character", + "\u016d" + ] + ] + }, + { + "input": "û", + "description": "Named entity: ucirc without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00fb" + ] + ] + }, + { + "input": "û", + "description": "Named entity: ucirc; with a semi-colon", + "output": [ + [ + "Character", + "\u00fb" + ] + ] + }, + { + "input": "&ucy", + "description": "Bad named entity: ucy without a semi-colon", + "output": [ + [ + "Character", + "&ucy" + ] + ] + }, + { + "input": "у", + "description": "Named entity: ucy; with a semi-colon", + "output": [ + [ + "Character", + "\u0443" + ] + ] + }, + { + "input": "&udarr", + "description": "Bad named entity: udarr without a semi-colon", + "output": [ + [ + "Character", + "&udarr" + ] + ] + }, + { + "input": "⇅", + "description": "Named entity: udarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21c5" + ] + ] + }, + { + "input": "&udblac", + "description": "Bad named entity: udblac without a semi-colon", + "output": [ + [ + "Character", + "&udblac" + ] + ] + }, + { + "input": "ű", + "description": "Named entity: udblac; with a semi-colon", + "output": [ + [ + "Character", + "\u0171" + ] + ] + }, + { + "input": "&udhar", + "description": "Bad named entity: udhar without a semi-colon", + "output": [ + [ + "Character", + "&udhar" + ] + ] + }, + { + "input": "⥮", + "description": "Named entity: udhar; with a semi-colon", + "output": [ + [ + "Character", + "\u296e" + ] + ] + }, + { + "input": "&ufisht", + "description": "Bad named entity: ufisht without a semi-colon", + "output": [ + [ + "Character", + "&ufisht" + ] + ] + }, + { + "input": "⥾", + "description": "Named entity: ufisht; with a semi-colon", + "output": [ + [ + "Character", + "\u297e" + ] + ] + }, + { + "input": "&ufr", + "description": "Bad named entity: ufr without a semi-colon", + "output": [ + [ + "Character", + "&ufr" + ] + ] + }, + { + "input": "𝔲", + "description": "Named entity: ufr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd32" + ] + ] + }, + { + "input": "ù", + "description": "Named entity: ugrave without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00f9" + ] + ] + }, + { + "input": "ù", + "description": "Named entity: ugrave; with a semi-colon", + "output": [ + [ + "Character", + "\u00f9" + ] + ] + }, + { + "input": "&uharl", + "description": "Bad named entity: uharl without a semi-colon", + "output": [ + [ + "Character", + "&uharl" + ] + ] + }, + { + "input": "↿", + "description": "Named entity: uharl; with a semi-colon", + "output": [ + [ + "Character", + "\u21bf" + ] + ] + }, + { + "input": "&uharr", + "description": "Bad named entity: uharr without a semi-colon", + "output": [ + [ + "Character", + "&uharr" + ] + ] + }, + { + "input": "↾", + "description": "Named entity: uharr; with a semi-colon", + "output": [ + [ + "Character", + "\u21be" + ] + ] + }, + { + "input": "&uhblk", + "description": "Bad named entity: uhblk without a semi-colon", + "output": [ + [ + "Character", + "&uhblk" + ] + ] + }, + { + "input": "▀", + "description": "Named entity: uhblk; with a semi-colon", + "output": [ + [ + "Character", + "\u2580" + ] + ] + }, + { + "input": "&ulcorn", + "description": "Bad named entity: ulcorn without a semi-colon", + "output": [ + [ + "Character", + "&ulcorn" + ] + ] + }, + { + "input": "⌜", + "description": "Named entity: ulcorn; with a semi-colon", + "output": [ + [ + "Character", + "\u231c" + ] + ] + }, + { + "input": "&ulcorner", + "description": "Bad named entity: ulcorner without a semi-colon", + "output": [ + [ + "Character", + "&ulcorner" + ] + ] + }, + { + "input": "⌜", + "description": "Named entity: ulcorner; with a semi-colon", + "output": [ + [ + "Character", + "\u231c" + ] + ] + }, + { + "input": "&ulcrop", + "description": "Bad named entity: ulcrop without a semi-colon", + "output": [ + [ + "Character", + "&ulcrop" + ] + ] + }, + { + "input": "⌏", + "description": "Named entity: ulcrop; with a semi-colon", + "output": [ + [ + "Character", + "\u230f" + ] + ] + }, + { + "input": "&ultri", + "description": "Bad named entity: ultri without a semi-colon", + "output": [ + [ + "Character", + "&ultri" + ] + ] + }, + { + "input": "◸", + "description": "Named entity: ultri; with a semi-colon", + "output": [ + [ + "Character", + "\u25f8" + ] + ] + }, + { + "input": "&umacr", + "description": "Bad named entity: umacr without a semi-colon", + "output": [ + [ + "Character", + "&umacr" + ] + ] + }, + { + "input": "ū", + "description": "Named entity: umacr; with a semi-colon", + "output": [ + [ + "Character", + "\u016b" + ] + ] + }, + { + "input": "¨", + "description": "Named entity: uml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a8" + ] + ] + }, + { + "input": "¨", + "description": "Named entity: uml; with a semi-colon", + "output": [ + [ + "Character", + "\u00a8" + ] + ] + }, + { + "input": "&uogon", + "description": "Bad named entity: uogon without a semi-colon", + "output": [ + [ + "Character", + "&uogon" + ] + ] + }, + { + "input": "ų", + "description": "Named entity: uogon; with a semi-colon", + "output": [ + [ + "Character", + "\u0173" + ] + ] + }, + { + "input": "&uopf", + "description": "Bad named entity: uopf without a semi-colon", + "output": [ + [ + "Character", + "&uopf" + ] + ] + }, + { + "input": "𝕦", + "description": "Named entity: uopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd66" + ] + ] + }, + { + "input": "&uparrow", + "description": "Bad named entity: uparrow without a semi-colon", + "output": [ + [ + "Character", + "&uparrow" + ] + ] + }, + { + "input": "↑", + "description": "Named entity: uparrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2191" + ] + ] + }, + { + "input": "&updownarrow", + "description": "Bad named entity: updownarrow without a semi-colon", + "output": [ + [ + "Character", + "&updownarrow" + ] + ] + }, + { + "input": "↕", + "description": "Named entity: updownarrow; with a semi-colon", + "output": [ + [ + "Character", + "\u2195" + ] + ] + }, + { + "input": "&upharpoonleft", + "description": "Bad named entity: upharpoonleft without a semi-colon", + "output": [ + [ + "Character", + "&upharpoonleft" + ] + ] + }, + { + "input": "↿", + "description": "Named entity: upharpoonleft; with a semi-colon", + "output": [ + [ + "Character", + "\u21bf" + ] + ] + }, + { + "input": "&upharpoonright", + "description": "Bad named entity: upharpoonright without a semi-colon", + "output": [ + [ + "Character", + "&upharpoonright" + ] + ] + }, + { + "input": "↾", + "description": "Named entity: upharpoonright; with a semi-colon", + "output": [ + [ + "Character", + "\u21be" + ] + ] + }, + { + "input": "&uplus", + "description": "Bad named entity: uplus without a semi-colon", + "output": [ + [ + "Character", + "&uplus" + ] + ] + }, + { + "input": "⊎", + "description": "Named entity: uplus; with a semi-colon", + "output": [ + [ + "Character", + "\u228e" + ] + ] + }, + { + "input": "&upsi", + "description": "Bad named entity: upsi without a semi-colon", + "output": [ + [ + "Character", + "&upsi" + ] + ] + }, + { + "input": "υ", + "description": "Named entity: upsi; with a semi-colon", + "output": [ + [ + "Character", + "\u03c5" + ] + ] + }, + { + "input": "&upsih", + "description": "Bad named entity: upsih without a semi-colon", + "output": [ + [ + "Character", + "&upsih" + ] + ] + }, + { + "input": "ϒ", + "description": "Named entity: upsih; with a semi-colon", + "output": [ + [ + "Character", + "\u03d2" + ] + ] + }, + { + "input": "&upsilon", + "description": "Bad named entity: upsilon without a semi-colon", + "output": [ + [ + "Character", + "&upsilon" + ] + ] + }, + { + "input": "υ", + "description": "Named entity: upsilon; with a semi-colon", + "output": [ + [ + "Character", + "\u03c5" + ] + ] + }, + { + "input": "&upuparrows", + "description": "Bad named entity: upuparrows without a semi-colon", + "output": [ + [ + "Character", + "&upuparrows" + ] + ] + }, + { + "input": "⇈", + "description": "Named entity: upuparrows; with a semi-colon", + "output": [ + [ + "Character", + "\u21c8" + ] + ] + }, + { + "input": "&urcorn", + "description": "Bad named entity: urcorn without a semi-colon", + "output": [ + [ + "Character", + "&urcorn" + ] + ] + }, + { + "input": "⌝", + "description": "Named entity: urcorn; with a semi-colon", + "output": [ + [ + "Character", + "\u231d" + ] + ] + }, + { + "input": "&urcorner", + "description": "Bad named entity: urcorner without a semi-colon", + "output": [ + [ + "Character", + "&urcorner" + ] + ] + }, + { + "input": "⌝", + "description": "Named entity: urcorner; with a semi-colon", + "output": [ + [ + "Character", + "\u231d" + ] + ] + }, + { + "input": "&urcrop", + "description": "Bad named entity: urcrop without a semi-colon", + "output": [ + [ + "Character", + "&urcrop" + ] + ] + }, + { + "input": "⌎", + "description": "Named entity: urcrop; with a semi-colon", + "output": [ + [ + "Character", + "\u230e" + ] + ] + }, + { + "input": "&uring", + "description": "Bad named entity: uring without a semi-colon", + "output": [ + [ + "Character", + "&uring" + ] + ] + }, + { + "input": "ů", + "description": "Named entity: uring; with a semi-colon", + "output": [ + [ + "Character", + "\u016f" + ] + ] + }, + { + "input": "&urtri", + "description": "Bad named entity: urtri without a semi-colon", + "output": [ + [ + "Character", + "&urtri" + ] + ] + }, + { + "input": "◹", + "description": "Named entity: urtri; with a semi-colon", + "output": [ + [ + "Character", + "\u25f9" + ] + ] + }, + { + "input": "&uscr", + "description": "Bad named entity: uscr without a semi-colon", + "output": [ + [ + "Character", + "&uscr" + ] + ] + }, + { + "input": "𝓊", + "description": "Named entity: uscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcca" + ] + ] + }, + { + "input": "&utdot", + "description": "Bad named entity: utdot without a semi-colon", + "output": [ + [ + "Character", + "&utdot" + ] + ] + }, + { + "input": "⋰", + "description": "Named entity: utdot; with a semi-colon", + "output": [ + [ + "Character", + "\u22f0" + ] + ] + }, + { + "input": "&utilde", + "description": "Bad named entity: utilde without a semi-colon", + "output": [ + [ + "Character", + "&utilde" + ] + ] + }, + { + "input": "ũ", + "description": "Named entity: utilde; with a semi-colon", + "output": [ + [ + "Character", + "\u0169" + ] + ] + }, + { + "input": "&utri", + "description": "Bad named entity: utri without a semi-colon", + "output": [ + [ + "Character", + "&utri" + ] + ] + }, + { + "input": "▵", + "description": "Named entity: utri; with a semi-colon", + "output": [ + [ + "Character", + "\u25b5" + ] + ] + }, + { + "input": "&utrif", + "description": "Bad named entity: utrif without a semi-colon", + "output": [ + [ + "Character", + "&utrif" + ] + ] + }, + { + "input": "▴", + "description": "Named entity: utrif; with a semi-colon", + "output": [ + [ + "Character", + "\u25b4" + ] + ] + }, + { + "input": "&uuarr", + "description": "Bad named entity: uuarr without a semi-colon", + "output": [ + [ + "Character", + "&uuarr" + ] + ] + }, + { + "input": "⇈", + "description": "Named entity: uuarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21c8" + ] + ] + }, + { + "input": "ü", + "description": "Named entity: uuml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00fc" + ] + ] + }, + { + "input": "ü", + "description": "Named entity: uuml; with a semi-colon", + "output": [ + [ + "Character", + "\u00fc" + ] + ] + }, + { + "input": "&uwangle", + "description": "Bad named entity: uwangle without a semi-colon", + "output": [ + [ + "Character", + "&uwangle" + ] + ] + }, + { + "input": "⦧", + "description": "Named entity: uwangle; with a semi-colon", + "output": [ + [ + "Character", + "\u29a7" + ] + ] + }, + { + "input": "&vArr", + "description": "Bad named entity: vArr without a semi-colon", + "output": [ + [ + "Character", + "&vArr" + ] + ] + }, + { + "input": "⇕", + "description": "Named entity: vArr; with a semi-colon", + "output": [ + [ + "Character", + "\u21d5" + ] + ] + }, + { + "input": "&vBar", + "description": "Bad named entity: vBar without a semi-colon", + "output": [ + [ + "Character", + "&vBar" + ] + ] + }, + { + "input": "⫨", + "description": "Named entity: vBar; with a semi-colon", + "output": [ + [ + "Character", + "\u2ae8" + ] + ] + }, + { + "input": "&vBarv", + "description": "Bad named entity: vBarv without a semi-colon", + "output": [ + [ + "Character", + "&vBarv" + ] + ] + }, + { + "input": "⫩", + "description": "Named entity: vBarv; with a semi-colon", + "output": [ + [ + "Character", + "\u2ae9" + ] + ] + }, + { + "input": "&vDash", + "description": "Bad named entity: vDash without a semi-colon", + "output": [ + [ + "Character", + "&vDash" + ] + ] + }, + { + "input": "⊨", + "description": "Named entity: vDash; with a semi-colon", + "output": [ + [ + "Character", + "\u22a8" + ] + ] + }, + { + "input": "&vangrt", + "description": "Bad named entity: vangrt without a semi-colon", + "output": [ + [ + "Character", + "&vangrt" + ] + ] + }, + { + "input": "⦜", + "description": "Named entity: vangrt; with a semi-colon", + "output": [ + [ + "Character", + "\u299c" + ] + ] + }, + { + "input": "&varepsilon", + "description": "Bad named entity: varepsilon without a semi-colon", + "output": [ + [ + "Character", + "&varepsilon" + ] + ] + }, + { + "input": "ϵ", + "description": "Named entity: varepsilon; with a semi-colon", + "output": [ + [ + "Character", + "\u03f5" + ] + ] + }, + { + "input": "&varkappa", + "description": "Bad named entity: varkappa without a semi-colon", + "output": [ + [ + "Character", + "&varkappa" + ] + ] + }, + { + "input": "ϰ", + "description": "Named entity: varkappa; with a semi-colon", + "output": [ + [ + "Character", + "\u03f0" + ] + ] + }, + { + "input": "&varnothing", + "description": "Bad named entity: varnothing without a semi-colon", + "output": [ + [ + "Character", + "&varnothing" + ] + ] + }, + { + "input": "∅", + "description": "Named entity: varnothing; with a semi-colon", + "output": [ + [ + "Character", + "\u2205" + ] + ] + }, + { + "input": "&varphi", + "description": "Bad named entity: varphi without a semi-colon", + "output": [ + [ + "Character", + "&varphi" + ] + ] + }, + { + "input": "ϕ", + "description": "Named entity: varphi; with a semi-colon", + "output": [ + [ + "Character", + "\u03d5" + ] + ] + }, + { + "input": "&varpi", + "description": "Bad named entity: varpi without a semi-colon", + "output": [ + [ + "Character", + "&varpi" + ] + ] + }, + { + "input": "ϖ", + "description": "Named entity: varpi; with a semi-colon", + "output": [ + [ + "Character", + "\u03d6" + ] + ] + }, + { + "input": "&varpropto", + "description": "Bad named entity: varpropto without a semi-colon", + "output": [ + [ + "Character", + "&varpropto" + ] + ] + }, + { + "input": "∝", + "description": "Named entity: varpropto; with a semi-colon", + "output": [ + [ + "Character", + "\u221d" + ] + ] + }, + { + "input": "&varr", + "description": "Bad named entity: varr without a semi-colon", + "output": [ + [ + "Character", + "&varr" + ] + ] + }, + { + "input": "↕", + "description": "Named entity: varr; with a semi-colon", + "output": [ + [ + "Character", + "\u2195" + ] + ] + }, + { + "input": "&varrho", + "description": "Bad named entity: varrho without a semi-colon", + "output": [ + [ + "Character", + "&varrho" + ] + ] + }, + { + "input": "ϱ", + "description": "Named entity: varrho; with a semi-colon", + "output": [ + [ + "Character", + "\u03f1" + ] + ] + }, + { + "input": "&varsigma", + "description": "Bad named entity: varsigma without a semi-colon", + "output": [ + [ + "Character", + "&varsigma" + ] + ] + }, + { + "input": "ς", + "description": "Named entity: varsigma; with a semi-colon", + "output": [ + [ + "Character", + "\u03c2" + ] + ] + }, + { + "input": "&varsubsetneq", + "description": "Bad named entity: varsubsetneq without a semi-colon", + "output": [ + [ + "Character", + "&varsubsetneq" + ] + ] + }, + { + "input": "⊊︀", + "description": "Named entity: varsubsetneq; with a semi-colon", + "output": [ + [ + "Character", + "\u228a\ufe00" + ] + ] + }, + { + "input": "&varsubsetneqq", + "description": "Bad named entity: varsubsetneqq without a semi-colon", + "output": [ + [ + "Character", + "&varsubsetneqq" + ] + ] + }, + { + "input": "⫋︀", + "description": "Named entity: varsubsetneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2acb\ufe00" + ] + ] + }, + { + "input": "&varsupsetneq", + "description": "Bad named entity: varsupsetneq without a semi-colon", + "output": [ + [ + "Character", + "&varsupsetneq" + ] + ] + }, + { + "input": "⊋︀", + "description": "Named entity: varsupsetneq; with a semi-colon", + "output": [ + [ + "Character", + "\u228b\ufe00" + ] + ] + }, + { + "input": "&varsupsetneqq", + "description": "Bad named entity: varsupsetneqq without a semi-colon", + "output": [ + [ + "Character", + "&varsupsetneqq" + ] + ] + }, + { + "input": "⫌︀", + "description": "Named entity: varsupsetneqq; with a semi-colon", + "output": [ + [ + "Character", + "\u2acc\ufe00" + ] + ] + }, + { + "input": "&vartheta", + "description": "Bad named entity: vartheta without a semi-colon", + "output": [ + [ + "Character", + "&vartheta" + ] + ] + }, + { + "input": "ϑ", + "description": "Named entity: vartheta; with a semi-colon", + "output": [ + [ + "Character", + "\u03d1" + ] + ] + }, + { + "input": "&vartriangleleft", + "description": "Bad named entity: vartriangleleft without a semi-colon", + "output": [ + [ + "Character", + "&vartriangleleft" + ] + ] + }, + { + "input": "⊲", + "description": "Named entity: vartriangleleft; with a semi-colon", + "output": [ + [ + "Character", + "\u22b2" + ] + ] + }, + { + "input": "&vartriangleright", + "description": "Bad named entity: vartriangleright without a semi-colon", + "output": [ + [ + "Character", + "&vartriangleright" + ] + ] + }, + { + "input": "⊳", + "description": "Named entity: vartriangleright; with a semi-colon", + "output": [ + [ + "Character", + "\u22b3" + ] + ] + }, + { + "input": "&vcy", + "description": "Bad named entity: vcy without a semi-colon", + "output": [ + [ + "Character", + "&vcy" + ] + ] + }, + { + "input": "в", + "description": "Named entity: vcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0432" + ] + ] + }, + { + "input": "&vdash", + "description": "Bad named entity: vdash without a semi-colon", + "output": [ + [ + "Character", + "&vdash" + ] + ] + }, + { + "input": "⊢", + "description": "Named entity: vdash; with a semi-colon", + "output": [ + [ + "Character", + "\u22a2" + ] + ] + }, + { + "input": "&vee", + "description": "Bad named entity: vee without a semi-colon", + "output": [ + [ + "Character", + "&vee" + ] + ] + }, + { + "input": "∨", + "description": "Named entity: vee; with a semi-colon", + "output": [ + [ + "Character", + "\u2228" + ] + ] + }, + { + "input": "&veebar", + "description": "Bad named entity: veebar without a semi-colon", + "output": [ + [ + "Character", + "&veebar" + ] + ] + }, + { + "input": "⊻", + "description": "Named entity: veebar; with a semi-colon", + "output": [ + [ + "Character", + "\u22bb" + ] + ] + }, + { + "input": "&veeeq", + "description": "Bad named entity: veeeq without a semi-colon", + "output": [ + [ + "Character", + "&veeeq" + ] + ] + }, + { + "input": "≚", + "description": "Named entity: veeeq; with a semi-colon", + "output": [ + [ + "Character", + "\u225a" + ] + ] + }, + { + "input": "&vellip", + "description": "Bad named entity: vellip without a semi-colon", + "output": [ + [ + "Character", + "&vellip" + ] + ] + }, + { + "input": "⋮", + "description": "Named entity: vellip; with a semi-colon", + "output": [ + [ + "Character", + "\u22ee" + ] + ] + }, + { + "input": "&verbar", + "description": "Bad named entity: verbar without a semi-colon", + "output": [ + [ + "Character", + "&verbar" + ] + ] + }, + { + "input": "|", + "description": "Named entity: verbar; with a semi-colon", + "output": [ + [ + "Character", + "|" + ] + ] + }, + { + "input": "&vert", + "description": "Bad named entity: vert without a semi-colon", + "output": [ + [ + "Character", + "&vert" + ] + ] + }, + { + "input": "|", + "description": "Named entity: vert; with a semi-colon", + "output": [ + [ + "Character", + "|" + ] + ] + }, + { + "input": "&vfr", + "description": "Bad named entity: vfr without a semi-colon", + "output": [ + [ + "Character", + "&vfr" + ] + ] + }, + { + "input": "𝔳", + "description": "Named entity: vfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd33" + ] + ] + }, + { + "input": "&vltri", + "description": "Bad named entity: vltri without a semi-colon", + "output": [ + [ + "Character", + "&vltri" + ] + ] + }, + { + "input": "⊲", + "description": "Named entity: vltri; with a semi-colon", + "output": [ + [ + "Character", + "\u22b2" + ] + ] + }, + { + "input": "&vnsub", + "description": "Bad named entity: vnsub without a semi-colon", + "output": [ + [ + "Character", + "&vnsub" + ] + ] + }, + { + "input": "⊂⃒", + "description": "Named entity: vnsub; with a semi-colon", + "output": [ + [ + "Character", + "\u2282\u20d2" + ] + ] + }, + { + "input": "&vnsup", + "description": "Bad named entity: vnsup without a semi-colon", + "output": [ + [ + "Character", + "&vnsup" + ] + ] + }, + { + "input": "⊃⃒", + "description": "Named entity: vnsup; with a semi-colon", + "output": [ + [ + "Character", + "\u2283\u20d2" + ] + ] + }, + { + "input": "&vopf", + "description": "Bad named entity: vopf without a semi-colon", + "output": [ + [ + "Character", + "&vopf" + ] + ] + }, + { + "input": "𝕧", + "description": "Named entity: vopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd67" + ] + ] + }, + { + "input": "&vprop", + "description": "Bad named entity: vprop without a semi-colon", + "output": [ + [ + "Character", + "&vprop" + ] + ] + }, + { + "input": "∝", + "description": "Named entity: vprop; with a semi-colon", + "output": [ + [ + "Character", + "\u221d" + ] + ] + }, + { + "input": "&vrtri", + "description": "Bad named entity: vrtri without a semi-colon", + "output": [ + [ + "Character", + "&vrtri" + ] + ] + }, + { + "input": "⊳", + "description": "Named entity: vrtri; with a semi-colon", + "output": [ + [ + "Character", + "\u22b3" + ] + ] + }, + { + "input": "&vscr", + "description": "Bad named entity: vscr without a semi-colon", + "output": [ + [ + "Character", + "&vscr" + ] + ] + }, + { + "input": "𝓋", + "description": "Named entity: vscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udccb" + ] + ] + }, + { + "input": "&vsubnE", + "description": "Bad named entity: vsubnE without a semi-colon", + "output": [ + [ + "Character", + "&vsubnE" + ] + ] + }, + { + "input": "⫋︀", + "description": "Named entity: vsubnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2acb\ufe00" + ] + ] + }, + { + "input": "&vsubne", + "description": "Bad named entity: vsubne without a semi-colon", + "output": [ + [ + "Character", + "&vsubne" + ] + ] + }, + { + "input": "⊊︀", + "description": "Named entity: vsubne; with a semi-colon", + "output": [ + [ + "Character", + "\u228a\ufe00" + ] + ] + }, + { + "input": "&vsupnE", + "description": "Bad named entity: vsupnE without a semi-colon", + "output": [ + [ + "Character", + "&vsupnE" + ] + ] + }, + { + "input": "⫌︀", + "description": "Named entity: vsupnE; with a semi-colon", + "output": [ + [ + "Character", + "\u2acc\ufe00" + ] + ] + }, + { + "input": "&vsupne", + "description": "Bad named entity: vsupne without a semi-colon", + "output": [ + [ + "Character", + "&vsupne" + ] + ] + }, + { + "input": "⊋︀", + "description": "Named entity: vsupne; with a semi-colon", + "output": [ + [ + "Character", + "\u228b\ufe00" + ] + ] + }, + { + "input": "&vzigzag", + "description": "Bad named entity: vzigzag without a semi-colon", + "output": [ + [ + "Character", + "&vzigzag" + ] + ] + }, + { + "input": "⦚", + "description": "Named entity: vzigzag; with a semi-colon", + "output": [ + [ + "Character", + "\u299a" + ] + ] + }, + { + "input": "&wcirc", + "description": "Bad named entity: wcirc without a semi-colon", + "output": [ + [ + "Character", + "&wcirc" + ] + ] + }, + { + "input": "ŵ", + "description": "Named entity: wcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0175" + ] + ] + }, + { + "input": "&wedbar", + "description": "Bad named entity: wedbar without a semi-colon", + "output": [ + [ + "Character", + "&wedbar" + ] + ] + }, + { + "input": "⩟", + "description": "Named entity: wedbar; with a semi-colon", + "output": [ + [ + "Character", + "\u2a5f" + ] + ] + }, + { + "input": "&wedge", + "description": "Bad named entity: wedge without a semi-colon", + "output": [ + [ + "Character", + "&wedge" + ] + ] + }, + { + "input": "∧", + "description": "Named entity: wedge; with a semi-colon", + "output": [ + [ + "Character", + "\u2227" + ] + ] + }, + { + "input": "&wedgeq", + "description": "Bad named entity: wedgeq without a semi-colon", + "output": [ + [ + "Character", + "&wedgeq" + ] + ] + }, + { + "input": "≙", + "description": "Named entity: wedgeq; with a semi-colon", + "output": [ + [ + "Character", + "\u2259" + ] + ] + }, + { + "input": "&weierp", + "description": "Bad named entity: weierp without a semi-colon", + "output": [ + [ + "Character", + "&weierp" + ] + ] + }, + { + "input": "℘", + "description": "Named entity: weierp; with a semi-colon", + "output": [ + [ + "Character", + "\u2118" + ] + ] + }, + { + "input": "&wfr", + "description": "Bad named entity: wfr without a semi-colon", + "output": [ + [ + "Character", + "&wfr" + ] + ] + }, + { + "input": "𝔴", + "description": "Named entity: wfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd34" + ] + ] + }, + { + "input": "&wopf", + "description": "Bad named entity: wopf without a semi-colon", + "output": [ + [ + "Character", + "&wopf" + ] + ] + }, + { + "input": "𝕨", + "description": "Named entity: wopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd68" + ] + ] + }, + { + "input": "&wp", + "description": "Bad named entity: wp without a semi-colon", + "output": [ + [ + "Character", + "&wp" + ] + ] + }, + { + "input": "℘", + "description": "Named entity: wp; with a semi-colon", + "output": [ + [ + "Character", + "\u2118" + ] + ] + }, + { + "input": "&wr", + "description": "Bad named entity: wr without a semi-colon", + "output": [ + [ + "Character", + "&wr" + ] + ] + }, + { + "input": "≀", + "description": "Named entity: wr; with a semi-colon", + "output": [ + [ + "Character", + "\u2240" + ] + ] + }, + { + "input": "&wreath", + "description": "Bad named entity: wreath without a semi-colon", + "output": [ + [ + "Character", + "&wreath" + ] + ] + }, + { + "input": "≀", + "description": "Named entity: wreath; with a semi-colon", + "output": [ + [ + "Character", + "\u2240" + ] + ] + }, + { + "input": "&wscr", + "description": "Bad named entity: wscr without a semi-colon", + "output": [ + [ + "Character", + "&wscr" + ] + ] + }, + { + "input": "𝓌", + "description": "Named entity: wscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udccc" + ] + ] + }, + { + "input": "&xcap", + "description": "Bad named entity: xcap without a semi-colon", + "output": [ + [ + "Character", + "&xcap" + ] + ] + }, + { + "input": "⋂", + "description": "Named entity: xcap; with a semi-colon", + "output": [ + [ + "Character", + "\u22c2" + ] + ] + }, + { + "input": "&xcirc", + "description": "Bad named entity: xcirc without a semi-colon", + "output": [ + [ + "Character", + "&xcirc" + ] + ] + }, + { + "input": "◯", + "description": "Named entity: xcirc; with a semi-colon", + "output": [ + [ + "Character", + "\u25ef" + ] + ] + }, + { + "input": "&xcup", + "description": "Bad named entity: xcup without a semi-colon", + "output": [ + [ + "Character", + "&xcup" + ] + ] + }, + { + "input": "⋃", + "description": "Named entity: xcup; with a semi-colon", + "output": [ + [ + "Character", + "\u22c3" + ] + ] + }, + { + "input": "&xdtri", + "description": "Bad named entity: xdtri without a semi-colon", + "output": [ + [ + "Character", + "&xdtri" + ] + ] + }, + { + "input": "▽", + "description": "Named entity: xdtri; with a semi-colon", + "output": [ + [ + "Character", + "\u25bd" + ] + ] + }, + { + "input": "&xfr", + "description": "Bad named entity: xfr without a semi-colon", + "output": [ + [ + "Character", + "&xfr" + ] + ] + }, + { + "input": "𝔵", + "description": "Named entity: xfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd35" + ] + ] + }, + { + "input": "&xhArr", + "description": "Bad named entity: xhArr without a semi-colon", + "output": [ + [ + "Character", + "&xhArr" + ] + ] + }, + { + "input": "⟺", + "description": "Named entity: xhArr; with a semi-colon", + "output": [ + [ + "Character", + "\u27fa" + ] + ] + }, + { + "input": "&xharr", + "description": "Bad named entity: xharr without a semi-colon", + "output": [ + [ + "Character", + "&xharr" + ] + ] + }, + { + "input": "⟷", + "description": "Named entity: xharr; with a semi-colon", + "output": [ + [ + "Character", + "\u27f7" + ] + ] + }, + { + "input": "&xi", + "description": "Bad named entity: xi without a semi-colon", + "output": [ + [ + "Character", + "&xi" + ] + ] + }, + { + "input": "ξ", + "description": "Named entity: xi; with a semi-colon", + "output": [ + [ + "Character", + "\u03be" + ] + ] + }, + { + "input": "&xlArr", + "description": "Bad named entity: xlArr without a semi-colon", + "output": [ + [ + "Character", + "&xlArr" + ] + ] + }, + { + "input": "⟸", + "description": "Named entity: xlArr; with a semi-colon", + "output": [ + [ + "Character", + "\u27f8" + ] + ] + }, + { + "input": "&xlarr", + "description": "Bad named entity: xlarr without a semi-colon", + "output": [ + [ + "Character", + "&xlarr" + ] + ] + }, + { + "input": "⟵", + "description": "Named entity: xlarr; with a semi-colon", + "output": [ + [ + "Character", + "\u27f5" + ] + ] + }, + { + "input": "&xmap", + "description": "Bad named entity: xmap without a semi-colon", + "output": [ + [ + "Character", + "&xmap" + ] + ] + }, + { + "input": "⟼", + "description": "Named entity: xmap; with a semi-colon", + "output": [ + [ + "Character", + "\u27fc" + ] + ] + }, + { + "input": "&xnis", + "description": "Bad named entity: xnis without a semi-colon", + "output": [ + [ + "Character", + "&xnis" + ] + ] + }, + { + "input": "⋻", + "description": "Named entity: xnis; with a semi-colon", + "output": [ + [ + "Character", + "\u22fb" + ] + ] + }, + { + "input": "&xodot", + "description": "Bad named entity: xodot without a semi-colon", + "output": [ + [ + "Character", + "&xodot" + ] + ] + }, + { + "input": "⨀", + "description": "Named entity: xodot; with a semi-colon", + "output": [ + [ + "Character", + "\u2a00" + ] + ] + }, + { + "input": "&xopf", + "description": "Bad named entity: xopf without a semi-colon", + "output": [ + [ + "Character", + "&xopf" + ] + ] + }, + { + "input": "𝕩", + "description": "Named entity: xopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd69" + ] + ] + }, + { + "input": "&xoplus", + "description": "Bad named entity: xoplus without a semi-colon", + "output": [ + [ + "Character", + "&xoplus" + ] + ] + }, + { + "input": "⨁", + "description": "Named entity: xoplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a01" + ] + ] + }, + { + "input": "&xotime", + "description": "Bad named entity: xotime without a semi-colon", + "output": [ + [ + "Character", + "&xotime" + ] + ] + }, + { + "input": "⨂", + "description": "Named entity: xotime; with a semi-colon", + "output": [ + [ + "Character", + "\u2a02" + ] + ] + }, + { + "input": "&xrArr", + "description": "Bad named entity: xrArr without a semi-colon", + "output": [ + [ + "Character", + "&xrArr" + ] + ] + }, + { + "input": "⟹", + "description": "Named entity: xrArr; with a semi-colon", + "output": [ + [ + "Character", + "\u27f9" + ] + ] + }, + { + "input": "&xrarr", + "description": "Bad named entity: xrarr without a semi-colon", + "output": [ + [ + "Character", + "&xrarr" + ] + ] + }, + { + "input": "⟶", + "description": "Named entity: xrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u27f6" + ] + ] + }, + { + "input": "&xscr", + "description": "Bad named entity: xscr without a semi-colon", + "output": [ + [ + "Character", + "&xscr" + ] + ] + }, + { + "input": "𝓍", + "description": "Named entity: xscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udccd" + ] + ] + }, + { + "input": "&xsqcup", + "description": "Bad named entity: xsqcup without a semi-colon", + "output": [ + [ + "Character", + "&xsqcup" + ] + ] + }, + { + "input": "⨆", + "description": "Named entity: xsqcup; with a semi-colon", + "output": [ + [ + "Character", + "\u2a06" + ] + ] + }, + { + "input": "&xuplus", + "description": "Bad named entity: xuplus without a semi-colon", + "output": [ + [ + "Character", + "&xuplus" + ] + ] + }, + { + "input": "⨄", + "description": "Named entity: xuplus; with a semi-colon", + "output": [ + [ + "Character", + "\u2a04" + ] + ] + }, + { + "input": "&xutri", + "description": "Bad named entity: xutri without a semi-colon", + "output": [ + [ + "Character", + "&xutri" + ] + ] + }, + { + "input": "△", + "description": "Named entity: xutri; with a semi-colon", + "output": [ + [ + "Character", + "\u25b3" + ] + ] + }, + { + "input": "&xvee", + "description": "Bad named entity: xvee without a semi-colon", + "output": [ + [ + "Character", + "&xvee" + ] + ] + }, + { + "input": "⋁", + "description": "Named entity: xvee; with a semi-colon", + "output": [ + [ + "Character", + "\u22c1" + ] + ] + }, + { + "input": "&xwedge", + "description": "Bad named entity: xwedge without a semi-colon", + "output": [ + [ + "Character", + "&xwedge" + ] + ] + }, + { + "input": "⋀", + "description": "Named entity: xwedge; with a semi-colon", + "output": [ + [ + "Character", + "\u22c0" + ] + ] + }, + { + "input": "ý", + "description": "Named entity: yacute without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00fd" + ] + ] + }, + { + "input": "ý", + "description": "Named entity: yacute; with a semi-colon", + "output": [ + [ + "Character", + "\u00fd" + ] + ] + }, + { + "input": "&yacy", + "description": "Bad named entity: yacy without a semi-colon", + "output": [ + [ + "Character", + "&yacy" + ] + ] + }, + { + "input": "я", + "description": "Named entity: yacy; with a semi-colon", + "output": [ + [ + "Character", + "\u044f" + ] + ] + }, + { + "input": "&ycirc", + "description": "Bad named entity: ycirc without a semi-colon", + "output": [ + [ + "Character", + "&ycirc" + ] + ] + }, + { + "input": "ŷ", + "description": "Named entity: ycirc; with a semi-colon", + "output": [ + [ + "Character", + "\u0177" + ] + ] + }, + { + "input": "&ycy", + "description": "Bad named entity: ycy without a semi-colon", + "output": [ + [ + "Character", + "&ycy" + ] + ] + }, + { + "input": "ы", + "description": "Named entity: ycy; with a semi-colon", + "output": [ + [ + "Character", + "\u044b" + ] + ] + }, + { + "input": "¥", + "description": "Named entity: yen without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00a5" + ] + ] + }, + { + "input": "¥", + "description": "Named entity: yen; with a semi-colon", + "output": [ + [ + "Character", + "\u00a5" + ] + ] + }, + { + "input": "&yfr", + "description": "Bad named entity: yfr without a semi-colon", + "output": [ + [ + "Character", + "&yfr" + ] + ] + }, + { + "input": "𝔶", + "description": "Named entity: yfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd36" + ] + ] + }, + { + "input": "&yicy", + "description": "Bad named entity: yicy without a semi-colon", + "output": [ + [ + "Character", + "&yicy" + ] + ] + }, + { + "input": "ї", + "description": "Named entity: yicy; with a semi-colon", + "output": [ + [ + "Character", + "\u0457" + ] + ] + }, + { + "input": "&yopf", + "description": "Bad named entity: yopf without a semi-colon", + "output": [ + [ + "Character", + "&yopf" + ] + ] + }, + { + "input": "𝕪", + "description": "Named entity: yopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd6a" + ] + ] + }, + { + "input": "&yscr", + "description": "Bad named entity: yscr without a semi-colon", + "output": [ + [ + "Character", + "&yscr" + ] + ] + }, + { + "input": "𝓎", + "description": "Named entity: yscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udcce" + ] + ] + }, + { + "input": "&yucy", + "description": "Bad named entity: yucy without a semi-colon", + "output": [ + [ + "Character", + "&yucy" + ] + ] + }, + { + "input": "ю", + "description": "Named entity: yucy; with a semi-colon", + "output": [ + [ + "Character", + "\u044e" + ] + ] + }, + { + "input": "ÿ", + "description": "Named entity: yuml without a semi-colon", + "output": [ + "ParseError", + [ + "Character", + "\u00ff" + ] + ] + }, + { + "input": "ÿ", + "description": "Named entity: yuml; with a semi-colon", + "output": [ + [ + "Character", + "\u00ff" + ] + ] + }, + { + "input": "&zacute", + "description": "Bad named entity: zacute without a semi-colon", + "output": [ + [ + "Character", + "&zacute" + ] + ] + }, + { + "input": "ź", + "description": "Named entity: zacute; with a semi-colon", + "output": [ + [ + "Character", + "\u017a" + ] + ] + }, + { + "input": "&zcaron", + "description": "Bad named entity: zcaron without a semi-colon", + "output": [ + [ + "Character", + "&zcaron" + ] + ] + }, + { + "input": "ž", + "description": "Named entity: zcaron; with a semi-colon", + "output": [ + [ + "Character", + "\u017e" + ] + ] + }, + { + "input": "&zcy", + "description": "Bad named entity: zcy without a semi-colon", + "output": [ + [ + "Character", + "&zcy" + ] + ] + }, + { + "input": "з", + "description": "Named entity: zcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0437" + ] + ] + }, + { + "input": "&zdot", + "description": "Bad named entity: zdot without a semi-colon", + "output": [ + [ + "Character", + "&zdot" + ] + ] + }, + { + "input": "ż", + "description": "Named entity: zdot; with a semi-colon", + "output": [ + [ + "Character", + "\u017c" + ] + ] + }, + { + "input": "&zeetrf", + "description": "Bad named entity: zeetrf without a semi-colon", + "output": [ + [ + "Character", + "&zeetrf" + ] + ] + }, + { + "input": "ℨ", + "description": "Named entity: zeetrf; with a semi-colon", + "output": [ + [ + "Character", + "\u2128" + ] + ] + }, + { + "input": "&zeta", + "description": "Bad named entity: zeta without a semi-colon", + "output": [ + [ + "Character", + "&zeta" + ] + ] + }, + { + "input": "ζ", + "description": "Named entity: zeta; with a semi-colon", + "output": [ + [ + "Character", + "\u03b6" + ] + ] + }, + { + "input": "&zfr", + "description": "Bad named entity: zfr without a semi-colon", + "output": [ + [ + "Character", + "&zfr" + ] + ] + }, + { + "input": "𝔷", + "description": "Named entity: zfr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd37" + ] + ] + }, + { + "input": "&zhcy", + "description": "Bad named entity: zhcy without a semi-colon", + "output": [ + [ + "Character", + "&zhcy" + ] + ] + }, + { + "input": "ж", + "description": "Named entity: zhcy; with a semi-colon", + "output": [ + [ + "Character", + "\u0436" + ] + ] + }, + { + "input": "&zigrarr", + "description": "Bad named entity: zigrarr without a semi-colon", + "output": [ + [ + "Character", + "&zigrarr" + ] + ] + }, + { + "input": "⇝", + "description": "Named entity: zigrarr; with a semi-colon", + "output": [ + [ + "Character", + "\u21dd" + ] + ] + }, + { + "input": "&zopf", + "description": "Bad named entity: zopf without a semi-colon", + "output": [ + [ + "Character", + "&zopf" + ] + ] + }, + { + "input": "𝕫", + "description": "Named entity: zopf; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udd6b" + ] + ] + }, + { + "input": "&zscr", + "description": "Bad named entity: zscr without a semi-colon", + "output": [ + [ + "Character", + "&zscr" + ] + ] + }, + { + "input": "𝓏", + "description": "Named entity: zscr; with a semi-colon", + "output": [ + [ + "Character", + "\ud835\udccf" + ] + ] + }, + { + "input": "&zwj", + "description": "Bad named entity: zwj without a semi-colon", + "output": [ + [ + "Character", + "&zwj" + ] + ] + }, + { + "input": "‍", + "description": "Named entity: zwj; with a semi-colon", + "output": [ + [ + "Character", + "\u200d" + ] + ] + }, + { + "input": "&zwnj", + "description": "Bad named entity: zwnj without a semi-colon", + "output": [ + [ + "Character", + "&zwnj" + ] + ] + }, + { + "input": "‌", + "description": "Named entity: zwnj; with a semi-colon", + "output": [ + [ + "Character", + "\u200c" + ] + ] + } + ] +}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/numericEntities.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/numericEntities.test new file mode 100644 index 000000000..36c82281c --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/numericEntities.test @@ -0,0 +1,1313 @@ +{"tests": [ + +{"description": "Invalid numeric entity character U+0000", +"input": "�", +"output": ["ParseError", ["Character", "\uFFFD"]]}, + +{"description": "Invalid numeric entity character U+0001", +"input": "", +"output": ["ParseError", ["Character", "\u0001"]]}, + +{"description": "Invalid numeric entity character U+0002", +"input": "", +"output": ["ParseError", ["Character", "\u0002"]]}, + +{"description": "Invalid numeric entity character U+0003", +"input": "", +"output": ["ParseError", ["Character", "\u0003"]]}, + +{"description": "Invalid numeric entity character U+0004", +"input": "", +"output": ["ParseError", ["Character", "\u0004"]]}, + +{"description": "Invalid numeric entity character U+0005", +"input": "", +"output": ["ParseError", ["Character", "\u0005"]]}, + +{"description": "Invalid numeric entity character U+0006", +"input": "", +"output": ["ParseError", ["Character", "\u0006"]]}, + +{"description": "Invalid numeric entity character U+0007", +"input": "", +"output": ["ParseError", ["Character", "\u0007"]]}, + +{"description": "Invalid numeric entity character U+0008", +"input": "", +"output": ["ParseError", ["Character", "\u0008"]]}, + +{"description": "Invalid numeric entity character U+000B", +"input": "", +"output": ["ParseError", ["Character", "\u000b"]]}, + +{"description": "Invalid numeric entity character U+000E", +"input": "", +"output": ["ParseError", ["Character", "\u000e"]]}, + +{"description": "Invalid numeric entity character U+000F", +"input": "", +"output": ["ParseError", ["Character", "\u000f"]]}, + +{"description": "Invalid numeric entity character U+0010", +"input": "", +"output": ["ParseError", ["Character", "\u0010"]]}, + +{"description": "Invalid numeric entity character U+0011", +"input": "", +"output": ["ParseError", ["Character", "\u0011"]]}, + +{"description": "Invalid numeric entity character U+0012", +"input": "", +"output": ["ParseError", ["Character", "\u0012"]]}, + +{"description": "Invalid numeric entity character U+0013", +"input": "", +"output": ["ParseError", ["Character", "\u0013"]]}, + +{"description": "Invalid numeric entity character U+0014", +"input": "", +"output": ["ParseError", ["Character", "\u0014"]]}, + +{"description": "Invalid numeric entity character U+0015", +"input": "", +"output": ["ParseError", ["Character", "\u0015"]]}, + +{"description": "Invalid numeric entity character U+0016", +"input": "", +"output": ["ParseError", ["Character", "\u0016"]]}, + +{"description": "Invalid numeric entity character U+0017", +"input": "", +"output": ["ParseError", ["Character", "\u0017"]]}, + +{"description": "Invalid numeric entity character U+0018", +"input": "", +"output": ["ParseError", ["Character", "\u0018"]]}, + +{"description": "Invalid numeric entity character U+0019", +"input": "", +"output": ["ParseError", ["Character", "\u0019"]]}, + +{"description": "Invalid numeric entity character U+001A", +"input": "", +"output": ["ParseError", ["Character", "\u001a"]]}, + +{"description": "Invalid numeric entity character U+001B", +"input": "", +"output": ["ParseError", ["Character", "\u001b"]]}, + +{"description": "Invalid numeric entity character U+001C", +"input": "", +"output": ["ParseError", ["Character", "\u001c"]]}, + +{"description": "Invalid numeric entity character U+001D", +"input": "", +"output": ["ParseError", ["Character", "\u001d"]]}, + +{"description": "Invalid numeric entity character U+001E", +"input": "", +"output": ["ParseError", ["Character", "\u001e"]]}, + +{"description": "Invalid numeric entity character U+001F", +"input": "", +"output": ["ParseError", ["Character", "\u001f"]]}, + +{"description": "Invalid numeric entity character U+007F", +"input": "", +"output": ["ParseError", ["Character", "\u007f"]]}, + +{"description": "Invalid numeric entity character U+D800", +"input": "�", +"output": ["ParseError", ["Character", "\uFFFD"]]}, + +{"description": "Invalid numeric entity character U+DFFF", +"input": "�", +"output": ["ParseError", ["Character", "\uFFFD"]]}, + +{"description": "Invalid numeric entity character U+FDD0", +"input": "", +"output": ["ParseError", ["Character", "\ufdd0"]]}, + +{"description": "Invalid numeric entity character U+FDD1", +"input": "", +"output": ["ParseError", ["Character", "\ufdd1"]]}, + +{"description": "Invalid numeric entity character U+FDD2", +"input": "", +"output": ["ParseError", ["Character", "\ufdd2"]]}, + +{"description": "Invalid numeric entity character U+FDD3", +"input": "", +"output": ["ParseError", ["Character", "\ufdd3"]]}, + +{"description": "Invalid numeric entity character U+FDD4", +"input": "", +"output": ["ParseError", ["Character", "\ufdd4"]]}, + +{"description": "Invalid numeric entity character U+FDD5", +"input": "", +"output": ["ParseError", ["Character", "\ufdd5"]]}, + +{"description": "Invalid numeric entity character U+FDD6", +"input": "", +"output": ["ParseError", ["Character", "\ufdd6"]]}, + +{"description": "Invalid numeric entity character U+FDD7", +"input": "", +"output": ["ParseError", ["Character", "\ufdd7"]]}, + +{"description": "Invalid numeric entity character U+FDD8", +"input": "", +"output": ["ParseError", ["Character", "\ufdd8"]]}, + +{"description": "Invalid numeric entity character U+FDD9", +"input": "", +"output": ["ParseError", ["Character", "\ufdd9"]]}, + +{"description": "Invalid numeric entity character U+FDDA", +"input": "", +"output": ["ParseError", ["Character", "\ufdda"]]}, + +{"description": "Invalid numeric entity character U+FDDB", +"input": "", +"output": ["ParseError", ["Character", "\ufddb"]]}, + +{"description": "Invalid numeric entity character U+FDDC", +"input": "", +"output": ["ParseError", ["Character", "\ufddc"]]}, + +{"description": "Invalid numeric entity character U+FDDD", +"input": "", +"output": ["ParseError", ["Character", "\ufddd"]]}, + +{"description": "Invalid numeric entity character U+FDDE", +"input": "", +"output": ["ParseError", ["Character", "\ufdde"]]}, + +{"description": "Invalid numeric entity character U+FDDF", +"input": "", +"output": ["ParseError", ["Character", "\ufddf"]]}, + +{"description": "Invalid numeric entity character U+FDE0", +"input": "", +"output": ["ParseError", ["Character", "\ufde0"]]}, + +{"description": "Invalid numeric entity character U+FDE1", +"input": "", +"output": ["ParseError", ["Character", "\ufde1"]]}, + +{"description": "Invalid numeric entity character U+FDE2", +"input": "", +"output": ["ParseError", ["Character", "\ufde2"]]}, + +{"description": "Invalid numeric entity character U+FDE3", +"input": "", +"output": ["ParseError", ["Character", "\ufde3"]]}, + +{"description": "Invalid numeric entity character U+FDE4", +"input": "", +"output": ["ParseError", ["Character", "\ufde4"]]}, + +{"description": "Invalid numeric entity character U+FDE5", +"input": "", +"output": ["ParseError", ["Character", "\ufde5"]]}, + +{"description": "Invalid numeric entity character U+FDE6", +"input": "", +"output": ["ParseError", ["Character", "\ufde6"]]}, + +{"description": "Invalid numeric entity character U+FDE7", +"input": "", +"output": ["ParseError", ["Character", "\ufde7"]]}, + +{"description": "Invalid numeric entity character U+FDE8", +"input": "", +"output": ["ParseError", ["Character", "\ufde8"]]}, + +{"description": "Invalid numeric entity character U+FDE9", +"input": "", +"output": ["ParseError", ["Character", "\ufde9"]]}, + +{"description": "Invalid numeric entity character U+FDEA", +"input": "", +"output": ["ParseError", ["Character", "\ufdea"]]}, + +{"description": "Invalid numeric entity character U+FDEB", +"input": "", +"output": ["ParseError", ["Character", "\ufdeb"]]}, + +{"description": "Invalid numeric entity character U+FDEC", +"input": "", +"output": ["ParseError", ["Character", "\ufdec"]]}, + +{"description": "Invalid numeric entity character U+FDED", +"input": "", +"output": ["ParseError", ["Character", "\ufded"]]}, + +{"description": "Invalid numeric entity character U+FDEE", +"input": "", +"output": ["ParseError", ["Character", "\ufdee"]]}, + +{"description": "Invalid numeric entity character U+FDEF", +"input": "", +"output": ["ParseError", ["Character", "\ufdef"]]}, + +{"description": "Invalid numeric entity character U+FFFE", +"input": "", +"output": ["ParseError", ["Character", "\ufffe"]]}, + +{"description": "Invalid numeric entity character U+FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uffff"]]}, + +{"description": "Invalid numeric entity character U+1FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD83F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+1FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD83F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+2FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD87F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+2FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD87F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+3FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD8BF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+3FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD8BF\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+4FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD8FF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+4FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD8FF\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+5FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD93F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+5FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD93F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+6FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD97F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+6FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD97F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+7FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD9BF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+7FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD9BF\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+8FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uD9FF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+8FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uD9FF\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+9FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDA3F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+9FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDA3F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+AFFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDA7F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+AFFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDA7F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+BFFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDABF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+BFFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDABF\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+CFFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDAFF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+CFFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDAFF\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+DFFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDB3F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+DFFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDB3F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+EFFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDB7F\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+EFFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDB7F\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+FFFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDBBF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+FFFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDBBF\uDFFF"]]}, + +{"description": "Invalid numeric entity character U+10FFFE", +"input": "", +"output": ["ParseError", ["Character", "\uDBFF\uDFFE"]]}, + +{"description": "Invalid numeric entity character U+10FFFF", +"input": "", +"output": ["ParseError", ["Character", "\uDBFF\uDFFF"]]}, + +{"description": "Valid numeric entity character U+0009", +"input": "	", +"output": [["Character", "\u0009"]]}, + +{"description": "Valid numeric entity character U+000A", +"input": "
", +"output": [["Character", "\u000A"]]}, + +{"description": "Valid numeric entity character U+0020", +"input": " ", +"output": [["Character", "\u0020"]]}, + +{"description": "Valid numeric entity character U+0021", +"input": "!", +"output": [["Character", "\u0021"]]}, + +{"description": "Valid numeric entity character U+0022", +"input": """, +"output": [["Character", "\u0022"]]}, + +{"description": "Valid numeric entity character U+0023", +"input": "#", +"output": [["Character", "\u0023"]]}, + +{"description": "Valid numeric entity character U+0024", +"input": "$", +"output": [["Character", "\u0024"]]}, + +{"description": "Valid numeric entity character U+0025", +"input": "%", +"output": [["Character", "\u0025"]]}, + +{"description": "Valid numeric entity character U+0026", +"input": "&", +"output": [["Character", "\u0026"]]}, + +{"description": "Valid numeric entity character U+0027", +"input": "'", +"output": [["Character", "\u0027"]]}, + +{"description": "Valid numeric entity character U+0028", +"input": "(", +"output": [["Character", "\u0028"]]}, + +{"description": "Valid numeric entity character U+0029", +"input": ")", +"output": [["Character", "\u0029"]]}, + +{"description": "Valid numeric entity character U+002A", +"input": "*", +"output": [["Character", "\u002A"]]}, + +{"description": "Valid numeric entity character U+002B", +"input": "+", +"output": [["Character", "\u002B"]]}, + +{"description": "Valid numeric entity character U+002C", +"input": ",", +"output": [["Character", "\u002C"]]}, + +{"description": "Valid numeric entity character U+002D", +"input": "-", +"output": [["Character", "\u002D"]]}, + +{"description": "Valid numeric entity character U+002E", +"input": ".", +"output": [["Character", "\u002E"]]}, + +{"description": "Valid numeric entity character U+002F", +"input": "/", +"output": [["Character", "\u002F"]]}, + +{"description": "Valid numeric entity character U+0030", +"input": "0", +"output": [["Character", "\u0030"]]}, + +{"description": "Valid numeric entity character U+0031", +"input": "1", +"output": [["Character", "\u0031"]]}, + +{"description": "Valid numeric entity character U+0032", +"input": "2", +"output": [["Character", "\u0032"]]}, + +{"description": "Valid numeric entity character U+0033", +"input": "3", +"output": [["Character", "\u0033"]]}, + +{"description": "Valid numeric entity character U+0034", +"input": "4", +"output": [["Character", "\u0034"]]}, + +{"description": "Valid numeric entity character U+0035", +"input": "5", +"output": [["Character", "\u0035"]]}, + +{"description": "Valid numeric entity character U+0036", +"input": "6", +"output": [["Character", "\u0036"]]}, + +{"description": "Valid numeric entity character U+0037", +"input": "7", +"output": [["Character", "\u0037"]]}, + +{"description": "Valid numeric entity character U+0038", +"input": "8", +"output": [["Character", "\u0038"]]}, + +{"description": "Valid numeric entity character U+0039", +"input": "9", +"output": [["Character", "\u0039"]]}, + +{"description": "Valid numeric entity character U+003A", +"input": ":", +"output": [["Character", "\u003A"]]}, + +{"description": "Valid numeric entity character U+003B", +"input": ";", +"output": [["Character", "\u003B"]]}, + +{"description": "Valid numeric entity character U+003C", +"input": "<", +"output": [["Character", "\u003C"]]}, + +{"description": "Valid numeric entity character U+003D", +"input": "=", +"output": [["Character", "\u003D"]]}, + +{"description": "Valid numeric entity character U+003E", +"input": ">", +"output": [["Character", "\u003E"]]}, + +{"description": "Valid numeric entity character U+003F", +"input": "?", +"output": [["Character", "\u003F"]]}, + +{"description": "Valid numeric entity character U+0040", +"input": "@", +"output": [["Character", "\u0040"]]}, + +{"description": "Valid numeric entity character U+0041", +"input": "A", +"output": [["Character", "\u0041"]]}, + +{"description": "Valid numeric entity character U+0042", +"input": "B", +"output": [["Character", "\u0042"]]}, + +{"description": "Valid numeric entity character U+0043", +"input": "C", +"output": [["Character", "\u0043"]]}, + +{"description": "Valid numeric entity character U+0044", +"input": "D", +"output": [["Character", "\u0044"]]}, + +{"description": "Valid numeric entity character U+0045", +"input": "E", +"output": [["Character", "\u0045"]]}, + +{"description": "Valid numeric entity character U+0046", +"input": "F", +"output": [["Character", "\u0046"]]}, + +{"description": "Valid numeric entity character U+0047", +"input": "G", +"output": [["Character", "\u0047"]]}, + +{"description": "Valid numeric entity character U+0048", +"input": "H", +"output": [["Character", "\u0048"]]}, + +{"description": "Valid numeric entity character U+0049", +"input": "I", +"output": [["Character", "\u0049"]]}, + +{"description": "Valid numeric entity character U+004A", +"input": "J", +"output": [["Character", "\u004A"]]}, + +{"description": "Valid numeric entity character U+004B", +"input": "K", +"output": [["Character", "\u004B"]]}, + +{"description": "Valid numeric entity character U+004C", +"input": "L", +"output": [["Character", "\u004C"]]}, + +{"description": "Valid numeric entity character U+004D", +"input": "M", +"output": [["Character", "\u004D"]]}, + +{"description": "Valid numeric entity character U+004E", +"input": "N", +"output": [["Character", "\u004E"]]}, + +{"description": "Valid numeric entity character U+004F", +"input": "O", +"output": [["Character", "\u004F"]]}, + +{"description": "Valid numeric entity character U+0050", +"input": "P", +"output": [["Character", "\u0050"]]}, + +{"description": "Valid numeric entity character U+0051", +"input": "Q", +"output": [["Character", "\u0051"]]}, + +{"description": "Valid numeric entity character U+0052", +"input": "R", +"output": [["Character", "\u0052"]]}, + +{"description": "Valid numeric entity character U+0053", +"input": "S", +"output": [["Character", "\u0053"]]}, + +{"description": "Valid numeric entity character U+0054", +"input": "T", +"output": [["Character", "\u0054"]]}, + +{"description": "Valid numeric entity character U+0055", +"input": "U", +"output": [["Character", "\u0055"]]}, + +{"description": "Valid numeric entity character U+0056", +"input": "V", +"output": [["Character", "\u0056"]]}, + +{"description": "Valid numeric entity character U+0057", +"input": "W", +"output": [["Character", "\u0057"]]}, + +{"description": "Valid numeric entity character U+0058", +"input": "X", +"output": [["Character", "\u0058"]]}, + +{"description": "Valid numeric entity character U+0059", +"input": "Y", +"output": [["Character", "\u0059"]]}, + +{"description": "Valid numeric entity character U+005A", +"input": "Z", +"output": [["Character", "\u005A"]]}, + +{"description": "Valid numeric entity character U+005B", +"input": "[", +"output": [["Character", "\u005B"]]}, + +{"description": "Valid numeric entity character U+005C", +"input": "\", +"output": [["Character", "\u005C"]]}, + +{"description": "Valid numeric entity character U+005D", +"input": "]", +"output": [["Character", "\u005D"]]}, + +{"description": "Valid numeric entity character U+005E", +"input": "^", +"output": [["Character", "\u005E"]]}, + +{"description": "Valid numeric entity character U+005F", +"input": "_", +"output": [["Character", "\u005F"]]}, + +{"description": "Valid numeric entity character U+0060", +"input": "`", +"output": [["Character", "\u0060"]]}, + +{"description": "Valid numeric entity character U+0061", +"input": "a", +"output": [["Character", "\u0061"]]}, + +{"description": "Valid numeric entity character U+0062", +"input": "b", +"output": [["Character", "\u0062"]]}, + +{"description": "Valid numeric entity character U+0063", +"input": "c", +"output": [["Character", "\u0063"]]}, + +{"description": "Valid numeric entity character U+0064", +"input": "d", +"output": [["Character", "\u0064"]]}, + +{"description": "Valid numeric entity character U+0065", +"input": "e", +"output": [["Character", "\u0065"]]}, + +{"description": "Valid numeric entity character U+0066", +"input": "f", +"output": [["Character", "\u0066"]]}, + +{"description": "Valid numeric entity character U+0067", +"input": "g", +"output": [["Character", "\u0067"]]}, + +{"description": "Valid numeric entity character U+0068", +"input": "h", +"output": [["Character", "\u0068"]]}, + +{"description": "Valid numeric entity character U+0069", +"input": "i", +"output": [["Character", "\u0069"]]}, + +{"description": "Valid numeric entity character U+006A", +"input": "j", +"output": [["Character", "\u006A"]]}, + +{"description": "Valid numeric entity character U+006B", +"input": "k", +"output": [["Character", "\u006B"]]}, + +{"description": "Valid numeric entity character U+006C", +"input": "l", +"output": [["Character", "\u006C"]]}, + +{"description": "Valid numeric entity character U+006D", +"input": "m", +"output": [["Character", "\u006D"]]}, + +{"description": "Valid numeric entity character U+006E", +"input": "n", +"output": [["Character", "\u006E"]]}, + +{"description": "Valid numeric entity character U+006F", +"input": "o", +"output": [["Character", "\u006F"]]}, + +{"description": "Valid numeric entity character U+0070", +"input": "p", +"output": [["Character", "\u0070"]]}, + +{"description": "Valid numeric entity character U+0071", +"input": "q", +"output": [["Character", "\u0071"]]}, + +{"description": "Valid numeric entity character U+0072", +"input": "r", +"output": [["Character", "\u0072"]]}, + +{"description": "Valid numeric entity character U+0073", +"input": "s", +"output": [["Character", "\u0073"]]}, + +{"description": "Valid numeric entity character U+0074", +"input": "t", +"output": [["Character", "\u0074"]]}, + +{"description": "Valid numeric entity character U+0075", +"input": "u", +"output": [["Character", "\u0075"]]}, + +{"description": "Valid numeric entity character U+0076", +"input": "v", +"output": [["Character", "\u0076"]]}, + +{"description": "Valid numeric entity character U+0077", +"input": "w", +"output": [["Character", "\u0077"]]}, + +{"description": "Valid numeric entity character U+0078", +"input": "x", +"output": [["Character", "\u0078"]]}, + +{"description": "Valid numeric entity character U+0079", +"input": "y", +"output": [["Character", "\u0079"]]}, + +{"description": "Valid numeric entity character U+007A", +"input": "z", +"output": [["Character", "\u007A"]]}, + +{"description": "Valid numeric entity character U+007B", +"input": "{", +"output": [["Character", "\u007B"]]}, + +{"description": "Valid numeric entity character U+007C", +"input": "|", +"output": [["Character", "\u007C"]]}, + +{"description": "Valid numeric entity character U+007D", +"input": "}", +"output": [["Character", "\u007D"]]}, + +{"description": "Valid numeric entity character U+007E", +"input": "~", +"output": [["Character", "\u007E"]]}, + +{"description": "Valid numeric entity character U+00A0", +"input": " ", +"output": [["Character", "\u00A0"]]}, + +{"description": "Valid numeric entity character U+00A1", +"input": "¡", +"output": [["Character", "\u00A1"]]}, + +{"description": "Valid numeric entity character U+00A2", +"input": "¢", +"output": [["Character", "\u00A2"]]}, + +{"description": "Valid numeric entity character U+00A3", +"input": "£", +"output": [["Character", "\u00A3"]]}, + +{"description": "Valid numeric entity character U+00A4", +"input": "¤", +"output": [["Character", "\u00A4"]]}, + +{"description": "Valid numeric entity character U+00A5", +"input": "¥", +"output": [["Character", "\u00A5"]]}, + +{"description": "Valid numeric entity character U+00A6", +"input": "¦", +"output": [["Character", "\u00A6"]]}, + +{"description": "Valid numeric entity character U+00A7", +"input": "§", +"output": [["Character", "\u00A7"]]}, + +{"description": "Valid numeric entity character U+00A8", +"input": "¨", +"output": [["Character", "\u00A8"]]}, + +{"description": "Valid numeric entity character U+00A9", +"input": "©", +"output": [["Character", "\u00A9"]]}, + +{"description": "Valid numeric entity character U+00AA", +"input": "ª", +"output": [["Character", "\u00AA"]]}, + +{"description": "Valid numeric entity character U+00AB", +"input": "«", +"output": [["Character", "\u00AB"]]}, + +{"description": "Valid numeric entity character U+00AC", +"input": "¬", +"output": [["Character", "\u00AC"]]}, + +{"description": "Valid numeric entity character U+00AD", +"input": "­", +"output": [["Character", "\u00AD"]]}, + +{"description": "Valid numeric entity character U+00AE", +"input": "®", +"output": [["Character", "\u00AE"]]}, + +{"description": "Valid numeric entity character U+00AF", +"input": "¯", +"output": [["Character", "\u00AF"]]}, + +{"description": "Valid numeric entity character U+00B0", +"input": "°", +"output": [["Character", "\u00B0"]]}, + +{"description": "Valid numeric entity character U+00B1", +"input": "±", +"output": [["Character", "\u00B1"]]}, + +{"description": "Valid numeric entity character U+00B2", +"input": "²", +"output": [["Character", "\u00B2"]]}, + +{"description": "Valid numeric entity character U+00B3", +"input": "³", +"output": [["Character", "\u00B3"]]}, + +{"description": "Valid numeric entity character U+00B4", +"input": "´", +"output": [["Character", "\u00B4"]]}, + +{"description": "Valid numeric entity character U+00B5", +"input": "µ", +"output": [["Character", "\u00B5"]]}, + +{"description": "Valid numeric entity character U+00B6", +"input": "¶", +"output": [["Character", "\u00B6"]]}, + +{"description": "Valid numeric entity character U+00B7", +"input": "·", +"output": [["Character", "\u00B7"]]}, + +{"description": "Valid numeric entity character U+00B8", +"input": "¸", +"output": [["Character", "\u00B8"]]}, + +{"description": "Valid numeric entity character U+00B9", +"input": "¹", +"output": [["Character", "\u00B9"]]}, + +{"description": "Valid numeric entity character U+00BA", +"input": "º", +"output": [["Character", "\u00BA"]]}, + +{"description": "Valid numeric entity character U+00BB", +"input": "»", +"output": [["Character", "\u00BB"]]}, + +{"description": "Valid numeric entity character U+00BC", +"input": "¼", +"output": [["Character", "\u00BC"]]}, + +{"description": "Valid numeric entity character U+00BD", +"input": "½", +"output": [["Character", "\u00BD"]]}, + +{"description": "Valid numeric entity character U+00BE", +"input": "¾", +"output": [["Character", "\u00BE"]]}, + +{"description": "Valid numeric entity character U+00BF", +"input": "¿", +"output": [["Character", "\u00BF"]]}, + +{"description": "Valid numeric entity character U+00C0", +"input": "À", +"output": [["Character", "\u00C0"]]}, + +{"description": "Valid numeric entity character U+00C1", +"input": "Á", +"output": [["Character", "\u00C1"]]}, + +{"description": "Valid numeric entity character U+00C2", +"input": "Â", +"output": [["Character", "\u00C2"]]}, + +{"description": "Valid numeric entity character U+00C3", +"input": "Ã", +"output": [["Character", "\u00C3"]]}, + +{"description": "Valid numeric entity character U+00C4", +"input": "Ä", +"output": [["Character", "\u00C4"]]}, + +{"description": "Valid numeric entity character U+00C5", +"input": "Å", +"output": [["Character", "\u00C5"]]}, + +{"description": "Valid numeric entity character U+00C6", +"input": "Æ", +"output": [["Character", "\u00C6"]]}, + +{"description": "Valid numeric entity character U+00C7", +"input": "Ç", +"output": [["Character", "\u00C7"]]}, + +{"description": "Valid numeric entity character U+00C8", +"input": "È", +"output": [["Character", "\u00C8"]]}, + +{"description": "Valid numeric entity character U+00C9", +"input": "É", +"output": [["Character", "\u00C9"]]}, + +{"description": "Valid numeric entity character U+00CA", +"input": "Ê", +"output": [["Character", "\u00CA"]]}, + +{"description": "Valid numeric entity character U+00CB", +"input": "Ë", +"output": [["Character", "\u00CB"]]}, + +{"description": "Valid numeric entity character U+00CC", +"input": "Ì", +"output": [["Character", "\u00CC"]]}, + +{"description": "Valid numeric entity character U+00CD", +"input": "Í", +"output": [["Character", "\u00CD"]]}, + +{"description": "Valid numeric entity character U+00CE", +"input": "Î", +"output": [["Character", "\u00CE"]]}, + +{"description": "Valid numeric entity character U+00CF", +"input": "Ï", +"output": [["Character", "\u00CF"]]}, + +{"description": "Valid numeric entity character U+00D0", +"input": "Ð", +"output": [["Character", "\u00D0"]]}, + +{"description": "Valid numeric entity character U+00D1", +"input": "Ñ", +"output": [["Character", "\u00D1"]]}, + +{"description": "Valid numeric entity character U+00D2", +"input": "Ò", +"output": [["Character", "\u00D2"]]}, + +{"description": "Valid numeric entity character U+00D3", +"input": "Ó", +"output": [["Character", "\u00D3"]]}, + +{"description": "Valid numeric entity character U+00D4", +"input": "Ô", +"output": [["Character", "\u00D4"]]}, + +{"description": "Valid numeric entity character U+00D5", +"input": "Õ", +"output": [["Character", "\u00D5"]]}, + +{"description": "Valid numeric entity character U+00D6", +"input": "Ö", +"output": [["Character", "\u00D6"]]}, + +{"description": "Valid numeric entity character U+00D7", +"input": "×", +"output": [["Character", "\u00D7"]]}, + +{"description": "Valid numeric entity character U+00D8", +"input": "Ø", +"output": [["Character", "\u00D8"]]}, + +{"description": "Valid numeric entity character U+00D9", +"input": "Ù", +"output": [["Character", "\u00D9"]]}, + +{"description": "Valid numeric entity character U+00DA", +"input": "Ú", +"output": [["Character", "\u00DA"]]}, + +{"description": "Valid numeric entity character U+00DB", +"input": "Û", +"output": [["Character", "\u00DB"]]}, + +{"description": "Valid numeric entity character U+00DC", +"input": "Ü", +"output": [["Character", "\u00DC"]]}, + +{"description": "Valid numeric entity character U+00DD", +"input": "Ý", +"output": [["Character", "\u00DD"]]}, + +{"description": "Valid numeric entity character U+00DE", +"input": "Þ", +"output": [["Character", "\u00DE"]]}, + +{"description": "Valid numeric entity character U+00DF", +"input": "ß", +"output": [["Character", "\u00DF"]]}, + +{"description": "Valid numeric entity character U+00E0", +"input": "à", +"output": [["Character", "\u00E0"]]}, + +{"description": "Valid numeric entity character U+00E1", +"input": "á", +"output": [["Character", "\u00E1"]]}, + +{"description": "Valid numeric entity character U+00E2", +"input": "â", +"output": [["Character", "\u00E2"]]}, + +{"description": "Valid numeric entity character U+00E3", +"input": "ã", +"output": [["Character", "\u00E3"]]}, + +{"description": "Valid numeric entity character U+00E4", +"input": "ä", +"output": [["Character", "\u00E4"]]}, + +{"description": "Valid numeric entity character U+00E5", +"input": "å", +"output": [["Character", "\u00E5"]]}, + +{"description": "Valid numeric entity character U+00E6", +"input": "æ", +"output": [["Character", "\u00E6"]]}, + +{"description": "Valid numeric entity character U+00E7", +"input": "ç", +"output": [["Character", "\u00E7"]]}, + +{"description": "Valid numeric entity character U+00E8", +"input": "è", +"output": [["Character", "\u00E8"]]}, + +{"description": "Valid numeric entity character U+00E9", +"input": "é", +"output": [["Character", "\u00E9"]]}, + +{"description": "Valid numeric entity character U+00EA", +"input": "ê", +"output": [["Character", "\u00EA"]]}, + +{"description": "Valid numeric entity character U+00EB", +"input": "ë", +"output": [["Character", "\u00EB"]]}, + +{"description": "Valid numeric entity character U+00EC", +"input": "ì", +"output": [["Character", "\u00EC"]]}, + +{"description": "Valid numeric entity character U+00ED", +"input": "í", +"output": [["Character", "\u00ED"]]}, + +{"description": "Valid numeric entity character U+00EE", +"input": "î", +"output": [["Character", "\u00EE"]]}, + +{"description": "Valid numeric entity character U+00EF", +"input": "ï", +"output": [["Character", "\u00EF"]]}, + +{"description": "Valid numeric entity character U+00F0", +"input": "ð", +"output": [["Character", "\u00F0"]]}, + +{"description": "Valid numeric entity character U+00F1", +"input": "ñ", +"output": [["Character", "\u00F1"]]}, + +{"description": "Valid numeric entity character U+00F2", +"input": "ò", +"output": [["Character", "\u00F2"]]}, + +{"description": "Valid numeric entity character U+00F3", +"input": "ó", +"output": [["Character", "\u00F3"]]}, + +{"description": "Valid numeric entity character U+00F4", +"input": "ô", +"output": [["Character", "\u00F4"]]}, + +{"description": "Valid numeric entity character U+00F5", +"input": "õ", +"output": [["Character", "\u00F5"]]}, + +{"description": "Valid numeric entity character U+00F6", +"input": "ö", +"output": [["Character", "\u00F6"]]}, + +{"description": "Valid numeric entity character U+00F7", +"input": "÷", +"output": [["Character", "\u00F7"]]}, + +{"description": "Valid numeric entity character U+00F8", +"input": "ø", +"output": [["Character", "\u00F8"]]}, + +{"description": "Valid numeric entity character U+00F9", +"input": "ù", +"output": [["Character", "\u00F9"]]}, + +{"description": "Valid numeric entity character U+00FA", +"input": "ú", +"output": [["Character", "\u00FA"]]}, + +{"description": "Valid numeric entity character U+00FB", +"input": "û", +"output": [["Character", "\u00FB"]]}, + +{"description": "Valid numeric entity character U+00FC", +"input": "ü", +"output": [["Character", "\u00FC"]]}, + +{"description": "Valid numeric entity character U+00FD", +"input": "ý", +"output": [["Character", "\u00FD"]]}, + +{"description": "Valid numeric entity character U+00FE", +"input": "þ", +"output": [["Character", "\u00FE"]]}, + +{"description": "Valid numeric entity character U+00FF", +"input": "ÿ", +"output": [["Character", "\u00FF"]]}, + +{"description": "Valid numeric entity character U+D7FF", +"input": "퟿", +"output": [["Character", "\uD7FF"]]}, + +{"description": "Valid numeric entity character U+E000", +"input": "", +"output": [["Character", "\uE000"]]}, + +{"description": "Valid numeric entity character U+FDCF", +"input": "﷏", +"output": [["Character", "\uFDCF"]]}, + +{"description": "Valid numeric entity character U+FDF0", +"input": "ﷰ", +"output": [["Character", "\uFDF0"]]}, + +{"description": "Valid numeric entity character U+FFFD", +"input": "�", +"output": [["Character", "\uFFFD"]]}, + +{"description": "Valid numeric entity character U+10000", +"input": "𐀀", +"output": [["Character", "\uD800\uDC00"]]}, + +{"description": "Valid numeric entity character U+1FFFD", +"input": "🿽", +"output": [["Character", "\uD83F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+20000", +"input": "𠀀", +"output": [["Character", "\uD840\uDC00"]]}, + +{"description": "Valid numeric entity character U+2FFFD", +"input": "𯿽", +"output": [["Character", "\uD87F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+30000", +"input": "𰀀", +"output": [["Character", "\uD880\uDC00"]]}, + +{"description": "Valid numeric entity character U+3FFFD", +"input": "𿿽", +"output": [["Character", "\uD8BF\uDFFD"]]}, + +{"description": "Valid numeric entity character U+40000", +"input": "񀀀", +"output": [["Character", "\uD8C0\uDC00"]]}, + +{"description": "Valid numeric entity character U+4FFFD", +"input": "񏿽", +"output": [["Character", "\uD8FF\uDFFD"]]}, + +{"description": "Valid numeric entity character U+50000", +"input": "񐀀", +"output": [["Character", "\uD900\uDC00"]]}, + +{"description": "Valid numeric entity character U+5FFFD", +"input": "񟿽", +"output": [["Character", "\uD93F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+60000", +"input": "񠀀", +"output": [["Character", "\uD940\uDC00"]]}, + +{"description": "Valid numeric entity character U+6FFFD", +"input": "񯿽", +"output": [["Character", "\uD97F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+70000", +"input": "񰀀", +"output": [["Character", "\uD980\uDC00"]]}, + +{"description": "Valid numeric entity character U+7FFFD", +"input": "񿿽", +"output": [["Character", "\uD9BF\uDFFD"]]}, + +{"description": "Valid numeric entity character U+80000", +"input": "򀀀", +"output": [["Character", "\uD9C0\uDC00"]]}, + +{"description": "Valid numeric entity character U+8FFFD", +"input": "򏿽", +"output": [["Character", "\uD9FF\uDFFD"]]}, + +{"description": "Valid numeric entity character U+90000", +"input": "򐀀", +"output": [["Character", "\uDA00\uDC00"]]}, + +{"description": "Valid numeric entity character U+9FFFD", +"input": "򟿽", +"output": [["Character", "\uDA3F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+A0000", +"input": "򠀀", +"output": [["Character", "\uDA40\uDC00"]]}, + +{"description": "Valid numeric entity character U+AFFFD", +"input": "򯿽", +"output": [["Character", "\uDA7F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+B0000", +"input": "򰀀", +"output": [["Character", "\uDA80\uDC00"]]}, + +{"description": "Valid numeric entity character U+BFFFD", +"input": "򿿽", +"output": [["Character", "\uDABF\uDFFD"]]}, + +{"description": "Valid numeric entity character U+C0000", +"input": "󀀀", +"output": [["Character", "\uDAC0\uDC00"]]}, + +{"description": "Valid numeric entity character U+CFFFD", +"input": "󏿽", +"output": [["Character", "\uDAFF\uDFFD"]]}, + +{"description": "Valid numeric entity character U+D0000", +"input": "󐀀", +"output": [["Character", "\uDB00\uDC00"]]}, + +{"description": "Valid numeric entity character U+DFFFD", +"input": "󟿽", +"output": [["Character", "\uDB3F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+E0000", +"input": "󠀀", +"output": [["Character", "\uDB40\uDC00"]]}, + +{"description": "Valid numeric entity character U+EFFFD", +"input": "󯿽", +"output": [["Character", "\uDB7F\uDFFD"]]}, + +{"description": "Valid numeric entity character U+F0000", +"input": "󰀀", +"output": [["Character", "\uDB80\uDC00"]]}, + +{"description": "Valid numeric entity character U+FFFFD", +"input": "󿿽", +"output": [["Character", "\uDBBF\uDFFD"]]}, + +{"description": "Valid numeric entity character U+100000", +"input": "􀀀", +"output": [["Character", "\uDBC0\uDC00"]]}, + +{"description": "Valid numeric entity character U+10FFFD", +"input": "􏿽", +"output": [["Character", "\uDBFF\uDFFD"]]} + +]} + + diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/pendingSpecChanges.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/pendingSpecChanges.test new file mode 100644 index 000000000..1b7dc3c72 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/pendingSpecChanges.test @@ -0,0 +1,7 @@ +{"tests": [ + +{"description":"<!---- >", +"input":"<!---- >", +"output":["ParseError", "ParseError", ["Comment","-- >"]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test1.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test1.test new file mode 100644 index 000000000..b97b2cbec --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test1.test @@ -0,0 +1,196 @@ +{"tests": [ + +{"description":"Correct Doctype lowercase", +"input":"<!DOCTYPE html>", +"output":[["DOCTYPE", "html", null, null, true]]}, + +{"description":"Correct Doctype uppercase", +"input":"<!DOCTYPE HTML>", +"output":[["DOCTYPE", "html", null, null, true]]}, + +{"description":"Correct Doctype mixed case", +"input":"<!DOCTYPE HtMl>", +"output":[["DOCTYPE", "html", null, null, true]]}, + +{"description":"Correct Doctype case with EOF", +"input":"<!DOCTYPE HtMl", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"Truncated doctype start", +"input":"<!DOC>", +"output":["ParseError", ["Comment", "DOC"]]}, + +{"description":"Doctype in error", +"input":"<!DOCTYPE foo>", +"output":[["DOCTYPE", "foo", null, null, true]]}, + +{"description":"Single Start Tag", +"input":"<h>", +"output":[["StartTag", "h", {}]]}, + +{"description":"Empty end tag", +"input":"</>", +"output":["ParseError"]}, + +{"description":"Empty start tag", +"input":"<>", +"output":["ParseError", ["Character", "<>"]]}, + +{"description":"Start Tag w/attribute", +"input":"<h a='b'>", +"output":[["StartTag", "h", {"a":"b"}]]}, + +{"description":"Start Tag w/attribute no quotes", +"input":"<h a=b>", +"output":[["StartTag", "h", {"a":"b"}]]}, + +{"description":"Start/End Tag", +"input":"<h></h>", +"output":[["StartTag", "h", {}], ["EndTag", "h"]]}, + +{"description":"Two unclosed start tags", +"input":"<p>One<p>Two", +"output":[["StartTag", "p", {}], ["Character", "One"], ["StartTag", "p", {}], ["Character", "Two"]]}, + +{"description":"End Tag w/attribute", +"input":"<h></h a='b'>", +"output":[["StartTag", "h", {}], "ParseError", ["EndTag", "h"]]}, + +{"description":"Multiple atts", +"input":"<h a='b' c='d'>", +"output":[["StartTag", "h", {"a":"b", "c":"d"}]]}, + +{"description":"Multiple atts no space", +"input":"<h a='b'c='d'>", +"output":["ParseError", ["StartTag", "h", {"a":"b", "c":"d"}]]}, + +{"description":"Repeated attr", + "input":"<h a='b' a='d'>", + "output":["ParseError", ["StartTag", "h", {"a":"b"}]]}, + +{"description":"Simple comment", + "input":"<!--comment-->", + "output":[["Comment", "comment"]]}, + +{"description":"Comment, Central dash no space", + "input":"<!----->", + "output":["ParseError", ["Comment", "-"]]}, + +{"description":"Comment, two central dashes", +"input":"<!-- --comment -->", +"output":["ParseError", ["Comment", " --comment "]]}, + +{"description":"Unfinished comment", +"input":"<!--comment", +"output":["ParseError", ["Comment", "comment"]]}, + +{"description":"Start of a comment", +"input":"<!-", +"output":["ParseError", ["Comment", "-"]]}, + +{"description":"Short comment", + "input":"<!-->", + "output":["ParseError", ["Comment", ""]]}, + +{"description":"Short comment two", + "input":"<!--->", + "output":["ParseError", ["Comment", ""]]}, + +{"description":"Short comment three", + "input":"<!---->", + "output":[["Comment", ""]]}, + + +{"description":"Ampersand EOF", +"input":"&", +"output":[["Character", "&"]]}, + +{"description":"Ampersand ampersand EOF", +"input":"&&", +"output":[["Character", "&&"]]}, + +{"description":"Ampersand space EOF", +"input":"& ", +"output":[["Character", "& "]]}, + +{"description":"Unfinished entity", +"input":"&f", +"output":[["Character", "&f"]]}, + +{"description":"Ampersand, number sign", +"input":"&#", +"output":["ParseError", ["Character", "&#"]]}, + +{"description":"Unfinished numeric entity", +"input":"&#x", +"output":["ParseError", ["Character", "&#x"]]}, + +{"description":"Entity with trailing semicolon (1)", +"input":"I'm ¬it", +"output":[["Character","I'm \u00ACit"]]}, + +{"description":"Entity with trailing semicolon (2)", +"input":"I'm ∉", +"output":[["Character","I'm \u2209"]]}, + +{"description":"Entity without trailing semicolon (1)", +"input":"I'm ¬it", +"output":[["Character","I'm "], "ParseError", ["Character", "\u00ACit"]]}, + +{"description":"Entity without trailing semicolon (2)", +"input":"I'm ¬in", +"output":[["Character","I'm "], "ParseError", ["Character", "\u00ACin"]]}, + +{"description":"Partial entity match at end of file", +"input":"I'm &no", +"output":[["Character","I'm &no"]]}, + +{"description":"Non-ASCII character reference name", +"input":"&\u00AC;", +"output":[["Character", "&\u00AC;"]]}, + +{"description":"ASCII decimal entity", +"input":"$", +"output":[["Character","$"]]}, + +{"description":"ASCII hexadecimal entity", +"input":"?", +"output":[["Character","?"]]}, + +{"description":"Hexadecimal entity in attribute", +"input":"<h a='?'></h>", +"output":[["StartTag", "h", {"a":"?"}], ["EndTag", "h"]]}, + +{"description":"Entity in attribute without semicolon ending in x", +"input":"<h a='¬x'>", +"output":[["StartTag", "h", {"a":"¬x"}]]}, + +{"description":"Entity in attribute without semicolon ending in 1", +"input":"<h a='¬1'>", +"output":[["StartTag", "h", {"a":"¬1"}]]}, + +{"description":"Entity in attribute without semicolon ending in i", +"input":"<h a='¬i'>", +"output":[["StartTag", "h", {"a":"¬i"}]]}, + +{"description":"Entity in attribute without semicolon", +"input":"<h a='©'>", +"output":["ParseError", ["StartTag", "h", {"a":"\u00A9"}]]}, + +{"description":"Unquoted attribute ending in ampersand", +"input":"<s o=& t>", +"output":[["StartTag","s",{"o":"&","t":""}]]}, + +{"description":"Unquoted attribute at end of tag with final character of &, with tag followed by characters", +"input":"<a a=a&>foo", +"output":[["StartTag", "a", {"a":"a&"}], ["Character", "foo"]]}, + +{"description":"plaintext element", + "input":"<plaintext>foobar", + "output":[["StartTag","plaintext",{}], ["Character","foobar"]]}, + +{"description":"Open angled bracket in unquoted attribute value state", + "input":"<a a=f<>", + "output":["ParseError", ["StartTag", "a", {"a":"f<"}]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test2.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test2.test new file mode 100644 index 000000000..87a8eba34 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test2.test @@ -0,0 +1,179 @@ +{"tests": [ + +{"description":"DOCTYPE without name", +"input":"<!DOCTYPE>", +"output":["ParseError", "ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"DOCTYPE without space before name", +"input":"<!DOCTYPEhtml>", +"output":["ParseError", ["DOCTYPE", "html", null, null, true]]}, + +{"description":"Incorrect DOCTYPE without a space before name", +"input":"<!DOCTYPEfoo>", +"output":["ParseError", ["DOCTYPE", "foo", null, null, true]]}, + +{"description":"DOCTYPE with publicId", +"input":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML Transitional 4.01//EN\">", +"output":[["DOCTYPE", "html", "-//W3C//DTD HTML Transitional 4.01//EN", null, true]]}, + +{"description":"DOCTYPE with EOF after PUBLIC", +"input":"<!DOCTYPE html PUBLIC", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"DOCTYPE with EOF after PUBLIC '", +"input":"<!DOCTYPE html PUBLIC '", +"output":["ParseError", ["DOCTYPE", "html", "", null, false]]}, + +{"description":"DOCTYPE with EOF after PUBLIC 'x", +"input":"<!DOCTYPE html PUBLIC 'x", +"output":["ParseError", ["DOCTYPE", "html", "x", null, false]]}, + +{"description":"DOCTYPE with systemId", +"input":"<!DOCTYPE html SYSTEM \"-//W3C//DTD HTML Transitional 4.01//EN\">", +"output":[["DOCTYPE", "html", null, "-//W3C//DTD HTML Transitional 4.01//EN", true]]}, + +{"description":"DOCTYPE with publicId and systemId", +"input":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML Transitional 4.01//EN\" \"-//W3C//DTD HTML Transitional 4.01//EN\">", +"output":[["DOCTYPE", "html", "-//W3C//DTD HTML Transitional 4.01//EN", "-//W3C//DTD HTML Transitional 4.01//EN", true]]}, + +{"description":"DOCTYPE with > in double-quoted publicId", +"input":"<!DOCTYPE html PUBLIC \">x", +"output":["ParseError", ["DOCTYPE", "html", "", null, false], ["Character", "x"]]}, + +{"description":"DOCTYPE with > in single-quoted publicId", +"input":"<!DOCTYPE html PUBLIC '>x", +"output":["ParseError", ["DOCTYPE", "html", "", null, false], ["Character", "x"]]}, + +{"description":"DOCTYPE with > in double-quoted systemId", +"input":"<!DOCTYPE html PUBLIC \"foo\" \">x", +"output":["ParseError", ["DOCTYPE", "html", "foo", "", false], ["Character", "x"]]}, + +{"description":"DOCTYPE with > in single-quoted systemId", +"input":"<!DOCTYPE html PUBLIC 'foo' '>x", +"output":["ParseError", ["DOCTYPE", "html", "foo", "", false], ["Character", "x"]]}, + +{"description":"Incomplete doctype", +"input":"<!DOCTYPE html ", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"Numeric entity representing the NUL character", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Hexadecimal entity representing the NUL character", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Numeric entity representing a codepoint after 1114111 (U+10FFFF)", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Hexadecimal entity representing a codepoint after 1114111 (U+10FFFF)", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Hexadecimal entity pair representing a surrogate pair", +"input":"��", +"output":["ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Hexadecimal entity with mixed uppercase and lowercase", +"input":"ꯍ", +"output":[["Character", "\uABCD"]]}, + +{"description":"Entity without a name", +"input":"&;", +"output":[["Character", "&;"]]}, + +{"description":"Unescaped ampersand in attribute value", +"input":"<h a='&'>", +"output":[["StartTag", "h", { "a":"&" }]]}, + +{"description":"StartTag containing <", +"input":"<a<b>", +"output":[["StartTag", "a<b", { }]]}, + +{"description":"Non-void element containing trailing /", +"input":"<h/>", +"output":[["StartTag","h",{},true]]}, + +{"description":"Void element with permitted slash", +"input":"<br/>", +"output":[["StartTag","br",{},true]]}, + +{"description":"Void element with permitted slash (with attribute)", +"input":"<br foo='bar'/>", +"output":[["StartTag","br",{"foo":"bar"},true]]}, + +{"description":"StartTag containing /", +"input":"<h/a='b'>", +"output":["ParseError", ["StartTag", "h", { "a":"b" }]]}, + +{"description":"Double-quoted attribute value", +"input":"<h a=\"b\">", +"output":[["StartTag", "h", { "a":"b" }]]}, + +{"description":"Unescaped </", +"input":"</", +"output":["ParseError", ["Character", "</"]]}, + +{"description":"Illegal end tag name", +"input":"</1>", +"output":["ParseError", ["Comment", "1"]]}, + +{"description":"Simili processing instruction", +"input":"<?namespace>", +"output":["ParseError", ["Comment", "?namespace"]]}, + +{"description":"A bogus comment stops at >, even if preceeded by two dashes", +"input":"<?foo-->", +"output":["ParseError", ["Comment", "?foo--"]]}, + +{"description":"Unescaped <", +"input":"foo < bar", +"output":[["Character", "foo "], "ParseError", ["Character", "< bar"]]}, + +{"description":"Null Byte Replacement", +"input":"\u0000", +"output":["ParseError", ["Character", "\u0000"]]}, + +{"description":"Comment with dash", +"input":"<!---x", +"output":["ParseError", ["Comment", "-x"]]}, + +{"description":"Entity + newline", +"input":"\nx\n>\n", +"output":[["Character","\nx\n>\n"]]}, + +{"description":"Start tag with no attributes but space before the greater-than sign", +"input":"<h >", +"output":[["StartTag", "h", {}]]}, + +{"description":"Empty attribute followed by uppercase attribute", +"input":"<h a B=''>", +"output":[["StartTag", "h", {"a":"", "b":""}]]}, + +{"description":"Double-quote after attribute name", +"input":"<h a \">", +"output":["ParseError", ["StartTag", "h", {"a":"", "\"":""}]]}, + +{"description":"Single-quote after attribute name", +"input":"<h a '>", +"output":["ParseError", ["StartTag", "h", {"a":"", "'":""}]]}, + +{"description":"Empty end tag with following characters", +"input":"a</>bc", +"output":[["Character", "a"], "ParseError", ["Character", "bc"]]}, + +{"description":"Empty end tag with following tag", +"input":"a</><b>c", +"output":[["Character", "a"], "ParseError", ["StartTag", "b", {}], ["Character", "c"]]}, + +{"description":"Empty end tag with following comment", +"input":"a</><!--b-->c", +"output":[["Character", "a"], "ParseError", ["Comment", "b"], ["Character", "c"]]}, + +{"description":"Empty end tag with following end tag", +"input":"a</></b>c", +"output":[["Character", "a"], "ParseError", ["EndTag", "b"], ["Character", "c"]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test3.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test3.test new file mode 100644 index 000000000..8fc529a2b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test3.test @@ -0,0 +1,6047 @@ +{"tests": [ + +{"description":"", +"input":"", +"output":[]}, + +{"description":"\\u0009", +"input":"\u0009", +"output":[["Character", "\u0009"]]}, + +{"description":"\\u000A", +"input":"\u000A", +"output":[["Character", "\u000A"]]}, + +{"description":"\\u000B", +"input":"\u000B", +"output":["ParseError", ["Character", "\u000B"]]}, + +{"description":"\\u000C", +"input":"\u000C", +"output":[["Character", "\u000C"]]}, + +{"description":" ", +"input":" ", +"output":[["Character", " "]]}, + +{"description":"!", +"input":"!", +"output":[["Character", "!"]]}, + +{"description":"\"", +"input":"\"", +"output":[["Character", "\""]]}, + +{"description":"%", +"input":"%", +"output":[["Character", "%"]]}, + +{"description":"&", +"input":"&", +"output":[["Character", "&"]]}, + +{"description":"'", +"input":"'", +"output":[["Character", "'"]]}, + +{"description":",", +"input":",", +"output":[["Character", ","]]}, + +{"description":"-", +"input":"-", +"output":[["Character", "-"]]}, + +{"description":".", +"input":".", +"output":[["Character", "."]]}, + +{"description":"/", +"input":"/", +"output":[["Character", "/"]]}, + +{"description":"0", +"input":"0", +"output":[["Character", "0"]]}, + +{"description":"1", +"input":"1", +"output":[["Character", "1"]]}, + +{"description":"9", +"input":"9", +"output":[["Character", "9"]]}, + +{"description":";", +"input":";", +"output":[["Character", ";"]]}, + +{"description":"<", +"input":"<", +"output":["ParseError", ["Character", "<"]]}, + +{"description":"<\\u0000", +"input":"<\u0000", +"output":["ParseError", ["Character", "<"], "ParseError", ["Character", "\u0000"]]}, + +{"description":"<\\u0009", +"input":"<\u0009", +"output":["ParseError", ["Character", "<\u0009"]]}, + +{"description":"<\\u000A", +"input":"<\u000A", +"output":["ParseError", ["Character", "<\u000A"]]}, + +{"description":"<\\u000B", +"input":"<\u000B", +"output":["ParseError", "ParseError", ["Character", "<\u000B"]]}, + +{"description":"<\\u000C", +"input":"<\u000C", +"output":["ParseError", ["Character", "<\u000C"]]}, + +{"description":"< ", +"input":"< ", +"output":["ParseError", ["Character", "< "]]}, + +{"description":"<!", +"input":"<!", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!\\u0000", +"input":"<!\u0000", +"output":["ParseError", ["Comment", "\uFFFD"]]}, + +{"description":"<!\\u0009", +"input":"<!\u0009", +"output":["ParseError", ["Comment", "\u0009"]]}, + +{"description":"<!\\u000A", +"input":"<!\u000A", +"output":["ParseError", ["Comment", "\u000A"]]}, + +{"description":"<!\\u000B", +"input":"<!\u000B", +"output":["ParseError", "ParseError", ["Comment", "\u000B"]]}, + +{"description":"<!\\u000C", +"input":"<!\u000C", +"output":["ParseError", ["Comment", "\u000C"]]}, + +{"description":"<! ", +"input":"<! ", +"output":["ParseError", ["Comment", " "]]}, + +{"description":"<!!", +"input":"<!!", +"output":["ParseError", ["Comment", "!"]]}, + +{"description":"<!\"", +"input":"<!\"", +"output":["ParseError", ["Comment", "\""]]}, + +{"description":"<!&", +"input":"<!&", +"output":["ParseError", ["Comment", "&"]]}, + +{"description":"<!'", +"input":"<!'", +"output":["ParseError", ["Comment", "'"]]}, + +{"description":"<!-", +"input":"<!-", +"output":["ParseError", ["Comment", "-"]]}, + +{"description":"<!--", +"input":"<!--", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!--\\u0000", +"input":"<!--\u0000", +"output":["ParseError", "ParseError", ["Comment", "\uFFFD"]]}, + +{"description":"<!--\\u0009", +"input":"<!--\u0009", +"output":["ParseError", ["Comment", "\u0009"]]}, + +{"description":"<!--\\u000A", +"input":"<!--\u000A", +"output":["ParseError", ["Comment", "\u000A"]]}, + +{"description":"<!--\\u000B", +"input":"<!--\u000B", +"output":["ParseError", "ParseError", ["Comment", "\u000B"]]}, + +{"description":"<!--\\u000C", +"input":"<!--\u000C", +"output":["ParseError", ["Comment", "\u000C"]]}, + +{"description":"<!-- ", +"input":"<!-- ", +"output":["ParseError", ["Comment", " "]]}, + +{"description":"<!-- \\u0000", +"input":"<!-- \u0000", +"output":["ParseError", "ParseError", ["Comment", " \uFFFD"]]}, + +{"description":"<!-- \\u0009", +"input":"<!-- \u0009", +"output":["ParseError", ["Comment", " \u0009"]]}, + +{"description":"<!-- \\u000A", +"input":"<!-- \u000A", +"output":["ParseError", ["Comment", " \u000A"]]}, + +{"description":"<!-- \\u000B", +"input":"<!-- \u000B", +"output":["ParseError", "ParseError", ["Comment", " \u000B"]]}, + +{"description":"<!-- \\u000C", +"input":"<!-- \u000C", +"output":["ParseError", ["Comment", " \u000C"]]}, + +{"description":"<!-- ", +"input":"<!-- ", +"output":["ParseError", ["Comment", " "]]}, + +{"description":"<!-- !", +"input":"<!-- !", +"output":["ParseError", ["Comment", " !"]]}, + +{"description":"<!-- \"", +"input":"<!-- \"", +"output":["ParseError", ["Comment", " \""]]}, + +{"description":"<!-- &", +"input":"<!-- &", +"output":["ParseError", ["Comment", " &"]]}, + +{"description":"<!-- '", +"input":"<!-- '", +"output":["ParseError", ["Comment", " '"]]}, + +{"description":"<!-- ,", +"input":"<!-- ,", +"output":["ParseError", ["Comment", " ,"]]}, + +{"description":"<!-- -", +"input":"<!-- -", +"output":["ParseError", ["Comment", " "]]}, + +{"description":"<!-- -\\u0000", +"input":"<!-- -\u0000", +"output":["ParseError", "ParseError", ["Comment", " -\uFFFD"]]}, + +{"description":"<!-- -\\u0009", +"input":"<!-- -\u0009", +"output":["ParseError", ["Comment", " -\u0009"]]}, + +{"description":"<!-- -\\u000A", +"input":"<!-- -\u000A", +"output":["ParseError", ["Comment", " -\u000A"]]}, + +{"description":"<!-- -\\u000B", +"input":"<!-- -\u000B", +"output":["ParseError", "ParseError", ["Comment", " -\u000B"]]}, + +{"description":"<!-- -\\u000C", +"input":"<!-- -\u000C", +"output":["ParseError", ["Comment", " -\u000C"]]}, + +{"description":"<!-- - ", +"input":"<!-- - ", +"output":["ParseError", ["Comment", " - "]]}, + +{"description":"<!-- -!", +"input":"<!-- -!", +"output":["ParseError", ["Comment", " -!"]]}, + +{"description":"<!-- -\"", +"input":"<!-- -\"", +"output":["ParseError", ["Comment", " -\""]]}, + +{"description":"<!-- -&", +"input":"<!-- -&", +"output":["ParseError", ["Comment", " -&"]]}, + +{"description":"<!-- -'", +"input":"<!-- -'", +"output":["ParseError", ["Comment", " -'"]]}, + +{"description":"<!-- -,", +"input":"<!-- -,", +"output":["ParseError", ["Comment", " -,"]]}, + +{"description":"<!-- --", +"input":"<!-- --", +"output":["ParseError", ["Comment", " "]]}, + +{"description":"<!-- -.", +"input":"<!-- -.", +"output":["ParseError", ["Comment", " -."]]}, + +{"description":"<!-- -/", +"input":"<!-- -/", +"output":["ParseError", ["Comment", " -/"]]}, + +{"description":"<!-- -0", +"input":"<!-- -0", +"output":["ParseError", ["Comment", " -0"]]}, + +{"description":"<!-- -1", +"input":"<!-- -1", +"output":["ParseError", ["Comment", " -1"]]}, + +{"description":"<!-- -9", +"input":"<!-- -9", +"output":["ParseError", ["Comment", " -9"]]}, + +{"description":"<!-- -<", +"input":"<!-- -<", +"output":["ParseError", ["Comment", " -<"]]}, + +{"description":"<!-- -=", +"input":"<!-- -=", +"output":["ParseError", ["Comment", " -="]]}, + +{"description":"<!-- ->", +"input":"<!-- ->", +"output":["ParseError", ["Comment", " ->"]]}, + +{"description":"<!-- -?", +"input":"<!-- -?", +"output":["ParseError", ["Comment", " -?"]]}, + +{"description":"<!-- -@", +"input":"<!-- -@", +"output":["ParseError", ["Comment", " -@"]]}, + +{"description":"<!-- -A", +"input":"<!-- -A", +"output":["ParseError", ["Comment", " -A"]]}, + +{"description":"<!-- -B", +"input":"<!-- -B", +"output":["ParseError", ["Comment", " -B"]]}, + +{"description":"<!-- -Y", +"input":"<!-- -Y", +"output":["ParseError", ["Comment", " -Y"]]}, + +{"description":"<!-- -Z", +"input":"<!-- -Z", +"output":["ParseError", ["Comment", " -Z"]]}, + +{"description":"<!-- -`", +"input":"<!-- -`", +"output":["ParseError", ["Comment", " -`"]]}, + +{"description":"<!-- -a", +"input":"<!-- -a", +"output":["ParseError", ["Comment", " -a"]]}, + +{"description":"<!-- -b", +"input":"<!-- -b", +"output":["ParseError", ["Comment", " -b"]]}, + +{"description":"<!-- -y", +"input":"<!-- -y", +"output":["ParseError", ["Comment", " -y"]]}, + +{"description":"<!-- -z", +"input":"<!-- -z", +"output":["ParseError", ["Comment", " -z"]]}, + +{"description":"<!-- -{", +"input":"<!-- -{", +"output":["ParseError", ["Comment", " -{"]]}, + +{"description":"<!-- -\\uDBC0\\uDC00", +"input":"<!-- -\uDBC0\uDC00", +"output":["ParseError", ["Comment", " -\uDBC0\uDC00"]]}, + +{"description":"<!-- .", +"input":"<!-- .", +"output":["ParseError", ["Comment", " ."]]}, + +{"description":"<!-- /", +"input":"<!-- /", +"output":["ParseError", ["Comment", " /"]]}, + +{"description":"<!-- 0", +"input":"<!-- 0", +"output":["ParseError", ["Comment", " 0"]]}, + +{"description":"<!-- 1", +"input":"<!-- 1", +"output":["ParseError", ["Comment", " 1"]]}, + +{"description":"<!-- 9", +"input":"<!-- 9", +"output":["ParseError", ["Comment", " 9"]]}, + +{"description":"<!-- <", +"input":"<!-- <", +"output":["ParseError", ["Comment", " <"]]}, + +{"description":"<!-- =", +"input":"<!-- =", +"output":["ParseError", ["Comment", " ="]]}, + +{"description":"<!-- >", +"input":"<!-- >", +"output":["ParseError", ["Comment", " >"]]}, + +{"description":"<!-- ?", +"input":"<!-- ?", +"output":["ParseError", ["Comment", " ?"]]}, + +{"description":"<!-- @", +"input":"<!-- @", +"output":["ParseError", ["Comment", " @"]]}, + +{"description":"<!-- A", +"input":"<!-- A", +"output":["ParseError", ["Comment", " A"]]}, + +{"description":"<!-- B", +"input":"<!-- B", +"output":["ParseError", ["Comment", " B"]]}, + +{"description":"<!-- Y", +"input":"<!-- Y", +"output":["ParseError", ["Comment", " Y"]]}, + +{"description":"<!-- Z", +"input":"<!-- Z", +"output":["ParseError", ["Comment", " Z"]]}, + +{"description":"<!-- `", +"input":"<!-- `", +"output":["ParseError", ["Comment", " `"]]}, + +{"description":"<!-- a", +"input":"<!-- a", +"output":["ParseError", ["Comment", " a"]]}, + +{"description":"<!-- b", +"input":"<!-- b", +"output":["ParseError", ["Comment", " b"]]}, + +{"description":"<!-- y", +"input":"<!-- y", +"output":["ParseError", ["Comment", " y"]]}, + +{"description":"<!-- z", +"input":"<!-- z", +"output":["ParseError", ["Comment", " z"]]}, + +{"description":"<!-- {", +"input":"<!-- {", +"output":["ParseError", ["Comment", " {"]]}, + +{"description":"<!-- \\uDBC0\\uDC00", +"input":"<!-- \uDBC0\uDC00", +"output":["ParseError", ["Comment", " \uDBC0\uDC00"]]}, + +{"description":"<!--!", +"input":"<!--!", +"output":["ParseError", ["Comment", "!"]]}, + +{"description":"<!--\"", +"input":"<!--\"", +"output":["ParseError", ["Comment", "\""]]}, + +{"description":"<!--&", +"input":"<!--&", +"output":["ParseError", ["Comment", "&"]]}, + +{"description":"<!--'", +"input":"<!--'", +"output":["ParseError", ["Comment", "'"]]}, + +{"description":"<!--,", +"input":"<!--,", +"output":["ParseError", ["Comment", ","]]}, + +{"description":"<!---", +"input":"<!---", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!---\\u0000", +"input":"<!---\u0000", +"output":["ParseError", "ParseError", ["Comment", "-\uFFFD"]]}, + +{"description":"<!---\\u0009", +"input":"<!---\u0009", +"output":["ParseError", ["Comment", "-\u0009"]]}, + +{"description":"<!---\\u000A", +"input":"<!---\u000A", +"output":["ParseError", ["Comment", "-\u000A"]]}, + +{"description":"<!---\\u000B", +"input":"<!---\u000B", +"output":["ParseError", "ParseError", ["Comment", "-\u000B"]]}, + +{"description":"<!---\\u000C", +"input":"<!---\u000C", +"output":["ParseError", ["Comment", "-\u000C"]]}, + +{"description":"<!--- ", +"input":"<!--- ", +"output":["ParseError", ["Comment", "- "]]}, + +{"description":"<!---!", +"input":"<!---!", +"output":["ParseError", ["Comment", "-!"]]}, + +{"description":"<!---\"", +"input":"<!---\"", +"output":["ParseError", ["Comment", "-\""]]}, + +{"description":"<!---&", +"input":"<!---&", +"output":["ParseError", ["Comment", "-&"]]}, + +{"description":"<!---'", +"input":"<!---'", +"output":["ParseError", ["Comment", "-'"]]}, + +{"description":"<!---,", +"input":"<!---,", +"output":["ParseError", ["Comment", "-,"]]}, + +{"description":"<!----", +"input":"<!----", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!----\\u0000", +"input":"<!----\u0000", +"output":["ParseError", "ParseError", ["Comment", "--\uFFFD"]]}, + +{"description":"<!----\\u0009", +"input":"<!----\u0009", +"output":["ParseError", "ParseError", ["Comment", "--\u0009"]]}, + +{"description":"<!----\\u000A", +"input":"<!----\u000A", +"output":["ParseError", "ParseError", ["Comment", "--\u000A"]]}, + +{"description":"<!----\\u000B", +"input":"<!----\u000B", +"output":["ParseError", "ParseError", "ParseError", ["Comment", "--\u000B"]]}, + +{"description":"<!----\\u000C", +"input":"<!----\u000C", +"output":["ParseError", "ParseError", ["Comment", "--\u000C"]]}, + +{"description":"<!---- ", +"input":"<!---- ", +"output":["ParseError", "ParseError", ["Comment", "-- "]]}, + +{"description":"<!---- -", +"input":"<!---- -", +"output":["ParseError", "ParseError", ["Comment", "-- "]]}, + +{"description":"<!---- --", +"input":"<!---- --", +"output":["ParseError", "ParseError", ["Comment", "-- "]]}, + +{"description":"<!---- -->", +"input":"<!---- -->", +"output":["ParseError", ["Comment", "-- "]]}, + +{"description":"<!---- -->", +"input":"<!---- -->", +"output":["ParseError", ["Comment", "-- "]]}, + +{"description":"<!---- a-->", +"input":"<!---- a-->", +"output":["ParseError", ["Comment", "-- a"]]}, + +{"description":"<!----!", +"input":"<!----!", +"output":["ParseError", "ParseError", ["Comment", ""]]}, + +{"description":"<!----!>", +"input":"<!----!>", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!----!a", +"input":"<!----!a", +"output":["ParseError", "ParseError", ["Comment", "--!a"]]}, + +{"description":"<!----!a-", +"input":"<!----!a-", +"output":["ParseError", "ParseError", ["Comment", "--!a"]]}, + +{"description":"<!----!a--", +"input":"<!----!a--", +"output":["ParseError", "ParseError", ["Comment", "--!a"]]}, + +{"description":"<!----!a-->", +"input":"<!----!a-->", +"output":["ParseError", ["Comment", "--!a"]]}, + +{"description":"<!----!-", +"input":"<!----!-", +"output":["ParseError", "ParseError", ["Comment", "--!"]]}, + +{"description":"<!----!--", +"input":"<!----!--", +"output":["ParseError", "ParseError", ["Comment", "--!"]]}, + +{"description":"<!----!-->", +"input":"<!----!-->", +"output":["ParseError", ["Comment", "--!"]]}, + +{"description":"<!----\"", +"input":"<!----\"", +"output":["ParseError", "ParseError", ["Comment", "--\""]]}, + +{"description":"<!----&", +"input":"<!----&", +"output":["ParseError", "ParseError", ["Comment", "--&"]]}, + +{"description":"<!----'", +"input":"<!----'", +"output":["ParseError", "ParseError", ["Comment", "--'"]]}, + +{"description":"<!----,", +"input":"<!----,", +"output":["ParseError", "ParseError", ["Comment", "--,"]]}, + +{"description":"<!-----", +"input":"<!-----", +"output":["ParseError", "ParseError", ["Comment", "-"]]}, + +{"description":"<!----.", +"input":"<!----.", +"output":["ParseError", "ParseError", ["Comment", "--."]]}, + +{"description":"<!----/", +"input":"<!----/", +"output":["ParseError", "ParseError", ["Comment", "--/"]]}, + +{"description":"<!----0", +"input":"<!----0", +"output":["ParseError", "ParseError", ["Comment", "--0"]]}, + +{"description":"<!----1", +"input":"<!----1", +"output":["ParseError", "ParseError", ["Comment", "--1"]]}, + +{"description":"<!----9", +"input":"<!----9", +"output":["ParseError", "ParseError", ["Comment", "--9"]]}, + +{"description":"<!----<", +"input":"<!----<", +"output":["ParseError", "ParseError", ["Comment", "--<"]]}, + +{"description":"<!----=", +"input":"<!----=", +"output":["ParseError", "ParseError", ["Comment", "--="]]}, + +{"description":"<!---->", +"input":"<!---->", +"output":[["Comment", ""]]}, + +{"description":"<!----?", +"input":"<!----?", +"output":["ParseError", "ParseError", ["Comment", "--?"]]}, + +{"description":"<!----@", +"input":"<!----@", +"output":["ParseError", "ParseError", ["Comment", "--@"]]}, + +{"description":"<!----A", +"input":"<!----A", +"output":["ParseError", "ParseError", ["Comment", "--A"]]}, + +{"description":"<!----B", +"input":"<!----B", +"output":["ParseError", "ParseError", ["Comment", "--B"]]}, + +{"description":"<!----Y", +"input":"<!----Y", +"output":["ParseError", "ParseError", ["Comment", "--Y"]]}, + +{"description":"<!----Z", +"input":"<!----Z", +"output":["ParseError", "ParseError", ["Comment", "--Z"]]}, + +{"description":"<!----`", +"input":"<!----`", +"output":["ParseError", "ParseError", ["Comment", "--`"]]}, + +{"description":"<!----a", +"input":"<!----a", +"output":["ParseError", "ParseError", ["Comment", "--a"]]}, + +{"description":"<!----b", +"input":"<!----b", +"output":["ParseError", "ParseError", ["Comment", "--b"]]}, + +{"description":"<!----y", +"input":"<!----y", +"output":["ParseError", "ParseError", ["Comment", "--y"]]}, + +{"description":"<!----z", +"input":"<!----z", +"output":["ParseError", "ParseError", ["Comment", "--z"]]}, + +{"description":"<!----{", +"input":"<!----{", +"output":["ParseError", "ParseError", ["Comment", "--{"]]}, + +{"description":"<!----\\uDBC0\\uDC00", +"input":"<!----\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["Comment", "--\uDBC0\uDC00"]]}, + +{"description":"<!---.", +"input":"<!---.", +"output":["ParseError", ["Comment", "-."]]}, + +{"description":"<!---/", +"input":"<!---/", +"output":["ParseError", ["Comment", "-/"]]}, + +{"description":"<!---0", +"input":"<!---0", +"output":["ParseError", ["Comment", "-0"]]}, + +{"description":"<!---1", +"input":"<!---1", +"output":["ParseError", ["Comment", "-1"]]}, + +{"description":"<!---9", +"input":"<!---9", +"output":["ParseError", ["Comment", "-9"]]}, + +{"description":"<!---<", +"input":"<!---<", +"output":["ParseError", ["Comment", "-<"]]}, + +{"description":"<!---=", +"input":"<!---=", +"output":["ParseError", ["Comment", "-="]]}, + +{"description":"<!--->", +"input":"<!--->", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!---?", +"input":"<!---?", +"output":["ParseError", ["Comment", "-?"]]}, + +{"description":"<!---@", +"input":"<!---@", +"output":["ParseError", ["Comment", "-@"]]}, + +{"description":"<!---A", +"input":"<!---A", +"output":["ParseError", ["Comment", "-A"]]}, + +{"description":"<!---B", +"input":"<!---B", +"output":["ParseError", ["Comment", "-B"]]}, + +{"description":"<!---Y", +"input":"<!---Y", +"output":["ParseError", ["Comment", "-Y"]]}, + +{"description":"<!---Z", +"input":"<!---Z", +"output":["ParseError", ["Comment", "-Z"]]}, + +{"description":"<!---`", +"input":"<!---`", +"output":["ParseError", ["Comment", "-`"]]}, + +{"description":"<!---a", +"input":"<!---a", +"output":["ParseError", ["Comment", "-a"]]}, + +{"description":"<!---b", +"input":"<!---b", +"output":["ParseError", ["Comment", "-b"]]}, + +{"description":"<!---y", +"input":"<!---y", +"output":["ParseError", ["Comment", "-y"]]}, + +{"description":"<!---z", +"input":"<!---z", +"output":["ParseError", ["Comment", "-z"]]}, + +{"description":"<!---{", +"input":"<!---{", +"output":["ParseError", ["Comment", "-{"]]}, + +{"description":"<!---\\uDBC0\\uDC00", +"input":"<!---\uDBC0\uDC00", +"output":["ParseError", ["Comment", "-\uDBC0\uDC00"]]}, + +{"description":"<!--.", +"input":"<!--.", +"output":["ParseError", ["Comment", "."]]}, + +{"description":"<!--/", +"input":"<!--/", +"output":["ParseError", ["Comment", "/"]]}, + +{"description":"<!--0", +"input":"<!--0", +"output":["ParseError", ["Comment", "0"]]}, + +{"description":"<!--1", +"input":"<!--1", +"output":["ParseError", ["Comment", "1"]]}, + +{"description":"<!--9", +"input":"<!--9", +"output":["ParseError", ["Comment", "9"]]}, + +{"description":"<!--<", +"input":"<!--<", +"output":["ParseError", ["Comment", "<"]]}, + +{"description":"<!--=", +"input":"<!--=", +"output":["ParseError", ["Comment", "="]]}, + +{"description":"<!-->", +"input":"<!-->", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!--?", +"input":"<!--?", +"output":["ParseError", ["Comment", "?"]]}, + +{"description":"<!--@", +"input":"<!--@", +"output":["ParseError", ["Comment", "@"]]}, + +{"description":"<!--A", +"input":"<!--A", +"output":["ParseError", ["Comment", "A"]]}, + +{"description":"<!--B", +"input":"<!--B", +"output":["ParseError", ["Comment", "B"]]}, + +{"description":"<!--Y", +"input":"<!--Y", +"output":["ParseError", ["Comment", "Y"]]}, + +{"description":"<!--Z", +"input":"<!--Z", +"output":["ParseError", ["Comment", "Z"]]}, + +{"description":"<!--`", +"input":"<!--`", +"output":["ParseError", ["Comment", "`"]]}, + +{"description":"<!--a", +"input":"<!--a", +"output":["ParseError", ["Comment", "a"]]}, + +{"description":"<!--b", +"input":"<!--b", +"output":["ParseError", ["Comment", "b"]]}, + +{"description":"<!--y", +"input":"<!--y", +"output":["ParseError", ["Comment", "y"]]}, + +{"description":"<!--z", +"input":"<!--z", +"output":["ParseError", ["Comment", "z"]]}, + +{"description":"<!--{", +"input":"<!--{", +"output":["ParseError", ["Comment", "{"]]}, + +{"description":"<!--\\uDBC0\\uDC00", +"input":"<!--\uDBC0\uDC00", +"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]}, + +{"description":"<!/", +"input":"<!/", +"output":["ParseError", ["Comment", "/"]]}, + +{"description":"<!0", +"input":"<!0", +"output":["ParseError", ["Comment", "0"]]}, + +{"description":"<!1", +"input":"<!1", +"output":["ParseError", ["Comment", "1"]]}, + +{"description":"<!9", +"input":"<!9", +"output":["ParseError", ["Comment", "9"]]}, + +{"description":"<!<", +"input":"<!<", +"output":["ParseError", ["Comment", "<"]]}, + +{"description":"<!=", +"input":"<!=", +"output":["ParseError", ["Comment", "="]]}, + +{"description":"<!>", +"input":"<!>", +"output":["ParseError", ["Comment", ""]]}, + +{"description":"<!?", +"input":"<!?", +"output":["ParseError", ["Comment", "?"]]}, + +{"description":"<!@", +"input":"<!@", +"output":["ParseError", ["Comment", "@"]]}, + +{"description":"<!A", +"input":"<!A", +"output":["ParseError", ["Comment", "A"]]}, + +{"description":"<!B", +"input":"<!B", +"output":["ParseError", ["Comment", "B"]]}, + +{"description":"<!DOCTYPE", +"input":"<!DOCTYPE", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE\\u0000", +"input":"<!DOCTYPE\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\uFFFD", null, null, false]]}, + +{"description":"<!DOCTYPE\\u0008", +"input":"<!DOCTYPE\u0008", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u0008", null, null, false]]}, + +{"description":"<!DOCTYPE\\u0009", +"input":"<!DOCTYPE\u0009", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE\\u000A", +"input":"<!DOCTYPE\u000A", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE\\u000B", +"input":"<!DOCTYPE\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u000B", null, null, false]]}, + +{"description":"<!DOCTYPE\\u000C", +"input":"<!DOCTYPE\u000C", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE\\u000D", +"input":"<!DOCTYPE\u000D", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE\\u001F", +"input":"<!DOCTYPE\u001F", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u001F", null, null, false]]}, + +{"description":"<!DOCTYPE ", +"input":"<!DOCTYPE ", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE \\u0000", +"input":"<!DOCTYPE \u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "\uFFFD", null, null, false]]}, + +{"description":"<!DOCTYPE \\u0008", +"input":"<!DOCTYPE \u0008", +"output":["ParseError", "ParseError", ["DOCTYPE", "\u0008", null, null, false]]}, + +{"description":"<!DOCTYPE \\u0009", +"input":"<!DOCTYPE \u0009", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE \\u000A", +"input":"<!DOCTYPE \u000A", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE \\u000B", +"input":"<!DOCTYPE \u000B", +"output":["ParseError", "ParseError", ["DOCTYPE", "\u000B", null, null, false]]}, + +{"description":"<!DOCTYPE \\u000C", +"input":"<!DOCTYPE \u000C", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE \\u000D", +"input":"<!DOCTYPE \u000D", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE \\u001F", +"input":"<!DOCTYPE \u001F", +"output":["ParseError", "ParseError", ["DOCTYPE", "\u001F", null, null, false]]}, + +{"description":"<!DOCTYPE ", +"input":"<!DOCTYPE ", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE !", +"input":"<!DOCTYPE !", +"output":["ParseError", ["DOCTYPE", "!", null, null, false]]}, + +{"description":"<!DOCTYPE \"", +"input":"<!DOCTYPE \"", +"output":["ParseError", ["DOCTYPE", "\"", null, null, false]]}, + +{"description":"<!DOCTYPE &", +"input":"<!DOCTYPE &", +"output":["ParseError", ["DOCTYPE", "&", null, null, false]]}, + +{"description":"<!DOCTYPE '", +"input":"<!DOCTYPE '", +"output":["ParseError", ["DOCTYPE", "'", null, null, false]]}, + +{"description":"<!DOCTYPE -", +"input":"<!DOCTYPE -", +"output":["ParseError", ["DOCTYPE", "-", null, null, false]]}, + +{"description":"<!DOCTYPE /", +"input":"<!DOCTYPE /", +"output":["ParseError", ["DOCTYPE", "/", null, null, false]]}, + +{"description":"<!DOCTYPE 0", +"input":"<!DOCTYPE 0", +"output":["ParseError", ["DOCTYPE", "0", null, null, false]]}, + +{"description":"<!DOCTYPE 1", +"input":"<!DOCTYPE 1", +"output":["ParseError", ["DOCTYPE", "1", null, null, false]]}, + +{"description":"<!DOCTYPE 9", +"input":"<!DOCTYPE 9", +"output":["ParseError", ["DOCTYPE", "9", null, null, false]]}, + +{"description":"<!DOCTYPE <", +"input":"<!DOCTYPE <", +"output":["ParseError", ["DOCTYPE", "<", null, null, false]]}, + +{"description":"<!DOCTYPE =", +"input":"<!DOCTYPE =", +"output":["ParseError", ["DOCTYPE", "=", null, null, false]]}, + +{"description":"<!DOCTYPE >", +"input":"<!DOCTYPE >", +"output":["ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE ?", +"input":"<!DOCTYPE ?", +"output":["ParseError", ["DOCTYPE", "?", null, null, false]]}, + +{"description":"<!DOCTYPE @", +"input":"<!DOCTYPE @", +"output":["ParseError", ["DOCTYPE", "@", null, null, false]]}, + +{"description":"<!DOCTYPE A", +"input":"<!DOCTYPE A", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE B", +"input":"<!DOCTYPE B", +"output":["ParseError", ["DOCTYPE", "b", null, null, false]]}, + +{"description":"<!DOCTYPE Y", +"input":"<!DOCTYPE Y", +"output":["ParseError", ["DOCTYPE", "y", null, null, false]]}, + +{"description":"<!DOCTYPE Z", +"input":"<!DOCTYPE Z", +"output":["ParseError", ["DOCTYPE", "z", null, null, false]]}, + +{"description":"<!DOCTYPE [", +"input":"<!DOCTYPE [", +"output":["ParseError", ["DOCTYPE", "[", null, null, false]]}, + +{"description":"<!DOCTYPE `", +"input":"<!DOCTYPE `", +"output":["ParseError", ["DOCTYPE", "`", null, null, false]]}, + +{"description":"<!DOCTYPE a", +"input":"<!DOCTYPE a", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u0000", +"input":"<!DOCTYPE a\u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "a\uFFFD", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u0008", +"input":"<!DOCTYPE a\u0008", +"output":["ParseError", "ParseError", ["DOCTYPE", "a\u0008", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u0009", +"input":"<!DOCTYPE a\u0009", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u000A", +"input":"<!DOCTYPE a\u000A", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u000B", +"input":"<!DOCTYPE a\u000B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a\u000B", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u000C", +"input":"<!DOCTYPE a\u000C", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u000D", +"input":"<!DOCTYPE a\u000D", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a\\u001F", +"input":"<!DOCTYPE a\u001F", +"output":["ParseError", "ParseError", ["DOCTYPE", "a\u001F", null, null, false]]}, + +{"description":"<!DOCTYPE a ", +"input":"<!DOCTYPE a ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u0000", +"input":"<!DOCTYPE a \u0000", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u0008", +"input":"<!DOCTYPE a \u0008", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u0009", +"input":"<!DOCTYPE a \u0009", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u000A", +"input":"<!DOCTYPE a \u000A", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u000B", +"input":"<!DOCTYPE a \u000B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u000C", +"input":"<!DOCTYPE a \u000C", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u000D", +"input":"<!DOCTYPE a \u000D", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\u001F", +"input":"<!DOCTYPE a \u001F", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a ", +"input":"<!DOCTYPE a ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a !", +"input":"<!DOCTYPE a !", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \"", +"input":"<!DOCTYPE a \"", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a &", +"input":"<!DOCTYPE a &", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a '", +"input":"<!DOCTYPE a '", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a -", +"input":"<!DOCTYPE a -", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a /", +"input":"<!DOCTYPE a /", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a 0", +"input":"<!DOCTYPE a 0", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a 1", +"input":"<!DOCTYPE a 1", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a 9", +"input":"<!DOCTYPE a 9", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a <", +"input":"<!DOCTYPE a <", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a =", +"input":"<!DOCTYPE a =", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a >", +"input":"<!DOCTYPE a >", +"output":[["DOCTYPE", "a", null, null, true]]}, + +{"description":"<!DOCTYPE a ?", +"input":"<!DOCTYPE a ?", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a @", +"input":"<!DOCTYPE a @", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a A", +"input":"<!DOCTYPE a A", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a B", +"input":"<!DOCTYPE a B", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC", +"input":"<!DOCTYPE a PUBLIC", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u0000", +"input":"<!DOCTYPE a PUBLIC\u0000", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u0008", +"input":"<!DOCTYPE a PUBLIC\u0008", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u0009", +"input":"<!DOCTYPE a PUBLIC\u0009", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u000A", +"input":"<!DOCTYPE a PUBLIC\u000A", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u000B", +"input":"<!DOCTYPE a PUBLIC\u000B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u000C", +"input":"<!DOCTYPE a PUBLIC\u000C", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u000D", +"input":"<!DOCTYPE a PUBLIC\u000D", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\u001F", +"input":"<!DOCTYPE a PUBLIC\u001F", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC ", +"input":"<!DOCTYPE a PUBLIC ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC!", +"input":"<!DOCTYPE a PUBLIC!", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"", +"input":"<!DOCTYPE a PUBLIC\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"\\u0000", +"input":"<!DOCTYPE a PUBLIC\"\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"\\u0009", +"input":"<!DOCTYPE a PUBLIC\"\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"\\u000A", +"input":"<!DOCTYPE a PUBLIC\"\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"\\u000B", +"input":"<!DOCTYPE a PUBLIC\"\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"\\u000C", +"input":"<!DOCTYPE a PUBLIC\"\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\" ", +"input":"<!DOCTYPE a PUBLIC\" ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"!", +"input":"<!DOCTYPE a PUBLIC\"!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"\"", +"input":"<!DOCTYPE a PUBLIC\"\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"#", +"input":"<!DOCTYPE a PUBLIC\"#", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "#", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"&", +"input":"<!DOCTYPE a PUBLIC\"&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"'", +"input":"<!DOCTYPE a PUBLIC\"'", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "'", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"-", +"input":"<!DOCTYPE a PUBLIC\"-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"/", +"input":"<!DOCTYPE a PUBLIC\"/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"0", +"input":"<!DOCTYPE a PUBLIC\"0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"1", +"input":"<!DOCTYPE a PUBLIC\"1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"9", +"input":"<!DOCTYPE a PUBLIC\"9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"<", +"input":"<!DOCTYPE a PUBLIC\"<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"=", +"input":"<!DOCTYPE a PUBLIC\"=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\">", +"input":"<!DOCTYPE a PUBLIC\">", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"?", +"input":"<!DOCTYPE a PUBLIC\"?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"@", +"input":"<!DOCTYPE a PUBLIC\"@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"A", +"input":"<!DOCTYPE a PUBLIC\"A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"B", +"input":"<!DOCTYPE a PUBLIC\"B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"Y", +"input":"<!DOCTYPE a PUBLIC\"Y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"Z", +"input":"<!DOCTYPE a PUBLIC\"Z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"`", +"input":"<!DOCTYPE a PUBLIC\"`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"a", +"input":"<!DOCTYPE a PUBLIC\"a", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"b", +"input":"<!DOCTYPE a PUBLIC\"b", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"y", +"input":"<!DOCTYPE a PUBLIC\"y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"z", +"input":"<!DOCTYPE a PUBLIC\"z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"{", +"input":"<!DOCTYPE a PUBLIC\"{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\"\\uDBC0\\uDC00", +"input":"<!DOCTYPE a PUBLIC\"\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC#", +"input":"<!DOCTYPE a PUBLIC#", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC&", +"input":"<!DOCTYPE a PUBLIC&", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'", +"input":"<!DOCTYPE a PUBLIC'", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'\\u0000", +"input":"<!DOCTYPE a PUBLIC'\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'\\u0009", +"input":"<!DOCTYPE a PUBLIC'\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'\\u000A", +"input":"<!DOCTYPE a PUBLIC'\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'\\u000B", +"input":"<!DOCTYPE a PUBLIC'\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'\\u000C", +"input":"<!DOCTYPE a PUBLIC'\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC' ", +"input":"<!DOCTYPE a PUBLIC' ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'!", +"input":"<!DOCTYPE a PUBLIC'!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'\"", +"input":"<!DOCTYPE a PUBLIC'\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\"", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'&", +"input":"<!DOCTYPE a PUBLIC'&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''", +"input":"<!DOCTYPE a PUBLIC''", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u0000", +"input":"<!DOCTYPE a PUBLIC''\u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u0008", +"input":"<!DOCTYPE a PUBLIC''\u0008", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u0009", +"input":"<!DOCTYPE a PUBLIC''\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u000A", +"input":"<!DOCTYPE a PUBLIC''\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u000B", +"input":"<!DOCTYPE a PUBLIC''\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u000C", +"input":"<!DOCTYPE a PUBLIC''\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u000D", +"input":"<!DOCTYPE a PUBLIC''\u000D", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\u001F", +"input":"<!DOCTYPE a PUBLIC''\u001F", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'' ", +"input":"<!DOCTYPE a PUBLIC'' ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''!", +"input":"<!DOCTYPE a PUBLIC''!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\"", +"input":"<!DOCTYPE a PUBLIC''\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]}, + +{"description":"<!DOCTYPE a PUBLIC''#", +"input":"<!DOCTYPE a PUBLIC''#", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''&", +"input":"<!DOCTYPE a PUBLIC''&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'''", +"input":"<!DOCTYPE a PUBLIC'''", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]}, + +{"description":"<!DOCTYPE a PUBLIC''(", +"input":"<!DOCTYPE a PUBLIC''(", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''-", +"input":"<!DOCTYPE a PUBLIC''-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''/", +"input":"<!DOCTYPE a PUBLIC''/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''0", +"input":"<!DOCTYPE a PUBLIC''0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''1", +"input":"<!DOCTYPE a PUBLIC''1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''9", +"input":"<!DOCTYPE a PUBLIC''9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''<", +"input":"<!DOCTYPE a PUBLIC''<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''=", +"input":"<!DOCTYPE a PUBLIC''=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''>", +"input":"<!DOCTYPE a PUBLIC''>", +"output":["ParseError", ["DOCTYPE", "a", "", null, true]]}, + +{"description":"<!DOCTYPE a PUBLIC''?", +"input":"<!DOCTYPE a PUBLIC''?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''@", +"input":"<!DOCTYPE a PUBLIC''@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''A", +"input":"<!DOCTYPE a PUBLIC''A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''B", +"input":"<!DOCTYPE a PUBLIC''B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''Y", +"input":"<!DOCTYPE a PUBLIC''Y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''Z", +"input":"<!DOCTYPE a PUBLIC''Z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''`", +"input":"<!DOCTYPE a PUBLIC''`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''a", +"input":"<!DOCTYPE a PUBLIC''a", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''b", +"input":"<!DOCTYPE a PUBLIC''b", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''y", +"input":"<!DOCTYPE a PUBLIC''y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''z", +"input":"<!DOCTYPE a PUBLIC''z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''{", +"input":"<!DOCTYPE a PUBLIC''{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC''\\uDBC0\\uDC00", +"input":"<!DOCTYPE a PUBLIC''\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'(", +"input":"<!DOCTYPE a PUBLIC'(", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "(", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'-", +"input":"<!DOCTYPE a PUBLIC'-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'/", +"input":"<!DOCTYPE a PUBLIC'/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'0", +"input":"<!DOCTYPE a PUBLIC'0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'1", +"input":"<!DOCTYPE a PUBLIC'1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'9", +"input":"<!DOCTYPE a PUBLIC'9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'<", +"input":"<!DOCTYPE a PUBLIC'<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'=", +"input":"<!DOCTYPE a PUBLIC'=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'>", +"input":"<!DOCTYPE a PUBLIC'>", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'?", +"input":"<!DOCTYPE a PUBLIC'?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'@", +"input":"<!DOCTYPE a PUBLIC'@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'A", +"input":"<!DOCTYPE a PUBLIC'A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'B", +"input":"<!DOCTYPE a PUBLIC'B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'Y", +"input":"<!DOCTYPE a PUBLIC'Y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'Z", +"input":"<!DOCTYPE a PUBLIC'Z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'`", +"input":"<!DOCTYPE a PUBLIC'`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'a", +"input":"<!DOCTYPE a PUBLIC'a", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'b", +"input":"<!DOCTYPE a PUBLIC'b", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'y", +"input":"<!DOCTYPE a PUBLIC'y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'z", +"input":"<!DOCTYPE a PUBLIC'z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'{", +"input":"<!DOCTYPE a PUBLIC'{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC'\\uDBC0\\uDC00", +"input":"<!DOCTYPE a PUBLIC'\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC(", +"input":"<!DOCTYPE a PUBLIC(", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC-", +"input":"<!DOCTYPE a PUBLIC-", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC/", +"input":"<!DOCTYPE a PUBLIC/", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC0", +"input":"<!DOCTYPE a PUBLIC0", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC1", +"input":"<!DOCTYPE a PUBLIC1", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC9", +"input":"<!DOCTYPE a PUBLIC9", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC<", +"input":"<!DOCTYPE a PUBLIC<", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC=", +"input":"<!DOCTYPE a PUBLIC=", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC>", +"input":"<!DOCTYPE a PUBLIC>", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC?", +"input":"<!DOCTYPE a PUBLIC?", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC@", +"input":"<!DOCTYPE a PUBLIC@", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICA", +"input":"<!DOCTYPE a PUBLICA", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICB", +"input":"<!DOCTYPE a PUBLICB", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICY", +"input":"<!DOCTYPE a PUBLICY", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICZ", +"input":"<!DOCTYPE a PUBLICZ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC`", +"input":"<!DOCTYPE a PUBLIC`", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICa", +"input":"<!DOCTYPE a PUBLICa", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICb", +"input":"<!DOCTYPE a PUBLICb", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICy", +"input":"<!DOCTYPE a PUBLICy", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLICz", +"input":"<!DOCTYPE a PUBLICz", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC{", +"input":"<!DOCTYPE a PUBLIC{", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a PUBLIC\\uDBC0\\uDC00", +"input":"<!DOCTYPE a PUBLIC\uDBC0\uDC00", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM", +"input":"<!DOCTYPE a SYSTEM", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u0000", +"input":"<!DOCTYPE a SYSTEM\u0000", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u0008", +"input":"<!DOCTYPE a SYSTEM\u0008", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u0009", +"input":"<!DOCTYPE a SYSTEM\u0009", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u000A", +"input":"<!DOCTYPE a SYSTEM\u000A", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u000B", +"input":"<!DOCTYPE a SYSTEM\u000B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u000C", +"input":"<!DOCTYPE a SYSTEM\u000C", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u000D", +"input":"<!DOCTYPE a SYSTEM\u000D", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\u001F", +"input":"<!DOCTYPE a SYSTEM\u001F", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM ", +"input":"<!DOCTYPE a SYSTEM ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM!", +"input":"<!DOCTYPE a SYSTEM!", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"", +"input":"<!DOCTYPE a SYSTEM\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"\\u0000", +"input":"<!DOCTYPE a SYSTEM\"\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"\\u0009", +"input":"<!DOCTYPE a SYSTEM\"\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"\\u000A", +"input":"<!DOCTYPE a SYSTEM\"\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"\\u000B", +"input":"<!DOCTYPE a SYSTEM\"\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"\\u000C", +"input":"<!DOCTYPE a SYSTEM\"\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\" ", +"input":"<!DOCTYPE a SYSTEM\" ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"!", +"input":"<!DOCTYPE a SYSTEM\"!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"\"", +"input":"<!DOCTYPE a SYSTEM\"\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"#", +"input":"<!DOCTYPE a SYSTEM\"#", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "#", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"&", +"input":"<!DOCTYPE a SYSTEM\"&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"'", +"input":"<!DOCTYPE a SYSTEM\"'", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "'", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"-", +"input":"<!DOCTYPE a SYSTEM\"-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"/", +"input":"<!DOCTYPE a SYSTEM\"/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"0", +"input":"<!DOCTYPE a SYSTEM\"0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"1", +"input":"<!DOCTYPE a SYSTEM\"1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"9", +"input":"<!DOCTYPE a SYSTEM\"9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"<", +"input":"<!DOCTYPE a SYSTEM\"<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"=", +"input":"<!DOCTYPE a SYSTEM\"=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\">", +"input":"<!DOCTYPE a SYSTEM\">", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"?", +"input":"<!DOCTYPE a SYSTEM\"?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"@", +"input":"<!DOCTYPE a SYSTEM\"@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"A", +"input":"<!DOCTYPE a SYSTEM\"A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"B", +"input":"<!DOCTYPE a SYSTEM\"B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"Y", +"input":"<!DOCTYPE a SYSTEM\"Y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"Z", +"input":"<!DOCTYPE a SYSTEM\"Z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"`", +"input":"<!DOCTYPE a SYSTEM\"`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"a", +"input":"<!DOCTYPE a SYSTEM\"a", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"b", +"input":"<!DOCTYPE a SYSTEM\"b", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"y", +"input":"<!DOCTYPE a SYSTEM\"y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"z", +"input":"<!DOCTYPE a SYSTEM\"z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"{", +"input":"<!DOCTYPE a SYSTEM\"{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]}, + +{"description":"<!DOCTYPE a SYSTEM\"\\uDBC0\\uDC00", +"input":"<!DOCTYPE a SYSTEM\"\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]}, + +{"description":"<!DOCTYPE a SYSTEM#", +"input":"<!DOCTYPE a SYSTEM#", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM&", +"input":"<!DOCTYPE a SYSTEM&", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM'", +"input":"<!DOCTYPE a SYSTEM'", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'\\u0000", +"input":"<!DOCTYPE a SYSTEM'\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'\\u0009", +"input":"<!DOCTYPE a SYSTEM'\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'\\u000A", +"input":"<!DOCTYPE a SYSTEM'\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'\\u000B", +"input":"<!DOCTYPE a SYSTEM'\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'\\u000C", +"input":"<!DOCTYPE a SYSTEM'\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]}, + +{"description":"<!DOCTYPE a SYSTEM' ", +"input":"<!DOCTYPE a SYSTEM' ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'!", +"input":"<!DOCTYPE a SYSTEM'!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'\"", +"input":"<!DOCTYPE a SYSTEM'\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\"", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'&", +"input":"<!DOCTYPE a SYSTEM'&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]}, + +{"description":"<!DOCTYPE a SYSTEM''", +"input":"<!DOCTYPE a SYSTEM''", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u0000", +"input":"<!DOCTYPE a SYSTEM''\u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u0008", +"input":"<!DOCTYPE a SYSTEM''\u0008", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u0009", +"input":"<!DOCTYPE a SYSTEM''\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u000A", +"input":"<!DOCTYPE a SYSTEM''\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u000B", +"input":"<!DOCTYPE a SYSTEM''\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u000C", +"input":"<!DOCTYPE a SYSTEM''\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u000D", +"input":"<!DOCTYPE a SYSTEM''\u000D", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\u001F", +"input":"<!DOCTYPE a SYSTEM''\u001F", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM'' ", +"input":"<!DOCTYPE a SYSTEM'' ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM''!", +"input":"<!DOCTYPE a SYSTEM''!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''\"", +"input":"<!DOCTYPE a SYSTEM''\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''&", +"input":"<!DOCTYPE a SYSTEM''&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM'''", +"input":"<!DOCTYPE a SYSTEM'''", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''-", +"input":"<!DOCTYPE a SYSTEM''-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''/", +"input":"<!DOCTYPE a SYSTEM''/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''0", +"input":"<!DOCTYPE a SYSTEM''0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''1", +"input":"<!DOCTYPE a SYSTEM''1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''9", +"input":"<!DOCTYPE a SYSTEM''9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''<", +"input":"<!DOCTYPE a SYSTEM''<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''=", +"input":"<!DOCTYPE a SYSTEM''=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''>", +"input":"<!DOCTYPE a SYSTEM''>", +"output":["ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''?", +"input":"<!DOCTYPE a SYSTEM''?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''@", +"input":"<!DOCTYPE a SYSTEM''@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''A", +"input":"<!DOCTYPE a SYSTEM''A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''B", +"input":"<!DOCTYPE a SYSTEM''B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''Y", +"input":"<!DOCTYPE a SYSTEM''Y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''Z", +"input":"<!DOCTYPE a SYSTEM''Z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''`", +"input":"<!DOCTYPE a SYSTEM''`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''a", +"input":"<!DOCTYPE a SYSTEM''a", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''b", +"input":"<!DOCTYPE a SYSTEM''b", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''y", +"input":"<!DOCTYPE a SYSTEM''y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''z", +"input":"<!DOCTYPE a SYSTEM''z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''{", +"input":"<!DOCTYPE a SYSTEM''{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM''\\uDBC0\\uDC00", +"input":"<!DOCTYPE a SYSTEM''\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPE a SYSTEM'(", +"input":"<!DOCTYPE a SYSTEM'(", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "(", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'-", +"input":"<!DOCTYPE a SYSTEM'-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'/", +"input":"<!DOCTYPE a SYSTEM'/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'0", +"input":"<!DOCTYPE a SYSTEM'0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'1", +"input":"<!DOCTYPE a SYSTEM'1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'9", +"input":"<!DOCTYPE a SYSTEM'9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'<", +"input":"<!DOCTYPE a SYSTEM'<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'=", +"input":"<!DOCTYPE a SYSTEM'=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'>", +"input":"<!DOCTYPE a SYSTEM'>", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'?", +"input":"<!DOCTYPE a SYSTEM'?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'@", +"input":"<!DOCTYPE a SYSTEM'@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'A", +"input":"<!DOCTYPE a SYSTEM'A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'B", +"input":"<!DOCTYPE a SYSTEM'B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'Y", +"input":"<!DOCTYPE a SYSTEM'Y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'Z", +"input":"<!DOCTYPE a SYSTEM'Z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'`", +"input":"<!DOCTYPE a SYSTEM'`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'a", +"input":"<!DOCTYPE a SYSTEM'a", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'b", +"input":"<!DOCTYPE a SYSTEM'b", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'y", +"input":"<!DOCTYPE a SYSTEM'y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'z", +"input":"<!DOCTYPE a SYSTEM'z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'{", +"input":"<!DOCTYPE a SYSTEM'{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]}, + +{"description":"<!DOCTYPE a SYSTEM'\\uDBC0\\uDC00", +"input":"<!DOCTYPE a SYSTEM'\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]}, + +{"description":"<!DOCTYPE a SYSTEM(", +"input":"<!DOCTYPE a SYSTEM(", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM-", +"input":"<!DOCTYPE a SYSTEM-", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM/", +"input":"<!DOCTYPE a SYSTEM/", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM0", +"input":"<!DOCTYPE a SYSTEM0", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM1", +"input":"<!DOCTYPE a SYSTEM1", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM9", +"input":"<!DOCTYPE a SYSTEM9", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM<", +"input":"<!DOCTYPE a SYSTEM<", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM=", +"input":"<!DOCTYPE a SYSTEM=", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM>", +"input":"<!DOCTYPE a SYSTEM>", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM?", +"input":"<!DOCTYPE a SYSTEM?", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM@", +"input":"<!DOCTYPE a SYSTEM@", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMA", +"input":"<!DOCTYPE a SYSTEMA", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMB", +"input":"<!DOCTYPE a SYSTEMB", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMY", +"input":"<!DOCTYPE a SYSTEMY", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMZ", +"input":"<!DOCTYPE a SYSTEMZ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM`", +"input":"<!DOCTYPE a SYSTEM`", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMa", +"input":"<!DOCTYPE a SYSTEMa", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMb", +"input":"<!DOCTYPE a SYSTEMb", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMy", +"input":"<!DOCTYPE a SYSTEMy", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEMz", +"input":"<!DOCTYPE a SYSTEMz", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM{", +"input":"<!DOCTYPE a SYSTEM{", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a SYSTEM\\uDBC0\\uDC00", +"input":"<!DOCTYPE a SYSTEM\uDBC0\uDC00", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a Y", +"input":"<!DOCTYPE a Y", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a Z", +"input":"<!DOCTYPE a Z", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a `", +"input":"<!DOCTYPE a `", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a", +"input":"<!DOCTYPE a a", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a\\u0000", +"input":"<!DOCTYPE a a\u0000", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a\\u0009", +"input":"<!DOCTYPE a a\u0009", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a\\u000A", +"input":"<!DOCTYPE a a\u000A", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a\\u000B", +"input":"<!DOCTYPE a a\u000B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a\\u000C", +"input":"<!DOCTYPE a a\u000C", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a ", +"input":"<!DOCTYPE a a ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a!", +"input":"<!DOCTYPE a a!", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a\"", +"input":"<!DOCTYPE a a\"", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a&", +"input":"<!DOCTYPE a a&", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a'", +"input":"<!DOCTYPE a a'", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a-", +"input":"<!DOCTYPE a a-", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a/", +"input":"<!DOCTYPE a a/", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a0", +"input":"<!DOCTYPE a a0", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a1", +"input":"<!DOCTYPE a a1", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a9", +"input":"<!DOCTYPE a a9", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a<", +"input":"<!DOCTYPE a a<", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a=", +"input":"<!DOCTYPE a a=", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a>", +"input":"<!DOCTYPE a a>", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a?", +"input":"<!DOCTYPE a a?", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a@", +"input":"<!DOCTYPE a a@", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a aA", +"input":"<!DOCTYPE a aA", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a aB", +"input":"<!DOCTYPE a aB", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a aY", +"input":"<!DOCTYPE a aY", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a aZ", +"input":"<!DOCTYPE a aZ", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a`", +"input":"<!DOCTYPE a a`", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a aa", +"input":"<!DOCTYPE a aa", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a ab", +"input":"<!DOCTYPE a ab", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a ay", +"input":"<!DOCTYPE a ay", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a az", +"input":"<!DOCTYPE a az", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a{", +"input":"<!DOCTYPE a a{", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a a\\uDBC0\\uDC00", +"input":"<!DOCTYPE a a\uDBC0\uDC00", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a b", +"input":"<!DOCTYPE a b", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a y", +"input":"<!DOCTYPE a y", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a z", +"input":"<!DOCTYPE a z", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a {", +"input":"<!DOCTYPE a {", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a \\uDBC0\\uDC00", +"input":"<!DOCTYPE a \uDBC0\uDC00", +"output":["ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPE a!", +"input":"<!DOCTYPE a!", +"output":["ParseError", ["DOCTYPE", "a!", null, null, false]]}, + +{"description":"<!DOCTYPE a\"", +"input":"<!DOCTYPE a\"", +"output":["ParseError", ["DOCTYPE", "a\"", null, null, false]]}, + +{"description":"<!DOCTYPE a&", +"input":"<!DOCTYPE a&", +"output":["ParseError", ["DOCTYPE", "a&", null, null, false]]}, + +{"description":"<!DOCTYPE a'", +"input":"<!DOCTYPE a'", +"output":["ParseError", ["DOCTYPE", "a'", null, null, false]]}, + +{"description":"<!DOCTYPE a-", +"input":"<!DOCTYPE a-", +"output":["ParseError", ["DOCTYPE", "a-", null, null, false]]}, + +{"description":"<!DOCTYPE a/", +"input":"<!DOCTYPE a/", +"output":["ParseError", ["DOCTYPE", "a/", null, null, false]]}, + +{"description":"<!DOCTYPE a0", +"input":"<!DOCTYPE a0", +"output":["ParseError", ["DOCTYPE", "a0", null, null, false]]}, + +{"description":"<!DOCTYPE a1", +"input":"<!DOCTYPE a1", +"output":["ParseError", ["DOCTYPE", "a1", null, null, false]]}, + +{"description":"<!DOCTYPE a9", +"input":"<!DOCTYPE a9", +"output":["ParseError", ["DOCTYPE", "a9", null, null, false]]}, + +{"description":"<!DOCTYPE a<", +"input":"<!DOCTYPE a<", +"output":["ParseError", ["DOCTYPE", "a<", null, null, false]]}, + +{"description":"<!DOCTYPE a=", +"input":"<!DOCTYPE a=", +"output":["ParseError", ["DOCTYPE", "a=", null, null, false]]}, + +{"description":"<!DOCTYPE a>", +"input":"<!DOCTYPE a>", +"output":[["DOCTYPE", "a", null, null, true]]}, + +{"description":"<!DOCTYPE a?", +"input":"<!DOCTYPE a?", +"output":["ParseError", ["DOCTYPE", "a?", null, null, false]]}, + +{"description":"<!DOCTYPE a@", +"input":"<!DOCTYPE a@", +"output":["ParseError", ["DOCTYPE", "a@", null, null, false]]}, + +{"description":"<!DOCTYPE aA", +"input":"<!DOCTYPE aA", +"output":["ParseError", ["DOCTYPE", "aa", null, null, false]]}, + +{"description":"<!DOCTYPE aB", +"input":"<!DOCTYPE aB", +"output":["ParseError", ["DOCTYPE", "ab", null, null, false]]}, + +{"description":"<!DOCTYPE aY", +"input":"<!DOCTYPE aY", +"output":["ParseError", ["DOCTYPE", "ay", null, null, false]]}, + +{"description":"<!DOCTYPE aZ", +"input":"<!DOCTYPE aZ", +"output":["ParseError", ["DOCTYPE", "az", null, null, false]]}, + +{"description":"<!DOCTYPE a[", +"input":"<!DOCTYPE a[", +"output":["ParseError", ["DOCTYPE", "a[", null, null, false]]}, + +{"description":"<!DOCTYPE a`", +"input":"<!DOCTYPE a`", +"output":["ParseError", ["DOCTYPE", "a`", null, null, false]]}, + +{"description":"<!DOCTYPE aa", +"input":"<!DOCTYPE aa", +"output":["ParseError", ["DOCTYPE", "aa", null, null, false]]}, + +{"description":"<!DOCTYPE ab", +"input":"<!DOCTYPE ab", +"output":["ParseError", ["DOCTYPE", "ab", null, null, false]]}, + +{"description":"<!DOCTYPE ay", +"input":"<!DOCTYPE ay", +"output":["ParseError", ["DOCTYPE", "ay", null, null, false]]}, + +{"description":"<!DOCTYPE az", +"input":"<!DOCTYPE az", +"output":["ParseError", ["DOCTYPE", "az", null, null, false]]}, + +{"description":"<!DOCTYPE a{", +"input":"<!DOCTYPE a{", +"output":["ParseError", ["DOCTYPE", "a{", null, null, false]]}, + +{"description":"<!DOCTYPE a\\uDBC0\\uDC00", +"input":"<!DOCTYPE a\uDBC0\uDC00", +"output":["ParseError", ["DOCTYPE", "a\uDBC0\uDC00", null, null, false]]}, + +{"description":"<!DOCTYPE b", +"input":"<!DOCTYPE b", +"output":["ParseError", ["DOCTYPE", "b", null, null, false]]}, + +{"description":"<!DOCTYPE y", +"input":"<!DOCTYPE y", +"output":["ParseError", ["DOCTYPE", "y", null, null, false]]}, + +{"description":"<!DOCTYPE z", +"input":"<!DOCTYPE z", +"output":["ParseError", ["DOCTYPE", "z", null, null, false]]}, + +{"description":"<!DOCTYPE {", +"input":"<!DOCTYPE {", +"output":["ParseError", ["DOCTYPE", "{", null, null, false]]}, + +{"description":"<!DOCTYPE \\uDBC0\\uDC00", +"input":"<!DOCTYPE \uDBC0\uDC00", +"output":["ParseError", ["DOCTYPE", "\uDBC0\uDC00", null, null, false]]}, + +{"description":"<!DOCTYPE!", +"input":"<!DOCTYPE!", +"output":["ParseError", "ParseError", ["DOCTYPE", "!", null, null, false]]}, + +{"description":"<!DOCTYPE\"", +"input":"<!DOCTYPE\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "\"", null, null, false]]}, + +{"description":"<!DOCTYPE&", +"input":"<!DOCTYPE&", +"output":["ParseError", "ParseError", ["DOCTYPE", "&", null, null, false]]}, + +{"description":"<!DOCTYPE'", +"input":"<!DOCTYPE'", +"output":["ParseError", "ParseError", ["DOCTYPE", "'", null, null, false]]}, + +{"description":"<!DOCTYPE-", +"input":"<!DOCTYPE-", +"output":["ParseError", "ParseError", ["DOCTYPE", "-", null, null, false]]}, + +{"description":"<!DOCTYPE/", +"input":"<!DOCTYPE/", +"output":["ParseError", "ParseError", ["DOCTYPE", "/", null, null, false]]}, + +{"description":"<!DOCTYPE0", +"input":"<!DOCTYPE0", +"output":["ParseError", "ParseError", ["DOCTYPE", "0", null, null, false]]}, + +{"description":"<!DOCTYPE1", +"input":"<!DOCTYPE1", +"output":["ParseError", "ParseError", ["DOCTYPE", "1", null, null, false]]}, + +{"description":"<!DOCTYPE9", +"input":"<!DOCTYPE9", +"output":["ParseError", "ParseError", ["DOCTYPE", "9", null, null, false]]}, + +{"description":"<!DOCTYPE<", +"input":"<!DOCTYPE<", +"output":["ParseError", "ParseError", ["DOCTYPE", "<", null, null, false]]}, + +{"description":"<!DOCTYPE=", +"input":"<!DOCTYPE=", +"output":["ParseError", "ParseError", ["DOCTYPE", "=", null, null, false]]}, + +{"description":"<!DOCTYPE>", +"input":"<!DOCTYPE>", +"output":["ParseError", "ParseError", ["DOCTYPE", null, null, null, false]]}, + +{"description":"<!DOCTYPE?", +"input":"<!DOCTYPE?", +"output":["ParseError", "ParseError", ["DOCTYPE", "?", null, null, false]]}, + +{"description":"<!DOCTYPE@", +"input":"<!DOCTYPE@", +"output":["ParseError", "ParseError", ["DOCTYPE", "@", null, null, false]]}, + +{"description":"<!DOCTYPEA", +"input":"<!DOCTYPEA", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEB", +"input":"<!DOCTYPEB", +"output":["ParseError", "ParseError", ["DOCTYPE", "b", null, null, false]]}, + +{"description":"<!DOCTYPEY", +"input":"<!DOCTYPEY", +"output":["ParseError", "ParseError", ["DOCTYPE", "y", null, null, false]]}, + +{"description":"<!DOCTYPEZ", +"input":"<!DOCTYPEZ", +"output":["ParseError", "ParseError", ["DOCTYPE", "z", null, null, false]]}, + +{"description":"<!DOCTYPE`", +"input":"<!DOCTYPE`", +"output":["ParseError", "ParseError", ["DOCTYPE", "`", null, null, false]]}, + +{"description":"<!DOCTYPEa", +"input":"<!DOCTYPEa", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u0000", +"input":"<!DOCTYPEa\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\uFFFD", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u0008", +"input":"<!DOCTYPEa\u0008", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u0008", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u0009", +"input":"<!DOCTYPEa\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u000A", +"input":"<!DOCTYPEa\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u000B", +"input":"<!DOCTYPEa\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u000B", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u000C", +"input":"<!DOCTYPEa\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u000D", +"input":"<!DOCTYPEa\u000D", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa\\u001F", +"input":"<!DOCTYPEa\u001F", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u001F", null, null, false]]}, + +{"description":"<!DOCTYPEa ", +"input":"<!DOCTYPEa ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u0000", +"input":"<!DOCTYPEa \u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u0008", +"input":"<!DOCTYPEa \u0008", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u0009", +"input":"<!DOCTYPEa \u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u000A", +"input":"<!DOCTYPEa \u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u000B", +"input":"<!DOCTYPEa \u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u000C", +"input":"<!DOCTYPEa \u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u000D", +"input":"<!DOCTYPEa \u000D", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\u001F", +"input":"<!DOCTYPEa \u001F", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa ", +"input":"<!DOCTYPEa ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa !", +"input":"<!DOCTYPEa !", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \"", +"input":"<!DOCTYPEa \"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa &", +"input":"<!DOCTYPEa &", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa '", +"input":"<!DOCTYPEa '", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa -", +"input":"<!DOCTYPEa -", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa /", +"input":"<!DOCTYPEa /", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa 0", +"input":"<!DOCTYPEa 0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa 1", +"input":"<!DOCTYPEa 1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa 9", +"input":"<!DOCTYPEa 9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa <", +"input":"<!DOCTYPEa <", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa =", +"input":"<!DOCTYPEa =", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa >", +"input":"<!DOCTYPEa >", +"output":["ParseError", ["DOCTYPE", "a", null, null, true]]}, + +{"description":"<!DOCTYPEa ?", +"input":"<!DOCTYPEa ?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa @", +"input":"<!DOCTYPEa @", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa A", +"input":"<!DOCTYPEa A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa B", +"input":"<!DOCTYPEa B", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC", +"input":"<!DOCTYPEa PUBLIC", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u0000", +"input":"<!DOCTYPEa PUBLIC\u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u0008", +"input":"<!DOCTYPEa PUBLIC\u0008", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u0009", +"input":"<!DOCTYPEa PUBLIC\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u000A", +"input":"<!DOCTYPEa PUBLIC\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u000B", +"input":"<!DOCTYPEa PUBLIC\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u000C", +"input":"<!DOCTYPEa PUBLIC\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u000D", +"input":"<!DOCTYPEa PUBLIC\u000D", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\u001F", +"input":"<!DOCTYPEa PUBLIC\u001F", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC ", +"input":"<!DOCTYPEa PUBLIC ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC!", +"input":"<!DOCTYPEa PUBLIC!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"", +"input":"<!DOCTYPEa PUBLIC\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"\\u0000", +"input":"<!DOCTYPEa PUBLIC\"\u0000", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"\\u0009", +"input":"<!DOCTYPEa PUBLIC\"\u0009", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"\\u000A", +"input":"<!DOCTYPEa PUBLIC\"\u000A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"\\u000B", +"input":"<!DOCTYPEa PUBLIC\"\u000B", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"\\u000C", +"input":"<!DOCTYPEa PUBLIC\"\u000C", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\" ", +"input":"<!DOCTYPEa PUBLIC\" ", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"!", +"input":"<!DOCTYPEa PUBLIC\"!", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"\"", +"input":"<!DOCTYPEa PUBLIC\"\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"#", +"input":"<!DOCTYPEa PUBLIC\"#", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "#", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"&", +"input":"<!DOCTYPEa PUBLIC\"&", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"'", +"input":"<!DOCTYPEa PUBLIC\"'", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "'", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"-", +"input":"<!DOCTYPEa PUBLIC\"-", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"/", +"input":"<!DOCTYPEa PUBLIC\"/", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"0", +"input":"<!DOCTYPEa PUBLIC\"0", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"1", +"input":"<!DOCTYPEa PUBLIC\"1", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"9", +"input":"<!DOCTYPEa PUBLIC\"9", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"<", +"input":"<!DOCTYPEa PUBLIC\"<", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"=", +"input":"<!DOCTYPEa PUBLIC\"=", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\">", +"input":"<!DOCTYPEa PUBLIC\">", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"?", +"input":"<!DOCTYPEa PUBLIC\"?", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"@", +"input":"<!DOCTYPEa PUBLIC\"@", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"A", +"input":"<!DOCTYPEa PUBLIC\"A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"B", +"input":"<!DOCTYPEa PUBLIC\"B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"Y", +"input":"<!DOCTYPEa PUBLIC\"Y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"Z", +"input":"<!DOCTYPEa PUBLIC\"Z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"`", +"input":"<!DOCTYPEa PUBLIC\"`", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"a", +"input":"<!DOCTYPEa PUBLIC\"a", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"b", +"input":"<!DOCTYPEa PUBLIC\"b", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"y", +"input":"<!DOCTYPEa PUBLIC\"y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"z", +"input":"<!DOCTYPEa PUBLIC\"z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"{", +"input":"<!DOCTYPEa PUBLIC\"{", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\"\\uDBC0\\uDC00", +"input":"<!DOCTYPEa PUBLIC\"\uDBC0\uDC00", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC#", +"input":"<!DOCTYPEa PUBLIC#", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC&", +"input":"<!DOCTYPEa PUBLIC&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'", +"input":"<!DOCTYPEa PUBLIC'", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'\\u0000", +"input":"<!DOCTYPEa PUBLIC'\u0000", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'\\u0009", +"input":"<!DOCTYPEa PUBLIC'\u0009", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'\\u000A", +"input":"<!DOCTYPEa PUBLIC'\u000A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'\\u000B", +"input":"<!DOCTYPEa PUBLIC'\u000B", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'\\u000C", +"input":"<!DOCTYPEa PUBLIC'\u000C", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC' ", +"input":"<!DOCTYPEa PUBLIC' ", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'!", +"input":"<!DOCTYPEa PUBLIC'!", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'\"", +"input":"<!DOCTYPEa PUBLIC'\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\"", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'&", +"input":"<!DOCTYPEa PUBLIC'&", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''", +"input":"<!DOCTYPEa PUBLIC''", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u0000", +"input":"<!DOCTYPEa PUBLIC''\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u0008", +"input":"<!DOCTYPEa PUBLIC''\u0008", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u0009", +"input":"<!DOCTYPEa PUBLIC''\u0009", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u000A", +"input":"<!DOCTYPEa PUBLIC''\u000A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u000B", +"input":"<!DOCTYPEa PUBLIC''\u000B", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u000C", +"input":"<!DOCTYPEa PUBLIC''\u000C", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u000D", +"input":"<!DOCTYPEa PUBLIC''\u000D", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\u001F", +"input":"<!DOCTYPEa PUBLIC''\u001F", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'' ", +"input":"<!DOCTYPEa PUBLIC'' ", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''!", +"input":"<!DOCTYPEa PUBLIC''!", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\"", +"input":"<!DOCTYPEa PUBLIC''\"", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]}, + +{"description":"<!DOCTYPEa PUBLIC''#", +"input":"<!DOCTYPEa PUBLIC''#", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''&", +"input":"<!DOCTYPEa PUBLIC''&", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'''", +"input":"<!DOCTYPEa PUBLIC'''", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]}, + +{"description":"<!DOCTYPEa PUBLIC''(", +"input":"<!DOCTYPEa PUBLIC''(", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''-", +"input":"<!DOCTYPEa PUBLIC''-", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''/", +"input":"<!DOCTYPEa PUBLIC''/", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''0", +"input":"<!DOCTYPEa PUBLIC''0", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''1", +"input":"<!DOCTYPEa PUBLIC''1", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''9", +"input":"<!DOCTYPEa PUBLIC''9", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''<", +"input":"<!DOCTYPEa PUBLIC''<", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''=", +"input":"<!DOCTYPEa PUBLIC''=", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''>", +"input":"<!DOCTYPEa PUBLIC''>", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, true]]}, + +{"description":"<!DOCTYPEa PUBLIC''?", +"input":"<!DOCTYPEa PUBLIC''?", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''@", +"input":"<!DOCTYPEa PUBLIC''@", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''A", +"input":"<!DOCTYPEa PUBLIC''A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''B", +"input":"<!DOCTYPEa PUBLIC''B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''Y", +"input":"<!DOCTYPEa PUBLIC''Y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''Z", +"input":"<!DOCTYPEa PUBLIC''Z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''`", +"input":"<!DOCTYPEa PUBLIC''`", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''a", +"input":"<!DOCTYPEa PUBLIC''a", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''b", +"input":"<!DOCTYPEa PUBLIC''b", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''y", +"input":"<!DOCTYPEa PUBLIC''y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''z", +"input":"<!DOCTYPEa PUBLIC''z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''{", +"input":"<!DOCTYPEa PUBLIC''{", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC''\\uDBC0\\uDC00", +"input":"<!DOCTYPEa PUBLIC''\uDBC0\uDC00", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'(", +"input":"<!DOCTYPEa PUBLIC'(", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "(", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'-", +"input":"<!DOCTYPEa PUBLIC'-", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'/", +"input":"<!DOCTYPEa PUBLIC'/", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'0", +"input":"<!DOCTYPEa PUBLIC'0", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'1", +"input":"<!DOCTYPEa PUBLIC'1", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'9", +"input":"<!DOCTYPEa PUBLIC'9", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'<", +"input":"<!DOCTYPEa PUBLIC'<", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'=", +"input":"<!DOCTYPEa PUBLIC'=", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'>", +"input":"<!DOCTYPEa PUBLIC'>", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'?", +"input":"<!DOCTYPEa PUBLIC'?", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'@", +"input":"<!DOCTYPEa PUBLIC'@", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'A", +"input":"<!DOCTYPEa PUBLIC'A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'B", +"input":"<!DOCTYPEa PUBLIC'B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'Y", +"input":"<!DOCTYPEa PUBLIC'Y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'Z", +"input":"<!DOCTYPEa PUBLIC'Z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'`", +"input":"<!DOCTYPEa PUBLIC'`", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'a", +"input":"<!DOCTYPEa PUBLIC'a", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'b", +"input":"<!DOCTYPEa PUBLIC'b", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'y", +"input":"<!DOCTYPEa PUBLIC'y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'z", +"input":"<!DOCTYPEa PUBLIC'z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'{", +"input":"<!DOCTYPEa PUBLIC'{", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC'\\uDBC0\\uDC00", +"input":"<!DOCTYPEa PUBLIC'\uDBC0\uDC00", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC(", +"input":"<!DOCTYPEa PUBLIC(", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC-", +"input":"<!DOCTYPEa PUBLIC-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC/", +"input":"<!DOCTYPEa PUBLIC/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC0", +"input":"<!DOCTYPEa PUBLIC0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC1", +"input":"<!DOCTYPEa PUBLIC1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC9", +"input":"<!DOCTYPEa PUBLIC9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC<", +"input":"<!DOCTYPEa PUBLIC<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC=", +"input":"<!DOCTYPEa PUBLIC=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC>", +"input":"<!DOCTYPEa PUBLIC>", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC?", +"input":"<!DOCTYPEa PUBLIC?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC@", +"input":"<!DOCTYPEa PUBLIC@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICA", +"input":"<!DOCTYPEa PUBLICA", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICB", +"input":"<!DOCTYPEa PUBLICB", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICY", +"input":"<!DOCTYPEa PUBLICY", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICZ", +"input":"<!DOCTYPEa PUBLICZ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC`", +"input":"<!DOCTYPEa PUBLIC`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICa", +"input":"<!DOCTYPEa PUBLICa", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICb", +"input":"<!DOCTYPEa PUBLICb", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICy", +"input":"<!DOCTYPEa PUBLICy", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLICz", +"input":"<!DOCTYPEa PUBLICz", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC{", +"input":"<!DOCTYPEa PUBLIC{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa PUBLIC\\uDBC0\\uDC00", +"input":"<!DOCTYPEa PUBLIC\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM", +"input":"<!DOCTYPEa SYSTEM", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u0000", +"input":"<!DOCTYPEa SYSTEM\u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u0008", +"input":"<!DOCTYPEa SYSTEM\u0008", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u0009", +"input":"<!DOCTYPEa SYSTEM\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u000A", +"input":"<!DOCTYPEa SYSTEM\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u000B", +"input":"<!DOCTYPEa SYSTEM\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u000C", +"input":"<!DOCTYPEa SYSTEM\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u000D", +"input":"<!DOCTYPEa SYSTEM\u000D", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\u001F", +"input":"<!DOCTYPEa SYSTEM\u001F", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM ", +"input":"<!DOCTYPEa SYSTEM ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM!", +"input":"<!DOCTYPEa SYSTEM!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"", +"input":"<!DOCTYPEa SYSTEM\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"\\u0000", +"input":"<!DOCTYPEa SYSTEM\"\u0000", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"\\u0009", +"input":"<!DOCTYPEa SYSTEM\"\u0009", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"\\u000A", +"input":"<!DOCTYPEa SYSTEM\"\u000A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"\\u000B", +"input":"<!DOCTYPEa SYSTEM\"\u000B", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"\\u000C", +"input":"<!DOCTYPEa SYSTEM\"\u000C", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\" ", +"input":"<!DOCTYPEa SYSTEM\" ", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"!", +"input":"<!DOCTYPEa SYSTEM\"!", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"\"", +"input":"<!DOCTYPEa SYSTEM\"\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"#", +"input":"<!DOCTYPEa SYSTEM\"#", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "#", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"&", +"input":"<!DOCTYPEa SYSTEM\"&", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"'", +"input":"<!DOCTYPEa SYSTEM\"'", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "'", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"-", +"input":"<!DOCTYPEa SYSTEM\"-", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"/", +"input":"<!DOCTYPEa SYSTEM\"/", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"0", +"input":"<!DOCTYPEa SYSTEM\"0", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"1", +"input":"<!DOCTYPEa SYSTEM\"1", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"9", +"input":"<!DOCTYPEa SYSTEM\"9", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"<", +"input":"<!DOCTYPEa SYSTEM\"<", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"=", +"input":"<!DOCTYPEa SYSTEM\"=", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\">", +"input":"<!DOCTYPEa SYSTEM\">", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"?", +"input":"<!DOCTYPEa SYSTEM\"?", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"@", +"input":"<!DOCTYPEa SYSTEM\"@", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"A", +"input":"<!DOCTYPEa SYSTEM\"A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"B", +"input":"<!DOCTYPEa SYSTEM\"B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"Y", +"input":"<!DOCTYPEa SYSTEM\"Y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"Z", +"input":"<!DOCTYPEa SYSTEM\"Z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"`", +"input":"<!DOCTYPEa SYSTEM\"`", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"a", +"input":"<!DOCTYPEa SYSTEM\"a", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"b", +"input":"<!DOCTYPEa SYSTEM\"b", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"y", +"input":"<!DOCTYPEa SYSTEM\"y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"z", +"input":"<!DOCTYPEa SYSTEM\"z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"{", +"input":"<!DOCTYPEa SYSTEM\"{", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]}, + +{"description":"<!DOCTYPEa SYSTEM\"\\uDBC0\\uDC00", +"input":"<!DOCTYPEa SYSTEM\"\uDBC0\uDC00", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]}, + +{"description":"<!DOCTYPEa SYSTEM#", +"input":"<!DOCTYPEa SYSTEM#", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM&", +"input":"<!DOCTYPEa SYSTEM&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM'", +"input":"<!DOCTYPEa SYSTEM'", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'\\u0000", +"input":"<!DOCTYPEa SYSTEM'\u0000", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'\\u0009", +"input":"<!DOCTYPEa SYSTEM'\u0009", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'\\u000A", +"input":"<!DOCTYPEa SYSTEM'\u000A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'\\u000B", +"input":"<!DOCTYPEa SYSTEM'\u000B", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'\\u000C", +"input":"<!DOCTYPEa SYSTEM'\u000C", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]}, + +{"description":"<!DOCTYPEa SYSTEM' ", +"input":"<!DOCTYPEa SYSTEM' ", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'!", +"input":"<!DOCTYPEa SYSTEM'!", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'\"", +"input":"<!DOCTYPEa SYSTEM'\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\"", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'&", +"input":"<!DOCTYPEa SYSTEM'&", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]}, + +{"description":"<!DOCTYPEa SYSTEM''", +"input":"<!DOCTYPEa SYSTEM''", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u0000", +"input":"<!DOCTYPEa SYSTEM''\u0000", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u0008", +"input":"<!DOCTYPEa SYSTEM''\u0008", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u0009", +"input":"<!DOCTYPEa SYSTEM''\u0009", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u000A", +"input":"<!DOCTYPEa SYSTEM''\u000A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u000B", +"input":"<!DOCTYPEa SYSTEM''\u000B", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u000C", +"input":"<!DOCTYPEa SYSTEM''\u000C", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u000D", +"input":"<!DOCTYPEa SYSTEM''\u000D", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\u001F", +"input":"<!DOCTYPEa SYSTEM''\u001F", +"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM'' ", +"input":"<!DOCTYPEa SYSTEM'' ", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM''!", +"input":"<!DOCTYPEa SYSTEM''!", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''\"", +"input":"<!DOCTYPEa SYSTEM''\"", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''&", +"input":"<!DOCTYPEa SYSTEM''&", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM'''", +"input":"<!DOCTYPEa SYSTEM'''", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''-", +"input":"<!DOCTYPEa SYSTEM''-", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''/", +"input":"<!DOCTYPEa SYSTEM''/", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''0", +"input":"<!DOCTYPEa SYSTEM''0", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''1", +"input":"<!DOCTYPEa SYSTEM''1", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''9", +"input":"<!DOCTYPEa SYSTEM''9", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''<", +"input":"<!DOCTYPEa SYSTEM''<", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''=", +"input":"<!DOCTYPEa SYSTEM''=", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''>", +"input":"<!DOCTYPEa SYSTEM''>", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''?", +"input":"<!DOCTYPEa SYSTEM''?", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''@", +"input":"<!DOCTYPEa SYSTEM''@", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''A", +"input":"<!DOCTYPEa SYSTEM''A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''B", +"input":"<!DOCTYPEa SYSTEM''B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''Y", +"input":"<!DOCTYPEa SYSTEM''Y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''Z", +"input":"<!DOCTYPEa SYSTEM''Z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''`", +"input":"<!DOCTYPEa SYSTEM''`", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''a", +"input":"<!DOCTYPEa SYSTEM''a", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''b", +"input":"<!DOCTYPEa SYSTEM''b", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''y", +"input":"<!DOCTYPEa SYSTEM''y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''z", +"input":"<!DOCTYPEa SYSTEM''z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''{", +"input":"<!DOCTYPEa SYSTEM''{", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM''\\uDBC0\\uDC00", +"input":"<!DOCTYPEa SYSTEM''\uDBC0\uDC00", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]}, + +{"description":"<!DOCTYPEa SYSTEM'(", +"input":"<!DOCTYPEa SYSTEM'(", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "(", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'-", +"input":"<!DOCTYPEa SYSTEM'-", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'/", +"input":"<!DOCTYPEa SYSTEM'/", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'0", +"input":"<!DOCTYPEa SYSTEM'0", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'1", +"input":"<!DOCTYPEa SYSTEM'1", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'9", +"input":"<!DOCTYPEa SYSTEM'9", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'<", +"input":"<!DOCTYPEa SYSTEM'<", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'=", +"input":"<!DOCTYPEa SYSTEM'=", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'>", +"input":"<!DOCTYPEa SYSTEM'>", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'?", +"input":"<!DOCTYPEa SYSTEM'?", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'@", +"input":"<!DOCTYPEa SYSTEM'@", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'A", +"input":"<!DOCTYPEa SYSTEM'A", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'B", +"input":"<!DOCTYPEa SYSTEM'B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'Y", +"input":"<!DOCTYPEa SYSTEM'Y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'Z", +"input":"<!DOCTYPEa SYSTEM'Z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'`", +"input":"<!DOCTYPEa SYSTEM'`", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'a", +"input":"<!DOCTYPEa SYSTEM'a", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'b", +"input":"<!DOCTYPEa SYSTEM'b", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'y", +"input":"<!DOCTYPEa SYSTEM'y", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'z", +"input":"<!DOCTYPEa SYSTEM'z", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'{", +"input":"<!DOCTYPEa SYSTEM'{", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]}, + +{"description":"<!DOCTYPEa SYSTEM'\\uDBC0\\uDC00", +"input":"<!DOCTYPEa SYSTEM'\uDBC0\uDC00", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]}, + +{"description":"<!DOCTYPEa SYSTEM(", +"input":"<!DOCTYPEa SYSTEM(", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM-", +"input":"<!DOCTYPEa SYSTEM-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM/", +"input":"<!DOCTYPEa SYSTEM/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM0", +"input":"<!DOCTYPEa SYSTEM0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM1", +"input":"<!DOCTYPEa SYSTEM1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM9", +"input":"<!DOCTYPEa SYSTEM9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM<", +"input":"<!DOCTYPEa SYSTEM<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM=", +"input":"<!DOCTYPEa SYSTEM=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM>", +"input":"<!DOCTYPEa SYSTEM>", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM?", +"input":"<!DOCTYPEa SYSTEM?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM@", +"input":"<!DOCTYPEa SYSTEM@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMA", +"input":"<!DOCTYPEa SYSTEMA", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMB", +"input":"<!DOCTYPEa SYSTEMB", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMY", +"input":"<!DOCTYPEa SYSTEMY", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMZ", +"input":"<!DOCTYPEa SYSTEMZ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM`", +"input":"<!DOCTYPEa SYSTEM`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMa", +"input":"<!DOCTYPEa SYSTEMa", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMb", +"input":"<!DOCTYPEa SYSTEMb", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMy", +"input":"<!DOCTYPEa SYSTEMy", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEMz", +"input":"<!DOCTYPEa SYSTEMz", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM{", +"input":"<!DOCTYPEa SYSTEM{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa SYSTEM\\uDBC0\\uDC00", +"input":"<!DOCTYPEa SYSTEM\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa Y", +"input":"<!DOCTYPEa Y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa Z", +"input":"<!DOCTYPEa Z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa `", +"input":"<!DOCTYPEa `", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a", +"input":"<!DOCTYPEa a", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a\\u0000", +"input":"<!DOCTYPEa a\u0000", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a\\u0009", +"input":"<!DOCTYPEa a\u0009", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a\\u000A", +"input":"<!DOCTYPEa a\u000A", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a\\u000B", +"input":"<!DOCTYPEa a\u000B", +"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a\\u000C", +"input":"<!DOCTYPEa a\u000C", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a ", +"input":"<!DOCTYPEa a ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a!", +"input":"<!DOCTYPEa a!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a\"", +"input":"<!DOCTYPEa a\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a&", +"input":"<!DOCTYPEa a&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a'", +"input":"<!DOCTYPEa a'", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a-", +"input":"<!DOCTYPEa a-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a/", +"input":"<!DOCTYPEa a/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a0", +"input":"<!DOCTYPEa a0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a1", +"input":"<!DOCTYPEa a1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a9", +"input":"<!DOCTYPEa a9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a<", +"input":"<!DOCTYPEa a<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a=", +"input":"<!DOCTYPEa a=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a>", +"input":"<!DOCTYPEa a>", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a?", +"input":"<!DOCTYPEa a?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a@", +"input":"<!DOCTYPEa a@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa aA", +"input":"<!DOCTYPEa aA", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa aB", +"input":"<!DOCTYPEa aB", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa aY", +"input":"<!DOCTYPEa aY", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa aZ", +"input":"<!DOCTYPEa aZ", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a`", +"input":"<!DOCTYPEa a`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa aa", +"input":"<!DOCTYPEa aa", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa ab", +"input":"<!DOCTYPEa ab", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa ay", +"input":"<!DOCTYPEa ay", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa az", +"input":"<!DOCTYPEa az", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a{", +"input":"<!DOCTYPEa a{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa a\\uDBC0\\uDC00", +"input":"<!DOCTYPEa a\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa b", +"input":"<!DOCTYPEa b", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa y", +"input":"<!DOCTYPEa y", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa z", +"input":"<!DOCTYPEa z", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa {", +"input":"<!DOCTYPEa {", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa \\uDBC0\\uDC00", +"input":"<!DOCTYPEa \uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]}, + +{"description":"<!DOCTYPEa!", +"input":"<!DOCTYPEa!", +"output":["ParseError", "ParseError", ["DOCTYPE", "a!", null, null, false]]}, + +{"description":"<!DOCTYPEa\"", +"input":"<!DOCTYPEa\"", +"output":["ParseError", "ParseError", ["DOCTYPE", "a\"", null, null, false]]}, + +{"description":"<!DOCTYPEa&", +"input":"<!DOCTYPEa&", +"output":["ParseError", "ParseError", ["DOCTYPE", "a&", null, null, false]]}, + +{"description":"<!DOCTYPEa'", +"input":"<!DOCTYPEa'", +"output":["ParseError", "ParseError", ["DOCTYPE", "a'", null, null, false]]}, + +{"description":"<!DOCTYPEa-", +"input":"<!DOCTYPEa-", +"output":["ParseError", "ParseError", ["DOCTYPE", "a-", null, null, false]]}, + +{"description":"<!DOCTYPEa/", +"input":"<!DOCTYPEa/", +"output":["ParseError", "ParseError", ["DOCTYPE", "a/", null, null, false]]}, + +{"description":"<!DOCTYPEa0", +"input":"<!DOCTYPEa0", +"output":["ParseError", "ParseError", ["DOCTYPE", "a0", null, null, false]]}, + +{"description":"<!DOCTYPEa1", +"input":"<!DOCTYPEa1", +"output":["ParseError", "ParseError", ["DOCTYPE", "a1", null, null, false]]}, + +{"description":"<!DOCTYPEa9", +"input":"<!DOCTYPEa9", +"output":["ParseError", "ParseError", ["DOCTYPE", "a9", null, null, false]]}, + +{"description":"<!DOCTYPEa<", +"input":"<!DOCTYPEa<", +"output":["ParseError", "ParseError", ["DOCTYPE", "a<", null, null, false]]}, + +{"description":"<!DOCTYPEa=", +"input":"<!DOCTYPEa=", +"output":["ParseError", "ParseError", ["DOCTYPE", "a=", null, null, false]]}, + +{"description":"<!DOCTYPEa>", +"input":"<!DOCTYPEa>", +"output":["ParseError", ["DOCTYPE", "a", null, null, true]]}, + +{"description":"<!DOCTYPEa?", +"input":"<!DOCTYPEa?", +"output":["ParseError", "ParseError", ["DOCTYPE", "a?", null, null, false]]}, + +{"description":"<!DOCTYPEa@", +"input":"<!DOCTYPEa@", +"output":["ParseError", "ParseError", ["DOCTYPE", "a@", null, null, false]]}, + +{"description":"<!DOCTYPEaA", +"input":"<!DOCTYPEaA", +"output":["ParseError", "ParseError", ["DOCTYPE", "aa", null, null, false]]}, + +{"description":"<!DOCTYPEaB", +"input":"<!DOCTYPEaB", +"output":["ParseError", "ParseError", ["DOCTYPE", "ab", null, null, false]]}, + +{"description":"<!DOCTYPEaY", +"input":"<!DOCTYPEaY", +"output":["ParseError", "ParseError", ["DOCTYPE", "ay", null, null, false]]}, + +{"description":"<!DOCTYPEaZ", +"input":"<!DOCTYPEaZ", +"output":["ParseError", "ParseError", ["DOCTYPE", "az", null, null, false]]}, + +{"description":"<!DOCTYPEa[", +"input":"<!DOCTYPEa[", +"output":["ParseError", "ParseError", ["DOCTYPE", "a[", null, null, false]]}, + +{"description":"<!DOCTYPEa`", +"input":"<!DOCTYPEa`", +"output":["ParseError", "ParseError", ["DOCTYPE", "a`", null, null, false]]}, + +{"description":"<!DOCTYPEaa", +"input":"<!DOCTYPEaa", +"output":["ParseError", "ParseError", ["DOCTYPE", "aa", null, null, false]]}, + +{"description":"<!DOCTYPEab", +"input":"<!DOCTYPEab", +"output":["ParseError", "ParseError", ["DOCTYPE", "ab", null, null, false]]}, + +{"description":"<!DOCTYPEay", +"input":"<!DOCTYPEay", +"output":["ParseError", "ParseError", ["DOCTYPE", "ay", null, null, false]]}, + +{"description":"<!DOCTYPEaz", +"input":"<!DOCTYPEaz", +"output":["ParseError", "ParseError", ["DOCTYPE", "az", null, null, false]]}, + +{"description":"<!DOCTYPEa{", +"input":"<!DOCTYPEa{", +"output":["ParseError", "ParseError", ["DOCTYPE", "a{", null, null, false]]}, + +{"description":"<!DOCTYPEa\\uDBC0\\uDC00", +"input":"<!DOCTYPEa\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "a\uDBC0\uDC00", null, null, false]]}, + +{"description":"<!DOCTYPEb", +"input":"<!DOCTYPEb", +"output":["ParseError", "ParseError", ["DOCTYPE", "b", null, null, false]]}, + +{"description":"<!DOCTYPEy", +"input":"<!DOCTYPEy", +"output":["ParseError", "ParseError", ["DOCTYPE", "y", null, null, false]]}, + +{"description":"<!DOCTYPEz", +"input":"<!DOCTYPEz", +"output":["ParseError", "ParseError", ["DOCTYPE", "z", null, null, false]]}, + +{"description":"<!DOCTYPE{", +"input":"<!DOCTYPE{", +"output":["ParseError", "ParseError", ["DOCTYPE", "{", null, null, false]]}, + +{"description":"<!DOCTYPE\\uDBC0\\uDC00", +"input":"<!DOCTYPE\uDBC0\uDC00", +"output":["ParseError", "ParseError", ["DOCTYPE", "\uDBC0\uDC00", null, null, false]]}, + +{"description":"<!Y", +"input":"<!Y", +"output":["ParseError", ["Comment", "Y"]]}, + +{"description":"<!Z", +"input":"<!Z", +"output":["ParseError", ["Comment", "Z"]]}, + +{"description":"<!`", +"input":"<!`", +"output":["ParseError", ["Comment", "`"]]}, + +{"description":"<!a", +"input":"<!a", +"output":["ParseError", ["Comment", "a"]]}, + +{"description":"<!b", +"input":"<!b", +"output":["ParseError", ["Comment", "b"]]}, + +{"description":"<!y", +"input":"<!y", +"output":["ParseError", ["Comment", "y"]]}, + +{"description":"<!z", +"input":"<!z", +"output":["ParseError", ["Comment", "z"]]}, + +{"description":"<!{", +"input":"<!{", +"output":["ParseError", ["Comment", "{"]]}, + +{"description":"<!\\uDBC0\\uDC00", +"input":"<!\uDBC0\uDC00", +"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]}, + +{"description":"<\"", +"input":"<\"", +"output":["ParseError", ["Character", "<\""]]}, + +{"description":"<&", +"input":"<&", +"output":["ParseError", ["Character", "<&"]]}, + +{"description":"<'", +"input":"<'", +"output":["ParseError", ["Character", "<'"]]}, + +{"description":"<-", +"input":"<-", +"output":["ParseError", ["Character", "<-"]]}, + +{"description":"<.", +"input":"<.", +"output":["ParseError", ["Character", "<."]]}, + +{"description":"</", +"input":"</", +"output":["ParseError", ["Character", "</"]]}, + +{"description":"</\\u0000", +"input":"</\u0000", +"output":["ParseError", ["Comment", "\uFFFD"]]}, + +{"description":"</\\u0009", +"input":"</\u0009", +"output":["ParseError", ["Comment", "\u0009"]]}, + +{"description":"</\\u000A", +"input":"</\u000A", +"output":["ParseError", ["Comment", "\u000A"]]}, + +{"description":"</\\u000B", +"input":"</\u000B", +"output":["ParseError", "ParseError", ["Comment", "\u000B"]]}, + +{"description":"</\\u000C", +"input":"</\u000C", +"output":["ParseError", ["Comment", "\u000C"]]}, + +{"description":"</ ", +"input":"</ ", +"output":["ParseError", ["Comment", " "]]}, + +{"description":"</!", +"input":"</!", +"output":["ParseError", ["Comment", "!"]]}, + +{"description":"</\"", +"input":"</\"", +"output":["ParseError", ["Comment", "\""]]}, + +{"description":"</&", +"input":"</&", +"output":["ParseError", ["Comment", "&"]]}, + +{"description":"</'", +"input":"</'", +"output":["ParseError", ["Comment", "'"]]}, + +{"description":"</-", +"input":"</-", +"output":["ParseError", ["Comment", "-"]]}, + +{"description":"<//", +"input":"<//", +"output":["ParseError", ["Comment", "/"]]}, + +{"description":"</0", +"input":"</0", +"output":["ParseError", ["Comment", "0"]]}, + +{"description":"</1", +"input":"</1", +"output":["ParseError", ["Comment", "1"]]}, + +{"description":"</9", +"input":"</9", +"output":["ParseError", ["Comment", "9"]]}, + +{"description":"</<", +"input":"</<", +"output":["ParseError", ["Comment", "<"]]}, + +{"description":"</=", +"input":"</=", +"output":["ParseError", ["Comment", "="]]}, + +{"description":"</>", +"input":"</>", +"output":["ParseError"]}, + +{"description":"</?", +"input":"</?", +"output":["ParseError", ["Comment", "?"]]}, + +{"description":"</@", +"input":"</@", +"output":["ParseError", ["Comment", "@"]]}, + +{"description":"</A>", +"input":"</A>", +"output":[["EndTag", "a"]]}, + +{"description":"</B>", +"input":"</B>", +"output":[["EndTag", "b"]]}, + +{"description":"</Y>", +"input":"</Y>", +"output":[["EndTag", "y"]]}, + +{"description":"</Z>", +"input":"</Z>", +"output":[["EndTag", "z"]]}, + +{"description":"</[", +"input":"</[", +"output":["ParseError", ["Comment", "["]]}, + +{"description":"</`", +"input":"</`", +"output":["ParseError", ["Comment", "`"]]}, + +{"description":"</a>", +"input":"</a>", +"output":[["EndTag", "a"]]}, + +{"description":"</b>", +"input":"</b>", +"output":[["EndTag", "b"]]}, + +{"description":"</y>", +"input":"</y>", +"output":[["EndTag", "y"]]}, + +{"description":"</z>", +"input":"</z>", +"output":[["EndTag", "z"]]}, + +{"description":"</{", +"input":"</{", +"output":["ParseError", ["Comment", "{"]]}, + +{"description":"</\\uDBC0\\uDC00", +"input":"</\uDBC0\uDC00", +"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]}, + +{"description":"<0", +"input":"<0", +"output":["ParseError", ["Character", "<0"]]}, + +{"description":"<1", +"input":"<1", +"output":["ParseError", ["Character", "<1"]]}, + +{"description":"<9", +"input":"<9", +"output":["ParseError", ["Character", "<9"]]}, + +{"description":"<<", +"input":"<<", +"output":["ParseError", ["Character", "<"], "ParseError", ["Character", "<"]]}, + +{"description":"<=", +"input":"<=", +"output":["ParseError", ["Character", "<="]]}, + +{"description":"<>", +"input":"<>", +"output":["ParseError", ["Character", "<>"]]}, + +{"description":"<?", +"input":"<?", +"output":["ParseError", ["Comment", "?"]]}, + +{"description":"<?\\u0000", +"input":"<?\u0000", +"output":["ParseError", ["Comment", "?\uFFFD"]]}, + +{"description":"<?\\u0009", +"input":"<?\u0009", +"output":["ParseError", ["Comment", "?\u0009"]]}, + +{"description":"<?\\u000A", +"input":"<?\u000A", +"output":["ParseError", ["Comment", "?\u000A"]]}, + +{"description":"<?\\u000B", +"input":"<?\u000B", +"output":["ParseError", "ParseError", ["Comment", "?\u000B"]]}, + +{"description":"<?\\u000C", +"input":"<?\u000C", +"output":["ParseError", ["Comment", "?\u000C"]]}, + +{"description":"<? ", +"input":"<? ", +"output":["ParseError", ["Comment", "? "]]}, + +{"description":"<?!", +"input":"<?!", +"output":["ParseError", ["Comment", "?!"]]}, + +{"description":"<?\"", +"input":"<?\"", +"output":["ParseError", ["Comment", "?\""]]}, + +{"description":"<?&", +"input":"<?&", +"output":["ParseError", ["Comment", "?&"]]}, + +{"description":"<?'", +"input":"<?'", +"output":["ParseError", ["Comment", "?'"]]}, + +{"description":"<?-", +"input":"<?-", +"output":["ParseError", ["Comment", "?-"]]}, + +{"description":"<?/", +"input":"<?/", +"output":["ParseError", ["Comment", "?/"]]}, + +{"description":"<?0", +"input":"<?0", +"output":["ParseError", ["Comment", "?0"]]}, + +{"description":"<?1", +"input":"<?1", +"output":["ParseError", ["Comment", "?1"]]}, + +{"description":"<?9", +"input":"<?9", +"output":["ParseError", ["Comment", "?9"]]}, + +{"description":"<?<", +"input":"<?<", +"output":["ParseError", ["Comment", "?<"]]}, + +{"description":"<?=", +"input":"<?=", +"output":["ParseError", ["Comment", "?="]]}, + +{"description":"<?>", +"input":"<?>", +"output":["ParseError", ["Comment", "?"]]}, + +{"description":"<??", +"input":"<??", +"output":["ParseError", ["Comment", "??"]]}, + +{"description":"<?@", +"input":"<?@", +"output":["ParseError", ["Comment", "?@"]]}, + +{"description":"<?A", +"input":"<?A", +"output":["ParseError", ["Comment", "?A"]]}, + +{"description":"<?B", +"input":"<?B", +"output":["ParseError", ["Comment", "?B"]]}, + +{"description":"<?Y", +"input":"<?Y", +"output":["ParseError", ["Comment", "?Y"]]}, + +{"description":"<?Z", +"input":"<?Z", +"output":["ParseError", ["Comment", "?Z"]]}, + +{"description":"<?`", +"input":"<?`", +"output":["ParseError", ["Comment", "?`"]]}, + +{"description":"<?a", +"input":"<?a", +"output":["ParseError", ["Comment", "?a"]]}, + +{"description":"<?b", +"input":"<?b", +"output":["ParseError", ["Comment", "?b"]]}, + +{"description":"<?y", +"input":"<?y", +"output":["ParseError", ["Comment", "?y"]]}, + +{"description":"<?z", +"input":"<?z", +"output":["ParseError", ["Comment", "?z"]]}, + +{"description":"<?{", +"input":"<?{", +"output":["ParseError", ["Comment", "?{"]]}, + +{"description":"<?\\uDBC0\\uDC00", +"input":"<?\uDBC0\uDC00", +"output":["ParseError", ["Comment", "?\uDBC0\uDC00"]]}, + +{"description":"<@", +"input":"<@", +"output":["ParseError", ["Character", "<@"]]}, + +{"description":"<A>", +"input":"<A>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<B>", +"input":"<B>", +"output":[["StartTag", "b", {}]]}, + +{"description":"<Y>", +"input":"<Y>", +"output":[["StartTag", "y", {}]]}, + +{"description":"<Z>", +"input":"<Z>", +"output":[["StartTag", "z", {}]]}, + +{"description":"<[", +"input":"<[", +"output":["ParseError", ["Character", "<["]]}, + +{"description":"<`", +"input":"<`", +"output":["ParseError", ["Character", "<`"]]}, + +{"description":"<a>", +"input":"<a>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a\\u0000>", +"input":"<a\u0000>", +"output":["ParseError", ["StartTag", "a\uFFFD", {}]]}, + +{"description":"<a\\u0008>", +"input":"<a\u0008>", +"output":["ParseError", ["StartTag", "a\u0008", {}]]}, + +{"description":"<a\\u0009>", +"input":"<a\u0009>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a\\u000A>", +"input":"<a\u000A>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a\\u000B>", +"input":"<a\u000B>", +"output":["ParseError", ["StartTag", "a\u000B", {}]]}, + +{"description":"<a\\u000C>", +"input":"<a\u000C>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a\\u000D>", +"input":"<a\u000D>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a\\u001F>", +"input":"<a\u001F>", +"output":["ParseError", ["StartTag", "a\u001F", {}]]}, + +{"description":"<a >", +"input":"<a >", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a \\u0000>", +"input":"<a \u0000>", +"output":["ParseError", ["StartTag", "a", {"\uFFFD":""}]]}, + +{"description":"<a \\u0008>", +"input":"<a \u0008>", +"output":["ParseError", ["StartTag", "a", {"\u0008":""}]]}, + +{"description":"<a \\u0009>", +"input":"<a \u0009>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a \\u000A>", +"input":"<a \u000A>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a \\u000B>", +"input":"<a \u000B>", +"output":["ParseError", ["StartTag", "a", {"\u000B":""}]]}, + +{"description":"<a \\u000C>", +"input":"<a \u000C>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a \\u000D>", +"input":"<a \u000D>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a \\u001F>", +"input":"<a \u001F>", +"output":["ParseError", ["StartTag", "a", {"\u001F":""}]]}, + +{"description":"<a >", +"input":"<a >", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a !>", +"input":"<a !>", +"output":[["StartTag", "a", {"!":""}]]}, + +{"description":"<a \">", +"input":"<a \">", +"output":["ParseError", ["StartTag", "a", {"\"":""}]]}, + +{"description":"<a #>", +"input":"<a #>", +"output":[["StartTag", "a", {"#":""}]]}, + +{"description":"<a &>", +"input":"<a &>", +"output":[["StartTag", "a", {"&":""}]]}, + +{"description":"<a '>", +"input":"<a '>", +"output":["ParseError", ["StartTag", "a", {"'":""}]]}, + +{"description":"<a (>", +"input":"<a (>", +"output":[["StartTag", "a", {"(":""}]]}, + +{"description":"<a ->", +"input":"<a ->", +"output":[["StartTag", "a", {"-":""}]]}, + +{"description":"<a .>", +"input":"<a .>", +"output":[["StartTag", "a", {".":""}]]}, + +{"description":"<a />", +"input":"<a />", +"output":[["StartTag", "a", {}, true]]}, + +{"description":"<a 0>", +"input":"<a 0>", +"output":[["StartTag", "a", {"0":""}]]}, + +{"description":"<a 1>", +"input":"<a 1>", +"output":[["StartTag", "a", {"1":""}]]}, + +{"description":"<a 9>", +"input":"<a 9>", +"output":[["StartTag", "a", {"9":""}]]}, + +{"description":"<a <>", +"input":"<a <>", +"output":["ParseError", ["StartTag", "a", {"<":""}]]}, + +{"description":"<a =>", +"input":"<a =>", +"output":["ParseError", ["StartTag", "a", {"=":""}]]}, + +{"description":"<a >", +"input":"<a >", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a ?>", +"input":"<a ?>", +"output":[["StartTag", "a", {"?":""}]]}, + +{"description":"<a @>", +"input":"<a @>", +"output":[["StartTag", "a", {"@":""}]]}, + +{"description":"<a A>", +"input":"<a A>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a B>", +"input":"<a B>", +"output":[["StartTag", "a", {"b":""}]]}, + +{"description":"<a Y>", +"input":"<a Y>", +"output":[["StartTag", "a", {"y":""}]]}, + +{"description":"<a Z>", +"input":"<a Z>", +"output":[["StartTag", "a", {"z":""}]]}, + +{"description":"<a [>", +"input":"<a [>", +"output":[["StartTag", "a", {"[":""}]]}, + +{"description":"<a `>", +"input":"<a `>", +"output":[["StartTag", "a", {"`":""}]]}, + +{"description":"<a a>", +"input":"<a a>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a\\u0000>", +"input":"<a a\u0000>", +"output":["ParseError", ["StartTag", "a", {"a\uFFFD":""}]]}, + +{"description":"<a a\\u0008>", +"input":"<a a\u0008>", +"output":["ParseError", ["StartTag", "a", {"a\u0008":""}]]}, + +{"description":"<a a\\u0009>", +"input":"<a a\u0009>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a\\u000A>", +"input":"<a a\u000A>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a\\u000B>", +"input":"<a a\u000B>", +"output":["ParseError", ["StartTag", "a", {"a\u000B":""}]]}, + +{"description":"<a a\\u000C>", +"input":"<a a\u000C>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a\\u000D>", +"input":"<a a\u000D>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a\\u001F>", +"input":"<a a\u001F>", +"output":["ParseError", ["StartTag", "a", {"a\u001F":""}]]}, + +{"description":"<a a >", +"input":"<a a >", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a \\u0000>", +"input":"<a a \u0000>", +"output":["ParseError", ["StartTag", "a", {"a":"", "\uFFFD":""}]]}, + +{"description":"<a a \\u0008>", +"input":"<a a \u0008>", +"output":["ParseError", ["StartTag", "a", {"a":"", "\u0008":""}]]}, + +{"description":"<a a \\u0009>", +"input":"<a a \u0009>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a \\u000A>", +"input":"<a a \u000A>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a \\u000B>", +"input":"<a a \u000B>", +"output":["ParseError", ["StartTag", "a", {"a":"", "\u000B":""}]]}, + +{"description":"<a a \\u000C>", +"input":"<a a \u000C>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a \\u000D>", +"input":"<a a \u000D>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a \\u001F>", +"input":"<a a \u001F>", +"output":["ParseError", ["StartTag", "a", {"a":"", "\u001F":""}]]}, + +{"description":"<a a >", +"input":"<a a >", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a !>", +"input":"<a a !>", +"output":[["StartTag", "a", {"a":"", "!":""}]]}, + +{"description":"<a a \">", +"input":"<a a \">", +"output":["ParseError", ["StartTag", "a", {"a":"", "\"":""}]]}, + +{"description":"<a a #>", +"input":"<a a #>", +"output":[["StartTag", "a", {"a":"", "#":""}]]}, + +{"description":"<a a &>", +"input":"<a a &>", +"output":[["StartTag", "a", {"a":"", "&":""}]]}, + +{"description":"<a a '>", +"input":"<a a '>", +"output":["ParseError", ["StartTag", "a", {"a":"", "'":""}]]}, + +{"description":"<a a (>", +"input":"<a a (>", +"output":[["StartTag", "a", {"a":"", "(":""}]]}, + +{"description":"<a a ->", +"input":"<a a ->", +"output":[["StartTag", "a", {"a":"", "-":""}]]}, + +{"description":"<a a .>", +"input":"<a a .>", +"output":[["StartTag", "a", {"a":"", ".":""}]]}, + +{"description":"<a a />", +"input":"<a a />", +"output":[["StartTag", "a", {"a":""}, true]]}, + +{"description":"<a a 0>", +"input":"<a a 0>", +"output":[["StartTag", "a", {"a":"", "0":""}]]}, + +{"description":"<a a 1>", +"input":"<a a 1>", +"output":[["StartTag", "a", {"a":"", "1":""}]]}, + +{"description":"<a a 9>", +"input":"<a a 9>", +"output":[["StartTag", "a", {"a":"", "9":""}]]}, + +{"description":"<a a <>", +"input":"<a a <>", +"output":["ParseError", ["StartTag", "a", {"a":"", "<":""}]]}, + +{"description":"<a a =>", +"input":"<a a =>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a >", +"input":"<a a >", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a ?>", +"input":"<a a ?>", +"output":[["StartTag", "a", {"a":"", "?":""}]]}, + +{"description":"<a a @>", +"input":"<a a @>", +"output":[["StartTag", "a", {"a":"", "@":""}]]}, + +{"description":"<a a A>", +"input":"<a a A>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a B>", +"input":"<a a B>", +"output":[["StartTag", "a", {"a":"", "b":""}]]}, + +{"description":"<a a Y>", +"input":"<a a Y>", +"output":[["StartTag", "a", {"a":"", "y":""}]]}, + +{"description":"<a a Z>", +"input":"<a a Z>", +"output":[["StartTag", "a", {"a":"", "z":""}]]}, + +{"description":"<a a [>", +"input":"<a a [>", +"output":[["StartTag", "a", {"a":"", "[":""}]]}, + +{"description":"<a a `>", +"input":"<a a `>", +"output":[["StartTag", "a", {"a":"", "`":""}]]}, + +{"description":"<a a a>", +"input":"<a a a>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a b>", +"input":"<a a b>", +"output":[["StartTag", "a", {"a":"", "b":""}]]}, + +{"description":"<a a y>", +"input":"<a a y>", +"output":[["StartTag", "a", {"a":"", "y":""}]]}, + +{"description":"<a a z>", +"input":"<a a z>", +"output":[["StartTag", "a", {"a":"", "z":""}]]}, + +{"description":"<a a {>", +"input":"<a a {>", +"output":[["StartTag", "a", {"a":"", "{":""}]]}, + +{"description":"<a a \\uDBC0\\uDC00>", +"input":"<a a \uDBC0\uDC00>", +"output":[["StartTag", "a", {"a":"", "\uDBC0\uDC00":""}]]}, + +{"description":"<a a!>", +"input":"<a a!>", +"output":[["StartTag", "a", {"a!":""}]]}, + +{"description":"<a a\">", +"input":"<a a\">", +"output":["ParseError", ["StartTag", "a", {"a\"":""}]]}, + +{"description":"<a a#>", +"input":"<a a#>", +"output":[["StartTag", "a", {"a#":""}]]}, + +{"description":"<a a&>", +"input":"<a a&>", +"output":[["StartTag", "a", {"a&":""}]]}, + +{"description":"<a a'>", +"input":"<a a'>", +"output":["ParseError", ["StartTag", "a", {"a'":""}]]}, + +{"description":"<a a(>", +"input":"<a a(>", +"output":[["StartTag", "a", {"a(":""}]]}, + +{"description":"<a a->", +"input":"<a a->", +"output":[["StartTag", "a", {"a-":""}]]}, + +{"description":"<a a.>", +"input":"<a a.>", +"output":[["StartTag", "a", {"a.":""}]]}, + +{"description":"<a a/>", +"input":"<a a/>", +"output":[["StartTag", "a", {"a":""}, true]]}, + +{"description":"<a a0>", +"input":"<a a0>", +"output":[["StartTag", "a", {"a0":""}]]}, + +{"description":"<a a1>", +"input":"<a a1>", +"output":[["StartTag", "a", {"a1":""}]]}, + +{"description":"<a a9>", +"input":"<a a9>", +"output":[["StartTag", "a", {"a9":""}]]}, + +{"description":"<a a<>", +"input":"<a a<>", +"output":["ParseError", ["StartTag", "a", {"a<":""}]]}, + +{"description":"<a a=>", +"input":"<a a=>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=\\u0000>", +"input":"<a a=\u0000>", +"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]}, + +{"description":"<a a=\\u0008>", +"input":"<a a=\u0008>", +"output":["ParseError", ["StartTag", "a", {"a":"\u0008"}]]}, + +{"description":"<a a=\\u0009>", +"input":"<a a=\u0009>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=\\u000A>", +"input":"<a a=\u000A>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=\\u000B>", +"input":"<a a=\u000B>", +"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]}, + +{"description":"<a a=\\u000C>", +"input":"<a a=\u000C>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=\\u000D>", +"input":"<a a=\u000D>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=\\u001F>", +"input":"<a a=\u001F>", +"output":["ParseError", ["StartTag", "a", {"a":"\u001F"}]]}, + +{"description":"<a a= >", +"input":"<a a= >", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=!>", +"input":"<a a=!>", +"output":[["StartTag", "a", {"a":"!"}]]}, + +{"description":"<a a=\"\">", +"input":"<a a=\"\">", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=\"\\u0000\">", +"input":"<a a=\"\u0000\">", +"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]}, + +{"description":"<a a=\"\\u0009\">", +"input":"<a a=\"\u0009\">", +"output":[["StartTag", "a", {"a":"\u0009"}]]}, + +{"description":"<a a=\"\\u000A\">", +"input":"<a a=\"\u000A\">", +"output":[["StartTag", "a", {"a":"\u000A"}]]}, + +{"description":"<a a=\"\\u000B\">", +"input":"<a a=\"\u000B\">", +"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]}, + +{"description":"<a a=\"\\u000C\">", +"input":"<a a=\"\u000C\">", +"output":[["StartTag", "a", {"a":"\u000C"}]]}, + +{"description":"<a a=\" \">", +"input":"<a a=\" \">", +"output":[["StartTag", "a", {"a":" "}]]}, + +{"description":"<a a=\"!\">", +"input":"<a a=\"!\">", +"output":[["StartTag", "a", {"a":"!"}]]}, + +{"description":"<a a=\"\">", +"input":"<a a=\"\">", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=\"#\">", +"input":"<a a=\"#\">", +"output":[["StartTag", "a", {"a":"#"}]]}, + +{"description":"<a a=\"%\">", +"input":"<a a=\"%\">", +"output":[["StartTag", "a", {"a":"%"}]]}, + +{"description":"<a a=\"&\">", +"input":"<a a=\"&\">", +"output":[["StartTag", "a", {"a":"&"}]]}, + +{"description":"<a a=\"'\">", +"input":"<a a=\"'\">", +"output":[["StartTag", "a", {"a":"'"}]]}, + +{"description":"<a a=\"-\">", +"input":"<a a=\"-\">", +"output":[["StartTag", "a", {"a":"-"}]]}, + +{"description":"<a a=\"/\">", +"input":"<a a=\"/\">", +"output":[["StartTag", "a", {"a":"/"}]]}, + +{"description":"<a a=\"0\">", +"input":"<a a=\"0\">", +"output":[["StartTag", "a", {"a":"0"}]]}, + +{"description":"<a a=\"1\">", +"input":"<a a=\"1\">", +"output":[["StartTag", "a", {"a":"1"}]]}, + +{"description":"<a a=\"9\">", +"input":"<a a=\"9\">", +"output":[["StartTag", "a", {"a":"9"}]]}, + +{"description":"<a a=\"<\">", +"input":"<a a=\"<\">", +"output":[["StartTag", "a", {"a":"<"}]]}, + +{"description":"<a a=\"=\">", +"input":"<a a=\"=\">", +"output":[["StartTag", "a", {"a":"="}]]}, + +{"description":"<a a=\">\">", +"input":"<a a=\">\">", +"output":[["StartTag", "a", {"a":">"}]]}, + +{"description":"<a a=\"?\">", +"input":"<a a=\"?\">", +"output":[["StartTag", "a", {"a":"?"}]]}, + +{"description":"<a a=\"@\">", +"input":"<a a=\"@\">", +"output":[["StartTag", "a", {"a":"@"}]]}, + +{"description":"<a a=\"A\">", +"input":"<a a=\"A\">", +"output":[["StartTag", "a", {"a":"A"}]]}, + +{"description":"<a a=\"B\">", +"input":"<a a=\"B\">", +"output":[["StartTag", "a", {"a":"B"}]]}, + +{"description":"<a a=\"Y\">", +"input":"<a a=\"Y\">", +"output":[["StartTag", "a", {"a":"Y"}]]}, + +{"description":"<a a=\"Z\">", +"input":"<a a=\"Z\">", +"output":[["StartTag", "a", {"a":"Z"}]]}, + +{"description":"<a a=\"`\">", +"input":"<a a=\"`\">", +"output":[["StartTag", "a", {"a":"`"}]]}, + +{"description":"<a a=\"a\">", +"input":"<a a=\"a\">", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=\"b\">", +"input":"<a a=\"b\">", +"output":[["StartTag", "a", {"a":"b"}]]}, + +{"description":"<a a=\"y\">", +"input":"<a a=\"y\">", +"output":[["StartTag", "a", {"a":"y"}]]}, + +{"description":"<a a=\"z\">", +"input":"<a a=\"z\">", +"output":[["StartTag", "a", {"a":"z"}]]}, + +{"description":"<a a=\"{\">", +"input":"<a a=\"{\">", +"output":[["StartTag", "a", {"a":"{"}]]}, + +{"description":"<a a=\"\\uDBC0\\uDC00\">", +"input":"<a a=\"\uDBC0\uDC00\">", +"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]}, + +{"description":"<a a=#>", +"input":"<a a=#>", +"output":[["StartTag", "a", {"a":"#"}]]}, + +{"description":"<a a=%>", +"input":"<a a=%>", +"output":[["StartTag", "a", {"a":"%"}]]}, + +{"description":"<a a=&>", +"input":"<a a=&>", +"output":[["StartTag", "a", {"a":"&"}]]}, + +{"description":"<a a=''>", +"input":"<a a=''>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a='\\u0000'>", +"input":"<a a='\u0000'>", +"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]}, + +{"description":"<a a='\\u0009'>", +"input":"<a a='\u0009'>", +"output":[["StartTag", "a", {"a":"\u0009"}]]}, + +{"description":"<a a='\\u000A'>", +"input":"<a a='\u000A'>", +"output":[["StartTag", "a", {"a":"\u000A"}]]}, + +{"description":"<a a='\\u000B'>", +"input":"<a a='\u000B'>", +"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]}, + +{"description":"<a a='\\u000C'>", +"input":"<a a='\u000C'>", +"output":[["StartTag", "a", {"a":"\u000C"}]]}, + +{"description":"<a a=' '>", +"input":"<a a=' '>", +"output":[["StartTag", "a", {"a":" "}]]}, + +{"description":"<a a='!'>", +"input":"<a a='!'>", +"output":[["StartTag", "a", {"a":"!"}]]}, + +{"description":"<a a='\"'>", +"input":"<a a='\"'>", +"output":[["StartTag", "a", {"a":"\""}]]}, + +{"description":"<a a='%'>", +"input":"<a a='%'>", +"output":[["StartTag", "a", {"a":"%"}]]}, + +{"description":"<a a='&'>", +"input":"<a a='&'>", +"output":[["StartTag", "a", {"a":"&"}]]}, + +{"description":"<a a=''>", +"input":"<a a=''>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''\\u0000>", +"input":"<a a=''\u0000>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\uFFFD":""}]]}, + +{"description":"<a a=''\\u0008>", +"input":"<a a=''\u0008>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u0008":""}]]}, + +{"description":"<a a=''\\u0009>", +"input":"<a a=''\u0009>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''\\u000A>", +"input":"<a a=''\u000A>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''\\u000B>", +"input":"<a a=''\u000B>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u000B":""}]]}, + +{"description":"<a a=''\\u000C>", +"input":"<a a=''\u000C>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''\\u000D>", +"input":"<a a=''\u000D>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''\\u001F>", +"input":"<a a=''\u001F>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u001F":""}]]}, + +{"description":"<a a='' >", +"input":"<a a='' >", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''!>", +"input":"<a a=''!>", +"output":["ParseError", ["StartTag", "a", {"a":"", "!":""}]]}, + +{"description":"<a a=''\">", +"input":"<a a=''\">", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\"":""}]]}, + +{"description":"<a a=''&>", +"input":"<a a=''&>", +"output":["ParseError", ["StartTag", "a", {"a":"", "&":""}]]}, + +{"description":"<a a='''>", +"input":"<a a='''>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "'":""}]]}, + +{"description":"<a a=''->", +"input":"<a a=''->", +"output":["ParseError", ["StartTag", "a", {"a":"", "-":""}]]}, + +{"description":"<a a=''.>", +"input":"<a a=''.>", +"output":["ParseError", ["StartTag", "a", {"a":"", ".":""}]]}, + +{"description":"<a a=''/>", +"input":"<a a=''/>", +"output":[["StartTag", "a", {"a":""}, true]]}, + +{"description":"<a a=''0>", +"input":"<a a=''0>", +"output":["ParseError", ["StartTag", "a", {"a":"", "0":""}]]}, + +{"description":"<a a=''1>", +"input":"<a a=''1>", +"output":["ParseError", ["StartTag", "a", {"a":"", "1":""}]]}, + +{"description":"<a a=''9>", +"input":"<a a=''9>", +"output":["ParseError", ["StartTag", "a", {"a":"", "9":""}]]}, + +{"description":"<a a=''<>", +"input":"<a a=''<>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "<":""}]]}, + +{"description":"<a a=''=>", +"input":"<a a=''=>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "=":""}]]}, + +{"description":"<a a=''>", +"input":"<a a=''>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''?>", +"input":"<a a=''?>", +"output":["ParseError", ["StartTag", "a", {"a":"", "?":""}]]}, + +{"description":"<a a=''@>", +"input":"<a a=''@>", +"output":["ParseError", ["StartTag", "a", {"a":"", "@":""}]]}, + +{"description":"<a a=''A>", +"input":"<a a=''A>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''B>", +"input":"<a a=''B>", +"output":["ParseError", ["StartTag", "a", {"a":"", "b":""}]]}, + +{"description":"<a a=''Y>", +"input":"<a a=''Y>", +"output":["ParseError", ["StartTag", "a", {"a":"", "y":""}]]}, + +{"description":"<a a=''Z>", +"input":"<a a=''Z>", +"output":["ParseError", ["StartTag", "a", {"a":"", "z":""}]]}, + +{"description":"<a a=''`>", +"input":"<a a=''`>", +"output":["ParseError", ["StartTag", "a", {"a":"", "`":""}]]}, + +{"description":"<a a=''a>", +"input":"<a a=''a>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=''b>", +"input":"<a a=''b>", +"output":["ParseError", ["StartTag", "a", {"a":"", "b":""}]]}, + +{"description":"<a a=''y>", +"input":"<a a=''y>", +"output":["ParseError", ["StartTag", "a", {"a":"", "y":""}]]}, + +{"description":"<a a=''z>", +"input":"<a a=''z>", +"output":["ParseError", ["StartTag", "a", {"a":"", "z":""}]]}, + +{"description":"<a a=''{>", +"input":"<a a=''{>", +"output":["ParseError", ["StartTag", "a", {"a":"", "{":""}]]}, + +{"description":"<a a=''\\uDBC0\\uDC00>", +"input":"<a a=''\uDBC0\uDC00>", +"output":["ParseError", ["StartTag", "a", {"a":"", "\uDBC0\uDC00":""}]]}, + +{"description":"<a a='('>", +"input":"<a a='('>", +"output":[["StartTag", "a", {"a":"("}]]}, + +{"description":"<a a='-'>", +"input":"<a a='-'>", +"output":[["StartTag", "a", {"a":"-"}]]}, + +{"description":"<a a='/'>", +"input":"<a a='/'>", +"output":[["StartTag", "a", {"a":"/"}]]}, + +{"description":"<a a='0'>", +"input":"<a a='0'>", +"output":[["StartTag", "a", {"a":"0"}]]}, + +{"description":"<a a='1'>", +"input":"<a a='1'>", +"output":[["StartTag", "a", {"a":"1"}]]}, + +{"description":"<a a='9'>", +"input":"<a a='9'>", +"output":[["StartTag", "a", {"a":"9"}]]}, + +{"description":"<a a='<'>", +"input":"<a a='<'>", +"output":[["StartTag", "a", {"a":"<"}]]}, + +{"description":"<a a='='>", +"input":"<a a='='>", +"output":[["StartTag", "a", {"a":"="}]]}, + +{"description":"<a a='>'>", +"input":"<a a='>'>", +"output":[["StartTag", "a", {"a":">"}]]}, + +{"description":"<a a='?'>", +"input":"<a a='?'>", +"output":[["StartTag", "a", {"a":"?"}]]}, + +{"description":"<a a='@'>", +"input":"<a a='@'>", +"output":[["StartTag", "a", {"a":"@"}]]}, + +{"description":"<a a='A'>", +"input":"<a a='A'>", +"output":[["StartTag", "a", {"a":"A"}]]}, + +{"description":"<a a='B'>", +"input":"<a a='B'>", +"output":[["StartTag", "a", {"a":"B"}]]}, + +{"description":"<a a='Y'>", +"input":"<a a='Y'>", +"output":[["StartTag", "a", {"a":"Y"}]]}, + +{"description":"<a a='Z'>", +"input":"<a a='Z'>", +"output":[["StartTag", "a", {"a":"Z"}]]}, + +{"description":"<a a='`'>", +"input":"<a a='`'>", +"output":[["StartTag", "a", {"a":"`"}]]}, + +{"description":"<a a='a'>", +"input":"<a a='a'>", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a='b'>", +"input":"<a a='b'>", +"output":[["StartTag", "a", {"a":"b"}]]}, + +{"description":"<a a='y'>", +"input":"<a a='y'>", +"output":[["StartTag", "a", {"a":"y"}]]}, + +{"description":"<a a='z'>", +"input":"<a a='z'>", +"output":[["StartTag", "a", {"a":"z"}]]}, + +{"description":"<a a='{'>", +"input":"<a a='{'>", +"output":[["StartTag", "a", {"a":"{"}]]}, + +{"description":"<a a='\\uDBC0\\uDC00'>", +"input":"<a a='\uDBC0\uDC00'>", +"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]}, + +{"description":"<a a=(>", +"input":"<a a=(>", +"output":[["StartTag", "a", {"a":"("}]]}, + +{"description":"<a a=->", +"input":"<a a=->", +"output":[["StartTag", "a", {"a":"-"}]]}, + +{"description":"<a a=/>", +"input":"<a a=/>", +"output":[["StartTag", "a", {"a":"/"}]]}, + +{"description":"<a a=0>", +"input":"<a a=0>", +"output":[["StartTag", "a", {"a":"0"}]]}, + +{"description":"<a a=1>", +"input":"<a a=1>", +"output":[["StartTag", "a", {"a":"1"}]]}, + +{"description":"<a a=9>", +"input":"<a a=9>", +"output":[["StartTag", "a", {"a":"9"}]]}, + +{"description":"<a a=<>", +"input":"<a a=<>", +"output":["ParseError", ["StartTag", "a", {"a":"<"}]]}, + +{"description":"<a a==>", +"input":"<a a==>", +"output":["ParseError", ["StartTag", "a", {"a":"="}]]}, + +{"description":"<a a=>", +"input":"<a a=>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a a=?>", +"input":"<a a=?>", +"output":[["StartTag", "a", {"a":"?"}]]}, + +{"description":"<a a=@>", +"input":"<a a=@>", +"output":[["StartTag", "a", {"a":"@"}]]}, + +{"description":"<a a=A>", +"input":"<a a=A>", +"output":[["StartTag", "a", {"a":"A"}]]}, + +{"description":"<a a=B>", +"input":"<a a=B>", +"output":[["StartTag", "a", {"a":"B"}]]}, + +{"description":"<a a=Y>", +"input":"<a a=Y>", +"output":[["StartTag", "a", {"a":"Y"}]]}, + +{"description":"<a a=Z>", +"input":"<a a=Z>", +"output":[["StartTag", "a", {"a":"Z"}]]}, + +{"description":"<a a=`>", +"input":"<a a=`>", +"output":["ParseError", ["StartTag", "a", {"a":"`"}]]}, + +{"description":"<a a=a>", +"input":"<a a=a>", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=a\\u0000>", +"input":"<a a=a\u0000>", +"output":["ParseError", ["StartTag", "a", {"a":"a\uFFFD"}]]}, + +{"description":"<a a=a\\u0008>", +"input":"<a a=a\u0008>", +"output":["ParseError", ["StartTag", "a", {"a":"a\u0008"}]]}, + +{"description":"<a a=a\\u0009>", +"input":"<a a=a\u0009>", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=a\\u000A>", +"input":"<a a=a\u000A>", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=a\\u000B>", +"input":"<a a=a\u000B>", +"output":["ParseError", ["StartTag", "a", {"a":"a\u000B"}]]}, + +{"description":"<a a=a\\u000C>", +"input":"<a a=a\u000C>", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=a\\u000D>", +"input":"<a a=a\u000D>", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=a\\u001F>", +"input":"<a a=a\u001F>", +"output":["ParseError", ["StartTag", "a", {"a":"a\u001F"}]]}, + +{"description":"<a a=a >", +"input":"<a a=a >", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=a!>", +"input":"<a a=a!>", +"output":[["StartTag", "a", {"a":"a!"}]]}, + +{"description":"<a a=a\">", +"input":"<a a=a\">", +"output":["ParseError", ["StartTag", "a", {"a":"a\""}]]}, + +{"description":"<a a=a#>", +"input":"<a a=a#>", +"output":[["StartTag", "a", {"a":"a#"}]]}, + +{"description":"<a a=a%>", +"input":"<a a=a%>", +"output":[["StartTag", "a", {"a":"a%"}]]}, + +{"description":"<a a=a&>", +"input":"<a a=a&>", +"output":[["StartTag", "a", {"a":"a&"}]]}, + +{"description":"<a a=a'>", +"input":"<a a=a'>", +"output":["ParseError", ["StartTag", "a", {"a":"a'"}]]}, + +{"description":"<a a=a(>", +"input":"<a a=a(>", +"output":[["StartTag", "a", {"a":"a("}]]}, + +{"description":"<a a=a->", +"input":"<a a=a->", +"output":[["StartTag", "a", {"a":"a-"}]]}, + +{"description":"<a a=a/>", +"input":"<a a=a/>", +"output":[["StartTag", "a", {"a":"a/"}]]}, + +{"description":"<a a=a0>", +"input":"<a a=a0>", +"output":[["StartTag", "a", {"a":"a0"}]]}, + +{"description":"<a a=a1>", +"input":"<a a=a1>", +"output":[["StartTag", "a", {"a":"a1"}]]}, + +{"description":"<a a=a9>", +"input":"<a a=a9>", +"output":[["StartTag", "a", {"a":"a9"}]]}, + +{"description":"<a a=a<>", +"input":"<a a=a<>", +"output":["ParseError", ["StartTag", "a", {"a":"a<"}]]}, + +{"description":"<a a=a=>", +"input":"<a a=a=>", +"output":["ParseError", ["StartTag", "a", {"a":"a="}]]}, + +{"description":"<a a=a>", +"input":"<a a=a>", +"output":[["StartTag", "a", {"a":"a"}]]}, + +{"description":"<a a=a?>", +"input":"<a a=a?>", +"output":[["StartTag", "a", {"a":"a?"}]]}, + +{"description":"<a a=a@>", +"input":"<a a=a@>", +"output":[["StartTag", "a", {"a":"a@"}]]}, + +{"description":"<a a=aA>", +"input":"<a a=aA>", +"output":[["StartTag", "a", {"a":"aA"}]]}, + +{"description":"<a a=aB>", +"input":"<a a=aB>", +"output":[["StartTag", "a", {"a":"aB"}]]}, + +{"description":"<a a=aY>", +"input":"<a a=aY>", +"output":[["StartTag", "a", {"a":"aY"}]]}, + +{"description":"<a a=aZ>", +"input":"<a a=aZ>", +"output":[["StartTag", "a", {"a":"aZ"}]]}, + +{"description":"<a a=a`>", +"input":"<a a=a`>", +"output":["ParseError", ["StartTag", "a", {"a":"a`"}]]}, + +{"description":"<a a=aa>", +"input":"<a a=aa>", +"output":[["StartTag", "a", {"a":"aa"}]]}, + +{"description":"<a a=ab>", +"input":"<a a=ab>", +"output":[["StartTag", "a", {"a":"ab"}]]}, + +{"description":"<a a=ay>", +"input":"<a a=ay>", +"output":[["StartTag", "a", {"a":"ay"}]]}, + +{"description":"<a a=az>", +"input":"<a a=az>", +"output":[["StartTag", "a", {"a":"az"}]]}, + +{"description":"<a a=a{>", +"input":"<a a=a{>", +"output":[["StartTag", "a", {"a":"a{"}]]}, + +{"description":"<a a=a\\uDBC0\\uDC00>", +"input":"<a a=a\uDBC0\uDC00>", +"output":[["StartTag", "a", {"a":"a\uDBC0\uDC00"}]]}, + +{"description":"<a a=b>", +"input":"<a a=b>", +"output":[["StartTag", "a", {"a":"b"}]]}, + +{"description":"<a a=y>", +"input":"<a a=y>", +"output":[["StartTag", "a", {"a":"y"}]]}, + +{"description":"<a a=z>", +"input":"<a a=z>", +"output":[["StartTag", "a", {"a":"z"}]]}, + +{"description":"<a a={>", +"input":"<a a={>", +"output":[["StartTag", "a", {"a":"{"}]]}, + +{"description":"<a a=\\uDBC0\\uDC00>", +"input":"<a a=\uDBC0\uDC00>", +"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]}, + +{"description":"<a a>", +"input":"<a a>", +"output":[["StartTag", "a", {"a":""}]]}, + +{"description":"<a a?>", +"input":"<a a?>", +"output":[["StartTag", "a", {"a?":""}]]}, + +{"description":"<a a@>", +"input":"<a a@>", +"output":[["StartTag", "a", {"a@":""}]]}, + +{"description":"<a aA>", +"input":"<a aA>", +"output":[["StartTag", "a", {"aa":""}]]}, + +{"description":"<a aB>", +"input":"<a aB>", +"output":[["StartTag", "a", {"ab":""}]]}, + +{"description":"<a aY>", +"input":"<a aY>", +"output":[["StartTag", "a", {"ay":""}]]}, + +{"description":"<a aZ>", +"input":"<a aZ>", +"output":[["StartTag", "a", {"az":""}]]}, + +{"description":"<a a[>", +"input":"<a a[>", +"output":[["StartTag", "a", {"a[":""}]]}, + +{"description":"<a a`>", +"input":"<a a`>", +"output":[["StartTag", "a", {"a`":""}]]}, + +{"description":"<a aa>", +"input":"<a aa>", +"output":[["StartTag", "a", {"aa":""}]]}, + +{"description":"<a ab>", +"input":"<a ab>", +"output":[["StartTag", "a", {"ab":""}]]}, + +{"description":"<a ay>", +"input":"<a ay>", +"output":[["StartTag", "a", {"ay":""}]]}, + +{"description":"<a az>", +"input":"<a az>", +"output":[["StartTag", "a", {"az":""}]]}, + +{"description":"<a a{>", +"input":"<a a{>", +"output":[["StartTag", "a", {"a{":""}]]}, + +{"description":"<a a\\uDBC0\\uDC00>", +"input":"<a a\uDBC0\uDC00>", +"output":[["StartTag", "a", {"a\uDBC0\uDC00":""}]]}, + +{"description":"<a b>", +"input":"<a b>", +"output":[["StartTag", "a", {"b":""}]]}, + +{"description":"<a y>", +"input":"<a y>", +"output":[["StartTag", "a", {"y":""}]]}, + +{"description":"<a z>", +"input":"<a z>", +"output":[["StartTag", "a", {"z":""}]]}, + +{"description":"<a {>", +"input":"<a {>", +"output":[["StartTag", "a", {"{":""}]]}, + +{"description":"<a \\uDBC0\\uDC00>", +"input":"<a \uDBC0\uDC00>", +"output":[["StartTag", "a", {"\uDBC0\uDC00":""}]]}, + +{"description":"<a!>", +"input":"<a!>", +"output":[["StartTag", "a!", {}]]}, + +{"description":"<a\">", +"input":"<a\">", +"output":[["StartTag", "a\"", {}]]}, + +{"description":"<a&>", +"input":"<a&>", +"output":[["StartTag", "a&", {}]]}, + +{"description":"<a'>", +"input":"<a'>", +"output":[["StartTag", "a'", {}]]}, + +{"description":"<a->", +"input":"<a->", +"output":[["StartTag", "a-", {}]]}, + +{"description":"<a.>", +"input":"<a.>", +"output":[["StartTag", "a.", {}]]}, + +{"description":"<a/>", +"input":"<a/>", +"output":[["StartTag", "a", {}, true]]}, + +{"description":"<a/\\u0000>", +"input":"<a/\u0000>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"\uFFFD":""}]]}, + +{"description":"<a/\\u0009>", +"input":"<a/\u0009>", +"output":["ParseError", ["StartTag", "a", {}]]}, + +{"description":"<a/\\u000A>", +"input":"<a/\u000A>", +"output":["ParseError", ["StartTag", "a", {}]]}, + +{"description":"<a/\\u000B>", +"input":"<a/\u000B>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"\u000B":""}]]}, + +{"description":"<a/\\u000C>", +"input":"<a/\u000C>", +"output":["ParseError", ["StartTag", "a", {}]]}, + +{"description":"<a/ >", +"input":"<a/ >", +"output":["ParseError", ["StartTag", "a", {}]]}, + +{"description":"<a/!>", +"input":"<a/!>", +"output":["ParseError", ["StartTag", "a", {"!":""}]]}, + +{"description":"<a/\">", +"input":"<a/\">", +"output":["ParseError", "ParseError", ["StartTag", "a", {"\"":""}]]}, + +{"description":"<a/&>", +"input":"<a/&>", +"output":["ParseError", ["StartTag", "a", {"&":""}]]}, + +{"description":"<a/'>", +"input":"<a/'>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"'":""}]]}, + +{"description":"<a/->", +"input":"<a/->", +"output":["ParseError", ["StartTag", "a", {"-":""}]]}, + +{"description":"<a//>", +"input":"<a//>", +"output":["ParseError", ["StartTag", "a", {}, true]]}, + +{"description":"<a/0>", +"input":"<a/0>", +"output":["ParseError", ["StartTag", "a", {"0":""}]]}, + +{"description":"<a/1>", +"input":"<a/1>", +"output":["ParseError", ["StartTag", "a", {"1":""}]]}, + +{"description":"<a/9>", +"input":"<a/9>", +"output":["ParseError", ["StartTag", "a", {"9":""}]]}, + +{"description":"<a/<>", +"input":"<a/<>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"<":""}]]}, + +{"description":"<a/=>", +"input":"<a/=>", +"output":["ParseError", "ParseError", ["StartTag", "a", {"=":""}]]}, + +{"description":"<a/>", +"input":"<a/>", +"output":[["StartTag", "a", {}, true]]}, + +{"description":"<a/?>", +"input":"<a/?>", +"output":["ParseError", ["StartTag", "a", {"?":""}]]}, + +{"description":"<a/@>", +"input":"<a/@>", +"output":["ParseError", ["StartTag", "a", {"@":""}]]}, + +{"description":"<a/A>", +"input":"<a/A>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a/B>", +"input":"<a/B>", +"output":["ParseError", ["StartTag", "a", {"b":""}]]}, + +{"description":"<a/Y>", +"input":"<a/Y>", +"output":["ParseError", ["StartTag", "a", {"y":""}]]}, + +{"description":"<a/Z>", +"input":"<a/Z>", +"output":["ParseError", ["StartTag", "a", {"z":""}]]}, + +{"description":"<a/`>", +"input":"<a/`>", +"output":["ParseError", ["StartTag", "a", {"`":""}]]}, + +{"description":"<a/a>", +"input":"<a/a>", +"output":["ParseError", ["StartTag", "a", {"a":""}]]}, + +{"description":"<a/b>", +"input":"<a/b>", +"output":["ParseError", ["StartTag", "a", {"b":""}]]}, + +{"description":"<a/y>", +"input":"<a/y>", +"output":["ParseError", ["StartTag", "a", {"y":""}]]}, + +{"description":"<a/z>", +"input":"<a/z>", +"output":["ParseError", ["StartTag", "a", {"z":""}]]}, + +{"description":"<a/{>", +"input":"<a/{>", +"output":["ParseError", ["StartTag", "a", {"{":""}]]}, + +{"description":"<a/\\uDBC0\\uDC00>", +"input":"<a/\uDBC0\uDC00>", +"output":["ParseError", ["StartTag", "a", {"\uDBC0\uDC00":""}]]}, + +{"description":"<a0>", +"input":"<a0>", +"output":[["StartTag", "a0", {}]]}, + +{"description":"<a1>", +"input":"<a1>", +"output":[["StartTag", "a1", {}]]}, + +{"description":"<a9>", +"input":"<a9>", +"output":[["StartTag", "a9", {}]]}, + +{"description":"<a<>", +"input":"<a<>", +"output":[["StartTag", "a<", {}]]}, + +{"description":"<a=>", +"input":"<a=>", +"output":[["StartTag", "a=", {}]]}, + +{"description":"<a>", +"input":"<a>", +"output":[["StartTag", "a", {}]]}, + +{"description":"<a?>", +"input":"<a?>", +"output":[["StartTag", "a?", {}]]}, + +{"description":"<a@>", +"input":"<a@>", +"output":[["StartTag", "a@", {}]]}, + +{"description":"<aA>", +"input":"<aA>", +"output":[["StartTag", "aa", {}]]}, + +{"description":"<aB>", +"input":"<aB>", +"output":[["StartTag", "ab", {}]]}, + +{"description":"<aY>", +"input":"<aY>", +"output":[["StartTag", "ay", {}]]}, + +{"description":"<aZ>", +"input":"<aZ>", +"output":[["StartTag", "az", {}]]}, + +{"description":"<a[>", +"input":"<a[>", +"output":[["StartTag", "a[", {}]]}, + +{"description":"<a`>", +"input":"<a`>", +"output":[["StartTag", "a`", {}]]}, + +{"description":"<aa>", +"input":"<aa>", +"output":[["StartTag", "aa", {}]]}, + +{"description":"<ab>", +"input":"<ab>", +"output":[["StartTag", "ab", {}]]}, + +{"description":"<ay>", +"input":"<ay>", +"output":[["StartTag", "ay", {}]]}, + +{"description":"<az>", +"input":"<az>", +"output":[["StartTag", "az", {}]]}, + +{"description":"<a{>", +"input":"<a{>", +"output":[["StartTag", "a{", {}]]}, + +{"description":"<a\\uDBC0\\uDC00>", +"input":"<a\uDBC0\uDC00>", +"output":[["StartTag", "a\uDBC0\uDC00", {}]]}, + +{"description":"<b>", +"input":"<b>", +"output":[["StartTag", "b", {}]]}, + +{"description":"<y>", +"input":"<y>", +"output":[["StartTag", "y", {}]]}, + +{"description":"<z>", +"input":"<z>", +"output":[["StartTag", "z", {}]]}, + +{"description":"<{", +"input":"<{", +"output":["ParseError", ["Character", "<{"]]}, + +{"description":"<\\uDBC0\\uDC00", +"input":"<\uDBC0\uDC00", +"output":["ParseError", ["Character", "<\uDBC0\uDC00"]]}, + +{"description":"=", +"input":"=", +"output":[["Character", "="]]}, + +{"description":">", +"input":">", +"output":[["Character", ">"]]}, + +{"description":"?", +"input":"?", +"output":[["Character", "?"]]}, + +{"description":"@", +"input":"@", +"output":[["Character", "@"]]}, + +{"description":"A", +"input":"A", +"output":[["Character", "A"]]}, + +{"description":"B", +"input":"B", +"output":[["Character", "B"]]}, + +{"description":"Y", +"input":"Y", +"output":[["Character", "Y"]]}, + +{"description":"Z", +"input":"Z", +"output":[["Character", "Z"]]}, + +{"description":"`", +"input":"`", +"output":[["Character", "`"]]}, + +{"description":"a", +"input":"a", +"output":[["Character", "a"]]}, + +{"description":"b", +"input":"b", +"output":[["Character", "b"]]}, + +{"description":"y", +"input":"y", +"output":[["Character", "y"]]}, + +{"description":"z", +"input":"z", +"output":[["Character", "z"]]}, + +{"description":"{", +"input":"{", +"output":[["Character", "{"]]}, + +{"description":"\\uDBC0\\uDC00", +"input":"\uDBC0\uDC00", +"output":[["Character", "\uDBC0\uDC00"]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test4.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test4.test new file mode 100644 index 000000000..4be94b0c7 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/test4.test @@ -0,0 +1,344 @@ +{"tests": [ + +{"description":"< in attribute name", +"input":"<z/0 <>", +"output":["ParseError", "ParseError", ["StartTag", "z", {"0": "", "<": ""}]]}, + +{"description":"< in attribute value", +"input":"<z x=<>", +"output":["ParseError", ["StartTag", "z", {"x": "<"}]]}, + +{"description":"= in unquoted attribute value", +"input":"<z z=z=z>", +"output":["ParseError", ["StartTag", "z", {"z": "z=z"}]]}, + +{"description":"= attribute", +"input":"<z =>", +"output":["ParseError", ["StartTag", "z", {"=": ""}]]}, + +{"description":"== attribute", +"input":"<z ==>", +"output":["ParseError", "ParseError", ["StartTag", "z", {"=": ""}]]}, + +{"description":"=== attribute", +"input":"<z ===>", +"output":["ParseError", "ParseError", ["StartTag", "z", {"=": "="}]]}, + +{"description":"==== attribute", +"input":"<z ====>", +"output":["ParseError", "ParseError", "ParseError", ["StartTag", "z", {"=": "=="}]]}, + +{"description":"\" after ampersand in double-quoted attribute value", +"input":"<z z=\"&\">", +"output":[["StartTag", "z", {"z": "&"}]]}, + +{"description":"' after ampersand in double-quoted attribute value", +"input":"<z z=\"&'\">", +"output":[["StartTag", "z", {"z": "&'"}]]}, + +{"description":"' after ampersand in single-quoted attribute value", +"input":"<z z='&'>", +"output":[["StartTag", "z", {"z": "&"}]]}, + +{"description":"\" after ampersand in single-quoted attribute value", +"input":"<z z='&\"'>", +"output":[["StartTag", "z", {"z": "&\""}]]}, + +{"description":"Text after bogus character reference", +"input":"<z z='&xlink_xmlns;'>bar<z>", +"output":[["StartTag","z",{"z":"&xlink_xmlns;"}],["Character","bar"],["StartTag","z",{}]]}, + +{"description":"Text after hex character reference", +"input":"<z z='  foo'>bar<z>", +"output":[["StartTag","z",{"z":" foo"}],["Character","bar"],["StartTag","z",{}]]}, + +{"description":"Attribute name starting with \"", +"input":"<foo \"='bar'>", +"output":["ParseError", ["StartTag", "foo", {"\"": "bar"}]]}, + +{"description":"Attribute name starting with '", +"input":"<foo '='bar'>", +"output":["ParseError", ["StartTag", "foo", {"'": "bar"}]]}, + +{"description":"Attribute name containing \"", +"input":"<foo a\"b='bar'>", +"output":["ParseError", ["StartTag", "foo", {"a\"b": "bar"}]]}, + +{"description":"Attribute name containing '", +"input":"<foo a'b='bar'>", +"output":["ParseError", ["StartTag", "foo", {"a'b": "bar"}]]}, + +{"description":"Unquoted attribute value containing '", +"input":"<foo a=b'c>", +"output":["ParseError", ["StartTag", "foo", {"a": "b'c"}]]}, + +{"description":"Unquoted attribute value containing \"", +"input":"<foo a=b\"c>", +"output":["ParseError", ["StartTag", "foo", {"a": "b\"c"}]]}, + +{"description":"Double-quoted attribute value not followed by whitespace", +"input":"<foo a=\"b\"c>", +"output":["ParseError", ["StartTag", "foo", {"a": "b", "c": ""}]]}, + +{"description":"Single-quoted attribute value not followed by whitespace", +"input":"<foo a='b'c>", +"output":["ParseError", ["StartTag", "foo", {"a": "b", "c": ""}]]}, + +{"description":"Quoted attribute followed by permitted /", +"input":"<br a='b'/>", +"output":[["StartTag","br",{"a":"b"},true]]}, + +{"description":"Quoted attribute followed by non-permitted /", +"input":"<bar a='b'/>", +"output":[["StartTag","bar",{"a":"b"},true]]}, + +{"description":"CR EOF after doctype name", +"input":"<!doctype html \r", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"CR EOF in tag name", +"input":"<z\r", +"output":["ParseError"]}, + +{"description":"Slash EOF in tag name", +"input":"<z/", +"output":["ParseError"]}, + +{"description":"Zero hex numeric entity", +"input":"�", +"output":["ParseError", "ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Zero decimal numeric entity", +"input":"�", +"output":["ParseError", "ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Zero-prefixed hex numeric entity", +"input":"A", +"output":[["Character", "A"]]}, + +{"description":"Zero-prefixed decimal numeric entity", +"input":"A", +"output":[["Character", "A"]]}, + +{"description":"Empty hex numeric entities", +"input":"&#x &#X ", +"output":["ParseError", ["Character", "&#x "], "ParseError", ["Character", "&#X "]]}, + +{"description":"Empty decimal numeric entities", +"input":"&# &#; ", +"output":["ParseError", ["Character", "&# "], "ParseError", ["Character", "&#; "]]}, + +{"description":"Non-BMP numeric entity", +"input":"𐀀", +"output":[["Character", "\uD800\uDC00"]]}, + +{"description":"Maximum non-BMP numeric entity", +"input":"", +"output":["ParseError", ["Character", "\uDBFF\uDFFF"]]}, + +{"description":"Above maximum numeric entity", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"32-bit hex numeric entity", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"33-bit hex numeric entity", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"33-bit decimal numeric entity", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"65-bit hex numeric entity", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"65-bit decimal numeric entity", +"input":"�", +"output":["ParseError", ["Character", "\uFFFD"]]}, + +{"description":"Surrogate code point edge cases", +"input":"퟿����", +"output":[["Character", "\uD7FF"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD\uE000"]]}, + +{"description":"Uppercase start tag name", +"input":"<X>", +"output":[["StartTag", "x", {}]]}, + +{"description":"Uppercase end tag name", +"input":"</X>", +"output":[["EndTag", "x"]]}, + +{"description":"Uppercase attribute name", +"input":"<x X>", +"output":[["StartTag", "x", { "x":"" }]]}, + +{"description":"Tag/attribute name case edge values", +"input":"<x@AZ[`az{ @AZ[`az{>", +"output":[["StartTag", "x@az[`az{", { "@az[`az{":"" }]]}, + +{"description":"Duplicate different-case attributes", +"input":"<x x=1 x=2 X=3>", +"output":["ParseError", "ParseError", ["StartTag", "x", { "x":"1" }]]}, + +{"description":"Uppercase close tag attributes", +"input":"</x X>", +"output":["ParseError", ["EndTag", "x"]]}, + +{"description":"Duplicate close tag attributes", +"input":"</x x x>", +"output":["ParseError", "ParseError", ["EndTag", "x"]]}, + +{"description":"Permitted slash", +"input":"<br/>", +"output":[["StartTag","br",{},true]]}, + +{"description":"Non-permitted slash", +"input":"<xr/>", +"output":[["StartTag","xr",{},true]]}, + +{"description":"Permitted slash but in close tag", +"input":"</br/>", +"output":["ParseError", ["EndTag", "br"]]}, + +{"description":"Doctype public case-sensitivity (1)", +"input":"<!DoCtYpE HtMl PuBlIc \"AbC\" \"XyZ\">", +"output":[["DOCTYPE", "html", "AbC", "XyZ", true]]}, + +{"description":"Doctype public case-sensitivity (2)", +"input":"<!dOcTyPe hTmL pUbLiC \"aBc\" \"xYz\">", +"output":[["DOCTYPE", "html", "aBc", "xYz", true]]}, + +{"description":"Doctype system case-sensitivity (1)", +"input":"<!DoCtYpE HtMl SyStEm \"XyZ\">", +"output":[["DOCTYPE", "html", null, "XyZ", true]]}, + +{"description":"Doctype system case-sensitivity (2)", +"input":"<!dOcTyPe hTmL sYsTeM \"xYz\">", +"output":[["DOCTYPE", "html", null, "xYz", true]]}, + +{"description":"U+0000 in lookahead region after non-matching character", +"input":"<!doc>\u0000", +"output":["ParseError", ["Comment", "doc"], "ParseError", ["Character", "\u0000"]], +"ignoreErrorOrder":true}, + +{"description":"U+0000 in lookahead region", +"input":"<!doc\u0000", +"output":["ParseError", ["Comment", "doc\uFFFD"]], +"ignoreErrorOrder":true}, + +{"description":"U+0080 in lookahead region", +"input":"<!doc\u0080", +"output":["ParseError", "ParseError", ["Comment", "doc\u0080"]], +"ignoreErrorOrder":true}, + +{"description":"U+FDD1 in lookahead region", +"input":"<!doc\uFDD1", +"output":["ParseError", "ParseError", ["Comment", "doc\uFDD1"]], +"ignoreErrorOrder":true}, + +{"description":"U+1FFFF in lookahead region", +"input":"<!doc\uD83F\uDFFF", +"output":["ParseError", "ParseError", ["Comment", "doc\uD83F\uDFFF"]], +"ignoreErrorOrder":true}, + +{"description":"CR followed by non-LF", +"input":"\r?", +"output":[["Character", "\n?"]]}, + +{"description":"CR at EOF", +"input":"\r", +"output":[["Character", "\n"]]}, + +{"description":"LF at EOF", +"input":"\n", +"output":[["Character", "\n"]]}, + +{"description":"CR LF", +"input":"\r\n", +"output":[["Character", "\n"]]}, + +{"description":"CR CR", +"input":"\r\r", +"output":[["Character", "\n\n"]]}, + +{"description":"LF LF", +"input":"\n\n", +"output":[["Character", "\n\n"]]}, + +{"description":"LF CR", +"input":"\n\r", +"output":[["Character", "\n\n"]]}, + +{"description":"text CR CR CR text", +"input":"text\r\r\rtext", +"output":[["Character", "text\n\n\ntext"]]}, + +{"description":"Doctype publik", +"input":"<!DOCTYPE html PUBLIK \"AbC\" \"XyZ\">", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"Doctype publi", +"input":"<!DOCTYPE html PUBLI", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"Doctype sistem", +"input":"<!DOCTYPE html SISTEM \"AbC\">", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"Doctype sys", +"input":"<!DOCTYPE html SYS", +"output":["ParseError", ["DOCTYPE", "html", null, null, false]]}, + +{"description":"Doctype html x>text", +"input":"<!DOCTYPE html x>text", +"output":["ParseError", ["DOCTYPE", "html", null, null, false], ["Character", "text"]]}, + +{"description":"Grave accent in unquoted attribute", +"input":"<a a=aa`>", +"output":["ParseError", ["StartTag", "a", {"a":"aa`"}]]}, + +{"description":"EOF in tag name state ", +"input":"<a", +"output":["ParseError"]}, + +{"description":"EOF in tag name state", +"input":"<a", +"output":["ParseError"]}, + +{"description":"EOF in before attribute name state", +"input":"<a ", +"output":["ParseError"]}, + +{"description":"EOF in attribute name state", +"input":"<a a", +"output":["ParseError"]}, + +{"description":"EOF in after attribute name state", +"input":"<a a ", +"output":["ParseError"]}, + +{"description":"EOF in before attribute value state", +"input":"<a a =", +"output":["ParseError"]}, + +{"description":"EOF in attribute value (double quoted) state", +"input":"<a a =\"a", +"output":["ParseError"]}, + +{"description":"EOF in attribute value (single quoted) state", +"input":"<a a ='a", +"output":["ParseError"]}, + +{"description":"EOF in attribute value (unquoted) state", +"input":"<a a =a", +"output":["ParseError"]}, + +{"description":"EOF in after attribute value state", +"input":"<a a ='a'", +"output":["ParseError"]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/unicodeChars.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/unicodeChars.test new file mode 100644 index 000000000..c7786682c --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/unicodeChars.test @@ -0,0 +1,1295 @@ +{"tests": [ + +{"description": "Invalid Unicode character U+0001", +"input": "\u0001", +"output": ["ParseError", ["Character", "\u0001"]]}, + +{"description": "Invalid Unicode character U+0002", +"input": "\u0002", +"output": ["ParseError", ["Character", "\u0002"]]}, + +{"description": "Invalid Unicode character U+0003", +"input": "\u0003", +"output": ["ParseError", ["Character", "\u0003"]]}, + +{"description": "Invalid Unicode character U+0004", +"input": "\u0004", +"output": ["ParseError", ["Character", "\u0004"]]}, + +{"description": "Invalid Unicode character U+0005", +"input": "\u0005", +"output": ["ParseError", ["Character", "\u0005"]]}, + +{"description": "Invalid Unicode character U+0006", +"input": "\u0006", +"output": ["ParseError", ["Character", "\u0006"]]}, + +{"description": "Invalid Unicode character U+0007", +"input": "\u0007", +"output": ["ParseError", ["Character", "\u0007"]]}, + +{"description": "Invalid Unicode character U+0008", +"input": "\u0008", +"output": ["ParseError", ["Character", "\u0008"]]}, + +{"description": "Invalid Unicode character U+000B", +"input": "\u000B", +"output": ["ParseError", ["Character", "\u000B"]]}, + +{"description": "Invalid Unicode character U+000E", +"input": "\u000E", +"output": ["ParseError", ["Character", "\u000E"]]}, + +{"description": "Invalid Unicode character U+000F", +"input": "\u000F", +"output": ["ParseError", ["Character", "\u000F"]]}, + +{"description": "Invalid Unicode character U+0010", +"input": "\u0010", +"output": ["ParseError", ["Character", "\u0010"]]}, + +{"description": "Invalid Unicode character U+0011", +"input": "\u0011", +"output": ["ParseError", ["Character", "\u0011"]]}, + +{"description": "Invalid Unicode character U+0012", +"input": "\u0012", +"output": ["ParseError", ["Character", "\u0012"]]}, + +{"description": "Invalid Unicode character U+0013", +"input": "\u0013", +"output": ["ParseError", ["Character", "\u0013"]]}, + +{"description": "Invalid Unicode character U+0014", +"input": "\u0014", +"output": ["ParseError", ["Character", "\u0014"]]}, + +{"description": "Invalid Unicode character U+0015", +"input": "\u0015", +"output": ["ParseError", ["Character", "\u0015"]]}, + +{"description": "Invalid Unicode character U+0016", +"input": "\u0016", +"output": ["ParseError", ["Character", "\u0016"]]}, + +{"description": "Invalid Unicode character U+0017", +"input": "\u0017", +"output": ["ParseError", ["Character", "\u0017"]]}, + +{"description": "Invalid Unicode character U+0018", +"input": "\u0018", +"output": ["ParseError", ["Character", "\u0018"]]}, + +{"description": "Invalid Unicode character U+0019", +"input": "\u0019", +"output": ["ParseError", ["Character", "\u0019"]]}, + +{"description": "Invalid Unicode character U+001A", +"input": "\u001A", +"output": ["ParseError", ["Character", "\u001A"]]}, + +{"description": "Invalid Unicode character U+001B", +"input": "\u001B", +"output": ["ParseError", ["Character", "\u001B"]]}, + +{"description": "Invalid Unicode character U+001C", +"input": "\u001C", +"output": ["ParseError", ["Character", "\u001C"]]}, + +{"description": "Invalid Unicode character U+001D", +"input": "\u001D", +"output": ["ParseError", ["Character", "\u001D"]]}, + +{"description": "Invalid Unicode character U+001E", +"input": "\u001E", +"output": ["ParseError", ["Character", "\u001E"]]}, + +{"description": "Invalid Unicode character U+001F", +"input": "\u001F", +"output": ["ParseError", ["Character", "\u001F"]]}, + +{"description": "Invalid Unicode character U+007F", +"input": "\u007F", +"output": ["ParseError", ["Character", "\u007F"]]}, + +{"description": "Invalid Unicode character U+FDD0", +"input": "\uFDD0", +"output": ["ParseError", ["Character", "\uFDD0"]]}, + +{"description": "Invalid Unicode character U+FDD1", +"input": "\uFDD1", +"output": ["ParseError", ["Character", "\uFDD1"]]}, + +{"description": "Invalid Unicode character U+FDD2", +"input": "\uFDD2", +"output": ["ParseError", ["Character", "\uFDD2"]]}, + +{"description": "Invalid Unicode character U+FDD3", +"input": "\uFDD3", +"output": ["ParseError", ["Character", "\uFDD3"]]}, + +{"description": "Invalid Unicode character U+FDD4", +"input": "\uFDD4", +"output": ["ParseError", ["Character", "\uFDD4"]]}, + +{"description": "Invalid Unicode character U+FDD5", +"input": "\uFDD5", +"output": ["ParseError", ["Character", "\uFDD5"]]}, + +{"description": "Invalid Unicode character U+FDD6", +"input": "\uFDD6", +"output": ["ParseError", ["Character", "\uFDD6"]]}, + +{"description": "Invalid Unicode character U+FDD7", +"input": "\uFDD7", +"output": ["ParseError", ["Character", "\uFDD7"]]}, + +{"description": "Invalid Unicode character U+FDD8", +"input": "\uFDD8", +"output": ["ParseError", ["Character", "\uFDD8"]]}, + +{"description": "Invalid Unicode character U+FDD9", +"input": "\uFDD9", +"output": ["ParseError", ["Character", "\uFDD9"]]}, + +{"description": "Invalid Unicode character U+FDDA", +"input": "\uFDDA", +"output": ["ParseError", ["Character", "\uFDDA"]]}, + +{"description": "Invalid Unicode character U+FDDB", +"input": "\uFDDB", +"output": ["ParseError", ["Character", "\uFDDB"]]}, + +{"description": "Invalid Unicode character U+FDDC", +"input": "\uFDDC", +"output": ["ParseError", ["Character", "\uFDDC"]]}, + +{"description": "Invalid Unicode character U+FDDD", +"input": "\uFDDD", +"output": ["ParseError", ["Character", "\uFDDD"]]}, + +{"description": "Invalid Unicode character U+FDDE", +"input": "\uFDDE", +"output": ["ParseError", ["Character", "\uFDDE"]]}, + +{"description": "Invalid Unicode character U+FDDF", +"input": "\uFDDF", +"output": ["ParseError", ["Character", "\uFDDF"]]}, + +{"description": "Invalid Unicode character U+FDE0", +"input": "\uFDE0", +"output": ["ParseError", ["Character", "\uFDE0"]]}, + +{"description": "Invalid Unicode character U+FDE1", +"input": "\uFDE1", +"output": ["ParseError", ["Character", "\uFDE1"]]}, + +{"description": "Invalid Unicode character U+FDE2", +"input": "\uFDE2", +"output": ["ParseError", ["Character", "\uFDE2"]]}, + +{"description": "Invalid Unicode character U+FDE3", +"input": "\uFDE3", +"output": ["ParseError", ["Character", "\uFDE3"]]}, + +{"description": "Invalid Unicode character U+FDE4", +"input": "\uFDE4", +"output": ["ParseError", ["Character", "\uFDE4"]]}, + +{"description": "Invalid Unicode character U+FDE5", +"input": "\uFDE5", +"output": ["ParseError", ["Character", "\uFDE5"]]}, + +{"description": "Invalid Unicode character U+FDE6", +"input": "\uFDE6", +"output": ["ParseError", ["Character", "\uFDE6"]]}, + +{"description": "Invalid Unicode character U+FDE7", +"input": "\uFDE7", +"output": ["ParseError", ["Character", "\uFDE7"]]}, + +{"description": "Invalid Unicode character U+FDE8", +"input": "\uFDE8", +"output": ["ParseError", ["Character", "\uFDE8"]]}, + +{"description": "Invalid Unicode character U+FDE9", +"input": "\uFDE9", +"output": ["ParseError", ["Character", "\uFDE9"]]}, + +{"description": "Invalid Unicode character U+FDEA", +"input": "\uFDEA", +"output": ["ParseError", ["Character", "\uFDEA"]]}, + +{"description": "Invalid Unicode character U+FDEB", +"input": "\uFDEB", +"output": ["ParseError", ["Character", "\uFDEB"]]}, + +{"description": "Invalid Unicode character U+FDEC", +"input": "\uFDEC", +"output": ["ParseError", ["Character", "\uFDEC"]]}, + +{"description": "Invalid Unicode character U+FDED", +"input": "\uFDED", +"output": ["ParseError", ["Character", "\uFDED"]]}, + +{"description": "Invalid Unicode character U+FDEE", +"input": "\uFDEE", +"output": ["ParseError", ["Character", "\uFDEE"]]}, + +{"description": "Invalid Unicode character U+FDEF", +"input": "\uFDEF", +"output": ["ParseError", ["Character", "\uFDEF"]]}, + +{"description": "Invalid Unicode character U+FFFE", +"input": "\uFFFE", +"output": ["ParseError", ["Character", "\uFFFE"]]}, + +{"description": "Invalid Unicode character U+FFFF", +"input": "\uFFFF", +"output": ["ParseError", ["Character", "\uFFFF"]]}, + +{"description": "Invalid Unicode character U+1FFFE", +"input": "\uD83F\uDFFE", +"output": ["ParseError", ["Character", "\uD83F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+1FFFF", +"input": "\uD83F\uDFFF", +"output": ["ParseError", ["Character", "\uD83F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+2FFFE", +"input": "\uD87F\uDFFE", +"output": ["ParseError", ["Character", "\uD87F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+2FFFF", +"input": "\uD87F\uDFFF", +"output": ["ParseError", ["Character", "\uD87F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+3FFFE", +"input": "\uD8BF\uDFFE", +"output": ["ParseError", ["Character", "\uD8BF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+3FFFF", +"input": "\uD8BF\uDFFF", +"output": ["ParseError", ["Character", "\uD8BF\uDFFF"]]}, + +{"description": "Invalid Unicode character U+4FFFE", +"input": "\uD8FF\uDFFE", +"output": ["ParseError", ["Character", "\uD8FF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+4FFFF", +"input": "\uD8FF\uDFFF", +"output": ["ParseError", ["Character", "\uD8FF\uDFFF"]]}, + +{"description": "Invalid Unicode character U+5FFFE", +"input": "\uD93F\uDFFE", +"output": ["ParseError", ["Character", "\uD93F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+5FFFF", +"input": "\uD93F\uDFFF", +"output": ["ParseError", ["Character", "\uD93F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+6FFFE", +"input": "\uD97F\uDFFE", +"output": ["ParseError", ["Character", "\uD97F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+6FFFF", +"input": "\uD97F\uDFFF", +"output": ["ParseError", ["Character", "\uD97F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+7FFFE", +"input": "\uD9BF\uDFFE", +"output": ["ParseError", ["Character", "\uD9BF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+7FFFF", +"input": "\uD9BF\uDFFF", +"output": ["ParseError", ["Character", "\uD9BF\uDFFF"]]}, + +{"description": "Invalid Unicode character U+8FFFE", +"input": "\uD9FF\uDFFE", +"output": ["ParseError", ["Character", "\uD9FF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+8FFFF", +"input": "\uD9FF\uDFFF", +"output": ["ParseError", ["Character", "\uD9FF\uDFFF"]]}, + +{"description": "Invalid Unicode character U+9FFFE", +"input": "\uDA3F\uDFFE", +"output": ["ParseError", ["Character", "\uDA3F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+9FFFF", +"input": "\uDA3F\uDFFF", +"output": ["ParseError", ["Character", "\uDA3F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+AFFFE", +"input": "\uDA7F\uDFFE", +"output": ["ParseError", ["Character", "\uDA7F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+AFFFF", +"input": "\uDA7F\uDFFF", +"output": ["ParseError", ["Character", "\uDA7F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+BFFFE", +"input": "\uDABF\uDFFE", +"output": ["ParseError", ["Character", "\uDABF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+BFFFF", +"input": "\uDABF\uDFFF", +"output": ["ParseError", ["Character", "\uDABF\uDFFF"]]}, + +{"description": "Invalid Unicode character U+CFFFE", +"input": "\uDAFF\uDFFE", +"output": ["ParseError", ["Character", "\uDAFF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+CFFFF", +"input": "\uDAFF\uDFFF", +"output": ["ParseError", ["Character", "\uDAFF\uDFFF"]]}, + +{"description": "Invalid Unicode character U+DFFFE", +"input": "\uDB3F\uDFFE", +"output": ["ParseError", ["Character", "\uDB3F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+DFFFF", +"input": "\uDB3F\uDFFF", +"output": ["ParseError", ["Character", "\uDB3F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+EFFFE", +"input": "\uDB7F\uDFFE", +"output": ["ParseError", ["Character", "\uDB7F\uDFFE"]]}, + +{"description": "Invalid Unicode character U+EFFFF", +"input": "\uDB7F\uDFFF", +"output": ["ParseError", ["Character", "\uDB7F\uDFFF"]]}, + +{"description": "Invalid Unicode character U+FFFFE", +"input": "\uDBBF\uDFFE", +"output": ["ParseError", ["Character", "\uDBBF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+FFFFF", +"input": "\uDBBF\uDFFF", +"output": ["ParseError", ["Character", "\uDBBF\uDFFF"]]}, + +{"description": "Invalid Unicode character U+10FFFE", +"input": "\uDBFF\uDFFE", +"output": ["ParseError", ["Character", "\uDBFF\uDFFE"]]}, + +{"description": "Invalid Unicode character U+10FFFF", +"input": "\uDBFF\uDFFF", +"output": ["ParseError", ["Character", "\uDBFF\uDFFF"]]}, + +{"description": "Valid Unicode character U+0009", +"input": "\u0009", +"output": [["Character", "\u0009"]]}, + +{"description": "Valid Unicode character U+000A", +"input": "\u000A", +"output": [["Character", "\u000A"]]}, + +{"description": "Valid Unicode character U+0020", +"input": "\u0020", +"output": [["Character", "\u0020"]]}, + +{"description": "Valid Unicode character U+0021", +"input": "\u0021", +"output": [["Character", "\u0021"]]}, + +{"description": "Valid Unicode character U+0022", +"input": "\u0022", +"output": [["Character", "\u0022"]]}, + +{"description": "Valid Unicode character U+0023", +"input": "\u0023", +"output": [["Character", "\u0023"]]}, + +{"description": "Valid Unicode character U+0024", +"input": "\u0024", +"output": [["Character", "\u0024"]]}, + +{"description": "Valid Unicode character U+0025", +"input": "\u0025", +"output": [["Character", "\u0025"]]}, + +{"description": "Valid Unicode character U+0026", +"input": "\u0026", +"output": [["Character", "\u0026"]]}, + +{"description": "Valid Unicode character U+0027", +"input": "\u0027", +"output": [["Character", "\u0027"]]}, + +{"description": "Valid Unicode character U+0028", +"input": "\u0028", +"output": [["Character", "\u0028"]]}, + +{"description": "Valid Unicode character U+0029", +"input": "\u0029", +"output": [["Character", "\u0029"]]}, + +{"description": "Valid Unicode character U+002A", +"input": "\u002A", +"output": [["Character", "\u002A"]]}, + +{"description": "Valid Unicode character U+002B", +"input": "\u002B", +"output": [["Character", "\u002B"]]}, + +{"description": "Valid Unicode character U+002C", +"input": "\u002C", +"output": [["Character", "\u002C"]]}, + +{"description": "Valid Unicode character U+002D", +"input": "\u002D", +"output": [["Character", "\u002D"]]}, + +{"description": "Valid Unicode character U+002E", +"input": "\u002E", +"output": [["Character", "\u002E"]]}, + +{"description": "Valid Unicode character U+002F", +"input": "\u002F", +"output": [["Character", "\u002F"]]}, + +{"description": "Valid Unicode character U+0030", +"input": "\u0030", +"output": [["Character", "\u0030"]]}, + +{"description": "Valid Unicode character U+0031", +"input": "\u0031", +"output": [["Character", "\u0031"]]}, + +{"description": "Valid Unicode character U+0032", +"input": "\u0032", +"output": [["Character", "\u0032"]]}, + +{"description": "Valid Unicode character U+0033", +"input": "\u0033", +"output": [["Character", "\u0033"]]}, + +{"description": "Valid Unicode character U+0034", +"input": "\u0034", +"output": [["Character", "\u0034"]]}, + +{"description": "Valid Unicode character U+0035", +"input": "\u0035", +"output": [["Character", "\u0035"]]}, + +{"description": "Valid Unicode character U+0036", +"input": "\u0036", +"output": [["Character", "\u0036"]]}, + +{"description": "Valid Unicode character U+0037", +"input": "\u0037", +"output": [["Character", "\u0037"]]}, + +{"description": "Valid Unicode character U+0038", +"input": "\u0038", +"output": [["Character", "\u0038"]]}, + +{"description": "Valid Unicode character U+0039", +"input": "\u0039", +"output": [["Character", "\u0039"]]}, + +{"description": "Valid Unicode character U+003A", +"input": "\u003A", +"output": [["Character", "\u003A"]]}, + +{"description": "Valid Unicode character U+003B", +"input": "\u003B", +"output": [["Character", "\u003B"]]}, + +{"description": "Valid Unicode character U+003D", +"input": "\u003D", +"output": [["Character", "\u003D"]]}, + +{"description": "Valid Unicode character U+003E", +"input": "\u003E", +"output": [["Character", "\u003E"]]}, + +{"description": "Valid Unicode character U+003F", +"input": "\u003F", +"output": [["Character", "\u003F"]]}, + +{"description": "Valid Unicode character U+0040", +"input": "\u0040", +"output": [["Character", "\u0040"]]}, + +{"description": "Valid Unicode character U+0041", +"input": "\u0041", +"output": [["Character", "\u0041"]]}, + +{"description": "Valid Unicode character U+0042", +"input": "\u0042", +"output": [["Character", "\u0042"]]}, + +{"description": "Valid Unicode character U+0043", +"input": "\u0043", +"output": [["Character", "\u0043"]]}, + +{"description": "Valid Unicode character U+0044", +"input": "\u0044", +"output": [["Character", "\u0044"]]}, + +{"description": "Valid Unicode character U+0045", +"input": "\u0045", +"output": [["Character", "\u0045"]]}, + +{"description": "Valid Unicode character U+0046", +"input": "\u0046", +"output": [["Character", "\u0046"]]}, + +{"description": "Valid Unicode character U+0047", +"input": "\u0047", +"output": [["Character", "\u0047"]]}, + +{"description": "Valid Unicode character U+0048", +"input": "\u0048", +"output": [["Character", "\u0048"]]}, + +{"description": "Valid Unicode character U+0049", +"input": "\u0049", +"output": [["Character", "\u0049"]]}, + +{"description": "Valid Unicode character U+004A", +"input": "\u004A", +"output": [["Character", "\u004A"]]}, + +{"description": "Valid Unicode character U+004B", +"input": "\u004B", +"output": [["Character", "\u004B"]]}, + +{"description": "Valid Unicode character U+004C", +"input": "\u004C", +"output": [["Character", "\u004C"]]}, + +{"description": "Valid Unicode character U+004D", +"input": "\u004D", +"output": [["Character", "\u004D"]]}, + +{"description": "Valid Unicode character U+004E", +"input": "\u004E", +"output": [["Character", "\u004E"]]}, + +{"description": "Valid Unicode character U+004F", +"input": "\u004F", +"output": [["Character", "\u004F"]]}, + +{"description": "Valid Unicode character U+0050", +"input": "\u0050", +"output": [["Character", "\u0050"]]}, + +{"description": "Valid Unicode character U+0051", +"input": "\u0051", +"output": [["Character", "\u0051"]]}, + +{"description": "Valid Unicode character U+0052", +"input": "\u0052", +"output": [["Character", "\u0052"]]}, + +{"description": "Valid Unicode character U+0053", +"input": "\u0053", +"output": [["Character", "\u0053"]]}, + +{"description": "Valid Unicode character U+0054", +"input": "\u0054", +"output": [["Character", "\u0054"]]}, + +{"description": "Valid Unicode character U+0055", +"input": "\u0055", +"output": [["Character", "\u0055"]]}, + +{"description": "Valid Unicode character U+0056", +"input": "\u0056", +"output": [["Character", "\u0056"]]}, + +{"description": "Valid Unicode character U+0057", +"input": "\u0057", +"output": [["Character", "\u0057"]]}, + +{"description": "Valid Unicode character U+0058", +"input": "\u0058", +"output": [["Character", "\u0058"]]}, + +{"description": "Valid Unicode character U+0059", +"input": "\u0059", +"output": [["Character", "\u0059"]]}, + +{"description": "Valid Unicode character U+005A", +"input": "\u005A", +"output": [["Character", "\u005A"]]}, + +{"description": "Valid Unicode character U+005B", +"input": "\u005B", +"output": [["Character", "\u005B"]]}, + +{"description": "Valid Unicode character U+005C", +"input": "\u005C", +"output": [["Character", "\u005C"]]}, + +{"description": "Valid Unicode character U+005D", +"input": "\u005D", +"output": [["Character", "\u005D"]]}, + +{"description": "Valid Unicode character U+005E", +"input": "\u005E", +"output": [["Character", "\u005E"]]}, + +{"description": "Valid Unicode character U+005F", +"input": "\u005F", +"output": [["Character", "\u005F"]]}, + +{"description": "Valid Unicode character U+0060", +"input": "\u0060", +"output": [["Character", "\u0060"]]}, + +{"description": "Valid Unicode character U+0061", +"input": "\u0061", +"output": [["Character", "\u0061"]]}, + +{"description": "Valid Unicode character U+0062", +"input": "\u0062", +"output": [["Character", "\u0062"]]}, + +{"description": "Valid Unicode character U+0063", +"input": "\u0063", +"output": [["Character", "\u0063"]]}, + +{"description": "Valid Unicode character U+0064", +"input": "\u0064", +"output": [["Character", "\u0064"]]}, + +{"description": "Valid Unicode character U+0065", +"input": "\u0065", +"output": [["Character", "\u0065"]]}, + +{"description": "Valid Unicode character U+0066", +"input": "\u0066", +"output": [["Character", "\u0066"]]}, + +{"description": "Valid Unicode character U+0067", +"input": "\u0067", +"output": [["Character", "\u0067"]]}, + +{"description": "Valid Unicode character U+0068", +"input": "\u0068", +"output": [["Character", "\u0068"]]}, + +{"description": "Valid Unicode character U+0069", +"input": "\u0069", +"output": [["Character", "\u0069"]]}, + +{"description": "Valid Unicode character U+006A", +"input": "\u006A", +"output": [["Character", "\u006A"]]}, + +{"description": "Valid Unicode character U+006B", +"input": "\u006B", +"output": [["Character", "\u006B"]]}, + +{"description": "Valid Unicode character U+006C", +"input": "\u006C", +"output": [["Character", "\u006C"]]}, + +{"description": "Valid Unicode character U+006D", +"input": "\u006D", +"output": [["Character", "\u006D"]]}, + +{"description": "Valid Unicode character U+006E", +"input": "\u006E", +"output": [["Character", "\u006E"]]}, + +{"description": "Valid Unicode character U+006F", +"input": "\u006F", +"output": [["Character", "\u006F"]]}, + +{"description": "Valid Unicode character U+0070", +"input": "\u0070", +"output": [["Character", "\u0070"]]}, + +{"description": "Valid Unicode character U+0071", +"input": "\u0071", +"output": [["Character", "\u0071"]]}, + +{"description": "Valid Unicode character U+0072", +"input": "\u0072", +"output": [["Character", "\u0072"]]}, + +{"description": "Valid Unicode character U+0073", +"input": "\u0073", +"output": [["Character", "\u0073"]]}, + +{"description": "Valid Unicode character U+0074", +"input": "\u0074", +"output": [["Character", "\u0074"]]}, + +{"description": "Valid Unicode character U+0075", +"input": "\u0075", +"output": [["Character", "\u0075"]]}, + +{"description": "Valid Unicode character U+0076", +"input": "\u0076", +"output": [["Character", "\u0076"]]}, + +{"description": "Valid Unicode character U+0077", +"input": "\u0077", +"output": [["Character", "\u0077"]]}, + +{"description": "Valid Unicode character U+0078", +"input": "\u0078", +"output": [["Character", "\u0078"]]}, + +{"description": "Valid Unicode character U+0079", +"input": "\u0079", +"output": [["Character", "\u0079"]]}, + +{"description": "Valid Unicode character U+007A", +"input": "\u007A", +"output": [["Character", "\u007A"]]}, + +{"description": "Valid Unicode character U+007B", +"input": "\u007B", +"output": [["Character", "\u007B"]]}, + +{"description": "Valid Unicode character U+007C", +"input": "\u007C", +"output": [["Character", "\u007C"]]}, + +{"description": "Valid Unicode character U+007D", +"input": "\u007D", +"output": [["Character", "\u007D"]]}, + +{"description": "Valid Unicode character U+007E", +"input": "\u007E", +"output": [["Character", "\u007E"]]}, + +{"description": "Valid Unicode character U+00A0", +"input": "\u00A0", +"output": [["Character", "\u00A0"]]}, + +{"description": "Valid Unicode character U+00A1", +"input": "\u00A1", +"output": [["Character", "\u00A1"]]}, + +{"description": "Valid Unicode character U+00A2", +"input": "\u00A2", +"output": [["Character", "\u00A2"]]}, + +{"description": "Valid Unicode character U+00A3", +"input": "\u00A3", +"output": [["Character", "\u00A3"]]}, + +{"description": "Valid Unicode character U+00A4", +"input": "\u00A4", +"output": [["Character", "\u00A4"]]}, + +{"description": "Valid Unicode character U+00A5", +"input": "\u00A5", +"output": [["Character", "\u00A5"]]}, + +{"description": "Valid Unicode character U+00A6", +"input": "\u00A6", +"output": [["Character", "\u00A6"]]}, + +{"description": "Valid Unicode character U+00A7", +"input": "\u00A7", +"output": [["Character", "\u00A7"]]}, + +{"description": "Valid Unicode character U+00A8", +"input": "\u00A8", +"output": [["Character", "\u00A8"]]}, + +{"description": "Valid Unicode character U+00A9", +"input": "\u00A9", +"output": [["Character", "\u00A9"]]}, + +{"description": "Valid Unicode character U+00AA", +"input": "\u00AA", +"output": [["Character", "\u00AA"]]}, + +{"description": "Valid Unicode character U+00AB", +"input": "\u00AB", +"output": [["Character", "\u00AB"]]}, + +{"description": "Valid Unicode character U+00AC", +"input": "\u00AC", +"output": [["Character", "\u00AC"]]}, + +{"description": "Valid Unicode character U+00AD", +"input": "\u00AD", +"output": [["Character", "\u00AD"]]}, + +{"description": "Valid Unicode character U+00AE", +"input": "\u00AE", +"output": [["Character", "\u00AE"]]}, + +{"description": "Valid Unicode character U+00AF", +"input": "\u00AF", +"output": [["Character", "\u00AF"]]}, + +{"description": "Valid Unicode character U+00B0", +"input": "\u00B0", +"output": [["Character", "\u00B0"]]}, + +{"description": "Valid Unicode character U+00B1", +"input": "\u00B1", +"output": [["Character", "\u00B1"]]}, + +{"description": "Valid Unicode character U+00B2", +"input": "\u00B2", +"output": [["Character", "\u00B2"]]}, + +{"description": "Valid Unicode character U+00B3", +"input": "\u00B3", +"output": [["Character", "\u00B3"]]}, + +{"description": "Valid Unicode character U+00B4", +"input": "\u00B4", +"output": [["Character", "\u00B4"]]}, + +{"description": "Valid Unicode character U+00B5", +"input": "\u00B5", +"output": [["Character", "\u00B5"]]}, + +{"description": "Valid Unicode character U+00B6", +"input": "\u00B6", +"output": [["Character", "\u00B6"]]}, + +{"description": "Valid Unicode character U+00B7", +"input": "\u00B7", +"output": [["Character", "\u00B7"]]}, + +{"description": "Valid Unicode character U+00B8", +"input": "\u00B8", +"output": [["Character", "\u00B8"]]}, + +{"description": "Valid Unicode character U+00B9", +"input": "\u00B9", +"output": [["Character", "\u00B9"]]}, + +{"description": "Valid Unicode character U+00BA", +"input": "\u00BA", +"output": [["Character", "\u00BA"]]}, + +{"description": "Valid Unicode character U+00BB", +"input": "\u00BB", +"output": [["Character", "\u00BB"]]}, + +{"description": "Valid Unicode character U+00BC", +"input": "\u00BC", +"output": [["Character", "\u00BC"]]}, + +{"description": "Valid Unicode character U+00BD", +"input": "\u00BD", +"output": [["Character", "\u00BD"]]}, + +{"description": "Valid Unicode character U+00BE", +"input": "\u00BE", +"output": [["Character", "\u00BE"]]}, + +{"description": "Valid Unicode character U+00BF", +"input": "\u00BF", +"output": [["Character", "\u00BF"]]}, + +{"description": "Valid Unicode character U+00C0", +"input": "\u00C0", +"output": [["Character", "\u00C0"]]}, + +{"description": "Valid Unicode character U+00C1", +"input": "\u00C1", +"output": [["Character", "\u00C1"]]}, + +{"description": "Valid Unicode character U+00C2", +"input": "\u00C2", +"output": [["Character", "\u00C2"]]}, + +{"description": "Valid Unicode character U+00C3", +"input": "\u00C3", +"output": [["Character", "\u00C3"]]}, + +{"description": "Valid Unicode character U+00C4", +"input": "\u00C4", +"output": [["Character", "\u00C4"]]}, + +{"description": "Valid Unicode character U+00C5", +"input": "\u00C5", +"output": [["Character", "\u00C5"]]}, + +{"description": "Valid Unicode character U+00C6", +"input": "\u00C6", +"output": [["Character", "\u00C6"]]}, + +{"description": "Valid Unicode character U+00C7", +"input": "\u00C7", +"output": [["Character", "\u00C7"]]}, + +{"description": "Valid Unicode character U+00C8", +"input": "\u00C8", +"output": [["Character", "\u00C8"]]}, + +{"description": "Valid Unicode character U+00C9", +"input": "\u00C9", +"output": [["Character", "\u00C9"]]}, + +{"description": "Valid Unicode character U+00CA", +"input": "\u00CA", +"output": [["Character", "\u00CA"]]}, + +{"description": "Valid Unicode character U+00CB", +"input": "\u00CB", +"output": [["Character", "\u00CB"]]}, + +{"description": "Valid Unicode character U+00CC", +"input": "\u00CC", +"output": [["Character", "\u00CC"]]}, + +{"description": "Valid Unicode character U+00CD", +"input": "\u00CD", +"output": [["Character", "\u00CD"]]}, + +{"description": "Valid Unicode character U+00CE", +"input": "\u00CE", +"output": [["Character", "\u00CE"]]}, + +{"description": "Valid Unicode character U+00CF", +"input": "\u00CF", +"output": [["Character", "\u00CF"]]}, + +{"description": "Valid Unicode character U+00D0", +"input": "\u00D0", +"output": [["Character", "\u00D0"]]}, + +{"description": "Valid Unicode character U+00D1", +"input": "\u00D1", +"output": [["Character", "\u00D1"]]}, + +{"description": "Valid Unicode character U+00D2", +"input": "\u00D2", +"output": [["Character", "\u00D2"]]}, + +{"description": "Valid Unicode character U+00D3", +"input": "\u00D3", +"output": [["Character", "\u00D3"]]}, + +{"description": "Valid Unicode character U+00D4", +"input": "\u00D4", +"output": [["Character", "\u00D4"]]}, + +{"description": "Valid Unicode character U+00D5", +"input": "\u00D5", +"output": [["Character", "\u00D5"]]}, + +{"description": "Valid Unicode character U+00D6", +"input": "\u00D6", +"output": [["Character", "\u00D6"]]}, + +{"description": "Valid Unicode character U+00D7", +"input": "\u00D7", +"output": [["Character", "\u00D7"]]}, + +{"description": "Valid Unicode character U+00D8", +"input": "\u00D8", +"output": [["Character", "\u00D8"]]}, + +{"description": "Valid Unicode character U+00D9", +"input": "\u00D9", +"output": [["Character", "\u00D9"]]}, + +{"description": "Valid Unicode character U+00DA", +"input": "\u00DA", +"output": [["Character", "\u00DA"]]}, + +{"description": "Valid Unicode character U+00DB", +"input": "\u00DB", +"output": [["Character", "\u00DB"]]}, + +{"description": "Valid Unicode character U+00DC", +"input": "\u00DC", +"output": [["Character", "\u00DC"]]}, + +{"description": "Valid Unicode character U+00DD", +"input": "\u00DD", +"output": [["Character", "\u00DD"]]}, + +{"description": "Valid Unicode character U+00DE", +"input": "\u00DE", +"output": [["Character", "\u00DE"]]}, + +{"description": "Valid Unicode character U+00DF", +"input": "\u00DF", +"output": [["Character", "\u00DF"]]}, + +{"description": "Valid Unicode character U+00E0", +"input": "\u00E0", +"output": [["Character", "\u00E0"]]}, + +{"description": "Valid Unicode character U+00E1", +"input": "\u00E1", +"output": [["Character", "\u00E1"]]}, + +{"description": "Valid Unicode character U+00E2", +"input": "\u00E2", +"output": [["Character", "\u00E2"]]}, + +{"description": "Valid Unicode character U+00E3", +"input": "\u00E3", +"output": [["Character", "\u00E3"]]}, + +{"description": "Valid Unicode character U+00E4", +"input": "\u00E4", +"output": [["Character", "\u00E4"]]}, + +{"description": "Valid Unicode character U+00E5", +"input": "\u00E5", +"output": [["Character", "\u00E5"]]}, + +{"description": "Valid Unicode character U+00E6", +"input": "\u00E6", +"output": [["Character", "\u00E6"]]}, + +{"description": "Valid Unicode character U+00E7", +"input": "\u00E7", +"output": [["Character", "\u00E7"]]}, + +{"description": "Valid Unicode character U+00E8", +"input": "\u00E8", +"output": [["Character", "\u00E8"]]}, + +{"description": "Valid Unicode character U+00E9", +"input": "\u00E9", +"output": [["Character", "\u00E9"]]}, + +{"description": "Valid Unicode character U+00EA", +"input": "\u00EA", +"output": [["Character", "\u00EA"]]}, + +{"description": "Valid Unicode character U+00EB", +"input": "\u00EB", +"output": [["Character", "\u00EB"]]}, + +{"description": "Valid Unicode character U+00EC", +"input": "\u00EC", +"output": [["Character", "\u00EC"]]}, + +{"description": "Valid Unicode character U+00ED", +"input": "\u00ED", +"output": [["Character", "\u00ED"]]}, + +{"description": "Valid Unicode character U+00EE", +"input": "\u00EE", +"output": [["Character", "\u00EE"]]}, + +{"description": "Valid Unicode character U+00EF", +"input": "\u00EF", +"output": [["Character", "\u00EF"]]}, + +{"description": "Valid Unicode character U+00F0", +"input": "\u00F0", +"output": [["Character", "\u00F0"]]}, + +{"description": "Valid Unicode character U+00F1", +"input": "\u00F1", +"output": [["Character", "\u00F1"]]}, + +{"description": "Valid Unicode character U+00F2", +"input": "\u00F2", +"output": [["Character", "\u00F2"]]}, + +{"description": "Valid Unicode character U+00F3", +"input": "\u00F3", +"output": [["Character", "\u00F3"]]}, + +{"description": "Valid Unicode character U+00F4", +"input": "\u00F4", +"output": [["Character", "\u00F4"]]}, + +{"description": "Valid Unicode character U+00F5", +"input": "\u00F5", +"output": [["Character", "\u00F5"]]}, + +{"description": "Valid Unicode character U+00F6", +"input": "\u00F6", +"output": [["Character", "\u00F6"]]}, + +{"description": "Valid Unicode character U+00F7", +"input": "\u00F7", +"output": [["Character", "\u00F7"]]}, + +{"description": "Valid Unicode character U+00F8", +"input": "\u00F8", +"output": [["Character", "\u00F8"]]}, + +{"description": "Valid Unicode character U+00F9", +"input": "\u00F9", +"output": [["Character", "\u00F9"]]}, + +{"description": "Valid Unicode character U+00FA", +"input": "\u00FA", +"output": [["Character", "\u00FA"]]}, + +{"description": "Valid Unicode character U+00FB", +"input": "\u00FB", +"output": [["Character", "\u00FB"]]}, + +{"description": "Valid Unicode character U+00FC", +"input": "\u00FC", +"output": [["Character", "\u00FC"]]}, + +{"description": "Valid Unicode character U+00FD", +"input": "\u00FD", +"output": [["Character", "\u00FD"]]}, + +{"description": "Valid Unicode character U+00FE", +"input": "\u00FE", +"output": [["Character", "\u00FE"]]}, + +{"description": "Valid Unicode character U+00FF", +"input": "\u00FF", +"output": [["Character", "\u00FF"]]}, + +{"description": "Valid Unicode character U+D7FF", +"input": "\uD7FF", +"output": [["Character", "\uD7FF"]]}, + +{"description": "Valid Unicode character U+E000", +"input": "\uE000", +"output": [["Character", "\uE000"]]}, + +{"description": "Valid Unicode character U+FDCF", +"input": "\uFDCF", +"output": [["Character", "\uFDCF"]]}, + +{"description": "Valid Unicode character U+FDF0", +"input": "\uFDF0", +"output": [["Character", "\uFDF0"]]}, + +{"description": "Valid Unicode character U+FFFD", +"input": "\uFFFD", +"output": [["Character", "\uFFFD"]]}, + +{"description": "Valid Unicode character U+10000", +"input": "\uD800\uDC00", +"output": [["Character", "\uD800\uDC00"]]}, + +{"description": "Valid Unicode character U+1FFFD", +"input": "\uD83F\uDFFD", +"output": [["Character", "\uD83F\uDFFD"]]}, + +{"description": "Valid Unicode character U+20000", +"input": "\uD840\uDC00", +"output": [["Character", "\uD840\uDC00"]]}, + +{"description": "Valid Unicode character U+2FFFD", +"input": "\uD87F\uDFFD", +"output": [["Character", "\uD87F\uDFFD"]]}, + +{"description": "Valid Unicode character U+30000", +"input": "\uD880\uDC00", +"output": [["Character", "\uD880\uDC00"]]}, + +{"description": "Valid Unicode character U+3FFFD", +"input": "\uD8BF\uDFFD", +"output": [["Character", "\uD8BF\uDFFD"]]}, + +{"description": "Valid Unicode character U+40000", +"input": "\uD8C0\uDC00", +"output": [["Character", "\uD8C0\uDC00"]]}, + +{"description": "Valid Unicode character U+4FFFD", +"input": "\uD8FF\uDFFD", +"output": [["Character", "\uD8FF\uDFFD"]]}, + +{"description": "Valid Unicode character U+50000", +"input": "\uD900\uDC00", +"output": [["Character", "\uD900\uDC00"]]}, + +{"description": "Valid Unicode character U+5FFFD", +"input": "\uD93F\uDFFD", +"output": [["Character", "\uD93F\uDFFD"]]}, + +{"description": "Valid Unicode character U+60000", +"input": "\uD940\uDC00", +"output": [["Character", "\uD940\uDC00"]]}, + +{"description": "Valid Unicode character U+6FFFD", +"input": "\uD97F\uDFFD", +"output": [["Character", "\uD97F\uDFFD"]]}, + +{"description": "Valid Unicode character U+70000", +"input": "\uD980\uDC00", +"output": [["Character", "\uD980\uDC00"]]}, + +{"description": "Valid Unicode character U+7FFFD", +"input": "\uD9BF\uDFFD", +"output": [["Character", "\uD9BF\uDFFD"]]}, + +{"description": "Valid Unicode character U+80000", +"input": "\uD9C0\uDC00", +"output": [["Character", "\uD9C0\uDC00"]]}, + +{"description": "Valid Unicode character U+8FFFD", +"input": "\uD9FF\uDFFD", +"output": [["Character", "\uD9FF\uDFFD"]]}, + +{"description": "Valid Unicode character U+90000", +"input": "\uDA00\uDC00", +"output": [["Character", "\uDA00\uDC00"]]}, + +{"description": "Valid Unicode character U+9FFFD", +"input": "\uDA3F\uDFFD", +"output": [["Character", "\uDA3F\uDFFD"]]}, + +{"description": "Valid Unicode character U+A0000", +"input": "\uDA40\uDC00", +"output": [["Character", "\uDA40\uDC00"]]}, + +{"description": "Valid Unicode character U+AFFFD", +"input": "\uDA7F\uDFFD", +"output": [["Character", "\uDA7F\uDFFD"]]}, + +{"description": "Valid Unicode character U+B0000", +"input": "\uDA80\uDC00", +"output": [["Character", "\uDA80\uDC00"]]}, + +{"description": "Valid Unicode character U+BFFFD", +"input": "\uDABF\uDFFD", +"output": [["Character", "\uDABF\uDFFD"]]}, + +{"description": "Valid Unicode character U+C0000", +"input": "\uDAC0\uDC00", +"output": [["Character", "\uDAC0\uDC00"]]}, + +{"description": "Valid Unicode character U+CFFFD", +"input": "\uDAFF\uDFFD", +"output": [["Character", "\uDAFF\uDFFD"]]}, + +{"description": "Valid Unicode character U+D0000", +"input": "\uDB00\uDC00", +"output": [["Character", "\uDB00\uDC00"]]}, + +{"description": "Valid Unicode character U+DFFFD", +"input": "\uDB3F\uDFFD", +"output": [["Character", "\uDB3F\uDFFD"]]}, + +{"description": "Valid Unicode character U+E0000", +"input": "\uDB40\uDC00", +"output": [["Character", "\uDB40\uDC00"]]}, + +{"description": "Valid Unicode character U+EFFFD", +"input": "\uDB7F\uDFFD", +"output": [["Character", "\uDB7F\uDFFD"]]}, + +{"description": "Valid Unicode character U+F0000", +"input": "\uDB80\uDC00", +"output": [["Character", "\uDB80\uDC00"]]}, + +{"description": "Valid Unicode character U+FFFFD", +"input": "\uDBBF\uDFFD", +"output": [["Character", "\uDBBF\uDFFD"]]}, + +{"description": "Valid Unicode character U+100000", +"input": "\uDBC0\uDC00", +"output": [["Character", "\uDBC0\uDC00"]]}, + +{"description": "Valid Unicode character U+10FFFD", +"input": "\uDBFF\uDFFD", +"output": [["Character", "\uDBFF\uDFFD"]]} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/unicodeCharsProblematic.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/unicodeCharsProblematic.test new file mode 100644 index 000000000..8fb54c411 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/unicodeCharsProblematic.test @@ -0,0 +1,27 @@ +{"tests" : [ +{"description": "Invalid Unicode character U+DFFF", +"doubleEscaped":true, +"input": "\\uDFFF", +"output":["ParseError", ["Character", "\\uDFFF"]]}, + +{"description": "Invalid Unicode character U+D800", +"doubleEscaped":true, +"input": "\\uD800", +"output":["ParseError", ["Character", "\\uD800"]]}, + +{"description": "Invalid Unicode character U+DFFF with valid preceding character", +"doubleEscaped":true, +"input": "a\\uDFFF", +"output":[["Character", "a"], "ParseError", ["Character", "\\uDFFF"]]}, + +{"description": "Invalid Unicode character U+D800 with valid following character", +"doubleEscaped":true, +"input": "\\uD800a", +"output":["ParseError", ["Character", "\\uD800a"]]}, + +{"description":"CR followed by U+0000", +"input":"\r\u0000", +"output":[["Character", "\n"], "ParseError", ["Character", "\u0000"]], +"ignoreErrorOrder":true} +] +}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/xmlViolation.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/xmlViolation.test new file mode 100644 index 000000000..137d96429 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tokenizer/xmlViolation.test @@ -0,0 +1,22 @@ +{"xmlViolationTests": [ + +{"description":"Non-XML character", +"input":"a\uFFFFb", +"ignoreErrorOrder":true, +"output":["ParseError",["Character","a\uFFFDb"]]}, + +{"description":"Non-XML space", +"input":"a\u000Cb", +"ignoreErrorOrder":true, +"output":[["Character","a b"]]}, + +{"description":"Double hyphen in comment", +"input":"<!-- foo -- bar -->", +"output":["ParseError",["Comment"," foo - - bar "]]}, + +{"description":"FF between attributes", +"input":"<a b=''\u000Cc=''>", +"output":[["StartTag","a",{"b":"","c":""}]]} +]} + + diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/README.md b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/README.md new file mode 100644 index 000000000..2aba4bf86 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/README.md @@ -0,0 +1,98 @@ +Tree Construction Tests +======================= + +Each file containing tree construction tests consists of any number of +tests separated by two newlines (LF) and a single newline before the end +of the file. For instance: + + [TEST]LF + LF + [TEST]LF + LF + [TEST]LF + +Where [TEST] is the following format: + +Each test must begin with a string "\#data" followed by a newline (LF). +All subsequent lines until a line that says "\#errors" are the test data +and must be passed to the system being tested unchanged, except with the +final newline (on the last line) removed. + +Then there must be a line that says "\#errors". It must be followed by +one line per parse error that a conformant checker would return. It +doesn't matter what those lines are, although they can't be +"\#document-fragment", "\#document", "\#script-off", "\#script-on", or +empty, the only thing that matters is that there be the right number +of parse errors. + +Then there \*may\* be a line that says "\#document-fragment", which must +be followed by a newline (LF), followed by a string of characters that +indicates the context element, followed by a newline (LF). If this line +is present the "\#data" must be parsed using the HTML fragment parsing +algorithm with the context element as context. + +Then there \*may\* be a line that says "\#script-off" or +"\#script-in". If a line that says "\#script-off" is present, the +parser must set the scripting flag to disabled. If a line that says +"\#script-on" is present, it must set it to enabled. Otherwise, the +test should be run in both modes. + +Then there must be a line that says "\#document", which must be followed +by a dump of the tree of the parsed DOM. Each node must be represented +by a single line. Each line must start with "| ", followed by two spaces +per parent node that the node has before the root document node. + +- Element nodes must be represented by a "`<`" then the *tag name + string* "`>`", and all the attributes must be given, sorted + lexicographically by UTF-16 code unit according to their *attribute + name string*, on subsequent lines, as if they were children of the + element node. +- Attribute nodes must have the *attribute name string*, then an "=" + sign, then the attribute value in double quotes ("). +- Text nodes must be the string, in double quotes. Newlines aren't + escaped. +- Comments must be "`<`" then "`!-- `" then the data then "` -->`". +- DOCTYPEs must be "`<!DOCTYPE `" then the name then if either of the + system id or public id is non-empty a space, public id in + double-quotes, another space an the system id in double-quotes, and + then in any case "`>`". +- Processing instructions must be "`<?`", then the target, then a + space, then the data and then "`>`". (The HTML parser cannot emit + processing instructions, but scripts can, and the WebVTT to DOM + rules can emit them.) +- Template contents are represented by the string "content" with the + children below it. + +The *tag name string* is the local name prefixed by a namespace +designator. For the HTML namespace, the namespace designator is the +empty string, i.e. there's no prefix. For the SVG namespace, the +namespace designator is "svg ". For the MathML namespace, the namespace +designator is "math ". + +The *attribute name string* is the local name prefixed by a namespace +designator. For no namespace, the namespace designator is the empty +string, i.e. there's no prefix. For the XLink namespace, the namespace +designator is "xlink ". For the XML namespace, the namespace designator +is "xml ". For the XMLNS namespace, the namespace designator is "xmlns +". Note the difference between "xlink:href" which is an attribute in no +namespace with the local name "xlink:href" and "xlink href" which is an +attribute in the xlink namespace with the local name "href". + +If there is also a "\#document-fragment" the bit following "\#document" +must be a representation of the HTML fragment serialization for the +context element given by "\#document-fragment". + +For example: + + #data + <p>One<p>Two + #errors + 3: Missing document type declaration + #document + | <html> + | <head> + | <body> + | <p> + | "One" + | <p> + | "Two" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/adoption01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/adoption01.dat new file mode 100644 index 000000000..2e1127e51 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/adoption01.dat @@ -0,0 +1,337 @@ +#data +<a><p></a></p> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,10): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <a> +| <p> +| <a> + +#data +<a>1<p>2</a>3</p> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,12): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <a> +| "1" +| <p> +| <a> +| "2" +| "3" + +#data +<a>1<button>2</a>3</button> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,17): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <a> +| "1" +| <button> +| <a> +| "2" +| "3" + +#data +<a>1<b>2</a>3</b> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,12): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <a> +| "1" +| <b> +| "2" +| <b> +| "3" + +#data +<a>1<div>2<div>3</a>4</div>5</div> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,20): adoption-agency-1.3 +(1,20): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <a> +| "1" +| <div> +| <a> +| "2" +| <div> +| <a> +| "3" +| "4" +| "5" + +#data +<table><a>1<p>2</a>3</p> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,10): unexpected-start-tag-implies-table-voodoo +(1,11): unexpected-character-implies-table-voodoo +(1,14): unexpected-start-tag-implies-table-voodoo +(1,15): unexpected-character-implies-table-voodoo +(1,19): unexpected-end-tag-implies-table-voodoo +(1,19): adoption-agency-1.3 +(1,20): unexpected-character-implies-table-voodoo +(1,24): unexpected-end-tag-implies-table-voodoo +(1,24): eof-in-table +#document +| <html> +| <head> +| <body> +| <a> +| "1" +| <p> +| <a> +| "2" +| "3" +| <table> + +#data +<b><b><a><p></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,16): adoption-agency-1.3 +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <b> +| <a> +| <p> +| <a> + +#data +<b><a><b><p></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,16): adoption-agency-1.3 +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <a> +| <b> +| <b> +| <p> +| <a> + +#data +<a><b><b><p></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,16): adoption-agency-1.3 +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <b> +| <b> +| <b> +| <b> +| <p> +| <a> + +#data +<p>1<s id="A">2<b id="B">3</p>4</s>5</b> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,30): unexpected-end-tag +(1,35): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <p> +| "1" +| <s> +| id="A" +| "2" +| <b> +| id="B" +| "3" +| <s> +| id="A" +| <b> +| id="B" +| "4" +| <b> +| id="B" +| "5" + +#data +<table><a>1<td>2</td>3</table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,10): unexpected-start-tag-implies-table-voodoo +(1,11): unexpected-character-implies-table-voodoo +(1,15): unexpected-cell-in-table-body +(1,30): unexpected-implied-end-tag-in-table-view +#document +| <html> +| <head> +| <body> +| <a> +| "1" +| <a> +| "3" +| <table> +| <tbody> +| <tr> +| <td> +| "2" + +#data +<table>A<td>B</td>C</table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,8): unexpected-character-implies-table-voodoo +(1,12): unexpected-cell-in-table-body +(1,22): unexpected-character-implies-table-voodoo +#document +| <html> +| <head> +| <body> +| "AC" +| <table> +| <tbody> +| <tr> +| <td> +| "B" + +#data +<a><svg><tr><input></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,23): unexpected-end-tag +(1,23): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <a> +| <svg svg> +| <svg tr> +| <svg input> + +#data +<div><a><b><div><div><div><div><div><div><div><div><div><div></a> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,65): adoption-agency-1.3 +(1,65): adoption-agency-1.3 +(1,65): adoption-agency-1.3 +(1,65): adoption-agency-1.3 +(1,65): adoption-agency-1.3 +(1,65): adoption-agency-1.3 +(1,65): adoption-agency-1.3 +(1,65): adoption-agency-1.3 +(1,65): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <a> +| <b> +| <b> +| <div> +| <a> +| <div> +| <a> +| <div> +| <a> +| <div> +| <a> +| <div> +| <a> +| <div> +| <a> +| <div> +| <a> +| <div> +| <a> +| <div> +| <div> + +#data +<div><a><b><u><i><code><div></a> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,32): adoption-agency-1.3 +(1,32): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <a> +| <b> +| <u> +| <i> +| <code> +| <u> +| <i> +| <code> +| <div> +| <a> + +#data +<b><b><b><b>x</b></b></b></b>y +#errors +(1,3): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <b> +| <b> +| <b> +| <b> +| "x" +| "y" + +#data +<p><b><b><b><b><p>x +#errors +(1,3): expected-doctype-but-got-start-tag +(1,18): unexpected-end-tag +(1,19): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <b> +| <b> +| <b> +| <b> +| <p> +| <b> +| <b> +| <b> +| "x" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/adoption02.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/adoption02.dat new file mode 100644 index 000000000..e54d8033b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/adoption02.dat @@ -0,0 +1,39 @@ +#data +<b>1<i>2<p>3</b>4 +#errors +(1,3): expected-doctype-but-got-start-tag +(1,16): adoption-agency-1.3 +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| "1" +| <i> +| "2" +| <i> +| <p> +| <b> +| "3" +| "4" + +#data +<a><div><style></style><address><a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,35): unexpected-start-tag-implies-end-tag +(1,35): adoption-agency-1.3 +(1,35): adoption-agency-1.3 +(1,35): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <div> +| <a> +| <style> +| <address> +| <a> +| <a> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/comments01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/comments01.dat new file mode 100644 index 000000000..35ec6cced --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/comments01.dat @@ -0,0 +1,178 @@ +#data +FOO<!-- BAR -->BAZ +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- BAR --> +| "BAZ" + +#data +FOO<!-- BAR --!>BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,15): unexpected-bang-after-double-dash-in-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- BAR --> +| "BAZ" + +#data +FOO<!-- BAR -- >BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,15): unexpected-char-in-comment +(1,21): eof-in-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- BAR -- >BAZ --> + +#data +FOO<!-- BAR -- <QUX> -- MUX -->BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,15): unexpected-char-in-comment +(1,24): unexpected-char-in-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- BAR -- <QUX> -- MUX --> +| "BAZ" + +#data +FOO<!-- BAR -- <QUX> -- MUX --!>BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,15): unexpected-char-in-comment +(1,24): unexpected-char-in-comment +(1,31): unexpected-bang-after-double-dash-in-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- BAR -- <QUX> -- MUX --> +| "BAZ" + +#data +FOO<!-- BAR -- <QUX> -- MUX -- >BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,15): unexpected-char-in-comment +(1,24): unexpected-char-in-comment +(1,31): unexpected-char-in-comment +(1,35): eof-in-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- BAR -- <QUX> -- MUX -- >BAZ --> + +#data +FOO<!---->BAZ +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- --> +| "BAZ" + +#data +FOO<!--->BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,9): incorrect-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- --> +| "BAZ" + +#data +FOO<!-->BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,8): incorrect-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- --> +| "BAZ" + +#data +<?xml version="1.0">Hi +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,22): expected-doctype-but-got-chars +#document +| <!-- ?xml version="1.0" --> +| <html> +| <head> +| <body> +| "Hi" + +#data +<?xml version="1.0"> +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,20): expected-doctype-but-got-eof +#document +| <!-- ?xml version="1.0" --> +| <html> +| <head> +| <body> + +#data +<?xml version +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,13): expected-doctype-but-got-eof +#document +| <!-- ?xml version --> +| <html> +| <head> +| <body> + +#data +FOO<!----->BAZ +#errors +(1,3): expected-doctype-but-got-chars +(1,10): unexpected-dash-after-double-dash-in-comment +#document +| <html> +| <head> +| <body> +| "FOO" +| <!-- - --> +| "BAZ" + +#data +<html><!-- comment --><title>Comment before head</title> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <!-- comment --> +| <head> +| <title> +| "Comment before head" +| <body> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/doctype01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/doctype01.dat new file mode 100644 index 000000000..cec663897 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/doctype01.dat @@ -0,0 +1,424 @@ +#data +<!DOCTYPE html>Hello +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!dOctYpE HtMl>Hello +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPEhtml>Hello +#errors +(1,9): need-space-after-doctype +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE>Hello +#errors +(1,9): need-space-after-doctype +(1,10): expected-doctype-name-but-got-right-bracket +(1,10): unknown-doctype +#document +| <!DOCTYPE > +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE >Hello +#errors +(1,11): expected-doctype-name-but-got-right-bracket +(1,11): unknown-doctype +#document +| <!DOCTYPE > +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato>Hello +#errors +(1,17): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato >Hello +#errors +(1,18): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato taco>Hello +#errors +(1,17): expected-space-or-right-bracket-in-doctype +(1,22): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato taco "ddd>Hello +#errors +(1,17): expected-space-or-right-bracket-in-doctype +(1,27): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato sYstEM>Hello +#errors +(1,24): unexpected-char-in-doctype +(1,24): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato sYstEM >Hello +#errors +(1,28): unexpected-char-in-doctype +(1,28): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato sYstEM ggg>Hello +#errors +(1,34): unexpected-char-in-doctype +(1,37): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato SYSTEM taco >Hello +#errors +(1,25): unexpected-char-in-doctype +(1,31): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato SYSTEM 'taco"'>Hello +#errors +(1,32): unknown-doctype +#document +| <!DOCTYPE potato "" "taco""> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato SYSTEM "taco">Hello +#errors +(1,31): unknown-doctype +#document +| <!DOCTYPE potato "" "taco"> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato SYSTEM "tai'co">Hello +#errors +(1,33): unknown-doctype +#document +| <!DOCTYPE potato "" "tai'co"> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato SYSTEMtaco "ddd">Hello +#errors +(1,24): unexpected-char-in-doctype +(1,34): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato grass SYSTEM taco>Hello +#errors +(1,17): expected-space-or-right-bracket-in-doctype +(1,35): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato pUbLIc>Hello +#errors +(1,24): unexpected-end-of-doctype +(1,24): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato pUbLIc >Hello +#errors +(1,25): unexpected-end-of-doctype +(1,25): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato pUbLIcgoof>Hello +#errors +(1,24): unexpected-char-in-doctype +(1,28): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato PUBLIC goof>Hello +#errors +(1,25): unexpected-char-in-doctype +(1,29): unknown-doctype +#document +| <!DOCTYPE potato> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato PUBLIC "go'of">Hello +#errors +(1,32): unknown-doctype +#document +| <!DOCTYPE potato "go'of" ""> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato PUBLIC 'go'of'>Hello +#errors +(1,29): unexpected-char-in-doctype +(1,32): unknown-doctype +#document +| <!DOCTYPE potato "go" ""> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato PUBLIC 'go:hh of' >Hello +#errors +(1,38): unknown-doctype +#document +| <!DOCTYPE potato "go:hh of" ""> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE potato PUBLIC "W3C-//dfdf" SYSTEM ggg>Hello +#errors +(1,38): unexpected-char-in-doctype +(1,48): unknown-doctype +#document +| <!DOCTYPE potato "W3C-//dfdf" ""> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" + "http://www.w3.org/TR/html4/strict.dtd">Hello +#errors +#document +| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE ...>Hello +#errors +(1,14): unknown-doctype +#document +| <!DOCTYPE ...> +| <html> +| <head> +| <body> +| "Hello" + +#data +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +#errors +(2,58): unknown-doctype +#document +| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> +#errors +(2,54): unknown-doctype +#document +| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] "uri" [ +<!-- internal declarations --> +]> +#errors +(1,23): expected-space-or-right-bracket-in-doctype +(2,30): unknown-doctype +#document +| <!DOCTYPE root-element> +| <html> +| <head> +| <body> +| "]>" + +#data +<!DOCTYPE html PUBLIC + "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" + "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> +#errors +(3,53): unknown-doctype +#document +| <!DOCTYPE html "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE HTML SYSTEM "http://www.w3.org/DTD/HTML4-strict.dtd"><body><b>Mine!</b></body> +#errors +(1,63): unknown-doctype +#document +| <!DOCTYPE html "" "http://www.w3.org/DTD/HTML4-strict.dtd"> +| <html> +| <head> +| <body> +| <b> +| "Mine!" + +#data +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> +#errors +(1,50): unexpected-char-in-doctype +#document +| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> +#errors +(1,50): unexpected-char-in-doctype +#document +| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> +#errors +(1,21): unexpected-char-in-doctype +(1,49): unexpected-char-in-doctype +#document +| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'> +#errors +(1,21): unexpected-char-in-doctype +(1,49): unexpected-char-in-doctype +#document +| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +| <html> +| <head> +| <body> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/domjs-unsafe.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/domjs-unsafe.dat Binary files differnew file mode 100644 index 000000000..34b4e6271 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/domjs-unsafe.dat diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/entities01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/entities01.dat new file mode 100644 index 000000000..20d53a0fd --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/entities01.dat @@ -0,0 +1,723 @@ +#data +FOO>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO>BAR" + +#data +FOO>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,6): named-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| "FOO>BAR" + +#data +FOO> BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,6): named-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| "FOO> BAR" + +#data +FOO>;;BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO>;;BAR" + +#data +I'm ¬it; I tell you +#errors +(1,4): expected-doctype-but-got-chars +(1,9): named-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| "I'm ¬it; I tell you" + +#data +I'm ∉ I tell you +#errors +(1,4): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "I'm ∉ I tell you" + +#data +FOO& BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO& BAR" + +#data +FOO&<BAR> +#errors +(1,3): expected-doctype-but-got-chars +(1,9): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO&" +| <bar> + +#data +FOO&&&>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO&&&>BAR" + +#data +FOO)BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO)BAR" + +#data +FOOABAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOOABAR" + +#data +FOOABAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOOABAR" + +#data +FOO&#BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,5): expected-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO&#BAR" + +#data +FOO&#ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,5): expected-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO&#ZOO" + +#data +FOOºR +#errors +(1,3): expected-doctype-but-got-chars +(1,7): expected-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOºR" + +#data +FOO&#xZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,6): expected-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO&#xZOO" + +#data +FOO&#XZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,6): expected-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO&#XZOO" + +#data +FOO)BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,7): numeric-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| "FOO)BAR" + +#data +FOO䆺R +#errors +(1,3): expected-doctype-but-got-chars +(1,10): numeric-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| "FOO䆺R" + +#data +FOOAZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,8): numeric-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| "FOOAZOO" + +#data +FOO�ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO�ZOO" + +#data +FOOxZOO +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOOxZOO" + +#data +FOOyZOO +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOOyZOO" + +#data +FOO€ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO€ZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÂZOO" + +#data +FOO‚ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO‚ZOO" + +#data +FOOƒZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÆ’ZOO" + +#data +FOO„ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO„ZOO" + +#data +FOO…ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO…ZOO" + +#data +FOO†ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO†ZOO" + +#data +FOO‡ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO‡ZOO" + +#data +FOOˆZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOˆZOO" + +#data +FOO‰ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO‰ZOO" + +#data +FOOŠZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÅ ZOO" + +#data +FOO‹ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO‹ZOO" + +#data +FOOŒZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÅ’ZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÂZOO" + +#data +FOOŽZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOŽZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÂZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÂZOO" + +#data +FOO‘ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO‘ZOO" + +#data +FOO’ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO’ZOO" + +#data +FOO“ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO“ZOO" + +#data +FOO”ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOâ€ZOO" + +#data +FOO•ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO•ZOO" + +#data +FOO–ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO–ZOO" + +#data +FOO—ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO—ZOO" + +#data +FOO˜ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOËœZOO" + +#data +FOO™ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOâ„¢ZOO" + +#data +FOOšZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÅ¡ZOO" + +#data +FOO›ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO›ZOO" + +#data +FOOœZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÅ“ZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOÂZOO" + +#data +FOOžZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOžZOO" + +#data +FOOŸZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOŸZOO" + +#data +FOO ZOO +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO ZOO" + +#data +FOO퟿ZOO +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO퟿ZOO" + +#data +FOO�ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO�ZOO" + +#data +FOO�ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO�ZOO" + +#data +FOO�ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO�ZOO" + +#data +FOO�ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,11): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO�ZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOOZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,13): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOô¿¾ZOO" + +#data +FOO􈟔ZOO +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOOôˆŸ”ZOO" + +#data +FOOZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,13): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOOô¿¿ZOO" + +#data +FOO�ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,13): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO�ZOO" + +#data +FOO�ZOO +#errors +(1,3): expected-doctype-but-got-chars +(1,13): illegal-codepoint-for-numeric-entity +#document +| <html> +| <head> +| <body> +| "FOO�ZOO" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/entities02.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/entities02.dat new file mode 100644 index 000000000..f117f068a --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/entities02.dat @@ -0,0 +1,283 @@ +#data +<div bar="ZZ>YY"></div> +#errors +(1,20): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>YY" + +#data +<div bar="ZZ&"></div> +#errors +(1,15): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ&" + +#data +<div bar='ZZ&'></div> +#errors +(1,15): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ&" + +#data +<div bar=ZZ&></div> +#errors +(1,13): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ&" + +#data +<div bar="ZZ>=YY"></div> +#errors +(1,15): named-entity-without-semicolon +(1,20): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>=YY" + +#data +<div bar="ZZ>0YY"></div> +#errors +(1,20): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>0YY" + +#data +<div bar="ZZ>9YY"></div> +#errors +(1,20): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>9YY" + +#data +<div bar="ZZ>aYY"></div> +#errors +(1,20): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>aYY" + +#data +<div bar="ZZ>ZYY"></div> +#errors +(1,20): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>ZYY" + +#data +<div bar="ZZ> YY"></div> +#errors +(1,15): named-entity-without-semicolon +(1,20): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ> YY" + +#data +<div bar="ZZ>"></div> +#errors +(1,15): named-entity-without-semicolon +(1,17): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>" + +#data +<div bar='ZZ>'></div> +#errors +(1,15): named-entity-without-semicolon +(1,17): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>" + +#data +<div bar=ZZ>></div> +#errors +(1,14): named-entity-without-semicolon +(1,15): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ>" + +#data +<div bar="ZZ£_id=23"></div> +#errors +(1,18): named-entity-without-semicolon +(1,26): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ£_id=23" + +#data +<div bar="ZZ&prod_id=23"></div> +#errors +(1,25): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ&prod_id=23" + +#data +<div bar="ZZ£_id=23"></div> +#errors +(1,27): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ£_id=23" + +#data +<div bar="ZZ∏_id=23"></div> +#errors +(1,26): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZâˆ_id=23" + +#data +<div bar="ZZ£=23"></div> +#errors +(1,18): named-entity-without-semicolon +(1,23): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ£=23" + +#data +<div bar="ZZ&prod=23"></div> +#errors +(1,22): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| bar="ZZ&prod=23" + +#data +<div>ZZ£_id=23</div> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,13): named-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| <div> +| "ZZ£_id=23" + +#data +<div>ZZ&prod_id=23</div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| "ZZ&prod_id=23" + +#data +<div>ZZ£_id=23</div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| "ZZ£_id=23" + +#data +<div>ZZ∏_id=23</div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| "ZZâˆ_id=23" + +#data +<div>ZZ£=23</div> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,13): named-entity-without-semicolon +#document +| <html> +| <head> +| <body> +| <div> +| "ZZ£=23" + +#data +<div>ZZ&prod=23</div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| "ZZ&prod=23" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/html5test-com.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/html5test-com.dat new file mode 100644 index 000000000..8c6ec40cd --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/html5test-com.dat @@ -0,0 +1,291 @@ +#data +<div<div> +#errors +(1,9): expected-doctype-but-got-start-tag +(1,9): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div<div> + +#data +<div foo<bar=''> +#errors +(1,9): invalid-character-in-attribute-name +(1,16): expected-doctype-but-got-start-tag +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| foo<bar="" + +#data +<div foo=`bar`> +#errors +(1,10): equals-in-unquoted-attribute-value +(1,14): unexpected-character-in-unquoted-attribute-value +(1,15): expected-doctype-but-got-start-tag +(1,15): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| foo="`bar`" + +#data +<div \"foo=''> +#errors +(1,7): invalid-character-in-attribute-name +(1,14): expected-doctype-but-got-start-tag +(1,14): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| \"foo="" + +#data +<a href='\nbar'></a> +#errors +(1,16): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <a> +| href="\nbar" + +#data +<!DOCTYPE html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +⟨⟩ +#errors +(1,6): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "⟨⟩" + +#data +' +#errors +(1,6): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "'" + +#data +ⅈ +#errors +(1,12): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "â…ˆ" + +#data +𝕂 +#errors +(1,6): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "ð•‚" + +#data +∉ +#errors +(1,9): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "∉" + +#data +<?import namespace="foo" implementation="#bar"> +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,47): expected-doctype-but-got-eof +#document +| <!-- ?import namespace="foo" implementation="#bar" --> +| <html> +| <head> +| <body> + +#data +<!--foo--bar--> +#errors +(1,10): unexpected-char-in-comment +(1,15): expected-doctype-but-got-eof +#document +| <!-- foo--bar --> +| <html> +| <head> +| <body> + +#data +<![CDATA[x]]> +#errors +(1,2): expected-dashes-or-doctype +(1,13): expected-doctype-but-got-eof +#document +| <!-- [CDATA[x]] --> +| <html> +| <head> +| <body> + +#data +<textarea><!--</textarea>--></textarea> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,39): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <textarea> +| "<!--" +| "-->" + +#data +<textarea><!--</textarea>--> +#errors +(1,10): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <textarea> +| "<!--" +| "-->" + +#data +<style><!--</style>--></style> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,30): unexpected-end-tag +#document +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "-->" + +#data +<style><!--</style>--> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "-->" + +#data +<ul><li>A </li> <li>B</li></ul> +#errors +(1,4): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ul> +| <li> +| "A " +| " " +| <li> +| "B" + +#data +<table><form><input type=hidden><input></form><div></div></table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,13): unexpected-form-in-table +(1,32): unexpected-hidden-input-in-table +(1,39): unexpected-start-tag-implies-table-voodoo +(1,46): unexpected-end-tag-implies-table-voodoo +(1,46): unexpected-end-tag +(1,51): unexpected-start-tag-implies-table-voodoo +(1,57): unexpected-end-tag-implies-table-voodoo +#document +| <html> +| <head> +| <body> +| <input> +| <div> +| <table> +| <form> +| <input> +| type="hidden" + +#data +<i>A<b>B<p></i>C</b>D +#errors +(1,3): expected-doctype-but-got-start-tag +(1,15): adoption-agency-1.3 +(1,20): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <i> +| "A" +| <b> +| "B" +| <b> +| <p> +| <b> +| <i> +| "C" +| "D" + +#data +<div></div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> + +#data +<svg></svg> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <svg svg> + +#data +<math></math> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <math math> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/inbody01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/inbody01.dat new file mode 100644 index 000000000..10f6520f6 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/inbody01.dat @@ -0,0 +1,54 @@ +#data +<button>1</foo> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,15): unexpected-end-tag +(1,15): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <button> +| "1" + +#data +<foo>1<p>2</foo> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,16): unexpected-end-tag +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <foo> +| "1" +| <p> +| "2" + +#data +<dd>1</foo> +#errors +(1,4): expected-doctype-but-got-start-tag +(1,11): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <dd> +| "1" + +#data +<foo>1<dd>2</foo> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): unexpected-end-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <foo> +| "1" +| <dd> +| "2" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/isindex.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/isindex.dat new file mode 100644 index 000000000..42ef997f7 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/isindex.dat @@ -0,0 +1,47 @@ +#data +<isindex> +#errors +(1,9): expected-doctype-but-got-start-tag +(1,9): deprecated-tag +#document +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<isindex name="A" action="B" prompt="C" foo="D"> +#errors +(1,48): expected-doctype-but-got-start-tag +(1,48): deprecated-tag +#document +| <html> +| <head> +| <body> +| <form> +| action="B" +| <hr> +| <label> +| "C" +| <input> +| foo="D" +| name="isindex" +| <hr> + +#data +<form><isindex> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,15): deprecated-tag +(1,15): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <form> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/main-element.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/main-element.dat new file mode 100644 index 000000000..4b103bb0f --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/main-element.dat @@ -0,0 +1,46 @@ +#data +<!doctype html><p>foo<main>bar<p>baz +#errors +(1,36): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" +| <main> +| "bar" +| <p> +| "baz" + +#data +<!doctype html><main><p>foo</main>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <main> +| <p> +| "foo" +| "bar" + +#data +<!DOCTYPE html>xxx<svg><x><g><a><main><b> +#errors + * (1,42) unexpected HTML-like start tag token in foreign content + * (1,42) unexpected end of file +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "xxx" +| <svg svg> +| <svg x> +| <svg g> +| <svg a> +| <svg main> +| <b> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/pending-spec-changes-plain-text-unsafe.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/pending-spec-changes-plain-text-unsafe.dat Binary files differnew file mode 100644 index 000000000..3ee8cec90 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/pending-spec-changes-plain-text-unsafe.dat diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/pending-spec-changes.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/pending-spec-changes.dat new file mode 100644 index 000000000..1647d7f23 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/pending-spec-changes.dat @@ -0,0 +1,46 @@ +#data +<input type="hidden"><frameset> +#errors +(1,21): expected-doctype-but-got-start-tag +(1,31): unexpected-start-tag +(1,31): eof-in-frameset +#document +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><table><caption><svg>foo</table>bar +#errors +(1,47): unexpected-end-tag +(1,47): end-table-tag-in-caption +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <svg svg> +| "foo" +| "bar" + +#data +<table><tr><td><svg><desc><td></desc><circle> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,30): unexpected-cell-end-tag +(1,37): unexpected-end-tag +(1,45): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| <svg desc> +| <td> +| <circle> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/plain-text-unsafe.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/plain-text-unsafe.dat Binary files differnew file mode 100644 index 000000000..f40dd5760 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/plain-text-unsafe.dat diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/ruby.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/ruby.dat new file mode 100644 index 000000000..80d0c5331 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/ruby.dat @@ -0,0 +1,298 @@ +#data +<html><ruby>a<rb>b<rb></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rb> +| "b" +| <rb> + +#data +<html><ruby>a<rb>b<rt></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rb> +| "b" +| <rt> + +#data +<html><ruby>a<rb>b<rtc></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rb> +| "b" +| <rtc> + +#data +<html><ruby>a<rb>b<rp></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rb> +| "b" +| <rp> + +#data +<html><ruby>a<rb>b<span></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rb> +| "b" +| <span> + +#data +<html><ruby>a<rt>b<rb></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rt> +| "b" +| <rb> + +#data +<html><ruby>a<rt>b<rt></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rt> +| "b" +| <rt> + +#data +<html><ruby>a<rt>b<rtc></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rt> +| "b" +| <rtc> + +#data +<html><ruby>a<rt>b<rp></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rt> +| "b" +| <rp> + +#data +<html><ruby>a<rt>b<span></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rt> +| "b" +| <span> + +#data +<html><ruby>a<rtc>b<rb></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rtc> +| "b" +| <rb> + +#data +<html><ruby>a<rtc>b<rt>c<rt>d</ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rtc> +| "b" +| <rt> +| "c" +| <rt> +| "d" + +#data +<html><ruby>a<rtc>b<rtc></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rtc> +| "b" +| <rtc> + +#data +<html><ruby>a<rtc>b<rp></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rtc> +| "b" +| <rp> + +#data +<html><ruby>a<rtc>b<span></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rtc> +| "b" +| <span> + +#data +<html><ruby>a<rp>b<rb></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rp> +| "b" +| <rb> + +#data +<html><ruby>a<rp>b<rt></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rp> +| "b" +| <rt> + +#data +<html><ruby>a<rp>b<rtc></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rp> +| "b" +| <rtc> + +#data +<html><ruby>a<rp>b<rp></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rp> +| "b" +| <rp> + +#data +<html><ruby>a<rp>b<span></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rp> +| "b" +| <span> + +#data +<html><ruby><rtc><ruby>a<rb>b<rt></ruby></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| <rtc> +| <ruby> +| "a" +| <rb> +| "b" +| <rt> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scriptdata01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scriptdata01.dat new file mode 100644 index 000000000..ac698d282 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scriptdata01.dat @@ -0,0 +1,365 @@ +#data +FOO<script>'Hello'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'Hello'" +| "BAR" + +#data +FOO<script></script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "BAR" + +#data +FOO<script></script >BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "BAR" + +#data +FOO<script></script/>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,21): self-closing-flag-on-end-tag +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "BAR" + +#data +FOO<script></script/ >BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,20): unexpected-character-after-solidus-in-tag +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "BAR" + +#data +FOO<script type="text/plain"></scriptx>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,42): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "</scriptx>BAR" + +#data +FOO<script></script foo=">" dd>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,31): attributes-in-end-tag +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "BAR" + +#data +FOO<script>'<'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<'" +| "BAR" + +#data +FOO<script>'<!'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!'" +| "BAR" + +#data +FOO<script>'<!-'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!-'" +| "BAR" + +#data +FOO<script>'<!--'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!--'" +| "BAR" + +#data +FOO<script>'<!---'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!---'" +| "BAR" + +#data +FOO<script>'<!-->'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!-->'" +| "BAR" + +#data +FOO<script>'<!-->'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!-->'" +| "BAR" + +#data +FOO<script>'<!-- potato'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!-- potato'" +| "BAR" + +#data +FOO<script>'<!-- <sCrIpt'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!-- <sCrIpt'" +| "BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt>'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,56): expected-script-data-but-got-eof +(1,56): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt>'</script>BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt> -'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,58): expected-script-data-but-got-eof +(1,58): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt> -'</script>BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt> --'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,59): expected-script-data-but-got-eof +(1,59): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt> --'</script>BAR" + +#data +FOO<script>'<!-- <sCrIpt> -->'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "'<!-- <sCrIpt> -->'" +| "BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt> --!>'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,61): expected-script-data-but-got-eof +(1,61): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt> --!>'</script>BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt> -- >'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,61): expected-script-data-but-got-eof +(1,61): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt> -- >'</script>BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt '</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,56): expected-script-data-but-got-eof +(1,56): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt '</script>BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +(1,56): expected-script-data-but-got-eof +(1,56): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt/'</script>BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt\'</script>BAR +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt\'" +| "BAR" + +#data +FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR</script>QUX +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| type="text/plain" +| "'<!-- <sCrIpt/'</script>BAR" +| "QUX" + +#data +FOO<script><!--<script>-></script>--></script>QUX +#errors +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "FOO" +| <script> +| "<!--<script>-></script>-->" +| "QUX" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/adoption01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/adoption01.dat new file mode 100644 index 000000000..4e08d0e84 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/adoption01.dat @@ -0,0 +1,15 @@ +#data +<p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b> +#errors +#document +| <html> +| <head> +| <body> +| <p> +| <b> +| id="B" +| <script> +| "document.getElementById("A").id = "B"" +| <b> +| id="A" +| "TEXT" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/ark.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/ark.dat new file mode 100644 index 000000000..acbac41df --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/ark.dat @@ -0,0 +1,26 @@ +#data +<p><font size=4><font size=4><font size=4><script>document.getElementsByTagName("font")[2].setAttribute("size", "5");</script><font size=4><p>X +#errors +#document +| <html> +| <head> +| <body> +| <p> +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="5" +| <script> +| "document.getElementsByTagName("font")[2].setAttribute("size", "5");" +| <font> +| size="4" +| <p> +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| "X" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/webkit01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/webkit01.dat new file mode 100644 index 000000000..ef4a41ca0 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/scripted/webkit01.dat @@ -0,0 +1,28 @@ +#data +1<script>document.write("2")</script>3 +#errors +#document +| <html> +| <head> +| <body> +| "1" +| <script> +| "document.write("2")" +| "23" + +#data +1<script>document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")</script>4 +#errors +#document +| <html> +| <head> +| <body> +| "1" +| <script> +| "document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")" +| <script> +| "document.write('2')" +| "2" +| <script> +| "document.write('3')" +| "34" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tables01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tables01.dat new file mode 100644 index 000000000..f0caaa3c5 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tables01.dat @@ -0,0 +1,286 @@ +#data +<table><th> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,11): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <th> + +#data +<table><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,11): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><col foo='bar'> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,22): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <colgroup> +| <col> +| foo="bar" + +#data +<table><colgroup></html>foo +#errors +(1,7): expected-doctype-but-got-start-tag +(1,24): unexpected-end-tag +(1,27): foster-parenting-character-in-table +(1,27): foster-parenting-character-in-table +(1,27): foster-parenting-character-in-table +(1,27): eof-in-table +#document +| <html> +| <head> +| <body> +| "foo" +| <table> +| <colgroup> + +#data +<table></table><p>foo +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <table> +| <p> +| "foo" + +#data +<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,14): unexpected-end-tag +(1,24): unexpected-end-tag +(1,30): unexpected-end-tag +(1,41): unexpected-end-tag +(1,48): unexpected-end-tag +(1,56): unexpected-end-tag +(1,61): unexpected-end-tag +(1,69): unexpected-end-tag +(1,74): unexpected-end-tag +(1,82): unexpected-end-tag +(1,87): unexpected-end-tag +(1,91): unexpected-cell-in-table-body +(1,91): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><select><option>3</select></table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,15): unexpected-start-tag-implies-table-voodoo +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| "3" +| <table> + +#data +<table><select><table></table></select></table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,15): unexpected-start-tag-implies-table-voodoo +(1,22): unexpected-table-element-start-tag-in-select-in-table +(1,22): unexpected-start-tag-implies-end-tag +(1,39): unexpected-end-tag +(1,47): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <select> +| <table> +| <table> + +#data +<table><select></table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,15): unexpected-start-tag-implies-table-voodoo +(1,23): unexpected-table-element-end-tag-in-select-in-table +#document +| <html> +| <head> +| <body> +| <select> +| <table> + +#data +<table><select><option>A<tr><td>B</td></tr></table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,15): unexpected-start-tag-implies-table-voodoo +(1,28): unexpected-table-element-start-tag-in-select-in-table +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| "A" +| <table> +| <tbody> +| <tr> +| <td> +| "B" + +#data +<table><td></body></caption></col></colgroup></html>foo +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,18): unexpected-end-tag +(1,28): unexpected-end-tag +(1,34): unexpected-end-tag +(1,45): unexpected-end-tag +(1,52): unexpected-end-tag +(1,55): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "foo" + +#data +<table><td>A</table>B +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "A" +| "B" + +#data +<table><tr><caption> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <caption> + +#data +<table><tr></body></caption></col></colgroup></html></td></th><td>foo +#errors +(1,7): expected-doctype-but-got-start-tag +(1,18): unexpected-end-tag-in-table-row +(1,28): unexpected-end-tag-in-table-row +(1,34): unexpected-end-tag-in-table-row +(1,45): unexpected-end-tag-in-table-row +(1,52): unexpected-end-tag-in-table-row +(1,57): unexpected-end-tag-in-table-row +(1,62): unexpected-end-tag-in-table-row +(1,69): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "foo" + +#data +<table><td><tr> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,15): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <tr> + +#data +<table><td><button><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,23): unexpected-cell-end-tag +(1,23): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <button> +| <td> + +#data +<table><tr><td><svg><desc><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,30): unexpected-cell-end-tag +(1,30): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| <svg desc> +| <td> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/template.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/template.dat new file mode 100644 index 000000000..f370cc186 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/template.dat @@ -0,0 +1,1591 @@ +#data +<body><template>Hello</template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| "Hello" + +#data +<template>Hello</template> +#errors +no doctype +#document +| <html> +| <head> +| <template> +| content +| "Hello" +| <body> + +#data +<template></template><div></div> +#errors +no doctype +#document +| <html> +| <head> +| <template> +| content +| <body> +| <div> + +#data +<html><template>Hello</template> +#errors +no doctype +#document +| <html> +| <head> +| <template> +| content +| "Hello" +| <body> + +#data +<head><template><div></div></template></head> +#errors +no doctype +#document +| <html> +| <head> +| <template> +| content +| <div> +| <body> + +#data +<div><template><div><span></template><b> +#errors + * (1,6) missing DOCTYPE + * (1,38) mismatched template end tag + * (1,41) unexpected end of file +#document +| <html> +| <head> +| <body> +| <div> +| <template> +| content +| <div> +| <span> +| <b> + +#data +<div><template></div>Hello +#errors + * (1,6) missing DOCTYPE + * (1,22) unexpected token in template + * (1,27) unexpected end of file in template + * (1,27) unexpected end of file +#document +| <html> +| <head> +| <body> +| <div> +| <template> +| content +| "Hello" + +#data +<div></template></div> +#errors + * (1,6) missing DOCTYPE + * (1,17) unexpected template end tag +#document +| <html> +| <head> +| <body> +| <div> + +#data +<table><template></template></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content + +#data +<table><template></template></div> +#errors + * (1,8) missing DOCTYPE + * (1,35) unexpected token in table - foster parenting + * (1,35) unexpected end tag + * (1,35) unexpected end of file +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content + +#data +<table><div><template></template></div> +#errors + * (1,8) missing DOCTYPE + * (1,13) unexpected token in table - foster parenting + * (1,40) unexpected token in table - foster parenting + * (1,40) unexpected end of file +#document +| <html> +| <head> +| <body> +| <div> +| <template> +| content +| <table> + +#data +<table><template></template><div></div> +#errors +no doctype +bad div in table +bad /div in table +eof in table +#document +| <html> +| <head> +| <body> +| <div> +| <table> +| <template> +| content + +#data +<table> <template></template></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| " " +| <template> +| content + +#data +<table><tbody><template></template></tbody> +#errors +no doctype +eof in table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <template> +| content + +#data +<table><tbody><template></tbody></template> +#errors +no doctype +bad /tbody +eof in table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <template> +| content + +#data +<table><tbody><template></template></tbody></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <template> +| content + +#data +<table><thead><template></template></thead> +#errors +no doctype +eof in table +#document +| <html> +| <head> +| <body> +| <table> +| <thead> +| <template> +| content + +#data +<table><tfoot><template></template></tfoot> +#errors +no doctype +eof in table +#document +| <html> +| <head> +| <body> +| <table> +| <tfoot> +| <template> +| content + +#data +<select><template></template></select> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <select> +| <template> +| content + +#data +<select><template><option></option></template></select> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <select> +| <template> +| content +| <option> + +#data +<template><option></option></select><option></option></template> +#errors +no doctype +bad /select +#document +| <html> +| <head> +| <template> +| content +| <option> +| <option> +| <body> + +#data +<select><template></template><option></select> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <select> +| <template> +| content +| <option> + +#data +<select><option><template></template></select> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| <template> +| content + +#data +<select><template> +#errors +no doctype +eof in template +eof in select +#document +| <html> +| <head> +| <body> +| <select> +| <template> +| content + +#data +<select><option></option><template> +#errors +no doctype +eof in template +eof in select +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| <template> +| content + +#data +<select><option></option><template><option> +#errors +no doctype +eof in template +eof in select +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| <template> +| content +| <option> + +#data +<table><thead><template><td></template></table> +#errors + * (1,8) missing DOCTYPE +#document +| <html> +| <head> +| <body> +| <table> +| <thead> +| <template> +| content +| <td> + +#data +<table><template><thead></template></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content +| <thead> + +#data +<body><table><template><td></tr><div></template></table> +#errors +no doctype +bad </tr> +missing </div> +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content +| <td> +| <div> + +#data +<table><template><thead></template></thead></table> +#errors +no doctype +bad /thead after /template +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content +| <thead> + +#data +<table><thead><template><tr></template></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| <thead> +| <template> +| content +| <tr> + +#data +<table><template><tr></template></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content +| <tr> + +#data +<table><tr><template><td> +#errors +no doctype +eof in template +eof in table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <template> +| content +| <td> + +#data +<table><template><tr><template><td></template></tr></template></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content +| <tr> +| <template> +| content +| <td> + +#data +<table><template><tr><template><td></td></template></tr></template></table> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content +| <tr> +| <template> +| content +| <td> + +#data +<table><template><td></template> +#errors +no doctype +eof in table +#document +| <html> +| <head> +| <body> +| <table> +| <template> +| content +| <td> + +#data +<body><template><td></td></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <td> + +#data +<body><template><template><tr></tr></template><td></td></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <template> +| content +| <tr> +| <td> + +#data +<table><colgroup><template><col> +#errors +no doctype +eof in template +eof in table +#document +| <html> +| <head> +| <body> +| <table> +| <colgroup> +| <template> +| content +| <col> + +#data +<frameset><template><frame></frame></template></frameset> +#errors + * (1,11) missing DOCTYPE + * (1,21) unexpected start tag token + * (1,36) unexpected end tag token + * (1,47) unexpected end tag token +#document +| <html> +| <head> +| <frameset> +| <frame> + +#data +<template><frame></frame></frameset><frame></frame></template> +#errors + * (1,11) missing DOCTYPE + * (1,18) unexpected start tag + * (1,26) unexpected end tag + * (1,37) unexpected end tag + * (1,44) unexpected start tag + * (1,52) unexpected end tag +#document +| <html> +| <head> +| <template> +| content +| <body> + +#data +<template><div><frameset><span></span></div><span></span></template> +#errors +no doctype +bad frameset +#document +| <html> +| <head> +| <template> +| content +| <div> +| <span> +| <span> +| <body> + +#data +<body><template><div><frameset><span></span></div><span></span></template></body> +#errors +no doctype +bad frameset +#document +| <html> +| <head> +| <body> +| <template> +| content +| <div> +| <span> +| <span> + +#data +<body><template><script>var i = 1;</script><td></td></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <script> +| "var i = 1;" +| <td> + +#data +<body><template><tr><div></div></tr></template> +#errors +no doctype +foster-parented div +foster-parented /div +#document +| <html> +| <head> +| <body> +| <template> +| content +| <tr> +| <div> + +#data +<body><template><tr></tr><td></td></template> +#errors +no doctype +unexpected <td> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <tr> +| <tr> +| <td> + +#data +<body><template><td></td></tr><td></td></template> +#errors +no doctype +bad </tr> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <td> +| <td> + +#data +<body><template><td></td><tbody><td></td></template> +#errors +no doctype +bad <tbody> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <td> +| <td> + +#data +<body><template><td></td><caption></caption><td></td></template> +#errors + * (1,7) missing DOCTYPE + * (1,35) unexpected start tag in table row + * (1,45) unexpected end tag in table row +#document +| <html> +| <head> +| <body> +| <template> +| content +| <td> +| <td> + +#data +<body><template><td></td><colgroup></caption><td></td></template> +#errors + * (1,7) missing DOCTYPE + * (1,36) unexpected start tag in table row + * (1,46) unexpected end tag in table row +#document +| <html> +| <head> +| <body> +| <template> +| content +| <td> +| <td> + +#data +<body><template><td></td></table><td></td></template> +#errors +no doctype +bad </table> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <td> +| <td> + +#data +<body><template><tr></tr><tbody><tr></tr></template> +#errors +no doctype +bad <tbody> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <tr> +| <tr> + +#data +<body><template><tr></tr><caption><tr></tr></template> +#errors +no doctype +bad <caption> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <tr> +| <tr> + +#data +<body><template><tr></tr></table><tr></tr></template> +#errors +no doctype +bad </table> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <tr> +| <tr> + +#data +<body><template><thead></thead><caption></caption><tbody></tbody></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <thead> +| <caption> +| <tbody> + +#data +<body><template><thead></thead></table><tbody></tbody></template></body> +#errors +no doctype +bad </table> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <thead> +| <tbody> + +#data +<body><template><div><tr></tr></div></template> +#errors +no doctype +bad tr +bad /tr +#document +| <html> +| <head> +| <body> +| <template> +| content +| <div> + +#data +<body><template><em>Hello</em></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <em> +| "Hello" + +#data +<body><template><!--comment--></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <!-- comment --> + +#data +<body><template><style></style><td></td></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <style> +| <td> + +#data +<body><template><meta><td></td></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <meta> +| <td> + +#data +<body><template><link><td></td></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <link> +| <td> + +#data +<body><template><template><tr></tr></template><td></td></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <template> +| content +| <tr> +| <td> + +#data +<body><table><colgroup><template><col></col></template></colgroup></table></body> +#errors +no doctype +bad /col +#document +| <html> +| <head> +| <body> +| <table> +| <colgroup> +| <template> +| content +| <col> + +#data +<body a=b><template><div></div><body c=d><div></div></body></template></body> +#errors +no doctype +bad <body> +bad </body> +#document +| <html> +| <head> +| <body> +| a="b" +| <template> +| content +| <div> +| <div> + +#data +<html a=b><template><div><html b=c><span></template> +#errors +no doctype +bad <html> +missing end tags in template +#document +| <html> +| a="b" +| <head> +| <template> +| content +| <div> +| <span> +| <body> + +#data +<html a=b><template><col></col><html b=c><col></col></template> +#errors +no doctype +bad /col +bad html +bad /col +#document +| <html> +| a="b" +| <head> +| <template> +| content +| <col> +| <col> +| <body> + +#data +<html a=b><template><frame></frame><html b=c><frame></frame></template> +#errors +no doctype +bad frame +bad /frame +bad html +bad frame +bad /frame +#document +| <html> +| a="b" +| <head> +| <template> +| content +| <body> + +#data +<body><template><tr></tr><template></template><td></td></template> +#errors +no doctype +unexpected <td> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <tr> +| <template> +| content +| <tr> +| <td> + +#data +<body><template><thead></thead><template><tr></tr></template><tr></tr><tfoot></tfoot></template> +#errors +no doctype +#document +| <html> +| <head> +| <body> +| <template> +| content +| <thead> +| <template> +| content +| <tr> +| <tbody> +| <tr> +| <tfoot> + +#data +<body><template><template><b><template></template></template>text</template> +#errors +no doctype +missing </b> +#document +| <html> +| <head> +| <body> +| <template> +| content +| <template> +| content +| <b> +| <template> +| content +| "text" + +#data +<body><template><col><colgroup> +#errors +no doctype +bad colgroup +eof in template +#document +| <html> +| <head> +| <body> +| <template> +| content +| <col> + +#data +<body><template><col></colgroup> +#errors +no doctype +bogus /colgroup +eof in template +#document +| <html> +| <head> +| <body> +| <template> +| content +| <col> + +#data +<body><template><col><colgroup></template></body> +#errors +no doctype +bad colgroup +#document +| <html> +| <head> +| <body> +| <template> +| content +| <col> + +#data +<body><template><col><div> +#errors + * (1,7) missing DOCTYPE + * (1,27) unexpected token + * (1,27) unexpected end of file in template +#document +| <html> +| <head> +| <body> +| <template> +| content +| <col> + +#data +<body><template><col></div> +#errors +no doctype +bad /div +eof in template +#document +| <html> +| <head> +| <body> +| <template> +| content +| <col> + +#data +<body><template><col>Hello +#errors +no doctype +unexpected text +eof in template +#document +| <html> +| <head> +| <body> +| <template> +| content +| <col> + +#data +<body><template><i><menu>Foo</i> +#errors +no doctype +mising /menu +eof in template +#document +| <html> +| <head> +| <body> +| <template> +| content +| <i> +| <menu> +| <i> +| "Foo" + +#data +<body><template></div><div>Foo</div><template></template><tr></tr> +#errors +no doctype +bogus /div +bogus tr +bogus /tr +eof in template +#document +| <html> +| <head> +| <body> +| <template> +| content +| <div> +| "Foo" +| <template> +| content + +#data +<body><div><template></div><tr><td>Foo</td></tr></template> +#errors + * (1,7) missing DOCTYPE + * (1,28) unexpected token in template + * (1,60) unexpected end of file +#document +| <html> +| <head> +| <body> +| <div> +| <template> +| content +| <tr> +| <td> +| "Foo" + +#data +<template></figcaption><sub><table></table> +#errors +no doctype +bad /figcaption +eof in template +#document +| <html> +| <head> +| <template> +| content +| <sub> +| <table> +| <body> + +#data +<template><template> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <body> + +#data +<template><div> +#errors +no doctype +eof in template +#document +| <html> +| <head> +| <template> +| content +| <div> +| <body> + +#data +<template><template><div> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <div> +| <body> + +#data +<template><template><table> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <table> +| <body> + +#data +<template><template><tbody> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <tbody> +| <body> + +#data +<template><template><tr> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <tr> +| <body> + +#data +<template><template><td> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <td> +| <body> + +#data +<template><template><caption> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <caption> +| <body> + +#data +<template><template><colgroup> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <colgroup> +| <body> + +#data +<template><template><col> +#errors +no doctype +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <col> +| <body> + +#data +<template><template><tbody><select> +#errors + * (1,11) missing DOCTYPE + * (1,36) unexpected token in table - foster parenting + * (1,36) unexpected end of file in template + * (1,36) unexpected end of file in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <tbody> +| <select> +| <body> + +#data +<template><template><table>Foo +#errors +no doctype +foster-parenting text F +foster-parenting text o +foster-parenting text o +eof +eof +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| "Foo" +| <table> +| <body> + +#data +<template><template><frame> +#errors +no doctype +bad tag +eof +eof +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <body> + +#data +<template><template><script>var i +#errors +no doctype +eof in script +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <script> +| "var i" +| <body> + +#data +<template><template><style>var i +#errors +no doctype +eof in style +eof in template +eof in template +#document +| <html> +| <head> +| <template> +| content +| <template> +| content +| <style> +| "var i" +| <body> + +#data +<template><table></template><body><span>Foo +#errors +no doctype +missing /table +bad eof +#document +| <html> +| <head> +| <template> +| content +| <table> +| <body> +| <span> +| "Foo" + +#data +<template><td></template><body><span>Foo +#errors +no doctype +bad eof +#document +| <html> +| <head> +| <template> +| content +| <td> +| <body> +| <span> +| "Foo" + +#data +<template><object></template><body><span>Foo +#errors +no doctype +missing /object +bad eof +#document +| <html> +| <head> +| <template> +| content +| <object> +| <body> +| <span> +| "Foo" + +#data +<template><svg><template> +#errors +no doctype +eof in template +#document +| <html> +| <head> +| <template> +| content +| <svg svg> +| <svg template> +| <body> + +#data +<template><svg><foo><template><foreignObject><div></template><div> +#errors +no doctype +ugly template closure +bad eof +#document +| <html> +| <head> +| <template> +| content +| <svg svg> +| <svg foo> +| <svg template> +| <svg foreignObject> +| <div> +| <body> +| <div> + +#data +<dummy><template><span></dummy> +#errors +no doctype +bad end tag </dummy> +eof in template +eof in dummy +#document +| <html> +| <head> +| <body> +| <dummy> +| <template> +| content +| <span> + +#data +<body><table><tr><td><select><template>Foo</template><caption>A</table> +#errors +no doctype +(1,62): unexpected-caption-in-select-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| <template> +| content +| "Foo" +| <caption> +| "A" + +#data +<body></body><template> +#errors +no doctype +(1,23): template-after-body +(1,24): eof-in-template +#document +| <html> +| <head> +| <body> +| <template> +| content + +#data +<head></head><template> +#errors +no doctype +(1,23): template-after-head +(1,24): eof-in-template +#document +| <html> +| <head> +| <template> +| content +| <body> + +#data +<head></head><template>Foo</template> +#errors +no doctype +(1,23): template-after-head +#document +| <html> +| <head> +| <template> +| content +| "Foo" +| <body> + +#data +<!DOCTYPE HTML><dummy><table><template><table><template><table><script> +#errors +eof script +eof template +eof template +eof table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dummy> +| <table> +| <template> +| content +| <table> +| <template> +| content +| <table> +| <script> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests1.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests1.dat new file mode 100644 index 000000000..d6726e305 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests1.dat @@ -0,0 +1,1959 @@ +#data +Test +#errors +(1,0): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "Test" + +#data +<p>One<p>Two +#errors +(1,3): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <p> +| "One" +| <p> +| "Two" + +#data +Line1<br>Line2<br>Line3<br>Line4 +#errors +(1,0): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "Line1" +| <br> +| "Line2" +| <br> +| "Line3" +| <br> +| "Line4" + +#data +<html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<head> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<body> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><head> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><head></head> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><head></head><body> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><head></head><body></body> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><head><body></body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><head></body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><head><body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<html><body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +<head></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> + +#data +</head> +#errors +(1,7): expected-doctype-but-got-end-tag +#document +| <html> +| <head> +| <body> + +#data +</body> +#errors +(1,7): expected-doctype-but-got-end-tag element. +#document +| <html> +| <head> +| <body> + +#data +</html> +#errors +(1,7): expected-doctype-but-got-end-tag element. +#document +| <html> +| <head> +| <body> + +#data +<b><table><td><i></table> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,14): unexpected-cell-in-table-body +(1,25): unexpected-cell-end-tag +(1,25): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <table> +| <tbody> +| <tr> +| <td> +| <i> + +#data +<b><table><td></b><i></table>X +#errors +(1,3): expected-doctype-but-got-start-tag +(1,14): unexpected-cell-in-table-body +(1,18): unexpected-end-tag +(1,29): unexpected-cell-end-tag +(1,30): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <table> +| <tbody> +| <tr> +| <td> +| <i> +| "X" + +#data +<h1>Hello<h2>World +#errors +(1,4): expected-doctype-but-got-start-tag +(1,13): unexpected-start-tag +(1,18): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <h1> +| "Hello" +| <h2> +| "World" + +#data +<a><p>X<a>Y</a>Z</p></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,10): unexpected-start-tag-implies-end-tag +(1,10): adoption-agency-1.3 +(1,24): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <a> +| <p> +| <a> +| "X" +| <a> +| "Y" +| "Z" + +#data +<b><button>foo</b>bar +#errors +(1,3): expected-doctype-but-got-start-tag +(1,18): adoption-agency-1.3 +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <button> +| <b> +| "foo" +| "bar" + +#data +<!DOCTYPE html><span><button>foo</span>bar +#errors +(1,39): unexpected-end-tag +(1,42): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <span> +| <button> +| "foobar" + +#data +<p><b><div><marquee></p></b></div>X +#errors +(1,3): expected-doctype-but-got-start-tag +(1,11): unexpected-end-tag +(1,24): unexpected-end-tag +(1,28): unexpected-end-tag +(1,34): end-tag-too-early +(1,35): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <b> +| <div> +| <b> +| <marquee> +| <p> +| "X" + +#data +<script><div></script></div><title><p></title><p><p> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,28): unexpected-end-tag +#document +| <html> +| <head> +| <script> +| "<div>" +| <title> +| "<p>" +| <body> +| <p> +| <p> + +#data +<!--><div>--<!--> +#errors +(1,5): incorrect-comment +(1,10): expected-doctype-but-got-start-tag +(1,17): incorrect-comment +(1,17): expected-closing-tag-but-got-eof +#document +| <!-- --> +| <html> +| <head> +| <body> +| <div> +| "--" +| <!-- --> + +#data +<p><hr></p> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,11): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <p> +| <hr> +| <p> + +#data +<select><b><option><select><option></b></select>X +#errors +(1,8): expected-doctype-but-got-start-tag +(1,11): unexpected-start-tag-in-select +(1,27): unexpected-select-in-select +(1,39): unexpected-end-tag +(1,48): unexpected-end-tag +(1,49): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> +| "X" + +#data +<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y +#errors +(1,3): expected-doctype-but-got-start-tag +(1,14): unexpected-cell-in-table-body +(1,35): unexpected-start-tag-implies-end-tag +(1,40): unexpected-cell-end-tag +(1,43): unexpected-start-tag-implies-table-voodoo +(1,43): unexpected-start-tag-implies-end-tag +(1,43): unexpected-end-tag +(1,63): unexpected-start-tag-implies-end-tag +(1,64): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <a> +| <table> +| <tbody> +| <tr> +| <td> +| <a> +| <table> +| <a> +| <a> +| <b> +| "X" +| "C" +| <a> +| "Y" + +#data +<a X>0<b>1<a Y>2 +#errors +(1,5): expected-doctype-but-got-start-tag +(1,15): unexpected-start-tag-implies-end-tag +(1,15): adoption-agency-1.3 +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| x="" +| "0" +| <b> +| "1" +| <b> +| <a> +| y="" +| "2" + +#data +<!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X--> +#errors +(1,7): unexpected-dash-after-double-dash-in-comment +(1,14): expected-doctype-but-got-start-tag +(1,41): unexpected-start-tag-implies-table-voodoo +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): foster-parenting-character-in-table +(1,48): unexpected-cell-in-table-body +(1,63): unexpected-cell-end-tag +(1,71): eof-in-table +#document +| <!-- - --> +| <html> +| <head> +| <body> +| <font> +| <div> +| "helloexcite!" +| <b> +| "me!" +| <table> +| <tbody> +| <tr> +| <th> +| <i> +| "please!" +| <!-- X --> + +#data +<!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <li> +| "hello" +| <li> +| "world" +| <ul> +| "how" +| <li> +| "do" +| "you" +| <!-- do --> + +#data +<!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E +#errors +(1,54): unexpected-end-tag-in-select +(1,55): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "A" +| <option> +| "B" +| <optgroup> +| "C" +| <select> +| "DE" + +#data +< +#errors +(1,1): expected-tag-name +(1,1): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "<" + +#data +<# +#errors +(1,1): expected-tag-name +(1,1): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "<#" + +#data +</ +#errors +(1,2): expected-closing-tag-but-got-eof +(1,2): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "</" + +#data +</# +#errors +(1,2): expected-closing-tag-but-got-char +(1,3): expected-doctype-but-got-eof +#document +| <!-- # --> +| <html> +| <head> +| <body> + +#data +<? +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,2): expected-doctype-but-got-eof +#document +| <!-- ? --> +| <html> +| <head> +| <body> + +#data +<?# +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,3): expected-doctype-but-got-eof +#document +| <!-- ?# --> +| <html> +| <head> +| <body> + +#data +<! +#errors +(1,2): expected-dashes-or-doctype +(1,2): expected-doctype-but-got-eof +#document +| <!-- --> +| <html> +| <head> +| <body> + +#data +<!# +#errors +(1,2): expected-dashes-or-doctype +(1,3): expected-doctype-but-got-eof +#document +| <!-- # --> +| <html> +| <head> +| <body> + +#data +<?COMMENT?> +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,11): expected-doctype-but-got-eof +#document +| <!-- ?COMMENT? --> +| <html> +| <head> +| <body> + +#data +<!COMMENT> +#errors +(1,2): expected-dashes-or-doctype +(1,10): expected-doctype-but-got-eof +#document +| <!-- COMMENT --> +| <html> +| <head> +| <body> + +#data +</ COMMENT > +#errors +(1,2): expected-closing-tag-but-got-char +(1,12): expected-doctype-but-got-eof +#document +| <!-- COMMENT --> +| <html> +| <head> +| <body> + +#data +<?COM--MENT?> +#errors +(1,1): expected-tag-name-but-got-question-mark +(1,13): expected-doctype-but-got-eof +#document +| <!-- ?COM--MENT? --> +| <html> +| <head> +| <body> + +#data +<!COM--MENT> +#errors +(1,2): expected-dashes-or-doctype +(1,12): expected-doctype-but-got-eof +#document +| <!-- COM--MENT --> +| <html> +| <head> +| <body> + +#data +</ COM--MENT > +#errors +(1,2): expected-closing-tag-but-got-char +(1,14): expected-doctype-but-got-eof +#document +| <!-- COM--MENT --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><style> EOF +#errors +(1,26): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| " EOF" +| <body> + +#data +<!DOCTYPE html><script> <!-- </script> --> </script> EOF +#errors +(1,52): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| " <!-- " +| " " +| <body> +| "--> EOF" + +#data +<b><p></b>TEST +#errors +(1,3): expected-doctype-but-got-start-tag +(1,10): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <b> +| <p> +| <b> +| "TEST" + +#data +<p id=a><b><p id=b></b>TEST +#errors +(1,8): expected-doctype-but-got-start-tag +(1,19): unexpected-end-tag +(1,23): adoption-agency-1.2 +#document +| <html> +| <head> +| <body> +| <p> +| id="a" +| <b> +| <p> +| id="b" +| "TEST" + +#data +<b id=a><p><b id=b></p></b>TEST +#errors +(1,8): expected-doctype-but-got-start-tag +(1,23): unexpected-end-tag +(1,27): adoption-agency-1.2 +(1,31): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| id="a" +| <p> +| <b> +| id="b" +| "TEST" + +#data +<!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body> +#errors +(1,61): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "U-test" +| <body> +| <div> +| <p> +| "Test" +| <u> + +#data +<!DOCTYPE html><font><table></font></table></font> +#errors +(1,35): unexpected-end-tag-implies-table-voodoo +(1,35): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <table> + +#data +<font><p>hello<b>cruel</font>world +#errors +(1,6): expected-doctype-but-got-start-tag +(1,29): adoption-agency-1.3 +(1,29): adoption-agency-1.3 +(1,34): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <font> +| <p> +| <font> +| "hello" +| <b> +| "cruel" +| <b> +| "world" + +#data +<b>Test</i>Test +#errors +(1,3): expected-doctype-but-got-start-tag +(1,11): unexpected-end-tag +(1,15): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| "TestTest" + +#data +<b>A<cite>B<div>C +#errors +(1,3): expected-doctype-but-got-start-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| "A" +| <cite> +| "B" +| <div> +| "C" + +#data +<b>A<cite>B<div>C</cite>D +#errors +(1,3): expected-doctype-but-got-start-tag +(1,24): unexpected-end-tag +(1,25): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| "A" +| <cite> +| "B" +| <div> +| "CD" + +#data +<b>A<cite>B<div>C</b>D +#errors +(1,3): expected-doctype-but-got-start-tag +(1,21): adoption-agency-1.3 +(1,22): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| "A" +| <cite> +| "B" +| <div> +| <b> +| "C" +| "D" + +#data + +#errors +(1,0): expected-doctype-but-got-eof +#document +| <html> +| <head> +| <body> + +#data +<DIV> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,5): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> + +#data +<DIV> abc +#errors +(1,5): expected-doctype-but-got-start-tag +(1,9): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc" + +#data +<DIV> abc <B> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,13): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> + +#data +<DIV> abc <B> def +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def" + +#data +<DIV> abc <B> def <I> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> + +#data +<DIV> abc <B> def <I> ghi +#errors +(1,5): expected-doctype-but-got-start-tag +(1,25): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi" + +#data +<DIV> abc <B> def <I> ghi <P> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,29): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <p> + +#data +<DIV> abc <B> def <I> ghi <P> jkl +#errors +(1,5): expected-doctype-but-got-start-tag +(1,33): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <p> +| " jkl" + +#data +<DIV> abc <B> def <I> ghi <P> jkl </B> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,38): adoption-agency-1.3 +(1,38): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <i> +| <p> +| <b> +| " jkl " + +#data +<DIV> abc <B> def <I> ghi <P> jkl </B> mno +#errors +(1,5): expected-doctype-but-got-start-tag +(1,38): adoption-agency-1.3 +(1,42): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <i> +| <p> +| <b> +| " jkl " +| " mno" + +#data +<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,38): adoption-agency-1.3 +(1,47): adoption-agency-1.3 +(1,47): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <i> +| <p> +| <i> +| <b> +| " jkl " +| " mno " + +#data +<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr +#errors +(1,5): expected-doctype-but-got-start-tag +(1,38): adoption-agency-1.3 +(1,47): adoption-agency-1.3 +(1,51): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <i> +| <p> +| <i> +| <b> +| " jkl " +| " mno " +| " pqr" + +#data +<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,38): adoption-agency-1.3 +(1,47): adoption-agency-1.3 +(1,56): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <i> +| <p> +| <i> +| <b> +| " jkl " +| " mno " +| " pqr " + +#data +<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu +#errors +(1,5): expected-doctype-but-got-start-tag +(1,38): adoption-agency-1.3 +(1,47): adoption-agency-1.3 +(1,60): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " abc " +| <b> +| " def " +| <i> +| " ghi " +| <i> +| <p> +| <i> +| <b> +| " jkl " +| " mno " +| " pqr " +| " stu" + +#data +<test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> +#errors +(1,1040): expected-doctype-but-got-start-tag +(1,1040): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <test> +| attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------="" + +#data +<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe +#errors +(1,15): expected-doctype-but-got-start-tag +(1,39): unexpected-start-tag-implies-table-voodoo +(1,39): unexpected-start-tag-implies-end-tag +(1,39): unexpected-end-tag +(1,45): foster-parenting-character-in-table +(1,45): foster-parenting-character-in-table +(1,68): foster-parenting-character-in-table +(1,71): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| href="blah" +| "aba" +| <a> +| href="foo" +| "br" +| <a> +| href="foo" +| "x" +| <table> +| <tbody> +| <tr> +| <td> +| <a> +| href="foo" +| "aoe" + +#data +<a href="blah">aba<table><tr><td><a href="foo">br</td></tr>x</table>aoe +#errors +(1,15): expected-doctype-but-got-start-tag +(1,54): unexpected-cell-end-tag +(1,68): unexpected text in table +(1,71): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| href="blah" +| "abax" +| <table> +| <tbody> +| <tr> +| <td> +| <a> +| href="foo" +| "br" +| "aoe" + +#data +<table><a href="blah">aba<tr><td><a href="foo">br</td></tr>x</table>aoe +#errors +(1,7): expected-doctype-but-got-start-tag +(1,22): unexpected-start-tag-implies-table-voodoo +(1,29): foster-parenting-character-in-table +(1,29): foster-parenting-character-in-table +(1,29): foster-parenting-character-in-table +(1,54): unexpected-cell-end-tag +(1,68): foster-parenting-character-in-table +(1,71): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| href="blah" +| "aba" +| <a> +| href="blah" +| "x" +| <table> +| <tbody> +| <tr> +| <td> +| <a> +| href="foo" +| "br" +| <a> +| href="blah" +| "aoe" + +#data +<a href=a>aa<marquee>aa<a href=b>bb</marquee>aa +#errors +(1,10): expected-doctype-but-got-start-tag +(1,45): end-tag-too-early +(1,47): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| href="a" +| "aa" +| <marquee> +| "aa" +| <a> +| href="b" +| "bb" +| "aa" + +#data +<wbr><strike><code></strike><code><strike></code> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,28): adoption-agency-1.3 +(1,49): adoption-agency-1.3 +(1,49): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <wbr> +| <strike> +| <code> +| <code> +| <code> +| <strike> + +#data +<!DOCTYPE html><spacer>foo +#errors +(1,26): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <spacer> +| "foo" + +#data +<title><meta></title><link><title><meta></title> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <title> +| "<meta>" +| <link> +| <title> +| "<meta>" +| <body> + +#data +<style><!--</style><meta><script>--><link></script> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| "<!--" +| <meta> +| <script> +| "--><link>" +| <body> + +#data +<head><meta></head><link> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,25): unexpected-start-tag-out-of-my-head +#document +| <html> +| <head> +| <meta> +| <link> +| <body> + +#data +<table><tr><tr><td><td><span><th><span>X</table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,33): unexpected-cell-end-tag +(1,48): unexpected-cell-end-tag +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <tr> +| <td> +| <td> +| <span> +| <th> +| <span> +| "X" + +#data +<body><body><base><link><meta><title><p></title><body><p></body> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,12): unexpected-start-tag +(1,54): unexpected-start-tag +#document +| <html> +| <head> +| <body> +| <base> +| <link> +| <meta> +| <title> +| "<p>" +| <p> + +#data +<textarea><p></textarea> +#errors +(1,10): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <textarea> +| "<p>" + +#data +<p><image></p> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,10): unexpected-start-tag-treated-as +#document +| <html> +| <head> +| <body> +| <p> +| <img> + +#data +<a><table><a></table><p><a><div><a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,13): unexpected-start-tag-implies-table-voodoo +(1,13): unexpected-start-tag-implies-end-tag +(1,13): adoption-agency-1.3 +(1,27): unexpected-start-tag-implies-end-tag +(1,27): adoption-agency-1.2 +(1,32): unexpected-end-tag +(1,35): unexpected-start-tag-implies-end-tag +(1,35): adoption-agency-1.2 +(1,35): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <a> +| <table> +| <p> +| <a> +| <div> +| <a> + +#data +<head></p><meta><p> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,10): unexpected-end-tag +#document +| <html> +| <head> +| <meta> +| <body> +| <p> + +#data +<head></html><meta><p> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,19): expected-eof-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <meta> +| <p> + +#data +<b><table><td><i></table> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,14): unexpected-cell-in-table-body +(1,25): unexpected-cell-end-tag +(1,25): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <table> +| <tbody> +| <tr> +| <td> +| <i> + +#data +<b><table><td></b><i></table> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,14): unexpected-cell-in-table-body +(1,18): unexpected-end-tag +(1,29): unexpected-cell-end-tag +(1,29): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <table> +| <tbody> +| <tr> +| <td> +| <i> + +#data +<h1><h2> +#errors +(1,4): expected-doctype-but-got-start-tag +(1,8): unexpected-start-tag +(1,8): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <h1> +| <h2> + +#data +<a><p><a></a></p></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,9): unexpected-start-tag-implies-end-tag +(1,9): adoption-agency-1.3 +(1,21): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <a> +| <p> +| <a> +| <a> + +#data +<b><button></b></button></b> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,15): adoption-agency-1.3 +(1,28): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <b> +| <button> +| <b> + +#data +<p><b><div><marquee></p></b></div> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,11): unexpected-end-tag +(1,24): unexpected-end-tag +(1,28): unexpected-end-tag +(1,34): end-tag-too-early +(1,34): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <b> +| <div> +| <b> +| <marquee> +| <p> + +#data +<script></script></div><title></title><p><p> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,23): unexpected-end-tag +#document +| <html> +| <head> +| <script> +| <title> +| <body> +| <p> +| <p> + +#data +<p><hr></p> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,11): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <p> +| <hr> +| <p> + +#data +<select><b><option><select><option></b></select> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,11): unexpected-start-tag-in-select +(1,27): unexpected-select-in-select +(1,39): unexpected-end-tag +(1,48): unexpected-end-tag +(1,48): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> + +#data +<html><head><title></title><body></body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <title> +| <body> + +#data +<a><table><td><a><table></table><a></tr><a></table><a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,14): unexpected-cell-in-table-body +(1,35): unexpected-start-tag-implies-end-tag +(1,40): unexpected-cell-end-tag +(1,43): unexpected-start-tag-implies-table-voodoo +(1,43): unexpected-start-tag-implies-end-tag +(1,43): unexpected-end-tag +(1,54): unexpected-start-tag-implies-end-tag +(1,54): adoption-agency-1.2 +(1,54): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <a> +| <table> +| <tbody> +| <tr> +| <td> +| <a> +| <table> +| <a> +| <a> + +#data +<ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul> +#errors +(1,4): expected-doctype-but-got-start-tag +(1,45): end-tag-too-early +(1,58): end-tag-too-early +(1,69): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <ul> +| <li> +| <div> +| <li> +| <li> +| <li> +| <div> +| <li> +| <address> +| <li> +| <b> +| <em> +| <li> + +#data +<ul><li><ul></li><li>a</li></ul></li></ul> +#errors +(1,4): expected-doctype-but-got-start-tag +(1,17): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <ul> +| <li> +| <ul> +| <li> +| "a" + +#data +<frameset><frame><frameset><frame></frameset><noframes></noframes></frameset> +#errors +(1,10): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <frameset> +| <frame> +| <frameset> +| <frame> +| <noframes> + +#data +<h1><table><td><h3></table><h3></h1> +#errors +(1,4): expected-doctype-but-got-start-tag +(1,15): unexpected-cell-in-table-body +(1,27): unexpected-cell-end-tag +(1,31): unexpected-start-tag +(1,36): end-tag-too-early +#document +| <html> +| <head> +| <body> +| <h1> +| <table> +| <tbody> +| <tr> +| <td> +| <h3> +| <h3> + +#data +<table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <table> +| <colgroup> +| <col> +| <colgroup> +| <col> +| <col> +| <col> +| <colgroup> +| <col> +| <col> +| <thead> +| <tr> +| <td> + +#data +<table><col><tbody><col><tr><col><td><col></table><col> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,37): unexpected-cell-in-table-body +(1,55): unexpected-start-tag-ignored +#document +| <html> +| <head> +| <body> +| <table> +| <colgroup> +| <col> +| <tbody> +| <colgroup> +| <col> +| <tbody> +| <tr> +| <colgroup> +| <col> +| <tbody> +| <tr> +| <td> +| <colgroup> +| <col> + +#data +<table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,52): unexpected-cell-in-table-body +(1,80): unexpected-start-tag-ignored +#document +| <html> +| <head> +| <body> +| <table> +| <colgroup> +| <tbody> +| <colgroup> +| <tbody> +| <tr> +| <colgroup> +| <tbody> +| <tr> +| <td> +| <colgroup> + +#data +</strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> +#errors +(1,9): expected-doctype-but-got-end-tag +(1,9): unexpected-end-tag-before-html +(1,13): unexpected-end-tag-before-html +(1,18): unexpected-end-tag-before-html +(1,22): unexpected-end-tag-before-html +(1,26): unexpected-end-tag-before-html +(1,35): unexpected-end-tag-before-html +(1,39): unexpected-end-tag-before-html +(1,47): unexpected-end-tag-before-html +(1,52): unexpected-end-tag-before-html +(1,58): unexpected-end-tag-before-html +(1,64): unexpected-end-tag-before-html +(1,72): unexpected-end-tag-before-html +(1,79): unexpected-end-tag-before-html +(1,88): unexpected-end-tag-before-html +(1,93): unexpected-end-tag-before-html +(1,98): unexpected-end-tag-before-html +(1,103): unexpected-end-tag-before-html +(1,108): unexpected-end-tag-before-html +(1,113): unexpected-end-tag-before-html +(1,118): unexpected-end-tag-before-html +(1,130): unexpected-end-tag-after-body +(1,130): unexpected-end-tag-treated-as +(1,134): unexpected-end-tag +(1,140): unexpected-end-tag +(1,148): unexpected-end-tag +(1,155): unexpected-end-tag +(1,163): unexpected-end-tag +(1,172): unexpected-end-tag +(1,180): unexpected-end-tag +(1,185): unexpected-end-tag +(1,190): unexpected-end-tag +(1,195): unexpected-end-tag +(1,203): unexpected-end-tag +(1,210): unexpected-end-tag +(1,217): unexpected-end-tag +(1,225): unexpected-end-tag +(1,230): unexpected-end-tag +(1,238): unexpected-end-tag +(1,244): unexpected-end-tag +(1,251): unexpected-end-tag +(1,258): unexpected-end-tag +(1,269): unexpected-end-tag +(1,279): unexpected-end-tag +(1,287): unexpected-end-tag +(1,296): unexpected-end-tag +(1,300): unexpected-end-tag +(1,305): unexpected-end-tag +(1,310): unexpected-end-tag +(1,320): unexpected-end-tag +(1,331): unexpected-end-tag +(1,339): unexpected-end-tag +(1,347): unexpected-end-tag +(1,355): unexpected-end-tag +(1,365): end-tag-too-early +(1,378): end-tag-too-early +(1,387): end-tag-too-early +(1,393): end-tag-too-early +(1,399): end-tag-too-early +(1,404): end-tag-too-early +(1,415): end-tag-too-early +(1,425): end-tag-too-early +(1,432): end-tag-too-early +(1,437): end-tag-too-early +(1,442): end-tag-too-early +(1,447): unexpected-end-tag +(1,454): unexpected-end-tag +(1,460): unexpected-end-tag +(1,467): unexpected-end-tag +(1,476): end-tag-too-early +(1,486): end-tag-too-early +(1,495): end-tag-too-early +(1,513): expected-eof-but-got-end-tag +(1,513): unexpected-end-tag +(1,520): unexpected-end-tag +(1,529): unexpected-end-tag +(1,537): unexpected-end-tag +(1,547): unexpected-end-tag +(1,557): unexpected-end-tag +(1,568): unexpected-end-tag +(1,579): unexpected-end-tag +(1,590): unexpected-end-tag +(1,599): unexpected-end-tag +(1,611): unexpected-end-tag +(1,622): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <br> +| <p> + +#data +<table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,20): unexpected-end-tag-implies-table-voodoo +(1,20): unexpected-end-tag +(1,24): unexpected-end-tag-implies-table-voodoo +(1,24): unexpected-end-tag +(1,29): unexpected-end-tag-implies-table-voodoo +(1,29): unexpected-end-tag +(1,33): unexpected-end-tag-implies-table-voodoo +(1,33): unexpected-end-tag +(1,37): unexpected-end-tag-implies-table-voodoo +(1,37): unexpected-end-tag +(1,46): unexpected-end-tag-implies-table-voodoo +(1,46): unexpected-end-tag +(1,50): unexpected-end-tag-implies-table-voodoo +(1,50): unexpected-end-tag +(1,58): unexpected-end-tag-implies-table-voodoo +(1,58): unexpected-end-tag +(1,63): unexpected-end-tag-implies-table-voodoo +(1,63): unexpected-end-tag +(1,69): unexpected-end-tag-implies-table-voodoo +(1,69): end-tag-too-early +(1,75): unexpected-end-tag-implies-table-voodoo +(1,75): unexpected-end-tag +(1,83): unexpected-end-tag-implies-table-voodoo +(1,83): unexpected-end-tag +(1,90): unexpected-end-tag-implies-table-voodoo +(1,90): unexpected-end-tag +(1,99): unexpected-end-tag-implies-table-voodoo +(1,99): unexpected-end-tag +(1,104): unexpected-end-tag-implies-table-voodoo +(1,104): end-tag-too-early +(1,109): unexpected-end-tag-implies-table-voodoo +(1,109): end-tag-too-early +(1,114): unexpected-end-tag-implies-table-voodoo +(1,114): end-tag-too-early +(1,119): unexpected-end-tag-implies-table-voodoo +(1,119): end-tag-too-early +(1,124): unexpected-end-tag-implies-table-voodoo +(1,124): end-tag-too-early +(1,129): unexpected-end-tag-implies-table-voodoo +(1,129): end-tag-too-early +(1,136): unexpected-end-tag-in-table-row +(1,141): unexpected-end-tag-implies-table-voodoo +(1,141): unexpected-end-tag-treated-as +(1,145): unexpected-end-tag-implies-table-voodoo +(1,145): unexpected-end-tag +(1,151): unexpected-end-tag-implies-table-voodoo +(1,151): unexpected-end-tag +(1,159): unexpected-end-tag-implies-table-voodoo +(1,159): unexpected-end-tag +(1,166): unexpected-end-tag-implies-table-voodoo +(1,166): unexpected-end-tag +(1,174): unexpected-end-tag-implies-table-voodoo +(1,174): unexpected-end-tag +(1,183): unexpected-end-tag-implies-table-voodoo +(1,183): unexpected-end-tag +(1,196): unexpected-end-tag +(1,201): unexpected-end-tag +(1,206): unexpected-end-tag +(1,214): unexpected-end-tag +(1,221): unexpected-end-tag +(1,228): unexpected-end-tag +(1,236): unexpected-end-tag +(1,241): unexpected-end-tag +(1,249): unexpected-end-tag +(1,255): unexpected-end-tag +(1,262): unexpected-end-tag +(1,269): unexpected-end-tag +(1,280): unexpected-end-tag +(1,290): unexpected-end-tag +(1,298): unexpected-end-tag +(1,307): unexpected-end-tag +(1,311): unexpected-end-tag +(1,316): unexpected-end-tag +(1,321): unexpected-end-tag +(1,331): unexpected-end-tag +(1,342): unexpected-end-tag +(1,350): unexpected-end-tag +(1,358): unexpected-end-tag +(1,366): unexpected-end-tag +(1,376): end-tag-too-early +(1,389): end-tag-too-early +(1,398): end-tag-too-early +(1,404): end-tag-too-early +(1,410): end-tag-too-early +(1,415): end-tag-too-early +(1,426): end-tag-too-early +(1,436): end-tag-too-early +(1,443): end-tag-too-early +(1,448): end-tag-too-early +(1,453): end-tag-too-early +(1,458): unexpected-end-tag +(1,465): unexpected-end-tag +(1,471): unexpected-end-tag +(1,478): unexpected-end-tag +(1,487): end-tag-too-early +(1,497): end-tag-too-early +(1,506): end-tag-too-early +(1,524): expected-eof-but-got-end-tag +(1,524): unexpected-end-tag +(1,531): unexpected-end-tag +(1,540): unexpected-end-tag +(1,548): unexpected-end-tag +(1,558): unexpected-end-tag +(1,568): unexpected-end-tag +(1,579): unexpected-end-tag +(1,590): unexpected-end-tag +(1,601): unexpected-end-tag +(1,610): unexpected-end-tag +(1,622): unexpected-end-tag +(1,633): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <br> +| <table> +| <tbody> +| <tr> +| <p> + +#data +<frameset> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,10): eof-in-frameset +#document +| <html> +| <head> +| <frameset> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests10.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests10.dat new file mode 100644 index 000000000..3e9a9f19b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests10.dat @@ -0,0 +1,847 @@ +#data +<!DOCTYPE html><svg></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> + +#data +<!DOCTYPE html><svg></svg><![CDATA[a]]> +#errors +(1,28) expected-dashes-or-doctype +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <!-- [CDATA[a]] --> + +#data +<!DOCTYPE html><body><svg></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> + +#data +<!DOCTYPE html><body><select><svg></svg></select> +#errors +(1,34) unexpected-start-tag-in-select +(1,40) unexpected-end-tag-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!DOCTYPE html><body><select><option><svg></svg></option></select> +#errors +(1,42) unexpected-start-tag-in-select +(1,48) unexpected-end-tag-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!DOCTYPE html><body><table><svg></svg></table> +#errors +(1,33) foster-parenting-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <table> + +#data +<!DOCTYPE html><body><table><svg><g>foo</g></svg></table> +#errors +(1,33) foster-parenting-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg g> +| "foo" +| <table> + +#data +<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table> +#errors +(1,33) foster-parenting-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <table> + +#data +<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table> +#errors +(1,40) foster-parenting-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <table> +| <tbody> + +#data +<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table> +#errors +(1,44) foster-parenting-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" + +#data +<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux +#errors +(1,65) unexpected-html-element-in-foreign-content +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <p> +| "baz" +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux +#errors +(1,73) unexpected-end-tag +(1,73) expected-one-end-tag-but-got-another +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| "baz" +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux +#errors +(1,43) foster-parenting-start-tag svg +(1,66) unexpected HTML-like start tag token in foreign content +(1,66) foster-parenting-start-tag +(1,67) foster-parenting-character +(1,68) foster-parenting-character +(1,69) foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <p> +| "baz" +| <table> +| <colgroup> +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux +#errors +(1,49) unexpected-start-tag-in-select +(1,52) unexpected-start-tag-in-select +(1,59) unexpected-end-tag-in-select +(1,62) unexpected-start-tag-in-select +(1,69) unexpected-end-tag-in-select +(1,72) unexpected-start-tag-in-select +(1,83) unexpected-table-element-end-tag-in-select-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| "foobarbaz" +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux +#errors +(1,36) unexpected-start-tag-implies-table-voodoo +(1,41) unexpected-start-tag-in-select +(1,44) unexpected-start-tag-in-select +(1,51) unexpected-end-tag-in-select +(1,54) unexpected-start-tag-in-select +(1,61) unexpected-end-tag-in-select +(1,64) unexpected-start-tag-in-select +(1,75) unexpected-table-element-end-tag-in-select-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| "foobarbaz" +| <table> +| <p> +| "quux" + +#data +<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz +#errors +(1,40) expected-eof-but-got-start-tag +(1,63) unexpected-html-element-in-foreign-content +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz +#errors +(1,33) unexpected-start-tag-after-body +(1,56) unexpected-html-element-in-foreign-content +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg g> +| "foo" +| <svg g> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><frameset><svg><g></g><g></g><p><span> +#errors +(1,30) unexpected-start-tag-in-frameset +(1,33) unexpected-start-tag-in-frameset +(1,37) unexpected-end-tag-in-frameset +(1,40) unexpected-start-tag-in-frameset +(1,44) unexpected-end-tag-in-frameset +(1,47) unexpected-start-tag-in-frameset +(1,53) unexpected-start-tag-in-frameset +(1,53) eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span> +#errors +(1,41) unexpected-start-tag-after-frameset +(1,44) unexpected-start-tag-after-frameset +(1,48) unexpected-end-tag-after-frameset +(1,51) unexpected-start-tag-after-frameset +(1,55) unexpected-end-tag-after-frameset +(1,58) unexpected-start-tag-after-frameset +(1,64) unexpected-start-tag-after-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| <svg svg> +| xlink href="foo" + +#data +<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| xml:lang="en" +| <svg svg> +| <svg g> +| xlink href="foo" +| xml lang="en" + +#data +<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| xml:lang="en" +| <svg svg> +| <svg g> +| xlink href="foo" +| xml lang="en" + +#data +<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| xml:lang="en" +| <svg svg> +| <svg g> +| xlink href="foo" +| xml lang="en" +| "bar" + +#data +<svg></path> +#errors +(1,5) expected-doctype-but-got-start-tag +(1,12) unexpected-end-tag +(1,12) unexpected-end-tag +(1,12) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> + +#data +<div><svg></div>a +#errors +(1,5) expected-doctype-but-got-start-tag +(1,16) unexpected-end-tag +(1,16) end-tag-too-early +#document +| <html> +| <head> +| <body> +| <div> +| <svg svg> +| "a" + +#data +<div><svg><path></div>a +#errors +(1,5) expected-doctype-but-got-start-tag +(1,22) unexpected-end-tag +(1,22) end-tag-too-early +#document +| <html> +| <head> +| <body> +| <div> +| <svg svg> +| <svg path> +| "a" + +#data +<div><svg><path></svg><path> +#errors +(1,5) expected-doctype-but-got-start-tag +(1,22) unexpected-end-tag +(1,28) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <svg svg> +| <svg path> +| <path> + +#data +<div><svg><path><foreignObject><math></div>a +#errors +(1,5) expected-doctype-but-got-start-tag +(1,43) unexpected-end-tag +(1,43) end-tag-too-early +(1,44) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <svg svg> +| <svg path> +| <svg foreignObject> +| <math math> +| "a" + +#data +<div><svg><path><foreignObject><p></div>a +#errors +(1,5) expected-doctype-but-got-start-tag +(1,40) end-tag-too-early +(1,41) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <svg svg> +| <svg path> +| <svg foreignObject> +| <p> +| "a" + +#data +<!DOCTYPE html><svg><desc><div><svg><ul>a +#errors +(1,40) unexpected-html-element-in-foreign-content +(1,41) expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg desc> +| <div> +| <svg svg> +| <ul> +| "a" + +#data +<!DOCTYPE html><svg><desc><svg><ul>a +#errors +(1,35) unexpected-html-element-in-foreign-content +(1,36) expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg desc> +| <svg svg> +| <ul> +| "a" + +#data +<!DOCTYPE html><p><svg><desc><p> +#errors +(1,32) expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <svg svg> +| <svg desc> +| <p> + +#data +<!DOCTYPE html><p><svg><title><p> +#errors +(1,33) expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <svg svg> +| <svg title> +| <p> + +#data +<div><svg><path><foreignObject><p></foreignObject><p> +#errors +(1,5) expected-doctype-but-got-start-tag +(1,50) unexpected-end-tag +(1,53) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <svg svg> +| <svg path> +| <svg foreignObject> +| <p> +| <p> + +#data +<math><mi><div><object><div><span></span></div></object></div></mi><mi> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,71) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| <div> +| <object> +| <div> +| <span> +| <math mi> + +#data +<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,83) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| <svg svg> +| <svg foreignObject> +| <div> +| <div> +| <math mi> + +#data +<svg><script></script><path> +#errors +(1,5) expected-doctype-but-got-start-tag +(1,28) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| <svg script> +| <svg path> + +#data +<table><svg></svg><tr> +#errors +(1,7) expected-doctype-but-got-start-tag +(1,12) unexpected-start-tag-implies-table-voodoo +(1,22) eof-in-table +#document +| <html> +| <head> +| <body> +| <svg svg> +| <table> +| <tbody> +| <tr> + +#data +<math><mi><mglyph> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,18) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| <math mglyph> + +#data +<math><mi><malignmark> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,22) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| <math malignmark> + +#data +<math><mo><mglyph> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,18) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mo> +| <math mglyph> + +#data +<math><mo><malignmark> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,22) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mo> +| <math malignmark> + +#data +<math><mn><mglyph> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,18) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| <math mglyph> + +#data +<math><mn><malignmark> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,22) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| <math malignmark> + +#data +<math><ms><mglyph> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,18) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math ms> +| <math mglyph> + +#data +<math><ms><malignmark> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,22) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math ms> +| <math malignmark> + +#data +<math><mtext><mglyph> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,21) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mtext> +| <math mglyph> + +#data +<math><mtext><malignmark> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,25) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math mtext> +| <math malignmark> + +#data +<math><annotation-xml><svg></svg></annotation-xml><mi> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,54) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| <svg svg> +| <math mi> + +#data +<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,144) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| <svg svg> +| <svg foreignObject> +| <div> +| <math math> +| <math mi> +| <span> +| <svg path> +| <math mi> + +#data +<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi> +#errors +(1,6) expected-doctype-but-got-start-tag +(1,153) expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| <svg svg> +| <svg foreignObject> +| <math math> +| <math mi> +| <svg svg> +| <math mo> +| <span> +| <svg path> +| <math mi> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests11.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests11.dat new file mode 100644 index 000000000..ad62cdf65 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests11.dat @@ -0,0 +1,482 @@ +#data +<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentscripttype="" +| contentstyletype="" +| diffuseConstant="" +| edgeMode="" +| externalresourcesrequired="" +| filterUnits="" +| filterres="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data +<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' DIFFUSECONSTANT='' EDGEMODE='' EXTERNALRESOURCESREQUIRED='' FILTERRES='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentscripttype="" +| contentstyletype="" +| diffuseConstant="" +| edgeMode="" +| externalresourcesrequired="" +| filterUnits="" +| filterres="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data +<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' contentscripttype='' contentstyletype='' diffuseconstant='' edgemode='' externalresourcesrequired='' filterres='' filterunits='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentscripttype="" +| contentstyletype="" +| diffuseConstant="" +| edgeMode="" +| externalresourcesrequired="" +| filterUnits="" +| filterres="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data +<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| attributename="" +| attributetype="" +| basefrequency="" +| baseprofile="" +| calcmode="" +| clippathunits="" +| contentscripttype="" +| contentstyletype="" +| diffuseconstant="" +| edgemode="" +| externalresourcesrequired="" +| filterres="" +| filterunits="" +| glyphref="" +| gradienttransform="" +| gradientunits="" +| kernelmatrix="" +| kernelunitlength="" +| keypoints="" +| keysplines="" +| keytimes="" +| lengthadjust="" +| limitingconeangle="" +| markerheight="" +| markerunits="" +| markerwidth="" +| maskcontentunits="" +| maskunits="" +| numoctaves="" +| pathlength="" +| patterncontentunits="" +| patterntransform="" +| patternunits="" +| pointsatx="" +| pointsaty="" +| pointsatz="" +| preservealpha="" +| preserveaspectratio="" +| primitiveunits="" +| refx="" +| refy="" +| repeatcount="" +| repeatdur="" +| requiredextensions="" +| requiredfeatures="" +| specularconstant="" +| specularexponent="" +| spreadmethod="" +| startoffset="" +| stddeviation="" +| stitchtiles="" +| surfacescale="" +| systemlanguage="" +| tablevalues="" +| targetx="" +| targety="" +| textlength="" +| viewbox="" +| viewtarget="" +| xchannelselector="" +| ychannelselector="" +| zoomandpan="" + +#data +<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg altGlyph> +| <svg altGlyphDef> +| <svg altGlyphItem> +| <svg animateColor> +| <svg animateMotion> +| <svg animateTransform> +| <svg clipPath> +| <svg feBlend> +| <svg feColorMatrix> +| <svg feComponentTransfer> +| <svg feComposite> +| <svg feConvolveMatrix> +| <svg feDiffuseLighting> +| <svg feDisplacementMap> +| <svg feDistantLight> +| <svg feFlood> +| <svg feFuncA> +| <svg feFuncB> +| <svg feFuncG> +| <svg feFuncR> +| <svg feGaussianBlur> +| <svg feImage> +| <svg feMerge> +| <svg feMergeNode> +| <svg feMorphology> +| <svg feOffset> +| <svg fePointLight> +| <svg feSpecularLighting> +| <svg feSpotLight> +| <svg feTile> +| <svg feTurbulence> +| <svg foreignObject> +| <svg glyphRef> +| <svg linearGradient> +| <svg radialGradient> +| <svg textPath> + +#data +<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg altGlyph> +| <svg altGlyphDef> +| <svg altGlyphItem> +| <svg animateColor> +| <svg animateMotion> +| <svg animateTransform> +| <svg clipPath> +| <svg feBlend> +| <svg feColorMatrix> +| <svg feComponentTransfer> +| <svg feComposite> +| <svg feConvolveMatrix> +| <svg feDiffuseLighting> +| <svg feDisplacementMap> +| <svg feDistantLight> +| <svg feFlood> +| <svg feFuncA> +| <svg feFuncB> +| <svg feFuncG> +| <svg feFuncR> +| <svg feGaussianBlur> +| <svg feImage> +| <svg feMerge> +| <svg feMergeNode> +| <svg feMorphology> +| <svg feOffset> +| <svg fePointLight> +| <svg feSpecularLighting> +| <svg feSpotLight> +| <svg feTile> +| <svg feTurbulence> +| <svg foreignObject> +| <svg glyphRef> +| <svg linearGradient> +| <svg radialGradient> +| <svg textPath> + +#data +<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg altGlyph> +| <svg altGlyphDef> +| <svg altGlyphItem> +| <svg animateColor> +| <svg animateMotion> +| <svg animateTransform> +| <svg clipPath> +| <svg feBlend> +| <svg feColorMatrix> +| <svg feComponentTransfer> +| <svg feComposite> +| <svg feConvolveMatrix> +| <svg feDiffuseLighting> +| <svg feDisplacementMap> +| <svg feDistantLight> +| <svg feFlood> +| <svg feFuncA> +| <svg feFuncB> +| <svg feFuncG> +| <svg feFuncR> +| <svg feGaussianBlur> +| <svg feImage> +| <svg feMerge> +| <svg feMergeNode> +| <svg feMorphology> +| <svg feOffset> +| <svg fePointLight> +| <svg feSpecularLighting> +| <svg feSpotLight> +| <svg feTile> +| <svg feTurbulence> +| <svg foreignObject> +| <svg glyphRef> +| <svg linearGradient> +| <svg radialGradient> +| <svg textPath> + +#data +<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math altglyph> +| <math altglyphdef> +| <math altglyphitem> +| <math animatecolor> +| <math animatemotion> +| <math animatetransform> +| <math clippath> +| <math feblend> +| <math fecolormatrix> +| <math fecomponenttransfer> +| <math fecomposite> +| <math feconvolvematrix> +| <math fediffuselighting> +| <math fedisplacementmap> +| <math fedistantlight> +| <math feflood> +| <math fefunca> +| <math fefuncb> +| <math fefuncg> +| <math fefuncr> +| <math fegaussianblur> +| <math feimage> +| <math femerge> +| <math femergenode> +| <math femorphology> +| <math feoffset> +| <math fepointlight> +| <math fespecularlighting> +| <math fespotlight> +| <math fetile> +| <math feturbulence> +| <math foreignobject> +| <math glyphref> +| <math lineargradient> +| <math radialgradient> +| <math textpath> + +#data +<!DOCTYPE html><body><svg><solidColor /></svg> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg solidcolor> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests12.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests12.dat new file mode 100644 index 000000000..63107d277 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests12.dat @@ -0,0 +1,62 @@ +#data +<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" +| <math math> +| <math mtext> +| <i> +| "baz" +| <math annotation-xml> +| <svg svg> +| <svg desc> +| <b> +| "eggs" +| <svg g> +| <svg foreignObject> +| <p> +| "spam" +| <table> +| <tbody> +| <tr> +| <td> +| <img> +| <svg g> +| "quux" +| "bar" + +#data +<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "foo" +| <math math> +| <math mtext> +| <i> +| "baz" +| <math annotation-xml> +| <svg svg> +| <svg desc> +| <b> +| "eggs" +| <svg g> +| <svg foreignObject> +| <p> +| "spam" +| <table> +| <tbody> +| <tr> +| <td> +| <img> +| <svg g> +| "quux" +| "bar" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests14.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests14.dat new file mode 100644 index 000000000..a08b7649e --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests14.dat @@ -0,0 +1,75 @@ +#data +<!DOCTYPE html><html><body><xyz:abc></xyz:abc> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xyz:abc> + +#data +<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xyz:abc> +| <span> + +#data +<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc> +#errors +(1,38): non-html-root +#document +| <!DOCTYPE html> +| <html> +| abc:def="gh" +| <head> +| <body> +| <xyz:abc> + +#data +<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo> +#errors +(1,53): non-html-root +#document +| <!DOCTYPE html> +| <html> +| xml:lang="bar" +| <head> +| <body> + +#data +<!DOCTYPE html><html 123=456> +#errors +#document +| <!DOCTYPE html> +| <html> +| 123="456" +| <head> +| <body> + +#data +<!DOCTYPE html><html 123=456><html 789=012> +#errors +(1,43): non-html-root +#document +| <!DOCTYPE html> +| <html> +| 123="456" +| 789="012" +| <head> +| <body> + +#data +<!DOCTYPE html><html><body 789=012> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| 789="012" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests15.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests15.dat new file mode 100644 index 000000000..93d06a871 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests15.dat @@ -0,0 +1,216 @@ +#data +<!DOCTYPE html><p><b><i><u></p> <p>X +#errors +(1,31): unexpected-end-tag +(1,36): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <b> +| <i> +| <u> +| <b> +| <i> +| <u> +| " " +| <p> +| "X" + +#data +<p><b><i><u></p> +<p>X +#errors +(1,3): expected-doctype-but-got-start-tag +(1,16): unexpected-end-tag +(2,4): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <b> +| <i> +| <u> +| <b> +| <i> +| <u> +| " +" +| <p> +| "X" + +#data +<!doctype html></html> <head> +#errors +(1,29): expected-eof-but-got-start-tag +(1,29): unexpected-start-tag-ignored +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " " + +#data +<!doctype html></body><meta> +#errors +(1,28): unexpected-start-tag-after-body +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <meta> + +#data +<html></html><!-- foo --> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <!-- foo --> + +#data +<!doctype html></body><title>X</title> +#errors +(1,29): unexpected-start-tag-after-body +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <title> +| "X" + +#data +<!doctype html><table> X<meta></table> +#errors +(1,23): foster-parenting-character +(1,24): foster-parenting-character +(1,30): foster-parenting-start-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " X" +| <meta> +| <table> + +#data +<!doctype html><table> x</table> +#errors +(1,23): foster-parenting-character +(1,24): foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> + +#data +<!doctype html><table> x </table> +#errors +(1,23): foster-parenting-character +(1,24): foster-parenting-character +(1,25): foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x " +| <table> + +#data +<!doctype html><table><tr> x</table> +#errors +(1,27): foster-parenting-character +(1,28): foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table>X<style> <tr>x </style> </table> +#errors +(1,23): foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <style> +| " <tr>x " +| " " + +#data +<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> +#errors +(1,30): foster-parenting-start-tag +(1,31): foster-parenting-character +(1,32): foster-parenting-character +(1,33): foster-parenting-character +(1,37): foster-parenting-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <a> +| "foo" +| <table> +| " " +| <tbody> +| <tr> +| <td> +| "bar" +| " " + +#data +<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,7): unexpected-start-tag-ignored +(1,15): unexpected-end-tag +(1,23): unexpected-end-tag +(1,33): unexpected-start-tag +(1,99): expected-named-closing-tag-but-got-eof +(1,99): eof-in-frameset +#document +| <html> +| <head> +| <frameset> +| <frame> +| <frameset> +| <frame> +| <noframes> +| "</frameset><noframes>" + +#data +<!DOCTYPE html><object></html> +#errors +(1,30): expected-body-in-scope +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests16.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests16.dat new file mode 100644 index 000000000..121915777 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests16.dat @@ -0,0 +1,2458 @@ +#data +<!doctype html><script> +#errors +(1,23): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script>a +#errors +(1,24): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<!doctype html><script>< +#errors +(1,24): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<!doctype html><script></ +#errors +(1,25): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<!doctype html><script></S +#errors +(1,26): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<!doctype html><script></SC +#errors +(1,27): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<!doctype html><script></SCR +#errors +(1,28): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<!doctype html><script></SCRI +#errors +(1,29): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<!doctype html><script></SCRIP +#errors +(1,30): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +(1,31): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +(1,32): expected-attribute-name-but-got-eof +(1,32): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script></s +#errors +(1,26): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<!doctype html><script></sc +#errors +(1,27): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<!doctype html><script></scr +#errors +(1,28): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<!doctype html><script></scri +#errors +(1,29): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<!doctype html><script></scrip +#errors +(1,30): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<!doctype html><script></script +#errors +(1,31): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<!doctype html><script></script +#errors +(1,32): expected-attribute-name-but-got-eof +(1,32): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script><! +#errors +(1,25): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<!doctype html><script><!a +#errors +(1,26): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<!doctype html><script><!- +#errors +(1,26): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<!doctype html><script><!-a +#errors +(1,27): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<!doctype html><script><!-- +#errors +(1,27): expected-named-closing-tag-but-got-eof +(1,27): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--a +#errors +(1,28): expected-named-closing-tag-but-got-eof +(1,28): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<!doctype html><script><!--< +#errors +(1,28): expected-named-closing-tag-but-got-eof +(1,28): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<!doctype html><script><!--<a +#errors +(1,29): expected-named-closing-tag-but-got-eof +(1,29): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<!doctype html><script><!--</ +#errors +(1,29): expected-named-closing-tag-but-got-eof +(1,29): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<!doctype html><script><!--</script +#errors +(1,35): expected-named-closing-tag-but-got-eof +(1,35): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<!doctype html><script><!--</script +#errors +(1,36): expected-attribute-name-but-got-eof +(1,36): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--<s +#errors +(1,29): expected-named-closing-tag-but-got-eof +(1,29): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<!doctype html><script><!--<script +#errors +(1,34): expected-named-closing-tag-but-got-eof +(1,34): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<!doctype html><script><!--<script +#errors +(1,35): eof-in-script-in-script +(1,35): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<!doctype html><script><!--<script < +#errors +(1,36): eof-in-script-in-script +(1,36): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<!doctype html><script><!--<script <a +#errors +(1,37): eof-in-script-in-script +(1,37): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<!doctype html><script><!--<script </ +#errors +(1,37): eof-in-script-in-script +(1,37): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<!doctype html><script><!--<script </s +#errors +(1,38): eof-in-script-in-script +(1,38): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +(1,43): eof-in-script-in-script +(1,43): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<!doctype html><script><!--<script </scripta +#errors +(1,44): eof-in-script-in-script +(1,44): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +(1,44): expected-named-closing-tag-but-got-eof +(1,44): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script> +#errors +(1,44): expected-named-closing-tag-but-got-eof +(1,44): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<!doctype html><script><!--<script </script/ +#errors +(1,44): expected-named-closing-tag-but-got-eof +(1,44): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<!doctype html><script><!--<script </script < +#errors +(1,45): expected-named-closing-tag-but-got-eof +(1,45): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<!doctype html><script><!--<script </script <a +#errors +(1,46): expected-named-closing-tag-but-got-eof +(1,46): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<!doctype html><script><!--<script </script </ +#errors +(1,46): expected-named-closing-tag-but-got-eof +(1,46): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +(1,52): expected-named-closing-tag-but-got-eof +(1,52): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +(1,53): expected-attribute-name-but-got-eof +(1,53): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script/ +#errors +(1,53): unexpected-EOF-after-solidus-in-tag +(1,53): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script - +#errors +(1,36): eof-in-script-in-script +(1,36): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<!doctype html><script><!--<script -a +#errors +(1,37): eof-in-script-in-script +(1,37): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<!doctype html><script><!--<script -< +#errors +(1,37): eof-in-script-in-script +(1,37): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -<" +| <body> + +#data +<!doctype html><script><!--<script -- +#errors +(1,37): eof-in-script-in-script +(1,37): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<!doctype html><script><!--<script --a +#errors +(1,38): eof-in-script-in-script +(1,38): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<!doctype html><script><!--<script --< +#errors +(1,38): eof-in-script-in-script +(1,38): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --<" +| <body> + +#data +<!doctype html><script><!--<script --> +#errors +(1,38): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script -->< +#errors +(1,39): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<!doctype html><script><!--<script --></ +#errors +(1,40): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +(1,46): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +(1,47): expected-attribute-name-but-got-eof +(1,47): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script/ +#errors +(1,47): unexpected-EOF-after-solidus-in-tag +(1,47): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script><\/script>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<!doctype html><script><!--<script></scr'+'ipt>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>--><!--</script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-- ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- -></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- - ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<!doctype html><script><!--<script>--!></script>X +#errors +(1,49): expected-named-closing-tag-but-got-eof +(1,49): unexpected-EOF-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<!doctype html><script><!--<scr'+'ipt></script>--></script> +#errors +(1,59): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<!doctype html><script><!--<script></scr'+'ipt></script>X +#errors +(1,57): expected-named-closing-tag-but-got-eof +(1,57): unexpected-eof-in-text-mode +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<!doctype html><style><!--<style></style>--></style> +#errors +(1,52): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<!doctype html><style><!--</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<!doctype html><style><!--...</style>...--></style> +#errors +(1,51): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<!doctype html><style><!--...<style><!--...--!></style>--></style> +#errors +(1,66): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<!doctype html><style><!--...</style><!-- --><style>@import ...</style> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<!doctype html><style>...<style><!--...</style><!-- --></style> +#errors +(1,63): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<!doctype html><style>...<!--[if IE]><style>...</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<!doctype html><title><!--<title></title>--></title> +#errors +(1,52): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "<!--<title>" +| <body> +| "-->" + +#data +<!doctype html><title></title></title> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "</title>" +| <body> + +#data +<!doctype html><title>foo/title><link></head><body>X +#errors +(1,52): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<!doctype html><noscript><!--<noscript></noscript>--></noscript> +#errors +(1,64): unexpected-end-tag +#script-on +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<!doctype html><noscript><!--<noscript></noscript>--></noscript> +#errors +#script-off +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| <!-- <noscript></noscript> --> +| <body> + +#data +<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> +#errors +#script-on +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> +#errors +#script-off +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| <!-- </noscript>X<noscript> --> +| <body> + +#data +<!doctype html><noscript><iframe></noscript>X +#errors +#script-on +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<!doctype html><noscript><iframe></noscript>X +#errors + * (1,34) unexpected token in head noscript + * (1,46) unexpected EOF +#script-off +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| <body> +| <iframe> +| "</noscript>X" + +#data +<!doctype html><noframes><!--<noframes></noframes>--></noframes> +#errors +(1,64): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<!doctype html><noframes><body><script><!--...</script></body></noframes></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<!doctype html><textarea><!--<textarea></textarea>--></textarea> +#errors +(1,64): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<!doctype html><textarea></textarea></textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<!doctype html><textarea><</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<" + +#data +<!doctype html><textarea>a<b</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "a<b" + +#data +<!doctype html><iframe><!--<iframe></iframe>--></iframe> +#errors +(1,56): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<!doctype html><xmp><!--<xmp></xmp>--></xmp> +#errors +(1,44): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<!doctype html><noembed><!--<noembed></noembed>--></noembed> +#errors +(1,60): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<script> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,8): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script>a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,9): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<script>< +#errors +(1,8): expected-doctype-but-got-start-tag +(1,9): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<script></ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,10): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<script></S +#errors +(1,8): expected-doctype-but-got-start-tag +(1,11): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<script></SC +#errors +(1,8): expected-doctype-but-got-start-tag +(1,12): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<script></SCR +#errors +(1,8): expected-doctype-but-got-start-tag +(1,13): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<script></SCRI +#errors +(1,8): expected-doctype-but-got-start-tag +(1,14): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<script></SCRIP +#errors +(1,8): expected-doctype-but-got-start-tag +(1,15): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<script></SCRIPT +#errors +(1,8): expected-doctype-but-got-start-tag +(1,16): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<script></SCRIPT +#errors +(1,8): expected-doctype-but-got-start-tag +(1,17): expected-attribute-name-but-got-eof +(1,17): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script></s +#errors +(1,8): expected-doctype-but-got-start-tag +(1,11): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<script></sc +#errors +(1,8): expected-doctype-but-got-start-tag +(1,12): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<script></scr +#errors +(1,8): expected-doctype-but-got-start-tag +(1,13): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<script></scri +#errors +(1,8): expected-doctype-but-got-start-tag +(1,14): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<script></scrip +#errors +(1,8): expected-doctype-but-got-start-tag +(1,15): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<script></script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,16): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<script></script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,17): expected-attribute-name-but-got-eof +(1,17): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script><! +#errors +(1,8): expected-doctype-but-got-start-tag +(1,10): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<script><!a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,11): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<script><!- +#errors +(1,8): expected-doctype-but-got-start-tag +(1,11): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<script><!-a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,12): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<script><!-- +#errors +(1,8): expected-doctype-but-got-start-tag +(1,12): expected-named-closing-tag-but-got-eof +(1,12): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,13): expected-named-closing-tag-but-got-eof +(1,13): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<script><!--< +#errors +(1,8): expected-doctype-but-got-start-tag +(1,13): expected-named-closing-tag-but-got-eof +(1,13): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<script><!--<a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,14): expected-named-closing-tag-but-got-eof +(1,14): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<script><!--</ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,14): expected-named-closing-tag-but-got-eof +(1,14): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<script><!--</script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,20): expected-named-closing-tag-but-got-eof +(1,20): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<script><!--</script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,21): expected-attribute-name-but-got-eof +(1,21): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--<s +#errors +(1,8): expected-doctype-but-got-start-tag +(1,14): expected-named-closing-tag-but-got-eof +(1,14): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<script><!--<script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,19): expected-named-closing-tag-but-got-eof +(1,19): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<script><!--<script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,20): eof-in-script-in-script +(1,20): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<script><!--<script < +#errors +(1,8): expected-doctype-but-got-start-tag +(1,21): eof-in-script-in-script +(1,21): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<script><!--<script <a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,22): eof-in-script-in-script +(1,22): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<script><!--<script </ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,22): eof-in-script-in-script +(1,22): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<script><!--<script </s +#errors +(1,8): expected-doctype-but-got-start-tag +(1,23): eof-in-script-in-script +(1,23): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<script><!--<script </script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,28): eof-in-script-in-script +(1,28): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<script><!--<script </scripta +#errors +(1,8): expected-doctype-but-got-start-tag +(1,29): eof-in-script-in-script +(1,29): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<script><!--<script </script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,29): expected-named-closing-tag-but-got-eof +(1,29): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,29): expected-named-closing-tag-but-got-eof +(1,29): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<script><!--<script </script/ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,29): expected-named-closing-tag-but-got-eof +(1,29): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<script><!--<script </script < +#errors +(1,8): expected-doctype-but-got-start-tag +(1,30): expected-named-closing-tag-but-got-eof +(1,30): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<script><!--<script </script <a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,31): expected-named-closing-tag-but-got-eof +(1,31): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<script><!--<script </script </ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,31): expected-named-closing-tag-but-got-eof +(1,31): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<script><!--<script </script </script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,37): expected-named-closing-tag-but-got-eof +(1,37): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<script><!--<script </script </script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,38): expected-attribute-name-but-got-eof +(1,38): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script/ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,38): unexpected-EOF-after-solidus-in-tag +(1,38): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script - +#errors +(1,8): expected-doctype-but-got-start-tag +(1,21): eof-in-script-in-script +(1,21): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<script><!--<script -a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,22): eof-in-script-in-script +(1,22): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<script><!--<script -- +#errors +(1,8): expected-doctype-but-got-start-tag +(1,22): eof-in-script-in-script +(1,22): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<script><!--<script --a +#errors +(1,8): expected-doctype-but-got-start-tag +(1,23): eof-in-script-in-script +(1,23): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<script><!--<script --> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,23): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script -->< +#errors +(1,8): expected-doctype-but-got-start-tag +(1,24): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<script><!--<script --></ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,25): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<script><!--<script --></script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,31): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<script><!--<script --></script +#errors +(1,8): expected-doctype-but-got-start-tag +(1,32): expected-attribute-name-but-got-eof +(1,32): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script/ +#errors +(1,8): expected-doctype-but-got-start-tag +(1,32): unexpected-EOF-after-solidus-in-tag +(1,32): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script><\/script>--></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<script><!--<script></scr'+'ipt>--></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<script><!--<script></script><script></script></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<script><!--<script></script><script></script>--><!--</script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<script><!--<script></script><script></script>-- ></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<script><!--<script></script><script></script>- -></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<script><!--<script></script><script></script>- - ></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<script><!--<script></script><script></script>-></script> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<script><!--<script>--!></script>X +#errors +(1,8): expected-doctype-but-got-start-tag +(1,34): expected-named-closing-tag-but-got-eof +(1,34): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<script><!--<scr'+'ipt></script>--></script> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,44): unexpected-end-tag +#document +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<script><!--<script></scr'+'ipt></script>X +#errors +(1,8): expected-doctype-but-got-start-tag +(1,42): expected-named-closing-tag-but-got-eof +(1,42): unexpected-eof-in-text-mode +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<style><!--<style></style>--></style> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,37): unexpected-end-tag +#document +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<style><!--</style>X +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<style><!--...</style>...--></style> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,36): unexpected-end-tag +#document +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<style><!--...<style><!--...--!></style>--></style> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,51): unexpected-end-tag +#document +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<style><!--...</style><!-- --><style>@import ...</style> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<style>...<style><!--...</style><!-- --></style> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,48): unexpected-end-tag +#document +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<style>...<!--[if IE]><style>...</style>X +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<title><!--<title></title>--></title> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,37): unexpected-end-tag +#document +| <html> +| <head> +| <title> +| "<!--<title>" +| <body> +| "-->" + +#data +<title></title></title> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <title> +| "</title>" +| <body> + +#data +<title>foo/title><link></head><body>X +#errors +(1,7): expected-doctype-but-got-start-tag +(1,37): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<noscript><!--<noscript></noscript>--></noscript> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,49): unexpected-end-tag +#script-on +#document +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<noscript><!--<noscript></noscript>--></noscript> +#errors + * (1,11) missing DOCTYPE +#script-off +#document +| <html> +| <head> +| <noscript> +| <!-- <noscript></noscript> --> +| <body> + +#data +<noscript><!--</noscript>X<noscript>--></noscript> +#errors +(1,10): expected-doctype-but-got-start-tag +#script-on +#document +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<noscript><!--</noscript>X<noscript>--></noscript> +#errors +(1,10): expected-doctype-but-got-start-tag +#script-off +#document +| <html> +| <head> +| <noscript> +| <!-- </noscript>X<noscript> --> +| <body> + +#data +<noscript><iframe></noscript>X +#errors +(1,10): expected-doctype-but-got-start-tag +#script-on +#document +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<noscript><iframe></noscript>X +#errors + * (1,11) missing DOCTYPE + * (1,19) unexpected token in head noscript + * (1,31) unexpected EOF +#script-off +#document +| <html> +| <head> +| <noscript> +| <body> +| <iframe> +| "</noscript>X" + +#data +<noframes><!--<noframes></noframes>--></noframes> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,49): unexpected-end-tag +#document +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<noframes><body><script><!--...</script></body></noframes></html> +#errors +(1,10): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<textarea><!--<textarea></textarea>--></textarea> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,49): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<textarea></textarea></textarea> +#errors +(1,10): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<iframe><!--<iframe></iframe>--></iframe> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,41): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<iframe>...<!--X->...<!--/X->...</iframe> +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<xmp><!--<xmp></xmp>--></xmp> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,29): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<noembed><!--<noembed></noembed>--></noembed> +#errors +(1,9): expected-doctype-but-got-start-tag +(1,45): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<!doctype html><table> + +#errors +(2,0): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " +" + +#data +<!doctype html><table><td><span><font></span><span> +#errors +(1,26): unexpected-cell-in-table-body +(1,45): unexpected-end-tag +(1,51): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <span> +| <font> +| <font> +| <span> + +#data +<!doctype html><form><table></form><form></table></form> +#errors +(1,35): unexpected-end-tag-implies-table-voodoo +(1,35): unexpected-end-tag +(1,41): unexpected-form-in-table +(1,56): unexpected-end-tag +(1,56): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <table> +| <form> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests17.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests17.dat new file mode 100644 index 000000000..e49bcf031 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests17.dat @@ -0,0 +1,179 @@ +#data +<!doctype html><table><tbody><select><tr> +#errors +(1,37): unexpected-start-tag-implies-table-voodoo +(1,41): unexpected-table-element-start-tag-in-select-in-table +(1,41): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tr><select><td> +#errors +(1,34): unexpected-start-tag-implies-table-voodoo +(1,38): unexpected-table-element-start-tag-in-select-in-table +(1,38): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<!doctype html><table><tr><td><select><td> +#errors +(1,42): unexpected-table-element-start-tag-in-select-in-table +(1,42): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| <td> + +#data +<!doctype html><table><tr><th><select><td> +#errors +(1,42): unexpected-table-element-start-tag-in-select-in-table +(1,42): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <th> +| <select> +| <td> + +#data +<!doctype html><table><caption><select><tr> +#errors +(1,43): unexpected-table-element-start-tag-in-select-in-table +(1,43): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <select> +| <tbody> +| <tr> + +#data +<!doctype html><select><tr> +#errors +(1,27): unexpected-start-tag-in-select +(1,27): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><td> +#errors +(1,27): unexpected-start-tag-in-select +(1,27): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><th> +#errors +(1,27): unexpected-start-tag-in-select +(1,27): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tbody> +#errors +(1,30): unexpected-start-tag-in-select +(1,30): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><thead> +#errors +(1,30): unexpected-start-tag-in-select +(1,30): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tfoot> +#errors +(1,30): unexpected-start-tag-in-select +(1,30): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><caption> +#errors +(1,32): unexpected-start-tag-in-select +(1,32): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><table><tr></table>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| "a" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests18.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests18.dat new file mode 100644 index 000000000..926bccb38 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests18.dat @@ -0,0 +1,322 @@ +#data +<!doctype html><plaintext></plaintext> +#errors +(1,38): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><plaintext></plaintext> +#errors +(1,33): foster-parenting-start-tag +(1,34): foster-parenting-character +(1,35): foster-parenting-character +(1,36): foster-parenting-character +(1,37): foster-parenting-character +(1,38): foster-parenting-character +(1,39): foster-parenting-character +(1,40): foster-parenting-character +(1,41): foster-parenting-character +(1,42): foster-parenting-character +(1,43): foster-parenting-character +(1,44): foster-parenting-character +(1,45): foster-parenting-character +(1,45): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> + +#data +<!doctype html><table><tbody><plaintext></plaintext> +#errors +(1,40): foster-parenting-start-tag +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,41): foster-parenting-character +(1,52): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +(1,44): foster-parenting-start-tag +(1,45): foster-parenting-character +(1,46): foster-parenting-character +(1,47): foster-parenting-character +(1,48): foster-parenting-character +(1,49): foster-parenting-character +(1,50): foster-parenting-character +(1,51): foster-parenting-character +(1,52): foster-parenting-character +(1,53): foster-parenting-character +(1,54): foster-parenting-character +(1,55): foster-parenting-character +(1,56): foster-parenting-character +(1,56): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><plaintext></plaintext> +#errors +(1,26): unexpected-cell-in-table-body +(1,49): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><caption><plaintext></plaintext> +#errors +(1,54): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><tr><style></script></style>abc +#errors +(1,51): foster-parenting-character +(1,52): foster-parenting-character +(1,53): foster-parenting-character +(1,53): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <style> +| "</script>" + +#data +<!doctype html><table><tr><script></style></script>abc +#errors +(1,52): foster-parenting-character +(1,53): foster-parenting-character +(1,54): foster-parenting-character +(1,54): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <script> +| "</style>" + +#data +<!doctype html><table><caption><style></script></style>abc +#errors +(1,58): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><table><td><style></script></style>abc +#errors +(1,26): unexpected-cell-in-table-body +(1,53): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><select><script></style></script>abc +#errors +(1,51): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" + +#data +<!doctype html><table><select><script></style></script>abc +#errors +(1,30): unexpected-start-tag-implies-table-voodoo +(1,58): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> + +#data +<!doctype html><table><tr><select><script></style></script>abc +#errors +(1,34): unexpected-start-tag-implies-table-voodoo +(1,62): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><frameset></frameset><noframes>abc +#errors +(1,49): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><frameset></frameset></html><noframes>abc +#errors +(1,56): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><table><tr></tbody><tfoot> +#errors +(1,41): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <tfoot> + +#data +<!doctype html><table><td><svg></svg>abc<td> +#errors +(1,26): unexpected-cell-in-table-body +(1,44): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| "abc" +| <td> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests19.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests19.dat new file mode 100644 index 000000000..02158c8bb --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests19.dat @@ -0,0 +1,1524 @@ +#data +<!doctype html><math><mn DefinitionUrl="foo"> +#errors +(1,45): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| definitionURL="foo" + +#data +<!doctype html><html></p><!--foo--> +#errors +(1,25): end-tag-after-implied-root +#document +| <!DOCTYPE html> +| <html> +| <!-- foo --> +| <head> +| <body> + +#data +<!doctype html><head></head></p><!--foo--> +#errors +(1,32): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- foo --> +| <body> + +#data +<!doctype html><body><p><pre> +#errors +(1,29): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <pre> + +#data +<!doctype html><body><p><listing> +#errors +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <listing> + +#data +<!doctype html><p><plaintext> +#errors +(1,29): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <plaintext> + +#data +<!doctype html><p><h1> +#errors +(1,22): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <h1> + +#data +<!doctype html><form><isindex> +#errors +(1,30): deprecated-tag +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> + +#data +<!doctype html><isindex action="POST"> +#errors +(1,38): deprecated-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| action="POST" +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex prompt="this is isindex"> +#errors +(1,49): deprecated-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "this is isindex" +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex type="hidden"> +#errors +(1,38): deprecated-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| type="hidden" +| <hr> + +#data +<!doctype html><isindex name="foo"> +#errors +(1,35): deprecated-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><ruby><p><rp> +#errors +(1,28): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rp> + +#data +<!doctype html><ruby><div><span><rp> +#errors +(1,36): XXX-undefined-error +(1,36): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rp> + +#data +<!doctype html><ruby><div><p><rp> +#errors +(1,33): XXX-undefined-error +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rp> + +#data +<!doctype html><ruby><p><rt> +#errors +(1,28): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rt> + +#data +<!doctype html><ruby><div><span><rt> +#errors +(1,36): XXX-undefined-error +(1,36): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rt> + +#data +<!doctype html><ruby><div><p><rt> +#errors +(1,33): XXX-undefined-error +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rt> + +#data +<html><ruby>a<rb>b<rt></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rb> +| "b" +| <rt> + +#data +<html><ruby>a<rp>b<rt></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rp> +| "b" +| <rt> + +#data +<html><ruby>a<rt>b<rt></ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rt> +| "b" +| <rt> + +#data +<html><ruby>a<rtc>b<rt>c<rb>d</ruby></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <ruby> +| "a" +| <rtc> +| "b" +| <rt> +| "c" +| <rb> +| "d" + +#data +<!doctype html><math/><foo> +#errors +(1,27): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <foo> + +#data +<!doctype html><svg/><foo> +#errors +(1,26): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <foo> + +#data +<!doctype html><div></body><!--foo--> +#errors +(1,27): expected-one-end-tag-but-got-another +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <!-- foo --> + +#data +<!doctype html><h1><div><h3><span></h1>foo +#errors +(1,39): end-tag-too-early +(1,42): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h1> +| <div> +| <h3> +| <span> +| "foo" + +#data +<!doctype html><p></h3>foo +#errors +(1,23): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" + +#data +<!doctype html><h3><li>abc</h2>foo +#errors +(1,31): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h3> +| <li> +| "abc" +| "foo" + +#data +<!doctype html><table>abc<!--foo--> +#errors +(1,23): foster-parenting-character +(1,24): foster-parenting-character +(1,25): foster-parenting-character +(1,35): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <!-- foo --> + +#data +<!doctype html><table> <!--foo--> +#errors +(1,34): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <!-- foo --> + +#data +<!doctype html><table> b <!--foo--> +#errors +(1,23): foster-parenting-character +(1,24): foster-parenting-character +(1,25): foster-parenting-character +(1,35): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " b " +| <table> +| <!-- foo --> + +#data +<!doctype html><select><option><option> +#errors +(1,39): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +(1,42): unexpected-end-tag-in-select +(1,42): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +(1,42): unexpected-end-tag-in-select +(1,42): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><dd><optgroup><dd> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dd> +| <optgroup> +| <dd> + +#data +<!doctype html><p><math><mi><p><h1> +#errors +(1,35): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mi> +| <p> +| <h1> + +#data +<!doctype html><p><math><mo><p><h1> +#errors +(1,35): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mo> +| <p> +| <h1> + +#data +<!doctype html><p><math><mn><p><h1> +#errors +(1,35): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <p> +| <h1> + +#data +<!doctype html><p><math><ms><p><h1> +#errors +(1,35): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math ms> +| <p> +| <h1> + +#data +<!doctype html><p><math><mtext><p><h1> +#errors +(1,38): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mtext> +| <p> +| <h1> + +#data +<!doctype html><frameset></noframes> +#errors +(1,36): unexpected-end-tag-in-frameset +(1,36): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html c=d><body></html><html a=b> +#errors +(1,48): non-html-root +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><html c=d><frameset></frameset></html><html a=b> +#errors +(1,63): non-html-root +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <!-- foo --> + +#data +<!doctype html><html><frameset></frameset></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!doctype html><html><frameset></frameset></html>abc +#errors +(1,50): expected-eof-but-got-char +(1,51): expected-eof-but-got-char +(1,52): expected-eof-but-got-char +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><p> +#errors +(1,52): expected-eof-but-got-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html></p> +#errors +(1,53): expected-eof-but-got-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<html><frameset></frameset></html><!doctype html> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,49): unexpected-doctype +#document +| <html> +| <head> +| <frameset> + +#data +<!doctype html><body><frameset> +#errors +(1,31): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html><p><frameset><frame> +#errors +(1,28): unexpected-start-tag +(1,35): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><p>a<frameset> +#errors +(1,29): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "a" + +#data +<!doctype html><p> <frameset><frame> +#errors +(1,29): unexpected-start-tag +(1,36): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><pre><frameset> +#errors +(1,30): unexpected-start-tag +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> + +#data +<!doctype html><listing><frameset> +#errors +(1,34): unexpected-start-tag +(1,34): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <listing> + +#data +<!doctype html><li><frameset> +#errors +(1,29): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <li> + +#data +<!doctype html><dd><frameset> +#errors +(1,29): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dd> + +#data +<!doctype html><dt><frameset> +#errors +(1,29): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> + +#data +<!doctype html><button><frameset> +#errors +(1,33): unexpected-start-tag +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <button> + +#data +<!doctype html><applet><frameset> +#errors +(1,33): unexpected-start-tag +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <applet> + +#data +<!doctype html><marquee><frameset> +#errors +(1,34): unexpected-start-tag +(1,34): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <marquee> + +#data +<!doctype html><object><frameset> +#errors +(1,33): unexpected-start-tag +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> + +#data +<!doctype html><table><frameset> +#errors +(1,32): unexpected-start-tag-implies-table-voodoo +(1,32): unexpected-start-tag +(1,32): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> + +#data +<!doctype html><area><frameset> +#errors +(1,31): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <area> + +#data +<!doctype html><basefont><frameset> +#errors +(1,35): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <basefont> +| <frameset> + +#data +<!doctype html><bgsound><frameset> +#errors +(1,34): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <bgsound> +| <frameset> + +#data +<!doctype html><br><frameset> +#errors +(1,29): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <br> + +#data +<!doctype html><embed><frameset> +#errors +(1,32): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <embed> + +#data +<!doctype html><img><frameset> +#errors +(1,30): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html><input><frameset> +#errors +(1,32): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> + +#data +<!doctype html><keygen><frameset> +#errors +(1,33): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <keygen> + +#data +<!doctype html><wbr><frameset> +#errors +(1,30): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <wbr> + +#data +<!doctype html><hr><frameset> +#errors +(1,29): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <hr> + +#data +<!doctype html><textarea></textarea><frameset> +#errors +(1,46): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> + +#data +<!doctype html><xmp></xmp><frameset> +#errors +(1,36): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> + +#data +<!doctype html><iframe></iframe><frameset> +#errors +(1,42): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> + +#data +<!doctype html><select></select><frameset> +#errors +(1,42): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><svg></svg><frameset><frame> +#errors +(1,36): unexpected-start-tag +(1,43): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><math></math><frameset><frame> +#errors +(1,38): unexpected-start-tag +(1,45): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg><foreignObject><div> <frameset><frame> +#errors +(1,51): unexpected-start-tag +(1,58): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg>a</svg><frameset><frame> +#errors +(1,37): unexpected-start-tag +(1,44): unexpected-start-tag-ignored +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "a" + +#data +<!doctype html><svg> </svg><frameset><frame> +#errors +(1,37): unexpected-start-tag +(1,44): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<html>aaa<frameset></frameset> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,19): unexpected-start-tag +(1,30): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| "aaa" + +#data +<html> a <frameset></frameset> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,19): unexpected-start-tag +(1,30): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| "a " + +#data +<!doctype html><div><frameset> +#errors +(1,30): unexpected-start-tag +(1,30): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><div><body><frameset> +#errors +(1,26): unexpected-start-tag +(1,36): unexpected-start-tag +(1,36): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> + +#data +<!doctype html><p><math></p>a +#errors +(1,28): unexpected-end-tag +(1,28): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| "a" + +#data +<!doctype html><p><math><mn><span></p>a +#errors +(1,38): unexpected-end-tag +(1,39): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <span> +| <p> +| "a" + +#data +<!doctype html><math></html> +#errors +(1,28): unexpected-end-tag +(1,28): expected-one-end-tag-but-got-another +(1,28): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!doctype html><meta charset="ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| charset="ascii" +| <body> + +#data +<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| content="text/html;charset=ascii" +| http-equiv="content-type" +| <body> + +#data +<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> +| <meta> +| charset="utf8" +| <body> + +#data +<!doctype html><html a=b><head></head><html c=d> +#errors +(1,48): non-html-root +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><image/> +#errors +(1,23): image-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html>a<i>b<table>c<b>d</i>e</b>f +#errors +(1,28): foster-parenting-character +(1,31): foster-parenting-start-tag +(1,32): foster-parenting-character +(1,36): foster-parenting-end-tag +(1,36): adoption-agency-1.3 +(1,37): foster-parenting-character +(1,41): foster-parenting-end-tag +(1,42): foster-parenting-character +(1,42): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "a" +| <i> +| "bc" +| <b> +| "de" +| "f" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +(1,25): foster-parenting-start-tag +(1,26): foster-parenting-character +(1,29): foster-parenting-start-tag +(1,30): foster-parenting-character +(1,35): foster-parenting-start-tag +(1,36): foster-parenting-character +(1,39): foster-parenting-start-tag +(1,40): foster-parenting-character +(1,44): foster-parenting-end-tag +(1,44): adoption-agency-1.3 +(1,44): adoption-agency-1.3 +(1,45): foster-parenting-character +(1,49): foster-parenting-end-tag +(1,49): adoption-agency-1.3 +(1,49): adoption-agency-1.3 +(1,50): foster-parenting-character +(1,50): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f +#errors +(1,37): adoption-agency-1.3 +(1,37): adoption-agency-1.3 +(1,42): adoption-agency-1.3 +(1,42): adoption-agency-1.3 +(1,43): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" + +#data +<!doctype html><table><i>a<b>b<div>c</i> +#errors +(1,25): foster-parenting-start-tag +(1,26): foster-parenting-character +(1,29): foster-parenting-start-tag +(1,30): foster-parenting-character +(1,35): foster-parenting-start-tag +(1,36): foster-parenting-character +(1,40): foster-parenting-end-tag +(1,40): adoption-agency-1.3 +(1,40): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <i> +| "c" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +(1,25): foster-parenting-start-tag +(1,26): foster-parenting-character +(1,29): foster-parenting-start-tag +(1,30): foster-parenting-character +(1,35): foster-parenting-start-tag +(1,36): foster-parenting-character +(1,39): foster-parenting-start-tag +(1,40): foster-parenting-character +(1,44): foster-parenting-end-tag +(1,44): adoption-agency-1.3 +(1,44): adoption-agency-1.3 +(1,45): foster-parenting-character +(1,49): foster-parenting-end-tag +(1,44): adoption-agency-1.3 +(1,44): adoption-agency-1.3 +(1,50): foster-parenting-character +(1,50): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><table><i>a<div>b<tr>c<b>d</i>e +#errors +(1,25): foster-parenting-start-tag +(1,26): foster-parenting-character +(1,31): foster-parenting-start-tag +(1,32): foster-parenting-character +(1,37): foster-parenting-character +(1,40): foster-parenting-start-tag +(1,41): foster-parenting-character +(1,45): foster-parenting-end-tag +(1,45): adoption-agency-1.3 +(1,46): foster-parenting-character +(1,46): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <div> +| "b" +| <i> +| "c" +| <b> +| "d" +| <b> +| "e" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><table><i>a<div>b<b>c</i>d +#errors +(1,26): unexpected-cell-in-table-body +(1,36): foster-parenting-start-tag +(1,37): foster-parenting-character +(1,42): foster-parenting-start-tag +(1,43): foster-parenting-character +(1,46): foster-parenting-start-tag +(1,47): foster-parenting-character +(1,51): foster-parenting-end-tag +(1,51): adoption-agency-1.3 +(1,51): adoption-agency-1.3 +(1,52): foster-parenting-character +(1,52): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <i> +| "a" +| <div> +| <i> +| "b" +| <b> +| "c" +| <b> +| "d" +| <table> + +#data +<!doctype html><body><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <bgsound> + +#data +<!doctype html><body><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <basefont> + +#data +<!doctype html><a><b></a><basefont> +#errors +(1,25): adoption-agency-1.3 +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <basefont> + +#data +<!doctype html><a><b></a><bgsound> +#errors +(1,25): adoption-agency-1.3 +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <bgsound> + +#data +<!doctype html><figcaption><article></figcaption>a +#errors +(1,49): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <figcaption> +| <article> +| "a" + +#data +<!doctype html><summary><article></summary>a +#errors +(1,43): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <summary> +| <article> +| "a" + +#data +<!doctype html><p><a><plaintext>b +#errors +(1,32): unexpected-end-tag +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <a> +| <plaintext> +| <a> +| "b" + +#data +<!DOCTYPE html><div>a<a></div>b<p>c</p>d +#errors +(1,30): end-tag-too-early +(1,40): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| "a" +| <a> +| <a> +| "b" +| <p> +| "c" +| "d" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests2.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests2.dat new file mode 100644 index 000000000..41953160f --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests2.dat @@ -0,0 +1,799 @@ +#data +<!DOCTYPE html>Test +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Test" + +#data +<textarea>test</div>test +#errors +(1,10): expected-doctype-but-got-start-tag +(1,24): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <textarea> +| "test</div>test" + +#data +<table><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,11): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><td>test</tbody></table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "test" + +#data +<frame>test +#errors +(1,7): expected-doctype-but-got-start-tag +(1,7): unexpected-start-tag-ignored +#document +| <html> +| <head> +| <body> +| "test" + +#data +<!DOCTYPE html><frameset>test +#errors +(1,29): unexpected-char-in-frameset +(1,29): unexpected-char-in-frameset +(1,29): unexpected-char-in-frameset +(1,29): unexpected-char-in-frameset +(1,29): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset> te st +#errors +(1,29): unexpected-char-in-frameset +(1,29): unexpected-char-in-frameset +(1,29): unexpected-char-in-frameset +(1,29): unexpected-char-in-frameset +(1,29): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!DOCTYPE html><frameset></frameset> te st +#errors +(1,29): unexpected-char-after-frameset +(1,29): unexpected-char-after-frameset +(1,29): unexpected-char-after-frameset +(1,29): unexpected-char-after-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!DOCTYPE html><frameset><!DOCTYPE html> +#errors +(1,40): unexpected-doctype +(1,40): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><font><p><b>test</font> +#errors +(1,38): adoption-agency-1.3 +(1,38): adoption-agency-1.3 +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <p> +| <font> +| <b> +| "test" + +#data +<!DOCTYPE html><dt><div><dd> +#errors +(1,28): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> +| <div> +| <dd> + +#data +<script></x +#errors +(1,8): expected-doctype-but-got-start-tag +(1,11): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <script> +| "</x" +| <body> + +#data +<table><plaintext><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,18): unexpected-start-tag-implies-table-voodoo +(1,22): foster-parenting-character-in-table +(1,22): foster-parenting-character-in-table +(1,22): foster-parenting-character-in-table +(1,22): foster-parenting-character-in-table +(1,22): eof-in-table +#document +| <html> +| <head> +| <body> +| <plaintext> +| "<td>" +| <table> + +#data +<plaintext></plaintext> +#errors +(1,11): expected-doctype-but-got-start-tag +(1,23): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!DOCTYPE html><table><tr>TEST +#errors +(1,30): foster-parenting-character-in-table +(1,30): foster-parenting-character-in-table +(1,30): foster-parenting-character-in-table +(1,30): foster-parenting-character-in-table +(1,30): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "TEST" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> +#errors +(1,37): unexpected-start-tag +(1,53): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| t1="1" +| t2="2" +| t3="3" +| t4="4" + +#data +</b test +#errors +(1,8): eof-in-attribute-name +(1,8): expected-doctype-but-got-eof +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html></b test<b &=&>X +#errors +(1,24): invalid-character-in-attribute-name +(1,32): named-entity-without-semicolon +(1,33): attributes-in-end-tag +(1,33): unexpected-end-tag-before-html +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" + +#data +<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt +#errors +(1,9): need-space-after-doctype +(1,54): expected-named-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| type="text/x-foobar;baz" +| "X</SCRipt" +| <body> + +#data +& +#errors +(1,1): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "&" + +#data +&# +#errors +(1,2): expected-numeric-entity +(1,2): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "&#" + +#data +&#X +#errors +(1,3): expected-numeric-entity +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "&#X" + +#data +&#x +#errors +(1,3): expected-numeric-entity +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "&#x" + +#data +- +#errors +(1,4): numeric-entity-without-semicolon +(1,4): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "-" + +#data +&x-test +#errors +(1,2): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "&x-test" + +#data +<!doctypehtml><p><li> +#errors +(1,9): need-space-after-doctype +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <li> + +#data +<!doctypehtml><p><dt> +#errors +(1,9): need-space-after-doctype +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dt> + +#data +<!doctypehtml><p><dd> +#errors +(1,9): need-space-after-doctype +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dd> + +#data +<!doctypehtml><p><form> +#errors +(1,9): need-space-after-doctype +(1,23): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <form> + +#data +<!DOCTYPE html><p></P>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "X" + +#data +& +#errors +(1,4): named-entity-without-semicolon +(1,4): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "&" + +#data +&AMp; +#errors +(1,3): expected-named-entity +(1,3): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "&AMp;" + +#data +<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> +#errors +(1,110): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> + +#data +<!DOCTYPE html>X</body>X +#errors +(1,24): unexpected-char-after-body +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "XX" + +#data +<!DOCTYPE html><!-- X +#errors +(1,21): eof-in-comment +#document +| <!DOCTYPE html> +| <!-- X --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><table><caption>test TEST</caption><td>test +#errors +(1,54): unexpected-cell-in-table-body +(1,58): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| "test TEST" +| <tbody> +| <tr> +| <td> +| "test" + +#data +<!DOCTYPE html><select><option><optgroup> +#errors +(1,41): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> +#errors +(1,68): unexpected-select-in-select +(1,76): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <option> +| <option> + +#data +<!DOCTYPE html><select><optgroup><option><optgroup> +#errors +(1,51): eof-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><datalist><option>foo</datalist>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <datalist> +| <option> +| "foo" +| "bar" + +#data +<!DOCTYPE html><font><input><input></font> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <input> +| <input> + +#data +<!DOCTYPE html><!-- XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX +#errors +(1,29): eof-in-comment +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<isindex test=x name=x> +#errors +(1,23): expected-doctype-but-got-start-tag +(1,23): deprecated-tag +#document +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| test="x" +| <hr> + +#data +test +test +#errors +(2,4): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "test +test" + +#data +<!DOCTYPE html><body><title>test</body></title> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <title> +| "test</body>" + +#data +<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style> +x { content:"</style" } </style> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <title> +| "X" +| <meta> +| name="z" +| <link> +| rel="foo" +| <style> +| " +x { content:"</style" } " + +#data +<!DOCTYPE html><select><optgroup></optgroup></select> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> + +#data + + +#errors +(2,1): expected-doctype-but-got-eof +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html> <html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><script> +</script> <title>x</title> </head> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| " +" +| " " +| <title> +| "x" +| " " +| <body> + +#data +<!DOCTYPE html><html><body><html id=x> +#errors +(1,38): non-html-root +#document +| <!DOCTYPE html> +| <html> +| id="x" +| <head> +| <body> + +#data +<!DOCTYPE html>X</body><html id="x"> +#errors +(1,36): non-html-root +#document +| <!DOCTYPE html> +| <html> +| id="x" +| <head> +| <body> +| "X" + +#data +<!DOCTYPE html><head><html id=x> +#errors +(1,32): non-html-root +#document +| <!DOCTYPE html> +| <html> +| id="x" +| <head> +| <body> + +#data +<!DOCTYPE html>X</html>X +#errors +(1,24): expected-eof-but-got-char +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "XX" + +#data +<!DOCTYPE html>X</html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X " + +#data +<!DOCTYPE html>X</html><p>X +#errors +(1,26): expected-eof-but-got-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <p> +| "X" + +#data +<!DOCTYPE html>X<p/x/y/z> +#errors +(1,19): unexpected-character-after-solidus-in-tag +(1,21): unexpected-character-after-solidus-in-tag +(1,23): unexpected-character-after-solidus-in-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <p> +| x="" +| y="" +| z="" + +#data +<!DOCTYPE html><!--x-- +#errors +(1,22): eof-in-comment-double-dash +#document +| <!DOCTYPE html> +| <!-- x --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><table><tr><td></p></table> +#errors +(1,34): unexpected-end-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <p> + +#data +<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->--> +#errors +(1,20): expected-space-or-right-bracket-in-doctype +(1,25): unknown-doctype +(1,35): unexpected-char-in-comment +#document +| <!DOCTYPE <!doctype> +| <html> +| <head> +| <body> +| ">" +| <!-- <!--x --> +| "-->" + +#data +<!doctype html><div><form></form><div></div></div> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <form> +| <div> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests20.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests20.dat new file mode 100644 index 000000000..52c5acdc6 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests20.dat @@ -0,0 +1,516 @@ +#data +<!doctype html><p><button><button> +#errors +(1,34): unexpected-start-tag-implies-end-tag +(1,34): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <button> + +#data +<!doctype html><p><button><address> +#errors +(1,35): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <address> + +#data +<!doctype html><p><button><blockquote> +#errors +(1,38): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <blockquote> + +#data +<!doctype html><p><button><menu> +#errors +(1,32): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <menu> + +#data +<!doctype html><p><button><p> +#errors +(1,29): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <p> + +#data +<!doctype html><p><button><ul> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <ul> + +#data +<!doctype html><p><button><h1> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <h1> + +#data +<!doctype html><p><button><h6> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <h6> + +#data +<!doctype html><p><button><listing> +#errors +(1,35): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <listing> + +#data +<!doctype html><p><button><pre> +#errors +(1,31): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <pre> + +#data +<!doctype html><p><button><form> +#errors +(1,32): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <form> + +#data +<!doctype html><p><button><li> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <li> + +#data +<!doctype html><p><button><dd> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <dd> + +#data +<!doctype html><p><button><dt> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <dt> + +#data +<!doctype html><p><button><plaintext> +#errors +(1,37): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <plaintext> + +#data +<!doctype html><p><button><table> +#errors +(1,33): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <table> + +#data +<!doctype html><p><button><hr> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <hr> + +#data +<!doctype html><p><button><xmp> +#errors +(1,31): expected-named-closing-tag-but-got-eof +(1,31): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <xmp> + +#data +<!doctype html><p><button></p> +#errors +(1,30): unexpected-end-tag +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <button> +| <p> + +#data +<!doctype html><address><button></address>a +#errors +(1,42): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <address> +| <button> +| "a" + +#data +<!doctype html><address><button></address>a +#errors +(1,42): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <address> +| <button> +| "a" + +#data +<p><table></p> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,14): unexpected-end-tag-implies-table-voodoo +(1,14): unexpected-end-tag +(1,14): eof-in-table +#document +| <html> +| <head> +| <body> +| <p> +| <p> +| <table> + +#data +<!doctype html><svg> +#errors +(1,20): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> + +#data +<!doctype html><p><figcaption> +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <figcaption> + +#data +<!doctype html><p><summary> +#errors +(1,27): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <summary> + +#data +<!doctype html><form><table><form> +#errors +(1,34): unexpected-form-in-table +(1,34): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <table> + +#data +<!doctype html><table><form><form> +#errors +(1,28): unexpected-form-in-table +(1,34): unexpected-form-in-table +(1,34): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <form> + +#data +<!doctype html><table><form></table><form> +#errors +(1,28): unexpected-form-in-table +(1,42): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <form> + +#data +<!doctype html><svg><foreignObject><p> +#errors +(1,38): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg foreignObject> +| <p> + +#data +<!doctype html><svg><title>abc +#errors +(1,30): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg title> +| "abc" + +#data +<option><span><option> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,22): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <option> +| <span> +| <option> + +#data +<option><option> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <option> +| <option> + +#data +<math><annotation-xml><div> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,27): unexpected-html-element-in-foreign-content +(1,27): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| <div> + +#data +<math><annotation-xml encoding="application/svg+xml"><div> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,58): unexpected-html-element-in-foreign-content +(1,58): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| encoding="application/svg+xml" +| <div> + +#data +<math><annotation-xml encoding="application/xhtml+xml"><div> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,60): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| encoding="application/xhtml+xml" +| <div> + +#data +<math><annotation-xml encoding="aPPlication/xhtmL+xMl"><div> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,60): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| encoding="aPPlication/xhtmL+xMl" +| <div> + +#data +<math><annotation-xml encoding="text/html"><div> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,48): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| encoding="text/html" +| <div> + +#data +<math><annotation-xml encoding="Text/htmL"><div> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,48): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| encoding="Text/htmL" +| <div> + +#data +<math><annotation-xml encoding=" text/html "><div> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,50): unexpected-html-element-in-foreign-content +(1,50): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| encoding=" text/html " +| <div> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests21.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests21.dat new file mode 100644 index 000000000..d384a5556 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests21.dat @@ -0,0 +1,305 @@ +#data +<svg><![CDATA[foo]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "foo" + +#data +<math><![CDATA[foo]]> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <math math> +| "foo" + +#data +<div><![CDATA[foo]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,7): expected-dashes-or-doctype +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <!-- [CDATA[foo]] --> + +#data +<svg><![CDATA[foo +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "foo" + +#data +<svg><![CDATA[foo +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "foo" + +#data +<svg><![CDATA[ +#errors +(1,5): expected-doctype-but-got-start-tag +(1,14): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> + +#data +<svg><![CDATA[]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> + +#data +<svg><![CDATA[]] >]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "]] >" + +#data +<svg><![CDATA[]] >]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "]] >" + +#data +<svg><![CDATA[]] +#errors +(1,5): expected-doctype-but-got-start-tag +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "]]" + +#data +<svg><![CDATA[] +#errors +(1,5): expected-doctype-but-got-start-tag +(1,15): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "]" + +#data +<svg><![CDATA[]>a +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "]>a" + +#data +<!DOCTYPE html><svg><![CDATA[foo]]]> +#errors +(1,36): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "foo]" + +#data +<!DOCTYPE html><svg><![CDATA[foo]]]]> +#errors +(1,37): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "foo]]" + +#data +<!DOCTYPE html><svg><![CDATA[foo]]]]]> +#errors +(1,38): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "foo]]]" + +#data +<svg><foreignObject><div><![CDATA[foo]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,27): expected-dashes-or-doctype +(1,40): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| <svg foreignObject> +| <div> +| <!-- [CDATA[foo]] --> + +#data +<svg><![CDATA[<svg>]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,22): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "<svg>" + +#data +<svg><![CDATA[</svg>a]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,24): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "</svg>a" + +#data +<svg><![CDATA[<svg>a +#errors +(1,5): expected-doctype-but-got-start-tag +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "<svg>a" + +#data +<svg><![CDATA[</svg>a +#errors +(1,5): expected-doctype-but-got-start-tag +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "</svg>a" + +#data +<svg><![CDATA[<svg>]]><path> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,28): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "<svg>" +| <svg path> + +#data +<svg><![CDATA[<svg>]]></path> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,29): unexpected-end-tag +(1,29): unexpected-end-tag +(1,29): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "<svg>" + +#data +<svg><![CDATA[<svg>]]><!--path--> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,33): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "<svg>" +| <!-- path --> + +#data +<svg><![CDATA[<svg>]]>path +#errors +(1,5): expected-doctype-but-got-start-tag +(1,26): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "<svg>path" + +#data +<svg><![CDATA[<!--svg-->]]> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,27): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| "<!--svg-->" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests22.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests22.dat new file mode 100644 index 000000000..31e6d9e33 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests22.dat @@ -0,0 +1,190 @@ +#data +<a><b><big><em><strong><div>X</a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,33): adoption-agency-1.3 +(1,33): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <b> +| <big> +| <em> +| <strong> +| <big> +| <em> +| <strong> +| <div> +| <a> +| "X" + +#data +<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,91): adoption-agency-1.3 +(1,91): adoption-agency-1.3 +(1,91): adoption-agency-1.3 +(1,91): adoption-agency-1.3 +(1,91): adoption-agency-1.3 +(1,91): adoption-agency-1.3 +(1,91): adoption-agency-1.3 +(1,91): adoption-agency-1.3 +(1,91): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <b> +| <b> +| <div> +| id="1" +| <a> +| <div> +| id="2" +| <a> +| <div> +| id="3" +| <a> +| <div> +| id="4" +| <a> +| <div> +| id="5" +| <a> +| <div> +| id="6" +| <a> +| <div> +| id="7" +| <a> +| <div> +| id="8" +| <a> +| "A" + +#data +<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,101): adoption-agency-1.3 +(1,101): adoption-agency-1.3 +(1,101): adoption-agency-1.3 +(1,101): adoption-agency-1.3 +(1,101): adoption-agency-1.3 +(1,101): adoption-agency-1.3 +(1,101): adoption-agency-1.3 +(1,101): adoption-agency-1.3 +(1,101): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <b> +| <b> +| <div> +| id="1" +| <a> +| <div> +| id="2" +| <a> +| <div> +| id="3" +| <a> +| <div> +| id="4" +| <a> +| <div> +| id="5" +| <a> +| <div> +| id="6" +| <a> +| <div> +| id="7" +| <a> +| <div> +| id="8" +| <a> +| <div> +| id="9" +| "A" + +#data +<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,112): adoption-agency-1.3 +(1,112): adoption-agency-1.3 +(1,112): adoption-agency-1.3 +(1,112): adoption-agency-1.3 +(1,112): adoption-agency-1.3 +(1,112): adoption-agency-1.3 +(1,112): adoption-agency-1.3 +(1,112): adoption-agency-1.3 +(1,112): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <b> +| <b> +| <div> +| id="1" +| <a> +| <div> +| id="2" +| <a> +| <div> +| id="3" +| <a> +| <div> +| id="4" +| <a> +| <div> +| id="5" +| <a> +| <div> +| id="6" +| <a> +| <div> +| id="7" +| <a> +| <div> +| id="8" +| <a> +| <div> +| id="9" +| <div> +| id="10" +| "A" + +#data +<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST +#errors +(1,6): expected-doctype-but-got-start-tag +(1,46): adoption-agency-1.3 +(1,50): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <cite> +| <b> +| <cite> +| <i> +| <cite> +| <i> +| <cite> +| <i> +| <i> +| <i> +| <div> +| <b> +| "X" +| "TEST" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests23.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests23.dat new file mode 100644 index 000000000..49e4a4ace --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests23.dat @@ -0,0 +1,168 @@ +#data +<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X +#errors +(1,3): expected-doctype-but-got-start-tag +(1,116): unexpected-end-tag +(1,117): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <font> +| size="4" +| <font> +| color="red" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| color="red" +| <p> +| <font> +| color="red" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| color="red" +| "X" + +#data +<p><font size=4><font size=4><font size=4><font size=4><p>X +#errors +(1,3): expected-doctype-but-got-start-tag +(1,58): unexpected-end-tag +(1,59): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <p> +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| "X" + +#data +<p><font size=4><font size=4><font size=4><font size="5"><font size=4><p>X +#errors +(1,3): expected-doctype-but-got-start-tag +(1,73): unexpected-end-tag +(1,74): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="5" +| <font> +| size="4" +| <p> +| <font> +| size="4" +| <font> +| size="4" +| <font> +| size="5" +| <font> +| size="4" +| "X" + +#data +<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X +#errors +(1,3): expected-doctype-but-got-start-tag +(1,68): unexpected-end-tag +(1,69): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <font> +| id="a" +| size="4" +| <font> +| id="b" +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| <p> +| <font> +| id="a" +| size="4" +| <font> +| id="b" +| size="4" +| <font> +| size="4" +| <font> +| size="4" +| "X" + +#data +<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y +#errors +(1,3): expected-doctype-but-got-start-tag +(1,64): end-tag-too-early +(1,67): unexpected-end-tag +(1,68): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <b> +| id="a" +| <b> +| id="a" +| <b> +| id="a" +| <b> +| <object> +| <b> +| id="a" +| <b> +| id="a" +| "X" +| <p> +| <b> +| id="a" +| <b> +| id="a" +| <b> +| id="a" +| <b> +| "Y" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests24.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests24.dat new file mode 100644 index 000000000..f6dc7eb48 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests24.dat @@ -0,0 +1,79 @@ +#data +<!DOCTYPE html>≂̸ +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "≂̸" + +#data +<!DOCTYPE html>≂̸A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "≂̸A" + +#data +<!DOCTYPE html>   +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "âŸâ€Š" + +#data +<!DOCTYPE html>  A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "âŸâ€ŠA" + +#data +<!DOCTYPE html>⊂⃒ +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "⊂⃒" + +#data +<!DOCTYPE html>⊂⃒A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "⊂⃒A" + +#data +<!DOCTYPE html>𝔾 +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "ð”¾" + +#data +<!DOCTYPE html>𝔾A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "ð”¾A" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests25.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests25.dat new file mode 100644 index 000000000..103574ee4 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests25.dat @@ -0,0 +1,232 @@ +#data +<!DOCTYPE html><body><foo>A +#errors +(1,27): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <foo> +| "A" + +#data +<!DOCTYPE html><body><area>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <area> +| "A" + +#data +<!DOCTYPE html><body><base>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <base> +| "A" + +#data +<!DOCTYPE html><body><basefont>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <basefont> +| "A" + +#data +<!DOCTYPE html><body><bgsound>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <bgsound> +| "A" + +#data +<!DOCTYPE html><body><br>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <br> +| "A" + +#data +<!DOCTYPE html><body><col>A +#errors +(1,26): unexpected-start-tag-ignored +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "A" + +#data +<!DOCTYPE html><body><command>A +#errors +eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <command> +| "A" + +#data +<!DOCTYPE html><body><menuitem>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <menuitem> +| "A" + +#data +<!DOCTYPE html><body><embed>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <embed> +| "A" + +#data +<!DOCTYPE html><body><frame>A +#errors +(1,28): unexpected-start-tag-ignored +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "A" + +#data +<!DOCTYPE html><body><hr>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <hr> +| "A" + +#data +<!DOCTYPE html><body><img>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> +| "A" + +#data +<!DOCTYPE html><body><input>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> +| "A" + +#data +<!DOCTYPE html><body><keygen>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <keygen> +| "A" + +#data +<!DOCTYPE html><body><link>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <link> +| "A" + +#data +<!DOCTYPE html><body><meta>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <meta> +| "A" + +#data +<!DOCTYPE html><body><param>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <param> +| "A" + +#data +<!DOCTYPE html><body><source>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <source> +| "A" + +#data +<!DOCTYPE html><body><track>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <track> +| "A" + +#data +<!DOCTYPE html><body><wbr>A +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <wbr> +| "A" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests26.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests26.dat new file mode 100644 index 000000000..8964624a4 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests26.dat @@ -0,0 +1,388 @@ +#data +<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a> +#errors +(1,47): unexpected-start-tag-implies-end-tag +(1,51): adoption-agency-1.3 +(1,74): unexpected-start-tag-implies-end-tag +(1,74): adoption-agency-1.3 +(1,81): unexpected-start-tag-implies-end-tag +(1,85): adoption-agency-1.3 +(1,108): unexpected-start-tag-implies-end-tag +(1,108): adoption-agency-1.3 +(1,115): unexpected-start-tag-implies-end-tag +(1,119): adoption-agency-1.3 +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| href="#1" +| <nobr> +| "1" +| <nobr> +| <nobr> +| <br> +| <a> +| href="#2" +| <a> +| href="#2" +| <nobr> +| "2" +| <nobr> +| <nobr> +| <br> +| <a> +| href="#3" +| <a> +| href="#3" +| <nobr> +| "3" +| <nobr> + +#data +<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3 +#errors +(1,37): unexpected-start-tag-implies-end-tag +(1,41): adoption-agency-1.3 +(1,50): unexpected-start-tag-implies-end-tag +(1,50): adoption-agency-1.3 +(1,57): unexpected-start-tag-implies-end-tag +(1,61): adoption-agency-1.3 +(1,62): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| <nobr> +| "1" +| <nobr> +| <nobr> +| <i> +| <i> +| <nobr> +| "2" +| <nobr> +| <nobr> +| "3" + +#data +<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3 +#errors +(1,44): foster-parenting-start-tag +(1,48): foster-parenting-end-tag +(1,48): adoption-agency-1.3 +(1,51): foster-parenting-start-tag +(1,57): foster-parenting-start-tag +(1,57): nobr-already-in-scope +(1,57): adoption-agency-1.2 +(1,58): foster-parenting-character +(1,64): foster-parenting-start-tag +(1,64): nobr-already-in-scope +(1,68): foster-parenting-end-tag +(1,68): adoption-agency-1.2 +(1,69): foster-parenting-character +(1,69): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| <nobr> +| "1" +| <nobr> +| <i> +| <i> +| <nobr> +| "2" +| <nobr> +| <nobr> +| "3" +| <table> + +#data +<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3 +#errors +(1,56): unexpected-end-tag +(1,65): unexpected-start-tag-implies-end-tag +(1,65): adoption-agency-1.3 +(1,72): unexpected-start-tag-implies-end-tag +(1,76): adoption-agency-1.3 +(1,77): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| <nobr> +| "1" +| <table> +| <tbody> +| <tr> +| <td> +| <nobr> +| <i> +| <i> +| <nobr> +| "2" +| <nobr> +| <nobr> +| "3" + +#data +<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3 +#errors +(1,42): unexpected-start-tag-implies-end-tag +(1,42): adoption-agency-1.3 +(1,46): adoption-agency-1.3 +(1,46): adoption-agency-1.3 +(1,55): unexpected-start-tag-implies-end-tag +(1,55): adoption-agency-1.3 +(1,62): unexpected-start-tag-implies-end-tag +(1,66): adoption-agency-1.3 +(1,67): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| <nobr> +| "1" +| <div> +| <b> +| <nobr> +| <nobr> +| <nobr> +| <i> +| <i> +| <nobr> +| "2" +| <nobr> +| <nobr> +| "3" + +#data +<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3 +#errors +(1,37): unexpected-start-tag-implies-end-tag +(1,41): adoption-agency-1.3 +(1,55): unexpected-start-tag-implies-end-tag +(1,55): adoption-agency-1.3 +(1,62): unexpected-start-tag-implies-end-tag +(1,66): adoption-agency-1.3 +(1,67): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| <nobr> +| "1" +| <nobr> +| <div> +| <nobr> +| <i> +| <i> +| <nobr> +| "2" +| <nobr> +| <nobr> +| "3" + +#data +<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr> +#errors +(1,37): unexpected-start-tag-implies-end-tag +(1,46): adoption-agency-1.3 +(1,55): unexpected-start-tag-implies-end-tag +(1,55): adoption-agency-1.3 +(1,55): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| <nobr> +| "1" +| <nobr> +| <ins> +| <nobr> +| <i> +| <i> +| <nobr> + +#data +<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2 +#errors +(1,42): unexpected-start-tag-implies-end-tag +(1,42): adoption-agency-1.3 +(1,46): adoption-agency-1.3 +(1,50): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| <nobr> +| "1" +| <ins> +| <nobr> +| <nobr> +| <i> +| "2" + +#data +<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i> +#errors +(1,35): adoption-agency-1.3 +(1,44): unexpected-start-tag-implies-end-tag +(1,44): adoption-agency-1.3 +(1,49): adoption-agency-1.3 +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <b> +| "1" +| <nobr> +| <nobr> +| <i> +| <i> +| <nobr> +| "2" + +#data +<p><code x</code></p> + +#errors +(1,3): expected-doctype-but-got-start-tag +(1,11): invalid-character-in-attribute-name +(1,12): unexpected-character-after-solidus-in-tag +(1,21): unexpected-end-tag +(2,0): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <p> +| <code> +| code="" +| x<="" +| <code> +| code="" +| x<="" +| " +" + +#data +<!DOCTYPE html><svg><foreignObject><p><i></p>a +#errors +(1,45): unexpected-end-tag +(1,46): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <svg foreignObject> +| <p> +| <i> +| <i> +| "a" + +#data +<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a +#errors +(1,60): unexpected-end-tag +(1,61): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| <svg foreignObject> +| <p> +| <i> +| <i> +| "a" + +#data +<!DOCTYPE html><math><mtext><p><i></p>a +#errors +(1,38): unexpected-end-tag +(1,39): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mtext> +| <p> +| <i> +| <i> +| "a" + +#data +<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a +#errors +(1,53): unexpected-end-tag +(1,54): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <math math> +| <math mtext> +| <p> +| <i> +| <i> +| "a" + +#data +<!DOCTYPE html><body><div><!/div>a +#errors +(1,28): expected-dashes-or-doctype +(1,34): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <!-- /div --> +| "a" + +#data +<button><p><button> +#errors +Line 1 Col 8 Unexpected start tag (button). Expected DOCTYPE. +Line 1 Col 19 Unexpected start tag (button) implies end tag (button). +Line 1 Col 19 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <button> +| <p> +| <button> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests3.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests3.dat new file mode 100644 index 000000000..c7583d99e --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests3.dat @@ -0,0 +1,305 @@ +#data +<head></head><style></style> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,20): unexpected-start-tag-out-of-my-head +#document +| <html> +| <head> +| <style> +| <body> + +#data +<head></head><script></script> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,21): unexpected-start-tag-out-of-my-head +#document +| <html> +| <head> +| <script> +| <body> + +#data +<head></head><!-- --><style></style><!-- --><script></script> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,28): unexpected-start-tag-out-of-my-head +(1,52): unexpected-start-tag-out-of-my-head +#document +| <html> +| <head> +| <style> +| <script> +| <!-- --> +| <!-- --> +| <body> + +#data +<head></head><!-- -->x<style></style><!-- --><script></script> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <!-- --> +| <body> +| "x" +| <style> +| <!-- --> +| <script> + +#data +<!DOCTYPE html><html><head></head><body><pre> +</pre></body></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> + +#data +<!DOCTYPE html><html><head></head><body><pre> +foo</pre></body></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> +| "foo" + +#data +<!DOCTYPE html><html><head></head><body><pre> + +foo</pre></body></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> +| " +foo" + +#data +<!DOCTYPE html><html><head></head><body><pre> +foo +</pre></body></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> +| "foo +" + +#data +<!DOCTYPE html><html><head></head><body><pre>x</pre><span> +</span></body></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> +| "x" +| <span> +| " +" + +#data +<!DOCTYPE html><html><head></head><body><pre>x +y</pre></body></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> +| "x +y" + +#data +<!DOCTYPE html><html><head></head><body><pre>x<div> +y</pre></body></html> +#errors +(2,7): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> +| "x" +| <div> +| " +y" + +#data +<!DOCTYPE html><pre>

A</pre> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> +| " +A" + +#data +<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML> +#errors +(1,33): two-heads-are-not-better-than-one +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| <body> + +#data +<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML> +#errors +(1,33): two-heads-are-not-better-than-one +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<textarea>foo<span>bar</span><i>baz +#errors +(1,10): expected-doctype-but-got-start-tag +(1,35): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <textarea> +| "foo<span>bar</span><i>baz" + +#data +<title>foo<span>bar</em><i>baz +#errors +(1,7): expected-doctype-but-got-start-tag +(1,30): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <title> +| "foo<span>bar</em><i>baz" +| <body> + +#data +<!DOCTYPE html><textarea> +</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> + +#data +<!DOCTYPE html><textarea> +foo</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "foo" + +#data +<!DOCTYPE html><textarea> + +foo</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| " +foo" + +#data +<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html> +#errors +(1,60): end-tag-too-early +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ul> +| <li> +| <div> +| <p> +| <li> + +#data +<!doctype html><nobr><nobr><nobr> +#errors +(1,27): unexpected-start-tag-implies-end-tag +(1,33): unexpected-start-tag-implies-end-tag +(1,33): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <nobr> +| <nobr> +| <nobr> + +#data +<!doctype html><nobr><nobr></nobr><nobr> +#errors +(1,27): unexpected-start-tag-implies-end-tag +(1,40): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <nobr> +| <nobr> +| <nobr> + +#data +<!doctype html><html><body><p><table></table></body></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <table> + +#data +<p><table></table> +#errors +(1,3): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <p> +| <table> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests4.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests4.dat new file mode 100644 index 000000000..0a6174c36 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests4.dat @@ -0,0 +1,58 @@ +#data +direct div content +#errors +#document-fragment +div +#document +| "direct div content" + +#data +direct textarea content +#errors +#document-fragment +textarea +#document +| "direct textarea content" + +#data +textarea content with <em>pseudo</em> <foo>markup +#errors +#document-fragment +textarea +#document +| "textarea content with <em>pseudo</em> <foo>markup" + +#data +this is CDATA inside a <style> element +#errors +#document-fragment +style +#document +| "this is CDATA inside a <style> element" + +#data +</plaintext> +#errors +#document-fragment +plaintext +#document +| "</plaintext>" + +#data +setting html's innerHTML +#errors +#document-fragment +html +#document +| <head> +| <body> +| "setting html's innerHTML" + +#data +<title>setting head's innerHTML</title> +#errors +#document-fragment +head +#document +| <title> +| "setting head's innerHTML" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests5.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests5.dat new file mode 100644 index 000000000..1ef8cae42 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests5.dat @@ -0,0 +1,210 @@ +#data +<style> <!-- </style>x +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| " <!-- " +| <body> +| "x" + +#data +<style> <!-- </style> --> </style>x +#errors +(1,7): expected-doctype-but-got-start-tag +(1,34): unexpected-end-tag +#document +| <html> +| <head> +| <style> +| " <!-- " +| " " +| <body> +| "--> x" + +#data +<style> <!--> </style>x +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| " <!--> " +| <body> +| "x" + +#data +<style> <!---> </style>x +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| " <!---> " +| <body> +| "x" + +#data +<iframe> <!---> </iframe>x +#errors +(1,8): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <iframe> +| " <!---> " +| "x" + +#data +<iframe> <!--- </iframe>->x</iframe> --> </iframe>x +#errors +(1,8): expected-doctype-but-got-start-tag +(1,36): unexpected-end-tag +(1,50): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <iframe> +| " <!--- " +| "->x --> x" + +#data +<script> <!-- </script> --> </script>x +#errors +(1,8): expected-doctype-but-got-start-tag +(1,37): unexpected-end-tag +#document +| <html> +| <head> +| <script> +| " <!-- " +| " " +| <body> +| "--> x" + +#data +<title> <!-- </title> --> </title>x +#errors +(1,7): expected-doctype-but-got-start-tag +(1,34): unexpected-end-tag +#document +| <html> +| <head> +| <title> +| " <!-- " +| " " +| <body> +| "--> x" + +#data +<textarea> <!--- </textarea>->x</textarea> --> </textarea>x +#errors +(1,10): expected-doctype-but-got-start-tag +(1,42): unexpected-end-tag +(1,58): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <textarea> +| " <!--- " +| "->x --> x" + +#data +<style> <!</-- </style>x +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <style> +| " <!</-- " +| <body> +| "x" + +#data +<p><xmp></xmp> +#errors +(1,3): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <p> +| <xmp> + +#data +<xmp> <!-- > --> </xmp> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <xmp> +| " <!-- > --> " + +#data +<title>&</title> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <title> +| "&" +| <body> + +#data +<title><!--&--></title> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <title> +| "<!--&-->" +| <body> + +#data +<title><!--</title> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <title> +| "<!--" +| <body> + +#data +<noscript><!--</noscript>--></noscript> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,39): unexpected-end-tag +#script-on +#document +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "-->" + +#data +<noscript><!--</noscript>--></noscript> +#errors +(1,10): expected-doctype-but-got-start-tag +#script-off +#document +| <html> +| <head> +| <noscript> +| <!-- </noscript> --> +| <body> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests6.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests6.dat new file mode 100644 index 000000000..d774fc234 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests6.dat @@ -0,0 +1,659 @@ +#data +<!doctype html></head> <head> +#errors +(1,29): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| " " +| <body> + +#data +<!doctype html><form><div></form><div> +#errors +(1,33): end-tag-too-early-ignored +(1,38): expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <div> +| <div> + +#data +<!doctype html><title>&</title> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "&" +| <body> + +#data +<!doctype html><title><!--&--></title> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "<!--&-->" +| <body> + +#data +<!doctype> +#errors +(1,9): need-space-after-doctype +(1,10): expected-doctype-name-but-got-right-bracket +(1,10): unknown-doctype +#document +| <!DOCTYPE > +| <html> +| <head> +| <body> + +#data +<!---x +#errors +(1,6): eof-in-comment +(1,6): expected-doctype-but-got-eof +#document +| <!-- -x --> +| <html> +| <head> +| <body> + +#data +<body> +<div> +#errors +(1,6): unexpected-start-tag +(2,5): expected-closing-tag-but-got-eof +#document-fragment +div +#document +| " +" +| <div> + +#data +<frameset></frameset> +foo +#errors +(1,10): expected-doctype-but-got-start-tag +(2,1): unexpected-char-after-frameset +(2,2): unexpected-char-after-frameset +(2,3): unexpected-char-after-frameset +#document +| <html> +| <head> +| <frameset> +| " +" + +#data +<frameset></frameset> +<noframes> +#errors +(1,10): expected-doctype-but-got-start-tag +(2,10): expected-named-closing-tag-but-got-eof +#document +| <html> +| <head> +| <frameset> +| " +" +| <noframes> + +#data +<frameset></frameset> +<div> +#errors +(1,10): expected-doctype-but-got-start-tag +(2,5): unexpected-start-tag-after-frameset +#document +| <html> +| <head> +| <frameset> +| " +" + +#data +<frameset></frameset> +</html> +#errors +(1,10): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <frameset> +| " +" + +#data +<frameset></frameset> +</div> +#errors +(1,10): expected-doctype-but-got-start-tag +(2,6): unexpected-end-tag-after-frameset +#document +| <html> +| <head> +| <frameset> +| " +" + +#data +<form><form> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,12): unexpected-start-tag +(1,12): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <form> + +#data +<button><button> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,16): unexpected-start-tag-implies-end-tag +(1,16): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <button> +| <button> + +#data +<table><tr><td></th> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,20): unexpected-end-tag +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><caption><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,20): unexpected-cell-in-table-body +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <caption> +| <tbody> +| <tr> +| <td> + +#data +<table><caption><div> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <caption> +| <div> + +#data +</caption><div> +#errors +(1,10): XXX-undefined-error +(1,15): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <div> + +#data +<table><caption><div></caption> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,31): expected-one-end-tag-but-got-another +(1,31): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <caption> +| <div> + +#data +<table><caption></table> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <table> +| <caption> + +#data +</table><div> +#errors +(1,8): unexpected-end-tag +(1,13): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <div> + +#data +<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,23): unexpected-end-tag +(1,29): unexpected-end-tag +(1,40): unexpected-end-tag +(1,47): unexpected-end-tag +(1,55): unexpected-end-tag +(1,60): unexpected-end-tag +(1,68): unexpected-end-tag +(1,73): unexpected-end-tag +(1,81): unexpected-end-tag +(1,86): unexpected-end-tag +(1,86): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <caption> + +#data +<table><caption><div></div> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,27): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <caption> +| <div> + +#data +<table><tr><td></body></caption></col></colgroup></html> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,22): unexpected-end-tag +(1,32): unexpected-end-tag +(1,38): unexpected-end-tag +(1,49): unexpected-end-tag +(1,56): unexpected-end-tag +(1,56): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +</table></tbody></tfoot></thead></tr><div> +#errors +(1,8): unexpected-end-tag +(1,16): unexpected-end-tag +(1,24): unexpected-end-tag +(1,32): unexpected-end-tag +(1,37): unexpected-end-tag +(1,42): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <div> + +#data +<table><colgroup>foo +#errors +(1,7): expected-doctype-but-got-start-tag +(1,18): foster-parenting-character-in-table +(1,19): foster-parenting-character-in-table +(1,20): foster-parenting-character-in-table +(1,20): eof-in-table +#document +| <html> +| <head> +| <body> +| "foo" +| <table> +| <colgroup> + +#data +foo<col> +#errors +(1,1): unexpected-character-in-colgroup +(1,2): unexpected-character-in-colgroup +(1,3): unexpected-character-in-colgroup +#document-fragment +colgroup +#document +| <col> + +#data +<table><colgroup></col> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,23): no-end-tag +(1,23): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <colgroup> + +#data +<frameset><div> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,15): unexpected-start-tag-in-frameset +(1,15): eof-in-frameset +#document +| <html> +| <head> +| <frameset> + +#data +</frameset><frame> +#errors +(1,11): unexpected-frameset-in-frameset-innerhtml +#document-fragment +frameset +#document +| <frame> + +#data +<frameset></div> +#errors +(1,10): expected-doctype-but-got-start-tag +(1,16): unexpected-end-tag-in-frameset +(1,16): eof-in-frameset +#document +| <html> +| <head> +| <frameset> + +#data +</body><div> +#errors +(1,7): unexpected-close-tag +(1,12): expected-closing-tag-but-got-eof +#document-fragment +body +#document +| <div> + +#data +<table><tr><div> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,16): unexpected-start-tag-implies-table-voodoo +(1,16): eof-in-table +#document +| <html> +| <head> +| <body> +| <div> +| <table> +| <tbody> +| <tr> + +#data +</tr><td> +#errors +(1,5): unexpected-end-tag +#document-fragment +tr +#document +| <td> + +#data +</tbody></tfoot></thead><td> +#errors +(1,8): unexpected-end-tag +(1,16): unexpected-end-tag +(1,24): unexpected-end-tag +#document-fragment +tr +#document +| <td> + +#data +<table><tr><div><td> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,16): foster-parenting-start-tag +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<caption><col><colgroup><tbody><tfoot><thead><tr> +#errors +(1,9): unexpected-start-tag +(1,14): unexpected-start-tag +(1,24): unexpected-start-tag +(1,31): unexpected-start-tag +(1,38): unexpected-start-tag +(1,45): unexpected-start-tag +#document-fragment +tbody +#document +| <tr> + +#data +<table><tbody></thead> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,22): unexpected-end-tag-in-table-body +(1,22): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> + +#data +</table><tr> +#errors +(1,8): unexpected-end-tag +#document-fragment +tbody +#document +| <tr> + +#data +<table><tbody></body></caption></col></colgroup></html></td></th></tr> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,21): unexpected-end-tag-in-table-body +(1,31): unexpected-end-tag-in-table-body +(1,37): unexpected-end-tag-in-table-body +(1,48): unexpected-end-tag-in-table-body +(1,55): unexpected-end-tag-in-table-body +(1,60): unexpected-end-tag-in-table-body +(1,65): unexpected-end-tag-in-table-body +(1,70): unexpected-end-tag-in-table-body +(1,70): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> + +#data +<table><tbody></div> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,20): unexpected-end-tag-implies-table-voodoo +(1,20): end-tag-too-early +(1,20): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> + +#data +<table><table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,14): unexpected-start-tag-implies-end-tag +(1,14): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> +| <table> + +#data +<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,14): unexpected-end-tag +(1,24): unexpected-end-tag +(1,30): unexpected-end-tag +(1,41): unexpected-end-tag +(1,48): unexpected-end-tag +(1,56): unexpected-end-tag +(1,61): unexpected-end-tag +(1,69): unexpected-end-tag +(1,74): unexpected-end-tag +(1,82): unexpected-end-tag +(1,87): unexpected-end-tag +(1,87): eof-in-table +#document +| <html> +| <head> +| <body> +| <table> + +#data +</table><tr> +#errors +(1,8): unexpected-end-tag +#document-fragment +table +#document +| <tbody> +| <tr> + +#data +<body></body></html> +#errors +(1,20): unexpected-end-tag-after-body-innerhtml +#document-fragment +html +#document +| <head> +| <body> + +#data +<html><frameset></frameset></html> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <frameset> +| " " + +#data +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html></html> +#errors +#document +| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" ""> +| <html> +| <head> +| <body> + +#data +<param><frameset></frameset> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,17): unexpected-start-tag +#document +| <html> +| <head> +| <frameset> + +#data +<source><frameset></frameset> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,18): unexpected-start-tag +#document +| <html> +| <head> +| <frameset> + +#data +<track><frameset></frameset> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,17): unexpected-start-tag +#document +| <html> +| <head> +| <frameset> + +#data +</html><frameset></frameset> +#errors +(1,7): expected-doctype-but-got-end-tag +(1,17): expected-eof-but-got-start-tag +(1,17): unexpected-start-tag +#document +| <html> +| <head> +| <frameset> + +#data +</body><frameset></frameset> +#errors +(1,7): expected-doctype-but-got-end-tag +(1,17): unexpected-start-tag-after-body +(1,17): unexpected-start-tag +#document +| <html> +| <head> +| <frameset> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests7.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests7.dat new file mode 100644 index 000000000..d941d3d70 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests7.dat @@ -0,0 +1,403 @@ +#data +<!doctype html><body><title>X</title> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <title> +| "X" + +#data +<!doctype html><table><title>X</title></table> +#errors +(1,29): unexpected-start-tag-implies-table-voodoo +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <title> +| "X" +| <table> + +#data +<!doctype html><head></head><title>X</title> +#errors +(1,35): unexpected-start-tag-out-of-my-head +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "X" +| <body> + +#data +<!doctype html></head><title>X</title> +#errors +(1,29): unexpected-start-tag-out-of-my-head +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "X" +| <body> + +#data +<!doctype html><table><meta></table> +#errors +(1,28): unexpected-start-tag-implies-table-voodoo +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <meta> +| <table> + +#data +<!doctype html><table>X<tr><td><table> <meta></table></table> +#errors +unexpected text in table +(1,45): unexpected-start-tag-implies-table-voodoo +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <tbody> +| <tr> +| <td> +| <meta> +| <table> +| " " + +#data +<!doctype html><html> <head> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html> <head> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html><table><style> <tr>x </style> </table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <style> +| " <tr>x " +| " " + +#data +<!doctype html><table><TBODY><script> <tr>x </script> </table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <script> +| " <tr>x " +| " " + +#data +<!doctype html><p><applet><p>X</p></applet> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <applet> +| <p> +| "X" + +#data +<!doctype html><listing> +X</listing> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <listing> +| "X" + +#data +<!doctype html><select><input>X +#errors +(1,30): unexpected-input-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <input> +| "X" + +#data +<!doctype html><select><select>X +#errors +(1,31): unexpected-select-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| "X" + +#data +<!doctype html><table><input type=hidDEN></table> +#errors +(1,41): unexpected-hidden-input-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <input> +| type="hidDEN" + +#data +<!doctype html><table>X<input type=hidDEN></table> +#errors +(1,23): foster-parenting-character +(1,42): unexpected-hidden-input-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <input> +| type="hidDEN" + +#data +<!doctype html><table> <input type=hidDEN></table> +#errors +(1,43): unexpected-hidden-input-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <input> +| type="hidDEN" + +#data +<!doctype html><table> <input type='hidDEN'></table> +#errors +(1,45): unexpected-hidden-input-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <input> +| type="hidDEN" + +#data +<!doctype html><table><input type=" hidden"><input type=hidDEN></table> +#errors +(1,44): unexpected-start-tag-implies-table-voodoo +(1,63): unexpected-hidden-input-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> +| type=" hidden" +| <table> +| <input> +| type="hidDEN" + +#data +<!doctype html><table><select>X<tr> +#errors +(1,30): unexpected-start-tag-implies-table-voodoo +(1,35): unexpected-table-element-start-tag-in-select-in-table +(1,35): eof-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| "X" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><select>X</select> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| "X" + +#data +<!DOCTYPE hTmL><html></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE HTML><html></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<body>X</body></body> +#errors +(1,21): unexpected-end-tag-after-body +#document-fragment +html +#document +| <head> +| <body> +| "X" + +#data +<div><p>a</x> b +#errors +(1,5): expected-doctype-but-got-start-tag +(1,13): unexpected-end-tag +(1,15): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <p> +| "a b" + +#data +<table><tr><td><code></code> </table> +#errors +(1,7): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <code> +| " " + +#data +<table><b><tr><td>aaa</td></tr>bbb</table>ccc +#errors +(1,7): expected-doctype-but-got-start-tag +(1,10): foster-parenting-start-tag +(1,32): foster-parenting-character +(1,33): foster-parenting-character +(1,34): foster-parenting-character +(1,45): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| <b> +| "bbb" +| <table> +| <tbody> +| <tr> +| <td> +| "aaa" +| <b> +| "ccc" + +#data +A<table><tr> B</tr> B</table> +#errors +(1,1): expected-doctype-but-got-chars +(1,13): foster-parenting-character +(1,14): foster-parenting-character +(1,20): foster-parenting-character +(1,21): foster-parenting-character +#document +| <html> +| <head> +| <body> +| "A B B" +| <table> +| <tbody> +| <tr> + +#data +A<table><tr> B</tr> </em>C</table> +#errors +(1,1): expected-doctype-but-got-chars +(1,13): foster-parenting-character +(1,14): foster-parenting-character +(1,20): foster-parenting-character +(1,25): unexpected-end-tag +(1,26): foster-parenting-character +#document +| <html> +| <head> +| <body> +| "A BC" +| <table> +| <tbody> +| <tr> +| " " + +#data +<select><keygen> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,16): unexpected-input-in-select +#document +| <html> +| <head> +| <body> +| <select> +| <keygen> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests8.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests8.dat new file mode 100644 index 000000000..33dd96d33 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests8.dat @@ -0,0 +1,151 @@ +#data +<div> +<div></div> +</span>x +#errors +(1,5): expected-doctype-but-got-start-tag +(3,7): unexpected-end-tag +(3,8): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| " +" +| <div> +| " +x" + +#data +<div>x<div></div> +</span>x +#errors +(1,5): expected-doctype-but-got-start-tag +(2,7): unexpected-end-tag +(2,8): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| "x" +| <div> +| " +x" + +#data +<div>x<div></div>x</span>x +#errors +(1,5): expected-doctype-but-got-start-tag +(1,25): unexpected-end-tag +(1,26): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| "x" +| <div> +| "xx" + +#data +<div>x<div></div>y</span>z +#errors +(1,5): expected-doctype-but-got-start-tag +(1,25): unexpected-end-tag +(1,26): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| "x" +| <div> +| "yz" + +#data +<table><div>x<div></div>x</span>x +#errors +(1,7): expected-doctype-but-got-start-tag +(1,12): foster-parenting-start-tag +(1,13): foster-parenting-character +(1,18): foster-parenting-start-tag +(1,24): foster-parenting-end-tag +(1,25): foster-parenting-start-tag +(1,32): foster-parenting-end-tag +(1,32): unexpected-end-tag +(1,33): foster-parenting-character +(1,33): eof-in-table +#document +| <html> +| <head> +| <body> +| <div> +| "x" +| <div> +| "xx" +| <table> + +#data +x<table>x +#errors +(1,1): expected-doctype-but-got-chars +(1,9): foster-parenting-character +(1,9): eof-in-table +#document +| <html> +| <head> +| <body> +| "xx" +| <table> + +#data +x<table><table>x +#errors +(1,1): expected-doctype-but-got-chars +(1,15): unexpected-start-tag-implies-end-tag +(1,16): foster-parenting-character +(1,16): eof-in-table +#document +| <html> +| <head> +| <body> +| "x" +| <table> +| "x" +| <table> + +#data +<b>a<div></div><div></b>y +#errors +(1,3): expected-doctype-but-got-start-tag +(1,24): adoption-agency-1.3 +(1,25): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <b> +| "a" +| <div> +| <div> +| <b> +| "y" + +#data +<a><div><p></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,15): adoption-agency-1.3 +(1,15): adoption-agency-1.3 +(1,15): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <div> +| <a> +| <p> +| <a> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests9.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests9.dat new file mode 100644 index 000000000..f8d04b23b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests9.dat @@ -0,0 +1,472 @@ +#data +<!DOCTYPE html><math></math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!DOCTYPE html><body><math></math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!DOCTYPE html><math><mi> +#errors +(1,25) expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> + +#data +<!DOCTYPE html><math><annotation-xml><svg><u> +#errors +(1,45) unexpected-html-element-in-foreign-content +(1,45) expected-closing-tag-but-got-eof +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math annotation-xml> +| <svg svg> +| <u> + +#data +<!DOCTYPE html><body><select><math></math></select> +#errors +(1,35) unexpected-start-tag-in-select +(1,42) unexpected-end-tag-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!DOCTYPE html><body><select><option><math></math></option></select> +#errors +(1,43) unexpected-start-tag-in-select +(1,50) unexpected-end-tag-in-select +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!DOCTYPE html><body><table><math></math></table> +#errors +(1,34) unexpected-start-tag-implies-table-voodoo +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <table> + +#data +<!DOCTYPE html><body><table><math><mi>foo</mi></math></table> +#errors +(1,34) foster-parenting-start-token +(1,39) foster-parenting-character +(1,40) foster-parenting-character +(1,41) foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| "foo" +| <table> + +#data +<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table> +#errors +(1,34) foster-parenting-start-tag +(1,39) foster-parenting-character +(1,40) foster-parenting-character +(1,41) foster-parenting-character +(1,51) foster-parenting-character +(1,52) foster-parenting-character +(1,53) foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <table> + +#data +<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table> +#errors +(1,41) foster-parenting-start-tag +(1,46) foster-parenting-character +(1,47) foster-parenting-character +(1,48) foster-parenting-character +(1,58) foster-parenting-character +(1,59) foster-parenting-character +(1,60) foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <table> +| <tbody> + +#data +<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table> +#errors +(1,45) foster-parenting-start-tag +(1,50) foster-parenting-character +(1,51) foster-parenting-character +(1,52) foster-parenting-character +(1,62) foster-parenting-character +(1,63) foster-parenting-character +(1,64) foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" + +#data +<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux +#errors +(1,70) unexpected-html-element-in-foreign-content +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <p> +| "baz" +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux +#errors +(1,78) unexpected-end-tag +(1,78) expected-one-end-tag-but-got-another +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| "baz" +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux +#errors +(1,44) foster-parenting-start-tag +(1,49) foster-parenting-character +(1,50) foster-parenting-character +(1,51) foster-parenting-character +(1,61) foster-parenting-character +(1,62) foster-parenting-character +(1,63) foster-parenting-character +(1,71) unexpected-html-element-in-foreign-content +(1,71) foster-parenting-start-tag +(1,63) foster-parenting-character +(1,63) foster-parenting-character +(1,63) foster-parenting-character +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <p> +| "baz" +| <table> +| <colgroup> +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux +#errors +(1,50) unexpected-start-tag-in-select +(1,54) unexpected-start-tag-in-select +(1,62) unexpected-end-tag-in-select +(1,66) unexpected-start-tag-in-select +(1,74) unexpected-end-tag-in-select +(1,77) unexpected-start-tag-in-select +(1,88) unexpected-table-element-end-tag-in-select-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| "foobarbaz" +| <p> +| "quux" + +#data +<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux +#errors +(1,36) unexpected-start-tag-implies-table-voodoo +(1,42) unexpected-start-tag-in-select +(1,46) unexpected-start-tag-in-select +(1,54) unexpected-end-tag-in-select +(1,58) unexpected-start-tag-in-select +(1,66) unexpected-end-tag-in-select +(1,69) unexpected-start-tag-in-select +(1,80) unexpected-table-element-end-tag-in-select-in-table +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| "foobarbaz" +| <table> +| <p> +| "quux" + +#data +<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz +#errors +(1,41) expected-eof-but-got-start-tag +(1,68) unexpected-html-element-in-foreign-content +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz +#errors +(1,34) unexpected-start-tag-after-body +(1,61) unexpected-html-element-in-foreign-content +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mi> +| "foo" +| <math mi> +| "bar" +| <p> +| "baz" + +#data +<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span> +#errors +(1,31) unexpected-start-tag-in-frameset +(1,35) unexpected-start-tag-in-frameset +(1,40) unexpected-end-tag-in-frameset +(1,44) unexpected-start-tag-in-frameset +(1,49) unexpected-end-tag-in-frameset +(1,52) unexpected-start-tag-in-frameset +(1,58) unexpected-start-tag-in-frameset +(1,58) eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span> +#errors +(1,42) unexpected-start-tag-after-frameset +(1,46) unexpected-start-tag-after-frameset +(1,51) unexpected-end-tag-after-frameset +(1,55) unexpected-start-tag-after-frameset +(1,60) unexpected-end-tag-after-frameset +(1,63) unexpected-start-tag-after-frameset +(1,69) unexpected-start-tag-after-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| <math math> +| xlink href="foo" + +#data +<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| xml:lang="en" +| <math math> +| <math mi> +| xlink href="foo" +| xml lang="en" + +#data +<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| xml:lang="en" +| <math math> +| <math mi> +| xlink href="foo" +| xml lang="en" + +#data +<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| xlink:href="foo" +| xml:lang="en" +| <math math> +| <math mi> +| xlink href="foo" +| xml lang="en" +| "bar" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests_innerHTML_1.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests_innerHTML_1.dat new file mode 100644 index 000000000..9c5c18220 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tests_innerHTML_1.dat @@ -0,0 +1,891 @@ +#data +<body><span> +#errors +(1,6): unexpected-start-tag +(1,12): expected-closing-tag-but-got-eof +#document-fragment +body +#document +| <span> + +#data +<span><body> +#errors +(1,12): unexpected-start-tag +(1,12): expected-closing-tag-but-got-eof +#document-fragment +body +#document +| <span> + +#data +<span><body> +#errors +(1,12): unexpected-start-tag +(1,12): expected-closing-tag-but-got-eof +#document-fragment +div +#document +| <span> + +#data +<body><span> +#errors +(1,12): expected-closing-tag-but-got-eof +#document-fragment +html +#document +| <head> +| <body> +| <span> + +#data +<frameset><span> +#errors +(1,10): unexpected-start-tag +(1,16): expected-closing-tag-but-got-eof +#document-fragment +body +#document +| <span> + +#data +<span><frameset> +#errors +(1,16): unexpected-start-tag +(1,16): expected-closing-tag-but-got-eof +#document-fragment +body +#document +| <span> + +#data +<span><frameset> +#errors +(1,16): unexpected-start-tag +(1,16): expected-closing-tag-but-got-eof +#document-fragment +div +#document +| <span> + +#data +<frameset><span> +#errors +(1,16): unexpected-start-tag-in-frameset +(1,16): eof-in-frameset +#document-fragment +html +#document +| <head> +| <frameset> + +#data +<table><tr> +#errors +(1,7): unexpected-start-tag +#document-fragment +table +#document +| <tbody> +| <tr> + +#data +</table><tr> +#errors +(1,8): unexpected-end-tag +#document-fragment +table +#document +| <tbody> +| <tr> + +#data +<a> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,3): eof-in-table +#document-fragment +table +#document +| <a> + +#data +<a> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,3): eof-in-table +#document-fragment +table +#document +| <a> + +#data +<a><caption>a +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,13): expected-closing-tag-but-got-eof +#document-fragment +table +#document +| <a> +| <caption> +| "a" + +#data +<a><colgroup><col> +#errors +(1,3): foster-parenting-start-token +(1,18): expected-closing-tag-but-got-eof +#document-fragment +table +#document +| <a> +| <colgroup> +| <col> + +#data +<a><tbody><tr> +#errors +(1,3): foster-parenting-start-tag +#document-fragment +table +#document +| <a> +| <tbody> +| <tr> + +#data +<a><tfoot><tr> +#errors +(1,3): foster-parenting-start-tag +#document-fragment +table +#document +| <a> +| <tfoot> +| <tr> + +#data +<a><thead><tr> +#errors +(1,3): foster-parenting-start-tag +#document-fragment +table +#document +| <a> +| <thead> +| <tr> + +#data +<a><tr> +#errors +(1,3): foster-parenting-start-tag +#document-fragment +table +#document +| <a> +| <tbody> +| <tr> + +#data +<a><th> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,7): unexpected-cell-in-table-body +#document-fragment +table +#document +| <a> +| <tbody> +| <tr> +| <th> + +#data +<a><td> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,7): unexpected-cell-in-table-body +#document-fragment +table +#document +| <a> +| <tbody> +| <tr> +| <td> + +#data +<table></table><tbody> +#errors +(1,22): unexpected-start-tag +#document-fragment +caption +#document +| <table> + +#data +</table><span> +#errors +(1,8): unexpected-end-tag +(1,14): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> + +#data +<span></table> +#errors +(1,14): unexpected-end-tag +(1,14): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> + +#data +</caption><span> +#errors +(1,10): XXX-undefined-error +(1,16): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> + +#data +<span></caption><span> +#errors +(1,16): XXX-undefined-error +(1,22): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><caption><span> +#errors +(1,15): unexpected-start-tag +(1,21): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><col><span> +#errors +(1,11): unexpected-start-tag +(1,17): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><colgroup><span> +#errors +(1,16): unexpected-start-tag +(1,22): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><html><span> +#errors +(1,12): non-html-root +(1,18): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><tbody><span> +#errors +(1,13): unexpected-start-tag +(1,19): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><td><span> +#errors +(1,10): unexpected-start-tag +(1,16): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><tfoot><span> +#errors +(1,13): unexpected-start-tag +(1,19): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><thead><span> +#errors +(1,13): unexpected-start-tag +(1,19): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><th><span> +#errors +(1,10): unexpected-start-tag +(1,16): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span><tr><span> +#errors +(1,10): unexpected-start-tag +(1,16): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +<span></table><span> +#errors +(1,14): unexpected-end-tag +(1,20): expected-closing-tag-but-got-eof +#document-fragment +caption +#document +| <span> +| <span> + +#data +</colgroup><col> +#errors +(1,11): XXX-undefined-error +#document-fragment +colgroup +#document +| <col> + +#data +<a><col> +#errors +(1,3): XXX-undefined-error +#document-fragment +colgroup +#document +| <col> + +#data +<caption><a> +#errors +(1,9): XXX-undefined-error +(1,12): unexpected-start-tag-implies-table-voodoo +(1,12): eof-in-table +#document-fragment +tbody +#document +| <a> + +#data +<col><a> +#errors +(1,5): XXX-undefined-error +(1,8): unexpected-start-tag-implies-table-voodoo +(1,8): eof-in-table +#document-fragment +tbody +#document +| <a> + +#data +<colgroup><a> +#errors +(1,10): XXX-undefined-error +(1,13): unexpected-start-tag-implies-table-voodoo +(1,13): eof-in-table +#document-fragment +tbody +#document +| <a> + +#data +<tbody><a> +#errors +(1,7): XXX-undefined-error +(1,10): unexpected-start-tag-implies-table-voodoo +(1,10): eof-in-table +#document-fragment +tbody +#document +| <a> + +#data +<tfoot><a> +#errors +(1,7): XXX-undefined-error +(1,10): unexpected-start-tag-implies-table-voodoo +(1,10): eof-in-table +#document-fragment +tbody +#document +| <a> + +#data +<thead><a> +#errors +(1,7): XXX-undefined-error +(1,10): unexpected-start-tag-implies-table-voodoo +(1,10): eof-in-table +#document-fragment +tbody +#document +| <a> + +#data +</table><a> +#errors +(1,8): XXX-undefined-error +(1,11): unexpected-start-tag-implies-table-voodoo +(1,11): eof-in-table +#document-fragment +tbody +#document +| <a> + +#data +<a><tr> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +#document-fragment +tbody +#document +| <a> +| <tr> + +#data +<a><td> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,7): unexpected-cell-in-table-body +#document-fragment +tbody +#document +| <a> +| <tr> +| <td> + +#data +<a><td> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,7): unexpected-cell-in-table-body +#document-fragment +tbody +#document +| <a> +| <tr> +| <td> + +#data +<a><td> +#errors +(1,3): unexpected-start-tag-implies-table-voodoo +(1,7): unexpected-cell-in-table-body +#document-fragment +tbody +#document +| <a> +| <tr> +| <td> + +#data +<td><table><tbody><a><tr> +#errors +(1,4): unexpected-cell-in-table-body +(1,21): unexpected-start-tag-implies-table-voodoo +(1,25): eof-in-table +#document-fragment +tbody +#document +| <tr> +| <td> +| <a> +| <table> +| <tbody> +| <tr> + +#data +</tr><td> +#errors +(1,5): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<td><table><a><tr></tr><tr> +#errors +(1,14): unexpected-start-tag-implies-table-voodoo +(1,27): eof-in-table +#document-fragment +tr +#document +| <td> +| <a> +| <table> +| <tbody> +| <tr> +| <tr> + +#data +<caption><td> +#errors +(1,9): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<col><td> +#errors +(1,5): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<colgroup><td> +#errors +(1,10): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<tbody><td> +#errors +(1,7): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<tfoot><td> +#errors +(1,7): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<thead><td> +#errors +(1,7): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<tr><td> +#errors +(1,4): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +</table><td> +#errors +(1,8): XXX-undefined-error +#document-fragment +tr +#document +| <td> + +#data +<td><table></table><td> +#errors +#document-fragment +tr +#document +| <td> +| <table> +| <td> + +#data +<td><table></table><td> +#errors +#document-fragment +tr +#document +| <td> +| <table> +| <td> + +#data +<caption><a> +#errors +(1,9): XXX-undefined-error +(1,12): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<col><a> +#errors +(1,5): XXX-undefined-error +(1,8): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<colgroup><a> +#errors +(1,10): XXX-undefined-error +(1,13): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<tbody><a> +#errors +(1,7): XXX-undefined-error +(1,10): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<tfoot><a> +#errors +(1,7): XXX-undefined-error +(1,10): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<th><a> +#errors +(1,4): XXX-undefined-error +(1,7): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<thead><a> +#errors +(1,7): XXX-undefined-error +(1,10): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<tr><a> +#errors +(1,4): XXX-undefined-error +(1,7): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +</table><a> +#errors +(1,8): XXX-undefined-error +(1,11): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +</tbody><a> +#errors +(1,8): XXX-undefined-error +(1,11): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +</td><a> +#errors +(1,5): unexpected-end-tag +(1,8): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +</tfoot><a> +#errors +(1,8): XXX-undefined-error +(1,11): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +</thead><a> +#errors +(1,8): XXX-undefined-error +(1,11): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +</th><a> +#errors +(1,5): unexpected-end-tag +(1,8): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +</tr><a> +#errors +(1,5): XXX-undefined-error +(1,8): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <a> + +#data +<table><td><td> +#errors +(1,11): unexpected-cell-in-table-body +(1,15): expected-closing-tag-but-got-eof +#document-fragment +td +#document +| <table> +| <tbody> +| <tr> +| <td> +| <td> + +#data +</select><option> +#errors +(1,9): XXX-undefined-error +(1,17): eof-in-select +#document-fragment +select +#document +| <option> + +#data +<input><option> +#errors +(1,7): unexpected-input-in-select +(1,15): eof-in-select +#document-fragment +select +#document +| <option> + +#data +<keygen><option> +#errors +(1,8): unexpected-input-in-select +(1,16): eof-in-select +#document-fragment +select +#document +| <option> + +#data +<textarea><option> +#errors +(1,10): unexpected-input-in-select +(1,18): eof-in-select +#document-fragment +select +#document +| <option> + +#data +</html><!--abc--> +#errors +(1,7): unexpected-end-tag-after-body-innerhtml +#document-fragment +html +#document +| <head> +| <body> +| <!-- abc --> + +#data +</frameset><frame> +#errors +(1,11): unexpected-frameset-in-frameset-innerhtml +#document-fragment +frameset +#document +| <frame> + +#data +#errors +#document-fragment +html +#document +| <head> +| <body> diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tricky01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tricky01.dat new file mode 100644 index 000000000..753502a26 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/tricky01.dat @@ -0,0 +1,336 @@ +#data +<b><p>Bold </b> Not bold</p> +Also not bold. +#errors +(1,3): expected-doctype-but-got-start-tag +(1,15): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <b> +| <p> +| <b> +| "Bold " +| " Not bold" +| " +Also not bold." + +#data +<html> +<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain +<p>I should not be red. <font color=red>Red. <i>Italic and red.</p> +<p>Italic and red. </i> Red.</font> I should not be red.</p> +<b>Bold <i>Bold and italic</b> Only Italic </i> Plain +#errors +(1,6): expected-doctype-but-got-start-tag +(2,58): adoption-agency-1.3 +(3,67): unexpected-end-tag +(4,23): adoption-agency-1.3 +(4,35): adoption-agency-1.3 +(5,30): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <font> +| color="red" +| <i> +| "Italic and Red" +| <i> +| <p> +| <font> +| color="red" +| "Italic and Red " +| " Just italic." +| " Italic only." +| " Plain +" +| <p> +| "I should not be red. " +| <font> +| color="red" +| "Red. " +| <i> +| "Italic and red." +| <font> +| color="red" +| <i> +| " +" +| <p> +| <font> +| color="red" +| <i> +| "Italic and red. " +| " Red." +| " I should not be red." +| " +" +| <b> +| "Bold " +| <i> +| "Bold and italic" +| <i> +| " Only Italic " +| " Plain" + +#data +<html><body> +<p><font size="7">First paragraph.</p> +<p>Second paragraph.</p></font> +<b><p><i>Bold and Italic</b> Italic</p> +#errors +(1,6): expected-doctype-but-got-start-tag +(2,38): unexpected-end-tag +(4,28): adoption-agency-1.3 +(4,28): adoption-agency-1.3 +(4,39): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| " +" +| <p> +| <font> +| size="7" +| "First paragraph." +| <font> +| size="7" +| " +" +| <p> +| "Second paragraph." +| " +" +| <b> +| <p> +| <b> +| <i> +| "Bold and Italic" +| <i> +| " Italic" + +#data +<html> +<dl> +<dt><b>Boo +<dd>Goo? +</dl> +</html> +#errors +(1,6): expected-doctype-but-got-start-tag +(4,4): end-tag-too-early +(5,5): end-tag-too-early +(6,7): expected-one-end-tag-but-got-another +#document +| <html> +| <head> +| <body> +| <dl> +| " +" +| <dt> +| <b> +| "Boo +" +| <dd> +| <b> +| "Goo? +" +| <b> +| " +" + +#data +<html><body> +<label><a><div>Hello<div>World</div></a></label> +</body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +(2,40): adoption-agency-1.3 +(2,48): unexpected-end-tag +(3,7): expected-one-end-tag-but-got-another +#document +| <html> +| <head> +| <body> +| " +" +| <label> +| <a> +| <div> +| <a> +| "Hello" +| <div> +| "World" +| " +" + +#data +<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table> +#errors +(1,7): expected-doctype-but-got-start-tag +(1,15): foster-parenting-start-tag +(1,16): foster-parenting-character +(1,22): foster-parenting-start-tag +(1,23): foster-parenting-character +(1,32): foster-parenting-end-tag +(1,32): end-tag-too-early +(1,33): foster-parenting-character +(1,38): foster-parenting-start-tag +#document +| <html> +| <head> +| <body> +| <center> +| " " +| <font> +| "a" +| <font> +| <img> +| " " +| <table> +| " " +| <tbody> +| <tr> +| <td> +| " " +| " " +| " " + +#data +<table><tr><p><a><p>You should see this text. +#errors +(1,7): expected-doctype-but-got-start-tag +(1,14): unexpected-start-tag-implies-table-voodoo +(1,17): unexpected-start-tag-implies-table-voodoo +(1,20): unexpected-start-tag-implies-table-voodoo +(1,20): closing-non-current-p-element +(1,21): foster-parenting-character +(1,22): foster-parenting-character +(1,23): foster-parenting-character +(1,24): foster-parenting-character +(1,25): foster-parenting-character +(1,26): foster-parenting-character +(1,27): foster-parenting-character +(1,28): foster-parenting-character +(1,29): foster-parenting-character +(1,30): foster-parenting-character +(1,31): foster-parenting-character +(1,32): foster-parenting-character +(1,33): foster-parenting-character +(1,34): foster-parenting-character +(1,35): foster-parenting-character +(1,36): foster-parenting-character +(1,37): foster-parenting-character +(1,38): foster-parenting-character +(1,39): foster-parenting-character +(1,40): foster-parenting-character +(1,41): foster-parenting-character +(1,42): foster-parenting-character +(1,43): foster-parenting-character +(1,44): foster-parenting-character +(1,45): foster-parenting-character +(1,45): eof-in-table +#document +| <html> +| <head> +| <body> +| <p> +| <a> +| <p> +| <a> +| "You should see this text." +| <table> +| <tbody> +| <tr> + +#data +<TABLE> +<TR> +<CENTER><CENTER><TD></TD></TR><TR> +<FONT> +<TABLE><tr></tr></TABLE> +</P> +<a></font><font></a> +This page contains an insanely badly-nested tag sequence. +#errors +(1,7): expected-doctype-but-got-start-tag +(3,8): unexpected-start-tag-implies-table-voodoo +(3,16): unexpected-start-tag-implies-table-voodoo +(4,6): unexpected-start-tag-implies-table-voodoo +(4,6): unexpected character token in table (the newline) +(5,7): unexpected-start-tag-implies-end-tag +(6,4): unexpected p end tag +(7,10): adoption-agency-1.3 +(7,20): adoption-agency-1.3 +(8,57): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <center> +| <center> +| <font> +| " +" +| <table> +| " +" +| <tbody> +| <tr> +| " +" +| <td> +| <tr> +| " +" +| <table> +| <tbody> +| <tr> +| <font> +| " +" +| <p> +| " +" +| <a> +| <a> +| <font> +| <font> +| " +This page contains an insanely badly-nested tag sequence." + +#data +<html> +<body> +<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the +nobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre> +</body> +</html> +#errors +(1,6): expected-doctype-but-got-start-tag +(3,56): adoption-agency-1.3 +(4,58): adoption-agency-1.3 +(5,7): expected-one-end-tag-but-got-another +#document +| <html> +| <head> +| <body> +| " +" +| <b> +| <nobr> +| <div> +| <b> +| <nobr> +| "This text is in a div inside a nobr" +| "More text that should not be in the nobr, i.e., the +nobr should have closed the div inside it implicitly. " +| <pre> +| "A pre tag outside everything else." +| " + +" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/webkit01.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/webkit01.dat new file mode 100644 index 000000000..c480accd9 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/webkit01.dat @@ -0,0 +1,705 @@ +#data +Test +#errors +(1,4): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "Test" + +#data +<div></div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> + +#data +<div>Test</div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| "Test" + +#data +<di +#errors +(1,3): eof-in-tag-name +(1,3): expected-doctype-but-got-eof +#document +| <html> +| <head> +| <body> + +#data +<div>Hello</div> +<script> +console.log("PASS"); +</script> +<div>Bye</div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| "Hello" +| " +" +| <script> +| " +console.log("PASS"); +" +| " +" +| <div> +| "Bye" + +#data +<div foo="bar">Hello</div> +#errors +(1,15): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| foo="bar" +| "Hello" + +#data +<div>Hello</div> +<script> +console.log("FOO<span>BAR</span>BAZ"); +</script> +<div>Bye</div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| "Hello" +| " +" +| <script> +| " +console.log("FOO<span>BAR</span>BAZ"); +" +| " +" +| <div> +| "Bye" + +#data +<foo bar="baz"></foo><potato quack="duck"></potato> +#errors +(1,15): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <foo> +| bar="baz" +| <potato> +| quack="duck" + +#data +<foo bar="baz"><potato quack="duck"></potato></foo> +#errors +(1,15): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <foo> +| bar="baz" +| <potato> +| quack="duck" + +#data +<foo></foo bar="baz"><potato></potato quack="duck"> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,21): attributes-in-end-tag +(1,51): attributes-in-end-tag +#document +| <html> +| <head> +| <body> +| <foo> +| <potato> + +#data +</ tttt> +#errors +(1,2): expected-closing-tag-but-got-char +(1,8): expected-doctype-but-got-eof +#document +| <!-- tttt --> +| <html> +| <head> +| <body> + +#data +<div FOO ><img><img></div> +#errors +(1,10): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| foo="" +| <img> +| <img> + +#data +<p>Test</p<p>Test2</p> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,13): unexpected-end-tag +#document +| <html> +| <head> +| <body> +| <p> +| "TestTest2" + +#data +<rdar://problem/6869687> +#errors +(1,7): unexpected-character-after-solidus-in-tag +(1,8): unexpected-character-after-solidus-in-tag +(1,16): unexpected-character-after-solidus-in-tag +(1,24): expected-doctype-but-got-start-tag +(1,24): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <rdar:> +| 6869687="" +| problem="" + +#data +<A>test< /A> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,8): expected-tag-name +(1,12): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| "test< /A>" + +#data +< +#errors +(1,4): expected-doctype-but-got-chars +#document +| <html> +| <head> +| <body> +| "<" + +#data +<body foo='bar'><body foo='baz' yo='mama'> +#errors +(1,16): expected-doctype-but-got-start-tag +(1,42): unexpected-start-tag +#document +| <html> +| <head> +| <body> +| foo="bar" +| yo="mama" + +#data +<body></br foo="bar"></body> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,21): attributes-in-end-tag +(1,21): unexpected-end-tag-treated-as +#document +| <html> +| <head> +| <body> +| <br> + +#data +<bdy><br foo="bar"></body> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,26): expected-one-end-tag-but-got-another +#document +| <html> +| <head> +| <body> +| <bdy> +| <br> +| foo="bar" + +#data +<body></body></br foo="bar"> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,28): attributes-in-end-tag +(1,28): unexpected-end-tag-after-body +(1,28): unexpected-end-tag-treated-as +#document +| <html> +| <head> +| <body> +| <br> + +#data +<bdy></body><br foo="bar"> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,12): expected-one-end-tag-but-got-another +(1,26): unexpected-start-tag-after-body +(1,26): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <bdy> +| <br> +| foo="bar" + +#data +<html><body></body></html><!-- Hi there --> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <!-- Hi there --> + +#data +<html><body></body></html>x<!-- Hi there --> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,27): expected-eof-but-got-char +#document +| <html> +| <head> +| <body> +| "x" +| <!-- Hi there --> + +#data +<html><body></body></html>x<!-- Hi there --></html><!-- Again --> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,27): expected-eof-but-got-char +#document +| <html> +| <head> +| <body> +| "x" +| <!-- Hi there --> +| <!-- Again --> + +#data +<html><body></body></html>x<!-- Hi there --></body></html><!-- Again --> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,27): expected-eof-but-got-char +#document +| <html> +| <head> +| <body> +| "x" +| <!-- Hi there --> +| <!-- Again --> + +#data +<html><body><ruby><div><rp>xx</rp></div></ruby></body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,27): XXX-undefined-error +#document +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <rp> +| "xx" + +#data +<html><body><ruby><div><rt>xx</rt></div></ruby></body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,27): XXX-undefined-error +#document +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <rt> +| "xx" + +#data +<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6--> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <frameset> +| <!-- 1 --> +| <noframes> +| "A" +| <!-- 2 --> +| <!-- 3 --> +| <noframes> +| "B" +| <!-- 4 --> +| <noframes> +| "C" +| <!-- 5 --> +| <!-- 6 --> + +#data +<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select> +#errors +(1,8): expected-doctype-but-got-start-tag +(1,25): unexpected-select-in-select +(1,59): unexpected-select-in-select +(1,93): unexpected-select-in-select +(1,127): unexpected-select-in-select +(1,127): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <select> +| <option> +| "A" +| <option> +| "B" +| <select> +| <option> +| "C" +| <option> +| "D" +| <select> +| <option> +| "E" +| <option> +| "F" +| <select> +| <option> +| "G" + +#data +<dd><dd><dt><dt><dd><li><li> +#errors +(1,4): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <dd> +| <dd> +| <dt> +| <dt> +| <dd> +| <li> +| <li> + +#data +<div><b></div><div><nobr>a<nobr> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,14): end-tag-too-early +(1,32): unexpected-start-tag-implies-end-tag +(1,32): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <div> +| <b> +| <div> +| <b> +| <nobr> +| "a" +| <nobr> + +#data +<head></head> +<body></body> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| " +" +| <body> + +#data +<head></head> <style></style>ddd +#errors +(1,6): expected-doctype-but-got-start-tag +(1,21): unexpected-start-tag-out-of-my-head +#document +| <html> +| <head> +| <style> +| " " +| <body> +| "ddd" + +#data +<kbd><table></kbd><col><select><tr> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,18): unexpected-end-tag-implies-table-voodoo +(1,18): unexpected-end-tag +(1,31): unexpected-start-tag-implies-table-voodoo +(1,35): unexpected-table-element-start-tag-in-select-in-table +(1,35): eof-in-table +#document +| <html> +| <head> +| <body> +| <kbd> +| <select> +| <table> +| <colgroup> +| <col> +| <tbody> +| <tr> + +#data +<kbd><table></kbd><col><select><tr></table><div> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,18): unexpected-end-tag-implies-table-voodoo +(1,18): unexpected-end-tag +(1,31): unexpected-start-tag-implies-table-voodoo +(1,35): unexpected-table-element-start-tag-in-select-in-table +(1,48): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <kbd> +| <select> +| <table> +| <colgroup> +| <col> +| <tbody> +| <tr> +| <div> + +#data +<a><li><style></style><title></title></a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,41): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <a> +| <li> +| <a> +| <style> +| <title> + +#data +<font></p><p><meta><title></title></font> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,10): unexpected-end-tag +(1,41): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <font> +| <p> +| <p> +| <font> +| <meta> +| <title> + +#data +<a><center><title></title><a> +#errors +(1,3): expected-doctype-but-got-start-tag +(1,29): unexpected-start-tag-implies-end-tag +(1,29): adoption-agency-1.3 +(1,29): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <a> +| <center> +| <a> +| <title> +| <a> + +#data +<svg><title><div> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| <svg title> +| <div> + +#data +<svg><title><rect><div> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,23): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| <svg title> +| <rect> +| <div> + +#data +<svg><title><svg><div> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,22): unexpected-html-element-in-foreign-content +(1,22): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| <svg title> +| <svg svg> +| <div> + +#data +<img <="" FAIL> +#errors +(1,6): invalid-character-in-attribute-name +(1,15): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <img> +| <="" +| fail="" + +#data +<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul> +#errors +(1,4): expected-doctype-but-got-start-tag +(1,23): non-void-element-with-trailing-solidus +(1,29): end-tag-too-early +#document +| <html> +| <head> +| <body> +| <ul> +| <li> +| <div> +| id="foo" +| "A" +| <li> +| "B" +| <div> +| "C" + +#data +<svg><em><desc></em> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,9): unexpected-html-element-in-foreign-content +(1,20): adoption-agency-1.3 +#document +| <html> +| <head> +| <body> +| <svg svg> +| <em> +| <desc> + +#data +<svg><tfoot></mi><td> +#errors +(1,5): expected-doctype-but-got-start-tag +(1,17): unexpected-end-tag +(1,17): unexpected-end-tag +(1,21): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <svg svg> +| <svg tfoot> +| <svg td> + +#data +<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math> +#errors +(1,6): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <math math> +| <math mrow> +| <math mrow> +| <math mn> +| "1" +| <math mi> +| "a" + +#data +<!doctype html><input type="hidden"><frameset> +#errors +(1,46): unexpected-start-tag +(1,46): eof-in-frameset +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><input type="button"><frameset> +#errors +(1,46): unexpected-start-tag +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> +| type="button" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/webkit02.dat b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/webkit02.dat new file mode 100644 index 000000000..1ce90dfe1 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/tree-construction/webkit02.dat @@ -0,0 +1,134 @@ +#data +<foo bar=qux/> +#errors +(1,14): expected-doctype-but-got-start-tag +(1,14): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <foo> +| bar="qux/" + +#data +<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p> +#errors +(1,15): expected-doctype-but-got-start-tag +#script-on +#document +| <html> +| <head> +| <body> +| <p> +| id="status" +| <noscript> +| "<strong>A</strong>" +| <span> +| "B" + +#data +<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p> +#errors +(1,15): expected-doctype-but-got-start-tag +#script-off +#document +| <html> +| <head> +| <body> +| <p> +| id="status" +| <noscript> +| <strong> +| "A" +| <span> +| "B" + +#data +<div><sarcasm><div></div></sarcasm></div> +#errors +(1,5): expected-doctype-but-got-start-tag +#document +| <html> +| <head> +| <body> +| <div> +| <sarcasm> +| <div> + +#data +<html><body><img src="" border="0" alt="><div>A</div></body></html> +#errors +(1,6): expected-doctype-but-got-start-tag +(1,67): eof-in-attribute-value-double-quote +#document +| <html> +| <head> +| <body> + +#data +<table><td></tbody>A +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,20): foster-parenting-character +(1,20): eof-in-table +#document +| <html> +| <head> +| <body> +| "A" +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><td></thead>A +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,19): XXX-undefined-error +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "A" + +#data +<table><td></tfoot>A +#errors +(1,7): expected-doctype-but-got-start-tag +(1,11): unexpected-cell-in-table-body +(1,19): XXX-undefined-error +(1,20): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "A" + +#data +<table><thead><td></tbody>A +#errors +(1,7): expected-doctype-but-got-start-tag +(1,18): unexpected-cell-in-table-body +(1,26): XXX-undefined-error +(1,27): expected-closing-tag-but-got-eof +#document +| <html> +| <head> +| <body> +| <table> +| <thead> +| <tr> +| <td> +| "A" diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/attributes.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/attributes.test new file mode 100755 index 000000000..2815976bf --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/attributes.test @@ -0,0 +1,1035 @@ +{"tests": [ + +{"description": "allowed 'class' attribute on <span>", +"input": "<span class>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'contenteditable' attribute on <span>", +"input": "<span contenteditable>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'contextmenu' attribute on <span>", +"input": "<span contextmenu>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'dir' attribute on <span>", +"input": "<span dir>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'draggable' attribute on <span>", +"input": "<span draggable>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'id' attribute on <span>", +"input": "<span id>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'irrelevant' attribute on <span>", +"input": "<span irrelevant>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'lang' attribute on <span>", +"input": "<span lang>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ref' attribute on <span>", +"input": "<span ref>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'tabindex' attribute on <span>", +"input": "<span tabindex>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'template' attribute on <span>", +"input": "<span template>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'title' attribute on <span>", +"input": "<span title>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onabort' attribute on <span>", +"input": "<span onabort>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onbeforeunload' attribute on <span>", +"input": "<span onbeforeunload>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onblur' attribute on <span>", +"input": "<span onblur>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onchange' attribute on <span>", +"input": "<span onchange>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onclick' attribute on <span>", +"input": "<span onclick>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'oncontextmenu' attribute on <span>", +"input": "<span oncontextmenu>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondblclick' attribute on <span>", +"input": "<span ondblclick>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondrag' attribute on <span>", +"input": "<span ondrag>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondragend' attribute on <span>", +"input": "<span ondragend>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondragenter' attribute on <span>", +"input": "<span ondragenter>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondragleave' attribute on <span>", +"input": "<span ondragleave>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondragover' attribute on <span>", +"input": "<span ondragover>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondragstart' attribute on <span>", +"input": "<span ondragstart>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ondrop' attribute on <span>", +"input": "<span ondrop>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onerror' attribute on <span>", +"input": "<span onerror>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onfocus' attribute on <span>", +"input": "<span onfocus>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onkeydown' attribute on <span>", +"input": "<span onkeydown>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onkeypress' attribute on <span>", +"input": "<span onkeypress>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onkeyup' attribute on <span>", +"input": "<span onkeyup>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onload' attribute on <span>", +"input": "<span onload>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onmessage' attribute on <span>", +"input": "<span onmessage>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onmousedown' attribute on <span>", +"input": "<span onmousedown>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onmousemove' attribute on <span>", +"input": "<span onmousemove>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onmouseout' attribute on <span>", +"input": "<span onmouseout>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onmouseover' attribute on <span>", +"input": "<span onmouseover>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onmouseup' attribute on <span>", +"input": "<span onmouseup>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onmousewheel' attribute on <span>", +"input": "<span onmousewheel>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onresize' attribute on <span>", +"input": "<span onresize>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onscroll' attribute on <span>", +"input": "<span onscroll>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onselect' attribute on <span>", +"input": "<span onselect>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onsubmit' attribute on <span>", +"input": "<span onsubmit>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onunload' attribute on <span>", +"input": "<span onunload>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <command>", +"input": "<command type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'label' attribute on <command>", +"input": "<command label>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'icon' attribute on <command>", +"input": "<command icon>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'hidden' attribute on <command>", +"input": "<command hidden>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <command>", +"input": "<command disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'checked' attribute on <command>", +"input": "<command checked>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'radiogroup' attribute on <command>", +"input": "<command radiogroup>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'default' attribute on <command>", +"input": "<command default>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'value' attribute on <meter>", +"input": "<meter value>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'min' attribute on <meter>", +"input": "<meter min>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'low' attribute on <meter>", +"input": "<meter low>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'high' attribute on <meter>", +"input": "<meter high>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'max' attribute on <meter>", +"input": "<meter max>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'optimum' attribute on <meter>", +"input": "<meter optimum>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'cite' attribute on <ins>", +"input": "<ins cite>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'datetime' attribute on <ins>", +"input": "<ins datetime>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'multiple' attribute on <datagrid>", +"input": "<datagrid multiple>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <datagrid>", +"input": "<datagrid disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'name' attribute on <meta>", +"input": "<meta name>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'http-equiv' attribute on <meta>", +"input": "<meta http-equiv>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'content' attribute on <meta>", +"input": "<meta content>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'charset' attribute on <meta>", +"input": "<meta charset>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'src' attribute on <video>", +"input": "<video src>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'autoplay' attribute on <video>", +"input": "<video autoplay>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'start' attribute on <video>", +"input": "<video start>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'loopstart' attribute on <video>", +"input": "<video loopstart>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'loopend' attribute on <video>", +"input": "<video loopend>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'end' attribute on <video>", +"input": "<video end>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'loopcount' attribute on <video>", +"input": "<video loopcount>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'controls' attribute on <video>", +"input": "<video controls>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'style' attribute on <font>", +"input": "<font style>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'media' attribute on <style>", +"input": "<style media>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <style>", +"input": "<style type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'scoped' attribute on <style>", +"input": "<style scoped>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'alt' attribute on <img>", +"input": "<img alt>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'src' attribute on <img>", +"input": "<img src>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'usemap' attribute on <img>", +"input": "<img usemap>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ismap' attribute on <img>", +"input": "<img ismap>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'height' attribute on <img>", +"input": "<img height>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'width' attribute on <img>", +"input": "<img width>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'alt' attribute on <area>", +"input": "<area alt>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'coords' attribute on <area>", +"input": "<area coords>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'shape' attribute on <area>", +"input": "<area shape>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'href' attribute on <area>", +"input": "<area href>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'target' attribute on <area>", +"input": "<area target>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ping' attribute on <area>", +"input": "<area ping>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'rel' attribute on <area>", +"input": "<area rel>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'media' attribute on <area>", +"input": "<area media>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'hreflang' attribute on <area>", +"input": "<area hreflang>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <area>", +"input": "<area type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <menu>", +"input": "<menu type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'label' attribute on <menu>", +"input": "<menu label>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'autosubmit' attribute on <menu>", +"input": "<menu autosubmit>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'name' attribute on <param>", +"input": "<param name>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'value' attribute on <param>", +"input": "<param value>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'value' attribute on <li>", +"input": "<li value>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'src' attribute on <source>", +"input": "<source src>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <source>", +"input": "<source type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'media' attribute on <source>", +"input": "<source media>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'xmlns' attribute on <html>", +"input": "<html xmlns>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'open' attribute on <details>", +"input": "<details open>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'colspan' attribute on <th>", +"input": "<th colspan>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'rowspan' attribute on <th>", +"input": "<th rowspan>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'scope' attribute on <th>", +"input": "<th scope>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'value' attribute on <progress>", +"input": "<progress value>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'max' attribute on <progress>", +"input": "<progress max>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'colspan' attribute on <td>", +"input": "<td colspan>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'rowspan' attribute on <td>", +"input": "<td rowspan>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'cite' attribute on <blockquote>", +"input": "<blockquote cite>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'data' attribute on <object>", +"input": "<object data>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <object>", +"input": "<object type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'usemap' attribute on <object>", +"input": "<object usemap>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'height' attribute on <object>", +"input": "<object height>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'width' attribute on <object>", +"input": "<object width>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'height' attribute on <canvas>", +"input": "<canvas height>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'width' attribute on <canvas>", +"input": "<canvas width>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'href' attribute on <base>", +"input": "<base href>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'target' attribute on <base>", +"input": "<base target>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'href' attribute on <link>", +"input": "<link href>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'rel' attribute on <link>", +"input": "<link rel>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'media' attribute on <link>", +"input": "<link media>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'hreflang' attribute on <link>", +"input": "<link hreflang>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <link>", +"input": "<link type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'href' attribute on <a>", +"input": "<a href>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'target' attribute on <a>", +"input": "<a target>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'ping' attribute on <a>", +"input": "<a ping>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'rel' attribute on <a>", +"input": "<a rel>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'media' attribute on <a>", +"input": "<a media>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'hreflang' attribute on <a>", +"input": "<a hreflang>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <a>", +"input": "<a type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'src' attribute on <event-source>", +"input": "<event-source src>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'start' attribute on <ol>", +"input": "<ol start>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'span' attribute on <colgroup>", +"input": "<colgroup span>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'src' attribute on <script>", +"input": "<script src>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'defer' attribute on <script>", +"input": "<script defer>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'async' attribute on <script>", +"input": "<script async>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <script>", +"input": "<script type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'cite' attribute on <q>", +"input": "<q cite>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'cite' attribute on <del>", +"input": "<del cite>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'datetime' attribute on <del>", +"input": "<del datetime>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'src' attribute on <iframe>", +"input": "<iframe src>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'datetime' attribute on <time>", +"input": "<time datetime>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'src' attribute on <audio>", +"input": "<audio src>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'autoplay' attribute on <audio>", +"input": "<audio autoplay>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'start' attribute on <audio>", +"input": "<audio start>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'loopstart' attribute on <audio>", +"input": "<audio loopstart>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'loopend' attribute on <audio>", +"input": "<audio loopend>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'end' attribute on <audio>", +"input": "<audio end>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'loopcount' attribute on <audio>", +"input": "<audio loopcount>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'controls' attribute on <audio>", +"input": "<audio controls>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'span' attribute on <col>", +"input": "<col span>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <fieldset>", +"input": "<fieldset disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'form' attribute on <fieldset>", +"input": "<fieldset form>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onsubmit' attribute on <form>", +"input": "<form onsubmit>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'name' attribute on <form>", +"input": "<form name>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onreset' attribute on <form>", +"input": "<form onreset>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'accept' attribute on <form>", +"input": "<form accept>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'replace' attribute on <form>", +"input": "<form replace>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'accept-charset' attribute on <form>", +"input": "<form accept-charset>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'action' attribute on <form>", +"input": "<form action>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'data' attribute on <form>", +"input": "<form data>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'method' attribute on <form>", +"input": "<form method>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'enctype' attribute on <form>", +"input": "<form enctype>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'rows' attribute on <textarea>", +"input": "<textarea rows>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'name' attribute on <textarea>", +"input": "<textarea name>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'form' attribute on <textarea>", +"input": "<textarea form>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'required' attribute on <textarea>", +"input": "<textarea required>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'cols' attribute on <textarea>", +"input": "<textarea cols>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'accept' attribute on <textarea>", +"input": "<textarea accept>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <textarea>", +"input": "<textarea disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'readonly' attribute on <textarea>", +"input": "<textarea readonly>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'wrap' attribute on <textarea>", +"input": "<textarea wrap>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'autofocus' attribute on <textarea>", +"input": "<textarea autofocus>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'maxlength' attribute on <textarea>", +"input": "<textarea maxlength>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'a' attribute on <datalist>", +"input": "<datalist a>", +"fail-unless": "unknown-attribute"}, + +{"description": "allowed 'd' attribute on <datalist>", +"input": "<datalist d>", +"fail-unless": "unknown-attribute"}, + +{"description": "allowed 't' attribute on <datalist>", +"input": "<datalist t>", +"fail-unless": "unknown-attribute"}, + +{"description": "allowed 'action' attribute on <button>", +"input": "<button action>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'enctype' attribute on <button>", +"input": "<button enctype>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'method' attribute on <button>", +"input": "<button method>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'replace' attribute on <button>", +"input": "<button replace>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'template' attribute on <button>", +"input": "<button template>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'name' attribute on <button>", +"input": "<button name>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'form' attribute on <button>", +"input": "<button form>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'value' attribute on <button>", +"input": "<button value>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <button>", +"input": "<button disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'autofocus' attribute on <button>", +"input": "<button autofocus>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'type' attribute on <button>", +"input": "<button type>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'accesskey' attribute on <label>", +"input": "<label accesskey>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'form' attribute on <label>", +"input": "<label form>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'for' attribute on <label>", +"input": "<label for>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <optgroup>", +"input": "<optgroup disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'label' attribute on <optgroup>", +"input": "<optgroup label>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onforminput' attribute on <output>", +"input": "<output onforminput>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'onformchange' attribute on <output>", +"input": "<output onformchange>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'name' attribute on <output>", +"input": "<output name>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'form' attribute on <output>", +"input": "<output form>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'for' attribute on <output>", +"input": "<output for>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'multiple' attribute on <select>", +"input": "<select multiple>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'name' attribute on <select>", +"input": "<select name>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'form' attribute on <select>", +"input": "<select form>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'accesskey' attribute on <select>", +"input": "<select accesskey>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <select>", +"input": "<select disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'autofocus' attribute on <select>", +"input": "<select autofocus>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'data' attribute on <select>", +"input": "<select data>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'size' attribute on <select>", +"input": "<select size>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'selected' attribute on <option>", +"input": "<option selected>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'value' attribute on <option>", +"input": "<option value>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'label' attribute on <option>", +"input": "<option label>", +"fail-if": "unknown-attribute"}, + +{"description": "allowed 'disabled' attribute on <option>", +"input": "<option disabled>", +"fail-if": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <command>", +"input": "<command foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <meter>", +"input": "<meter foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <ins>", +"input": "<ins foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <datagrid>", +"input": "<datagrid foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <meta>", +"input": "<meta foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <video>", +"input": "<video foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <font>", +"input": "<font foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <style>", +"input": "<style foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <img>", +"input": "<img foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <area>", +"input": "<area foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <menu>", +"input": "<menu foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <param>", +"input": "<param foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <li>", +"input": "<li foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <source>", +"input": "<source foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <html>", +"input": "<html foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <details>", +"input": "<details foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <th>", +"input": "<th foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <progress>", +"input": "<progress foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <td>", +"input": "<td foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <blockquote>", +"input": "<blockquote foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <object>", +"input": "<object foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <canvas>", +"input": "<canvas foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <base>", +"input": "<base foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <link>", +"input": "<link foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <a>", +"input": "<a foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <event-source>", +"input": "<event-source foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <ol>", +"input": "<ol foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <colgroup>", +"input": "<colgroup foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <script>", +"input": "<script foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <q>", +"input": "<q foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <del>", +"input": "<del foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <iframe>", +"input": "<iframe foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <time>", +"input": "<time foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <audio>", +"input": "<audio foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <col>", +"input": "<col foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "missing required 'href' attribute on <link>", +"input": "<link rel>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'rel' attribute on <link>", +"input": "<link href>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'dir' attribute on <bdo>", +"input": "<bdo>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'src' attribute on <img>", +"input": "<img>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'src' attribute on <embed>", +"input": "<embed>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'name' attribute on <param>", +"input": "<param value>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'value' attribute on <param>", +"input": "<param name>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'src' attribute on <source>", +"input": "<source>", +"fail-unless": "missing-required-attribute"}, + +{"description": "missing required 'id' attribute on <map>", +"input": "<map>", +"fail-unless": "missing-required-attribute"} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/base-href-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/base-href-attribute.test new file mode 100755 index 000000000..83a626a79 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/base-href-attribute.test @@ -0,0 +1,787 @@ +{"tests": [ + +{"description": "base href contains invalid URI due to leading space", +"input": "<base href=' http://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to trailing space", +"input": "<base href='http://www.example.com/ '", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to space in scheme", +"input": "<base href='ht tp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to space in domain", +"input": "<base href='http://www.example. com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to space in path", +"input": "<base href='http://www.example.com/a b'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to space in fragment", +"input": "<base href='http://www.example.com/a#b c'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to space in query", +"input": "<base href='http://www.example.com/a?b c'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to leading tab", +"input": "<base href='\thttp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to trailing tab", +"input": "<base href='http://www.example.com/\t'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to tab in scheme", +"input": "<base href='ht\ttp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to tab in domain", +"input": "<base href='http://www.example.\tcom/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to tab in path", +"input": "<base href='http://www.example.com/a\tb'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to tab in fragment", +"input": "<base href='http://www.example.com/a#b\tc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to tab in query", +"input": "<base href='http://www.example.com/a?b\tc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to leading LF", +"input": "<base href='\nhttp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LF in scheme", +"input": "<base href='ht\ntp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LF in domain", +"input": "<base href='http://www.example.\ncom/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LF in path", +"input": "<base href='http://www.example.com/a\nb'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LF in fragment", +"input": "<base href='http://www.example.com/a#b\nc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LF in query", +"input": "<base href='http://www.example.com/a?b\nc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to leading LT", +"input": "<base href='\u000Bhttp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to trailing LT", +"input": "<base href='http://www.example.com/\u000B'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LT in scheme", +"input": "<base href='ht\u000Btp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LT in domain", +"input": "<base href='http://www.example.\u000Bcom/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LT in path", +"input": "<base href='http://www.example.com/a\u000Bb'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LT in fragment", +"input": "<base href='http://www.example.com/a#b\u000Bc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to LT in query", +"input": "<base href='http://www.example.com/a?b\u000Bc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to leading FF", +"input": "<base href='\u000Chttp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to trailing FF", +"input": "<base href='http://www.example.com/\u000C'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to FF in scheme", +"input": "<base href='ht\u000Ctp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to FF in domain", +"input": "<base href='http://www.example.\u000Ccom/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to FF in path", +"input": "<base href='http://www.example.com/a\u000Cb'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to FF in fragment", +"input": "<base href='http://www.example.com/a#b\u000Cc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to FF in query", +"input": "<base href='http://www.example.com/a?b\u000Cc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to leading CR", +"input": "<base href='\rhttp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to CR in scheme", +"input": "<base href='ht\rtp://www.example.com/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to CR in domain", +"input": "<base href='http://www.example.\rcom/'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to CR in path", +"input": "<base href='http://www.example.com/a\rb'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to CR in fragment", +"input": "<base href='http://www.example.com/a#b\rc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains invalid URI due to CR in query", +"input": "<base href='http://www.example.com/a?b\rc'", +"fail-unless": "invalid-uri-char"}, + +{"description": "base href contains valid URI scheme 'ftp'", +"input": "<base href='ftp://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'http'", +"input": "<base href='http://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'gopher'", +"input": "<base href='gopher://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'mailto'", +"input": "<base href='mailto://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'news'", +"input": "<base href='news://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'nntp'", +"input": "<base href='nntp://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'telnet'", +"input": "<base href='telnet://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'wais'", +"input": "<base href='wais://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'file'", +"input": "<base href='file://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'prospero'", +"input": "<base href='prospero://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'z39.50s'", +"input": "<base href='z39.50s://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'z39.50r'", +"input": "<base href='z39.50r://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'cid'", +"input": "<base href='cid://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'mid'", +"input": "<base href='mid://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'vemmi'", +"input": "<base href='vemmi://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'service'", +"input": "<base href='service://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'imap'", +"input": "<base href='imap://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'nfs'", +"input": "<base href='nfs://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'acap'", +"input": "<base href='acap://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'rtsp'", +"input": "<base href='rtsp://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'tip'", +"input": "<base href='tip://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'pop'", +"input": "<base href='pop://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'data'", +"input": "<base href='data://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'dav'", +"input": "<base href='dav://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'opaquelocktoken'", +"input": "<base href='opaquelocktoken://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'sip'", +"input": "<base href='sip://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'sips'", +"input": "<base href='sips://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'tel'", +"input": "<base href='tel://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'fax'", +"input": "<base href='fax://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'modem'", +"input": "<base href='modem://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'ldap'", +"input": "<base href='ldap://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'https'", +"input": "<base href='https://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'soap.beep'", +"input": "<base href='soap.beep://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'soap.beeps'", +"input": "<base href='soap.beeps://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'xmlrpc.beep'", +"input": "<base href='xmlrpc.beep://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'xmlrpc.beeps'", +"input": "<base href='xmlrpc.beeps://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'urn'", +"input": "<base href='urn://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'go'", +"input": "<base href='go://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'h323'", +"input": "<base href='h323://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'ipp'", +"input": "<base href='ipp://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'tftp'", +"input": "<base href='tftp://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'mupdate'", +"input": "<base href='mupdate://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'pres'", +"input": "<base href='pres://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'im'", +"input": "<base href='im://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'mtqp'", +"input": "<base href='mtqp://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'iris.beep'", +"input": "<base href='iris.beep://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'dict'", +"input": "<base href='dict://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'snmp'", +"input": "<base href='snmp://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'crid'", +"input": "<base href='crid://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'tag'", +"input": "<base href='tag://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'dns'", +"input": "<base href='dns://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'info'", +"input": "<base href='info://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'javascript'", +"input": "<base href='javascript:foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'FTP'", +"input": "<base href='FTP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'HTTP'", +"input": "<base href='HTTP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'GOPHER'", +"input": "<base href='GOPHER://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'MAILTO'", +"input": "<base href='MAILTO://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'NEWS'", +"input": "<base href='NEWS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'NNTP'", +"input": "<base href='NNTP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'TELNET'", +"input": "<base href='TELNET://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'WAIS'", +"input": "<base href='WAIS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'FILE'", +"input": "<base href='FILE://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'PROSPERO'", +"input": "<base href='PROSPERO://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'Z39.50S'", +"input": "<base href='Z39.50S://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'Z39.50R'", +"input": "<base href='Z39.50R://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'CID'", +"input": "<base href='CID://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'MID'", +"input": "<base href='MID://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'VEMMI'", +"input": "<base href='VEMMI://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'SERVICE'", +"input": "<base href='SERVICE://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'IMAP'", +"input": "<base href='IMAP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'NFS'", +"input": "<base href='NFS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'ACAP'", +"input": "<base href='ACAP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'RTSP'", +"input": "<base href='RTSP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'TIP'", +"input": "<base href='TIP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'POP'", +"input": "<base href='POP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'DATA'", +"input": "<base href='DATA://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'DAV'", +"input": "<base href='DAV://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'OPAQUELOCKTOKEN'", +"input": "<base href='OPAQUELOCKTOKEN://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'SIP'", +"input": "<base href='SIP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'SIPS'", +"input": "<base href='SIPS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'TEL'", +"input": "<base href='TEL://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'FAX'", +"input": "<base href='FAX://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'MODEM'", +"input": "<base href='MODEM://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'LDAP'", +"input": "<base href='LDAP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'HTTPS'", +"input": "<base href='HTTPS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'SOAP.BEEP'", +"input": "<base href='SOAP.BEEP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'SOAP.BEEPS'", +"input": "<base href='SOAP.BEEPS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'XMLRPC.BEEP'", +"input": "<base href='XMLRPC.BEEP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'XMLRPC.BEEPS'", +"input": "<base href='XMLRPC.BEEPS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'URN'", +"input": "<base href='URN://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'GO'", +"input": "<base href='GO://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'H323'", +"input": "<base href='H323://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'IPP'", +"input": "<base href='IPP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'TFTP'", +"input": "<base href='TFTP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'MUPDATE'", +"input": "<base href='MUPDATE://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'PRES'", +"input": "<base href='PRES://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'IM'", +"input": "<base href='IM://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'MTQP'", +"input": "<base href='MTQP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'IRIS.BEEP'", +"input": "<base href='IRIS.BEEP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'DICT'", +"input": "<base href='DICT://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'SNMP'", +"input": "<base href='SNMP://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'CRID'", +"input": "<base href='CRID://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'TAG'", +"input": "<base href='TAG://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'DNS'", +"input": "<base href='DNS://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'INFO'", +"input": "<base href='INFO://foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'JAVASCRIPT'", +"input": "<base href='JAVASCRIPT:foo'", +"fail-if": "invalid-scheme"}, + +{"description": "base href contains valid URI scheme 'foo'", +"input": "<base href='foo:bar'", +"fail-unless": "invalid-scheme"}, + +{"description": "base href contains valid URI 'g'", +"input": "<base href='g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI './g'", +"input": "<base href='./g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g/'", +"input": "<base href='g/'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '/g'", +"input": "<base href='/g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '//g'", +"input": "<base href='//g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '?y'", +"input": "<base href='?y'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g?y'", +"input": "<base href='g?y'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '#s'", +"input": "<base href='#s'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g#s'", +"input": "<base href='g#s'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g?y#s'", +"input": "<base href='g?y#s'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI ';x'", +"input": "<base href=';x'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g;x'", +"input": "<base href='g;x'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g;x?y#s'", +"input": "<base href='g;x?y#s'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '.'", +"input": "<base href='.'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI './'", +"input": "<base href='./'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '..'", +"input": "<base href='..'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '../'", +"input": "<base href='../'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '../g'", +"input": "<base href='../g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '../..'", +"input": "<base href='../..'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '../../'", +"input": "<base href='../../'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '../../g'", +"input": "<base href='../../g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '../../../g'", +"input": "<base href='../../../g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '../../../../g'", +"input": "<base href='../../../../g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '/./g'", +"input": "<base href='/./g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '/../g'", +"input": "<base href='/../g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g.'", +"input": "<base href='g.'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '.g'", +"input": "<base href='.g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g..'", +"input": "<base href='g..'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI '..g'", +"input": "<base href='..g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI './../g'", +"input": "<base href='./../g'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI './g/.'", +"input": "<base href='./g/.'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g/./h'", +"input": "<base href='g/./h'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g/../h'", +"input": "<base href='g/../h'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g;x=1/./y'", +"input": "<base href='g;x=1/./y'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g;x=1/../y'", +"input": "<base href='g;x=1/../y'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g?y/./x'", +"input": "<base href='g?y/./x'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g?y/../x'", +"input": "<base href='g?y/../x'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g#s/./x'", +"input": "<base href='g#s/./x'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'g#s/../x'", +"input": "<base href='g#s/../x'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI './g:h'", +"input": "<base href='./g:h'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://www.w%33.org'", +"input": "<base href='http://www.w%33.org'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://r%C3%A4ksm%C3%B6rg%C3%A5s.josefsson.org'", +"input": "<base href='http://r%C3%A4ksm%C3%B6rg%C3%A5s.josefsson.org'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://xn--rksmrgs-5wao1o.josefsson.org'", +"input": "<base href='http://xn--rksmrgs-5wao1o.josefsson.org'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://%E7%B4%8D%E8%B1%86.w3.mag.keio.ac.jp'", +"input": "<base href='http://%E7%B4%8D%E8%B1%86.w3.mag.keio.ac.jp'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://xn--99zt52a.w3.mag.keio.ac.jp'", +"input": "<base href='http://xn--99zt52a.w3.mag.keio.ac.jp'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp/'", +"input": "<base href='http://www.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp/'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/'", +"input": "<base href='http://www.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp/'", +"input": "<base href='http://%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.%E3%81%BB%E3%82%93%E3%81%A8%E3%81%86%E3%81%AB%E3%81%AA%E3%81%8C%E3%81%84%E3%82%8F%E3%81%91%E3%81%AE%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E3%81%A9%E3%82%81%E3%81%84%E3%82%93%E3%82%81%E3%81%84%E3%81%AE%E3%82%89%E3%81%B9%E3%82%8B%E3%81%BE%E3%81%A0%E3%81%AA%E3%81%8C%E3%81%8F%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%9F%E3%82%8A%E3%81%AA%E3%81%84.w3.mag.keio.ac.jp/'", +"fail-if": "invalid-attribute-value"}, + +{"description": "base href contains valid URI 'http://xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/'", +"input": "<base href='http://xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.xn--n8jaaaaai5bhf7as8fsfk3jnknefdde3fg11amb5gzdb4wi9bya3kc6lra.w3.mag.keio.ac.jp/'", +"fail-if": "invalid-attribute-value"} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/base-target-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/base-target-attribute.test new file mode 100755 index 000000000..6d4db20b2 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/base-target-attribute.test @@ -0,0 +1,35 @@ +{"tests": [ + +{"description": "valid base target attribute '_self'", +"input": "<base target=_self>", +"fail-if": "invalid-browsing-context"}, + +{"description": "valid base target attribute '_parent'", +"input": "<base target=_parent>", +"fail-if": "invalid-browsing-context"}, + +{"description": "valid base target attribute '_top'", +"input": "<base target=_top>", +"fail-if": "invalid-browsing-context"}, + +{"description": "valid base target attribute '_blank'", +"input": "<base target=_blank>", +"fail-if": "invalid-browsing-context"}, + +{"description": "valid base target attribute 'foo'", +"input": "<base target=foo>", +"fail-if": "invalid-browsing-context"}, + +{"description": "base target attribute may be blank", +"input": "<base target>", +"fail-if": "invalid-browsing-context"}, + +{"description": "invalid base target attribute '_'", +"input": "<base target=_>", +"fail-unless": "invalid-browsing-context"}, + +{"description": "invalid base target attribute '_foo'", +"input": "<base target=_foo>", +"fail-unless": "invalid-browsing-context"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/blockquote-cite-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/blockquote-cite-attribute.test new file mode 100755 index 000000000..153c6e6af --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/blockquote-cite-attribute.test @@ -0,0 +1,7 @@ +{"tests": [ + +{"description": "blockquote cite contains invalid URI due to space in domain", +"input": "<blockquote cite='http://www.example. com/'", +"fail-unless": "invalid-uri-char"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/classattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/classattribute.test new file mode 100755 index 000000000..0fe703fcd --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/classattribute.test @@ -0,0 +1,152 @@ +{"tests": [ + +{"description": "valid single class attribute value", +"input": "<span class=a>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading space", +"input": "<span class=' a'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with trailing space", +"input": "<span class='a '>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading and trailing space", +"input": "<span class=' a '>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading tab", +"input": "<span class='\ta'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with trailing tab", +"input": "<span class='a\t'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading and trailing tab", +"input": "<span class='\ta\t'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading LF", +"input": "<span class='\na'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with trailing LF", +"input": "<span class='a\n'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading and trailing LF", +"input": "<span class='\na\n'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading LT", +"input": "<span class='\u000Ba'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with trailing LT", +"input": "<span class='a\u000B'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading and trailing LT", +"input": "<span class='\u000Ba\u000B'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading FF", +"input": "<span class='\u000Ca'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with trailing FF", +"input": "<span class='a\u000C'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading and trailing FF", +"input": "<span class='\u000Ca\u000C'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading CR", +"input": "<span class='\ra'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with trailing CR", +"input": "<span class='a\r'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid single class attribute value with leading and trailing CR", +"input": "<span class='\ra\r'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid double class attribute value separated by space", +"input": "<span class='a b'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid double class attribute value separated by tab", +"input": "<span class='a\tb'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid double class attribute value separated by LF", +"input": "<span class='a\nb'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid double class attribute value separated by LT", +"input": "<span class='a\u000Bb'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid double class attribute value separated by FF", +"input": "<span class='a\u000Cb'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid double class attribute value separated by CR", +"input": "<span class='a\rb'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "invalid duplicated class attribute value separated by space", +"input": "<span class='a a'>", +"fail-unless": "invalid-attribute-value"}, + +{"description": "invalid duplicated class attribute value separated by tab", +"input": "<span class='a\ta'>", +"fail-unless": "invalid-attribute-value"}, + +{"description": "invalid duplicated class attribute value separated by LF", +"input": "<span class='a\na'>", +"fail-unless": "invalid-attribute-value"}, + +{"description": "invalid duplicated class attribute value separated by LT", +"input": "<span class='a\u000Ba'>", +"fail-unless": "invalid-attribute-value"}, + +{"description": "invalid duplicated class attribute value separated by FF", +"input": "<span class='a\u000Ca'>", +"fail-unless": "invalid-attribute-value"}, + +{"description": "invalid duplicated class attribute value separated by CR", +"input": "<span class='a\ra'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated class attribute value separated by space", +"input": "<span class='a a'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated class attribute value separated by tab", +"input": "<span class='a\ta'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated class attribute value separated by LF", +"input": "<span class='a\na'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated class attribute value separated by LT", +"input": "<span class='a\u000Ba'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated class attribute value separated by FF", +"input": "<span class='a\u000Ca'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated class attribute value separated by CR", +"input": "<span class='a\ra'>", +"fail-unless": "duplicate-value-in-token-list"} + +]} + diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/contenteditableattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/contenteditableattribute.test new file mode 100755 index 000000000..b6ae1d27e --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/contenteditableattribute.test @@ -0,0 +1,59 @@ +{"tests": [ + +{"description": "valid contenteditable attribute value 'true'", +"input": "<span contenteditable=true>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid contenteditable attribute value 'TRUE'", +"input": "<span contenteditable=TRUE>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid contenteditable attribute value 'TrUe'", +"input": "<span contenteditable=TrUe>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid contenteditable attribute value 'false'", +"input": "<span contenteditable=false>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid contenteditable attribute value 'FALSE'", +"input": "<span contenteditable=FALSE>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid contenteditable attribute value 'FalSe'", +"input": "<span contenteditable=FalSe>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid contenteditable attribute value ''", +"input": "<span contenteditable=''>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid contenteditable attribute value (not specified)", +"input": "<span contenteditable>", +"fail-if": "invalid-attribute-value"}, + +{"description": "invalid contenteditable attribute value 'foo'", +"input": "<span contenteditable=foo>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid contenteditable attribute value '0'", +"input": "<span contenteditable=0>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid contenteditable attribute value '1'", +"input": "<span contenteditable=1>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid contenteditable attribute value 'yes'", +"input": "<span contenteditable=yes>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid contenteditable attribute value 'no'", +"input": "<span contenteditable=no>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid contenteditable attribute value 'inherit'", +"input": "<span contenteditable=inherit>", +"fail-unless": "invalid-enumerated-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/contextmenuattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/contextmenuattribute.test new file mode 100755 index 000000000..59e4397c9 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/contextmenuattribute.test @@ -0,0 +1,115 @@ +{"tests": [ + +{"description": "contextmenu points to valid ID earlier", +"input": "<menu id=a><span contextmenu=a>", +"fail-if": "id-does-not-exist"}, + +{"description": "contextmenu points to valid ID later", +"input": "<span contextmenu=a><menu id=a>", +"fail-if": "id-does-not-exist"}, + +{"description": "contextmenu points to non-existent ID", +"input": "<span contextmenu=a>", +"fail-unless": "id-does-not-exist"}, + +{"description": "contextmenu points to ID on non-menu element", +"input": "<span id=a><span contextmenu=a>", +"fail-unless": "contextmenu-must-point-to-menu"}, + +{"description": "uppercase contextmenu points to ID on non-menu element", +"input": "<span id=a><span CONTEXTMENU=a>", +"fail-unless": "contextmenu-must-point-to-menu"}, + +{"description": "valid ID 'a'", +"input": "<span contextmenu=a>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid ID '1'", +"input": "<span contextmenu=1>", +"fail-if": "invalid-attribute-value"}, + +{"description": "wacky but valid ID", +"input": "<span contextmenu='<html><head><title>a</title></head><body><p>b</p></body></html>'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "invalid blank ID", +"input": "<span id>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "invalid blank ID with quotes", +"input": "<span contextmenu=''>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "invalid ID because of leading space", +"input": "<span contextmenu=' a'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing space", +"input": "<span contextmenu='a '>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of space in value", +"input": "<span contextmenu='a b'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading tab", +"input": "<span contextmenu='\ta'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing tab", +"input": "<span contextmenu='a\t'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of tab in value", +"input": "<span contextmenu='a\tb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading LF", +"input": "<span contextmenu='\na'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing LF", +"input": "<span contextmenu='a\n'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of LF in value", +"input": "<span contextmenu='a\nb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading LT", +"input": "<span contextmenu='\u000Ba'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing LT", +"input": "<span contextmenu='a\u000B'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of LT in value", +"input": "<span contextmenu='a\u000Bb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading FF", +"input": "<span contextmenu='\u000Ca'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing FF", +"input": "<span contextmenu='a\u000C'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of FF in value", +"input": "<span contextmenu='a\u000Cb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading CR", +"input": "<span contextmenu='\ra'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing CR", +"input": "<span contextmenu='a\r'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of CR in value", +"input": "<span contextmenu='a\rb'>", +"fail-unless": "space-in-id"} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/dirattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/dirattribute.test new file mode 100755 index 000000000..71883dc1c --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/dirattribute.test @@ -0,0 +1,59 @@ +{"tests": [ + +{"description": "valid dir attribute value 'ltr'", +"input": "<span dir=ltr>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid dir attribute value 'LTR'", +"input": "<span dir=LTR>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid dir attribute value 'LtR'", +"input": "<span dir=LtR>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid dir attribute value 'rtl'", +"input": "<span dir=rtl>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid dir attribute value 'RTL'", +"input": "<span dir=RTL>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid dir attribute value 'RtL'", +"input": "<span dir=RtL>", +"fail-if": "invalid-attribute-value"}, + +{"description": "invalid dir attribute value due to leading space", +"input": "<span dir=' ltr'>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "dir attribute value can not be blank", +"input": "<span dir>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "dir attribute value can not be blank (with quotes)", +"input": "<span dir=''>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "invalid dir attribute value 'left'", +"input": "<span dir=left>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid dir attribute value 'right'", +"input": "<span dir=right>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid dir attribute value 'lefttoright'", +"input": "<span dir=lefttoright>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid dir attribute value 'righttoleft'", +"input": "<span dir=righttoleft>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid dir attribute value 'inherit'", +"input": "<span dir=inherit>", +"fail-unless": "invalid-enumerated-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/draggableattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/draggableattribute.test new file mode 100755 index 000000000..49e692d98 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/draggableattribute.test @@ -0,0 +1,63 @@ +{"tests": [ + +{"description": "valid draggable attribute value 'true'", +"input": "<span draggable=true>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid draggable attribute value 'TRUE'", +"input": "<span draggable=TRUE>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid draggable attribute value 'TrUe'", +"input": "<span draggable=TrUe>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid draggable attribute value 'false'", +"input": "<span draggable=false>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid draggable attribute value 'FALSE'", +"input": "<span draggable=FALSE>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid draggable attribute value 'FalSe'", +"input": "<span draggable=FalSe>", +"fail-if": "invalid-attribute-value"}, + +{"description": "invalid draggable attribute value ''", +"input": "<span draggable=''>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "valid draggable attribute value (not specified)", +"input": "<span draggable>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "invalid draggable attribute value 'foo'", +"input": "<span draggable=foo>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid draggable attribute value '0'", +"input": "<span draggable=0>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid draggable attribute value '1'", +"input": "<span draggable=1>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid draggable attribute value 'yes'", +"input": "<span draggable=yes>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid draggable attribute value 'no'", +"input": "<span draggable=no>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid draggable attribute value 'auto'", +"input": "<span draggable=auto>", +"fail-unless": "invalid-enumerated-value"}, + +{"description": "invalid draggable attribute value 'inherit'", +"input": "<span draggable=inherit>", +"fail-unless": "invalid-enumerated-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/html-xmlns-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/html-xmlns-attribute.test new file mode 100755 index 000000000..2ebd19eba --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/html-xmlns-attribute.test @@ -0,0 +1,23 @@ +{"tests": [ + +{"description": "valid html xmlns attribute", +"input": "<html xmlns=http://www.w3.org/1999/xhtml>", +"fail-if": "invalid-root-namespace"}, + +{"description": "invalid html xmlns attribute due to leading space", +"input": "<html xmlns=' http://www.w3.org/1999/xhtml'>", +"fail-unless": "invalid-root-namespace"}, + +{"description": "invalid html xmlns attribute due to trailing space", +"input": "<html xmlns='http://www.w3.org/1999/xhtml '>", +"fail-unless": "invalid-root-namespace"}, + +{"description": "invalid html xmlns attribute due to uppercase", +"input": "<html xmlns=HTTP://WWW.W3.ORG/1999/XHTML>", +"fail-unless": "invalid-root-namespace"}, + +{"description": "invalid xmlns attribute on non-html element", +"input": "<body xmlns=http://www.w3.org/1999/xhtml>", +"fail-unless": "unknown-attribute"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/idattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/idattribute.test new file mode 100755 index 000000000..4058d5219 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/idattribute.test @@ -0,0 +1,115 @@ +{"tests": [ + +{"description": "valid ID 'a'", +"input": "<span id=a>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid ID '1'", +"input": "<span id=1>", +"fail-if": "invalid-attribute-value"}, + +{"description": "wacky but valid ID", +"input": "<span id='<html><head><title>a</title></head><body><p>b</p></body></html>'>", +"fail-if": "invalid-attribute-value"}, + +{"description": "invalid blank ID", +"input": "<span id>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "invalid blank ID with quotes", +"input": "<span id=''>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "invalid ID because of leading space", +"input": "<span id=' a'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing space", +"input": "<span id='a '>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of space in value", +"input": "<span id='a b'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading tab", +"input": "<span id='\ta'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing tab", +"input": "<span id='a\t'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of tab in value", +"input": "<span id='a\tb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading LF", +"input": "<span id='\na'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing LF", +"input": "<span id='a\n'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of LF in value", +"input": "<span id='a\nb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading LT", +"input": "<span id='\u000Ba'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing LT", +"input": "<span id='a\u000B'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of LT in value", +"input": "<span id='a\u000Bb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading FF", +"input": "<span id='\u000Ca'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing FF", +"input": "<span id='a\u000C'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of FF in value", +"input": "<span id='a\u000Cb'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of leading CR", +"input": "<span id='\ra'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of trailing CR", +"input": "<span id='a\r'>", +"fail-unless": "space-in-id"}, + +{"description": "invalid ID because of CR in value", +"input": "<span id='a\rb'>", +"fail-unless": "space-in-id"}, + +{"description": "duplicate ID values", +"input": "<span id=a><span id=a>", +"fail-unless": "duplicate-id"}, + +{"description": "duplicate ID values with spaces (weird but true)", +"input": "<span id='a '><span id='a '>", +"fail-unless": "duplicate-id"}, + +{"description": "not duplicate ID values because spaces don't match", +"input": "<span id=a><span id='a '>", +"fail-if": "duplicate-id"}, + +{"description": "not duplicate ID values because spaces don't match", +"input": "<span id=' a'><span id='a '>", +"fail-if": "duplicate-id"}, + +{"description": "not duplicate ID values because case doesn't match", +"input": "<span id=a><span id=A>", +"fail-if": "duplicate-id"} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/inputattributes.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/inputattributes.test new file mode 100755 index 000000000..acdc50e7b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/inputattributes.test @@ -0,0 +1,2795 @@ +{"tests": [ + +{"description": "'size' attribute deprecated on <input type='text'>", +"input": "<input type=text size>", +"fail-unless": "deprecated-attribute"}, + +{"description": "'size' attribute deprecated on <input type='password'>", +"input": "<input type=password size>", +"fail-unless": "deprecated-attribute"}, + +{"description": "allowed 'accesskey' attribute on <input type='checkbox'>", +"input": "<input type=checkbox accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='checkbox'>", +"input": "<input type=checkbox disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'checked' attribute on <input type='checkbox'>", +"input": "<input type=checkbox checked>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='checkbox'>", +"input": "<input type=checkbox autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='checkbox'>", +"input": "<input type=checkbox form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='checkbox'>", +"input": "<input type=checkbox name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='checkbox'>", +"input": "<input type=checkbox required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='checkbox'>", +"input": "<input type=checkbox value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='checkbox'>", +"input": "<input type=checkbox action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='checkbox'>", +"input": "<input type=checkbox tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='text'>", +"input": "<input type=text accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='text'>", +"input": "<input type=text accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='text'>", +"input": "<input type=text replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='text'>", +"input": "<input type=text disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='text'>", +"input": "<input type=text alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'size' attribute on <input type='text'>", +"input": "<input type=text size>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='text'>", +"input": "<input type=text checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='text'>", +"input": "<input type=text min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'pattern' attribute on <input type='text'>", +"input": "<input type=text pattern>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='text'>", +"input": "<input type=text readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='text'>", +"input": "<input type=text template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='text'>", +"input": "<input type=text autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='text'>", +"input": "<input type=text target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='text'>", +"input": "<input type=text method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='text'>", +"input": "<input type=text form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='text'>", +"input": "<input type=text max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='text'>", +"input": "<input type=text step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='text'>", +"input": "<input type=text enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='text'>", +"input": "<input type=text src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='text'>", +"input": "<input type=text name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='text'>", +"input": "<input type=text required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='text'>", +"input": "<input type=text list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='text'>", +"input": "<input type=text value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='text'>", +"input": "<input type=text autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'inputmode' attribute on <input type='text'>", +"input": "<input type=text inputmode>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'maxlength' attribute on <input type='text'>", +"input": "<input type=text maxlength>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='text'>", +"input": "<input type=text action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='text'>", +"input": "<input type=text tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='image'>", +"input": "<input type=image accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='image'>", +"input": "<input type=image accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'replace' attribute on <input type='image'>", +"input": "<input type=image replace>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='image'>", +"input": "<input type=image disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'alt' attribute on <input type='image'>", +"input": "<input type=image alt>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='image'>", +"input": "<input type=image size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='image'>", +"input": "<input type=image checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='image'>", +"input": "<input type=image min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='image'>", +"input": "<input type=image pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='image'>", +"input": "<input type=image readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='image'>", +"input": "<input type=image template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='image'>", +"input": "<input type=image autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'target' attribute on <input type='image'>", +"input": "<input type=image target>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'method' attribute on <input type='image'>", +"input": "<input type=image method>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='image'>", +"input": "<input type=image form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='image'>", +"input": "<input type=image max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='image'>", +"input": "<input type=image step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'enctype' attribute on <input type='image'>", +"input": "<input type=image enctype>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'src' attribute on <input type='image'>", +"input": "<input type=image src>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='image'>", +"input": "<input type=image name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='image'>", +"input": "<input type=image required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='image'>", +"input": "<input type=image list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'value' attribute not allowed on <input type='image'>", +"input": "<input type=image value>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='image'>", +"input": "<input type=image autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='image'>", +"input": "<input type=image inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='image'>", +"input": "<input type=image maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'action' attribute on <input type='image'>", +"input": "<input type=image action>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='image'>", +"input": "<input type=image tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='number'>", +"input": "<input type=number accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='number'>", +"input": "<input type=number accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='number'>", +"input": "<input type=number replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='number'>", +"input": "<input type=number disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='number'>", +"input": "<input type=number alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='number'>", +"input": "<input type=number size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='number'>", +"input": "<input type=number checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='number'>", +"input": "<input type=number min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='number'>", +"input": "<input type=number pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='number'>", +"input": "<input type=number readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='number'>", +"input": "<input type=number template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='number'>", +"input": "<input type=number autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='number'>", +"input": "<input type=number target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='number'>", +"input": "<input type=number method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='number'>", +"input": "<input type=number form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='number'>", +"input": "<input type=number max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='number'>", +"input": "<input type=number step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='number'>", +"input": "<input type=number enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='number'>", +"input": "<input type=number src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='number'>", +"input": "<input type=number name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='number'>", +"input": "<input type=number required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='number'>", +"input": "<input type=number list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='number'>", +"input": "<input type=number value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='number'>", +"input": "<input type=number autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='number'>", +"input": "<input type=number inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='number'>", +"input": "<input type=number maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='number'>", +"input": "<input type=number action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='number'>", +"input": "<input type=number tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='month'>", +"input": "<input type=month accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='month'>", +"input": "<input type=month accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='month'>", +"input": "<input type=month replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='month'>", +"input": "<input type=month disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='month'>", +"input": "<input type=month alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='month'>", +"input": "<input type=month size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='month'>", +"input": "<input type=month checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='month'>", +"input": "<input type=month min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='month'>", +"input": "<input type=month pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='month'>", +"input": "<input type=month readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='month'>", +"input": "<input type=month template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='month'>", +"input": "<input type=month autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='month'>", +"input": "<input type=month target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='month'>", +"input": "<input type=month method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='month'>", +"input": "<input type=month form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='month'>", +"input": "<input type=month max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='month'>", +"input": "<input type=month step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='month'>", +"input": "<input type=month enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='month'>", +"input": "<input type=month src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='month'>", +"input": "<input type=month name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='month'>", +"input": "<input type=month required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='month'>", +"input": "<input type=month list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='month'>", +"input": "<input type=month value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='month'>", +"input": "<input type=month autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='month'>", +"input": "<input type=month inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='month'>", +"input": "<input type=month maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='month'>", +"input": "<input type=month action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='month'>", +"input": "<input type=month tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='radio'>", +"input": "<input type=radio accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='radio'>", +"input": "<input type=radio accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='radio'>", +"input": "<input type=radio replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='radio'>", +"input": "<input type=radio disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='radio'>", +"input": "<input type=radio alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='radio'>", +"input": "<input type=radio size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'checked' attribute on <input type='radio'>", +"input": "<input type=radio checked>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='radio'>", +"input": "<input type=radio min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='radio'>", +"input": "<input type=radio pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='radio'>", +"input": "<input type=radio readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='radio'>", +"input": "<input type=radio template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='radio'>", +"input": "<input type=radio autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='radio'>", +"input": "<input type=radio target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='radio'>", +"input": "<input type=radio method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='radio'>", +"input": "<input type=radio form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='radio'>", +"input": "<input type=radio max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='radio'>", +"input": "<input type=radio step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='radio'>", +"input": "<input type=radio enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='radio'>", +"input": "<input type=radio src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='radio'>", +"input": "<input type=radio name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='radio'>", +"input": "<input type=radio required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='radio'>", +"input": "<input type=radio list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='radio'>", +"input": "<input type=radio value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='radio'>", +"input": "<input type=radio autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='radio'>", +"input": "<input type=radio inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='radio'>", +"input": "<input type=radio maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='radio'>", +"input": "<input type=radio action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='radio'>", +"input": "<input type=radio tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='file'>", +"input": "<input type=file accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accept' attribute on <input type='file'>", +"input": "<input type=file accept>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='file'>", +"input": "<input type=file replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='file'>", +"input": "<input type=file disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='file'>", +"input": "<input type=file alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='file'>", +"input": "<input type=file size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='file'>", +"input": "<input type=file checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='file'>", +"input": "<input type=file min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='file'>", +"input": "<input type=file pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='file'>", +"input": "<input type=file readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='file'>", +"input": "<input type=file template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='file'>", +"input": "<input type=file autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='file'>", +"input": "<input type=file target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='file'>", +"input": "<input type=file method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='file'>", +"input": "<input type=file form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='file'>", +"input": "<input type=file max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='file'>", +"input": "<input type=file step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='file'>", +"input": "<input type=file enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='file'>", +"input": "<input type=file src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='file'>", +"input": "<input type=file name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='file'>", +"input": "<input type=file required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='file'>", +"input": "<input type=file list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'value' attribute not allowed on <input type='file'>", +"input": "<input type=file value>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='file'>", +"input": "<input type=file autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='file'>", +"input": "<input type=file inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='file'>", +"input": "<input type=file maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='file'>", +"input": "<input type=file action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='file'>", +"input": "<input type=file tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='password'>", +"input": "<input type=password accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='password'>", +"input": "<input type=password accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='password'>", +"input": "<input type=password replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='password'>", +"input": "<input type=password disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='password'>", +"input": "<input type=password alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'size' attribute on <input type='password'>", +"input": "<input type=password size>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='password'>", +"input": "<input type=password checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='password'>", +"input": "<input type=password min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'pattern' attribute on <input type='password'>", +"input": "<input type=password pattern>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='password'>", +"input": "<input type=password readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='password'>", +"input": "<input type=password template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='password'>", +"input": "<input type=password autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='password'>", +"input": "<input type=password target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='password'>", +"input": "<input type=password method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='password'>", +"input": "<input type=password form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='password'>", +"input": "<input type=password max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='password'>", +"input": "<input type=password step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='password'>", +"input": "<input type=password enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='password'>", +"input": "<input type=password src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='password'>", +"input": "<input type=password name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='password'>", +"input": "<input type=password required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='password'>", +"input": "<input type=password list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='password'>", +"input": "<input type=password value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='password'>", +"input": "<input type=password autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'inputmode' attribute on <input type='password'>", +"input": "<input type=password inputmode>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'maxlength' attribute on <input type='password'>", +"input": "<input type=password maxlength>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='password'>", +"input": "<input type=password action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='password'>", +"input": "<input type=password tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='move-up'>", +"input": "<input type=move-up accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='move-up'>", +"input": "<input type=move-up disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='move-up'>", +"input": "<input type=move-up autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='move-up'>", +"input": "<input type=move-up form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='move-up'>", +"input": "<input type=move-up name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='move-up'>", +"input": "<input type=move-up value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='move-up'>", +"input": "<input type=move-up action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='move-up'>", +"input": "<input type=move-up tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='submit'>", +"input": "<input type=submit accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='submit'>", +"input": "<input type=submit accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'replace' attribute on <input type='submit'>", +"input": "<input type=submit replace>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='submit'>", +"input": "<input type=submit disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='submit'>", +"input": "<input type=submit alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='submit'>", +"input": "<input type=submit size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='submit'>", +"input": "<input type=submit checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='submit'>", +"input": "<input type=submit min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='submit'>", +"input": "<input type=submit pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='submit'>", +"input": "<input type=submit readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='submit'>", +"input": "<input type=submit template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='submit'>", +"input": "<input type=submit autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'target' attribute on <input type='submit'>", +"input": "<input type=submit target>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'method' attribute on <input type='submit'>", +"input": "<input type=submit method>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='submit'>", +"input": "<input type=submit form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='submit'>", +"input": "<input type=submit max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='submit'>", +"input": "<input type=submit step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'enctype' attribute on <input type='submit'>", +"input": "<input type=submit enctype>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='submit'>", +"input": "<input type=submit src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='submit'>", +"input": "<input type=submit name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='submit'>", +"input": "<input type=submit required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='submit'>", +"input": "<input type=submit list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='submit'>", +"input": "<input type=submit value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='submit'>", +"input": "<input type=submit autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='submit'>", +"input": "<input type=submit inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='submit'>", +"input": "<input type=submit maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'action' attribute on <input type='submit'>", +"input": "<input type=submit action>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='submit'>", +"input": "<input type=submit tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='add'>", +"input": "<input type=add accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='add'>", +"input": "<input type=add accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='add'>", +"input": "<input type=add replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='add'>", +"input": "<input type=add disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='add'>", +"input": "<input type=add alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='add'>", +"input": "<input type=add size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='add'>", +"input": "<input type=add checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='add'>", +"input": "<input type=add min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='add'>", +"input": "<input type=add pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='add'>", +"input": "<input type=add readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'template' attribute on <input type='add'>", +"input": "<input type=add template>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='add'>", +"input": "<input type=add autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='add'>", +"input": "<input type=add target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='add'>", +"input": "<input type=add method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='add'>", +"input": "<input type=add form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='add'>", +"input": "<input type=add max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='add'>", +"input": "<input type=add step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='add'>", +"input": "<input type=add enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='add'>", +"input": "<input type=add src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='add'>", +"input": "<input type=add name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='add'>", +"input": "<input type=add required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='add'>", +"input": "<input type=add list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='add'>", +"input": "<input type=add value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='add'>", +"input": "<input type=add autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='add'>", +"input": "<input type=add inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='add'>", +"input": "<input type=add maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='add'>", +"input": "<input type=add action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='add'>", +"input": "<input type=add tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accesskey' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden accesskey>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='hidden'>", +"input": "<input type=hidden disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autofocus' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden autofocus>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='hidden'>", +"input": "<input type=hidden form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='hidden'>", +"input": "<input type=hidden name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='hidden'>", +"input": "<input type=hidden value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'tabindex' attribute not allowed on <input type='hidden'>", +"input": "<input type=hidden tabindex>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='email'>", +"input": "<input type=email accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='email'>", +"input": "<input type=email accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='email'>", +"input": "<input type=email replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='email'>", +"input": "<input type=email disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='email'>", +"input": "<input type=email alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='email'>", +"input": "<input type=email size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='email'>", +"input": "<input type=email checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='email'>", +"input": "<input type=email min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'pattern' attribute on <input type='email'>", +"input": "<input type=email pattern>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='email'>", +"input": "<input type=email readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='email'>", +"input": "<input type=email template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='email'>", +"input": "<input type=email autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='email'>", +"input": "<input type=email target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='email'>", +"input": "<input type=email method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='email'>", +"input": "<input type=email form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='email'>", +"input": "<input type=email max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='email'>", +"input": "<input type=email step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='email'>", +"input": "<input type=email enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='email'>", +"input": "<input type=email src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='email'>", +"input": "<input type=email name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='email'>", +"input": "<input type=email required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='email'>", +"input": "<input type=email list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='email'>", +"input": "<input type=email value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='email'>", +"input": "<input type=email autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'inputmode' attribute on <input type='email'>", +"input": "<input type=email inputmode>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'maxlength' attribute on <input type='email'>", +"input": "<input type=email maxlength>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='email'>", +"input": "<input type=email action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='email'>", +"input": "<input type=email tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='week'>", +"input": "<input type=week accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='week'>", +"input": "<input type=week accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='week'>", +"input": "<input type=week replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='week'>", +"input": "<input type=week disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='week'>", +"input": "<input type=week alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='week'>", +"input": "<input type=week size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='week'>", +"input": "<input type=week checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='week'>", +"input": "<input type=week min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='week'>", +"input": "<input type=week pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='week'>", +"input": "<input type=week readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='week'>", +"input": "<input type=week template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='week'>", +"input": "<input type=week autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='week'>", +"input": "<input type=week target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='week'>", +"input": "<input type=week method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='week'>", +"input": "<input type=week form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='week'>", +"input": "<input type=week max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='week'>", +"input": "<input type=week step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='week'>", +"input": "<input type=week enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='week'>", +"input": "<input type=week src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='week'>", +"input": "<input type=week name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='week'>", +"input": "<input type=week required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='week'>", +"input": "<input type=week list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='week'>", +"input": "<input type=week value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='week'>", +"input": "<input type=week autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='week'>", +"input": "<input type=week inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='week'>", +"input": "<input type=week maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='week'>", +"input": "<input type=week action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='week'>", +"input": "<input type=week tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='date'>", +"input": "<input type=date accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='date'>", +"input": "<input type=date accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='date'>", +"input": "<input type=date replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='date'>", +"input": "<input type=date disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='date'>", +"input": "<input type=date alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='date'>", +"input": "<input type=date size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='date'>", +"input": "<input type=date checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='date'>", +"input": "<input type=date min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='date'>", +"input": "<input type=date pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='date'>", +"input": "<input type=date readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='date'>", +"input": "<input type=date template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='date'>", +"input": "<input type=date autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='date'>", +"input": "<input type=date target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='date'>", +"input": "<input type=date method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='date'>", +"input": "<input type=date form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='date'>", +"input": "<input type=date max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='date'>", +"input": "<input type=date step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='date'>", +"input": "<input type=date enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='date'>", +"input": "<input type=date src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='date'>", +"input": "<input type=date name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='date'>", +"input": "<input type=date required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='date'>", +"input": "<input type=date list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='date'>", +"input": "<input type=date value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='date'>", +"input": "<input type=date autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='date'>", +"input": "<input type=date inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='date'>", +"input": "<input type=date maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='date'>", +"input": "<input type=date action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='date'>", +"input": "<input type=date tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='datetime'>", +"input": "<input type=datetime accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='datetime'>", +"input": "<input type=datetime disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='datetime'>", +"input": "<input type=datetime min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='datetime'>", +"input": "<input type=datetime readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='datetime'>", +"input": "<input type=datetime autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='datetime'>", +"input": "<input type=datetime form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='datetime'>", +"input": "<input type=datetime max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='datetime'>", +"input": "<input type=datetime step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='datetime'>", +"input": "<input type=datetime name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='datetime'>", +"input": "<input type=datetime required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='datetime'>", +"input": "<input type=datetime list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='datetime'>", +"input": "<input type=datetime value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='datetime'>", +"input": "<input type=datetime autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='datetime'>", +"input": "<input type=datetime action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='datetime'>", +"input": "<input type=datetime tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='move-down'>", +"input": "<input type=move-down accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='move-down'>", +"input": "<input type=move-down disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='move-down'>", +"input": "<input type=move-down autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='move-down'>", +"input": "<input type=move-down form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='move-down'>", +"input": "<input type=move-down name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='move-down'>", +"input": "<input type=move-down value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='move-down'>", +"input": "<input type=move-down action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='move-down'>", +"input": "<input type=move-down tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='datetime-local'>", +"input": "<input type=datetime-local action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='reset'>", +"input": "<input type=reset accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='reset'>", +"input": "<input type=reset accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='reset'>", +"input": "<input type=reset replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='reset'>", +"input": "<input type=reset disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='reset'>", +"input": "<input type=reset alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='reset'>", +"input": "<input type=reset size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='reset'>", +"input": "<input type=reset checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='reset'>", +"input": "<input type=reset min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='reset'>", +"input": "<input type=reset pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='reset'>", +"input": "<input type=reset readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='reset'>", +"input": "<input type=reset template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='reset'>", +"input": "<input type=reset autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='reset'>", +"input": "<input type=reset target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='reset'>", +"input": "<input type=reset method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='reset'>", +"input": "<input type=reset form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='reset'>", +"input": "<input type=reset max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='reset'>", +"input": "<input type=reset step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='reset'>", +"input": "<input type=reset enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='reset'>", +"input": "<input type=reset src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='reset'>", +"input": "<input type=reset name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='reset'>", +"input": "<input type=reset required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='reset'>", +"input": "<input type=reset list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='reset'>", +"input": "<input type=reset value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='reset'>", +"input": "<input type=reset autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='reset'>", +"input": "<input type=reset inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='reset'>", +"input": "<input type=reset maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='reset'>", +"input": "<input type=reset action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='reset'>", +"input": "<input type=reset tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='url'>", +"input": "<input type=url accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='url'>", +"input": "<input type=url accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='url'>", +"input": "<input type=url replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='url'>", +"input": "<input type=url disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='url'>", +"input": "<input type=url alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='url'>", +"input": "<input type=url size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='url'>", +"input": "<input type=url checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='url'>", +"input": "<input type=url min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'pattern' attribute on <input type='url'>", +"input": "<input type=url pattern>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='url'>", +"input": "<input type=url readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='url'>", +"input": "<input type=url template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='url'>", +"input": "<input type=url autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='url'>", +"input": "<input type=url target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='url'>", +"input": "<input type=url method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='url'>", +"input": "<input type=url form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='url'>", +"input": "<input type=url max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='url'>", +"input": "<input type=url step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='url'>", +"input": "<input type=url enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='url'>", +"input": "<input type=url src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='url'>", +"input": "<input type=url name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='url'>", +"input": "<input type=url required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='url'>", +"input": "<input type=url list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='url'>", +"input": "<input type=url value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='url'>", +"input": "<input type=url autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'inputmode' attribute on <input type='url'>", +"input": "<input type=url inputmode>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'maxlength' attribute on <input type='url'>", +"input": "<input type=url maxlength>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='url'>", +"input": "<input type=url action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='url'>", +"input": "<input type=url tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='button'>", +"input": "<input type=button accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='button'>", +"input": "<input type=button accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='button'>", +"input": "<input type=button replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='button'>", +"input": "<input type=button disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='button'>", +"input": "<input type=button alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='button'>", +"input": "<input type=button size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='button'>", +"input": "<input type=button checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='button'>", +"input": "<input type=button min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='button'>", +"input": "<input type=button pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='button'>", +"input": "<input type=button readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='button'>", +"input": "<input type=button template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='button'>", +"input": "<input type=button autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='button'>", +"input": "<input type=button target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='button'>", +"input": "<input type=button method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='button'>", +"input": "<input type=button form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='button'>", +"input": "<input type=button max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='button'>", +"input": "<input type=button step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='button'>", +"input": "<input type=button enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='button'>", +"input": "<input type=button src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='button'>", +"input": "<input type=button name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='button'>", +"input": "<input type=button required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='button'>", +"input": "<input type=button list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='button'>", +"input": "<input type=button value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='button'>", +"input": "<input type=button autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='button'>", +"input": "<input type=button inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='button'>", +"input": "<input type=button maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='button'>", +"input": "<input type=button action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='button'>", +"input": "<input type=button tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='remove'>", +"input": "<input type=remove accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='remove'>", +"input": "<input type=remove accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='remove'>", +"input": "<input type=remove replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='remove'>", +"input": "<input type=remove disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='remove'>", +"input": "<input type=remove alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='remove'>", +"input": "<input type=remove size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='remove'>", +"input": "<input type=remove checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'min' attribute not allowed on <input type='remove'>", +"input": "<input type=remove min>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='remove'>", +"input": "<input type=remove pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'readonly' attribute not allowed on <input type='remove'>", +"input": "<input type=remove readonly>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='remove'>", +"input": "<input type=remove template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='remove'>", +"input": "<input type=remove autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='remove'>", +"input": "<input type=remove target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='remove'>", +"input": "<input type=remove method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='remove'>", +"input": "<input type=remove form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'max' attribute not allowed on <input type='remove'>", +"input": "<input type=remove max>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'step' attribute not allowed on <input type='remove'>", +"input": "<input type=remove step>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='remove'>", +"input": "<input type=remove enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='remove'>", +"input": "<input type=remove src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='remove'>", +"input": "<input type=remove name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'required' attribute not allowed on <input type='remove'>", +"input": "<input type=remove required>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'list' attribute not allowed on <input type='remove'>", +"input": "<input type=remove list>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='remove'>", +"input": "<input type=remove value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'autocomplete' attribute not allowed on <input type='remove'>", +"input": "<input type=remove autocomplete>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='remove'>", +"input": "<input type=remove inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='remove'>", +"input": "<input type=remove maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='remove'>", +"input": "<input type=remove action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='remove'>", +"input": "<input type=remove tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='range'>", +"input": "<input type=range accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='range'>", +"input": "<input type=range accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='range'>", +"input": "<input type=range replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='range'>", +"input": "<input type=range disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='range'>", +"input": "<input type=range alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='range'>", +"input": "<input type=range size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='range'>", +"input": "<input type=range checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='range'>", +"input": "<input type=range min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='range'>", +"input": "<input type=range pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='range'>", +"input": "<input type=range readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='range'>", +"input": "<input type=range template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='range'>", +"input": "<input type=range autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='range'>", +"input": "<input type=range target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='range'>", +"input": "<input type=range method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='range'>", +"input": "<input type=range form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='range'>", +"input": "<input type=range max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='range'>", +"input": "<input type=range step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='range'>", +"input": "<input type=range enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='range'>", +"input": "<input type=range src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='range'>", +"input": "<input type=range name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='range'>", +"input": "<input type=range required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='range'>", +"input": "<input type=range list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='range'>", +"input": "<input type=range value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='range'>", +"input": "<input type=range autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='range'>", +"input": "<input type=range inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='range'>", +"input": "<input type=range maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='range'>", +"input": "<input type=range action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='range'>", +"input": "<input type=range tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'accesskey' attribute on <input type='time'>", +"input": "<input type=time accesskey>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'accept' attribute not allowed on <input type='time'>", +"input": "<input type=time accept>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'replace' attribute not allowed on <input type='time'>", +"input": "<input type=time replace>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'disabled' attribute on <input type='time'>", +"input": "<input type=time disabled>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'alt' attribute not allowed on <input type='time'>", +"input": "<input type=time alt>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'size' attribute not allowed on <input type='time'>", +"input": "<input type=time size>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'checked' attribute not allowed on <input type='time'>", +"input": "<input type=time checked>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'min' attribute on <input type='time'>", +"input": "<input type=time min>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'pattern' attribute not allowed on <input type='time'>", +"input": "<input type=time pattern>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'readonly' attribute on <input type='time'>", +"input": "<input type=time readonly>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'template' attribute not allowed on <input type='time'>", +"input": "<input type=time template>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autofocus' attribute on <input type='time'>", +"input": "<input type=time autofocus>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'target' attribute not allowed on <input type='time'>", +"input": "<input type=time target>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'method' attribute not allowed on <input type='time'>", +"input": "<input type=time method>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'form' attribute on <input type='time'>", +"input": "<input type=time form>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'max' attribute on <input type='time'>", +"input": "<input type=time max>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'step' attribute on <input type='time'>", +"input": "<input type=time step>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'enctype' attribute not allowed on <input type='time'>", +"input": "<input type=time enctype>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'src' attribute not allowed on <input type='time'>", +"input": "<input type=time src>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'name' attribute on <input type='time'>", +"input": "<input type=time name>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'required' attribute on <input type='time'>", +"input": "<input type=time required>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'list' attribute on <input type='time'>", +"input": "<input type=time list>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'value' attribute on <input type='time'>", +"input": "<input type=time value>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'autocomplete' attribute on <input type='time'>", +"input": "<input type=time autocomplete>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'inputmode' attribute not allowed on <input type='time'>", +"input": "<input type=time inputmode>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'maxlength' attribute not allowed on <input type='time'>", +"input": "<input type=time maxlength>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "'action' attribute not allowed on <input type='time'>", +"input": "<input type=time action>", +"fail-unless": "attribute-not-allowed-on-this-input-type"}, + +{"description": "allowed 'tabindex' attribute on <input type='time'>", +"input": "<input type=time tabindex>", +"fail-if": "attribute-not-allowed-on-this-input-type"}, + +{"description": "unknown 'foo' attribute on <input type='checkbox'>", +"input": "<input type=checkbox foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='text'>", +"input": "<input type=text foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='image'>", +"input": "<input type=image foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='number'>", +"input": "<input type=number foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='month'>", +"input": "<input type=month foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='radio'>", +"input": "<input type=radio foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='file'>", +"input": "<input type=file foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='password'>", +"input": "<input type=password foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='move-up'>", +"input": "<input type=move-up foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='submit'>", +"input": "<input type=submit foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='add'>", +"input": "<input type=add foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='hidden'>", +"input": "<input type=hidden foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='email'>", +"input": "<input type=email foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='week'>", +"input": "<input type=week foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='date'>", +"input": "<input type=date foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='datetime'>", +"input": "<input type=datetime foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='move-down'>", +"input": "<input type=move-down foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='datetime-local'>", +"input": "<input type=datetime-local foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='reset'>", +"input": "<input type=reset foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='url'>", +"input": "<input type=url foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='button'>", +"input": "<input type=button foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='remove'>", +"input": "<input type=remove foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='range'>", +"input": "<input type=range foo>", +"fail-unless": "unknown-attribute"}, + +{"description": "unknown 'foo' attribute on <input type='time'>", +"input": "<input type=time foo>", +"fail-unless": "unknown-attribute"} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/irrelevantattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/irrelevantattribute.test new file mode 100755 index 000000000..fa4061300 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/irrelevantattribute.test @@ -0,0 +1,63 @@ +{"tests": [ + +{"description": "valid irrelevant attribute value 'irrelevant'", +"input": "<span irrelevant=irrelevant>", +"fail-if": "invalid-attribute-value"}, + +{"description": "valid irrelevant attribute value ''", +"input": "<span irrelevant=''>", +"fail-if": "invalid-attribute-value"}, + +{"description": "invalid irrelevant attribute value due to uppercase", +"input": "<span irrelevant=IRRELEVANT>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value due to mixed case", +"input": "<span irrelevant=IrReLeVaNt>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value due to leading space", +"input": "<span irrelevant=' irrelevant'>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value due to trailing space", +"input": "<span irrelevant='irrelevant '>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value 'foo'", +"input": "<span irrelevant=foo>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value '0'", +"input": "<span irrelevant=0>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value '1'", +"input": "<span irrelevant=1>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value 'yes'", +"input": "<span irrelevant=yes>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value 'no'", +"input": "<span irrelevant=no>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value 'true'", +"input": "<span irrelevant=true>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value 'false'", +"input": "<span irrelevant=false>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value 'auto'", +"input": "<span irrelevant=auto>", +"fail-unless": "invalid-boolean-value"}, + +{"description": "invalid irrelevant attribute value 'inherit'", +"input": "<span irrelevant=inherit>", +"fail-unless": "invalid-boolean-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/langattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/langattribute.test new file mode 100755 index 000000000..6c831a179 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/langattribute.test @@ -0,0 +1,5579 @@ +{"tests": [ + +{"description": "valid lang attribute 'roh'", +"input": "<span lang=roh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gv'", +"input": "<span lang=gv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gu'", +"input": "<span lang=gu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'scn'", +"input": "<span lang=scn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rom'", +"input": "<span lang=rom>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ron'", +"input": "<span lang=ron>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'alg'", +"input": "<span lang=alg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oss'", +"input": "<span lang=oss>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ale'", +"input": "<span lang=ale>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'alb'", +"input": "<span lang=alb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sco'", +"input": "<span lang=sco>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'scc'", +"input": "<span lang=scc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mni'", +"input": "<span lang=mni>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gd'", +"input": "<span lang=gd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'per'", +"input": "<span lang=per>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ga'", +"input": "<span lang=ga>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nwc'", +"input": "<span lang=nwc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'osa'", +"input": "<span lang=osa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gn'", +"input": "<span lang=gn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'alt'", +"input": "<span lang=alt>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gl'", +"input": "<span lang=gl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'scr'", +"input": "<span lang=scr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mwr'", +"input": "<span lang=mwr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ty'", +"input": "<span lang=ty>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tw'", +"input": "<span lang=tw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tt'", +"input": "<span lang=tt>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tr'", +"input": "<span lang=tr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ts'", +"input": "<span lang=ts>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tn'", +"input": "<span lang=tn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'to'", +"input": "<span lang=to>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tl'", +"input": "<span lang=tl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tk'", +"input": "<span lang=tk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'th'", +"input": "<span lang=th>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ti'", +"input": "<span lang=ti>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ven'", +"input": "<span lang=ven>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tg'", +"input": "<span lang=tg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'te'", +"input": "<span lang=te>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uga'", +"input": "<span lang=uga>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ta'", +"input": "<span lang=ta>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fas'", +"input": "<span lang=fas>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fat'", +"input": "<span lang=fat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fan'", +"input": "<span lang=fan>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fao'", +"input": "<span lang=fao>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'got'", +"input": "<span lang=got>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sme'", +"input": "<span lang=sme>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'din'", +"input": "<span lang=din>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hye'", +"input": "<span lang=hye>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'guj'", +"input": "<span lang=guj>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cmc'", +"input": "<span lang=cmc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srd'", +"input": "<span lang=srd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mdr'", +"input": "<span lang=mdr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ml'", +"input": "<span lang=ml>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'div'", +"input": "<span lang=div>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zh'", +"input": "<span lang=zh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tem'", +"input": "<span lang=tem>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xho'", +"input": "<span lang=xho>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mno'", +"input": "<span lang=mno>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'roa'", +"input": "<span lang=roa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'za'", +"input": "<span lang=za>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'deu'", +"input": "<span lang=deu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mk'", +"input": "<span lang=mk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nbl'", +"input": "<span lang=nbl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zu'", +"input": "<span lang=zu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ter'", +"input": "<span lang=ter>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tet'", +"input": "<span lang=tet>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mnc'", +"input": "<span lang=mnc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sun'", +"input": "<span lang=sun>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'abk'", +"input": "<span lang=abk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'suk'", +"input": "<span lang=suk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kur'", +"input": "<span lang=kur>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kum'", +"input": "<span lang=kum>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'slo'", +"input": "<span lang=slo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sus'", +"input": "<span lang=sus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'new'", +"input": "<span lang=new>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kua'", +"input": "<span lang=kua>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sux'", +"input": "<span lang=sux>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'den'", +"input": "<span lang=den>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mr'", +"input": "<span lang=mr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mul'", +"input": "<span lang=mul>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lez'", +"input": "<span lang=lez>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gla'", +"input": "<span lang=gla>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bos'", +"input": "<span lang=bos>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gle'", +"input": "<span lang=gle>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eka'", +"input": "<span lang=eka>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'glg'", +"input": "<span lang=glg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'akk'", +"input": "<span lang=akk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dra'", +"input": "<span lang=dra>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aka'", +"input": "<span lang=aka>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bod'", +"input": "<span lang=bod>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'glv'", +"input": "<span lang=glv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jrb'", +"input": "<span lang=jrb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vie'", +"input": "<span lang=vie>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ipk'", +"input": "<span lang=ipk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uzb'", +"input": "<span lang=uzb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sgn'", +"input": "<span lang=sgn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sga'", +"input": "<span lang=sga>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bre'", +"input": "<span lang=bre>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'apa'", +"input": "<span lang=apa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bra'", +"input": "<span lang=bra>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aym'", +"input": "<span lang=aym>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cha'", +"input": "<span lang=cha>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chb'", +"input": "<span lang=chb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'che'", +"input": "<span lang=che>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chg'", +"input": "<span lang=chg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chi'", +"input": "<span lang=chi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chk'", +"input": "<span lang=chk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aus'", +"input": "<span lang=aus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chn'", +"input": "<span lang=chn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cho'", +"input": "<span lang=cho>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chp'", +"input": "<span lang=chp>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chr'", +"input": "<span lang=chr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chu'", +"input": "<span lang=chu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chv'", +"input": "<span lang=chv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chy'", +"input": "<span lang=chy>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'msa'", +"input": "<span lang=msa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iii'", +"input": "<span lang=iii>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vot'", +"input": "<span lang=vot>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mg'", +"input": "<span lang=mg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ndo'", +"input": "<span lang=ndo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ibo'", +"input": "<span lang=ibo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'car'", +"input": "<span lang=car>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mo'", +"input": "<span lang=mo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mn'", +"input": "<span lang=mn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mi'", +"input": "<span lang=mi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mh'", +"input": "<span lang=mh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cau'", +"input": "<span lang=cau>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cat'", +"input": "<span lang=cat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bur'", +"input": "<span lang=bur>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mt'", +"input": "<span lang=mt>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cai'", +"input": "<span lang=cai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'del'", +"input": "<span lang=del>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ms'", +"input": "<span lang=ms>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'byn'", +"input": "<span lang=byn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mwl'", +"input": "<span lang=mwl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'my'", +"input": "<span lang=my>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cad'", +"input": "<span lang=cad>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tat'", +"input": "<span lang=tat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nde'", +"input": "<span lang=nde>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tam'", +"input": "<span lang=tam>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'spa'", +"input": "<span lang=spa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tah'", +"input": "<span lang=tah>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tai'", +"input": "<span lang=tai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cze'", +"input": "<span lang=cze>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'afh'", +"input": "<span lang=afh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eng'", +"input": "<span lang=eng>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'afa'", +"input": "<span lang=afa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'id'", +"input": "<span lang=id>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nyn'", +"input": "<span lang=nyn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nyo'", +"input": "<span lang=nyo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gez'", +"input": "<span lang=gez>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nya'", +"input": "<span lang=nya>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sio'", +"input": "<span lang=sio>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sin'", +"input": "<span lang=sin>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'afr'", +"input": "<span lang=afr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'map'", +"input": "<span lang=map>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fr'", +"input": "<span lang=fr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lao'", +"input": "<span lang=lao>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lah'", +"input": "<span lang=lah>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nym'", +"input": "<span lang=nym>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sna'", +"input": "<span lang=sna>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lad'", +"input": "<span lang=lad>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fy'", +"input": "<span lang=fy>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'snk'", +"input": "<span lang=snk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fa'", +"input": "<span lang=fa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mac'", +"input": "<span lang=mac>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mad'", +"input": "<span lang=mad>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ff'", +"input": "<span lang=ff>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lat'", +"input": "<span lang=lat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fi'", +"input": "<span lang=fi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fj'", +"input": "<span lang=fj>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mal'", +"input": "<span lang=mal>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mao'", +"input": "<span lang=mao>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fo'", +"input": "<span lang=fo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mak'", +"input": "<span lang=mak>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'egy'", +"input": "<span lang=egy>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'znd'", +"input": "<span lang=znd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ss'", +"input": "<span lang=ss>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sr'", +"input": "<span lang=sr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sq'", +"input": "<span lang=sq>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sit'", +"input": "<span lang=sit>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sw'", +"input": "<span lang=sw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sv'", +"input": "<span lang=sv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'su'", +"input": "<span lang=su>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'st'", +"input": "<span lang=st>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sk'", +"input": "<span lang=sk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'si'", +"input": "<span lang=si>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sh'", +"input": "<span lang=sh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'so'", +"input": "<span lang=so>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sn'", +"input": "<span lang=sn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sm'", +"input": "<span lang=sm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sl'", +"input": "<span lang=sl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sc'", +"input": "<span lang=sc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sa'", +"input": "<span lang=sa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sg'", +"input": "<span lang=sg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'se'", +"input": "<span lang=se>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sd'", +"input": "<span lang=sd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zen'", +"input": "<span lang=zen>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kbd'", +"input": "<span lang=kbd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'enm'", +"input": "<span lang=enm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iro'", +"input": "<span lang=iro>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vai'", +"input": "<span lang=vai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'csb'", +"input": "<span lang=csb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tsn'", +"input": "<span lang=tsn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lg'", +"input": "<span lang=lg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lb'", +"input": "<span lang=lb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'la'", +"input": "<span lang=la>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ln'", +"input": "<span lang=ln>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lo'", +"input": "<span lang=lo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'li'", +"input": "<span lang=li>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lv'", +"input": "<span lang=lv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lt'", +"input": "<span lang=lt>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lu'", +"input": "<span lang=lu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hin'", +"input": "<span lang=hin>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fij'", +"input": "<span lang=fij>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fin'", +"input": "<span lang=fin>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eus'", +"input": "<span lang=eus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yi'", +"input": "<span lang=yi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'non'", +"input": "<span lang=non>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ceb'", +"input": "<span lang=ceb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yo'", +"input": "<span lang=yo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dan'", +"input": "<span lang=dan>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cel'", +"input": "<span lang=cel>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bat'", +"input": "<span lang=bat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nob'", +"input": "<span lang=nob>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dak'", +"input": "<span lang=dak>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ces'", +"input": "<span lang=ces>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dar'", +"input": "<span lang=dar>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'son'", +"input": "<span lang=son>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'day'", +"input": "<span lang=day>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nor'", +"input": "<span lang=nor>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gba'", +"input": "<span lang=gba>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ssa'", +"input": "<span lang=ssa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hil'", +"input": "<span lang=hil>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kpe'", +"input": "<span lang=kpe>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'man'", +"input": "<span lang=man>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wel'", +"input": "<span lang=wel>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'el'", +"input": "<span lang=el>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eo'", +"input": "<span lang=eo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'en'", +"input": "<span lang=en>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lam'", +"input": "<span lang=lam>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ee'", +"input": "<span lang=ee>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tpi'", +"input": "<span lang=tpi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mdf'", +"input": "<span lang=mdf>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mas'", +"input": "<span lang=mas>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mar'", +"input": "<span lang=mar>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eu'", +"input": "<span lang=eu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'et'", +"input": "<span lang=et>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'es'", +"input": "<span lang=es>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ru'", +"input": "<span lang=ru>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rw'", +"input": "<span lang=rw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'goh'", +"input": "<span lang=goh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sms'", +"input": "<span lang=sms>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smo'", +"input": "<span lang=smo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smn'", +"input": "<span lang=smn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smj'", +"input": "<span lang=smj>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smi'", +"input": "<span lang=smi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nic'", +"input": "<span lang=nic>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rm'", +"input": "<span lang=rm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rn'", +"input": "<span lang=rn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ro'", +"input": "<span lang=ro>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dsb'", +"input": "<span lang=dsb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sma'", +"input": "<span lang=sma>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gor'", +"input": "<span lang=gor>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ast'", +"input": "<span lang=ast>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'orm'", +"input": "<span lang=orm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'que'", +"input": "<span lang=que>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ori'", +"input": "<span lang=ori>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'crh'", +"input": "<span lang=crh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'asm'", +"input": "<span lang=asm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pus'", +"input": "<span lang=pus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kik'", +"input": "<span lang=kik>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ltz'", +"input": "<span lang=ltz>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ath'", +"input": "<span lang=ath>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wln'", +"input": "<span lang=wln>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'isl'", +"input": "<span lang=isl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xh'", +"input": "<span lang=xh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mag'", +"input": "<span lang=mag>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mai'", +"input": "<span lang=mai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xx'", +"input": "<span lang=xx>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mah'", +"input": "<span lang=mah>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tel'", +"input": "<span lang=tel>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lav'", +"input": "<span lang=lav>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zap'", +"input": "<span lang=zap>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yid'", +"input": "<span lang=yid>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kok'", +"input": "<span lang=kok>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kom'", +"input": "<span lang=kom>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kon'", +"input": "<span lang=kon>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ukr'", +"input": "<span lang=ukr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ton'", +"input": "<span lang=ton>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kos'", +"input": "<span lang=kos>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kor'", +"input": "<span lang=kor>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tog'", +"input": "<span lang=tog>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hun'", +"input": "<span lang=hun>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hup'", +"input": "<span lang=hup>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cym'", +"input": "<span lang=cym>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'udm'", +"input": "<span lang=udm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bej'", +"input": "<span lang=bej>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ben'", +"input": "<span lang=ben>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bel'", +"input": "<span lang=bel>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bem'", +"input": "<span lang=bem>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tsi'", +"input": "<span lang=tsi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aar'", +"input": "<span lang=aar>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ber'", +"input": "<span lang=ber>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nzi'", +"input": "<span lang=nzi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sai'", +"input": "<span lang=sai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ang'", +"input": "<span lang=ang>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pra'", +"input": "<span lang=pra>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'san'", +"input": "<span lang=san>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bho'", +"input": "<span lang=bho>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sal'", +"input": "<span lang=sal>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pro'", +"input": "<span lang=pro>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'raj'", +"input": "<span lang=raj>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sad'", +"input": "<span lang=sad>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'anp'", +"input": "<span lang=anp>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rap'", +"input": "<span lang=rap>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sas'", +"input": "<span lang=sas>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iba'", +"input": "<span lang=iba>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'myn'", +"input": "<span lang=myn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'min'", +"input": "<span lang=min>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lim'", +"input": "<span lang=lim>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lin'", +"input": "<span lang=lin>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nah'", +"input": "<span lang=nah>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lit'", +"input": "<span lang=lit>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'efi'", +"input": "<span lang=efi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srn'", +"input": "<span lang=srn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arn'", +"input": "<span lang=arn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ypk'", +"input": "<span lang=ypk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mis'", +"input": "<span lang=mis>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kac'", +"input": "<span lang=kac>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kab'", +"input": "<span lang=kab>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kaa'", +"input": "<span lang=kaa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kan'", +"input": "<span lang=kan>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kam'", +"input": "<span lang=kam>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kal'", +"input": "<span lang=kal>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kas'", +"input": "<span lang=kas>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kar'", +"input": "<span lang=kar>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kaw'", +"input": "<span lang=kaw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kau'", +"input": "<span lang=kau>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kat'", +"input": "<span lang=kat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kaz'", +"input": "<span lang=kaz>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tyv'", +"input": "<span lang=tyv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'awa'", +"input": "<span lang=awa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'urd'", +"input": "<span lang=urd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ka'", +"input": "<span lang=ka>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'doi'", +"input": "<span lang=doi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kg'", +"input": "<span lang=kg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kk'", +"input": "<span lang=kk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kj'", +"input": "<span lang=kj>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ki'", +"input": "<span lang=ki>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ko'", +"input": "<span lang=ko>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kn'", +"input": "<span lang=kn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'km'", +"input": "<span lang=km>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kl'", +"input": "<span lang=kl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ks'", +"input": "<span lang=ks>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kr'", +"input": "<span lang=kr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kw'", +"input": "<span lang=kw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kv'", +"input": "<span lang=kv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ku'", +"input": "<span lang=ku>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ky'", +"input": "<span lang=ky>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ota'", +"input": "<span lang=ota>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kut'", +"input": "<span lang=kut>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tkl'", +"input": "<span lang=tkl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nld'", +"input": "<span lang=nld>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oji'", +"input": "<span lang=oji>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oci'", +"input": "<span lang=oci>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ha'", +"input": "<span lang=ha>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wol'", +"input": "<span lang=wol>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jav'", +"input": "<span lang=jav>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hrv'", +"input": "<span lang=hrv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ger'", +"input": "<span lang=ger>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mga'", +"input": "<span lang=mga>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hit'", +"input": "<span lang=hit>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dyu'", +"input": "<span lang=dyu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ssw'", +"input": "<span lang=ssw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'de'", +"input": "<span lang=de>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'da'", +"input": "<span lang=da>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dz'", +"input": "<span lang=dz>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lui'", +"input": "<span lang=lui>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dv'", +"input": "<span lang=dv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ita'", +"input": "<span lang=ita>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'geo'", +"input": "<span lang=geo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'him'", +"input": "<span lang=him>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gem'", +"input": "<span lang=gem>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'crp'", +"input": "<span lang=crp>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'qu'", +"input": "<span lang=qu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bas'", +"input": "<span lang=bas>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'baq'", +"input": "<span lang=baq>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bad'", +"input": "<span lang=bad>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nep'", +"input": "<span lang=nep>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cre'", +"input": "<span lang=cre>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ban'", +"input": "<span lang=ban>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'x'", +"input": "<span lang=x>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bal'", +"input": "<span lang=bal>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bam'", +"input": "<span lang=bam>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bak'", +"input": "<span lang=bak>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'shn'", +"input": "<span lang=shn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bai'", +"input": "<span lang=bai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arp'", +"input": "<span lang=arp>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'art'", +"input": "<span lang=art>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arw'", +"input": "<span lang=arw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'qtz'", +"input": "<span lang=qtz>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ara'", +"input": "<span lang=ara>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arc'", +"input": "<span lang=arc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arg'", +"input": "<span lang=arg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sem'", +"input": "<span lang=sem>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sel'", +"input": "<span lang=sel>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nub'", +"input": "<span lang=nub>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arm'", +"input": "<span lang=arm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'btk'", +"input": "<span lang=btk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lus'", +"input": "<span lang=lus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iku'", +"input": "<span lang=iku>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mus'", +"input": "<span lang=mus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lua'", +"input": "<span lang=lua>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lub'", +"input": "<span lang=lub>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lug'", +"input": "<span lang=lug>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ira'", +"input": "<span lang=ira>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mun'", +"input": "<span lang=mun>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tur'", +"input": "<span lang=tur>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lun'", +"input": "<span lang=lun>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'luo'", +"input": "<span lang=luo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'men'", +"input": "<span lang=men>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wa'", +"input": "<span lang=wa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tso'", +"input": "<span lang=tso>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wo'", +"input": "<span lang=wo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jv'", +"input": "<span lang=jv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tut'", +"input": "<span lang=tut>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ind'", +"input": "<span lang=ind>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tuk'", +"input": "<span lang=tuk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tum'", +"input": "<span lang=tum>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ja'", +"input": "<span lang=ja>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cop'", +"input": "<span lang=cop>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cos'", +"input": "<span lang=cos>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cor'", +"input": "<span lang=cor>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ilo'", +"input": "<span lang=ilo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fiu'", +"input": "<span lang=fiu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gwi'", +"input": "<span lang=gwi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'und'", +"input": "<span lang=und>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gws'", +"input": "<span lang=gws>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tli'", +"input": "<span lang=tli>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tlh'", +"input": "<span lang=tlh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nno'", +"input": "<span lang=nno>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ch'", +"input": "<span lang=ch>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'co'", +"input": "<span lang=co>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ca'", +"input": "<span lang=ca>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'por'", +"input": "<span lang=por>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ce'", +"input": "<span lang=ce>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pon'", +"input": "<span lang=pon>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cy'", +"input": "<span lang=cy>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sah'", +"input": "<span lang=sah>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cs'", +"input": "<span lang=cs>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cr'", +"input": "<span lang=cr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ady'", +"input": "<span lang=ady>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cv'", +"input": "<span lang=cv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cu'", +"input": "<span lang=cu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ps'", +"input": "<span lang=ps>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fra'", +"input": "<span lang=fra>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dum'", +"input": "<span lang=dum>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pt'", +"input": "<span lang=pt>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'swa'", +"input": "<span lang=swa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dua'", +"input": "<span lang=dua>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fro'", +"input": "<span lang=fro>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yap'", +"input": "<span lang=yap>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'frm'", +"input": "<span lang=frm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tiv'", +"input": "<span lang=tiv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'frs'", +"input": "<span lang=frs>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'frr'", +"input": "<span lang=frr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yao'", +"input": "<span lang=yao>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pa'", +"input": "<span lang=pa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xal'", +"input": "<span lang=xal>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fry'", +"input": "<span lang=fry>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pi'", +"input": "<span lang=pi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dut'", +"input": "<span lang=dut>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pl'", +"input": "<span lang=pl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gay'", +"input": "<span lang=gay>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oto'", +"input": "<span lang=oto>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sag'", +"input": "<span lang=sag>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hmn'", +"input": "<span lang=hmn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hmo'", +"input": "<span lang=hmo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'an'", +"input": "<span lang=an>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gaa'", +"input": "<span lang=gaa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fur'", +"input": "<span lang=fur>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mlg'", +"input": "<span lang=mlg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'slv'", +"input": "<span lang=slv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ain'", +"input": "<span lang=ain>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fil'", +"input": "<span lang=fil>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mlt'", +"input": "<span lang=mlt>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'slk'", +"input": "<span lang=slk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rar'", +"input": "<span lang=rar>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ful'", +"input": "<span lang=ful>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sla'", +"input": "<span lang=sla>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 've'", +"input": "<span lang=ve>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jpn'", +"input": "<span lang=jpn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vol'", +"input": "<span lang=vol>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vi'", +"input": "<span lang=vi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'is'", +"input": "<span lang=is>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kho'", +"input": "<span lang=kho>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iu'", +"input": "<span lang=iu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'it'", +"input": "<span lang=it>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vo'", +"input": "<span lang=vo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ii'", +"input": "<span lang=ii>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ay'", +"input": "<span lang=ay>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ik'", +"input": "<span lang=ik>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'io'", +"input": "<span lang=io>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kha'", +"input": "<span lang=kha>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ia'", +"input": "<span lang=ia>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ave'", +"input": "<span lang=ave>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jpr'", +"input": "<span lang=jpr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ie'", +"input": "<span lang=ie>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ava'", +"input": "<span lang=ava>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ig'", +"input": "<span lang=ig>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pap'", +"input": "<span lang=pap>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ewo'", +"input": "<span lang=ewo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pau'", +"input": "<span lang=pau>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ewe'", +"input": "<span lang=ewe>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'paa'", +"input": "<span lang=paa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'qaa'", +"input": "<span lang=qaa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pag'", +"input": "<span lang=pag>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sat'", +"input": "<span lang=sat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pal'", +"input": "<span lang=pal>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pam'", +"input": "<span lang=pam>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pan'", +"input": "<span lang=pan>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'phi'", +"input": "<span lang=phi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nog'", +"input": "<span lang=nog>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'phn'", +"input": "<span lang=phn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kir'", +"input": "<span lang=kir>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nia'", +"input": "<span lang=nia>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dgr'", +"input": "<span lang=dgr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'syr'", +"input": "<span lang=syr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kin'", +"input": "<span lang=kin>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tup'", +"input": "<span lang=tup>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'niu'", +"input": "<span lang=niu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gsw'", +"input": "<span lang=gsw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'epo'", +"input": "<span lang=epo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jbo'", +"input": "<span lang=jbo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mic'", +"input": "<span lang=mic>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tha'", +"input": "<span lang=tha>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sam'", +"input": "<span lang=sam>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hai'", +"input": "<span lang=hai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gmh'", +"input": "<span lang=gmh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cus'", +"input": "<span lang=cus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ell'", +"input": "<span lang=ell>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wen'", +"input": "<span lang=wen>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bnt'", +"input": "<span lang=bnt>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fre'", +"input": "<span lang=fre>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'elx'", +"input": "<span lang=elx>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ada'", +"input": "<span lang=ada>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nav'", +"input": "<span lang=nav>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hat'", +"input": "<span lang=hat>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hau'", +"input": "<span lang=hau>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'haw'", +"input": "<span lang=haw>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bin'", +"input": "<span lang=bin>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'amh'", +"input": "<span lang=amh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bik'", +"input": "<span lang=bik>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bih'", +"input": "<span lang=bih>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mos'", +"input": "<span lang=mos>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'moh'", +"input": "<span lang=moh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mon'", +"input": "<span lang=mon>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mol'", +"input": "<span lang=mol>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bis'", +"input": "<span lang=bis>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bla'", +"input": "<span lang=bla>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pol'", +"input": "<span lang=pol>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tib'", +"input": "<span lang=tib>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tvl'", +"input": "<span lang=tvl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tgk'", +"input": "<span lang=tgk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ijo'", +"input": "<span lang=ijo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'est'", +"input": "<span lang=est>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kmb'", +"input": "<span lang=kmb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ice'", +"input": "<span lang=ice>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'peo'", +"input": "<span lang=peo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tgl'", +"input": "<span lang=tgl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'umb'", +"input": "<span lang=umb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tmh'", +"input": "<span lang=tmh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fon'", +"input": "<span lang=fon>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hsb'", +"input": "<span lang=hsb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'be'", +"input": "<span lang=be>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bg'", +"input": "<span lang=bg>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'run'", +"input": "<span lang=run>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ba'", +"input": "<span lang=ba>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rum'", +"input": "<span lang=rum>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bm'", +"input": "<span lang=bm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bn'", +"input": "<span lang=bn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bo'", +"input": "<span lang=bo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bh'", +"input": "<span lang=bh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bi'", +"input": "<span lang=bi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'br'", +"input": "<span lang=br>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bs'", +"input": "<span lang=bs>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rus'", +"input": "<span lang=rus>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rup'", +"input": "<span lang=rup>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pli'", +"input": "<span lang=pli>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'om'", +"input": "<span lang=om>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oj'", +"input": "<span lang=oj>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ace'", +"input": "<span lang=ace>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ach'", +"input": "<span lang=ach>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oc'", +"input": "<span lang=oc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dzo'", +"input": "<span lang=dzo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kru'", +"input": "<span lang=kru>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srr'", +"input": "<span lang=srr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ido'", +"input": "<span lang=ido>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srp'", +"input": "<span lang=srp>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kro'", +"input": "<span lang=kro>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'krl'", +"input": "<span lang=krl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'krc'", +"input": "<span lang=krc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nds'", +"input": "<span lang=nds>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'os'", +"input": "<span lang=os>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'or'", +"input": "<span lang=or>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zul'", +"input": "<span lang=zul>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'twi'", +"input": "<span lang=twi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sog'", +"input": "<span lang=sog>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nso'", +"input": "<span lang=nso>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'swe'", +"input": "<span lang=swe>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'som'", +"input": "<span lang=som>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chm'", +"input": "<span lang=chm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'snd'", +"input": "<span lang=snd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sot'", +"input": "<span lang=sot>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mkd'", +"input": "<span lang=mkd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wak'", +"input": "<span lang=wak>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'her'", +"input": "<span lang=her>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lol'", +"input": "<span lang=lol>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mkh'", +"input": "<span lang=mkh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'heb'", +"input": "<span lang=heb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'loz'", +"input": "<span lang=loz>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gil'", +"input": "<span lang=gil>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'was'", +"input": "<span lang=was>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'war'", +"input": "<span lang=war>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hz'", +"input": "<span lang=hz>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hy'", +"input": "<span lang=hy>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sid'", +"input": "<span lang=sid>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hr'", +"input": "<span lang=hr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ht'", +"input": "<span lang=ht>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hu'", +"input": "<span lang=hu>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hi'", +"input": "<span lang=hi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ho'", +"input": "<span lang=ho>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bul'", +"input": "<span lang=bul>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wal'", +"input": "<span lang=wal>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bua'", +"input": "<span lang=bua>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bug'", +"input": "<span lang=bug>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'he'", +"input": "<span lang=he>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uz'", +"input": "<span lang=uz>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aze'", +"input": "<span lang=aze>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ur'", +"input": "<span lang=ur>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zha'", +"input": "<span lang=zha>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uk'", +"input": "<span lang=uk>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ug'", +"input": "<span lang=ug>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zho'", +"input": "<span lang=zho>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aa'", +"input": "<span lang=aa>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ab'", +"input": "<span lang=ab>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ae'", +"input": "<span lang=ae>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uig'", +"input": "<span lang=uig>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'af'", +"input": "<span lang=af>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ak'", +"input": "<span lang=ak>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'am'", +"input": "<span lang=am>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'myv'", +"input": "<span lang=myv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'khi'", +"input": "<span lang=khi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'as'", +"input": "<span lang=as>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ar'", +"input": "<span lang=ar>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'inh'", +"input": "<span lang=inh>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'khm'", +"input": "<span lang=khm>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'av'", +"input": "<span lang=av>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mya'", +"input": "<span lang=mya>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ine'", +"input": "<span lang=ine>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'az'", +"input": "<span lang=az>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ina'", +"input": "<span lang=ina>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'inc'", +"input": "<span lang=inc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nl'", +"input": "<span lang=nl>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nn'", +"input": "<span lang=nn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'no'", +"input": "<span lang=no>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'na'", +"input": "<span lang=na>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nb'", +"input": "<span lang=nb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nai'", +"input": "<span lang=nai>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nd'", +"input": "<span lang=nd>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ne'", +"input": "<span lang=ne>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tir'", +"input": "<span lang=tir>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ng'", +"input": "<span lang=ng>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ny'", +"input": "<span lang=ny>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nap'", +"input": "<span lang=nap>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gre'", +"input": "<span lang=gre>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'grb'", +"input": "<span lang=grb>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'grc'", +"input": "<span lang=grc>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nau'", +"input": "<span lang=nau>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'grn'", +"input": "<span lang=grn>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nr'", +"input": "<span lang=nr>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tig'", +"input": "<span lang=tig>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yor'", +"input": "<span lang=yor>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nv'", +"input": "<span lang=nv>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mri'", +"input": "<span lang=mri>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'may'", +"input": "<span lang=may>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zun'", +"input": "<span lang=zun>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ile'", +"input": "<span lang=ile>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sqi'", +"input": "<span lang=sqi>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gon'", +"input": "<span lang=gon>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cpe'", +"input": "<span lang=cpe>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cpf'", +"input": "<span lang=cpf>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cpp'", +"input": "<span lang=cpp>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'roh-foo'", +"input": "<span lang=roh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gv-foo'", +"input": "<span lang=gv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gu-foo'", +"input": "<span lang=gu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'scn-foo'", +"input": "<span lang=scn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rom-foo'", +"input": "<span lang=rom-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ron-foo'", +"input": "<span lang=ron-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'alg-foo'", +"input": "<span lang=alg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oss-foo'", +"input": "<span lang=oss-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ale-foo'", +"input": "<span lang=ale-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'alb-foo'", +"input": "<span lang=alb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sco-foo'", +"input": "<span lang=sco-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'scc-foo'", +"input": "<span lang=scc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mni-foo'", +"input": "<span lang=mni-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gd-foo'", +"input": "<span lang=gd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'per-foo'", +"input": "<span lang=per-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ga-foo'", +"input": "<span lang=ga-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nwc-foo'", +"input": "<span lang=nwc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'osa-foo'", +"input": "<span lang=osa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gn-foo'", +"input": "<span lang=gn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'alt-foo'", +"input": "<span lang=alt-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gl-foo'", +"input": "<span lang=gl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'scr-foo'", +"input": "<span lang=scr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mwr-foo'", +"input": "<span lang=mwr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ty-foo'", +"input": "<span lang=ty-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tw-foo'", +"input": "<span lang=tw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tt-foo'", +"input": "<span lang=tt-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tr-foo'", +"input": "<span lang=tr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ts-foo'", +"input": "<span lang=ts-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tn-foo'", +"input": "<span lang=tn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'to-foo'", +"input": "<span lang=to-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tl-foo'", +"input": "<span lang=tl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tk-foo'", +"input": "<span lang=tk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'th-foo'", +"input": "<span lang=th-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ti-foo'", +"input": "<span lang=ti-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ven-foo'", +"input": "<span lang=ven-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tg-foo'", +"input": "<span lang=tg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'te-foo'", +"input": "<span lang=te-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uga-foo'", +"input": "<span lang=uga-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ta-foo'", +"input": "<span lang=ta-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fas-foo'", +"input": "<span lang=fas-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fat-foo'", +"input": "<span lang=fat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fan-foo'", +"input": "<span lang=fan-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fao-foo'", +"input": "<span lang=fao-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'got-foo'", +"input": "<span lang=got-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sme-foo'", +"input": "<span lang=sme-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'din-foo'", +"input": "<span lang=din-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hye-foo'", +"input": "<span lang=hye-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'guj-foo'", +"input": "<span lang=guj-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cmc-foo'", +"input": "<span lang=cmc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srd-foo'", +"input": "<span lang=srd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mdr-foo'", +"input": "<span lang=mdr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ml-foo'", +"input": "<span lang=ml-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'div-foo'", +"input": "<span lang=div-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zh-foo'", +"input": "<span lang=zh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tem-foo'", +"input": "<span lang=tem-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xho-foo'", +"input": "<span lang=xho-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mno-foo'", +"input": "<span lang=mno-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'roa-foo'", +"input": "<span lang=roa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'za-foo'", +"input": "<span lang=za-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'deu-foo'", +"input": "<span lang=deu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mk-foo'", +"input": "<span lang=mk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nbl-foo'", +"input": "<span lang=nbl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zu-foo'", +"input": "<span lang=zu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ter-foo'", +"input": "<span lang=ter-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tet-foo'", +"input": "<span lang=tet-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mnc-foo'", +"input": "<span lang=mnc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sun-foo'", +"input": "<span lang=sun-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'abk-foo'", +"input": "<span lang=abk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'suk-foo'", +"input": "<span lang=suk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kur-foo'", +"input": "<span lang=kur-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kum-foo'", +"input": "<span lang=kum-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'slo-foo'", +"input": "<span lang=slo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sus-foo'", +"input": "<span lang=sus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'new-foo'", +"input": "<span lang=new-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kua-foo'", +"input": "<span lang=kua-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sux-foo'", +"input": "<span lang=sux-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'den-foo'", +"input": "<span lang=den-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mr-foo'", +"input": "<span lang=mr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mul-foo'", +"input": "<span lang=mul-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lez-foo'", +"input": "<span lang=lez-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gla-foo'", +"input": "<span lang=gla-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bos-foo'", +"input": "<span lang=bos-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gle-foo'", +"input": "<span lang=gle-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eka-foo'", +"input": "<span lang=eka-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'glg-foo'", +"input": "<span lang=glg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'akk-foo'", +"input": "<span lang=akk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dra-foo'", +"input": "<span lang=dra-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aka-foo'", +"input": "<span lang=aka-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bod-foo'", +"input": "<span lang=bod-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'glv-foo'", +"input": "<span lang=glv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jrb-foo'", +"input": "<span lang=jrb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vie-foo'", +"input": "<span lang=vie-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ipk-foo'", +"input": "<span lang=ipk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uzb-foo'", +"input": "<span lang=uzb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sgn-foo'", +"input": "<span lang=sgn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sga-foo'", +"input": "<span lang=sga-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bre-foo'", +"input": "<span lang=bre-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'apa-foo'", +"input": "<span lang=apa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bra-foo'", +"input": "<span lang=bra-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aym-foo'", +"input": "<span lang=aym-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cha-foo'", +"input": "<span lang=cha-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chb-foo'", +"input": "<span lang=chb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'che-foo'", +"input": "<span lang=che-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chg-foo'", +"input": "<span lang=chg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chi-foo'", +"input": "<span lang=chi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chk-foo'", +"input": "<span lang=chk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aus-foo'", +"input": "<span lang=aus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chn-foo'", +"input": "<span lang=chn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cho-foo'", +"input": "<span lang=cho-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chp-foo'", +"input": "<span lang=chp-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chr-foo'", +"input": "<span lang=chr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chu-foo'", +"input": "<span lang=chu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chv-foo'", +"input": "<span lang=chv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chy-foo'", +"input": "<span lang=chy-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'msa-foo'", +"input": "<span lang=msa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iii-foo'", +"input": "<span lang=iii-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vot-foo'", +"input": "<span lang=vot-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mg-foo'", +"input": "<span lang=mg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ndo-foo'", +"input": "<span lang=ndo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ibo-foo'", +"input": "<span lang=ibo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'car-foo'", +"input": "<span lang=car-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mo-foo'", +"input": "<span lang=mo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mn-foo'", +"input": "<span lang=mn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mi-foo'", +"input": "<span lang=mi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mh-foo'", +"input": "<span lang=mh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cau-foo'", +"input": "<span lang=cau-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cat-foo'", +"input": "<span lang=cat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bur-foo'", +"input": "<span lang=bur-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mt-foo'", +"input": "<span lang=mt-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cai-foo'", +"input": "<span lang=cai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'del-foo'", +"input": "<span lang=del-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ms-foo'", +"input": "<span lang=ms-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'byn-foo'", +"input": "<span lang=byn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mwl-foo'", +"input": "<span lang=mwl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'my-foo'", +"input": "<span lang=my-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cad-foo'", +"input": "<span lang=cad-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tat-foo'", +"input": "<span lang=tat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nde-foo'", +"input": "<span lang=nde-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tam-foo'", +"input": "<span lang=tam-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'spa-foo'", +"input": "<span lang=spa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tah-foo'", +"input": "<span lang=tah-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tai-foo'", +"input": "<span lang=tai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cze-foo'", +"input": "<span lang=cze-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'afh-foo'", +"input": "<span lang=afh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eng-foo'", +"input": "<span lang=eng-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'afa-foo'", +"input": "<span lang=afa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'id-foo'", +"input": "<span lang=id-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nyn-foo'", +"input": "<span lang=nyn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nyo-foo'", +"input": "<span lang=nyo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gez-foo'", +"input": "<span lang=gez-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nya-foo'", +"input": "<span lang=nya-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sio-foo'", +"input": "<span lang=sio-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sin-foo'", +"input": "<span lang=sin-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'afr-foo'", +"input": "<span lang=afr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'map-foo'", +"input": "<span lang=map-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fr-foo'", +"input": "<span lang=fr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lao-foo'", +"input": "<span lang=lao-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lah-foo'", +"input": "<span lang=lah-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nym-foo'", +"input": "<span lang=nym-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sna-foo'", +"input": "<span lang=sna-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lad-foo'", +"input": "<span lang=lad-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fy-foo'", +"input": "<span lang=fy-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'snk-foo'", +"input": "<span lang=snk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fa-foo'", +"input": "<span lang=fa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mac-foo'", +"input": "<span lang=mac-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mad-foo'", +"input": "<span lang=mad-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ff-foo'", +"input": "<span lang=ff-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lat-foo'", +"input": "<span lang=lat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fi-foo'", +"input": "<span lang=fi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fj-foo'", +"input": "<span lang=fj-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mal-foo'", +"input": "<span lang=mal-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mao-foo'", +"input": "<span lang=mao-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fo-foo'", +"input": "<span lang=fo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mak-foo'", +"input": "<span lang=mak-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'egy-foo'", +"input": "<span lang=egy-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'znd-foo'", +"input": "<span lang=znd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ss-foo'", +"input": "<span lang=ss-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sr-foo'", +"input": "<span lang=sr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sq-foo'", +"input": "<span lang=sq-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sit-foo'", +"input": "<span lang=sit-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sw-foo'", +"input": "<span lang=sw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sv-foo'", +"input": "<span lang=sv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'su-foo'", +"input": "<span lang=su-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'st-foo'", +"input": "<span lang=st-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sk-foo'", +"input": "<span lang=sk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'si-foo'", +"input": "<span lang=si-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sh-foo'", +"input": "<span lang=sh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'so-foo'", +"input": "<span lang=so-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sn-foo'", +"input": "<span lang=sn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sm-foo'", +"input": "<span lang=sm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sl-foo'", +"input": "<span lang=sl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sc-foo'", +"input": "<span lang=sc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sa-foo'", +"input": "<span lang=sa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sg-foo'", +"input": "<span lang=sg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'se-foo'", +"input": "<span lang=se-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sd-foo'", +"input": "<span lang=sd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zen-foo'", +"input": "<span lang=zen-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kbd-foo'", +"input": "<span lang=kbd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'enm-foo'", +"input": "<span lang=enm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iro-foo'", +"input": "<span lang=iro-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vai-foo'", +"input": "<span lang=vai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'csb-foo'", +"input": "<span lang=csb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tsn-foo'", +"input": "<span lang=tsn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lg-foo'", +"input": "<span lang=lg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lb-foo'", +"input": "<span lang=lb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'la-foo'", +"input": "<span lang=la-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ln-foo'", +"input": "<span lang=ln-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lo-foo'", +"input": "<span lang=lo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'li-foo'", +"input": "<span lang=li-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lv-foo'", +"input": "<span lang=lv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lt-foo'", +"input": "<span lang=lt-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lu-foo'", +"input": "<span lang=lu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hin-foo'", +"input": "<span lang=hin-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fij-foo'", +"input": "<span lang=fij-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fin-foo'", +"input": "<span lang=fin-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eus-foo'", +"input": "<span lang=eus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yi-foo'", +"input": "<span lang=yi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'non-foo'", +"input": "<span lang=non-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ceb-foo'", +"input": "<span lang=ceb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yo-foo'", +"input": "<span lang=yo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dan-foo'", +"input": "<span lang=dan-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cel-foo'", +"input": "<span lang=cel-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bat-foo'", +"input": "<span lang=bat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nob-foo'", +"input": "<span lang=nob-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dak-foo'", +"input": "<span lang=dak-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ces-foo'", +"input": "<span lang=ces-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dar-foo'", +"input": "<span lang=dar-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'son-foo'", +"input": "<span lang=son-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'day-foo'", +"input": "<span lang=day-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nor-foo'", +"input": "<span lang=nor-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gba-foo'", +"input": "<span lang=gba-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ssa-foo'", +"input": "<span lang=ssa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hil-foo'", +"input": "<span lang=hil-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kpe-foo'", +"input": "<span lang=kpe-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'man-foo'", +"input": "<span lang=man-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wel-foo'", +"input": "<span lang=wel-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'el-foo'", +"input": "<span lang=el-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eo-foo'", +"input": "<span lang=eo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'en-foo'", +"input": "<span lang=en-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lam-foo'", +"input": "<span lang=lam-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ee-foo'", +"input": "<span lang=ee-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tpi-foo'", +"input": "<span lang=tpi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mdf-foo'", +"input": "<span lang=mdf-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mas-foo'", +"input": "<span lang=mas-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mar-foo'", +"input": "<span lang=mar-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'eu-foo'", +"input": "<span lang=eu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'et-foo'", +"input": "<span lang=et-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'es-foo'", +"input": "<span lang=es-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ru-foo'", +"input": "<span lang=ru-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rw-foo'", +"input": "<span lang=rw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'goh-foo'", +"input": "<span lang=goh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sms-foo'", +"input": "<span lang=sms-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smo-foo'", +"input": "<span lang=smo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smn-foo'", +"input": "<span lang=smn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smj-foo'", +"input": "<span lang=smj-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'smi-foo'", +"input": "<span lang=smi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nic-foo'", +"input": "<span lang=nic-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rm-foo'", +"input": "<span lang=rm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rn-foo'", +"input": "<span lang=rn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ro-foo'", +"input": "<span lang=ro-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dsb-foo'", +"input": "<span lang=dsb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sma-foo'", +"input": "<span lang=sma-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gor-foo'", +"input": "<span lang=gor-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ast-foo'", +"input": "<span lang=ast-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'orm-foo'", +"input": "<span lang=orm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'que-foo'", +"input": "<span lang=que-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ori-foo'", +"input": "<span lang=ori-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'crh-foo'", +"input": "<span lang=crh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'asm-foo'", +"input": "<span lang=asm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pus-foo'", +"input": "<span lang=pus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kik-foo'", +"input": "<span lang=kik-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ltz-foo'", +"input": "<span lang=ltz-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ath-foo'", +"input": "<span lang=ath-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wln-foo'", +"input": "<span lang=wln-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'isl-foo'", +"input": "<span lang=isl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xh-foo'", +"input": "<span lang=xh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mag-foo'", +"input": "<span lang=mag-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mai-foo'", +"input": "<span lang=mai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xx-foo'", +"input": "<span lang=xx-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mah-foo'", +"input": "<span lang=mah-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tel-foo'", +"input": "<span lang=tel-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lav-foo'", +"input": "<span lang=lav-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zap-foo'", +"input": "<span lang=zap-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yid-foo'", +"input": "<span lang=yid-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kok-foo'", +"input": "<span lang=kok-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kom-foo'", +"input": "<span lang=kom-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kon-foo'", +"input": "<span lang=kon-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ukr-foo'", +"input": "<span lang=ukr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ton-foo'", +"input": "<span lang=ton-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kos-foo'", +"input": "<span lang=kos-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kor-foo'", +"input": "<span lang=kor-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tog-foo'", +"input": "<span lang=tog-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hun-foo'", +"input": "<span lang=hun-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hup-foo'", +"input": "<span lang=hup-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cym-foo'", +"input": "<span lang=cym-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'udm-foo'", +"input": "<span lang=udm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bej-foo'", +"input": "<span lang=bej-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ben-foo'", +"input": "<span lang=ben-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bel-foo'", +"input": "<span lang=bel-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bem-foo'", +"input": "<span lang=bem-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tsi-foo'", +"input": "<span lang=tsi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aar-foo'", +"input": "<span lang=aar-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ber-foo'", +"input": "<span lang=ber-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nzi-foo'", +"input": "<span lang=nzi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sai-foo'", +"input": "<span lang=sai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ang-foo'", +"input": "<span lang=ang-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pra-foo'", +"input": "<span lang=pra-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'san-foo'", +"input": "<span lang=san-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bho-foo'", +"input": "<span lang=bho-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sal-foo'", +"input": "<span lang=sal-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pro-foo'", +"input": "<span lang=pro-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'raj-foo'", +"input": "<span lang=raj-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sad-foo'", +"input": "<span lang=sad-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'anp-foo'", +"input": "<span lang=anp-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rap-foo'", +"input": "<span lang=rap-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sas-foo'", +"input": "<span lang=sas-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iba-foo'", +"input": "<span lang=iba-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'myn-foo'", +"input": "<span lang=myn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'min-foo'", +"input": "<span lang=min-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lim-foo'", +"input": "<span lang=lim-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lin-foo'", +"input": "<span lang=lin-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nah-foo'", +"input": "<span lang=nah-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lit-foo'", +"input": "<span lang=lit-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'efi-foo'", +"input": "<span lang=efi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srn-foo'", +"input": "<span lang=srn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arn-foo'", +"input": "<span lang=arn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ypk-foo'", +"input": "<span lang=ypk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mis-foo'", +"input": "<span lang=mis-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kac-foo'", +"input": "<span lang=kac-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kab-foo'", +"input": "<span lang=kab-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kaa-foo'", +"input": "<span lang=kaa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kan-foo'", +"input": "<span lang=kan-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kam-foo'", +"input": "<span lang=kam-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kal-foo'", +"input": "<span lang=kal-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kas-foo'", +"input": "<span lang=kas-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kar-foo'", +"input": "<span lang=kar-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kaw-foo'", +"input": "<span lang=kaw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kau-foo'", +"input": "<span lang=kau-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kat-foo'", +"input": "<span lang=kat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kaz-foo'", +"input": "<span lang=kaz-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tyv-foo'", +"input": "<span lang=tyv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'awa-foo'", +"input": "<span lang=awa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'urd-foo'", +"input": "<span lang=urd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ka-foo'", +"input": "<span lang=ka-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'doi-foo'", +"input": "<span lang=doi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kg-foo'", +"input": "<span lang=kg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kk-foo'", +"input": "<span lang=kk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kj-foo'", +"input": "<span lang=kj-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ki-foo'", +"input": "<span lang=ki-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ko-foo'", +"input": "<span lang=ko-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kn-foo'", +"input": "<span lang=kn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'km-foo'", +"input": "<span lang=km-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kl-foo'", +"input": "<span lang=kl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ks-foo'", +"input": "<span lang=ks-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kr-foo'", +"input": "<span lang=kr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kw-foo'", +"input": "<span lang=kw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kv-foo'", +"input": "<span lang=kv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ku-foo'", +"input": "<span lang=ku-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ky-foo'", +"input": "<span lang=ky-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ota-foo'", +"input": "<span lang=ota-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kut-foo'", +"input": "<span lang=kut-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tkl-foo'", +"input": "<span lang=tkl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nld-foo'", +"input": "<span lang=nld-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oji-foo'", +"input": "<span lang=oji-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oci-foo'", +"input": "<span lang=oci-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ha-foo'", +"input": "<span lang=ha-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wol-foo'", +"input": "<span lang=wol-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jav-foo'", +"input": "<span lang=jav-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hrv-foo'", +"input": "<span lang=hrv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ger-foo'", +"input": "<span lang=ger-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mga-foo'", +"input": "<span lang=mga-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hit-foo'", +"input": "<span lang=hit-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dyu-foo'", +"input": "<span lang=dyu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ssw-foo'", +"input": "<span lang=ssw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'de-foo'", +"input": "<span lang=de-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'da-foo'", +"input": "<span lang=da-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dz-foo'", +"input": "<span lang=dz-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lui-foo'", +"input": "<span lang=lui-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dv-foo'", +"input": "<span lang=dv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ita-foo'", +"input": "<span lang=ita-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'geo-foo'", +"input": "<span lang=geo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'him-foo'", +"input": "<span lang=him-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gem-foo'", +"input": "<span lang=gem-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'crp-foo'", +"input": "<span lang=crp-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'qu-foo'", +"input": "<span lang=qu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bas-foo'", +"input": "<span lang=bas-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'baq-foo'", +"input": "<span lang=baq-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bad-foo'", +"input": "<span lang=bad-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nep-foo'", +"input": "<span lang=nep-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cre-foo'", +"input": "<span lang=cre-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ban-foo'", +"input": "<span lang=ban-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'x-foo'", +"input": "<span lang=x-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bal-foo'", +"input": "<span lang=bal-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bam-foo'", +"input": "<span lang=bam-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bak-foo'", +"input": "<span lang=bak-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'shn-foo'", +"input": "<span lang=shn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bai-foo'", +"input": "<span lang=bai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arp-foo'", +"input": "<span lang=arp-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'art-foo'", +"input": "<span lang=art-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arw-foo'", +"input": "<span lang=arw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'qtz-foo'", +"input": "<span lang=qtz-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ara-foo'", +"input": "<span lang=ara-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arc-foo'", +"input": "<span lang=arc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arg-foo'", +"input": "<span lang=arg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sem-foo'", +"input": "<span lang=sem-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sel-foo'", +"input": "<span lang=sel-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nub-foo'", +"input": "<span lang=nub-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'arm-foo'", +"input": "<span lang=arm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'btk-foo'", +"input": "<span lang=btk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lus-foo'", +"input": "<span lang=lus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iku-foo'", +"input": "<span lang=iku-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mus-foo'", +"input": "<span lang=mus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lua-foo'", +"input": "<span lang=lua-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lub-foo'", +"input": "<span lang=lub-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lug-foo'", +"input": "<span lang=lug-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ira-foo'", +"input": "<span lang=ira-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mun-foo'", +"input": "<span lang=mun-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tur-foo'", +"input": "<span lang=tur-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lun-foo'", +"input": "<span lang=lun-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'luo-foo'", +"input": "<span lang=luo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'men-foo'", +"input": "<span lang=men-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wa-foo'", +"input": "<span lang=wa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tso-foo'", +"input": "<span lang=tso-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wo-foo'", +"input": "<span lang=wo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jv-foo'", +"input": "<span lang=jv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tut-foo'", +"input": "<span lang=tut-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ind-foo'", +"input": "<span lang=ind-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tuk-foo'", +"input": "<span lang=tuk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tum-foo'", +"input": "<span lang=tum-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ja-foo'", +"input": "<span lang=ja-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cop-foo'", +"input": "<span lang=cop-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cos-foo'", +"input": "<span lang=cos-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cor-foo'", +"input": "<span lang=cor-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ilo-foo'", +"input": "<span lang=ilo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fiu-foo'", +"input": "<span lang=fiu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gwi-foo'", +"input": "<span lang=gwi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'und-foo'", +"input": "<span lang=und-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gws-foo'", +"input": "<span lang=gws-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tli-foo'", +"input": "<span lang=tli-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tlh-foo'", +"input": "<span lang=tlh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nno-foo'", +"input": "<span lang=nno-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ch-foo'", +"input": "<span lang=ch-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'co-foo'", +"input": "<span lang=co-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ca-foo'", +"input": "<span lang=ca-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'por-foo'", +"input": "<span lang=por-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ce-foo'", +"input": "<span lang=ce-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pon-foo'", +"input": "<span lang=pon-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cy-foo'", +"input": "<span lang=cy-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sah-foo'", +"input": "<span lang=sah-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cs-foo'", +"input": "<span lang=cs-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cr-foo'", +"input": "<span lang=cr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ady-foo'", +"input": "<span lang=ady-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cv-foo'", +"input": "<span lang=cv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cu-foo'", +"input": "<span lang=cu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ps-foo'", +"input": "<span lang=ps-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fra-foo'", +"input": "<span lang=fra-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dum-foo'", +"input": "<span lang=dum-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pt-foo'", +"input": "<span lang=pt-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'swa-foo'", +"input": "<span lang=swa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dua-foo'", +"input": "<span lang=dua-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fro-foo'", +"input": "<span lang=fro-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yap-foo'", +"input": "<span lang=yap-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'frm-foo'", +"input": "<span lang=frm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tiv-foo'", +"input": "<span lang=tiv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'frs-foo'", +"input": "<span lang=frs-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'frr-foo'", +"input": "<span lang=frr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yao-foo'", +"input": "<span lang=yao-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pa-foo'", +"input": "<span lang=pa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'xal-foo'", +"input": "<span lang=xal-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fry-foo'", +"input": "<span lang=fry-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pi-foo'", +"input": "<span lang=pi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dut-foo'", +"input": "<span lang=dut-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pl-foo'", +"input": "<span lang=pl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gay-foo'", +"input": "<span lang=gay-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oto-foo'", +"input": "<span lang=oto-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sag-foo'", +"input": "<span lang=sag-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hmn-foo'", +"input": "<span lang=hmn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hmo-foo'", +"input": "<span lang=hmo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'an-foo'", +"input": "<span lang=an-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gaa-foo'", +"input": "<span lang=gaa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fur-foo'", +"input": "<span lang=fur-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mlg-foo'", +"input": "<span lang=mlg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'slv-foo'", +"input": "<span lang=slv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ain-foo'", +"input": "<span lang=ain-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fil-foo'", +"input": "<span lang=fil-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mlt-foo'", +"input": "<span lang=mlt-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'slk-foo'", +"input": "<span lang=slk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rar-foo'", +"input": "<span lang=rar-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ful-foo'", +"input": "<span lang=ful-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sla-foo'", +"input": "<span lang=sla-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 've-foo'", +"input": "<span lang=ve-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jpn-foo'", +"input": "<span lang=jpn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vol-foo'", +"input": "<span lang=vol-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vi-foo'", +"input": "<span lang=vi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'is-foo'", +"input": "<span lang=is-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kho-foo'", +"input": "<span lang=kho-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'iu-foo'", +"input": "<span lang=iu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'it-foo'", +"input": "<span lang=it-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'vo-foo'", +"input": "<span lang=vo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ii-foo'", +"input": "<span lang=ii-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ay-foo'", +"input": "<span lang=ay-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ik-foo'", +"input": "<span lang=ik-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'io-foo'", +"input": "<span lang=io-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kha-foo'", +"input": "<span lang=kha-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ia-foo'", +"input": "<span lang=ia-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ave-foo'", +"input": "<span lang=ave-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jpr-foo'", +"input": "<span lang=jpr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ie-foo'", +"input": "<span lang=ie-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ava-foo'", +"input": "<span lang=ava-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ig-foo'", +"input": "<span lang=ig-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pap-foo'", +"input": "<span lang=pap-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ewo-foo'", +"input": "<span lang=ewo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pau-foo'", +"input": "<span lang=pau-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ewe-foo'", +"input": "<span lang=ewe-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'paa-foo'", +"input": "<span lang=paa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'qaa-foo'", +"input": "<span lang=qaa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pag-foo'", +"input": "<span lang=pag-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sat-foo'", +"input": "<span lang=sat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pal-foo'", +"input": "<span lang=pal-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pam-foo'", +"input": "<span lang=pam-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pan-foo'", +"input": "<span lang=pan-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'phi-foo'", +"input": "<span lang=phi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nog-foo'", +"input": "<span lang=nog-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'phn-foo'", +"input": "<span lang=phn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kir-foo'", +"input": "<span lang=kir-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nia-foo'", +"input": "<span lang=nia-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dgr-foo'", +"input": "<span lang=dgr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'syr-foo'", +"input": "<span lang=syr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kin-foo'", +"input": "<span lang=kin-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tup-foo'", +"input": "<span lang=tup-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'niu-foo'", +"input": "<span lang=niu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gsw-foo'", +"input": "<span lang=gsw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'epo-foo'", +"input": "<span lang=epo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'jbo-foo'", +"input": "<span lang=jbo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mic-foo'", +"input": "<span lang=mic-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tha-foo'", +"input": "<span lang=tha-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sam-foo'", +"input": "<span lang=sam-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hai-foo'", +"input": "<span lang=hai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gmh-foo'", +"input": "<span lang=gmh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cus-foo'", +"input": "<span lang=cus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ell-foo'", +"input": "<span lang=ell-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wen-foo'", +"input": "<span lang=wen-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bnt-foo'", +"input": "<span lang=bnt-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fre-foo'", +"input": "<span lang=fre-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'elx-foo'", +"input": "<span lang=elx-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ada-foo'", +"input": "<span lang=ada-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nav-foo'", +"input": "<span lang=nav-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hat-foo'", +"input": "<span lang=hat-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hau-foo'", +"input": "<span lang=hau-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'haw-foo'", +"input": "<span lang=haw-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bin-foo'", +"input": "<span lang=bin-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'amh-foo'", +"input": "<span lang=amh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bik-foo'", +"input": "<span lang=bik-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bih-foo'", +"input": "<span lang=bih-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mos-foo'", +"input": "<span lang=mos-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'moh-foo'", +"input": "<span lang=moh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mon-foo'", +"input": "<span lang=mon-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mol-foo'", +"input": "<span lang=mol-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bis-foo'", +"input": "<span lang=bis-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bla-foo'", +"input": "<span lang=bla-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pol-foo'", +"input": "<span lang=pol-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tib-foo'", +"input": "<span lang=tib-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tvl-foo'", +"input": "<span lang=tvl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tgk-foo'", +"input": "<span lang=tgk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ijo-foo'", +"input": "<span lang=ijo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'est-foo'", +"input": "<span lang=est-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kmb-foo'", +"input": "<span lang=kmb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ice-foo'", +"input": "<span lang=ice-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'peo-foo'", +"input": "<span lang=peo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tgl-foo'", +"input": "<span lang=tgl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'umb-foo'", +"input": "<span lang=umb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tmh-foo'", +"input": "<span lang=tmh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'fon-foo'", +"input": "<span lang=fon-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hsb-foo'", +"input": "<span lang=hsb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'be-foo'", +"input": "<span lang=be-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bg-foo'", +"input": "<span lang=bg-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'run-foo'", +"input": "<span lang=run-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ba-foo'", +"input": "<span lang=ba-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rum-foo'", +"input": "<span lang=rum-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bm-foo'", +"input": "<span lang=bm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bn-foo'", +"input": "<span lang=bn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bo-foo'", +"input": "<span lang=bo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bh-foo'", +"input": "<span lang=bh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bi-foo'", +"input": "<span lang=bi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'br-foo'", +"input": "<span lang=br-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bs-foo'", +"input": "<span lang=bs-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rus-foo'", +"input": "<span lang=rus-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'rup-foo'", +"input": "<span lang=rup-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'pli-foo'", +"input": "<span lang=pli-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'om-foo'", +"input": "<span lang=om-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oj-foo'", +"input": "<span lang=oj-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ace-foo'", +"input": "<span lang=ace-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ach-foo'", +"input": "<span lang=ach-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'oc-foo'", +"input": "<span lang=oc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'dzo-foo'", +"input": "<span lang=dzo-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kru-foo'", +"input": "<span lang=kru-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srr-foo'", +"input": "<span lang=srr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ido-foo'", +"input": "<span lang=ido-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'srp-foo'", +"input": "<span lang=srp-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'kro-foo'", +"input": "<span lang=kro-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'krl-foo'", +"input": "<span lang=krl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'krc-foo'", +"input": "<span lang=krc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nds-foo'", +"input": "<span lang=nds-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'os-foo'", +"input": "<span lang=os-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'or-foo'", +"input": "<span lang=or-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zul-foo'", +"input": "<span lang=zul-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'twi-foo'", +"input": "<span lang=twi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sog-foo'", +"input": "<span lang=sog-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nso-foo'", +"input": "<span lang=nso-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'swe-foo'", +"input": "<span lang=swe-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'som-foo'", +"input": "<span lang=som-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'chm-foo'", +"input": "<span lang=chm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'snd-foo'", +"input": "<span lang=snd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sot-foo'", +"input": "<span lang=sot-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mkd-foo'", +"input": "<span lang=mkd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wak-foo'", +"input": "<span lang=wak-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'her-foo'", +"input": "<span lang=her-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'lol-foo'", +"input": "<span lang=lol-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mkh-foo'", +"input": "<span lang=mkh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'heb-foo'", +"input": "<span lang=heb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'loz-foo'", +"input": "<span lang=loz-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gil-foo'", +"input": "<span lang=gil-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'was-foo'", +"input": "<span lang=was-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'war-foo'", +"input": "<span lang=war-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hz-foo'", +"input": "<span lang=hz-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hy-foo'", +"input": "<span lang=hy-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sid-foo'", +"input": "<span lang=sid-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hr-foo'", +"input": "<span lang=hr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ht-foo'", +"input": "<span lang=ht-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hu-foo'", +"input": "<span lang=hu-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'hi-foo'", +"input": "<span lang=hi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ho-foo'", +"input": "<span lang=ho-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bul-foo'", +"input": "<span lang=bul-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'wal-foo'", +"input": "<span lang=wal-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bua-foo'", +"input": "<span lang=bua-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'bug-foo'", +"input": "<span lang=bug-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'he-foo'", +"input": "<span lang=he-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uz-foo'", +"input": "<span lang=uz-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aze-foo'", +"input": "<span lang=aze-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ur-foo'", +"input": "<span lang=ur-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zha-foo'", +"input": "<span lang=zha-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uk-foo'", +"input": "<span lang=uk-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ug-foo'", +"input": "<span lang=ug-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zho-foo'", +"input": "<span lang=zho-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'aa-foo'", +"input": "<span lang=aa-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ab-foo'", +"input": "<span lang=ab-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ae-foo'", +"input": "<span lang=ae-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'uig-foo'", +"input": "<span lang=uig-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'af-foo'", +"input": "<span lang=af-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ak-foo'", +"input": "<span lang=ak-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'am-foo'", +"input": "<span lang=am-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'myv-foo'", +"input": "<span lang=myv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'khi-foo'", +"input": "<span lang=khi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'as-foo'", +"input": "<span lang=as-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ar-foo'", +"input": "<span lang=ar-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'inh-foo'", +"input": "<span lang=inh-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'khm-foo'", +"input": "<span lang=khm-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'av-foo'", +"input": "<span lang=av-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mya-foo'", +"input": "<span lang=mya-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ine-foo'", +"input": "<span lang=ine-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'az-foo'", +"input": "<span lang=az-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ina-foo'", +"input": "<span lang=ina-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'inc-foo'", +"input": "<span lang=inc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nl-foo'", +"input": "<span lang=nl-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nn-foo'", +"input": "<span lang=nn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'no-foo'", +"input": "<span lang=no-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'na-foo'", +"input": "<span lang=na-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nb-foo'", +"input": "<span lang=nb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nai-foo'", +"input": "<span lang=nai-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nd-foo'", +"input": "<span lang=nd-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ne-foo'", +"input": "<span lang=ne-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tir-foo'", +"input": "<span lang=tir-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ng-foo'", +"input": "<span lang=ng-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ny-foo'", +"input": "<span lang=ny-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nap-foo'", +"input": "<span lang=nap-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gre-foo'", +"input": "<span lang=gre-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'grb-foo'", +"input": "<span lang=grb-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'grc-foo'", +"input": "<span lang=grc-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nau-foo'", +"input": "<span lang=nau-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'grn-foo'", +"input": "<span lang=grn-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nr-foo'", +"input": "<span lang=nr-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'tig-foo'", +"input": "<span lang=tig-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'yor-foo'", +"input": "<span lang=yor-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'nv-foo'", +"input": "<span lang=nv-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'mri-foo'", +"input": "<span lang=mri-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'may-foo'", +"input": "<span lang=may-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'zun-foo'", +"input": "<span lang=zun-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'ile-foo'", +"input": "<span lang=ile-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'sqi-foo'", +"input": "<span lang=sqi-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'gon-foo'", +"input": "<span lang=gon-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cpe-foo'", +"input": "<span lang=cpe-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cpf-foo'", +"input": "<span lang=cpf-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'cpp-foo'", +"input": "<span lang=cpp-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "invalid lang attribute 'foo'", +"input": "<span lang=foo>", +"fail-unless": "invalid-lang-code"}, + +{"description": "valid lang attribute 'EN'", +"input": "<span lang=EN>", +"fail-if": "invalid-lang-code"}, + +{"description": "valid lang attribute 'EN-foo'", +"input": "<span lang=EN-foo>", +"fail-if": "invalid-lang-code"}, + +{"description": "lang attribute can be blank", +"input": "<span lang>", +"fail-if": "invalid-lang-code"}, + +{"description": "lang attribute can be blank (with quotes)", +"input": "<span lang=''>", +"fail-if": "invalid-lang-code"}, + +{"description": "lang attribute can not be just space characters", +"input": "<span lang=' '>", +"fail-unless": "invalid-lang-code"}, + +{"description": "lang attribute can not contain leading spaces", +"input": "<span lang=' en'>", +"fail-unless": "invalid-lang-code"}, + +{"description": "lang attribute can not contain trailing spaces", +"input": "<span lang='en '>", +"fail-unless": "invalid-lang-code"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/li-value-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/li-value-attribute.test new file mode 100755 index 000000000..9ef9dcc56 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/li-value-attribute.test @@ -0,0 +1,7 @@ +{"tests": [ + +{"description": "invalid li value attribute value due to leading junk", +"input": "<li value=a1>", +"fail-unless": "invalid-integer-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-href-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-href-attribute.test new file mode 100755 index 000000000..950c3786f --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-href-attribute.test @@ -0,0 +1,7 @@ +{"tests": [ + +{"description": "link href contains invalid URI due to space in domain", +"input": "<link href='http://www.example. com/'", +"fail-unless": "invalid-uri-char"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-hreflang-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-hreflang-attribute.test new file mode 100755 index 000000000..de39d4da0 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-hreflang-attribute.test @@ -0,0 +1,7 @@ +{"tests": [ + +{"description": "invalid lang attribute 'foo'", +"input": "<link hreflang=foo>", +"fail-unless": "invalid-lang-code"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-rel-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-rel-attribute.test new file mode 100755 index 000000000..a436751da --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/link-rel-attribute.test @@ -0,0 +1,271 @@ +{"tests": [ + +{"description": "invalid link rel value 'foo'", +"input": "<link rel=foo>", +"fail-unless": "invalid-rel"}, + +{"description": "valid link rel value 'alternate stylesheet'", +"input": "<link rel='alternate stylesheet'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading space", +"input": "<link rel=' stylesheet'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with trailing space", +"input": "<link rel='stylesheet '>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading and trailing space", +"input": "<link rel=' stylesheet '>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading tab", +"input": "<link rel='\tstylesheet'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with trailing tab", +"input": "<link rel='stylesheet\t'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading and trailing tab", +"input": "<link rel='\tstylesheet\t'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading LF", +"input": "<link rel='\nstylesheet'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with trailing LF", +"input": "<link rel='stylesheet\n'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading and trailing LF", +"input": "<link rel='\nstylesheet\n'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading LT", +"input": "<link rel='\u000Bstylesheet'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with trailing LT", +"input": "<link rel='stylesheet\u000B'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading and trailing LT", +"input": "<link rel='\u000Bstylesheet\u000B'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading FF", +"input": "<link rel='\u000Cstylesheet'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with trailing FF", +"input": "<link rel='stylesheet\u000C'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading and trailing FF", +"input": "<link rel='\u000Cstylesheet\u000C'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading CR", +"input": "<link rel='\rstylesheet'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with trailing CR", +"input": "<link rel='stylesheet\r'>", +"fail-if": "invalid-rel"}, + +{"description": "valid single link rel value with leading and trailing CR", +"input": "<link rel='\rstylesheet\r'>", +"fail-if": "invalid-rel"}, + +{"description": "valid double link rel value separated by space", +"input": "<link rel='stylesheet alternate'>", +"fail-if": "invalid-rel"}, + +{"description": "valid double link rel value separated by tab", +"input": "<link rel='stylesheet\talternate'>", +"fail-if": "invalid-rel"}, + +{"description": "valid double link rel value separated by LF", +"input": "<link rel='stylesheet\nalternate'>", +"fail-if": "invalid-rel"}, + +{"description": "valid double link rel value separated by LT", +"input": "<link rel='stylesheet\u000Balternate'>", +"fail-if": "invalid-rel"}, + +{"description": "valid double link rel value separated by FF", +"input": "<link rel='stylesheet\u000Calternate'>", +"fail-if": "invalid-rel"}, + +{"description": "valid double link rel value separated by CR", +"input": "<link rel='stylesheet\ralternate'>", +"fail-if": "invalid-rel"}, + +{"description": "invalid duplicated link rel value separated by space", +"input": "<link rel='stylesheet stylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by tab", +"input": "<link rel='stylesheet\tstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by LF", +"input": "<link rel='stylesheet\nstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by LT", +"input": "<link rel='stylesheet\u000Bstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by FF", +"input": "<link rel='stylesheet\u000Cstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by CR", +"input": "<link rel='stylesheet\rstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by space", +"input": "<link rel='stylesheet stylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by tab", +"input": "<link rel='stylesheet\tstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by LF", +"input": "<link rel='stylesheet\nstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by LT", +"input": "<link rel='stylesheet\u000Bstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by FF", +"input": "<link rel='stylesheet\u000Cstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "invalid duplicated link rel value separated by CR", +"input": "<link rel='stylesheet\rstylesheet'>", +"fail-unless": "duplicate-value-in-token-list"}, + +{"description": "valid link rel value 'feed'", +"input": "<link rel=feed>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'help'", +"input": "<link rel=help>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'tag'", +"input": "<link rel=tag>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'sidebar'", +"input": "<link rel=sidebar>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'archive'", +"input": "<link rel=archive>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'contents'", +"input": "<link rel=contents>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'previous'", +"input": "<link rel=previous>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'index'", +"input": "<link rel=index>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'end'", +"input": "<link rel=end>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'copyright'", +"input": "<link rel=copyright>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'author'", +"input": "<link rel=author>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'top'", +"input": "<link rel=top>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'alternate'", +"input": "<link rel=alternate>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'next'", +"input": "<link rel=next>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'start'", +"input": "<link rel=start>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'stylesheet'", +"input": "<link rel=stylesheet>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'archives'", +"input": "<link rel=archives>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'toc'", +"input": "<link rel=toc>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'prev'", +"input": "<link rel=prev>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'begin'", +"input": "<link rel=begin>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'icon'", +"input": "<link rel=icon>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'search'", +"input": "<link rel=search>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'last'", +"input": "<link rel=last>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'license'", +"input": "<link rel=license>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'pingback'", +"input": "<link rel=pingback>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'up'", +"input": "<link rel=up>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'contact'", +"input": "<link rel=contact>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'prefetch'", +"input": "<link rel=prefetch>", +"fail-if": "invalid-rel"}, + +{"description": "valid link rel value 'first'", +"input": "<link rel=first>", +"fail-if": "invalid-rel"} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/ol-start-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/ol-start-attribute.test new file mode 100755 index 000000000..5e18cbef4 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/ol-start-attribute.test @@ -0,0 +1,7 @@ +{"tests": [ + +{"description": "invalid ol start attribute value due to leading junk", +"input": "<ol start=a1>", +"fail-unless": "invalid-integer-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/starttags.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/starttags.test new file mode 100755 index 000000000..0aa5b4d00 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/starttags.test @@ -0,0 +1,375 @@ +{"tests": [ + +{"description": "unknown start tag <foo>", +"input": "<foo>", +"fail-unless": "unknown-start-tag"}, + +{"description": "allowed start tag <code>", +"input": "<code>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <kbd>", +"input": "<kbd>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <aside>", +"input": "<aside>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <datagrid>", +"input": "<datagrid>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <font>", +"input": "<font>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <noscript>", +"input": "<noscript>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <style>", +"input": "<style>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <img>", +"input": "<img>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <title>", +"input": "<title>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <menu>", +"input": "<menu>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <tr>", +"input": "<tr>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <param>", +"input": "<param>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <li>", +"input": "<li>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <source>", +"input": "<source>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <tfoot>", +"input": "<tfoot>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <th>", +"input": "<th>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <td>", +"input": "<td>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <dl>", +"input": "<dl>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <blockquote>", +"input": "<blockquote>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <dd>", +"input": "<dd>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <abbr>", +"input": "<abbr>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <dt>", +"input": "<dt>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <noembed>", +"input": "<noembed>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <p>", +"input": "<p>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <small>", +"input": "<small>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <meter>", +"input": "<meter>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <em>", +"input": "<em>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <meta>", +"input": "<meta>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <video>", +"input": "<video>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <div>", +"input": "<div>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <canvas>", +"input": "<canvas>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <sub>", +"input": "<sub>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <section>", +"input": "<section>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <sup>", +"input": "<sup>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <progress>", +"input": "<progress>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <body>", +"input": "<body>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <base>", +"input": "<base>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <br>", +"input": "<br>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <address>", +"input": "<address>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <article>", +"input": "<article>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <strong>", +"input": "<strong>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <legend>", +"input": "<legend>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <event-source>", +"input": "<event-source>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <ol>", +"input": "<ol>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <script>", +"input": "<script>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <caption>", +"input": "<caption>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <dialog>", +"input": "<dialog>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <col>", +"input": "<col>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <h2>", +"input": "<h2>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <h3>", +"input": "<h3>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <h1>", +"input": "<h1>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <h6>", +"input": "<h6>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <h4>", +"input": "<h4>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <h5>", +"input": "<h5>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <header>", +"input": "<header>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <table>", +"input": "<table>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <span>", +"input": "<span>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <area>", +"input": "<area>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <dfn>", +"input": "<dfn>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <var>", +"input": "<var>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <cite>", +"input": "<cite>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <thead>", +"input": "<thead>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <head>", +"input": "<head>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <hr>", +"input": "<hr>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <link>", +"input": "<link>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <datatemplate>", +"input": "<datatemplate>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <b>", +"input": "<b>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <colgroup>", +"input": "<colgroup>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <ul>", +"input": "<ul>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <del>", +"input": "<del>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <iframe>", +"input": "<iframe>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <pre>", +"input": "<pre>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <figure>", +"input": "<figure>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <ins>", +"input": "<ins>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <tbody>", +"input": "<tbody>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <html>", +"input": "<html>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <nav>", +"input": "<nav>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <details>", +"input": "<details>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <samp>", +"input": "<samp>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <map>", +"input": "<map>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <nest>", +"input": "<nest>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <object>", +"input": "<object>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <a>", +"input": "<a>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <footer>", +"input": "<footer>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <i>", +"input": "<i>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <m>", +"input": "<m>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <rule>", +"input": "<rule>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <q>", +"input": "<q>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <command>", +"input": "<command>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <time>", +"input": "<time>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <audio>", +"input": "<audio>", +"fail-if": "unknown-start-tag"}, + +{"description": "allowed start tag <bdo>", +"input": "<bdo>", +"fail-if": "unknown-start-tag"} + +]} diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/style-scoped-attribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/style-scoped-attribute.test new file mode 100755 index 000000000..f47795a21 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/style-scoped-attribute.test @@ -0,0 +1,7 @@ +{"tests": [ + +{"description": "invalid style scoped attribute value 'inherit'", +"input": "<style scoped=inherit>", +"fail-unless": "invalid-boolean-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/tabindexattribute.test b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/tabindexattribute.test new file mode 100755 index 000000000..02066957b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/testdata/validator/tabindexattribute.test @@ -0,0 +1,79 @@ +{"tests": [ + +{"description": "valid tabindex attribute value '-1'", +"input": "<span tabindex=-1>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value '0'", +"input": "<span tabindex=0>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value '1'", +"input": "<span tabindex=1>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value '32768'", +"input": "<span tabindex=32768>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value '-32768'", +"input": "<span tabindex=-32768>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with leading spaces", +"input": "<span tabindex=' -32768'>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with trailing spaces", +"input": "<span tabindex='-32768 '>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with trailing junk", +"input": "<span tabindex='32768a'>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with trailing junk and whitespace", +"input": "<span tabindex='32768a '>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with trailing whitespace and junk", +"input": "<span tabindex='32768 a'>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with leading spaces", +"input": "<span tabindex=' 32768'>", +"fail-if": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with leading spaces (with sign)", +"input": "<span tabindex=' -32768'>", +"fail-if": "invalid-integer-value"}, + +{"description": "invalid tabindex attribute value (blank)", +"input": "<span tabindex>", +"fail-unless": "attribute-value-can-not-be-blank"}, + +{"description": "invalid tabindex attribute value due to leading junk", +"input": "<span tabindex=a1>", +"fail-unless": "invalid-integer-value"}, + +{"description": "invalid tabindex attribute value due to two hyphens", +"input": "<span tabindex=--1>", +"fail-unless": "invalid-integer-value"}, + +{"description": "invalid tabindex attribute value due to non-numeric", +"input": "<span tabindex=foo>", +"fail-unless": "invalid-integer-value"}, + +{"description": "invalid tabindex attribute value due to positive sign", +"input": "<span tabindex=+1>", +"fail-unless": "invalid-integer-value"}, + +{"description": "invalid tabindex attribute value due to decimal point", +"input": "<span tabindex=.1>", +"fail-unless": "invalid-integer-value"}, + +{"description": "valid tabindex attribute value with trailing decimal point", +"input": "<span tabindex=1.0>", +"fail-if": "invalid-integer-value"} + +]}
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/tokenizertotree.py b/testing/web-platform/tests/tools/html5lib/html5lib/tests/tokenizertotree.py new file mode 100644 index 000000000..b841c76ce --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/tokenizertotree.py @@ -0,0 +1,68 @@ +from __future__ import absolute_import, division, unicode_literals + +import sys +import os +import json +import re + +import html5lib +from . import support +from . import test_tokenizer + +p = html5lib.HTMLParser() + +unnamespaceExpected = re.compile(r"^(\|\s*)<html ([^>]+)>", re.M).sub + + +def main(out_path): + if not os.path.exists(out_path): + sys.stderr.write("Path %s does not exist" % out_path) + sys.exit(1) + + for filename in support.get_data_files('tokenizer', '*.test'): + run_file(filename, out_path) + + +def run_file(filename, out_path): + try: + tests_data = json.load(open(filename, "r")) + except ValueError: + sys.stderr.write("Failed to load %s\n" % filename) + return + name = os.path.splitext(os.path.split(filename)[1])[0] + output_file = open(os.path.join(out_path, "tokenizer_%s.dat" % name), "w") + + if 'tests' in tests_data: + for test_data in tests_data['tests']: + if 'initialStates' not in test_data: + test_data["initialStates"] = ["Data state"] + + for initial_state in test_data["initialStates"]: + if initial_state != "Data state": + # don't support this yet + continue + test = make_test(test_data) + output_file.write(test) + + output_file.close() + + +def make_test(test_data): + if 'doubleEscaped' in test_data: + test_data = test_tokenizer.unescape_test(test_data) + + rv = [] + rv.append("#data") + rv.append(test_data["input"].encode("utf8")) + rv.append("#errors") + tree = p.parse(test_data["input"]) + output = p.tree.testSerializer(tree) + output = "\n".join(("| " + line[3:]) if line.startswith("| ") else line + for line in output.split("\n")) + output = unnamespaceExpected(r"\1<\2>", output) + rv.append(output.encode("utf8")) + rv.append("") + return "\n".join(rv) + +if __name__ == "__main__": + main(sys.argv[1]) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/us-ascii.html b/testing/web-platform/tests/tools/html5lib/html5lib/tests/us-ascii.html new file mode 100644 index 000000000..728cb6baf --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/us-ascii.html @@ -0,0 +1,3 @@ +<!doctype html>
+<title>Test</title>
+<p>Hello World!
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tests/utf-8-bom.html b/testing/web-platform/tests/tools/html5lib/html5lib/tests/utf-8-bom.html new file mode 100644 index 000000000..6ac5efced --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tests/utf-8-bom.html @@ -0,0 +1,3 @@ +<!doctype html>
+<title>Test</title>
+<p>Hello World! ©
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/tokenizer.py b/testing/web-platform/tests/tools/html5lib/html5lib/tokenizer.py new file mode 100644 index 000000000..797745787 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/tokenizer.py @@ -0,0 +1,1731 @@ +from __future__ import absolute_import, division, unicode_literals + +try: + chr = unichr # flake8: noqa +except NameError: + pass + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from .inputstream import HTMLInputStream + +from .trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, encoding=None, parseMeta=True, useChardet=True, + lowercaseElementName=True, lowercaseAttrName=True, parser=None): + + self.stream = HTMLInputStream(stream, encoding, parseMeta, useChardet) + self.parser = parser + + # Perform case conversions? + self.lowercaseElementName = lowercaseElementName + self.lowercaseAttrName = lowercaseAttrName + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") + or (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + if self.lowercaseElementName: + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + if self.lowercaseAttrName: + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, value in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for i in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treeadapters/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/treeadapters/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treeadapters/__init__.py diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treeadapters/sax.py b/testing/web-platform/tests/tools/html5lib/html5lib/treeadapters/sax.py new file mode 100644 index 000000000..ad47df956 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treeadapters/sax.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.sax.xmlreader import AttributesNSImpl + +from ..constants import adjustForeignAttributes, unadjustForeignAttributes + +prefix_mapping = {} +for prefix, localName, namespace in adjustForeignAttributes.values(): + if prefix is not None: + prefix_mapping[prefix] = namespace + + +def to_sax(walker, handler): + """Call SAX-like content handler based on treewalker walker""" + handler.startDocument() + for prefix, namespace in prefix_mapping.items(): + handler.startPrefixMapping(prefix, namespace) + + for token in walker: + type = token["type"] + if type == "Doctype": + continue + elif type in ("StartTag", "EmptyTag"): + attrs = AttributesNSImpl(token["data"], + unadjustForeignAttributes) + handler.startElementNS((token["namespace"], token["name"]), + token["name"], + attrs) + if type == "EmptyTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type == "EndTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type in ("Characters", "SpaceCharacters"): + handler.characters(token["data"]) + elif type == "Comment": + pass + else: + assert False, "Unknown token type" + + for prefix, namespace in prefix_mapping.items(): + handler.endPrefixMapping(prefix) + handler.endDocument() diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/__init__.py new file mode 100644 index 000000000..6a6b2a4c4 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/__init__.py @@ -0,0 +1,76 @@ +"""A collection of modules for building different kinds of tree from +HTML documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1) A set of classes for various types of elements: Document, Doctype, +Comment, Element. These must implement the interface of +_base.treebuilders.Node (although comment nodes have a different +signature for their constructor, see treebuilders.etree.Comment) +Textual content may also be implemented as another node type, or not, as +your tree implementation requires. + +2) A treebuilder object (called TreeBuilder by convention) that +inherits from treebuilders._base.TreeBuilder. This has 4 required attributes: +documentClass - the class to use for the bottommost node of a document +elementClass - the class to use for HTML Elements +commentClass - the class to use for comments +doctypeClass - the class to use for doctypes +It also has one required method: +getDocument - Returns the root node of the complete document tree + +3) If you wish to run the unit tests, you must also create a +testSerializer method on your treebuilder which accepts a node and +returns a string containing Node and its children serialized according +to the format used in the unittests +""" + +from __future__ import absolute_import, division, unicode_literals + +from ..utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of tree with built-in support + + treeType - the name of the tree type required (case-insensitive). Supported + values are: + + "dom" - A generic builder for DOM implementations, defaulting to + a xml.dom.minidom based implementation. + "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to + xml.etree.cElementTree if available and + xml.etree.ElementTree if not. + "lxml" - A etree-based builder for lxml.etree, handling + limitations of lxml's implementation. + + implementation - (Currently applies to the "etree" and "dom" tree types). A + module implementing the tree type e.g. + xml.etree.ElementTree or xml.etree.cElementTree.""" + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/_base.py b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/_base.py new file mode 100644 index 000000000..8b97cc11a --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/_base.py @@ -0,0 +1,377 @@ +from __future__ import absolute_import, division, unicode_literals +from six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + def __init__(self, name): + """Node representing an item in the tree. + name - The tag name associated with the node + parent - The parent of the current node (or None for the document node) + value - The value of the current node (applies to text nodes and + comments + attributes - a dict holding name, value pairs for attributes of the node + childNodes - a list of child nodes of the current node. This must + include all elements but not necessarily other node types + _flags - A list of miscellaneous flags that can be set on the node + """ + self.name = name + self.parent = None + self.value = None + self.attributes = {} + self.childNodes = [] + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node""" + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + documentClass - the class to use for the bottommost node of a document + elementClass - the class to use for HTML Elements + commentClass - the class to use for comments + doctypeClass - the class to use for doctypes + """ + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if (node.name == target and not exactNode or + node == target and exactNode): + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) + and name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + "Return the final tree" + return self.document + + def getFragment(self): + "Return the final fragment" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + node - the node from which to start serializing""" + raise NotImplementedError diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/dom.py b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/dom.py new file mode 100644 index 000000000..234233b79 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/dom.py @@ -0,0 +1,227 @@ +from __future__ import absolute_import, division, unicode_literals + + +from xml.dom import minidom, Node +import weakref + +from . import _base +from .. import constants +from ..constants import namespaces +from ..utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(object): + def __init__(self, element): + self.element = element + + def __iter__(self): + return list(self.element.attributes.items()).__iter__() + + def __setitem__(self, name, value): + self.element.setAttribute(name, value) + + def __len__(self): + return len(list(self.element.attributes.items())) + + def items(self): + return [(item[0], item[1]) for item in + list(self.element.attributes.items())] + + def keys(self): + return list(self.element.attributes.keys()) + + def __getitem__(self, name): + return self.element.getAttribute(name) + + def __contains__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.hasAttribute(name) + + class NodeBuilder(_base.Node): + def __init__(self, element): + _base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") + and self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(_base.TreeBuilder): + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return _base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + _base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + if Node.TEXT_NODE not in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/etree.py b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/etree.py new file mode 100644 index 000000000..2c8ed19f8 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/etree.py @@ -0,0 +1,337 @@ +from __future__ import absolute_import, division, unicode_literals +from six import text_type + +import re + +from . import _base +from .. import ihatexml +from .. import constants +from ..constants import namespaces +from ..utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(_base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + _base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + filter = ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(_base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return _base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/etree_lxml.py b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 000000000..35d08efaa --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,369 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals + +import warnings +import re +import sys + +from . import _base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + finalText = None + infosetFilter = ihatexml.InfosetFilter() + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info.major == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + if finalText is not None: + rv.append("|%s\"%s\"" % (' ' * 2, finalText)) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + finalText = None + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + if finalText is not None: + rv.append("%s\"" % (' ' * 2, finalText)) + + return "".join(rv) + + +class TreeBuilder(_base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = ihatexml.InfosetFilter() + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value={}): + self._element = element + dict.__init__(self, value) + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = builder.Comment + # self.fragmentClass = builder.DocumentFragment + _base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + _base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + """Create the document root""" + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our iniial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + root.addprevious(etree.Comment(comment_token["data"])) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/__init__.py new file mode 100644 index 000000000..18124e75f --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/__init__.py @@ -0,0 +1,57 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +import sys + +from ..utils import default_etree + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + treeType - the name of the tree type required (case-insensitive). Supported + values are: + + "dom" - The xml.dom.minidom DOM implementation + "pulldom" - The xml.dom.pulldom event stream + "etree" - A generic walker for tree implementations exposing an + elementtree-like interface (known to work with + ElementTree, cElementTree and lxml.etree). + "lxml" - Optimized walker for lxml.etree + "genshi" - a Genshi stream + + implementation - (Currently applies to the "etree" tree type only). A module + implementing the tree type e.g. xml.etree.ElementTree or + cElementTree.""" + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType in ("dom", "pulldom"): + name = "%s.%s" % (__name__, treeType) + __import__(name) + mod = sys.modules[name] + treeWalkerCache[treeType] = mod.TreeWalker + elif treeType == "genshi": + from . import genshistream + treeWalkerCache[treeType] = genshistream.TreeWalker + elif treeType == "lxml": + from . import lxmletree + treeWalkerCache[treeType] = lxmletree.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/_base.py b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/_base.py new file mode 100644 index 000000000..34252e50c --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/_base.py @@ -0,0 +1,200 @@ +from __future__ import absolute_import, division, unicode_literals +from six import text_type, string_types + +import gettext +_ = gettext.gettext + +from xml.dom import Node + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + +from ..constants import voidElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +def to_text(s, blank_if_none=True): + """Wrapper around six.text_type to convert None to empty string""" + if s is None: + if blank_if_none: + return "" + else: + return None + elif isinstance(s, text_type): + return s + else: + return text_type(s) + + +def is_text_or_none(string): + """Wrapper around isinstance(string_types) or is None""" + return string is None or isinstance(string, string_types) + + +class TreeWalker(object): + def __init__(self, tree): + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + assert namespace is None or isinstance(namespace, string_types), type(namespace) + assert isinstance(name, string_types), type(name) + assert all((namespace is None or isinstance(namespace, string_types)) and + isinstance(name, string_types) and + isinstance(value, string_types) + for (namespace, name), value in attrs.items()) + + yield {"type": "EmptyTag", "name": to_text(name, False), + "namespace": to_text(namespace), + "data": attrs} + if hasChildren: + yield self.error(_("Void element has children")) + + def startTag(self, namespace, name, attrs): + assert namespace is None or isinstance(namespace, string_types), type(namespace) + assert isinstance(name, string_types), type(name) + assert all((namespace is None or isinstance(namespace, string_types)) and + isinstance(name, string_types) and + isinstance(value, string_types) + for (namespace, name), value in attrs.items()) + + return {"type": "StartTag", + "name": text_type(name), + "namespace": to_text(namespace), + "data": dict(((to_text(namespace, False), to_text(name)), + to_text(value, False)) + for (namespace, name), value in attrs.items())} + + def endTag(self, namespace, name): + assert namespace is None or isinstance(namespace, string_types), type(namespace) + assert isinstance(name, string_types), type(namespace) + + return {"type": "EndTag", + "name": to_text(name, False), + "namespace": to_text(namespace), + "data": {}} + + def text(self, data): + assert isinstance(data, string_types), type(data) + + data = to_text(data) + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + assert isinstance(data, string_types), type(data) + + return {"type": "Comment", "data": text_type(data)} + + def doctype(self, name, publicId=None, systemId=None, correct=True): + assert is_text_or_none(name), type(name) + assert is_text_or_none(publicId), type(publicId) + assert is_text_or_none(systemId), type(systemId) + + return {"type": "Doctype", + "name": to_text(name), + "publicId": to_text(publicId), + "systemId": to_text(systemId), + "correct": to_text(correct)} + + def entity(self, name): + assert isinstance(name, string_types), type(name) + + return {"type": "Entity", "name": text_type(name)} + + def unknown(self, nodeType): + return self.error(_("Unknown node type: ") + nodeType) + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/dom.py b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/dom.py new file mode 100644 index 000000000..a01287a94 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/dom.py @@ -0,0 +1,46 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +import gettext +_ = gettext.gettext + +from . import _base + + +class TreeWalker(_base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return _base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return _base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (_base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return _base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (_base.DOCUMENT,) + + else: + return _base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/etree.py b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/etree.py new file mode 100644 index 000000000..fd8a9cc9b --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/etree.py @@ -0,0 +1,138 @@ +from __future__ import absolute_import, division, unicode_literals + +try: + from collections import OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict + except ImportError: + OrderedDict = dict +import gettext +_ = gettext.gettext + +import re + +from six import text_type + +from . import _base +from ..utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(_base.NonRecursiveTreeWalker): + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, key, parents, flag = node + if flag in ("text", "tail"): + return _base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (_base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (_base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return _base.COMMENT, node.text + + else: + assert type(node.tag) == text_type, type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = OrderedDict() + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (_base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/genshistream.py b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/genshistream.py new file mode 100644 index 000000000..f559c45d0 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/genshistream.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import _base + +from ..constants import voidElements, namespaces + + +class TreeWalker(_base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, pos = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END + or next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/lxmletree.py b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/lxmletree.py new file mode 100644 index 000000000..bc934ac05 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/lxmletree.py @@ -0,0 +1,204 @@ +from __future__ import absolute_import, division, unicode_literals +from six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from gettext import gettext +_ = gettext + +from . import _base + +from .. import ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("utf-8", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + root = et.getroot() + node = root + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(_base.NonRecursiveTreeWalker): + def __init__(self, tree): + if hasattr(tree, "getroot"): + tree = Root(tree) + elif isinstance(tree, list): + tree = FragmentRoot(tree) + _base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key + return _base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (_base.DOCUMENT,) + + elif isinstance(node, Doctype): + return _base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): + return _base.TEXT, node.obj + + elif node.tag == etree.Comment: + return _base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return _base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (_base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), _("Text nodes have no children") + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), _("Text nodes are text or tail, found %s") % key + if key == "text": + return node + # else: fallback to "normal" processing + + return node.getparent() diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/pulldom.py b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/pulldom.py new file mode 100644 index 000000000..0b0f515fe --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/treewalkers/pulldom.py @@ -0,0 +1,63 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom.pulldom import START_ELEMENT, END_ELEMENT, \ + COMMENT, IGNORABLE_WHITESPACE, CHARACTERS + +from . import _base + +from ..constants import voidElements + + +class TreeWalker(_base.TreeWalker): + def __iter__(self): + ignore_until = None + previous = None + for event in self.tree: + if previous is not None and \ + (ignore_until is None or previous[1] is ignore_until): + if previous[1] is ignore_until: + ignore_until = None + for token in self.tokens(previous, event): + yield token + if token["type"] == "EmptyTag": + ignore_until = previous[1] + previous = event + if ignore_until is None or previous[1] is ignore_until: + for token in self.tokens(previous, None): + yield token + elif ignore_until is not None: + raise ValueError("Illformed DOM event stream: void element without END_ELEMENT") + + def tokens(self, event, next): + type, node = event + if type == START_ELEMENT: + name = node.nodeName + namespace = node.namespaceURI + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + attrs[(attr.namespaceURI, attr.localName)] = attr.value + if name in voidElements: + for token in self.emptyTag(namespace, + name, + attrs, + not next or next[1] is not node): + yield token + else: + yield self.startTag(namespace, name, attrs) + + elif type == END_ELEMENT: + name = node.nodeName + namespace = node.namespaceURI + if name not in voidElements: + yield self.endTag(namespace, name) + + elif type == COMMENT: + yield self.comment(node.nodeValue) + + elif type in (IGNORABLE_WHITESPACE, CHARACTERS): + for token in self.text(node.nodeValue): + yield token + + else: + yield self.unknown(type) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/trie/__init__.py b/testing/web-platform/tests/tools/html5lib/html5lib/trie/__init__.py new file mode 100644 index 000000000..a8cca8a9a --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/trie/__init__.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/trie/_base.py b/testing/web-platform/tests/tools/html5lib/html5lib/trie/_base.py new file mode 100644 index 000000000..724486b16 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/trie/_base.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + keys = super().keys() + + if prefix is None: + return set(keys) + + # Python 2.6: no set comprehensions + return set([x for x in keys if x.startswith(prefix)]) + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/trie/datrie.py b/testing/web-platform/tests/tools/html5lib/html5lib/trie/datrie.py new file mode 100644 index 000000000..51f3d046a --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/trie/py.py b/testing/web-platform/tests/tools/html5lib/html5lib/trie/py.py new file mode 100644 index 000000000..c2ba3da75 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/testing/web-platform/tests/tools/html5lib/html5lib/utils.py b/testing/web-platform/tests/tools/html5lib/html5lib/utils.py new file mode 100644 index 000000000..2f41f4dfa --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/html5lib/utils.py @@ -0,0 +1,82 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory"] + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if type(name) in (list, tuple, frozenset, set): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to dal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + if name in moduleCache: + return moduleCache[name] + else: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + moduleCache[name] = mod + return mod + + return moduleFactory diff --git a/testing/web-platform/tests/tools/html5lib/parse.py b/testing/web-platform/tests/tools/html5lib/parse.py new file mode 100755 index 000000000..9cbf3b8d1 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/parse.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python +"""usage: %prog [options] filename + +Parse a document to a tree, with optional profiling +""" + +import sys +import os +import traceback +from optparse import OptionParser + +from html5lib import html5parser, sanitizer +from html5lib.tokenizer import HTMLTokenizer +from html5lib import treebuilders, serializer, treewalkers +from html5lib import constants + +def parse(): + optParser = getOptParser() + opts,args = optParser.parse_args() + encoding = "utf8" + + try: + f = args[-1] + # Try opening from the internet + if f.startswith('http://'): + try: + import urllib.request, urllib.parse, urllib.error, cgi + f = urllib.request.urlopen(f) + contentType = f.headers.get('content-type') + if contentType: + (mediaType, params) = cgi.parse_header(contentType) + encoding = params.get('charset') + except: + pass + elif f == '-': + f = sys.stdin + if sys.version_info[0] >= 3: + encoding = None + else: + try: + # Try opening from file system + f = open(f, "rb") + except IOError as e: + sys.stderr.write("Unable to open file: %s\n" % e) + sys.exit(1) + except IndexError: + sys.stderr.write("No filename provided. Use -h for help\n") + sys.exit(1) + + treebuilder = treebuilders.getTreeBuilder(opts.treebuilder) + + if opts.sanitize: + tokenizer = sanitizer.HTMLSanitizer + else: + tokenizer = HTMLTokenizer + + p = html5parser.HTMLParser(tree=treebuilder, tokenizer=tokenizer, debug=opts.log) + + if opts.fragment: + parseMethod = p.parseFragment + else: + parseMethod = p.parse + + if opts.profile: + import cProfile + import pstats + cProfile.runctx("run(parseMethod, f, encoding)", None, + {"run": run, + "parseMethod": parseMethod, + "f": f, + "encoding": encoding}, + "stats.prof") + # XXX - We should use a temp file here + stats = pstats.Stats('stats.prof') + stats.strip_dirs() + stats.sort_stats('time') + stats.print_stats() + elif opts.time: + import time + t0 = time.time() + document = run(parseMethod, f, encoding) + t1 = time.time() + if document: + printOutput(p, document, opts) + t2 = time.time() + sys.stderr.write("\n\nRun took: %fs (plus %fs to print the output)"%(t1-t0, t2-t1)) + else: + sys.stderr.write("\n\nRun took: %fs"%(t1-t0)) + else: + document = run(parseMethod, f, encoding) + if document: + printOutput(p, document, opts) + +def run(parseMethod, f, encoding): + try: + document = parseMethod(f, encoding=encoding) + except: + document = None + traceback.print_exc() + return document + +def printOutput(parser, document, opts): + if opts.encoding: + print("Encoding:", parser.tokenizer.stream.charEncoding) + + for item in parser.log: + print(item) + + if document is not None: + if opts.xml: + sys.stdout.write(document.toxml("utf-8")) + elif opts.tree: + if not hasattr(document,'__getitem__'): + document = [document] + for fragment in document: + print(parser.tree.testSerializer(fragment)) + elif opts.hilite: + sys.stdout.write(document.hilite("utf-8")) + elif opts.html: + kwargs = {} + for opt in serializer.HTMLSerializer.options: + try: + kwargs[opt] = getattr(opts,opt) + except: + pass + if not kwargs['quote_char']: + del kwargs['quote_char'] + + tokens = treewalkers.getTreeWalker(opts.treebuilder)(document) + if sys.version_info[0] >= 3: + encoding = None + else: + encoding = "utf-8" + for text in serializer.HTMLSerializer(**kwargs).serialize(tokens, encoding=encoding): + sys.stdout.write(text) + if not text.endswith('\n'): sys.stdout.write('\n') + if opts.error: + errList=[] + for pos, errorcode, datavars in parser.errors: + errList.append("Line %i Col %i"%pos + " " + constants.E.get(errorcode, 'Unknown error "%s"' % errorcode) % datavars) + sys.stdout.write("\nParse errors:\n" + "\n".join(errList)+"\n") + +def getOptParser(): + parser = OptionParser(usage=__doc__) + + parser.add_option("-p", "--profile", action="store_true", default=False, + dest="profile", help="Use the hotshot profiler to " + "produce a detailed log of the run") + + parser.add_option("-t", "--time", + action="store_true", default=False, dest="time", + help="Time the run using time.time (may not be accurate on all platforms, especially for short runs)") + + parser.add_option("-b", "--treebuilder", action="store", type="string", + dest="treebuilder", default="simpleTree") + + parser.add_option("-e", "--error", action="store_true", default=False, + dest="error", help="Print a list of parse errors") + + parser.add_option("-f", "--fragment", action="store_true", default=False, + dest="fragment", help="Parse as a fragment") + + parser.add_option("", "--tree", action="store_true", default=False, + dest="tree", help="Output as debug tree") + + parser.add_option("-x", "--xml", action="store_true", default=False, + dest="xml", help="Output as xml") + + parser.add_option("", "--no-html", action="store_false", default=True, + dest="html", help="Don't output html") + + parser.add_option("", "--hilite", action="store_true", default=False, + dest="hilite", help="Output as formatted highlighted code.") + + parser.add_option("-c", "--encoding", action="store_true", default=False, + dest="encoding", help="Print character encoding used") + + parser.add_option("", "--inject-meta-charset", action="store_true", + default=False, dest="inject_meta_charset", + help="inject <meta charset>") + + parser.add_option("", "--strip-whitespace", action="store_true", + default=False, dest="strip_whitespace", + help="strip whitespace") + + parser.add_option("", "--omit-optional-tags", action="store_true", + default=False, dest="omit_optional_tags", + help="omit optional tags") + + parser.add_option("", "--quote-attr-values", action="store_true", + default=False, dest="quote_attr_values", + help="quote attribute values") + + parser.add_option("", "--use-best-quote-char", action="store_true", + default=False, dest="use_best_quote_char", + help="use best quote character") + + parser.add_option("", "--quote-char", action="store", + default=None, dest="quote_char", + help="quote character") + + parser.add_option("", "--no-minimize-boolean-attributes", + action="store_false", default=True, + dest="minimize_boolean_attributes", + help="minimize boolean attributes") + + parser.add_option("", "--use-trailing-solidus", action="store_true", + default=False, dest="use_trailing_solidus", + help="use trailing solidus") + + parser.add_option("", "--space-before-trailing-solidus", + action="store_true", default=False, + dest="space_before_trailing_solidus", + help="add space before trailing solidus") + + parser.add_option("", "--escape-lt-in-attrs", action="store_true", + default=False, dest="escape_lt_in_attrs", + help="escape less than signs in attribute values") + + parser.add_option("", "--escape-rcdata", action="store_true", + default=False, dest="escape_rcdata", + help="escape rcdata element values") + + parser.add_option("", "--sanitize", action="store_true", default=False, + dest="sanitize", help="sanitize") + + parser.add_option("-l", "--log", action="store_true", default=False, + dest="log", help="log state transitions") + + return parser + +if __name__ == "__main__": + parse() diff --git a/testing/web-platform/tests/tools/html5lib/requirements-install.sh b/testing/web-platform/tests/tools/html5lib/requirements-install.sh new file mode 100755 index 000000000..5f8ba5064 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/requirements-install.sh @@ -0,0 +1,16 @@ +#!/bin/bash -e + +if [[ $USE_OPTIONAL != "true" && $USE_OPTIONAL != "false" ]]; then + echo "fatal: \$USE_OPTIONAL not set to true or false. Exiting." + exit 1 +fi + +pip install -r requirements-test.txt + +if [[ $USE_OPTIONAL == "true" && $TRAVIS_PYTHON_VERSION != "pypy" ]]; then + if [[ $TRAVIS_PYTHON_VERSION == "2.6" ]]; then + pip install --allow-external Genshi --allow-insecure Genshi -r requirements-optional-2.6.txt + else + pip install --allow-external Genshi --allow-insecure Genshi -r requirements-optional-cpython.txt + fi +fi diff --git a/testing/web-platform/tests/tools/html5lib/requirements-optional-2.6.txt b/testing/web-platform/tests/tools/html5lib/requirements-optional-2.6.txt new file mode 100644 index 000000000..37557ac40 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/requirements-optional-2.6.txt @@ -0,0 +1,5 @@ +-r requirements-optional-cpython.txt + +# Can be used to force attributes to be serialized in alphabetical +# order. +ordereddict diff --git a/testing/web-platform/tests/tools/html5lib/requirements-optional-cpython.txt b/testing/web-platform/tests/tools/html5lib/requirements-optional-cpython.txt new file mode 100644 index 000000000..35ed3529c --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/requirements-optional-cpython.txt @@ -0,0 +1,5 @@ +-r requirements-optional.txt + +# lxml is supported with its own treebuilder ("lxml") and otherwise +# uses the standard ElementTree support +lxml diff --git a/testing/web-platform/tests/tools/html5lib/requirements-optional.txt b/testing/web-platform/tests/tools/html5lib/requirements-optional.txt new file mode 100644 index 000000000..c63552701 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/requirements-optional.txt @@ -0,0 +1,13 @@ +-r requirements.txt + +# We support a Genshi treewalker that can be used to serialize Genshi +# streams. +genshi + +# DATrie can be used in place of our Python trie implementation for +# slightly better parsing performance. +datrie + +# charade can be used as a fallback in case we are unable to determine +# the encoding of a document. +charade diff --git a/testing/web-platform/tests/tools/html5lib/requirements-test.txt b/testing/web-platform/tests/tools/html5lib/requirements-test.txt new file mode 100644 index 000000000..d5f8088c1 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/requirements-test.txt @@ -0,0 +1,5 @@ +-r requirements.txt + +flake8 +nose +ordereddict # Python 2.6 diff --git a/testing/web-platform/tests/tools/html5lib/requirements.txt b/testing/web-platform/tests/tools/html5lib/requirements.txt new file mode 100644 index 000000000..ffe2fce49 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/requirements.txt @@ -0,0 +1 @@ +six diff --git a/testing/web-platform/tests/tools/html5lib/setup.py b/testing/web-platform/tests/tools/html5lib/setup.py new file mode 100644 index 000000000..f75910eaf --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/setup.py @@ -0,0 +1,44 @@ +from distutils.core import setup +import os +import codecs + +classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: Text Processing :: Markup :: HTML' + ] + +packages = ['html5lib'] + ['html5lib.'+name + for name in os.listdir(os.path.join('html5lib')) + if os.path.isdir(os.path.join('html5lib', name)) and + not name.startswith('.') and name != 'tests'] + +current_dir = os.path.dirname(__file__) +with codecs.open(os.path.join(current_dir, 'README.rst'), 'r', 'utf8') as readme_file: + with codecs.open(os.path.join(current_dir, 'CHANGES.rst'), 'r', 'utf8') as changes_file: + long_description = readme_file.read() + '\n' + changes_file.read() + +setup(name='html5lib', + version='0.9999-dev', + url='https://github.com/html5lib/html5lib-python', + license="MIT License", + description='HTML parser based on the WHATWG HTML specifcation', + long_description=long_description, + classifiers=classifiers, + maintainer='James Graham', + maintainer_email='james@hoppipolla.co.uk', + packages=packages, + install_requires=[ + 'six', + ], + ) diff --git a/testing/web-platform/tests/tools/html5lib/tox.ini b/testing/web-platform/tests/tools/html5lib/tox.ini new file mode 100644 index 000000000..479f9e1f7 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/tox.ini @@ -0,0 +1,30 @@ +[tox] +envlist = py26,py27,py32,py33,py34,pypy + +[testenv] +deps = + -r{toxinidir}/requirements-optional-cpython.txt + flake8 + nose +commands = + {envbindir}/nosetests -q + {toxinidir}/flake8-run.sh +install_command = + pip install {opts} {packages} + +[testenv:pypy] +# lxml doesn't work and datrie doesn't make sense +# (it's slower than the pure-python version) +deps = + charade + flake8 + Genshi + nose + six + +[testenv:py26] +basepython = python2.6 +deps = + -r{toxinidir}/requirements-optional-2.6.txt + flake8 + nose diff --git a/testing/web-platform/tests/tools/html5lib/utils/entities.py b/testing/web-platform/tests/tools/html5lib/utils/entities.py new file mode 100644 index 000000000..116a27cbc --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/utils/entities.py @@ -0,0 +1,88 @@ +import json + +import html5lib + +def parse(path="html5ents.xml"): + return html5lib.parse(open(path), treebuilder="lxml") + +def entity_table(tree): + return dict((entity_name("".join(tr[0].xpath(".//text()"))), + entity_characters(tr[1].text)) + for tr in tree.xpath("//h:tbody/h:tr", + namespaces={"h":"http://www.w3.org/1999/xhtml"})) + +def entity_name(inp): + return inp.strip() + +def entity_characters(inp): + return "".join(codepoint_to_character(item) + for item in inp.split() + if item) + +def codepoint_to_character(inp): + return ("\U000"+inp[2:]).decode("unicode-escape") + +def make_tests_json(entities): + test_list = make_test_list(entities) + tests_json = {"tests": + [make_test(*item) for item in test_list] + } + return tests_json + +def make_test(name, characters, good): + return { + "description":test_description(name, good), + "input":"&%s"%name, + "output":test_expected(name, characters, good) + } + +def test_description(name, good): + with_semicolon = name.endswith(";") + semicolon_text = {True:"with a semi-colon", + False:"without a semi-colon"}[with_semicolon] + if good: + text = "Named entity: %s %s"%(name, semicolon_text) + else: + text = "Bad named entity: %s %s"%(name, semicolon_text) + return text + +def test_expected(name, characters, good): + rv = [] + if not good or not name.endswith(";"): + rv.append("ParseError") + rv.append(["Character", characters]) + return rv + +def make_test_list(entities): + tests = [] + for entity_name, characters in entities.items(): + if entity_name.endswith(";") and not subentity_exists(entity_name, entities): + tests.append((entity_name[:-1], "&" + entity_name[:-1], False)) + tests.append((entity_name, characters, True)) + return sorted(tests) + +def subentity_exists(entity_name, entities): + for i in range(1, len(entity_name)): + if entity_name[:-i] in entities: + return True + return False + +def make_entities_code(entities): + entities_text = "\n".join(" \"%s\": u\"%s\","%( + name, entities[name].encode( + "unicode-escape").replace("\"", "\\\"")) + for name in sorted(entities.keys())) + return """entities = { +%s +}"""%entities_text + +def main(): + entities = entity_table(parse()) + tests_json = make_tests_json(entities) + json.dump(tests_json, open("namedEntities.test", "w"), indent=4) + code = make_entities_code(entities) + open("entities_constants.py", "w").write(code) + +if __name__ == "__main__": + main() + diff --git a/testing/web-platform/tests/tools/html5lib/utils/iana_parse.py b/testing/web-platform/tests/tools/html5lib/utils/iana_parse.py new file mode 100644 index 000000000..6dde94c28 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/utils/iana_parse.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +import sys +import urllib.request, urllib.error, urllib.parse +import codecs + +def main(): + encodings = [] + f = urllib.request.urlopen(sys.argv[1]) + for line in f: + if line.startswith("Name: ") or line.startswith("Alias: "): + enc = line.split()[1] + try: + codecs.lookup(enc) + if enc.lower not in encodings: + encodings.append(enc.lower()) + except LookupError: + pass + sys.stdout.write("encodings = frozenset((\n") + for enc in encodings: + sys.stdout.write(' "%s",\n'%enc) + sys.stdout.write(' ))') + +if __name__ == "__main__": + main()
\ No newline at end of file diff --git a/testing/web-platform/tests/tools/html5lib/utils/spider.py b/testing/web-platform/tests/tools/html5lib/utils/spider.py new file mode 100644 index 000000000..a7b803197 --- /dev/null +++ b/testing/web-platform/tests/tools/html5lib/utils/spider.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +"""Spider to try and find bugs in the parser. Requires httplib2 and elementtree + +usage: +import spider +s = spider.Spider() +s.spider("http://www.google.com", maxURLs=100) +""" + +import urllib.request, urllib.error, urllib.parse +import urllib.robotparser +import md5 + +import httplib2 + +import html5lib +from html5lib.treebuilders import etree + +class Spider(object): + def __init__(self): + self.unvisitedURLs = set() + self.visitedURLs = set() + self.buggyURLs=set() + self.robotParser = urllib.robotparser.RobotFileParser() + self.contentDigest = {} + self.http = httplib2.Http(".cache") + + def run(self, initialURL, maxURLs=1000): + urlNumber = 0 + self.visitedURLs.add(initialURL) + content = self.loadURL(initialURL) + while maxURLs is None or urlNumber < maxURLs: + if content is not None: + self.parse(content) + urlNumber += 1 + if not self.unvisitedURLs: + break + content = self.loadURL(self.unvisitedURLs.pop()) + + def parse(self, content): + failed = False + p = html5lib.HTMLParser(tree=etree.TreeBuilder) + try: + tree = p.parse(content) + except: + self.buggyURLs.add(self.currentURL) + failed = True + print("BUGGY:", self.currentURL) + self.visitedURLs.add(self.currentURL) + if not failed: + self.updateURLs(tree) + + def loadURL(self, url): + resp, content = self.http.request(url, "GET") + self.currentURL = url + digest = md5.md5(content).hexdigest() + if digest in self.contentDigest: + content = None + self.visitedURLs.add(url) + else: + self.contentDigest[digest] = url + + if resp['status'] != "200": + content = None + + return content + + def updateURLs(self, tree): + """Take all the links in the current document, extract the URLs and + update the list of visited and unvisited URLs according to whether we + have seen them before or not""" + urls = set() + #Remove all links we have already visited + for link in tree.findall(".//a"): + try: + url = urllib.parse.urldefrag(link.attrib['href'])[0] + if (url and url not in self.unvisitedURLs and url + not in self.visitedURLs): + urls.add(url) + except KeyError: + pass + + #Remove all non-http URLs and a dd a sutiable base URL where that is + #missing + newUrls = set() + for url in urls: + splitURL = list(urllib.parse.urlsplit(url)) + if splitURL[0] != "http": + continue + if splitURL[1] == "": + splitURL[1] = urllib.parse.urlsplit(self.currentURL)[1] + newUrls.add(urllib.parse.urlunsplit(splitURL)) + urls = newUrls + + responseHeaders = {} + #Now we want to find the content types of the links we haven't visited + for url in urls: + try: + resp, content = self.http.request(url, "HEAD") + responseHeaders[url] = resp + except AttributeError as KeyError: + #Don't know why this happens + pass + + + #Remove links not of content-type html or pages not found + #XXX - need to deal with other status codes? + toVisit = set([url for url in urls if url in responseHeaders and + "html" in responseHeaders[url]['content-type'] and + responseHeaders[url]['status'] == "200"]) + + #Now check we are allowed to spider the page + for url in toVisit: + robotURL = list(urllib.parse.urlsplit(url)[:2]) + robotURL.extend(["robots.txt", "", ""]) + robotURL = urllib.parse.urlunsplit(robotURL) + self.robotParser.set_url(robotURL) + if not self.robotParser.can_fetch("*", url): + toVisit.remove(url) + + self.visitedURLs.update(urls) + self.unvisitedURLs.update(toVisit) |