Manual:Recursive conversion of wikitext/cs

Normálně se wikitext jako {{subst:a}} neuloží jako {{subst:a}}, pokud {{template:a}} existuje, protože subst: na své místo uloží kódování template:a.

S určitým kódováním se subst: automaticky nepřevede při prvním uložení. Editor může vytvořit wikitext, který se převede pouze při opětovném uložení nebo který se může převést při každém uložení.

Odložení substituce s Template:subst

Substituci lze odložit pro jednu operaci uložení pomocí Template:Subst obsahujícího "Subst"

Tato šablona může mít na různých wikinách různé názvy. Na Wikipedii se nazývá Template:Delay subst.
Použitá šablona Kódování šablony Vložit nebo napsat Uložit Výsledek
Template:subst {{subst: {{subst:subst}}a|b}} save page {{subst:a|b}}
  1. Soubor, který má být zpočátku uložen, obsahuje {{subst:subst}}a|b}}
  2. Při prvním uložení je {{subst:subst}} nahrazeno obsahem šablony subst, omezeno na zahrnutou část, tj. {{subst:.
  3. Po uložení má uložený soubor nyní hodnotu {{subst:a|b}}.
  4. Další uložení (s úpravami jinde na stránce nebo bez nich) má za následek normální nahrazení šablony "a".


Složitější příklady

V {{subst:substancia}}a|b}} nejsou explicitní závorky vyvážené - jsou tam dvě { a čtyři }.

Problém s nevyváženými závorkami spočívá v tom, že když je tento kód uzavřen v rozsahu uzavírající závorky {{subst: ... | ... | ... }}, analyzátor identifikuje parametry uzavírající závorky {{subst: za předpokladu, že to, co se nachází mezi svislými čarami (nebo uzavíracími závorkami), je normální text šablony a musí být vyvážený. Takže pokud je {{subst:subst}}a|b}} uvnitř další dvojice dvojitých závorek, poslední uzavírací závorky }} vnitřního kódu se berou jako uzavírací závorky vnější dvojice.

Viz příklad s:

Použitá šablona Kódování šablony Vložit nebo napsat Uložit Výsledek
Template:T1demo start-{{{1}}}-end {{subst:t1demo|{{subst:subst}}a|b}}|c}} save page start-{{subst:a-end|c}}
  1. Při ukládání souboru první proměnná subst:t1demo znamená, že místo uložení souboru tak, jak je, by měla být volána šablona T1demo s jakýmikoli parametry, které se zdají být jejími, a výsledek nahradí volající sekvenci. Šablona T1demo proto musí inicializovat svůj parametr:
  2. Formální analýza vidí vyváženou sekvenci {{subst:subst}}a mezi první a druhou svislou čárou: Tento řetězec je proto předáván jako parametr 1.
  3. Termín "b" se pak nachází mezi svislou linií a uzavíracími závorkami }}, a proto je identifikován jako parametr 2.
  4. Obsah šablony je poté vyhodnocen a nahrazen {{{1}}}} hodnotou identifikovanou jako parametr 1 – a šablona zjevně parametr 2 nepoužívá.

Kvůli těmto nevyváženým závorkám již sekvence {{subst:subst}}a|b}} nemůže fungovat, protože je disartikulovaná (oddělená) a narušená voláním šablony, která ji obklopuje.

Složené závorky lze vyvážit Template:)), která nahrazuje dvě uzavírací složené závorky.

Použitá šablona Kódování šablony Vložit nebo napsat Uložit Výsledek
Template:)) }} {{subst:subst}}a|b{{subst:))}} save page {{subst:a|b}}
Template:T1demo start-{{{1}}}-end {{subst:t1demo|{{subst:subst}}a|b}}|c{{subst:))}} save page start-{{subst:a-end|c}}

Tentokrát při ukládání souboru první proměnná subst:t1demo správně identifikuje uzavírací složené závorky, které odpovídají těm otevíracím. Vnitřní kód, který je identifikován jako parametry, však zní: {{subst:subst}}a|b{{subst:))}}|c a analyzátor nyní vidí dva parametry oddělené svislou čárou:

  1. {{subst:subst}}a
  2. b{{subst:))}}

Problém je nyní v tom, že úvodní složené závorky zamýšlené druhé proměnné subst: byly pro analyzátor skryty ve formálně vyvážené proměnné {{subst:subst}}. A uzavírací složené závorky byly také skryty ve formálně vyvážené proměnné {{))}}, takže analyzátor nevidí, že prostřední svislá čára má být uvnitř jedné z dvojic závorek ve vnitřním kódu, takže je brána jako oddělovač parametrů vnější šablony nebo funkce analyzátoru.

Abychom skryli tento symbol svislítka před první analýzou, potřebujeme nyní také magické slovo "!", což je ekvivalent {{subst:!}}:

Vložit nebo napsat Uložit Výsledek
{{subst:t1|{{subst:subst}}a{{subst:!}}b{{subst:))}}|c}} Save page start-{{subst:a|b}}-end
  1. Při prvním volání analyzátor správně identifikuje parametry t1 jako:
    {{subst:subst}}a{{subst:!}}b{{subst:))}}|c
  2. Tento blok parametrů se skládá ze dvou parametrů oddělených svislou čárou první úrovně:
    1. {{subst:subst}}a{{subst:!}}b{{subst:))}}
    2. c
  3. Nyní je nutné vyhodnotit hodnotu obou parametrů, což dává:
    1. {{subst:a|b}}
    2. c
  4. Hodnota těchto parametrů je nyní vložena do substitučního textu t1 start-{{{1}}}-end, což vede ke správnému výsledku.


Vytvoření rekurzivně samokonvertující stránky

Výsledná stránka může mít stejnou vlastnost jako vytvoření uložené stránky obsahující subst, pokud použijeme šablonu "a" speciálně navrženou pro tento účel.. Při použití na volající stránce by tato šablona mohla do výsledku vložit aktivní hodnotu subst:. Ale tato substituční volání (která se obvykle aktivují při ukládání stránky) by měla být neutralizována, dokud není samotná šablona někde zahrnuta: Nesmí být aktivována při ukládání samotné speciální šablony. Pro vytvoření statické šablony jsou možné dvě strategie:

  • <includeonly></includeonly> je vloženo před (nebo kolem) (nebo uvnitř) každé subst:, což brání analyzátoru v tom, aby ji vnímal jako platné (a aktivní) volání subst:,
  • nebo alternativně každé subst: je nahrazeno {{{|subst:}}}. Tento šikovný trik používá výchozí přiřazení hodnoty pro nedefinované parametry, obvykle vnímané jako {{{a|b}}}, což znamená při substituci se zde používá daná hodnota parametru a, ale pokud je a nedefinované, použijte jako výchozí hodnotu "b". Protože v tomto případě neexistuje název proměnné, bude nepojmenovaná proměnná vždy nedefinovaná a po zahrnutí šablony se vždy převede na svou výchozí hodnotu.

Základní forma je Template:tsubst obsahující "a{{{{{|subst:}}}subst}}tsubst|b{{{{{|subst:}}}))}}c<noinclude>{{doc|content=This template is used as an example at [[Manual:Recursive conversion of wikitext]][[Category:Demo templates]]}}</noinclude>", kde "b" představuje parametry, "a" výstup před voláním šablony a "c" výstup po volání šablony. To vše může záviset na parametrech. Tento obsah sám o sobě nemá aktivní hodnotu subst:, takže se při ukládání nezmění. Pokud se nyní v souboru uvnitř souboru {{subst:tsubst|..}} objeví proměnná template:tsubst, při prvním uložení souboru se proto provede proměnná vyšší úrovně {{subst:tsubst|..}}.

  1. Analyzátor nejprve vymezí parametry volajícího kódu, získá jejich textový výraz a určí hodnotu těchto parametrů.
  2. Protože obsah template:tsubst nemá platný název parametru, bude jeho obsah při substituci vždy přeložen identicky: Dva pseudoparametry {{{|subst:}}} budou nahrazeny jejich výchozí hodnotou subst:. Efektivní textový obsah proměnné tsubst po substituci parametrů bude tedy a{{subst:subst}}tsubst|b{{subst:rb}}c.
  3. Hodnota této počáteční sekvence se po vlastní substituci rozšíří a ve volajícím souboru bude nahrazena hodnotou a{{subst:tsubst|b}}c.

V důsledku toho je wikitext počínaje wikitextem {{subst:tsubst|..}} při ukládání volajícího souboru nahrazen textem a{{subst:tsubst|b}}c. Rekurzivně se při každém ukládání před složené závorky přidá "a", hodnoty parametrů se nahradí a za složené závorky se přidá "c".

Wikitexty "a", "b" a "c", které se objevují v tomto jednoduchém příkladu template:tsubst, jsou zástupnými symboly pro {{{{{|subst:}}}..}} při použití v propracovanějších šablonách. V takovém případě je vytvořený wikitext výsledkem rozšíření proměnné, funkce parseru nebo šablony, jak je uvedeno ve volané propracované šabloně, v okamžiku uložení volajícího souboru.

  • Nahrazení textu "b" tedy představuje situaci, kdy byl volající soubor naposledy uložen, posloupnost "a" udává historii každého následného uložení od nejstaršího po nejnovější a "c" historii od nejnovějšího po nejstarší. Jinými slovy, chronologické pořadí směřuje dovnitř, směrem k volání šablony. Historie roste zevnitř, z místa, kde je šablona rekurzivně aktivní.
  • Také ~{{{|~~}}} poskytuje podpis uživatele.
  • Obecněji řečeno, stránka může obsahovat více volání šablon, z nichž každé generuje více volání šablon.
  • Pokud je to žádoucí, lze nastavit tak, aby se šablona za určité podmínky (např. nahrazením prázdné stránky) přestala reprodukovat a zůstaly by pouze staré verze "a" a "c" a případně i výsledek poslední substituce mezi nimi.


Úprava vykresleného výstupu

Hodnotu <span style="display:none">..</span> lze použít ke skrytí volání šablony. Správné vnořování uvnitř nebo kolem dvojic dvojitých nebo trojitých závorek není nutné, během rozšiřování šablony jsou tyto značky považovány za prostý text. Např. úvodní tag může být v "b" a uzavírací tag v "c".

Pokud máme neprázdné "c", musí "c" začínat na "</span>", aby se skryly uzavírací závorky. Otevírací a zavírací tagy span musí být vyvážené, aby se zabránilo ovlivnění stylu voláním šablony a nebo jejím výstupem. To vyžaduje otevírací značku span v "c", která odpovídá dříve vložené uzavírací značce v "c". Může se nacházet buď bezprostředně za uzavírací značkou na začátku "c" (volitelně s určením stylu, který přepíše externí styl), nebo na konci "c" (externí styl platí i pro "c"). Pokud máme neprázdné "a", musí "a" pro skrytí úvodních závorek končit na "<span style="display:none">". Proto musí "a" začínat uzavíracím tagem span, aby odpovídal úvodnímu tage span v předchozím "a" (pro "a" se použije externí styl, pokud neobsahuje další pár tagů span). Nakonec, pro shodu s uzavíracím tagem span na začátku nejstaršího (levého) písmene "a" je potřeba otevírací tag span nalevo od něj, zatímco pro shodu s otevíracím tagem span v nejstarším (pravém) písmenu "c" je potřeba uzavírací tag span napravo od něj. Pokud je "a" prázdné, vloží se také tento úvodní tag span. Podobně, pokud je "c" prázdné, vloží se také tento uzavírací tag span.

Celé volání šablony, včetně "b", je tedy skryté, pokud uvnitř "b" nemáme "</span>" a "<span style="display:none">!. V takovém případě má část "b" mezi nimi externí styl, pokud neobsahuje další pár tagů span.

Fiktivní páry tagů span (buď bez nul mezi nimi, nebo bez specifikace stylu) by mohly být čas od času ručně vyčištěny.

Dokumentace

V případě automatické konverze wikitextu není původní wikitext automaticky zdokumentován. Souhrn úprav může být k tomu užitečný. Navíc v případě automatické konverze pouhým kliknutím na Editovat a Zveřejnit změny se wikitext, a to jak před konverzí, tak i po ní, nachází v historii úprav. Do shrnutí úprav by mohl být vložen kód, který by označoval "bez ručních změn wikitextu". Nedokumentovaný je tedy pouze původně zadaný wikitext, pokud není použit v souhrnu úprav (jehož kapacita může být příliš malá), nebo uložen v pre- nebo nowiki-tazích na samotné stránce nebo v dokumentaci stránky.


Jednoduchý příklad ze živého prostředí

Výše uvedené šablony ve tvaru Template:Tsubst obsahující "a{{{{{|subst:}}}subst}}tsubst|b{{{{{|subst:}}}))}}c<noinclude>{{doc|content=This template is used as an example at [[Manual:Recursive conversion of wikitext]][[Category:Demo templates]]}}</noinclude>" byly diskutovány, kde b představuje parametry, a výstup před voláním šablony a c výstup po volání šablony. To vše může záviset na parametrech. Jednoduchým příkladem je samotná šablona bez parametrů, kde "a", "b" a "c" jsou pouze tato explicitní písmena.

Počínaje wikitextem {{subst:tsubst|b}} se při každém ukládání přidává "a" před otevírací složené závorky a "c" za uzavírací složené závorky.

{{void~1= Příklad v reálném čase (automaticky se mění po každém stisknutí klávesy Zveřejnit změny):

a{{subst:tsubst|b}}c }}

Další příklady

Příklady:

Příklady šablon navržených pro použití s preprocesorem starším než 2008, které poskytovaly libovolný počet úrovní substituce:

  • m:Template:square root A – vypočítá Newtonovou metodou druhou odmocninu parametru 1, přičemž počáteční odhad je parametr 2, s kritériem absolutního zastavení chyby (ukončí se, když dva po sobě jdoucí odhady leží v parametru 3), ve dvou uloženích (nebo s parserovou funkcí v jednom uložení), s výpisem všech po sobě jdoucích odhadů a rozdílů mezi po sobě jdoucími odhady
  • m:Template:square root B stejné jako m:Template:square root A, až na to, že se vytiskne pouze konečný výsledek
  • m:Template:sqr – totéž, s pevným kritériem zastavení relativní chyby <1e-11 (na základě použití serveru s 12místnými výsledky). Dává jednu hodnotu, volání lze zadat do výrazu
  • m:Template:multiple substs – funkce subst generuje více substů na každé úrovni ve dvou uloženích (nebo, volána pomocí funkce parser, v jednom uložení)


Náhled

Upozorňujeme, že náhled před/bez provedení ručních změn wikitextu není stejný jako vykreslení aktuální stránky.

Související odkazy

Category:Parser manuals/cs
Category:Parser manuals/cs