Hilfe:Vorlagenprogrammierung
aus Wikipedia, der freien Enzyklopädie
Abkürzung: WP:VP
Seit Mitte April 2006 verfügt die Wiki-Syntax der MediaWiki-Software über verschiedene Konstrukte einer Programmiersprache für die Verwendung in Vorlagen. Voraussetzung ist die Extension ParserFunctions.
(Auch die die Grundfunktionalität bringt bereits einen Satz von Parserfunktionen mit sich; diese werden separat unter Variablen besprochen.)
Die Sprachkonstrukte sollten ausschließlich im Vorlagen-Namensraum verwendet und wohlüberlegt eingesetzt werden. Nicht jede Spielerei, die möglich ist, ist auch sinnvoll. Programmierkonstrukte, die nicht ausreichend dokumentiert sind, werden wieder gelöscht.
Bei Problemen und Fragen zur Vorlagenprogrammierung hilft die Werkstatt des Wikiprojekts Vorlagen weiter.
Inhaltsverzeichnis |
[Bearbeiten] Beschreibung der ParserFunctions
[Bearbeiten] Funktion if
Die if
-Funktion ist ein Wenn-Dann-Sonst-Konstrukt. Die Syntax:
{{#if: <bedingung> | <dann-text> | <sonst-text>}}
Enthält die <bedingung>
Text, gilt sie als erfüllt und es wird <dann-text>
zurückgegeben. Ist <bedingung>
hingegen leer oder besteht ausschließlich aus Leerzeichen (whitespace), gilt sie als nicht erfüllt und es wird <sonst-text>
zurückgegeben. <sonst-text>
kann auch weggelassen werden, dann wird in diesem Fall nichts zurückgegeben.
Bei der Testbedingung ist auf folgendes zu achten: Wird z.B. der Parameter {{{foo}}}
referenziert und wurde dieser Parameter nicht angegeben, so hat der referenzierte Parameter den Wert "{{{foo}}}
" (die Wiki-Software löst den Parameter also nicht auf) und der Ausdruck ist immer richtig. Um dies zu verhindern, wird typischerweise {{{foo|}}}
benutzt, also die Angabe eines leeren Default-Wertes. In diesem Fall hat der referenzierte Ausdruck den Wert "", also ein leerer Parameter. Dieses Verfahren erlaubt allerdings keine Unterscheidung mehr zwischen einem nicht angegebenen oder einem leer angegebenen Parameter.
Da Bedingungen sehr häufig in Tabellen und Infoboxen verwendet werden, noch ein weiterer Hinweis zur Tabellenverarbeitung: Um eine Tabellenzeile auszublenden, die etwa folgenden statischen Aufbau hat
... |- | Name || Wert ...
kann folgende Kodierung verwendet werden
... |- {{#if: {{{foo|}}} | {{!}} Name {{!!}} Wert }} ...
Dabei ist auf folgendes zu achten:
- Innerhalb der if-Anweisung darf das |-Zeichen nicht anderweitig verwendet werden, weil es sonst fälschlicherweise als
dann-text
interpretiert werden würde. Daher muss das für die Tabelle notwendige |-Zeichen als{{!}}
oder doppelt als{{!!}}
kodiert werden. - Die Tabellensyntax erlaubt mehrere leere Zeilen hintereinander. Das heißt es ist unproblematisch mehrere Zeilen mit
|-
(selbst mit Leerzeilen dazwischen) hintereinander zu kodieren.
Achtung: if
unterstützt keine Gleichungen oder Ähnliches. Siehe dafür ifeq
und ifexpr
.
[Bearbeiten] Funktion ifeq
ifeq
vergleicht zwei Zeichenketten und gibt je nach Ergebnis verschiedene Texte zurück.
{{#ifeq: <text 1> | <text 2> | <text wenn gleich> | <text wenn ungleich> }}
[Bearbeiten] Funktion ifexist
ifexist
prüft, ob ein angegebenes Lemma existiert, und gibt je nachdem verschiedene Texte zurück.
{{#ifexist: <Lemma> | <Text wenn Lemma existiert> | <Text wenn Lemma nicht existiert> }}
Dabei darf die Gesamtzahl der ifexist auf einer Seite nicht die Grenze von 500 übersteigen, wobei es egal ist, ob sie eingebunden werden oder nicht. Weitere Einbindungen von ifexist werden stets so behandelt, als würde die angegebene Seite nicht existieren. Zusätzlich erscheint eine Warnung und die Seiten werden kategorisiert.
Die Überprüfung mittels #ifexist:
erzeugt intern einen Link zum überprüften Lemma, dieser taucht dann fälschlicherweise in dessen Linkliste auf. Bei Dateien wird eine Verwendung angezeigt. Diese Problematik kann nicht umgangen werden.
Interwiki-Links werden nicht geprüft. Es wird immer angenommen, dass Lemmata in anderen Wikis nicht existieren.
Die Parserfunktion prüft bei Bildern mit Namensraum "Bild:" bzw. "Image:" auf Existenz einer Bildbeschreibungsseite im lokalen Projekt, bei Angabe von "Media:" auf physikalische Existenz der Datei, auch über das lokale Projekt hinweg auf Commons.
[Bearbeiten] Funktion expr
expr berechnet mathematische Ausdrücke.
{{ #expr: <ausdruck> }}
Operator | Operation | Beispiel |
---|---|---|
Algebraische Operationen | ||
+ | Addition | {{#expr: 30 + 7 }} = 37 |
- | Subtraktion (oder Negation) | {{#expr: 30 - 7 }} = 23 |
* | Multiplikation | {{#expr: 30 * 7 }} = 210 |
/ oder div | Division | {{#expr: 30 / 7 }} = 4.2857142857143 |
^ | Potenz (ab). Achtung: Beim zweifachen Potenzieren sollten Klammern angegeben werden. Die Potenzen werden von der Software linksassoziativ ausgeführt: 2^2^2 = (2^2)^2. | {{#expr: 2^8 }} = 256 |
mod | Modulo, der Rest einer Division | {{#expr: 30 mod 7 }} = 2 |
exp | Exponentialfunktion (en) | {{#expr: exp 5 }} = 148.41315910258 |
ln | Der natürliche Logarithmus einer Zahl. Zur Umrechnung in andere Logarithmen siehe Basisumrechnung. | {{#expr: ln exp 3 }} = 3 |
abs | Betragsfunktion | {{#expr: abs -1.2 }} = 1.2, {{#expr: abs 1.2 }} = 1.2 |
Runden | ||
round | Rundet die Zahl auf der linken Seite auf die Anzahl Nachkommastellen, die von der Zahl auf der rechten Seite angegeben wird | {{#expr: 30 / 7 round 7 }} = 4.2857143 |
trunc | Rundet eine Zahl in Richtung Null, d. h. negative Zahlen werden aufgerundet und positive Zahlen werden abgerundet | {{#expr: trunc -1.2 }} = -1, {{#expr: trunc 1.2 }} = 1 |
floor | Abrunden | {{#expr: floor -1.2 }} = -2, {{#expr: floor 1.2 }} = 1 |
ceil | Aufrunden | {{#expr: ceil -1.2 }} = -1, {{#expr: ceil 1.2 }} = 2 |
Konstanten und trigonometrische Operatoren | ||
e | Die Eulersche Zahl e | {{#expr: e }} = 2.718281828459 |
pi | Die Kreiszahl π | {{#expr: pi }} = 3.1415926535898 |
sin | Berechnet den Sinus einer Zahl in Bogenmaß | {{#expr: sin 3.14 }} = 0.0015926529164868 |
cos | Berechnet den Kosinus (engl. cosine) einer Zahl in Bogenmaß | {{#expr: cos pi }} = -1 |
tan | Berechnet den Tangens einer Zahl in Bogenmaß | {{#expr: tan 1 }} = 1.5574077246549 |
asin | Berechnet den Arkussinus | {{#expr: asin 0.5 }} = 0.5235987755983 |
acos | Berechnet den Arkuskosinus | {{#expr: acos 0 }} = 1.5707963267949 |
atan | Berechnet den Arkustangens | {{#expr: atan 1.4 }} = 0.95054684081208 |
Vergleichsoperatoren | ||
= | Gleichheit | {{#expr: 30 = 7 }} = 0 |
<> oder != | Ungleichheit | {{#expr: 30 <> 7 }} = 1 |
< | Kleiner als | {{#expr: 30 < 7 }} = 0 |
> | Größer als | {{#expr: 30 > 7 }} = 1 |
<= | Kleiner oder gleich | {{#expr: 30 <= 7 }} = 0 |
>= | Größer oder gleich | {{#expr: 30 >= 7 }} = 1 |
Logische Operatoren | ||
and | Logisches UND | {{#expr: 30 and 7 }} = 1 |
or | Logisches ODER | {{#expr: 30 or 7 }} = 1 |
not | Logisches NICHT | {{#expr: not 7 }} = 0 |
Syntax | ||
#.#e±# | Statt eines Kommas muss der Punkt zur Trennung der Nachkommastellen benutzt werden. Zahlengruppierungen (im deutschen meist der Punkt) sind nicht möglich. Zahlen können in der wissenschaftlicher Notation übergeben werden. Für positive Exponenten ist das Plus optional. | {{#expr: 0.7e4 }} = 7000 |
( ) | Gruppierung/Klammerung | {{#expr: (30 + 7) * 7 }} = 259 |
Die booleschen Operatoren behandeln 0 (Null) als falsch und 1 als wahr. Zahlen werden mit dem Punkt als Dezimaltrenner angegeben.
Beispiel:
{{ #expr: (100 - 32) / 9 * 5 round 0 }}
ergibt:
38
Damit werden 100 Fahrenheit auf die Celsius-Skala umgerechnet (auf die nächste Ganze Zahl gerundet).
Da diese Berechnungen aus Kompatibilitätsgründen mit dem englischen Zahlenformat durchgeführt werden (Beispiel: {{ #expr: 13000 / 3.1 round 2 }}
ergibt 4193.55) müssen solche Zahlen zusätzlich in das im deutschen Sprachraum übliche Format umgewandelt werden (Beispiel: {{
formatnum: {{ #expr: 13000 / 3.1 round 2 }} }}
ergibt 4.193,55).
[Bearbeiten] Funktion ifexpr
ifexpr
Wertet einen mathematischen Ausdruck aus.
{{#ifexpr: <ausdruck> | <dann-text> | <sonst-text> }}
Ist das Ergebnis von <ausdruck>
0 (Null), wird <sonst-text>
zurückgegeben. Sonst wird <dann-text>
zurückgegeben. <sonst-text>
kann auch weggelassen werden, dann wird in diesem Fall nichts zurückgegeben.
Die Syntax für Ausdrücke wird in der Beschreibung von expr erklärt.
[Bearbeiten] Funktion iferror
iferror
prüft, ob ein Fehler vorliegt, und gibt je nachdem verschiedene Texte zurück. Ein Fehler wird über die Klasse class="error"
repräsentiert. Diese Klasse wird in den Elementen div
, span
, p
und strong
erkannt. Dies ist ein Fehler, wie er bei #expr, #ifexpr, #time oder #rel2abs auftreten kann. Es können so auch vom Benutzer selber Fehler erzeugt werden. Es muss nur die Klasse in einer der Elemente auftauchen.
{{#iferror: <Ausdruck> | <Text bei Fehler> | <Text bei keinem Fehler> }}
Die letzten beiden Parameter sind optional. Sofern kein Text bei keinem Fehler angegeben ist, wird Ausdruck zurückgegeben. Ist nur Ausdruck angegeben, wird bei einem Fehler nichts ausgegeben, sonst Ausdruck.
[Bearbeiten] Funktion switch
switch
vergleicht einen Wert mit mehreren anderen. Die Grundsyntax ist:
{{#switch: <vergleichswert> | <wert1> = <ergebnis1> | <wert2> = <ergebnis2> | ... | <wertn> = <ergebnisn> | #default = <standardergebnis> }}
switch
geht alle Werte durch, bis der Vergleichswert gefunden wird. Dann wird das entsprechende Ergebnis (hinter dem Gleichheitszeichen) zurückgegeben. Wenn kein Wert übereinstimmt, wird der Eintrag unter #default
verwendet, sofern es diesen gibt. (Falls das Standardergebnis kein Gleichheitszeichen enthält, kann #default
auch weggelassen werden.)
„Rückfall“-Werte sind ebenfalls möglich:
{{#switch: <vergleichswert> | <wert1> | <wert2> | <wert3> = <ergebnis1,2,3> | ... | <wertn> = <ergebnisn> | #default = <standardergebnis> }}
Hier wird für <wert1>
, <wert2>
und <wert3>
derselbe Wert <ergebnis1,2,3>
zurückgegeben.
[Bearbeiten] Funktion time
#time ist eine Zeit- und Datums-Formatierungs-Funktion. Sie liefert die Koordinierte Weltzeit (UTC).
Für die lokale Zeit kann die Funktion #timel angewandt werden.
Die Syntax ist
- {{ #time: format }}
oder
- {{ #time: format | time }}
Wenn "time" nicht angegeben wird, wird die Zeit zum Zeitpunkt der Umwandlung in HTML benutzt. Durch das Servercaching kann es dabei zu Abweichungen bei der Artikelanzeige bis zu einer Woche kommen. Eine manuelle Aktualisierung kann durch einen „null edit“ (Seite bearbeiten und Speichern ohne Änderung) erfolgen.
Der "format"-Parameter ist ähnlich den der PHP-Datumsparameter.
Die folgenden Codes haben dieselbe Bedeutung wie in PHP. Bedeutende Differenzen vom PHP-Verhalten (abgesehen von sprachlichen und lokalen Unterschieden) sollten als Fehler der Parserfunktionen gesehen und als Bug gemeldet werden. Alle numerischen Codes geben Zahlen entsprechend der lokalen Spracheinstellung zurück, durch die Nutzung des xn-Codes kann dieses Verhalten überschrieben werden.
Code | Beschreibung | Ausgabe |
---|---|---|
d | Tag, mit führender Null | 29 |
D | Wochentag, abgekürzt | So |
j | Tag, ohne führende Null | 29 |
l | Wochentag, ausgeschrieben | Sonntag |
F | Monatsname, ausgeschrieben | Juni |
m | Monat, mit führender Null. | 06 |
M | Monatsname, abgekürzt | Jun. |
n | Monat, ohne führende Null. | 6 |
Y | Jahr, 4-stellig | 2008 |
y | Jahr, 2-stellig. | 08 |
H | Stunde, mit führender Null | 21 |
i | Minute, mit führender Null | 45 |
s | Sekunde, mit führender Null | 25 |
Die folgenden Codes sind Erweiterungen zu PHP:
Code | Beschreibung | Ausgabe |
---|---|---|
xn | Formatiert den nächsten numerischen Code als Roh-ASCII. Beispiel, in Hindi: {{ #time:H, xnH}} ergibt ०६, 06. | |
xr | Formatiert den nächsten numerischen Code als römische Zahl. | |
xg | Gibt die Genitivform des Monatsnamens aus; für Sprachen, die zwischen Genitiv und Nominativ unterscheiden. | |
xx | Der Buchstabe "x" | x |
xmj |
Tag nach islamischer Zeitrechnung |
24 Jumada al-thani |
xij |
Tag im iranischen Kalender |
9 Tir |
xjj |
Tag im jüdischen Kalender |
26 30 |
xkY | Jahr im thailändischen Sonnenkalender (Tag und Monat sind mit dem Gregorianischen Kalender identisch) | 2551 |
Jedes unbekannte Zeichen wird unbearbeitet zur Ausgabe durchgereicht. Dazu gibt es zwei Konventionen:
- Zeichen in doppelten Anführungszeichen werden als solche ausgegeben (ohne Anführungszeichen). Anführungszeichen alleine werden als solche ausgegeben. Beispiele:
- {{ #time: "Der Monat ist" F}} → Der Monat ist Juni
- {{ #time:i's"}} → 54'25"
- Backslash-escaping wird unterstützt: \H ergibt das Zeichen H, \" ergibt das Zeichen ".
Das Format des "time"-Parameters ist identisch mit der PHP-Funktion strtotime(). Relative Angaben, wie zum Beispiel "+10 hours", werden unterstützt, welche für eine Zeitzonen-Berechnung genutzt werden können.
Code | Beschreibung | Ausgabe |
---|---|---|
{{ #time:j"."n"."Y H":"i":"s|2 days 10 hours 40 minutes ago}} | Das angezeigte Datum wird um 2 Tage, 10 Stunden und 40 Minuten nach hinten verschoben | 27:6:2008 11:14:25 |
{{ #time:j"."n"."Y H":"i":"s|yesterday}} | Gestern | 28.6.2008 00:00:00 |
{{ #time:j"."n"."Y H":"i":"s|tomorrow}} | Morgen | 30.6.2008 00:00:00 |
{{#time:j"."n"."Y H":"i":"s|2 days}} | Übermorgen | 1.7.2008 21:54:25 |
{{#time:j"."n"."Y H":"i":"s|2 years 2 months 2 weeks 2 days}} | In 2 Jahren, 2 Monaten, 2 Wochen und 2 Tagen | 14.9.2010 21:54:25 |
{{#time:j"."n"."Y H":"i":"s|1 year 1 month 1 week 1 day}} | In einem Jahr, einem Monat, einer Woche und einem Tag | 6.8.2009 21:54:25 |
{{#time:xjj. xjF xjY}} | Aktuelles Datum nach dem jüdischen Kalender | 26. Sivan 5768 |
{{#time:xmj. xmF xmY}} | Aktuelles Datum nach dem islamischer Zeitrechnung | 24. Jumada al-thani 1429 |
{{#time:xij. xiF xiY}} | Aktuelles Datum nach dem iranischen Kalender | 9. Tir 1387 |
{{#time:j. F xkY}} | Aktuelles Datum nach dem Thailändischen Sonnenkalender | 29. Juni 2551 |
Siehe das „GNU tar manual“ für weitere Informationen.
[Bearbeiten] Funktion rel2abs
{{#rel2abs:}}
ermöglicht die relative Navigation in Unterseiten.
Ein relativer Seitenpfad kann ".", ".." sein oder mit "/", "./" "../" beginnen.
Relativer Seitenpfad | Basis | Beispiel | Ergebnis |
---|---|---|---|
. | {{#rel2abs: .}} |
Hilfe:Vorlagenprogrammierung | |
.. | {{#rel2abs: ..}} |
||
. | ns:a/b | {{#rel2abs: .|ns:a/b}} |
ns:a/b |
.. | ns:a/b | {{#rel2abs: ..|ns:a/b}} |
ns:a |
/x | ns:a/b | {{#rel2abs: /x|ns:a/b}} |
ns:a/b/x |
./x | ns:a/b | {{#rel2abs: ./x|ns:a/b}} |
ns:a/b/x |
../x | ns:a/b | {{#rel2abs: ../x|ns:a/b}} |
ns:a/x |
../../x | ns:a/b | {{#rel2abs: ../../x|ns:a/b}} |
x |
[Bearbeiten] Funktion titleparts
{{#titleparts:}}
gibt die angegebene Anzahl an Teilen (ab einer angegebenen Stelle) eines Seitentitels zurück, die durch einen Schrägstrich ("/
") getrennt sind. Beispiele:
{{#titleparts:Hilfe:Verweis/a/b|0}}
ergibtHilfe:Verweis/a/b
(Der ganze Name){{#titleparts:Hilfe:Verweis/a/b|1}}
ergibtHilfe:Verweis
{{#titleparts:Hilfe:Verweis/a/b|2}}
ergibtHilfe:Verweis/a
{{#titleparts:Hilfe:Verweis/a/b|1|2}}
ergibta
{{#titleparts:Hilfe:Verweis/a/b|2|2}}
ergibta/b
Mit negativen Werten wird von rechts der Teil zurückgegeben:
{{#titleparts:Hilfe:Verweis/a/b|1|-1}}
ergibtb
[Bearbeiten] Verwendung mit subst
Die ParserFunctions können auch mit subst verwendet werden, solange kein Leerzeichen zwischen subst:
und #
steht.
Hierbei ist aber zu beachten, dass sich die ParserFunctions sehr unterschiedlich verhalten. Daher ist ein Test vorher immer anzuraten. Für Tipps und Tricks gibt es eine englischsprachige Hilfeseite.
[Bearbeiten] Überprüfung von Zeichenketten
Mit #expr: können zwar numerische Werte, jedoch keine Zeichenketten verwendet werden. Dies lässt sich aber über die folgenden Vorlagen bewerkstelligen. Sie sind nicht Teil der ParserFunctions, werden allerdings der Vollständigkeit halber hier mit aufgelistet, um einen umfassenden Überblick über die zur Vorlagen-Programmierung einsetzbaren Mittel zu geben.
Nachfolgend bedeutet wahr, dass der jeweilige Parameter eine nicht-leere Zeichenkette enthält sowie nicht nur aus Whitespaces besteht.
Syntax | Beschreibung | Wahrheitstabelle | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
{{booland|A|B}} | Wenn A und B wahr sind, ist das Ergebnis wahr. |
|
|||||||||
{{boolor|A|B}} | Wenn A und/oder B wahr sind, ist das Ergebnis wahr. Statt dessen können die zu überprüfenden Parameter auch einfach verkettet werden, z. B.:
|
|
|||||||||
{{boolxor|A|B}} | Wenn entweder A oder B wahr ist, ist das Ergebnis wahr. |
|
|||||||||
{{boolnxor|A|B}} | Wenn A und B falsch sind oder A und B wahr sind, ist das Ergebnis wahr. |
|
|||||||||
{{boolnand|A|B}} | Wenn A und B wahr sind, ist das Ergebnis falsch. |
|
|||||||||
{{boolnor|A|B}} | Wenn A und B falsch sind, ist das Ergebnis wahr. Statt dessen kann auch die oben beschriebene Oder-Syntax mit vertauschten Dann- und Sonst-Zweigen verwendet werden. |
|
|||||||||
{{boolnot|A}} | Wenn A falsch ist, ist das Ergebnis wahr. |
[Bearbeiten] Besonderheiten
[Bearbeiten] Tabellen
siehe Problem: Senkrechter Strich in Parameterwerten
[Bearbeiten] Programmierhilfen
Um den Quelltext nicht zu sehr aufzublähen gibt es Vorlagen, mit denen Berechnungen eingebunden werden können:
- Vorlage:Ziffer extrahiert eine Ziffer aus einer Ganzzahl.
- Vorlage:Quersumme berechnet eine Quersumme.
- Vorlage:Zwischen prüft, ob eine Zahl in einem Intervall liegt.
- Vorlage:Min und Vorlage:Max bestimmen das Minimum bzw. Maximum von zwei bis drei Zahlen.
- Vorlage:IstZahl prüft, ob ein Parameter eine Zahl ist oder nicht.
[Bearbeiten] Testen
Vorlagen mit Parserfunktionen können auf der Spezialseite "Vorlagen expandieren" getestet werden.
Dabei wird der Aufruf der Vorlage (bspw. Vorlage:Infobox Tennisspieler) mit ihren Parametern in das „Eingabefeld“ kopiert:
{{Infobox Tennisspieler | Nationalität = deutsch | Geburtstag = 01.01.2000 | ErsteProfisaison = 2000 | Spielhand = links oder rechts }}
Über das Feld „Kontexttitel“ kann optional ein Seitenname übergeben werden, der die seitenabhängige Variable {{PAGENAME}}
füllt.
Beispielhafter Seitenname
Im o. g. Beispiel führt dies dazu, dass in der Vorschau oberhalb der Infobox nicht „ExpandTemplates“, sondern „Beispielhafter Seitenname“ angezeigt wird.
Weiterführende Informationen finden sich unter Extension:ExpandTemplates.