Home | History | Annotate | Download | only in lib
      1 <?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- sgml -*- -->
      2 <!DOCTYPE xsl:stylesheet [ 
      3   <!ENTITY nl "&#xa;"> 
      4   <!ENTITY line-len "72">
      5   <!ENTITY indent "    ">
      6   <!-- we always output the same-length rule, so just define it as an entity -->
      7   <!ENTITY rule "------------------------------------------------------------------------">
      8 ]>
      9 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     10 <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
     11 
     12 
     13 <!-- line-wrapping stuff -->
     14 <xsl:import href="line-wrap.xsl"/>
     15 
     16 <!-- dump all white-space only nodes -->
     17 <xsl:strip-space elements="*"/>
     18 
     19 
     20 <xsl:output method="text" encoding="ISO-8859-1" 
     21             indent="yes" omit-xml-declaration="yes"/>
     22 
     23 <xsl:param name="generate.toc">
     24 book      nop
     25 article   nop
     26 qandaset  toc
     27 qandadiv  nop
     28 </xsl:param>
     29 
     30 
     31 <!-- top-level place to start -->
     32 <xsl:template match="*" mode="process.root">
     33   <xsl:text>&nl;</xsl:text>
     34   <xsl:apply-templates select="."/>
     35 </xsl:template>
     36 
     37 
     38 <!-- book templates -->
     39 <xsl:template match="book">
     40   <xsl:call-template name="book.titlepage"/>
     41   <xsl:apply-templates/>
     42 </xsl:template>
     43 
     44 <xsl:template name="book.titlepage">
     45   <xsl:text>&nl;</xsl:text>
     46   <xsl:variable name="recto.content">
     47     <xsl:apply-templates mode="book.titlepage.recto.auto.mode" 
     48                          select="bookinfo/title"/>
     49     <xsl:apply-templates mode="book.titlepage.recto.auto.mode" 
     50                          select="bookinfo/releaseinfo"/>
     51     <xsl:apply-templates mode="book.titlepage.recto.auto.mode" 
     52                          select="bookinfo/copyright"/>
     53     <xsl:apply-templates mode="book.titlepage.recto.auto.mode" 
     54                          select="bookinfo/author"/>
     55   </xsl:variable>
     56     <xsl:copy-of select="$recto.content"/>
     57 
     58 </xsl:template>
     59 
     60 <xsl:template match="title" mode="book.titlepage.recto.auto.mode">
     61   <xsl:value-of select="."/>
     62   <xsl:text>&nl;</xsl:text>
     63 </xsl:template>
     64 
     65 <xsl:template match="releaseinfo" mode="book.titlepage.recto.auto.mode">
     66   <xsl:value-of select="."/>
     67   <xsl:text>&nl;</xsl:text>
     68 
     69   <xsl:call-template name="ruler">
     70     <xsl:with-param name="char" select="'~'"/>
     71     <xsl:with-param name="len" select="string-length(.)"/>
     72   </xsl:call-template>
     73 
     74   <xsl:text>&nl;</xsl:text>
     75 </xsl:template>
     76 
     77 <!-- noop -->
     78 <xsl:template match="copyright" mode="book.titlepage.recto.auto.mode"/>
     79 <!-- noop -->
     80 <xsl:template match="author" mode="book.titlepage.recto.auto.mode"/>
     81 
     82 
     83 <!-- article templates -->
     84 <xsl:template match="article">
     85   <xsl:call-template name="article.titlepage"/>
     86   <xsl:apply-templates/>
     87 </xsl:template>
     88 
     89 <!-- noop -->
     90 <xsl:template name="article.titlepage"/>
     91 <!-- noop -->
     92 <xsl:template match="article/title" mode="titlepage.mode"/>
     93 
     94 
     95 
     96 <!-- qandaset / qandadiv / qandaentry templates -->
     97 <xsl:template match="qandaset">
     98   <xsl:variable name="title" select="(title)[1]"/>
     99     <xsl:text>Table of Contents</xsl:text>
    100     <xsl:apply-templates select="$title"/>
    101     <xsl:call-template name="process.qanda.toc"/>
    102     <xsl:text>&nl;</xsl:text>
    103     <!-- do the thang -->
    104     <xsl:apply-templates select="qandaentry|qandadiv"/>
    105 </xsl:template>
    106 
    107 <xsl:template match="qandadiv/title">
    108   <xsl:variable name="qalevel">
    109     <xsl:call-template name="qandadiv.section.level"/>
    110   </xsl:variable>
    111 
    112   <xsl:text>&nl;&rule;&nl;</xsl:text>
    113   <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
    114   <xsl:text>. </xsl:text>
    115   <xsl:apply-templates/>
    116   <xsl:text>&nl;&rule;&nl;&nl;</xsl:text>
    117 </xsl:template>
    118 
    119 <xsl:template name="process.qanda.toc">
    120   <xsl:apply-templates select="qandadiv" mode="qandatoc.mode"/>
    121 </xsl:template>
    122 
    123 <xsl:template match="qandadiv" mode="qandatoc.mode">
    124   <xsl:apply-templates select="title" mode="qandatoc.mode"/>
    125   <xsl:call-template name="process.qanda.toc"/>
    126 </xsl:template>
    127 
    128 <xsl:template match="qandadiv/title" mode="qandatoc.mode">
    129   <xsl:variable name="qalevel">
    130     <xsl:call-template name="qandadiv.section.level"/>
    131   </xsl:variable>
    132 
    133   <xsl:text>&nl;</xsl:text>
    134   <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
    135   <xsl:text>. </xsl:text>
    136 
    137   <xsl:apply-templates/>
    138 </xsl:template>
    139 
    140 <xsl:template match="qandadiv">
    141   <xsl:apply-templates select="(title)[1]"/>
    142   <xsl:apply-templates select="qandadiv|qandaentry"/>
    143 </xsl:template>
    144 
    145 <!-- if this qandaentry is not the first child in the parent qandadiv, -->
    146 <!-- then output a separator line -->
    147 <xsl:template match="qandaentry">
    148   <xsl:if test="position() > 1">
    149     <xsl:text>&rule;&nl;&nl;</xsl:text>
    150   </xsl:if>
    151   <xsl:apply-templates/>
    152 </xsl:template>
    153 
    154 
    155 
    156 <!-- TODO: implement indenting of subsequent lines in question para -->
    157 <!-- maybe pass a var 'indent' along to foldl ... ... -->
    158 <xsl:template match="question">
    159   <xsl:variable name="qnum">
    160     <xsl:apply-templates select="." mode="label.markup"/>
    161   </xsl:variable>
    162 
    163   <xsl:for-each select="para|screen|programlisting|itemizedlist|orderedlist">
    164     <xsl:choose>
    165       <!-- glue $qnum onto the front of the first question para -->
    166       <xsl:when test="local-name() = 'para' and position() = 1">
    167         <xsl:apply-templates select=".">
    168           <xsl:with-param name="prefix" select="concat($qnum, '. ')"/>
    169         </xsl:apply-templates>
    170       </xsl:when>
    171       <xsl:otherwise>
    172         <xsl:apply-templates select=".">
    173           <xsl:with-param name="prefix" select="zzzz"/>
    174         </xsl:apply-templates>
    175       </xsl:otherwise>
    176     </xsl:choose>
    177   </xsl:for-each>
    178 
    179 </xsl:template>
    180 
    181 
    182 <xsl:template match="answer">
    183   <xsl:apply-templates select="*[name(.) != 'label']"/>
    184 </xsl:template>
    185 
    186 
    187 <xsl:template match="para">
    188   <xsl:param name="prefix" select="''"/>
    189 
    190   <!-- reformat any ulinks found -->
    191   <xsl:variable name="text">
    192     <xsl:choose>
    193       <xsl:when test="descendant-or-self::ulink">
    194         <xsl:apply-templates name="ulink"/>
    195       </xsl:when>
    196       <xsl:otherwise>
    197         <xsl:value-of select="."/>
    198       </xsl:otherwise>
    199     </xsl:choose>
    200   </xsl:variable>
    201 
    202   <!-- the input to str-split-to-lines must be delim'd by either   -->
    203   <!-- a space or a newline. since we need a newline at the end of -->
    204   <!-- every para anyway, stick it on now -->
    205   <xsl:variable name="pLine" 
    206                 select="concat($prefix, normalize-space($text), '&nl;')"/>
    207 
    208   <xsl:choose>
    209     <xsl:when test="string-length($pLine) &lt; &line-len;">
    210       <xsl:value-of select="$pLine"/>
    211     </xsl:when>
    212     <xsl:otherwise>
    213       <!-- TODO: this is where an 'indent' param should be sent -->
    214       <xsl:call-template name="str-split-to-lines">
    215         <xsl:with-param name="pStr" select="$pLine"/>
    216         <xsl:with-param name="pLineLength" select="&line-len;"/>
    217         <xsl:with-param name="pDelimiters" select="' &nl;'"/>
    218       </xsl:call-template>
    219     </xsl:otherwise>
    220   </xsl:choose>
    221   <xsl:text>&nl;</xsl:text>
    222 </xsl:template>
    223 
    224 
    225 <!-- always indent the contents of screen / programlisting -->
    226 <xsl:template match="screen|programlisting">
    227   <xsl:call-template name="indent.me">
    228     <xsl:with-param name="first" select="'1'"/>
    229   </xsl:call-template>
    230   <xsl:text>&nl;</xsl:text>
    231 </xsl:template>
    232 
    233 
    234 <xsl:template match="itemizedlist">
    235   <xsl:apply-templates select="listitem"/>
    236 </xsl:template>
    237 
    238 <xsl:template match="itemizedlist/listitem">
    239   <xsl:apply-templates>
    240     <xsl:with-param name="prefix" select="'* '"/>
    241   </xsl:apply-templates>
    242 </xsl:template>
    243 
    244 
    245 <xsl:template match="orderedlist">
    246   <xsl:apply-templates select="listitem"/>
    247 </xsl:template>
    248 
    249 <xsl:template match="orderedlist/listitem">
    250   <xsl:apply-templates>
    251     <xsl:with-param name="prefix" select="concat(position(), '. ' )"/>
    252   </xsl:apply-templates>
    253 </xsl:template>
    254 
    255 
    256 <xsl:template match="ulink" name="ulink">
    257   <xsl:variable name="url"  select="normalize-space(@url)"/>
    258 
    259   <xsl:value-of select="concat(text(), ': ')"/>
    260 
    261   <xsl:text>&lt;</xsl:text>
    262   <xsl:choose>
    263     <xsl:when test="starts-with($url, 'mailto:')">
    264       <xsl:value-of select="substring-after($url, ':')"/>
    265     </xsl:when>
    266     <xsl:otherwise>
    267       <xsl:value-of select="$url"/>
    268     </xsl:otherwise>
    269   </xsl:choose>
    270   <xsl:text>&gt;</xsl:text>
    271 
    272 </xsl:template>
    273 
    274 
    275 <!-- indent a string -->
    276 <xsl:template name="indent.me">
    277   <xsl:param name="text" select="."/>
    278   <xsl:param name="first" select="'0'"/>
    279   <xsl:choose>
    280     <xsl:when test="contains($text, '&#xa;')">
    281       <xsl:value-of select="substring-before($text, '&#xa;')"/>
    282       <xsl:if test="$first = 0">
    283         <xsl:text>&nl;</xsl:text>
    284       </xsl:if>
    285       <xsl:text>&indent;</xsl:text>
    286       <xsl:call-template name="indent.me">
    287         <xsl:with-param name="text" select="substring-after($text, '&#xa;')"/>
    288       </xsl:call-template>
    289     </xsl:when>
    290     <xsl:otherwise>
    291       <xsl:if test="not(string-length($text) = 0)">
    292         <xsl:text>&indent;</xsl:text>
    293 	      <xsl:value-of select="$text"/>
    294         <xsl:text>&nl;</xsl:text>
    295       </xsl:if>
    296     </xsl:otherwise>
    297   </xsl:choose>
    298 </xsl:template>
    299 
    300 
    301 <!-- Repeat the character 'char' 'len' times -->
    302 <xsl:template name="ruler">
    303   <xsl:param name="char"/>
    304   <xsl:param name="len"/>
    305   <xsl:param name="line"/>
    306   <xsl:choose>
    307     <xsl:when test="$len = 0">
    308       <xsl:value-of select="$line"/>
    309       <xsl:text>&nl;</xsl:text>
    310     </xsl:when>
    311     <xsl:when test="$len mod 2 = 1">
    312       <xsl:call-template name="ruler">
    313 	      <xsl:with-param name="char" select="concat($char,$char)"/>
    314 	      <xsl:with-param name="len" select="($len - 1) div 2"/>
    315         <xsl:with-param name="line" select="concat($line,$char)"/>
    316 	    </xsl:call-template>
    317     </xsl:when>
    318     <xsl:otherwise>
    319 	    <xsl:call-template name="ruler">
    320 	      <xsl:with-param name="char" select="concat($char,$char)"/>
    321 	      <xsl:with-param name="len" select="$len div 2"/>
    322         <xsl:with-param name="line" select="$line"/>
    323 	    </xsl:call-template>
    324     </xsl:otherwise>
    325   </xsl:choose>
    326 </xsl:template>
    327 
    328 
    329 </xsl:stylesheet>
    330 
    331