Hilfe:Parserfunktionen/Kontrollstrukturen

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Hilfe:PF/K)
Zur Navigation springen Zur Suche springen

Diese Hilfeseite erläutert spezielle Parserfunktionen, mit denen sich in der Programmierung von Vorlagen Kontrollstrukturen realisieren lassen; also von Bedingungen abhängige wenn – dann – sonst.

Alle Parameter und Ergebnisse werden „getrimmt“; führende oder schließende einfache Leerzeichen oder Zeilenumbrüche werden ignoriert.

Einfache Verzweigung – #if

Funktion Pflichtparameter Parameter
#if Bedingung WennWahr WennFalsch
Ergebnis in Abhängigkeit von einer Bedingung.
  • Die Bedingung ist
    • „wahr“, wenn sie nicht leer ist
    • „falsch“, wenn sie leer ist
  • Die Bedingung muss im Quelltext aus wirksamen Zeichen bestehen, darf also nicht nur Leerzeichen oder HTML-Kommentare enthalten. In der Regel ist dies ein Parameterwert, eine Vorlageneinbindung oder eine Parserfunktion usw., die dann im aktuellen Kontext ausgewertet werden. Diese Auswertung darf dann aber „leer“ ergeben.
  • WennWahr ist das Ergebnis, das die Parserfunktion liefern soll, wenn die Bedingung „wahr“ ist. Dies kann auch leer sein.
  • WennFalsch ist das Ergebnis, das die Parserfunktion liefern soll, wenn die Bedingung „falsch“ ist. Dies kann auch leer sein; allerdings würde dann diese Option komplett weggelassen werden.
Beispiele:
  • {{#if: {{{1}}} | Wahr}} → Wenn der Vorlagenparameter {{{1}}} nicht leer ist, resultiert Wahr, sonst „nichts“.
  • {{#if: {{{1}}} | Wahr | Falsch}} → Wenn der Vorlagenparameter {{{1}}} nicht leer ist, resultiert Wahr, sonst Falsch.
  • {{#if: {{{1}}} | | Falsch}} → Wenn der Vorlagenparameter {{{1}}} leer ist, resultiert Falsch, sonst „nichts“.

Anmerkungen:

  • Oft ist es sinnvoll, auch nicht-leere Werte wie 0, nein, - oder false als „falsch“ aufzufassen. Hierfür gibt es faculty@TemplUtl.
  • Die effizienteste Methode zum Trimmen eines Parameterwertes ist: {{#if: trim | {{{1}}} }} – Die „Bedingung“ ist immer „wahr“; damit wird WennWahr zum Resultat, und das ist immer getrimmt. Der Hinweis trim soll den Sinn dieses sinnlosen Konstrukts verdeutlichen.

Wenn gleich – #ifeq

Funktion Pflichtparameter Parameter
#ifeq Vergleichswert1 Vergleichswert2 WennGleich WennUngleich
Ergebnis in Abhängigkeit des Vergleichs zweier Zeichenketten.
  • Die Vergleichswerte müssen im Quelltext aus wirksamen Zeichen bestehen, dürfen also nicht nur Leerzeichen oder HTML-Kommentare enthalten. Mindestens einer wird ein Parameterwert, eine Vorlageneinbindung oder eine Parserfunktion usw. sein, die dann im aktuellen Kontext ausgewertet werden. Diese Auswertung darf dann aber „leer“ ergeben.
  • WennGleich ist das Ergebnis, das die Parserfunktion liefern soll, wenn beide Zeichenketten gleich sind. Dies kann auch leer sein.
  • WennUngleich ist das Ergebnis, das die Parserfunktion liefern soll, wenn die Zeichenketten unterschiedlich sind. Dies kann auch leer sein; allerdings würde dann diese Option komplett weggelassen werden.
Beispiel: {{#ifeq: {{{Parole}}} | Emil | Clique | fremd}} → Wenn der Vorlagenparameter {{{Parole}}} den Wert Emil hat, dann ist das Ergebmis Clique, ansonsten fremd.

Mehrfache Verzweigung – #switch

Funktion Pflichtparameter Parameter Pflichtparameter Parameter
#switch: Vergleichswert Werte Wert=Ergebnis Werte Wert=Ergebnis SonstErgebnis
Ergebnis in Abhängigkeit von einem Vergleichswert.
  • Es handelt sich hierbei um eine WennUngleich-Verkettung der Funktion Wenn gleich – #ifeq
  • Der Vergleichswert muss im Quelltext aus wirksamen Zeichen bestehen, darf also nicht nur Leerzeichen oder HTML-Kommentare enthalten. Das ist ein Parameterwert, eine Vorlageneinbindung oder eine Parserfunktion usw., die dann im aktuellen Kontext ausgewertet werden. Diese Auswertung darf dann aber „leer“ sein.
  • Werte sind optional beliebig viele Werte, welche mit dem Vergleichswert verglichen werden.
  • Werte können keine Gleichheitszeichen = enthalten, dürfen aber leer sein.
  • Folgt auf einen Wert ein Gleichheitszeichen =, so wird das zugewiesene Ergebnis zum Ergebnis der Parserfunktion, wenn zuvor ein Vergleich erfolgreich war.
  • Das Ergebnis darf „leer“ sein.
  • Wenn ein Vergleich erfolgreich ist, wird die nächstfolgende Zuweisung zum Ergebnis und die Abarbeitung beendet.
  • Wenn kein Vergleich erfolgreich ist wird die Zuweisung im optionalen Parameter SonstErgebnis durchgeführt.
  • Wenn der optionale Parameter SonstErgebnis weggelassen wird, wird ein evtl. an einer beliebigen Position angegebener Wert "#default" zusätzlich auch als SonstErgebnis verwendet. Es ist global üblich, den Wert #default als letzten Vergleichswert zu verwenden, auch wenn das kaum als angegebener Wert zu vermuten wäre.
Beispiel:
{{#switch: {{{Zeichen}}}
  |A|B|C|D| … X|Y|Z=Großbuchstabe
  |a|b|c|d| … x|y|z=Kleinbuchstabe
  |=Leerzeichen
  |,|;|.|!|?=Satzzeichen
  |{{{Zeichen}}}=KEIN ZEICHEN ANGEGEBEN
  |#default=Sonderzeichen
}}

In Abhängigkeit vom Vorlagenparameter {{{Zeichen}}} wird es klassifiziert.

Wenn Fehler – #iferror

Es wird analysiert, ob in einem Wikitext eine Fehlermeldung vorliegt.

Eine Fehlermeldung wird erkannt:

  • an bestimmten HTML-Tags, namentlich <div> <span> <p> <strong>,
  • die eine Klassenzuweisung class="error" enthalten müssen,
  • wobei error mit doppelten Anführungszeichen " und nicht mit ' (oder ohne) angegeben sein muss,
  • jedoch weitere durch Leerzeichen abgetrennte Klassenbezeichner im Attributwert vorkommen dürfen.

Solche Fehlermeldungen können in jeder Vorlage generiert werden; viele Elemente der Wiki-Software erzeugen sie ebenfalls.

Funktion Pflichtparameter Parameter
#iferror Wikitext WennFehler WennProblemlos
Ergebnis in Abhängigkeit von der Existenz einer Fehlermeldung.
  • Wikitext wird analysiert.

Es ergeben sich drei Möglichkeiten in Abhängigkeit davon, ob auch WennFehler und WennProblemlos angegeben wurden.

  1. Nur Wikitext:
    • Wenn „Fehlermeldung“ gefunden, dann ist das Ergebnis „nichts“.
    • Wenn keine Fehlermeldung gefunden wurde, dann ist das Ergebnis der Wikitext.
  2. Wikitext und WennFehler:
    • Wenn „Fehlermeldung“ gefunden, dann ist das Ergebnis WennFehler.
    • Wenn keine Fehlermeldung gefunden wurde, dann ist das Ergebnis der Wikitext.
  3. Wikitext und WennFehler und WennProblemlos:
    • Wenn „Fehlermeldung“ gefunden, dann ist das Ergebnis WennFehler.
    • Wenn keine Fehlermeldung gefunden wurde, dann ist das Ergebnis WennProblemlos.
Beispiele:
  • {{#iferror: <span class="error">Bug!</span>}} → »«
  • {{#iferror: Alles fein.}} → »Alles fein.«
  • {{#iferror: <span class="error">Bug!</span> | Problem!}} → »Problem!«
  • {{#iferror: Alles fein. | Problem!}} → »Alles fein.«
  • {{#iferror: <span class="error">Bug!</span> | Problem! | einwandfrei}} → »Problem!«
  • {{#iferror: Alles fein. | Problem! | einwandfrei}} → »einwandfrei«
  • {{#iferror: <span class="error">Bug!</span> | | einwandfrei}} → »«
  • {{#iferror: Alles fein. | | einwandfrei}} → »einwandfrei«

Wenn existiert – #ifexist

Funktion Pflichtparameter Parameter
#ifexist Seitenname WennExistiert WennNicht
Ergebnis in Abhängigkeit von der Existenz einer Seite im lokalen Projekt.
  • Seitenname wird gesucht; fremde Wikis werden nicht betrachtet.
  • Mediendateien gelten auch als existent, wenn sie auf Commons liegen und im Namensraum Media: gesucht werden, Im Namensraum Datei: existieren nur lokale Dateibeschreibungsseiten.
  • WennExistiert ist das Ergebnis, das die Parserfunktion liefern soll, wenn Seitenname existiert. Dies kann auch leer sein.
  • WennNicht ist das Ergebnis, das die Parserfunktion liefern soll, wenn Seitenname nicht existiert. Dies kann auch leer sein; allerdings würde dann diese Option komplett weggelassen werden.
Beispiele:
  • {{#ifexist: H:? | Help! | Imagine there is no help}}Help! für H:?
  • {{#ifexist: H:! | Help! | Imagine there is no help}}Imagine there is no help für H:!

Der Seitenname wird im Gesamtprojekt wie eine Verlinkung registriert.

  • Das hat den Grund, dass zu erwarten ist, dass sich das Ergebnis der Programmierung signifikant verändern soll, wenn eine existierende Seite gelöscht wird, oder aber eine bisher nicht existierende Seite neu angelegt wird.
  • Damit wird die diese Konstruktion enthaltende Seite so behandelt, als ob sich eine eingebundene Vorlage verändert hätte: Die im Cache hinterlegte Präsentation wird als ungültig entfernt, und spätestens mit dem nächsten Abruf der Seite unter geänderten Bedingungen neu produziert.
  • Anhand der Datenbank-Tabelle Links auf diese Seite weiß der Server, welche Seiten, ihre Inhalte oder Existenz Auswirkungen auf die Darstellung anderer Seiten haben; etwa auch ob Wikilinks in rot oder blau darzustellen sind. Gemäß der Einträge in der Datenbank-Tabelle werden die beeinflussten Seiten neu aufgebaut.
  • Es gibt mit phab:T14019 von 2007 Überlegungen aus 2022, in den Tabellen von WhatLinksHere die Abfragen nach Seitenexistenz in einer vierten Spalte gesondert auszuweisen, statt sie gemeinsam mit den Verlinkungen zu verbuchen. Das betriffft jedoch nur die bisherige Aufschlüsselung nach Verlinkung – Seiteneinbindung – Weiterleitung. Änderungen des Status bedürfen auch dann einer Neugenerierung des Gesamtinhalts unter den aktuellen Bedingungen.
  • Um die Existenz einer Datei abzufragen, muss man dem Dateinamen den Namensraum "Medium" voranstellen und nicht "Datei". Beispiel Datei:Commons-logo.svg: {{#ifexist: Medium:Commons-logo.svg|...

#ifexist gehört zu den „teuren“ Funktionen, von denen pro dargestellter Seite gemäß Vorlagenbeschränkungen insgesamt nur 500 erlaubt sind.

Wenn Ausdruck – #ifexpr

Funktion Pflichtparameter Parameter
#ifexpr Ausdruck WennWahr WennFalsch
Ergebnis in Abhängigkeit von einem berechneten Ausdruck.
  • Ausdruck muss mittels der Parserfunktion #expr auswertbar sein.
  • Wenn Ausdruck einen Wert ungleich 0 liefert, ist das Ergebnis WennWahr.
  • Wenn Ausdruck den Wert 0 liefert, ist das Ergebnis WennFalsch oder „leer“.
  • Wenn Ausdruck keine gültige Berechnung ermöglicht, ist das Ergebnis eine Fehlermeldung mit Behandlung wie bei #expr.
Beispiele:
  • {{#ifexpr: 1 | Richtig}}Richtig
  • {{#ifexpr: 0 | Richtig}}
  • {{#ifexpr: 1 | Richtig | Falsch}}Richtig
  • {{#ifexpr: 0 | Richtig | Falsch}}Falsch
  • {{#ifexpr: 99 | Richtig | Falsch}}Richtig
  • {{#ifexpr: -123 | Richtig | Falsch}}Richtig
  • {{#ifexpr: x | Richtig | Falsch}}Fehler im Ausdruck: Unerkanntes Wort „x“

Und-/Oder-Verknüpfungen

Wenn bei einer der Verknüpfungsvorlagen (Vorlage:Booland, Vorlage:Boolor usw.) die Parameter übergeben werden, dann müssen zunächst ausnahmslos alle Parameterwerte vollständig ausgewertet worden sein, bevor dann die Verknüpfungsvorlage mit all diesen Parameterwerten eingebunden werden kann.

  • Das kann zum Problem werden; insbesondere wenn dadurch „teure“ oder sonst performancekritische Auswertungen erforderlich sind.

Intelligenter ist immer der folgende Weg:

  • Und:
    • Eine Bedingung wird ausgewertet, falls erfolgreich dann die nächste, wenn auch diese erfolgreich dann die nächste usw. Sobald eine Bedingung nicht erfüllt ist, erfolgen auch keine Auswertungen mehr.
    • Beispiel: {{#if: {{A-Vorlage}} | {{#if: {{B-Vorlage}} | <Aktion> }} }}
  • Oder:
    • Eine Bedingung wird ausgewertet, falls nicht erfolgreich dann die nächste, falls nicht erfolgreich dann die nächste usw. Sobald eine Bedingung erfüllt ist, erfolgen auch keine Auswertungen mehr.
    • Es kann ein boolescher Wert 1 für den Erfolgsfall gebildet werden, und das gesamte Oder-Konstrukt liefert danach den Wert 1 oder leer. Dieses Resultat kann dann zur Auswertung der gemeinschaftlichen Ziel-Aktion herangezogen werden.
    • Beispiel:{{#if: {{#if: {{A-Vorlage}} | 1 | {{#if: {{B-Vorlage}} | 1 }} }} | <Aktion> }}

Geschichte

Mitte April 2006 wurden (zusammen mit anderen in der Erweiterung für Parserfunktionen) die Kontrollstrukturen verfügbar gemacht. Erst dadurch wurde auch eine Vorlagenprogrammierung im eigentlichen Sinn möglich, während bis dahin nur stumpf Parameterwerte formatiert wurden. Die allerersten Vorlagen hatten noch nicht einmal Parameter gehabt und hießen schlicht „Bausteine“; sie lieferten immer den gleichen Text.