#20 Skriptování: uvnitř zadání skriptu lze používat jiná makra (interpretují se před provedením skriptu).
authorFrantišek Kučera <franta-hg@frantovo.cz>
Fri, 06 Jul 2012 14:52:05 +0200
changeset 113 18bf0044f5ab
parent 112 7d4b23ccf144
child 114 9302cf6856ea
#20 Skriptování: uvnitř zadání skriptu lze používat jiná makra (interpretují se před provedením skriptu).
vstup/kontakt.xml
vstup/makra/firma.xsl
vstup/skriptování.xml
šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java
šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
šablona/makra/skriptování.xsl
--- a/vstup/kontakt.xml	Fri Jul 06 13:41:35 2012 +0200
+++ b/vstup/kontakt.xml	Fri Jul 06 14:52:05 2012 +0200
@@ -10,6 +10,7 @@
 		</p>
 		<p>
 			<strong>Naše adresa:</strong><br/>
+			<m:firma/><br/>
 			Polární 128<br/>
 			Tučňákova Lhota<br/>
 			Česká republika
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vstup/makra/firma.xsl	Fri Jul 06 14:52:05 2012 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+	xmlns="http://www.w3.org/1999/xhtml"
+	xmlns:h="http://www.w3.org/1999/xhtml"
+	xmlns:s="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
+	xmlns:k="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/konfigurace"
+	xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+	xmlns:fn="http://www.w3.org/2005/xpath-functions"
+	xmlns:svg="http://www.w3.org/2000/svg"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	exclude-result-prefixes="fn h s k m xs">
+
+	<!-- Vypíše název naší firmy: -->
+	<xsl:template match="m:firma">
+		<xsl:text>Chovatelská stanice a.s.</xsl:text>
+	</xsl:template>
+
+</xsl:stylesheet>
--- a/vstup/skriptování.xml	Fri Jul 06 13:41:35 2012 +0200
+++ b/vstup/skriptování.xml	Fri Jul 06 14:52:05 2012 +0200
@@ -145,7 +145,7 @@
 echo "Perex:  $XWG_STRANKA_PEREX";
 		]]></m:skript></pre>
 
-		<h2 id="makraVeSkriptech">Makra ve skriptech</h2>
+		<h2 id="makraZeSkriptů">Makra ze skriptů</h2>
 		<p>
 			XML generované skriptem může také obsahovat makra, která se následně interptetují.
 			<m:skript jazyk="bash" výstup="xhtml"><![CDATA[
@@ -214,9 +214,38 @@
 			Známá chyba: ve skriptech zatím nefungují poznámky pod čarou (a není jisté, jestli kdy fungovat budou – pravděpodobně by to vyžadovalo vícefázové zpracování).
 		</p>
 
+		<h2>Makra ve skriptech</h2>
+		
+		<p>
+			Uvnitř zdrojového kódu skriptu můžeme používat jiná makra.
+			Např. tento kód:
+		</p>
+
+		<m:pre jazyk="xml"><![CDATA[<pre>
+	<m:skript jazyk="bash">
+		echo "Náš podnik se jmenuje <m:firma/>";
+	</m:skript>
+</pre>]]></m:pre>
+
+		<p>
+			nám vygeneruje:
+		</p>
+
+		<pre><m:skript jazyk="bash">
+				echo "Náš podnik se jmenuje <m:firma/>";
+		</m:skript></pre>
+
+		<p>
+			Můžete si tak vytvořit makra pro opakující se části
+			a používat je jak v textu stránek, tak ve skriptech nebo diagramech.
+			Jen pozor na ošetření zvláštních znaků – pokud text takové znaky obsahuje,
+			je dobré ho zabalit ještě do jedné značky, která se postará o <em>escapování</em> 
+			pro daný kontext (skriptovací jazyk a prostředí v něm – např. apostrofy vs. uvozovky).
+		</p>
+
 		<h2>Skripty v makrech</h2>
 		<p>
-			Uvnitř maker můžeme volat<m:podČarou>
+			Uvnitř definic maker můžeme volat<m:podČarou>
 				Ovšem trochu jiným způsobem, než ve stránkách –
 				nacházíme se totiž v <em>programu</em> (XSL šablona definující makro)
 				nikoli v <em>datovém souboru</em> (XML stránka).
@@ -281,7 +310,7 @@
 		-->
 
 		<p>
-			Podobně bychom mohli postupovat i u <a href="#makraVeSkriptech">diagramu</a> –
+			Podobně bychom mohli postupovat i u <a href="#makraZeSkriptů">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>
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Fri Jul 06 13:41:35 2012 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/Funkce.java	Fri Jul 06 14:52:05 2012 +0200
@@ -1,36 +1,37 @@
 /**
  * XML Web generátor – program na generování webových stránek
  * Copyright © 2012 František Kučera (frantovo.cz)
- * 
+ *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 package cz.frantovo.xmlWebGenerator;
 
 import java.io.File;
-import java.util.Date;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Date;
 
 /**
  * Společná knihovna funkcí volaných z XSLT
- *  
+ *
  * @author František Kučera (frantovo.cz)
  */
 public class Funkce {
 
 	/**
 	 * Zjištuje, kdy byl naposledy daný soubor změněn.
+	 *
 	 * @param soubor cesta k souboru
 	 * @return datum poslední změny
 	 * @throws URISyntaxException
@@ -40,5 +41,16 @@
 		File f = new File(uri);
 		return new Date(f.lastModified());
 	}
+
+	public static String spojText(String[] kusyTextu) {
+		if (kusyTextu == null || kusyTextu.length < 1) {
+			return null;
+		} else {
+			StringBuilder sb = new StringBuilder();
+			for (int i = 0; i < kusyTextu.length; i++) {
+				sb.append(kusyTextu[i]);
+			}
+			return sb.toString();
+		}
+	}
 }
-
--- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java	Fri Jul 06 13:41:35 2012 +0200
+++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java	Fri Jul 06 14:52:05 2012 +0200
@@ -18,6 +18,7 @@
 package cz.frantovo.xmlWebGenerator.makra;
 
 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud;
+import static cz.frantovo.xmlWebGenerator.Funkce.spojText;
 import static cz.frantovo.xmlWebGenerator.Xmlns.*;
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -74,8 +75,8 @@
 	 * @param perexStránky perex stránky → proměnná prostředí
 	 * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource)
 	 */
-	public static Source interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
-		String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky);
+	public static Source interpretuj(String[] skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
+		String výstupSkriptu = získejVýstupSkriptu(spojText(skriptText), skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky);
 		return vyrobXml(výstupSkriptu, zjistiFormát(výstupníFormát));
 	}
 
--- a/šablona/makra/skriptování.xsl	Fri Jul 06 13:41:35 2012 +0200
+++ b/šablona/makra/skriptování.xsl	Fri Jul 06 14:52:05 2012 +0200
@@ -44,8 +44,11 @@
 		
 		<xsl:choose>
 			<xsl:when test="$režim = 'povolit'">
+				<xsl:variable name="zadáníSkriptu">
+					<xsl:apply-templates select="*|text()"/>
+				</xsl:variable>
 				<xsl:variable name="výstupSkriptu" select="j:interpretuj(
-																	text(),
+																	$zadáníSkriptu,
 																	@src,
 																	@jazyk,
 																	@výstup,