1 <?xml version="1.0" encoding="utf-8"?>
\r
2 <xsl:stylesheet version="1.0"
\r
3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
\r
4 xmlns:str="http://exslt.org/strings"
\r
5 extension-element-prefixes="str">
\r
10 doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
\r
11 doctype-system="http://www.w3.org/TR/html4/loose.dtd"/>
\r
13 <xsl:param name="topdir" select="''"/>
\r
15 <xsl:template match="*" name="copy">
\r
17 <xsl:call-template name="copy-attributes"/>
\r
18 <xsl:apply-templates/>
\r
22 <xsl:template name="copy-attributes">
\r
23 <xsl:for-each select="@*">
\r
24 <xsl:attribute name="{name(current())}">
\r
26 <xsl:when test="contains(current(),'@TOPDIR@')">
\r
27 <xsl:value-of select="substring-before(current(),'@TOPDIR@')"/>
\r
28 <xsl:value-of select="$topdir"/>
\r
29 <xsl:value-of select="substring-after(current(),'@TOPDIR@')"/>
\r
32 <xsl:value-of select="current()"/>
\r
39 <!-- Replace @TOPDIR@ with relative top directory path -->
\r
41 <xsl:template match="@*[contains(current(),'@TOPDIR@')]">
\r
42 <xsl:value-of select="substring-before(current(),'@TOPDIR@')"/>
\r
43 <xsl:value-of select="$topdir"/>
\r
44 <xsl:value-of select="substring-after(current(),'@TOPDIR@')"/>
\r
47 <!-- Add 'class' attribute to some special paragraphs/lists -->
\r
49 <xsl:template name="add-class">
\r
50 <xsl:param name="class"/>
\r
52 <xsl:call-template name="copy-attributes"/>
\r
53 <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>
\r
54 <xsl:apply-templates/>
\r
58 <!-- Add '<br/>' tag after every ', ' -->
\r
59 <!-- This code is not very robust, it works with the doxygen output though -->
\r
61 <xsl:template name="break-comma">
\r
63 <xsl:call-template name="copy-attributes"/>
\r
64 <xsl:attribute name="class">commalist</xsl:attribute>
\r
65 <xsl:apply-templates mode="break-comma"/>
\r
69 <xsl:template match="text()[1]" mode="break-comma">
\r
70 <xsl:value-of select="current()"/><br/>
\r
73 <xsl:template match="*" mode="break-comma">
\r
74 <xsl:call-template name="copy"/>
\r
77 <xsl:template match="text()[contains(current(),' and') or contains(current(),'and ')]" mode="break-comma" priority="1">
\r
78 <xsl:value-of select="substring-before(current(),'and')"/>
\r
80 <xsl:value-of select="substring-after(current(),'and')"/>
\r
83 <xsl:template match="text()[contains(current(),',')]" mode="break-comma">
\r
84 <xsl:value-of select="substring-before(current(),',')"/>
\r
85 <xsl:text>,</xsl:text><br/>
\r
86 <xsl:value-of select="substring-after(current(),',')"/>
\r
89 <!-- ====================================================================== -->
\r
91 <!-- Hack Glossary menu highlight -->
\r
93 <xsl:template match="div[@class='tabs menu']/ul[1]">
\r
95 <xsl:when test="//h1[.//text()='Glossary']">
\r
96 <xsl:call-template name="add-class">
\r
97 <xsl:with-param name="class">glossary</xsl:with-param>
\r
98 </xsl:call-template>
\r
102 <xsl:call-template name="copy-attributes"/>
\r
103 <xsl:apply-templates/>
\r
109 <!-- Autogenerate table-of-contents for a page -->
\r
111 <xsl:template match="div[@id='autotoc']">
\r
113 <xsl:call-template name="copy-attributes"/>
\r
116 <xsl:for-each select="following::h2|following::h3|following::h4">
\r
117 <xsl:element name="li">
\r
118 <xsl:attribute name="class">
\r
119 <xsl:value-of select="concat('level_',local-name())"/>
\r
121 <b><xsl:call-template name="section-number"/><xsl:text> </xsl:text></b>
\r
122 <xsl:element name="a">
\r
124 <xsl:when test="a/@name">
\r
125 <xsl:attribute name="href">
\r
126 <xsl:value-of select="concat('#',a/@name)"/>
\r
130 <xsl:attribute name="href">
\r
131 <xsl:text>#autotoc-</xsl:text>
\r
132 <xsl:call-template name="section-number"/>
\r
136 <xsl:value-of select="string(current())"/>
\r
144 <xsl:template name="section-number">
\r
145 <xsl:number level="any" from="div[@id='autotoc']" count="h2"/>
\r
146 <xsl:text>.</xsl:text>
\r
147 <xsl:if test="self::h3|self::h4">
\r
148 <xsl:number level="any" from="h2" count="h3"/>
\r
149 <xsl:text>.</xsl:text>
\r
151 <xsl:if test="self::h4">
\r
152 <xsl:number level="any" from="h3" count="h4"/>
\r
153 <xsl:text>.</xsl:text>
\r
157 <xsl:template match="h2|h3|h4">
\r
159 <xsl:call-template name="copy-attributes"/>
\r
161 <xsl:when test="preceding::div[@id='autotoc']">
\r
162 <xsl:call-template name="section-number"/>
\r
163 <xsl:text> </xsl:text>
\r
165 <xsl:when test="a">
\r
166 <xsl:apply-templates/>
\r
169 <xsl:element name="a">
\r
170 <xsl:attribute name="class"><xsl:text>anchor</xsl:text></xsl:attribute>
\r
171 <xsl:attribute name="name">
\r
172 <xsl:text>autotoc-</xsl:text>
\r
173 <xsl:call-template name="section-number"/>
\r
175 <xsl:apply-templates/>
\r
181 <xsl:apply-templates/>
\r
187 <!-- Build dia image-map from special div/span elements -->
\r
188 <xsl:template match="div[@class='diamap']">
\r
189 <xsl:element name="map">
\r
190 <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
\r
191 <xsl:for-each select="span">
\r
193 <xsl:variable name="name" select="string(a[1])"/>
\r
194 <xsl:element name="area">
\r
195 <xsl:attribute name="shape">rect</xsl:attribute>
\r
196 <xsl:attribute name="alt"><xsl:value-of select="$name"/></xsl:attribute>
\r
197 <xsl:attribute name="title"><xsl:value-of select="$name"/></xsl:attribute>
\r
198 <xsl:attribute name="href"><xsl:value-of select="a[1]/@href"/></xsl:attribute>
\r
199 <xsl:attribute name="coords"><xsl:value-of select="@coords"/></xsl:attribute>
\r
206 <!-- Add grouping to all-members page -->
\r
208 <xsl:template match="table[preceding-sibling::h1[1][contains(text(),'Member List')]]">
\r
209 <table class="allmembers">
\r
211 <!-- We need to filter the table rows by looking for indications on the object type -->
\r
212 <!-- The table has 3 acolumns: -->
\r
213 <!-- td[1] is the name of the object, -->
\r
214 <!-- td[2] is the name of the class the object is defined in -->
\r
215 <!-- td[3] contains additional flags -->
\r
217 <!-- The conditions we have are: -->
\r
219 <!-- contains(td[3],'static') static member (variable or function) -->
\r
220 <!-- contains(td[3],'protected') protected member of arbitrary type -->
\r
221 <!-- contains(td[3],'private') private member of arbitrary type -->
\r
222 <!-- contains(td{3],'friend') friend declaration (function or class) -->
\r
223 <!-- contains(td[3],'pure virtual') entry is a pure-virtual member function -->
\r
224 <!-- starts-with(td[1]/text(),'(') function entry (member, static or friend) -->
\r
225 <!-- contains(td[1], 'typedef') entry is a typdef -->
\r
226 <!-- contains(td[1], 'enum ') entry is enum type or enumerator -->
\r
227 <!-- contains(td[1], 'enum name') entry is the name of an enum type -->
\r
228 <!-- contains(td[1], 'enum value') entry is an enumerator value -->
\r
229 <!-- str:split(substring-before(concat(td[2]/a,'<'),'<'),'::')[position()=last()]==string(td[1]/a) -->
\r
230 <!-- entry is a constructor -->
\r
231 <!-- not(starts-with(td[1]/a,'~')) entry is a destructor -->
\r
233 <xsl:variable name="public-static-memfn">
\r
234 <xsl:apply-templates select="tr[contains(td[3],'static')][not(contains(td[3],'protected'))][not(contains(td[3],'private'))][not(contains(td[3],'friend'))][starts-with(td[1]/text(),'(')]"/>
\r
236 <xsl:if test="string($public-static-memfn)">
\r
237 <tr><td colspan="3"><h2>Static Public Member Functions</h2></td></tr>
\r
238 <xsl:copy-of select="$public-static-memfn"/>
\r
241 <xsl:variable name="public-static-var">
\r
242 <xsl:apply-templates select="tr[not(contains(td[1],'typedef'))][contains(td[3],'static')][not(contains(td[3],'protected'))][not(contains(td[3],'private'))][not(starts-with(td[1]/text(),'('))]"/>
\r
244 <xsl:if test="string($public-static-var)">
\r
245 <tr><td colspan="3"><h2>Static Public Attributes</h2></td></tr>
\r
246 <xsl:copy-of select="$public-static-var"/>
\r
249 <xsl:variable name="public-memfn">
\r
250 <xsl:apply-templates select="tr[not(contains(td[1],'typedef'))][not(contains(td[3],'static'))][not(contains(td[3],'protected'))][not(contains(td[3],'private'))][not(contains(td[3],'friend'))][starts-with(td[1]/text(),'(')][str:split(substring-before(concat(td[2]/a,'<'),'<'),'::')[position()=last()]!=string(td[1]/a)][not(starts-with(td[1]/a,'~'))][not(contains(td[3],'pure virtual'))]"/>
\r
252 <xsl:if test="string($public-memfn)">
\r
253 <tr><td colspan="3"><h2>Public Member Functions</h2></td></tr>
\r
254 <xsl:copy-of select="$public-memfn"/>
\r
257 <xsl:variable name="public-var">
\r
258 <xsl:apply-templates select="tr[not(contains(td[1],'typedef'))][not(contains(td[1],'enum '))][not(contains(td[3],'static'))][not(contains(td[3],'protected'))][not(contains(td[3],'private'))][not(starts-with(td[1]/text(),'('))]"/>
\r
260 <xsl:if test="string($public-var)">
\r
261 <tr><td colspan="3"><h2>Public Attributes</h2></td></tr>
\r
262 <xsl:copy-of select="$public-var"/>
\r
265 <xsl:variable name="public-enum">
\r
266 <xsl:apply-templates select="tr[contains(td[1],'enum value')][not(contains(td[3],'protected'))][not(contains(td[3],'private'))]"/>
\r
268 <xsl:if test="string($public-enum)">
\r
269 <tr><td colspan="3"><h2>Public Enumerators</h2></td></tr>
\r
270 <xsl:copy-of select="$public-enum"/>
\r
273 <xsl:variable name="public-type">
\r
274 <xsl:apply-templates select="tr[contains(td[1],'typedef') or contains(td[1],'enum name')][not(contains(td[3],'protected'))][not(contains(td[3],'private'))][not(contains(td[3],'friend'))]"/>
\r
276 <xsl:if test="string($public-type)">
\r
277 <tr><td colspan="r"><h2>Public Types</h2></td></tr>
\r
278 <xsl:copy-of select="$public-type"/>
\r
281 <xsl:variable name="non-public">
\r
282 <xsl:apply-templates select="tr[contains(td[3],'protected') or contains(td[3],'private') or contains(td[3],'friend')][str:split(substring-before(concat(td[2]/a,'<'),'<'),'::')[position()=last()]!=string(td[1]/a)][not(starts-with(td[1]/a,'~'))][not(contains(td[3],'pure virtual'))]"/>
\r
284 <xsl:if test="string($non-public)">
\r
285 <tr><td colspan="3"><h2>Non-Public Members</h2></td></tr>
\r
286 <xsl:copy-of select="$non-public"/>
\r
292 <xsl:template match="table[preceding-sibling::h1[1][contains(text(),'Member List')]]/tr/td[2]/a/text()[contains(.,'<')]">
\r
293 <!-- this removes the template args form the second column to make the table more compact -->
\r
294 <xsl:value-of select="substring-before(.,'<')"/>
\r
297 <xsl:template match="table[preceding-sibling::h1[1][contains(text(),'Member List')]]/tr/td[1]/a/text()[contains(.,'::')]">
\r
298 <!-- for some weird reason, some members have a fully qualified name in the first column -->
\r
299 <!-- remove the qualification here -->
\r
300 <xsl:value-of select="str:split(.,'::')[position()=last()]"/>
\r
303 <!-- Remove the automatically inserted search form (we build our own) -->
\r
304 <xsl:template match="li[form]">
\r
307 <!-- Add CSS class to alphabetical class index table -->
\r
308 <xsl:template match="table[preceding-sibling::*[1][self::div][@class='qindex']]">
\r
309 <xsl:call-template name="add-class">
\r
310 <xsl:with-param name="class">qindextable</xsl:with-param>
\r
311 </xsl:call-template>
\r
314 <!-- Add CSS class to special paragraphs -->
\r
316 <xsl:template match="dl[dt/b/a/text()='Bug:']">
\r
317 <xsl:call-template name="add-class">
\r
318 <xsl:with-param name="class">xref-bug</xsl:with-param>
\r
319 </xsl:call-template>
\r
322 <xsl:template match="dl[dt/b/a/text()='Fix:']">
\r
323 <xsl:call-template name="add-class">
\r
324 <xsl:with-param name="class">xref-fix</xsl:with-param>
\r
325 </xsl:call-template>
\r
328 <xsl:template match="dl[dt/b/a/text()='Todo:']">
\r
329 <xsl:call-template name="add-class">
\r
330 <xsl:with-param name="class">xref-todo</xsl:with-param>
\r
331 </xsl:call-template>
\r
334 <xsl:template match="dl[dt/b/a/text()='Idea:']">
\r
335 <xsl:call-template name="add-class">
\r
336 <xsl:with-param name="class">xref-idea</xsl:with-param>
\r
337 </xsl:call-template>
\r
340 <xsl:template match="dl[dt/b/text()='Parameters:']|dl[dt/b/text()='Template Parameters:']">
\r
341 <xsl:call-template name="add-class">
\r
342 <xsl:with-param name="class">parameters</xsl:with-param>
\r
343 </xsl:call-template>
\r
346 <xsl:template match="dl[dt/b/text()='Implementation note:']">
\r
347 <xsl:call-template name="add-class">
\r
348 <xsl:with-param name="class">implementation</xsl:with-param>
\r
349 </xsl:call-template>
\r
352 <xsl:template match="p[starts-with(text(),'Definition at line ')]">
\r
353 <xsl:call-template name="add-class">
\r
354 <xsl:with-param name="class">sourceline</xsl:with-param>
\r
355 </xsl:call-template>
\r
358 <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'References ')]">
\r
359 <xsl:call-template name="add-class">
\r
360 <xsl:with-param name="class">references</xsl:with-param>
\r
361 </xsl:call-template>
\r
364 <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Referenced by ')]">
\r
365 <xsl:call-template name="add-class">
\r
366 <xsl:with-param name="class">referencedby</xsl:with-param>
\r
367 </xsl:call-template>
\r
370 <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Reimplemented from ')]">
\r
371 <xsl:call-template name="add-class">
\r
372 <xsl:with-param name="class">reimplementedfrom</xsl:with-param>
\r
373 </xsl:call-template>
\r
376 <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Reimplemented in ')]">
\r
377 <xsl:call-template name="add-class">
\r
378 <xsl:with-param name="class">reimplementedin</xsl:with-param>
\r
379 </xsl:call-template>
\r
382 <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Implemented in ')]">
\r
383 <xsl:call-template name="add-class">
\r
384 <xsl:with-param name="class">implementedin</xsl:with-param>
\r
385 </xsl:call-template>
\r
388 <xsl:template match="p[starts-with(text(),'Inherited by ')]">
\r
389 <xsl:call-template name="break-comma"/>
\r
392 <xsl:template match="p[starts-with(text(),'Inherits ')]">
\r
393 <xsl:call-template name="break-comma"/>
\r
396 <!-- Add CSS class to the member overview table of a class documentation -->
\r
397 <xsl:template match="table[descendant::td[@class='memItemLeft']]">
\r
398 <xsl:call-template name="add-class">
\r
399 <xsl:with-param name="class">members</xsl:with-param>
\r
400 </xsl:call-template>
\r
403 <!-- Add CSS class to literal links (links, where link text and href attribute are the same -->
\r
404 <xsl:template match="a[@href=string(current())]" priority="1">
\r
405 <xsl:call-template name="add-class">
\r
406 <xsl:with-param name="class">literal</xsl:with-param>
\r
407 </xsl:call-template>
\r
410 <!-- Add CSS class to external links -->
\r
411 <xsl:template match="a[contains(@href,'http://')]">
\r
412 <xsl:call-template name="add-class">
\r
413 <xsl:with-param name="class">ext</xsl:with-param>
\r
414 </xsl:call-template>
\r
417 <!-- Add CSS class to anchor-only links -->
\r
418 <xsl:template match="a[not(@href)]">
\r
419 <xsl:call-template name="add-class">
\r
420 <xsl:with-param name="class">anchor</xsl:with-param>
\r
421 </xsl:call-template>
\r
424 <!-- Add CSS class to the brief documentation paragraph of the member documentation -->
\r
425 <xsl:template match="div[@class='memdoc']/p[1]">
\r
426 <xsl:call-template name="add-class">
\r
427 <xsl:with-param name="class">memtitle</xsl:with-param>
\r
428 </xsl:call-template>
\r
431 <!-- Remove external items from the namespace index -->
\r
432 <xsl:template match="div[@id='content2']/table[contains(preceding-sibling::h1/text(),'Namespace Reference')]/tr[td[@class='memItemRight']/a[1][@class='elRef'][@doxygen]]">
\r
435 <!-- Remove [external] references from the modules page -->
\r
436 <xsl:template match="div[@id='content2']/ul/li[a/@class='elRef'][a/@doxygen][code/text()='[external]'][not(ul)]">
\r
439 <!-- Insert 'senf/' into include paths -->
\r
440 <xsl:template match="code[starts-with(text(),'#include <')]/a">
\r
442 <xsl:call-template name="copy-attributes"/>
\r
443 <xsl:text>senf/</xsl:text>
\r
444 <xsl:apply-templates/>
\r