Nápověda:Rozšíření:ParserFunctions

This page is a translated version of the page Help:Extension:ParserFunctions and the translation is 100% complete.

Rozšíření ParserFunctions poskytuje jedenáct dalších syntaktických funkcí pro doplnění "magických slov ", které jsou již na MediaWiki přítomna. (Může být nakonfigurován tak, aby poskytoval další funkce syntaktického analyzátoru pro zpracování řetězců. Tyto řetězcové funkce jsou zdokumentovány někde jinde .) Všechny funkce analyzátoru poskytované tímto rozšířením mají podobu:

{{#functionname: argument 1 | argument 2 | argument 3 ... }}
PD Poznámka: Editací této stránky souhlasíte s uvolněním svého příspěvku pod licencí CC0. Více informací se dočtete na stránce Public Domain Help Pages.
PD

#expr

Typ Operátory
Seskupení (závorky) ( )
Čísla 1234.5   e (2.718)   pi (3.142)
binární operátor e   unární (jednočlenný) +,-
Unární not ceil trunc floor abs exp ln sin cos tan acos asin atan
Binární ^
* / div mod
+ -
Smyčka round
Logická = != <> > < >= <=
and
or

Tato funkce vyhodnocuje matematický výraz a vrací vypočítanou hodnotu. Tato funkce je k dispozici také na stránce Scribunto prostřednictvím funkce mw.ext.ParserFunctions.expr.

{{#expr: výraz }}

Dostupné operátory jsou uvedeny vpravo, v pořadí podle priority. Viz Nápověda:Výpočet pro více informací o funkci každého operátora. Přesnost a formát vráceného výsledku se bude lišit v závislosti na operačním systému serveru, na kterém je spuštěna wiki, a na formátu čísla jazyka webu.

Při vyhodnocování pomocí booleovské algebry se nula vyhodnocuje jako false a jakákoli nenulová hodnota, kladná nebo záporná, se vyhodnocuje jako true:

{{#expr: 1 and -1 }}1
{{#expr: 1 and 0 }}0
{{#expr: 1 or -1 }}1
{{#expr: -1 or 0 }}1
{{#expr: 0 or 0 }}0

Prázdný vstupní výraz vrací prázdný řetězec. Neplatné výrazy vracejí jednu z několika chybových zpráv, které lze zachytit pomocí funkce #iferror:

{{#expr: }}
{{#expr: 1+ }}Expression error: Missing operand for +.
{{#expr: 1 = }}Expression error: Missing operand for =.
{{#expr: 1 foo 2 }}Expression error: Unrecognized word "foo".

Pořadí sčítání a odčítání operandů před nebo za číslem je smysluplné a lze s ním zacházet jako s kladnou nebo zápornou hodnotou namísto s operandem s chybným vstupem:

{{#expr: +1 }}1
{{#expr: -1 }}-1
{{#expr: + 1 }}1
{{#expr: - 1 }}-1

Pokud používáte výstup pomocí magických slov, musíte je nejprve naformátovat, abyste odstranili čárky a přeložili číslice. Například {{NUMBEROFUSERS}} má za následek 17 652 660, kde chceme 17652660, které lze získat pomocí {{formatnum :{{NUMBEROFUSERS}}|R}}. To je obzvláště důležité v některých jazycích, kde jsou překládány číslice. Například v bengálštině {{NUMBEROFUSERS}} produkuje ৩০,০৬১.

{{#expr:{{NUMBEROFUSERS}}+100}} Expression error: Unrecognized punctuation character " ".
{{#expr:{{formatnum:{{NUMBEROFUSERS}}|R}}+100}}17652760
  Varování: Operátor mod dává pro některé hodnoty druhého argumentu špatné výsledky:
{{#expr: 123 mod (2^64-1)}}Division by zero. (vytvoří prázdný řetězec; měl by být 123)
Pokud chcete provádět výpočty na základě dat (např. otestovat, zda je aktuální datum a čas po nějakém jiném datu a čase). Nejprve převeďte čas na počet sekund po 1. lednu 1970 pomocí {{#time: xNU }}, potom můžete jednoduše přidat a odečíst data jako čísla.

Zaokrouhlování

Rounds z čísla nalevo na násobek 1/10 zvýšené na mocninu, s exponentem rovným zkrácené hodnotě čísla uvedeného napravo.

Chcete-li zaokrouhlit nahoru nebo dolů, použijte unary ceil nebo floor resp.

Modelový případ Výsledek Metoda zaokrouhlování
{{#expr: 1/3 round 5 }} 0.33333 Poslední číslice je <5, takže nedochází ke zjevnému zaokrouhlování (0.333333… → 0.33333)
{{#expr: 1/6 round 5 }} 0.16667 Poslední číslice je ≥5, takže je zaokrouhlena nahoru (0.166666… → 0.16667)
{{#expr: 8.99999/9 round 5 }} 1 Výsledek se na poslední číslici opět zaokrouhlí nahoru, což má za následek další zaokrouhlování (0.999998… → 1.00000 → 1)
{{#expr: 1234.5678 round -2 }} 1200 Zaokrouhleno na nejbližší 100, protože záporné hodnoty se zaokrouhlí doleva od desetinné čárky
{{#expr: 1234.5678 round 2 }} 1234.57 Zaokrouhleno na nejbližší setinu, protože kladné hodnoty se zaokrouhlí vpravo od desetinné čárky
{{#expr: 1234.5678 round 2.3 }} 1234.57 Desetinná čísla v zaokrouhlovacím indexu nezmění výsledek zaokrouhlených
{{#expr: trunc 1234.5678 }} 1234 Desetinná část je zkrácena (odříznuta)
Zaokrouhlování na nejbližší celé číslo
{{#expr: 1/3 round 0 }} 0 Až na nejbližší celé číslo, které je nula
{{#expr: 1/2 round 0 }} 1 Až na nejbližší celé číslo, které je jedna
{{#expr: 3/4 round 0 }} 1 Až na nejbližší celé číslo, které je jedna
{{#expr: -1/3 round 0 }} -0 Až na nejbližší celé číslo, které je nula
{{#expr: -1/2 round 0 }} -1 Dolů na nejbližší celé číslo, které je záporné
{{#expr: -3/4 round 0 }} -1 Dolů na nejbližší celé číslo, které je záporné
Zaokrouhlování nahoru nebo dolů ceil nebo floor
{{#expr: ceil(1/3) }} 1 Až do dalšího většího celého čísla, které je jedna
{{#expr: floor(1/3) }} 0 Až na další menší číslo, které je nula
{{#expr: ceil(-1/3) }} -0 Až do dalšího většího čísla, které je nula
{{#expr: floor(-1/3) }} -1 Až na další menší celé číslo, které je záporné
{{#expr: ceil 1/3 }} 0.33333333333333 Není zaokrouhleno, protože 1 je již celé číslo
  Varování: Interpretováno jako (ceil 1)/3, ne ceil(1/3), jak byste mohli očekávat

Řetězce

Výrazy fungují pouze s číselnými hodnotami. Nemohou porovnávat řetězce nebo znaky. K tomu lze použít #ifeq.

{{#expr: "a" = "a" }}Expression error: Unrecognized punctuation character """.
{{#expr: a = a }}Expression error: Unrecognized word "a".
{{#ifeq: a | a | 1 | 0 }}1

#if

Tato funkce vyhodnocuje testovaný řetězec a určuje, zda je nebo není prázdný. Testovaný řetězec obsahující pouze mezeru je považován za prázdný.

{{#if: testovaný řetězec | hodnota, pokud testovaný řetězec není prázdný | hodnota, pokud je testovaný řetězec prázdný (nebo pouze mezera) }}
{{#if: první parametr | druhý parametr | třetí parametr }}

Tato funkce nejprve otestuje, zda první parametr není prázdný. Pokud není první parametr prázdný, funkce zobrazí druhý argument. Pokud je první parametr prázdný nebo obsahuje pouze prázdná místa (mezery, řádky atd.), zobrazí se třetí argument.

{{#if: | yes | no}}no
{{#if: string | yes | no}}yes
{{#if:      | yes | no}}no
{{#if:


| yes | no}}
no

Testovaný řetězec je vždy interpretován jako čistý text, takže matematické výrazy se nevyhodnocují (viz #ifexpr):

{{#if: 1==2 | yes | no }}yes
{{#if: 0 | yes | no }}yes

Poslední parametr (false) může být vynechán:

{{#if: foo | yes }} yes
{{#if: | yes }}
{{#if: foo | | no}}

Funkce může být vnořena. Chcete-li to provést, vnořte vnitřní funkci #if v její plné podobě namísto parametru uzavírací funkce #if. Je možné až sedm úrovní vnoření. Může to záviset na wiki nebo na omezení paměti.

{{#if: testovaný řetězec | hodnota, pokud testovaný řetězec není prázdný | {{#if: testovaný řetězec | hodnota, pokud testovaný řetězec není prázdný | hodnota, pokud je testovaný řetězec prázdný (nebo pouze mezera) }} }}

Parametr můžete také použít jako testovaný řetězec v příkazu #if. Musíte se ovšem ujistit, že za název proměnné přidáte | (symbol pipe, svislítko, svislá čára). (Pokud parametr nemá hodnotu, vyhodnotí se řetězec "{{{1}}}" jako prázdný.)

{{#if:{{{1|}}}|Zadali jste text v proměnné 1|Neexistuje žádný text v proměnné 1}}

Více na stránce Help:Parser functions in templates , kde jsou další příklady této funkce analyzátoru.

#ifeq

Tato syntaktická funkce porovnává dva vstupní řetězce. Určuje, zda jsou totožné a na základě výsledku vrací jeden ze dvou řetězců. Pokud je požadováno další srovnání a výstupní řetězce, zvažte použití přepínače #switch.

{{#ifeq: string 1 | string 2 | value if identical | value if different }}

Pokud mají oba řetězce platné číselné hodnoty, jsou řetězce porovnávány numericky:

{{#ifeq: 01 | 1 | equal | not equal}}equal
{{#ifeq: 0 | -0 | equal | not equal}}equal
{{#ifeq: 1e3 | 1000 | equal | not equal}}equal
{{#ifeq: {{#expr:10^3}} | 1000 | equal | not equal}}equal

Jinak je porovnání provedeno jako text. Toto srovnání rozlišuje velká a malá písmena:

{{#ifeq: foo | bar | equal | not equal}}not equal
{{#ifeq: foo | Foo | equal | not equal}}not equal
{{#ifeq: "01" | "1" | equal | not equal}}not equal  (porovnání s podobným příkladem výše, bez uvozovek)
{{#ifeq: 10^3 | 1000 | equal | not equal}}not equal  (ve srovnání s podobným příkladem výše, přičemž #expr vrací první platné číslo)

Jako praktický příklad zvažte existující šablonu Template:Timer. Pomocí parseru vyberte mezi dvěma standardními časy, krátkým a dlouhým. Parametr bere jako první vstup pro porovnání s "krátkým" řetězcem – neexistuje žádná konvence pro pořadí, ale je jednodušší jej přečíst, pokud je parametr na prvním místě. Kód šablony je definován jako:

{{#ifeq: {{{1|}}} | short | 20 | 40 }}

následující možný výsledek:

{{timer|short}}20
{{timer|20}}40
{{timer}}40
  Varování: #ifexpr nehlásí ekvivalentní numerická srovnání s analyzátory #ifeq a #switch. Tito dva jsou přesnější než #ifexpr a nevracejí ekvivalentní výsledky.

Zvažte tato srovnání se změnou poslední číslice:

{{#ifeq: 12345678901234567 | 12345678901234568 | equal | not equal}}not equal
{{#switch: 12345678901234567 | 12345678901234568 = equal | not equal}}not equal

Protože PHP použité v #ifeq a #switch porovnává dvě čísla typu integer, vrací očekávaný výsledek správně. Zatímco s #ifexpr a se stejnými čísly:

{{#ifexpr: 12345678901234567 = 12345678901234568 | equal | not equal}}equal

S jinou číslicí je výsledek rovnosti skutečně nesprávný.

Toto chování v #ifexpr je způsobeno tím, že MediaWiki převádí doslovná čísla ve výrazech na typ float, což u velkých celých čísel, jako jsou tato, zahrnuje zaokrouhlování.

  Varování: Při použití ve funkci analyzátoru musí být všechny značky analyzátoru a další funkce analyzátoru dočasně nahrazeny jedinečným kódem . To ovlivňuje srovnání:
{{#ifeq: <nowiki>foo</nowiki> | <nowiki>foo</nowiki> | equal | not equal}}not equal
{{#ifeq: <math>foo</math> | <math>foo</math> | equal | not equal}}not equal
{{#ifeq: {{#tag:math|foo}} | {{#tag:math|foo}} | equal | not equal}}not equal
{{#ifeq: [[foo]] | [[foo]] | equal | not equal}}equal
Pokud jsou porovnávané řetězce zadány jako stejná volání stejné šablony obsahující takové značky, pak je podmínka pravdivá, ale v případě dvou šablon s identickým obsahem obsahujících takové značky je nepravdivá.
  Varování: Srovnání literálu s magickými slovy názvu stránky může v závislosti na konfiguraci webu selhat. Například {{FULLPAGENAME}}, v závislosti na wiki, může kapitalizovat první písmeno a nahradí všechna podtržítka mezerami.

Chcete-li tento problém vyřešit, použijte kouzelné slovo na oba parametry:

{{#ifeq: {{FULLPAGENAME: L'Aquila}} | {{FULLPAGENAME}} | equal | not equal}}equal

#iferror

Tato funkce vezme vstupní řetězec a vrátí jeden ze dvou výsledků. Funkce se vyhodnotí na true, pokud vstupní řetězec obsahuje objekt HTML s chybou class="error", generovaný jinými funkcemi analyzátoru, jako jsou #expr, #time a #rel2abs, chyby šablon, jako jsou smyčky a rekurze a další chyby analyzátoru "failsoft".

{{#iferror: test string | value if error | value if correct }}

Jeden nebo oba zpětné řetězce lze vynechat. Pokud je řetězec correct (správný) vynechán, je vrácen testovací řetězec test string, pokud není chybný. Pokud je také vynechán řetězec error, vrací se při chybě prázdný řetězec:

{{#iferror: {{#expr: 1 + 2 }} | error | correct }}correct
{{#iferror: {{#expr: 1 + X }} | error | correct }}error
{{#iferror: {{#expr: 1 + 2 }} | error }}3
{{#iferror: {{#expr: 1 + X }} | error }}error
{{#iferror: {{#expr: 1 + 2 }} }}3
{{#iferror: {{#expr: 1 + X }} }}
{{#iferror: {{#expr: . }} | error | correct }}correct
{{#iferror: <strong class="error">a</strong> | error | correct }}error

#ifexpr

Tato funkce vyhodnocuje matematický výraz a vrací jeden ze dvou řetězců v závislosti na booleovské hodnotě výsledku:

{{#ifexpr: expression | value if true | value if false }}

Vstup expression (výraz) je vyhodnocen přesně jako u #expr výše, přičemž jsou k dispozici stejné operátory. Výstup je pak vyhodnocen jako booleovský výraz.

Prázdný vstupní výraz je vyhodnocen jako false:

{{#ifexpr: | yes | no}}no

Jak bylo uvedeno výše, nula se vyhodnotí jako false a jakákoli nenulová hodnota se vyhodnotí jako true, takže tato funkce je ekvivalentní funkci používající pouze #ifeq a #expr:

{{#ifeq: {{#expr: expression }} | 0 | value if false | value if true }}

s výjimkou prázdného nebo nesprávného vstupního výrazu (chybová zpráva je považována za prázdný řetězec; není rovno nule, takže dostaneme hodnotu value if true (hodnota je pravdivá)).

{{#ifexpr: = | yes | no }} Expression error: Unexpected = operator.

porovnání

{{#ifeq: {{#expr: = }} | 0 | no | yes }} yes

Je možné vynechat jednu nebo obě vrácené hodnoty. Žádný výstup není uveden, pokud je příslušná větev ponechána prázdná:

{{#ifexpr: 1 > 0 | yes }}yes
{{#ifexpr: 1 < 0 | yes }}
{{#ifexpr: 0 = 0 | yes }} yes
{{#ifexpr: 1 > 0 | | no}}
{{#ifexpr: 1 < 0 | | no}} no
{{#ifexpr: 1 > 0 }}

Boolean operators of equality or inequality operators are supported.

{{#ifexpr: 0 = 0 or 1 = 0 | yes}}yes
{{#ifexpr: 0 = 0 and 1 = 0 | | no}}no

#ifexist

Tato funkce vezme vstupní řetězec, interpretuje jej jako název stránky a vrací jednu ze dvou hodnot v závislosti na tom, zda stránka na místní wiki existuje.

{{#ifexist: page title | value if exists | value if doesn't exist }}

Funkce se vyhodnotí jako true, pokud stránka existuje, ať už obsahuje obsah, je jakoby prázdná (obsahuje metadata, jako jsou odkazy na kategorie nebo kouzelná slova , ale obsah je neviditelný), je prázdná nebo je přesměrovaná . Pouze stránky, které jsou znovu propojeny, se vyhodnotí jako false, včetně případů, kdy stránka dříve existovala, ale byla smazána.

{{#ifexist: Help:Extension:ParserFunctions/cs | exists | doesn't exist }}exists
{{#ifexist: XXHelp:Extension:ParserFunctions/csXX | exists | doesn't exist }}doesn't exist

Funkce se vyhodnotí jako true pro systémové zprávy , které byly přizpůsobeny, a pro speciální stránky , které jsou definovány softwarem.

{{#ifexist: Special:Watchlist | exists | doesn't exist }}exists
{{#ifexist: Special:CheckUser | exists | doesn't exist }}exists (protože na této wiki je nainstalováno rozšíření Checkuser )
{{#ifexist: MediaWiki:Copyright | exists | doesn't exist }}exists (protože hlášení Copyright bylo upraveno)

Pokud stránka kontroluje cíl pomocí #ifexist:, pak se tato stránka objeví v seznamu Special:WhatLinksHere pro cílovou stránku. Takže pokud byl kód {{#ifexist:Foo }} zahrnut aktuálně na této stránce (Help:Extension:ParserFunctions/cs), Special:WhatLinksHere/Foo zobrazí Help:Extension:ParserFunctions/cs.

Na wiki používajících sdílené úložiště médií lze #ifexist: použít ke kontrole, zda byl soubor nahrán do úložiště, ale nikoli do samotné wiki:

{{#ifexist: File:Example.png | exists | doesn't exist }}doesn't exist
{{#ifexist: Image:Example.png | exists | doesn't exist }}doesn't exist
{{#ifexist: Media:Example.png | exists | doesn't exist }}exists

Pokud byla pro soubor vytvořena stránka místního popisu, výsledkem je exists pro všechny výše uvedené.

#ifexist: nefunguje v odkazech na interwiki.

omezení pro ifexist

#ifexist: je považován za "cennou parserovou funkci". Na libovolnou stránku lze zahrnout pouze omezený počet funkcí (včetně funkcí uvnitř přenesených šablon). Pokud je tento limit překročen, všechny další funkce #ifexist: automaticky vrátí false, ať už cílová stránka existuje nebo ne a stránka je zavedena do kategorie Category:Pages with too many expensive parser function calls. Název sledované kategorie se může lišit v závislosti na jazyce obsahu vaší wiki.

Pro některé případy použití je možné emulovat (schopnost napodobovat jeden systém jiným) efekt ifexist s css pomocí selektorů a.new (pro výběr odkazů na neexistující stránky) nebo a:not(.new) (pro výběr odkazů na existující stránky). Navíc, protože počet cenných syntaktických funkcí, které lze použít na jedné stránce, je řízen $wgExpensiveParserFunctionLimit , lze také v případě potřeby zvýšit limit v LocalSettings.php.

ifexist a chybějící stránky

Stránka, která neexistuje a je testována na použití #ifexist, skončí na seznamu hledaných stránek. Více najdete na stránce úkol T14019 a v dokumentaci k šabloně w:Template:Linkless exists najdete jak to lze obejít.

#rel2abs

Tato funkce převede relativní cestu k souboru na absolutní cestu k souboru.

{{#rel2abs: path }}
{{#rel2abs: path | base path }}

V rámci vstupu path je platná následující syntaxe:

  • . → aktuální úroveň
  • .. → přejde o jednu úroveň výše
  • /foo → přejde o jednu úroveň dolů do podadresáře /foo

Pokud není zadán base path, bude místo toho použit celý název stránky:

{{#rel2abs: /quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ./quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ../quok | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../. | Help:Foo/bar/baz }}Help:Foo/bar

Neplatná syntaxe, například /. nebo /./, je ignorována. Protože nejsou povoleny více než dvě po sobě jdoucí tečky, lze k oddělení po sobě jdoucích příkazů použít tyto sekvence:

{{#rel2abs: ../quok/. | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../../quok | Help:Foo/bar/baz }}Help:Foo/quok
{{#rel2abs: ../../../quok | Help:Foo/bar/baz }}quok
{{#rel2abs: ../../../../quok | Help:Foo/bar/baz }}Error: Invalid depth in path: "Help:Foo/bar/baz/../../../../quok" (tried to access a node above the root node).

#switch

Související stránky: w:Help:Switch parser function

Tato funkce porovnává jednu vstupní hodnotu s několika testovacími případy a v případě nalezení shody vrací přidružený řetězec.

{{#switch: comparison string
 | case = result
 | case = result
 | ...
 | case = result
 | default result
}}

Příklady:

{{#switch: baz | foo = Foo | baz = Baz | Bar }} Baz
{{#switch: foo | foo = Foo | baz = Baz | Bar }} Foo
{{#switch: zzz | foo = Foo | baz = Baz | Bar }} Bar

#switch se značkami částečného převodu může ovlivnit konfigurační soubor, který umožňuje editoru, který není obeznámen s kódováním šablon, prohlížet a upravovat konfigurovatelné prvky.

Výchozí

default result (výchozí výsledek) je vrácen, pokud žádný řetězec case neodpovídá comparison string (srovnávacímu řetězci):

{{#switch: test | foo = Foo | baz = Baz | Bar }} Bar

V této syntaxi musí být výchozím výsledkem poslední parametr a nesmí obsahovat nezpracované znaménko rovná se (znaménko rovná se bez {{}}). Pokud ano, bude to považováno za srovnání velkých a malých písmen a pokud se žádné případy neshodují, nezobrazí se žádný text. Důvodem je, že výchozí hodnota nebyla definována (je prázdná). Pokud se však případ shoduje, bude vrácen přidružený řetězec.

{{#switch: test | Bar | foo = Foo | baz = Baz }} →
{{#switch: test | foo = Foo | baz = Baz | B=ar }} →
{{#switch: test | test = Foo | baz = Baz | B=ar }} → Foo

Alternativně může být výchozí výsledek explicitně deklarován řetězcem case z "#default".

{{#switch: comparison string
 | case = result
 | case = result
 | ...
 | case = result
 | #default = default result
}}

Výchozí výsledky deklarované tímto způsobem mohou být umístěny kdekoli v rámci funkce:

{{#switch: test | foo = Foo | #default = Bar | baz = Baz }} Bar

Pokud je parametr default vynechán a nedojde k žádné shodě, nevrací se žádný výsledek result:

{{#switch: test | foo = Foo | baz = Baz }}

Výsledky seskupení

Je možné nechat hodnoty 'propadnout', když několik řetězců case vrací stejný řetězec result. Tím minimalizujeme duplicitu.

{{#switch: comparison string
 | case1 = result1
 | case2 
 | case3 
 | case4 = result234
 | case5 = result5
 | case6 
 | case7 = result67
 | #default = default result
}}

Zde se všechny případy 2, 3 a 4 vrátí result234; případy 6 a 7 vrátí result67. "#default = " v posledním parametru může být ve výše uvedeném případě vynechán.

Použití s parametry

Funkce může být použita s parametry jako zkušební řetězec. V tomto případě není nutné umístit svislítko za název parametru, protože je velmi nepravděpodobné, že se rozhodnete nastavit případ jako řetězec "{{{parameter name}}}". (Toto je hodnota, kterou bude parametr přednastaven, pokud svislítko chybí a parametr neexistuje nebo nemá hodnotu. Podívejte se na stránku Help:Parser functions in templates .)

{{#switch: {{{1}}} | foo = Foo | baz = Baz | Bar }}

Ve výše uvedeném případě, pokud se {{{1}}} rovná foo, funkce vrátí Foo. Pokud se rovná baz, funkce vrátí Baz. Pokud je parametr prázdný nebo neexistuje, vrátí funkce Bar.

Stejně jako ve výše uvedené části lze případy kombinovat a získat jediný výsledek.

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | Bar }}

Pokud se {{{1}}} rovná foo, zoo nebo roo, funkce vrátí Foo. Pokud se rovná baz, funkce vrátí Baz. Pokud je parametr prázdný nebo neexistuje, vrátí funkce Bar.

Kromě toho lze výchozí výsledek vynechat, pokud si nepřejete nic vracet, pokud hodnota testovacího parametru neodpovídá žádnému z případů.

{{#switch: {{{1}}} | foo = Foo | bar = Bar }}

V tomto případě funkce vrací prázdný řetězec, pokud neexistuje {{{1}}} a je rovno foo nebo bar, v tomto případě vrací Foo, respektive Bar.

To má stejný účinek jako prohlášení výchozího výsledku za prázdný.

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | }}

Pokud se z nějakého důvodu rozhodnete nastavit případ jako "{{{parameter name}}}", funkce vrátí výsledek tohoto případu, pokud parametr neexistuje nebo nemá hodnotu. Parametr by musel existovat a mít jinou hodnotu než řetězec "{{{parameter name}}}", aby vrátil výchozí výsledek funkce.

(pokud {{{1}}} neexistuje nebo je prázdný):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo
(když {{{1}}} má hodnotu "test"):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Bar
(když {{{1}}} má hodnotu {{{1}}}):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo


V tomto hypotetickém případě budete muset do parametru přidat svislítko ({{{1|}}}).

Srovnávací chování

Stejně jako u #ifeq je porovnání provedeno číselně, pokud porovnávaný řetězec i řetězec případu jsou číselné nebo jako řetězec citlivý na velikost písmen jinak:

{{#switch: 0 + 1 | 1 = one | 2 = two | three}} → three
{{#switch: {{#expr: 0 + 1}} | 1 = one | 2 = two | three}} → one
{{#switch: a | a = A | b = B | C}} → A
{{#switch: A | a = A | b = B | C}} → C

Řetězec case může být prázdný:

{{#switch: | = Nothing | foo = Foo | Something }}Nothing

Jakmile je nalezena shoda, následující cases (případy) jsou ignorovány:

{{#switch: b | f = Foo | b = Bar | b = Baz | }}Bar
  Varování: Numerická srovnání s přepínačem #switch a #ifeq nejsou ekvivalentní srovnáním ve výrazech (viz také výše):
{{#switch: 12345678901234567 | 12345678901234568 = A | B}} → B
{{#ifexpr: 12345678901234567 = 12345678901234568 | A | B}} → A

Prosté znaky rovná se

Řetězce "Case" nemohou obsahovat prostá znaménka rovná se. Chcete-li tento problém vyřešit, vytvořte šablonu {{=}} obsahující jediné znaménko rovná se: = nebo nahraďte znak rovná se kódem html &#61;.

Příklad:

Napíšete Zobrazí se
{{#switch: 1=2
 | 1=2 = raw
 | 1<nowiki>=</nowiki>2 = nowiki
 | 1{{=}}2 = template
 | default
}}
template
{{#switch: 1=2
 | 1&#61;2 = html
 | default
}}
html
Pro jednoduchý příklad použití této funkce v reálném životě, se podívejte na Template:NBA color. Dva složitější příklady lze nalézt na Template:Extension a w:Template:BOTREQ.

Nahrazování #ifeq

#switch lze použít ke snížení hloubky rozšíření.

Například:

  • {{#switch:{{{1}}} |condition1=branch1 |condition2=branch2 |condition3=branch3 |branch4}}

je ekvivalentní

  • {{#ifeq:{{{1}}}|condition1 |branch1 |{{#ifeq:{{{1}}}|condition2 |branch2 |{{#ifeq:{{{1}}}|condition3 |branch3 |branch4}}}}}}

tj. hluboké založení, lineární:

{{#ifeq:{{{1}}}|condition1
  |<!--then-->branch1
  |<!--else-->{{#ifeq:{{{1}}}|condition2
                |<!--then-->branch2
                |<!--else-->{{#ifeq:{{{1}}}|condition3
                              |<!--then-->branch3
                              |<!--else-->branch4}}}}}}

Na druhou stranu by výměna přepínače mohla být komplikovaná, případně nepraktická pro IF vnořené do obou větví (zobrazeny s alternativami odsazení, odsazené na obou stranách), čímž by se vytvořil plný symetrický strom:

{{#ifeq:{{{1}}}|condition1
 |<!--then-->branch1t{{
  #ifeq:{{{1}}}|condition2
   |<!--then-->branch1t2t{{#ifeq:{{{1}}}|condition4|<!--then-->branch1t2t4t|<!--else-->branch1t2t4e}}
   |<!--else-->branch1t2e{{#ifeq:{{{1}}}|condition5|<!--then-->branch1t2e5t|<!--else-->branch1t2e5e}}
  }}
 |<!--else-->branch1e{{#ifeq:{{{1}}}|condition3
   |<!--then-->branch1e3t{{#ifeq:{{{1}}}|condition6|branch1e3t6t|branch1e3t6e}}
   |<!--else-->branch1e3e{{
    #ifeq:{{{1}}}|condition7
     |branch1e3e7t
     |branch1e3e7t
    }}
  }}
}}

#time

Tato syntaktická funkce bere datum a nebo čas (v gregoriánském kalendáři) a formátuje ho podle dané syntaxe. Lze určit objekt datum / čas. Výchozí hodnota je hodnota kouzelného slova {{CURRENTTIMESTAMP}}, tj. čas, kdy byla stránka naposledy vykreslena do HTML.

{{#time: format string }}
{{#time: format string | date/time object }}
{{#time: format string | date/time object | language code }}
{{#time: format string | date/time object | language code | local }}

Seznam přijatých formátovacích kódů je uveden v tabulce vpravo. Jakýkoli znak ve formátovacím řetězci, který není rozpoznán, je předán nezměněný. To platí také pro mezery (systém je pro interpretaci kódů nepotřebuje). Existují také dva způsoby, jak uniknout znakům uvnitř formátovacího řetězce:

  1. Zpětné lomítko následované znakem formátování je interpretováno jako jediný literálový znak.
  2. Znaky uzavřené ve dvojitých uvozovkách se považují za doslovné znaky a uvozovky se odstraní.

Kromě toho je spřežka xx interpretována jako jediné doslovné "x".

Vzhledem k tomu, že se seznam formátovacích kódů neustále vyvíjí (s podporou nových kalendářů nebo nových datových polí vypočítaných a formátovaných jinak), měli byste vyhýbatt všem doslovným znakům (nejen písmenům ASCII, která se aktuálně používají formátovacími kódy), které je třeba předat nezměněné.

Bohužel v současné době není ASCII jednoduchá uvozovka stále uznávána jako jednoduchá alternativa pro označení doslovného textu k aktuálně podporovaným dvojitým uvozovkám ASCII (například dvojité uvozovky jsou povinné pro jiná použití, jako je vymezení hodnot řetězců v JSON, C , C++...) a zpětná lomítka (která musí být escapována také v řetězcových konstantách používaných mnoha jazyky, včetně JSON, C, C++, PHP, JavaScript, Lua). Stále tedy nemůžete vložit žádné doslovné dvojité uvozovky, aniž byste je neuvedli zpětným lomítkem (nebo můžete místo toho použít jiné složené, hranaté nebo čtvercové uvozovky).

{{#time: Y-m-d }}2022-08-13
{{#time: [[Y]] m d }}2022 08 13
{{#time: [[Y (year)]] }}2022 (22UTCamSat, 13 Aug 2022 09:39:04 +0000)
{{#time: [[Y "(year)"]] }}2022 (year)
{{#time: i's" }}39'04"

Objekt date/time object může být v jakémkoli formátu akceptovaném funkcí strtotime() v PHP. Jsou přijímány jak absolutní (např. 20 December 2000), tak relativní (např. +20 hours) a kombinované časy (např. 30 July +1 year) časy.

{{#time: r|now}}Sat, 13 Aug 2022 09:39:05 +0000
{{#time: r|+2 hours}}Sat, 13 Aug 2022 11:39:05 +0000
{{#time: r|now + 2 hours}}Sat, 13 Aug 2022 11:39:05 +0000
{{#time: r|20 December 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|December 20, 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000-12-20}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000 December 20}}Error: Invalid time.

language code (kód jazyka) v ISO 639-3 (?) Umožňuje zobrazení řetězce ve vybraném jazyce

{{#time:d F Y|1988-02-28|nl}}28 februari 1988
{{#time:l|now|uk}}субота
{{#time:d xg Y|20 June 2010|pl}}20 czerwca 2010

Parametr local určuje, zda objekt datum/čas odkazuje na místní časové pásmo nebo UTC.

Toto je booleovský parametr: Jeho hodnota je určena přetypováním hodnoty argumentu (pro podrobnosti o tom, jak se řetězec přetypuje na booleovské hodnoty viz oficiální dokumentace PHP).

Upozorňujeme, že pokud je proměnná $wgLocaltimezone nastavena na UTC, není žádný rozdíl ve výstupu, když je local nastaven na true nebo false.

Podrobnosti viz následující příklady:

{{#time: Y F d H:i:s|now|it|0}}2022 agosto 13 09:39:05
{{#time: Y F d H:i:s|now|it|1}}2022 agosto 13 09:39:05
{{#time: Y F d H:i:s|+2 hours||0}}2022 srpen 13 11:39:05
{{#time: Y F d H:i:s|+2 hours||1}}2022 srpen 13 11:39:05
{{#time:c|2019-05-16T17:05:43+02:00|it}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|0}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|true}}2019-05-16T15:05:43+00:00

Pokud jste vypočítali časovou značku Unixu, můžete ji použít při výpočtech data tak, že předběžně čekáte na symbol @.

{{#time: U | now }}1660383545
{{#time: r | @1660383544 }}Sat, 13 Aug 2022 09:39:04 +0000
  Varování: Bez předpony @ před číselnými hodnotami časových razítek je výsledkem většinou chyba nebo je to neočekávaná hodnota:
{{#time: r | 1970-01-01 00:16:39 }}Thu, 01 Jan 1970 00:16:39 +0000
{{#time: U | 1970-01-01 00:16:39 }}999
{{#time: r | @999 }}Thu, 01 Jan 1970 00:16:39 +0000 (správný)
{{#time: r | 999 }}Error: Invalid time. (nepodporovaný formát roku)
{{#time: r | 1970-01-01 00:16:40 }}Thu, 01 Jan 1970 00:16:40 +0000
{{#time: U | 1970-01-01 00:16:40 }}1000
{{#time: r | @1000 }}Thu, 01 Jan 1970 00:16:40 +0000 (správný)
{{#time: r | 1000 }}Wed, 13 Aug 1000 00:00:00 +0000 (interpretováno jako rok s aktuálním měsícem a dnem v měsíci)
{{#time: r | 1970-01-01 02:46:39 }}Thu, 01 Jan 1970 02:46:39 +0000
{{#time: U | 1970-01-01 02:46:39 }}9999
{{#time: r | @9999 }}Thu, 01 Jan 1970 02:46:39 +0000 (správný)
{{#time: r | 9999 }}Fri, 13 Aug 9999 00:00:00 +0000 (interpretováno jako rok s aktuálním měsícem a dnem v měsíci)
{{#time: r | 1970-01-01 02:46:40 }}Thu, 01 Jan 1970 02:46:40 +0000
{{#time: U | 1970-01-01 02:46:40 }}10000
{{#time: r | @10000 }}Thu, 01 Jan 1970 02:46:40 +0000 (správný)
{{#time: r | 10000 }}Error: Invalid time. (nepodporovaný formát roku)
  Varování: Rozsah přijatelného vstupu je 1. ledna 0111 → 31. prosince 9999. Pro roky 100 až 110 je výstup nekonzistentní, Y a přestupné roky jsou jako roky 100-110, r, D, la U jsou jako interpretace těchto let jako 2000-2010.
{{#time: d F Y | 29 Feb 0100 }}01 březen 0100
(správný, žádný přestupný rok), ale
{{#time: r | 29 Feb 0100 }}Mon, 01 Mar 0100 00:00:00 +0000 (špatně, i když 100 je interpretováno jako 2000, protože to je přestupný rok)
{{#time: d F Y | 15 April 10000 }}Error: Invalid time.
{{#time: r | 10000-4-15 }}Sat, 15 Apr 2000 10:00:00 +0000

Čísla roků 0-99 jsou interpretována jako 2000-2069 a 1970-1999, s výjimkou případů, kdy jsou psána ve čtyřmístném formátu s úvodními nulami:

{{#time: d F Y | 1 Jan 6 }}01 leden 2006
{{#time: d F Y | 1 Jan 06 }}01 leden 2006
{{#time: d F Y | 1 Jan 006 }}01 leden 2006
{{#time: d F Y | 1 Jan 0006 }}01 leden 0006 (4-digit format)
Den v týdnu je dodáván pro roky 100-110 a od roku 1753, pro roky 111-1752 zobrazuje r-výstup "Unknown" (neznámý) a l-výstup "<>". V důsledku toho se r-výstup nepřijímá jako vstup pro tyto roky.

Lze zadat úplná nebo částečná absolutní data; funkce "vyplní" části data, které nejsou specifikovány pomocí aktuálních hodnot:

{{#time: Y | January 1 }}2022
  Varování: Funkce vyplňování není konzistentní. Některé části jsou vyplněny pomocí aktuálních hodnot, jiné nejsou:
{{#time: Y m d H:i:s | June }}2022 06 13 00:00:00 Vrací aktuální den, v aktuálním roce, v uvedeném měsíci.
{{#time: Y m d H:i:s | 2003 }}2003 08 13 00:00:00 Vrací aktuální den, a v uvedeném roce.

To však neplatí, je-li uvedeno obojí:

{{#time: Y m d H:i:s | June 2003 }}2003 06 01 00:00:00 Vrací první den uvedeného měsíce.

Čtyřciferné číslo se vždy interpretuje jako rok, nikdy ne jako hodiny a minuty: [1]

{{#time: Y m d H:i:s | 1959 }}1959 08 13 00:00:00

Šestimístné číslo je interpretováno jako hodiny, minuty a sekundy, pokud je to možné, ale jinak jako chyba (nikoli například rok a měsíc):

{{#time: Y m d H:i:s | 195909 }}2022 08 13 19:59:09 Vstup je považován za čas, pravděpodobněji než za rok + měsíc.
{{#time: Y m d H:i:s | 196009 }}Error: Invalid time. Ačkoli 19:60:09 není platný čas, 196009 není interpretován jako září 1960.

Funkce převádějící matematické znaky na data:

{{#time: d F Y | January 0 2008 }}31 prosinec 2007
{{#time: d F | January 32 }}Error: Invalid time.
{{#time: d F | February 29 2008 }}29 únor
{{#time: d F | February 29 2007 }}01 březen
{{#time:Y-F|now -1 months}}2022-červenec

Celková délka formátovacích řetězců #time je omezena na 6000 znaků [2].

Problém s časovými pásmy

Tato funkce syntaktického analyzátoru #time (konkrétně v PHP DateTime) obsahuje chybu, která neumožňuje předávání nečísel jako kompenzace relativního časového pásma. Tento problém se netýká při použití hodinového časového pásma, jako je EDT. Například:

  • {{#time:g:i A | -4 hours }} → 5:39 AM

Indie je však s časovým posunem +5,5 hodiny od UTC a proto použití jejího časového pásma obvykle neumožňuje správný výpočet relativního časového pásma. Co se stane:

  • {{#time:g:i A | +5.5 hours }} → 9:39 AM

Chcete-li tento problém vyřešit, jednoduše převeďte čas na minuty nebo sekundy, například:

  • {{#time:g:i A | +330 minutes }} → 3:09 PM
  • {{#time:g:i A | +19800 seconds }} → 3:09 PM

(Tim Starling, vývojář této funkce, poskytl přesnou syntaxi tohoto řešení.)

#timel

Tato funkce je identická s {{#time: ... }}, když parametr local je nastaven na true, takže vždy používá místní čas wiki (jak je nastaveno v $wgLocaltimezone ).

Syntaxe funkce je:

{{#timel: format string }}
{{#timel: format string | date/time object }}
{{#timel: format string | date/time object | language code }}
Upozorňujeme, že pokud je proměnná $wgLocaltimezone nastavena na UTC, není žádný rozdíl ve výstupu, když je local nastaveno na true nebo false
 
Příklad použití funkcí analyzátoru #time a #timel ze serveru, kde časové pásmo není UTC

Podívejte se například na následující příklady:

{{#time:c|now|it}}2022-08-13T09:39:05+00:00
{{#time:c|now|it|0}}2022-08-13T09:39:05+00:00
{{#time:c|now|it|1}}2022-08-13T09:39:05+00:00
{{#timel:c|now|it}}2022-08-13T09:39:05+00:00
 
Příklad upozornění od https://no.wikipedia.org/wiki/Maldiskusjon:Sommertid
  Varování: Uvědomte si, že U pro čas i timel vrátí stejný počet sekund od 1970-01-01 00:00:00 UTC na Wikipedii s odlišným časovým pásmem než UTC (dříve známý jako GMT)
U Unixový čas. Sekundy od 1. ledna 1970 00:00:00 GMT.
Z Posun časového pásma v sekundách.
{{#time: U}}1660383544
{{#timel: U}}1660383544
{{#time: Z}}0
{{#timel: Z}}0

#titleparts

Tato funkce rozdělí nadpis stránky na segmenty na základě lomítek a poté vrátí některé z těchto segmentů jako výstup.

{{#titleparts: jméno stránky | počet segmentů pro vrácení | první segment pro vrácení }}

Pokud není zadán parametr počet segmentů k návratu, je výchozí hodnota "0", která vrací všechny segmenty z prvního segmentu k návratu (včetně). Pokud není zadán parametr první segment k návratu nebo je "0", bude výchozí hodnota "1":

{{#titleparts: Talk:Foo/bar/baz/quok }}Talk:Foo/bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | 1 }}Talk:Foo See also {{ROOTPAGENAME }}.
{{#titleparts: Talk:Foo/bar/baz/quok | 2 }}Talk:Foo/bar
{{#titleparts: Talk:Foo/bar/baz/quok | 2 | 2 }}bar/baz
{{#titleparts: Talk:Foo/bar/baz/quok | | 2 }}bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | | 5 }}

Pro obě hodnoty jsou akceptovány záporné hodnoty. Záporné hodnoty pro parametr počet segmentů, které se mají vrátit ve skutečnosti 'odstraňují' segmenty z konce řetězce. Záporné hodnoty pro první segment, který se vrátí se překládá jako "začít s tímto segmentem počítáním zprava":

{{#titleparts: Talk:Foo/bar/baz/quok | -1 }}Talk:Foo/bar/baz Odřízne jeden segment od konce řetězce. Viz též {{BASEPAGENAME}}.
{{#titleparts: Talk:Foo/bar/baz/quok | -4 }} Odřízne všechny 4 segmenty od konce řetězce
{{#titleparts: Talk:Foo/bar/baz/quok | -5 }} Odřízne 5 segmentů od konce řetězce (více než existuje)
{{#titleparts: Talk:Foo/bar/baz/quok | | -1 }} quok Vrací poslední segment. Viz též {{SUBPAGENAME}}.
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | 2 }} bar/baz Odřízne jeden segment od konce řetězce a poté vrátí druhý segment a dále
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | -2 }} baz Začne kopírovat u druhého posledního prvku. Odřízne jeden segment od konce řetězce

Před zpracováním je parametr pagename (jméno stránky) dekódován HTML: Pokud obsahuje některé standardní entity HTML znaků, budou převedeny na prosté znaky (interně kódované pomocí UTF-8, tj. stejné kódování jako na zdrojové stránce MediaWiki pomocí této funkce analyzátoru).

Například jakýkoli výskyt &quot;, &#34; nebo &#x22; v pagename bude nahrazen ".
Nevykonává se žádné jiné konverze z HTML na prostý text, takže značky HTML zůstanou v tomto počátečním kroku neporušené, i když jsou v názvech stránek neplatné.
Je známo, že některá magická klíčová slova nebo funkce analyzátoru MediaWiki (například {{PAGENAME }} a podobné) vracejí řetězce, které jsou zbytečně kódovány HTML, i když jejich vlastní vstupní parametr nebyl kódován HTML:

Funkci syntaktického analyzátoru titulků lze poté použít jako zástupné řešení k převodu těchto vrácených řetězců tak, aby je bylo možné správně zpracovat pomocí některých dalších syntaktických funkcí, které také vezmou název stránky v parametru (například {{PAGESINCAT: }}, ale stále s HTML nefungují správně) - kódované vstupní řetězce.

Pokud je například aktuální stránka Kategorie:Côte-d'Or, pak:

  • {{#ifeq: {{FULLPAGENAME}} | Category:Côte-d'Or | 1 | 0 }} a {{#ifeq: {{FULLPAGENAME}} | Category:Côte-d&apos;Or | 1 | 0 }} vracejí 1 (skutečný); (funkce #ifeq analyzátoru provádí HTML dekódování vstupních parametrů).
  • {{#switch: {{FULLPAGENAME}} | Category:Côte-d'Or = 1 | #default = 0 }} a {{#switch: {{FULLPAGENAME}} | Category:Côte-d&apos;Or = 1 | #default = 0 }} vracejí 1; (funkce #switch analyzátoru provede HTML dekódování vstupních parametrů).
  • {{#ifexist: {{FULLPAGENAME}} | 1 | 0 }}, {{#ifexist: Category:Côte-d'Or | 1 | 0 }} nebo dokonce {{#ifexist: Category:Côte-d&apos;Or | 1 | 0 }}, vrátí všechny 1, pokud daná stránka kategorie existuje (funkce #ifexist analyzátoru provede HTML dekódování jejích vstupních parametrů);
  • {{PAGESINCAT: Côte-d'Or }} vrátí nenulové číslo, pokud tato kategorie obsahuje stránky nebo podkategorie, ale:
  • {{PAGESINCAT: {{CURRENTPAGENAME}} }}, může stále bezpodmínečně vrátit 0, stejně jako:
  • {{PAGESINCAT: {{PAGENAME|Category:Côte-d'Or}} }}
  • {{PAGESINCAT: {{PAGENAME|Category:Côte-d&apos;Or}} }}

Důvodem tohoto neočekávaného chování je, že u současných verzí MediaWiki existují dvě upozornění:

  • {{FULLPAGENAME}} nebo dokonce {{FULLPAGENAME|Côte-d'Or}} může vrátit řetězec skutečně zakódovaný HTML Category:Côte-d&apos;Or a ne očekávaný Category:Côte-d'Or a to:
  • {{PAGESINCAT: Côte-d&apos;Or }} bezpodmínečně vrací 0 (magické klíčové slovo PAGESINCAT neprovádí žádné dekódování vstupního parametru HTML).

Jednoduché řešení používající titulní grafy (které budou i nadále fungovat, pokud budou tato dvě upozornění opravena v novější verzi MediaWiki):

  • {{PAGESINCAT: {{#titleparts: {{CURRENTPAGENAME}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME|Category:Côte-d'Or}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME|Category:Côte-d&apos;Or}} }} }}, že všechny vrátí skutečný počet stránek ve stejné kategorii.

Poté je, pokud je to možné, dekódovaný název stránky kanonizovaný do standardního názvu stránky podporovaného MediaWiki:

  1. Všechna podtržítka jsou automaticky nahrazena mezerami:
    {{#titleparts: Talk:Foo/bah_boo|1|2}}bah boo Ne bah_boo, navzdory podtržítku v originálu.
  2. Řetězec je rozdělen maximálně 25krát. Další lomítka jsou ignorována a 25. prvek bude obsahovat zbytek řetězce. Řetězec je také omezen na 255 znaků, protože je považován za název stránky:
    {{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee | 1 | 25 }}y/z/aa/bb/cc/dd/ee
    Pokud jste z jakéhokoli důvodu potřebovali posunout tuto funkci na její limit, i když je velmi nepravděpodobné, je možné obejít 25 dělený limit volání vnořených funkcí:
    {{#titleparts: {{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee| 1 | 25 }} | 1 | 2}}z
  3. Nakonec se první dílčí řetězec kapitalizuje podle nastavení velkých písmen v místní wiki (pokud se tento dílčí řetězec také začíná názvem místního jmenného prostoru, je tento název jmenného prostoru také normalizován).
    {{#titleparts: talk:a/b/c }}Talk:A/b/c
  Varování: Můžete použít #titleparts jako malý "řetězcový analyzátor a převodník", ale zvažte, že vrací první podřetězec s velkým prvním písmenem:
{{#titleparts: one/two/three/four|1|1 }}One
{{#titleparts: one/two/three/four|1|2 }}two

Pokud je potřeba malá písmena, použijte k ovládání výstupu funkci lc:

{{lc: {{#titleparts: one/two/three/four|1|1 }} }}one

Chcete-li získat 'správnou' první kapitalizaci podřetězců (velká nebo malá písmena), můžete na začátek řetězce předepsat lomítko. Pro vrácení prvního segmentu použijte 2 místo 1:

{{#titleparts: /one/two/three/four|1|2 }}one
{{#titleparts: /One/two/three/four|1|2 }}One
  Varování: Některé znaky, které jsou v názvu stránky nezákonné, způsobí, že #titleparts nebude řetězec analyzovat:
{{#titleparts: {one/two} | 1 | 1 }}{one/two}. Nevytváří očekávané: {one
{{#titleparts: [[page]]/123 | 1 | 2 }}page/123. Nefunguje, protože závorky jsou v názvech stránek nezákonné a tato funkce analyzátoru nezpracovává odkazy vložené do jeho vstupního parametru pagename, i když používají syntaxi MediaWiki nebo jakékoli jiné značky HTML nebo MediaWiki.
{{#titleparts: red/#00FF00/blue | 1 | 3 }} → "". Nefunguje, protože „#“ je také v nadpisech stránek nezákonné.
  Varování: Pokud je některá část názvu pouze "." nebo "..", #titleparts nebude řetězec analyzovat:
{{#titleparts: one/./three | 1 | 1 }}one/./three. Celý řetězec je vrácen. Neprodukuje očekávané: one
  Varování: Tato funkce se elegantně nerozkládá, pokud vstup přesáhne 255 bajtů v UTF-8. Pokud je vstupní řetězec 256 bajtů nebo více, je vrácen celý řetězec.

Řetězcové funkce

Všechny tyto funkce (len, pos, rpos, sub, replace, explode) jsou integrované z rozšíření StringFunctions, ale jsou k dispozici, pouze pokud správce nastaví $wgPFEnableStringFunctions = true; na LocalSettings.php.

Všechny tyto funkce fungují v čase O(n), což je činí bezpečnými proti útokům DoS.

  1. Některé parametry těchto funkcí jsou, aby se zabránilo zneužití, omezeny globálním nastavením. Viz část Limity dále.
  2. Pro funkce, které rozlišují velká a malá písmena, můžete v některých případech použít jako řešení magické slovo {{lc:string}}.
  3. Chcete-li zjistit, zda server MediaWiki tyto funkce povoluje, zkontrolujte seznam podporovaných funkcí rozšířeného analyzátoru v Special:Version.
  4. Délka řetězce je omezena proměnnou $wgPFStringLengthLimit, výchozí je 1000.

#len

Funkce parseru #len byla od verze 1.2.0 sloučena z rozšířením StringFunctions .

Funkce #len vrací délku daného řetězce. Syntaxe je:

{{#len:string}}

Návratová hodnota je vždy počet znaků ve zdrojovém řetězci (po rozšíření vyvolání šablony, ale před převodem na HTML). Pokud není zadán žádný řetězec, je návratová hodnota nula.

  • Tato funkce je bezpečná u vícebajtových znaků UTF-8. Příklad:
    • {{#len:Žmržlina}}8
  • Úvodní a koncové mezery nebo nové řádky se nezapočítávají, ale meziprostory a nové řádky se berou v úvahu. Příklady:
    • {{#len:Icecream }}8
    • {{#len: a   b }}5 - 3 mezery mezi 2 znaky
  • Znaky uváděné odkazem nejsou převedeny, ale počítány podle jejich zdrojové formy.
    • {{#len:&nbsp;}}6 - odkazy na pojmenované znaky
    • {{#len:&#32;}}5 - odkazy na číselné znaky, neignorované, přestože zde označují mezeru.
  • Značky, jako je ‎<nowiki> a jiná rozšíření značek, budou mít vždy nulovou délku, protože jejich obsah je před analyzátorem skrytý. Příklad:
    • {{#len:<nowiki>This is a </nowiki>test}}4

#pos

Funkce parseru #pos byla sloučena z rozšíření StringFunctions od verze 1.2.0.

Funkce #pos vrací pozici daného vyhledávaného dotazu v řetězci. Syntaxe je:

{{#pos:string|hledaný výraz|offset}}

Parametr offset, pokud je zadán, říká počáteční pozici, kde by se tato funkce měla začít hledat.

Pokud je hledaný výraz nalezen, je návratovou hodnotou celé číslo první pozice v řetězci.

Pokud není hledaný výraz nalezen, vrátí funkce prázdný řetězec.

  • Tato funkce rozlišuje velká a malá písmena.
  • Maximální povolená délka vyhledávacího dotazu je omezena globálním nastavením $wgStringFunctionsLimitSearch.
  • Tato funkce je bezpečná u vícebajtových znaků UTF-8. Příklad: {{#pos:Žmržlina|žlina}} vrací 3.
  • Stejně jako u #len, ‎<nowiki> a dalších rozšíření značek se pro účely určení délky považuje za délku 1. Příklad: {{#pos:<nowiki>This is a </nowiki>test|test}} vrací 1.

#rpos

Funkce parser #rpos byla sloučena z rozšíření StringFunctions od verze 1.2.0.

Funkce #rpos vrací poslední pozici daného vyhledávaného dotazu v řetězci. Syntaxe je:

 {{#rpos:string|hledaný výraz}}

Pokud je nalezen hledaný výraz, je návratová hodnota celé číslo jeho nulové pozice v řetězci.

Pokud není hledaný výraz nalezen, vrátí funkce -1.

Použijete-li toto k hledání posledního oddělovače, přidejte +1 do výsledku a načtěte pozici za posledním oddělovačem. Toto funguje také, když není oddělovač nalezen, protože "-1 + 1" je nula, což je začátek dané hodnoty.
  • Tato funkce rozlišuje velká a malá písmena.
  • Maximální povolená délka vyhledávacího dotazu je omezena globálním nastavením $wgStringFunctionsLimitSearch.
  • Tato funkce je bezpečná u vícebajtových znaků UTF-8. Příklad: {{#rpos:Žmržlina|lina}} vrací 4.
  • Stejně jako u #len, ‎<nowiki> a dalších rozšíření značek jsou pro účely pozice znaku považovány za mající délku 1. Příklad: {{#rpos:<nowiki>This is a </nowiki>test|test}} vrací 1.

#sub

Funkce parser #sub byla sloučena z rozšíření StringFunctions od verze 1.2.0.

Funkce #sub vrací podřetězec z daného řetězce. Syntaxe je:

{{#sub:string|start|length}}

Parametr start, pokud je kladný (nebo nula), určuje index prvního znaku, který má být vrácen, založený na nule.

Příklad: {{#sub:Icecream|3}} vrací cream.

{{#sub:Icecream|0|3}} vrací Ice.

Pokud je parametr start záporný, určuje, kolik znaků od konce by mělo být vráceno.

Příklad: {{#sub:Icecream|-3}} vrací eam.

Parametr length, pokud je přítomen a je kladný, určuje maximální délku vráceného řetězce.

Příklad: {{#sub:Icecream|3|3}} vrací cre.

Pokud je parametr length záporný, určuje, kolik znaků bude vynecháno od konce řetězce.

Příklad: {{#sub:Icecream|3|-3}} vrací cr.

Pokud je parametr start záporný, určuje, kolik znaků od konce by mělo být vráceno. Parametr length, pokud je přítomen a je kladný, určuje maximální délku vráceného řetězce od počátečního bodu.

Příklad: {{#sub:Icecream|-3|2}} vrací ea.

  • Pokud je parametr length nulový, nepoužívá se pro zkrácení vůbec.
    • Příklad: {{#sub:Icecream|3|0}} vrací cream. {{#sub:Icecream|0|3}} vrací Ice.
  • Pokud start označuje pozici za zkrácením od konce negativním parametrem length, bude vrácen prázdný řetězec.
    • Příklad: {{#sub:Icecream|3|-6}} vrací prázdný řetězec.
  • Tato funkce je bezpečná u vícebajtových znaků UTF-8. Příklad: {{#sub:Žmržlina|3}} vrací žlina.
  • Stejně jako u #len, ‎<nowiki> a dalších rozšíření značek se pro účely určení délky považuje za délku 1. Příklad: {{#sub:<nowiki>This is a </nowiki>test|1}} vrací test.

#count

Funkce analyzátoru #count byla přidána k rozšíření StringFunctions od verze 1.2.0.

Funkce #count vrací, kolikrát se daný podřetězec objevil v zadaném textu.

{{#count:string|substring}}

#replace

Funkce parser #replace byla sloučena z rozšíření StringFunctions od verze 1.2.0.

Funkce #replace vrátí daný řetězec se všemi výskyty hledaného výrazu nahrazeného nahrazujícím výrazem.

{{#replace:string|search term|replacement term}}

Pokud je search term nespecifikovaný nebo prázdný, bude prohledán jediný prostor.

Pokud je replacement term nespecifikovaný nebo prázdný, budou všechny výskyty search term z řetězce odstraněny.

  • Tato funkce rozlišuje velká a malá písmena.
  • Maximální povolená délka search term je omezena globálním nastavením $wgStringFunctionsLimitSearch.
  • Maximální povolená délka replacement term je omezena globálním nastavením $wgStringFunctionsLimitReplace.
  • I když je replacement term mezera, použije se prázdný řetězec. Toto je vedlejší efekt parseru MediaWiki. Chcete-li použít mezeru jako replacement term, vložte ji do značek nowiki.
    • Příklad: {{#replace:My_little_home_page|_|<nowiki> </nowiki>}} vrací My little home page.
    • Pokud to nefunguje, zkuste {{#replace:My_little_home_page|_|<nowiki/> <nowiki/>}} se dvěma samouzavíracími značkami.
    • Všimněte si, že toto je jediné přijatelné použití nowiki v náhradním způsobu, protože jinak by nowiki mohl být použit k obejití $wgStringFunctionsLimitReplace, vložením libovolně velkého počtu znaků do výstupu. Z tohoto důvodu jsou všechny výskyty ‎<nowiki> nebo jakékoli jiné značky rozšířené v náhradním výrazu nahrazeny mezerami.
  • Tato funkce je bezpečná u vícebajtových znaků UTF-8. Příklad: {{#replace:Žmržlina|ž|z}} vrací Žmrzlina.
  • Pokud je třeba nahradit více položek v jednom textovém řetězci, můžete zvážit i použití Extension:ReplaceSet . Přidá funkci syntaktického analyzátoru pro posloupnost nahrazení.
Nahrazení velkých a malých písmen

V současné době syntaxe neposkytuje přepínač pro přepínání nastavení rozlišování velkých a malých písmen. Jako řešení však můžete použít magická slova určená k formátování. (např. {{lc:your_string_here}}) Pokud například chcete z řetězce odstranit slovo "Category:" bez ohledu na velikost písmen, můžete zadat:

{{#replace:{{lc:{{{1}}}}}|category:|}}

Nevýhodou je však to, že výstup bude malými písmeny. Pokud chcete zachovat velikost písmen i po výměně, musíte k dosažení použít více úrovní vnoření (tj. více nahrazujících volání).

#explode

Funkce parser #explode byla sloučena z rozšíření StringFunctions od verze 1.2.0.

Funkce #explode rozdělí daný řetězec na části a poté vrátí jednu z částí. Syntaxe je:

{{#explode:string|delimiter|position|limit}}

Parametr delimiter určuje řetězec, který se použije k rozdělení string na části. Tento řetězec delimiter pak není součástí žádné části a když jsou dva řetězce delimiter vedle sebe, vytvoří mezi nimi prázdnou část. Pokud není tento parametr zadán, použije se jedna mezera. Parametr limit je k dispozici pouze v ParserFunctions, nikoli v samostatné verzi StringFunctions. Umožňuje omezit počet vrácených částí. Přičemž veškerý zbývající text bude zahrnut ve výsledné části.

Parametr position určuje, která část má být vrácena. Části se počítají od 0. Pokud není tento parametr zadán, použije se první část (s číslem 0). Když je jako position použita záporná hodnota, části se počítají od konce. V tomto případě číslo dílu -1 znamená poslední část. Příklady:

  • {{#explode:And if you tolerate this| |2}} vrací you
  • {{#explode:String/Functions/Code|/|-1}} vrací Code
  • {{#explode:Split%By%Percentage%Signs|%|2}} vrací Percentage
  • {{#explode:And if you tolerate this thing| |2|3}} vrací you tolerate this thing

Vrácená hodnota je "pozice" -té části. Pokud je méně částí, než určuje pozice, je vrácen prázdný řetězec.

  • Tato funkce rozlišuje velká a malá písmena.
  • Maximální povolená délka oddělovače je omezena globálním nastavením $wgStringFunctionsLimitSearch.
  • Tato funkce je bezpečná u vícebajtových znaků UTF-8. Příklad: {{#explode:Žmržlina|ž|1}} vrátí lina.

#urldecode

#urldecode převádí únikové znaky z řetězce ' URL kódováno' zpět na čitelný text. Syntaxe je:

{{#urldecode:hodnota}}

Poznámky:

  • Tato funkce funguje přímým odhalením funkce PHP urldecode().
  • Odkaz na znakový kód lze najít na www.w3schools.com.
  • Opak, urlencode, byl integrován do MediaWiki od verze 1.18; příklady viz Nápověda:Magická slova .
  • urldecode byl sloučen ze Stringfunctions v roce 2010 přidělením 1b75afd18d3695bdb6ffbfccd0e4aec064785363

Limity

Tento modul definuje tři globální nastavení:

Používají se k omezení některých parametrů některých funkcí, aby se zajistilo, že funkce budou fungovat v O(n) časové složitosti, a jsou proto bezpečné proti útokům DoS.

$wgStringFunctionsLimitSearch

Toto nastavení používají #pos, #rpos, #replace a #explode. Všechny tyto funkce hledají podřetězec ve větším řetězci, zatímco fungují, což může běžet v O(n*m), a proto činí software zranitelnějším vůči útokům DoS. Nastavením této hodnoty na určité malé číslo se časová složitost na O(n) sníží.

Toto nastavení omezuje maximální povolenou délku hledaného řetězce.

Výchozí hodnota je 30 vícebajtových znaků.

$wgStringFunctionsLimitReplace

Toto nastavení používá #replace. Tato funkce nahrazuje všechny výskyty jednoho řetězce jiným řetězcem, který lze použít k rychlému generování velkého množství dat, a proto činí software zranitelnějším vůči útokům DoS. Toto nastavení omezuje maximální povolenou délku nahrazujícího řetězce.

Výchozí hodnota je 30 vícebajtových znaků.

Obecné problémy

Náhrady

Funkce syntaktického analyzátoru mohou být nahrazeny předponou hash (#) znaku subst::

{{subst:#ifexist: Help:Extension:ParserFunctions/cs | [[Help:Extension:ParserFunctions/cs]] | Help:Extension:ParserFunctions/cs }} → kód [[Help:Extension:ParserFunctions/cs]] bude vložen do wikitextu, protože stránka Help:Extension:ParserFunctions/cs existuje.
  Varování: Výsledky nahrazovaných funkcí syntaktického analyzátoru nejsou definovány, pokud výrazy obsahují nenahrazovatelný nestálý kód, jako jsou proměnné nebo jiné funkce syntaktického analyzátoru. Pro konzistentní výsledky musí být nahrazen veškerý nestálý (volatilní) kód ve vyhodnocovaném výrazu. Viz Nápověda:Záměna.

Náhrada nefunguje v rámci ‎<ref>‎</ref> . Pro tento účel můžete použít {{subst:#tag:ref|}}.

Přesměrování

Zejména {{#time:…|now-…}} by se mohl hodit v přesměrování na stránky obsahující data, ale to nefunguje.

Únikové znaky svislítka v tabulkách

Funkce analyzátoru změní syntaxi wikitable a znaky svislé čáry (|), přičemž všechny nezpracované znaky svislé čáry budou považovat za oddělovače parametrů. Aby se tomu předešlo, většina wiki používala šablonu Template:! s obsahem pouze nezpracovaného znaku svislítka (|), protože MW 1.24 jej nahradila skupinou znaků {{!}} word . Tím se "skryje" svislítko (roura, trubka, svislá čára) před analyzátorem MediaWiki, což zajistí, že se nepoužije, dokud nebudou rozbaleny všechny šablony a proměnné na stránce. Poté bude interpretováno jako řádek tabulky nebo oddělovač sloupců. Alternativně lze použít základní tabulku HTML. I když je to méně intuitivní a více náchylnější k chybám.

Znaku svislé čáry se můžete také, pro zobrazení základního, neinterpretovaného znaku, vyhnout pomocí entity HTML: &#124;.

Popis Napíšete Zobrazí se
Znak svislítka jako oddělovač řádků nebo sloupců tabulky
{{!}}
|
Svislítko jako prostý znak
&#124;
|


Odstraňování mezer

Bílé znaky (mezery), včetně nových řádků, tabulátorů a mezer, jsou odstraněny ze začátku a konce všech parametrů těchto funkcí analyzátoru. Pokud to není žádoucí, lze řetězce porovnávat po uvedení do uvozovek.

{{#ifeq: foo           |           foo | equal | not equal }}equal
{{#ifeq: "foo          " | "          foo" | equal | not equal }}not equal

Chcete-li zabránit oříznutí předcházejících a následujících částí, podívejte se na m:Template:If. Někteří lidé to dosahují pomocí zápisu <nowiki > </nowiki> místo mezer.

foo{{#if:|| bar }}foofoobarfoo
foo{{#if:||<nowiki /> bar <nowiki />}}foofoo bar foo

Tuto metodu však lze použít k vykreslení pouze jednoho znaku mezery, protože syntaktický analyzátor potlačuje více znaků mezery v jednom řádku do jednoho znaku.

<span style="white-space: pre;">foo{{#if:||<nowiki/>      bar      <nowiki/>}}foo</span>
foo bar foo

V tomto příkladu se styl white-space: pre používá k vynucení bílého prostoru, který má být prohlížečem zachován. Ale ani s ním nejsou mezery zobrazeny. K tomu dochází proto, protože mezery jsou před odesláním do prohlížeče odstraněny softwarem.

Toto chování je možné vyřešit nahrazením mezer znaky &#32; (breakable space(rozbitný prostor)) nebo znaky &nbsp; (non-breakable space(nerozbitný prostor)), protože nejsou měněny softwarem:

<span style="white-space: pre;">foo{{#if:||&#32;&#32;&#32;bar&#32;&#32;&#32;}}foo</span>foo bar foo
foo{{#if:||&nbsp;&nbsp;&nbsp;bar&nbsp;&nbsp;&nbsp;}}foofoo   bar   foo

Beware that not all parameters are created equal. In ParserFunctions, whitespace at the beginning and end is always stripped. In templates, whitespace at the beginning and end is stripped for named parameters and named unnamed parameters but not from unnamed parameters:

foo{{1x|content= bar}}foofoobarfoo
foo{{1x|1= bar}}foofoobarfoo
foo{{1x| bar }}foofoo bar foo

Související stránky

Odkazy

  1. Před rokem 2011 tomu tak nebylo, jak dokládá r86805.
  2. ParserFunctions.php na phabricator.wikimedia.org