--=REKLAMA=--
Poniższy artykuł dotyczy funkcji parsera. Jest to luźne tłumaczenie artykułu meta, dostępnego [tutaj] skopiowane ze strony: polskiej Wikipedii
Funkcje parsera są rozszerzeniami mechanizmu szablonów ułatwiającymi konstrukcję skomplikowanych szablonów, dających różne efekty w zależności od użytych parametrów. Zostały aktywowane na wszystkich wikipediach na zasadzie testu.
Istnieje rozszerzenie MediaWiki, będące kolekcją funkcji parsera. Ich wywołanie najczęściej ma postać:
{{#nazwa_fukcji: argument 1 | argument 2 | argument 3...}}
Poniżej opisano pięć funkcji: if, ifeq, switch, expr oraz ifexpr
If (z ang. jeśli, jeżeli). Funkcja if ma w ogólności postać:
{{#if: warunek | tekst 1 | tekst 2 }}
czyli:
{{#if: niepusty argument 1|to wyświetl argument 2|w przeciwnym wypadku wyświetl argument 3}}
Jeśli warunek nie jest pusty, albo nie zawiera samych spacji, to wyświetlany jest tekst 1. W przeciwnym wypadku (gdy pole warunek jest puste, albo zawiera same spacje) wyświetlany jest tekst 2. Warunek może się składać np. z jednego lub większej ilości sprawdzanych parametrów szablonu. Przy wielu parametrach zasada jest analogiczna jak przy jednym - jeśli po rozwinięciu wszystkich parametrów warunek nie jest pusty, albo nie zawiera samych spacji, to wyświetlany jest tekst 1, w przeciwnym wypadku tekst 2.
Jako warunek w różnych szablonach najlepiej podawać dowolny parametr i w ten sposób szablon będzie mógł "reagować" na to czy parametr jest pusty czy nie.
{{#if: {{{parametr|}}} | Parametr jest nie pusty. | Parametr nie został podany lub jest pusty.}}
{{Szablon|parametr=cokolwiek}}
daje wynik:
{{Szablon|parametr=}}
lub po prostu {{Szablon}}
daje wynik:
Czyli w pierwszej sytuacji wyświetlany jest pierwszy tekst, a w drugiej ten drugi.
Skoro można przetestować, czy jakiś parametr jest pusty, to można go też dalej wstawić i wyświetlić.
{{#if: {{{parametr|}}} | Parameter jest nie pusty i oto on: {{{parametr|}}}. | Parametr nie został podany lub jest pusty.}}
{{Szablon|parametr=cokolwiek}}
daje wynik:
{{Szablon|parametr=}}
lub po prostu {{Szablon}}
jest identyczne jak wyżej i daje wynik:
Nieco sensowniejszym przykładem, który pozwoli zrozumieć po co to jest, może być poniższy prosty szablon:
{{#if:{{{kobieta|}}}|Ta wikipedystka|Ten wikipedysta}} potrafi już używać funkcji parsera i jest z tego dumn{{#if:{{{kobieta|}}}|a|y}}.
{{Szablon|kobieta=tak}}
daje wynik:
{{Szablon|kobieta=}}
Wszystko będzie w porządku póki będziemy pamiętać, że sprawdzane jest tylko, czy podany parametr jest pusty, stąd
{{Szablon|kobieta=nie}}
daje wynik:
ifeq (od if equal — ang. jeśli równe). Funkcja ifeq ma w ogólności postać:
{{#ifeq: porównaj A | porównaj B | tekst 1 | tekst 2 }}
czyli:
{{#ifeq: argument 1|jest równy argument 2 | to wyświetl argument 3|w przeciwnym wypadku wyświetl argument 4}}
Jeśli porównaj A i porównaj B są identyczne, to wyświetlany jest tekst 1. W przeciwnym wypadku (gdy pole porównaj A i porównaj B są różne) wyświetlany jest tekst 2.
Funkcja ifeq nadaje się idealnie do uczynienia poprzedniego szablonu nieco bardziej intuicyjnym:
{{#ifeq:{{{kobieta}}}|tak|Ta wikipedystka|Ten wikipedysta}} potrafi już używać funkcji parsera i jest z tego dumn{{#ifeq:{{{kobieta}}}|tak|a|y}}.
{{Szablon|kobieta=tak}}
daje wynik:
{{Szablon|kobieta=}}
{{Szablon|kobieta=nie}}
daje wynik:
Ale żeby nie zagubić sensu może warto jednak dać dwa proste przykłady (tym razem bez użycia szablonów).
{{#ifeq: tak | tak | podane argumenty są równe | podane argumenty są różne }}
{{#ifeq: tak | nie | podane argumenty są równe | podane argumenty są różne }}
Czyli tak jest równe tak, nie jest różne od tak. To chyba oczywiste ☺.
W wypadku tej funkcji też można jednak ponarzekać, że nie wszystko jest tak jak chcemy:
{{#ifeq: tak | Tak | podane argumenty są równe | podane argumenty są różne }}
Jednak tak jest różne od Tak, co jak się przyjrzeć może nie jest aż takie dziwne ;).
ifexist (od if exist — ang. jeśli istnieje). Funkcja ifexist ma w ogólności postać:
{{#ifexist: artykuł | tekst 1 | tekst 2 }}
czyli:
{{#ifexist: artykuł o nazwie argument 1|to wyświetl argument 2|w przeciwnym wypadku wyświetl argument 3}}
Jeśli istnieje artykuł, to wyświetl tekst 1. W przeciwnym wypadku (gdy artykuł nie istnieje) wyświetlany jest tekst 2.
{{#ifexist:Coś|Coś istnieje|Coś nie istnieje}}
- daje w wyniku "Coś nie istnieje", bo artykuł Coś nie istnieje.
{{#ifexist:Łoś|Łoś istnieje|Łoś nie istnieje}}
- daje w wyniku "Łoś nie istnieje", bo artykuł Łoś nie istnieje.
{{#ifexist:Wikipedia:Funkcje parsera|dziękujemy za funkcje parsera ;)|mam pomysł na ciekawą funkcjonalność}}
- daje w wyniku "mam pomysł na ciekawą funkcjonalność".
Tu należy zwrócić uwagę, że funkcja działa analogicznie do oznaczania linków na niebiesko (gdy artykuł istnieje) i na czerwono (gdy artykuł nie istnieje). Jak do tej pory, takie oznaczanie linków nie działa dla interwiki (oraz linków do pokrewnych projektów). Podobnie ta funkcja parsera nie obsługuje tego rodzaju linków.
{{#ifexist::en:Moose|Moose istnieje?|Moose nie istnieje?}}
Uwaga: Przykład dotyczy Wikipedii (strona en:Moose w rzeczywistości istnieje - tutaj wyświetlana jako nieistniejąca, bo nie są obsługiwane skróty interwiki.
switch
porównuje pojedynczą wartość z wieloma innymi. Jeżeli znajdzie taką samą wartość zwraca odpowiedni ciąg znaków. W przeciwnym wypadku zwróci wartość domyślną, o ile taka zostanie podana.
sposób wywołania:
{{ #switch: wartość do porównania | wartość1 = wynik1 | wartość2 = wynik2 | ... | wartośćn = wynikn | wartość domyślna }}
lub (w przypadku gdy wartość domyślna musi zawierać znak równości):
{{ #switch: wartość do porównania | wartość1 = wynik1 | wartość2 = wynik2 | ... | wartośćn = wynikn | #default = wartość domyślna }}
lub (w przypadku gdy dla kilku różnych wartości ma być ten sam wynik):
{{ #switch: wartość do porównania | wartość1 | wartość2 | wartość3 = wynik1/2/3 | ... | wartośćn = wynikn | wartość domyślna }}
Przykład:
{{ #switch: {{{dzień}}} | 1 = poniedziałek | 2 = wtorek | 3 = środa | 4 = czwartek | 5 = piątek | 6 = sobota | 7 = niedziela | weekend }}
Porównuje treść przesyłaną przez parametr dzień. Jeśli ta treść to 1-7 w wyniku otrzymamy odpowienią nazwę dnia tygodnia. Gdy treść będzie inna lub pędzie pusta, otrzymamy tekst weekend.
Funkcja expr
wykonuje obliczenia matematyczne.
{{ #expr: wyrażenie }}
Operator | Operacja matematyczna | Przykład |
---|---|---|
+ | Dodawanie | {{#expr: 30 + 7}} = 37
|
- | Odejmowanie | {{#expr: 30 - 7}} = 23
|
* | Mnożenie | {{#expr: 30 * 7}} = 210
|
/ div |
Dzielenie | {{#expr: 30 / 7}} = 4.2857142857143
|
round x | Zaokrąglanie do x miejsc po przecinku | {{#expr: 30 / 7 round 3}} = 4.286
|
mod | Dzielenie modulo (reszta z dzielenia) | {{#expr: 30 mod 7}} = 2
|
Operatory logiczne ("1" - prawda, "0" - fałsz) | ||
= | Równa się | {{#expr: 30 = 7}} = 0
|
<> != |
Nie równa się (jest większe lub mniejsze) | {{#expr: 30 <> 7}} = 1
|
< | Mniejsze niż | {{#expr: 30 < 7}} = 0
|
> | Większe niż | {{#expr: 30 > 7}} = 1
|
<= | Mniejsze lub równe | {{#expr: 30 <= 7}} = 0
|
>= | Większe lub równe | {{#expr: 30 >= 7}} = 1
|
and | Logiczne i | {{#expr: 30 and 7}} = 1
|
or | Logiczne lub | {{#expr: 30 or 7}} = 1
|
not | logiczne nie | {{#expr: not 7}} = 0
|
Specjalne | ||
( ) | Grupowanie | {{#expr: (30 + 7) * 5 }} = 185
|
UWAGA! Separatorem dziesiętnym w wyniku jest .
(kropka), a więc np. liczba półtora ma zapis "1.5".
Aby obliczyć ile stopni Celsjusza odpowiada 100°F można skorzystać ze wzoru (wyrażenia) podanego poniżej.
{{#expr: (100 - 32) / 9 * 5 round 0 }}
38
Tu należy zauważyć, że 100°F nie jest dokładnie równe 38°C, jednak dzięki użyciu round 0, wynik został zaokrąglony do najbliższej liczby całkowitej (round 1 zaokrągliło by do pierwszego miejsca po przecinku).
ifexpr (od if expression — ang. jeśli wyrażenie). Funkcja ifexpr ma w ogólności postać:
{{#ifexpr: jeśli wyrażenie jest równe 1 | wtedy tekst 1 | w przeciwnym wypadku tekst 2}}
Jeżeli wyrażenie da wynik 0, to zostanie wyświetlony tekst w przeciwnym wypadku tekst 2. Natomiast, jeżeli wynikiem jest liczba inna niż 0, to wyświetlony zostanie tekst wtedy tekst 1. Funkcja obsługuje te same operatory co funkcja expr.
time zwraca czas w zdanym formacie także dla daty podanej w opcjonalnym drugim parametrze, bądź w wersji względnej (np. +1 month).
{{#time: format | określenie czasu (opcjonalne)}}
Składnia formatu została zapożyczona ze składni PHP. Została jednak ona rozszerzona o dodatkowe kody podane poniżej.
Kod | Opis |
---|---|
xg | Wyświetla nazwę miesiąca w dopełniaczu (np. "września"). |
xn | Następujący po tej sekwencji znaków kod formatu (na przykład godziny 'H') zostanie wyświetlony jako kod ASCII. Dla przykładu w języku Hindi, {{#time:H, xnH}} da w wyniku ०६, 06. |
xr | Następujący po tej sekwencji znaków kod formatu (na przykład godziny 'H') zostanie wyświetlony jako liczba rzymska; przykład {{#time:H, xrH}} da w wyniku 09, IX |
xx | Wyświetla znak 'x' |
Poniżej lista kodów znakowych zapożyczonych ze składni PHP.
Kod | Opis | Przykład lub zakres | Obecne ustawienie |
---|---|---|---|
Y | Rok | 2005 | 2024 |
y | Rok w formacie dwucyfrowym (dwie ostatnie cyfry roku) | od 00 do 99 (05 dla roku 2005) | 24 |
n | Numer bieżącego miesiąca | od 1 do 12 (9 dla września) | 3 |
m | Numer bieżącego miesiąca, dwucyfrowy | od 01 do 12 (09 dla września) | 03 |
L | Sprawdza, czy rok jest przestępny | od 1 jeśli tak, 0 jeśli nie. | 1 |
M | Skrótowa nazwa miesiąca | od sty do gru (lis dla listopada) | mar |
F | Pełna nazwa miesiąca | styczeń do grudzień | marzec |
t | Liczba dni w miesiącu | od 28 do 31 (30 dla listopada) | 31 |
j | Dzień miesiąca | od 1 do 31 | 29 |
d | Dzień miesiąca, liczba dwucyfrowa | od 01 do 31 | 29 |
z | Dzień roku (od liczby 0) | od 0 do 364 (365 w roku przestępnym - 1 dla 2 stycznia) | 88 |
D | Skrótowa nazwa dnia tygodnia | od Pon do Nie | Pt |
l | Pełna nazwa nia tygodnia | od Poniedziałek do Niedziela | piątek |
w | Numer dnia tygodnia (według amerykańskiego kalendarza). | od 0 (Niedziela) do 6 (Sobota) | 5 |
N | Numer dnia tygodnia | od 1 (Poniedziałek) do 7 (Niedziela) | 5 |
W | Numer tygodnia | od 1 do 52 (lub 53 - zależy od roku) | 13 |
a | "am" (między 01:00:00 a 12:59:59 tego samego dnia) lub "pm", małymi literami (wykorzystowane w formacie 12-godzinnym). | am / pm | am |
A | Tak samo, jak a ale dużymi literami | AM / PM | AM |
g | 12-godzinny format godziny bez poprzedzającego ew. zera (jedna lub dwie cyfry, używane z am/pm lub AM/PM). | od 1 do 12 | 9 |
h | 12-godzinny format godziny, z poprzedzającym ew. zerem (dwie cyfry, używane z am/pm lub AM/PM). | od 01 do 12 | 09 |
G | 24-godzinny format godziny bez poprzedzającego ew. zera (jedna lub dwie cyfry, używane z am/pm lub AM/PM). | od 0 do 23 | 9 |
H | 24-godzinny format godziny, z poprzedzającym ew. zerem (dwie cyfry, używane z am/pm lub AM/PM). | od 00 do 23 | 09 |
i | Minuta, z poprzedzającym ew. zerem (dwie cyfry). | od 00 do 59 | 57 |
s | Sekunda, z poprzedzającym ew. zerem (dwie cyfry). | od 00 do 59 | 32 |
U | Sekundy, które upłynęły od 1 stycznia 1970 00:00:00 czasu GMT. | od 0 do nieskończoności | 1711706252 |
c | Data w formacie ISO 8601, taka jak {{#time:Y-m-dTH:m:s{{#time:+H:m|+0 hours}}}} . | ustawiona sztywna długość stringa (łańcucha) | 2024-03-29T09:57:32+00:00 |
r | Data w formacie RFC 2822, taka jak {{#time:D, j M Y H:m:s {{#time:+H:m|+0 hours}}}}. | zmienna długość stringa (łańcucha) | Fri, 29 Mar 2024 09:57:32 +0000 |
Przy tworzeniu tabel w formacie MediaWiki należy użyć szablonu {{!}} zamiast znaku potoku (|), gdyż funkcje parsera uniemożliwiają zwykłe jego wstawienie (alternatywnie można użyć składni HTML). Przy wpisywaniu znaku potoku jako zwykły tekst można użyć encji |
lub konstrukcji <nowiki>|</nowiki>.
W obrębie funkcji parsera należy użyć składni HTML dla nowego wiersza (<br/>).
W następującym przypadku:
Pierwszy akapit, wyświetlany zawsze.{{#if:{{{1|}}}| Drugi akapit, wyświetlany jedynie, gdy zostanie podany argument {{{1}}}.}}
należy dodać <nowiki/> przed rozpoczęciem drugiego akapitu (tzw. whitespace) aby został poprawnie wyświetlony, np.:
Pierwszy akapit, wyświetlany zawsze.{{#if:{{{1|}}}|<nowiki/> Drugi akapit, wyświetlany jedynie, gdy zostanie podany argument {{{1}}}.}}