diff options
Diffstat (limited to 'html/graphics.xsl')
-rw-r--r-- | html/graphics.xsl | 1568 |
1 files changed, 1568 insertions, 0 deletions
diff --git a/html/graphics.xsl b/html/graphics.xsl new file mode 100644 index 0000000..da5bf9a --- /dev/null +++ b/html/graphics.xsl @@ -0,0 +1,1568 @@ +<?xml version='1.0'?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory" + xmlns:simg="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.ImageIntrinsics" + xmlns:ximg="xalan://com.nwalsh.xalan.ImageIntrinsics" + xmlns:xtext="xalan://com.nwalsh.xalan.Text" + xmlns:lxslt="http://xml.apache.org/xslt" + exclude-result-prefixes="xlink stext xtext lxslt simg ximg" + extension-element-prefixes="stext xtext" + version='1.0'> + +<!-- ******************************************************************** + $Id: graphics.xsl 9367 2012-05-12 23:46:35Z bobstayton $ + ******************************************************************** + + This file is part of the XSL DocBook Stylesheet distribution. + See ../README or http://docbook.sf.net/release/xsl/current/ for + copyright and other information. + + Contributors: + Colin Paul Adams, <colin@colina.demon.co.uk> + + ******************************************************************** --> + +<lxslt:component prefix="xtext" elements="insertfile"/> +<lxslt:component prefix="ximg" functions="new getWidth getDepth"/> + +<!-- ==================================================================== --> +<!-- Graphic format tests for the HTML backend --> + +<xsl:template name="is.graphic.format"> + <xsl:param name="format"></xsl:param> + <xsl:if test="$format = 'SVG' + or $format = 'PNG' + or $format = 'JPG' + or $format = 'JPEG' + or $format = 'linespecific' + or $format = 'GIF' + or $format = 'GIF87a' + or $format = 'GIF89a' + or $format = 'BMP'">1</xsl:if> +</xsl:template> + +<xsl:template name="is.graphic.extension"> + <xsl:param name="ext"></xsl:param> + <xsl:variable name="lcext" select="translate($ext, + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + 'abcdefghijklmnopqrstuvwxyz')"/> + <xsl:if test="$lcext = 'svg' + or $lcext = 'png' + or $lcext = 'jpeg' + or $lcext = 'jpg' + or $lcext = 'avi' + or $lcext = 'mpg' + or $lcext = 'mp4' + or $lcext = 'mpeg' + or $lcext = 'qt' + or $lcext = 'gif' + or $lcext = 'acc' + or $lcext = 'mp1' + or $lcext = 'mp2' + or $lcext = 'mp3' + or $lcext = 'mp4' + or $lcext = 'm4v' + or $lcext = 'm4a' + or $lcext = 'wav' + or $lcext = 'ogv' + or $lcext = 'ogg' + or $lcext = 'webm' + or $lcext = 'bmp'">1</xsl:if> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="screenshot"> + <div> + <xsl:apply-templates select="." mode="common.html.attributes"/> + <xsl:call-template name="id.attribute"/> + <xsl:apply-templates/> + </div> +</xsl:template> + +<xsl:template match="screeninfo"> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template name="process.image"> + <!-- When this template is called, the current node should be --> + <!-- a graphic, inlinegraphic, imagedata, or videodata. All --> + <!-- those elements have the same set of attributes, so we can --> + <!-- handle them all in one place. --> + <xsl:param name="tag" select="'img'"/> + <xsl:param name="alt"/> + <xsl:param name="longdesc"/> + + <!-- The HTML img element only supports the notion of content-area + scaling; it doesn't support the distinction between a + content-area and a viewport-area, so we have to make some + compromises. + + 1. If only the content-area is specified, everything is fine. + (If you ask for a three inch image, that's what you'll get.) + + 2. If only the viewport-area is provided: + - If scalefit=1, treat it as both the content-area and + the viewport-area. (If you ask for an image in a five inch + area, we'll make the image five inches to fill that area.) + - If scalefit=0, ignore the viewport-area specification. + + Note: this is not quite the right semantic and has the additional + problem that it can result in anamorphic scaling, which scalefit + should never cause. + + 3. If both the content-area and the viewport-area is specified + on a graphic element, ignore the viewport-area. + (If you ask for a three inch image in a five inch area, we'll assume + it's better to give you a three inch image in an unspecified area + than a five inch image in a five inch area. + + Relative units also cause problems. As a general rule, the stylesheets + are operating too early and too loosely coupled with the rendering engine + to know things like the current font size or the actual dimensions of + an image. Therefore: + + 1. We use a fixed size for pixels, $pixels.per.inch + + 2. We use a fixed size for "em"s, $points.per.em + + Percentages are problematic. In the following discussion, we speak + of width and contentwidth, but the same issues apply to depth and + contentdepth + + 1. A width of 50% means "half of the available space for the image." + That's fine. But note that in HTML, this is a dynamic property and + the image size will vary if the browser window is resized. + + 2. A contentwidth of 50% means "half of the actual image width". But + the stylesheets have no way to assess the image's actual size. Treating + this as a width of 50% is one possibility, but it produces behavior + (dynamic scaling) that seems entirely out of character with the + meaning. + + Instead, the stylesheets define a $nominal.image.width + and convert percentages to actual values based on that nominal size. + + Scale can be problematic. Scale applies to the contentwidth, so + a scale of 50 when a contentwidth is not specified is analagous to a + width of 50%. (If a contentwidth is specified, the scaling factor can + be applied to that value and no problem exists.) + + If scale is specified but contentwidth is not supplied, the + nominal.image.width is used to calculate a base size + for scaling. + + Warning: as a consequence of these decisions, unless the aspect ratio + of your image happens to be exactly the same as (nominal width / nominal height), + specifying contentwidth="50%" and contentdepth="50%" is NOT going to + scale the way you expect (or really, the way it should). + + Don't do that. In fact, a percentage value is not recommended for content + size at all. Use scale instead. + + Finally, align and valign are troublesome. Horizontal alignment is now + supported by wrapping the image in a <div align="{@align}"> (in block + contexts!). I can't think of anything (practical) to do about vertical + alignment. + --> + + <xsl:variable name="width-units"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0"></xsl:when> + <xsl:when test="@width"> + <xsl:call-template name="length-units"> + <xsl:with-param name="length" select="@width"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="not(@depth) and $default.image.width != ''"> + <xsl:call-template name="length-units"> + <xsl:with-param name="length" select="$default.image.width"/> + </xsl:call-template> + </xsl:when> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="width"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0"></xsl:when> + <xsl:when test="@width"> + <xsl:choose> + <xsl:when test="$width-units = '%'"> + <xsl:value-of select="@width"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="length-spec"> + <xsl:with-param name="length" select="@width"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:when test="not(@depth) and $default.image.width != ''"> + <xsl:value-of select="$default.image.width"/> + </xsl:when> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="scalefit"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0">0</xsl:when> + <xsl:when test="@contentwidth or @contentdepth">0</xsl:when> + <xsl:when test="@scale">0</xsl:when> + <xsl:when test="@scalefit"><xsl:value-of select="@scalefit"/></xsl:when> + <xsl:when test="$width != '' or @depth">1</xsl:when> + <xsl:otherwise>0</xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="scale"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0">1.0</xsl:when> + <xsl:when test="@contentwidth or @contentdepth">1.0</xsl:when> + <xsl:when test="@scale"> + <xsl:value-of select="@scale div 100.0"/> + </xsl:when> + <xsl:otherwise>1.0</xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="filename"> + <xsl:choose> + <xsl:when test="local-name(.) = 'graphic' + or local-name(.) = 'inlinegraphic'"> + <!-- handle legacy graphic and inlinegraphic by new template --> + <xsl:call-template name="mediaobject.filename"> + <xsl:with-param name="object" select="."/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <!-- imagedata, videodata, audiodata --> + <xsl:call-template name="mediaobject.filename"> + <xsl:with-param name="object" select=".."/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="output_filename"> + <xsl:choose> + <xsl:when test="@entityref"> + <xsl:value-of select="$filename"/> + </xsl:when> + <!-- + Moved test for $keep.relative.image.uris to template below: + <xsl:template match="@fileref"> + --> + <xsl:otherwise> + <xsl:value-of select="$filename"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="img.src.path.pi"> + <xsl:call-template name="pi.dbhtml_img.src.path"> + <xsl:with-param name="node" select=".."/> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="filename.for.graphicsize"> + <xsl:choose> + <xsl:when test="$img.src.path.pi != ''"> + <xsl:value-of select="concat($img.src.path.pi, $filename)"/> + </xsl:when> + <xsl:when test="$img.src.path != '' and + $graphicsize.use.img.src.path != 0 and + $tag = 'img' and + not(starts-with($filename, '/')) and + not(contains($filename, '://'))"> + <xsl:value-of select="concat($img.src.path, $filename)"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$filename"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="realintrinsicwidth"> + <!-- This funny compound test works around a bug in XSLTC --> + <xsl:choose> + <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0 + and not(@format='SVG')"> + <xsl:choose> + <xsl:when test="function-available('simg:getWidth')"> + <xsl:value-of select="simg:getWidth(simg:new($filename.for.graphicsize), + $nominal.image.width)"/> + </xsl:when> + <xsl:when test="function-available('ximg:getWidth')"> + <xsl:value-of select="ximg:getWidth(ximg:new($filename.for.graphicsize), + $nominal.image.width)"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="0"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="0"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="intrinsicwidth"> + <xsl:choose> + <xsl:when test="$realintrinsicwidth = 0"> + <xsl:value-of select="$nominal.image.width"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$realintrinsicwidth"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="intrinsicdepth"> + <!-- This funny compound test works around a bug in XSLTC --> + <xsl:choose> + <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0 + and not(@format='SVG')"> + <xsl:choose> + <xsl:when test="function-available('simg:getDepth')"> + <xsl:value-of select="simg:getDepth(simg:new($filename.for.graphicsize), + $nominal.image.depth)"/> + </xsl:when> + <xsl:when test="function-available('ximg:getDepth')"> + <xsl:value-of select="ximg:getDepth(ximg:new($filename.for.graphicsize), + $nominal.image.depth)"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$nominal.image.depth"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$nominal.image.depth"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="contentwidth"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0"></xsl:when> + <xsl:when test="@contentwidth"> + <xsl:variable name="units"> + <xsl:call-template name="length-units"> + <xsl:with-param name="length" select="@contentwidth"/> + </xsl:call-template> + </xsl:variable> + + <xsl:choose> + <xsl:when test="$units = '%'"> + <xsl:variable name="cmagnitude"> + <xsl:call-template name="length-magnitude"> + <xsl:with-param name="length" select="@contentwidth"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$intrinsicwidth * $cmagnitude div 100.0"/> + <xsl:text>px</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="length-spec"> + <xsl:with-param name="length" select="@contentwidth"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$intrinsicwidth"/> + <xsl:text>px</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="scaled.contentwidth"> + <xsl:if test="$contentwidth != ''"> + <xsl:variable name="cwidth.in.points"> + <xsl:call-template name="length-in-points"> + <xsl:with-param name="length" select="$contentwidth"/> + <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/> + <xsl:with-param name="em.size" select="$points.per.em"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$cwidth.in.points div 72.0 * $pixels.per.inch * $scale"/> + </xsl:if> + </xsl:variable> + + <xsl:variable name="html.width"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0"></xsl:when> + <xsl:when test="$width-units = '%'"> + <xsl:value-of select="$width"/> + </xsl:when> + <xsl:when test="$width != ''"> + <xsl:variable name="width.in.points"> + <xsl:call-template name="length-in-points"> + <xsl:with-param name="length" select="$width"/> + <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/> + <xsl:with-param name="em.size" select="$points.per.em"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="round($width.in.points div 72.0 * $pixels.per.inch)"/> + </xsl:when> + <xsl:otherwise></xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="contentdepth"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0"></xsl:when> + <xsl:when test="@contentdepth"> + <xsl:variable name="units"> + <xsl:call-template name="length-units"> + <xsl:with-param name="length" select="@contentdepth"/> + </xsl:call-template> + </xsl:variable> + + <xsl:choose> + <xsl:when test="$units = '%'"> + <xsl:variable name="cmagnitude"> + <xsl:call-template name="length-magnitude"> + <xsl:with-param name="length" select="@contentdepth"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$intrinsicdepth * $cmagnitude div 100.0"/> + <xsl:text>px</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="length-spec"> + <xsl:with-param name="length" select="@contentdepth"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$intrinsicdepth"/> + <xsl:text>px</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="scaled.contentdepth"> + <xsl:if test="$contentdepth != ''"> + <xsl:variable name="cdepth.in.points"> + <xsl:call-template name="length-in-points"> + <xsl:with-param name="length" select="$contentdepth"/> + <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/> + <xsl:with-param name="em.size" select="$points.per.em"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$cdepth.in.points div 72.0 * $pixels.per.inch * $scale"/> + </xsl:if> + </xsl:variable> + + <xsl:variable name="depth-units"> + <xsl:if test="@depth"> + <xsl:call-template name="length-units"> + <xsl:with-param name="length" select="@depth"/> + </xsl:call-template> + </xsl:if> + </xsl:variable> + + <xsl:variable name="depth"> + <xsl:if test="@depth"> + <xsl:choose> + <xsl:when test="$depth-units = '%'"> + <xsl:value-of select="@depth"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="length-spec"> + <xsl:with-param name="length" select="@depth"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + </xsl:variable> + + <xsl:variable name="html.depth"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0"></xsl:when> + <xsl:when test="$depth-units = '%'"> + <xsl:value-of select="$depth"/> + </xsl:when> + <xsl:when test="@depth and @depth != ''"> + <xsl:variable name="depth.in.points"> + <xsl:call-template name="length-in-points"> + <xsl:with-param name="length" select="$depth"/> + <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/> + <xsl:with-param name="em.size" select="$points.per.em"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="round($depth.in.points div 72.0 * $pixels.per.inch)"/> + </xsl:when> + <xsl:otherwise></xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="viewport"> + <xsl:choose> + <xsl:when test="$ignore.image.scaling != 0">0</xsl:when> + <xsl:when test="local-name(.) = 'inlinegraphic' + or ancestor::inlinemediaobject + or ancestor::inlineequation">0</xsl:when> + <xsl:otherwise> + <xsl:value-of select="$make.graphic.viewport"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + +<!-- + <xsl:message>===================================== +scale: <xsl:value-of select="$scale"/>, <xsl:value-of select="$scalefit"/> +@contentwidth <xsl:value-of select="@contentwidth"/> +$contentwidth <xsl:value-of select="$contentwidth"/> +scaled.contentwidth: <xsl:value-of select="$scaled.contentwidth"/> +@width: <xsl:value-of select="@width"/> +width: <xsl:value-of select="$width"/> +html.width: <xsl:value-of select="$html.width"/> +@contentdepth <xsl:value-of select="@contentdepth"/> +$contentdepth <xsl:value-of select="$contentdepth"/> +scaled.contentdepth: <xsl:value-of select="$scaled.contentdepth"/> +@depth: <xsl:value-of select="@depth"/> +depth: <xsl:value-of select="$depth"/> +html.depth: <xsl:value-of select="$html.depth"/> +align: <xsl:value-of select="@align"/> +valign: <xsl:value-of select="@valign"/></xsl:message> +--> + + <xsl:variable name="scaled" + select="@width|@depth|@contentwidth|@contentdepth + |@scale|@scalefit"/> + + <xsl:variable name="img"> + <xsl:choose> + <xsl:when test="@format = 'SVG'"> + <object type="image/svg+xml"> + <xsl:attribute name="data"> + <xsl:choose> + <xsl:when test="$img.src.path != '' and + $tag = 'img' and + not(starts-with($output_filename, '/')) and + not(contains($output_filename, '://'))"> + <xsl:value-of select="$img.src.path"/> + </xsl:when> + </xsl:choose> + <xsl:value-of select="$output_filename"/> + </xsl:attribute> + <xsl:call-template name="process.image.attributes"> + <!--xsl:with-param name="alt" select="$alt"/ there's no alt here--> + <xsl:with-param name="html.depth" select="$html.depth"/> + <xsl:with-param name="html.width" select="$html.width"/> + <xsl:with-param name="longdesc" select="$longdesc"/> + <xsl:with-param name="scale" select="$scale"/> + <xsl:with-param name="scalefit" select="$scalefit"/> + <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/> + <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/> + <xsl:with-param name="viewport" select="$viewport"/> + </xsl:call-template> + <xsl:if test="@align"> + <xsl:attribute name="align"> + <xsl:choose> + <xsl:when test="@align = 'center'">middle</xsl:when> + <xsl:otherwise> + <xsl:value-of select="@align"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:if> + <xsl:if test="$use.embed.for.svg != 0"> + <embed type="image/svg+xml"> + <xsl:attribute name="src"> + <xsl:choose> + <xsl:when test="$img.src.path != '' and + $tag = 'img' and + not(starts-with($output_filename, '/')) and + not(contains($output_filename, '://'))"> + <xsl:value-of select="$img.src.path"/> + </xsl:when> + </xsl:choose> + <xsl:value-of select="$output_filename"/> + </xsl:attribute> + <xsl:call-template name="process.image.attributes"> + <!--xsl:with-param name="alt" select="$alt"/ there's no alt here --> + <xsl:with-param name="html.depth" select="$html.depth"/> + <xsl:with-param name="html.width" select="$html.width"/> + <xsl:with-param name="longdesc" select="$longdesc"/> + <xsl:with-param name="scale" select="$scale"/> + <xsl:with-param name="scalefit" select="$scalefit"/> + <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/> + <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/> + <xsl:with-param name="viewport" select="$viewport"/> + </xsl:call-template> + </embed> + </xsl:if> + </object> + </xsl:when> + <xsl:otherwise> + <xsl:element name="{$tag}"> + <xsl:if test="$tag = 'img' and ../../self::imageobjectco"> + <xsl:variable name="mapname"> + <xsl:call-template name="object.id"> + <xsl:with-param name="object" select="../../areaspec"/> + </xsl:call-template> + </xsl:variable> + <xsl:choose> + <xsl:when test="$scaled"> + <!-- It might be possible to handle some scaling; needs --> + <!-- more investigation --> + <xsl:message> + <xsl:text>Warning: imagemaps not supported </xsl:text> + <xsl:text>on scaled images</xsl:text> + </xsl:message> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="border">0</xsl:attribute> + <xsl:attribute name="usemap"> + <xsl:value-of select="concat('#', $mapname)"/> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + + <xsl:attribute name="src"> + <xsl:choose> + <xsl:when test="$img.src.path != '' and + $tag = 'img' and + not(starts-with($output_filename, '/')) and + not(contains($output_filename, '://'))"> + <xsl:value-of select="$img.src.path"/> + </xsl:when> + </xsl:choose> + <xsl:value-of select="$output_filename"/> + </xsl:attribute> + + <xsl:if test="@align"> + <xsl:attribute name="align"> + <xsl:choose> + <xsl:when test="@align = 'center'">middle</xsl:when> + <xsl:otherwise> + <xsl:value-of select="@align"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:if> + + <xsl:call-template name="process.image.attributes"> + <xsl:with-param name="alt"> + <xsl:choose> + <xsl:when test="$alt != ''"> + <xsl:copy-of select="$alt"/> + </xsl:when> + <xsl:when test="ancestor::figure"> + <xsl:value-of select="normalize-space(ancestor::figure/title)"/> + </xsl:when> + </xsl:choose> + </xsl:with-param> + <xsl:with-param name="html.depth" select="$html.depth"/> + <xsl:with-param name="html.width" select="$html.width"/> + <xsl:with-param name="longdesc" select="$longdesc"/> + <xsl:with-param name="scale" select="$scale"/> + <xsl:with-param name="scalefit" select="$scalefit"/> + <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/> + <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/> + <xsl:with-param name="viewport" select="$viewport"/> + </xsl:call-template> + </xsl:element> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="bgcolor"> + <xsl:call-template name="pi.dbhtml_background-color"> + <xsl:with-param name="node" select=".."/> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="use.viewport" + select="$viewport != 0 + and ($html.width != '' + or ($html.depth != '' and $depth-units != '%') + or $bgcolor != '' + or @valign)"/> + + <xsl:choose> + <xsl:when test="$use.viewport"> + <table border="{$table.border.off}"> + <xsl:if test="$div.element != 'section'"> + <xsl:attribute name="summary">manufactured viewport for HTML img</xsl:attribute> + </xsl:if> + <xsl:if test="$css.decoration != ''"> + <xsl:attribute name="style">cellpadding: 0; cellspacing: 0;</xsl:attribute> + </xsl:if> + <xsl:if test="$html.width != ''"> + <xsl:attribute name="width"> + <xsl:value-of select="$html.width"/> + </xsl:attribute> + </xsl:if> + <tr> + <xsl:if test="$html.depth != '' and $depth-units != '%'"> + <!-- don't do this for percentages because browsers get confused --> + <xsl:choose> + <xsl:when test="$css.decoration != 0"> + <xsl:attribute name="style"> + <xsl:text>height: </xsl:text> + <xsl:value-of select="$html.depth"/> + <xsl:text>px</xsl:text> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="height"> + <xsl:value-of select="$html.depth"/> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + <td> + <xsl:if test="$bgcolor != ''"> + <xsl:choose> + <xsl:when test="$css.decoration != 0"> + <xsl:attribute name="style"> + <xsl:text>background-color: </xsl:text> + <xsl:value-of select="$bgcolor"/> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="bgcolor"> + <xsl:value-of select="$bgcolor"/> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + <xsl:if test="@align"> + <xsl:attribute name="align"> + <xsl:value-of select="@align"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="@valign"> + <xsl:attribute name="valign"> + <xsl:value-of select="@valign"/> + </xsl:attribute> + </xsl:if> + <xsl:copy-of select="$img"/> + </td> + </tr> + </table> + </xsl:when> + <xsl:otherwise> + <xsl:copy-of select="$img"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:if test="$tag = 'img' and ../../self::imageobjectco and not($scaled)"> + <xsl:variable name="mapname"> + <xsl:call-template name="object.id"> + <xsl:with-param name="object" select="../../areaspec"/> + </xsl:call-template> + </xsl:variable> + + <map name="{$mapname}"> + <xsl:for-each select="../../areaspec//area"> + <xsl:variable name="units"> + <xsl:choose> + <xsl:when test="@units = 'other' and @otherunits"> + <xsl:value-of select="@otherunits"/> + </xsl:when> + <xsl:when test="@units"> + <xsl:value-of select="@units"/> + </xsl:when> + <!-- areaspec|areaset/area --> + <xsl:when test="../@units = 'other' and ../@otherunits"> + <xsl:value-of select="../@otherunits"/> + </xsl:when> + <xsl:when test="../@units"> + <xsl:value-of select="../@units"/> + </xsl:when> + <!-- areaspec/areaset/area --> + <xsl:when test="../../@units = 'other' and ../../@otherunits"> + <xsl:value-of select="../@otherunits"/> + </xsl:when> + <xsl:when test="../../@units"> + <xsl:value-of select="../../@units"/> + </xsl:when> + <xsl:otherwise>calspair</xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:choose> + <xsl:when test="$units = 'calspair' or + $units = 'imagemap'"> + <xsl:variable name="coords" select="normalize-space(@coords)"/> + + <area shape="rect"> + <xsl:variable name="linkends"> + <xsl:choose> + <xsl:when test="@linkends"> + <xsl:value-of select="normalize-space(@linkends)"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="normalize-space(../@linkends)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="href"> + <xsl:choose> + <xsl:when test="@xlink:href"> + <xsl:value-of select="@xlink:href"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="../@xlink:href"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:choose> + <xsl:when test="$linkends != ''"> + <xsl:variable name="linkend"> + <xsl:choose> + <xsl:when test="contains($linkends, ' ')"> + <xsl:value-of select="substring-before($linkends, ' ')"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$linkends"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="target" select="key('id', $linkend)[1]"/> + + <xsl:if test="$target"> + <xsl:attribute name="href"> + <xsl:call-template name="href.target"> + <xsl:with-param name="object" select="$target"/> + </xsl:call-template> + </xsl:attribute> + </xsl:if> + </xsl:when> + <xsl:when test="$href != ''"> + <xsl:attribute name="href"> + <xsl:value-of select="$href"/> + </xsl:attribute> + </xsl:when> + </xsl:choose> + + <xsl:if test="alt"> + <xsl:attribute name="alt"> + <xsl:value-of select="alt[1]"/> + </xsl:attribute> + </xsl:if> + + <xsl:attribute name="coords"> + <xsl:choose> + <xsl:when test="$units = 'calspair'"> + + <xsl:variable name="p1" + select="substring-before($coords, ' ')"/> + <xsl:variable name="p2" + select="substring-after($coords, ' ')"/> + + <xsl:variable name="x1" select="substring-before($p1,',')"/> + <xsl:variable name="y1" select="substring-after($p1,',')"/> + <xsl:variable name="x2" select="substring-before($p2,',')"/> + <xsl:variable name="y2" select="substring-after($p2,',')"/> + + <xsl:variable name="x1p" select="$x1 div 100.0"/> + <xsl:variable name="y1p" select="$y1 div 100.0"/> + <xsl:variable name="x2p" select="$x2 div 100.0"/> + <xsl:variable name="y2p" select="$y2 div 100.0"/> + + <!-- + <xsl:message> + <xsl:text>units: </xsl:text> + <xsl:value-of select="$units"/> + <xsl:text> </xsl:text> + <xsl:value-of select="$x1p"/><xsl:text>, </xsl:text> + <xsl:value-of select="$y1p"/><xsl:text>, </xsl:text> + <xsl:value-of select="$x2p"/><xsl:text>, </xsl:text> + <xsl:value-of select="$y2p"/><xsl:text>, </xsl:text> + </xsl:message> + + <xsl:message> + <xsl:text> </xsl:text> + <xsl:value-of select="$intrinsicwidth"/> + <xsl:text>, </xsl:text> + <xsl:value-of select="$intrinsicdepth"/> + </xsl:message> + + <xsl:message> + <xsl:text> </xsl:text> + <xsl:value-of select="$units"/> + <xsl:text> </xsl:text> + <xsl:value-of + select="round($x1p * $intrinsicwidth div 100.0)"/> + <xsl:text>,</xsl:text> + <xsl:value-of select="round($intrinsicdepth + - ($y2p * $intrinsicdepth div 100.0))"/> + <xsl:text>,</xsl:text> + <xsl:value-of select="round($x2p * + $intrinsicwidth div 100.0)"/> + <xsl:text>,</xsl:text> + <xsl:value-of select="round($intrinsicdepth + - ($y1p * $intrinsicdepth div 100.0))"/> + </xsl:message> + --> + <xsl:value-of + select="round($x1p * $intrinsicwidth div 100.0)"/> + <xsl:text>,</xsl:text> + <xsl:value-of select="round($intrinsicdepth + - ($y2p * $intrinsicdepth div 100.0))"/> + <xsl:text>,</xsl:text> + <xsl:value-of + select="round($x2p * $intrinsicwidth div 100.0)"/> + <xsl:text>,</xsl:text> + <xsl:value-of select="round($intrinsicdepth + - ($y1p * $intrinsicdepth div 100.0))"/> + </xsl:when> + <xsl:otherwise> + <xsl:copy-of select="$coords"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </area> + </xsl:when> + <xsl:otherwise> + <xsl:message> + <xsl:text>Warning: only calspair or </xsl:text> + <xsl:text>otherunits='imagemap' supported </xsl:text> + <xsl:text>in imageobjectco</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + </map> + </xsl:if> +</xsl:template> + +<xsl:template name="process.image.attributes"> + <xsl:param name="alt"/> + <xsl:param name="html.width"/> + <xsl:param name="html.depth"/> + <xsl:param name="longdesc"/> + <xsl:param name="scale"/> + <xsl:param name="scalefit"/> + <xsl:param name="scaled.contentdepth"/> + <xsl:param name="scaled.contentwidth"/> + <xsl:param name="viewport"/> + + <xsl:choose> + <xsl:when test="@contentwidth or @contentdepth"> + <!-- ignore @width/@depth, @scale, and @scalefit if specified --> + <xsl:if test="@contentwidth and $scaled.contentwidth != ''"> + <xsl:attribute name="width"> + <xsl:value-of select="$scaled.contentwidth"/> + </xsl:attribute> + </xsl:if> + <xsl:if test="@contentdepth and $scaled.contentdepth != ''"> + <xsl:attribute name="height"> + <xsl:value-of select="$scaled.contentdepth"/> + </xsl:attribute> + </xsl:if> + </xsl:when> + + <xsl:when test="number($scale) != 1.0"> + <!-- scaling is always uniform, so we only have to specify one dimension --> + <!-- ignore @scalefit if specified --> + <xsl:attribute name="width"> + <xsl:value-of select="$scaled.contentwidth"/> + </xsl:attribute> + </xsl:when> + + <xsl:when test="$scalefit != 0"> + <xsl:choose> + <xsl:when test="contains($html.width, '%')"> + <xsl:choose> + <xsl:when test="$viewport != 0"> + <!-- The *viewport* will be scaled, so use 100% here! --> + <xsl:attribute name="width"> + <xsl:value-of select="'100%'"/> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="width"> + <xsl:value-of select="$html.width"/> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test="contains($html.depth, '%')"> + <!-- HTML doesn't deal with this case very well...do nothing --> + </xsl:when> + + <xsl:when test="$scaled.contentwidth != '' and $html.width != '' + and $scaled.contentdepth != '' and $html.depth != ''"> + <!-- scalefit should not be anamorphic; figure out which direction --> + <!-- has the limiting scale factor and scale in that direction --> + <xsl:choose> + <xsl:when test="$html.width div $scaled.contentwidth > + $html.depth div $scaled.contentdepth"> + <xsl:attribute name="height"> + <xsl:value-of select="$html.depth"/> + </xsl:attribute> + </xsl:when> + <xsl:otherwise> + <xsl:attribute name="width"> + <xsl:value-of select="$html.width"/> + </xsl:attribute> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + + <xsl:when test="$scaled.contentwidth != '' and $html.width != ''"> + <xsl:attribute name="width"> + <xsl:value-of select="$html.width"/> + </xsl:attribute> + </xsl:when> + + <xsl:when test="$scaled.contentdepth != '' and $html.depth != ''"> + <xsl:attribute name="height"> + <xsl:value-of select="$html.depth"/> + </xsl:attribute> + </xsl:when> + </xsl:choose> + </xsl:when> + </xsl:choose> + + <xsl:if test="$alt != ''"> + <xsl:attribute name="alt"> + <xsl:value-of select="normalize-space($alt)"/> + </xsl:attribute> + </xsl:if> + + <!-- Turn off longdesc attribute since not supported by browsers + <xsl:if test="$longdesc != ''"> + <xsl:attribute name="longdesc"> + <xsl:value-of select="$longdesc"/> + </xsl:attribute> + </xsl:if> + --> + + <xsl:if test="@align and $viewport = 0"> + <xsl:attribute name="align"> + <xsl:choose> + <xsl:when test="@align = 'center'">middle</xsl:when> + <xsl:otherwise> + <xsl:value-of select="@align"/> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:if> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="graphic"> + <xsl:choose> + <xsl:when test="parent::inlineequation"> + <span> + <xsl:call-template name="id.attribute"/> + <xsl:call-template name="anchor"/> + <xsl:call-template name="process.image"/> + </span> + </xsl:when> + <xsl:otherwise> + <div> + <xsl:call-template name="id.attribute"/> + <xsl:if test="@align"> + <xsl:attribute name="align"> + <xsl:value-of select="@align"/> + </xsl:attribute> + </xsl:if> + <xsl:call-template name="anchor"/> + <xsl:call-template name="process.image"/> + </div> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="inlinegraphic"> + <xsl:variable name="filename"> + <xsl:choose> + <xsl:when test="@entityref"> + <xsl:value-of select="unparsed-entity-uri(@entityref)"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="@fileref"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:call-template name="anchor"/> + + <xsl:choose> + <xsl:when test="@format='linespecific'"> + <xsl:choose> + <xsl:when test="$use.extensions != '0' + and $textinsert.extension != '0'"> + <xsl:choose> + <xsl:when test="element-available('stext:insertfile')"> + <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/> + </xsl:when> + <xsl:when test="element-available('xtext:insertfile')"> + <xtext:insertfile href="{$filename}"/> + </xsl:when> + <xsl:otherwise> + <xsl:message terminate="yes"> + <xsl:text>No insertfile extension available.</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:message terminate="yes"> + <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/> + <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="process.image"/> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="mediaobject|mediaobjectco"> + + <xsl:variable name="olist" select="imageobject|imageobjectco + |videoobject|audioobject + |textobject"/> + + <xsl:variable name="object.index"> + <xsl:call-template name="select.mediaobject.index"> + <xsl:with-param name="olist" select="$olist"/> + <xsl:with-param name="count" select="1"/> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="object" select="$olist[position() = $object.index]"/> + + <xsl:variable name="align"> + <xsl:value-of select="$object/descendant::imagedata[@align][1]/@align"/> + </xsl:variable> + + <div> + <xsl:apply-templates select="." mode="common.html.attributes"/> + <xsl:if test="$align != '' "> + <xsl:attribute name="align"> + <xsl:value-of select="$align"/> + </xsl:attribute> + </xsl:if> + <xsl:call-template name="id.attribute"/> + <xsl:call-template name="anchor"/> + + <xsl:apply-templates select="$object"/> + <xsl:apply-templates select="caption"/> + </div> +</xsl:template> + +<xsl:template match="inlinemediaobject"> + <span> + <xsl:apply-templates select="." mode="common.html.attributes"/> + <xsl:call-template name="id.attribute"/> + <xsl:call-template name="anchor"/> + <xsl:call-template name="select.mediaobject"/> + </span> +</xsl:template> + +<xsl:template match="programlisting/inlinemediaobject + |screen/inlinemediaobject" priority="2"> + <!-- the additional span causes problems in some cases --> + <xsl:call-template name="select.mediaobject"/> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="imageobjectco"> + <xsl:call-template name="anchor"/> + <xsl:choose> + <!-- select one imageobject? --> + <xsl:when test="$use.role.for.mediaobject != 0 and + count(imageobject) > 1 and + imageobject[@role]"> + <xsl:variable name="olist" select="imageobject"/> + + <xsl:variable name="object.index"> + <xsl:call-template name="select.mediaobject.index"> + <xsl:with-param name="olist" select="$olist"/> + <xsl:with-param name="count" select="1"/> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="object" select="$olist[position() = $object.index]"/> + + <xsl:apply-templates select="$object"/> + </xsl:when> + <xsl:otherwise> + <!-- otherwise process them all --> + <xsl:apply-templates select="imageobject"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:apply-templates select="calloutlist"/> + +</xsl:template> + +<xsl:template match="imageobject"> + <xsl:apply-templates select="imagedata"/> +</xsl:template> + +<xsl:template match="imagedata"> + <xsl:variable name="filename"> + <xsl:call-template name="mediaobject.filename"> + <xsl:with-param name="object" select=".."/> + </xsl:call-template> + </xsl:variable> + + <xsl:choose> + <!-- Handle MathML and SVG markup in imagedata --> + <xsl:when test="mml:*" xmlns:mml="http://www.w3.org/1998/Math/MathML"> + <xsl:apply-templates/> + </xsl:when> + + <xsl:when test="svg:*" xmlns:svg="http://www.w3.org/2000/svg"> + <xsl:apply-templates/> + </xsl:when> + + <xsl:when test="@format='linespecific'"> + <xsl:choose> + <xsl:when test="$use.extensions != '0' + and $textinsert.extension != '0'"> + <xsl:choose> + <xsl:when test="element-available('stext:insertfile')"> + <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/> + </xsl:when> + <xsl:when test="element-available('xtext:insertfile')"> + <xtext:insertfile href="{$filename}"/> + </xsl:when> + <xsl:otherwise> + <xsl:message terminate="yes"> + <xsl:text>No insertfile extension available.</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <a xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad" + href="{$filename}"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:variable name="longdesc.uri"> + <xsl:call-template name="longdesc.uri"> + <xsl:with-param name="mediaobject" + select="ancestor::imageobject/parent::*"/> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="phrases" + select="ancestor::mediaobject/textobject[phrase] + |ancestor::inlinemediaobject/textobject[phrase] + |ancestor::mediaobjectco/textobject[phrase]"/> + + <xsl:call-template name="process.image"> + <xsl:with-param name="alt"> + <xsl:apply-templates select="$phrases[not(@role) or @role!='tex'][1]"/> + </xsl:with-param> + <xsl:with-param name="longdesc"> + <xsl:call-template name="write.longdesc"> + <xsl:with-param name="mediaobject" + select="ancestor::imageobject/parent::*"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + + <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0 + and ancestor::imageobject/parent::*/textobject[not(phrase)]"> + <xsl:call-template name="longdesc.link"> + <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/> + </xsl:call-template> + </xsl:if> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template name="longdesc.uri"> + <xsl:param name="mediaobject" select="."/> + <xsl:if test="$html.longdesc"> + <xsl:if test="$mediaobject/textobject[not(phrase)]"> + <xsl:variable name="dbhtml.dir"> + <xsl:call-template name="dbhtml-dir"/> + </xsl:variable> + <xsl:variable name="filename"> + <xsl:call-template name="make-relative-filename"> + <xsl:with-param name="base.dir"> + <xsl:choose> + <xsl:when test="$dbhtml.dir != ''"> + <xsl:value-of select="$dbhtml.dir"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$chunk.base.dir"/> + </xsl:otherwise> + </xsl:choose> + </xsl:with-param> + <xsl:with-param name="base.name"> + <xsl:choose> + <xsl:when test=" + $mediaobject/@*[local-name() = 'id'] + and not($use.id.as.filename = 0)"> + <!-- * if this mediaobject has an ID, then we use the --> + <!-- * value of that ID as basename for the "longdesc" --> + <!-- * file (that is, without prepending an "ld-" too it) --> + <xsl:value-of select="$mediaobject/@*[local-name() = 'id']"/> + <xsl:value-of select="$html.ext"/> + </xsl:when> + <xsl:otherwise> + <!-- * otherwise, if this mediaobject does not have an --> + <!-- * ID, then we generate an ID... --> + <xsl:variable name="image-id"> + <xsl:call-template name="object.id"> + <xsl:with-param name="object" select="$mediaobject"/> + </xsl:call-template> + </xsl:variable> + <!-- * ...and then we take that generated ID, prepend an --> + <!-- * "ld-" to it, and use that as the basename for the file --> + <xsl:value-of select="concat('ld-',$image-id,$html.ext)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:with-param> + </xsl:call-template> + </xsl:variable> + + <xsl:value-of select="$filename"/> + </xsl:if> + </xsl:if> +</xsl:template> + +<xsl:template name="write.longdesc"> + <xsl:param name="mediaobject" select="."/> + <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]"> + <xsl:variable name="filename"> + <xsl:call-template name="longdesc.uri"> + <xsl:with-param name="mediaobject" select="$mediaobject"/> + </xsl:call-template> + </xsl:variable> + + <xsl:value-of select="$filename"/> + + <xsl:call-template name="write.chunk"> + <xsl:with-param name="filename" select="$filename"/> + <xsl:with-param name="quiet" select="$chunk.quietly"/> + <xsl:with-param name="content"> + <xsl:call-template name="user.preroot"/> + <html> + <head> + <xsl:call-template name="system.head.content"/> + <xsl:call-template name="head.content"> + <xsl:with-param name="title" select="'Long Description'"/> + </xsl:call-template> + <xsl:call-template name="user.head.content"/> + </head> + <body> + <xsl:call-template name="body.attributes"/> + <xsl:for-each select="$mediaobject/textobject[not(phrase)]"> + <xsl:apply-templates select="./*"/> + </xsl:for-each> + </body> + </html> + <xsl:value-of select="$chunk.append"/> + </xsl:with-param> + </xsl:call-template> + </xsl:if> +</xsl:template> + +<xsl:template name="longdesc.link"> + <xsl:param name="longdesc.uri" select="''"/> + + <xsl:variable name="this.uri"> + <xsl:call-template name="make-relative-filename"> + <xsl:with-param name="base.dir" select="$chunk.base.dir"/> + <xsl:with-param name="base.name"> + <xsl:call-template name="href.target.uri"/> + </xsl:with-param> + </xsl:call-template> + </xsl:variable> + + <xsl:variable name="href.to"> + <xsl:call-template name="trim.common.uri.paths"> + <xsl:with-param name="uriA" select="$longdesc.uri"/> + <xsl:with-param name="uriB" select="$this.uri"/> + <xsl:with-param name="return" select="'A'"/> + </xsl:call-template> + </xsl:variable> + + <div class="longdesc-link" align="{$direction.align.end}"> + <br clear="all"/> + <span class="longdesc-link"> + <xsl:text>[</xsl:text> + <a href="{$href.to}" target="longdesc">D</a> + <xsl:text>]</xsl:text> + </span> + </div> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="videoobject"> + <xsl:apply-templates select="videodata"/> +</xsl:template> + +<xsl:template match="videodata"> + <xsl:call-template name="process.image"> + <xsl:with-param name="tag" select="'embed'"/> + <xsl:with-param name="alt"> + <xsl:apply-templates select="(../../textobject/phrase)[1]"/> + </xsl:with-param> + </xsl:call-template> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="audioobject"> + <xsl:apply-templates select="audiodata"/> +</xsl:template> + +<xsl:template match="audiodata"> + <xsl:call-template name="process.image"> + <xsl:with-param name="tag" select="'embed'"/> + <xsl:with-param name="alt"> + <xsl:apply-templates select="(../../textobject/phrase)[1]"/> + </xsl:with-param> + </xsl:call-template> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="textobject"> + <xsl:apply-templates/> +</xsl:template> + +<xsl:template match="textdata"> + <xsl:variable name="filename"> + <xsl:choose> + <xsl:when test="@entityref"> + <xsl:value-of select="unparsed-entity-uri(@entityref)"/> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="@fileref"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="encoding"> + <xsl:choose> + <xsl:when test="@encoding"> + <xsl:value-of select="@encoding"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$textdata.default.encoding"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:choose> + <xsl:when test="$use.extensions != '0' + and $textinsert.extension != '0'"> + <xsl:choose> + <xsl:when test="element-available('stext:insertfile')"> + <stext:insertfile href="{$filename}" encoding="{$encoding}"/> + </xsl:when> + <xsl:when test="element-available('xtext:insertfile')"> + <xtext:insertfile href="{$filename}"/> + </xsl:when> + <xsl:otherwise> + <xsl:message terminate="yes"> + <xsl:text>No insertfile extension available.</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:message terminate="yes"> + <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/> + <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<!-- ==================================================================== --> + +<xsl:template match="caption"> + <div> + <xsl:apply-templates select="." mode="common.html.attributes"/> + <xsl:call-template name="id.attribute"/> + <xsl:if test="@align = 'right' or @align = 'left' or @align='center'"> + <xsl:attribute name="align"><xsl:value-of + select="@align"/></xsl:attribute> + </xsl:if> + <xsl:apply-templates/> + </div> +</xsl:template> + +<!-- ==================================================================== --> +<!-- "Support" for SVG --> + +<xsl:template match="svg:*" xmlns:svg="http://www.w3.org/2000/svg"> + <xsl:copy> + <xsl:copy-of select="@*"/> + <xsl:apply-templates/> + </xsl:copy> +</xsl:template> + + +<!-- The following works sometimes, but needs to take into account + 1. When there is no /*/@xml:base + 2. When the chunks are going somewhere else +<xsl:variable name="relpath"> + <xsl:call-template name="relative-uri"> + <xsl:with-param name="filename" select="@fileref"/> + </xsl:call-template> +</xsl:variable> + +<xsl:choose> + <xsl:when test="/*/@xml:base + and starts-with($relpath,/*/@xml:base)"> + <xsl:value-of select="substring-after($relpath,/*/@xml:base)"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="@fileref"/> + </xsl:otherwise> +</xsl:choose> +<xsl:value-of select="@fileref"/> + </xsl:when> +--> +<!-- Resolve xml:base attributes --> +<xsl:template match="@fileref"> + <!-- need a check for absolute urls --> + <xsl:choose> + <xsl:when test="contains(., ':')"> + <!-- it has a uri scheme so it is an absolute uri --> + <xsl:value-of select="."/> + </xsl:when> + <xsl:when test="$keep.relative.image.uris != 0"> + <!-- leave it alone --> + <xsl:value-of select="."/> + </xsl:when> + <xsl:otherwise> + <!-- its a relative uri that needs xml:base processing --> + <xsl:call-template name="relative-uri"> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +</xsl:stylesheet> |