changeset 20:627a2524520d

Cleanups, rename svn2cl.xsl to xml2cl.csl.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 20 May 2020 12:42:41 +0300
parents 0accb32904e7
children 31f6639b7a77
files hg2cl svn2cl svn2cl.xsl xml2cl.xsl
diffstat 4 files changed, 308 insertions(+), 313 deletions(-) [+]
line wrap: on
line diff
--- a/hg2cl	Wed May 20 10:44:27 2020 +0300
+++ b/hg2cl	Wed May 20 12:42:41 2020 +0300
@@ -45,7 +45,7 @@
 CHANGELOG="ChangeLog"
 
 # do command line checking
-prog=`basename $0`
+prog="$(basename $0)"
 while [ -n "$1" ]
 do
   case "$1" in
@@ -78,7 +78,7 @@
       shift
       ;;
     -V|--version)
-      echo "$prog $VERSION";
+      echo "${prog} $VERSION";
       echo "Written by Arthur de Jong."
       echo "Modified for Mercurial by Matti Hamalainen."
       echo "Copyright (C) 2005 Arthur de Jong."
@@ -89,7 +89,7 @@
       exit 0
       ;;
     -h|--help)
-      echo "Usage: $prog [OPTION]..."
+      echo "Usage: ${prog} [OPTION]..."
       echo "Generate a ChangeLog from a checked out Mercurial repository."
       echo ""
       echo "  --strip-prefix NAME    prefix to strip from all entries, defaults"
@@ -105,8 +105,8 @@
       exit 0
       ;;
     *)
-      echo "$prog: invalid option -- $1"
-      echo "Try \`$prog --help' for more information."
+      echo "${prog}: invalid option -- $1"
+      echo "Try \`${prog} --help' for more information."
       exit 1
       ;;
   esac
@@ -120,7 +120,7 @@
 
 # find the directory that this script resides in
 dir="$(dirname "$(realpath "$0")")"
-XSL="${dir}/svn2cl.xsl"
+XSL="${dir}/xml2cl.xsl"
 
 # redirect stdout to the changelog file if needed
 if test "x$CHANGELOG" != "x-"; then
--- a/svn2cl	Wed May 20 10:44:27 2020 +0300
+++ b/svn2cl	Wed May 20 12:42:41 2020 +0300
@@ -44,7 +44,7 @@
 CHANGELOG="ChangeLog"
 
 # do command line checking
-prog=`basename $0`
+prog="$(basename $0)"
 while [ -n "$1" ]
 do
   case "$1" in
@@ -77,7 +77,7 @@
       shift
       ;;
     -V|--version)
-      echo "$prog $VERSION";
+      echo "${prog} $VERSION";
       echo "Written by Arthur de Jong."
       echo "Modified by Matti Hamalainen."
       echo "Copyright (C) 2005-2008 Arthur de Jong."
@@ -87,7 +87,7 @@
       exit 0
       ;;
     -h|--help)
-      echo "Usage: $prog [OPTION]..."
+      echo "Usage: ${prog} [OPTION]..."
       echo "Generate a ChangeLog from a checked out subversion repository."
       echo ""
       echo "  --strip-prefix NAME    prefix to strip from all entries, defaults"
@@ -103,8 +103,8 @@
       exit 0
       ;;
     *)
-      echo "$prog: invalid option -- $1"
-      echo "Try \`$prog --help' for more information."
+      echo "${prog}: invalid option -- $1"
+      echo "Try \`${prog} --help' for more information."
       exit 1
       ;;
   esac
@@ -117,13 +117,8 @@
 fi
 
 # find the directory that this script resides in
-prog="$0"
-while test -h "$prog"; do
-  prog=`ls -ld "$prog" | sed "s/^.*-> \(.*\)/\1/;/^[^/]/s,^,$(dirname "$prog")/,"`
-done
-dir=`dirname $prog`
-dir=`cd $dir && pwd`
-XSL="$dir/svn2cl.xsl"
+dir="$(dirname "$(realpath "$0")")"
+XSL="${dir}/xml2cl.xsl"
 
 # redirect stdout to the changelog file if needed
 if test "x$CHANGELOG" != "x-"; then
--- a/svn2cl.xsl	Wed May 20 10:44:27 2020 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,295 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-
-   svn2cl.xsl - xslt stylesheet for converting svn log to a normal
-                changelog
-
-   Usage (replace ++ with two minus signs):
-     svn ++verbose ++xml log | \
-       xsltproc ++stringparam strip-prefix `basename $(pwd)` \
-                ++stringparam linelen 75 \
-                ++stringparam groupbyday yes \
-                ++stringparam include-rev yes \
-                svn2cl.xsl - > ChangeLog
-
-   This file is based on several implementations of this conversion
-   that I was not completely happy with and some other common
-   xslt constructs found on the web.
-
-   Copyright (C) 2004, 2005 Arthur de Jong.
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions
-   are met:
-   1. Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-   2. Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in
-      the documentation and/or other materials provided with the
-      distribution.
-   3. The name of the author may not be used to endorse or promote
-      products derived from this software without specific prior
-      written permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-   ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--->
-
-<!DOCTYPE page [
- <!ENTITY tab "&#9;">
- <!ENTITY newl "&#13;">
- <!ENTITY space "&#32;">
-]>
-
-<!--
-   TODO
-   - make external lookups of author names possible
-   - find a place for revision numbers
-   - mark deleted files as such
-   - combine paths
-   - make path formatting nicer
--->
-
-<xsl:stylesheet
-  version="1.0"
-  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-  xmlns="http://www.w3.org/1999/xhtml">
-
- <xsl:output
-   method="text"
-   encoding="iso-8859-15"
-   media-type="text/plain"
-   omit-xml-declaration="yes"
-   standalone="yes"
-   indent="no" />
-
- <xsl:strip-space elements="*" />
-
- <!-- the prefix of pathnames to strip -->
- <xsl:param name="strip-prefix" select="'/'" />
-
- <!-- the length of a line to wrap messages at -->
- <xsl:param name="linelen" select="75" />
- 
- <!-- whether entries should be grouped by day -->
- <xsl:param name="groupbyday" select="'no'" />
-
- <!-- whether entries should be grouped by day -->
- <xsl:param name="include-rev" select="'no'" />
-
- <!-- add newlines at the end of the changelog -->
- <xsl:template match="log">
-  <xsl:apply-templates/>
-  <xsl:text>&newl;</xsl:text>
- </xsl:template>
-
- <!-- format one entry from the log -->
- <xsl:template match="logentry">
-  <!-- save log entry number -->
-  <xsl:variable name="pos" select="position()"/>
-  <!-- fetch previous entry's date -->
-  <xsl:variable name="prevdate">
-   <xsl:apply-templates select="../logentry[position()=(($pos)-1)]/date"/>
-  </xsl:variable>
-  <!-- fetch previous entry's author -->
-  <xsl:variable name="prevauthor">
-   <xsl:apply-templates select="../logentry[position()=(($pos)-1)]/author"/>
-  </xsl:variable>
-  <!-- fetch this entry's date -->
-  <xsl:variable name="date">
-   <xsl:apply-templates select="date" />
-  </xsl:variable>
-  <!-- fetch this entry's author -->
-  <xsl:variable name="author">
-   <xsl:apply-templates select="author" />
-  </xsl:variable>
-  <!-- check if header is changed -->
-  <xsl:if test="($prevdate!=$date) or ($prevauthor!=$author)">
-   <!-- add newline -->
-   <xsl:if test="not(position()=1)">
-     <xsl:text>&newl;</xsl:text>
-   </xsl:if>
-   <!-- date -->
-   <xsl:apply-templates select="date" />
-   <!-- two spaces -->
-   <xsl:text>&space;&space;</xsl:text>
-   <!-- author's name -->
-   <xsl:apply-templates select="author" />
-   <!-- two newlines -->
-   <xsl:text>&newl;&newl;</xsl:text>
-  </xsl:if>
-  <!-- get paths string -->
-  <xsl:variable name="paths">
-   <xsl:apply-templates select="paths" />
-  </xsl:variable>
-  <!-- get revision number -->
-  <xsl:variable name="rev">
-   <xsl:if test="$include-rev='yes'">
-    <xsl:text>[r</xsl:text>
-    <xsl:value-of select="@revision"/>
-    <xsl:text>]&space;</xsl:text>
-   </xsl:if>
-  </xsl:variable>
-  <!-- first line is indented (other indents are done in wrap template) -->
-  <xsl:text>&tab;*&space;</xsl:text>
-  <!-- print the paths and message nicely wrapped -->
-  <xsl:call-template name="wrap">
-   <xsl:with-param name="txt" select="concat($rev,$paths,normalize-space(msg))" />
-  </xsl:call-template>
- </xsl:template>
-
- <!-- format date -->
- <xsl:template match="date">
-  <xsl:variable name="date" select="normalize-space(.)" />
-  <!-- output date part -->
-  <xsl:value-of select="substring($date,1,10)" />
-  <!-- output time part -->
-  <xsl:if test="$groupbyday!='yes'">
-   <xsl:text>&space;</xsl:text>
-   <xsl:value-of select="substring($date,12,5)" />
-  </xsl:if>
- </xsl:template>
-
- <!-- format author -->
- <xsl:template match="author">
-  <xsl:value-of select="normalize-space(.)" />
- </xsl:template>
-
- <!-- present a list of paths names -->
- <xsl:template match="paths">
-  <xsl:for-each select="path">
-   <xsl:sort select="normalize-space(.)" data-type="text" />
-   <!-- unless we are the first entry, add a comma -->
-   <xsl:if test="not(position()=1)">
-    <xsl:text>,&space;</xsl:text>
-   </xsl:if>
-   <!-- print the path name -->
-   <xsl:apply-templates select="."/>
-  </xsl:for-each>
-  <!-- end the list with a colon -->
-  <xsl:text>:&space;</xsl:text>
- </xsl:template>
-
- <!-- transform path to something printable -->
- <xsl:template match="path">
-  <!-- fetch the pathname -->
-  <xsl:variable name="p1" select="normalize-space(.)" />
-  <!-- strip leading slash -->
-  <xsl:variable name="p2">
-   <xsl:choose>
-    <xsl:when test="starts-with($p1,'/')">
-     <xsl:value-of select="substring($p1,2)" />
-    </xsl:when>
-    <xsl:otherwise>
-     <xsl:value-of select="$p1" />
-    </xsl:otherwise>
-   </xsl:choose>
-  </xsl:variable>
-  <!-- strip trailing slash from strip-prefix -->
-  <xsl:variable name="sp">
-   <xsl:choose>
-    <xsl:when test="substring($strip-prefix,string-length($strip-prefix),1)='/'">
-     <xsl:value-of select="substring($strip-prefix,1,string-length($strip-prefix)-1)" />
-    </xsl:when>
-    <xsl:otherwise>
-     <xsl:value-of select="$strip-prefix" />
-    </xsl:otherwise>
-   </xsl:choose>
-  </xsl:variable>
-  <!-- strip strip-prefix -->
-  <xsl:variable name="p3">
-   <xsl:choose>
-    <xsl:when test="starts-with($p2,$sp)">
-     <xsl:value-of select="substring($p2,1+string-length($sp))" />
-    </xsl:when>
-    <xsl:otherwise>
-     <!-- TODO: do not print strings that do not begin with strip-prefix -->
-     <xsl:value-of select="$p2" />
-    </xsl:otherwise>
-   </xsl:choose>
-  </xsl:variable>
-  <!-- strip another slash -->
-  <xsl:variable name="p4">
-   <xsl:choose>
-    <xsl:when test="starts-with($p3,'/')">
-     <xsl:value-of select="substring($p3,2)" />
-    </xsl:when>
-    <xsl:otherwise>
-     <xsl:value-of select="$p3" />
-    </xsl:otherwise>
-   </xsl:choose>
-  </xsl:variable>
-  <!-- translate empty string to dot -->
-  <xsl:choose>
-   <xsl:when test="$p4 = ''">
-    <xsl:text>.</xsl:text>
-   </xsl:when>
-   <xsl:otherwise>
-    <xsl:value-of select="$p4" />
-   </xsl:otherwise>
-  </xsl:choose>
- </xsl:template>
-
- <!-- string-wrapping template -->
- <xsl:template name="wrap">
-  <xsl:param name="txt" />
-  <xsl:choose>
-   <xsl:when test="(string-length($txt) &lt; (($linelen)-9)) or not(contains($txt,' '))">
-    <!-- this is easy, nothing to do -->
-    <xsl:value-of select="$txt" />
-    <!-- add newline -->
-    <xsl:text>&newl;</xsl:text>
-   </xsl:when>
-   <xsl:otherwise>
-    <!-- find the first line -->
-    <xsl:variable name="tmp" select="substring($txt,1,(($linelen)-10))" />
-    <xsl:variable name="line">
-     <xsl:choose>
-      <xsl:when test="contains($tmp,' ')">
-       <xsl:call-template name="find-line">
-        <xsl:with-param name="txt" select="$tmp" />
-       </xsl:call-template>
-      </xsl:when>
-      <xsl:otherwise>
-       <xsl:value-of select="substring-before($txt,' ')" />
-      </xsl:otherwise>
-     </xsl:choose>
-    </xsl:variable>
-    <!-- print newline and tab -->
-    <xsl:value-of select="$line" />
-    <xsl:text>&newl;&tab;&space;&space;</xsl:text>
-    <!-- wrap the rest of the text -->
-    <xsl:call-template name="wrap">
-     <xsl:with-param name="txt" select="normalize-space(substring($txt,string-length($line)+1))" />
-    </xsl:call-template>
-   </xsl:otherwise>
-  </xsl:choose>
- </xsl:template>
-
- <!-- template to trim line to contain space as last char -->
- <xsl:template name="find-line">
-  <xsl:param name="txt" />
-  <xsl:choose>
-   <xsl:when test="substring($txt,string-length($txt),1) = ' '">
-    <xsl:value-of select="normalize-space($txt)" />
-   </xsl:when>
-   <xsl:otherwise>
-    <xsl:call-template name="find-line">
-     <xsl:with-param name="txt" select="substring($txt,1,string-length($txt)-1)" />
-    </xsl:call-template>
-   </xsl:otherwise>
-  </xsl:choose>
- </xsl:template>
-
-</xsl:stylesheet>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml2cl.xsl	Wed May 20 12:42:41 2020 +0300
@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+
+   svn2cl.xsl - xslt stylesheet for converting svn log to a normal
+                changelog
+
+   Usage (replace ++ with two minus signs):
+     svn ++verbose ++xml log | \
+       xsltproc ++stringparam strip-prefix `basename $(pwd)` \
+                ++stringparam linelen 75 \
+                ++stringparam groupbyday yes \
+                ++stringparam include-rev yes \
+                svn2cl.xsl - > ChangeLog
+
+   This file is based on several implementations of this conversion
+   that I was not completely happy with and some other common
+   xslt constructs found on the web.
+
+   Copyright (C) 2004, 2005 Arthur de Jong.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in
+      the documentation and/or other materials provided with the
+      distribution.
+   3. The name of the author may not be used to endorse or promote
+      products derived from this software without specific prior
+      written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+   IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+   OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-->
+
+<!DOCTYPE page [
+ <!ENTITY tab "&#9;">
+ <!ENTITY newl "&#13;">
+ <!ENTITY space "&#32;">
+]>
+
+<!--
+   TODO
+   - make external lookups of author names possible
+   - find a place for revision numbers
+   - mark deleted files as such
+   - combine paths
+   - make path formatting nicer
+-->
+
+<xsl:stylesheet
+  version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns="http://www.w3.org/1999/xhtml">
+
+ <xsl:output
+   method="text"
+   encoding="iso-8859-15"
+   media-type="text/plain"
+   omit-xml-declaration="yes"
+   standalone="yes"
+   indent="no" />
+
+ <xsl:strip-space elements="*" />
+
+ <!-- the prefix of pathnames to strip -->
+ <xsl:param name="strip-prefix" select="'/'" />
+
+ <!-- the length of a line to wrap messages at -->
+ <xsl:param name="linelen" select="75" />
+ 
+ <!-- whether entries should be grouped by day -->
+ <xsl:param name="groupbyday" select="'no'" />
+
+ <!-- whether entries should be grouped by day -->
+ <xsl:param name="include-rev" select="'no'" />
+
+ <!-- add newlines at the end of the changelog -->
+ <xsl:template match="log">
+  <xsl:apply-templates/>
+  <xsl:text>&newl;</xsl:text>
+ </xsl:template>
+
+ <!-- format one entry from the log -->
+ <xsl:template match="logentry">
+  <!-- save log entry number -->
+  <xsl:variable name="pos" select="position()"/>
+  <!-- fetch previous entry's date -->
+  <xsl:variable name="prevdate">
+   <xsl:apply-templates select="../logentry[position()=(($pos)-1)]/date"/>
+  </xsl:variable>
+  <!-- fetch previous entry's author -->
+  <xsl:variable name="prevauthor">
+   <xsl:apply-templates select="../logentry[position()=(($pos)-1)]/author"/>
+  </xsl:variable>
+  <!-- fetch this entry's date -->
+  <xsl:variable name="date">
+   <xsl:apply-templates select="date" />
+  </xsl:variable>
+  <!-- fetch this entry's author -->
+  <xsl:variable name="author">
+   <xsl:apply-templates select="author" />
+  </xsl:variable>
+  <!-- check if header is changed -->
+  <xsl:if test="($prevdate!=$date) or ($prevauthor!=$author)">
+   <!-- add newline -->
+   <xsl:if test="not(position()=1)">
+     <xsl:text>&newl;</xsl:text>
+   </xsl:if>
+   <!-- date -->
+   <xsl:apply-templates select="date" />
+   <!-- two spaces -->
+   <xsl:text>&space;&space;</xsl:text>
+   <!-- author's name -->
+   <xsl:apply-templates select="author" />
+   <!-- two newlines -->
+   <xsl:text>&newl;&newl;</xsl:text>
+  </xsl:if>
+  <!-- get paths string -->
+  <xsl:variable name="paths">
+   <xsl:apply-templates select="paths" />
+  </xsl:variable>
+  <!-- get revision number -->
+  <xsl:variable name="rev">
+   <xsl:if test="$include-rev='yes'">
+    <xsl:text>[r</xsl:text>
+    <xsl:value-of select="@revision"/>
+    <xsl:text>]&space;</xsl:text>
+   </xsl:if>
+  </xsl:variable>
+  <!-- first line is indented (other indents are done in wrap template) -->
+  <xsl:text>&tab;*&space;</xsl:text>
+  <!-- print the paths and message nicely wrapped -->
+  <xsl:call-template name="wrap">
+   <xsl:with-param name="txt" select="concat($rev,$paths,normalize-space(msg))" />
+  </xsl:call-template>
+ </xsl:template>
+
+ <!-- format date -->
+ <xsl:template match="date">
+  <xsl:variable name="date" select="normalize-space(.)" />
+  <!-- output date part -->
+  <xsl:value-of select="substring($date,1,10)" />
+  <!-- output time part -->
+  <xsl:if test="$groupbyday!='yes'">
+   <xsl:text>&space;</xsl:text>
+   <xsl:value-of select="substring($date,12,5)" />
+  </xsl:if>
+ </xsl:template>
+
+ <!-- format author -->
+ <xsl:template match="author">
+  <xsl:value-of select="normalize-space(.)" />
+ </xsl:template>
+
+ <!-- present a list of paths names -->
+ <xsl:template match="paths">
+  <xsl:for-each select="path">
+   <xsl:sort select="normalize-space(.)" data-type="text" />
+   <!-- unless we are the first entry, add a comma -->
+   <xsl:if test="not(position()=1)">
+    <xsl:text>,&space;</xsl:text>
+   </xsl:if>
+   <!-- print the path name -->
+   <xsl:apply-templates select="."/>
+  </xsl:for-each>
+  <!-- end the list with a colon -->
+  <xsl:text>:&space;</xsl:text>
+ </xsl:template>
+
+ <!-- transform path to something printable -->
+ <xsl:template match="path">
+  <!-- fetch the pathname -->
+  <xsl:variable name="p1" select="normalize-space(.)" />
+  <!-- strip leading slash -->
+  <xsl:variable name="p2">
+   <xsl:choose>
+    <xsl:when test="starts-with($p1,'/')">
+     <xsl:value-of select="substring($p1,2)" />
+    </xsl:when>
+    <xsl:otherwise>
+     <xsl:value-of select="$p1" />
+    </xsl:otherwise>
+   </xsl:choose>
+  </xsl:variable>
+  <!-- strip trailing slash from strip-prefix -->
+  <xsl:variable name="sp">
+   <xsl:choose>
+    <xsl:when test="substring($strip-prefix,string-length($strip-prefix),1)='/'">
+     <xsl:value-of select="substring($strip-prefix,1,string-length($strip-prefix)-1)" />
+    </xsl:when>
+    <xsl:otherwise>
+     <xsl:value-of select="$strip-prefix" />
+    </xsl:otherwise>
+   </xsl:choose>
+  </xsl:variable>
+  <!-- strip strip-prefix -->
+  <xsl:variable name="p3">
+   <xsl:choose>
+    <xsl:when test="starts-with($p2,$sp)">
+     <xsl:value-of select="substring($p2,1+string-length($sp))" />
+    </xsl:when>
+    <xsl:otherwise>
+     <!-- TODO: do not print strings that do not begin with strip-prefix -->
+     <xsl:value-of select="$p2" />
+    </xsl:otherwise>
+   </xsl:choose>
+  </xsl:variable>
+  <!-- strip another slash -->
+  <xsl:variable name="p4">
+   <xsl:choose>
+    <xsl:when test="starts-with($p3,'/')">
+     <xsl:value-of select="substring($p3,2)" />
+    </xsl:when>
+    <xsl:otherwise>
+     <xsl:value-of select="$p3" />
+    </xsl:otherwise>
+   </xsl:choose>
+  </xsl:variable>
+  <!-- translate empty string to dot -->
+  <xsl:choose>
+   <xsl:when test="$p4 = ''">
+    <xsl:text>.</xsl:text>
+   </xsl:when>
+   <xsl:otherwise>
+    <xsl:value-of select="$p4" />
+   </xsl:otherwise>
+  </xsl:choose>
+ </xsl:template>
+
+ <!-- string-wrapping template -->
+ <xsl:template name="wrap">
+  <xsl:param name="txt" />
+  <xsl:choose>
+   <xsl:when test="(string-length($txt) &lt; (($linelen)-9)) or not(contains($txt,' '))">
+    <!-- this is easy, nothing to do -->
+    <xsl:value-of select="$txt" />
+    <!-- add newline -->
+    <xsl:text>&newl;</xsl:text>
+   </xsl:when>
+   <xsl:otherwise>
+    <!-- find the first line -->
+    <xsl:variable name="tmp" select="substring($txt,1,(($linelen)-10))" />
+    <xsl:variable name="line">
+     <xsl:choose>
+      <xsl:when test="contains($tmp,' ')">
+       <xsl:call-template name="find-line">
+        <xsl:with-param name="txt" select="$tmp" />
+       </xsl:call-template>
+      </xsl:when>
+      <xsl:otherwise>
+       <xsl:value-of select="substring-before($txt,' ')" />
+      </xsl:otherwise>
+     </xsl:choose>
+    </xsl:variable>
+    <!-- print newline and tab -->
+    <xsl:value-of select="$line" />
+    <xsl:text>&newl;&tab;&space;&space;</xsl:text>
+    <!-- wrap the rest of the text -->
+    <xsl:call-template name="wrap">
+     <xsl:with-param name="txt" select="normalize-space(substring($txt,string-length($line)+1))" />
+    </xsl:call-template>
+   </xsl:otherwise>
+  </xsl:choose>
+ </xsl:template>
+
+ <!-- template to trim line to contain space as last char -->
+ <xsl:template name="find-line">
+  <xsl:param name="txt" />
+  <xsl:choose>
+   <xsl:when test="substring($txt,string-length($txt),1) = ' '">
+    <xsl:value-of select="normalize-space($txt)" />
+   </xsl:when>
+   <xsl:otherwise>
+    <xsl:call-template name="find-line">
+     <xsl:with-param name="txt" select="substring($txt,1,string-length($txt)-1)" />
+    </xsl:call-template>
+   </xsl:otherwise>
+  </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>