From 1c3dcba9c035e8d8a18905da72d0a5112813764d Mon Sep 17 00:00:00 2001 From: "J. King" Date: Thu, 27 Apr 2023 17:13:44 -0400 Subject: [PATCH] Add elements and attributes from SVG2, ARIA The constant-generation process is still broken --- RoboFile.php | 375 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 364 insertions(+), 11 deletions(-) diff --git a/RoboFile.php b/RoboFile.php index 6a093a8..acc51cc 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -159,20 +159,360 @@ class RoboFile extends \Robo\Tasks { public function constants(): Result { $c = $this->collectionBuilder()->addCode(function() { - $out = ['elem' => [], 'attr' => []]; - $elems = []; - $attrs = []; + $elems = [ + 'self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"], + ]; + $attrs = [ + 'self::NULL_NAMESPACE' => [ + 'accumulate' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform"]], + 'additive' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform"]], + 'amplitude' => ['self::SVG_NAMESPACE' => ["feFuncA", "feFuncB", "feFuncG", "feFuncR"]], + 'aria-activedescendant' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-atomic' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-autocomplete' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-busy' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-checked' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-colcount' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-colindex' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-colspan' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-controls' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-current' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-describedby' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-details' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-disabled' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-dropeffect' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-errormessage' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-expanded' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-flowto' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-grabbed' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-haspopup' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-hidden' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-invalid' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-keyshortcuts' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-label' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-labelledby' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-level' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-live' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-modal' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-multiline' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-multiselectable' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-orientation' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-owns' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-placeholder' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-posinset' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-pressed' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-readonly' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-relevant' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-required' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-roledescription' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-rowcount' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-rowindex' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-rowspan' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-selected' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-setsize' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-sort' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-valuemax' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-valuemin' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-valuenow' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'aria-valuetext' => ['self::HTML_NAMESPACE' => ["*"], 'self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'attributeName' => ['self::SVG_NAMESPACE' => ["animate", "animateTransform", "set"]], + 'azimuth' => ['self::SVG_NAMESPACE' => ["feDistantLight"]], + 'baseFrequency' => ['self::SVG_NAMESPACE' => ["feTurbulence"]], + 'begin' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set", "discard"]], + 'bias' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix"]], + 'by' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform"]], + 'calcMode' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform"]], + 'class' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'clipPathUnits' => ['self::SVG_NAMESPACE' => ["clipPath"]], + 'crossorigin' => ['self::SVG_NAMESPACE' => ["feImage", "image", "script"]], + 'cx' => ['self::SVG_NAMESPACE' => ["radialGradient", "circle", "ellipse"]], + 'cy' => ['self::SVG_NAMESPACE' => ["radialGradient", "circle", "ellipse"]], + 'd' => ['self::SVG_NAMESPACE' => ["path"]], + 'diffuseConstant' => ['self::SVG_NAMESPACE' => ["feDiffuseLighting"]], + 'divisor' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix"]], + 'download' => ['self::SVG_NAMESPACE' => ["a"]], + 'dur' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'dx' => ['self::SVG_NAMESPACE' => ["feDropShadow", "feOffset", "text", "tspan"]], + 'dy' => ['self::SVG_NAMESPACE' => ["feDropShadow", "feOffset", "text", "tspan"]], + 'edgeMode' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix"]], + 'edgeMode' => ['self::SVG_NAMESPACE' => ["feGaussianBlur"]], + 'elevation' => ['self::SVG_NAMESPACE' => ["feDistantLight"]], + 'end' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'exponent' => ['self::SVG_NAMESPACE' => ["feFuncA", "feFuncB", "feFuncG", "feFuncR"]], + 'fill' => ['self::SVG_NAMESPACE' => ["*"]], + 'filterUnits' => ['self::SVG_NAMESPACE' => ["filter"]], + 'fr' => ['self::SVG_NAMESPACE' => ["radialGradient"]], + 'from' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform"]], + 'fx' => ['self::SVG_NAMESPACE' => ["radialGradient"]], + 'fy' => ['self::SVG_NAMESPACE' => ["radialGradient"]], + 'gradientTransform' => ['self::SVG_NAMESPACE' => ["linearGradient", "radialGradient"]], + 'gradientUnits' => ['self::SVG_NAMESPACE' => ["linearGradient", "radialGradient"]], + 'height' => ['self::SVG_NAMESPACE' => ["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDropShadow", "feFlood", "feGaussianBlur", "feImage", "feMerge", "feMorphology", "feOffset", "feSpecularLighting", "feTile", "feTurbulence", "filter", "mask", "pattern", "foreignObject", "image", "rect", "svg", "symbol", "use"]], + 'href' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "set", "discard", "feImage", "image", "linearGradient", "mpath", "pattern", "radialGradient", "script", "textPath", "use"]], + 'hreflang' => ['self::SVG_NAMESPACE' => ["a"]], + 'id' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'in' => ['self::SVG_NAMESPACE' => ["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDropShadow", "feGaussianBlur", "feMergeNode", "feMorphology", "feOffset", "feSpecularLighting", "feTile"]], + 'in2' => ['self::SVG_NAMESPACE' => ["feBlend", "feComposite", "feDisplacementMap"]], + 'intercept' => ['self::SVG_NAMESPACE' => ["feFuncA", "feFuncB", "feFuncG", "feFuncR"]], + 'k1' => ['self::SVG_NAMESPACE' => ["feComposite"]], + 'k2' => ['self::SVG_NAMESPACE' => ["feComposite"]], + 'k3' => ['self::SVG_NAMESPACE' => ["feComposite"]], + 'k4' => ['self::SVG_NAMESPACE' => ["feComposite"]], + 'kernelMatrix' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix", "feConvolveMatrix", "feDiffuseLighting", "feSpecularLighting"]], + 'keyPoints' => ['self::SVG_NAMESPACE' => ["animateMotion"]], + 'keySplines' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform"]], + 'keyTimes' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform"]], + 'lang' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'lengthAdjust' => ['self::SVG_NAMESPACE' => ["text", "textPath", "tspan"]], + 'limitingConeAngle' => ['self::SVG_NAMESPACE' => ["feSpotLight"]], + 'markerHeight' => ['self::SVG_NAMESPACE' => ["marker"]], + 'markerUnits' => ['self::SVG_NAMESPACE' => ["marker"]], + 'markerWidth' => ['self::SVG_NAMESPACE' => ["marker"]], + 'maskContentUnits' => ['self::SVG_NAMESPACE' => ["mask"]], + 'maskUnits' => ['self::SVG_NAMESPACE' => ["mask"]], + 'max' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'media' => ['self::SVG_NAMESPACE' => ["style"]], + 'method' => ['self::SVG_NAMESPACE' => ["textPath"]], + 'min' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'mode' => ['self::SVG_NAMESPACE' => ["feBlend"]], + 'numOctaves' => ['self::SVG_NAMESPACE' => ["feTurbulence"]], + 'offset' => ['self::SVG_NAMESPACE' => ["feFuncA", "feFuncB", "feFuncG", "feFuncR", "stop"]], + 'onabort' => ['self::SVG_NAMESPACE' => ["svg"]], + 'onafterprint' => ['self::SVG_NAMESPACE' => ["*"]], + 'onbeforeprint' => ['self::SVG_NAMESPACE' => ["*"]], + 'onbegin' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'oncancel' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'oncanplay' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'oncanplaythrough' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onchange' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onclick' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onclose' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'oncopy' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'oncuechange' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'oncut' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondblclick' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondrag' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondragend' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondragenter' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondragexit' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondragleave' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondragover' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondragstart' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondrop' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ondurationchange' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onemptied' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onend' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'onended' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onerror' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view", "svg"]], + 'onfocus' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onfocusin' => ['self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "defs", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video"]], + 'onfocusout' => ['self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "defs", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video"]], + 'onhashchange' => ['self::SVG_NAMESPACE' => ["*"]], + 'oninput' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'oninvalid' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onkeydown' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onkeypress' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onkeyup' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onload' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onloadeddata' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onloadedmetadata' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onloadstart' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmessage' => ['self::SVG_NAMESPACE' => ["*"]], + 'onmousedown' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmouseenter' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmouseleave' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmousemove' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmouseout' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmouseover' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmouseup' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onmousewheel' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onoffline' => ['self::SVG_NAMESPACE' => ["*"]], + 'ononline' => ['self::SVG_NAMESPACE' => ["*"]], + 'onpagehide' => ['self::SVG_NAMESPACE' => ["*"]], + 'onpageshow' => ['self::SVG_NAMESPACE' => ["*"]], + 'onpaste' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onpause' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onplay' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onplaying' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onpopstate' => ['self::SVG_NAMESPACE' => ["*"]], + 'onprogress' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onratechange' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onrepeat' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'onreset' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onresize' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view", "svg"]], + 'onscroll' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view", "svg"]], + 'onseeked' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onseeking' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onselect' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onshow' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onstalled' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onstorage' => ['self::SVG_NAMESPACE' => ["*"]], + 'onsubmit' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onsuspend' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ontimeupdate' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'ontoggle' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onunload' => ['self::SVG_NAMESPACE' => ["*"]], + 'onvolumechange' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'onwaiting' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "defs", "desc", "ellipse", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'operator' => ['self::SVG_NAMESPACE' => ["feComposite", "feMorphology"]], + 'order' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix"]], + 'orient' => ['self::SVG_NAMESPACE' => ["marker"]], + 'origin' => ['self::SVG_NAMESPACE' => ["animateMotion"]], + 'path' => ['self::SVG_NAMESPACE' => ["animateMotion", "textPath"]], + 'pathLength' => ['self::SVG_NAMESPACE' => ["circle", "ellipse", "line", "path", "polygon", "polyline", "rect"]], + 'patternContentUnits' => ['self::SVG_NAMESPACE' => ["pattern"]], + 'patternTransform' => ['self::SVG_NAMESPACE' => ["pattern"]], + 'patternUnits' => ['self::SVG_NAMESPACE' => ["pattern"]], + 'ping' => ['self::SVG_NAMESPACE' => ["a"]], + 'playbackorder' => ['self::SVG_NAMESPACE' => ["svg"]], + 'points' => ['self::SVG_NAMESPACE' => ["polygon", "polyline"]], + 'pointsAtX' => ['self::SVG_NAMESPACE' => ["feSpotLight"]], + 'pointsAtY' => ['self::SVG_NAMESPACE' => ["feSpotLight"]], + 'pointsAtZ' => ['self::SVG_NAMESPACE' => ["feSpotLight"]], + 'preserveAlpha' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix"]], + 'preserveAspectRatio' => ['self::SVG_NAMESPACE' => ["canvas", "feImage", "image", "marker", "pattern", "svg", "symbol", "view"]], + 'primitiveUnits' => ['self::SVG_NAMESPACE' => ["filter"]], + 'r' => ['self::SVG_NAMESPACE' => ["radialGradient", "circle"]], + 'radius' => ['self::SVG_NAMESPACE' => ["feMorphology"]], + 'refX' => ['self::SVG_NAMESPACE' => ["marker", "symbol"]], + 'refY' => ['self::SVG_NAMESPACE' => ["marker", "symbol"]], + 'referrerpolicy' => ['self::SVG_NAMESPACE' => ["a", "a"]], + 'repeatCount' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'repeatDur' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'requiredExtensions' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "mask", "path", "polygon", "polyline", "rect", "set", "svg", "switch", "text", "textPath", "tspan", "unknown", "use", "video"]], + 'restart' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'result' => ['self::SVG_NAMESPACE' => ["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDropShadow", "feFlood", "feGaussianBlur", "feImage", "feMerge", "feMorphology", "feOffset", "feSpecularLighting", "feTile", "feTurbulence"]], + 'role' => ['self::SVG_NAMESPACE' => ["a", "audio", "canvas", "circle", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "path", "polygon", "polyline", "rect", "svg", "switch", "symbol", "text", "textPath", "tspan", "unknown", "use", "video", "view"]], + 'rotate' => ['self::SVG_NAMESPACE' => ["animateMotion", "text", "tspan"]], + 'rx' => ['self::SVG_NAMESPACE' => ["ellipse", "rect"]], + 'ry' => ['self::SVG_NAMESPACE' => ["ellipse", "rect"]], + 'scale' => ['self::SVG_NAMESPACE' => ["feDisplacementMap"]], + 'seed' => ['self::SVG_NAMESPACE' => ["feTurbulence"]], + 'side' => ['self::SVG_NAMESPACE' => ["textPath"]], + 'slope' => ['self::SVG_NAMESPACE' => ["feFuncA", "feFuncB", "feFuncG", "feFuncR"]], + 'spacing' => ['self::SVG_NAMESPACE' => ["textPath"]], + 'specularConstant' => ['self::SVG_NAMESPACE' => ["feSpecularLighting"]], + 'specularExponent' => ['self::SVG_NAMESPACE' => ["feSpecularLighting", "feSpotLight"]], + 'spreadMethod' => ['self::SVG_NAMESPACE' => ["linearGradient", "radialGradient"]], + 'startOffset' => ['self::SVG_NAMESPACE' => ["textPath"]], + 'stdDeviation' => ['self::SVG_NAMESPACE' => ["feDropShadow", "feGaussianBlur"]], + 'stitchTiles' => ['self::SVG_NAMESPACE' => ["feTurbulence"]], + 'style' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'surfaceScale' => ['self::SVG_NAMESPACE' => ["feDiffuseLighting", "feSpecularLighting"]], + 'systemLanguage' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "discard", "ellipse", "foreignObject", "g", "iframe", "image", "line", "mask", "path", "polygon", "polyline", "rect", "set", "svg", "switch", "text", "textPath", "tspan", "unknown", "use", "video"]], + 'tabindex' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'tableValues' => ['self::SVG_NAMESPACE' => ["feFuncA", "feFuncB", "feFuncG", "feFuncR"]], + 'target' => ['self::SVG_NAMESPACE' => ["a"]], + 'targetX' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix"]], + 'targetY' => ['self::SVG_NAMESPACE' => ["feConvolveMatrix"]], + 'textLength' => ['self::SVG_NAMESPACE' => ["text", "textPath", "tspan"]], + 'timelinebegin' => ['self::SVG_NAMESPACE' => ["svg"]], + 'title' => ['self::SVG_NAMESPACE' => ["style"]], + 'to' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "set"]], + 'transform' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "marker", "mask", "metadata", "mpath", "path", "polygon", "polyline", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + 'type' => ['self::SVG_NAMESPACE' => ["a", "animateTransform", "feColorMatrix", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feTurbulence", "script", "style"]], + 'values' => ['self::SVG_NAMESPACE' => ["animate", "animateMotion", "animateTransform", "feColorMatrix"]], + 'viewBox' => ['self::SVG_NAMESPACE' => ["marker", "pattern", "svg", "symbol", "view"]], + 'width' => ['self::SVG_NAMESPACE' => ["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDropShadow", "feFlood", "feGaussianBlur", "feImage", "feMerge", "feMorphology", "feOffset", "feSpecularLighting", "feTile", "feTurbulence", "filter", "mask", "pattern", "foreignObject", "image", "rect", "svg", "symbol", "use"]], + 'x' => ['self::SVG_NAMESPACE' => ["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDropShadow", "feFlood", "feGaussianBlur", "feImage", "feMerge", "feMorphology", "feOffset", "feSpecularLighting", "feTile", "feTurbulence", "fePointLight", "feSpotLight", "filter", "mask", "pattern", "text", "tspan", "foreignObject", "image", "rect", "svg", "symbol", "use"]], + 'x1' => ['self::SVG_NAMESPACE' => ["line", "linearGradient"]], + 'x2' => ['self::SVG_NAMESPACE' => ["line", "linearGradient"]], + 'xChannelSelector' => ['self::SVG_NAMESPACE' => ["feDisplacementMap"]], + 'y' => ['self::SVG_NAMESPACE' => ["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDropShadow", "feFlood", "feGaussianBlur", "feImage", "feMerge", "feMorphology", "feOffset", "feSpecularLighting", "feTile", "feTurbulence", "fePointLight", "feSpotLight", "filter", "mask", "pattern", "text", "tspan", "foreignObject", "image", "rect", "svg", "symbol", "use"]], + 'y1' => ['self::SVG_NAMESPACE' => ["line", "linearGradient"]], + 'y2' => ['self::SVG_NAMESPACE' => ["line", "linearGradient"]], + 'yChannelSelector' => ['self::SVG_NAMESPACE' => ["feDisplacementMap"]], + 'z' => ['self::SVG_NAMESPACE' => ["fePointLight", "feSpotLight"]], + 'zoomAndPan' => ['self::SVG_NAMESPACE' => ["svg", "view"]], + 'alignment-baseline' => ['self::SVG_NAMESPACE' => ["*"]], + 'baseline-shift' => ['self::SVG_NAMESPACE' => ["*"]], + 'clip-path' => ['self::SVG_NAMESPACE' => ["*"]], + 'clip-rule' => ['self::SVG_NAMESPACE' => ["*"]], + 'color' => ['self::SVG_NAMESPACE' => ["*"]], + 'color-interpolation' => ['self::SVG_NAMESPACE' => ["*"]], + 'color-interpolation-filters' => ['self::SVG_NAMESPACE' => ["*"]], + 'color-rendering' => ['self::SVG_NAMESPACE' => ["*"]], + 'cursor' => ['self::SVG_NAMESPACE' => ["*"]], + 'direction' => ['self::SVG_NAMESPACE' => ["*"]], + 'display' => ['self::SVG_NAMESPACE' => ["*"]], + 'dominant-baseline' => ['self::SVG_NAMESPACE' => ["*"]], + 'fill-opacity' => ['self::SVG_NAMESPACE' => ["*"]], + 'fill-rule' => ['self::SVG_NAMESPACE' => ["*"]], + 'filter' => ['self::SVG_NAMESPACE' => ["*"]], + 'flood-color' => ['self::SVG_NAMESPACE' => ["*"]], + 'flood-opacity' => ['self::SVG_NAMESPACE' => ["*"]], + 'font-family' => ['self::SVG_NAMESPACE' => ["*"]], + 'font-size' => ['self::SVG_NAMESPACE' => ["*"]], + 'font-size-adjust' => ['self::SVG_NAMESPACE' => ["*"]], + 'font-stretch' => ['self::SVG_NAMESPACE' => ["*"]], + 'font-style' => ['self::SVG_NAMESPACE' => ["*"]], + 'font-variant' => ['self::SVG_NAMESPACE' => ["*"]], + 'font-weight' => ['self::SVG_NAMESPACE' => ["*"]], + 'glyph-orientation-horizontal' => ['self::SVG_NAMESPACE' => ["*"]], + 'glyph-orientation-vertical' => ['self::SVG_NAMESPACE' => ["*"]], + 'image-rendering' => ['self::SVG_NAMESPACE' => ["*"]], + 'letter-spacing' => ['self::SVG_NAMESPACE' => ["*"]], + 'lighting-color' => ['self::SVG_NAMESPACE' => ["*"]], + 'marker-end' => ['self::SVG_NAMESPACE' => ["*"]], + 'marker-mid' => ['self::SVG_NAMESPACE' => ["*"]], + 'marker-start' => ['self::SVG_NAMESPACE' => ["*"]], + 'mask' => ['self::SVG_NAMESPACE' => ["*"]], + 'opacity' => ['self::SVG_NAMESPACE' => ["*"]], + 'overflow' => ['self::SVG_NAMESPACE' => ["*"]], + 'paint-order' => ['self::SVG_NAMESPACE' => ["*"]], + 'pointer-events' => ['self::SVG_NAMESPACE' => ["*"]], + 'shape-rendering' => ['self::SVG_NAMESPACE' => ["*"]], + 'stop-color' => ['self::SVG_NAMESPACE' => ["*"]], + 'stop-opacity' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke-dasharray' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke-dashoffset' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke-linecap' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke-linejoin' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke-miterlimit' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke-opacity' => ['self::SVG_NAMESPACE' => ["*"]], + 'stroke-width' => ['self::SVG_NAMESPACE' => ["*"]], + 'text-anchor' => ['self::SVG_NAMESPACE' => ["*"]], + 'text-decoration' => ['self::SVG_NAMESPACE' => ["*"]], + 'text-overflow' => ['self::SVG_NAMESPACE' => ["*"]], + 'text-rendering' => ['self::SVG_NAMESPACE' => ["*"]], + 'unicode-bidi' => ['self::SVG_NAMESPACE' => ["*"]], + 'vector-effect' => ['self::SVG_NAMESPACE' => ["*"]], + 'visibility' => ['self::SVG_NAMESPACE' => ["*"]], + 'white-space' => ['self::SVG_NAMESPACE' => ["*"]], + 'word-spacing' => ['self::SVG_NAMESPACE' => ["*"]], + 'writing-mode' => ['self::SVG_NAMESPACE' => ["*"]], + ], + 'self::XLINK_NAMESPACE' => [ + 'href' => ['self::SVG_NAMESPACE' => ["a", "image", "linearGradient", "pattern", "radialGradient", "script", "textPath", "use", "feImage"]], + 'title' => ['self::SVG_NAMESPACE' => ["a", "image", "linearGradient", "pattern", "radialGradient", "script", "textPath", "use"]], + ], + 'self::XML_NAMESPACE' => [ + 'space' => ['self::SVG_NAMESPACE' => ["a", "animate", "animateMotion", "animateTransform", "audio", "canvas", "circle", "clipPath", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "foreignObject", "g", "iframe", "image", "line", "linearGradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tspan", "unknown", "use", "video", "view"]], + ], + ]; // retrieve the single-page HTML specification (this is around 12MB in size) $spec = file_get_contents("html.html"); //$spec = file_get_contents("https://html.spec.whatwg.org/"); // parse it (this may take several seconds if ($spec) { + // define a list of attribute-element maps which the specification omits for some reason + $extra = [ + 'background' => ["body", "table", "thead", "tbody", "tfoot", "tr", "td", "th"], + 'contextmenu' => ["*"], + 'datafld' => ["a", "button", "div", "fieldset", "frame", "iframe", "img", "input", "label", "legend", "marquee", "object", "select", "span", "textarea"], + 'dataformatas' => ["button", "div", "input", "label", "legend", "marquee", "object", "option", "select", "span", "table"], + 'datasrc' => ["a", "button", "div", "frame", "iframe", "img", "input", "label", "legend", "marquee", "object", "option", "select", "span", "table", "textarea"], + 'dropzone' => ["*"], + 'role' => ["*"], + ]; $p = new DOMParser; $document = $p->parseFromString($spec, "text/html;charset=utf-8"); // pick out element and attribute definitions from the specification + $elems["self::HTML_NAMESPACE"] = []; foreach ($document->getElementsByTagName("dfn") as $el) { $type = $el->getAttribute("data-dfn-type"); if ($type === "element") { - $elems[] = trim($el->textContent); + $elems["self::HTML_NAMESPACE"][] = trim($el->textContent); } elseif ($type === "element-attr") { $name = trim($el->textContent); if (preg_match('/\s/', $name)) { @@ -180,18 +520,31 @@ class RoboFile extends \Robo\Tasks { continue; } $attrs[$name] = $attrs[$name] ?? []; + $attrs[$name]["self::HTML_NAMESPACE"] = $attrs[$name]["self::HTML_NAMESPACE"] ?? []; $context = $el->getAttribute("data-dfn-for") ?? ""; if (strlen($context)) { $context = explode(",", $context); - $attrs[$name] = array_merge($attrs[$name], $context); + $attrs[$name]["self::HTML_NAMESPACE"] = array_merge($attrs[$name]["self::HTML_NAMESPACE"], $context); + } elseif (isset($extra[$name])) { + $attrs[$name]["self::HTML_NAMESPACE"] = array_merge($attrs[$name]["self::HTML_NAMESPACE"], $extra[$name]); + } else { + throw new \Exception("Attribute $name oes not have an element list defined; check the HTML specification"); } + } elseif ($type === "attribute") { + $name = trim(trim($el->textContent), "*"); + $attrs[$name] = $attrs[$name] ?? []; + $attrs[$name]["self::HTML_NAMESPACE"] = ["*"]; } } - // do a second pass over what's been collected to find global attributes and normalize them to a single "*" entry + // do a second pass over attributes which have been collected to find globals and normalize them to a single "*" entry + $attrs = array_map(function($v) { + if (array_intersect($v["self::HTML_NAMESPACE"], ["global", "html-global", "htmlsvg-global"])) { + return ["self::HTML_NAMESPACE" => ["*"]]; + } else { + return $v; + } + }, $attrs); } - //$spec = file_get_contents("aria.html"); //$spec = file_get_contents("https://www.w3.org/TR/wai-aria/"); - //$spec = file_get_contents("svg-elem.html"); //$spec = file_get_contents("https://www.w3.org/TR/SVG2/eltindex.html"); - //$spec = file_get_contents("svg-attr.html"); //$spec = file_get_contents("https://www.w3.org/TR/SVG2/attindex.html"); // sort and filter the results for unqiueness sort($elems); ksort($attrs); @@ -210,8 +563,8 @@ class RoboFile extends \Robo\Tasks { $attrList[] = "'$name' => [\"".implode("\", \"", $context)."\"]"; } $attrs = implode(", ", $attrList); - echo "protected const KNOWN_ELEMENTS_HTML = [".$elems."];\n"; - echo "protected const KNOWN_ATTRIBUTES_HTML = [".$attrs."];\n"; + echo "protected const KNOWN_ELEMENTS = [".$elems."];\n"; + echo "protected const KNOWN_ATTRIBUTES = [".$attrs."];\n"; }); return $c->run();