Dokumentation der StringParser_BBCode-Klasse

8. Absatzbehandlung

8.1 Allgemeines

Es ist mit Hilfe dieser Klasse Möglich, dass Absätze automatisch erkannt werden und mit entsprechenden HTML-Tags umschlossen werden. Beispielsweise könnte folgender Text:

Dies ist der erste Absatz eines längeren Textes! Dies ist der zweite Absatz eines längeren Textes!

Automatisch in folgendes HTML verwandelt werden:

<p>Dies ist der erste Absatz eines längeren Textes!</p> <p>Dies ist der zweite Absatz eines längeren Textes!</p>

Wenn im Text noch keine BBCodes vorkommen, ist dieses Unterfangen noch trivial und könnte mit einer einfachen Funktion realisiert werden. Schwierig wird es jedoch, wenn BBCodes in einem Absatz geöffnet und erst im nächsten geschlossen werden.

Man kann die Art, wie die Klasse Absätze erkennt und ersetzt, beeinflussen. Es gibt dazu die Methode setParagraphHandlingParameters:

void setParagraphHandlingParameters (string $detect_string, string $start_tag, string $end_tag);

$detect_string
Die Zeichenkette, nach der gesucht werden soll.
$start_tag
Der Starttag, der bei der Ersetzung verwendet werden soll.
$end_tag
Der Endtag, der bei der Ersetzung verwendet werden soll.

Die Standardeinstellungen sind:

$bbcode->setParagraphHandlingParameters ("\n\n", "<p>, "</p>");

Wenn man mit diesen Standardeinstellungen zufrieden ist, ist es nicht notwendig die Methode aufzurufen.

8.2 Absatzbehandlung aktivieren

Im Normalfall ist die Absatzbehandlung deaktiviert. Absätze können direkt im Text (innerhalb des sogenannten Root-Elements) und auch innerhalb von BBCodes ersetzt werden. Damit Absätze innerhalb des Root-Elements ersetzt werden, muss man folgende Methode aufrufen:

$bbcode->setRootParagraphHandling (true);

Damit werden Absätze direkt innerhalb des Elternelements gesucht und ersetzt. Um Absätze innerhalb eines BBCodes ersetzen zu lassen, muss man ein Flag für diesen Code setzen:

$bbcode->setCodeFlag ('*', 'paragraphs', true);

Damit würde für das [*]-Element die Absatzbehandlung aktiviert werden und innerhalb des [*]-Elements würden Absätze ersetzt werden.

8.3 Weitere Möglichkeiten

Im Normalfall wird, falls ein BBCode in einem Absatz geöffnet und in einem späteren Absatz geschlossen wird, der BBCode vor dem Ende des ersten Absatzes geschlossen und im nächsten Absatz sofort wieder geöffnet. Beispiel:

Dies ist der erste Absatz [b]eines längeren Textes! Dies ist der zweite Absatz[/b] eines längeren Textes!

Dies würde im Normalfall zu folgendem ersetzt werden:

<p>Dies ist der erste Absatz <b>eines längeren Textes!</b></p> <p><b>Dies ist der zweite Absatz</b> eines längeren Textes!</p>

Es besteht jedoch auch die Möglichkeit, dass ein bestimmter BBCode nicht durch einen Absatz unterbrochen werden sollte - bei Links kann dies ganz sinnvoll sein. In diesem Fall kann man das Code-Flag 'paragraph_type' auf BBCODE_PARAGRAPH_ALLOW_INSIDE setzen, damit dies eben nicht passiert:

$bbcode->setCodeFlag ('url', 'paragraph_type', BBCODE_PARAGRAPH_ALLOW_INSIDE);

Folgender Text:

Dies ist der erste Absatz [url=http://www.example.org/]eines längeren Textes! Dies ist der zweite Absatz[/url] eines längeren Textes!

Würde dann so ersetzt werden:

<p>Dies ist der erste Absatz <a href="http://www.example.com/">eines längeren Textes!<br> <br> Dies ist der zweite Absatz</a> eines längeren Textes!</p>

Der BBCode wird also nicht durch einen Absatz unterbrochen und die zwei Leerzeilen zwischendrin werden normal durch Parserfunktionen ersetzt.

Es gibt außerdem noch Codes, deren HTML-Ersetzung nicht innerhalb von einem HTML-Absatz auftauchen darf, da dies sonst kein gültiges HTML wäre. Beispiele dafür sind zum Beispiel listen. Damit die Absatzbehandlung diese Listen auch berücksichtigt, muss das Code-Flag 'paragraph_type' auf BBCODE_PARAGRAPH_BLOCK_ELEMENT gesetzt werden (Hinweis: Das BLOCK hat außer von der Namensgebung her nichts mit dem 'block'-Standard-Inhaltstyp gemein):

$bbcode->setCodeFlag ('list', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);

Folgender Text:

Dies ist der erste Absatz [list] [*]Listenpunkt [/list]

Würde dann so ersetzt werden:

<p>Dies ist der erste Absatz </p><ul> <li>Listenpunkt </li></ul>

Oder, falls innerhalb von [*] selbst wieder Absatzbehandlung aktiviert wurde, so:

<p>Dies ist der erste Absatz </p><ul> <li><p>Listenpunkt </p></li></ul>

Tipp: Setzen Sie die Code-Flags 'opentag.before.newline' und 'closetag.after.newline' eines BBCODE_PARAGRAPH_BLOCK_ELEMENT-BBCodes auf BBCODE_NEWLINE_IGNORE oder BBCODE_NEWLINE_DROP. So vermeiden Sie, dass leere Absätze der Form <p></p> entstehen.