#20 Skriptování: výstupní formáty: text (prostý), xhtml (fragment), xml (celý dokument, může mít XML deklaraci).
1.1 --- a/vstup/makra/hg-verze.xsl Thu Jul 05 19:10:42 2012 +0200
1.2 +++ b/vstup/makra/hg-verze.xsl Thu Jul 05 20:13:56 2012 +0200
1.3 @@ -10,24 +10,12 @@
1.4 xmlns:svg="http://www.w3.org/2000/svg"
1.5 xmlns:xs="http://www.w3.org/2001/XMLSchema"
1.6 exclude-result-prefixes="fn h s k m xs">
1.7 -
1.8 +
1.9 <!-- Vypíše verze z verzovacího systému: -->
1.10 <xsl:template match="m:hg-verze">
1.11 +
1.12 <xsl:variable name="zadáníSkriptu">
1.13 - <!--
1.14 - TODO:
1.15 - Zahazovat XML deklaraci bychom mohli v Javě u všech skriptů…
1.16 - Nicméně současná dohoda je taková, že skripty vracejí fragment, ne celý dokument,
1.17 - což má výhodu v tom, že můžou vrátit kus textu a nějakou tu značku
1.18 - a nemusí to být zabalené v kořenovém elementu.
1.19 -
1.20 - -->
1.21 - <m:skript jazyk="bash" výstup="xml">hg log --style xml | awk '{if(NR>1)print}';</m:skript>
1.22 - <!--
1.23 - Také bychom filtrování mohli provés ve skriptu…
1.24 - hg log … | xpath -e "//logentry[tag[starts-with(., 'v')]]" 2>/dev/null
1.25 - …ale to by bylo trochu zbytečně pracné.
1.26 - -->
1.27 + <m:skript jazyk="bash" výstup="xml">hg log --style xml</m:skript>
1.28 </xsl:variable>
1.29
1.30 <xsl:variable name="výstupSkriptu">
1.31 @@ -42,10 +30,6 @@
1.32 </tr>
1.33 </thead>
1.34 <tbody style="text-align: right;">
1.35 - <!--
1.36 - Výstup skriptu se bude nacházet v XHTML jmenném prostoru, což je obvykle v pořádku,
1.37 - ale pro mezivýsledky to není úplně vhodné.
1.38 - -->
1.39 <xsl:for-each select="$výstupSkriptu/h:log/h:logentry[h:tag[starts-with(text(), 'v')]]">
1.40 <tr>
1.41 <td><xsl:value-of select="substring(h:tag/text(), 2)"/></td>
2.1 --- a/vstup/skriptování.xml Thu Jul 05 19:10:42 2012 +0200
2.2 +++ b/vstup/skriptování.xml Thu Jul 05 20:13:56 2012 +0200
2.3 @@ -6,7 +6,7 @@
2.4 <pořadí>50</pořadí>
2.5
2.6 <text xmlns="http://www.w3.org/1999/xhtml">
2.7 -
2.8 +
2.9 <p>
2.10 Na stránkách můžeme používat skripty.
2.11 Spouští se při generování a jejich standardní výstup se vloží do stránky.
2.12 @@ -40,7 +40,7 @@
2.13 <p>
2.14 V současnosti jsou podporované tyto jazyky:
2.15 </p>
2.16 -
2.17 +
2.18 <table>
2.19 <thead>
2.20 <tr>
2.21 @@ -49,7 +49,7 @@
2.22 </tr>
2.23 </thead>
2.24 <tbody>
2.25 - <m:skript jazyk="perl" výstup="xml"><![CDATA[
2.26 + <m:skript jazyk="perl" výstup="xhtml"><![CDATA[
2.27 use strict;
2.28 use warnings;
2.29
2.30 @@ -111,7 +111,7 @@
2.31 <p>
2.32 Ve skriptech máme dostupné následující proměnné prostředí:
2.33 </p>
2.34 -
2.35 +
2.36 <table>
2.37 <thead>
2.38 <tr>
2.39 @@ -121,23 +121,23 @@
2.40 </thead>
2.41 <tbody>
2.42 <!-- Pokud načítáme skript ze souboru, je atribut jazyk nepovinný. -->
2.43 - <m:skript jazyk="perl" výstup="xml" src="skriptování-proměnné.pl"/>
2.44 + <m:skript jazyk="perl" výstup="xhtml" src="skriptování-proměnné.pl"/>
2.45 </tbody>
2.46 </table>
2.47 -
2.48 +
2.49 <p>
2.50 Kód:
2.51 </p>
2.52 -
2.53 +
2.54 <m:pre jazyk="xml"><![CDATA[<m:skript jazyk="bash">
2.55 echo "URI: $XWG_STRANKA_URI";
2.56 echo "Soubor: $XWG_STRANKA_SOUBOR";
2.57 echo "Nadpis: $XWG_STRANKA_NADPIS";
2.58 echo "Perex: $XWG_STRANKA_PEREX";
2.59 </m:skript>]]></m:pre>
2.60 -
2.61 +
2.62 <p>nám vypíše:</p>
2.63 -
2.64 +
2.65 <pre><m:skript jazyk="bash"><![CDATA[
2.66 echo "URI: $XWG_STRANKA_URI" | sed s/\\/home\\/$USER/\\/home\\/xwg/g;
2.67 echo "Soubor: $XWG_STRANKA_SOUBOR" | sed s/\\/home\\/$USER/\\/home\\/xwg/g;
2.68 @@ -148,7 +148,7 @@
2.69 <h2>Makra ve skriptech</h2>
2.70 <p>
2.71 XML generované skriptem může také obsahovat makra, která se následně interptetují.
2.72 - <m:skript jazyk="bash" výstup="xml"><![CDATA[
2.73 + <m:skript jazyk="bash" výstup="xhtml"><![CDATA[
2.74 echo '<m:skript jazyk="bash">'; # Ty zrůdo! :-)
2.75 echo 'echo "Takže můžeš skriptovat, když skriptuješ,";';
2.76 echo '</m:skript>';
2.77 @@ -156,7 +156,7 @@
2.78 nebo dělat něco užitečnějšího.
2.79 </p>
2.80
2.81 - <m:skript jazyk="perl" výstup="xml"><![CDATA[
2.82 + <m:skript jazyk="perl" výstup="xhtml"><![CDATA[
2.83 use strict;
2.84 use warnings;
2.85
2.86 @@ -179,9 +179,9 @@
2.87 print "</m:diagram>";
2.88 closedir(DIR);
2.89 ]]></m:skript>
2.90 -
2.91 +
2.92 <p>…třeba vygenerovat tento diagram následujícím perlovským skriptem:</p>
2.93 -
2.94 +
2.95 <m:pre jazyk="perl"><![CDATA[
2.96 use strict;
2.97 use warnings;
2.98 @@ -206,7 +206,7 @@
2.99 closedir(DIR);]]></m:pre>
2.100
2.101 <p>
2.102 - Který vložíme zabalený v <code><![CDATA[<m:skript jazyk="perl" výstup="xml"> … </m:skript>]]></code> do stránky.
2.103 + Který vložíme zabalený v <code><![CDATA[<m:skript jazyk="perl" výstup="xhtml"> … </m:skript>]]></code> do stránky.
2.104 </p>
2.105 <p>
2.106 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í).
3.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 19:10:42 2012 +0200
3.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java Thu Jul 05 20:13:56 2012 +0200
3.3 @@ -40,6 +40,12 @@
3.4 */
3.5 public class Skriptování {
3.6
3.7 + private enum FORMÁT {
3.8 +
3.9 + xml,
3.10 + xhtml,
3.11 + text
3.12 + }
3.13 /**
3.14 * klíč = jazyk – např. bash
3.15 * hodnota = interpret – např. /bin/bash
3.16 @@ -70,7 +76,7 @@
3.17 */
3.18 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 {
3.19 String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky);
3.20 - return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát));
3.21 + return vyrobXml(výstupSkriptu, zjistiFormát(výstupníFormát));
3.22 }
3.23
3.24 private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
3.25 @@ -169,26 +175,29 @@
3.26 return !(s == null || s.trim().isEmpty());
3.27 }
3.28
3.29 + private static FORMÁT zjistiFormát(String výstupníFormát) {
3.30 + try {
3.31 + return FORMÁT.valueOf(výstupníFormát);
3.32 + } catch (NullPointerException e) {
3.33 + return FORMÁT.text;
3.34 + } catch (IllegalArgumentException e) {
3.35 + return FORMÁT.text;
3.36 + }
3.37 + }
3.38 +
3.39 /**
3.40 * @param zadání výstup vygenerovaný skriptem
3.41 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text
3.42 * @return xml fragment nebo prostý text zabalený do html/body
3.43 * @throws Exception
3.44 */
3.45 - private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception {
3.46 + private static Source vyrobXml(String zadání, FORMÁT formát) throws Exception {
3.47 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
3.48 DocumentBuilder db = dbf.newDocumentBuilder();
3.49 Document d;
3.50
3.51 - if (xmlFormát) {
3.52 - try {
3.53 - zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>";
3.54 - d = db.parse(new ByteArrayInputStream(zadání.getBytes()));
3.55 - } catch (Exception e) {
3.56 - System.err.println("Chyba: Skript vrátil neplatné XML.");
3.57 - throw e;
3.58 - }
3.59 - } else {
3.60 +
3.61 + if (formát == FORMÁT.text) {
3.62 d = db.newDocument();
3.63 Node html = d.createElementNS(XHTML, "html");
3.64 Node body = d.createElementNS(XHTML, "body");
3.65 @@ -196,6 +205,16 @@
3.66 body.appendChild(text);
3.67 html.appendChild(body);
3.68 d.appendChild(html);
3.69 + } else {
3.70 + if (formát == FORMÁT.xhtml) {
3.71 + zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>";
3.72 + }
3.73 + try {
3.74 + d = db.parse(new ByteArrayInputStream(zadání.getBytes()));
3.75 + } catch (Exception e) {
3.76 + System.err.println("Chyba: Skript vrátil neplatné XML.");
3.77 + throw e;
3.78 + }
3.79 }
3.80
3.81 return new DOMSource(d);
4.1 --- a/šablona/makra/skriptování.xsl Thu Jul 05 19:10:42 2012 +0200
4.2 +++ b/šablona/makra/skriptování.xsl Thu Jul 05 20:13:56 2012 +0200
4.3 @@ -32,7 +32,10 @@
4.4 Provedeme skript zadaný v těle elementu nebo v souboru a jeho výstup vložíme do stránky.
4.5 *
4.6 @jazyk programovací jazyk, např. bash, perl, php (nepovinné, pokud je vyplněn atribut src)
4.7 - @výstup formát výstupu skriptu: text (výchozí) | xml (musí být validním fragmentem XML)
4.8 + @výstup formát výstupu skriptu:
4.9 + text – libovolný text, escapujeme (výchozí)
4.10 + xhtml – platný XML fragment, přidáme mu výchozí jmenný prostor XHTML a jmenný prostor pro makra
4.11 + xml – platný XML dokument – vhodné pro další zpracování v jiných makrech
4.12 @src soubor se skriptem/programem (volitelný parametr – buď zadáme skript do těla elementu, nebo nastavíme tento atribut)
4.13 -->
4.14 <xsl:template match="m:skript">
4.15 @@ -50,7 +53,16 @@
4.16 //s:stránka/s:nadpis/text(),
4.17 //s:stránka/s:perex/text()
4.18 )"/>
4.19 - <xsl:apply-templates select="$výstupSkriptu/h:html/h:body/node()"/>
4.20 + <xsl:choose>
4.21 + <xsl:when test="@výstup = 'xml'">
4.22 + <!-- XML výstup zpracujeme, jak je: -->
4.23 + <xsl:apply-templates select="$výstupSkriptu/*"/>
4.24 + </xsl:when>
4.25 + <xsl:otherwise>
4.26 + <!-- Prostý text a XHTML fragmenty dostáváme zabalené v html/body -->
4.27 + <xsl:apply-templates select="$výstupSkriptu/h:html/h:body/node()"/>
4.28 + </xsl:otherwise>
4.29 + </xsl:choose>
4.30 </xsl:when>
4.31
4.32 <xsl:when test="$režim = 'zakázat'">
4.33 @@ -59,7 +71,7 @@
4.34 <xsl:when test="$režim = 'ignorovat'">
4.35 <xsl:message>Stránka obsahuje skripty, ale skripty jsou ignorovány – změnu lze provést ve web.conf.</xsl:message>
4.36 </xsl:when>
4.37 - <xsl:when test="$režim = 'vložit' and @výstup = 'xml'">
4.38 + <xsl:when test="$režim = 'vložit' and (@výstup = 'xml' or @výstup = 'xhtml')">
4.39 <xsl:message>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</xsl:message>
4.40 </xsl:when>
4.41 <xsl:when test="$režim = 'vložit'">
4.42 @@ -69,7 +81,7 @@
4.43 </xsl:when>
4.44 <xsl:otherwise><!-- varovat = výchozí možnost -->
4.45 <xsl:choose>
4.46 - <xsl:when test="@výstup = 'xml'">
4.47 + <xsl:when test="@výstup = 'xml' or @výstup = 'xhtml'">
4.48 <xsl:message>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</xsl:message>
4.49 </xsl:when>
4.50 <xsl:otherwise>