Project

General

Profile

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>
(17-17/39)