Browse Source

Fix up serialization of constants

MathML still remains to be added
master
J. King 1 year ago
parent
commit
743ed8a4e2
  1. 62
      RoboFile.php
  2. 8
      lib/AbstractSanitizer.php

62
RoboFile.php

@ -520,53 +520,61 @@ class RoboFile extends \Robo\Tasks {
// skip the definition if the name is not valid // skip the definition if the name is not valid
continue; continue;
} }
$attrs[$name] = $attrs[$name] ?? []; $attrs['self::NULL_NAMESPACE'][$name] = $attrs['self::NULL_NAMESPACE'][$name] ?? [];
$attrs[$name]["self::HTML_NAMESPACE"] = $attrs[$name]["self::HTML_NAMESPACE"] ?? []; $attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'] = $attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'] ?? [];
$context = $el->getAttribute("data-dfn-for") ?? ""; $context = $el->getAttribute("data-dfn-for") ?? "";
if (strlen($context)) { if (strlen($context)) {
$context = explode(",", $context); $context = explode(",", $context);
$attrs[$name]["self::HTML_NAMESPACE"] = array_merge($attrs[$name]["self::HTML_NAMESPACE"], $context); $attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'] = array_merge($attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'], $context);
} elseif (isset($extra[$name])) { } elseif (isset($extra[$name])) {
$attrs[$name]["self::HTML_NAMESPACE"] = array_merge($attrs[$name]["self::HTML_NAMESPACE"], $extra[$name]); $attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'] = array_merge($attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'], $extra[$name]);
} else { } else {
throw new \Exception("Attribute $name oes not have an element list defined; check the HTML specification"); throw new \Exception("Attribute $name oes not have an element list defined; check the HTML specification");
} }
} elseif ($type === "attribute") { } elseif ($type === "attribute") {
$name = trim(trim($el->textContent), "*"); $name = trim(trim($el->textContent), "*");
$attrs[$name] = $attrs[$name] ?? []; $context = $el->getAttribute("data-dfn-for");
$attrs[$name]["self::HTML_NAMESPACE"] = ["*"]; if (preg_match('/^platform object$|^[A-Z]/', $context)) {
// this is either a slot or an IDL attribute
continue;
}
$attrs['self::NULL_NAMESPACE'][$name] = $attrs['self::NULL_NAMESPACE'][$name] ?? [];
$attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'] = ["*"];
} }
} }
// do a second pass over attributes which have been collected to find globals 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) { $attrs['self::NULL_NAMESPACE'] = array_map(function($v) {
if (array_intersect($v["self::HTML_NAMESPACE"], ["global", "html-global", "htmlsvg-global"])) { if (!isset($v['self::HTML_NAMESPACE'])) {
return ["self::HTML_NAMESPACE" => ["*"]]; return $v;
} elseif (array_intersect($v['self::HTML_NAMESPACE'], ["global", "html-global", "htmlsvg-global"])) {
return ['self::HTML_NAMESPACE' => ["*"]];
} else { } else {
return $v; return $v;
} }
}, $attrs); }, $attrs['self::NULL_NAMESPACE']);
// sort the elements
sort($elems['self::HTML_NAMESPACE']);
$elems['self::HTML_NAMESPACE'] = array_unique($elems['self::HTML_NAMESPACE']);
} }
// sort and filter the results for unqiueness // sort and filter the results for unqiueness
sort($elems); ksort($attrs['self::NULL_NAMESPACE']);
ksort($attrs); $attrs['self::NULL_NAMESPACE'] = array_map(function($v) {
$elems = array_unique($elems); foreach ($v as $k => $vv) {
$attrs = array_map(function($v) { sort($v[$k]);
sort($v); }
return $v; return $v;
}, $attrs); }, $attrs['self::NULL_NAMESPACE']);
// formt the lists as a PHP arrays // formt the lists as a PHP arrays
$elems = array_map(function($e) { foreach (['elems' => $elems, 'attrs' => $attrs] as $k => $v) {
return "'$e' => true"; $v = json_encode($v);
}, $elems); $v = str_replace(["{", "}", ","], ["[", "]", ", "], $v);
$elems = implode(", ", $elems); $v = preg_replace('/"([^"]+)":/', "'$1' => ", $v);
$attrList = []; $v = preg_replace("/'(self::[A-Z]+_NAMESPACE)'/", "$1", $v);
foreach ($attrs as $name => $context) { $$k = $v;
$attrList[] = "'$name' => [\"".implode("\", \"", $context)."\"]";
} }
$attrs = implode(", ", $attrList); // output the result
echo "protected const KNOWN_ELEMENTS = [".$elems."];\n"; echo "protected const KNOWN_ELEMENTS = ".$elems.";\n";
echo "protected const KNOWN_ATTRIBUTES = [".$attrs."];\n"; echo "protected const KNOWN_ATTRIBUTES = ".$attrs.";\n";
}); });
return $c->run(); return $c->run();
} }

8
lib/AbstractSanitizer.php

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save