Changeset 107:379a2a893fd1

Show
Ignore:
Timestamp:
07/05/12 19:10:42 (8 years ago)
Author:
František Kučera <franta-hg@…>
Branch:
default
Message:

#20 Skriptování: Makra ve skriptech a Skripty v makrech + výpis verzí z Mercurialu.

Files:
2 added
3 modified

Legend:

Unmodified
Added
Removed
  • vstup/skriptování.xml

    r105 r107  
    2323                <p> 
    2424                        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> 
    2830                </p> 
    2931                <p> 
     
    6365                </table> 
    6466 
    65                 <h2>Perl</h2> 
     67                <h2>Perl – ukázka</h2> 
    6668                <p>Jazyky použité nebo citované na této stránce:</p> 
    6769                <!-- 
     
    8789                        ]]></m:skript></pre> 
    8890 
    89                         <h2>BASH</h2> 
     91                        <h2>BASH – ukázka</h2> 
    9092                <pre><m:skript jazyk="bash"><![CDATA[ 
    9193echo -n "Právě je: "; 
     
    144146                ]]></m:skript></pre> 
    145147 
     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[ 
     152echo '<m:skript jazyk="bash">'; # Ty zrůdo! :-) 
     153echo 'echo "Takže můžeš skriptovat, když skriptuješ,";'; 
     154echo '</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[ 
     160use strict; 
     161use warnings; 
     162 
     163my $adresar = "vstup/makra"; 
     164 
     165print "<m:diagram nadpis='Uživatelská makra v adresáři $adresar'>\n"; 
     166print " node            [shape=\"box\"];\n"; 
     167print " koren   [label=\"Uživatelská makra\"];\n"; 
     168 
     169opendir(DIR, $adresar) or die $!; 
     170my $i = 0; 
     171while (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} 
     179print "</m:diagram>"; 
     180closedir(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[ 
     186use strict; 
     187use warnings; 
     188 
     189my $adresar = "vstup/makra"; 
     190 
     191print "<m:diagram nadpis='Uživatelská makra v adresáři $adresar'>\n"; 
     192print " node    [shape=\"box\"];\n"; 
     193print " koren   [label=\"Uživatelská makra\"];\n"; 
     194 
     195opendir(DIR, $adresar) or die $!; 
     196my $i = 0; 
     197while (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} 
     205print "</m:diagram>"; 
     206closedir(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 
    146232        </text> 
    147233 
  • šablona/funkce/src/cz/frantovo/xmlWebGenerator/makra/Skriptování.java

    r103 r107  
    1919 
    2020import static cz.frantovo.xmlWebGenerator.NástrojeCLI.načtiProud; 
     21import static cz.frantovo.xmlWebGenerator.Xmlns.*; 
    2122import java.io.ByteArrayInputStream; 
    2223import java.io.File; 
     
    2829import javax.xml.parsers.DocumentBuilder; 
    2930import javax.xml.parsers.DocumentBuilderFactory; 
     31import javax.xml.transform.Source; 
     32import javax.xml.transform.dom.DOMSource; 
    3033import org.w3c.dom.Document; 
     34import org.w3c.dom.Node; 
    3135 
    3236/** 
     
    6367         * @param nadpisStránky nadpis stránky → proměnná prostředí 
    6468         * @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) 
    6670         */ 
    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 
    6878                try { 
    6979                        if (isNeprázdný(skriptSoubor)) { 
     
    137147                                } 
    138148 
    139                                 return připravVýstup(výsledek, výstupníFormát); 
     149                                return výsledek.trim(); 
    140150                        } else { 
    141151                                System.err.println("--- Standardní výstup skriptu: -----"); 
     
    147157                        } 
    148158                } 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."); 
    150160                        System.err.println("--------"); 
    151161                        System.err.println(skriptText); 
    152162                        System.err.println("--------"); 
    153163                        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; 
    169165                } 
    170166        } 
     
    175171 
    176172        /** 
    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 
    179177         */ 
    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); 
    190199                } 
     200 
     201                return new DOMSource(d); 
    191202        } 
    192203} 
  • šablona/makra/skriptování.xsl

    r106 r107  
    1919<xsl:stylesheet version="2.0" 
    2020        xmlns="http://www.w3.org/1999/xhtml" 
     21        xmlns:h="http://www.w3.org/1999/xhtml" 
    2122        xmlns:m="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/makro" 
    2223        xmlns:j="java:cz.frantovo.xmlWebGenerator.makra.Skriptování" 
     
    5051                                                                                                                                        //s:stránka/s:perex/text() 
    5152                                                                                                                                )"/> 
    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()"/> 
    6354                        </xsl:when> 
    6455