diff options
author | 2024-11-06 20:54:36 +0100 | |
---|---|---|
committer | 2024-11-09 07:57:02 +0100 | |
commit | 6a6a071ba6e6d5561915259ceb00d894b7110a4b (patch) | |
tree | 070a86a370d100d575e2c22d15c3044c1730556a | |
parent | Rename "contentsTree" element to "contents" (diff) | |
download | devmanual-6a6a071ba6e6d5561915259ceb00d894b7110a4b.tar.gz devmanual-6a6a071ba6e6d5561915259ceb00d894b7110a4b.tar.bz2 devmanual-6a6a071ba6e6d5561915259ceb00d894b7110a4b.zip |
devbook.xsl: Rework the contents template
- New extraction-count template, split off from contents
- Fix path_rel; it was correct only for the two special cases of an
empty path or a path equal to @self
- Suppress empty <ul></ul> in output
Signed-off-by: Ulrich Müller <ulm@gentoo.org>
-rw-r--r-- | devbook.xsl | 155 |
1 files changed, 75 insertions, 80 deletions
diff --git a/devbook.xsl b/devbook.xsl index 529365c..8615fec 100644 --- a/devbook.xsl +++ b/devbook.xsl @@ -428,105 +428,100 @@ </xsl:choose> </xsl:template> +<xsl:template name="extraction-count"> + <xsl:param name="depth"/> + <xsl:param name="maxdepth"/> + <xsl:param name="path"/> + <xsl:param name="extraction"/> + <xsl:if test="$depth < $maxdepth or $maxdepth = 0"> + <xsl:for-each select="document(concat($path, 'text.xml'))/devbook/include"> + <count value="{count(document(concat($path, @href, 'text.xml'))//*[name()=$extraction])}"> + <xsl:call-template name="extraction-count"> + <xsl:with-param name="depth" select="$depth + 1"/> + <xsl:with-param name="maxdepth" select="$maxdepth"/> + <xsl:with-param name="path" select="concat($path, @href)"/> + <xsl:with-param name="extraction" select="$extraction"/> + </xsl:call-template> + </count> + </xsl:for-each> + </xsl:if> +</xsl:template> + <!-- TOC Tree --> <xsl:template match="contents" name="contents"> <xsl:param name="depth" select="0"/> - <xsl:param name="maxdepth"> - <xsl:choose> - <xsl:when test="@maxdepth"><xsl:value-of select="@maxdepth"/></xsl:when> - <xsl:otherwise>0</xsl:otherwise> - </xsl:choose> - </xsl:param> + <xsl:param name="maxdepth" select="sum(@maxdepth)"/> <xsl:param name="path"> <xsl:choose> <xsl:when test="@root"><xsl:value-of select="@root"/></xsl:when> <xsl:otherwise><xsl:value-of select="/devbook/@self"/></xsl:otherwise> </xsl:choose> </xsl:param> - <xsl:param name="path_rel"> - <xsl:if test="$depth = 0 and $path = '' and /devbook/@self != ''"> - <xsl:call-template name="repeat-string"> - <xsl:with-param name="count" - select="string-length(/devbook/@self) - string-length(translate(/devbook/@self, '/' , ''))"/> - <xsl:with-param name="string">../</xsl:with-param> - </xsl:call-template> - </xsl:if> - </xsl:param> <xsl:param name="orig_self" select="/devbook/@self"/> <xsl:param name="extraction" select="@extraction"/> - <xsl:param name="extraction_counting"/> - <xsl:variable name="doc_self" select="concat($path, 'text.xml')"/> - <xsl:if test="count(document($doc_self)/devbook/include) > 0 and ($depth < $maxdepth or $maxdepth = 0)"> - <xsl:choose> - <xsl:when test="$extraction_counting = 1"> - <xsl:for-each select="document($doc_self)/devbook/include"> - <count value="{count(document(concat($path, @href, 'text.xml'))//*[name()=$extraction])}" - path="{concat($path, @href)}"> - <xsl:call-template name="contents"> - <xsl:with-param name="depth" select="$depth + 1"/> - <xsl:with-param name="maxdepth" select="$maxdepth"/> - <xsl:with-param name="path" select="concat($path, @href)"/> - <xsl:with-param name="path_rel" select="concat($path_rel, @href)"/> - <xsl:with-param name="orig_self" select="$orig_self"/> - <xsl:with-param name="extraction" select="$extraction"/> - <xsl:with-param name="extraction_counting" select="1"/> - </xsl:call-template> - </count> - </xsl:for-each> - </xsl:when> - <xsl:otherwise> - <ul> - <xsl:for-each select="document($doc_self)/devbook/include"> - <xsl:variable name="extraction_counter_node"> + <xsl:if test="($depth < $maxdepth or $maxdepth = 0) + and count(document(concat($path, 'text.xml'))/devbook/include) > 0"> + <xsl:variable name="extraction_counter_node"> + <xsl:if test="$extraction"> + <xsl:call-template name="extraction-count"> + <xsl:with-param name="depth" select="$depth"/> + <xsl:with-param name="maxdepth" select="$maxdepth"/> + <xsl:with-param name="path" select="$path"/> + <xsl:with-param name="extraction" select="$extraction"/> + </xsl:call-template> + </xsl:if> + </xsl:variable> + <xsl:variable name="extraction_count" select="exslt:node-set($extraction_counter_node)"/> + <xsl:if test="not($extraction) or sum($extraction_count//@value) > 0"> + <xsl:variable name="path_rel"> + <xsl:call-template name="relative-path"> + <xsl:with-param name="path" select="$path"/> + <xsl:with-param name="self" select="$orig_self"/> + </xsl:call-template> + </xsl:variable> + <ul> + <xsl:for-each select="document(concat($path, 'text.xml'))/devbook/include"> + <xsl:variable name="index" select="position()"/> + <!-- We emit a list item with the included document's title: + * always if this is a normal table of contents; or + * when extracting, if there is at least one "extraction" + element in the document or any of its subdocuments + --> + <xsl:if test="not($extraction) or sum($extraction_count/count[$index]//@value) > 0"> + <li> + <a class="reference" href="{concat($path_rel, @href, 'index.html')}"> + <xsl:value-of select="document(concat($path, @href, 'text.xml'))/devbook/chapter[1]/title"/> + </a> + <xsl:if test="$extraction and $extraction_count/count[$index]/@value > 0"> + <!-- If the extracted element from the other document contains + any internal references, relative links would be based on + the wrong start location. So we replace /devbook/@self by + our own copy. Bug #916523. --> + <xsl:variable name="document_tree"> + <devbook self="{$orig_self}"> + <xsl:copy-of select="document(concat($path, @href, 'text.xml'))/devbook/*"/> + </devbook> + </xsl:variable> + <ul> + <xsl:for-each select="exslt:node-set($document_tree)//*[name()=$extraction]"> + <li><xsl:apply-templates select="."/></li> + </xsl:for-each> + </ul> + </xsl:if> + <!-- Call ourselves recursively for the next level --> <xsl:call-template name="contents"> <xsl:with-param name="depth" select="$depth + 1"/> <xsl:with-param name="maxdepth" select="$maxdepth"/> <xsl:with-param name="path" select="concat($path, @href)"/> - <xsl:with-param name="path_rel" select="concat($path_rel, @href)"/> <xsl:with-param name="orig_self" select="$orig_self"/> <xsl:with-param name="extraction" select="$extraction"/> - <xsl:with-param name="extraction_counting" select="1"/> </xsl:call-template> - </xsl:variable> - <xsl:variable name="extraction_counter" - select="count(exslt:node-set($extraction_counter_node)//*[@value != 0]) - + count(document(concat($path, @href, 'text.xml'))//*[name()=$extraction])"/> - <xsl:if test="string($extraction) = '' or $extraction_counter > 0"> - <li> - <a class="reference" href="{concat($path_rel, @href, 'index.html')}"> - <xsl:value-of select="document(concat($path, @href, 'text.xml'))/devbook/chapter[1]/title"/> - </a> - <xsl:if test="$extraction != ''"> - <!-- If the extracted element from the other document contains - any internal references, relative links would be based on - the wrong start location. So we replace /devbook/@self by - our own copy. Bug #916523. --> - <xsl:variable name="document_tree"> - <devbook self="{$orig_self}"> - <xsl:copy-of select="document(concat($path, @href, 'text.xml'))/devbook/*"/> - </devbook> - </xsl:variable> - <ul> - <xsl:for-each select="exslt:node-set($document_tree)//*[name()=$extraction]"> - <li><xsl:apply-templates select="."/></li> - </xsl:for-each> - </ul> - </xsl:if> - <xsl:call-template name="contents"> - <xsl:with-param name="depth" select="$depth + 1"/> - <xsl:with-param name="maxdepth" select="$maxdepth"/> - <xsl:with-param name="path" select="concat($path, @href)"/> - <xsl:with-param name="path_rel" select="concat($path_rel, @href)"/> - <xsl:with-param name="orig_self" select="$orig_self"/> - <xsl:with-param name="extraction" select="$extraction"/> - </xsl:call-template> - </li> - </xsl:if> - </xsl:for-each> - </ul> - </xsl:otherwise> - </xsl:choose> + </li> + </xsl:if> + </xsl:for-each> + </ul> + </xsl:if> </xsl:if> </xsl:template> |