# HG changeset patch # User František Kučera # Date 1341512036 -7200 # Node ID 8d9cab64c3354aca154d8092027f6687185a06d7 # Parent 379a2a893fd190746c542b7e399da1ebc2d4c74d #20 Skriptování: výstupní formáty: text (prostý), xhtml (fragment), xml (celý dokument, může mít XML deklaraci). diff -r 379a2a893fd1 -r 8d9cab64c335 vstup/makra/hg-verze.xsl --- a/vstup/makra/hg-verze.xsl Thu Jul 05 19:10:42 2012 +0200 +++ b/vstup/makra/hg-verze.xsl Thu Jul 05 20:13:56 2012 +0200 @@ -10,24 +10,12 @@ xmlns:svg="http://www.w3.org/2000/svg" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="fn h s k m xs"> - + + - - hg log --style xml | awk '{if(NR>1)print}'; - + hg log --style xml @@ -42,10 +30,6 @@ - diff -r 379a2a893fd1 -r 8d9cab64c335 vstup/skriptování.xml --- a/vstup/skriptování.xml Thu Jul 05 19:10:42 2012 +0200 +++ b/vstup/skriptování.xml Thu Jul 05 20:13:56 2012 +0200 @@ -6,7 +6,7 @@ 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. @@ -40,7 +40,7 @@

V současnosti jsou podporované tyto jazyky:

- + @@ -49,7 +49,7 @@ - Ve skriptech máme dostupné následující proměnné prostředí:

- +
@@ -121,23 +121,23 @@ - +
- +

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 ''; @@ -156,7 +156,7 @@ nebo dělat něco užitečnějšího.

- "; closedir(DIR); ]]> - +

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

- +

- Který vložíme zabalený v  … ]]> do stránky. + 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í). diff -r 379a2a893fd1 -r 8d9cab64c335 šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 19:10:42 2012 +0200 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 20:13:56 2012 +0200 @@ -40,6 +40,12 @@ */ public class Skriptování { + private enum FORMÁT { + + xml, + xhtml, + text + } /** * klíč = jazyk – např. bash * hodnota = interpret – např. /bin/bash @@ -70,7 +76,7 @@ */ public static Source interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky); - return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát)); + return vyrobXml(výstupSkriptu, zjistiFormát(výstupníFormát)); } private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { @@ -169,26 +175,29 @@ return !(s == null || s.trim().isEmpty()); } + private static FORMÁT zjistiFormát(String výstupníFormát) { + try { + return FORMÁT.valueOf(výstupníFormát); + } catch (NullPointerException e) { + return FORMÁT.text; + } catch (IllegalArgumentException e) { + return FORMÁT.text; + } + } + /** * @param zadání výstup vygenerovaný skriptem * @param xmlFormát formát zadání: true = xml fragment | false = prostý text * @return xml fragment nebo prostý text zabalený do html/body * @throws Exception */ - private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception { + private static Source vyrobXml(String zadání, FORMÁT formát) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document d; - if (xmlFormát) { - try { - zadání = "" + zadání + ""; - d = db.parse(new ByteArrayInputStream(zadání.getBytes())); - } catch (Exception e) { - System.err.println("Chyba: Skript vrátil neplatné XML."); - throw e; - } - } else { + + if (formát == FORMÁT.text) { d = db.newDocument(); Node html = d.createElementNS(XHTML, "html"); Node body = d.createElementNS(XHTML, "body"); @@ -196,6 +205,16 @@ body.appendChild(text); html.appendChild(body); d.appendChild(html); + } else { + if (formát == FORMÁT.xhtml) { + zadání = "" + zadání + ""; + } + try { + d = db.parse(new ByteArrayInputStream(zadání.getBytes())); + } catch (Exception e) { + System.err.println("Chyba: Skript vrátil neplatné XML."); + throw e; + } } return new DOMSource(d); diff -r 379a2a893fd1 -r 8d9cab64c335 šablona/makra/skriptování.xsl --- a/šablona/makra/skriptování.xsl Thu Jul 05 19:10:42 2012 +0200 +++ b/šablona/makra/skriptování.xsl Thu Jul 05 20:13:56 2012 +0200 @@ -32,7 +32,10 @@ Provedeme skript zadaný v těle elementu nebo v souboru a jeho výstup vložíme do stránky. * @jazyk programovací jazyk, např. bash, perl, php (nepovinné, pokud je vyplněn atribut src) - @výstup formát výstupu skriptu: text (výchozí) | xml (musí být validním fragmentem XML) + @výstup formát výstupu skriptu: + text – libovolný text, escapujeme (výchozí) + xhtml – platný XML fragment, přidáme mu výchozí jmenný prostor XHTML a jmenný prostor pro makra + xml – platný XML dokument – vhodné pro další zpracování v jiných makrech @src soubor se skriptem/programem (volitelný parametr – buď zadáme skript do těla elementu, nebo nastavíme tento atribut) --> @@ -50,7 +53,16 @@ //s:stránka/s:nadpis/text(), //s:stránka/s:perex/text() )"/> - + + + + + + + + + + @@ -59,7 +71,7 @@ Stránka obsahuje skripty, ale skripty jsou ignorovány – změnu lze provést ve web.conf. - + Není možné jen tak vložit text, který měl mít výstup ve formátu XML – změnu lze provést ve web.conf @@ -69,7 +81,7 @@ - + Není možné možné vložit varování na místo, kde měl být skript generující XML – změnu lze provést ve web.conf