From 1be9532f79fd7744be0945c4ab42d2f5b41e4e73 Mon Sep 17 00:00:00 2001 From: Ritwik Gupta Date: Mon, 24 Nov 2014 16:23:01 -0500 Subject: [PATCH 001/278] Added iframe seamless boolean attribute --- html5lib/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/html5lib/constants.py b/html5lib/constants.py index e7089846..659f2b5e 100644 --- a/html5lib/constants.py +++ b/html5lib/constants.py @@ -535,6 +535,7 @@ "input": frozenset(("disabled", "readonly", "required", "autofocus", "checked", "ismap")), "select": frozenset(("disabled", "readonly", "autofocus", "multiple")), "output": frozenset(("disabled", "readonly")), + "iframe": frozenset(("seamless")), } # entitiesWindows1252 has to be _ordered_ and needs to have an index. It From 4dfe3cd9f97ce51c53463d633308f4a3fe6ad9e6 Mon Sep 17 00:00:00 2001 From: Ritwik Gupta Date: Mon, 24 Nov 2014 16:25:04 -0500 Subject: [PATCH 002/278] Update CHANGES.rst --- CHANGES.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1431b3c9..89e48f94 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,7 +6,7 @@ Change Log Released on XXX, 2014 -* XXX +* Fix #XXX: added the seamless attribute for iframes. 0.999 From 7fd79e31e083ab75305b3e837ea9aa8c9b4675ff Mon Sep 17 00:00:00 2001 From: Ritwik Gupta Date: Mon, 24 Nov 2014 16:25:28 -0500 Subject: [PATCH 003/278] Update AUTHORS.rst --- AUTHORS.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index 4148a6ed..787c3b94 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -32,3 +32,4 @@ Patches and suggestions - Juan Carlos Garcia Segovia - Mike West - Marc DM +- Ritwik Gupta From 6f4a282afff0307b0f2e51f15c4b45f4a7cce45a Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 12 Jan 2016 21:22:50 +0100 Subject: [PATCH 004/278] Remove the mockParser because I have no idea why we have it. --- html5lib/tests/mockParser.py | 41 ------------------------------------ 1 file changed, 41 deletions(-) delete mode 100644 html5lib/tests/mockParser.py diff --git a/html5lib/tests/mockParser.py b/html5lib/tests/mockParser.py deleted file mode 100644 index ef31527e..00000000 --- a/html5lib/tests/mockParser.py +++ /dev/null @@ -1,41 +0,0 @@ -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. - """) From f28c5acb9901d22bed7587aa8d58d76e94965aec Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 12 Jan 2016 21:23:50 +0100 Subject: [PATCH 005/278] We don't need Python performance tests. --- html5lib/tests/performance/concatenation.py | 36 --------------------- 1 file changed, 36 deletions(-) delete mode 100644 html5lib/tests/performance/concatenation.py diff --git a/html5lib/tests/performance/concatenation.py b/html5lib/tests/performance/concatenation.py deleted file mode 100644 index a1465036..00000000 --- a/html5lib/tests/performance/concatenation.py +++ /dev/null @@ -1,36 +0,0 @@ -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)) From 5e90af858c175133c34ee548271bddb3ca5ef245 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 12 Jan 2016 21:29:23 +0100 Subject: [PATCH 006/278] Make pep8 1.7 happy. --- html5lib/html5parser.py | 147 +++++++++++++------------- html5lib/serializer/htmlserializer.py | 4 +- html5lib/tests/test_serializer.py | 3 +- html5lib/tests/test_tokenizer.py | 4 +- html5lib/treebuilders/_base.py | 4 +- html5lib/treebuilders/dom.py | 4 +- html5lib/treewalkers/__init__.py | 4 +- html5lib/treewalkers/_base.py | 6 +- html5lib/treewalkers/genshistream.py | 4 +- 9 files changed, 89 insertions(+), 91 deletions(-) diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index c2c30783..ae980c55 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -204,8 +204,8 @@ def mainLoop(self): elif type == DoctypeToken: new_token = phase.processDoctype(new_token) - if (type == StartTagToken and token["selfClosing"] - and not token["selfClosingAcknowledged"]): + if (type == StartTagToken and token["selfClosing"] and + not token["selfClosingAcknowledged"]): self.parseError("non-void-element-with-trailing-solidus", {"name": token["name"]}) @@ -517,77 +517,76 @@ def processDoctype(self, 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"): + 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 xhtml 1.0 transitional//")) or + publicId.startswith( ("-//w3c//dtd html 4.01 frameset//", "-//w3c//dtd html 4.01 transitional//")) and systemId is not None): @@ -988,8 +987,8 @@ def processSpaceCharactersDropNewline(self, token): 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()): + self.tree.openElements[-1].name in ("pre", "listing", "textarea") and + not self.tree.openElements[-1].hasContent()): data = data[1:] if data: self.tree.reconstructActiveFormattingElements() @@ -1016,8 +1015,8 @@ def startTagProcessInHead(self, 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"): + if (len(self.tree.openElements) == 1 or + self.tree.openElements[1].name != "body"): assert self.parser.innerHTML else: self.parser.framesetOK = False diff --git a/html5lib/serializer/htmlserializer.py b/html5lib/serializer/htmlserializer.py index be4d6344..b87d9a75 100644 --- a/html5lib/serializer/htmlserializer.py +++ b/html5lib/serializer/htmlserializer.py @@ -237,8 +237,8 @@ def serialize(self, treewalker, encoding=None): 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())): + (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 diff --git a/html5lib/tests/test_serializer.py b/html5lib/tests/test_serializer.py index 3c37feff..af76075e 100644 --- a/html5lib/tests/test_serializer.py +++ b/html5lib/tests/test_serializer.py @@ -91,8 +91,7 @@ def runSerializerTest(input, expected, options): encoding = options.get("encoding", None) if encoding: - encode = lambda x: x.encode(encoding) - expected = list(map(encode, expected)) + expected = list(map(lambda x: x.encode(encoding), expected)) result = serialize_html(input, options) if len(expected) == 1: diff --git a/html5lib/tests/test_tokenizer.py b/html5lib/tests/test_tokenizer.py index 823c6ea6..87e098f3 100644 --- a/html5lib/tests/test_tokenizer.py +++ b/html5lib/tests/test_tokenizer.py @@ -98,8 +98,8 @@ def tokensMatch(expectedTokens, receivedTokens, ignoreErrorOrder, """ checkSelfClosing = False for token in expectedTokens: - if (token[0] == "StartTag" and len(token) == 4 - or token[0] == "EndTag" and len(token) == 3): + if (token[0] == "StartTag" and len(token) == 4 or + token[0] == "EndTag" and len(token) == 3): checkSelfClosing = True break diff --git a/html5lib/treebuilders/_base.py b/html5lib/treebuilders/_base.py index 8b97cc11..8196f591 100644 --- a/html5lib/treebuilders/_base.py +++ b/html5lib/treebuilders/_base.py @@ -353,8 +353,8 @@ def getTableMisnestedNodePosition(self): 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): + 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. diff --git a/html5lib/treebuilders/dom.py b/html5lib/treebuilders/dom.py index 234233b7..8656244f 100644 --- a/html5lib/treebuilders/dom.py +++ b/html5lib/treebuilders/dom.py @@ -47,8 +47,8 @@ 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) + namespace = property(lambda self: hasattr(self.element, "namespaceURI") and + self.element.namespaceURI or None) def appendChild(self, node): node.parent = self diff --git a/html5lib/treewalkers/__init__.py b/html5lib/treewalkers/__init__.py index 21f46b01..00ae2804 100644 --- a/html5lib/treewalkers/__init__.py +++ b/html5lib/treewalkers/__init__.py @@ -10,11 +10,11 @@ from __future__ import absolute_import, division, unicode_literals -__all__ = ["getTreeWalker", "pprint", "dom", "etree", "genshistream", "lxmletree"] - from .. import constants from ..utils import default_etree +__all__ = ["getTreeWalker", "pprint", "dom", "etree", "genshistream", "lxmletree"] + treeWalkerCache = {} diff --git a/html5lib/treewalkers/_base.py b/html5lib/treewalkers/_base.py index 4e11cd02..e79a4357 100644 --- a/html5lib/treewalkers/_base.py +++ b/html5lib/treewalkers/_base.py @@ -1,11 +1,12 @@ from __future__ import absolute_import, division, unicode_literals from six import text_type, string_types +from xml.dom import Node +from ..constants import voidElements, spaceCharacters + __all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", "TreeWalker", "NonRecursiveTreeWalker"] -from xml.dom import Node - DOCUMENT = Node.DOCUMENT_NODE DOCTYPE = Node.DOCUMENT_TYPE_NODE TEXT = Node.TEXT_NODE @@ -14,7 +15,6 @@ ENTITY = Node.ENTITY_NODE UNKNOWN = "<#UNKNOWN#>" -from ..constants import voidElements, spaceCharacters spaceCharacters = "".join(spaceCharacters) diff --git a/html5lib/treewalkers/genshistream.py b/html5lib/treewalkers/genshistream.py index f559c45d..24d33282 100644 --- a/html5lib/treewalkers/genshistream.py +++ b/html5lib/treewalkers/genshistream.py @@ -39,8 +39,8 @@ def tokens(self, event, next): 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): + not next or next[0] != END or + next[1] != tag): yield token else: yield self.startTag(namespace, name, converted_attribs) From 85723e2f0f6c6628d8637c7ed03505a4b00ab247 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 5 Jan 2014 00:17:34 +0000 Subject: [PATCH 007/278] Fix #124: Move to webencodings for decoding the input byte stream. --- .pytest.expect | Bin 58861 -> 55230 bytes CHANGES.rst | 4 + html5lib/constants.py | 229 -------------------------------- html5lib/html5parser.py | 2 +- html5lib/inputstream.py | 64 ++++----- html5lib/tests/test_encoding.py | 18 +-- html5lib/tests/test_stream.py | 10 +- requirements.txt | 1 + setup.py | 1 + tox.ini | 2 + utils/iana_parse.py | 24 ---- 11 files changed, 49 insertions(+), 306 deletions(-) delete mode 100644 utils/iana_parse.py diff --git a/.pytest.expect b/.pytest.expect index c88e99b9140f2b24dfcee5e47ea9f9a90794de36..5f3b61942c093094876a3c29dfee8f19f63e6013 100644 GIT binary patch delta 1694 zcmX|BYfw~W7@l+XEV#g4xCjcu!en{bCHDe*&Vt%rR7eR;X2J%66)7`7a8NVTB*${b z7Tx7R$Ap9&P0EyoFGdql$aGSSu(47T+z_X12E?Z9k4}Bx*~Y(T-+jOLxsLTK&b2Fi zvv~dv{M+sR@)by*ERj6!35VqwS%?!Hh$*!5q7~*g5qE_I_+Az9y7C`5+9lE-c0qx_ zdXYSic+9~cBVt0SBGu|k9NtYbHH54Dk5Vw_q7gO4dIVq6qNUG(WmZk6u8YGerxC%; zVHljR!{(`41Y-?m?!%SSQt4;58Ld9bN2G&ok_ zLSTacokJ-v8Y^InqA{Kjhq_%xq#jBn+ot@%p?<&#pGUy_PBl`0i1hcEFwq=|h+j0Q z*{WrT1kq|QmM?3S)Tj%{b2xe2DL*hgEeUlF3GXM5VXVT4_T4G?GvzfhqR-^;FyGbS z6;QG>pX^C1=MWQRL+LZeP*LTAFIzzEq#SIR?!|?4Nny*h;yrUZy;6<9VkPDmdq%hes@LrJ{-jgBh4}wPMUP*vVou1((R{LHKrnNGYcps2Kd4w=zvc4 zi=o7XAx|Wt^4ewNIf|8dn0J&ZNlf_#9A`t{fw|~idKI;%c|f-l0|ON6U=AsIIgNv& z$?(6&!eNRJQJ7qiheLfb2js_sw-s1WOfR92b{C$51C9_uU;x|5-aeK(8i> z41au{2f{?bVwOxWkEF|@onD!UU-f3$O7r5>PpP{0iH*k>o~PK*bSjki@d~+%NdJ+U zlPIYYDLawK(}H8gqeh-L9^(~GjK`|*xV@FOnw`wS{bt9th*wI P6k6WB8YKyis=5CFdz-un delta 2632 zcmY*be^8U>9l!TS!bl_#K#Y+jFzad;0?C`azXF~lp=y;5waPhd6e?5OZY#81udIUs z_KIR_Lq4svT0Cs4_RcZDr>#GVNFBTFY8mXd&N}Tzx81gG)7tgcJEu4Iyl*6V{qMc! z{XXBHpU>y}j16&D&U1--Snlg!8r0sV4QO`+kdWq}&Xiwzw=P)GiAlR;Ns8T>Cg zv1rF!MnvztLX?Yc)*nLP0TuUfQM61&apq(;s+~4$k;-uGgcX0_ikRT6F%yUVBNb)* zS4`;knTrwd=~H3yZPNso_UgeQUzn`RzR9o?nMgqaYj*lHucX^L#h{`qf`*rQ_=`=* z%8Hr-vJjvFx+T2WnT;KxT%4x~ZFQ-4R#BnyoREY~*pN(1F)GL#z-$^HdByb9b;4v(>p637vgDl9}T<}{gXB{zq#Bj2i15wK^H5A5RrYD zF0$ah`On~>wG7j{-1xCMiktJVWJ+47L3-H!E+=Z9Sdm8dM_GE zEa-pOo~+1Ccb<+ej)wgTrWX7U|DIGiSroKUk}a-nhQ52)P#mSvGTp@u_fbP&M%6}# zijwEkPF-wB!55QZvm^%N>DhUhVAAP>KPQ(6rLQsuYe_>-B^RWrw49{{(qgZ?Ux49+ zLY6K(&ZH6HX8c&awFY?s9#e1FkjS&5t}24*r+M=0Me7-pB!rYWBG0L4y8AnLtX$y* zKXu+x;KTS!Ik-M(qqSpTrA&@3ew)S4L4}iOsvUjhNGzX+(YkERccl!%WmkDam8=@V z%t4xcO%6WWRe;Ui0>-yn@r_^VVy*^-_NMF*Nsnee4} zG84ni-!b`+PARfPwwnw#6kdT}#E_^eMA;_FM4HYkUW(X+NDK4-;1gBR0HHf)OiFcU&UaJ5{H&)3-TTx|iyC&FYT_Hv48*2RVR zV4)Y(3u(XCY#gE(#MrW<6z^UPb>*UUJZdrwaUd(Kd-(|G@6ymb6#ROMSRHeklJ zMjNJ2r6gkaK|4BHb1}0$f|(;c23OQ_LBWsC!7!xzKFpwn;_X(lhIFiKWsu)3!uzBH zXDwbdN9LcY52V{qRR+!UrN#LZ|`V$R`JtKRIc_5 z$-NfXdUD`rt=Rm{AX)feff;8{nDFPPXxxYP8L`BPa+()pY13|F(`B7!$G82_aKX(e zI)htwEH|9GSXtEb)%5uDhrgR?C>s(frfTr}M+zu>M0&ebdlgj{4^D2u^OM zas2jT8qXd&{-4lgn*y@i>sDfh!kZ zy;%s)VlNr$`hvljg~~~jorZL1azH+Qwx7pCZK_#R<@m+*2=EoS^@5eydWsnKVm(@Z zv;x1{sO7A1L0Q`lKB^2(a%&Hji^mUyO(9CD+4bS#6slOAuS9Qe1x;KsZRLd7pD*NV z%1-JNe=?R7Ikp5X$zJU2^J09h6Ti)yi|?=UVs(8k>BlIW2Be1)vhj4-9H7w*u|tw3 z+yPYPJ1C4|q`gmMGbnX&68&Eq)l@2r{Oi@Wui=f(AR7$n^E&jpliFr>mbN-#I_>HX zAJ$juUpxhH-Bm_BM^rPu9MT5EqxkLATVQ-C-4nr-o@lySG3dzD&8k$Q=v$zDFlr3p z2lLLX3SY`BRu3=4Y2OdE$s}j!6pM=AdG$3sCsv%2ry>ivF|z6oDV9@@jSKJootK2$ zEWCDNMhCB|Z{P8?^U$BjCdH@P8D5f9i8P+B&oXvLp^t=8M-+$W>(Z2bEsBA2M-5eo zloStCnu3a<=M?RoKl`h}4XX-z=O(kVp**TB4uxEw_=(BjM^^Q2T>c=IIiz2Qd{x+R z{&0H8bTw$I9ftVf+KeG9$w|bpdL56P(Nymf#R_?F@-Y^lY}7RGE({}ztL6Fhc@raz z)5{DPa5J(F;JPO~w^yYm&G`ubrq?h4ngXRTFK8-L>Y#Md9}tB)J1^|h9w{jbulz`6 cbOj#>*s(QKhz2S3av4sV(f525{Dss12No@|LI3~& diff --git a/CHANGES.rst b/CHANGES.rst index 4d0a1996..64162ccf 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -22,6 +22,10 @@ Released on XXX * Move testsuite to ``py.test``. +* Fix #124: move to webencodings for decoding the input byte stream; + this makes html5lib compliant with the Encoding Standard, and + introduces a required dependency on webencodings. + 0.9999999/1.0b8 ~~~~~~~~~~~~~~~ diff --git a/html5lib/constants.py b/html5lib/constants.py index d938e0ae..f6e38cbf 100644 --- a/html5lib/constants.py +++ b/html5lib/constants.py @@ -2846,235 +2846,6 @@ 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, diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index ae980c55..ed44a552 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -139,7 +139,7 @@ def documentEncoding(self): """ if not hasattr(self, 'tokenizer'): return None - return self.tokenizer.stream.charEncoding[0] + return self.tokenizer.stream.charEncoding[0].name def isHTMLIntegrationPoint(self, element): if (element.name == "annotation-xml" and diff --git a/html5lib/inputstream.py b/html5lib/inputstream.py index 63373db9..20f6c95a 100644 --- a/html5lib/inputstream.py +++ b/html5lib/inputstream.py @@ -1,13 +1,15 @@ from __future__ import absolute_import, division, unicode_literals -from six import text_type +from six import text_type, binary_type from six.moves import http_client, urllib import codecs import re +import webencodings + from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase -from .constants import encodings, ReparseException +from .constants import ReparseException from . import utils from io import StringIO @@ -195,7 +197,7 @@ def __init__(self, source): # List of where new lines occur self.newLines = [0] - self.charEncoding = ("utf-8", "certain") + self.charEncoding = (lookupEncoding("utf-8"), "certain") self.dataStream = self.openStream(source) self.reset() @@ -421,7 +423,7 @@ def __init__(self, source, encoding=None, parseMeta=True, chardet=True): HTMLUnicodeInputStream.__init__(self, self.rawStream) - self.charEncoding = (codecName(encoding), "certain") + self.charEncoding = (lookupEncoding(encoding), "certain") # Encoding Information # Number of bytes to use when looking for a meta element with @@ -440,8 +442,7 @@ def __init__(self, source, encoding=None, parseMeta=True, chardet=True): self.reset() def reset(self): - self.dataStream = codecs.getreader(self.charEncoding[0])(self.rawStream, - 'replace') + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') HTMLUnicodeInputStream.reset(self) def openStream(self, source): @@ -491,30 +492,25 @@ def detectEncoding(self, parseMeta=True, chardet=True): buffers.append(buffer) detector.feed(buffer) detector.close() - encoding = detector.result['encoding'] + encoding = lookupEncoding(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()] + encoding = lookupEncoding(self.defaultEncoding) 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" + newEncoding = lookupEncoding(newEncoding) if newEncoding is None: return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None elif newEncoding == self.charEncoding[0]: self.charEncoding = (self.charEncoding[0], "certain") else: @@ -529,8 +525,8 @@ def detectBOM(self): 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' + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' } # Go to beginning of file and read in 4 bytes @@ -550,9 +546,12 @@ def detectBOM(self): # 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 + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None def detectEncodingMeta(self): """Report the encoding declared by the meta element @@ -563,8 +562,8 @@ def detectEncodingMeta(self): self.rawStream.seek(0) encoding = parser.getEncoding() - if encoding in ("utf-16", "utf-16-be", "utf-16-le"): - encoding = "utf-8" + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") return encoding @@ -727,7 +726,7 @@ def handleMeta(self): return False elif attr[0] == b"charset": tentativeEncoding = attr[1] - codec = codecName(tentativeEncoding) + codec = lookupEncoding(tentativeEncoding) if codec is not None: self.encoding = codec return False @@ -735,7 +734,7 @@ def handleMeta(self): contentParser = ContentAttrParser(EncodingBytes(attr[1])) tentativeEncoding = contentParser.parse() if tentativeEncoding is not None: - codec = codecName(tentativeEncoding) + codec = lookupEncoding(tentativeEncoding) if codec is not None: if hasPragma: self.encoding = codec @@ -892,16 +891,19 @@ def parse(self): return None -def codecName(encoding): +def lookupEncoding(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): + if isinstance(encoding, binary_type): try: encoding = encoding.decode("ascii") except UnicodeDecodeError: return None - if encoding: - canonicalName = ascii_punctuation_re.sub("", encoding).lower() - return encodings.get(canonicalName, None) + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None else: return None diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py index d774ce0f..837e989f 100644 --- a/html5lib/tests/test_encoding.py +++ b/html5lib/tests/test_encoding.py @@ -12,20 +12,6 @@ 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 @@ -43,7 +29,7 @@ def runPreScanEncodingTest(data, encoding): if len(data) > stream.numBytesMeta: return - assert encoding == stream.charEncoding[0], errorMessage(data, encoding, stream.charEncoding[0]) + assert encoding == stream.charEncoding[0].name, errorMessage(data, encoding, stream.charEncoding[0].name) def test_encoding(): @@ -64,4 +50,4 @@ def test_encoding(): 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" + assert encoding[0].name == "big5" diff --git a/html5lib/tests/test_stream.py b/html5lib/tests/test_stream.py index 4436ef8a..ed203766 100644 --- a/html5lib/tests/test_stream.py +++ b/html5lib/tests/test_stream.py @@ -86,29 +86,29 @@ class HTMLInputStreamTest(unittest.TestCase): def test_char_ascii(self): stream = HTMLInputStream(b"'", encoding='ascii') - self.assertEqual(stream.charEncoding[0], 'ascii') + self.assertEqual(stream.charEncoding[0].name, 'windows-1252') 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.charEncoding[0].name, '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.charEncoding[0].name, '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.charEncoding[0].name, '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.assertTrue(stream.charEncoding[0].name in ['utf-16le', 'utf-16be'], stream.charEncoding) self.assertEqual(len(stream.charsUntil(' ', True)), 1025) def test_newlines(self): diff --git a/requirements.txt b/requirements.txt index ffe2fce4..15cae9dc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ six +webencodings diff --git a/setup.py b/setup.py index 7b06b45e..187a4169 100644 --- a/setup.py +++ b/setup.py @@ -57,6 +57,7 @@ packages=packages, install_requires=[ 'six', + 'webencodings', ], extras_require={ # A empty extra that only has a conditional marker will be diff --git a/tox.ini b/tox.ini index e66298d5..4a29b553 100644 --- a/tox.ini +++ b/tox.ini @@ -7,6 +7,8 @@ deps = pytest pytest-expect>=1.0,<2.0 mock + base: six + base: webencodings py26-base: ordereddict optional: -r{toxinidir}/requirements-optional.txt diff --git a/utils/iana_parse.py b/utils/iana_parse.py deleted file mode 100644 index 6dde94c2..00000000 --- a/utils/iana_parse.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/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 From f27af7000897cd2e589d07bf0ef0308054cb6024 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Mon, 24 Nov 2014 02:21:01 +0000 Subject: [PATCH 008/278] Get rid of obsolete replacement of unpaired surrogates with U+FFFD. --- .pytest.expect | Bin 55230 -> 55002 bytes html5lib/inputstream.py | 9 +-------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index 5f3b61942c093094876a3c29dfee8f19f63e6013..e818b51683df6a369de1cb6f44e86dbd9bcc9a27 100644 GIT binary patch delta 124 zcmV-?0E7R&uLIhx1CS~K+miucIk9B Date: Wed, 16 Dec 2015 01:30:55 +0000 Subject: [PATCH 009/278] Fix lint to expect text_type everywhere --- html5lib/filters/lint.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index 8884696d..9eee9cc5 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -1,5 +1,7 @@ from __future__ import absolute_import, division, unicode_literals +from six import text_type + from . import _base from ..constants import cdataElements, rcdataElements, voidElements @@ -21,7 +23,7 @@ def __iter__(self): name = token["name"] if contentModelFlag != "PCDATA": raise LintError("StartTag not in PCDATA content model flag: %(tag)s" % {"tag": name}) - if not isinstance(name, str): + if not isinstance(name, text_type): raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) if not name: raise LintError("Empty tag name") @@ -32,11 +34,11 @@ def __iter__(self): if type == "StartTag": open_elements.append(name) for name, value in token["data"]: - if not isinstance(name, str): + if not isinstance(name, text_type): 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): + if not isinstance(value, text_type): raise LintError("Attribute value is not a string: %(value)r" % {"value": value}) if name in cdataElements: contentModelFlag = "CDATA" @@ -47,7 +49,7 @@ def __iter__(self): elif type == "EndTag": name = token["name"] - if not isinstance(name, str): + if not isinstance(name, text_type): raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) if not name: raise LintError("Empty tag name") @@ -64,7 +66,7 @@ def __iter__(self): elif type in ("Characters", "SpaceCharacters"): data = token["data"] - if not isinstance(data, str): + if not isinstance(data, text_type): 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}) @@ -77,7 +79,7 @@ def __iter__(self): name = token["name"] if contentModelFlag != "PCDATA": raise LintError("Doctype not in PCDATA content model flag: %(name)s" % {"name": name}) - if not isinstance(name, str): + if not isinstance(name, text_type): raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) # XXX: what to do with token["data"] ? From fbbea1f614aaf69943c82271a37ec78623c362f7 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 01:34:28 +0000 Subject: [PATCH 010/278] Update lint filter for namespaced attributes --- html5lib/filters/lint.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index 9eee9cc5..74cdc859 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -33,11 +33,15 @@ def __iter__(self): 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, text_type): - raise LintError("Attribute name is not a string: %(name)r" % {"name": name}) - if not name: - raise LintError("Empty attribute name") + for (namespace, localname), value in token["data"].items(): + if namespace is not None and not isinstance(namespace, text_type): + raise LintError("Attribute namespace is not a string or None: %(name)r" % {"name": namespace}) + if namespace == "": + raise LintError("Empty attribute namespace") + if not isinstance(localname, text_type): + raise LintError("Attribute localname is not a string: %(name)r" % {"name": localname}) + if not localname: + raise LintError("Empty attribute localname") if not isinstance(value, text_type): raise LintError("Attribute value is not a string: %(value)r" % {"value": value}) if name in cdataElements: From 8b4d7c45b3715a3ae22ef543ec5cdfe5c742792e Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 01:36:22 +0000 Subject: [PATCH 011/278] Drop the content model requirements from lint --- html5lib/filters/lint.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index 74cdc859..fc7c1ebe 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -3,7 +3,7 @@ from six import text_type from . import _base -from ..constants import cdataElements, rcdataElements, voidElements +from ..constants import voidElements from ..constants import spaceCharacters spaceCharacters = "".join(spaceCharacters) @@ -16,13 +16,10 @@ class LintError(Exception): 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, text_type): raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) if not name: @@ -44,12 +41,6 @@ def __iter__(self): raise LintError("Empty attribute localname") if not isinstance(value, text_type): 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"] @@ -62,11 +53,9 @@ def __iter__(self): 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") + pass elif type in ("Characters", "SpaceCharacters"): data = token["data"] @@ -81,8 +70,6 @@ def __iter__(self): 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, text_type): raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) # XXX: what to do with token["data"] ? From 270a2ca14fafc989f8f1bd4f79db2f4bd9f4d1fc Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:05:55 +0000 Subject: [PATCH 012/278] Don't let the lxml treewalker walk above the fragment root --- html5lib/treewalkers/lxmletree.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/html5lib/treewalkers/lxmletree.py b/html5lib/treewalkers/lxmletree.py index 90e116d3..5c258a86 100644 --- a/html5lib/treewalkers/lxmletree.py +++ b/html5lib/treewalkers/lxmletree.py @@ -118,8 +118,10 @@ def __len__(self): class TreeWalker(_base.NonRecursiveTreeWalker): def __init__(self, tree): if hasattr(tree, "getroot"): + self.fragmentChildren = set() tree = Root(tree) elif isinstance(tree, list): + self.fragmentChildren = set(tree) tree = FragmentRoot(tree) _base.NonRecursiveTreeWalker.__init__(self, tree) self.filter = ihatexml.InfosetFilter() @@ -197,5 +199,7 @@ def getParentNode(self, node): if key == "text": return node # else: fallback to "normal" processing + elif node in self.fragmentChildren: + return None return node.getparent() From 66ef02658ba79d5cffc65d71468da3b3d0b6398e Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:22:22 +0000 Subject: [PATCH 013/278] Teach lint & treewalkers that elements are only void in HTML ns --- html5lib/filters/lint.py | 22 ++++++++++++++++------ html5lib/treewalkers/_base.py | 6 +++--- html5lib/treewalkers/genshistream.py | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index fc7c1ebe..cc3e4ac4 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -3,7 +3,7 @@ from six import text_type from . import _base -from ..constants import voidElements +from ..constants import namespaces, voidElements from ..constants import spaceCharacters spaceCharacters = "".join(spaceCharacters) @@ -19,17 +19,22 @@ def __iter__(self): for token in _base.Filter.__iter__(self): type = token["type"] if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] name = token["name"] + if namespace is not None and not isinstance(namespace, text_type): + raise LintError("Tag namespace is not a string or None: %(name)r" % {"name": namespace}) + if namespace == "": + raise LintError("Empty tag namespace") if not isinstance(name, text_type): 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: + if type == "StartTag" and (not namespace or namespace == namespaces["html"]) and name in voidElements: raise LintError("Void element reported as StartTag token: %(tag)s" % {"tag": name}) - elif type == "EmptyTag" and name not in voidElements: + elif type == "EmptyTag" and (not namespace or namespace == namespaces["html"]) 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) + open_elements.append((namespace, name)) for (namespace, localname), value in token["data"].items(): if namespace is not None and not isinstance(namespace, text_type): raise LintError("Attribute namespace is not a string or None: %(name)r" % {"name": namespace}) @@ -43,15 +48,20 @@ def __iter__(self): raise LintError("Attribute value is not a string: %(value)r" % {"value": value}) elif type == "EndTag": + namespace = token["namespace"] name = token["name"] + if namespace is not None and not isinstance(namespace, text_type): + raise LintError("Tag namespace is not a string or None: %(name)r" % {"name": namespace}) + if namespace == "": + raise LintError("Empty tag namespace") if not isinstance(name, text_type): raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) if not name: raise LintError("Empty tag name") - if name in voidElements: + if (not namespace or namespace == namespaces["html"]) and name in voidElements: raise LintError("Void element reported as EndTag token: %(tag)s" % {"tag": name}) start_name = open_elements.pop() - if start_name != name: + if start_name != (namespace, name): raise LintError("EndTag (%(end)s) does not match StartTag (%(start)s)" % {"end": name, "start": start_name}) elif type == "Comment": diff --git a/html5lib/treewalkers/_base.py b/html5lib/treewalkers/_base.py index e79a4357..271f45a0 100644 --- a/html5lib/treewalkers/_base.py +++ b/html5lib/treewalkers/_base.py @@ -2,7 +2,7 @@ from six import text_type, string_types from xml.dom import Node -from ..constants import voidElements, spaceCharacters +from ..constants import namespaces, voidElements, spaceCharacters __all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", "TreeWalker", "NonRecursiveTreeWalker"] @@ -154,7 +154,7 @@ def __iter__(self): elif type == ELEMENT: namespace, name, attributes, hasChildren = details - if name in voidElements: + if (not namespace or namespace == namespaces["html"]) and name in voidElements: for token in self.emptyTag(namespace, name, attributes, hasChildren): yield token @@ -187,7 +187,7 @@ def __iter__(self): type, details = details[0], details[1:] if type == ELEMENT: namespace, name, attributes, hasChildren = details - if name not in voidElements: + if (namespace and namespace != namespaces["html"]) or name not in voidElements: yield self.endTag(namespace, name) if self.tree is currentNode: currentNode = None diff --git a/html5lib/treewalkers/genshistream.py b/html5lib/treewalkers/genshistream.py index 24d33282..83cd1654 100644 --- a/html5lib/treewalkers/genshistream.py +++ b/html5lib/treewalkers/genshistream.py @@ -48,7 +48,7 @@ def tokens(self, event, next): elif kind == END: name = data.localname namespace = data.namespace - if name not in voidElements: + if namespace != namespaces["html"] or name not in voidElements: yield self.endTag(namespace, name) elif kind == COMMENT: From 5bd341350b22a78295c9b2883b568774d15fadef Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:26:44 +0000 Subject: [PATCH 014/278] Use lint filter to ensure validity of treewalkers --- html5lib/tests/test_treewalkers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index c79d0b1b..04a6cae4 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -14,6 +14,7 @@ from .support import get_data_files, TestData, convertExpected from html5lib import html5parser, treewalkers, treebuilders, treeadapters, constants +from html5lib.filters.lint import Filter as Lint treeTypes = { @@ -91,7 +92,7 @@ def test_all_tokens(self): p = html5parser.HTMLParser(tree=treeCls["builder"]) document = p.parse("a
b
c") document = treeCls.get("adapter", lambda x: x)(document) - output = treeCls["walker"](document) + output = Lint(treeCls["walker"](document)) for expectedToken, outputToken in zip(expected, output): self.assertEqual(expectedToken, outputToken) @@ -111,7 +112,7 @@ def runTreewalkerTest(innerHTML, input, expected, errors, treeClass): document = treeClass.get("adapter", lambda x: x)(document) try: - output = treewalkers.pprint(treeClass["walker"](document)) + output = treewalkers.pprint(Lint(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()], From fb9e1776a565ca157c33e4301891a58dee4337c4 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:27:56 +0000 Subject: [PATCH 015/278] Remove runtime type checks from treewalkers._base --- html5lib/treewalkers/_base.py | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/html5lib/treewalkers/_base.py b/html5lib/treewalkers/_base.py index 271f45a0..dd6823dd 100644 --- a/html5lib/treewalkers/_base.py +++ b/html5lib/treewalkers/_base.py @@ -31,11 +31,6 @@ def to_text(s, blank_if_none=True): 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 @@ -47,13 +42,6 @@ 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} @@ -61,13 +49,6 @@ def emptyTag(self, namespace, name, attrs, hasChildren=False): 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), @@ -76,17 +57,12 @@ def startTag(self, namespace, name, attrs): 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)] @@ -101,15 +77,9 @@ def text(self, data): 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), @@ -117,8 +87,6 @@ def doctype(self, name, publicId=None, systemId=None, correct=True): "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): From 2a5d7af11230225200cdaf101bb36980a8fd3f8e Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:34:39 +0000 Subject: [PATCH 016/278] Make sure we have the unicode from of text in lxml fragment root --- html5lib/treewalkers/lxmletree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/treewalkers/lxmletree.py b/html5lib/treewalkers/lxmletree.py index 5c258a86..173fa082 100644 --- a/html5lib/treewalkers/lxmletree.py +++ b/html5lib/treewalkers/lxmletree.py @@ -139,7 +139,7 @@ def getNodeDetails(self, node): 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 + return _base.TEXT, ensure_str(node.obj) elif node.tag == etree.Comment: return _base.COMMENT, ensure_str(node.text) From 9eff304ce8a230ecfe84a4c4fcb61b887bfcc551 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:35:13 +0000 Subject: [PATCH 017/278] Allow None as a doctype tagname in lint --- html5lib/filters/lint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index cc3e4ac4..9f99a876 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -80,8 +80,8 @@ def __iter__(self): elif type == "Doctype": name = token["name"] - if not isinstance(name, text_type): - raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) + if name is not None and not isinstance(name, text_type): + raise LintError("Tag name is not a string or None: %(tag)r" % {"tag": name}) # XXX: what to do with token["data"] ? elif type in ("ParseError", "SerializeError"): From e0ea89948b80a300825b039fcfcda8ec4a13d513 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:39:38 +0000 Subject: [PATCH 018/278] Drop all the to_text magic in treewalkers._base --- html5lib/treewalkers/_base.py | 44 +++++++++++------------------------ 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/html5lib/treewalkers/_base.py b/html5lib/treewalkers/_base.py index dd6823dd..6d0faef1 100644 --- a/html5lib/treewalkers/_base.py +++ b/html5lib/treewalkers/_base.py @@ -1,5 +1,4 @@ from __future__ import absolute_import, division, unicode_literals -from six import text_type, string_types from xml.dom import Node from ..constants import namespaces, voidElements, spaceCharacters @@ -18,19 +17,6 @@ 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) - - class TreeWalker(object): def __init__(self, tree): self.tree = tree @@ -42,28 +28,26 @@ def error(self, msg): return {"type": "SerializeError", "data": msg} def emptyTag(self, namespace, name, attrs, hasChildren=False): - yield {"type": "EmptyTag", "name": to_text(name, False), - "namespace": to_text(namespace), + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, "data": attrs} if hasChildren: yield self.error("Void element has children") def startTag(self, namespace, name, attrs): 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())} + "name": name, + "namespace": namespace, + "data": attrs} def endTag(self, namespace, name): return {"type": "EndTag", - "name": to_text(name, False), - "namespace": to_text(namespace), + "name": name, + "namespace": namespace, "data": {}} def text(self, data): - data = to_text(data) + data = data middle = data.lstrip(spaceCharacters) left = data[:len(data) - len(middle)] if left: @@ -77,17 +61,17 @@ def text(self, data): yield {"type": "SpaceCharacters", "data": right} def comment(self, data): - return {"type": "Comment", "data": text_type(data)} + return {"type": "Comment", "data": data} def doctype(self, name, publicId=None, systemId=None, correct=True): return {"type": "Doctype", - "name": to_text(name), - "publicId": to_text(publicId), - "systemId": to_text(systemId), - "correct": to_text(correct)} + "name": name, + "publicId": publicId, + "systemId": systemId, + "correct": correct} def entity(self, name): - return {"type": "Entity", "name": text_type(name)} + return {"type": "Entity", "name": name} def unknown(self, nodeType): return self.error("Unknown node type: " + nodeType) From 22c2b1ac0fc9eb73aefde898f7b9c948e34dc041 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:52:28 +0000 Subject: [PATCH 019/278] Get rid of LintError and just use asserts All of these properties should always hold per the API, so asserts seem like a good match here. --- html5lib/filters/lint.py | 77 +++++++++++++++------------------------- 1 file changed, 28 insertions(+), 49 deletions(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index 9f99a876..e2434ef4 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -9,10 +9,6 @@ spaceCharacters = "".join(spaceCharacters) -class LintError(Exception): - pass - - class Filter(_base.Filter): def __iter__(self): open_elements = [] @@ -21,73 +17,56 @@ def __iter__(self): if type in ("StartTag", "EmptyTag"): namespace = token["namespace"] name = token["name"] - if namespace is not None and not isinstance(namespace, text_type): - raise LintError("Tag namespace is not a string or None: %(name)r" % {"name": namespace}) - if namespace == "": - raise LintError("Empty tag namespace") - if not isinstance(name, text_type): - raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) - if not name: - raise LintError("Empty tag name") - if type == "StartTag" and (not namespace or namespace == namespaces["html"]) and name in voidElements: - raise LintError("Void element reported as StartTag token: %(tag)s" % {"tag": name}) - elif type == "EmptyTag" and (not namespace or namespace == namespaces["html"]) and name not in voidElements: - raise LintError("Non-void element reported as EmptyTag token: %(tag)s" % {"tag": token["name"]}) + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" if type == "StartTag": open_elements.append((namespace, name)) - for (namespace, localname), value in token["data"].items(): - if namespace is not None and not isinstance(namespace, text_type): - raise LintError("Attribute namespace is not a string or None: %(name)r" % {"name": namespace}) - if namespace == "": - raise LintError("Empty attribute namespace") - if not isinstance(localname, text_type): - raise LintError("Attribute localname is not a string: %(name)r" % {"name": localname}) - if not localname: - raise LintError("Empty attribute localname") - if not isinstance(value, text_type): - raise LintError("Attribute value is not a string: %(value)r" % {"value": value}) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) elif type == "EndTag": namespace = token["namespace"] name = token["name"] - if namespace is not None and not isinstance(namespace, text_type): - raise LintError("Tag namespace is not a string or None: %(name)r" % {"name": namespace}) - if namespace == "": - raise LintError("Empty tag namespace") - if not isinstance(name, text_type): - raise LintError("Tag name is not a string: %(tag)r" % {"tag": name}) - if not name: - raise LintError("Empty tag name") + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" if (not namespace or namespace == namespaces["html"]) and name in voidElements: - raise LintError("Void element reported as EndTag token: %(tag)s" % {"tag": name}) - start_name = open_elements.pop() - if start_name != (namespace, name): - raise LintError("EndTag (%(end)s) does not match StartTag (%(start)s)" % {"end": name, "start": start_name}) + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + else: + start = open_elements.pop() + assert start == (namespace, name) elif type == "Comment": pass elif type in ("Characters", "SpaceCharacters"): data = token["data"] - if not isinstance(data, text_type): - 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}) + assert isinstance(data, text_type) + assert data != "" if type == "SpaceCharacters": - data = data.strip(spaceCharacters) - if data: - raise LintError("Non-space character(s) found in SpaceCharacters token: %(token)r" % {"token": data}) + assert data.strip(spaceCharacters) == "" elif type == "Doctype": name = token["name"] - if name is not None and not isinstance(name, text_type): - raise LintError("Tag name is not a string or None: %(tag)r" % {"tag": name}) + assert name is None or isinstance(name, text_type) # XXX: what to do with token["data"] ? elif type in ("ParseError", "SerializeError"): pass else: - raise LintError("Unknown token type: %(type)s" % {"type": type}) + assert False, "Unknown token type: %(type)s" % {"type": type} yield token From 5336ebea678f099f5def28ffe3924c41c6de782d Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:54:53 +0000 Subject: [PATCH 020/278] Lint that comments are text_type --- html5lib/filters/lint.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index e2434ef4..be51b852 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -49,7 +49,8 @@ def __iter__(self): assert start == (namespace, name) elif type == "Comment": - pass + data = token["data"] + assert isinstance(data, text_type) elif type in ("Characters", "SpaceCharacters"): data = token["data"] From dc879ffaab0455e8974ceaac40b727e5a04c1175 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:55:06 +0000 Subject: [PATCH 021/278] Don't allow ParseError/SerializerError tokens, whatever they are! --- html5lib/filters/lint.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index be51b852..076dbc54 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -64,9 +64,6 @@ def __iter__(self): assert name is None or isinstance(name, text_type) # XXX: what to do with token["data"] ? - elif type in ("ParseError", "SerializeError"): - pass - else: assert False, "Unknown token type: %(type)s" % {"type": type} From 7f8bd13cc2d6e334d898c64afecf4b1bf64c5f93 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:55:32 +0000 Subject: [PATCH 022/278] Drop end tag tree walker's data (always empty now) --- html5lib/tests/test_treewalkers.py | 8 ++++---- html5lib/treewalkers/_base.py | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index 04a6cae4..e59f25ea 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -78,15 +78,15 @@ 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'}, + {'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'}, + {'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'} + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} ] for treeName, treeCls in sorted(treeTypes.items()): p = html5parser.HTMLParser(tree=treeCls["builder"]) diff --git a/html5lib/treewalkers/_base.py b/html5lib/treewalkers/_base.py index 6d0faef1..bf66ec71 100644 --- a/html5lib/treewalkers/_base.py +++ b/html5lib/treewalkers/_base.py @@ -43,8 +43,7 @@ def startTag(self, namespace, name, attrs): def endTag(self, namespace, name): return {"type": "EndTag", "name": name, - "namespace": namespace, - "data": {}} + "namespace": namespace} def text(self, data): data = data From c335295f6b9d0b0710b86d94f79494cc676deb70 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 02:57:59 +0000 Subject: [PATCH 023/278] Drop tree walker doctype correct flag, whatever that once was! --- html5lib/treewalkers/_base.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/html5lib/treewalkers/_base.py b/html5lib/treewalkers/_base.py index bf66ec71..36e1ba24 100644 --- a/html5lib/treewalkers/_base.py +++ b/html5lib/treewalkers/_base.py @@ -62,12 +62,11 @@ def text(self, data): def comment(self, data): return {"type": "Comment", "data": data} - def doctype(self, name, publicId=None, systemId=None, correct=True): + def doctype(self, name, publicId=None, systemId=None): return {"type": "Doctype", "name": name, "publicId": publicId, - "systemId": systemId, - "correct": correct} + "systemId": systemId} def entity(self, name): return {"type": "Entity", "name": name} From ca6591cca342065305949189f5adbc741f76fe9b Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 03:55:12 +0000 Subject: [PATCH 024/278] Make sure lint is testing everything treewalkers can do. --- html5lib/filters/lint.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/html5lib/filters/lint.py b/html5lib/filters/lint.py index 076dbc54..3ec63d72 100644 --- a/html5lib/filters/lint.py +++ b/html5lib/filters/lint.py @@ -62,7 +62,14 @@ def __iter__(self): elif type == "Doctype": name = token["name"] assert name is None or isinstance(name, text_type) - # XXX: what to do with token["data"] ? + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) else: assert False, "Unknown token type: %(type)s" % {"type": type} From a2cdaf5de7375328a1f4f18ae6af15a925870886 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 16 Dec 2015 00:46:48 +0000 Subject: [PATCH 025/278] Fix #144: avoid bogus parse error on camel-case foreign elements --- html5lib/html5parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index ed44a552..a7cb98be 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -2444,7 +2444,7 @@ def processStartTag(self, token): def processEndTag(self, token): nodeIndex = len(self.tree.openElements) - 1 node = self.tree.openElements[-1] - if node.name != token["name"]: + if node.name.translate(asciiUpper2Lower) != token["name"]: self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) while True: From 5efd7d64452a79d87b5ebc31c37badf04ad2e48c Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 15 Mar 2016 15:07:56 +0000 Subject: [PATCH 026/278] Drop Python 3.2 support. --- .travis.yml | 2 -- CHANGES.rst | 2 ++ README.rst | 2 +- setup.py | 1 - tox.ini | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index b9a89978..ad425cc9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,12 +2,10 @@ language: python python: - "2.6" - "2.7" - - "3.2" - "3.3" - "3.4" - "3.5" - "pypy" - - "pypy3" sudo: false diff --git a/CHANGES.rst b/CHANGES.rst index 64162ccf..c236de13 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -26,6 +26,8 @@ Released on XXX this makes html5lib compliant with the Encoding Standard, and introduces a required dependency on webencodings. +* Cease supporting Python 3.2 (in both CPython and PyPy forms). + 0.9999999/1.0b8 ~~~~~~~~~~~~~~~ diff --git a/README.rst b/README.rst index 1bbcb609..879dabad 100644 --- a/README.rst +++ b/README.rst @@ -90,7 +90,7 @@ More documentation is available at http://html5lib.readthedocs.org/. Installation ------------ -html5lib works on CPython 2.6+, CPython 3.2+ and PyPy. To install it, +html5lib works on CPython 2.6+, CPython 3.3+ and PyPy. To install it, use: .. code-block:: bash diff --git a/setup.py b/setup.py index 187a4169..034bafbc 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,6 @@ 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', diff --git a/tox.ini b/tox.ini index 4a29b553..74ccd51e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = {py26,py27,py32,py33,py34,py35,pypy,pypy3}-{base,optional} +envlist = {py26,py27,py33,py34,py35,pypy}-{base,optional} [testenv] deps = From 5dac3aca16f49eccfc2c04911ea4e67be90a5710 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Wed, 2 Mar 2016 15:30:10 +0100 Subject: [PATCH 027/278] Fix python implementation marker for setuptools 2.20 --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 034bafbc..34710414 100644 --- a/setup.py +++ b/setup.py @@ -65,8 +65,8 @@ # A conditional extra will only install these items when the extra is # requested and the condition matches. - "datrie:python_implementation == 'CPython'": ["datrie"], - "lxml:python_implementation == 'CPython'": ["lxml"], + "datrie:platform_python_implementation == 'CPython'": ["datrie"], + "lxml:platform_python_implementation == 'CPython'": ["lxml"], # Standard extras, will be installed when the extra is requested. "genshi": ["genshi"], @@ -77,6 +77,6 @@ # extra that will be installed whenever the condition matches and the # all extra is requested. "all": ["genshi", "charade"], - "all:python_implementation == 'CPython'": ["datrie", "lxml"], + "all:platform_python_implementation == 'CPython'": ["datrie", "lxml"], }, ) From b67c90d5b71ec1cca334d8a0918b8a1cf5373b4e Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Mon, 25 Apr 2016 00:01:40 +0100 Subject: [PATCH 028/278] Use the platform.python_implementation because it's the most compat See for a discussion of the various setuptools different aliases support. This means we don't work with 20.2 to 20.6 (released mid-Feb till late-Mar 2016). --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 34710414..b6ea24af 100644 --- a/setup.py +++ b/setup.py @@ -65,8 +65,8 @@ # A conditional extra will only install these items when the extra is # requested and the condition matches. - "datrie:platform_python_implementation == 'CPython'": ["datrie"], - "lxml:platform_python_implementation == 'CPython'": ["lxml"], + "datrie:platform.python_implementation == 'CPython'": ["datrie"], + "lxml:platform.python_implementation == 'CPython'": ["lxml"], # Standard extras, will be installed when the extra is requested. "genshi": ["genshi"], @@ -77,6 +77,6 @@ # extra that will be installed whenever the condition matches and the # all extra is requested. "all": ["genshi", "charade"], - "all:platform_python_implementation == 'CPython'": ["datrie", "lxml"], + "all:platform.python_implementation == 'CPython'": ["datrie", "lxml"], }, ) From 77c63f989391a21e2d6e0272a5e4f5282f2f74c6 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 13 Dec 2015 23:22:57 +0000 Subject: [PATCH 029/278] Run flake8 in all builds on Travis. --- .travis.yml | 12 ------------ flake8-run.sh | 12 +++++------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index ad425cc9..24fa867c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,18 +17,6 @@ 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 diff --git a/flake8-run.sh b/flake8-run.sh index d1a587d3..685ec6ab 100755 --- a/flake8-run.sh +++ b/flake8-run.sh @@ -5,10 +5,8 @@ if [[ ! -x $(which flake8) ]]; then 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 +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] From 66a3f42444cb1d4d2cfa32f6d1d69243baa6a9fa Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 13 Dec 2015 23:25:04 +0000 Subject: [PATCH 030/278] Add codecov. --- .coveragerc | 8 ++++++++ .travis.yml | 6 +++++- requirements-install.sh | 4 ++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 00000000..6facf352 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,8 @@ +[run] +branch = True +source = html5lib + +[paths] +source = + html5lib + .tox/*/lib/python*/site-packages/html5lib diff --git a/.travis.yml b/.travis.yml index 24fa867c..94bb87e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,8 +24,12 @@ install: - bash requirements-install.sh script: - - py.test + - if [[ $TRAVIS_PYTHON_VERSION == pypy* ]]; then py.test; fi + - if [[ $TRAVIS_PYTHON_VERSION != pypy* ]]; then coverage run -m pytest; fi - bash flake8-run.sh after_script: - python debug-info.py + +after_success: + - if [[ $TRAVIS_PYTHON_VERSION != pypy* ]]; then coverage combine && codecov; fi diff --git a/requirements-install.sh b/requirements-install.sh index a8964ea0..8cab142d 100755 --- a/requirements-install.sh +++ b/requirements-install.sh @@ -13,3 +13,7 @@ pip install -U -r requirements-test.txt if [[ $USE_OPTIONAL == "true" ]]; then pip install -U -r requirements-optional.txt fi + +if [[ $CI == "true" ]]; then + pip install -U codecov +fi From b65ae3f3b707e31b790c67134370444d39e33999 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Mon, 25 Apr 2016 02:00:39 +0100 Subject: [PATCH 031/278] Update pytest-expect to 1.1 and its human readable format --- .pytest.expect | Bin 55002 -> 60852 bytes requirements-test.txt | 2 +- tox.ini | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index e818b51683df6a369de1cb6f44e86dbd9bcc9a27..c9133f40faef31770929a34fd90bc4241b78aab8 100644 GIT binary patch literal 60852 zcmchgO>Z365k>d@72GKSBy0M;{u=HA*Z~40$i}-MFeqvy4@8jyIg+jX`rH=zhEqMF zn$|m)8!rUu)~)JO@0;|8&%4dd?#1Sh51aGd$(!xP=HyfJ!(Y<#li~SE(>yP&`d2q!{`>3Z^8D)c_VVqIA3mR+PJh1tlhf1xG|lS2 z&rVPN{d1(2R8g>-ACs3l7%nTVK`T^4D(MX(+r(l5gG7?DN59wV~Y>dPYi8u-Nh8u-Nh^5FZJ zbQTBTWszaEI0QaIWN|jV@3jYeXJ`OohlZ$01Hkr(8U7K4O#rb&0*Dc`mBjP>)5MCzvui7f3K7bn2f0N-YL z^SA5+SS6)2)K3=@sUPVj0+cla!$8WwFpz+eF=e2vEzo&HQCncGmRew{NW|A|fv#zR zp@^6!I$&4@j$Kk$KX0ZE=$H;zhNli#hD)S=vg&|Q6*vz|eP6#olSq9**1&E&t%=cW zO^jx1V1UoSK~@G1l5wJ0X$!5n3YkdrpZE)UT1k)=!@~Enk-|f1R`fs81{4>!jto*GHs7 zOc#lmFNk$#CKjF&0fI`hCGcl|YqZ+US%{?#+_Z_g%>VYGd+;_l2i`ZTCz|1!Q zRULrOI{*iJdFX%{cmR&}@&Ig#uQLKy-W_m9+%NwW^77A3Nu++YC6W5omPG2uq@EaJB~rhm?HgbPDiNY4z#CdQ zsb8M-4RG=y5rSCY^{SlI5B3tNUld4$AQm_)?;GG!Mj`}kz?p7Oyg88w(8a`?6FC8h z)epo}Keg%;u(a>$A7-H;#e>q;j^apq&}4Sg1KZ#Y}yPTN-dr)Z2>3}Y@4SW8P#)&q=$*Y$#BJ4A0Do`HgE+H^)LME&>BK0`e2l%JJj}f@ID4ar+p4bs z{@$1eab^>#we*J4iBX*S7<)r`n0v$78h6^Z+CN2O%wiaGiNIRg;>o(AU~9_4+Y{M& z$+s7Gku(Lc&lg8QoZ0vrV@fARapvQjFQz=qz0nvaj9kQR)mH$2Z_I-@vx(F?hTG|* z#3;^ujJ=^e%)QY%d!vZks;>b4-k1k*W)rEk^oG)jQJnc0dqa7cd!uvqMiIAFUjh8R zF%RO*CQ@tZ4W$#KIP)>~hVn4?hV%VYF5$#tXFkT>P#)&q zC{LU$pP`7`sy~0)H|+1Hbg5{2i(a&CwSS69V-~}hO9a-^ z7Ed-~lp)=eg?GMaooBauaTiHbfH0IhzQIutXEy%En9_++ocZ|XizyFtZ|DTfHes|y z+*W-B@b|_%h%=i=t)EDB`y2D}cW@=0Tj$#tXFkT>P##ooyg%FhM*a-=v0i-02KmkMey~(0SR#KW4X6L%F=ZF@?tV~B?*fqA^7dM;Bo9%A< zX}kMOZpt1JpuX1M4gzBSCjz;%ioEWPeb+DR+W+gXQV=7#^CDX1+xbwvbN%rZ+A7C- z^|cO~U?V)N3ww_6?LX{yVIE9JVc0bRad68s+c5X~_b&H>WGyFA3${nXwCl(h1@2@! zD$~AMbSJ+CcD2(47T5>u7D2R{67{e<7p7fD!Z3DaJ1Wz@VRq%$z^-1uv+Nc@w3-t2 zusau~T}Q$&c4a#%)4pML<=4QjZpK-5iy&G}iF(+b3)8M6VHmrz9hGU{FuU?=V3$Vs zP7kf63*4D5>^Z`PVQZzfAO^bSnN9Q_Z7)a?Fo{~m+aqDxwFlhEc2uT)v*YdL*T613 z-fA)aW$A&|(gp5J7xoV6tfVw8%+7UT z&k-$(S(%Q)uxplCxuuxhZEkiqO>_GqqAWq{s`^#Q`g+b~L3qC@%{z~zvBi$symtcR zdAV7Z`&*WqQ7?>vLHO3}ktkK!Lt&ig2gM!kBY6bXhxVho!#_v%p>Gr0W#fgGxrpM` zm9UTPxwyl9q>nCoRCo9{u&uJ2*e)A1w9G{mukL({M!OD;<8UA8qwPm^hkpax;GQrn zA4WZFrk5mpO}Ms`ZeR~2<4D`!J%R_DkKzXRIMh?gE#vj5{}~I;bkU?MD_tAYb8Un7 zh#kqa%tvv9d!A{z_Asqq0)R7JH0jDp*T(c*+u%K7M=~w*QQY93XIidVrq|^>1Y~-y zNmceh7ian*ZG-oS9l`X0`6zC1&oO=A+QM`qkNED)?ls}cPP#6pkF*WmBX%Iulldra zaE~)Rxki~zx5KoSG}OvtrU+H_UX`Z#0cG5Ggbg71-guP8onsW=J9aRv>q(g5qR3WM zswRf#%DC?c8pp7VM`_$S&9EG^40pE!v2-zrXOdJ+?`3g}ACTsqN7@LG@2y8|-aCi# zy=M!{+Edaj7fHCPl6A2>m*$;E-awXRJ!ScU_EN{-Z7RBJX0+HzIpX-yIb8Yz#Ha5@Bz{K${q`YL@$Ut+(+{2s6MtI)gAr` zvX6b6*e*{l&@vZMyt?c=j#-iC;tuzbKDy{p-QnNBw#sf|n^}d-C@G?NbtUW@x98#x z_mMu7ZP}0N4*v$W<=ewH^Fsg;?V?H7R=PH@=h_DE5j+xWnUCTI_dL{c{Vk^d50!5) A?f?J) literal 55002 zcmcIt$&wq#5w&%3gu}lg3B3dG)w?ar3%!KsF+Jiy(gevNV>nu4K_wD7&7g*t=H}AGv`B#&F zxZOUj`@Xu^|0(guSC@B}AIkzCK7W1l_U`uU=Xcn}arL_U2>*J!9k$!&KYzJ6y}5j~d;8|{`R?ldHnHa9x3e4ShKv2DiNDS4=l1K*-yJto)!S`mGy6ZEzu*_I zZ+F*U-hBAQ?d6wpu;b!QwcY;g(@&-+-2dkMMGrceNbTi!uU?w9et-U2lM`nT%$h@A z)td|UkL$Ks(|_DoZAbrc+xIK_kDGc`U$Exd49$hd5RCE;2KCMB>#Gk(zhU=LSL=)Y zC+8c{!65Iwxa#k1+iqq5tMiwe9BZ}RM%Mke^H<8a-)T|1Mb=WQVGXtY_558O#8vf2 zELg7tzguQgP2IN_``?|vsfo}5#7Cjqt?Yks{%Wr-@4h;o4;l=hj+JxYZ(x?cK7SJi zCn4sA_R;no4{LqZAw-r(kj-MpX@(YJb?itjC5qUA!8qbjVoRAe zYm!Y}RXo}YIdO={$UVnR96qY+#dL%h$f|QOK;1-0xB^?E473R;rCpRhWwpU6IdB~# zn%#sz*l%aU{@y`ytT|NJr~!w-&VI|NwK_%dV6lIkzgQlSvq>MBg*Me1=1T!9 zj%j4KfG<@bEvySvLpAV!44&c=!_nY3_o#A;34z8PFl-!1Xl_o?B$5L7Qn8$)GGgII z_4eFsCbeGmG(V_Ce-3$PJnZDUYRmh-obR?rC06NB6Ud14*S=mMe{w`qV^{}d4r7id z+dQmxA2v?8tICR1d{eDl$_vf}?=#jo+0c+s-m|;cFLpQA-|ue6%G{IFKS5otTdhFx z9U)C?+TDUn zB$2QmmE631rC>%F~NBSk!1&Var_~o0Jo+Ct8c4#W*w@7dujO%O_m>XQdJpXfP67=Cs3V zjd0|k{(4%#YYJOfx%YJoxfi2;1IV*xF)=j;?O3nX31@}LxaW-Nr927 z@%^f5Siz+n(N0wZD0@635@wb#B34G|>EW1;=CU61f!vN(nuHJsW3i+y&Na%Ty1?Q= zxSMJNdQKGqN77in3v?oRuWI@ZiKPRxjDo85$$ra^(ba3dkki+lFMCU4`pEc} zp%m!GwHNP+WVGFE`1U$_t-K(sq2YfST4-o|?`tUsIC?Y6zhaN}VBpcBCpA4oF4eF- zUZS`vLox}3_be9hq!<(#6GOcNWj7Mm>y>oQiy3N*pp%WQPtNCjX=koe86{bVS)&fa zmbo@kqjZEowd)hOS~TJUPKAiGRM?YZBrA=k?=SZMI$yV=|0T1Jto1n3kc{=5sPDLe zD-ZWjB}Q48)g~=R1U%M#(fxrE%0(0-k-rzIgN+H4(~+t{ z@yN!(Ai}VE8a8}h+4cjksYd%qhb@D-?Zdzm#q(@>f7AdlWMwkd=)i7u9bHM$@@sfz(YK2vU2GJx*zte{pGvS;gAWavWa%~4J|+V-Tp z8QQjkXQ_T9Ewx%#O>q(G5ePQO#S(KM<1EtTh{aP34|olW3$S)1=v3Y)Q_&?E`Y4@b zw2W4!hL6L+?eRCS_QmyL?RM*`v>JNJod{-%vOJ$IU`iDEt@rj6EuN9Y30eq2jII2hn-%~bR&ZN_Q2v+88vniPg zNDSpUq&10PC$U>gDxdI^u9nFS6iz&mQFjV@o(;7Q6pajJK|g8-Cml7X%SnqaTF%T^ z{xgwWxdu29xXpe8^WoT3#0Dld<4~~$VJwLI<-d zU~#D$WSYl8BTUwK7=_8YX>tB2lPRf2hiA}1HS$2h@4ZkMG6<^=&$SiZqO#FoH3!(M z#o)jx>9Jj~HR_K0&q|Rb)WXCq933_lS&F|uE#Bk|<#r&`(N~mdrnKSlJw3G;iuJp| zV2XXO85x>gnFSimck>kqy!it5j_pLXab)P=tG+KjQ&m%OWb&u)_R=wR}uzqIl&vU&L9hr%w>mQ4v$2r5TdPyL7D# zNO&l}6+AYVLP=KkLxWN#`^R-X6tvw3j2p4PjDb}66H!UQ3@v|NR1WzqqcjhCP&^%3 z&y-kMX<|YbogxRv%~W9)!~_(rU|J;DHbTT4c%s4Z0oK3@xT|0|<*`X9$4r*VifdS* zo8dsp1N=r!qY3Id?zl$a_6X-|3RnehQGi&LvkJiW+{wt+e^X&rh&4(y1rTM-CL%vdH16P=-a0?3#`;swNl^YIZ>fql>{Hw<>Lq6$X44=%a+t zpg6_(@tC1a7IF}nv>!t&iJFS%X)V?8(gz+hNIfvC)2dqYHLGE@LYI}u;kve9b_dV9 zE|Tk{%Bl_r);RJA`5YvRQkcX0(?+a-t(M}+6ZDMmv6MSFo`pGr=>5yThptK(plBOj zqm)pNOEWmk?hF&=$YZIZ|9HQ2qB%#%Qt+7{Rpa_h4^&u5{#$RHIrb=;nGYoffG%MkD=`bC#RJDd(}K-~m3xt5jCz7`_N-@L13cw&s9R zqg#0$FXvJY5JH*MAM18{hfhp&=1YZRqeN5)G+Tvwo5)%^PwZ7Ua3%HcK) zi|S*nJn)PQ-=Aq3c`naEX^)mZ87WWosmd?+%Hv3>m02Nm9o{zaY%9Qs2pa>eaMVqL zm4QAs3AZb=2gW54)O{U_)o=%du{%;5_0+y}LFm#hXpiXWxkf;{Sb{J}`@J}u(icG| zLMsoR=}H4@8%-xgn&Q%#+>Nk$ot)X>5a~dtPq5u;h62EZNzBl>)3>sF$0haDPhNz8OwJ1lP(E(nW?wPR7=?v~X+ zjTgmS_i>Lx)L}mh5X)?;X$r;$HqJ+g(l8(`oVlZU>@NKaLiCqpKwx_4v=#@rX8c4D z2lj!JMFq8mEadRc4N-M&<;Ey?ZS|DkPUPYU{1!(aur786M94mi1kKPPQ*hKf6qCmH z$EOR@X$v|c?0i%dSsz~Ca*uunM}FEJr-QA3qIrnV1mHPhquD2 z-7=<)x)ETreE#a80z~nR6d;%J?1>AJUX6F47O6`|!EmxQCd6-K$w`adQo3i4ab!G$ z#Fwh^^fW@eBZrSdd@AqoWHhmn%?Zh4aOqrW{9w4n?DB<$?y2pGm3EgAFva9pE?W0JOa|c%Z_I#d} zsB*vY6O`i*Ur~>VA(}XPl=}O^Jq>>d4&_)h?c<{>>H$4FwQeY1VK=+gMOpL0ls?}O z#aK5ui6e|3AX`6mlfo#+sKaqJeU7;l|I-?j&tD~1c3@6$ZlgnMajYII(AEog&YpV$ zdYL`d8|26Afx7j;SADu(t_?X9lvceyfj4n9_THBa9*}>##xSb8_%WgWv$#zKIl;}8 z_c}_4NBTBSP0o*@u~vi!kCw<|r9V0=L zSW|l8@gcU+#ON0~yGC;R;`ky7V3>5UPTDl`a%A~*L{u6mmlmjrkDqJK7n!(aCZ6(& zVT&`T^cb3AxeT?>I6IA=cz4B*yCXl!h&}wmxE{;hGn~AQXxv_OQXU7!jZX;3vsf zxKWi|Ir);8c4o!keNKB4Zi3UZipHyH$d9NOOcMQ0M-TOAFq1f*v0zV{YK(CG0EKjW zTW)MhErwMB-XTLq$X(G*T=U~*7Wn1@UVrmZCk>6Tp`6}}kyZx$bBjBeaTA801BTf#R8eM6P8 zp+;t3%xEN8NiiBSU2c$BxP~f~6wVjuJvEqMCk*m~M|kAmPHF(yS^|Q~37$0g6AQEWjae0D0Q%Gf84IsAgtGot%Vi*vV$=nX ztl+y${IkLR;Z31pV~#k38Z)olqRUnC@s1UdGOs z<0KX%^(dZel}9)~J_8#E2G*rIc^QEvO_kiu^G2joH&ni(Zje2|7jjcwEt_(5z6@KH zOFLn3V8w%rI;b}ldzZ{aJc68Xr^feQX3S2rR_*AZS?Qw&no0s$4WKcNGkUw^WBWfH zhCSUNg|o*|BHp@#i8+#~K#5_^*}9;oE~!a^Z$nCOZb!>eU17<9zQ!vEp0r*yDQ|wv1n~ug z7quJ$;W=<5Z8Z3S$f}E-Pe&7j?K)ywdb={7l}MsJUajgIJv!K>qfVRIWkRYfl?TAm zR32Y7<6FAT1~oKx*YzR~P{}(?v)I8V1cyFLScWYQ_%fhx;9wH)*=r~B2*YAK&X2ox zWW8pNKGjRQ3` z{N+z#RgLh)THq>8**kAaGJ z6f5DZZ#$Su;Ci7?mx~-_Kh(}0R-_g_at7VS0-55>JZ^DR5;A5mak6vohtMZ|rvwXQ zJpky+djRGZ(c>+K(lB&ee_%spEtPo3V5{00kTm2c#pGG&R7!1Z3|nNVDw_V8n5QEK zrHS~dmp56HY%juzqCAO*-35vh1|((9INDzESV8>olgg3x^}dp9yF9}hiygY91&Z?X z!w7!TJE05N!1&qu@9m_G9HPkJdx4Vpq!U+z_;Mmjulx)+o*@LQF0NkaJ!=~T%F8+N zWAec-6z^Rhrm`!umeBTyuIwL!W$`b%APd3BoTJO5u`}-wp8GilU=J^)r(!4B&#YQW z03GRvtwqZ`ct8(WB@KJIpJCd?n*m&z(H%1D@r-oWyOV(8b5G?k{Vtq zBI(vzK7vbeNvI|?mLU;zp548EvAences}xPn|Ir-Nb^s13w4j1_;? zZ{Rn@OjxevB)qx&K@2HCEp2i*Gjeo&DdS?}0RNT9>hIM={ZsJu>SO;cB;WmL&D zAS)w@G>$4&nv6@kGXz^Q_F;M*KEb}>9HufV-35YuSg*3E!fN0!t?$6OfT7Jmucty9 wn`x@>?^*G%PaUn!Bx{~wf{^8exj*Yb?Mg086c^LN_+ZVW+{t8kE^xB{0~_P|t^fc4 diff --git a/requirements-test.txt b/requirements-test.txt index 0580136a..e24223ef 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -2,6 +2,6 @@ flake8 pytest -pytest-expect>=1.0,<2.0 +pytest-expect>=1.1,<2.0 mock ordereddict ; python_version < '2.7' diff --git a/tox.ini b/tox.ini index 74ccd51e..efaea775 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,7 @@ envlist = {py26,py27,py33,py34,py35,pypy}-{base,optional} deps = flake8 pytest - pytest-expect>=1.0,<2.0 + pytest-expect>=1.1,<2.0 mock base: six base: webencodings From 04ff4c12f4098c9f1260d50e4c613864a5f8c054 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 14:59:05 +0200 Subject: [PATCH 032/278] assert that after assigning self.charEncoding it's not None --- html5lib/inputstream.py | 1 + 1 file changed, 1 insertion(+) diff --git a/html5lib/inputstream.py b/html5lib/inputstream.py index 5694efe3..27987a8a 100644 --- a/html5lib/inputstream.py +++ b/html5lib/inputstream.py @@ -430,6 +430,7 @@ def __init__(self, source, encoding=None, parseMeta=True, chardet=True): # Detect encoding iff no explicit "transport level" encoding is supplied if (self.charEncoding[0] is None): self.charEncoding = self.detectEncoding(parseMeta, chardet) + assert self.charEncoding[0] is not None # Call superclass self.reset() From 9ba3b280d8548862703076bbbc2b5377718d4c83 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 15:05:06 +0200 Subject: [PATCH 033/278] Increase encoding pre-scan length to 1024, per spec from 2011(!) 51babfe760a1dbe28c4521b2070e692ac872550a was the spec change. --- html5lib/inputstream.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/inputstream.py b/html5lib/inputstream.py index 27987a8a..ad5ca7dc 100644 --- a/html5lib/inputstream.py +++ b/html5lib/inputstream.py @@ -421,7 +421,7 @@ def __init__(self, source, encoding=None, parseMeta=True, chardet=True): # Encoding Information # Number of bytes to use when looking for a meta element with # encoding information - self.numBytesMeta = 512 + self.numBytesMeta = 1024 # Number of bytes to use when using detecting encoding using chardet self.numBytesChardet = 100 # Encoding to use if no other information can be found From 06fade8759f3175af9e37bafb638de42c731025f Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 16:13:26 +0200 Subject: [PATCH 034/278] Move to a single definition of treeTypes for all tests --- html5lib/tests/support.py | 40 +++++++++++++++---- html5lib/tests/test_treewalkers.py | 59 +++++------------------------ html5lib/tests/tree_construction.py | 13 +++++-- 3 files changed, 52 insertions(+), 60 deletions(-) diff --git a/html5lib/tests/support.py b/html5lib/tests/support.py index 56e09c81..54a64a85 100644 --- a/html5lib/tests/support.py +++ b/html5lib/tests/support.py @@ -13,16 +13,24 @@ os.path.pardir, os.path.pardir))) -from html5lib import treebuilders +from html5lib import treebuilders, treewalkers, treeadapters del base_path # Build a dict of available trees -treeTypes = {"DOM": treebuilders.getTreeBuilder("dom")} +treeTypes = {} -# Try whatever etree implementations are available from a list that are -#"supposed" to work +# DOM impls +treeTypes["DOM"] = { + "builder": treebuilders.getTreeBuilder("dom"), + "walker": treewalkers.getTreeWalker("dom") +} + +# ElementTree impls import xml.etree.ElementTree as ElementTree -treeTypes['ElementTree'] = treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True) +treeTypes['ElementTree'] = { + "builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True), + "walker": treewalkers.getTreeWalker("etree", ElementTree) +} try: import xml.etree.cElementTree as cElementTree @@ -33,14 +41,32 @@ if cElementTree.Element is ElementTree.Element: treeTypes['cElementTree'] = None else: - treeTypes['cElementTree'] = treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True) + treeTypes['cElementTree'] = { + "builder": treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True), + "walker": treewalkers.getTreeWalker("etree", cElementTree) + } try: import lxml.etree as lxml # flake8: noqa except ImportError: treeTypes['lxml'] = None else: - treeTypes['lxml'] = treebuilders.getTreeBuilder("lxml") + treeTypes['lxml'] = { + "builder": treebuilders.getTreeBuilder("lxml"), + "walker": treewalkers.getTreeWalker("lxml") + } + +# Genshi impls +try: + import genshi # flake8: noqa +except ImportError: + pass +else: + treeTypes["genshi"] = { + "builder": treebuilders.getTreeBuilder("dom"), + "adapter": lambda tree: treeadapters.genshi.to_genshi(treewalkers.getTreeWalker("dom")(tree)), + "walker": treewalkers.getTreeWalker("genshi") + } def get_data_files(subdirectory, files='*.dat'): diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index e59f25ea..1d96ff88 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -11,57 +11,12 @@ except AttributeError: unittest.TestCase.assertEqual = unittest.TestCase.assertEquals -from .support import get_data_files, TestData, convertExpected +import pytest -from html5lib import html5parser, treewalkers, treebuilders, treeadapters, constants -from html5lib.filters.lint import Filter as Lint - - -treeTypes = { - "DOM": {"builder": treebuilders.getTreeBuilder("dom"), - "walker": treewalkers.getTreeWalker("dom")}, -} - -# 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, fullTree=True), - "walker": treewalkers.getTreeWalker("etree", ElementTree)} - -try: - import xml.etree.cElementTree as ElementTree -except ImportError: - pass -else: - treeTypes['cElementTree'] = \ - {"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True), - "walker": treewalkers.getTreeWalker("etree", ElementTree)} +from .support import get_data_files, TestData, convertExpected, treeTypes - -try: - import lxml.etree as ElementTree # flake8: noqa -except ImportError: - pass -else: - treeTypes['lxml_native'] = \ - {"builder": treebuilders.getTreeBuilder("lxml"), - "walker": treewalkers.getTreeWalker("lxml")} - - -try: - import genshi # flake8: noqa -except ImportError: - pass -else: - treeTypes["genshi"] = \ - {"builder": treebuilders.getTreeBuilder("dom"), - "adapter": lambda tree: treeadapters.genshi.to_genshi(treewalkers.getTreeWalker("dom")(tree)), - "walker": treewalkers.getTreeWalker("genshi")} +from html5lib import html5parser, treewalkers, constants +from html5lib.filters.lint import Filter as Lint import re attrlist = re.compile(r"^(\s+)\w+=.*(\n\1\w+=.*)+", re.M) @@ -89,6 +44,8 @@ def test_all_tokens(self): {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} ] for treeName, treeCls in sorted(treeTypes.items()): + if treeCls is None: + continue p = html5parser.HTMLParser(tree=treeCls["builder"]) document = p.parse("a
b
c") document = treeCls.get("adapter", lambda x: x)(document) @@ -98,6 +55,8 @@ def test_all_tokens(self): def runTreewalkerTest(innerHTML, input, expected, errors, treeClass): + if treeClass is None: + pytest.skip("Treebuilder not loaded") warnings.resetwarnings() warnings.simplefilter("error") try: @@ -164,6 +123,8 @@ def set_attribute_on_first_child(docfrag, name, value, treeName): def runTreewalkerEditTest(intext, expected, attrs_to_add, tree): """tests what happens when we add attributes to the intext""" treeName, treeClass = tree + if treeClass is None: + pytest.skip("Treebuilder not loaded") parser = html5parser.HTMLParser(tree=treeClass["builder"]) document = parser.parseFragment(intext) for nom, val in attrs_to_add: diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index c1125387..b46f1fc9 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -13,18 +13,23 @@ class TreeConstructionFile(pytest.File): def collect(self): tests = TestData(str(self.fspath), "data") for i, test in enumerate(tests): - for treeName, treeClass in sorted(treeTypes.items()): + for treeName, treeAPIs in sorted(treeTypes.items()): + if treeAPIs is not None and "adapter" in treeAPIs: + continue for namespaceHTMLElements in (True, False): if namespaceHTMLElements: nodeid = "%d::%s::namespaced" % (i, treeName) else: nodeid = "%d::%s::void-namespace" % (i, treeName) - item = ParserTest(nodeid, self, - test, treeClass, namespaceHTMLElements) + item = ParserTest(nodeid, + self, + test, + treeAPIs["builder"] if treeAPIs is not None else None, + namespaceHTMLElements) item.add_marker(getattr(pytest.mark, treeName)) if namespaceHTMLElements: item.add_marker(pytest.mark.namespaced) - if treeClass is None: + if treeAPIs is None: item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) yield item From 0cb9e89af8a22a83f2f6c1933a9f4be3ef113067 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 16:42:10 +0200 Subject: [PATCH 035/278] Split out each tree construction test into its own collector --- html5lib/tests/tree_construction.py | 51 ++++++++++++++++++----------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index b46f1fc9..9d6ef74b 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -13,25 +13,38 @@ class TreeConstructionFile(pytest.File): def collect(self): tests = TestData(str(self.fspath), "data") for i, test in enumerate(tests): - for treeName, treeAPIs in sorted(treeTypes.items()): - if treeAPIs is not None and "adapter" in treeAPIs: - continue - for namespaceHTMLElements in (True, False): - if namespaceHTMLElements: - nodeid = "%d::%s::namespaced" % (i, treeName) - else: - nodeid = "%d::%s::void-namespace" % (i, treeName) - item = ParserTest(nodeid, - self, - test, - treeAPIs["builder"] if treeAPIs is not None else None, - namespaceHTMLElements) - item.add_marker(getattr(pytest.mark, treeName)) - if namespaceHTMLElements: - item.add_marker(pytest.mark.namespaced) - if treeAPIs is None: - item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) - yield item + yield TreeConstructionTest(str(i), self, testdata=test) + + +class TreeConstructionTest(pytest.Collector): + def __init__(self, name, parent=None, config=None, session=None, testdata=None): + super(TreeConstructionTest, self).__init__(name, parent, config, session) + self.testdata = testdata + + def collect(self): + for treeName, treeAPIs in sorted(treeTypes.items()): + for x in self._getParserTests(treeName, treeAPIs): + yield x + + def _getParserTests(self, treeName, treeAPIs): + if treeAPIs is not None and "adapter" in treeAPIs: + return + for namespaceHTMLElements in (True, False): + if namespaceHTMLElements: + nodeid = "%s::namespaced" % treeName + else: + nodeid = "%s::void-namespace" % treeName + item = ParserTest(nodeid, + self, + self.testdata, + treeAPIs["builder"] if treeAPIs is not None else None, + namespaceHTMLElements) + item.add_marker(getattr(pytest.mark, treeName)) + if namespaceHTMLElements: + item.add_marker(pytest.mark.namespaced) + if treeAPIs is None: + item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) + yield item def convertTreeDump(data): From bd2f09ce9ae9a94d102432c4b9b21dbdde584a1e Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 16:53:16 +0200 Subject: [PATCH 036/278] Prepare tree construction tests for moving treewalker tests over --- .pytest.expect | 880 ++++++++++++++-------------- html5lib/tests/tree_construction.py | 13 +- 2 files changed, 450 insertions(+), 443 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index c9133f40..dec81a4a 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -291,443 +291,443 @@ b'html5lib/tests/test_treewalkers.py::test_treewalker::[868]': FAIL b'html5lib/tests/test_treewalkers.py::test_treewalker::[871]': FAIL b'html5lib/tests/test_treewalkers.py::test_treewalker::[965]': FAIL b'html5lib/tests/test_treewalkers.py::test_treewalker::[966]': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::18::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::19::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::22::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::23::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::26::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::27::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::30::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::31::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::34::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::35::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::38::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::39::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::40::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::41::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::47::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::10::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::12::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::15::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::17::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::20::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::5::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/ruby.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::6::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests2.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::15::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::void-namespace': FAIL diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index 9d6ef74b..85188fe1 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, division, unicode_literals +import itertools import warnings import re @@ -23,7 +24,8 @@ def __init__(self, name, parent=None, config=None, session=None, testdata=None): def collect(self): for treeName, treeAPIs in sorted(treeTypes.items()): - for x in self._getParserTests(treeName, treeAPIs): + for x in itertools.chain(self._getParserTests(treeName, treeAPIs), + self._getTreeWalkerTests(treeName, treeAPIs)): yield x def _getParserTests(self, treeName, treeAPIs): @@ -31,21 +33,26 @@ def _getParserTests(self, treeName, treeAPIs): return for namespaceHTMLElements in (True, False): if namespaceHTMLElements: - nodeid = "%s::namespaced" % treeName + nodeid = "%s::parser::namespaced" % treeName else: - nodeid = "%s::void-namespace" % treeName + nodeid = "%s::parser::void-namespace" % treeName item = ParserTest(nodeid, self, self.testdata, treeAPIs["builder"] if treeAPIs is not None else None, namespaceHTMLElements) item.add_marker(getattr(pytest.mark, treeName)) + item.add_marker(pytest.mark.parser) if namespaceHTMLElements: item.add_marker(pytest.mark.namespaced) if treeAPIs is None: item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) yield item + def _getTreeWalkerTests(self, treeName, treeAPIs): + if False: + yield + def convertTreeDump(data): return "\n".join(convert(3)(data).split("\n")[1:]) From 7556f22800c5ee2df3261a6b950d1f1b221d592c Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 18:58:04 +0100 Subject: [PATCH 037/278] Move tree construction treewalker tests to tree_construction.py --- .pytest.expect | 280 +--------------------------- html5lib/tests/test_treewalkers.py | 62 +----- html5lib/tests/tree_construction.py | 89 ++++++++- 3 files changed, 90 insertions(+), 341 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index dec81a4a..0cab7521 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -16,281 +16,6 @@ b'html5lib/tests/test_tokenizer.py::testTokenizer::[5006]': FAIL b'html5lib/tests/test_tokenizer.py::testTokenizer::[5008]': FAIL b'html5lib/tests/test_tokenizer.py::testTokenizer::[5020]': FAIL b'html5lib/tests/test_tokenizer.py::testTokenizer::[5418]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1111]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1112]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1188]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1453]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1465]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1466]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1467]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1691]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1692]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1693]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1694]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1709]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1710]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1713]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1714]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1717]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1718]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1721]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1722]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1725]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1726]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1729]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1730]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1731]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1732]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1738]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1739]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1783]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1784]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1785]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1786]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1787]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1791]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1829]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1830]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1831]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1832]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1834]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1836]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1839]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1841]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1844]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1846]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[1849]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2064]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2178]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2180]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2182]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[218]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[219]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[220]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[221]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2275]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2277]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2279]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2341]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2344]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[236]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[237]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[240]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[241]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2438]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2439]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[244]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[245]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[248]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[249]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[252]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[253]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[256]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[257]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2584]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2585]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[258]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[259]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[265]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2661]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[266]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2926]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2938]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2939]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[2940]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[310]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[311]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[312]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[313]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[314]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3164]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3165]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3166]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3167]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3182]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3183]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3186]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3187]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[318]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3190]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3191]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3194]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3195]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3198]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3199]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3202]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3203]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3204]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3205]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3211]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3212]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3256]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3257]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3258]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3259]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3260]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3264]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3302]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3303]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3304]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3305]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3307]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3309]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3312]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3314]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3317]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3319]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3322]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3537]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[356]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[357]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[358]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[359]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[361]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[363]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3651]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3653]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3655]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[366]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[368]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[371]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[373]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3748]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3750]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3752]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[376]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3814]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3817]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3911]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[3912]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4057]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4058]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4134]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4399]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4411]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4412]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4413]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4637]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4638]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4639]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4640]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4655]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4656]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4659]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4660]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4663]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4664]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4667]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4668]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4671]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4672]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4675]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4676]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4677]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4678]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4684]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4685]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4729]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4730]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4731]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4732]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4733]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4737]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4775]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4776]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4777]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4778]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4780]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4782]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4785]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4787]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4790]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4792]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[4795]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5010]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5124]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5126]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5128]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5221]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5223]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5225]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5287]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5290]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5384]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5385]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5530]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5531]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5607]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5872]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5884]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5885]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[5886]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[591]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6110]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6111]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6112]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6113]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6128]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6129]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6132]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6133]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6136]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6137]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6140]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6141]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6144]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6145]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6148]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6149]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6150]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6151]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6157]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6158]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6202]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6203]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6204]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6205]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6206]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6210]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6248]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6249]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6250]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6251]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6253]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6255]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6258]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6260]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6263]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6265]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6268]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6483]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6597]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6599]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6601]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6694]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6696]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6698]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6760]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6763]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6857]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[6858]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7003]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7004]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[705]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[707]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7080]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[709]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7345]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7357]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7358]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[7359]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[802]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[804]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[806]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[868]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[871]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[965]': FAIL -b'html5lib/tests/test_treewalkers.py::test_treewalker::[966]': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::namespaced': FAIL @@ -453,12 +178,17 @@ u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::pars u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::ElementTree::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::cElementTree::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::genshi::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/math.dat::0::lxml::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::1::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::1::ElementTree::parser::namespaced': FAIL diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index 1d96ff88..73af7e49 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -1,10 +1,6 @@ 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 @@ -13,9 +9,9 @@ import pytest -from .support import get_data_files, TestData, convertExpected, treeTypes +from .support import treeTypes -from html5lib import html5parser, treewalkers, constants +from html5lib import html5parser, treewalkers from html5lib.filters.lint import Filter as Lint import re @@ -54,60 +50,6 @@ def test_all_tokens(self): self.assertEqual(expectedToken, outputToken) -def runTreewalkerTest(innerHTML, input, expected, errors, treeClass): - if treeClass is None: - pytest.skip("Treebuilder not loaded") - 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 = treewalkers.pprint(Lint(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 sorted(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""" diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index 85188fe1..fda850ed 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -1,13 +1,25 @@ from __future__ import absolute_import, division, unicode_literals import itertools -import warnings import re +import warnings +from difflib import unified_diff import pytest from .support import TestData, convert, convertExpected, treeTypes -from html5lib import html5parser, constants +from html5lib import html5parser, constants, treewalkers +from html5lib.filters.lint import Filter as Lint + +_attrlist_re = re.compile(r"^(\s+)\w+=.*(\n\1\w+=.*)+", re.M) + + +def sortattrs(s): + def replace(m): + lines = m.group(0).split("\n") + lines.sort() + return "\n".join(lines) + return _attrlist_re.sub(replace, s) class TreeConstructionFile(pytest.File): @@ -50,8 +62,16 @@ def _getParserTests(self, treeName, treeAPIs): yield item def _getTreeWalkerTests(self, treeName, treeAPIs): - if False: - yield + nodeid = "%s::treewalker" % treeName + item = TreeWalkerTest(nodeid, + self, + self.testdata, + treeAPIs) + item.add_marker(getattr(pytest.mark, treeName)) + item.add_marker(pytest.mark.treewalker) + if treeAPIs is None: + item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded")) + yield item def convertTreeDump(data): @@ -74,7 +94,7 @@ def runtest(self): input = self.test['data'] fragmentContainer = self.test['document-fragment'] - expected = self.test['document'] + expected = convertExpected(self.test['document']) expectedErrors = self.test['errors'].split("\n") if self.test['errors'] else [] with warnings.catch_warnings(): @@ -89,7 +109,7 @@ def runtest(self): output = convertTreeDump(p.tree.testSerializer(document)) - expected = convertExpected(expected) + expected = expected if self.namespaceHTMLElements: expected = namespaceExpected(r"\1", expected) @@ -117,3 +137,60 @@ def repr_failure(self, excinfo): return excinfo.getrepr(funcargs=True, showlocals=False, style="short", tbfilter=False) + + +class TreeWalkerTest(pytest.Item): + def __init__(self, name, parent, test, treeAPIs): + super(TreeWalkerTest, self).__init__(name, parent) + self.obj = lambda: 1 # this is to hack around skipif needing a function! + self.test = test + self.treeAPIs = treeAPIs + + def runtest(self): + p = html5parser.HTMLParser(tree=self.treeAPIs["builder"]) + + input = self.test['data'] + fragmentContainer = self.test['document-fragment'] + expected = convertExpected(self.test['document']) + + with warnings.catch_warnings(): + warnings.simplefilter("error") + try: + if fragmentContainer: + document = p.parseFragment(input, fragmentContainer) + else: + document = p.parse(input) + except constants.DataLossWarning: + pytest.skip("data loss warning") + + poutput = convertTreeDump(p.tree.testSerializer(document)) + namespace_expected = namespaceExpected(r"\1", expected) + if poutput != namespace_expected: + pytest.skip("parser output incorrect") + + document = self.treeAPIs.get("adapter", lambda x: x)(document) + + try: + output = treewalkers.pprint(Lint(self.treeAPIs["walker"](document))) + output = sortattrs(output) + expected = sortattrs(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: + pytest.skip("tree walker NotImplementedError") + + def repr_failure(self, excinfo): + traceback = excinfo.traceback + ntraceback = traceback.cut(path=__file__) + excinfo.traceback = ntraceback.filter() + + return excinfo.getrepr(funcargs=True, + showlocals=False, + style="short", tbfilter=False) From 8ddd3b983c270cee4f733f4662065495b5f963dc Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 19:58:05 +0100 Subject: [PATCH 038/278] Generate tokenizer tests from testdata files --- .pytest.expect | 28 ++--- html5lib/tests/conftest.py | 5 + .../tests/{test_tokenizer.py => tokenizer.py} | 103 +++++++++++------- 3 files changed, 85 insertions(+), 51 deletions(-) rename html5lib/tests/{test_tokenizer.py => tokenizer.py} (69%) diff --git a/.pytest.expect b/.pytest.expect index 0cab7521..3133aebe 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -2,20 +2,20 @@ pytest-expect file v1 (2, 7, 11, 'final', 0) b'html5lib/tests/test_encoding.py::test_encoding::[110]': FAIL b'html5lib/tests/test_encoding.py::test_encoding::[111]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4718]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4990]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4993]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4994]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4996]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4997]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[4999]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5002]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5003]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5005]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5006]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5008]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5020]': FAIL -b'html5lib/tests/test_tokenizer.py::testTokenizer::[5418]': FAIL +u'html5lib/tests/testdata/tokenizer/test2.test::0::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::228::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::231::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::232::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::234::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::235::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::237::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::240::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::241::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::243::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::244::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::246::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::258::dataState': FAIL +u'html5lib/tests/testdata/tokenizer/test3.test::656::dataState': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::0::ElementTree::parser::namespaced': FAIL diff --git a/html5lib/tests/conftest.py b/html5lib/tests/conftest.py index b6f0a1cd..811aebbf 100644 --- a/html5lib/tests/conftest.py +++ b/html5lib/tests/conftest.py @@ -1,10 +1,12 @@ import os.path from .tree_construction import TreeConstructionFile +from .tokenizer import TokenizerFile _dir = os.path.abspath(os.path.dirname(__file__)) _testdata = os.path.join(_dir, "testdata") _tree_construction = os.path.join(_testdata, "tree-construction") +_tokenizer = os.path.join(_testdata, "tokenizer") def pytest_collectstart(): @@ -19,3 +21,6 @@ def pytest_collect_file(path, parent): return if path.ext == ".dat": return TreeConstructionFile(path, parent) + elif dir == _tokenizer: + if path.ext == ".test": + return TokenizerFile(path, parent) diff --git a/html5lib/tests/test_tokenizer.py b/html5lib/tests/tokenizer.py similarity index 69% rename from html5lib/tests/test_tokenizer.py rename to html5lib/tests/tokenizer.py index 87e098f3..c6163a1f 100644 --- a/html5lib/tests/test_tokenizer.py +++ b/html5lib/tests/tokenizer.py @@ -1,13 +1,13 @@ from __future__ import absolute_import, division, unicode_literals +import codecs import json import warnings import re +import pytest from six import unichr -from .support import get_data_files - from html5lib.tokenizer import HTMLTokenizer from html5lib import constants, utils @@ -172,27 +172,6 @@ def repl(m): return test -def runTokenizerTest(test): - warnings.resetwarnings() - warnings.simplefilter("error") - - expected = test['output'] - if 'lastStartTag' not in test: - test['lastStartTag'] = None - parser = TokenizerTestParser(test['initialState'], - test['lastStartTag']) - tokens = parser.parse(test['input']) - 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() @@ -205,18 +184,68 @@ def capitalize(s): return s -def testTokenizer(): - for filename in get_data_files('tokenizer', '*.test'): - with open(filename) as fp: +class TokenizerFile(pytest.File): + def collect(self): + with codecs.open(str(self.fspath), "r", encoding="utf-8") 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) - if test["input"] is None: - continue # Not valid input for this platform - for initialState in test["initialStates"]: - test["initialState"] = capitalize(initialState) - yield runTokenizerTest, test + if 'tests' in tests: + for i, test in enumerate(tests['tests']): + yield TokenizerTestCollector(str(i), self, testdata=test) + + +class TokenizerTestCollector(pytest.Collector): + def __init__(self, name, parent=None, config=None, session=None, testdata=None): + super(TokenizerTestCollector, self).__init__(name, parent, config, session) + if 'initialStates' not in testdata: + testdata["initialStates"] = ["Data state"] + if 'doubleEscaped' in testdata: + testdata = unescape(testdata) + self.testdata = testdata + + def collect(self): + for initialState in self.testdata["initialStates"]: + initialState = capitalize(initialState) + item = TokenizerTest(initialState, + self, + self.testdata, + initialState) + if self.testdata["input"] is None: + item.add_marker(pytest.mark.skipif(True, reason="Relies on lone surrogates")) + yield item + + +class TokenizerTest(pytest.Item): + def __init__(self, name, parent, test, initialState): + super(TokenizerTest, self).__init__(name, parent) + self.obj = lambda: 1 # this is to hack around skipif needing a function! + self.test = test + self.initialState = initialState + + def runtest(self): + warnings.resetwarnings() + warnings.simplefilter("error") + + expected = self.test['output'] + if 'lastStartTag' not in self.test: + self.test['lastStartTag'] = None + parser = TokenizerTestParser(self.initialState, + self.test['lastStartTag']) + tokens = parser.parse(self.test['input']) + received = normalizeTokens(tokens) + errorMsg = "\n".join(["\n\nInitial state:", + self.initialState, + "\nInput:", self.test['input'], + "\nExpected:", repr(expected), + "\nreceived:", repr(tokens)]) + errorMsg = errorMsg + ignoreErrorOrder = self.test.get('ignoreErrorOrder', False) + assert tokensMatch(expected, received, ignoreErrorOrder, True), errorMsg + + def repr_failure(self, excinfo): + traceback = excinfo.traceback + ntraceback = traceback.cut(path=__file__) + excinfo.traceback = ntraceback.filter() + + return excinfo.getrepr(funcargs=True, + showlocals=False, + style="short", tbfilter=False) From a75b120409f1440b3603c3ed8643d1bdc1f9ed3c Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 20:08:37 +0100 Subject: [PATCH 039/278] Fix new flake8 warning ("not x in" v. "x not in") --- html5lib/tests/test_treewalkers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index 73af7e49..4d216117 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -75,7 +75,7 @@ def runTreewalkerEditTest(intext, expected, attrs_to_add, tree): document = treeClass.get("adapter", lambda x: x)(document) output = treewalkers.pprint(treeClass["walker"](document)) output = attrlist.sub(sortattrs, output) - if not output in expected: + if output not in expected: raise AssertionError("TreewalkerEditTest: %s\nExpected:\n%s\nReceived:\n%s" % (treeName, expected, output)) From 68d6f3466092c608091c03b5cba7e8f7afd7c245 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 3 May 2016 20:19:12 +0100 Subject: [PATCH 040/278] Remove last remanent of unittest from test_treewalkers.py --- html5lib/tests/test_treewalkers.py | 54 +++++++++++++----------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/html5lib/tests/test_treewalkers.py b/html5lib/tests/test_treewalkers.py index 4d216117..045d9d7b 100644 --- a/html5lib/tests/test_treewalkers.py +++ b/html5lib/tests/test_treewalkers.py @@ -1,12 +1,5 @@ from __future__ import absolute_import, division, unicode_literals -import unittest - -try: - unittest.TestCase.assertEqual -except AttributeError: - unittest.TestCase.assertEqual = unittest.TestCase.assertEquals - import pytest from .support import treeTypes @@ -24,30 +17,29 @@ def sortattrs(x): 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'}, - {'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'}, - {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, - {'data': 'c', 'type': 'Characters'}, - {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, - {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} - ] - for treeName, treeCls in sorted(treeTypes.items()): - if treeCls is None: - continue - p = html5parser.HTMLParser(tree=treeCls["builder"]) - document = p.parse("a
b
c") - document = treeCls.get("adapter", lambda x: x)(document) - output = Lint(treeCls["walker"](document)) - for expectedToken, outputToken in zip(expected, output): - self.assertEqual(expectedToken, outputToken) +def test_all_tokens(): + 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'}, + {'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'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'div'}, + {'data': 'c', 'type': 'Characters'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'body'}, + {'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'} + ] + for treeName, treeCls in sorted(treeTypes.items()): + if treeCls is None: + continue + p = html5parser.HTMLParser(tree=treeCls["builder"]) + document = p.parse("a
b
c") + document = treeCls.get("adapter", lambda x: x)(document) + output = Lint(treeCls["walker"](document)) + for expectedToken, outputToken in zip(expected, output): + assert expectedToken == outputToken def set_attribute_on_first_child(docfrag, name, value, treeName): From c5a800779b5af3d46aa4dbc69a171fdc47906005 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 4 May 2016 00:05:51 +0100 Subject: [PATCH 041/278] Add a better test for encoding prescan length --- html5lib/tests/test_encoding.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py index 837e989f..6c996b00 100644 --- a/html5lib/tests/test_encoding.py +++ b/html5lib/tests/test_encoding.py @@ -12,6 +12,15 @@ from html5lib import HTMLParser, inputstream +def test_basic_prescan_length(): + data = "Caf\u00E9".encode('utf-8') + pad = 1024 - len(data) + 1 + data = data.replace(b"-a-", b"-" + (b"a" * pad) + b"-") + assert len(data) == 1024 # Sanity + stream = inputstream.HTMLBinaryInputStream(data, chardet=False) + assert 'utf-8' == stream.charEncoding[0].name + + def runParserEncodingTest(data, encoding): p = HTMLParser() assert p.documentEncoding is None From 1d9f391f6f92677c29803272d9a3e27831a84814 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 4 May 2016 00:06:24 +0100 Subject: [PATCH 042/278] Fix changing encoding to actually change encoding; add test for it --- html5lib/inputstream.py | 2 +- html5lib/tests/test_encoding.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/html5lib/inputstream.py b/html5lib/inputstream.py index ad5ca7dc..15acba0d 100644 --- a/html5lib/inputstream.py +++ b/html5lib/inputstream.py @@ -509,8 +509,8 @@ def changeEncoding(self, newEncoding): self.charEncoding = (self.charEncoding[0], "certain") else: self.rawStream.seek(0) - self.reset() self.charEncoding = (newEncoding, "certain") + self.reset() raise ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) def detectBOM(self): diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py index 6c996b00..3837fe09 100644 --- a/html5lib/tests/test_encoding.py +++ b/html5lib/tests/test_encoding.py @@ -21,6 +21,19 @@ def test_basic_prescan_length(): assert 'utf-8' == stream.charEncoding[0].name +def test_parser_reparse(): + data = "Caf\u00E9".encode('utf-8') + pad = 10240 - len(data) + 1 + data = data.replace(b"-a-", b"-" + (b"a" * pad) + b"-") + assert len(data) == 10240 # Sanity + stream = inputstream.HTMLBinaryInputStream(data, chardet=False) + assert 'windows-1252' == stream.charEncoding[0].name + p = HTMLParser(namespaceHTMLElements=False) + doc = p.parse(data, useChardet=False) + assert 'utf-8' == p.documentEncoding + assert doc.find(".//title").text == "Caf\u00E9" + + def runParserEncodingTest(data, encoding): p = HTMLParser() assert p.documentEncoding is None From b0ae0c2aaa5c2d74602a9dc576f10753f1383882 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Wed, 4 May 2016 00:06:48 +0100 Subject: [PATCH 043/278] Ensure we only ever reparse *once* --- html5lib/html5parser.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index a7cb98be..34f7ac5c 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -89,12 +89,11 @@ def _parse(self, stream, innerHTML=False, container="div", parser=self, **kwargs) self.reset() - while True: - try: - self.mainLoop() - break - except ReparseException: - self.reset() + try: + self.mainLoop() + except ReparseException: + self.reset() + self.mainLoop() def reset(self): self.tree.reset() From bf3e733bbafd5a9d5dfb12c86459a82e68be97fe Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 17:57:41 +0100 Subject: [PATCH 044/278] Apply memoization to getPhases; this provides a decent perf gain --- html5lib/html5parser.py | 1 + html5lib/utils.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index 34f7ac5c..b56f6238 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -418,6 +418,7 @@ def parseRCDataRawtext(self, token, contentType): self.phase = self.phases["text"] +@utils.memoize def getPhases(debug): def log(function): """Logger that records which phase processes each token""" diff --git a/html5lib/utils.py b/html5lib/utils.py index c196821f..c70de172 100644 --- a/html5lib/utils.py +++ b/html5lib/utils.py @@ -109,3 +109,15 @@ def moduleFactory(baseModule, *args, **kwargs): return mod return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped From 645ce08f27069c5cad6e68e727f3effd96aaf1b7 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 10 May 2016 10:56:09 -0700 Subject: [PATCH 045/278] Avoid TestData throwing a warning in test_encoding.py --- html5lib/tests/test_encoding.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/html5lib/tests/test_encoding.py b/html5lib/tests/test_encoding.py index 3837fe09..41b888c4 100644 --- a/html5lib/tests/test_encoding.py +++ b/html5lib/tests/test_encoding.py @@ -8,7 +8,7 @@ except AttributeError: unittest.TestCase.assertEqual = unittest.TestCase.assertEquals -from .support import get_data_files, TestData, test_dir, errorMessage +from .support import get_data_files, test_dir, errorMessage, TestData as _TestData from html5lib import HTMLParser, inputstream @@ -56,7 +56,7 @@ def runPreScanEncodingTest(data, encoding): def test_encoding(): for filename in get_data_files("encoding"): - tests = TestData(filename, b"data", encoding=None) + 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']) From 366ed48da6d6550661cb6d9dcd8d4d1a0b44c645 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 10 May 2016 10:58:37 -0700 Subject: [PATCH 046/278] Change py.test config. Make warnings errors, xpass fail, and document markers. --- pytest.ini | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pytest.ini b/pytest.ini index 6875cc7d..8824977a 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,17 @@ [pytest] -addopts = -rXw -p no:doctest +# Output fails, errors, xpass, and warnings; ignore doctest; make warnings errors +addopts = -rfEXw -p no:doctest --strict + +# Make xpass results be considered fail +xfail_strict = true + +# Document our markers +markers = + DOM: mark a test as a DOM tree test + ElementTree: mark a test as a ElementTree tree test + cElementTree: mark a test as a cElementTree tree test + lxml: mark a test as a lxml tree test + genshi: mark a test as a genshi tree test + parser: mark a test as a parser test + namespaced: mark a test as a namespaced parser test + treewalker: mark a test as a treewalker test From 2f04a38038a23ef4f8123481fecae86d31ed6e3b Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Tue, 10 May 2016 09:49:51 -0700 Subject: [PATCH 047/278] Update tests --- .pytest.expect | 232 +++++++++++++++++++++++++++++++++++----- html5lib/tests/testdata | 2 +- 2 files changed, 209 insertions(+), 25 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index 3133aebe..5ec37054 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -176,6 +176,38 @@ u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTr u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/foreign-fragment.dat::48::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::2::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/isindex.dat::3::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::0::DOM::treewalker': FAIL @@ -221,6 +253,38 @@ u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::n u'html5lib/tests/testdata/tree-construction/math.dat::4::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/math.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::3::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::5::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/menuitem-element.dat::9::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::ElementTree::parser::namespaced': FAIL @@ -229,6 +293,126 @@ u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cEleme u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::namespaced': FAIL @@ -373,22 +557,30 @@ u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parse u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::18::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests19.dat::21::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::14::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::17::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/tests19.dat::7::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests2.dat::6::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests2.dat::6::ElementTree::parser::namespaced': FAIL @@ -413,14 +605,6 @@ u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests25.dat::8::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::namespaced': FAIL diff --git a/html5lib/tests/testdata b/html5lib/tests/testdata index 6234baea..8db03d03 160000 --- a/html5lib/tests/testdata +++ b/html5lib/tests/testdata @@ -1 +1 @@ -Subproject commit 6234baeabc51f6d51d1cfc2c4e4656bd99531f2b +Subproject commit 8db03d031c90c8b68273a90aad5168f4161c3078 From 7f2fe0054a31d6097be71fa6ee667a6c8e8f10db Mon Sep 17 00:00:00 2001 From: neumond Date: Thu, 21 Apr 2016 14:41:59 +0300 Subject: [PATCH 048/278] Implement InHeadNoscript context --- .pytest.expect | 173 +++------------------------- html5lib/constants.py | 6 + html5lib/html5parser.py | 120 ++++++++++++++++--- html5lib/tests/tree_construction.py | 16 ++- 4 files changed, 132 insertions(+), 183 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index 5ec37054..14863d43 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -293,14 +293,6 @@ u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cEleme u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::0::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::namespaced': FAIL @@ -309,46 +301,6 @@ u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::pa u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::11::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::12::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::13::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::14::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::15::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::namespaced': FAIL @@ -357,54 +309,19 @@ u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::pa u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::1::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::4::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::5::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::6::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::7::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::8::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::genshi::treewalker': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::namespaced': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::void-namespace': FAIL +u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::treewalker': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::namespaced': FAIL @@ -509,54 +426,6 @@ u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser u'html5lib/tests/testdata/tree-construction/tests11.dat::2::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests11.dat::2::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::181::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::183::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::185::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::84::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::86::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests16.dat::88::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests19.dat::14::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests19.dat::14::ElementTree::parser::namespaced': FAIL @@ -605,14 +474,6 @@ u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser u'html5lib/tests/testdata/tree-construction/tests25.dat::7::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/tests25.dat::7::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/tests5.dat::16::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::14::ElementTree::parser::namespaced': FAIL @@ -637,11 +498,3 @@ u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::pars u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/webkit02.dat::16::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/webkit02.dat::2::lxml::parser::void-namespace': FAIL diff --git a/html5lib/constants.py b/html5lib/constants.py index f6e38cbf..2244933c 100644 --- a/html5lib/constants.py +++ b/html5lib/constants.py @@ -283,6 +283,12 @@ "Element %(name)s not allowed in a non-html context", "unexpected-end-tag-before-html": "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", "XXX-undefined-error": "Undefined error (this sucks and should be fixed)", } diff --git a/html5lib/html5parser.py b/html5lib/html5parser.py index b56f6238..e6808425 100644 --- a/html5lib/html5parser.py +++ b/html5lib/html5parser.py @@ -22,18 +22,18 @@ def parse(doc, treebuilder="etree", encoding=None, - namespaceHTMLElements=True): + namespaceHTMLElements=True, scripting=False): """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) + return p.parse(doc, encoding=encoding, scripting=scripting) def parseFragment(doc, container="div", treebuilder="etree", encoding=None, - namespaceHTMLElements=True): + namespaceHTMLElements=True, scripting=False): tb = treebuilders.getTreeBuilder(treebuilder) p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) - return p.parseFragment(doc, container=container, encoding=encoding) + return p.parseFragment(doc, container=container, encoding=encoding, scripting=scripting) def method_decorator_metaclass(function): @@ -78,11 +78,12 @@ def __init__(self, tree=None, tokenizer=tokenizer.HTMLTokenizer, 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): + def _parse(self, stream, innerHTML=False, container="div", encoding=None, + parseMeta=True, useChardet=True, scripting=False, **kwargs): self.innerHTMLMode = innerHTML self.container = container + self.scripting = scripting self.tokenizer = self.tokenizer_class(stream, encoding=encoding, parseMeta=parseMeta, useChardet=useChardet, @@ -221,7 +222,8 @@ def normalizedTokens(self): for token in self.tokenizer: yield self.normalizeToken(token) - def parse(self, stream, encoding=None, parseMeta=True, useChardet=True): + def parse(self, stream, encoding=None, parseMeta=True, + useChardet=True, scripting=False): """Parse a HTML document into a well-formed tree stream - a filelike object or string containing the HTML to be parsed @@ -230,13 +232,15 @@ def parse(self, stream, encoding=None, parseMeta=True, useChardet=True): the encoding. If specified, that encoding will be used, regardless of any BOM or later declaration (such as in a meta element) + + scripting - treat noscript elements as if javascript was turned on """ self._parse(stream, innerHTML=False, encoding=encoding, - parseMeta=parseMeta, useChardet=useChardet) + parseMeta=parseMeta, useChardet=useChardet, scripting=scripting) return self.tree.getDocument() def parseFragment(self, stream, container="div", encoding=None, - parseMeta=False, useChardet=True): + parseMeta=False, useChardet=True, scripting=False): """Parse a HTML fragment into a well-formed tree fragment container - name of the element we're setting the innerHTML property @@ -248,8 +252,11 @@ def parseFragment(self, stream, container="div", encoding=None, the encoding. If specified, that encoding will be used, regardless of any BOM or later declaration (such as in a meta element) + + scripting - treat noscript elements as if javascript was turned on """ - self._parse(stream, True, container=container, encoding=encoding) + self._parse(stream, True, container=container, + encoding=encoding, scripting=scripting) return self.tree.getFragment() def parseError(self, errorcode="XXX-undefined-error", datavars={}): @@ -708,7 +715,8 @@ def __init__(self, parser, tree): self.startTagHandler = utils.MethodDispatcher([ ("html", self.startTagHtml), ("title", self.startTagTitle), - (("noscript", "noframes", "style"), self.startTagNoScriptNoFramesStyle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), ("script", self.startTagScript), (("base", "basefont", "bgsound", "command", "link"), self.startTagBaseLinkCommand), @@ -717,7 +725,7 @@ def __init__(self, parser, tree): ]) self.startTagHandler.default = self.startTagOther - self. endTagHandler = utils.MethodDispatcher([ + self.endTagHandler = utils.MethodDispatcher([ ("head", self.endTagHead), (("br", "html", "body"), self.endTagHtmlBodyBr) ]) @@ -767,10 +775,17 @@ def startTagMeta(self, token): def startTagTitle(self, token): self.parser.parseRCDataRawtext(token, "RCDATA") - def startTagNoScriptNoFramesStyle(self, token): + def startTagNoFramesStyle(self, token): # Need to decide whether to implement the scripting-disabled case self.parser.parseRCDataRawtext(token, "RAWTEXT") + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + def startTagScript(self, token): self.tree.insertElement(token) self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState @@ -796,10 +811,70 @@ def endTagOther(self, token): 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 InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + class AfterHeadPhase(Phase): def __init__(self, parser, tree): Phase.__init__(self, parser, tree) @@ -910,7 +985,8 @@ def __init__(self, parser, tree): ("isindex", self.startTagIsIndex), ("textarea", self.startTagTextarea), ("iframe", self.startTagIFrame), - (("noembed", "noframes", "noscript"), self.startTagRawtext), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), ("select", self.startTagSelect), (("rp", "rt"), self.startTagRpRt), (("option", "optgroup"), self.startTagOpt), @@ -1231,6 +1307,12 @@ def startTagIFrame(self, token): self.parser.framesetOK = False self.startTagRawtext(token) + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + def startTagRawtext(self, token): """iframe, noembed noframes, noscript(if scripting enabled)""" self.parser.parseRCDataRawtext(token, "RAWTEXT") @@ -2687,7 +2769,7 @@ def processEndTag(self, token): "beforeHtml": BeforeHtmlPhase, "beforeHead": BeforeHeadPhase, "inHead": InHeadPhase, - # XXX "inHeadNoscript": InHeadNoScriptPhase, + "inHeadNoscript": InHeadNoscriptPhase, "afterHead": AfterHeadPhase, "inBody": InBodyPhase, "text": TextPhase, diff --git a/html5lib/tests/tree_construction.py b/html5lib/tests/tree_construction.py index fda850ed..c6e7ca09 100644 --- a/html5lib/tests/tree_construction.py +++ b/html5lib/tests/tree_construction.py @@ -97,13 +97,17 @@ def runtest(self): expected = convertExpected(self.test['document']) expectedErrors = self.test['errors'].split("\n") if self.test['errors'] else [] + scripting = False + if 'script-on' in self.test: + scripting = True + with warnings.catch_warnings(): warnings.simplefilter("error") try: if fragmentContainer: - document = p.parseFragment(input, fragmentContainer) + document = p.parseFragment(input, fragmentContainer, scripting=scripting) else: - document = p.parse(input) + document = p.parse(input, scripting=scripting) except constants.DataLossWarning: pytest.skip("data loss warning") @@ -153,13 +157,17 @@ def runtest(self): fragmentContainer = self.test['document-fragment'] expected = convertExpected(self.test['document']) + scripting = False + if 'script-on' in self.test: + scripting = True + with warnings.catch_warnings(): warnings.simplefilter("error") try: if fragmentContainer: - document = p.parseFragment(input, fragmentContainer) + document = p.parseFragment(input, fragmentContainer, scripting=scripting) else: - document = p.parse(input) + document = p.parse(input, scripting=scripting) except constants.DataLossWarning: pytest.skip("data loss warning") From 482370391e4786bb36ae413deaa0f55e77563bd8 Mon Sep 17 00:00:00 2001 From: Vitalik Verhovodov Date: Sun, 8 May 2016 02:53:52 +0400 Subject: [PATCH 049/278] Scripting parameter for parse.py (#1) --- .pytest.expect | 37 ------------------------------------- parse.py | 16 ++++++++++------ 2 files changed, 10 insertions(+), 43 deletions(-) diff --git a/.pytest.expect b/.pytest.expect index 14863d43..8bfcf4b7 100644 --- a/.pytest.expect +++ b/.pytest.expect @@ -293,43 +293,6 @@ u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cEleme u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::cElementTree::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat::0::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::10::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::16::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::DOM::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::ElementTree::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::cElementTree::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::genshi::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::17::lxml::treewalker': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::DOM::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::ElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::cElementTree::parser::void-namespace': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::namespaced': FAIL -u'html5lib/tests/testdata/tree-construction/noscript01.dat::9::lxml::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::namespaced': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::DOM::parser::void-namespace': FAIL u'html5lib/tests/testdata/tree-construction/ruby.dat::0::ElementTree::parser::namespaced': FAIL diff --git a/parse.py b/parse.py index b9bea288..2245060a 100755 --- a/parse.py +++ b/parse.py @@ -65,11 +65,12 @@ def parse(): if opts.profile: import cProfile import pstats - cProfile.runctx("run(parseMethod, f, encoding)", None, + cProfile.runctx("run(parseMethod, f, encoding, scripting)", None, {"run": run, "parseMethod": parseMethod, "f": f, - "encoding": encoding}, + "encoding": encoding, + "scripting": opts.scripting}, "stats.prof") # XXX - We should use a temp file here stats = pstats.Stats('stats.prof') @@ -79,7 +80,7 @@ def parse(): elif opts.time: import time t0 = time.time() - document = run(parseMethod, f, encoding) + document = run(parseMethod, f, encoding, opts.scripting) t1 = time.time() if document: printOutput(p, document, opts) @@ -88,13 +89,13 @@ def parse(): else: sys.stderr.write("\n\nRun took: %fs"%(t1-t0)) else: - document = run(parseMethod, f, encoding) + document = run(parseMethod, f, encoding, opts.scripting) if document: printOutput(p, document, opts) -def run(parseMethod, f, encoding): +def run(parseMethod, f, encoding, scripting): try: - document = parseMethod(f, encoding=encoding) + document = parseMethod(f, encoding=encoding, scripting=scripting) except: document = None traceback.print_exc() @@ -168,6 +169,9 @@ def getOptParser(): parser.add_option("-f", "--fragment", action="store_true", default=False, dest="fragment", help="Parse as a fragment") + parser.add_option("-s", "--scripting", action="store_true", default=False, + dest="scripting", help="Handle noscript tags as if scripting was enabled") + parser.add_option("", "--tree", action="store_true", default=False, dest="tree", help="Output as debug tree") From 816eaf4eca9112e850a3be77ee0033e73bbb2099 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 00:15:16 +0100 Subject: [PATCH 050/278] lxml should only ever return an ASCII string as a str See --- html5lib/treewalkers/lxmletree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html5lib/treewalkers/lxmletree.py b/html5lib/treewalkers/lxmletree.py index 173fa082..36850086 100644 --- a/html5lib/treewalkers/lxmletree.py +++ b/html5lib/treewalkers/lxmletree.py @@ -15,7 +15,7 @@ def ensure_str(s): elif isinstance(s, text_type): return s else: - return s.decode("utf-8", "strict") + return s.decode("ascii", "strict") class Root(object): From 06e1a37f75b3ee50fc01fbed4f58185197df4f38 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Mon, 9 May 2016 22:00:19 -0700 Subject: [PATCH 051/278] Emphasise major changes in changelog, add lxml fix and noscript. --- CHANGES.rst | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index c236de13..62a6a233 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,7 +6,7 @@ Change Log Released on XXX -* Added ordereddict as a mandatory dependency on Python 2.6. +* **Added ordereddict as a mandatory dependency on Python 2.6.** * Added ``lxml``, ``genshi``, ``datrie``, ``charade``, and ``all`` extras that will do the right thing based on the specific @@ -16,17 +16,22 @@ Released on XXX * Cease supporting DATrie under PyPy. -* Remove ``PullDOM`` support, as this hasn't ever been properly +* **Remove ``PullDOM`` support, as this hasn't ever been properly tested, doesn't entirely work, and as far as I can tell is - completely unused by anyone. + completely unused by anyone.** * Move testsuite to ``py.test``. -* Fix #124: move to webencodings for decoding the input byte stream; +* **Fix #124: move to webencodings for decoding the input byte stream; this makes html5lib compliant with the Encoding Standard, and - introduces a required dependency on webencodings. + introduces a required dependency on webencodings.** -* Cease supporting Python 3.2 (in both CPython and PyPy forms). +* **Cease supporting Python 3.2 (in both CPython and PyPy forms).** + +* **Fix comments containing double-dash with lxml 3.5 and above.** + +* **Use scripting disabled by default (as we don't implement + scripting).** 0.9999999/1.0b8 From c6bdc743a4305af0f9e88921a03e993b9cbaf45b Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 18:02:40 +0100 Subject: [PATCH 052/278] Move the serializer testdata to html5lib-python as impl specific --- html5lib/tests/serializer-testdata/core.test | 125 +++ .../tests/serializer-testdata/injectmeta.test | 66 ++ .../serializer-testdata/optionaltags.test | 965 ++++++++++++++++++ .../tests/serializer-testdata/options.test | 60 ++ .../tests/serializer-testdata/whitespace.test | 51 + html5lib/tests/support.py | 4 +- html5lib/tests/test_serializer.py | 3 +- 7 files changed, 1271 insertions(+), 3 deletions(-) create mode 100644 html5lib/tests/serializer-testdata/core.test create mode 100644 html5lib/tests/serializer-testdata/injectmeta.test create mode 100644 html5lib/tests/serializer-testdata/optionaltags.test create mode 100644 html5lib/tests/serializer-testdata/options.test create mode 100644 html5lib/tests/serializer-testdata/whitespace.test diff --git a/html5lib/tests/serializer-testdata/core.test b/html5lib/tests/serializer-testdata/core.test new file mode 100644 index 00000000..c0b4222d --- /dev/null +++ b/html5lib/tests/serializer-testdata/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": [""] +}, + +{"description": "proper attribute value non-quoting", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"}]]], + "expected": [""], + "xhtml": [""] +}, + +{"description": "proper attribute value non-quoting (with <)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"], + "xhtml": [""] +}, + +{"description": "proper attribute value quoting (with =)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo=bar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with >)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo>bar"}]]], + "expected": ["bar\">"] +}, + +{"description": "proper attribute value quoting (with \")", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\"bar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with ')", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar"}]]], + "expected": [""] +}, + +{"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": [""] +}, + +{"description": "proper attribute value quoting (with space)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo bar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with tab)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\tbar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with LF)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\nbar"}]]], + "expected": [""] +}, + +{"description": "proper attribute value quoting (with CR)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\rbar"}]]], + "expected": [""] +}, + +{"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": [""], + "xhtml": [""] +}, + +{"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": [""] +}, + +{"description": "void element (as EmptyTag token)", + "input": [["EmptyTag", "img", {}]], + "expected": [""], + "xhtml": [""] +}, + +{"description": "void element (as StartTag token)", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "img", {}]], + "expected": [""], + "xhtml": [""] +}, + +{"description": "doctype in error", + "input": [["Doctype", "foo"]], + "expected": [""] +}, + +{"description": "character data", + "options": {"encoding":"utf-8"}, + "input": [["Characters", "ac&d"]], + "expected": ["a<b>c&d"] +}, + +{"description": "rcdata", + "input": [["StartTag", "http://www.w3.org/1999/xhtml", "script", {}], ["Characters", "ac&d"]], + "expected": [""] +}, + +{"description": "text within "] +} + +]} \ No newline at end of file diff --git a/html5lib/tests/support.py b/html5lib/tests/support.py index 54a64a85..6e6a916b 100644 --- a/html5lib/tests/support.py +++ b/html5lib/tests/support.py @@ -69,8 +69,8 @@ } -def get_data_files(subdirectory, files='*.dat'): - return sorted(glob.glob(os.path.join(test_dir, subdirectory, files))) +def get_data_files(subdirectory, files='*.dat', search_dir=test_dir): + return sorted(glob.glob(os.path.join(search_dir, subdirectory, files))) class DefaultDict(dict): diff --git a/html5lib/tests/test_serializer.py b/html5lib/tests/test_serializer.py index af76075e..c7e9d7ed 100644 --- a/html5lib/tests/test_serializer.py +++ b/html5lib/tests/test_serializer.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, division, unicode_literals +import os import json import unittest @@ -170,7 +171,7 @@ def testEntityNoResolve(self): def test_serializer(): - for filename in get_data_files('serializer', '*.test'): + for filename in get_data_files('serializer-testdata', '*.test', os.path.dirname(__file__)): with open(filename) as fp: tests = json.load(fp) for index, test in enumerate(tests['tests']): From b7a37d296562392170a406cf611adaf2821c9390 Mon Sep 17 00:00:00 2001 From: Geoffrey Sneddon Date: Sun, 8 May 2016 18:12:26 +0100 Subject: [PATCH 053/278] Reindent serializer testdata --- html5lib/tests/serializer-testdata/core.test | 552 ++- .../tests/serializer-testdata/injectmeta.test | 444 +- .../serializer-testdata/optionaltags.test | 4219 +++++++++++++---- .../tests/serializer-testdata/options.test | 265 +- .../tests/serializer-testdata/whitespace.test | 249 +- 5 files changed, 4462 insertions(+), 1267 deletions(-) diff --git a/html5lib/tests/serializer-testdata/core.test b/html5lib/tests/serializer-testdata/core.test index c0b4222d..0f3092bb 100644 --- a/html5lib/tests/serializer-testdata/core.test +++ b/html5lib/tests/serializer-testdata/core.test @@ -1,125 +1,427 @@ -{"tests": [ - -{"description": "proper attribute value escaping", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "test \"with\" ""}]]], - "expected": [""] -}, - -{"description": "proper attribute value non-quoting", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"}]]], - "expected": [""], - "xhtml": [""] -}, - -{"description": "proper attribute value non-quoting (with <)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo"], - "xhtml": [""] -}, - -{"description": "proper attribute value quoting (with =)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo=bar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with >)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo>bar"}]]], - "expected": ["bar\">"] -}, - -{"description": "proper attribute value quoting (with \")", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\"bar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with ')", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo'bar"}]]], - "expected": [""] -}, - -{"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": [""] -}, - -{"description": "proper attribute value quoting (with space)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo bar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with tab)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\tbar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with LF)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\nbar"}]]], - "expected": [""] -}, - -{"description": "proper attribute value quoting (with CR)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "span", [{"namespace": null, "name": "title", "value": "foo\rbar"}]]], - "expected": [""] -}, - -{"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": [""], - "xhtml": [""] -}, - -{"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": [""] -}, - -{"description": "void element (as EmptyTag token)", - "input": [["EmptyTag", "img", {}]], - "expected": [""], - "xhtml": [""] -}, - -{"description": "void element (as StartTag token)", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "img", {}]], - "expected": [""], - "xhtml": [""] -}, - -{"description": "doctype in error", - "input": [["Doctype", "foo"]], - "expected": [""] -}, - -{"description": "character data", - "options": {"encoding":"utf-8"}, - "input": [["Characters", "ac&d"]], - "expected": ["a<b>c&d"] -}, - -{"description": "rcdata", - "input": [["StartTag", "http://www.w3.org/1999/xhtml", "script", {}], ["Characters", "ac&d"]], - "expected": [""] -}, - -{"description": "text within "] -} - -]} \ No newline at end of file +{ + "tests": [ + { + "expected": [ + " foo" + ], + "input": [ + [ + "Characters", + "\t\r\n\f foo" + ] + ], + "description": "bare text with leading spaces", + "options": { + "strip_whitespace": true + } + }, + { + "expected": [ + "foo " + ], + "input": [ + [ + "Characters", + "foo \t\r\n\f" + ] + ], + "description": "bare text with trailing spaces", + "options": { + "strip_whitespace": true + } + }, + { + "expected": [ + "foo bar" + ], + "input": [ + [ + "Characters", + "foo \t\r\n\f bar" + ] + ], + "description": "bare text with inner spaces", + "options": { + "strip_whitespace": true + } + }, + { + "expected": [ + "
\t\r\n\f foo \t\r\n\f bar \t\r\n\f
" + ], + "input": [ + [ + "StartTag", + "http://www.w3.org/1999/xhtml", + "pre", + {} + ], + [ + "Characters", + "\t\r\n\f foo \t\r\n\f bar \t\r\n\f" + ], + [ + "EndTag", + "http://www.w3.org/1999/xhtml", + "pre" + ] + ], + "description": "text within
",
+            "options": {
+                "strip_whitespace": true
+            }
+        },
+        {
+            "expected": [
+                "
\t\r\n\f foo \t\r\n\f bar \t\r\n\f
" + ], + "input": [ + [ + "StartTag", + "http://www.w3.org/1999/xhtml", + "pre", + {} + ], + [ + "Characters", + "\t\r\n\f fo" + ], + [ + "StartTag", + "http://www.w3.org/1999/xhtml", + "span", + {} + ], + [ + "Characters", + "o \t\r\n\f b" + ], + [ + "EndTag", + "http://www.w3.org/1999/xhtml", + "span" + ], + [ + "Characters", + "ar \t\r\n\f" + ], + [ + "EndTag", + "http://www.w3.org/1999/xhtml", + "pre" + ] + ], + "description": "text within
, with inner markup",
+            "options": {
+                "strip_whitespace": true
+            }
+        },
+        {
+            "expected": [
+                ""
+            ],
+            "input": [
+                [
+                    "StartTag",
+                    "http://www.w3.org/1999/xhtml",
+                    "textarea",
+                    {}
+                ],
+                [
+                    "Characters",
+                    "\t\r\n\f foo \t\r\n\f bar \t\r\n\f"
+                ],
+                [
+                    "EndTag",
+                    "http://www.w3.org/1999/xhtml",
+                    "textarea"
+                ]
+            ],
+            "description": "text within