diff -r eec920c4bddf -r 4d33f14e99dd ukázka/skriptování.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ukázka/skriptování.xml Sat Nov 17 23:05:59 2012 +0100 @@ -0,0 +1,358 @@ + + 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"; + } +} + ]]> + +
JazykInterpret
$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. +

+ +
+ +
+