#20 Skriptování: vnořování maker – zadání tabulky nebo diagramu může být generované skriptem.
1.1 --- a/vstup/skriptování.xml Thu Jul 05 21:13:56 2012 +0200
1.2 +++ b/vstup/skriptování.xml Thu Jul 05 23:31:49 2012 +0200
1.3 @@ -74,7 +74,7 @@
1.4 use strict;
1.5 use warnings;
1.6
1.7 -open(XML, "<", $ENV{"XWG_STRANKA_SOUBOR"});
1.8 +open(XML, "<", $ENV{"XWG_STRANKA_SOUBOR"}) or die $!;
1.9 my %skripty;
1.10
1.11 while (<XML>) {
1.12 @@ -88,7 +88,7 @@
1.13 }
1.14 ]]></m:skript></pre>
1.15
1.16 - <h3>BASH – ukázka</h3>
1.17 + <h3>BASH – ukázka</h3>
1.18 <pre><m:skript jazyk="bash"><![CDATA[
1.19 echo -n "Právě je: ";
1.20 date;
1.21 @@ -145,7 +145,7 @@
1.22 echo "Perex: $XWG_STRANKA_PEREX";
1.23 ]]></m:skript></pre>
1.24
1.25 - <h2>Makra ve skriptech</h2>
1.26 + <h2 id="makraVeSkriptech">Makra ve skriptech</h2>
1.27 <p>
1.28 XML generované skriptem může také obsahovat makra, která se následně interptetují.
1.29 <m:skript jazyk="bash" výstup="xhtml"><![CDATA[
1.30 @@ -222,7 +222,8 @@
1.31 nikoli v <em>datovém souboru</em> (XML stránka).
1.32 </m:podČarou>
1.33 jiná makra – mj. skripty.
1.34 - Toho jsme využili v makru, které generuje tabulku verzí z mercurialu:
1.35 + Toho jsme využili v makru, které generuje tabulku verzí z mercurialu
1.36 + – ten umí vypsat historii úložiště v XML, které následně snadno zpracujeme v XSLT.
1.37 </p>
1.38
1.39 <m:hg-verze/>
1.40 @@ -231,6 +232,60 @@
1.41 Toto makro naleznete v souboru <code>vstup/makra/hg-verze.xsl</code>.
1.42 </p>
1.43
1.44 + <h2>Vnořování maker</h2>
1.45 + <p>
1.46 + Trochu jiný případ je vnořování maker na stránce.
1.47 + Např. si chceme vypsat vybrané internetové služby:
1.48 + </p>
1.49 + <m:tabulka>
1.50 + <m:skript jazyk="perl"><![CDATA[
1.51 +use strict;
1.52 +use warnings;
1.53 +
1.54 +print "Port\tSlužba\tProtokol\n";
1.55 +open(S, "<", "/etc/services") or die $!;
1.56 +while (<S>) {
1.57 + if (/(\w+)\s+(21|22|25|80)\/(tcp)/) {
1.58 + print "$2\t$1\t$3\n";
1.59 + }
1.60 +}
1.61 + ]]></m:skript>
1.62 + </m:tabulka>
1.63 +
1.64 + <p>
1.65 + Pro vygenerování použijeme dvě makra – tabulku a skript – která vložíme do textu stránky:
1.66 + </p>
1.67 +
1.68 + <m:pre jazyk="xml"><![CDATA[
1.69 +<m:tabulka>
1.70 + <m:skript jazyk="perl"><![CDATA[
1.71 + print "Port\tSlužba\tProtokol\n";
1.72 + open(S, "<", "/etc/services") or die $!;
1.73 + while (<S>) {
1.74 + if (/(\w+)\s+(21|22|25|80)\/(tcp)/) {
1.75 + print "$2\t$1\t$3\n";
1.76 + }
1.77 + }
1.78 + ]]]]>><![CDATA[</m:skript>
1.79 +</m:tabulka>]]></m:pre>
1.80 +
1.81 + <p>
1.82 + Ve skriptu v tomto případě negenerujeme XHTML značky, ale CSV (s tabulátory)
1.83 + a o převod na XHTML tabulku se postará XSL šablona.
1.84 + </p>
1.85 +
1.86 + <!--
1.87 + Nebo to taky můžeme napsat na jeden řádek:
1.88 + cat /etc/services | perl -ne 'if (/(\w+)\s+(21|22|25|80)\/(tcp)/) { print "$2\t$1\t$3\n";}'
1.89 + a vložit do tabulky jako BASH skript :-)
1.90 + -->
1.91 +
1.92 + <p>
1.93 + Podobně bychom mohli postupovat i u <a href="#makraVeSkriptech">diagramu</a> –
1.94 + negenerovat skriptem značky makra, ale pouze jeho obsah – zadání diagramu, nebo jen jeho část.
1.95 + Někdy se ale může hodit ve skriptu nastavovat atributy elementů nebo elementy vytvářet dynamicky.
1.96 + </p>
1.97 +
1.98 </text>
1.99
1.100 </stránka>
2.1 --- a/šablona/makra/diagramy.xsl Thu Jul 05 21:13:56 2012 +0200
2.2 +++ b/šablona/makra/diagramy.xsl Thu Jul 05 23:31:49 2012 +0200
2.3 @@ -35,8 +35,11 @@
2.4 @src zadání diagramu načteme ze souboru (potom je výchozí kompletní = 'ne')
2.5 -->
2.6 <xsl:template match="m:diagram">
2.7 + <xsl:variable name="zadání">
2.8 + <xsl:apply-templates select="*|text()"/>
2.9 + </xsl:variable>
2.10 <xsl:call-template name="vložDiagram">
2.11 - <xsl:with-param name="zadání" select="text()"/>
2.12 + <xsl:with-param name="zadání" select="$zadání"/>
2.13 <xsl:with-param name="kompletní" select="@kompletní = 'ano'"/>
2.14 </xsl:call-template>
2.15 </xsl:template>
3.1 --- a/šablona/makra/tabulka.xsl Thu Jul 05 21:13:56 2012 +0200
3.2 +++ b/šablona/makra/tabulka.xsl Thu Jul 05 23:31:49 2012 +0200
3.3 @@ -39,6 +39,18 @@
3.4 </xsl:call-template>
3.5 </xsl:template>
3.6
3.7 + <!-- Skript je potřeba interpretovat ještě před tabulkou – ostatní makra budou interpretovat uvnitř buněk -->
3.8 + <xsl:template match="m:tabulka[m:skript]">
3.9 + <xsl:variable name="zadání">
3.10 + <xsl:apply-templates select="*"/>
3.11 + </xsl:variable>
3.12 + <xsl:call-template name="vykresliTabulku">
3.13 + <xsl:with-param name="zadání" select="$zadání"/>
3.14 + <xsl:with-param name="oddělovač" select="(@oddělovač, '\t+')[1]"/>
3.15 + </xsl:call-template>
3.16 + </xsl:template>
3.17 +
3.18 + <!-- Tabulka načítaná ze souboru: -->
3.19 <xsl:template match="m:tabulka[@src]">
3.20 <xsl:call-template name="vykresliTabulku">
3.21 <xsl:with-param name="zadání" select="m:načti-textový-soubor(@src)"/>
3.22 @@ -46,6 +58,7 @@
3.23 </xsl:call-template>
3.24 </xsl:template>
3.25
3.26 + <!-- TODO: Umožnit použití maker a značek uvnitř buněk tabulky. -->
3.27 <xsl:template name="vykresliTabulku">
3.28 <xsl:param name="zadání"/>
3.29 <xsl:param name="oddělovač"/>