|
2 | 2 | from six import with_metaclass |
3 | 3 |
|
4 | 4 | import types |
| 5 | +from collections import OrderedDict |
5 | 6 |
|
6 | 7 | from . import inputstream |
7 | 8 | from . import tokenizer |
|
17 | 18 | namespaces, |
18 | 19 | htmlIntegrationPointElements, mathmlTextIntegrationPointElements, |
19 | 20 | adjustForeignAttributes as adjustForeignAttributesMap, |
| 21 | + adjustMathMLAttributes, adjustSVGAttributes, |
20 | 22 | E, |
21 | 23 | ReparseException |
22 | 24 | ) |
@@ -263,96 +265,18 @@ def normalizeToken(self, token): |
263 | 265 | """ HTML5 specific normalizations to the token stream """ |
264 | 266 |
|
265 | 267 | if token["type"] == tokenTypes["StartTag"]: |
266 | | - token["data"] = dict(token["data"][::-1]) |
| 268 | + token["data"] = OrderedDict(token['data']) |
267 | 269 |
|
268 | 270 | return token |
269 | 271 |
|
270 | 272 | def adjustMathMLAttributes(self, token): |
271 | | - replacements = {"definitionurl": "definitionURL"} |
272 | | - for k, v in replacements.items(): |
273 | | - if k in token["data"]: |
274 | | - token["data"][v] = token["data"][k] |
275 | | - del token["data"][k] |
| 273 | + adjust_attributes(token, adjustMathMLAttributes) |
276 | 274 |
|
277 | 275 | def adjustSVGAttributes(self, token): |
278 | | - replacements = { |
279 | | - "attributename": "attributeName", |
280 | | - "attributetype": "attributeType", |
281 | | - "basefrequency": "baseFrequency", |
282 | | - "baseprofile": "baseProfile", |
283 | | - "calcmode": "calcMode", |
284 | | - "clippathunits": "clipPathUnits", |
285 | | - "contentscripttype": "contentScriptType", |
286 | | - "contentstyletype": "contentStyleType", |
287 | | - "diffuseconstant": "diffuseConstant", |
288 | | - "edgemode": "edgeMode", |
289 | | - "externalresourcesrequired": "externalResourcesRequired", |
290 | | - "filterres": "filterRes", |
291 | | - "filterunits": "filterUnits", |
292 | | - "glyphref": "glyphRef", |
293 | | - "gradienttransform": "gradientTransform", |
294 | | - "gradientunits": "gradientUnits", |
295 | | - "kernelmatrix": "kernelMatrix", |
296 | | - "kernelunitlength": "kernelUnitLength", |
297 | | - "keypoints": "keyPoints", |
298 | | - "keysplines": "keySplines", |
299 | | - "keytimes": "keyTimes", |
300 | | - "lengthadjust": "lengthAdjust", |
301 | | - "limitingconeangle": "limitingConeAngle", |
302 | | - "markerheight": "markerHeight", |
303 | | - "markerunits": "markerUnits", |
304 | | - "markerwidth": "markerWidth", |
305 | | - "maskcontentunits": "maskContentUnits", |
306 | | - "maskunits": "maskUnits", |
307 | | - "numoctaves": "numOctaves", |
308 | | - "pathlength": "pathLength", |
309 | | - "patterncontentunits": "patternContentUnits", |
310 | | - "patterntransform": "patternTransform", |
311 | | - "patternunits": "patternUnits", |
312 | | - "pointsatx": "pointsAtX", |
313 | | - "pointsaty": "pointsAtY", |
314 | | - "pointsatz": "pointsAtZ", |
315 | | - "preservealpha": "preserveAlpha", |
316 | | - "preserveaspectratio": "preserveAspectRatio", |
317 | | - "primitiveunits": "primitiveUnits", |
318 | | - "refx": "refX", |
319 | | - "refy": "refY", |
320 | | - "repeatcount": "repeatCount", |
321 | | - "repeatdur": "repeatDur", |
322 | | - "requiredextensions": "requiredExtensions", |
323 | | - "requiredfeatures": "requiredFeatures", |
324 | | - "specularconstant": "specularConstant", |
325 | | - "specularexponent": "specularExponent", |
326 | | - "spreadmethod": "spreadMethod", |
327 | | - "startoffset": "startOffset", |
328 | | - "stddeviation": "stdDeviation", |
329 | | - "stitchtiles": "stitchTiles", |
330 | | - "surfacescale": "surfaceScale", |
331 | | - "systemlanguage": "systemLanguage", |
332 | | - "tablevalues": "tableValues", |
333 | | - "targetx": "targetX", |
334 | | - "targety": "targetY", |
335 | | - "textlength": "textLength", |
336 | | - "viewbox": "viewBox", |
337 | | - "viewtarget": "viewTarget", |
338 | | - "xchannelselector": "xChannelSelector", |
339 | | - "ychannelselector": "yChannelSelector", |
340 | | - "zoomandpan": "zoomAndPan" |
341 | | - } |
342 | | - for originalName in list(token["data"].keys()): |
343 | | - if originalName in replacements: |
344 | | - svgName = replacements[originalName] |
345 | | - token["data"][svgName] = token["data"][originalName] |
346 | | - del token["data"][originalName] |
| 276 | + adjust_attributes(token, adjustSVGAttributes) |
347 | 277 |
|
348 | 278 | def adjustForeignAttributes(self, token): |
349 | | - replacements = adjustForeignAttributesMap |
350 | | - |
351 | | - for originalName in token["data"].keys(): |
352 | | - if originalName in replacements: |
353 | | - foreignName = replacements[originalName] |
354 | | - token["data"][foreignName] = token["data"][originalName] |
355 | | - del token["data"][originalName] |
| 279 | + adjust_attributes(token, adjustForeignAttributesMap) |
356 | 280 |
|
357 | 281 | def reparseTokenNormal(self, token): |
358 | 282 | self.parser.phase() |
@@ -2702,6 +2626,12 @@ def processEndTag(self, token): |
2702 | 2626 | } |
2703 | 2627 |
|
2704 | 2628 |
|
| 2629 | +def adjust_attributes(token, replacements): |
| 2630 | + if frozenset(token['data']) & frozenset(replacements): |
| 2631 | + token['data'] = OrderedDict( |
| 2632 | + (replacements.get(k, k), v) for k, v in token['data'].iteritems()) |
| 2633 | + |
| 2634 | + |
2705 | 2635 | def impliedTagToken(name, type="EndTag", attributes=None, |
2706 | 2636 | selfClosing=False): |
2707 | 2637 | if attributes is None: |
|
0 commit comments