1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns="http://www.devhelp.net/book"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
Copyright (c) 2009 Daniel Elstner <daniel.kitta@gmail.com>
XSL transformation from a Doxygen tag file to DevHelp 2 format.
This script is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
by the Free Software Foundation, either version 2 of the License,
or (at your option) any later version.
This script is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this script. If not, see <http://www.gnu.org/licenses/>.
-->
<xsl:strip-space elements="*"/>
<xsl:output method="xml" version="1.0" indent="yes" encoding="UTF-8"/>
<xsl:param name="book_title"/>
<xsl:param name="book_name"/>
<xsl:param name="book_base"/>
<!-- Define keys to filter compounds that are members of other compounds -->
<xsl:key name="nested-group" match="compound[@kind='group']" use="subgroup"/>
<xsl:key name="nested-scope" match="compound[@kind='namespace']" use="namespace|class"/>
<xsl:key name="nested-scope" match="compound[@kind='class' or @kind='struct' or @kind='union']"
use="class"/>
<xsl:template match="/">
<book title="{$book_title}" name="{$book_name}" base="{$book_base}"
link="index.html" version="2" language="c++">
<chapters>
<xsl:variable name="modules" select="tagfile/compound[@kind='group']"/>
<xsl:if test="$modules">
<sub name="Modules" link="modules.html">
<!-- Select the top-level group compounds -->
<xsl:apply-templates select="$modules[not(key('nested-group', name))]"
mode="module-list">
<xsl:sort lang="en" select="title"/>
</xsl:apply-templates>
</sub>
</xsl:if>
<xsl:variable name="namespaces" select="tagfile/compound[@kind='namespace']"/>
<xsl:if test="$namespaces">
<sub name="Namespaces" link="namespaces.html">
<!-- Generate a flat list of fully qualified namespaces -->
<xsl:for-each select="$namespaces">
<xsl:sort lang="en" case-order="upper-first" select="name"/>
<sub name="{name}" link="{filename}"/>
</xsl:for-each>
</sub>
</xsl:if>
<xsl:if test="tagfile/compound[@kind='class' or @kind='struct' or @kind='union']">
<sub name="Classes" link="classes.html">
<!-- Select the top-level C++ compounds -->
<xsl:apply-templates select="tagfile/compound[not(key('nested-scope', name))]"
mode="class-list">
<xsl:sort lang="en" case-order="upper-first" select="name"/>
</xsl:apply-templates>
</sub>
</xsl:if>
</chapters>
<functions>
<xsl:apply-templates select="tagfile/compound" mode="keyword-list"/>
</functions>
</book>
</xsl:template>
<xsl:template match="compound" mode="module-list">
<xsl:variable name="children" select="subgroup"/>
<sub name="{title}" link="{filename}">
<!-- Select any subgroup compounds by name -->
<xsl:apply-templates select="../compound[@kind='group' and name=$children]"
mode="module-list">
<xsl:sort lang="en" select="title"/>
</xsl:apply-templates>
</sub>
</xsl:template>
<xsl:template match="compound[@kind='namespace' or @kind='class' or @kind='struct' or @kind='union']"
mode="class-list">
<!-- The scope prefix to strip from the name -->
<xsl:param name="scope"/>
<xsl:variable name="fullname" select="name"/>
<xsl:variable name="children" select="namespace|class"/>
<sub name="{substring-after($fullname, $scope)}" link="{filename}">
<!-- Select any nested C++ compounds by name -->
<xsl:apply-templates select="../compound[name=$children]" mode="class-list">
<xsl:sort lang="en" case-order="upper-first" select="name"/>
<xsl:with-param name="scope" select="concat($fullname, '::')"/>
</xsl:apply-templates>
</sub>
</xsl:template>
<!-- Ignore any other kind of compound -->
<xsl:template match="*" mode="class-list"/>
<xsl:template match="compound[@kind='namespace']" mode="keyword-list">
<!-- Process members, but do not list the namespace itself as a keyword -->
<xsl:apply-templates select="member" mode="keyword-list"/>
</xsl:template>
<xsl:template match="compound[@kind='class' or @kind='struct' or @kind='union']"
mode="keyword-list">
<!-- List the compound type itself as a keyword and process its members -->
<keyword type="struct" name="{name}" link="{filename}"/>
<xsl:apply-templates select="member" mode="keyword-list"/>
</xsl:template>
<!-- Match leaf compound members -->
<xsl:template match="member[@kind='typedef']" mode="keyword-list">
<keyword type="typedef" xsl:use-attribute-sets="keyword-member"/>
</xsl:template>
<xsl:template match="member[@kind='function' or @kind='friend']" mode="keyword-list">
<keyword type="function" xsl:use-attribute-sets="keyword-member"/>
</xsl:template>
<xsl:template match="member[@kind='enumeration']" mode="keyword-list">
<keyword type="enum" xsl:use-attribute-sets="keyword-member"/>
</xsl:template>
<xsl:template match="member[@kind='enumvalue' or @kind='define']" mode="keyword-list">
<keyword type="macro" xsl:use-attribute-sets="keyword-member"/>
</xsl:template>
<!-- Ignore unknown keyword types -->
<xsl:template match="*" mode="keyword-list"/>
<!-- Qualify member name and link anchor -->
<xsl:attribute-set name="keyword-member">
<xsl:attribute name="name">
<xsl:value-of select="concat(../name, '::', name)"/>
</xsl:attribute>
<xsl:attribute name="link">
<xsl:value-of select="concat(anchorfile, '#', anchor)"/>
</xsl:attribute>
</xsl:attribute-set>
</xsl:stylesheet>
|