# HG changeset patch # User František Kučera <franta-hg@frantovo.cz> # Date 1341523909 -7200 # Node ID d59023a42d4b13b19ae989f87fa5b3972b1dfa40 # Parent d43098fac7835194fe90f15eba4bf3bf2bfcf3b6 #20 Skriptování: vnořování maker – zadání tabulky nebo diagramu může být generované skriptem. diff -r d43098fac783 -r d59023a42d4b vstup/skriptování.xml --- 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> diff -r d43098fac783 -r d59023a42d4b šablona/makra/diagramy.xsl --- 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> diff -r d43098fac783 -r d59023a42d4b šablona/makra/tabulka.xsl --- 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č"/>