#20 Skriptování: vnořování maker – zadání tabulky nebo diagramu může být generované skriptem.
--- a/vstup/skriptování.xml Thu Jul 05 21:13:56 2012 +0200
+++ b/vstup/skriptování.xml Thu Jul 05 23:31:49 2012 +0200
@@ -74,7 +74,7 @@
use strict;
use warnings;
-open(XML, "<", $ENV{"XWG_STRANKA_SOUBOR"});
+open(XML, "<", $ENV{"XWG_STRANKA_SOUBOR"}) or die $!;
my %skripty;
while (<XML>) {
@@ -88,7 +88,7 @@
}
]]></m:skript></pre>
- <h3>BASH – ukázka</h3>
+ <h3>BASH – ukázka</h3>
<pre><m:skript jazyk="bash"><![CDATA[
echo -n "Právě je: ";
date;
@@ -145,7 +145,7 @@
echo "Perex: $XWG_STRANKA_PEREX";
]]></m:skript></pre>
- <h2>Makra ve skriptech</h2>
+ <h2 id="makraVeSkriptech">Makra ve skriptech</h2>
<p>
XML generované skriptem může také obsahovat makra, která se následně interptetují.
<m:skript jazyk="bash" výstup="xhtml"><![CDATA[
@@ -222,7 +222,8 @@
nikoli v <em>datovém souboru</em> (XML stránka).
</m:podČarou>
jiná makra – mj. skripty.
- Toho jsme využili v makru, které generuje tabulku verzí z mercurialu:
+ 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.
</p>
<m:hg-verze/>
@@ -231,6 +232,60 @@
Toto makro naleznete v souboru <code>vstup/makra/hg-verze.xsl</code>.
</p>
+ <h2>Vnořování maker</h2>
+ <p>
+ Trochu jiný případ je vnořování maker na stránce.
+ Např. si chceme vypsat vybrané internetové služby:
+ </p>
+ <m:tabulka>
+ <m:skript jazyk="perl"><![CDATA[
+use strict;
+use warnings;
+
+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>
+
+ <p>
+ Pro vygenerování použijeme dvě makra – tabulku a skript – která vložíme do textu stránky:
+ </p>
+
+ <m:pre jazyk="xml"><![CDATA[
+<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";
+ }
+ }
+ ]]]]>><![CDATA[</m:skript>
+</m:tabulka>]]></m:pre>
+
+ <p>
+ 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.
+ </p>
+
+ <!--
+ Nebo to taky můžeme napsat na jeden řádek:
+ cat /etc/services | perl -ne 'if (/(\w+)\s+(21|22|25|80)\/(tcp)/) { print "$2\t$1\t$3\n";}'
+ a vložit do tabulky jako BASH skript :-)
+ -->
+
+ <p>
+ Podobně bychom mohli postupovat i u <a href="#makraVeSkriptech">diagramu</a> –
+ 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.
+ </p>
+
</text>
</stránka>
--- a/šablona/makra/diagramy.xsl Thu Jul 05 21:13:56 2012 +0200
+++ b/šablona/makra/diagramy.xsl Thu Jul 05 23:31:49 2012 +0200
@@ -35,8 +35,11 @@
@src zadání diagramu načteme ze souboru (potom je výchozí kompletní = 'ne')
-->
<xsl:template match="m:diagram">
+ <xsl:variable name="zadání">
+ <xsl:apply-templates select="*|text()"/>
+ </xsl:variable>
<xsl:call-template name="vložDiagram">
- <xsl:with-param name="zadání" select="text()"/>
+ <xsl:with-param name="zadání" select="$zadání"/>
<xsl:with-param name="kompletní" select="@kompletní = 'ano'"/>
</xsl:call-template>
</xsl:template>
--- a/šablona/makra/tabulka.xsl Thu Jul 05 21:13:56 2012 +0200
+++ b/šablona/makra/tabulka.xsl Thu Jul 05 23:31:49 2012 +0200
@@ -39,6 +39,18 @@
</xsl:call-template>
</xsl:template>
+ <!-- Skript je potřeba interpretovat ještě před tabulkou – ostatní makra budou interpretovat uvnitř buněk -->
+ <xsl:template match="m:tabulka[m:skript]">
+ <xsl:variable name="zadání">
+ <xsl:apply-templates select="*"/>
+ </xsl:variable>
+ <xsl:call-template name="vykresliTabulku">
+ <xsl:with-param name="zadání" select="$zadání"/>
+ <xsl:with-param name="oddělovač" select="(@oddělovač, '\t+')[1]"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Tabulka načítaná ze souboru: -->
<xsl:template match="m:tabulka[@src]">
<xsl:call-template name="vykresliTabulku">
<xsl:with-param name="zadání" select="m:načti-textový-soubor(@src)"/>
@@ -46,6 +58,7 @@
</xsl:call-template>
</xsl:template>
+ <!-- TODO: Umožnit použití maker a značek uvnitř buněk tabulky. -->
<xsl:template name="vykresliTabulku">
<xsl:param name="zadání"/>
<xsl:param name="oddělovač"/>