aboutsummaryrefslogtreecommitdiff
path: root/t/test-site/src/common/reST.xsl
diff options
context:
space:
mode:
Diffstat (limited to 't/test-site/src/common/reST.xsl')
-rw-r--r--t/test-site/src/common/reST.xsl393
1 files changed, 393 insertions, 0 deletions
diff --git a/t/test-site/src/common/reST.xsl b/t/test-site/src/common/reST.xsl
new file mode 100644
index 0000000..7db5de2
--- /dev/null
+++ b/t/test-site/src/common/reST.xsl
@@ -0,0 +1,393 @@
+<!--
+ Copyright (c) 2006, Michael Alyn Miller <malyn@strangeGizmo.com>.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice unmodified, this list of conditions, and the following
+ disclaimer.
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ 3. Neither the name of Michael Alyn Miller nor the names of the
+ contributors to this software may be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+-->
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns="http://www.w3.org/1999/xhtml">
+
+
+
+<!-- Suppress the reST document title, information, and topic name.
+ These values should be pulled in by the main XSL template. -->
+<xsl:template match="/document/title" />
+<xsl:template match="/document/docinfo" />
+<xsl:template match="/document/topic" />
+
+<!-- Suppress all field lists. These are only used for 'special
+ features' implemented by the author of the site-specific reST
+ content. -->
+<xsl:template match="field_list" />
+<xsl:template match="comment" />
+
+
+<!-- ===================================================================
+ Inline elements.
+ -->
+
+<xsl:template match="emphasis">
+ <em><xsl:apply-templates /></em>
+</xsl:template>
+
+<xsl:template match="literal">
+ <tt><xsl:apply-templates /></tt>
+</xsl:template>
+
+<xsl:template match="reference">
+ <xsl:element name="a">
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="@refid">
+ <xsl:value-of select="concat('#', @refid)" />
+ </xsl:when>
+ <xsl:when test="@refuri">
+ <xsl:value-of select="@refuri" />
+ </xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:apply-templates />
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="strong">
+ <strong><xsl:apply-templates /></strong>
+</xsl:template>
+
+
+
+<!-- ===================================================================
+ Body elements.
+ -->
+
+
+<!-- Generic body elements. -->
+<xsl:template match="image">
+ <xsl:element name="img">
+ <xsl:attribute name="src">
+ <xsl:value-of select="@uri" />
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="@alt" />
+ </xsl:attribute>
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width" />
+ </xsl:attribute>
+ <xsl:attribute name="height">
+ <xsl:value-of select="@height" />
+ </xsl:attribute>
+ </xsl:element>
+</xsl:template>
+
+
+<xsl:template match="line_block">
+ <div class="line-block">
+ <xsl:apply-templates />
+ </div>
+</xsl:template>
+
+<xsl:template match="line_block/line">
+ <xsl:apply-templates /><br />
+</xsl:template>
+
+
+<xsl:template match="literal_block">
+ <div class="literal-block"><xsl:apply-templates /></div>
+</xsl:template>
+
+<xsl:template match="literal_block/br">
+ <br />
+</xsl:template>
+
+
+<xsl:template match="paragraph">
+ <p><xsl:apply-templates /></p>
+</xsl:template>
+
+<xsl:template match="substitution_definition" />
+
+
+
+<!-- reST block quotes get prepended with a paragraph that reads
+ "ATTRIBUTION wrote:" where ATTRIBUTION is the contents of the
+ reStructuredText attribution (the information after the
+ double-hyphens). -->
+<xsl:template match="block_quote">
+ <blockquote>
+ <xsl:apply-templates/>
+ </blockquote>
+
+ <xsl:if test="./attribution">
+ <div class="cite">
+ <span class="cite_label">Source: </span>
+ <cite><xsl:apply-templates select="attribution/*|attribution/text()" /></cite>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- Suppress block_quote/attribution elements since we grab the text of
+ the attribution from the block_quote template. -->
+<xsl:template match="block_quote/attribution" />
+
+
+<!-- Footnote references are wrapped in brackets ([..]) and enclosed in
+ an anchor tag with the class "footnoteref". -->
+<xsl:template match="footnote_reference">
+ <xsl:element name="a">
+ <xsl:attribute name="class">footnoteref</xsl:attribute>
+ <xsl:attribute name="id">
+ <xsl:text>footnote-backref-</xsl:text>
+ <xsl:value-of select="@ids" />
+ </xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:text>#footnote-</xsl:text>
+ <xsl:value-of select="@refid" />
+ </xsl:attribute>
+
+ <xsl:text>[</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>]</xsl:text>
+ </xsl:element>
+</xsl:template>
+
+<!-- The footnote itself is wrapped in a div tag with a class of
+ "footnote". The footnote begins with an anchor tag (class name
+ "footnotereturn") that links back to the part of the document where
+ the footnote appeared. -->
+<xsl:template match="footnote">
+ <xsl:element name="div">
+ <xsl:attribute name="class">footnote</xsl:attribute>
+ <xsl:attribute name="id">
+ <xsl:text>footnote-</xsl:text>
+ <xsl:value-of select="@ids" />
+ </xsl:attribute>
+
+ <xsl:element name="a">
+ <xsl:attribute name="class">footnotereturn</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:text>#footnote-backref-</xsl:text>
+ <xsl:value-of select="@backrefs" />
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:text>return to content</xsl:text>
+ </xsl:attribute>
+
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="label" />
+ <xsl:text>: </xsl:text>
+ </xsl:element>
+
+ <xsl:apply-templates />
+ </xsl:element>
+</xsl:template>
+<xsl:template match="footnote/label" />
+
+
+<!-- Basic lists. -->
+<xsl:template match="bullet_list">
+ <ul><xsl:apply-templates /></ul>
+</xsl:template>
+
+<xsl:template match="enumerated_list">
+ <ol><xsl:apply-templates /></ol>
+</xsl:template>
+
+<!-- Basic list items. -->
+<xsl:template match="list_item">
+ <li><xsl:apply-templates /></li>
+</xsl:template>
+
+<!-- TODO Lists are currently stripped of their paragraph wrapping.
+ This may or may not be what you want. You could use a match value
+ of "list_item/paragraph[count(child::*) = 0]" to detect simple vs.
+ complex paragraphs, although this would also catch inline elements.
+ A stunningly-complex match value should probably be created to
+ detect the list type (simple or complex) and then put all of the
+ items into the same wrapper (either a p tag or a bare list item). -->
+<xsl:template match="list_item/paragraph">
+<xsl:apply-templates />
+</xsl:template>
+
+
+<!-- Definition lists. -->
+<xsl:template match="definition_list">
+ <dl><xsl:apply-templates /></dl>
+</xsl:template>
+
+<xsl:template match="definition_list_item/term">
+ <dt><xsl:apply-templates /></dt>
+</xsl:template>
+
+<xsl:template match="definition_list_item/definition">
+ <dd><xsl:apply-templates /></dd>
+</xsl:template>
+
+
+<!-- Option lists. -->
+<xsl:template match="option_list">
+ <table class="option-list" cellpadding="0" cellspacing="0">
+ <tr>
+ <th>Option</th>
+ <th>Description</th>
+ </tr>
+
+ <xsl:apply-templates />
+ </table>
+</xsl:template>
+
+<xsl:template match="option_list_item">
+ <tr><xsl:apply-templates /></tr>
+</xsl:template>
+
+<xsl:template match="option_group">
+ <td>
+ <xsl:for-each select="option">
+ <xsl:apply-templates select="." /><br />
+ </xsl:for-each>
+ </td>
+</xsl:template>
+
+<xsl:template match="option_group/option">
+ <span class="option-string"><xsl:value-of select="option_string" /></span>
+ <xsl:if test="option_argument">
+ <span class="option-delimiter"><xsl:value-of select="option_argument/@delimiter" /></span>
+ <span class="option-argument"><xsl:value-of select="option_argument" /></span>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="option_list_item/description">
+ <td><xsl:apply-templates /></td>
+</xsl:template>
+
+
+<!-- Raw HTML elements are passed straight through. Note that this
+ assumes that the output document is an XHTML document. -->
+<xsl:template match="raw[@format='html']">
+ <xsl:value-of select="." disable-output-escaping="yes" />
+</xsl:template>
+
+
+<!-- Section titles are wrapped in a heading tag. The heading level
+ (h1, h2, h3, etc.) is set by counting the number of parent sections
+ that this section is enclosed in. -->
+<xsl:template match="section/title">
+ <xsl:element name="{concat('h', format-number(count(ancestor::section), '#'))}">
+ <xsl:attribute name="id">
+ <xsl:value-of select="parent::section/@ids" />
+ </xsl:attribute>
+
+ <xsl:apply-templates />
+ </xsl:element>
+</xsl:template>
+
+
+<!-- Tables.
+
+ These are pretty much handled as you would expect. The only custom
+ feature is a pair of special fields that can be used to control the
+ horizontal and vertical alignment of the table cells.
+
+ If you want to set a custom horizontal alignment, include the field
+ ":table-cell-halign:" directly before the table. Each of the cells
+ (td elements) will include an "align" attribute with the specified
+ value.
+
+ A similar field exists for specifying the valign value. This field
+ is called ":table-cell-valign:". -->
+<xsl:template match="table">
+ <table cellpadding="0" cellspacing="0"><xsl:apply-templates /></table>
+</xsl:template>
+
+<xsl:template match="thead">
+ <thead><xsl:apply-templates /></thead>
+</xsl:template>
+
+<xsl:template match="thead/row">
+ <tr><xsl:apply-templates /></tr>
+</xsl:template>
+
+<xsl:template match="thead/row/entry">
+ <xsl:element name="th">
+ <xsl:if test="@morecols">
+ <xsl:attribute name="colspan">
+ <xsl:value-of select="format-number(1 + @morecols, '#')" />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@morerows">
+ <xsl:attribute name="rowspan">
+ <xsl:value-of select="format-number(1 + @morerows, '#')" />
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates />
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="tbody">
+ <tbody><xsl:apply-templates /></tbody>
+</xsl:template>
+
+<xsl:template match="tbody/row">
+ <tr><xsl:apply-templates /></tr>
+</xsl:template>
+
+<xsl:template match="tbody/row/entry">
+ <xsl:element name="td">
+ <xsl:if test="@morecols">
+ <xsl:attribute name="colspan">
+ <xsl:value-of select="format-number(1 + @morecols, '#')" />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@morerows">
+ <xsl:attribute name="rowspan">
+ <xsl:value-of select="format-number(1 + @morerows, '#')" />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="ancestor::table/preceding-sibling::*[1]/field/field_name[text()='table-cell-halign']">
+ <xsl:attribute name="align">
+ <xsl:value-of select="ancestor::table/preceding-sibling::*[1]/field/field_name[text()='table-cell-halign']/../field_body/paragraph" />
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="ancestor::table/preceding-sibling::*[1]/field/field_name[text()='table-cell-valign']">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="ancestor::table/preceding-sibling::*[1]/field/field_name[text()='table-cell-valign']/../field_body/paragraph" />
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates />
+ </xsl:element>
+</xsl:template>
+
+
+</xsl:stylesheet>