<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:local="http://www.pantor.com/ns/local" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns:exsl="http://exslt.org/common" xmlns:teix="http://www.tei-c.org/ns/Examples" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:edate="http://exslt.org/dates-and-times" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xd="http://www.pnp-software.com/XSLTdoc" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:estr="http://exslt.org/strings" 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