VirtualBox

source: vbox/trunk/doc/manual/docbook-refentry-to-C-help.xsl@ 77177

Last change on this file since 77177 was 77177, checked in by vboxsync, 6 years ago

docbook-refentry-to-C-help.xsl: Skip the extra <> around arguments within a group. Check that args and group has the same choice value.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
  • Property svn:mergeinfo set to (toggle deleted branches)
    /branches/VBox-3.0/doc/manual/docbook-refentry-to-manual-overview.xsl58652,​70973
    /branches/VBox-3.2/doc/manual/docbook-refentry-to-manual-overview.xsl66309,​66318
    /branches/VBox-4.0/doc/manual/docbook-refentry-to-manual-overview.xsl70873
    /branches/VBox-4.1/doc/manual/docbook-refentry-to-manual-overview.xsl74233,​78414,​78691,​82579,​85941,​85944-85947,​85949-85950,​85953,​86701,​86728,​87009
    /branches/VBox-4.2/doc/manual/docbook-refentry-to-manual-overview.xsl82653,​86229-86230,​86234,​86529,​91503-91504,​91506-91508,​91510,​91514-91515,​91521
    /branches/VBox-4.3/doc/manual/docbook-refentry-to-manual-overview.xsl91223,​94066,​94839,​94897,​95154,​95164,​95167,​95295,​95338,​95353-95354,​95356,​95367,​95451,​95475,​95477,​95480,​95507,​95640,​95659,​95661,​95663,​98913-98915,​99358
    /branches/VBox-4.3/trunk/doc/manual/docbook-refentry-to-manual-overview.xsl91223
    /branches/andy/draganddrop/doc/manual/docbook-refentry-to-manual-overview.xsl90781-91268
    /branches/andy/guestctrl20/doc/manual/docbook-refentry-to-manual-overview.xsl78916,​78930
    /branches/andy/pdmaudio/doc/manual/docbook-refentry-to-manual-overview.xsl94582,​94641,​94654,​94688,​94778,​94783,​94816,​95197,​95215-95216,​95250,​95279,​95505-95506,​95543,​95694,​96323,​96470-96471,​96582,​96587,​96802-96803,​96817,​96904,​96967,​96999,​97020-97021,​97025,​97050,​97099
    /branches/bird/hardenedwindows/doc/manual/docbook-refentry-to-manual-overview.xsl92692-94610
    /branches/dsen/gui/doc/manual/docbook-refentry-to-manual-overview.xsl79076-79078,​79089,​79109-79110,​79112-79113,​79127-79130,​79134,​79141,​79151,​79155,​79157-79159,​79193,​79197
    /branches/dsen/gui2/doc/manual/docbook-refentry-to-manual-overview.xsl79224,​79228,​79233,​79235,​79258,​79262-79263,​79273,​79341,​79345,​79354,​79357,​79387-79388,​79559-79569,​79572-79573,​79578,​79581-79582,​79590-79591,​79598-79599,​79602-79603,​79605-79606,​79632,​79635,​79637,​79644
    /branches/dsen/gui3/doc/manual/docbook-refentry-to-manual-overview.xsl79645-79692
    /trunk/src/doc/manual/docbook-refentry-to-manual-overview.xsl92342
File size: 36.0 KB
Line 
1<?xml version="1.0"?>
2<!--
3 docbook-refentry-to-manual-sect1.xsl:
4 XSLT stylesheet for nicking the refsynopsisdiv bit of a
5 refentry (manpage) for use in the command overview section
6 in the user manual.
7
8 Copyright (C) 2006-2015 Oracle Corporation
9
10 This file is part of VirtualBox Open Source Edition (OSE), as
11 available from http://www.virtualbox.org. This file is free software;
12 you can redistribute it and/or modify it under the terms of the GNU
13 General Public License (GPL) as published by the Free Software
14 Foundation, in version 2 as it comes in the "COPYING" file of the
15 VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17-->
18
19<xsl:stylesheet
20 version="1.0"
21 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
22 xmlns:str="http://xsltsl.org/string"
23 >
24
25 <xsl:import href="string.xsl"/>
26 <xsl:import href="common-formatcfg.xsl"/>
27
28 <xsl:output method="text" version="1.0" encoding="utf-8" indent="yes"/>
29 <xsl:strip-space elements="*"/>
30
31 <xsl:param name="g_fDebugText" select="0"/>
32
33 <xsl:variable name="g_sUnderlineRefSect1">
34 <xsl:text>===================================================================================================================</xsl:text>
35 </xsl:variable>
36 <xsl:variable name="g_sUnderlineRefSect2">
37 <xsl:text>-------------------------------------------------------------------------------------------------------------------</xsl:text>
38 </xsl:variable>
39
40
41 <!-- Default action, do nothing. -->
42 <xsl:template match="node()|@*"/>
43
44 <!--
45 main() - because we need to order the output in a specific manner
46 that is contrary to the data flow in the refentry, this is
47 going to look a bit more like a C program than a stylesheet.
48 -->
49 <xsl:template match="refentry">
50 <!-- Assert refetry expectations. -->
51 <xsl:if test="not(./refsynopsisdiv)">
52 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>refentry must have a refsynopsisdiv</xsl:message>
53 </xsl:if>
54 <xsl:if test="not(./refentryinfo/title)">
55 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>refentry must have a refentryinfo with title</xsl:message>
56 </xsl:if>
57 <xsl:if test="not(./refmeta/refentrytitle)">
58 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>refentry must have a refentryinfo with title</xsl:message>
59 </xsl:if>
60 <xsl:if test="./refmeta/refentrytitle != ./refnamediv/refname">
61 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>The refmeta/refentrytitle and the refnamediv/refname must be identical</xsl:message>
62 </xsl:if>
63 <xsl:if test="not(./refsect1/title)">
64 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>refentry must have a refsect1 with title</xsl:message>
65 </xsl:if>
66 <xsl:if test="not(@id) or @id = ''">
67 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>refentry must have an id attribute</xsl:message>
68 </xsl:if>
69
70 <!-- variables -->
71 <xsl:variable name="sBaseId" select="@id"/>
72 <xsl:variable name="sDataBaseSym" select="concat('g_', translate(@id, '-', '_'))"/>
73
74
75 <!--
76 Convert the refsynopsisdiv into REFENTRY::Synopsis data.
77 -->
78 <xsl:text>
79
80static const RTMSGREFENTRYSTR </xsl:text><xsl:value-of select="$sDataBaseSym"/><xsl:text>_synopsis[] =
81{</xsl:text>
82 <xsl:for-each select="./refsynopsisdiv/cmdsynopsis">
83 <!-- Assert synopsis expectations -->
84 <xsl:if test="not(@id) or substring-before(@id, '-') != 'synopsis'">
85 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>The refsynopsisdiv/cmdsynopsis elements must have an id starting with 'synopsis-'.</xsl:message>
86 </xsl:if>
87 <xsl:if test="not(starts-with(substring-after(@id, '-'), $sBaseId))">
88 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>The refsynopsisdiv/cmdsynopsis elements @id is expected to include the refentry @id.</xsl:message>
89 </xsl:if>
90 <xsl:if test="not(../../refsect1/refsect2[@id=./@id])">
91 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>No refsect2 with id="<xsl:value-of select="@id"/>" found.</xsl:message>
92 </xsl:if>
93
94 <!-- Do the work. -->
95 <xsl:apply-templates select="."/>
96
97 </xsl:for-each>
98 <xsl:text>
99};</xsl:text>
100
101
102 <!--
103 Convert the whole manpage to help text.
104 -->
105 <xsl:text>
106static const RTMSGREFENTRYSTR </xsl:text><xsl:value-of select="$sDataBaseSym"/><xsl:text>_full_help[] =
107{</xsl:text>
108 <!-- We start by combining the refentry title and the refpurpose into a short description. -->
109 <xsl:text>
110 { </xsl:text><xsl:call-template name="calc-scope-for-refentry"/><xsl:text>,
111 "</xsl:text>
112 <xsl:apply-templates select="./refentryinfo/title/node()"/>
113 <xsl:text> -- </xsl:text>
114 <xsl:call-template name="capitalize">
115 <xsl:with-param name="text">
116 <xsl:apply-templates select="./refnamediv/refpurpose/node()"/>
117 </xsl:with-param>
118 </xsl:call-template>
119 <xsl:text>." },
120 { RTMSGREFENTRYSTR_SCOPE_SAME, "" },</xsl:text>
121
122 <!-- The follows the usage (synopsis) section. -->
123 <xsl:text>
124 { RTMSGREFENTRYSTR_SCOPE_GLOBAL,
125 "Usage" },
126 { RTMSGREFENTRYSTR_SCOPE_SAME,
127 "=====" },</xsl:text>
128 <xsl:apply-templates select="./refsynopsisdiv/node()"/>
129
130 <!-- Then comes the description and other refsect1 -->
131 <xsl:for-each select="./refsect1">
132 <xsl:if test="name(*[1]) != 'title'"><xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Expected title as the first element in refsect1.</xsl:message></xsl:if>
133 <xsl:if test="text()"><xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>No text supported in refsect1.</xsl:message></xsl:if>
134 <xsl:if test="not(./remark[@role='help-skip'])">
135 <xsl:variable name="sTitle">
136 <xsl:apply-templates select="./title/node()"/>
137 </xsl:variable>
138 <xsl:text>
139 { </xsl:text><xsl:call-template name="calc-scope-refsect1"/><xsl:text>, "" },
140 { RTMSGREFENTRYSTR_SCOPE_SAME,
141 "</xsl:text><xsl:value-of select="$sTitle"/><xsl:text>" },
142 { RTMSGREFENTRYSTR_SCOPE_SAME,
143 "</xsl:text>
144 <xsl:value-of select="substring($g_sUnderlineRefSect1, 1, string-length($sTitle))"/>
145 <xsl:text>" },</xsl:text>
146
147 <xsl:apply-templates select="./*[name() != 'title']"/>
148
149 <xsl:text>
150 { RTMSGREFENTRYSTR_SCOPE_SAME, "" },</xsl:text>
151 </xsl:if>
152 </xsl:for-each>
153
154 <xsl:text>
155};</xsl:text>
156
157 <!--
158 Generate the refentry structure.
159 -->
160 <xsl:text>
161static const RTMSGREFENTRY </xsl:text><xsl:value-of select="$sDataBaseSym"/><xsl:text> =
162{
163 /* .idInternal = */ HELP_CMD_</xsl:text>
164 <xsl:choose>
165 <xsl:when test="contains(@id, '-')">
166 <xsl:call-template name="str:to-upper"> <!-- Multi level command. -->
167 <xsl:with-param name="text" select="translate(substring-after(@id, '-'), '-', '_')"/>
168 </xsl:call-template>
169 </xsl:when>
170 <xsl:otherwise>
171 <xsl:call-template name="str:to-upper"> <!-- Simple command. -->
172 <xsl:with-param name="text" select="@id"/>
173 </xsl:call-template>
174 </xsl:otherwise>
175 </xsl:choose>
176 <xsl:text>,
177 /* .Synopsis = */ { RT_ELEMENTS(</xsl:text>
178 <xsl:value-of select="$sDataBaseSym"/><xsl:text>_synopsis), 0, </xsl:text>
179 <xsl:value-of select="$sDataBaseSym"/><xsl:text>_synopsis },
180 /* .Help = */ { RT_ELEMENTS(</xsl:text>
181 <xsl:value-of select="$sDataBaseSym"/><xsl:text>_full_help), 0, </xsl:text>
182 <xsl:value-of select="$sDataBaseSym"/><xsl:text>_full_help },
183 /* pszBrief = */ "</xsl:text>
184 <xsl:apply-templates select="./refnamediv/refpurpose/node()"/>
185 <!-- TODO: Add the command name too. -->
186 <xsl:text>"
187};
188</xsl:text>
189 </xsl:template>
190
191
192 <!--
193 Convert command synopsis to text.
194 -->
195 <xsl:template match="cmdsynopsis">
196 <xsl:if test="text()"><xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>cmdsynopsis with text is not supported.</xsl:message></xsl:if>
197 <xsl:if test="position() = 1">
198 <xsl:text>
199 { </xsl:text><xsl:call-template name="calc-scope-cmdsynopsis"/><xsl:text> | RTMSGREFENTRYSTR_FLAGS_SYNOPSIS, "" }, </xsl:text>
200 </xsl:if>
201 <xsl:text>
202 { </xsl:text><xsl:call-template name="calc-scope-cmdsynopsis"/><xsl:text> | RTMSGREFENTRYSTR_FLAGS_SYNOPSIS,
203 "</xsl:text><xsl:call-template name="emit-indentation"/><xsl:apply-templates select="*|@*"/><xsl:text>" },</xsl:text>
204 </xsl:template>
205
206 <xsl:template match="sbr">
207 <xsl:text>" },
208 { RTMSGREFENTRYSTR_SCOPE_SAME | RTMSGREFENTRYSTR_FLAGS_SYNOPSIS,
209 " </xsl:text><xsl:call-template name="emit-indentation"/> <!-- hardcoded in VBoxManageHelp.cpp too -->
210 </xsl:template>
211
212 <xsl:template match="cmdsynopsis/command">
213 <xsl:text>" },
214 { RTMSGREFENTRYSTR_SCOPE_SAME | RTMSGREFENTRYSTR_FLAGS_SYNOPSIS,
215 "</xsl:text><xsl:call-template name="emit-indentation"/>
216 <xsl:apply-templates select="node()|@*"/>
217 </xsl:template>
218
219 <xsl:template match="cmdsynopsis/command[1]" priority="2">
220 <xsl:apply-templates select="node()|@*"/>
221 </xsl:template>
222
223 <xsl:template match="command|option|computeroutput">
224 <xsl:apply-templates select="node()|@*"/>
225 </xsl:template>
226
227 <xsl:template match="replaceable">
228 <xsl:choose>
229 <xsl:when test="ancestor::arg">
230 <xsl:apply-templates />
231 </xsl:when>
232 <xsl:otherwise>
233 <xsl:text>&lt;</xsl:text>
234 <xsl:apply-templates />
235 <xsl:text>&gt;</xsl:text>
236 </xsl:otherwise>
237 </xsl:choose>
238 </xsl:template>
239
240 <!-- duplicated in docbook2latex.xsl -->
241 <xsl:template match="arg|group">
242 <!-- separator char if we're not the first child -->
243 <xsl:if test="position() > 1">
244 <xsl:choose>
245 <xsl:when test="parent::group"><xsl:value-of select="$arg.or.sep"/></xsl:when>
246 <xsl:when test="ancestor-or-self::*/@sepchar"><xsl:value-of select="ancestor-or-self::*/@sepchar"/></xsl:when>
247 <xsl:otherwise><xsl:text> </xsl:text></xsl:otherwise>
248 </xsl:choose>
249 </xsl:if>
250
251 <!-- Make sure group choice and arg choice matches. -->
252 <xsl:if test="self::arg and ancestor::group">
253 <xsl:if test="@choice != ancestor::group/@choice">
254 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Mismatching group and arg choice: "<xsl:value-of select="@choice"/>" (arg) vs "<xsl:value-of select="ancestor::group/@choice"/>" (group)</xsl:message>
255 </xsl:if>
256 </xsl:if>
257
258 <!-- open wrapping -->
259 <xsl:variable name="fWrappers" select="not(ancestor::group)"/>
260 <xsl:if test="$fWrappers">
261 <xsl:choose>
262 <xsl:when test="not(@choice) or @choice = ''"> <xsl:value-of select="$arg.choice.def.open.str"/></xsl:when>
263 <xsl:when test="@choice = 'opt'"> <xsl:value-of select="$arg.choice.opt.open.str"/></xsl:when>
264 <xsl:when test="@choice = 'req'"> <xsl:value-of select="$arg.choice.req.open.str"/></xsl:when>
265 <xsl:when test="@choice = 'plain'"/>
266 <xsl:otherwise><xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Invalid arg choice: "<xsl:value-of select="@choice"/>"</xsl:message></xsl:otherwise>
267 </xsl:choose>
268 </xsl:if>
269
270 <!-- render the arg (TODO: may need to do more work here) -->
271 <xsl:apply-templates />
272
273 <!-- repeat wrapping -->
274 <xsl:choose>
275 <xsl:when test="@rep = 'norepeat' or not(@rep) or @rep = ''"/>
276 <xsl:when test="@rep = 'repeat'"> <xsl:value-of select="$arg.rep.repeat.str"/></xsl:when>
277 <xsl:otherwise><xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Invalid rep choice: "<xsl:value-of select="@rep"/>"</xsl:message></xsl:otherwise>
278 </xsl:choose>
279
280 <!-- close wrapping -->
281 <xsl:if test="$fWrappers">
282 <xsl:choose>
283 <xsl:when test="not(@choice) or @choice = ''"> <xsl:value-of select="$arg.choice.def.close.str"/></xsl:when>
284 <xsl:when test="@choice = 'opt'"> <xsl:value-of select="$arg.choice.opt.close.str"/></xsl:when>
285 <xsl:when test="@choice = 'req'"> <xsl:value-of select="$arg.choice.req.close.str"/></xsl:when>
286 </xsl:choose>
287 </xsl:if>
288 </xsl:template>
289
290
291 <!--
292 refsect2
293 -->
294 <xsl:template match="refsect2">
295 <!-- assertions -->
296 <xsl:if test="text()"><xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>refsect2 shouldn't contain text</xsl:message></xsl:if>
297 <xsl:if test="count(./title) != 1"><xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>refsect2 requires a title (<xsl:value-of select="ancestor-or-self::*[@id][1]/@id"/>)</xsl:message></xsl:if>
298
299 <!-- title / command synopsis - sets the scope. -->
300 <xsl:variable name="sTitle">
301 <xsl:apply-templates select="./title/text()"/>
302 </xsl:variable>
303 <xsl:text>
304 { </xsl:text><xsl:call-template name="calc-scope-refsect2"/><xsl:text>, "" },
305 { RTMSGREFENTRYSTR_SCOPE_SAME,
306 "</xsl:text><xsl:call-template name="emit-indentation"/>
307 <xsl:value-of select="$sTitle"/>
308 <xsl:text>" },
309 { RTMSGREFENTRYSTR_SCOPE_SAME,
310 "</xsl:text><xsl:call-template name="emit-indentation"/>
311 <xsl:value-of select="substring($g_sUnderlineRefSect2, 1, string-length($sTitle))"/>
312 <xsl:text>" },</xsl:text>
313
314<!-- <xsl:if test="./*[name() != 'title']/following::
315 { RTMSGREFENTRYSTR_SCOPE_SAME, "y" },</xsl:text> cmdsynopsis -->
316
317 <!-- Format the text in the section -->
318 <xsl:for-each select="./*[name() != 'title']">
319 <xsl:apply-templates select="."/>
320 </xsl:for-each>
321
322 <!-- Add two blank lines, unless we're the last element in this refsect1. -->
323 <xsl:if test="position() != last()">
324 <xsl:text>
325 { RTMSGREFENTRYSTR_SCOPE_SAME, "" },</xsl:text>
326 </xsl:if>
327 </xsl:template>
328
329
330 <!--
331 para
332 -->
333 <xsl:template match="para">
334 <xsl:if test="position() != 1 or not(parent::listitem)">
335 <xsl:text>
336 { RTMSGREFENTRYSTR_SCOPE_SAME, "" },</xsl:text>
337 </xsl:if>
338 <xsl:call-template name="process-mixed"/>
339 </xsl:template>
340
341
342 <!--
343 variablelist
344 -->
345 <xsl:template match="variablelist">
346 <xsl:if test="*[not(self::varlistentry)]|text()">
347 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Only varlistentry elements are supported in variablelist </xsl:message>
348 </xsl:if>
349 <xsl:for-each select="./varlistentry">
350 <xsl:if test="not(term) or not(listitem) or count(listitem) > 1">
351 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Expected one or more term members and exactly one listentry member in varlistentry element.</xsl:message>
352 </xsl:if>
353 <xsl:if test="(not(@spacing) or @spacing != 'compact') and (position() > 1 or (count(../preceding-sibling::*) - count(../preceding-sibling::title) > 0))">
354 <xsl:text>
355 { RTMSGREFENTRYSTR_SCOPE_SAME, "" },</xsl:text>
356 </xsl:if>
357 <xsl:apply-templates select="*"/>
358 </xsl:for-each>
359 </xsl:template>
360
361 <xsl:template match="varlistentry/term">
362 <xsl:call-template name="process-mixed"/>
363 </xsl:template>
364
365 <xsl:template match="varlistentry/listitem">
366 <xsl:call-template name="check-children">
367 <xsl:with-param name="UnsupportedNodes" select="*[not(self::para or self::itemizedlist or self::orderedlist)]|text()"/>
368 <xsl:with-param name="SupportedNames">para, itemizedlist and orderedlist</xsl:with-param>
369 </xsl:call-template>
370
371 <xsl:apply-templates select="*"/>
372 </xsl:template>
373
374
375 <!--
376 itemizedlist and orderedlist
377 -->
378 <xsl:template match="itemizedlist|orderedlist">
379 <xsl:if test="*[not(self::listitem)]|text()">
380 <xsl:message terminate="yes">
381 <xsl:call-template name="error-prefix"/>Only listitem elements are supported in <xsl:value-of select="name()"/>:
382 <xsl:call-template name="list-nodes">
383 <xsl:with-param name="Nodes" select="*[not(self::listitem)]|text()"/>
384 </xsl:call-template>
385 </xsl:message>
386 </xsl:if>
387 <xsl:if test="parent::para">
388 <xsl:message terminate="yes"><xsl:value-of select="name()"/> inside a para is current not supported. <!-- no newline
389 -->Close the para before the list, it makes no difference to html and latex/pdf output.</xsl:message>
390 </xsl:if>
391 <xsl:if test="position() != 1 and (not(@spacing) or @spacing != 'compact')">
392 <xsl:text>
393 { RTMSGREFENTRYSTR_SCOPE_SAME, "" },</xsl:text>
394 </xsl:if>
395 <xsl:for-each select="./listitem">
396 <xsl:apply-templates select="*"/>
397 </xsl:for-each>
398 </xsl:template>
399
400 <xsl:template match="itemizedlist/listitem|orderedlist/listitem">
401 <xsl:if test="*[not(self::para)]|text()">
402 <xsl:message terminate="yes">
403 <xsl:call-template name="error-prefix"/>Expected <xsl:value-of select="name()"/>/listitem to only contain para elements:
404 <xsl:call-template name="list-nodes">
405 <xsl:with-param name="Nodes" select="*[not(self::para)]|text()"/>
406 </xsl:call-template>
407 </xsl:message>
408 </xsl:if>
409
410 <xsl:if test="position() != 1 and @spaceing != 'compact'">
411 <xsl:text>
412 { RTMSGREFENTRYSTR_SCOPE_SAME, "" },</xsl:text>
413 </xsl:if>
414 <xsl:apply-templates select="*"/>
415 </xsl:template>
416
417
418 <!--
419 Screen
420 -->
421 <xsl:template match="screen">
422 <xsl:if test="ancestor::para">
423 <xsl:text>" },</xsl:text>
424 </xsl:if>
425
426 <xsl:text>
427 { RTMSGREFENTRYSTR_SCOPE_SAME,
428 "</xsl:text>
429
430 <xsl:for-each select="node()">
431 <xsl:choose>
432 <xsl:when test="name() = ''">
433 <xsl:call-template name="screen_text_line">
434 <xsl:with-param name="sText" select="."/>
435 </xsl:call-template>
436 </xsl:when>
437 <xsl:otherwise>
438 <xsl:if test="*">
439 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Support for elements under screen has not been implemented: <xsl:value-of select="name()"/></xsl:message>
440 </xsl:if>
441 </xsl:otherwise>
442 </xsl:choose>
443 </xsl:for-each>
444
445 <xsl:if test="not(ancestor::para)">
446 <xsl:text>" },</xsl:text>
447 </xsl:if>
448 </xsl:template>
449
450 <xsl:template name="screen_text_line">
451 <xsl:param name="sText"/>
452 <xsl:call-template name="escape_fixed_text">
453 <xsl:with-param name="sText" select="substring-before($sText,'&#x0a;')"/>
454 </xsl:call-template>
455
456 <xsl:if test="substring-after($sText,'&#x0a;')">
457 <xsl:text>" },
458 { RTMSGREFENTRYSTR_SCOPE_SAME,
459 "</xsl:text>
460 <xsl:call-template name="screen_text_line">
461 <xsl:with-param name="sText" select="substring-after($sText,'&#x0a;')"/>
462 </xsl:call-template>
463 </xsl:if>
464 </xsl:template>
465
466
467 <!--
468 Text escaping for C.
469 -->
470 <xsl:template match="text()" name="escape_text">
471 <!-- Leading whitespace hack! -->
472 <xsl:if test="substring(.,1,1) = ' ' and position() != 1">
473 <xsl:text> </xsl:text>
474 <xsl:if test="boolean($g_fDebugText)">
475 <xsl:message>text: add space</xsl:message>
476 </xsl:if>
477 </xsl:if>
478
479 <!-- Body of text -->
480 <xsl:choose>
481
482 <xsl:when test="contains(., '\') or contains(., '&quot;')">
483 <xsl:variable name="sTmp">
484 <xsl:call-template name="str:subst">
485 <xsl:with-param name="text" select="normalize-space(.)"/>
486 <xsl:with-param name="replace" select="'\'"/>
487 <xsl:with-param name="with" select="'\\'"/>
488 <xsl:with-param name="disable-output-escaping" select="yes"/>
489 </xsl:call-template>
490 </xsl:variable>
491 <xsl:variable name="sTmp2">
492 <xsl:call-template name="str:subst">
493 <xsl:with-param name="text" select="$sTmp"/>
494 <xsl:with-param name="replace" select="'&quot;'"/>
495 <xsl:with-param name="with" select="'\&quot;'"/>
496 <xsl:with-param name="disable-output-escaping" select="yes"/>
497 </xsl:call-template>
498 </xsl:variable>
499 <xsl:value-of select="$sTmp2"/>
500 <xsl:if test="boolean($g_fDebugText)">
501 <xsl:message>text: |<xsl:value-of select="$sTmp2"/>|</xsl:message>
502 </xsl:if>
503 </xsl:when>
504
505 <xsl:otherwise>
506 <xsl:value-of select="normalize-space(.)"/>
507 <xsl:if test="boolean($g_fDebugText)">
508 <xsl:message>text: |<xsl:value-of select="normalize-space(.)"/>|</xsl:message>
509 </xsl:if>
510 </xsl:otherwise>
511 </xsl:choose>
512
513 <!-- Trailing whitespace hack! -->
514 <xsl:if test="substring(.,string-length(.)) = ' ' and position() != last() and string-length(.) != 1">
515 <xsl:text> </xsl:text>
516 <xsl:if test="boolean($g_fDebugText)">
517 <xsl:message>text: add space</xsl:message>
518 </xsl:if>
519 </xsl:if>
520
521 </xsl:template>
522
523 <!-- Elements producing non-breaking strings (single line). -->
524 <xsl:template match="command/text()|option/text()|computeroutput/text()|arg/text()" name="escape_fixed_text">
525 <xsl:param name="sText" select="normalize-space(.)"/>
526 <xsl:choose>
527
528 <xsl:when test="contains($sText, '\') or contains($sText, '&quot;')">
529 <xsl:variable name="sTmp1">
530 <xsl:call-template name="str:subst">
531 <xsl:with-param name="text" select="$sText"/>
532 <xsl:with-param name="replace" select="'\'"/>
533 <xsl:with-param name="with" select="'\\'"/>
534 <xsl:with-param name="disable-output-escaping" select="yes"/>
535 </xsl:call-template>
536 </xsl:variable>
537 <xsl:variable name="sTmp2">
538 <xsl:call-template name="str:subst">
539 <xsl:with-param name="text" select="$sTmp1"/>
540 <xsl:with-param name="replace" select="'&quot;'"/>
541 <xsl:with-param name="with" select="'\&quot;'"/>
542 <xsl:with-param name="disable-output-escaping" select="yes"/>
543 </xsl:call-template>
544 </xsl:variable>
545 <xsl:variable name="sTmp3">
546 <xsl:call-template name="str:subst">
547 <xsl:with-param name="text" select="$sTmp2"/>
548 <xsl:with-param name="replace" select="' '"/>
549 <xsl:with-param name="with" select="'\b'"/>
550 <xsl:with-param name="disable-output-escaping" select="yes"/>
551 </xsl:call-template>
552 </xsl:variable>
553 <xsl:value-of select="$sTmp3"/>
554 <xsl:if test="boolean($g_fDebugText)">
555 <xsl:message>text! |<xsl:value-of select="$sTmp3"/>|</xsl:message>
556 </xsl:if>
557 </xsl:when>
558
559 <xsl:when test="contains($sText, ' ')">
560 <xsl:variable name="sTmp">
561 <xsl:call-template name="str:subst">
562 <xsl:with-param name="text" select="$sText"/>
563 <xsl:with-param name="replace" select="' '"/>
564 <xsl:with-param name="with" select="'\b'"/>
565 <xsl:with-param name="disable-output-escaping" select="yes"/>
566 </xsl:call-template>
567 </xsl:variable>
568 <xsl:value-of select="$sTmp"/>
569 <xsl:if test="boolean($g_fDebugText)">
570 <xsl:message>text! |<xsl:value-of select="$sTmp"/>|</xsl:message>
571 </xsl:if>
572 </xsl:when>
573
574 <xsl:otherwise>
575 <xsl:value-of select="$sText"/>
576 <xsl:if test="boolean($g_fDebugText)">
577 <xsl:message>text! |<xsl:value-of select="$sText"/>|</xsl:message>
578 </xsl:if>
579 </xsl:otherwise>
580 </xsl:choose>
581 </xsl:template>
582
583
584 <!--
585 Unsupported elements and elements handled directly.
586 -->
587 <xsl:template match="synopfragment|synopfragmentref|title|refsect1">
588 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>The <xsl:value-of select="name()"/> element is not supported</xsl:message>
589 </xsl:template>
590
591 <!--
592 Fail on misplaced scoping remarks.
593 -->
594 <xsl:template match="remark[@role = 'help-scope']">
595 <xsl:choose>
596 <xsl:when test="parent::refsect1"/>
597 <xsl:when test="parent::refsect2"/>
598 <xsl:when test="parent::cmdsynopsis and ancestor::refsynopsisdiv"/>
599 <xsl:otherwise>
600 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Misplaced remark/@role=help-scope element.
601Only supported on: refsect1, refsect2, refsynopsisdiv/cmdsynopsis</xsl:message>
602 </xsl:otherwise>
603 </xsl:choose>
604 </xsl:template>
605
606 <!--
607 Execute synopsis copy remark (avoids duplication for complicated xml).
608 -->
609 <xsl:template match="remark[@role = 'help-copy-synopsis']">
610 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>remark/@role=help-copy-synopsis is not supported by this stylesheet. Must preprocess input!</xsl:message>
611 </xsl:template>
612
613 <!--
614 Warn about unhandled elements
615 -->
616 <xsl:template match="*">
617 <xsl:message terminate="no">Warning: Unhandled element: <!-- no newline -->
618 <xsl:for-each select="ancestor-or-self::*">
619 <xsl:text>/</xsl:text>
620 <xsl:value-of select="name(.)"/>
621 <xsl:if test="@id">
622 <xsl:value-of select="concat('[id=', @id ,']')"/>
623 </xsl:if>
624 </xsl:for-each>
625 </xsl:message>
626 </xsl:template>
627
628
629 <!--
630 Functions
631 Functions
632 Functions
633 -->
634
635 <!--
636 Processes mixed children, i.e. both text and regular elements.
637 Normalizes whitespace. -->
638 <xsl:template name="process-mixed">
639 <xsl:text>
640 { RTMSGREFENTRYSTR_SCOPE_SAME,
641 "</xsl:text><xsl:call-template name="emit-indentation"/>
642
643 <xsl:for-each select="node()[not(self::remark)]">
644 <xsl:choose>
645 <xsl:when test="name() = ''">
646 <xsl:call-template name="escape_text"/>
647 </xsl:when>
648 <xsl:otherwise>
649 <xsl:apply-templates select="."/>
650 </xsl:otherwise>
651 </xsl:choose>
652 </xsl:for-each>
653
654 <xsl:text>" },</xsl:text>
655 </xsl:template>
656
657
658 <!--
659 Element specific scoping.
660 -->
661
662 <xsl:template name="calc-scope-for-refentry">
663 <xsl:text>HELP_SCOPE_</xsl:text>
664 <xsl:choose>
665 <xsl:when test="contains(@id, '-')"> <!-- Multi level command. -->
666 <xsl:call-template name="str:to-upper">
667 <xsl:with-param name="text" select="translate(substring-after(@id, '-'), '-', '_')"/>
668 </xsl:call-template>
669 </xsl:when>
670 <xsl:otherwise> <!-- Single command. -->
671 <xsl:call-template name="str:to-upper">
672 <xsl:with-param name="text" select="@id"/>
673 </xsl:call-template>
674 </xsl:otherwise>
675 </xsl:choose>
676 </xsl:template>
677
678 <!-- Figures out the scope of a refsect1 element. -->
679 <xsl:template name="calc-scope-refsect1">
680 <xsl:choose>
681 <xsl:when test="title[text() = 'Description']">
682 <xsl:text>RTMSGREFENTRYSTR_SCOPE_GLOBAL</xsl:text>
683 </xsl:when>
684 <xsl:when test="@id or remark[@role='help-scope']">
685 <xsl:call-template name="calc-scope-from-remark-or-id"/>
686 </xsl:when>
687 <xsl:otherwise>
688 <xsl:text>RTMSGREFENTRYSTR_SCOPE_GLOBAL</xsl:text>
689 </xsl:otherwise>
690 </xsl:choose>
691 </xsl:template>
692
693 <!-- Figures out the scope of a refsect2 element. -->
694 <xsl:template name="calc-scope-refsect2">
695 <xsl:choose>
696 <xsl:when test="@id or remark[@role='help-scope']">
697 <xsl:call-template name="calc-scope-from-remark-or-id"/>
698 </xsl:when>
699 <xsl:otherwise>
700 <xsl:text>RTMSGREFENTRYSTR_SCOPE_SAME</xsl:text>
701 </xsl:otherwise>
702 </xsl:choose>
703 </xsl:template>
704
705 <!-- Figures out the scope of a refsect1 element. -->
706 <xsl:template name="calc-scope-cmdsynopsis">
707 <xsl:choose>
708 <xsl:when test="ancestor::refsynopsisdiv">
709 <xsl:call-template name="calc-scope-from-remark-or-id">
710 <xsl:with-param name="sId" select="substring-after(@id, '-')"/>
711 </xsl:call-template>
712 </xsl:when>
713 <xsl:otherwise>
714 <xsl:text>RTMSGREFENTRYSTR_SCOPE_SAME</xsl:text>
715 </xsl:otherwise>
716 </xsl:choose>
717 </xsl:template>
718
719
720 <!--
721 Scoping worker functions.
722 -->
723
724 <!-- Calculates the current scope from the scope remark or @id. -->
725 <xsl:template name="calc-scope-from-remark-or-id">
726 <xsl:param name="sId" select="@id"/>
727 <xsl:choose>
728 <xsl:when test="remark[@role='help-scope']">
729 <xsl:call-template name="calc-scope-consts-from-remark"/>
730 </xsl:when>
731 <xsl:when test="$sId != ''">
732 <xsl:call-template name="calc-scope-const-from-id">
733 <xsl:with-param name="sId" select="$sId"/>
734 </xsl:call-template>
735 </xsl:when>
736 <xsl:otherwise>
737 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>expected remark child or id attribute.</xsl:message>
738 </xsl:otherwise>
739 </xsl:choose>
740 </xsl:template>
741
742 <!-- Turns a @id into a scope constant.
743 Some woodoo taking place here here that chops the everything up to and
744 including the first refentry/@id word from all IDs before turning them into
745 constants (word delimiter '-'). -->
746 <xsl:template name="calc-scope-const-from-id">
747 <xsl:param name="sId" select="@id"/>
748 <xsl:param name="sAncestorId" select="ancestor::refentry/@id"/>
749 <xsl:text>HELP_SCOPE_</xsl:text>
750 <xsl:choose>
751 <xsl:when test="not($sAncestorId)"> <!-- Sanity check. -->
752 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>calc-scope-const-from-id is invoked without an refentry ancestor with a id. <xsl:call-template name="get-node-path"/> </xsl:message>
753 </xsl:when>
754
755 <xsl:when test="contains($sAncestorId, '-')"> <!-- Multi level command. -->
756 <xsl:variable name="sPrefix" select="concat(substring-before($sAncestorId, '-'), '-')"/>
757 <xsl:if test="not(contains($sId, $sPrefix))">
758 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Expected sId (<xsl:value-of select="$sId"/>) to contain <xsl:value-of select="$sPrefix"/></xsl:message>
759 </xsl:if>
760 <xsl:call-template name="str:to-upper">
761 <xsl:with-param name="text" select="translate(substring-after($sId, $sPrefix), '-', '_')"/>
762 </xsl:call-template>
763 </xsl:when>
764
765 <xsl:otherwise> <!-- Single command. -->
766 <xsl:call-template name="str:to-upper">
767 <xsl:with-param name="text" select="translate($sId, '-', '_')"/>
768 </xsl:call-template>
769 </xsl:otherwise>
770 </xsl:choose>
771 </xsl:template>
772
773 <!-- Turns a remark into one or more scope constants. -->
774 <xsl:template name="calc-scope-consts-from-remark">
775 <xsl:param name="sCondition" select="remark/@condition"/>
776 <xsl:variable name="sNormalized" select="concat(normalize-space(translate($sCondition, ',;:|', ' ')), ' ')"/>
777 <xsl:if test="$sNormalized = ' ' or $sNormalized = ''">
778 <xsl:message terminate="yes"><xsl:call-template name="error-prefix"/>Empty @condition for help-scope remark.</xsl:message>
779 </xsl:if>
780 <xsl:choose>
781 <xsl:when test="substring-before($sNormalized, ' ') = 'GLOBAL'">
782 <xsl:text>RTMSGREFENTRYSTR_SCOPE_GLOBAL</xsl:text>
783 </xsl:when>
784 <xsl:otherwise>
785 <xsl:text>HELP_SCOPE_</xsl:text><xsl:value-of select="substring-before($sNormalized, ' ')"/>
786 </xsl:otherwise>
787 </xsl:choose>
788 <xsl:call-template name="calc-scope-const-from-remark-worker">
789 <xsl:with-param name="sList" select="substring-after($sNormalized, ' ')"/>
790 </xsl:call-template>
791 </xsl:template>
792
793 <xsl:template name="calc-scope-const-from-remark-worker">
794 <xsl:param name="sList"/>
795 <xsl:if test="$sList != ''">
796 <xsl:choose>
797 <xsl:when test="substring-before($sList, ' ') = 'GLOBAL'">
798 <xsl:text>| RTMSGREFENTRYSTR_SCOPE_GLOBAL</xsl:text>
799 </xsl:when>
800 <xsl:otherwise>
801 <xsl:text> | HELP_SCOPE_</xsl:text><xsl:value-of select="substring-before($sList, ' ')"/>
802 </xsl:otherwise>
803 </xsl:choose>
804 <xsl:call-template name="calc-scope-const-from-remark-worker">
805 <xsl:with-param name="sList" select="substring-after($sList, ' ')"/>
806 </xsl:call-template>
807 </xsl:if>
808 </xsl:template>
809
810
811 <!--
812 Calculates and emits indentation list markup.
813 -->
814 <xsl:template name="emit-indentation">
815 <xsl:variable name="iDepth" select="count(ancestor-or-self::*)"/>
816 <xsl:for-each select="ancestor-or-self::*">
817 <xsl:choose>
818
819 <xsl:when test="self::refsect1
820 | self::refsect2
821 | self::refsect3
822 | self::refsynopsisdiv">
823 <xsl:text> </xsl:text>
824 </xsl:when>
825
826 <xsl:when test="self::term">
827 <!-- currently no indent. -->
828 </xsl:when>
829
830 <!-- Evidence here (especially with orderedlist) that doing list by for-each
831 listitem in the template matching the list type would be easier... -->
832 <xsl:when test="self::listitem and parent::itemizedlist and (position() + 1) = $iDepth">
833 <xsl:text> - </xsl:text>
834 </xsl:when>
835
836 <xsl:when test="self::listitem and parent::orderedlist and (position() + 1) = $iDepth">
837 <xsl:variable name="iNumber" select="count(preceding-sibling::listitem) + 1"/>
838 <xsl:if test="$iNumber &lt;= 9">
839 <xsl:text> </xsl:text>
840 </xsl:if>
841 <xsl:value-of select="$iNumber"/>
842 <xsl:text>. </xsl:text>
843 </xsl:when>
844
845 <xsl:when test="self::listitem">
846 <xsl:text> </xsl:text>
847 </xsl:when>
848
849 </xsl:choose>
850 </xsl:for-each>
851 </xsl:template>
852
853 <!--
854 Captializes the given text.
855 -->
856 <xsl:template name="capitalize">
857 <xsl:param name="text"/>
858 <xsl:call-template name="str:to-upper">
859 <xsl:with-param name="text" select="substring($text,1,1)"/>
860 </xsl:call-template>
861 <xsl:value-of select="substring($text,2)"/>
862 </xsl:template>
863
864
865 <!--
866 Debug/Diagnostics: Return the path to the specified node (by default the current).
867 -->
868 <xsl:template name="get-node-path">
869 <xsl:param name="Node" select="."/>
870 <xsl:for-each select="$Node">
871 <xsl:for-each select="ancestor-or-self::node()">
872 <xsl:choose>
873 <xsl:when test="name(.) = ''">
874 <xsl:text>text()</xsl:text>
875 </xsl:when>
876 <xsl:otherwise>
877 <xsl:value-of select="concat('/', name(.))"/>
878 <xsl:choose>
879 <xsl:when test="@id">
880 <xsl:text>[@id=</xsl:text>
881 <xsl:value-of select="@id"/>
882 <xsl:text>]</xsl:text>
883 </xsl:when>
884 <xsl:when test="position() > 1">
885 <xsl:text>[</xsl:text><xsl:value-of select="position()"/><xsl:text>]</xsl:text>
886 </xsl:when>
887 </xsl:choose>
888 </xsl:otherwise>
889 </xsl:choose>
890 </xsl:for-each>
891 </xsl:for-each>
892 </xsl:template>
893
894 <!--
895 Debug/Diagnostics: Return error message prefix.
896 -->
897 <xsl:template name="error-prefix">
898 <xsl:param name="Node" select="."/>
899 <xsl:text>error: </xsl:text>
900 <xsl:call-template name="get-node-path">
901 <xsl:with-param name="Node" select="$Node"/>
902 </xsl:call-template>
903 <xsl:text>: </xsl:text>
904 </xsl:template>
905
906 <!--
907 Debug/Diagnostics: Print list of nodes (by default all children of current node).
908 -->
909 <xsl:template name="list-nodes">
910 <xsl:param name="Nodes" select="node()"/>
911
912 <for-each select="$Nodes">
913 <xsl:if test="posision() != 1">
914 <xsl:text>, </xsl:text>
915 </xsl:if>
916 <xsl:choose>
917 <xsl:when test="name(.) = ''">
918 <xsl:text>text()</xsl:text>
919 </xsl:when>
920 <xsl:otherwise>
921 <xsl:value-of select="name(.)"/>
922 <xsl:if test="@id">
923 <xsl:text>[@id=</xsl:text>
924 <xsl:value-of select="@id"/>
925 <xsl:text>]</xsl:text>
926 </xsl:if>
927 </xsl:otherwise>
928 </xsl:choose>
929 </for-each>
930
931 </xsl:template>
932
933 <xsl:template name="check-children">
934 <xsl:param name="Node" select="."/>
935 <xsl:param name="UnsupportedNodes" select="*"/>
936 <xsl:param name="SupportedNames" select="'none'"/>
937 <xsl:if test="count($UnsupportedNodes) != 0">
938 <xsl:message terminate="yes">
939 <xsl:call-template name="get-node-path">
940 <xsl:with-param name="Node" select="$Node"/>
941 </xsl:call-template>
942 <!-- -->: error: Only <xsl:value-of select="$SupportedNames"/> are supported as children to <!-- -->
943 <xsl:value-of select="name($Node)"/>
944 <!-- -->Unsupported children: <!-- -->
945 <xsl:call-template name="list-nodes">
946 <xsl:with-param name="Nodes" select="$UnsupportedNodes"/>
947 </xsl:call-template>
948 </xsl:message>
949 </xsl:if>
950 </xsl:template>
951
952</xsl:stylesheet>
953
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette