#20 Skriptování: vnořování maker – zadání tabulky nebo diagramu může být generované skriptem.
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu Jul 05 23:31:49 2012 +0200 (2012-07-05)
changeset 111d59023a42d4b
parent 110 d43098fac783
child 112 7d4b23ccf144
#20 Skriptování: vnořování maker – zadání tabulky nebo diagramu může být generované skriptem.
vstup/skriptování.xml
šablona/makra/diagramy.xsl
šablona/makra/tabulka.xsl
     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 +	]]]]>&gt;<![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č"/>