Changeset 108:8d9cab64c335

Show
Ignore:
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:
4 modified

Legend:

Unmodified
Added
Removed
  • vstup/makra/hg-verze.xsl

    r107 r108  
    1111        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    1212        exclude-result-prefixes="fn h s k m xs"> 
    13  
     13         
    1414        <!-- Vypíše verze z verzovacího systému: --> 
    1515        <xsl:template match="m:hg-verze"> 
     16 
    1617                <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&gt;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> 
    3119                </xsl:variable> 
    3220 
     
    4331                        </thead> 
    4432                        <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                                 --> 
    4933                                <xsl:for-each select="$výstupSkriptu/h:log/h:logentry[h:tag[starts-with(text(), 'v')]]"> 
    5034                                        <tr> 
  • vstup/skriptování.xml

    r107 r108  
    77 
    88        <text xmlns="http://www.w3.org/1999/xhtml"> 
    9          
     9 
    1010                <p> 
    1111                        Na stránkách můžeme používat skripty. 
     
    4141                        V současnosti jsou podporované tyto jazyky: 
    4242                </p> 
    43                  
     43 
    4444                <table> 
    4545                        <thead> 
     
    5050                        </thead> 
    5151                        <tbody> 
    52                                 <m:skript jazyk="perl" výstup="xml"><![CDATA[ 
     52                                <m:skript jazyk="perl" výstup="xhtml"><![CDATA[ 
    5353use strict; 
    5454use warnings; 
     
    112112                                Ve skriptech máme dostupné následující proměnné prostředí: 
    113113                        </p> 
    114                          
     114 
    115115                        <table> 
    116116                                <thead> 
     
    122122                                <tbody> 
    123123                                        <!-- 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"/> 
    125125                                </tbody> 
    126126                        </table> 
    127                          
     127 
    128128                        <p> 
    129129                                Kód: 
    130130                        </p> 
    131                          
     131 
    132132                        <m:pre jazyk="xml"><![CDATA[<m:skript jazyk="bash"> 
    133133echo "URI:    $XWG_STRANKA_URI"; 
     
    136136echo "Perex:  $XWG_STRANKA_PEREX"; 
    137137</m:skript>]]></m:pre> 
    138                          
     138 
    139139                        <p>nám vypíše:</p> 
    140                          
     140 
    141141                        <pre><m:skript jazyk="bash"><![CDATA[ 
    142142echo "URI:    $XWG_STRANKA_URI" | sed s/\\/home\\/$USER/\\/home\\/xwg/g; 
     
    149149                <p> 
    150150                        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[ 
    152152echo '<m:skript jazyk="bash">'; # Ty zrůdo! :-) 
    153153echo 'echo "Takže můžeš skriptovat, když skriptuješ,";'; 
     
    157157                </p> 
    158158                 
    159                 <m:skript jazyk="perl" výstup="xml"><![CDATA[ 
     159                <m:skript jazyk="perl" výstup="xhtml"><![CDATA[ 
    160160use strict; 
    161161use warnings; 
     
    180180closedir(DIR); 
    181181                ]]></m:skript> 
    182                  
     182 
    183183                <p>…třeba vygenerovat tento diagram následujícím perlovským skriptem:</p> 
    184                  
     184 
    185185                <m:pre jazyk="perl"><![CDATA[ 
    186186use strict; 
     
    207207 
    208208                <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. 
    210210                </p> 
    211211                <p> 
  • šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java

    r107 r108  
    4141public class Skriptování { 
    4242 
     43        private enum FORMÁT { 
     44 
     45                xml, 
     46                xhtml, 
     47                text 
     48        } 
    4349        /** 
    4450         * klíč = jazyk – např. bash 
     
    7177        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 { 
    7278                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)); 
    7480        } 
    7581 
     
    170176        } 
    171177 
     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 
    172188        /** 
    173189         * @param zadání výstup vygenerovaný skriptem 
     
    176192         * @throws Exception 
    177193         */ 
    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 { 
    179195                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    180196                DocumentBuilder db = dbf.newDocumentBuilder(); 
    181197                Document d; 
    182198 
    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) { 
    192201                        d = db.newDocument(); 
    193202                        Node html = d.createElementNS(XHTML, "html"); 
     
    197206                        html.appendChild(body); 
    198207                        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                        } 
    199218                } 
    200219 
  • šablona/makra/skriptování.xsl

    r107 r108  
    3333                * 
    3434                @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 
    3639                @src soubor se skriptem/programem (volitelný parametr – buď zadáme skript do těla elementu, nebo nastavíme tento atribut) 
    3740        --> 
     
    5154                                                                                                                                        //s:stránka/s:perex/text() 
    5255                                                                                                                                )"/> 
    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> 
    5466                        </xsl:when> 
    5567 
     
    6072                                <xsl:message>Stránka obsahuje skripty, ale skripty jsou ignorovány – změnu lze provést ve web.conf.</xsl:message> 
    6173                        </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')"> 
    6375                                <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> 
    6476                        </xsl:when> 
     
    7082                        <xsl:otherwise><!-- varovat = výchozí možnost --> 
    7183                                <xsl:choose> 
    72                                         <xsl:when test="@výstup = 'xml'"> 
     84                                        <xsl:when test="@výstup = 'xml' or @výstup = 'xhtml'"> 
    7385                                                <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> 
    7486                                        </xsl:when>