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
.
V současnosti jsou podporované tyto jazyky:
Jazyk | Interpret |
bash
|
/bin/bash
|
perl
|
/usr/bin/perl
|
php
|
/usr/bin/php
|
python
|
/usr/bin/python
|
Jazyky použité nebo citované na této stránce:
1× php 9× perl 8× bash
Právě je: So čen 22 22:20:54 CEST 2013 Operační systém: GNU/Linux SHA-1 otisk zdrojáku této stránky: d0c8b60f86057dcf2296b2d43ab1b1b573eef118
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/vstup/skriptov%C3%A1n%C3%AD.xml Soubor: /home/xwg/src/xml-web-generator/vstup/skriptování.xml Nadpis: Skriptování Perex: Na stránku můžeme vložit výstup 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.
…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í).
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 :-)
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
.
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 | http | 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.