Ich benötigte eine XML-Validierung von potenziell HTML 5. HTML 4 und XHTML hatten nur etwa 250 Entitäten, während der aktuelle Entwurf (Januar 2012) mehr als 2000 enthält.
GET 'http://www.w3.org/TR/html5-author/named-character-references.html' |
xmllint --html --xmlout --format --noent - |
egrep '<code|<span.*glyph' | # get only the bits we're interested in
sed -e 's/.*">/__/' | # Add some "__" markers to make e.g. whitespace
sed -e 's/<.*/__/' | # entities work with xargs
sed 's/"/\"/' | # xmllint output contains " which messes up xargs
sed "s/'/\'/" | # ditto apostrophes. Make them HTML entities instead.
xargs -n 2 echo | # Put the entity names and values on one line
sed 's/__/<!ENTITY /' | # Make a DTD
sed 's/;__/ /' |
sed 's/ __/"/' |
sed 's/__$/">/' |
egrep -v '\bapos\b|\bquot\b|\blt\b|\bgt\b|\bamp\b' # remove XML entities.
Das Ergebnis ist eine Datei mit 2114 Entitäten.
<!ENTITY AElig "Æ">
<!ENTITY Aacute "Á">
<!ENTITY Abreve "Ă">
<!ENTITY Acirc "Â">
<!ENTITY Acy "А">
<!ENTITY Afr "𝔄">
Wenn man dies in einen XML-Parser einfügt, sollte der XML-Parser in der Lage sein, diese Zeicheneinheiten aufzulösen.
Aktualisierung Oktober 2012 : Da der Arbeitsentwurf nun eine JSON-Datei enthält (ja, ich verwende immer noch reguläre Ausdrücke), habe ich ihn auf ein einziges sed reduziert:
curl -s 'http://www.w3.org/TR/html5-author/entities.json' |
sed -n '/^ "&/s/"&\([^;"]*\)[^0-9]*\[\([0-9]*\)\].*/<!ENTITY \1 "\&#\2;">/p' |
uniq
Natürlich wäre ein Javascript-Äquivalent viel robuster, aber nicht jeder hat Node installiert. Jeder hat sed, richtig? Zufällige Beispielausgabe:
<!ENTITY subsetneqq "⫋">
<!ENTITY subsim "⫇">
<!ENTITY subsub "⫕">
<!ENTITY subsup "⫓">
<!ENTITY succapprox "⪸">
<!ENTITY succ "≻">