home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 November / PCWorld_2003-11_cd.bin / Komunik / apache / apache_2.0.47-win32-x86-no_ssl.msi / Data.Cab / F251382_html.xsl (.txt) < prev    next >
LaTeX Document  |  2003-06-30  |  9KB  |  273 lines

  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0"
  3.               xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  4.                   xmlns="http://www.w3.org/1999/xhtml">
  5. <!-- ==================================================================== -->
  6. <!-- Ordinary HTML that must be converted to latex                        -->
  7. <!-- ==================================================================== -->
  8. <xsl:template match="ul">
  9. <xsl:text>\begin{itemize}
  10. </xsl:text>
  11. <xsl:apply-templates/>
  12. <xsl:text>\end{itemize}
  13. </xsl:text>
  14. </xsl:template>
  15. <xsl:template match="ol">
  16. <xsl:text>\begin{enumerate}
  17. </xsl:text>
  18. <xsl:apply-templates/>
  19. <xsl:text>\end{enumerate}
  20. </xsl:text>
  21. </xsl:template>
  22. <xsl:template match="li">
  23. <xsl:text>\item </xsl:text>
  24. <xsl:apply-templates/>
  25. <xsl:text>
  26. </xsl:text>
  27. </xsl:template>
  28. <xsl:template match="dl">
  29. <xsl:text>\begin{description}
  30. </xsl:text>
  31. <xsl:apply-templates/>
  32. <xsl:text>\end{description}
  33. </xsl:text>
  34. </xsl:template>
  35. <xsl:template match="dt">
  36. <xsl:text>\item[</xsl:text><xsl:apply-templates/>
  37. <xsl:text>] </xsl:text>
  38. </xsl:template>
  39. <xsl:template match="dd">
  40. <xsl:apply-templates/>
  41. </xsl:template>
  42. <!-- Latex doesn't like successive line breaks, so replace any
  43.      sequence of two or more br separated only by white-space with
  44.      one line break followed by smallskips. -->
  45. <xsl:template match="br">
  46. <xsl:choose>
  47. <xsl:when test="name(preceding-sibling::node()[1])='br' or name(preceding-sibling::node()[1])='indent'">
  48. <xsl:text>\smallskip </xsl:text>
  49. </xsl:when>
  50. <xsl:when test="name(preceding-sibling::node()[2])='br' or name(preceding-sibling::node()[2])='indent'">
  51.   <xsl:choose>
  52.   <xsl:when test="normalize-space(preceding-sibling::node()[1])=''">
  53.     <xsl:text>\smallskip </xsl:text>
  54.   </xsl:when>
  55.   <xsl:otherwise>
  56.     <!-- Don't put a line break if we are the last thing -->
  57.     <xsl:if test="not(position()=last()) and not(position()=last()-1 and normalize-space(following-sibling::node()[1])='')">
  58.       <xsl:text>\\ </xsl:text>
  59.     </xsl:if>
  60.   </xsl:otherwise>
  61.   </xsl:choose>
  62. </xsl:when>
  63. <xsl:otherwise>
  64.     <!-- Don't put a line break if we are the last thing -->
  65.     <xsl:if test="not(position()=last()) and not(position()=last()-1 and normalize-space(following-sibling::node()[1])='')">
  66.       <xsl:text>\\ </xsl:text>
  67.     </xsl:if>
  68. </xsl:otherwise>
  69. </xsl:choose>
  70. </xsl:template>
  71. <xsl:template match="p">
  72. <xsl:apply-templates/>
  73. <xsl:text>\par
  74. </xsl:text>
  75. </xsl:template>
  76. <xsl:template match="code">
  77. <xsl:text>\texttt{</xsl:text>
  78. <xsl:apply-templates/>
  79. <xsl:text>}</xsl:text>
  80. </xsl:template>
  81. <xsl:template match="strong">
  82. <xsl:text>\textbf{</xsl:text>
  83. <xsl:apply-templates/>
  84. <xsl:text>}</xsl:text>
  85. </xsl:template>
  86. <xsl:template match="em">
  87. <xsl:text>\textit{</xsl:text>
  88. <xsl:apply-templates/>
  89. <xsl:text>}</xsl:text>
  90. </xsl:template>
  91. <!-- Value-of used here explicitly because we don't wan't latex-escaping
  92. performed.  Of course, this will conflict with html where some tags are
  93. interpreted in pre -->
  94. <xsl:template match="pre">
  95. <xsl:text>\begin{verbatim}
  96. </xsl:text>
  97. <xsl:value-of select="."/>
  98. <xsl:text>\end{verbatim}
  99. </xsl:text>
  100. </xsl:template>
  101. <xsl:template match="blockquote">
  102. <xsl:text>\begin{quotation}
  103. </xsl:text>
  104. <xsl:apply-templates/>
  105. <xsl:text>\end{quotation}
  106. </xsl:text>
  107. </xsl:template>
  108. <!-- XXX: We need to deal with table headers -->
  109. <xsl:template match="table">
  110. <xsl:variable name="table-type">
  111.   <xsl:choose>
  112.   <xsl:when test="count(tr) > 15">longtable</xsl:when>
  113.   <xsl:otherwise>tabular</xsl:otherwise>
  114.   </xsl:choose>
  115. </xsl:variable>
  116. <xsl:text>\begin{</xsl:text><xsl:value-of select="$table-type"/>
  117. <xsl:text>}{|</xsl:text>
  118. <xsl:choose>
  119. <xsl:when test="columnspec">
  120.   <xsl:for-each select="columnspec/column">
  121.     <xsl:text>l</xsl:text>
  122.     <xsl:if test="../../@border and not(position()=last())">
  123.       <xsl:text>|</xsl:text>
  124.     </xsl:if>
  125.   </xsl:for-each>
  126. </xsl:when>
  127. <xsl:otherwise>
  128.   <xsl:for-each select="tr[1]/*">
  129.     <xsl:text>l</xsl:text>
  130.     <xsl:if test="../../@border and not(position()=last())">
  131.       <xsl:text>|</xsl:text>
  132.     </xsl:if>
  133.   </xsl:for-each>
  134. </xsl:otherwise>
  135. </xsl:choose>
  136. <xsl:text>|}\hline
  137. </xsl:text>
  138. <xsl:apply-templates select="tr"/>
  139. <xsl:text>\hline\end{</xsl:text>
  140. <xsl:value-of select="$table-type"/>
  141. <xsl:text>}
  142. </xsl:text>
  143. </xsl:template>
  144. <xsl:template match="tr">
  145.   <xsl:apply-templates select="td|th"/>
  146.   <xsl:text>\\</xsl:text>
  147.   <xsl:if test="../@border and not(position()=last())">
  148.     <xsl:text>\hline</xsl:text>
  149.   </xsl:if>
  150.   <xsl:text>
  151. </xsl:text>
  152. </xsl:template>
  153. <xsl:template match="td">
  154.     <xsl:variable name="pos" select="position()"/>
  155.     <xsl:text>\begin{minipage}[t]{</xsl:text>
  156.     <xsl:choose>
  157.     <xsl:when test="../../columnspec">
  158.       <xsl:value-of select="../../columnspec/column[$pos]/@width"/>
  159.     </xsl:when>
  160.     <xsl:otherwise>
  161.       <xsl:value-of select=".95 div last()"/>
  162.     </xsl:otherwise>
  163.     </xsl:choose>
  164.     <xsl:text>\textwidth}\small </xsl:text>
  165.     <xsl:apply-templates/>
  166.     <xsl:text>\end{minipage}</xsl:text>
  167.     <xsl:if test="not(position()=last())">
  168.       <xsl:text> & </xsl:text>
  169.     </xsl:if>
  170. </xsl:template>
  171. <xsl:template match="th">
  172.     <xsl:variable name="pos" select="position()"/>
  173.     <xsl:text>\begin{minipage}[t]{</xsl:text>
  174.     <xsl:choose>
  175.     <xsl:when test="../../columnspec">
  176.       <xsl:value-of select="../../columnspec/column[$pos]/@width"/>
  177.     </xsl:when>
  178.     <xsl:otherwise>
  179.       <xsl:value-of select=".95 div last()"/>
  180.     </xsl:otherwise>
  181.     </xsl:choose>
  182.     <xsl:text>\textwidth}\bfseries </xsl:text>
  183.     <xsl:apply-templates/>
  184.     <xsl:text>\end{minipage}</xsl:text>
  185.     <xsl:if test="not(position()=last())">
  186.       <xsl:text> & </xsl:text>
  187.     </xsl:if>
  188. </xsl:template>
  189.    This is a horrible hack, but it seems to mostly work.  It does a
  190.    few things:
  191.    1. Transforms references starting in http:// to footnotes with the
  192.       appropriate hyperref macro to make them clickable.  (This needs
  193.       to be expanded to deal with news: and needs to be adjusted to
  194.       deal with "#", which is creating bad links at the moment.)
  195.    2. For intra-document references, constructs the appropriate absolute
  196.       reference using a latex \pageref.  
  197.       This involves applying a simplified version of the
  198.       general URL resolution rules to deal with ../.  It only works for
  199.       one level of subdirectory.
  200.    3. It is also necessary to deal with the fact that index pages
  201.       get references as "/".
  202. <xsl:template match="a">
  203. <xsl:apply-templates/>
  204. <xsl:if test="@href">
  205. <xsl:variable name="relpath" select="document(/*/@metafile)/metafile/relpath" />
  206. <xsl:variable name="path" select="document(/*/@metafile)/metafile/path" />
  207. <xsl:variable name="fileref">
  208.   <xsl:choose>
  209.   <xsl:when test="contains(@href, '.html')">
  210.     <xsl:value-of select="substring-before(@href, '.html')"/>
  211.   </xsl:when>
  212.   <xsl:otherwise>
  213.     <xsl:value-of select="concat(@href, 'index')"/>
  214.   </xsl:otherwise>
  215.   </xsl:choose>
  216. </xsl:variable>
  217. <xsl:choose>
  218. <xsl:when test="starts-with(@href, 'http:') or starts-with(@href, 'news:') or starts-with(@href, 'mailto:')">
  219.   <xsl:if test="not(.=@href)">
  220.     <xsl:text>\footnote{</xsl:text>
  221.       <xsl:text>\href{</xsl:text>
  222.       <xsl:call-template name="replace-string">
  223.         <xsl:with-param name="text" select="@href"/>
  224.         <xsl:with-param name="replace" select="'#'"/>
  225.         <xsl:with-param name="with" select="'\#'"/>
  226.       </xsl:call-template>
  227.       <xsl:text>}{</xsl:text>
  228.     <xsl:call-template name="ltescape">
  229.       <xsl:with-param name="string" select="@href"/>
  230.     </xsl:call-template>
  231.     <xsl:text>}}</xsl:text>
  232.   </xsl:if>
  233. </xsl:when>
  234. <xsl:when test="starts-with(@href, '#')">
  235. <!-- Don't do inter-section references -->
  236. </xsl:when>
  237. <xsl:otherwise>
  238.   <xsl:text> (p.\ \pageref{</xsl:text>
  239.     <xsl:call-template name="replace-string">
  240.       <xsl:with-param name="replace" select="'#'"/>
  241.       <xsl:with-param name="with" select="':'"/>
  242.       <xsl:with-param name="text">
  243.       <xsl:choose>
  244.       <xsl:when test="$relpath='.'">
  245.         <xsl:value-of select="concat('/',$fileref)"/>
  246.       </xsl:when>
  247.       <xsl:otherwise>
  248.         <xsl:choose>
  249.         <xsl:when test="starts-with($fileref,'..')">
  250.           <xsl:value-of select="substring-after($fileref,'..')"/>
  251.         </xsl:when>
  252.         <xsl:otherwise>
  253.           <xsl:value-of select="concat($path,$fileref)"/>
  254.         </xsl:otherwise>
  255.         </xsl:choose>
  256.       </xsl:otherwise>
  257.       </xsl:choose>
  258.       </xsl:with-param>
  259.      </xsl:call-template>
  260.   <xsl:text>}) </xsl:text>
  261. </xsl:otherwise>
  262. </xsl:choose>
  263. </xsl:if>
  264. </xsl:template>
  265. <xsl:template match="img">
  266. <xsl:text>[Image not coverted]</xsl:text>
  267. <xsl:variable name="path" select="document(/*/@metafile)/metafile/path" />
  268. <xsl:text>\includegraphics{</xsl:text>
  269. <xsl:value-of select="concat('.',$path,@src)"/>
  270. <xsl:text>}</xsl:text>
  271. </xsl:template>
  272. </xsl:stylesheet>
  273.