franta-hg@94: franta-hg@94: Skriptování franta-hg@94: Na stránku můžeme vložit výstup skriptů. franta-hg@97: 50 franta-hg@94: franta-hg@94: franta-hg@108: franta-hg@94:

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

franta-hg@94:

franta-hg@94: Příklad: franta-hg@95: franta-hg@95: Tyto stránky byly vygenerované v systému franta-hg@95: uname -o. franta-hg@95: franta-hg@95:

franta-hg@95: franta-hg@95:

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

franta-hg@103:

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

franta-hg@95: franta-hg@95:

Podporované jazyky

franta-hg@95:

franta-hg@95: V současnosti jsou podporované tyto jazyky: franta-hg@94:

franta-hg@108: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@108: ) { franta-hg@94: if (/podporovanýJazyk\.put\("(\w+)",\s*"(.*)"\);/) { franta-hg@95: print "\n"; franta-hg@94: } franta-hg@94: } franta-hg@95: ]]> franta-hg@95: franta-hg@95:
JazykInterpret
$1$2
franta-hg@94: franta-hg@110:

Perl – ukázka

franta-hg@94:

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

franta-hg@99: franta-hg@94:
) {
franta-hg@94: 	if (/m:skript\s+jazyk="(\w+)"/) {
franta-hg@94: 		$skripty{$1}++;
franta-hg@94: 	}
franta-hg@94: }
franta-hg@94: 
franta-hg@94: for(keys(%skripty)) {
franta-hg@94: 	print "$skripty{$_}×\t $_\n";
franta-hg@94: }
franta-hg@94: 			]]>
franta-hg@94: franta-hg@111:

BASH – ukázka

franta-hg@94:
franta-hg@94: franta-hg@94: franta-hg@94: franta-hg@94:

Proměnné prostředí

franta-hg@94:

franta-hg@94: Ve skriptech máme dostupné následující proměnné prostředí: franta-hg@94:

franta-hg@108: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@95: franta-hg@103: franta-hg@108: franta-hg@95: franta-hg@95:
ProměnnáVýznam
franta-hg@108: franta-hg@94:

franta-hg@94: Kód: franta-hg@94:

franta-hg@108: franta-hg@94: franta-hg@94: echo "URI: $XWG_STRANKA_URI"; franta-hg@94: echo "Soubor: $XWG_STRANKA_SOUBOR"; franta-hg@94: echo "Nadpis: $XWG_STRANKA_NADPIS"; franta-hg@94: echo "Perex: $XWG_STRANKA_PEREX"; franta-hg@94: ]]> franta-hg@108: franta-hg@94:

nám vypíše:

franta-hg@108: franta-hg@94:
franta-hg@94: franta-hg@113:

Makra ze skriptů

franta-hg@107:

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

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

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

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

franta-hg@108: Který vložíme zabalený v  … ]]> do stránky. franta-hg@107:

franta-hg@107:

franta-hg@107: 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í). franta-hg@107:

franta-hg@107: franta-hg@113:

Makra ve skriptech

franta-hg@113: franta-hg@113:

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

franta-hg@113: franta-hg@113: franta-hg@114: franta-hg@114: print "Náš podnik se jmenuje "; franta-hg@113: franta-hg@113: ]]> franta-hg@113: franta-hg@113:

franta-hg@113: nám vygeneruje: franta-hg@113:

franta-hg@113: franta-hg@114:

franta-hg@114: 				print "Náš podnik se jmenuje ";
franta-hg@113: 		
franta-hg@113: franta-hg@113:

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

franta-hg@114: franta-hg@114:

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

franta-hg@114: franta-hg@114:

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

franta-hg@114: Zdrojový kód: franta-hg@114:

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

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

franta-hg@113: franta-hg@107:

Skripty v makrech

franta-hg@107:

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

franta-hg@107: franta-hg@107: franta-hg@107: franta-hg@107:

franta-hg@107: Toto makro naleznete v souboru vstup/makra/hg-verze.xsl. franta-hg@107:

franta-hg@107: franta-hg@111:

Vnořování maker

franta-hg@111:

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

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

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

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

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

franta-hg@111: franta-hg@111: franta-hg@111: franta-hg@111:

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

franta-hg@111: franta-hg@112:

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

franta-hg@112: franta-hg@94:
franta-hg@94: franta-hg@94:
franta-hg@94: