]> git.stg.codes - stg.git/blob - doc/xslt/website/toc-tabular.xsl
Fix accessing array element above array bounds in rsconf
[stg.git] / doc / xslt / website / toc-tabular.xsl
1 <?xml version="1.0"?>
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                 version="1.0">
4
5 <xsl:output method="html"/>
6
7 <xsl:param name="nav.graphics" select="1"/>
8 <xsl:param name="nav.pointer" select="1"/>
9 <xsl:param name="nav.revisionflag" select="1"/>
10
11 <xsl:param name="toc.spacer.text">&#160;&#160;&#160;</xsl:param>
12 <xsl:param name="toc.spacer.image">graphics/blank.gif</xsl:param>
13
14 <xsl:param name="nav.icon.path">graphics/navicons/</xsl:param>
15 <xsl:param name="nav.icon.extension">.gif</xsl:param>
16
17 <!-- styles: folder, folder16, plusminus, triangle, arrow -->
18 <xsl:param name="nav.icon.style">triangle</xsl:param>
19
20 <xsl:param name="nav.text.spacer">&#160;</xsl:param>
21 <xsl:param name="nav.text.current.open">+</xsl:param>
22 <xsl:param name="nav.text.current.page">+</xsl:param>
23 <xsl:param name="nav.text.other.open">&#160;</xsl:param>
24 <xsl:param name="nav.text.other.closed">&#160;</xsl:param>
25 <xsl:param name="nav.text.other.page">&#160;</xsl:param>
26 <xsl:param name="nav.text.revisionflag.added">New</xsl:param>
27 <xsl:param name="nav.text.revisionflag.changed">Changed</xsl:param>
28 <xsl:param name="nav.text.revisionflag.deleted"></xsl:param>
29 <xsl:param name="nav.text.revisionflag.off"></xsl:param>
30
31 <xsl:param name="nav.text.pointer">&lt;-</xsl:param>
32
33 <xsl:param name="toc.expand.depth" select="1"/>
34
35 <!-- ==================================================================== --> 
36
37 <xsl:template match="toc/title|tocentry/title|titleabbrev">
38   <xsl:apply-templates/>
39 </xsl:template>
40
41 <xsl:template match="toc">
42   <xsl:param name="pageid" select="@id"/>
43
44   <xsl:variable name="relpath">
45     <xsl:call-template name="toc-rel-path">
46       <xsl:with-param name="pageid" select="$pageid"/>
47     </xsl:call-template>
48   </xsl:variable>
49
50   <xsl:variable name="homebanner"
51                 select="/autolayout/config[@param='homebanner-tabular'][1]"/>
52
53   <xsl:variable name="banner"
54                 select="/autolayout/config[@param='banner-tabular'][1]"/>
55
56   <xsl:choose>
57     <xsl:when test="$pageid = @id">
58       <img align="left" border="0">
59         <xsl:attribute name="src">
60           <xsl:value-of select="$relpath"/>
61           <xsl:value-of select="$homebanner/@value"/>
62         </xsl:attribute>
63         <xsl:attribute name="alt">
64           <xsl:value-of select="$homebanner/@altval"/>
65         </xsl:attribute>
66       </img>
67       <br clear="all"/>
68       <br/>
69     </xsl:when>
70     <xsl:otherwise>
71       <a href="{$relpath}{@dir}{$filename-prefix}{@filename}">
72         <img align="left" border="0">
73           <xsl:attribute name="src">
74             <xsl:value-of select="$relpath"/>
75             <xsl:value-of select="$banner/@value"/>
76           </xsl:attribute>
77           <xsl:attribute name="alt">
78             <xsl:value-of select="$banner/@altval"/>
79           </xsl:attribute>
80         </img>
81       </a>
82       <br clear="all"/>
83       <br/>
84     </xsl:otherwise>
85   </xsl:choose>
86
87   <xsl:apply-templates select="tocentry">
88     <xsl:with-param name="pageid" select="$pageid"/>
89     <xsl:with-param name="relpath" select="$relpath"/>
90   </xsl:apply-templates>
91   <br/>
92 </xsl:template>
93
94 <!-- ==================================================================== -->
95
96 <xsl:template match="tocentry">
97   <xsl:param name="pageid" select="@id"/>
98   <xsl:param name="toclevel" select="count(ancestor::*)"/>
99   <xsl:param name="relpath" select="''"/>
100   <xsl:param name="revisionflag" select="@revisionflag"/>
101
102   <xsl:variable name="page" select="."/>
103   <xsl:variable name="target"
104                 select="($page/descendant-or-self::tocentry[not(@tocskip) or @tocskip = '0']
105                        |$page/following::tocentry[@tocskip and @tocskip='0'])[1]"/>
106
107   <xsl:variable name="depth" select="count(ancestor::*)-1"/>
108
109   <xsl:variable name="isdescendant">
110     <xsl:choose>
111       <xsl:when test="ancestor::*[@id=$pageid]">1</xsl:when>
112       <xsl:otherwise>0</xsl:otherwise>
113     </xsl:choose>
114   </xsl:variable>
115
116   <xsl:variable name="hasdescendant">
117     <xsl:choose>
118       <xsl:when test="descendant::tocentry != ''">1</xsl:when>
119       <xsl:otherwise>0</xsl:otherwise>
120     </xsl:choose>
121   </xsl:variable>
122
123   <xsl:variable name="isancestor">
124     <xsl:choose>
125       <xsl:when test="descendant::*[@id=$pageid]">1</xsl:when>
126       <xsl:otherwise>0</xsl:otherwise>
127     </xsl:choose>
128   </xsl:variable>
129
130   <xsl:variable name="use.toc.expand.depth">
131     <xsl:variable name="config-param" select="ancestor::autolayout/config[@param='toc.expand.depth']/@value"/>
132     <xsl:choose>
133       <!-- toc.expand.depth attribute is not in DTD -->
134       <xsl:when test="ancestor::toc/@toc.expand.depth">
135         <xsl:value-of select="ancestor::toc/@toc.expand.depth"/>
136       </xsl:when>
137       <xsl:when test="floor($config-param) > 0">
138         <xsl:value-of select="$config-param"/>
139       </xsl:when>
140       <xsl:otherwise>
141         <xsl:value-of select="$toc.expand.depth"/>
142       </xsl:otherwise>
143     </xsl:choose>
144   </xsl:variable>
145
146   <xsl:variable name="is.open">
147     <xsl:choose>
148       <xsl:when test="$pageid = @id
149                       or $isancestor='1'
150                       or $depth &lt; $use.toc.expand.depth">1</xsl:when>
151       <xsl:otherwise>0</xsl:otherwise>
152     </xsl:choose>
153   </xsl:variable>
154
155   <!-- For any entry in the TOC:
156        1. It is the current page
157           a. it is a leaf             current/leaf
158           b. it is an open page       current/open
159        2. It is not the current page
160           a. it is a leaf             other/leaf
161           b. it is an open page       other/open
162           c. it is a closed page      other/closed
163   -->
164
165   <xsl:variable name="preceding-icon">
166     <xsl:value-of select="$relpath"/>
167     <xsl:value-of select="$nav.icon.path"/>
168     <xsl:value-of select="$nav.icon.style"/>
169     <xsl:choose>
170       <xsl:when test="$pageid=@id">
171         <xsl:choose>
172           <xsl:when test="$hasdescendant != 0">
173             <xsl:text>/current/open</xsl:text>
174           </xsl:when>
175           <xsl:otherwise>
176             <xsl:text>/current/leaf</xsl:text>
177           </xsl:otherwise>
178         </xsl:choose>
179       </xsl:when>
180       <xsl:otherwise>
181         <xsl:choose>
182           <xsl:when test="$hasdescendant = 0">
183             <xsl:text>/other/leaf</xsl:text>
184           </xsl:when>
185           <xsl:when test="$is.open != 0">
186             <xsl:text>/other/open</xsl:text>
187           </xsl:when>
188           <xsl:otherwise>
189             <xsl:text>/other/closed</xsl:text>
190           </xsl:otherwise>
191         </xsl:choose>
192       </xsl:otherwise>
193     </xsl:choose>
194     <xsl:value-of select="$nav.icon.extension"/>
195   </xsl:variable>
196
197   <xsl:variable name="preceding-text">
198     <xsl:choose>
199       <xsl:when test="$pageid=@id">
200         <xsl:choose>
201           <xsl:when test="$hasdescendant != 0">
202             <xsl:value-of select="$nav.text.current.open"/>
203           </xsl:when>
204           <xsl:otherwise>
205             <xsl:value-of select="$nav.text.current.page"/>
206           </xsl:otherwise>
207         </xsl:choose>
208       </xsl:when>
209       <xsl:otherwise>
210         <xsl:choose>
211           <xsl:when test="$isancestor != 0">
212             <xsl:value-of select="$nav.text.other.open"/>
213           </xsl:when>
214           <xsl:when test="$hasdescendant != 0">
215             <xsl:value-of select="$nav.text.other.closed"/>
216           </xsl:when>
217           <xsl:otherwise>
218             <xsl:value-of select="$nav.text.other.page"/>
219           </xsl:otherwise>
220         </xsl:choose>
221       </xsl:otherwise>
222     </xsl:choose>
223   </xsl:variable>
224
225   <xsl:variable name="following-icon">
226     <xsl:value-of select="$relpath"/>
227     <xsl:value-of select="$nav.icon.path"/>
228     <xsl:value-of select="$nav.icon.style"/>
229     <xsl:text>/current/pointer</xsl:text>
230     <xsl:value-of select="$nav.icon.extension"/>
231   </xsl:variable>
232
233   <xsl:variable name="following-text">
234     <xsl:value-of select="$nav.text.pointer"/>
235   </xsl:variable>
236
237   <xsl:variable name="revisionflag-icon">
238     <xsl:value-of select="$relpath"/>
239     <xsl:value-of select="$nav.icon.path"/>
240     <xsl:value-of select="$nav.icon.style"/>
241     <xsl:text>/</xsl:text>
242     <xsl:value-of select="$revisionflag"/>
243     <xsl:value-of select="$nav.icon.extension"/>
244   </xsl:variable>
245
246   <xsl:variable name="revisionflag-text">
247     <xsl:choose>
248       <xsl:when test="$revisionflag = 'changed'">
249         <xsl:value-of select="$nav.text.revisionflag.changed"/>
250       </xsl:when>
251       <xsl:when test="$revisionflag = 'added'">
252         <xsl:value-of select="$nav.text.revisionflag.added"/>
253       </xsl:when>
254       <xsl:when test="$revisionflag = 'deleted'">
255         <xsl:value-of select="$nav.text.revisionflag.deleted"/>
256       </xsl:when>
257       <xsl:otherwise>
258         <xsl:value-of select="$nav.text.revisionflag.off"/>
259       </xsl:otherwise>
260     </xsl:choose>
261   </xsl:variable>
262
263   <span>
264     <xsl:if test="$toclevel = 2">
265       <xsl:attribute name="class">
266         <xsl:text>toplevel</xsl:text>
267       </xsl:attribute>
268     </xsl:if>
269
270     <xsl:if test="$toclevel &gt; 2">
271       <xsl:attribute name="class">
272         <xsl:text>shrink</xsl:text>
273         <xsl:value-of select="$toclevel - 2"/>
274       </xsl:attribute>
275     </xsl:if>
276
277     <xsl:call-template name="insert.spacers">
278       <xsl:with-param name="count" select="$toclevel - 1"/>
279       <xsl:with-param name="relpath" select="$relpath"/>
280     </xsl:call-template>
281
282     <xsl:choose>
283       <xsl:when test="$nav.graphics != 0">
284         <xsl:call-template name="link.to.page">
285           <xsl:with-param name="href" select="@href"/>
286           <xsl:with-param name="page" select="$target"/>
287           <xsl:with-param name="relpath" select="$relpath"/>
288           <xsl:with-param name="linktext">
289             <img src="{$preceding-icon}" alt="{$preceding-text}" border="0"/>
290           </xsl:with-param>
291         </xsl:call-template>
292       </xsl:when>
293       <xsl:otherwise>
294         <xsl:value-of select="$preceding-text"/>
295       </xsl:otherwise>
296     </xsl:choose>
297
298     <xsl:choose>
299       <xsl:when test="$pageid = @id">
300         <span class="curpage">
301           <xsl:choose>
302             <xsl:when test="titleabbrev">
303               <xsl:apply-templates select="titleabbrev"/>
304             </xsl:when>
305             <xsl:otherwise>
306               <xsl:apply-templates select="title"/>
307             </xsl:otherwise>
308           </xsl:choose>
309
310           <xsl:if test="$nav.revisionflag != '0' and $revisionflag">
311             <xsl:value-of select="$nav.text.spacer"/>
312             <xsl:choose>
313               <xsl:when test="$nav.graphics = '1'">
314                 <img src="{$revisionflag-icon}" alt="{$revisionflag-text}" align="bottom"/>
315               </xsl:when>
316               <xsl:otherwise>
317                 <xsl:text>(</xsl:text>
318                 <xsl:value-of select="$revisionflag-text"/>
319                 <xsl:text>)</xsl:text>
320               </xsl:otherwise>
321             </xsl:choose>
322           </xsl:if>
323
324           <xsl:if test="$nav.pointer != '0'">
325             <xsl:value-of select="$nav.text.spacer"/>
326             <xsl:choose>
327               <xsl:when test="$nav.graphics = '1'">
328                 <img src="{$following-icon}" alt="{$following-text}"/>
329               </xsl:when>
330               <xsl:otherwise>
331                 <xsl:value-of select="$following-text"/>
332               </xsl:otherwise>
333             </xsl:choose>
334           </xsl:if>
335         </span>
336         <br/>
337       </xsl:when>
338       <xsl:otherwise>
339         <span>
340           <xsl:choose>
341             <xsl:when test="$isdescendant='0'">
342               <xsl:choose>
343                 <xsl:when test="$isancestor='1'">
344                   <xsl:attribute name="class">ancestor</xsl:attribute>
345                 </xsl:when>
346                 <xsl:otherwise>
347                   <xsl:attribute name="class">otherpage</xsl:attribute>
348                 </xsl:otherwise>
349               </xsl:choose>
350             </xsl:when>
351             <xsl:otherwise>
352               <!-- IS a descendant of curpage -->
353               <xsl:attribute name="class">descendant</xsl:attribute>
354             </xsl:otherwise>
355           </xsl:choose>
356
357           <xsl:call-template name="link.to.page">
358             <xsl:with-param name="href" select="@href"/>
359             <xsl:with-param name="page" select="$target"/>
360             <xsl:with-param name="relpath" select="$relpath"/>
361             <xsl:with-param name="linktext">
362               <xsl:choose>
363                 <xsl:when test="titleabbrev">
364                   <xsl:apply-templates select="titleabbrev"/>
365                 </xsl:when>
366                 <xsl:otherwise>
367                   <xsl:apply-templates select="title"/>
368                 </xsl:otherwise>
369               </xsl:choose>
370             </xsl:with-param>
371           </xsl:call-template>
372
373           <xsl:if test="$nav.revisionflag != '0' and $revisionflag">
374             <xsl:value-of select="$nav.text.spacer"/>
375             <xsl:choose>
376               <xsl:when test="$nav.graphics = '1'">
377                 <img src="{$revisionflag-icon}" alt="{$revisionflag-text}"/>
378               </xsl:when>
379               <xsl:otherwise>
380                 <xsl:text>(</xsl:text>
381                 <xsl:value-of select="$revisionflag-text"/>
382                 <xsl:text>)</xsl:text>
383               </xsl:otherwise>
384             </xsl:choose>
385           </xsl:if>
386
387         </span>
388         <br/>
389       </xsl:otherwise>
390     </xsl:choose>
391   </span>
392
393   <xsl:if test="$is.open != 0">
394     <xsl:apply-templates select="tocentry">
395       <xsl:with-param name="pageid" select="$pageid"/>
396       <xsl:with-param name="relpath" select="$relpath"/>
397     </xsl:apply-templates>
398   </xsl:if>
399 </xsl:template>
400
401 <xsl:template name="insert.spacers">
402   <xsl:param name="count" select="0"/>
403   <xsl:param name="relpath"/>
404   <xsl:if test="$count>0">
405     <xsl:choose>
406       <xsl:when test="$nav.graphics != 0">
407         <img src="{$relpath}{$toc.spacer.image}" alt="{$toc.spacer.text}"/>
408       </xsl:when>
409       <xsl:otherwise>
410         <xsl:value-of select="$toc.spacer.text"/>
411       </xsl:otherwise>
412     </xsl:choose>
413     <xsl:call-template name="insert.spacers">
414       <xsl:with-param name="count" select="$count - 1"/>
415       <xsl:with-param name="relpath" select="$relpath"/>
416     </xsl:call-template>
417   </xsl:if>
418 </xsl:template>
419
420 <xsl:template match="toc|tocentry|notoc" mode="toc-rel-path">
421   <xsl:call-template name="toc-rel-path"/>
422 </xsl:template>
423
424 <xsl:template name="toc-rel-path">
425   <xsl:param name="pageid" select="@id"/>
426   <xsl:variable name="entry" select="$autolayout//*[@id=$pageid]"/>
427   <xsl:variable name="filename" select="concat($entry/@dir,$entry/@filename)"/>
428
429   <xsl:variable name="slash-count">
430     <xsl:call-template name="toc-directory-depth">
431       <xsl:with-param name="filename" select="$filename"/>
432     </xsl:call-template>
433   </xsl:variable>
434
435   <xsl:variable name="depth">
436     <xsl:choose>
437       <xsl:when test="starts-with($filename, '/')">
438         <xsl:value-of select="$slash-count - 1"/>
439       </xsl:when>
440       <xsl:otherwise>
441         <xsl:value-of select="$slash-count"/>
442       </xsl:otherwise>
443     </xsl:choose>
444   </xsl:variable>
445
446 <!--
447   <xsl:message>
448     <xsl:value-of select="$filename"/>
449     <xsl:text> depth=</xsl:text>
450     <xsl:value-of select="$depth"/>
451   </xsl:message>
452 -->
453
454   <xsl:if test="$depth > 0">
455     <xsl:call-template name="copy-string">
456       <xsl:with-param name="string">../</xsl:with-param>
457       <xsl:with-param name="count" select="$depth"/>
458     </xsl:call-template>
459   </xsl:if>
460 </xsl:template>
461
462 <xsl:template name="toc-directory-depth">
463   <xsl:param name="filename"></xsl:param>
464   <xsl:param name="count" select="0"/>
465
466   <xsl:choose>
467     <xsl:when test='contains($filename,"/")'>
468       <xsl:call-template name="toc-directory-depth">
469         <xsl:with-param name="filename"
470                         select="substring-after($filename,'/')"/>
471         <xsl:with-param name="count" select="$count + 1"/>
472       </xsl:call-template>
473     </xsl:when>
474     <xsl:otherwise>
475       <xsl:value-of select="$count"/>
476     </xsl:otherwise>
477   </xsl:choose>
478 </xsl:template>
479
480 </xsl:stylesheet>