Changeset 108:8d9cab64c335
- Timestamp:
- 07/05/12 20:13:56 (12 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> |