Start · Sprachen · PHP · Referenz · CommonMark\Node\Document

CommonMark\Node\Document

Klasse

Repräsentiert den Wurzelknoten eines CommonMark-Dokuments und dient als oberste Ebene im AST.

seit PHP 1.0.0 Kategorie: misc

Signatur

class CommonMark\Node\Document extends CommonMark\Node

Beschreibung

CommonMark\Node\Document ist der Wurzelknoten (Root Node) des abstrakten Syntaxbaums (AST), der beim Parsen eines CommonMark-Dokuments entsteht. Alle anderen Knoten – wie Absätze, Überschriften, Listen oder Inline-Elemente – sind Kindknoten dieses Dokuments.

Die Klasse gehört zur PHP-Erweiterung commonmark (PECL) und wird typischerweise nicht direkt instanziiert, sondern als Rückgabewert von CommonMark\Parser::finish() erhalten. Das Document-Objekt kann anschließend mit einem CommonMark\Renderer in HTML oder andere Formate umgewandelt werden.

Als Unterklasse von CommonMark\Node erbt Document alle Methoden zum Traversieren und Manipulieren des Knotenbaums, etwa zum Hinzufügen, Entfernen oder Iterieren von Kindknoten. Dies erlaubt es, den AST vor dem Rendern programmatisch zu verändern.

  • Über $document->firstChild / $document->lastChild lassen sich die direkt enthaltenen Blöcke traversieren.
  • Mit $document->walker() kann der gesamte Baum iteriert werden.

Beispiele

Markdown parsen und als HTML rendern

<?php
// Benötigt die PECL-Erweiterung 'commonmark'
$parser = new CommonMark\Parser();
$parser->write("# Hallo Welt\n\nDies ist ein **Absatz**.");

/** @var CommonMark\Node\Document $document */
$document = $parser->finish();

$renderer = new CommonMark\HtmlRenderer();
echo $renderer->renderDocument($document);
<h1>Hallo Welt</h1> <p>Dies ist ein <strong>Absatz</strong>.</p>

AST traversieren und alle Überschriften ausgeben

<?php
$parser = new CommonMark\Parser();
$parser->write("# Kapitel 1\n\n## Abschnitt 1.1\n\nEtwas Text.\n\n# Kapitel 2");
$document = $parser->finish();

$walker = $document->walker();
while ($event = $walker->next()) {
    $node = $event->getNode();
    if ($node instanceof CommonMark\Node\Heading && $event->isEntering()) {
        echo "H" . $node->level . ": ";
        // Kindknoten für den Text ausgeben
        $child = $node->firstChild;
        while ($child) {
            if ($child instanceof CommonMark\Node\Text) {
                echo $child->literal;
            }
            $child = $child->next;
        }
        echo PHP_EOL;
    }
}
H1: Kapitel 1 H2: Abschnitt 1.1 H1: Kapitel 2

Document manuell aufbauen

<?php
// Dokument programmatisch erstellen
$document = new CommonMark\Node\Document();

$paragraph = new CommonMark\Node\Paragraph();
$text = new CommonMark\Node\Text();
$text->literal = 'Hallo, Welt!';
$paragraph->appendChild($text);
$document->appendChild($paragraph);

$renderer = new CommonMark\HtmlRenderer();
echo $renderer->renderDocument($document);
<p>Hallo, Welt!</p>

// Wichtig · Fallstricke

PECL-Erweiterung erforderlich: Die Klasse ist Teil der PECL-Erweiterung commonmark und nicht im PHP-Kern enthalten. Sie muss separat installiert werden (pecl install commonmark). Für rein PHP-basierte CommonMark-Unterstützung gibt es Alternativen wie league/commonmark.

Da Document den gesamten AST hält, sollte bei sehr großen Markdown-Dokumenten auf den Speicherverbrauch geachtet werden. Der Walker iteriert den Baum tief-zuerst; Modifikationen am Baum während der Iteration können zu unvorhergesehenem Verhalten führen.