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
continue;
}
$attrs[$name] = $attrs[$name] ?? [];
$attrs[$name]["self::HTML_NAMESPACE"] = $attrs[$name]["self::HTML_NAMESPACE"] ?? [];
$attrs['self::NULL_NAMESPACE'][$name] = $attrs['self::NULL_NAMESPACE'][$name] ?? [];
$attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'] = $attrs['self::NULL_NAMESPACE'][$name]['self::HTML_NAMESPACE'] ?? [];
$context = $el->getAttribute("data-dfn-for") ?? "";
if (strlen($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])) {
$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 {
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"] = ["*"];
$context = $el->getAttribute("data-dfn-for");
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
$attrs = array_map(function($v) {
if (array_intersect($v["self::HTML_NAMESPACE"], ["global", "html-global", "htmlsvg-global"])) {
return ["self::HTML_NAMESPACE" => ["*"]];
$attrs['self::NULL_NAMESPACE'] = array_map(function($v) {
if (!isset($v['self::HTML_NAMESPACE'])) {
return $v;
} elseif (array_intersect($v['self::HTML_NAMESPACE'], ["global", "html-global", "htmlsvg-global"])) {
return ['self::HTML_NAMESPACE' => ["*"]];
} else {
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($elems);
ksort($attrs);
$elems = array_unique($elems);
$attrs = array_map(function($v) {
sort($v);
ksort($attrs['self::NULL_NAMESPACE']);
$attrs['self::NULL_NAMESPACE'] = array_map(function($v) {
foreach ($v as $k => $vv) {
sort($v[$k]);
}
return $v;
}, $attrs);
}, $attrs['self::NULL_NAMESPACE']);
// formt the lists as a PHP arrays
$elems = array_map(function($e) {
return "'$e' => true";
}, $elems);
$elems = implode(", ", $elems);
$attrList = [];
foreach ($attrs as $name => $context) {
$attrList[] = "'$name' => [\"".implode("\", \"", $context)."\"]";
foreach (['elems' => $elems, 'attrs' => $attrs] as $k => $v) {
$v = json_encode($v);
$v = str_replace(["{", "}", ","], ["[", "]", ", "], $v);
$v = preg_replace('/"([^"]+)":/', "'$1' => ", $v);
$v = preg_replace("/'(self::[A-Z]+_NAMESPACE)'/", "$1", $v);
$$k = $v;
}
$attrs = implode(", ", $attrList);
echo "protected const KNOWN_ELEMENTS = [".$elems."];\n";
echo "protected const KNOWN_ATTRIBUTES = [".$attrs."];\n";
// output the result
echo "protected const KNOWN_ELEMENTS = ".$elems.";\n";
echo "protected const KNOWN_ATTRIBUTES = ".$attrs.";\n";
});
return $c->run();
}

8
lib/AbstractSanitizer.php

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