|
2 | 2 | from six import with_metaclass, viewkeys
|
3 | 3 |
|
4 | 4 | import types
|
| 5 | + |
5 | 6 | from collections import OrderedDict
|
| 7 | +from sys import version_info |
6 | 8 |
|
7 | 9 | from . import _inputstream
|
8 | 10 | from . import _tokenizer
|
|
24 | 26 | )
|
25 | 27 |
|
26 | 28 |
|
| 29 | +if version_info >= (3, 7): |
| 30 | + attributeMap = dict |
| 31 | +else: |
| 32 | + attributeMap = OrderedDict |
| 33 | + |
| 34 | + |
27 | 35 | def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs):
|
28 | 36 | """Parse an HTML document as a string or file-like object into a tree
|
29 | 37 |
|
@@ -329,10 +337,11 @@ def normalizeToken(self, token):
|
329 | 337 | # HTML5 specific normalizations to the token stream
|
330 | 338 | if token["type"] == tokenTypes["StartTag"]:
|
331 | 339 | raw = token["data"]
|
332 |
| - token["data"] = OrderedDict(raw) |
333 |
| - if len(raw) > len(token["data"]): |
| 340 | + data = attributeMap(raw) |
| 341 | + if len(raw) > len(data): |
334 | 342 | # we had some duplicated attribute, fix so first wins
|
335 |
| - token["data"].update(raw[::-1]) |
| 343 | + data.update(raw[::-1]) |
| 344 | + token["data"] = data |
336 | 345 |
|
337 | 346 | return token
|
338 | 347 |
|
@@ -2770,8 +2779,8 @@ def processEndTag(self, token):
|
2770 | 2779 | def adjust_attributes(token, replacements):
|
2771 | 2780 | needs_adjustment = viewkeys(token['data']) & viewkeys(replacements)
|
2772 | 2781 | if needs_adjustment:
|
2773 |
| - token['data'] = OrderedDict((replacements.get(k, k), v) |
2774 |
| - for k, v in token['data'].items()) |
| 2782 | + token['data'] = attributeMap((replacements.get(k, k), v) |
| 2783 | + for k, v in token['data'].items()) |
2775 | 2784 |
|
2776 | 2785 |
|
2777 | 2786 | def impliedTagToken(name, type="EndTag", attributes=None,
|
|
0 commit comments