|
2 | 2 | fromsiximportwith_metaclass,viewkeys
|
3 | 3 |
|
4 | 4 | importtypes
|
| 5 | + |
5 | 6 | fromcollectionsimportOrderedDict
|
| 7 | +fromsysimportversion_info |
6 | 8 |
|
7 | 9 | from .import_inputstream
|
8 | 10 | from .import_tokenizer
|
|
24 | 26 | )
|
25 | 27 |
|
26 | 28 |
|
| 29 | +ifversion_info>= (3,7): |
| 30 | +attributeMap=dict |
| 31 | +else: |
| 32 | +attributeMap=OrderedDict |
| 33 | + |
| 34 | + |
27 | 35 | defparse(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 | iftoken["type"]==tokenTypes["StartTag"]:
|
331 | 339 | raw=token["data"]
|
332 |
| -token["data"]=OrderedDict(raw) |
333 |
| -iflen(raw)>len(token["data"]): |
| 340 | +data=attributeMap(raw) |
| 341 | +iflen(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 | returntoken
|
338 | 347 |
|
@@ -2770,8 +2779,8 @@ def processEndTag(self, token):
|
2770 | 2779 | defadjust_attributes(token,replacements):
|
2771 | 2780 | needs_adjustment=viewkeys(token['data'])&viewkeys(replacements)
|
2772 | 2781 | ifneeds_adjustment:
|
2773 |
| -token['data']=OrderedDict((replacements.get(k,k),v) |
2774 |
| -fork,vintoken['data'].items()) |
| 2782 | +token['data']=attributeMap((replacements.get(k,k),v) |
| 2783 | +fork,vintoken['data'].items()) |
2775 | 2784 |
|
2776 | 2785 |
|
2777 | 2786 | defimpliedTagToken(name,type="EndTag",attributes=None,
|
|