# Dokumentation der `StringParser_BBCode`-Klasse

- Projektseite
- Dokumentation
- PHPDOC-Dokumentation
- Download
- This page in english

## 6. Flags zum Steuern des Verhaltens der Klasse

### 6.1 Allgemeines

Man kann bei jedem definierten Code auch Flags setzen. Ein Flag sagt der Klasse, dass bei diesem Code bestimmte Besonderheiten auftreten, die zu Berücksichtigen sind. Um für einen Code ein Flag zu setzen, muss die Methode `setCodeFlag` aufgerufen werden:

`$bbcode->setCodeFlag ('b', 'mein_flag', 'mein_wert');`

Die Methode hat folgenden Prototyp:

`void setCodeFlag (string $code, string $name, mixed $value);`

`$code`
  Gibt den Namen des Codes an, für den das Flag gesetzt werden soll.
`$name`
  Gibt den Namen des Flags an, das gesetzt werden soll. Hinweis: Falls ein Flag schon gesetzt wurde, wird der Wert beim zweiten Aufruf überschrieben. Es wird desweiteren nicht geprüft, ob das Flag überhaupt gültig ist, sie können folglich beliebige Flags setzen, allerdings haben nur bestimmte, weiter unten aufgezählte Flags eine besondere Bedeutung für die Klasse - alle anderen werden ignoriert.
`$value`
  Der Wert des Flags, das zu setzen ist.

### 6.2 Liste aller Flags

Es folgt nun eine Liste aller Flags, die von der Klasse interpretiert werden. Hinweis: Die meisten Werte für die Flags sind Konstanten. Daher sind diese nicht in Anführungszeichen zu setzen. Falls dies doch notwendig sein sollte, wird dies explizit durch Anführungszeichen gekennzeichnet!

Name des Flags | Wert | Bedeutung
--- | --- | ---
`'case_sensitive'` | `true` / `false` | Gibt an, ob Klein- und Großschreibung bei diesem Code beachtet werden sollen. Standard ist `true`, d.h. es wird zwischen Klein- und Großschreibung unterschieden (bspw. wäre `[b]` nicht gleich `[B]`). Bitte sehen Sie sich auch den globalen Flag `caseSensitive` an.
`'closetag'` | Gibt an, wie der Endtag zu behandeln ist. Dieses Flag und dessen Verhalten ist alles andere, als trivial, deswegen empfielt es sich, einfach einmal mit den Flags zu spielen, um die Effekte genau beobachten zu können.
`BBCODE_CLOSETAG_FORBIDDEN` | Der Endtag darf nicht vorkommen. Falls er doch vorkommt, wird das Vorkommen als normaler Text angefügt und das Element an dieser Stelle nicht geschlossen. Ansonsten verhält sich diese Option wie `BBCODE_CLOSETAG_OPTIONAL`.

`BBCODE_CLOSETAG_OPTIONAL`

Der Endtag ist optional. Wenn er vorkommt, schließt er ganz normal das Element. Wenn ein Elternelement geschlossen wird, wird dieses Element auch geschlossen. Wenn ein neuer Starttag des gleichen Codes auftritt, wird der Code vorher ebenfalls geschlossen. Dies ist beispielsweise bei Listen nützlich, die zum Beispiel so aussehen können:
`[list]
[*] Punkt
[*] Punkt
[/list]`
Hier soll der erste Listenpunkt geschlossen werden, sobald der zweite Listenpunkt geöffnet wird. Außerdem soll der zweite Listenpunkt geschlossen werden, sobald die Liste geschlossen wird. Das erreicht man, indem man dem Flag `'closetag'` des `[*]`-Codes diesen Wert (`BBCODE_CLOSETAG_OPTIONAL`) oder auch `BBCODE_CLOSETAG_FORBIDDEN` zuweist.

`BBCODE_CLOSETAG_IMPLICIT`
(Standardeinstellung)

Der Endtag ist nur dann optional, wenn das Elternelement geschlossen wird. Beispiel:
`[b]dies ist[i]ein text[/b]`
Wenn nun der `[i]`-Code das Flag `'closetag'` mit diesem Wert besitzt, dann wird es mit dem Auftreten von `[/b]` gleich mit geschlossen. Weiteres Beispiel:
`[list]
[*] [b]Punkt
[*] Punkt
[/list]`
Hier würde das `[b]`-Element beim Eintreten des zweiten `[*]` ebenso geschlossen, weil das Elternelement geschlossen wird.

`BBCODE_CLOSETAG_IMPLICIT_ON_CLOSE_ONLY`

Dies verhält sich wie `BBCODE_CLOSETAG_IMPLICIT`, nur, dass im Fall
`[list]
[*] [b]Punkt
[*] Punkt
[/list]`
das `[b]`-Element nicht geschlossen wird, da das Elternelement nur geschlossen würde, weil ein neues Element des gleichen Typs geöffnet würde. Dadurch, dass `[b]` nicht geschlossen wird, wird konsequenterweise auch das erste `[*]`-Element nicht geschlossen und somit das zweite `[*]`-Element nicht geöffnet, da es innerhalb von `[b]` nicht erlaubt ist.

`BBCODE_CLOSETAG_MUSTEXIST` | Der Endtag muss existieren. Falls er nicht existieren sollte, wird der Starttag als Text angehängt und nach dem Starttag weitergemacht. Ein derartiges Element kann auch nicht vom Elternelement geschlossen werden.
`'opentag.before.newline'` | Gibt an, wie ein möglicherweise existierendes Neue-Zeile-Zeichen (`\n`) vor dem Starttag behandelt werden soll. Zu den möglichen Werten weiter unten.
`'opentag.after.newline'` | Gibt an, wie ein möglicherweise existierendes Neue-Zeile-Zeichen (`\n`) nach dem Starttag behandelt werden soll. Zu den möglichen Werten weiter unten.
`'closetag.before.newline'` | Gibt an, wie ein möglicherweise existierendes Neue-Zeile-Zeichen (`\n`) vor dem Endtag behandelt werden soll. Zu den möglichen Werten weiter unten.
`'closetag.after.newline'` | Gibt an, wie ein möglicherweise existierendes Neue-Zeile-Zeichen (`\n`) nach dem Endtag behandelt werden soll. Zu den möglichen Werten weiter unten.
Mögliche Werte zu den vier obigen Flags | `BBCODE_NEWLINE_PARSE` (Standardeinstellung) | Das Neue-Zeile-Zeichen wird ganz normal wie jedes andere Zeichen auch mit Hilfe der Parserfunktionen verarbeitet.
`BBCODE_NEWLINE_IGNORE` | Das Neue-Zeile-Zeichen wird nicht von den Parserfunktionen verarbeitet, jedoch an die Ausgabe angehängt.
`BBCODE_NEWLINE_DROP` | Das Neue-Zeile-Zeichen wird entfernt.
`'paragraph_type'` | Flags, die bei der Absatzbehandlung notwendig ist. Dazu mehr im Kapitel Absatzbehandlung.
`'paragraphs'`
`'occurrence_type'` | Ein internes Flag, das von der Methode `setOccurrenceType` gesetzt wird. Es sollte nie notwendig sein, es manuell zu setzen oder auszuwerten. Mehr zu `setOccurrenceType` im Kapitel Maximales Auftreten von Elementen.

### 6.3 Globale Flags

Es gibt auch einige globale Flags. Dies sind Flags, die nicht nur für einen einzelnen Code gelten, sondern für die gesamte Klasse.

`caseSensitive`

  Dieser Flag steuert, ob die gesamte Klasse zwischen Groß- und Kleinschreibung unterscheidet. Der Wert des Flags kann mit der Methode `setGlobalCaseSensitive` geändert werden. Der aktuelle Wert kann mittels `globalCaseSensitive` abgefragt werden. Bei `true` (Standardeinstellung) unterscheidet die Klasse bei allen Codes zwischen Groß- und Kleinschreibung - außer bei denen, die das `'case_sensitive'`-Flag auf `false` gesetzt haben. Bei `false` unterscheidet die Klasse nie zwischen Groß- und Kleinschreibung - unabhängig davon, welchen Wert das `'case_sensitive'`-Attribut des Codes hat. Beispiel:

  `$bbcode->setGlobalCaseSensitive (false);`

`mixedAttributeTypes`

  Wenn das Flag aktiviert ist, wird `[code=foo attr=bar]` so verarbeitet, dass zwei Attribute erkannt werden (`default` = `'foo'`, `attr` = `'bar'`), wenn das Flag deaktiviert ist, wird nur ein Attribut erkannt (`default` = `foo attr=bar`). Standardmäßig ist das Flag deaktiviert. Der aktuelle Wert kann mittels `mixedAttributeTypes` abgefragt werden. Beispiel:

  `$bbcode->setMixedAttributeTypes (true);`

- Weiter: 7. Maximales Auftreten von Elementen
- Zurück: 5. Filter