Merge pull request #45930 from aszlig/option-description-parbreak
nixos: Split paras by \n\n in option descriptions
This commit is contained in:
commit
14b0456686
|
@ -90,7 +90,9 @@ let
|
||||||
fi
|
fi
|
||||||
${buildPackages.libxslt.bin}/bin/xsltproc \
|
${buildPackages.libxslt.bin}/bin/xsltproc \
|
||||||
--stringparam revision '${revision}' \
|
--stringparam revision '${revision}' \
|
||||||
-o $out ${./options-to-docbook.xsl} $optionsXML
|
-o intermediate.xml ${./options-to-docbook.xsl} $optionsXML
|
||||||
|
${buildPackages.libxslt.bin}/bin/xsltproc \
|
||||||
|
-o "$out" ${./postprocess-option-descriptions.xsl} intermediate.xml
|
||||||
'';
|
'';
|
||||||
|
|
||||||
sources = lib.sourceFilesBySuffices ./. [".xml"];
|
sources = lib.sourceFilesBySuffices ./. [".xml"];
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||||
xmlns:str="http://exslt.org/strings"
|
xmlns:str="http://exslt.org/strings"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:nixos="tag:nixos.org"
|
||||||
xmlns="http://docbook.org/ns/docbook"
|
xmlns="http://docbook.org/ns/docbook"
|
||||||
extension-element-prefixes="str"
|
extension-element-prefixes="str"
|
||||||
>
|
>
|
||||||
|
@ -30,10 +31,12 @@
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
|
|
||||||
<para>
|
<nixos:option-description>
|
||||||
<xsl:value-of disable-output-escaping="yes"
|
<para>
|
||||||
select="attr[@name = 'description']/string/@value" />
|
<xsl:value-of disable-output-escaping="yes"
|
||||||
</para>
|
select="attr[@name = 'description']/string/@value" />
|
||||||
|
</para>
|
||||||
|
</nixos:option-description>
|
||||||
|
|
||||||
<xsl:if test="attr[@name = 'type']">
|
<xsl:if test="attr[@name = 'type']">
|
||||||
<para>
|
<para>
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xsl:stylesheet version="1.0"
|
||||||
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||||
|
xmlns:str="http://exslt.org/strings"
|
||||||
|
xmlns:exsl="http://exslt.org/common"
|
||||||
|
xmlns:db="http://docbook.org/ns/docbook"
|
||||||
|
xmlns:nixos="tag:nixos.org"
|
||||||
|
extension-element-prefixes="str exsl">
|
||||||
|
<xsl:output method='xml' encoding="UTF-8" />
|
||||||
|
|
||||||
|
<xsl:template match="@*|node()">
|
||||||
|
<xsl:copy>
|
||||||
|
<xsl:apply-templates select="@*|node()" />
|
||||||
|
</xsl:copy>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template name="break-up-description">
|
||||||
|
<xsl:param name="input" />
|
||||||
|
<xsl:param name="buffer" />
|
||||||
|
|
||||||
|
<!-- Every time we have two newlines following each other, we want to
|
||||||
|
break it into </para><para>. -->
|
||||||
|
<xsl:variable name="parbreak" select="'

'" />
|
||||||
|
|
||||||
|
<!-- Similar to "(head:tail) = input" in Haskell. -->
|
||||||
|
<xsl:variable name="head" select="$input[1]" />
|
||||||
|
<xsl:variable name="tail" select="$input[position() > 1]" />
|
||||||
|
|
||||||
|
<xsl:choose>
|
||||||
|
<xsl:when test="$head/self::text() and contains($head, $parbreak)">
|
||||||
|
<!-- If the haystack provided to str:split() directly starts or
|
||||||
|
ends with $parbreak, it doesn't generate a <token/> for that,
|
||||||
|
so we are doing this here. -->
|
||||||
|
<xsl:variable name="splitted-raw">
|
||||||
|
<xsl:if test="starts-with($head, $parbreak)"><token /></xsl:if>
|
||||||
|
<xsl:for-each select="str:split($head, $parbreak)">
|
||||||
|
<token><xsl:value-of select="node()" /></token>
|
||||||
|
</xsl:for-each>
|
||||||
|
<!-- Something like ends-with($head, $parbreak), but there is
|
||||||
|
no ends-with() in XSLT, so we need to use substring(). -->
|
||||||
|
<xsl:if test="
|
||||||
|
substring($head, string-length($head) -
|
||||||
|
string-length($parbreak) + 1) = $parbreak
|
||||||
|
"><token /></xsl:if>
|
||||||
|
</xsl:variable>
|
||||||
|
<xsl:variable name="splitted"
|
||||||
|
select="exsl:node-set($splitted-raw)/token" />
|
||||||
|
<!-- The buffer we had so far didn't contain any text nodes that
|
||||||
|
contain a $parbreak, so we can put the buffer along with the
|
||||||
|
first token of $splitted into a para element. -->
|
||||||
|
<para xmlns="http://docbook.org/ns/docbook">
|
||||||
|
<xsl:apply-templates select="exsl:node-set($buffer)" />
|
||||||
|
<xsl:apply-templates select="$splitted[1]/node()" />
|
||||||
|
</para>
|
||||||
|
<!-- We have already emitted the first splitted result, so the
|
||||||
|
last result is going to be set as the new $buffer later
|
||||||
|
because its contents may not be directly followed up by a
|
||||||
|
$parbreak. -->
|
||||||
|
<xsl:for-each select="$splitted[position() > 1
|
||||||
|
and position() < last()]">
|
||||||
|
<para xmlns="http://docbook.org/ns/docbook">
|
||||||
|
<xsl:apply-templates select="node()" />
|
||||||
|
</para>
|
||||||
|
</xsl:for-each>
|
||||||
|
<xsl:call-template name="break-up-description">
|
||||||
|
<xsl:with-param name="input" select="$tail" />
|
||||||
|
<xsl:with-param name="buffer" select="$splitted[last()]/node()" />
|
||||||
|
</xsl:call-template>
|
||||||
|
</xsl:when>
|
||||||
|
<!-- Either non-text node or one without $parbreak, which we just
|
||||||
|
want to buffer and continue recursing. -->
|
||||||
|
<xsl:when test="$input">
|
||||||
|
<xsl:call-template name="break-up-description">
|
||||||
|
<xsl:with-param name="input" select="$tail" />
|
||||||
|
<!-- This essentially appends $head to $buffer. -->
|
||||||
|
<xsl:with-param name="buffer">
|
||||||
|
<xsl:if test="$buffer">
|
||||||
|
<xsl:for-each select="exsl:node-set($buffer)">
|
||||||
|
<xsl:apply-templates select="." />
|
||||||
|
</xsl:for-each>
|
||||||
|
</xsl:if>
|
||||||
|
<xsl:apply-templates select="$head" />
|
||||||
|
</xsl:with-param>
|
||||||
|
</xsl:call-template>
|
||||||
|
</xsl:when>
|
||||||
|
<!-- No more $input, just put the remaining $buffer in a para. -->
|
||||||
|
<xsl:otherwise>
|
||||||
|
<para xmlns="http://docbook.org/ns/docbook">
|
||||||
|
<xsl:apply-templates select="exsl:node-set($buffer)" />
|
||||||
|
</para>
|
||||||
|
</xsl:otherwise>
|
||||||
|
</xsl:choose>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
<xsl:template match="nixos:option-description">
|
||||||
|
<xsl:choose>
|
||||||
|
<!--
|
||||||
|
Only process nodes that are comprised of a single <para/> element,
|
||||||
|
because if that's not the case the description already contains
|
||||||
|
</para><para> in between and we need no further processing.
|
||||||
|
-->
|
||||||
|
<xsl:when test="count(db:para) > 1">
|
||||||
|
<xsl:apply-templates select="node()" />
|
||||||
|
</xsl:when>
|
||||||
|
<xsl:otherwise>
|
||||||
|
<xsl:call-template name="break-up-description">
|
||||||
|
<xsl:with-param name="input"
|
||||||
|
select="exsl:node-set(db:para/node())" />
|
||||||
|
</xsl:call-template>
|
||||||
|
</xsl:otherwise>
|
||||||
|
</xsl:choose>
|
||||||
|
</xsl:template>
|
||||||
|
|
||||||
|
</xsl:stylesheet>
|
Loading…
Reference in New Issue