Przejdź do zawartości

Pomoc:Funkcje parsera

Skrót: WP:FP, WP:If
Z Wikipedii, wolnej encyklopedii
Dla zaawansowanych

Funkcje parserarozszerzeniami 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

[edytuj | edytuj kod]

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 (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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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 (od if equalang. 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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]
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 existang. 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

[edytuj | edytuj kod]
{{#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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

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.

Funkcja expr wykonuje obliczenia matematyczne. Pełniejsza lista funkcji.

{{#expr: wyrażenie}}

Tabela używanych operatorów

[edytuj | edytuj kod]
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 (pomoc) {{#expr: 30 / 7 round 3}} = 4.286
mod Dzielenie modulo (reszta z dzielenia) {{#expr: 30 mod 7}} = 2
abs Wartość bezwzględna {{#expr: abs(-3)}} = 3
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”.

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

[edytuj | edytuj kod]

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

[edytuj | edytuj kod]

ifexpr (od if expressionang. 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 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 21, XXI
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) 11
m Numer bieżącego miesiąca, dwucyfrowy od 01 do 12 (09 dla września) 11
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) lis
F Pełna nazwa miesiąca styczeń do grudzień listopad
t Liczba dni w miesiącu od 28 do 31 (30 dla listopada) 30
j Dzień miesiąca od 1 do 31 28
d Dzień miesiąca, liczba dwucyfrowa od 01 do 31 28
z Dzień roku (od liczby 0) od 0 do 364 (365 w roku przestępnym – 1 dla 2 stycznia) 332
D Skrótowa nazwa dnia tygodnia od Pon do Nie Cz
l Pełna nazwa dnia tygodnia od Poniedziałek do Niedziela czwartek
w Numer dnia tygodnia (według amerykańskiego kalendarza). od 0 (Niedziela) do 6 (Sobota) 4
N Numer dnia tygodnia od 1 (Poniedziałek) do 7 (Niedziela) 4
W Numer tygodnia od 1 do 52 (lub 53 – zależy od roku) 48
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 pm
A Tak samo, jak a, ale dużymi literami AM / PM PM
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). od 0 do 23 21
H 24-godzinny format godziny, z poprzedzającym ew. zerem (dwie cyfry). od 00 do 23 21
i Minuta, z poprzedzającym ew. zerem (dwie cyfry). od 00 do 59 07
s Sekunda, z poprzedzającym ew. zerem (dwie cyfry). od 00 do 59 37
U Sekundy, które upłynęły od 1 stycznia 1970 00:00:00 czasu GMT. od 0 do nieskończoności 1732828057
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-11-28T21:07:37+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) Thu, 28 Nov 2024 21:07:37 +0000
Zobacz więcej: na stronach Mediawiki.

Nowy wiersz

[edytuj | edytuj kod]

W obrębie funkcji parsera należy użyć składni HTML dla nowego wiersza (<br />).

Nowy akapit

[edytuj | edytuj kod]

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ż

[edytuj | edytuj kod]

#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

[edytuj | edytuj kod]