|
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