XML source view

`
<xsl:stylesheet xmlns:local="http://www.pantor.com/ns/local" xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:teix="http://www.tei-c.org/ns/Examples" xmlns:svg="http://www.w3.org/2000/svg" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:edate="http://exslt.org/dates-and-times" xmlns:xd="http://www.pnp-software.com/XSLTdoc" xmlns:estr="http://exslt.org/strings" xmlns:exsl="http://exslt.org/common" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="exsl estr edate svg a fo local rng tei teix xd m" extension-element-prefixes="exsl estr edate" version="1.0">
<xd:doc type="stylesheet">
<xd:short> TEI stylesheet dealing with elements from the figures module,
making HTML output. </xd:short>
<xd:detail> This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version. This library is
distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details. You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA </xd:detail>
<xd:author>See AUTHORS</xd:author>
<xd:cvsId>$Id: figures.xsl 4801 2008-09-13 10:05:32Z rahtz $</xd:cvsId>
<xd:copyright>2008, TEI Consortium</xd:copyright>
</xd:doc>
<xd:doc>
<xd:short>Process elements m:*|@*|comment()|processing-instruction()|text()</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="m:*|@*|comment()|processing-instruction()|text()" mode="math">
<xsl:copy>
<xsl:apply-templates mode="math" select="*|@*|processing-instruction()|text()" />
</xsl:copy>
</xsl:template>
<xd:doc>
<xd:short>Process elements m:math</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="m:math">
<m:math>
<xsl:copy-of select="@*" />
<xsl:apply-templates mode="math" />
</m:math>
</xsl:template>
<xd:doc>
<xd:short>Process elements tei:cell</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:cell">
<td valign="top">
<xsl:for-each select="@*">
<xsl:choose>
<xsl:when test="name(.) = 'width' or name(.) = 'border' or name(.) = 'cellspacing' or name(.) = 'cellpadding'">
<xsl:copy-of select="." />
</xsl:when>
<xsl:when test="name(.)='rend' and starts-with(.,'width:')">
<xsl:attribute name="width">
<xsl:value-of select="substring-after(.,'width:')" />
</xsl:attribute>
</xsl:when>
<xsl:when test="name(.)='rend' and starts-with(.,'class:')">
<xsl:attribute name="class">
<xsl:value-of select="substring-after(.,'class:')" />
</xsl:attribute>
</xsl:when>
<xsl:when test="name(.)='rend' and starts-with(.,'style=')">
<xsl:attribute name="style">
<xsl:value-of select="substring-after(.,'style=')" />
</xsl:attribute>
</xsl:when>
<xsl:when test="name(.)='rend'">
<xsl:attribute name="class">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:when>
<xsl:when test="name(.)='cols'">
<xsl:attribute name="colspan">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:when>
<xsl:when test="name(.)='rows'">
<xsl:attribute name="rowspan">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:when>
<xsl:when test="name(.)='align'">
<xsl:attribute name="align">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:for-each>
<xsl:if test="not(@align) and not($cellAlign='left')">
<xsl:attribute name="align">
<xsl:value-of select="$cellAlign" />
</xsl:attribute>
</xsl:if>
<xsl:if test="@role and not (@rend)">
<xsl:attribute name="class">
<xsl:value-of select="@role" />
</xsl:attribute>
</xsl:if>
<xsl:call-template name="makeAnchor" />
<xsl:apply-templates />
</td>
</xsl:template>
<xd:doc>
<xd:short>Process elements tei:figDesc</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:figDesc" />
<xd:doc>
<xd:short>Process elements tei:figure</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:figure">
<xsl:choose>
<xsl:when test="@rend='inline' or @place='inline'">
<xsl:call-template name="showGraphic" />
</xsl:when>
<xsl:when test="parent::tei:ref or parent::tei:xref">
<xsl:call-template name="showGraphic" />
</xsl:when>
<xsl:otherwise>
<div>
<xsl:choose>
<xsl:when test="@rend">
<xsl:attribute name="class">
<xsl:value-of select="@rend" />
</xsl:attribute>
</xsl:when>
<xsl:when test="@rendition">
<xsl:call-template name="applyRendition" />
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="class">
<xsl:text>figure</xsl:text>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="@xml:id">
<xsl:choose>
<xsl:when test="$xhtml='true'">
<xsl:attribute name="id">
<xsl:value-of select="@xml:id" />
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<a class="f" name="{@xml:id}">
<xsl:comment> </xsl:comment>
</a>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="@file|@url|@entity">
<xsl:call-template name="showGraphic" />
</xsl:if>
<xsl:call-template name="figureHook" />
<xsl:apply-templates />
<xsl:if test="tei:head">
<div class="caption">
<xsl:choose>
<xsl:when test="ancestor::tei:front and $numberFrontFigures='true'">
<xsl:call-template name="i18n">
<xsl:with-param name="word">figureWord</xsl:with-param>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:number count="tei:figure[tei:head]" from="tei:front" level="any" />
<xsl:text>. </xsl:text>
</xsl:when>
<xsl:when test="ancestor::tei:back and $numberBackFigures='true'">
<xsl:call-template name="i18n">
<xsl:with-param name="word">figureWord</xsl:with-param>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:number count="tei:figure[tei:head]" from="tei:back" level="any" />
<xsl:text>. </xsl:text>
</xsl:when>
<xsl:when test="ancestor::tei:body and $numberFigures='true'">
<xsl:call-template name="i18n">
<xsl:with-param name="word">figureWord</xsl:with-param>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:number count="tei:figure[tei:head]" from="tei:body" level="any" />
<xsl:text>. </xsl:text>
</xsl:when>
</xsl:choose>
<xsl:apply-templates select="tei:head" mode="ok" />
</div>
</xsl:if>
</div>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xd:doc>
<xd:short>Process elements tei:figure/tei:head</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:figure/tei:head" />
<xd:doc>
<xd:short>Process elements tei:formula</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:formula" mode="xref">
<xsl:number />
</xsl:template>
<xd:doc>
<xd:short>Process elements tei:graphic</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:graphic">
<xsl:if test="@xml:id and not($xhtml='true')">
<a class="g" name="{@xml:id}">
<xsl:comment> </xsl:comment>
</a>
</xsl:if>
<xsl:call-template name="showGraphic" />
</xsl:template>
<xd:doc>
<xd:short>Process elements tei:row</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:row">
<tr>
<xsl:call-template name="rendToClass" />
<xsl:if test="@role">
<xsl:attribute name="class">
<xsl:value-of select="@role" />
</xsl:attribute>
</xsl:if>
<xsl:apply-templates />
</tr>
</xsl:template>
<xd:doc>
<xd:short>Process elements tei:table</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:table">
<div>
<xsl:attribute name="class">
<xsl:text>table</xsl:text>
<xsl:if test="@align">
<xsl:text> </xsl:text>
<xsl:value-of select="@align" />
</xsl:if>
</xsl:attribute>
<xsl:call-template name="makeAnchor" />
<table>
<xsl:call-template name="rendToClass">
<xsl:with-param name="id">false</xsl:with-param>
</xsl:call-template>
<xsl:if test="@rend='frame' or @rend='rules'">
<xsl:attribute name="rules">all</xsl:attribute>
<xsl:attribute name="border">1</xsl:attribute>
</xsl:if>
<xsl:for-each select="@*">
<xsl:if test="name(.)='summary' or name(.) = 'width' or name(.) = 'border' or name(.) = 'frame' or name(.) = 'rules' or name(.) = 'cellspacing' or name(.) = 'cellpadding'">
<xsl:copy-of select="." />
</xsl:if>
</xsl:for-each>
<xsl:if test="tei:head">
<caption>
<xsl:apply-templates mode="xref" select="." />
</caption>
</xsl:if>
<xsl:apply-templates select="tei:row" />
</table>
</div>
</xsl:template>
<xd:doc>
<xd:short>Process elements tei:table[@rend='simple']</xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template match="tei:table[@rend='simple']">
<table>
<xsl:choose>
<xsl:when test="@rend">
<xsl:attribute name="class">
<xsl:value-of select="@rend" />
</xsl:attribute>
</xsl:when>
<xsl:when test="@rendition">
<xsl:call-template name="applyRendition" />
</xsl:when>
</xsl:choose>
<xsl:for-each select="@*">
<xsl:if test="name(.)='summary' or name(.) = 'width' or name(.) = 'border' or name(.) = 'frame' or name(.) = 'rules' or name(.) = 'cellspacing' or name(.) = 'cellpadding'">
<xsl:copy-of select="." />
</xsl:if>
</xsl:for-each>
<xsl:call-template name="makeAnchor" />
<xsl:apply-templates />
</table>
</xsl:template>
<xd:doc>
<xd:short>[html] </xd:short>
<xd:param name="name">name</xd:param>
<xd:param name="value">value</xd:param>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template name="setDimension">
<xsl:param name="name" />
<xsl:param name="value" />
<xsl:variable name="calcvalue">
<xsl:choose>
<xsl:when test="contains($value,'in')">
<xsl:value-of select="round($dpi * substring-before($value,'in'))" />
</xsl:when>
<xsl:when test="contains($value,'pt')">
<xsl:value-of select="round($dpi * (substring-before($value,'pt') div 72))" />
</xsl:when>
<xsl:when test="contains($value,'cm')">
<xsl:value-of select="round($dpi * ( substring-before($value,'cm') div 2.54 ))" />
</xsl:when>
<xsl:when test="contains($value,'px')">
<xsl:value-of select="substring-before($value,'px')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$value" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:attribute name="{$name}">
<xsl:value-of select="$calcvalue" />
</xsl:attribute>
</xsl:template>
<xd:doc>
<xd:short>[html] </xd:short>
<xd:detail> </xd:detail>
</xd:doc>
<xsl:template name="showGraphic">
<xsl:variable name="File">
<xsl:choose>
<xsl:when test="@url">
<xsl:value-of select="@url" />
<xsl:if test="not(contains(@url,'.'))">
<xsl:value-of select="$graphicsSuffix" />
</xsl:if>
</xsl:when>
<xsl:when test="@file">
<xsl:value-of select="@file" />
<xsl:if test="not(contains(@file,'.'))">
<xsl:value-of select="$graphicsSuffix" />
</xsl:if>
</xsl:when>
<xsl:when test="@entity">
<xsl:variable name="entity">
<xsl:value-of select="unparsed-entity-uri(@entity)" />
</xsl:variable>
<xsl:choose>
<xsl:when test="starts-with($entity,'file:')">
<xsl:value-of select="substring-after($entity,'file:')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$entity" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">Cannot work out how to do a graphic
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="Alt">
<xsl:choose>
<xsl:when test="tei:figDesc">
<xsl:for-each select="tei:figDesc">
<xsl:apply-templates mode="plain" />
</xsl:for-each>
</xsl:when>
<xsl:when test="tei:head">
<xsl:value-of select="tei:head/text()" />
</xsl:when>
<xsl:when test="parent::tei:figure/tei:figDesc">
<xsl:for-each select="parent::tei:figure/tei:figDesc">
<xsl:apply-templates mode="plain" />
</xsl:for-each>
</xsl:when>
<xsl:when test="parent::tei:figure/tei:head">
<xsl:value-of select="parent::tei:figure/tei:head/text()" />
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="$showFigures='true'">
<img src="{$graphicsPrefix}{$File}">
<xsl:attribute name="alt">
<xsl:value-of select="$Alt" />
</xsl:attribute>
<xsl:call-template name="imgHook" />
<xsl:if test="@xml:id and $xhtml='true'">
<xsl:attribute name="id">
<xsl:value-of select="@xml:id" />
</xsl:attribute>
</xsl:if>
<xsl:call-template name="rendToClass" />
<xsl:if test="@width">
<xsl:call-template name="setDimension">
<xsl:with-param name="value">
<xsl:value-of select="@width" />
</xsl:with-param>
<xsl:with-param name="name">width</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:if test="@height">
<xsl:call-template name="setDimension">
<xsl:with-param name="value">
<xsl:value-of select="@height" />
</xsl:with-param>
<xsl:with-param name="name">height</xsl:with-param>
</xsl:call-template>
</xsl:if>
</img>
</xsl:when>
<xsl:otherwise>
<hr />
<p><xsl:call-template name="i18n">
<xsl:with-param name="word">figureWord</xsl:with-param>
</xsl:call-template>
<xsl:text> </xsl:text>
<xsl:for-each select="self::tei:figure|parent::tei:figure">
<xsl:number count="tei:figure[tei:head]" level="any" />
</xsl:for-each>
<xsl:text> </xsl:text>
<xsl:value-of select="$File" />
<xsl:text> [</xsl:text>
<xsl:value-of select="$Alt" />
<xsl:text>] </xsl:text>
</p>
<hr />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="tei:binaryObject">
<img>
<xsl:attribute name="src">
<xsl:text>data:</xsl:text>
<xsl:value-of select="@mimetype" />
<xsl:text>;base64,</xsl:text>
<xsl:copy-of select="text()" />
</xsl:attribute>
<xsl:if test="@width">
<xsl:call-template name="setDimension">
<xsl:with-param name="value">
<xsl:value-of select="@width" />
</xsl:with-param>
<xsl:with-param name="name">width</xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:if test="@height">
<xsl:call-template name="setDimension">
<xsl:with-param name="value">
<xsl:value-of select="@height" />
</xsl:with-param>
<xsl:with-param name="name">height</xsl:with-param>
</xsl:call-template>
</xsl:if>
</img>
<!-- also alt -->
<!-- this is what we'll need for IE:
<style type="text/css">
img {behavior: expression(fixBase64(this));}
</style>
<script type="text/javascript">
// a regular expression to test for Base64 data
var BASE64_DATA = /^data:.*;base64/i;
// path to the PHP module that will decode the encoded data
var base64Path = "/my/base64.php";
function fixBase64(img) {
// stop the CSS expression from being endlessly evaluated
img.runtimeStyle.behavior = "none";
// check the image src
if (BASE64_DATA.test(img.src)) {
// pass the data to the PHP routine
img.src = base64Path + "?" + img.src.slice(5);
}
};
</script>
Dean Edwards http://dean.edwards.name/weblog/2005/06/base64-sexy/
<?php
$data = split(";", $_SERVER["REDIRECT_QUERY_STRING"]);
$type = $data[0];
$data = split(",", $data[1]);
header("Content-type: ".$type);
echo base64_decode($data[1]);
?>
-->
</xsl:template>
<xsl:template match="svg:*">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
`
v