]> git.stg.codes - stg.git/blob - doc/xslt/html/graphics.xsl
[NY] Code deduplication.
[stg.git] / doc / xslt / html / graphics.xsl
1 <?xml version='1.0'?>
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                 xmlns:xlink="http://www.w3.org/1999/xlink"
4                 xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory"
5                 xmlns:simg="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.ImageIntrinsics"
6                 xmlns:ximg="xalan://com.nwalsh.xalan.ImageIntrinsics"
7                 xmlns:xtext="xalan://com.nwalsh.xalan.Text"
8                 xmlns:lxslt="http://xml.apache.org/xslt"
9                 exclude-result-prefixes="xlink stext xtext lxslt simg ximg"
10                 extension-element-prefixes="stext xtext"
11                 version='1.0'>
12
13 <!-- ********************************************************************
14      $Id: graphics.xsl 8421 2009-05-04 07:49:49Z bobstayton $
15      ********************************************************************
16
17      This file is part of the XSL DocBook Stylesheet distribution.
18      See ../README or http://docbook.sf.net/release/xsl/current/ for
19      copyright and other information.
20
21      Contributors:
22      Colin Paul Adams, <colin@colina.demon.co.uk>
23
24      ******************************************************************** -->
25
26 <lxslt:component prefix="xtext" elements="insertfile"/>
27 <lxslt:component prefix="ximg" functions="new getWidth getDepth"/>
28
29 <!-- ==================================================================== -->
30 <!-- Graphic format tests for the HTML backend -->
31
32 <xsl:template name="is.graphic.format">
33   <xsl:param name="format"></xsl:param>
34   <xsl:if test="$format = 'SVG'
35                 or $format = 'PNG'
36                 or $format = 'JPG'
37                 or $format = 'JPEG'
38                 or $format = 'linespecific'
39                 or $format = 'GIF'
40                 or $format = 'GIF87a'
41                 or $format = 'GIF89a'
42                 or $format = 'BMP'">1</xsl:if>
43 </xsl:template>
44
45 <xsl:template name="is.graphic.extension">
46   <xsl:param name="ext"></xsl:param>
47   <xsl:variable name="lcext" select="translate($ext,
48                                        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
49                                        'abcdefghijklmnopqrstuvwxyz')"/>
50   <xsl:if test="$lcext = 'svg'
51              or $lcext = 'png'
52              or $lcext = 'jpeg'
53              or $lcext = 'jpg'
54              or $lcext = 'avi'
55              or $lcext = 'mpg'
56              or $lcext = 'mpeg'
57              or $lcext = 'qt'
58              or $lcext = 'gif'
59              or $lcext = 'bmp'">1</xsl:if>
60 </xsl:template>
61
62 <!-- ==================================================================== -->
63
64 <xsl:template match="screenshot">
65   <div>
66     <xsl:apply-templates select="." mode="common.html.attributes"/>
67     <xsl:apply-templates/>
68   </div>
69 </xsl:template>
70
71 <xsl:template match="screeninfo">
72 </xsl:template>
73
74 <!-- ==================================================================== -->
75
76 <xsl:template name="process.image">
77   <!-- When this template is called, the current node should be  -->
78   <!-- a graphic, inlinegraphic, imagedata, or videodata. All    -->
79   <!-- those elements have the same set of attributes, so we can -->
80   <!-- handle them all in one place.                             -->
81   <xsl:param name="tag" select="'img'"/>
82   <xsl:param name="alt"/>
83   <xsl:param name="longdesc"/>
84
85   <!-- The HTML img element only supports the notion of content-area
86        scaling; it doesn't support the distinction between a
87        content-area and a viewport-area, so we have to make some
88        compromises.
89
90        1. If only the content-area is specified, everything is fine.
91           (If you ask for a three inch image, that's what you'll get.)
92
93        2. If only the viewport-area is provided:
94           - If scalefit=1, treat it as both the content-area and
95             the viewport-area. (If you ask for an image in a five inch
96             area, we'll make the image five inches to fill that area.)
97           - If scalefit=0, ignore the viewport-area specification.
98
99           Note: this is not quite the right semantic and has the additional
100           problem that it can result in anamorphic scaling, which scalefit
101           should never cause.
102
103        3. If both the content-area and the viewport-area is specified
104           on a graphic element, ignore the viewport-area.
105           (If you ask for a three inch image in a five inch area, we'll assume
106            it's better to give you a three inch image in an unspecified area
107            than a five inch image in a five inch area.
108
109        Relative units also cause problems. As a general rule, the stylesheets
110        are operating too early and too loosely coupled with the rendering engine
111        to know things like the current font size or the actual dimensions of
112        an image. Therefore:
113
114        1. We use a fixed size for pixels, $pixels.per.inch
115
116        2. We use a fixed size for "em"s, $points.per.em
117
118        Percentages are problematic. In the following discussion, we speak
119        of width and contentwidth, but the same issues apply to depth and
120        contentdepth
121
122        1. A width of 50% means "half of the available space for the image."
123           That's fine. But note that in HTML, this is a dynamic property and
124           the image size will vary if the browser window is resized.
125
126        2. A contentwidth of 50% means "half of the actual image width". But
127           the stylesheets have no way to assess the image's actual size. Treating
128           this as a width of 50% is one possibility, but it produces behavior
129           (dynamic scaling) that seems entirely out of character with the
130           meaning.
131
132           Instead, the stylesheets define a $nominal.image.width
133           and convert percentages to actual values based on that nominal size.
134
135        Scale can be problematic. Scale applies to the contentwidth, so
136        a scale of 50 when a contentwidth is not specified is analagous to a
137        width of 50%. (If a contentwidth is specified, the scaling factor can
138        be applied to that value and no problem exists.)
139
140        If scale is specified but contentwidth is not supplied, the
141        nominal.image.width is used to calculate a base size
142        for scaling.
143
144        Warning: as a consequence of these decisions, unless the aspect ratio
145        of your image happens to be exactly the same as (nominal width / nominal height),
146        specifying contentwidth="50%" and contentdepth="50%" is NOT going to
147        scale the way you expect (or really, the way it should).
148
149        Don't do that. In fact, a percentage value is not recommended for content
150        size at all. Use scale instead.
151
152        Finally, align and valign are troublesome. Horizontal alignment is now
153        supported by wrapping the image in a <div align="{@align}"> (in block
154        contexts!). I can't think of anything (practical) to do about vertical
155        alignment.
156   -->
157
158   <xsl:variable name="width-units">
159     <xsl:choose>
160       <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
161       <xsl:when test="@width">
162         <xsl:call-template name="length-units">
163           <xsl:with-param name="length" select="@width"/>
164         </xsl:call-template>
165       </xsl:when>
166       <xsl:when test="not(@depth) and $default.image.width != ''">
167         <xsl:call-template name="length-units">
168           <xsl:with-param name="length" select="$default.image.width"/>
169         </xsl:call-template>
170       </xsl:when>
171     </xsl:choose>
172   </xsl:variable>
173
174   <xsl:variable name="width">
175     <xsl:choose>
176       <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
177       <xsl:when test="@width">
178         <xsl:choose>
179           <xsl:when test="$width-units = '%'">
180             <xsl:value-of select="@width"/>
181           </xsl:when>
182           <xsl:otherwise>
183             <xsl:call-template name="length-spec">
184               <xsl:with-param name="length" select="@width"/>
185             </xsl:call-template>
186           </xsl:otherwise>
187         </xsl:choose>
188       </xsl:when>
189       <xsl:when test="not(@depth) and $default.image.width != ''">
190         <xsl:value-of select="$default.image.width"/>
191       </xsl:when>
192     </xsl:choose>
193   </xsl:variable>
194
195   <xsl:variable name="scalefit">
196     <xsl:choose>
197       <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
198       <xsl:when test="@contentwidth or @contentdepth">0</xsl:when>
199       <xsl:when test="@scale">0</xsl:when>
200       <xsl:when test="@scalefit"><xsl:value-of select="@scalefit"/></xsl:when>
201       <xsl:when test="$width != '' or @depth">1</xsl:when>
202       <xsl:otherwise>0</xsl:otherwise>
203     </xsl:choose>
204   </xsl:variable>
205
206   <xsl:variable name="scale">
207     <xsl:choose>
208       <xsl:when test="$ignore.image.scaling != 0">1.0</xsl:when>
209       <xsl:when test="@contentwidth or @contentdepth">1.0</xsl:when>
210       <xsl:when test="@scale">
211         <xsl:value-of select="@scale div 100.0"/>
212       </xsl:when>
213       <xsl:otherwise>1.0</xsl:otherwise>
214     </xsl:choose>
215   </xsl:variable>
216
217   <xsl:variable name="filename">
218     <xsl:choose>
219       <xsl:when test="local-name(.) = 'graphic'
220                       or local-name(.) = 'inlinegraphic'">
221         <!-- handle legacy graphic and inlinegraphic by new template --> 
222         <xsl:call-template name="mediaobject.filename">
223           <xsl:with-param name="object" select="."/>
224         </xsl:call-template>
225       </xsl:when>
226       <xsl:otherwise>
227         <!-- imagedata, videodata, audiodata -->
228         <xsl:call-template name="mediaobject.filename">
229           <xsl:with-param name="object" select=".."/>
230         </xsl:call-template>
231       </xsl:otherwise>
232     </xsl:choose>
233   </xsl:variable>
234
235   <xsl:variable name="output_filename">
236     <xsl:choose>
237       <xsl:when test="@entityref">
238         <xsl:value-of select="$filename"/>
239       </xsl:when>
240       <!--
241         Moved test for $keep.relative.image.uris to template below:
242             <xsl:template match="@fileref">
243       -->
244       <xsl:otherwise>
245         <xsl:value-of select="$filename"/>
246       </xsl:otherwise>
247     </xsl:choose>
248   </xsl:variable>
249
250   <xsl:variable name="img.src.path.pi">
251     <xsl:call-template name="pi.dbhtml_img.src.path">
252       <xsl:with-param name="node" select=".."/>
253     </xsl:call-template>
254   </xsl:variable>
255
256   <xsl:variable name="filename.for.graphicsize">
257     <xsl:choose>
258       <xsl:when test="$img.src.path.pi != ''">
259         <xsl:value-of select="concat($img.src.path.pi, $filename)"/>
260       </xsl:when>
261       <xsl:when test="$img.src.path != '' and
262                       $graphicsize.use.img.src.path != 0 and
263                       $tag = 'img' and
264                       not(starts-with($filename, '/')) and
265                       not(contains($filename, '://'))">
266         <xsl:value-of select="concat($img.src.path, $filename)"/>
267       </xsl:when>
268       <xsl:otherwise>
269         <xsl:value-of select="$filename"/>
270       </xsl:otherwise>
271     </xsl:choose>
272   </xsl:variable>
273
274   <xsl:variable name="realintrinsicwidth">
275     <!-- This funny compound test works around a bug in XSLTC -->
276     <xsl:choose>
277       <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
278         <xsl:choose>
279           <xsl:when test="function-available('simg:getWidth')">
280             <xsl:value-of select="simg:getWidth(simg:new($filename.for.graphicsize),
281                                                 $nominal.image.width)"/>
282           </xsl:when>
283           <xsl:when test="function-available('ximg:getWidth')">
284             <xsl:value-of select="ximg:getWidth(ximg:new($filename.for.graphicsize),
285                                                 $nominal.image.width)"/>
286           </xsl:when>
287           <xsl:otherwise>
288            <xsl:value-of select="0"/>
289           </xsl:otherwise>
290         </xsl:choose>
291       </xsl:when>
292       <xsl:otherwise>
293         <xsl:value-of select="0"/>
294       </xsl:otherwise>
295     </xsl:choose>
296   </xsl:variable>
297
298   <xsl:variable name="intrinsicwidth">
299     <xsl:choose>
300       <xsl:when test="$realintrinsicwidth = 0">
301        <xsl:value-of select="$nominal.image.width"/>
302       </xsl:when>
303       <xsl:otherwise>
304        <xsl:value-of select="$realintrinsicwidth"/>
305       </xsl:otherwise>
306     </xsl:choose>
307   </xsl:variable>
308
309   <xsl:variable name="intrinsicdepth">
310     <!-- This funny compound test works around a bug in XSLTC -->
311     <xsl:choose>
312       <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
313         <xsl:choose>
314           <xsl:when test="function-available('simg:getDepth')">
315             <xsl:value-of select="simg:getDepth(simg:new($filename.for.graphicsize),
316                                                 $nominal.image.depth)"/>
317           </xsl:when>
318           <xsl:when test="function-available('ximg:getDepth')">
319             <xsl:value-of select="ximg:getDepth(ximg:new($filename.for.graphicsize),
320                                                 $nominal.image.depth)"/>
321           </xsl:when>
322           <xsl:otherwise>
323             <xsl:value-of select="$nominal.image.depth"/>
324           </xsl:otherwise>
325         </xsl:choose>
326       </xsl:when>
327       <xsl:otherwise>
328         <xsl:value-of select="$nominal.image.depth"/>
329       </xsl:otherwise>
330     </xsl:choose>
331   </xsl:variable>
332
333   <xsl:variable name="contentwidth">
334     <xsl:choose>
335       <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
336       <xsl:when test="@contentwidth">
337         <xsl:variable name="units">
338           <xsl:call-template name="length-units">
339             <xsl:with-param name="length" select="@contentwidth"/>
340           </xsl:call-template>
341         </xsl:variable>
342
343         <xsl:choose>
344           <xsl:when test="$units = '%'">
345             <xsl:variable name="cmagnitude">
346               <xsl:call-template name="length-magnitude">
347                 <xsl:with-param name="length" select="@contentwidth"/>
348               </xsl:call-template>
349             </xsl:variable>
350             <xsl:value-of select="$intrinsicwidth * $cmagnitude div 100.0"/>
351             <xsl:text>px</xsl:text>
352           </xsl:when>
353           <xsl:otherwise>
354             <xsl:call-template name="length-spec">
355               <xsl:with-param name="length" select="@contentwidth"/>
356             </xsl:call-template>
357           </xsl:otherwise>
358         </xsl:choose>
359       </xsl:when>
360       <xsl:otherwise>
361         <xsl:value-of select="$intrinsicwidth"/>
362         <xsl:text>px</xsl:text>
363       </xsl:otherwise>
364     </xsl:choose>
365   </xsl:variable>
366
367   <xsl:variable name="scaled.contentwidth">
368     <xsl:if test="$contentwidth != ''">
369       <xsl:variable name="cwidth.in.points">
370         <xsl:call-template name="length-in-points">
371           <xsl:with-param name="length" select="$contentwidth"/>
372           <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
373           <xsl:with-param name="em.size" select="$points.per.em"/>
374         </xsl:call-template>
375       </xsl:variable>
376       <xsl:value-of select="$cwidth.in.points div 72.0 * $pixels.per.inch * $scale"/>
377     </xsl:if>
378   </xsl:variable>
379
380   <xsl:variable name="html.width">
381     <xsl:choose>
382       <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
383       <xsl:when test="$width-units = '%'">
384         <xsl:value-of select="$width"/>
385       </xsl:when>
386       <xsl:when test="$width != ''">
387         <xsl:variable name="width.in.points">
388           <xsl:call-template name="length-in-points">
389             <xsl:with-param name="length" select="$width"/>
390             <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
391             <xsl:with-param name="em.size" select="$points.per.em"/>
392           </xsl:call-template>
393         </xsl:variable>
394         <xsl:value-of select="round($width.in.points div 72.0 * $pixels.per.inch)"/>
395       </xsl:when>
396       <xsl:otherwise></xsl:otherwise>
397     </xsl:choose>
398   </xsl:variable>
399
400   <xsl:variable name="contentdepth">
401     <xsl:choose>
402       <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
403       <xsl:when test="@contentdepth">
404         <xsl:variable name="units">
405           <xsl:call-template name="length-units">
406             <xsl:with-param name="length" select="@contentdepth"/>
407           </xsl:call-template>
408         </xsl:variable>
409
410         <xsl:choose>
411           <xsl:when test="$units = '%'">
412             <xsl:variable name="cmagnitude">
413               <xsl:call-template name="length-magnitude">
414                 <xsl:with-param name="length" select="@contentdepth"/>
415               </xsl:call-template>
416             </xsl:variable>
417             <xsl:value-of select="$intrinsicdepth * $cmagnitude div 100.0"/>
418             <xsl:text>px</xsl:text>
419           </xsl:when>
420           <xsl:otherwise>
421             <xsl:call-template name="length-spec">
422               <xsl:with-param name="length" select="@contentdepth"/>
423             </xsl:call-template>
424           </xsl:otherwise>
425         </xsl:choose>
426       </xsl:when>
427       <xsl:otherwise>
428         <xsl:value-of select="$intrinsicdepth"/>
429         <xsl:text>px</xsl:text>
430       </xsl:otherwise>
431     </xsl:choose>
432   </xsl:variable>
433
434   <xsl:variable name="scaled.contentdepth">
435     <xsl:if test="$contentdepth != ''">
436       <xsl:variable name="cdepth.in.points">
437         <xsl:call-template name="length-in-points">
438           <xsl:with-param name="length" select="$contentdepth"/>
439           <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
440           <xsl:with-param name="em.size" select="$points.per.em"/>
441         </xsl:call-template>
442       </xsl:variable>
443       <xsl:value-of select="$cdepth.in.points div 72.0 * $pixels.per.inch * $scale"/>
444     </xsl:if>
445   </xsl:variable>
446
447   <xsl:variable name="depth-units">
448     <xsl:if test="@depth">
449       <xsl:call-template name="length-units">
450         <xsl:with-param name="length" select="@depth"/>
451       </xsl:call-template>
452     </xsl:if>
453   </xsl:variable>
454
455   <xsl:variable name="depth">
456     <xsl:if test="@depth">
457       <xsl:choose>
458         <xsl:when test="$depth-units = '%'">
459           <xsl:value-of select="@depth"/>
460         </xsl:when>
461         <xsl:otherwise>
462           <xsl:call-template name="length-spec">
463             <xsl:with-param name="length" select="@depth"/>
464           </xsl:call-template>
465         </xsl:otherwise>
466       </xsl:choose>
467     </xsl:if>
468   </xsl:variable>
469
470   <xsl:variable name="html.depth">
471     <xsl:choose>
472       <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
473       <xsl:when test="$depth-units = '%'">
474         <xsl:value-of select="$depth"/>
475       </xsl:when>
476       <xsl:when test="@depth and @depth != ''">
477         <xsl:variable name="depth.in.points">
478           <xsl:call-template name="length-in-points">
479             <xsl:with-param name="length" select="$depth"/>
480             <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
481             <xsl:with-param name="em.size" select="$points.per.em"/>
482           </xsl:call-template>
483         </xsl:variable>
484         <xsl:value-of select="round($depth.in.points div 72.0 * $pixels.per.inch)"/>
485       </xsl:when>
486       <xsl:otherwise></xsl:otherwise>
487     </xsl:choose>
488   </xsl:variable>
489
490   <xsl:variable name="viewport">
491     <xsl:choose>
492       <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
493       <xsl:when test="local-name(.) = 'inlinegraphic'
494                       or ancestor::inlinemediaobject
495                       or ancestor::inlineequation">0</xsl:when>
496       <xsl:otherwise>
497         <xsl:value-of select="$make.graphic.viewport"/>
498       </xsl:otherwise>
499     </xsl:choose>
500   </xsl:variable>
501
502 <!--
503   <xsl:message>=====================================
504 scale: <xsl:value-of select="$scale"/>, <xsl:value-of select="$scalefit"/>
505 @contentwidth <xsl:value-of select="@contentwidth"/>
506 $contentwidth <xsl:value-of select="$contentwidth"/>
507 scaled.contentwidth: <xsl:value-of select="$scaled.contentwidth"/>
508 @width: <xsl:value-of select="@width"/>
509 width: <xsl:value-of select="$width"/>
510 html.width: <xsl:value-of select="$html.width"/>
511 @contentdepth <xsl:value-of select="@contentdepth"/>
512 $contentdepth <xsl:value-of select="$contentdepth"/>
513 scaled.contentdepth: <xsl:value-of select="$scaled.contentdepth"/>
514 @depth: <xsl:value-of select="@depth"/>
515 depth: <xsl:value-of select="$depth"/>
516 html.depth: <xsl:value-of select="$html.depth"/>
517 align: <xsl:value-of select="@align"/>
518 valign: <xsl:value-of select="@valign"/></xsl:message>
519 -->
520
521   <xsl:variable name="scaled"
522               select="@width|@depth|@contentwidth|@contentdepth
523                         |@scale|@scalefit"/>
524
525   <xsl:variable name="img">
526     <xsl:choose>
527       <xsl:when test="@format = 'SVG'">
528         <object type="image/svg+xml">
529           <xsl:attribute name="data">
530             <xsl:choose>
531               <xsl:when test="$img.src.path != '' and
532                            $tag = 'img' and
533                            not(starts-with($output_filename, '/')) and
534                            not(contains($output_filename, '://'))">
535                 <xsl:value-of select="$img.src.path"/>
536               </xsl:when>
537            </xsl:choose>
538            <xsl:value-of select="$output_filename"/>
539           </xsl:attribute>
540           <xsl:call-template name="process.image.attributes">
541             <!--xsl:with-param name="alt" select="$alt"/ there's no alt here-->
542             <xsl:with-param name="html.depth" select="$html.depth"/>
543             <xsl:with-param name="html.width" select="$html.width"/>
544             <xsl:with-param name="longdesc" select="$longdesc"/>
545             <xsl:with-param name="scale" select="$scale"/>
546             <xsl:with-param name="scalefit" select="$scalefit"/>
547             <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
548             <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
549             <xsl:with-param name="viewport" select="$viewport"/>
550           </xsl:call-template>
551           <xsl:if test="@align">
552             <xsl:attribute name="align">
553                 <xsl:choose>
554                   <xsl:when test="@align = 'center'">middle</xsl:when>
555                   <xsl:otherwise>
556                     <xsl:value-of select="@align"/>
557                   </xsl:otherwise>
558                 </xsl:choose>
559             </xsl:attribute>
560           </xsl:if>
561           <xsl:if test="$use.embed.for.svg != 0">
562             <embed type="image/svg+xml">
563               <xsl:attribute name="src">
564                 <xsl:choose>
565                   <xsl:when test="$img.src.path != '' and
566                                   $tag = 'img' and
567                                   not(starts-with($output_filename, '/')) and
568                                   not(contains($output_filename, '://'))">
569                     <xsl:value-of select="$img.src.path"/>
570                   </xsl:when>
571                 </xsl:choose>
572                 <xsl:value-of select="$output_filename"/>
573               </xsl:attribute>
574               <xsl:call-template name="process.image.attributes">
575                 <!--xsl:with-param name="alt" select="$alt"/ there's no alt here -->
576                 <xsl:with-param name="html.depth" select="$html.depth"/>
577                 <xsl:with-param name="html.width" select="$html.width"/>
578                 <xsl:with-param name="longdesc" select="$longdesc"/>
579                 <xsl:with-param name="scale" select="$scale"/>
580                 <xsl:with-param name="scalefit" select="$scalefit"/>
581                 <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
582                 <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
583                 <xsl:with-param name="viewport" select="$viewport"/>
584               </xsl:call-template>
585             </embed>
586           </xsl:if>
587         </object>
588       </xsl:when>
589       <xsl:otherwise>
590         <xsl:element name="{$tag}">
591          <xsl:if test="$tag = 'img' and ../../self::imageobjectco">
592            <xsl:variable name="mapname">
593              <xsl:call-template name="object.id">
594                <xsl:with-param name="object" select="../../areaspec"/>
595              </xsl:call-template>
596            </xsl:variable>
597            <xsl:choose>
598              <xsl:when test="$scaled">
599               <!-- It might be possible to handle some scaling; needs -->
600               <!-- more investigation -->
601               <xsl:message>
602                 <xsl:text>Warning: imagemaps not supported </xsl:text>
603                 <xsl:text>on scaled images</xsl:text>
604               </xsl:message>
605              </xsl:when>
606              <xsl:otherwise>
607               <xsl:attribute name="border">0</xsl:attribute>
608               <xsl:attribute name="usemap">
609                 <xsl:value-of select="concat('#', $mapname)"/>
610               </xsl:attribute>
611              </xsl:otherwise>
612            </xsl:choose>
613          </xsl:if>
614
615           <xsl:attribute name="src">
616            <xsl:choose>
617              <xsl:when test="$img.src.path != '' and
618                            $tag = 'img' and
619                              not(starts-with($output_filename, '/')) and
620                            not(contains($output_filename, '://'))">
621                <xsl:value-of select="$img.src.path"/>
622              </xsl:when>
623            </xsl:choose>
624             <xsl:value-of select="$output_filename"/>
625           </xsl:attribute>
626
627           <xsl:if test="@align">
628             <xsl:attribute name="align">
629               <xsl:choose>
630                 <xsl:when test="@align = 'center'">middle</xsl:when>
631                 <xsl:otherwise>
632                   <xsl:value-of select="@align"/>
633                 </xsl:otherwise>
634               </xsl:choose>
635             </xsl:attribute>
636           </xsl:if>
637
638           <xsl:call-template name="process.image.attributes">
639             <xsl:with-param name="alt">
640               <xsl:choose>
641                 <xsl:when test="$alt != ''">
642                   <xsl:copy-of select="$alt"/>
643                 </xsl:when>
644                 <xsl:when test="ancestor::figure">
645                   <xsl:value-of select="normalize-space(ancestor::figure/title)"/>
646                 </xsl:when>
647               </xsl:choose>
648             </xsl:with-param>
649             <xsl:with-param name="html.depth" select="$html.depth"/>
650             <xsl:with-param name="html.width" select="$html.width"/>
651             <xsl:with-param name="longdesc" select="$longdesc"/>
652             <xsl:with-param name="scale" select="$scale"/>
653             <xsl:with-param name="scalefit" select="$scalefit"/>
654             <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
655             <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
656             <xsl:with-param name="viewport" select="$viewport"/>
657           </xsl:call-template>
658         </xsl:element>
659       </xsl:otherwise>
660     </xsl:choose>
661   </xsl:variable>
662
663   <xsl:variable name="bgcolor">
664     <xsl:call-template name="pi.dbhtml_background-color">
665       <xsl:with-param name="node" select=".."/>
666     </xsl:call-template>
667   </xsl:variable>
668
669   <xsl:variable name="use.viewport"
670                 select="$viewport != 0
671                         and ($html.width != ''
672                              or ($html.depth != '' and $depth-units != '%')
673                              or $bgcolor != ''
674                              or @valign)"/>
675
676   <xsl:choose>
677     <xsl:when test="$use.viewport">
678       <table border="0" summary="manufactured viewport for HTML img"
679              cellspacing="0" cellpadding="0">
680         <xsl:if test="$html.width != ''">
681           <xsl:attribute name="width">
682             <xsl:value-of select="$html.width"/>
683           </xsl:attribute>
684         </xsl:if>
685         <tr>
686           <xsl:if test="$html.depth != '' and $depth-units != '%'">
687             <!-- don't do this for percentages because browsers get confused -->
688             <xsl:choose>
689               <xsl:when test="$css.decoration != 0">
690                 <xsl:attribute name="style">
691                   <xsl:text>height: </xsl:text>
692                   <xsl:value-of select="$html.depth"/>
693                   <xsl:text>px</xsl:text>
694                 </xsl:attribute>
695               </xsl:when>
696               <xsl:otherwise>
697                 <xsl:attribute name="height">
698                   <xsl:value-of select="$html.depth"/>
699                 </xsl:attribute>
700               </xsl:otherwise>
701             </xsl:choose>
702           </xsl:if>
703           <td>
704             <xsl:if test="$bgcolor != ''">
705               <xsl:choose>
706                 <xsl:when test="$css.decoration != 0">
707                   <xsl:attribute name="style">
708                     <xsl:text>background-color: </xsl:text>
709                     <xsl:value-of select="$bgcolor"/>
710                   </xsl:attribute>
711                 </xsl:when>
712                 <xsl:otherwise>
713                   <xsl:attribute name="bgcolor">
714                     <xsl:value-of select="$bgcolor"/>
715                   </xsl:attribute>
716                 </xsl:otherwise>
717               </xsl:choose>
718             </xsl:if>
719             <xsl:if test="@align">
720               <xsl:attribute name="align">
721                 <xsl:value-of select="@align"/>
722               </xsl:attribute>
723             </xsl:if>
724             <xsl:if test="@valign">
725               <xsl:attribute name="valign">
726                 <xsl:value-of select="@valign"/>
727               </xsl:attribute>
728             </xsl:if>
729             <xsl:copy-of select="$img"/>
730           </td>
731         </tr>
732       </table>
733     </xsl:when>
734     <xsl:otherwise>
735       <xsl:copy-of select="$img"/>
736     </xsl:otherwise>
737   </xsl:choose>
738
739   <xsl:if test="$tag = 'img' and ../../self::imageobjectco and not($scaled)">
740     <xsl:variable name="mapname">
741       <xsl:call-template name="object.id">
742         <xsl:with-param name="object" select="../../areaspec"/>
743       </xsl:call-template>
744     </xsl:variable>
745
746     <map name="{$mapname}">
747       <xsl:for-each select="../../areaspec//area">
748         <xsl:variable name="units">
749           <xsl:choose>
750             <xsl:when test="@units = 'other' and @otherunits">
751               <xsl:value-of select="@otherunits"/>
752             </xsl:when>
753             <xsl:when test="@units">
754               <xsl:value-of select="@units"/>
755             </xsl:when>
756             <!-- areaspec|areaset/area -->
757             <xsl:when test="../@units = 'other' and ../@otherunits">
758               <xsl:value-of select="../@otherunits"/>
759             </xsl:when>
760             <xsl:when test="../@units">
761               <xsl:value-of select="../@units"/>
762             </xsl:when>
763             <!-- areaspec/areaset/area -->
764             <xsl:when test="../../@units = 'other' and ../../@otherunits">
765               <xsl:value-of select="../@otherunits"/>
766             </xsl:when>
767             <xsl:when test="../../@units">
768               <xsl:value-of select="../../@units"/>
769             </xsl:when>
770             <xsl:otherwise>calspair</xsl:otherwise>
771           </xsl:choose>
772         </xsl:variable>
773  
774         <xsl:choose>
775           <xsl:when test="$units = 'calspair' or
776                           $units = 'imagemap'">
777             <xsl:variable name="coords" select="normalize-space(@coords)"/>
778
779             <area shape="rect">
780               <xsl:variable name="linkends">
781                 <xsl:choose>
782                   <xsl:when test="@linkends">
783                     <xsl:value-of select="normalize-space(@linkends)"/>
784                   </xsl:when>
785                   <xsl:otherwise>
786                     <xsl:value-of select="normalize-space(../@linkends)"/>
787                   </xsl:otherwise>
788                 </xsl:choose>
789               </xsl:variable>
790  
791               <xsl:variable name="href">
792                 <xsl:choose>
793                   <xsl:when test="@xlink:href">
794                     <xsl:value-of select="@xlink:href"/>
795                   </xsl:when>
796                   <xsl:otherwise>
797                     <xsl:value-of select="../@xlink:href"/>
798                   </xsl:otherwise>
799                 </xsl:choose>
800               </xsl:variable>
801  
802               <xsl:choose>
803                 <xsl:when test="$linkends != ''">
804                   <xsl:variable name="linkend">
805                     <xsl:choose>
806                       <xsl:when test="contains($linkends, ' ')">
807                         <xsl:value-of select="substring-before($linkends, ' ')"/>
808                       </xsl:when>
809                       <xsl:otherwise>
810                         <xsl:value-of select="$linkends"/>
811                       </xsl:otherwise>
812                     </xsl:choose>
813                   </xsl:variable>
814                   
815                   <xsl:variable name="target" select="key('id', $linkend)[1]"/>
816                  
817                   <xsl:if test="$target">
818                     <xsl:attribute name="href">
819                       <xsl:call-template name="href.target">
820                         <xsl:with-param name="object" select="$target"/>
821                       </xsl:call-template>
822                     </xsl:attribute>
823                   </xsl:if>
824                 </xsl:when>
825                 <xsl:when test="$href != ''">
826                   <xsl:attribute name="href">
827                     <xsl:value-of select="$href"/>
828                   </xsl:attribute>
829                 </xsl:when>
830               </xsl:choose>
831  
832               <xsl:if test="alt">
833                 <xsl:attribute name="alt">
834                   <xsl:value-of select="alt[1]"/>
835                 </xsl:attribute>
836               </xsl:if>
837  
838               <xsl:attribute name="coords">
839                 <xsl:choose>
840                   <xsl:when test="$units = 'calspair'">
841
842                     <xsl:variable name="p1"
843                                 select="substring-before($coords, ' ')"/>
844                     <xsl:variable name="p2"
845                                 select="substring-after($coords, ' ')"/>
846          
847                     <xsl:variable name="x1" select="substring-before($p1,',')"/>
848                     <xsl:variable name="y1" select="substring-after($p1,',')"/>
849                     <xsl:variable name="x2" select="substring-before($p2,',')"/>
850                     <xsl:variable name="y2" select="substring-after($p2,',')"/>
851          
852                     <xsl:variable name="x1p" select="$x1 div 100.0"/>
853                     <xsl:variable name="y1p" select="$y1 div 100.0"/>
854                     <xsl:variable name="x2p" select="$x2 div 100.0"/>
855                     <xsl:variable name="y2p" select="$y2 div 100.0"/>
856          
857          <!--
858                     <xsl:message>
859                       <xsl:text>units: </xsl:text>
860                       <xsl:value-of select="$units"/>
861                       <xsl:text> </xsl:text>
862                       <xsl:value-of select="$x1p"/><xsl:text>, </xsl:text>
863                       <xsl:value-of select="$y1p"/><xsl:text>, </xsl:text>
864                       <xsl:value-of select="$x2p"/><xsl:text>, </xsl:text>
865                       <xsl:value-of select="$y2p"/><xsl:text>, </xsl:text>
866                     </xsl:message>
867          
868                     <xsl:message>
869                       <xsl:text>      </xsl:text>
870                       <xsl:value-of select="$intrinsicwidth"/>
871                       <xsl:text>, </xsl:text>
872                       <xsl:value-of select="$intrinsicdepth"/>
873                     </xsl:message>
874          
875                     <xsl:message>
876                       <xsl:text>      </xsl:text>
877                       <xsl:value-of select="$units"/>
878                       <xsl:text> </xsl:text>
879                       <xsl:value-of 
880                             select="round($x1p * $intrinsicwidth div 100.0)"/>
881                       <xsl:text>,</xsl:text>
882                       <xsl:value-of select="round($intrinsicdepth
883                                        - ($y2p * $intrinsicdepth div 100.0))"/>
884                       <xsl:text>,</xsl:text>
885                       <xsl:value-of select="round($x2p * 
886                                             $intrinsicwidth div 100.0)"/>
887                       <xsl:text>,</xsl:text>
888                       <xsl:value-of select="round($intrinsicdepth
889                                        - ($y1p * $intrinsicdepth div 100.0))"/>
890                     </xsl:message>
891          -->
892                     <xsl:value-of 
893                              select="round($x1p * $intrinsicwidth div 100.0)"/>
894                     <xsl:text>,</xsl:text>
895                     <xsl:value-of select="round($intrinsicdepth
896                                         - ($y2p * $intrinsicdepth div 100.0))"/>
897                     <xsl:text>,</xsl:text>
898                     <xsl:value-of 
899                              select="round($x2p * $intrinsicwidth div 100.0)"/>
900                     <xsl:text>,</xsl:text>
901                     <xsl:value-of select="round($intrinsicdepth
902                                       - ($y1p * $intrinsicdepth div 100.0))"/>
903                   </xsl:when>
904                   <xsl:otherwise>
905                     <xsl:copy-of select="$coords"/>
906                   </xsl:otherwise>
907                 </xsl:choose>
908               </xsl:attribute>
909             </area>
910           </xsl:when>
911           <xsl:otherwise>
912             <xsl:message>
913               <xsl:text>Warning: only calspair or </xsl:text>
914               <xsl:text>otherunits='imagemap' supported </xsl:text>
915               <xsl:text>in imageobjectco</xsl:text>
916             </xsl:message>
917           </xsl:otherwise>
918         </xsl:choose>
919       </xsl:for-each>
920     </map>
921   </xsl:if>
922 </xsl:template>
923
924 <xsl:template name="process.image.attributes">
925   <xsl:param name="alt"/>
926   <xsl:param name="html.width"/>
927   <xsl:param name="html.depth"/>
928   <xsl:param name="longdesc"/>
929   <xsl:param name="scale"/>
930   <xsl:param name="scalefit"/>
931   <xsl:param name="scaled.contentdepth"/>
932   <xsl:param name="scaled.contentwidth"/>
933   <xsl:param name="viewport"/>
934
935   <xsl:choose>
936     <xsl:when test="@contentwidth or @contentdepth">
937       <!-- ignore @width/@depth, @scale, and @scalefit if specified -->
938       <xsl:if test="@contentwidth and $scaled.contentwidth != ''">
939         <xsl:attribute name="width">
940           <xsl:value-of select="$scaled.contentwidth"/>
941         </xsl:attribute>
942       </xsl:if>
943       <xsl:if test="@contentdepth and $scaled.contentdepth != ''">
944         <xsl:attribute name="height">
945           <xsl:value-of select="$scaled.contentdepth"/>
946         </xsl:attribute>
947       </xsl:if>
948     </xsl:when>
949
950     <xsl:when test="number($scale) != 1.0">
951       <!-- scaling is always uniform, so we only have to specify one dimension -->
952       <!-- ignore @scalefit if specified -->
953       <xsl:attribute name="width">
954         <xsl:value-of select="$scaled.contentwidth"/>
955       </xsl:attribute>
956     </xsl:when>
957
958     <xsl:when test="$scalefit != 0">
959       <xsl:choose>
960         <xsl:when test="contains($html.width, '%')">
961           <xsl:choose>
962             <xsl:when test="$viewport != 0">
963               <!-- The *viewport* will be scaled, so use 100% here! -->
964               <xsl:attribute name="width">
965                 <xsl:value-of select="'100%'"/>
966               </xsl:attribute>
967             </xsl:when>
968             <xsl:otherwise>
969               <xsl:attribute name="width">
970                 <xsl:value-of select="$html.width"/>
971               </xsl:attribute>
972             </xsl:otherwise>
973           </xsl:choose>
974         </xsl:when>
975
976         <xsl:when test="contains($html.depth, '%')">
977           <!-- HTML doesn't deal with this case very well...do nothing -->
978         </xsl:when>
979
980         <xsl:when test="$scaled.contentwidth != '' and $html.width != ''
981                         and $scaled.contentdepth != '' and $html.depth != ''">
982           <!-- scalefit should not be anamorphic; figure out which direction -->
983           <!-- has the limiting scale factor and scale in that direction -->
984           <xsl:choose>
985             <xsl:when test="$html.width div $scaled.contentwidth &gt;
986                             $html.depth div $scaled.contentdepth">
987               <xsl:attribute name="height">
988                 <xsl:value-of select="$html.depth"/>
989               </xsl:attribute>
990             </xsl:when>
991             <xsl:otherwise>
992               <xsl:attribute name="width">
993                 <xsl:value-of select="$html.width"/>
994               </xsl:attribute>
995             </xsl:otherwise>
996           </xsl:choose>
997         </xsl:when>
998
999         <xsl:when test="$scaled.contentwidth != '' and $html.width != ''">
1000           <xsl:attribute name="width">
1001             <xsl:value-of select="$html.width"/>
1002           </xsl:attribute>
1003         </xsl:when>
1004
1005         <xsl:when test="$scaled.contentdepth != '' and $html.depth != ''">
1006           <xsl:attribute name="height">
1007             <xsl:value-of select="$html.depth"/>
1008           </xsl:attribute>
1009         </xsl:when>
1010       </xsl:choose>
1011     </xsl:when>
1012   </xsl:choose>
1013
1014   <xsl:if test="$alt != ''">
1015     <xsl:attribute name="alt">
1016       <xsl:value-of select="normalize-space($alt)"/>
1017     </xsl:attribute>
1018   </xsl:if>
1019
1020   <xsl:if test="$longdesc != ''">
1021     <xsl:attribute name="longdesc">
1022       <xsl:value-of select="$longdesc"/>
1023     </xsl:attribute>
1024   </xsl:if>
1025
1026   <xsl:if test="@align and $viewport = 0">
1027     <xsl:attribute name="align">
1028       <xsl:choose>
1029         <xsl:when test="@align = 'center'">middle</xsl:when>
1030         <xsl:otherwise>
1031           <xsl:value-of select="@align"/>
1032         </xsl:otherwise>
1033       </xsl:choose>
1034     </xsl:attribute>
1035   </xsl:if>
1036 </xsl:template>
1037
1038 <!-- ==================================================================== -->
1039
1040 <xsl:template match="graphic">
1041   <xsl:choose>
1042     <xsl:when test="parent::inlineequation">
1043       <xsl:call-template name="anchor"/>
1044       <xsl:call-template name="process.image"/>
1045     </xsl:when>
1046     <xsl:otherwise>
1047       <div>
1048         <xsl:if test="@align">
1049           <xsl:attribute name="align">
1050             <xsl:value-of select="@align"/>
1051           </xsl:attribute>
1052         </xsl:if>
1053         <xsl:call-template name="anchor"/>
1054         <xsl:call-template name="process.image"/>
1055       </div>
1056     </xsl:otherwise>
1057   </xsl:choose>
1058 </xsl:template>
1059
1060 <xsl:template match="inlinegraphic">
1061   <xsl:variable name="filename">
1062     <xsl:choose>
1063       <xsl:when test="@entityref">
1064         <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
1065       </xsl:when>
1066       <xsl:otherwise>
1067         <xsl:apply-templates select="@fileref"/>
1068       </xsl:otherwise>
1069     </xsl:choose>
1070   </xsl:variable>
1071
1072   <xsl:call-template name="anchor"/>
1073
1074   <xsl:choose>
1075     <xsl:when test="@format='linespecific'">
1076       <xsl:choose>
1077         <xsl:when test="$use.extensions != '0'
1078                         and $textinsert.extension != '0'">
1079           <xsl:choose>
1080             <xsl:when test="element-available('stext:insertfile')">
1081               <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
1082             </xsl:when>
1083             <xsl:when test="element-available('xtext:insertfile')">
1084               <xtext:insertfile href="{$filename}"/>
1085             </xsl:when>
1086             <xsl:otherwise>
1087               <xsl:message terminate="yes">
1088                 <xsl:text>No insertfile extension available.</xsl:text>
1089               </xsl:message>
1090             </xsl:otherwise>
1091           </xsl:choose>
1092         </xsl:when>
1093         <xsl:otherwise>
1094           <xsl:message terminate="yes">
1095             <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
1096             <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text> 
1097           </xsl:message>
1098         </xsl:otherwise>
1099       </xsl:choose>
1100     </xsl:when>
1101     <xsl:otherwise>
1102       <xsl:call-template name="process.image"/>
1103     </xsl:otherwise>
1104   </xsl:choose>
1105 </xsl:template>
1106
1107 <!-- ==================================================================== -->
1108
1109 <xsl:template match="mediaobject|mediaobjectco">
1110
1111   <xsl:variable name="olist" select="imageobject|imageobjectco
1112                      |videoobject|audioobject
1113                      |textobject"/>
1114
1115   <xsl:variable name="object.index">
1116     <xsl:call-template name="select.mediaobject.index">
1117       <xsl:with-param name="olist" select="$olist"/>
1118       <xsl:with-param name="count" select="1"/>
1119     </xsl:call-template>
1120   </xsl:variable>
1121
1122   <xsl:variable name="object" select="$olist[position() = $object.index]"/>
1123
1124   <xsl:variable name="align">
1125     <xsl:value-of select="$object/descendant::imagedata[@align][1]/@align"/>
1126   </xsl:variable>
1127
1128   <div>
1129     <xsl:apply-templates select="." mode="common.html.attributes"/>
1130     <xsl:if test="$align != '' ">
1131       <xsl:attribute name="align">
1132         <xsl:value-of select="$align"/>
1133       </xsl:attribute>
1134     </xsl:if>
1135     <xsl:call-template name="anchor"/>
1136
1137     <xsl:apply-templates select="$object"/>
1138     <xsl:apply-templates select="caption"/>
1139   </div>
1140 </xsl:template>
1141
1142 <xsl:template match="inlinemediaobject">
1143   <span>
1144     <xsl:apply-templates select="." mode="common.html.attributes"/>
1145     <xsl:call-template name="anchor"/>
1146     <xsl:call-template name="select.mediaobject"/>
1147   </span>
1148 </xsl:template>
1149
1150 <xsl:template match="programlisting/inlinemediaobject
1151                      |screen/inlinemediaobject" priority="2">
1152   <!-- the additional span causes problems in some cases -->
1153   <xsl:call-template name="select.mediaobject"/>
1154 </xsl:template>
1155
1156 <!-- ==================================================================== -->
1157
1158 <xsl:template match="imageobjectco">
1159   <xsl:call-template name="anchor"/>
1160   <xsl:apply-templates select="imageobject"/>
1161   <xsl:apply-templates select="calloutlist"/>
1162 </xsl:template>
1163
1164 <xsl:template match="imageobject">
1165   <xsl:apply-templates select="imagedata"/>
1166 </xsl:template>
1167
1168 <xsl:template match="imagedata">
1169   <xsl:variable name="filename">
1170     <xsl:call-template name="mediaobject.filename">
1171       <xsl:with-param name="object" select=".."/>
1172     </xsl:call-template>
1173   </xsl:variable>
1174
1175   <xsl:choose>
1176     <!-- Handle MathML and SVG markup in imagedata -->
1177     <xsl:when test="mml:*" xmlns:mml="http://www.w3.org/1998/Math/MathML">
1178       <xsl:apply-templates/>
1179     </xsl:when>
1180     
1181     <xsl:when test="svg:*" xmlns:svg="http://www.w3.org/2000/svg">
1182       <xsl:apply-templates/>
1183     </xsl:when>
1184
1185     <xsl:when test="@format='linespecific'">
1186       <xsl:choose>
1187         <xsl:when test="$use.extensions != '0'
1188                         and $textinsert.extension != '0'">
1189           <xsl:choose>
1190             <xsl:when test="element-available('stext:insertfile')">
1191               <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
1192             </xsl:when>
1193             <xsl:when test="element-available('xtext:insertfile')">
1194               <xtext:insertfile href="{$filename}"/>
1195             </xsl:when>
1196             <xsl:otherwise>
1197               <xsl:message terminate="yes">
1198                 <xsl:text>No insertfile extension available.</xsl:text>
1199               </xsl:message>
1200             </xsl:otherwise>
1201           </xsl:choose>
1202         </xsl:when>
1203         <xsl:otherwise>
1204           <a xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"
1205              href="{$filename}"/>
1206         </xsl:otherwise>
1207       </xsl:choose>
1208     </xsl:when>
1209     <xsl:otherwise>
1210       <xsl:variable name="longdesc.uri">
1211         <xsl:call-template name="longdesc.uri">
1212           <xsl:with-param name="mediaobject"
1213                           select="ancestor::imageobject/parent::*"/>
1214         </xsl:call-template>
1215       </xsl:variable>
1216
1217       <xsl:variable name="phrases"
1218                     select="ancestor::mediaobject/textobject[phrase]
1219                             |ancestor::inlinemediaobject/textobject[phrase]
1220                             |ancestor::mediaobjectco/textobject[phrase]"/>
1221
1222       <xsl:call-template name="process.image">
1223         <xsl:with-param name="alt">
1224           <xsl:apply-templates select="$phrases[not(@role) or @role!='tex'][1]"/>
1225         </xsl:with-param>
1226         <xsl:with-param name="longdesc">
1227           <xsl:call-template name="write.longdesc">
1228             <xsl:with-param name="mediaobject"
1229                             select="ancestor::imageobject/parent::*"/>
1230           </xsl:call-template>
1231         </xsl:with-param>
1232       </xsl:call-template>
1233
1234       <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0
1235                     and ancestor::imageobject/parent::*/textobject[not(phrase)]">
1236         <xsl:call-template name="longdesc.link">
1237           <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/>
1238         </xsl:call-template>
1239       </xsl:if>
1240     </xsl:otherwise>
1241   </xsl:choose>
1242 </xsl:template>
1243
1244 <!-- ==================================================================== -->
1245
1246 <xsl:template name="longdesc.uri">
1247   <xsl:param name="mediaobject" select="."/>
1248   <xsl:if test="$html.longdesc">
1249     <xsl:if test="$mediaobject/textobject[not(phrase)]">
1250       <xsl:variable name="dbhtml.dir">
1251         <xsl:call-template name="dbhtml-dir"/>
1252       </xsl:variable>
1253       <xsl:variable name="filename">
1254         <xsl:call-template name="make-relative-filename">
1255           <xsl:with-param name="base.dir">
1256             <xsl:choose>
1257               <xsl:when test="$dbhtml.dir != ''">
1258                 <xsl:value-of select="$dbhtml.dir"/>
1259               </xsl:when>
1260               <xsl:otherwise>
1261                 <xsl:value-of select="$base.dir"/>
1262               </xsl:otherwise>
1263             </xsl:choose>
1264           </xsl:with-param>
1265           <xsl:with-param name="base.name">
1266             <xsl:choose>
1267               <xsl:when test="
1268                 $mediaobject/@*[local-name() = 'id']
1269                 and not($use.id.as.filename = 0)">
1270                 <!-- * if this mediaobject has an ID, then we use the -->
1271                 <!-- * value of that ID as basename for the "longdesc" -->
1272                 <!-- * file (that is, without prepending an "ld-" too it) -->
1273                 <xsl:value-of select="$mediaobject/@*[local-name() = 'id']"/>
1274                 <xsl:value-of select="$html.ext"/>
1275               </xsl:when>
1276               <xsl:otherwise>
1277                 <!-- * otherwise, if this mediaobject does not have an -->
1278                 <!-- * ID, then we generate an ID... -->
1279                 <xsl:variable name="image-id">
1280                   <xsl:call-template name="object.id">
1281                     <xsl:with-param name="object" select="$mediaobject"/>
1282                   </xsl:call-template>
1283                 </xsl:variable>
1284                 <!-- * ...and then we take that generated ID, prepend an -->
1285                 <!-- * "ld-" to it, and use that as the basename for the file -->
1286                 <xsl:value-of select="concat('ld-',$image-id,$html.ext)"/>
1287               </xsl:otherwise>
1288             </xsl:choose>
1289           </xsl:with-param>
1290         </xsl:call-template>
1291       </xsl:variable>
1292
1293       <xsl:value-of select="$filename"/>
1294     </xsl:if>
1295   </xsl:if>
1296 </xsl:template>
1297
1298 <xsl:template name="write.longdesc">
1299   <xsl:param name="mediaobject" select="."/>
1300   <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
1301     <xsl:variable name="filename">
1302       <xsl:call-template name="longdesc.uri">
1303         <xsl:with-param name="mediaobject" select="$mediaobject"/>
1304       </xsl:call-template>
1305     </xsl:variable>
1306
1307     <xsl:value-of select="$filename"/>
1308
1309     <xsl:call-template name="write.chunk">
1310       <xsl:with-param name="filename" select="$filename"/>
1311       <xsl:with-param name="quiet" select="$chunk.quietly"/>
1312       <xsl:with-param name="content">
1313       <xsl:call-template name="user.preroot"/>
1314         <html>
1315           <head>
1316             <xsl:call-template name="system.head.content"/>
1317             <xsl:call-template name="head.content">
1318               <xsl:with-param name="title" select="'Long Description'"/>
1319             </xsl:call-template>
1320             <xsl:call-template name="user.head.content"/>
1321           </head>
1322           <body>
1323             <xsl:call-template name="body.attributes"/>
1324             <xsl:for-each select="$mediaobject/textobject[not(phrase)]">
1325               <xsl:apply-templates select="./*"/>
1326             </xsl:for-each>
1327           </body>
1328         </html>
1329         <xsl:value-of select="$chunk.append"/>
1330       </xsl:with-param>
1331     </xsl:call-template>
1332   </xsl:if>
1333 </xsl:template>
1334
1335 <xsl:template name="longdesc.link">
1336   <xsl:param name="longdesc.uri" select="''"/>
1337
1338   <xsl:variable name="this.uri">
1339     <xsl:call-template name="make-relative-filename">
1340       <xsl:with-param name="base.dir" select="$base.dir"/>
1341       <xsl:with-param name="base.name">
1342         <xsl:call-template name="href.target.uri"/>
1343       </xsl:with-param>
1344     </xsl:call-template>
1345   </xsl:variable>
1346
1347   <xsl:variable name="href.to">
1348     <xsl:call-template name="trim.common.uri.paths">
1349       <xsl:with-param name="uriA" select="$longdesc.uri"/>
1350       <xsl:with-param name="uriB" select="$this.uri"/>
1351       <xsl:with-param name="return" select="'A'"/>
1352     </xsl:call-template>
1353   </xsl:variable>
1354
1355   <div class="longdesc-link" align="{$direction.align.end}">
1356     <br clear="all"/>
1357     <span class="longdesc-link">
1358       <xsl:text>[</xsl:text>
1359       <a href="{$href.to}" target="longdesc">D</a>
1360       <xsl:text>]</xsl:text>
1361     </span>
1362   </div>
1363 </xsl:template>
1364
1365 <!-- ==================================================================== -->
1366
1367 <xsl:template match="videoobject">
1368   <xsl:apply-templates select="videodata"/>
1369 </xsl:template>
1370
1371 <xsl:template match="videodata">
1372   <xsl:call-template name="process.image">
1373     <xsl:with-param name="tag" select="'embed'"/>
1374     <xsl:with-param name="alt">
1375       <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
1376     </xsl:with-param>
1377   </xsl:call-template>
1378 </xsl:template>
1379
1380 <!-- ==================================================================== -->
1381
1382 <xsl:template match="audioobject">
1383   <xsl:apply-templates select="audiodata"/>
1384 </xsl:template>
1385
1386 <xsl:template match="audiodata">
1387   <xsl:call-template name="process.image">
1388     <xsl:with-param name="tag" select="'embed'"/>
1389     <xsl:with-param name="alt">
1390       <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
1391     </xsl:with-param>
1392   </xsl:call-template>
1393 </xsl:template>
1394
1395 <!-- ==================================================================== -->
1396
1397 <xsl:template match="textobject">
1398   <xsl:apply-templates/>
1399 </xsl:template>
1400
1401 <xsl:template match="textdata">
1402   <xsl:variable name="filename">
1403     <xsl:choose>
1404       <xsl:when test="@entityref">
1405         <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
1406       </xsl:when>
1407       <xsl:otherwise>
1408         <xsl:apply-templates select="@fileref"/>
1409       </xsl:otherwise>
1410     </xsl:choose>
1411   </xsl:variable>
1412
1413   <xsl:variable name="encoding">
1414     <xsl:choose>
1415       <xsl:when test="@encoding">
1416         <xsl:value-of select="@encoding"/>
1417       </xsl:when>
1418       <xsl:otherwise>
1419         <xsl:value-of select="$textdata.default.encoding"/>
1420       </xsl:otherwise>
1421     </xsl:choose>
1422   </xsl:variable>
1423
1424   <xsl:choose>
1425     <xsl:when test="$use.extensions != '0'
1426                     and $textinsert.extension != '0'">
1427       <xsl:choose>
1428         <xsl:when test="element-available('stext:insertfile')">
1429           <stext:insertfile href="{$filename}" encoding="{$encoding}"/>
1430         </xsl:when>
1431         <xsl:when test="element-available('xtext:insertfile')">
1432           <xtext:insertfile href="{$filename}"/>
1433         </xsl:when>
1434         <xsl:otherwise>
1435           <xsl:message terminate="yes">
1436             <xsl:text>No insertfile extension available.</xsl:text>
1437           </xsl:message>
1438         </xsl:otherwise>
1439       </xsl:choose>
1440     </xsl:when>
1441     <xsl:otherwise>
1442       <xsl:message terminate="yes">
1443         <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
1444         <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text> 
1445       </xsl:message>
1446     </xsl:otherwise>
1447   </xsl:choose>
1448 </xsl:template>
1449
1450 <!-- ==================================================================== -->
1451
1452 <xsl:template match="caption">
1453   <div>
1454     <xsl:apply-templates select="." mode="common.html.attributes"/>
1455     <xsl:if test="@align = 'right' or @align = 'left' or @align='center'">
1456       <xsl:attribute name="align"><xsl:value-of
1457                          select="@align"/></xsl:attribute>
1458     </xsl:if>
1459     <xsl:apply-templates/>
1460   </div>
1461 </xsl:template>
1462
1463 <!-- ==================================================================== -->
1464 <!-- "Support" for SVG -->
1465
1466 <xsl:template match="svg:*" xmlns:svg="http://www.w3.org/2000/svg">
1467   <xsl:copy>
1468     <xsl:copy-of select="@*"/>
1469     <xsl:apply-templates/>
1470   </xsl:copy>
1471 </xsl:template>
1472
1473
1474 <!-- The following works sometimes, but needs to take into account
1475              1. When there is no /*/@xml:base
1476              2. When the chunks are going somewhere else
1477 <xsl:variable name="relpath">
1478   <xsl:call-template name="relative-uri">
1479     <xsl:with-param name="filename" select="@fileref"/>
1480   </xsl:call-template>
1481 </xsl:variable>
1482
1483 <xsl:choose>
1484   <xsl:when test="/*/@xml:base
1485                   and starts-with($relpath,/*/@xml:base)">
1486     <xsl:value-of select="substring-after($relpath,/*/@xml:base)"/>
1487   </xsl:when>
1488   <xsl:otherwise>
1489     <xsl:value-of select="@fileref"/>
1490   </xsl:otherwise>
1491 </xsl:choose>
1492 <xsl:value-of select="@fileref"/>
1493       </xsl:when>
1494 -->
1495 <!-- Resolve xml:base attributes -->
1496 <xsl:template match="@fileref">
1497   <!-- need a check for absolute urls -->
1498   <xsl:choose>
1499     <xsl:when test="contains(., ':')">
1500       <!-- it has a uri scheme so it is an absolute uri -->
1501       <xsl:value-of select="."/>
1502     </xsl:when>
1503     <xsl:when test="$keep.relative.image.uris != 0">
1504       <!-- leave it alone -->
1505       <xsl:value-of select="."/>
1506     </xsl:when>
1507     <xsl:otherwise>
1508       <!-- its a relative uri that needs xml:base processing -->
1509       <xsl:call-template name="relative-uri">
1510       </xsl:call-template>
1511     </xsl:otherwise>
1512   </xsl:choose>
1513 </xsl:template>
1514
1515 </xsl:stylesheet>