Skriptování

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 GNU/Linux.

Díky skriptování můžeme stránky obohatit o prakticky libovolný obsah – jak prostý text, tak i XHTML fragmenty. 1

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:

Jazyk Interpret
bash /bin/bash
perl /usr/bin/perl
php /usr/bin/php
python /usr/bin/python

Perl – ukázka

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

1×	 php
9×	 perl
8×	 bash

BASH – ukázka

Právě je: Ne čec  8 12:58:06 CEST 2012
Operační systém: GNU/Linux
SHA-1 otisk zdrojáku této stránky: d0c8b60f86057dcf2296b2d43ab1b1b573eef118

Proměnné prostředí

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

Proměnná Význam
XWG_STRANKA_URI URI aktuálně zpracovávané stránky
XWG_STRANKA_SOUBOR absolutní cesta k souboru
XWG_STRANKA_NADPIS nadpis stránky
XWG_STRANKA_PEREX perex stránky

Kód:

<m:skript jazyk="bash">
echo "URI:    $XWG_STRANKA_URI";
echo "Soubor: $XWG_STRANKA_SOUBOR";
echo "Nadpis: $XWG_STRANKA_NADPIS";
echo "Perex:  $XWG_STRANKA_PEREX";
</m:skript>

nám vypíše:

URI:    file:/home/xwg/src/xml-web-generator-demo2/vstup/skriptov%C3%A1n%C3%AD.xml
Soubor: /home/xwg/src/xml-web-generator-demo2/vstup/skriptování.xml
Nadpis: Skriptování
Perex:  Na stránku můžeme vložit výstup skriptů.

Makra ze skriptů

XML generované skriptem může také obsahovat makra, která se následně interptetují. Takže můžeš skriptovat, když skriptuješ, nebo dělat něco užitečnějšího.

Diagram Uživatelská makra v adresáři vstup/makra | pokud nevidíte obrázek, váš prohlížeč stojí za starou bačkoru

Uživatelská makra v adresáři vstup/makra

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

use strict;
use warnings;

my $adresar = "vstup/makra";

print "<m:diagram nadpis='Uživatelská makra v adresáři $adresar'>\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 "</m:diagram>";
closedir(DIR);

Který vložíme zabalený v <m:skript jazyk="perl" výstup="xhtml"> … </m:skript> 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:

<pre>
	<m:skript jazyk="perl">
		print "Náš podnik se jmenuje <m:firma/>";
	</m:skript>
</pre>

nám vygeneruje:

Náš podnik se jmenuje Chovatelská stanice a.s.

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. 2

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.

S naší Chovatelskou stanicí a.s. budete jistě spokojeni!
Stejně jako my jsme spokojeni s operačním systémem GNU/Linux.

Zdrojový kód:

<pre>
	<m:skript jazyk="bash">
		echo "S naší <m:firma pad="7"/> budete jistě spokojeni!";
		echo "Stejně jako my jsme spokojeni s operačním systémem `uname -o`.";
	</m:skript>
</pre>

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 3 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.

Číslo verze Datum vydání
0.4 6. 7. 2012
0.3 8. 1. 2012
0.2 23. 8. 2011
0.1 30. 4. 2011

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:

Port Služba Protokol
21 ftp tcp
22 ssh tcp
25 smtp tcp
80 www tcp

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

<m:tabulka>
	<m:skript jazyk="perl"><![CDATA[
		print "Port\tSlužba\tProtokol\n";
		open(S, "<", "/etc/services") or die $!;
		while (<S>) {
			if (/(\w+)\s+(21|22|25|80)\/(tcp)/) {
				print "$2\t$1\t$3\n";
			}
		}
	]]></m:skript>
</m:tabulka>

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.

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

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

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

Poháněno tučňákem. Vytvořeno pomocí XML Web generátoru. Používá XML, XSLT, Ant a další dobroty.