11b9e150f99c25eb442f1c6eb4b05c9a9ac2d091
[senf.git] / doclib / html-munge.xsl
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 \r
6   <xsl:output \r
7     method="html" \r
8     encoding="html" \r
9     doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"\r
10     doctype-system="http://www.w3.org/TR/html4/loose.dtd"/>\r
11 \r
12   <xsl:param name="topdir" select="''"/>\r
13   \r
14   <xsl:template match="*" name="copy">\r
15     <xsl:copy>\r
16       <xsl:call-template name="copy-attributes"/>\r
17       <xsl:apply-templates/>\r
18     </xsl:copy>\r
19   </xsl:template>\r
20 \r
21   <xsl:template name="copy-attributes">\r
22     <xsl:for-each select="@*">\r
23       <xsl:attribute name="{name(current())}">\r
24         <xsl:choose>\r
25           <xsl:when test="contains(current(),'@TOPDIR@')">\r
26             <xsl:value-of select="substring-before(current(),'@TOPDIR@')"/>\r
27             <xsl:value-of select="$topdir"/>\r
28             <xsl:value-of select="substring-after(current(),'@TOPDIR@')"/>\r
29           </xsl:when>\r
30           <xsl:otherwise>\r
31             <xsl:value-of select="current()"/>\r
32           </xsl:otherwise>\r
33         </xsl:choose>\r
34       </xsl:attribute>\r
35     </xsl:for-each>\r
36   </xsl:template>\r
37 \r
38   <!-- Replace @TOPDIR@ with relative top directory path -->\r
39 \r
40   <xsl:template match="@*[contains(current(),'@TOPDIR@')]">\r
41     <xsl:value-of select="substring-before(current(),'@TOPDIR@')"/>\r
42     <xsl:value-of select="$topdir"/>\r
43     <xsl:value-of select="substring-after(current(),'@TOPDIR@')"/>\r
44   </xsl:template>\r
45   \r
46   <!-- Add 'class' attribute to some special paragraphs/lists -->\r
47   \r
48   <xsl:template name="add-class">\r
49     <xsl:param name="class"/>\r
50     <xsl:copy>\r
51       <xsl:call-template name="copy-attributes"/>\r
52       <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>\r
53       <xsl:apply-templates/>\r
54     </xsl:copy>\r
55   </xsl:template>\r
56 \r
57   <!-- Add '<br/>' tag after every ', ' -->\r
58   <!-- This code is not very robust, it works with the doxygen output though -->\r
59 \r
60   <xsl:template name="break-comma">\r
61     <xsl:copy>\r
62       <xsl:call-template name="copy-attributes"/>\r
63       <xsl:attribute name="class">commalist</xsl:attribute>\r
64       <xsl:apply-templates mode="break-comma"/>\r
65     </xsl:copy>\r
66   </xsl:template>\r
67  \r
68   <xsl:template match="text()[1]" mode="break-comma">\r
69     <xsl:value-of select="current()"/><br/>\r
70   </xsl:template>\r
71 \r
72   <xsl:template match="*" mode="break-comma">\r
73     <xsl:call-template name="copy"/>\r
74   </xsl:template>\r
75 \r
76   <xsl:template match="text()[contains(current(),' and') or contains(current(),'and ')]" mode="break-comma" priority="1">\r
77     <xsl:value-of select="substring-before(current(),'and')"/>\r
78     <br/>\r
79     <xsl:value-of select="substring-after(current(),'and')"/>\r
80   </xsl:template>\r
81 \r
82   <xsl:template match="text()[contains(current(),',')]" mode="break-comma">\r
83     <xsl:value-of select="substring-before(current(),',')"/>\r
84     <xsl:text>,</xsl:text><br/>\r
85     <xsl:value-of select="substring-after(current(),',')"/>\r
86   </xsl:template>\r
87 \r
88   <!-- ====================================================================== -->\r
89 \r
90   <!-- Hack Glossary menu highlight -->\r
91 \r
92   <xsl:template match="div[@class='tabs menu']/ul[1]">\r
93     <xsl:choose>\r
94       <xsl:when test="//h1[.//text()='Glossary']">\r
95         <xsl:call-template name="add-class">\r
96           <xsl:with-param name="class">glossary</xsl:with-param>\r
97         </xsl:call-template>\r
98       </xsl:when>\r
99       <xsl:otherwise>\r
100         <xsl:copy>\r
101           <xsl:call-template name="copy-attributes"/>\r
102           <xsl:apply-templates/>\r
103         </xsl:copy>\r
104       </xsl:otherwise>\r
105     </xsl:choose>\r
106   </xsl:template>\r
107 \r
108   <!-- Autogenerate table-of-contents for a page -->\r
109 \r
110   <xsl:template match="div[@id='autotoc']">\r
111     <xsl:copy>\r
112       <xsl:call-template name="copy-attributes"/>\r
113       <h1>Contents</h1>\r
114       <ul>\r
115         <xsl:for-each select="following::h2|following::h3|following::h4">\r
116           <xsl:element name="li">\r
117             <xsl:attribute name="class">\r
118               <xsl:value-of select="concat('level_',local-name())"/>\r
119             </xsl:attribute>\r
120             <b><xsl:call-template name="section-number"/><xsl:text> </xsl:text></b>\r
121             <xsl:element name="a">\r
122               <xsl:choose>\r
123                 <xsl:when test="a/@name">\r
124                   <xsl:attribute name="href">\r
125                     <xsl:value-of select="concat('#',a/@name)"/>\r
126                   </xsl:attribute>\r
127                 </xsl:when>\r
128                 <xsl:otherwise>\r
129                   <xsl:attribute name="href">\r
130                     <xsl:text>#autotoc-</xsl:text>\r
131                     <xsl:call-template name="section-number"/>\r
132                   </xsl:attribute>\r
133                 </xsl:otherwise>\r
134               </xsl:choose>\r
135               <xsl:value-of select="string(current())"/>\r
136             </xsl:element>\r
137           </xsl:element>\r
138         </xsl:for-each>\r
139       </ul>\r
140     </xsl:copy>\r
141   </xsl:template>\r
142 \r
143   <xsl:template name="section-number">\r
144     <xsl:number level="any" from="div[@id='autotoc']" count="h2"/>\r
145     <xsl:text>.</xsl:text>\r
146     <xsl:if test="self::h3|self::h4">\r
147       <xsl:number level="any" from="h2" count="h3"/>\r
148       <xsl:text>.</xsl:text>\r
149     </xsl:if>\r
150     <xsl:if test="self::h4">\r
151       <xsl:number level="any" from="h3" count="h4"/>\r
152       <xsl:text>.</xsl:text>\r
153     </xsl:if>\r
154   </xsl:template>\r
155   \r
156   <xsl:template match="h2|h3|h4">\r
157     <xsl:copy>\r
158       <xsl:call-template name="copy-attributes"/>\r
159       <xsl:choose>\r
160         <xsl:when test="preceding::div[@id='autotoc']">\r
161           <xsl:call-template name="section-number"/>\r
162           <xsl:text> </xsl:text>\r
163           <xsl:choose>\r
164             <xsl:when test="a">\r
165               <xsl:apply-templates/>\r
166             </xsl:when>\r
167             <xsl:otherwise>\r
168               <xsl:element name="a">\r
169                 <xsl:attribute name="class"><xsl:text>anchor</xsl:text></xsl:attribute>\r
170                 <xsl:attribute name="name">\r
171                   <xsl:text>autotoc-</xsl:text>\r
172                   <xsl:call-template name="section-number"/>\r
173                 </xsl:attribute>\r
174                 <xsl:apply-templates/>\r
175               </xsl:element>\r
176             </xsl:otherwise>\r
177           </xsl:choose>\r
178         </xsl:when>\r
179         <xsl:otherwise>\r
180           <xsl:apply-templates/>\r
181         </xsl:otherwise>\r
182       </xsl:choose>\r
183     </xsl:copy>\r
184   </xsl:template>\r
185 \r
186   <!-- Build dia image-map from special div/span elements -->\r
187   <xsl:template match="div[@class='diamap']">\r
188     <xsl:element name="map">\r
189       <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>\r
190       <xsl:for-each select="span">\r
191         <xsl:if test="a">\r
192           <xsl:variable name="name" select="string(a[1])"/>\r
193           <xsl:element name="area">\r
194             <xsl:attribute name="shape">rect</xsl:attribute>\r
195             <xsl:attribute name="alt"><xsl:value-of select="$name"/></xsl:attribute>\r
196             <xsl:attribute name="title"><xsl:value-of select="$name"/></xsl:attribute>\r
197             <xsl:attribute name="href"><xsl:value-of select="a[1]/@href"/></xsl:attribute>\r
198             <xsl:attribute name="coords"><xsl:value-of select="@coords"/></xsl:attribute>\r
199           </xsl:element>\r
200         </xsl:if>\r
201       </xsl:for-each>\r
202     </xsl:element>\r
203   </xsl:template>\r
204 \r
205   <!-- Add grouping to all-members page -->\r
206 \r
207   <xsl:template match="table[preceding-sibling::h1[1][contains(text(),'Member List')]]">\r
208     <table class="allmembers">\r
209       <tr><td colspan="3"><h2>Public static member functions</h2></td></tr>\r
210       <xsl:apply-templates select="tr[contains(td[3],'static')][not(contains(td[3],'protected'))][not(contains(td[3],'private'))][not(contains(td[3],'friend'))][str:split(substring-before(concat(td[2]/a,'&lt;'),'&lt;'),'::')[position()=last()]!=string(td[1]/a)][not(starts-with(td[1]/a,'~'))]"/>\r
211 \r
212       <tr><td colspan="3"><h2>Public member functions</h2></td></tr>\r
213       <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'))][str:split(substring-before(concat(td[2]/a,'&lt;'),'&lt;'),'::')[position()=last()]!=string(td[1]/a)][not(starts-with(td[1]/a,'~'))][not(contains(td[3],'pure virtual'))]"/>\r
214 \r
215       <tr><td colspan="r"><h2>Public typedefs</h2></td></tr>\r
216       <xsl:apply-templates select="tr[contains(td[1],'typedef')][not(contains(td[3],'protected'))][not(contains(td[3],'private'))][not(contains(td[3],'friend'))][str:split(substring-before(concat(td[2]/a,'&lt;'),'&lt;'),'::')[position()=last()]!=string(td[1]/a)][not(starts-with(td[1]/a,'~'))][not(contains(td[3],'pure virtual'))]"/>\r
217 \r
218       <tr><td colspan="3"><h2>Non-public members</h2></td></tr>\r
219       <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,'&lt;'),'&lt;'),'::')[position()=last()]!=string(td[1]/a)][not(starts-with(td[1]/a,'~'))][not(contains(td[3],'pure virtual'))]"/>\r
220 \r
221     </table>\r
222   </xsl:template>\r
223 \r
224   <xsl:template match="table[preceding-sibling::h1[1][contains(text(),'Member List')]]/tr/td[2]/a/text()[contains(.,'&lt;')]">\r
225     <xsl:value-of select="substring-before(.,'&lt;')"/>\r
226   </xsl:template>\r
227 \r
228   <xsl:template match="table[preceding-sibling::h1[1][contains(text(),'Member List')]]/tr/td[1]/a/text()[contains(.,'::')]">\r
229     <xsl:value-of select="str:split(.,'::')[position()=last()]"/>\r
230   </xsl:template>\r
231 \r
232   <!-- Remove the automatically inserted search form (we build our own) -->\r
233   <xsl:template match="li[form]"> \r
234   </xsl:template>\r
235 \r
236   <xsl:template match="table[preceding-sibling::*[1][self::div][@class='qindex']]">\r
237     <xsl:call-template name="add-class">\r
238       <xsl:with-param name="class">qindextable</xsl:with-param>\r
239     </xsl:call-template>\r
240   </xsl:template>\r
241   \r
242   <xsl:template match="dl[dt/b/a/text()='Bug:']">\r
243     <xsl:call-template name="add-class">\r
244       <xsl:with-param name="class">xref-bug</xsl:with-param>\r
245     </xsl:call-template>\r
246   </xsl:template>\r
247 \r
248   <xsl:template match="dl[dt/b/a/text()='Fix:']">\r
249     <xsl:call-template name="add-class">\r
250       <xsl:with-param name="class">xref-fix</xsl:with-param>\r
251     </xsl:call-template>\r
252   </xsl:template>\r
253 \r
254   <xsl:template match="dl[dt/b/a/text()='Todo:']">\r
255     <xsl:call-template name="add-class">\r
256       <xsl:with-param name="class">xref-todo</xsl:with-param>\r
257     </xsl:call-template>\r
258   </xsl:template>\r
259 \r
260   <xsl:template match="dl[dt/b/a/text()='Idea:']">\r
261     <xsl:call-template name="add-class">\r
262       <xsl:with-param name="class">xref-idea</xsl:with-param>\r
263     </xsl:call-template>\r
264   </xsl:template>\r
265 \r
266   <xsl:template match="dl[dt/b/text()='Parameters:']|dl[dt/b/text()='Template Parameters:']">\r
267     <xsl:call-template name="add-class">\r
268       <xsl:with-param name="class">parameters</xsl:with-param>\r
269     </xsl:call-template>\r
270   </xsl:template>\r
271 \r
272   <xsl:template match="dl[dt/b/text()='Implementation note:']">\r
273     <xsl:call-template name="add-class">\r
274       <xsl:with-param name="class">implementation</xsl:with-param>\r
275     </xsl:call-template>\r
276   </xsl:template>\r
277 \r
278   <xsl:template match="table[descendant::td[@class='memItemLeft']]">\r
279     <xsl:call-template name="add-class">\r
280       <xsl:with-param name="class">members</xsl:with-param>\r
281     </xsl:call-template>\r
282   </xsl:template>\r
283 \r
284   <xsl:template match="a[@href=string(current())]" priority="1">\r
285     <xsl:call-template name="add-class">\r
286       <xsl:with-param name="class">literal</xsl:with-param>\r
287     </xsl:call-template>\r
288   </xsl:template>\r
289 \r
290   <xsl:template match="a[contains(@href,'http://')]">\r
291     <xsl:call-template name="add-class">\r
292       <xsl:with-param name="class">ext</xsl:with-param>\r
293     </xsl:call-template>\r
294   </xsl:template>\r
295 \r
296   <xsl:template match="a[not(@href)]">\r
297     <xsl:call-template name="add-class">\r
298       <xsl:with-param name="class">anchor</xsl:with-param>\r
299     </xsl:call-template>\r
300   </xsl:template>\r
301 \r
302   <xsl:template match="div[@class='memdoc']/p[1]">\r
303     <xsl:call-template name="add-class">\r
304       <xsl:with-param name="class">memtitle</xsl:with-param>\r
305     </xsl:call-template>\r
306   </xsl:template>\r
307 \r
308   <xsl:template match="p[starts-with(text(),'Definition at line ')]">\r
309     <xsl:call-template name="add-class">\r
310       <xsl:with-param name="class">sourceline</xsl:with-param>\r
311     </xsl:call-template>\r
312   </xsl:template>\r
313 \r
314   <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'References ')]">\r
315     <xsl:call-template name="add-class">\r
316       <xsl:with-param name="class">references</xsl:with-param>\r
317     </xsl:call-template>\r
318   </xsl:template>\r
319 \r
320   <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Referenced by ')]">\r
321     <xsl:call-template name="add-class">\r
322       <xsl:with-param name="class">referencedby</xsl:with-param>\r
323     </xsl:call-template>\r
324   </xsl:template>\r
325 \r
326   <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Reimplemented from ')]">\r
327     <xsl:call-template name="add-class">\r
328       <xsl:with-param name="class">reimplementedfrom</xsl:with-param>\r
329     </xsl:call-template>\r
330   </xsl:template>\r
331 \r
332   <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Reimplemented in ')]">\r
333     <xsl:call-template name="add-class">\r
334       <xsl:with-param name="class">reimplementedin</xsl:with-param>\r
335     </xsl:call-template>\r
336   </xsl:template>\r
337 \r
338   <xsl:template match="div[@class='memdoc']/p[starts-with(text(),'Implemented in ')]">\r
339     <xsl:call-template name="add-class">\r
340       <xsl:with-param name="class">implementedin</xsl:with-param>\r
341     </xsl:call-template>\r
342   </xsl:template>\r
343 \r
344   <xsl:template match="p[starts-with(text(),'Inherited by ')]">\r
345     <xsl:call-template name="break-comma"/>\r
346   </xsl:template>\r
347 \r
348   <xsl:template match="p[starts-with(text(),'Inherits ')]">\r
349     <xsl:call-template name="break-comma"/>\r
350   </xsl:template>\r
351 \r
352   <!-- Remove external items from the namespace index -->\r
353   <xsl:template match="div[@id='content2']/table[contains(preceding-sibling::h1/text(),'Namespace Reference')]/tr[td[@class='memItemRight']/a[1][@class='elRef'][@doxygen]]">\r
354   </xsl:template>\r
355   \r
356   <!-- Remove [external] references from the modules page -->\r
357   <xsl:template match="div[@id='content2']/ul/li[a/@class='elRef'][a/@doxygen][code/text()='[external]'][not(ul)]">\r
358   </xsl:template>\r
359 \r
360   <!-- Insert 'senf/'  into include paths -->\r
361   <xsl:template match="code[starts-with(text(),'#include &lt;')]/a">\r
362     <xsl:copy>\r
363       <xsl:call-template name="copy-attributes"/>\r
364       <xsl:text>senf/</xsl:text>\r
365       <xsl:apply-templates/>\r
366     </xsl:copy>\r
367   </xsl:template>\r
368 \r
369 </xsl:stylesheet>\r