source: branches/properties/HELP_SOURCE/to_html.xsl

Last change on this file was 18710, checked in by westram, 3 years ago
  • add tiny links to anchor behind section headlines.
    • fix TEST_AUTO_UPDATE (missing include).
    • update expected unittest result.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.3 KB
Line 
1
2<!DOCTYPE xsl:stylesheet [
3          <!ENTITY nbsp "&#160;">
4          <!ENTITY acute "&#180;">
5          <!ENTITY dotwidth "20">
6          <!ENTITY dotheight "16">
7          <!ENTITY br "&#xa;">
8          ]>
9
10
11<!-- used to create ARB help in HTML format -->
12
13<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
14               version="1.0"
15               >
16
17  <!--  <xsl:output method="html" encoding="iso-8859-1" indent="no"/>-->
18  <xsl:output method="html" indent="no"/>
19
20  <xsl:param name="myname"/>
21  <xsl:param name="xml_location"/>
22
23  <!-- includes -->
24
25  <xsl:include href="date.xsl"/>
26
27  <xsl:variable name="rootpath">
28    <xsl:choose>
29      <xsl:when test="string-length(substring-before($myname,'/'))&gt;0">../</xsl:when>
30      <xsl:otherwise></xsl:otherwise>
31    </xsl:choose>
32  </xsl:variable>
33
34  <xsl:variable name="postscriptpath">
35    <xsl:value-of select="$rootpath"/><xsl:text>../help/</xsl:text>
36  </xsl:variable>
37  <xsl:variable name="pdfpath"><xsl:value-of select="$postscriptpath"/></xsl:variable>
38
39  <xsl:variable name="tableBorder">0</xsl:variable>
40
41  <xsl:variable name="author">ARB development</xsl:variable>
42  <xsl:variable name="maildomain">arb-home.de</xsl:variable>
43
44  <xsl:variable name="fontColor">black</xsl:variable>
45  <xsl:variable name="backgroundColor">white</xsl:variable>
46  <xsl:variable name="linkColor">blue</xsl:variable>
47  <xsl:variable name="visitedLinkColor">green</xsl:variable>
48  <xsl:variable name="activeLinkColor">red</xsl:variable>
49  <xsl:variable name="externalLinkColor">#aa0088</xsl:variable>
50
51  <xsl:variable name="linkSectionsColor">#ccccff</xsl:variable>
52
53  <xsl:variable name="lb"><xsl:text>&br;</xsl:text></xsl:variable> <!--used to detect line-breaks in XML-->
54
55  <!-- =============== -->
56  <!--     warning     -->
57  <!-- =============== -->
58
59  <xsl:template name="error">
60    <xsl:param name="text" select="'Unknown error'"/>
61    <xsl:message terminate="yes"><xsl:value-of select="$text"/></xsl:message>
62  </xsl:template>
63
64  <!-- ============ -->
65  <!--    LINKs     -->
66  <!-- ============ -->
67
68  <!--insert-link-->
69  <xsl:template name="insert-link">
70
71    <xsl:param name="address"/>
72    <xsl:param name="linktext"/>
73
74    <xsl:variable name="external">
75      <xsl:choose>
76        <xsl:when test="starts-with(substring-before($address,'.arb-home.de/'),'http://')">0</xsl:when><!--all arb-home-subdomains-->
77        <xsl:when test="starts-with($address,'http://arb-home.de/')">0</xsl:when>
78        <xsl:when test="starts-with($address,'http://')">1</xsl:when>
79        <xsl:otherwise>0</xsl:otherwise>
80      </xsl:choose>
81    </xsl:variable>
82
83    <xsl:choose>
84      <xsl:when test="$external = 1">
85        <!--if we have an external link -> create popup window-->
86        <A href="{$address}" target="_blank"><FONT color="{$externalLinkColor}"><xsl:value-of select="$linktext"/></FONT></A>
87      </xsl:when>
88      <xsl:otherwise>
89        <A href="{$address}"><xsl:value-of select="$linktext"/></A>
90      </xsl:otherwise>
91    </xsl:choose>
92  </xsl:template>
93
94  <!--insert-email-link-->
95  <xsl:template name="insert-email-link">
96    <xsl:param  name="linktext"/>
97    <xsl:param  name="address" select="arb"/>
98    <xsl:param  name="subject"/>
99
100    <xsl:variable name="add">
101      <xsl:choose>
102        <xsl:when test="string-length(substring-before($address,'@'))>0"><xsl:value-of select="$address"/></xsl:when>
103        <xsl:otherwise><xsl:value-of select="$address"/>@<xsl:value-of select="$maildomain"/></xsl:otherwise>
104      </xsl:choose>
105    </xsl:variable>
106    <xsl:variable name="addsubj">
107      <xsl:choose>
108        <xsl:when test="string-length($subject)>0"><xsl:value-of select="$add"/>?subject=<xsl:value-of select="$subject"/></xsl:when>
109        <xsl:otherwise><xsl:value-of select="$add"/></xsl:otherwise>
110      </xsl:choose>
111    </xsl:variable>
112    <A href="mailto:{$addsubj}">
113      <xsl:choose>
114        <xsl:when test="string-length($linktext)>0"><xsl:value-of select="$linktext"/></xsl:when>
115        <xsl:otherwise><xsl:value-of select="$add"/></xsl:otherwise>
116      </xsl:choose>
117    </A>
118  </xsl:template>
119
120
121  <!-- ============================== -->
122  <!--     insert document header     -->
123  <!-- ============================== -->
124  <xsl:template name="header" >
125    <xsl:param name="title" select="'Untitled'"/>
126    <xsl:comment>Generated from XML - XSLT-Stylesheet by Ralf Westram (ralf@arb-home.de) </xsl:comment>
127    <HEAD>
128      <META NAME="Author" CONTENT="{$author}"/>
129      <meta http-equiv="expires" content="86400"/>
130      <TITLE>ARB help: <xsl:value-of select="$title"/></TITLE>
131      <style type="text/css">
132        <xsl:text>
133          div {
134          margin-left:+10pt;
135          padding-top:3pt;
136          padding-bottom:3pt;
137<!--uncomment for layout fixes--><!--border:1px solid #ffdddd;-->}
138          h3 {
139          font-weight:normal;
140          padding:0px;
141          padding-top:3pt;
142          margin:0px;
143<!--border:1px solid #00bbbb;-->}
144<!--h1 { border:1px solid #008800; }--><!--h2 { border:1px solid #0000ff; }--></xsl:text>
145      </style>
146    </HEAD>
147  </xsl:template>
148
149  <!-- ======================== -->
150  <!--     link-to-document     -->
151  <!-- ======================== -->
152  <xsl:template name="link-to-document">
153    <xsl:param name="doc"/>
154    <xsl:param name="type"/>
155    <xsl:param name="missing"/>
156    <xsl:param name="quote"/>
157
158    <xsl:choose>
159      <xsl:when test="$type='ps'">
160        <A href="{concat($postscriptpath,$doc,'.gz')}">
161          <xsl:value-of select="$doc"/> (Postscript)
162        </A>
163      </xsl:when>
164      <xsl:when test="$type='pdf'">
165        <A href="{concat($pdfpath,$doc,'.gz')}">
166          <xsl:value-of select="$doc"/> (PDF)
167        </A>
168      </xsl:when>
169      <xsl:when test="$type='hlp'">
170        <xsl:variable name="docbase">
171          <xsl:value-of select="substring-before($doc,'.hlp')"/>
172        </xsl:variable>
173        <A href="{concat($rootpath,$docbase)}.html">
174          <xsl:choose>
175            <xsl:when test="$missing='1'">
176              <FONT color="red"><xsl:value-of select="concat('Missing Link to ',$doc)"/></FONT>
177            </xsl:when>
178            <xsl:otherwise>
179              <xsl:for-each select="document(concat($xml_location,'/',$docbase,'.xml'))">
180                <xsl:for-each select="PAGE/TITLE">
181                  <xsl:if test="$quote='1'">&acute;</xsl:if>
182                  <xsl:copy-of select="normalize-space(text())"/>
183                  <xsl:if test="$quote='1'">&acute;</xsl:if>
184                </xsl:for-each>
185              </xsl:for-each>
186            </xsl:otherwise>
187          </xsl:choose>
188        </A>
189      </xsl:when>
190      <xsl:otherwise>
191        <xsl:message terminate="yes">Illegal document type '<xsl:value-of select="$type"/>' in link-to-document</xsl:message>
192      </xsl:otherwise>
193    </xsl:choose>
194  </xsl:template>
195
196  <!-- =============== -->
197  <!--     uplinks     -->
198  <!-- =============== -->
199
200  <xsl:template match="UP" mode="uplinks">
201    <LI>
202      <xsl:call-template name="link-to-document">
203        <xsl:with-param name="doc" select="@dest"/>
204        <xsl:with-param name="type" select="@type"/>
205        <xsl:with-param name="missing" select="@missing"/>
206      </xsl:call-template>
207    </LI>
208  </xsl:template>
209
210  <xsl:template match="*" mode="uplinks">
211    <xsl:call-template name="error"><xsl:with-param name="text">Unwanted match in mode 'uplinks'</xsl:with-param></xsl:call-template>
212  </xsl:template>
213
214  <!-- ================ -->
215  <!--     sublinks     -->
216  <!-- ================ -->
217
218  <xsl:template match="SUB" mode="sublinks">
219    <LI>
220      <xsl:call-template name="link-to-document">
221        <xsl:with-param name="doc" select="@dest"/>
222        <xsl:with-param name="type" select="@type"/>
223        <xsl:with-param name="missing" select="@missing"/>
224      </xsl:call-template>
225    </LI>
226  </xsl:template>
227
228  <xsl:template match="*" mode="sublinks">
229    <xsl:call-template name="error"><xsl:with-param name="text">Unwanted match in mode 'sublinks'</xsl:with-param></xsl:call-template>
230  </xsl:template>
231
232  <!-- =================== -->
233  <!--     reflow mode     -->
234  <!-- =================== -->
235
236  <xsl:template match="text()" mode="reflow">
237    <xsl:variable name="normaltext"><xsl:value-of select="normalize-space(.)"/></xsl:variable>
238    <xsl:choose>
239      <xsl:when test="string-length($normaltext)='0'"></xsl:when><!--skip whitespace-only text-nodes-->
240      <xsl:otherwise>
241        <xsl:variable name="first"><xsl:value-of select="normalize-space(substring(.,1,1))"/></xsl:variable>
242        <xsl:variable name="last"><xsl:value-of select="normalize-space(substring(.,string-length(.)))"/></xsl:variable>
243        <xsl:if test="string-length($first)='0'"><!--if text starts with whitespace ..-->
244          <xsl:variable name="prevtag"><xsl:copy-of select="name(preceding-sibling::*[1])"/></xsl:variable>
245          <xsl:if test="$prevtag='LINK'"><!--.. and preceding-sibling is a LINK -> keep one space-->
246            <xsl:text> </xsl:text>
247          </xsl:if>
248        </xsl:if>
249
250        <xsl:value-of select="$normaltext"/>
251
252        <xsl:if test="string-length($last)='0'"><!--if text ends with whitespace ..-->
253          <xsl:variable name="nexttag"><xsl:copy-of select="name(following-sibling::*[1])"/></xsl:variable>
254          <xsl:if test="$nexttag='LINK'"><!--.. and following-sibling is a LINK -> keep one space-->
255            <xsl:text> </xsl:text>
256          </xsl:if>
257        </xsl:if>
258      </xsl:otherwise>
259    </xsl:choose>
260  </xsl:template>
261
262  <xsl:template match="LINK" mode="reflow">
263    <xsl:apply-templates select="." mode="link-recursion"/>
264  </xsl:template>
265  <xsl:template match="*" mode="reflow">
266    <xsl:call-template name="error"><xsl:with-param name="text">Illegal TAG <xsl:value-of select="name()"/> in mode &acute;reflow&acute;</xsl:with-param></xsl:call-template>
267  </xsl:template>
268
269  <!-- ========================= -->
270  <!--     preformatted mode     -->
271  <!-- ========================= -->
272
273<!--  <xsl:template match="text()" mode="preformatted-old"><PRE><FONT color="navy"><xsl:value-of select="substring-after(.,$lb)"/></FONT></PRE></xsl:template>-->
274
275  <xsl:template match="text()" mode="preformatted">
276    <xsl:variable name="before_lf"><xsl:value-of select="substring-before(.,$lb)"/></xsl:variable>
277
278    <xsl:choose>
279      <xsl:when test="normalize-space($before_lf)=''">
280        <xsl:variable name="after_lf"><xsl:value-of select="substring-after(.,$lb)"/></xsl:variable>
281        <xsl:choose>
282          <xsl:when test="normalize-space($after_lf)=''"><xsl:value-of select="."/></xsl:when>
283          <xsl:otherwise><xsl:value-of select="$after_lf"/></xsl:otherwise>
284        </xsl:choose>
285      </xsl:when>
286      <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
287    </xsl:choose>
288  </xsl:template>
289  <xsl:template match="LINK" mode="preformatted">
290    <xsl:apply-templates select="." mode="link-recursion"/>
291  </xsl:template>
292  <xsl:template match="*" mode="preformatted">
293    <xsl:call-template name="error"><xsl:with-param name="text">Illegal TAG <xsl:value-of select="name()"/> in mode &acute;preformatted&acute;</xsl:with-param></xsl:call-template>
294  </xsl:template>
295
296
297  <xsl:template match="LINK" mode="link-recursion">
298    <xsl:variable name="quoted">
299      <xsl:choose>
300        <xsl:when test="@quoted='0'">0</xsl:when>
301        <xsl:otherwise>1</xsl:otherwise>
302      </xsl:choose>
303    </xsl:variable>
304    <xsl:choose>
305      <xsl:when test="@type='hlp' or @type='ps' or @type='pdf'">
306        <xsl:call-template name="link-to-document">
307          <xsl:with-param name="doc" select="@dest"/>
308          <xsl:with-param name="type" select="@type"/>
309          <xsl:with-param name="missing" select="@missing"/>
310          <xsl:with-param name="quote" select="$quoted"/>
311        </xsl:call-template>
312      </xsl:when>
313      <xsl:when test="@type='www'">
314        <xsl:call-template name="insert-link">
315          <xsl:with-param name="linktext"><xsl:value-of select="@dest"/></xsl:with-param>
316          <xsl:with-param name="address"><xsl:value-of select="@dest"/></xsl:with-param>
317        </xsl:call-template>
318      </xsl:when>
319      <xsl:when test="@type='email'">
320        <xsl:call-template name="insert-email-link">
321          <xsl:with-param name="linktext"><xsl:value-of select="@dest"/></xsl:with-param>
322          <xsl:with-param name="address"><xsl:value-of select="@dest"/></xsl:with-param>
323          <xsl:with-param name="subject" select="concat('Concerning helppage ',$myname)"/>
324        </xsl:call-template>
325      </xsl:when>
326      <xsl:otherwise>
327        <xsl:call-template name="error"><xsl:with-param name="text">Unknown type '<xsl:value-of select="@type"/>'</xsl:with-param></xsl:call-template>
328      </xsl:otherwise>
329    </xsl:choose>
330  </xsl:template>
331
332  <xsl:template match="T" mode="condensed">
333    <xsl:choose>
334      <xsl:when test="@reflow='1'">
335          <xsl:apply-templates mode="reflow"/>
336      </xsl:when>
337      <xsl:otherwise>
338        <PRE><FONT color="navy" size="-1"><xsl:apply-templates mode="preformatted"/></FONT></PRE>
339      </xsl:otherwise>
340    </xsl:choose>
341  </xsl:template>
342
343  <xsl:template match="*" mode="condensed">
344    <xsl:apply-templates select="."/>
345  </xsl:template>
346
347  <xsl:template match="T">
348    <xsl:choose>
349      <xsl:when test="@reflow='1'">
350        <H3><xsl:apply-templates mode="reflow"/></H3>
351      </xsl:when>
352      <xsl:otherwise>
353        <PRE><FONT color="navy" size="-1"><xsl:apply-templates mode="preformatted"/></FONT></PRE>
354      </xsl:otherwise>
355    </xsl:choose>
356  </xsl:template>
357
358
359  <xsl:template match="ENTRY">
360    <LI>
361      <xsl:apply-templates mode="condensed"/>
362    </LI>
363  </xsl:template>
364
365  <xsl:template match="P">
366    <DIV><xsl:apply-templates mode="condensed"/></DIV>
367  </xsl:template>
368
369  <xsl:template match="ENUM">
370    <xsl:variable name="enumval"><xsl:value-of select="ENTRY[1]/@enumerated"/></xsl:variable>
371    <xsl:variable name="type">
372      <xsl:choose>
373        <xsl:when test="$enumval='a'">a</xsl:when>
374        <xsl:when test="$enumval='A'">A</xsl:when>
375        <xsl:otherwise>1</xsl:otherwise><!--fallback to 1. 2. 3. ..-->
376      </xsl:choose>
377    </xsl:variable>
378
379    <xsl:choose>
380      <xsl:when test="$type='1'">
381        <OL>
382          <xsl:apply-templates/>
383        </OL>
384      </xsl:when>
385      <xsl:otherwise>
386        <OL type="{$type}">
387          <xsl:apply-templates/>
388        </OL>
389      </xsl:otherwise>
390    </xsl:choose>
391
392    <BR/>
393  </xsl:template>
394  <xsl:template match="LIST">
395    <UL>
396      <xsl:apply-templates/>
397    </UL>
398    <BR/>
399  </xsl:template>
400
401  <xsl:template match="P" mode="top-level"><DIV><xsl:apply-templates/></DIV></xsl:template>
402  <xsl:template match="T|ENUM|LIST" mode="top-level"><xsl:apply-templates select="."/></xsl:template>
403
404  <xsl:template match="SECTION" mode="main">
405    <xsl:variable name="anchor"><xsl:value-of select="translate(@name,' ','_')"/></xsl:variable>
406    <A name="{$anchor}"></A>
407    <H2><xsl:value-of select="@name"/>&nbsp;<A href="#{$anchor}">&nbsp;</A>
408    </H2>
409    <TABLE width="100%" border="{$tableBorder}">
410      <TR>
411        <TD align="right">
412          <TABLE width="97%" border="{$tableBorder}">
413            <TR>
414              <TD>
415                <xsl:apply-templates mode="top-level"/>
416              </TD>
417            </TR>
418            <TR><TD>&nbsp;</TD></TR>
419          </TABLE>
420        </TD>
421      </TR>
422    </TABLE>
423  </xsl:template>
424
425  <xsl:template match="SECTION" mode="content">
426    <xsl:variable name="anchor"><xsl:value-of select="translate(@name,' ','_')"/></xsl:variable>
427    <LI><A href="#{$anchor}"><xsl:value-of select="@name"/></A></LI>
428  </xsl:template>
429
430  <!-- ================================ -->
431  <!--     PAGE document wide layout    -->
432  <!-- ================================ -->
433
434  <xsl:template match="PAGE">
435    <HTML>
436      <xsl:variable name="title">
437        <xsl:for-each select="TITLE">
438          <xsl:value-of select="text()"/>
439        </xsl:for-each>
440      </xsl:variable>
441      <xsl:call-template name="header">
442        <xsl:with-param name="title" select="$title"/>
443      </xsl:call-template>
444      <BODY LEFTMARGIN="10" TEXT="{$fontColor}" BGCOLOR="{$backgroundColor}" LINK="{$linkColor}" VLINK="{$visitedLinkColor}" ALINK="{$activeLinkColor}">
445        <TABLE width="95%">
446          <TR>
447            <TD align="left" valign="top">
448              <!-- Search Google -->
449              <FORM method="GET" action="http://www.google.com/search" name="google">
450                <A HREF="http://www.google.com">
451                  <IMG SRC="Logo_25wht.gif" width="75" height="32" border="0" ALT="Google" align="absmiddle"/>
452                </A>
453                <INPUT TYPE="hidden" name="q"/>
454                <INPUT TYPE="hidden" name="hl" value="en"/>
455                <INPUT TYPE="hidden" name="as_sitesearch" value="help.arb-home.de"/>
456                <INPUT TYPE="text" name="q2" size="31" maxlength="255"/>
457                <INPUT type="submit" name="btnG" VALUE="Search help" onClick="google.q.value=google.q2.value;return true;"/>
458                <INPUT type="submit" name="btnG" VALUE="Search site" onClick="google.as_sitesearch.value='arb-home.de';google.q.value=google.q2.value;return true;"/>
459              </FORM>
460              <!-- Search Google -->
461            </TD>
462            <TD valign="top" align="right">
463              <FONT size="-1">
464                <NOBR>More docs on the
465                <xsl:call-template name="insert-link">
466                  <xsl:with-param name="linktext" select="'ARB website'"/>
467                  <xsl:with-param name="address" select="'http://rtfm.arb-home.de/'"/>
468                </xsl:call-template>.</NOBR><BR/>
469                See also <A href="{concat($rootpath,'help_index')}.html">index</A> of helppages.<BR/>
470                Last update on <xsl:value-of select="$date"/>.
471              </FONT>
472            </TD>
473          </TR>
474        </TABLE>
475        <TABLE border="{$tableBorder}" width="98%" align="center">
476          <TR bgcolor="{$linkSectionsColor}">
477            <xsl:text>
478            </xsl:text>
479            <TD valign="top" width="50%">Main topics:<BR/>
480              <UL>
481                <xsl:apply-templates select="UP" mode="uplinks"/>
482              </UL>
483            </TD>
484            <xsl:text>
485            </xsl:text>
486            <TD valign="top">Related topics:<BR/>
487              <UL>
488                <xsl:apply-templates select="SUB" mode="sublinks"/>
489              </UL>
490            </TD>
491            <xsl:text>
492            </xsl:text>
493          </TR>
494          <TR>
495            <TD colspan="2">
496              <H1><xsl:value-of select="$title"/></H1>
497              <UL><xsl:apply-templates select="SECTION" mode="content"/></UL>
498              <xsl:apply-templates select="SECTION" mode="main"/>
499            </TD>
500          </TR>
501        </TABLE>
502      </BODY>
503    </HTML>
504  </xsl:template>
505
506  <!-- ============ -->
507  <!--     text()   (should be last template)  -->
508  <!-- ============ -->
509
510  <xsl:template match="text()|*">
511   <xsl:choose>
512     <!-- tags-->
513     <xsl:when test="string-length(name())>0">
514       <xsl:call-template name="error"><xsl:with-param name="text">Unhandled TAG <xsl:value-of select="name()"/></xsl:with-param></xsl:call-template>
515     </xsl:when>
516     <!-- text() -->
517     <xsl:otherwise>
518       <xsl:variable name="self"><xsl:value-of select="."/></xsl:variable>
519       <xsl:choose>
520         <!--allow empty text-->
521         <xsl:when test="normalize-space($self)=''"></xsl:when>
522         <xsl:otherwise>
523           <!--           {<xsl:value-of select="."/>}-->
524           <xsl:call-template name="error"><xsl:with-param name="text">Unexpected text</xsl:with-param></xsl:call-template>
525         </xsl:otherwise>
526       </xsl:choose>
527     </xsl:otherwise>
528   </xsl:choose>
529  </xsl:template>
530
531
532</xsl:transform>
533
Note: See TracBrowser for help on using the repository browser.