Changeset 107:379a2a893fd1
- Timestamp:
- 07/05/12 19:10:42 (12 years ago)
- Branch:
- default
- Files:
-
- 2 added
- 3 modified
Legend:
- Unmodified
- Added
- Removed
-
vstup/skriptování.xml
r105 r107 23 23 <p> 24 24 Díky skriptování můžeme stránky obohatit o prakticky libovolný obsah – 25 jak prostý text, tak i XHTML fragmenty.<m:podČarou>zapíná se pomocí atributu 26 <code>výstup="xml"</code> a generátor pak kontroluje správné formátování – 27 nestane se vám, že byste omylem vygenerovali stránky s překříženými nebo neuzavřenými značkami.</m:podČarou> 25 jak prostý text, tak i XHTML fragmenty.<m:podČarou> 26 Zapíná se pomocí atributu <code>výstup="xml"</code> a generátor pak kontroluje správné formátování – 27 nestane se vám, že byste omylem vygenerovali stránky s překříženými nebo neuzavřenými značkami. 28 Výchozím jmenným prostorem je XHTML a je dostupný i jmenný prostor pro makra (<code>m</code>). 29 </m:podČarou> 28 30 </p> 29 31 <p> … … 63 65 </table> 64 66 65 <h2>Perl </h2>67 <h2>Perl – ukázka</h2> 66 68 <p>Jazyky použité nebo citované na této stránce:</p> 67 69 <!-- … … 87 89 ]]></m:skript></pre> 88 90 89 <h2>BASH </h2>91 <h2>BASH – ukázka</h2> 90 92 <pre><m:skript jazyk="bash"><![CDATA[ 91 93 echo -n "Právě je: "; … … 144 146 ]]></m:skript></pre> 145 147 148 <h2>Makra ve skriptech</h2> 149 <p> 150 XML generované skriptem může také obsahovat makra, která se následně interptetují. 151 <m:skript jazyk="bash" výstup="xml"><![CDATA[ 152 echo '<m:skript jazyk="bash">'; # Ty zrůdo! :-) 153 echo 'echo "Takže můžeš skriptovat, když skriptuješ,";'; 154 echo '</m:skript>'; 155 ]]></m:skript> 156 nebo dělat něco užitečnějšího. 157 </p> 158 159 <m:skript jazyk="perl" výstup="xml"><![CDATA[ 160 use strict; 161 use warnings; 162 163 my $adresar = "vstup/makra"; 164 165 print "<m:diagram nadpis='Uživatelská makra v adresáři $adresar'>\n"; 166 print " node [shape=\"box\"];\n"; 167 print " koren [label=\"Uživatelská makra\"];\n"; 168 169 opendir(DIR, $adresar) or die $!; 170 my $i = 0; 171 while (readdir(DIR)) { 172 next if (/^\./); 173 # Měli bychom ošetřit zvláštní znaky v názvech souborů, 174 # abychom nezpůsobili chybu GraphVizu. 175 print "n$i [label=\"$_\"];\n"; 176 print "koren -> n$i;\n"; 177 $i++; 178 } 179 print "</m:diagram>"; 180 closedir(DIR); 181 ]]></m:skript> 182 183 <p>…třeba vygenerovat tento diagram následujícím perlovským skriptem:</p> 184 185 <m:pre jazyk="perl"><![CDATA[ 186 use strict; 187 use warnings; 188 189 my $adresar = "vstup/makra"; 190 191 print "<m:diagram nadpis='Uživatelská makra v adresáři $adresar'>\n"; 192 print " node [shape=\"box\"];\n"; 193 print " koren [label=\"Uživatelská makra\"];\n"; 194 195 opendir(DIR, $adresar) or die $!; 196 my $i = 0; 197 while (readdir(DIR)) { 198 next if (/^\./); 199 # Měli bychom ošetřit zvláštní znaky v názvech souborů, 200 # abychom nezpůsobili chybu GraphVizu. 201 print "n$i [label=\"$_\"];\n"; 202 print "koren -> n$i;\n"; 203 $i++; 204 } 205 print "</m:diagram>"; 206 closedir(DIR);]]></m:pre> 207 208 <p> 209 Který vložíme zabalený v <code><![CDATA[<m:skript jazyk="perl" výstup="xml"> … </m:skript>]]></code> do stránky. 210 </p> 211 <p> 212 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í). 213 </p> 214 215 <h2>Skripty v makrech</h2> 216 <p> 217 Uvnitř maker můžeme volat<m:podČarou> 218 Ovšem trochu jiným způsobem, než ve stránkách – 219 nacházíme se totiž v <em>programu</em> (XSL šablona definující makro) 220 nikoli v <em>datovém souboru</em> (XML stránka). 221 </m:podČarou> 222 jiná makra – mj. skripty. 223 Toho jsme využili v makru, které generuje tabulku verzí z mercurialu: 224 </p> 225 226 <m:hg-verze/> 227 228 <p> 229 Toto makro naleznete v souboru <code>vstup/makra/hg-verze.xsl</code>. 230 </p> 231 146 232 </text> 147 233 -
šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java
r103 r107 19 19 20 20 import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; 21 import static cz.frantovo.xmlWebGenerator.Xmlns.*; 21 22 import java.io.ByteArrayInputStream; 22 23 import java.io.File; … … 28 29 import javax.xml.parsers.DocumentBuilder; 29 30 import javax.xml.parsers.DocumentBuilderFactory; 31 import javax.xml.transform.Source; 32 import javax.xml.transform.dom.DOMSource; 30 33 import org.w3c.dom.Document; 34 import org.w3c.dom.Node; 31 35 32 36 /** … … 63 67 * @param nadpisStránky nadpis stránky → proměnná prostředí 64 68 * @param perexStránky perex stránky → proměnná prostředí 65 * @return výstup příkazu 69 * @return výstup příkazu buď jako textový řetězec nebo jako XML (DOMSource) 66 70 */ 67 public static String interpretuj(String skriptText, String skriptSoubor, String jazyk, String výstupníFormát, String uriStránky, String nadpisStránky, String perexStránky) { 71 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 { 72 String výstupSkriptu = získejVýstupSkriptu(skriptText, skriptSoubor, jazyk, uriStránky, nadpisStránky, perexStránky); 73 return vyrobXml(výstupSkriptu, "xml".equals(výstupníFormát)); 74 } 75 76 private static String získejVýstupSkriptu(String skriptText, String skriptSoubor, String jazyk, String uriStránky, String nadpisStránky, String perexStránky) throws Exception { 77 68 78 try { 69 79 if (isNeprázdný(skriptSoubor)) { … … 137 147 } 138 148 139 return připravVýstup(výsledek, výstupníFormát);149 return výsledek.trim(); 140 150 } else { 141 151 System.err.println("--- Standardní výstup skriptu: -----"); … … 147 157 } 148 158 } catch (Exception e) { 149 System.err.println("Došlo k chybě při vykonávání skriptu v jazyce: " + jazyk);159 System.err.println("Došlo k chybě při vykonávání skriptu."); 150 160 System.err.println("--------"); 151 161 System.err.println(skriptText); 152 162 System.err.println("--------"); 153 163 e.printStackTrace(System.err); 154 return null; 155 } 156 } 157 158 private static String připravVýstup(String výsledek, String formát) { 159 if ("xml".equals(formát)) { 160 if (zkontrolujXml(výsledek)) { 161 return výsledek.trim(); 162 } else { 163 System.err.println("Chyba v XML generovaném skriptem:"); 164 System.err.println(výsledek); 165 return null; 166 } 167 } else { 168 return výsledek.trim(); 164 throw e; 169 165 } 170 166 } … … 175 171 176 172 /** 177 * @param xml fragment XML vygenerovaný skriptem 178 * @return true v případě, že výstup je validním fragmentem XML 173 * @param zadání výstup vygenerovaný skriptem 174 * @param xmlFormát formát zadání: true = xml fragment | false = prostý text 175 * @return xml fragment nebo prostý text zabalený do html/body 176 * @throws Exception 179 177 */ 180 private static boolean zkontrolujXml(String xml) { 181 try { 182 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 183 DocumentBuilder db = dbf.newDocumentBuilder(); 184 xml = "<xml>" + xml + "</xml>"; 185 Document d = db.parse(new ByteArrayInputStream(xml.getBytes())); 186 return true; 187 } catch (Exception e) { 188 e.printStackTrace(System.err); 189 return false; 178 private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception { 179 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 180 DocumentBuilder db = dbf.newDocumentBuilder(); 181 Document d; 182 183 if (xmlFormát) { 184 try { 185 zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>"; 186 d = db.parse(new ByteArrayInputStream(zadání.getBytes())); 187 } catch (Exception e) { 188 System.err.println("Chyba: Skript vrátil neplatné XML."); 189 throw e; 190 } 191 } else { 192 d = db.newDocument(); 193 Node html = d.createElementNS(XHTML, "html"); 194 Node body = d.createElementNS(XHTML, "body"); 195 Node text = d.createTextNode(zadání); 196 body.appendChild(text); 197 html.appendChild(body); 198 d.appendChild(html); 190 199 } 200 201 return new DOMSource(d); 191 202 } 192 203 } -
šablona/makra/skriptování.xsl
r106 r107 19 19 <xsl:stylesheet version="2.0" 20 20 xmlns="http://www.w3.org/1999/xhtml" 21 xmlns:h="http://www.w3.org/1999/xhtml" 21 22 xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro" 22 23 xmlns:j="java:cz.frantovo.xmlWebGenerator.makra.Skriptování" … … 50 51 //s:stránka/s:perex/text() 51 52 )"/> 52 <xsl:choose> 53 <xsl:when test="$výstupSkriptu"> 54 <xsl:choose> 55 <xsl:when test="@výstup = 'xml'"><xsl:value-of select="$výstupSkriptu" disable-output-escaping="yes"/></xsl:when> 56 <xsl:otherwise><xsl:value-of select="$výstupSkriptu"/></xsl:otherwise> 57 </xsl:choose> 58 </xsl:when> 59 <xsl:otherwise> 60 <xsl:message terminate="yes">Při interpretaci skriptu došlo k chybě.</xsl:message> 61 </xsl:otherwise> 62 </xsl:choose> 53 <xsl:apply-templates select="$výstupSkriptu/h:html/h:body/node()"/> 63 54 </xsl:when> 64 55