Changeset 111:d59023a42d4b

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

#20 Skriptování: vnořování maker – zadání tabulky nebo diagramu může být generované skriptem.

Files:
3 modified

Legend:

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

    r110 r111  
    7575use warnings; 
    7676 
    77 open(XML, "<", $ENV{"XWG_STRANKA_SOUBOR"}); 
     77open(XML, "<", $ENV{"XWG_STRANKA_SOUBOR"}) or die $!; 
    7878my %skripty; 
    7979 
     
    8989                        ]]></m:skript></pre> 
    9090 
    91                         <h3>BASH – ukázka</h3> 
     91                <h3>BASH – ukázka</h3> 
    9292                <pre><m:skript jazyk="bash"><![CDATA[ 
    9393echo -n "Právě je: "; 
     
    146146                ]]></m:skript></pre> 
    147147 
    148                 <h2>Makra ve skriptech</h2> 
     148                <h2 id="makraVeSkriptech">Makra ve skriptech</h2> 
    149149                <p> 
    150150                        XML generované skriptem může také obsahovat makra, která se následně interptetují. 
     
    223223                        </m:podČarou> 
    224224                        jiná makra – mj. skripty. 
    225                         Toho jsme využili v makru, které generuje tabulku verzí z mercurialu: 
     225                        Toho jsme využili v makru, které generuje tabulku verzí z mercurialu 
     226                        – ten umí vypsat historii úložiště v XML, které následně snadno zpracujeme v XSLT. 
    226227                </p> 
    227228 
     
    232233                </p> 
    233234 
     235                <h2>Vnořování maker</h2> 
     236                <p> 
     237                        Trochu jiný případ je vnořování maker na stránce. 
     238                        Např. si chceme vypsat vybrané internetové služby: 
     239                </p> 
     240                <m:tabulka> 
     241                        <m:skript jazyk="perl"><![CDATA[ 
     242use strict; 
     243use warnings; 
     244 
     245print "Port\tSlužba\tProtokol\n"; 
     246open(S, "<", "/etc/services") or die $!; 
     247while (<S>) { 
     248        if (/(\w+)\s+(21|22|25|80)\/(tcp)/) { 
     249                print "$2\t$1\t$3\n"; 
     250        } 
     251} 
     252                        ]]></m:skript> 
     253                </m:tabulka> 
     254                 
     255                <p> 
     256                        Pro vygenerování použijeme dvě makra – tabulku a skript – která vložíme do textu stránky: 
     257                </p> 
     258                 
     259                <m:pre jazyk="xml"><![CDATA[ 
     260<m:tabulka> 
     261        <m:skript jazyk="perl"><![CDATA[ 
     262                print "Port\tSlužba\tProtokol\n"; 
     263                open(S, "<", "/etc/services") or die $!; 
     264                while (<S>) { 
     265                        if (/(\w+)\s+(21|22|25|80)\/(tcp)/) { 
     266                                print "$2\t$1\t$3\n"; 
     267                        } 
     268                } 
     269        ]]]]>&gt;<![CDATA[</m:skript> 
     270</m:tabulka>]]></m:pre> 
     271 
     272                <p> 
     273                        Ve skriptu v tomto případě negenerujeme XHTML značky, ale CSV (s tabulátory) 
     274                        a o převod na XHTML tabulku se postará XSL šablona. 
     275                </p> 
     276 
     277                <!-- 
     278                        Nebo to taky můžeme napsat na jeden řádek: 
     279                        cat /etc/services | perl -ne 'if (/(\w+)\s+(21|22|25|80)\/(tcp)/) { print "$2\t$1\t$3\n";}' 
     280                        a vložit do tabulky jako BASH skript :-) 
     281                --> 
     282 
     283                <p> 
     284                        Podobně bychom mohli postupovat i u <a href="#makraVeSkriptech">diagramu</a> – 
     285                        negenerovat skriptem značky makra, ale pouze jeho obsah – zadání diagramu, nebo jen jeho část. 
     286                        Někdy se ale může hodit ve skriptu nastavovat atributy elementů nebo elementy vytvářet dynamicky. 
     287                </p> 
     288 
    234289        </text> 
    235290 
  • šablona/makra/diagramy.xsl

    r87 r111  
    3636        --> 
    3737        <xsl:template match="m:diagram"> 
     38                <xsl:variable name="zadání"> 
     39                        <xsl:apply-templates select="*|text()"/> 
     40                </xsl:variable> 
    3841                <xsl:call-template name="vložDiagram"> 
    39                         <xsl:with-param name="zadání" select="text()"/> 
     42                        <xsl:with-param name="zadání" select="$zadání"/> 
    4043                        <xsl:with-param name="kompletní" select="@kompletní = 'ano'"/> 
    4144                </xsl:call-template> 
  • šablona/makra/tabulka.xsl

    r90 r111  
    4040        </xsl:template> 
    4141         
     42        <!-- Skript je potřeba interpretovat ještě před tabulkou – ostatní makra budou interpretovat uvnitř buněk --> 
     43        <xsl:template match="m:tabulka[m:skript]"> 
     44                <xsl:variable name="zadání"> 
     45                        <xsl:apply-templates select="*"/> 
     46                </xsl:variable> 
     47                <xsl:call-template name="vykresliTabulku"> 
     48                        <xsl:with-param name="zadání" select="$zadání"/> 
     49                        <xsl:with-param name="oddělovač" select="(@oddělovač, '\t+')[1]"/> 
     50                </xsl:call-template> 
     51        </xsl:template> 
     52         
     53        <!-- Tabulka načítaná ze souboru: --> 
    4254        <xsl:template match="m:tabulka[@src]"> 
    4355                <xsl:call-template name="vykresliTabulku"> 
     
    4759        </xsl:template> 
    4860         
     61        <!-- TODO: Umožnit použití maker a značek uvnitř buněk tabulky. --> 
    4962        <xsl:template name="vykresliTabulku"> 
    5063                <xsl:param name="zadání"/>