Gunther: TOC aus HTML Code generieren

Beitrag lesen

Mein Herr!

Vorab schon mal vielen Dank für deine Antwort!

Hör’ auf, reguläre Ausdrücke zum Parsen von HTML zu nutzen (was man sowieso nicht tun sollte),

Warum denn eigentlich nicht?

Weil sie nur sehr schwierig zu lesen und zu schreiben sind. Die Syntax-Regeln von HTML sind nicht so einfach mit regulären Ausdrücken zu erfassen. Was würde dein regulärer Ausdruck zum Beispiel mit folgendem Schnipsel anstellen:
<span title="<article>">? Es ist schwierig zur erkennen, dass <article> in dem Beispiel zum Attribut-Wert gehört.

Reguläre Ausdrücke stoßen außerdem schnell an ihre Grenzen. Nehmen wir ein einfaches Entscheidungsproblem: Beinhaltet das body-Element gleich viele section-Elemente wie h1-Elemente? Ein regulärer Ausdruck kann das Problem nachweislich* nicht lösen.

*) reguläre Ausrücke sind nicht turingvollständig.

In meinem konkreten Fall bspw. verändere ich ja gar nicht den vorhandenen HTML Code, sondern möchte ja nur gewisse Daten daraus extrahieren.

Mein Beispiel ist zugegebener Maßen sehr konstruiert, aber trotzdem würde dein regulärer Ausdruck daran scheitern.

Das ist sicherlich alles richtig, allerdings will und wollte ich ja nie eine "universell" anwendbare Funktion schreiben, sondern lediglich eine, die in meinem konkreten Fall, unter Berücksichtigung der bereits genannten Konventionen, den Job schnell & einfach erledigt.

Für die typischen Aufgaben Traversieren und Manipulieren bietet die DOM-API bereits fertige, erprobte Lösungen, also wieso diese nicht nutzen?

Weil mir diese in manchen Fällen eher als "Overkill" erscheinen, wenn ein recht simpler regulärer Ausdruck die Aufgabe auch erledigen kann.

  • alle Nodes durchlaufen, um meine H1 Section Heading Nodes zu finden
  • bei einem Treffer, den entsprechenden ParentNode nach weiteren Sectioning ChildNodes durchsuchen, wobei sich bei jedem Treffer der Level jeweils um eins erhöht

Ist das vom Ansatz her so in etwa korrekt?

Der offizielle Algorithmus deckt wesentlich mehr Szenarien ab, als deinen spezielle Fall, zum Beispiel auch Verschachtelungs-Tiefe anhand des Rangs (h1,h2,h3,…).

Aufbauend auf dem DOM-Vokabular ist dieser sehr präzise formuliert. http://www.w3.org/TR/html51/sections.html#outlines

Ja, schon klar.
Und außerdem ist (m)ein TOC ja nicht zu 100% identisch mit der Outline.

Anhand der Auflistung kann man aber schon sehr schön sehen, wie viele Bedingungen man der Reihe nach durchprüfen muss, um das korrekt umzusetzen. Mal gucken, wenn ich das nächste Mal Langeweile habe ...! ;-)

Solche Sachen wären doch auch mal etwas als Community Projekt für's Wiki ...!
Ich bin mir sicher, dass dabei anschließend das Optimum herauskommt.

Gruß Gunther