WHSD Dezember 2020

WHHT vereint WH und HT.
WHSD vereint WH und SDML.

WHSD ist die zweite WHHT app, die Vereinigung zweier ganzer Dokumententypen unter dem Dokumentenelement html.

Nachdem ich vor einigen Tagen einen weiteren Leckerbissen von FrameMaker, Dienstprogramme - Strukturierte Dokumente konvertieren … für die Umwandlung uralter HTML 3 Dokumente (in sein_a), nämlich erst der Ethik “im Stapel” nach SDML ausprobiet habe und mich drüber gefreut habe, dass ich so mit meinem DML-Staubsauger Hunderte von FONT und CENTER verseuchten Dokumenten auf einen Streich ins strukturierte Format gekriegt habe, habe ich micht gefragt: Was willst du nun mit dem alten Kram aus HTML 3 und HTML 2 anfangen? Ja, wäre WH genauso mit SDML fusioniert wie mit HT, dann wäre das etwas anderes. Dann könntest du mit den Dokumenten arbeiten. Gesagt getan. Und hier ist es, the one and only WHHT + SDML oder WHSD: Alle SDML Elemente sind in WHSD integriert, so dass nun Bücher mit parta bis parte und FONT und CENTER im Daumenkino geschrieben werden können.

Dass das nicht ganz ernst gemeint ist, siehst du daran, dass der Wust von Arrtibuten in den coreattrs auf die vier aus HT reduziert wurde. Aber da der Daumenkinoprogrammierer nun eine echte DTD vor sich hat, die nicht mit "categories" hochstapelt, sondern parameter entities hat, bei denen nur an einer Stelle Attributdeklarationen gemacht werden müssen, um überall zu gelten, kann er das schnell ändern. Bei dem Rest muss er sich an SGML anpassen, wenn er bei den großen Jungs mitspielen will.

Ähnlich wie bei WHHT waren einige Vorüberlegungen notwendig (siehe dort). Sollte eine zweite entity Vereinigung aus der Sammlung der entities von SDML und WH erfolgen? Das wäre nicht nur eine Riesenarbeit, sondern auch falsch gewesen. Nein, die DMLer mussten – bei mir jedenfalls – zu ihren Wurzeln zurückkehren und sich in das HT der WHHT integrieren, so dass die app auch WHHT.2 heißen könnte, aber bei WHSD ist der Zweck der Vereinigung von WH und SDML deutlicher im Namen zu erkennen als bei WHHT die Vereinigung von WH mit HT. Praktisch bedeutet das, dass die nicht in HT vorhandenen SDML Elemente in rumpfHT integriert wurden, die nun rumpfSD heißt, dass sie in den Standard Attributen coreattrs nicht mehr als in HT gekriegt haben und nur die einzeln bei den Elementen deklarierten Attribute nach WHSD mitnehmen durften. Dabei konnten einige Fehler von SDML korrigiert werden, wie die Nicht-Aufnahme der neuen Formularelemente in die formctrl entity, die bei den DMLern “Kategorien” mit “Interactive content” heißen. Durch die Nichtaufname hatten diese Formularelemente keinen nur ihnen gehörigen Ort in der Logik des Dokumententyps, sondern sind im Entity Brei Flow geschwommen, der das ganze Dokument umfassst.

Die WHSD Komponenten

DTD doku Bemerkung DTD Bemerkung doku
treiberWHSDdoku.html erste Erklärung des neuen Dokumententyps
treiberWHSD.txt treiberWHSD.html gemeinsame entities, doctype und body
rumpfSD.txt ../HT/rumpfSD.html Revision der entity names, neue DML elements Doku aus den HT und DML apps
../WHHT/rumpfWH.txt ../WHHT/rumpfWH.html Aufruf der WHWT.dtd, Tabelle, Attribute aus WHWT Doku aus der WHWT app
../WHWTFm/WHWT.dtd ../WHWT/dtd.html die WH Elemente in rumpfWH importiert

Die beiden ../WHHT/rumpfWH und ../WHWT/dtd.html bleiben an ihren ursprünglichen Orten in WHHT und WHWT, weil sich an der WH app nichts ändert.

Änderungen sind in treiberWHSD und ../HT/rumpfSD (die vormaligen treiberWHHT und rumpfHT). Deren Änderungen im Vergleich zur ersten WHHT app werden dort dokumentiert.

Ein Problem hat der “Staubsauger” (SDML). Die markup minimization ist in allen apps von SGML2 abgeschafft, auch in SDML. Aber viele alte HTML Dokumente sind mit ihr ebenso verseucht wie mit FONT und Co. Ganz zu schweigen von den DMLern, die diese ranzige Soße wieder aufgewärmt haben. Ohne markup minimization kann der Parser gar nicht anders, als beim Import die Paragraphen in einer Endlosrekursion ineinanderzuschachteln, weil sie keinen end-tag haben, so dass der p im p im p im p … ist. Es müsste also gelingen, die minimization für den Import der Altware anzuknipsen, damit die Paragraphen hintereinander stehen. Das Anknipsen der minimization in der SGML declaration genügt nicht, da beschwert sich der parser beim Import nur, dass die erforderliche minimization information fehlt. Es musste also die DTD wieder mit - O, O O, O -, - -, verseucht werden!

Bei der Benziger Bros. edition, 1947 der Summa Theologica von Thomas von Aquin, die vollständig minimization verseucht ist, habe ich mir vor dem SDML Import so beholfen, dass ich mit dem Texteditor jedes Auftreten von <p> ersetzt habe durch </p><p>, oder von <center> mit </center><center>, ebenso bei </font>, so dass vor jedem Paragraphenanfang der vermutete vorherige Paragraph, das vorherige center, das vorherige font beendet wird. Das hat die Nachbearbeitung nach dem Import auf ein Minimum reduziert. Als Andenken daran steht dort vor vielen Absätzen der tagc delimiter >. Grund: Das vermutete </p> ist in vielen Fällen falsch. Den Anfang des end-tags mit dem etago delimiter </ mit p ignoriert der Parser, den tagc delimiter > stellt er als Zeichen dar, weil aus seiner Sicht kein offenes Element geschlossen wurde.

Ein weiteres Problem: Die WHSD lässt sich nicht als Erst-Staubsauger verwenden, sondern nur die SDML allein. Danach können die WHSD Elemente in das SDML Dokument importiert werden, so dass dann auch der Export und Import gelingt. Grund: Bereits HT hat eine gewisse Strenge, obwohl im body nahezu Alles erlaubt ist. Die Zusammenfügung von WH und SD(ML) macht aus WHSD eine DTD mit element content, also noch strenger. Die Chaotik, in der die alten Dokumente aus den 90er Jahren geschrieben sind, lässt sich nur mit der chaotischen Flow entity, pardon category, nachbilden, die sich in WHSD der ps.zz entity zu fügen hat. Aber die mit SDML aufgesaugten Dokumente können die Elemente von WHSD importieren, und müssen dann nachbearbeitet werden. Vielleicht erstelle ich auch mal eine minization verseuchte app? Eher nicht. Von wegen, unmittelbar danach habichs getan. Ich habe DtdEdd mit einem minimize element versehen und SDML verseucht und die minimization in der sgmldecl eingeknipst – mit dem Erfolg, dass die Paragraphen weiterhin endlosrekursiv importiert wurden und ich zwei Tage vertrödelt habe. Der Thomas ist dran schuld! Ich habe die verseuchte DTD als Andenken aufgehoben und die minimization schleunigst wieder rückgängig gemacht, habe aber das minimize element in der DtdEdd stehengelassen. Man weiß ja nie. Ich habe übrigens auch den Thomas wieder in die reine Staubsauger app gestellt und nicht in der WHSD app gelassen. Aber die Hinweise auf die WHSD in den Fußzeilen der Dokumente habe ich stehengelassen. Man weiß ja nie.

Entity Tabelle

Die Namen der entities sind in WHHT und WHSD dieselben, nur haben sie oft andere Inhalte (entity texts). Die Spalte AAP Lists habe ich der AAP app (Association of American Publishers) übernommen, einer der ersten SGML apps. In ihr steht eine kurze Erläuterung der entities. Die Nummern verweisen auf die entities in der general.dtd. Die Entity Sammlung und -Namen sind in der AAP Anwendung dieselben wie in GE. HT hat auch eine Stufenfolge. So setzt sich inline aus fontstyle, phrase, font und formctrl zusammen und block aus heading, list und preformatted, die hier nicht aufgeführt ist. Flow bzw flow in DML und HT sind die obersten entities wie in GE. Nur setzt sich flow aus HT aus block und inline zusammen, während Flow in DML alle Elemente "ausmultipliziert" sein müssen, weil dort keine entities zur Verfügung stehen, die mehrere Elemente zu Einheiten zusammenfassen. Die Flow entity, pardon category als body content, qualifiziert DML genau wie HT mit mixed content im body als Staubsauger. Nur kommen hier auch alle Veteranen wie font oder center hinzu. Die vollständige Liste sieht so aus:

parameter entities in WHHT, SDML und WHSD
WHHT SDML WHSD AAP Lists/Erläuterung
isoall SYSTEM "C:∖e∖c∖apps∖isoallFm∖isoall.ent" isoall SYSTEM "C:∖e∖c∖apps∖isoallFm∖isoall.ent" isoall SYSTEM "C:∖e∖c∖apps∖isoallFm∖isoall.ent" Juli 2017 Die ISO entities., ab 12/20 auch in SDML.
head.misc "script|style|meta|link|object" head.misc "script | style | meta | link | object" head.misc "script|style|meta|link|object"
heading "h1|h2|h3|h4|h5|h6" heading "h1 | h2 | h3 | h4 | h5 | h6" heading "h1|h2|h3|h4|h5|h6"
head.content "title & base?" in WHSD als Element deklariert
coreattrs "id ID #IMPLIED -- document-wide unique id -- class CDATA #IMPLIED -- space-separated list of classes -- style CDATA #IMPLIED -- associated style info -- title CDATA #IMPLIED -- advisory title --" coreattrs "id ID #IMPLIED -- document-wide unique id -- class CDATA #IMPLIED -- space-separated list of classes -- style CDATA #IMPLIED -- associated style info -- title CDATA #IMPLIED -- advisory title -- dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text -- lang NAME #IMPLIED -- language code DML -- -- Dezember 2020 entferne 17 aus html5 und html 52-- -- 17.09.2018 Tue die click-attributes von html4 in die coreattrs von html5 -- onclick CDATA #IMPLIED -- a pointer button was clicked -- ondblclick CDATA #IMPLIED -- a pointer button was double clicked-- onmousedown CDATA #IMPLIED -- a pointer button was pressed down -- onmouseup CDATA #IMPLIED -- a pointer button was released -- onmouseover CDATA #IMPLIED -- a pointer was moved onto -- onmousemove CDATA #IMPLIED -- a pointer was moved within -- onmouseout CDATA #IMPLIED -- a pointer was moved away -- onkeypress CDATA #IMPLIED -- a key was pressed and released -- onkeydown CDATA #IMPLIED -- a key was pressed down -- onkeyup CDATA #IMPLIED -- a key was released -- coreattrs "id ID #IMPLIED -- document-wide unique id -- class CDATA #IMPLIED -- space-separated list of classes -- style CDATA #IMPLIED -- associated style info -- title CDATA #IMPLIED -- advisory title --" 12/20 entferne 17 Attribute aus SDML, der Rattenschwanz ist weg.
i18n "lang CDATA #IMPLIED -- language code -- dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --" i18n "lang CDATA #IMPLIED -- language code -- dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --"
events "onclick CDATA #IMPLIED -- a pointer button was clicked -- ondblclick CDATA #IMPLIED -- a pointer button was double clikked-- onmousedown CDATA #IMPLIED -- a pointer button was pressed down -- onmouseup CDATA #IMPLIED -- a pointer button was released -- onmouseover CDATA #IMPLIED -- a pointer was moved onto -- onmousemove CDATA #IMPLIED -- a pointer was moved within -- onmouseout CDATA #IMPLIED -- a pointer was moved away -- onkeypress CDATA #IMPLIED -- a key was pressed and released -- onkeydown CDATA #IMPLIED -- a key was pressed down --" onkeyup CDATA #IMPLIED -- a key was released -- (ltr|rtl) #IMPLIED -- direction for weak/neutral text --" events "onclick CDATA #IMPLIED -- a pointer button was clicked -- ondblclick CDATA #IMPLIED -- a pointer button was double clikked-- onmousedown CDATA #IMPLIED -- a pointer button was pressed down -- onmouseup CDATA #IMPLIED -- a pointer button was released -- onmouseover CDATA #IMPLIED -- a pointer was moved onto -- onmousemove CDATA #IMPLIED -- a pointer was moved within -- onmouseout CDATA #IMPLIED -- a pointer was moved away -- onkeypress CDATA #IMPLIED -- a key was pressed and released -- onkeydown CDATA #IMPLIED -- a key was pressed down --" onkeyup CDATA #IMPLIED -- a key was released -- (ltr|rtl) #IMPLIED -- direction for weak/neutral text --"
align "align (left|center|right|justify) #IMPLIED" align "align (left|center|right|justify) #IMPLIED" align "align (left|center|right|justify) #IMPLIED"
attrs "%coreattrs; %i18n; %events;" attrs "%coreattrs; %i18n; %events;"
p.em.ph "em1 | em2 | em3 | em4 | em5 | em6 | emSmall | page | tt | i | b | big | small | em | strong | dfn | code | samp | kbd | var | cite | abbr | acronym " phrase "code | dfn | em | cite | strong | samp | kbd | var | abbr | acronym | tt | i | b | u | s | strike | big | small | mark |bdi | bdo" p.em.ph "em1 | em2 | em3 | em4 | em5 | em6 | emSmall | page | tt | i | b | big | small | em | strong | dfn | code | samp | kbd | var | cite | abbr | acronym | ruby | bdi | bdo | mark" List 2: Emphasis
em "em (em | em2 | em3 | em4 | em5 | em6 | em7 | em8 | em9 | em10 | quote | quoteAlt | sub | super | page | emDate | quelle | symbol | dingbats | emTimes | emGrotesk | emKAP | big | small) #IMPLIED" em "em (em | em2 | em3 | em4 | em5 | em6 | em7 | em8 | em9 | em10 | emCit | emCitAlt | sub | super | page | emDate | quellinl | symbol | dingbats | emTimes | emGrotesk | emKAP | BIG | SMALL) #IMPLIED" em "em (em | em2 | em3 | em4 | em5 | em6 | em7 | em8 | em9 | em10 | quote | quoteAlt | sub | super | page | emDate | quelle | symbol | dingbats | emTimes | emGrotesk | emKAP | big | small) #IMPLIED"
emP "emP (em | em1 | em2 | em3 | em4 | em5 | em6 | em7 | em8 | em9 | em10 | quote | quoteAlt | sub | super | symbol | quelle | emTimes | emGrotesk | emKAP | dateP | SMALL) #IMPLIED" emP "emP(em | em1 | em2 | em3 | em4 | em5 | em6 | em7 | em8 | em9 | em10 | emCit | emCitAlt | sub | super | emSymbol | emTimes | emGrotesk | emKAP | emvoid | dateP | SMALL) #IMPLIED" emP "emP (em | em1 | em2 | em3 | em4 | em5 | em6 | em7 | em8 | em9 | em10 | quote | quoteAlt | sub | super | symbol | quelle | emTimes | emGrotesk | emKAP | dateP | SMALL) #IMPLIED"
p "p (p | pInline | pSatzspiegel | pSpiegelSteg | pSteg | pSteg8pt | pEingerueckt | pZentriert) #IMPLIED" p "p(p | pInline | pSatzspiegel | pSpiegelSteg | pSteg | pSteg8pt | pEingerueckt) #IMPLIED" p "p (p | pInline | pSatzspiegel | pSpiegelSteg | pSteg | pSteg8pt | pEingerueckt | pZentriert) #IMPLIED"
numnam "iframe | a | CAS | CCS | DLM | NAM | CAS | CCS | DLM | NAM | nam | num | dnam | dnum | fnam | fnum | hnam | hnum | hnamref | hnumref | quellnam | quellnum | bekknum | datum" numnam "iframe | a | CAS | CCS | DLM | NAM | CAS | CCS | DLM | NAM | nam | num | dnam | dnum | fnam | fnum | hnam | hnum | hnamref | hnumref | quellnam | quellnum | bekknum | datum"
p.rf.d "ElemText | xAbsText | xAttrText" p.rf.d "ElemText | xAbsText | xAttrText" List 4: References (empty)
special "a | img | object | span | br | script | map | q | sub | span | sup | bdo | iframe | applet | font | basefont" special "a | applet | br | wbr | script | template | source | map | q | sup | sub | font | basefont" special "a | img | object | span | br | script | map | q | sub | span | sup | bdo | iframe | applet | font | basefont"
formctrl "input | select | textarea | label | button " formctrl "input | select | textarea | label | button | menuitem | fieldset |option | optgroup" formctrl "input | select | textarea | label | button | datalist | dialog | details | menu | menuitem | meter | output | progress" Die Elemente aus formctrl sind in HT Teil von inline.
embedded "relabise | entabise | math | svg |audio | canvas | embed | iframe | img | object | picture | param | video | track"
p.zz.ph "(%p.em.ph;)|(%p.rf.d;)|(%numnam;)| (%special;) | (%formctrl)" inline "#PCDATA | span | ruby | data | time | %phrase; | %embedded; | %special;" p.zz.ph "(%p.em.ph;)|(%p.rf.d;)|(%numnam;)| (%special;) | (%formctrl) | (%embedded;)" List 5: Phrases
m.ph "(#PCDATA|(%p.zz.ph;))*" m.ph "(#PCDATA|(%p.zz.ph;))*" Model 16: Phrase
ps.ul.d "ol|ul" ps.ul.d "ol|ul" List 6: Unit-item Lists
ps.list "%ps.ul.d;|Listen|dl|gl|dltxt|defs" ps.list "%ps.ul.d;|Listen|dl|gl|dltxt|defs" List 7: All Lists
ps.elem "xmp | blockCit | blockCitAlt | note | lines | table | address | artwork | dropart | ich | relabise | entabise | gleichung | quelle | DtdEdd | svg | I23ABC | work|%heading; | pre | div | noscript | blockquote | form | hr | fieldset | TURBLE" block "%heading; | ol | ul | pre | hgroup | header | footer | figure | main | dl | div | center | noscript | blockquote | hr | table | TURBLE | address | DtdEdd | SGMLFragment" ps.elem "xmp | blockCit | blockCitAlt | note | lines | table | address | artwork | dropart | ich | relabise | entabise | gleichung | quelle | DtdEdd | svg | I23ABC | work|%heading; | pre | div | noscript | blockquote | form | hr | fieldset | TURBLE | hgroup | header | footer | main | SGMLFragment" 8 Other elements Okt. 2019 ps.ul.d 6 raus, steht nicht in WH, header und footer in HT aus DML zur Siimulation von Fuß- und Endnoten.
ps.zz "(%ps.elem;)|(%ps.list;)" ps.zz "(%ps.elem;)|(%ps.list;)" List 9: Para/sect subelements
s.p.d "p | partwork | lip" s.p.d "p | partwork | lip | center" List 10: Simple paragraphs
m.p "(#PCDATA|(%p.zz.ph;)|(%ps.zz;))*" m.p "(#PCDATA|(%p.zz.ph;)|(%ps.zz;))*" Model 17: Paragraph
m.pseq "((%s.p.d;), ((%s.p.d;)|(%ps.zz;))*)" m.pseq "((%s.p.d;), ((%s.p.d;)|(%ps.zz;))*)" Model 18: Paragraph sequence
DtdEdd SYSTEM "..∖DTFm∖DTD.txt"
s.top "topa | topb | topc | topd | tope" s.top "topa | topb | topc | topd | tope" List 11: Topics
contents "conta | contb | contc | contd | conte" contents "conta | contb | contc | contd | conte" für elementbasierte tocs, wie topics
sectioning "article | section | nav | aside"
m.top "toph?, (%s.zz;)*" m.top "toph?, (%s.zz;)*" Model 19: Topic
m.cont "conth?, (%s.zz;)*" m.cont "conth?, (%s.zz;)*" 19 für HTML Menüs
s.zz "((%s.p.d;)|(%ps.zz;)|(%s.top;)|(%contents;)" flow "p |CellBody | CellHead | TabelleTitel | %block; | %inline; | %sectioning;" s.zz "((%s.p.d;)|(%ps.zz;)|(%s.top;)|(%contents;) | (%sectioning;)" List 12: Section subelements
i.float "fig | fn" i.float "fig | fn | anm" List 13: Floating elements
fm.d "abstract | preface" fm.d "abstract | preface" GE: 14 Front matter
bm.d "glossary | bibliog" bm.d "glossary | bibliog" GE: 15 Back matter
docType "html" docType "html" 1 Document type generic identifier.
rumpfWH rumpfWH Deklarationen aus WH
rumpfHT rumpfSD Deklarationen aus SDML
Aufruf des body content von WHWT und SD

Die beiden entities rumpfWH und rumpfSD rufen die beiden Rümpfe von rumpfWH und rumpfSD auf. Die rumpfWH ist dieselbe wie in WHHT. Sie besteht nur aus wenigen Deklarationen, da der Großteil der Elemente mit WHWT identisch ist, die als externe entity aufgerufen wird. Dagegen ist rumpfSD eine Revision der bisherigen HT DTDs auf Grundlage der rumpfHT aus WHHT. Da sich die Deklaration auf die references der entities hinter dem Rücken des html Nutzers abspielen und alle html Elemente in ihrer bisherigen Form erhalten bleiben, kann jeder, der html kann, auch WHSD-html. Frage mich niemand nach dem Sinn des meter element oder anderer DMLer, ich deklariere nur aus Vergnügen.

Zwischenbilanz Dezember 2020

Für alte html und xml Dateien gibt es mittlerweile drei Staubsauger apps.

drei Staubsauger apps
app saugt wozu Bemerkung
SDML alle html ohne besondere Ansprüche body hat mixed content
WHHT xml+ht4 zum Bücherschreiben body hat element content
WHSD alle html zum Bücherschreiben body hat element content

Die aus WHATWG html5 entstandene SDML ist am leichtesten zu handhaben. Hier müssen die Dateien vor dem Import wie bei allen Staubsaugern nur den richtigen DOCTYPE mit lokalem Pfad der DTD bekommen.Tabellen müssen das mit der Spaltenanzahl ausgefüllte cols attribute bekommen.

In den xml Dateien beim WHHT Import müssen die non-html Elemente und Attribute in WH Elemente und Attribute umbenannt werden. Beispiel: die Lutherbibel hatte div1 bis div3 mit h1 bis h3, die in parta bis partc mit ha bis hc umbenannt worden sind. Oder Attributwerte wie 3Paul mussten in iiiPaul geändert werden, weil 3 kein name start character ist. Da xml bodies in der Regel element content haben, muss im body nichts geändert werden. Die nicht umbenannten und nicht in der DTD vorhandenen Elemente und Attribute ignoriert der SGML Parser beim Import. Der xml Import ist ein lohnender Einsatz, weil die meisten xml Dokumente ein Mix aus html und non-html Elementen sind, der die Träume des W3C, das SGML für das WWW zu schaffen, nicht verwirklichen konnte.

Die zuletzt (Stand 2021) entstandene WHSD muss vor dem Import den body zu element content machen, indem sie alle <body> in <div><body> und alle </body> in </div></body> umwandelt. Bei ihr bin ich mir noch nicht sicher, ob es ein totgeborenes Kind ist oder nicht. Ihr Vorteil ist sicher, dass sie alle html Elemente hat.

Bei WHHT und WHSD ist zu sehen, dass viele Doppeldeklarationen sind. Wenn ich genügend Erfahrungen mit den drei Staubsaugern gemacht habe, wird es sicher nur noch eine app zum Saugen geben, oder wenigstens die Wiedervereinigung von WHHT und WHSD. Zuerst hatte ich nämlich einfach in WHHT die fehlenden SD Elemente reindeklariert, bin aber dann durcheinandergeraten, so das ich WHHT und WHSD erstmal wieder getrennt habe.