Pomoc:Funkcje parsera
- Dla zaawansowanych
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.
Funkcje
Istnieje rozszerzenie MediaWiki, będące kolekcją funkcji parsera. Ich wywołanie najczęściej ma postać:
{#nazwa_funkcji: argument 1 | argument 2 | argument 3...}
Poniżej opisano pięć funkcji: if
, ifeq
, switch
, expr
oraz ifexpr
if
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.
Sprawdzanie parametru szablonu
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.}
- Wywołanie jako
{Szablon|parametr=cokolwiek}
daje wynik:
- Parametr jest nie pusty.
- Wywołanie jako
{Szablon|parametr=}
lub po prostu{Szablon}
daje wynik:
- Parametr nie został podany lub jest pusty.
Czyli w pierwszej sytuacji wyświetlany jest pierwszy tekst, a w drugiej ten drugi.
Sprawdzanie i wstawianie parametru
Skoro można przetestować, czy jakiś parametr jest pusty, to można go też dalej wstawić i wyświetlić.
{#if: {parametr|} | Parametr jest nie pusty i oto on: {parametr|}. | Parametr nie został podany lub jest pusty.}
- Wywołanie jako
{Szablon|parametr=cokolwiek}
daje wynik:
- Parametr jest nie pusty i oto on: cokolwiek.
- Wywołanie jako
{Szablon|parametr=}
lub po prostu{Szablon}
jest identyczne z powyższym i daje wynik:
- Parametr nie został podany lub jest pusty.
Przykład użytkowy
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}.
- Wywołanie jako
{Szablon|kobieta=tak}
daje wynik:
- Ta wikipedystka potrafi już używać funkcji parsera i jest z tego dumna.
- Wywołanie jako
{Szablon|kobieta=}
- Ten wikipedysta potrafi już używać funkcji parsera i jest z tego dumny.
Wszystko będzie w porządku, póki będziemy pamiętać, że sprawdzane jest tylko, czy podany parametr jest pusty, stąd
- Wywołanie jako
{Szablon|kobieta=nie}
daje wynik:
- Ta wikipedystka potrafi już używać funkcji parsera i jest z tego dumna.
ifeq
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 dla A=B | tekst 2 dla A różne od B}
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.
Przykład użytkowy w wydaniu ifeq
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}.
- Wywołanie jako
{Szablon|kobieta=tak}
daje wynik:
- Ta wikipedystka potrafi już używać funkcji parsera i jest z tego dumna.
- Wywołanie jako
{Szablon|kobieta=}
- Ten wikipedysta potrafi już używać funkcji parsera i jest z tego dumny.
- Wywołanie jako
{Szablon|kobieta=nie}
daje wynik:
- Ten wikipedysta potrafi już używać funkcji parsera i jest z tego dumny.
Prostszy przykład
Ale żeby nie zagubić sensu, może warto jednak dać dwa proste przykłady (tym razem bez użycia szablonów).
- Treść przykładu (1)
{#ifeq: tak | tak | podane argumenty są równe | podane argumenty są różne}
- Wynik
- podane argumenty są równe
- Treść przykładu (2)
{#ifeq: tak | nie | podane argumenty są równe | podane argumenty są różne}
- Wynik
- 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:
- Treść przykładu (3)
{#ifeq: tak | Tak | podane argumenty są równe | podane argumenty są różne}
- Wynik
- podane argumenty są różne
Jednak tak jest różne od Tak, co, jak się przyjrzeć, może nie jest aż takie dziwne;).
ifexist
- Uwaga! Ciężka funkcja
- To jedna z ciężkich funkcji parsera. Powinno się jej unikać w szablonach, zwłaszcza takich, które mogą występować wielokrotnie na stronie.
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.
Przykłady
{#ifexist:Cosik|Cosik istnieje|Cosik nie istnieje}
– daje w wyniku „Cosik nie istnieje”, bo artykuł Cosik nie istnieje.{#ifexist:Łoś|Łoś istnieje|Łoś nie istnieje}
– daje w wyniku „Łoś istnieje”, bo artykuł Łoś istnieje.{#ifexist:Wikipedia:Funkcje parsera|dziękujemy za funkcje parsera ;)|mam pomysł na ciekawą funkcję}
– daje w wyniku „dziękujemy za funkcje parsera ;)”.
Wyjątki
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.
- Choć en:Moose istnieje, to:
{#ifexist::en:Moose|Moose istnieje?|Moose nie istnieje?}
- daje w wyniku „Moose nie istnieje?”, co nie jest prawdą.
switch
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
| = pusta wartość
| 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 będzie pusta, otrzymamy tekst weekend.
expr
Funkcja expr
wykonuje obliczenia matematyczne. Pełniejsza lista funkcji.
{#expr: wyrażenie}
Tabela używanych operatorów
Operator Operacja matematyczna Przykład + Dodawanie {#expr: 30 + 7}
= 37– Odejmowanie {#expr: 30 – 7}
= 23* Mnożenie {#expr: 30 * 7}
= 210/
divDzielenie {#expr: 30 / 7}
= 4.2857142857143round x Zaokrąglanie do x miejsc po przecinku (pomoc) {#expr: 30 / 7 round 3}
= 4.286mod Dzielenie modulo (reszta z dzielenia) {#expr: 30 mod 7}
= 2abs Wartość bezwzględna {#expr: abs(-3)}
= 3Operatory 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}
= 1and Logiczne i {#expr: 30 and 7}
= 1or Logiczne lub {#expr: 30 or 7}
= 1not logiczne nie {#expr: not 7}
= 0Specjalne () 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”.
- Pomoc dotycząca zaokrąglania liczb
Testowa liczba: 322.762 Funkcja Wynik Uwaga 322.762 round 2 322.76 Dodatni indeks sprawia, że zaokrąglenie odbywa się na prawo od separatora dziesiętnego. 322.762 round -2 300 Ujemny indeks sprawia, że zaokrąglenie odbywa się na lewo od separatora dziesiętnego. 322.762 round 2.3 322.76 Liczby po separatorze dziesiętnym w indeksie nie mają wpływu na wynik.
Praktyczny przykład
Aby obliczyć, ile stopni Celsjusza odpowiada 100 °F, można skorzystać ze wzoru (wyrażenia) podanego poniżej.
- Treść przykładu:
{#expr: (100 – 32) / 9 * 5 round 0}
- Wynik:
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łoby do pierwszego miejsca po przecinku).
ifexpr
ifexpr
(od if expression – ang. jeśli wyrażenie). Funkcja ifexpr ma w ogólności postać:
{#ifexpr: jeśli wyrażenie jest prawdziwe | wtedy tekst 1 | w przeciwnym wypadku tekst 2}
Jako wyrażenie można użyć porównania liczbowego:
- {#ifexpr: 7 > 3 | tak | nie } → tak
- {#ifexpr: 7 > 7 | tak | nie } → nie
- {#ifexpr: 7 >= 7 | tak | nie } → tak
- {#ifexpr: 7 = 7 | tak | nie } → tak
- {#ifexpr: {abc|7} = 7 | tak | nie } → tak
Działają również tzw. truthy oraz falsy expressions. Czyli w praktyce 1 jest traktowane jako prawda, 0 jako fałsz. Przykłady:
- {#ifexpr: 1 | tak | nie } → tak
- {#ifexpr: 0 | tak | nie } → nie
- {#ifexpr: 12-12 | tak | nie } → nie
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
time
zwraca czas w żądanym 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 (strona w języku angielskim). 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 08, VIII |
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
|
2025 |
y | Rok w formacie dwucyfrowym (dwie ostatnie cyfry roku) | od 00 do 99 (05 dla roku 2005)
|
25 |
n | Numer bieżącego miesiąca | od 1 do 12 (9 dla września)
|
2 |
m | Numer bieżącego miesiąca, dwucyfrowy | od 01 do 12 (09 dla września)
|
02 |
L | Sprawdza, czy rok jest przestępny | od 1 jeśli tak, 0 jeśli nie.
|
0 |
M | Skrótowa nazwa miesiąca | od sty do gru (lis dla listopada)
|
lut |
F | Pełna nazwa miesiąca | styczeń do grudzień
|
luty |
t | Liczba dni w miesiącu | od 28 do 31 (30 dla listopada)
|
28 |
j | Dzień miesiąca | od 1 do 31
|
7 |
d | Dzień miesiąca, liczba dwucyfrowa | od 01 do 31
|
07 |
z | Dzień roku (od liczby 0) | od 0 do 364 (365 w roku przestępnym – 1 dla 2 stycznia)
|
37 |
D | Skrótowa nazwa dnia tygodnia | od Pon do Nie
|
Pt |
l | Pełna nazwa dnia 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)
|
06 |
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
|
8 |
h | 12-godzinny format godziny, z poprzedzającym ew. zerem (dwie cyfry, używane z am/pm lub AM/PM). | od 01 do 12
|
08 |
G | 24-godzinny format godziny bez poprzedzającego ew. zera (jedna lub dwie cyfry). | od 0 do 23
|
8 |
H | 24-godzinny format godziny, z poprzedzającym ew. zerem (dwie cyfry). | od 00 do 23
|
08 |
i | Minuta, z poprzedzającym ew. zerem (dwie cyfry). | od 00 do 59
|
29 |
s | Sekunda, z poprzedzającym ew. zerem (dwie cyfry). | od 00 do 59
|
27 |
U | Sekundy, które upłynęły od 1 stycznia 1970 00:00:00 czasu GMT. | od 0 do nieskończoności
|
1738916967 |
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) | 2025-02-07T08:29:27+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, 07 Feb 2025 08:29:27 +0000 |
- Zobacz więcej: na stronach Mediawiki.
Nowy wiersz
W obrębie funkcji parsera należy użyć składni HTML dla nowego wiersza (<br />
).
Nowy akapit
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|}| Drugi akapit, wyświetlany jedynie, gdy zostanie podany argument {1}.}
Zobacz też
Uwagi
#ifexist jest kosztowną funkcją parsera, tzn. można tylko ograniczoną liczbę tych funkcji zamieścić na stronie. Jeżeli jest ich użytych za dużo, tekst 2 będzie wyświetlany, bez względu na to, czy artykuł istnieje czy nie, a strona będzie umieszczona w kategorii stron ze zbyt dużą liczbą wywołań kosztownych funkcji parsera.
Linki zewnętrzne
- mw:Help:Parser function (ang. • pol.) – oficjalny opis funkcji parsera z rozszerzenia.
- mw:Help:Magic_words#Parser_functions (ang.) – funkcje wbudowane w MW (też przyjmują parametry, ale używa się ich bez `#`).
- The discussion about the ParserFunctions in the Wikitech-l list archive (ang.)
- ParserFunctions trial (ang.)
- P. Resnick , Internet Message Format, RFC 2822, IETF, kwiecień 2001, DOI: 10.17487/RFC2822, ISSN 2070-1721, OCLC 943595667 (ang.).