#20 Skriptování: výstupní formáty: text (prostý), xhtml (fragment), xml (celý dokument, může mít XML deklaraci).
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu, 05 Jul 2012 20:13:56 +0200
changeset 1088d9cab64c335
parent 107 379a2a893fd1
child 109 f9e3ee9cc924
#20 Skriptování: výstupní formáty: text (prostý), xhtml (fragment), xml (celý dokument, může mít XML deklaraci).
vstup/makra/hg-verze.xsl
vstup/skriptování.xml
šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
šablona/makra/skriptování.xsl
     1.1 --- a/vstup/makra/hg-verze.xsl	Thu Jul 05 19:10:42 2012 +0200
     1.2 +++ b/vstup/makra/hg-verze.xsl	Thu Jul 05 20:13:56 2012 +0200
     1.3 @@ -10,24 +10,12 @@
     1.4  	xmlns:svg="http://www.w3.org/2000/svg"
     1.5  	xmlns:xs="http://www.w3.org/2001/XMLSchema"
     1.6  	exclude-result-prefixes="fn h s k m xs">
     1.7 -
     1.8 +	
     1.9  	<!-- Vypíše verze z verzovacího systému: -->
    1.10  	<xsl:template match="m:hg-verze">
    1.11 +
    1.12  		<xsl:variable name="zadáníSkriptu">
    1.13 -			<!--
    1.14 -				TODO:
    1.15 -				Zahazovat XML deklaraci bychom mohli v Javě u všech skriptů… 
    1.16 -				Nicméně současná dohoda je taková, že skripty vracejí fragment, ne celý dokument,
    1.17 -				což má výhodu v tom, že můžou vrátit kus textu a nějakou tu značku
    1.18 -				a nemusí to být zabalené v kořenovém elementu.
    1.19 -				
    1.20 -			-->
    1.21 -			<m:skript jazyk="bash" výstup="xml">hg log --style xml | awk '{if(NR&gt;1)print}';</m:skript>
    1.22 -			<!--
    1.23 -				Také bychom filtrování mohli provés ve skriptu…
    1.24 -				hg log … | xpath -e "//logentry[tag[starts-with(., 'v')]]" 2>/dev/null
    1.25 -				 …ale to by bylo trochu zbytečně pracné.
    1.26 -			-->
    1.27 +			<m:skript jazyk="bash" výstup="xml">hg log --style xml</m:skript>
    1.28  		</xsl:variable>
    1.29  
    1.30  		<xsl:variable name="výstupSkriptu">
    1.31 @@ -42,10 +30,6 @@
    1.32  				</tr>
    1.33  			</thead>
    1.34  			<tbody style="text-align: right;">
    1.35 -				<!--
    1.36 -					Výstup skriptu se bude nacházet v XHTML jmenném prostoru, což je obvykle v pořádku,
    1.37 -					ale pro mezivýsledky to není úplně vhodné.
    1.38 -				-->
    1.39  				<xsl:for-each select="$výstupSkriptu/h:log/h:logentry[h:tag[starts-with(text(), 'v')]]">
    1.40  					<tr>
    1.41  						<td><xsl:value-of select="substring(h:tag/text(), 2)"/></td>
     2.1 --- a/vstup/skriptování.xml	Thu Jul 05 19:10:42 2012 +0200
     2.2 +++ b/vstup/skriptování.xml	Thu Jul 05 20:13:56 2012 +0200
     2.3 @@ -6,7 +6,7 @@
     2.4  	<pořadí>50</pořadí>
     2.5  
     2.6  	<text xmlns="http://www.w3.org/1999/xhtml">
     2.7 -	
     2.8 +
     2.9  		<p>
    2.10  			Na stránkách můžeme používat skripty.
    2.11  			Spouští se při generování a jejich standardní výstup se vloží do stránky.
    2.12 @@ -40,7 +40,7 @@
    2.13  		<p>
    2.14  			V současnosti jsou podporované tyto jazyky:
    2.15  		</p>
    2.16 -		
    2.17 +
    2.18  		<table>
    2.19  			<thead>
    2.20  				<tr>
    2.21 @@ -49,7 +49,7 @@
    2.22  				</tr>
    2.23  			</thead>
    2.24  			<tbody>
    2.25 -				<m:skript jazyk="perl" výstup="xml"><![CDATA[
    2.26 +				<m:skript jazyk="perl" výstup="xhtml"><![CDATA[
    2.27  use strict;
    2.28  use warnings;
    2.29  
    2.30 @@ -111,7 +111,7 @@
    2.31  			<p>
    2.32  				Ve skriptech máme dostupné následující proměnné prostředí:
    2.33  			</p>
    2.34 -			
    2.35 +
    2.36  			<table>
    2.37  				<thead>
    2.38  					<tr>
    2.39 @@ -121,23 +121,23 @@
    2.40  				</thead>
    2.41  				<tbody>
    2.42  					<!-- Pokud načítáme skript ze souboru, je atribut jazyk nepovinný. -->
    2.43 -					<m:skript jazyk="perl" výstup="xml" src="skriptování-proměnné.pl"/>
    2.44 +					<m:skript jazyk="perl" výstup="xhtml" src="skriptování-proměnné.pl"/>
    2.45  				</tbody>
    2.46  			</table>
    2.47 -			
    2.48 +
    2.49  			<p>
    2.50  				Kód:
    2.51  			</p>
    2.52 -			
    2.53 +
    2.54  			<m:pre jazyk="xml"><![CDATA[<m:skript jazyk="bash">
    2.55  echo "URI:    $XWG_STRANKA_URI";
    2.56  echo "Soubor: $XWG_STRANKA_SOUBOR";
    2.57  echo "Nadpis: $XWG_STRANKA_NADPIS";
    2.58  echo "Perex:  $XWG_STRANKA_PEREX";
    2.59  </m:skript>]]></m:pre>
    2.60 -			
    2.61 +
    2.62  			<p>nám vypíše:</p>
    2.63 -			
    2.64 +
    2.65  			<pre><m:skript jazyk="bash"><![CDATA[
    2.66  echo "URI:    $XWG_STRANKA_URI" | sed s/\\/home\\/$USER/\\/home\\/xwg/g;
    2.67  echo "Soubor: $XWG_STRANKA_SOUBOR" | sed s/\\/home\\/$USER/\\/home\\/xwg/g;
    2.68 @@ -148,7 +148,7 @@
    2.69  		<h2>Makra ve skriptech</h2>
    2.70  		<p>
    2.71  			XML generované skriptem může také obsahovat makra, která se následně interptetují.
    2.72 -			<m:skript jazyk="bash" výstup="xml"><![CDATA[
    2.73 +			<m:skript jazyk="bash" výstup="xhtml"><![CDATA[
    2.74  echo '<m:skript jazyk="bash">'; # Ty zrůdo! :-)
    2.75  echo 'echo "Takže můžeš skriptovat, když skriptuješ,";';
    2.76  echo '</m:skript>';
    2.77 @@ -156,7 +156,7 @@
    2.78  			nebo dělat něco užitečnějšího.
    2.79  		</p>
    2.80  		
    2.81 -		<m:skript jazyk="perl" výstup="xml"><![CDATA[
    2.82 +		<m:skript jazyk="perl" výstup="xhtml"><![CDATA[
    2.83  use strict;
    2.84  use warnings;
    2.85  
    2.86 @@ -179,9 +179,9 @@
    2.87  print "</m:diagram>";
    2.88  closedir(DIR);
    2.89  		]]></m:skript>
    2.90 -		
    2.91 +
    2.92  		<p>…třeba vygenerovat tento diagram následujícím perlovským skriptem:</p>
    2.93 -		
    2.94 +
    2.95  		<m:pre jazyk="perl"><![CDATA[
    2.96  use strict;
    2.97  use warnings;
    2.98 @@ -206,7 +206,7 @@
    2.99  closedir(DIR);]]></m:pre>
   2.100  
   2.101  		<p>
   2.102 -			Který vložíme zabalený v <code><![CDATA[<m:skript jazyk="perl" výstup="xml"> … </m:skript>]]></code> do stránky.
   2.103 +			Který vložíme zabalený v <code><![CDATA[<m:skript jazyk="perl" výstup="xhtml"> … </m:skript>]]></code> do stránky.
   2.104  		</p>
   2.105  		<p>
   2.106  			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í).
     3.1 --- a/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java	Thu Jul 05 19:10:42 2012 +0200
     3.2 +++ b/šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java	Thu Jul 05 20:13:56 2012 +0200
     3.3 @@ -40,6 +40,12 @@
     3.4   */
     3.5  public class Skriptování {
     3.6  
     3.7 +	private enum FORMÁT {
     3.8 +
     3.9 +		xml,
    3.10 +		xhtml,
    3.11 +		text
    3.12 +	}
    3.13  	/**
    3.14  	 * klíč = jazyk – např. bash
    3.15  	 * hodnota = interpret – např. /bin/bash
    3.16 @@ -70,7 +76,7 @@
    3.17  	 */
    3.18  	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 {
    3.19  		String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky);
    3.20 -		return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát));
    3.21 +		return vyrobXml(výstupSkriptu, zjistiFormát(výstupníFormát));
    3.22  	}
    3.23  
    3.24  	private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception {
    3.25 @@ -169,26 +175,29 @@
    3.26  		return !(s == null || s.trim().isEmpty());
    3.27  	}
    3.28  
    3.29 +	private static FORMÁT zjistiFormát(String výstupníFormát) {
    3.30 +		try {
    3.31 +			return FORMÁT.valueOf(výstupníFormát);
    3.32 +		} catch (NullPointerException e) {
    3.33 +			return FORMÁT.text;
    3.34 +		} catch (IllegalArgumentException e) {
    3.35 +			return FORMÁT.text;
    3.36 +		}
    3.37 +	}
    3.38 +
    3.39  	/**
    3.40  	 * @param zadání výstup vygenerovaný skriptem
    3.41  	 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text
    3.42  	 * @return xml fragment nebo prostý text zabalený do html/body
    3.43  	 * @throws Exception
    3.44  	 */
    3.45 -	private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception {
    3.46 +	private static Source vyrobXml(String zadání, FORMÁT formát) throws Exception {
    3.47  		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    3.48  		DocumentBuilder db = dbf.newDocumentBuilder();
    3.49  		Document d;
    3.50  
    3.51 -		if (xmlFormát) {
    3.52 -			try {
    3.53 -				zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>";
    3.54 -				d = db.parse(new ByteArrayInputStream(zadání.getBytes()));
    3.55 -			} catch (Exception e) {
    3.56 -				System.err.println("Chyba: Skript vrátil neplatné XML.");
    3.57 -				throw e;
    3.58 -			}
    3.59 -		} else {
    3.60 +
    3.61 +		if (formát == FORMÁT.text) {
    3.62  			d = db.newDocument();
    3.63  			Node html = d.createElementNS(XHTML, "html");
    3.64  			Node body = d.createElementNS(XHTML, "body");
    3.65 @@ -196,6 +205,16 @@
    3.66  			body.appendChild(text);
    3.67  			html.appendChild(body);
    3.68  			d.appendChild(html);
    3.69 +		} else {
    3.70 +			if (formát == FORMÁT.xhtml) {
    3.71 +				zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>";
    3.72 +			}
    3.73 +			try {
    3.74 +				d = db.parse(new ByteArrayInputStream(zadání.getBytes()));
    3.75 +			} catch (Exception e) {
    3.76 +				System.err.println("Chyba: Skript vrátil neplatné XML.");
    3.77 +				throw e;
    3.78 +			}
    3.79  		}
    3.80  
    3.81  		return new DOMSource(d);
     4.1 --- a/šablona/makra/skriptování.xsl	Thu Jul 05 19:10:42 2012 +0200
     4.2 +++ b/šablona/makra/skriptování.xsl	Thu Jul 05 20:13:56 2012 +0200
     4.3 @@ -32,7 +32,10 @@
     4.4  		Provedeme skript zadaný v těle elementu nebo v souboru a jeho výstup vložíme do stránky.
     4.5  		*
     4.6  		@jazyk programovací jazyk, např. bash, perl, php (nepovinné, pokud je vyplněn atribut src)
     4.7 -		@výstup formát výstupu skriptu: text (výchozí) | xml (musí být validním fragmentem XML)
     4.8 +		@výstup formát výstupu skriptu:
     4.9 +			text – libovolný text, escapujeme (výchozí)
    4.10 +			xhtml – platný XML fragment, přidáme mu výchozí jmenný prostor XHTML a jmenný prostor pro makra
    4.11 +			xml – platný XML dokument – vhodné pro další zpracování v jiných makrech
    4.12  		@src soubor se skriptem/programem (volitelný parametr – buď zadáme skript do těla elementu, nebo nastavíme tento atribut)
    4.13  	-->
    4.14  	<xsl:template match="m:skript">
    4.15 @@ -50,7 +53,16 @@
    4.16  																	//s:stránka/s:nadpis/text(),
    4.17  																	//s:stránka/s:perex/text()
    4.18  																)"/>
    4.19 -				<xsl:apply-templates select="$výstupSkriptu/h:html/h:body/node()"/>
    4.20 +				<xsl:choose>
    4.21 +					<xsl:when test="@výstup = 'xml'">
    4.22 +						<!-- XML výstup zpracujeme, jak je: -->
    4.23 +						<xsl:apply-templates select="$výstupSkriptu/*"/>
    4.24 +					</xsl:when>
    4.25 +					<xsl:otherwise>
    4.26 +						<!-- Prostý text a XHTML fragmenty dostáváme zabalené v html/body -->
    4.27 +						<xsl:apply-templates select="$výstupSkriptu/h:html/h:body/node()"/>
    4.28 +					</xsl:otherwise>
    4.29 +				</xsl:choose>
    4.30  			</xsl:when>
    4.31  
    4.32  			<xsl:when test="$režim = 'zakázat'">
    4.33 @@ -59,7 +71,7 @@
    4.34  			<xsl:when test="$režim = 'ignorovat'">
    4.35  				<xsl:message>Stránka obsahuje skripty, ale skripty jsou ignorovány – změnu lze provést ve web.conf.</xsl:message>
    4.36  			</xsl:when>
    4.37 -			<xsl:when test="$režim = 'vložit' and @výstup = 'xml'">
    4.38 +			<xsl:when test="$režim = 'vložit' and (@výstup = 'xml' or @výstup = 'xhtml')">
    4.39  				<xsl:message>Není možné jen tak vložit text, který měl mít výstup ve formátu XML – změnu lze provést ve web.conf</xsl:message>
    4.40  			</xsl:when>
    4.41  			<xsl:when test="$režim = 'vložit'">
    4.42 @@ -69,7 +81,7 @@
    4.43  			</xsl:when>
    4.44  			<xsl:otherwise><!-- varovat = výchozí možnost -->
    4.45  				<xsl:choose>
    4.46 -					<xsl:when test="@výstup = 'xml'">
    4.47 +					<xsl:when test="@výstup = 'xml' or @výstup = 'xhtml'">
    4.48  						<xsl:message>Není možné možné vložit varování na místo, kde měl být skript generující XML – změnu lze provést ve web.conf</xsl:message>
    4.49  					</xsl:when>
    4.50  					<xsl:otherwise>