Changeset 108:8d9cab64c335
- Timestamp:
- 07/05/12 20:13:56 (13 years ago)
- Author:
- František Kučera <franta-hg@…>
- Branch:
- default
- Message:
-
#20 Skriptování: výstupní formáty: text (prostý), xhtml (fragment), xml (celý dokument, může mít XML deklaraci).
- Files:
-
Legend:
- Unmodified
- Added
- Removed
-
|
r107
|
r108
|
|
| 11 | 11 | xmlns:xs="http://www.w3.org/2001/XMLSchema" |
| 12 | 12 | exclude-result-prefixes="fn h s k m xs"> |
| 13 | | |
| | 13 | |
| 14 | 14 | <!-- Vypíše verze z verzovacího systému: --> |
| 15 | 15 | <xsl:template match="m:hg-verze"> |
| | 16 | |
| 16 | 17 | <xsl:variable name="zadáníSkriptu"> |
| 17 | | <!-- |
| 18 | | TODO: |
| 19 | | Zahazovat XML deklaraci bychom mohli v Javě u všech skriptů… |
| 20 | | Nicméně současná dohoda je taková, že skripty vracejí fragment, ne celý dokument, |
| 21 | | což má výhodu v tom, že můžou vrátit kus textu a nějakou tu značku |
| 22 | | a nemusí to být zabalené v kořenovém elementu. |
| 23 | | |
| 24 | | --> |
| 25 | | <m:skript jazyk="bash" výstup="xml">hg log --style xml | awk '{if(NR>1)print}';</m:skript> |
| 26 | | <!-- |
| 27 | | Také bychom filtrování mohli provés ve skriptu… |
| 28 | | hg log … | xpath -e "//logentry[tag[starts-with(., 'v')]]" 2>/dev/null |
| 29 | | …ale to by bylo trochu zbytečně pracné. |
| 30 | | --> |
| | 18 | <m:skript jazyk="bash" výstup="xml">hg log --style xml</m:skript> |
| 31 | 19 | </xsl:variable> |
| 32 | 20 | |
| … |
… |
|
| 43 | 31 | </thead> |
| 44 | 32 | <tbody style="text-align: right;"> |
| 45 | | <!-- |
| 46 | | Výstup skriptu se bude nacházet v XHTML jmenném prostoru, což je obvykle v pořádku, |
| 47 | | ale pro mezivýsledky to není úplně vhodné. |
| 48 | | --> |
| 49 | 33 | <xsl:for-each select="$výstupSkriptu/h:log/h:logentry[h:tag[starts-with(text(), 'v')]]"> |
| 50 | 34 | <tr> |
-
|
r107
|
r108
|
|
| 7 | 7 | |
| 8 | 8 | <text xmlns="http://www.w3.org/1999/xhtml"> |
| 9 | | |
| | 9 | |
| 10 | 10 | <p> |
| 11 | 11 | Na stránkách můžeme používat skripty. |
| … |
… |
|
| 41 | 41 | V současnosti jsou podporované tyto jazyky: |
| 42 | 42 | </p> |
| 43 | | |
| | 43 | |
| 44 | 44 | <table> |
| 45 | 45 | <thead> |
| … |
… |
|
| 50 | 50 | </thead> |
| 51 | 51 | <tbody> |
| 52 | | <m:skript jazyk="perl" výstup="xml"><![CDATA[ |
| | 52 | <m:skript jazyk="perl" výstup="xhtml"><![CDATA[ |
| 53 | 53 | use strict; |
| 54 | 54 | use warnings; |
| … |
… |
|
| 112 | 112 | Ve skriptech máme dostupné následující proměnné prostředí: |
| 113 | 113 | </p> |
| 114 | | |
| | 114 | |
| 115 | 115 | <table> |
| 116 | 116 | <thead> |
| … |
… |
|
| 122 | 122 | <tbody> |
| 123 | 123 | <!-- Pokud načítáme skript ze souboru, je atribut jazyk nepovinný. --> |
| 124 | | <m:skript jazyk="perl" výstup="xml" src="skriptování-proměnné.pl"/> |
| | 124 | <m:skript jazyk="perl" výstup="xhtml" src="skriptování-proměnné.pl"/> |
| 125 | 125 | </tbody> |
| 126 | 126 | </table> |
| 127 | | |
| | 127 | |
| 128 | 128 | <p> |
| 129 | 129 | Kód: |
| 130 | 130 | </p> |
| 131 | | |
| | 131 | |
| 132 | 132 | <m:pre jazyk="xml"><![CDATA[<m:skript jazyk="bash"> |
| 133 | 133 | echo "URI: $XWG_STRANKA_URI"; |
| … |
… |
|
| 136 | 136 | echo "Perex: $XWG_STRANKA_PEREX"; |
| 137 | 137 | </m:skript>]]></m:pre> |
| 138 | | |
| | 138 | |
| 139 | 139 | <p>nám vypíše:</p> |
| 140 | | |
| | 140 | |
| 141 | 141 | <pre><m:skript jazyk="bash"><![CDATA[ |
| 142 | 142 | echo "URI: $XWG_STRANKA_URI" | sed s/\\/home\\/$USER/\\/home\\/xwg/g; |
| … |
… |
|
| 149 | 149 | <p> |
| 150 | 150 | XML generované skriptem může také obsahovat makra, která se následně interptetují. |
| 151 | | <m:skript jazyk="bash" výstup="xml"><![CDATA[ |
| | 151 | <m:skript jazyk="bash" výstup="xhtml"><![CDATA[ |
| 152 | 152 | echo '<m:skript jazyk="bash">'; # Ty zrůdo! :-) |
| 153 | 153 | echo 'echo "Takže můžeš skriptovat, když skriptuješ,";'; |
| … |
… |
|
| 157 | 157 | </p> |
| 158 | 158 | |
| 159 | | <m:skript jazyk="perl" výstup="xml"><![CDATA[ |
| | 159 | <m:skript jazyk="perl" výstup="xhtml"><![CDATA[ |
| 160 | 160 | use strict; |
| 161 | 161 | use warnings; |
| … |
… |
|
| 180 | 180 | closedir(DIR); |
| 181 | 181 | ]]></m:skript> |
| 182 | | |
| | 182 | |
| 183 | 183 | <p>…třeba vygenerovat tento diagram následujícím perlovským skriptem:</p> |
| 184 | | |
| | 184 | |
| 185 | 185 | <m:pre jazyk="perl"><![CDATA[ |
| 186 | 186 | use strict; |
| … |
… |
|
| 207 | 207 | |
| 208 | 208 | <p> |
| 209 | | Který vložíme zabalený v <code><![CDATA[<m:skript jazyk="perl" výstup="xml"> … </m:skript>]]></code> do stránky. |
| | 209 | Který vložíme zabalený v <code><![CDATA[<m:skript jazyk="perl" výstup="xhtml"> … </m:skript>]]></code> do stránky. |
| 210 | 210 | </p> |
| 211 | 211 | <p> |
-
|
r107
|
r108
|
|
| 41 | 41 | public class Skriptování { |
| 42 | 42 | |
| | 43 | private enum FORMÁT { |
| | 44 | |
| | 45 | xml, |
| | 46 | xhtml, |
| | 47 | text |
| | 48 | } |
| 43 | 49 | /** |
| 44 | 50 | * klíč = jazyk – např. bash |
| … |
… |
|
| 71 | 77 | 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 | 78 | 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)); |
| | 79 | return vyrobXml(výstupSkriptu, zjistiFormát(výstupníFormát)); |
| 74 | 80 | } |
| 75 | 81 | |
| … |
… |
|
| 170 | 176 | } |
| 171 | 177 | |
| | 178 | private static FORMÁT zjistiFormát(String výstupníFormát) { |
| | 179 | try { |
| | 180 | return FORMÁT.valueOf(výstupníFormát); |
| | 181 | } catch (NullPointerException e) { |
| | 182 | return FORMÁT.text; |
| | 183 | } catch (IllegalArgumentException e) { |
| | 184 | return FORMÁT.text; |
| | 185 | } |
| | 186 | } |
| | 187 | |
| 172 | 188 | /** |
| 173 | 189 | * @param zadání výstup vygenerovaný skriptem |
| … |
… |
|
| 176 | 192 | * @throws Exception |
| 177 | 193 | */ |
| 178 | | private static Source vyrobXml(String zadání, boolean xmlFormát) throws Exception { |
| | 194 | private static Source vyrobXml(String zadání, FORMÁT formát) throws Exception { |
| 179 | 195 | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); |
| 180 | 196 | DocumentBuilder db = dbf.newDocumentBuilder(); |
| 181 | 197 | Document d; |
| 182 | 198 | |
| 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 { |
| | 199 | |
| | 200 | if (formát == FORMÁT.text) { |
| 192 | 201 | d = db.newDocument(); |
| 193 | 202 | Node html = d.createElementNS(XHTML, "html"); |
| … |
… |
|
| 197 | 206 | html.appendChild(body); |
| 198 | 207 | d.appendChild(html); |
| | 208 | } else { |
| | 209 | if (formát == FORMÁT.xhtml) { |
| | 210 | zadání = "<html xmlns='" + XHTML + "' xmlns:m='" + MAKRO + "'><body>" + zadání + "</body></html>"; |
| | 211 | } |
| | 212 | try { |
| | 213 | d = db.parse(new ByteArrayInputStream(zadání.getBytes())); |
| | 214 | } catch (Exception e) { |
| | 215 | System.err.println("Chyba: Skript vrátil neplatné XML."); |
| | 216 | throw e; |
| | 217 | } |
| 199 | 218 | } |
| 200 | 219 | |
-
|
r107
|
r108
|
|
| 33 | 33 | * |
| 34 | 34 | @jazyk programovací jazyk, např. bash, perl, php (nepovinné, pokud je vyplněn atribut src) |
| 35 | | @výstup formát výstupu skriptu: text (výchozí) | xml (musí být validním fragmentem XML) |
| | 35 | @výstup formát výstupu skriptu: |
| | 36 | text – libovolný text, escapujeme (výchozí) |
| | 37 | xhtml – platný XML fragment, přidáme mu výchozí jmenný prostor XHTML a jmenný prostor pro makra |
| | 38 | xml – platný XML dokument – vhodné pro další zpracování v jiných makrech |
| 36 | 39 | @src soubor se skriptem/programem (volitelný parametr – buď zadáme skript do těla elementu, nebo nastavíme tento atribut) |
| 37 | 40 | --> |
| … |
… |
|
| 51 | 54 | //s:stránka/s:perex/text() |
| 52 | 55 | )"/> |
| 53 | | <xsl:apply-templates select="$výstupSkriptu/h:html/h:body/node()"/> |
| | 56 | <xsl:choose> |
| | 57 | <xsl:when test="@výstup = 'xml'"> |
| | 58 | <!-- XML výstup zpracujeme, jak je: --> |
| | 59 | <xsl:apply-templates select="$výstupSkriptu/*"/> |
| | 60 | </xsl:when> |
| | 61 | <xsl:otherwise> |
| | 62 | <!-- Prostý text a XHTML fragmenty dostáváme zabalené v html/body --> |
| | 63 | <xsl:apply-templates select="$výstupSkriptu/h:html/h:body/node()"/> |
| | 64 | </xsl:otherwise> |
| | 65 | </xsl:choose> |
| 54 | 66 | </xsl:when> |
| 55 | 67 | |
| … |
… |
|
| 60 | 72 | <xsl:message>Stránka obsahuje skripty, ale skripty jsou ignorovány – změnu lze provést ve web.conf.</xsl:message> |
| 61 | 73 | </xsl:when> |
| 62 | | <xsl:when test="$režim = 'vložit' and @výstup = 'xml'"> |
| | 74 | <xsl:when test="$režim = 'vložit' and (@výstup = 'xml' or @výstup = 'xhtml')"> |
| 63 | 75 | <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> |
| 64 | 76 | </xsl:when> |
| … |
… |
|
| 70 | 82 | <xsl:otherwise><!-- varovat = výchozí možnost --> |
| 71 | 83 | <xsl:choose> |
| 72 | | <xsl:when test="@výstup = 'xml'"> |
| | 84 | <xsl:when test="@výstup = 'xml' or @výstup = 'xhtml'"> |
| 73 | 85 | <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> |
| 74 | 86 | </xsl:when> |