Browse Source

Clean up foreign content case normalization

ns
J. King 3 years ago
parent
commit
8e7a0f6284
  1. 302
      lib/TreeBuilder.php

302
lib/TreeBuilder.php

@ -98,6 +98,108 @@ class TreeBuilder {
self::AFTER_AFTER_BODY_MODE => "After after body",
self::AFTER_AFTER_FRAMESET_MODE => "After after frameset",
];
protected const SVG_TAG_NAME_MAP = [
'altglyph' => 'altGlyph',
'altglyphdef' => 'altGlyphDef',
'altglyphitem' => 'altGlyphItem',
'animatecolor' => 'animateColor',
'animatemotion' => 'animateMotion',
'animatetransform' => 'animateTransform',
'clippath' => 'clipPath',
'feblend' => 'feBlend',
'fecolormatrix' => 'feColorMatrix',
'fecomponenttransfer' => 'feComponentTransfer',
'fecomposite' => 'feComposite',
'feconvolvematrix' => 'feConvolveMatrix',
'fediffuselighting' => 'feDiffuseLighting',
'fedisplacementmap' => 'feDisplacementMap',
'fedistantlight' => 'feDistantLight',
'feflood' => 'feFlood',
'fefunca' => 'feFuncA',
'fefuncb' => 'feFuncB',
'fefuncg' => 'feFuncG',
'fefuncr' => 'feFuncR',
'fegaussianblur' => 'feGaussianBlur',
'feimage' => 'feImage',
'femerge' => 'feMerge',
'femergenode' => 'feMergeNode',
'femorphology' => 'feMorphology',
'feoffset' => 'feOffset',
'fepointlight' => 'fePointLight',
'fespecularlighting' => 'feSpecularLighting',
'fespotlight' => 'feSpotLight',
'fetile' => 'feTile',
'feturbulence' => 'feTurbulence',
'foreignobject' => 'foreignObject',
'glyphref' => 'glyphRef',
'lineargradient' => 'linearGradient',
'radialgradient' => 'radialGradient',
'textpath' => 'textPath',
];
protected const SVG_ATTR_NAME_MAP = [
'attributename' => 'attributeName',
'attributetype' => 'attributeType',
'basefrequency' => 'baseFrequency',
'baseprofile' => 'baseProfile',
'calcmode' => 'calcMode',
'clippathunits' => 'clipPathUnits',
'contentscripttype' => 'contentScriptType',
'contentstyletype' => 'contentStyleType',
'diffuseconstant' => 'diffuseConstant',
'edgemode' => 'edgeMode',
'externalresourcesrequired' => 'externalResourcesRequired',
'filterres' => 'filterRes',
'filterunits' => 'filterUnits',
'glyphref' => 'glyphRef',
'gradienttransform' => 'gradientTransform',
'gradientunits' => 'gradientUnits',
'kernelmatrix' => 'kernelMatrix',
'kernelunitlength' => 'kernelUnitLength',
'keypoints' => 'keyPoints',
'keysplines' => 'keySplines',
'keytimes' => 'keyTimes',
'lengthadjust' => 'lengthAdjust',
'limitingconeangle' => 'limitingConeAngle',
'markerheight' => 'markerHeight',
'markerunits' => 'markerUnits',
'markerwidth' => 'markerWidth',
'maskcontentunits' => 'maskContentUnits',
'maskunits' => 'maskUnits',
'numoctaves' => 'numOctaves',
'pathlength' => 'pathLength',
'patterncontentunits' => 'patternContentUnits',
'patterntransform' => 'patternTransform',
'patternunits' => 'patternUnits',
'pointsatx' => 'pointsAtX',
'pointsaty' => 'pointsAtY',
'pointsatz' => 'pointsAtZ',
'preservealpha' => 'preserveAlpha',
'preserveaspectratio' => 'preserveAspectRatio',
'primitiveunits' => 'primitiveUnits',
'refx' => 'refX',
'refy' => 'refY',
'repeatcount' => 'repeatCount',
'repeatdur' => 'repeatDur',
'requiredextensions' => 'requiredExtensions',
'requiredfeatures' => 'requiredFeatures',
'specularconstant' => 'specularConstant',
'specularexponent' => 'specularExponent',
'spreadmethod' => 'spreadMethod',
'startoffset' => 'startOffset',
'stddeviation' => 'stdDeviation',
'stitchtiles' => 'stitchTiles',
'surfacescale' => 'surfaceScale',
'systemlanguage' => 'systemLanguage',
'tablevalues' => 'tableValues',
'targetx' => 'targetX',
'targety' => 'targetY',
'textlength' => 'textLength',
'viewbox' => 'viewBox',
'viewtarget' => 'viewTarget',
'xchannelselector' => 'xChannelSelector',
'ychannelselector' => 'yChannelSelector',
'zoomandpan' => 'zoomAndPan',
];
public function __construct(Document $dom, $formElement, bool $fragmentCase = false, $fragmentContext = null, OpenElementsStack $stack, Stack $templateInsertionModes, Tokenizer $tokenizer, ParseError $errorHandler, Data $data) {
// If the form element isn't an instance of DOMElement that has a node name of
@ -1484,79 +1586,7 @@ class TreeBuilder {
# second column. (This fixes the case of SVG elements that are not all
# lowercase.)
if ($this->stack->adjustedCurrentNodeNamespace === Parser::SVG_NAMESPACE) {
switch ($token->name) {
case 'altglyph': $token->name = 'altGlyph';
break;
case 'altglyphdef': $token->name = 'altGlyphDef';
break;
case 'altglyphitem': $token->name = 'altGlyphItem';
break;
case 'animatecolor': $token->name = 'animateColor';
break;
case 'animatemotion': $token->name = 'animateMotion';
break;
case 'animatetransform': $token->name = 'animateTransform';
break;
case 'clippath': $token->name = 'clipPath';
break;
case 'feblend': $token->name = 'feBlend';
break;
case 'fecolormatrix': $token->name = 'feColorMatrix';
break;
case 'fecomponenttransfer': $token->name = 'feComponentTransfer';
break;
case 'fecomposite': $token->name = 'feComposite';
break;
case 'feconvolvematrix': $token->name = 'feConvolveMatrix';
break;
case 'fediffuselighting': $token->name = 'feDiffuseLighting';
break;
case 'fedisplacementmap': $token->name = 'feDisplacementMap';
break;
case 'fedistantlight': $token->name = 'feDistantLight';
break;
case 'feflood': $token->name = 'feFlood';
break;
case 'fefunca': $token->name = 'feFuncA';
break;
case 'fefuncb': $token->name = 'feFuncB';
break;
case 'fefuncg': $token->name = 'feFuncG';
break;
case 'fefuncr': $token->name = 'feFuncR';
break;
case 'fegaussianblur': $token->name = 'feGaussianBlur';
break;
case 'feimage': $token->name = 'feImage';
break;
case 'femerge': $token->name = 'feMerge';
break;
case 'femergenode': $token->name = 'feMergeNode';
break;
case 'femorphology': $token->name = 'feMorphology';
break;
case 'feoffset': $token->name = 'feOffset';
break;
case 'fepointlight': $token->name = 'fePointLight';
break;
case 'fespecularlighting': $token->name = 'feSpecularLighting';
break;
case 'fespotlight': $token->name = 'feSpotLight';
break;
case 'fetile': $token->name = 'feTile';
break;
case 'feturbulence': $token->name = 'feTurbulence';
break;
case 'foreignobject': $token->name = 'foreignObject';
break;
case 'glyphref': $token->name = 'glyphRef';
break;
case 'lineargradient': $token->name = 'linearGradient';
break;
case 'radialgradient': $token->name = 'radialGradient';
break;
case 'textpath': $token->name = 'textPath';
}
$token->name = self::SVG_TAG_NAME_MAP[$token->name] ?? $token->name;
}
foreach ($token->attributes as &$a) {
@ -1570,131 +1600,7 @@ class TreeBuilder {
# for the token. (This fixes the case of SVG attributes that are not all
# lowercase.)
elseif ($currentNodeNamespace === Parser::SVG_NAMESPACE) {
switch ($a->name) {
case 'attributename': $a->name = 'attributeName';
break;
case 'attributetype': $a->name = 'attributeType';
break;
case 'basefrequency': $a->name = 'baseFrequency';
break;
case 'baseprofile': $a->name = 'baseProfile';
break;
case 'calcmode': $a->name = 'calcMode';
break;
case 'clippathunits': $a->name = 'clipPathUnits';
break;
case 'contentscripttype': $a->name = 'contentScriptType';
break;
case 'contentstyletype': $a->name = 'contentStyleType';
break;
case 'diffuseconstant': $a->name = 'diffuseConstant';
break;
case 'edgemode': $a->name = 'edgeMode';
break;
case 'externalresourcesrequired': $a->name = 'externalResourcesRequired';
break;
case 'filterres': $a->name = 'filterRes';
break;
case 'filterunits': $a->name = 'filterUnits';
break;
case 'glyphref': $a->name = 'glyphRef';
break;
case 'gradienttransform': $a->name = 'gradientTransform';
break;
case 'gradientunits': $a->name = 'gradientUnits';
break;
case 'kernelmatrix': $a->name = 'kernelMatrix';
break;
case 'kernelunitlength': $a->name = 'kernelUnitLength';
break;
case 'keypoints': $a->name = 'keyPoints';
break;
case 'keysplines': $a->name = 'keySplines';
break;
case 'keytimes': $a->name = 'keyTimes';
break;
case 'lengthadjust': $a->name = 'lengthAdjust';
break;
case 'limitingconeangle': $a->name = 'limitingConeAngle';
break;
case 'markerheight': $a->name = 'markerHeight';
break;
case 'markerunits': $a->name = 'markerUnits';
break;
case 'markerwidth': $a->name = 'markerWidth';
break;
case 'maskcontentunits': $a->name = 'maskContentUnits';
break;
case 'maskunits': $a->name = 'maskUnits';
break;
case 'numoctaves': $a->name = 'numOctaves';
break;
case 'pathlength': $a->name = 'pathLength';
break;
case 'patterncontentunits': $a->name = 'patternContentUnits';
break;
case 'patterntransform': $a->name = 'patternTransform';
break;
case 'patternunits': $a->name = 'patternUnits';
break;
case 'pointsatx': $a->name = 'pointsAtX';
break;
case 'pointsaty': $a->name = 'pointsAtY';
break;
case 'pointsatz': $a->name = 'pointsAtZ';
break;
case 'preservealpha': $a->name = 'preserveAlpha';
break;
case 'preserveaspectratio': $a->name = 'preserveAspectRatio';
break;
case 'primitiveunits': $a->name = 'primitiveUnits';
break;
case 'refx': $a->name = 'refX';
break;
case 'refy': $a->name = 'refY';
break;
case 'repeatcount': $a->name = 'repeatCount';
break;
case 'repeatdur': $a->name = 'repeatDur';
break;
case 'requiredextensions': $a->name = 'requiredExtensions';
break;
case 'requiredfeatures': $a->name = 'requiredFeatures';
break;
case 'specularconstant': $a->name = 'specularConstant';
break;
case 'specularexponent': $a->name = 'specularExponent';
break;
case 'spreadmethod': $a->name = 'spreadMethod';
break;
case 'startoffset': $a->name = 'startOffset';
break;
case 'stddeviation': $a->name = 'stdDeviation';
break;
case 'stitchtiles': $a->name = 'stitchTiles';
break;
case 'surfacescale': $a->name = 'surfaceScale';
break;
case 'systemlanguage': $a->name = 'systemLanguage';
break;
case 'tablevalues': $a->name = 'tableValues';
break;
case 'targetx': $a->name = 'targetX';
break;
case 'targety': $a->name = 'targetY';
break;
case 'textlength': $a->name = 'textLength';
break;
case 'viewbox': $a->name = 'viewBox';
break;
case 'viewtarget': $a->name = 'viewTarget';
break;
case 'xchannelselector': $a->name = 'xChannelSelector';
break;
case 'ychannelselector': $a->name = 'yChannelSelector';
break;
case 'zoomandpan': $a->name = 'zoomAndPan';
}
$a->name = self::SVG_ATTR_NAME_MAP[$a->name] ?? $a->name;
}
# Adjust foreign attributes for the token. (This fixes the use of namespaced

Loading…
Cancel
Save