Skriptování Na stránku můžeme vložit výstup skriptů. 50

Na stránkách můžeme používat skripty. Spouští se při generování a jejich standardní výstup se vloží do stránky. Třeba doprostřed textu ostavce nebo do jiného elementu.

Příklad: Tyto stránky byly vygenerované v systému uname -o.

Díky skriptování můžeme stránky obohatit o prakticky libovolný obsah – jak prostý text, tak i XHTML fragmenty. Zapíná se pomocí atributu výstup="xhtml" a generátor pak kontroluje správné formátování – nestane se vám, že byste omylem vygenerovali stránky s překříženými nebo neuzavřenými značkami. Výchozím jmenným prostorem je XHTML a je dostupný i jmenný prostor pro makra (m).

Skriptování ale může být nebezpečné, pokud byste spustili generátor na stránkách, které psal někdo nedůvěryhodný a vložil do nich škodlivý kód. Kromě toho, ukázková sada stránek by měla být přeložitelná kdekoli a mít minimum závislostí (ne každý musí mít nainstalovaný Perl nebo Python či další podporované interprety). Proto je skriptování ve výchozím stavu vypnuté – je potřeba ho povolit v souboru web.conf.

Podporované jazyky

V současnosti jsou podporované tyto jazyky:

) { if (/podporovanýJazyk\.put\("(\w+)",\s*"(.*)"\);/) { print "\n"; } } ]]>
Jazyk Interpret
$1$2

Perl – ukázka

Jazyky použité nebo citované na této stránce:

) {
	if (/m:skript\s+jazyk="(\w+)"/) {
		$skripty{$1}++;
	}
}

for(keys(%skripty)) {
	print "$skripty{$_}×\t $_\n";
}
			]]>

BASH – ukázka

Proměnné prostředí

Ve skriptech máme dostupné následující proměnné prostředí:

Proměnná Význam

Kód:

echo "URI: $XWG_STRANKA_URI"; echo "Soubor: $XWG_STRANKA_SOUBOR"; echo "Nadpis: $XWG_STRANKA_NADPIS"; echo "Perex: $XWG_STRANKA_PEREX"; ]]>

nám vypíše:

Makra ze skriptů

XML generované skriptem může také obsahovat makra, která se následně interptetují. '; # Ty zrůdo! :-) echo 'echo "Takže můžeš skriptovat, když skriptuješ,";'; echo ''; ]]> nebo dělat něco užitečnějšího.

\n"; print " node [shape=\"box\"];\n"; print " koren [label=\"Uživatelská makra\"];\n"; opendir(DIR, $adresar) or die $!; my $i = 0; while (readdir(DIR)) { next if (/^\./); # Měli bychom ošetřit zvláštní znaky v názvech souborů, # abychom nezpůsobili chybu GraphVizu. print " n$i [label=\"$_\"];\n"; print " koren -> n$i;\n"; $i++; } print ""; closedir(DIR); ]]>

…třeba vygenerovat tento diagram následujícím perlovským skriptem:

\n"; print " node [shape=\"box\"];\n"; print " koren [label=\"Uživatelská makra\"];\n"; opendir(DIR, $adresar) or die $!; my $i = 0; while (readdir(DIR)) { next if (/^\./); # Měli bychom ošetřit zvláštní znaky v názvech souborů, # abychom nezpůsobili chybu GraphVizu. print " n$i [label=\"$_\"];\n"; print " koren -> n$i;\n"; $i++; } print ""; closedir(DIR);]]>

Který vložíme zabalený v  … ]]> do stránky.

Známá chyba: ve skriptech zatím nefungují poznámky pod čarou (a není jisté, jestli kdy fungovat budou – pravděpodobně by to vyžadovalo vícefázové zpracování).

Makra ve skriptech

Uvnitř zdrojového kódu skriptu můžeme používat jiná makra. Např. tento kód:

print "Náš podnik se jmenuje "; ]]>

nám vygeneruje:


				print "Náš podnik se jmenuje ";
		

Můžete si tak vytvořit makra pro opakující se části a používat je jak v textu stránek, tak ve skriptech nebo diagramech. Jen pozor na ošetření zvláštních znaků – pokud text takové znaky obsahuje, je dobré ho zabalit ještě do jedné značky, která se postará o escapování pro daný kontext (skriptovací jazyk a prostředí v něm – např. apostrofy vs. uvozovky).

Jen pro připomenutí: nejedná se o nějaké primitivní zástupky a nahrazování textu – makra můžou být parametrizovaná, obsahovat atributy (např. pád a číslo) nebo vnořené elementy a na základě této parametrizace vytvářet odlišný výstup, který je následně předán skriptu.


			echo "S naší  budete jistě spokojeni!";
			echo "Stejně jako my jsme spokojeni s operačním systémem `uname -o`.";
		

Zdrojový kód:

echo "S naší budete jistě spokojeni!"; echo "Stejně jako my jsme spokojeni s operačním systémem `uname -o`."; ]]>

Skripty v těchto příkladech nejsou příliš užitečné, protože pouze vypisují text, který by šlo vložit přímo do XML stránky – předpokládá se, že ve svých skriptech budete dělat něco zajímavějšího :-)

Skripty v makrech

Uvnitř definic maker můžeme volat Ovšem trochu jiným způsobem, než ve stránkách – nacházíme se totiž v programu (XSL šablona definující makro) nikoli v datovém souboru (XML stránka). jiná makra – mj. skripty. Toho jsme využili v makru, které generuje tabulku verzí z mercurialu – ten umí vypsat historii úložiště v XML, které následně snadno zpracujeme v XSLT.

Toto makro naleznete v souboru vstup/makra/hg-verze.xsl.

Vnořování maker

Trochu jiný případ je vnořování maker na stránce. Např. si chceme vypsat vybrané internetové služby:

) { if (/(\w+)\s+(21|22|25|80)\/(tcp)/) { print "$2\t$1\t$3\n"; } } ]]>

Pro vygenerování použijeme dvě makra – tabulku a skript – která vložíme do textu stránky:

) { if (/(\w+)\s+(21|22|25|80)\/(tcp)/) { print "$2\t$1\t$3\n"; } } ]]]]>> ]]>

Ve skriptu v tomto případě negenerujeme XHTML značky, ale CSV (s tabulátory) a o převod na XHTML tabulku se postará XSL šablona.

Podobně bychom mohli postupovat i u diagramu – negenerovat skriptem značky makra, ale pouze jeho obsah – zadání diagramu, nebo jen jeho část. Někdy se ale může hodit ve skriptu nastavovat atributy elementů nebo elementy vytvářet dynamicky.

Skriptování lze použít i pro generování zdrojového kódu, který bude následně zvýrazněn pomocí značky <m:pre jazyk="…"/>. Toho využíváme na stránce Zdrojové kódy v případě SQL a XML ukázek. Skript můžeme použít mj. i ke zkrácení zdrojáku – když chceme vypsat jen jeho relevantní část.