| <?xml version="1.0"?> |
| <!DOCTYPE xsl:stylesheet [ |
| <!ENTITY lf SYSTEM "../xsl/util/lf.xml"> |
| ]> |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <xsl:stylesheet version="1.0" |
| xmlns:xsl="http://www.w3.org/1999/XSL/Transform" |
| xmlns="http://www.w3.org/1999/xhtml"> |
| |
| |
| <!-- load utility snippets --> |
| <xsl:include href="../xsl/util/pretrim.xsl" /> |
| |
| <!-- ==================================================================== --> |
| <!-- Ordinary HTML that must be converted to latex --> |
| <!-- ==================================================================== --> |
| |
| <xsl:template match="ul"> |
| <xsl:text>\begin{itemize}</xsl:text>&lf; |
| <xsl:apply-templates/> |
| <xsl:text>\end{itemize}</xsl:text>&lf; |
| </xsl:template> |
| |
| <xsl:template match="ol"> |
| <xsl:text>\begin{enumerate}</xsl:text>&lf; |
| <xsl:apply-templates/> |
| <xsl:text>\end{enumerate}</xsl:text>&lf; |
| </xsl:template> |
| |
| <xsl:template match="li"> |
| <xsl:text>\item </xsl:text> |
| <xsl:apply-templates/> |
| &lf; |
| </xsl:template> |
| |
| <xsl:template match="dl"> |
| <xsl:text>\begin{description}</xsl:text>&lf; |
| <xsl:apply-templates/> |
| <xsl:text>\end{description}</xsl:text>&lf; |
| </xsl:template> |
| |
| <xsl:template match="dt"> |
| <xsl:text>\item[</xsl:text><xsl:apply-templates/> |
| <xsl:text>] </xsl:text> |
| </xsl:template> |
| |
| <xsl:template match="dd"> |
| <xsl:apply-templates/> |
| </xsl:template> |
| |
| <xsl:template match="br"> |
| <xsl:call-template name="br"> |
| <xsl:with-param name="result" select="'\\'" /> |
| </xsl:call-template> |
| </xsl:template> |
| |
| <xsl:template match="br" mode="tabular"> |
| <xsl:call-template name="br"> |
| <xsl:with-param name="result" select="'\newline'" /> |
| </xsl:call-template> |
| </xsl:template> |
| |
| <!-- Latex doesn't like successive line breaks, so replace any |
| sequence of two or more br separated only by white-space with |
| one line break followed by smallskips. --> |
| <xsl:template name="br"> |
| <xsl:param name="result" /> |
| |
| <xsl:choose> |
| <xsl:when test="name(preceding-sibling::node()[1])='br' or name(preceding-sibling::node()[1])='indent'"> |
| <xsl:text>\smallskip </xsl:text> |
| </xsl:when> |
| <xsl:when test="name(preceding-sibling::node()[2])='br' or name(preceding-sibling::node()[2])='indent'"> |
| <xsl:choose> |
| <xsl:when test="normalize-space(preceding-sibling::node()[1])=''"> |
| <xsl:text>\smallskip </xsl:text> |
| </xsl:when> |
| <xsl:otherwise> |
| <!-- Don't put a line break if we are the last thing --> |
| <xsl:if test="not(position()=last()) and not(position()=last()-1 and normalize-space(following-sibling::node()[1])='')"> |
| <xsl:value-of select="$result" /> |
| <xsl:text> </xsl:text> |
| </xsl:if> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:when> |
| <xsl:otherwise> |
| <!-- Don't put a line break if we are the last thing --> |
| <xsl:if test="not(position()=last()) and not(position()=last()-1 and normalize-space(following-sibling::node()[1])='')"> |
| <xsl:value-of select="$result" /> |
| <xsl:text> </xsl:text> |
| </xsl:if> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:template> |
| |
| <xsl:template match="p"> |
| <xsl:apply-templates/> |
| <xsl:text>\par</xsl:text>&lf; |
| </xsl:template> |
| |
| <xsl:template match="code|program"> |
| <xsl:text>\texttt{</xsl:text> |
| <xsl:apply-templates/> |
| <xsl:text>}</xsl:text> |
| </xsl:template> |
| |
| <xsl:template match="code|program" mode="tabular"> |
| <xsl:text>\texttt{</xsl:text> |
| <xsl:apply-templates mode="tabular"/> |
| <xsl:text>}</xsl:text> |
| </xsl:template> |
| |
| <xsl:template match="strong"> |
| <xsl:text>\textbf{</xsl:text> |
| <xsl:apply-templates/> |
| <xsl:text>}</xsl:text> |
| </xsl:template> |
| |
| <xsl:template match="strong" mode="tabular"> |
| <xsl:text>\textbf{</xsl:text> |
| <xsl:apply-templates mode="tabular"/> |
| <xsl:text>}</xsl:text> |
| </xsl:template> |
| |
| <xsl:template match="em|var|cite|q|dfn"> |
| <xsl:text>\textit{</xsl:text> |
| <xsl:apply-templates mode="tabular"/> |
| <xsl:text>}</xsl:text> |
| </xsl:template> |
| |
| |
| <!-- Value-of used here explicitly because we don't wan't latex-escaping |
| performed. Of course, this will conflict with html where some tags are |
| interpreted in pre --> |
| <xsl:template match="pre|highlight"> |
| <xsl:text>\begin{verbatim}</xsl:text> |
| |
| <!-- If it's a one-liner, trim the initial indentation as well --> |
| <!-- it's most likely an accident --> |
| <xsl:call-template name="pre-ltrim-one"> |
| <xsl:with-param name="string"> |
| <xsl:call-template name="pre-rtrim"> |
| <xsl:with-param name="string"> |
| <xsl:call-template name="pre-ltrim"> |
| <xsl:with-param name="string"> |
| <xsl:value-of select="." /> |
| </xsl:with-param> |
| </xsl:call-template> |
| </xsl:with-param> |
| </xsl:call-template> |
| </xsl:with-param> |
| </xsl:call-template> |
| |
| <xsl:text>\end{verbatim}</xsl:text>&lf; |
| </xsl:template> |
| |
| <xsl:template match="blockquote"> |
| <xsl:text>\begin{quotation}</xsl:text>&lf; |
| <xsl:apply-templates/> |
| <xsl:text>\end{quotation}</xsl:text>&lf; |
| </xsl:template> |
| |
| <!-- XXX: We need to deal with table headers --> |
| |
| <xsl:template match="table"> |
| <xsl:variable name="table-type"> |
| <xsl:choose> |
| <xsl:when test="count(tr) > 15">longtable</xsl:when> |
| <xsl:otherwise>tabular</xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| |
| <xsl:text>\begin{</xsl:text><xsl:value-of select="$table-type"/> |
| <xsl:text>}{|</xsl:text> |
| <xsl:choose> |
| <xsl:when test="columnspec"> |
| <xsl:for-each select="columnspec/column"> |
| <xsl:text>l</xsl:text> |
| <xsl:if test="../../@border and not(position()=last())"> |
| <xsl:text>|</xsl:text> |
| </xsl:if> |
| </xsl:for-each> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:for-each select="tr[1]/*"> |
| <xsl:text>l</xsl:text> |
| <xsl:if test="../../@border and not(position()=last())"> |
| <xsl:text>|</xsl:text> |
| </xsl:if> |
| </xsl:for-each> |
| </xsl:otherwise> |
| </xsl:choose> |
| <xsl:text>|}\hline</xsl:text>&lf; |
| <xsl:apply-templates select="tr"/> |
| <xsl:text>\hline\end{</xsl:text> |
| <xsl:value-of select="$table-type"/> |
| <xsl:text>}</xsl:text>&lf; |
| </xsl:template> |
| |
| <xsl:template match="tr"> |
| <xsl:apply-templates select="td|th"/> |
| <xsl:text>\\</xsl:text> |
| <xsl:if test="../@border and not(position()=last())"> |
| <xsl:text>\hline</xsl:text> |
| </xsl:if> |
| &lf; |
| </xsl:template> |
| |
| <xsl:template match="td"> |
| <xsl:variable name="pos" select="position()"/> |
| <xsl:text>\begin{minipage}[t]{</xsl:text> |
| <xsl:choose> |
| <xsl:when test="../../columnspec"> |
| <xsl:value-of select="../../columnspec/column[$pos]/@width"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select=".95 div last()"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| <xsl:text>\textwidth}\small </xsl:text> |
| <xsl:apply-templates/> |
| <xsl:text>\end{minipage}</xsl:text> |
| <xsl:if test="not(position()=last())"> |
| <xsl:text> & </xsl:text> |
| </xsl:if> |
| </xsl:template> |
| |
| <xsl:template match="th"> |
| <xsl:variable name="pos" select="position()"/> |
| <xsl:text>\begin{minipage}[t]{</xsl:text> |
| <xsl:choose> |
| <xsl:when test="../../columnspec"> |
| <xsl:value-of select="../../columnspec/column[$pos]/@width"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select=".95 div last()"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| <xsl:text>\textwidth}\bfseries </xsl:text> |
| <xsl:apply-templates/> |
| <xsl:text>\end{minipage}</xsl:text> |
| <xsl:if test="not(position()=last())"> |
| <xsl:text> & </xsl:text> |
| </xsl:if> |
| </xsl:template> |
| |
| <!-- |
| This is a horrible hack, but it seems to mostly work. It does a |
| few things: |
| |
| 1. Transforms references starting in http:// to footnotes with the |
| appropriate hyperref macro to make them clickable. (This needs |
| to be expanded to deal with news: and needs to be adjusted to |
| deal with "#", which is creating bad links at the moment.) |
| |
| 2. For intra-document references, constructs the appropriate absolute |
| reference using a latex \pageref. |
| This involves applying a simplified version of the |
| general URL resolution rules to deal with ../. It only works for |
| one level of subdirectory. |
| |
| 3. It is also necessary to deal with the fact that index pages |
| get references as "/". |
| --> |
| <xsl:template match="a" mode="tabular"> |
| <xsl:apply-templates mode="tabular"/> |
| <xsl:call-template name="a"/> |
| </xsl:template> |
| |
| <xsl:template match="a"> |
| <xsl:apply-templates/> |
| <xsl:call-template name="a"/> |
| </xsl:template> |
| |
| <xsl:template name="a"> |
| <xsl:if test="@href"> |
| <xsl:variable name="relpath" select="document(/*/@metafile)/metafile/relpath" /> |
| <xsl:variable name="path" select="document(/*/@metafile)/metafile/path" /> |
| <xsl:variable name="href"> |
| <xsl:choose> |
| <xsl:when test="starts-with(@href, './')"> |
| <xsl:value-of select="substring(@href, 3)" /> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="@href" /> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| <xsl:variable name="fileref"> |
| <xsl:choose> |
| <xsl:when test="contains($href, '.html')"> |
| <xsl:value-of select="substring-before($href, '.html')"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="concat($href, 'index')"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:variable> |
| <xsl:choose> |
| |
| <xsl:when test="starts-with(@href, 'http:') or starts-with(@href, 'https:') or starts-with(@href, 'ftp:') or starts-with(@href, 'news:') or starts-with(@href, 'mailto:')"> |
| <xsl:if test="not(.=@href)"> |
| <xsl:text>\footnote{</xsl:text> |
| <xsl:text>\href{</xsl:text> |
| <xsl:call-template name="replace-string"> |
| <xsl:with-param name="replace" select="'%'"/> |
| <xsl:with-param name="with" select="'\%'"/> |
| <xsl:with-param name="text"> |
| <xsl:call-template name="replace-string"> |
| <xsl:with-param name="replace" select="'_'"/> |
| <xsl:with-param name="with" select="'\_'"/> |
| <xsl:with-param name="text"> |
| <xsl:call-template name="replace-string"> |
| <xsl:with-param name="replace" select="'#'"/> |
| <xsl:with-param name="with" select="'\#'"/> |
| <xsl:with-param name="text" select="@href"/> |
| </xsl:call-template> |
| </xsl:with-param> |
| </xsl:call-template> |
| </xsl:with-param> |
| </xsl:call-template> |
| <xsl:text>}{</xsl:text> |
| <xsl:call-template name="ltescape"> |
| <xsl:with-param name="string" select="@href"/> |
| </xsl:call-template> |
| <xsl:text>}}</xsl:text> |
| </xsl:if> |
| </xsl:when> |
| <xsl:when test="starts-with(@href, '#')"> |
| <!-- Don't do inter-section references --> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:text> (p.\ \pageref{</xsl:text> |
| <xsl:call-template name="replace-string"> |
| <xsl:with-param name="replace" select="'#'"/> |
| <xsl:with-param name="with" select="':'"/> |
| <xsl:with-param name="text"> |
| <xsl:choose> |
| <xsl:when test="$relpath='.'"> |
| <xsl:value-of select="concat('/',$fileref)"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:choose> |
| <xsl:when test="starts-with($fileref,'..')"> |
| <xsl:value-of select="substring-after($fileref,'..')"/> |
| </xsl:when> |
| <xsl:otherwise> |
| <xsl:value-of select="concat($path,$fileref)"/> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:with-param> |
| </xsl:call-template> |
| <xsl:text>}) </xsl:text> |
| </xsl:otherwise> |
| </xsl:choose> |
| </xsl:if> |
| </xsl:template> |
| |
| <xsl:template match="img"> |
| <xsl:call-template name="img"/> |
| </xsl:template> |
| |
| <xsl:template match="img" mode="tabular"> |
| <xsl:call-template name="img"/> |
| </xsl:template> |
| |
| <xsl:template name="img"> |
| <xsl:variable name="path" select="document(/*/@metafile)/metafile/path" /> |
| <xsl:text>\includegraphics{</xsl:text> |
| <xsl:call-template name="replace-string"> |
| <xsl:with-param name="text" select="concat('.',$path,@src)"/> |
| <xsl:with-param name="replace" select="'.gif'"/> |
| <xsl:with-param name="with" select="''"/> |
| </xsl:call-template> |
| <xsl:text>}</xsl:text> |
| </xsl:template> |
| |
| </xsl:stylesheet> |