|
|
@ -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(); |
|
|
|
} |
|
|
|