#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, 05 Jul 2012 23:31:49 +0200
changeset 111 d59023a42d4b
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
--- 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";
+			}
+		}
+	]]]]>&gt;<![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č"/>