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 ve skriptech

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í).

Skripty v makrech

Uvnitř 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.