|
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, |
|