mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 00:16:11 +00:00
132 lines
4.5 KiB
XML
132 lines
4.5 KiB
XML
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- sgml -*- -->
|
|
<xsl:stylesheet version="1.0"
|
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
xmlns:ext="http://exslt.org/common"
|
|
xmlns:str-split2lines-func="f:str-split2lines-func"
|
|
exclude-result-prefixes="xsl ext str-split2lines-func">
|
|
|
|
|
|
<!-- how much do I love haskell ... -->
|
|
<xsl:template name="str-foldl">
|
|
<xsl:param name="pFunc" select="/.."/>
|
|
<xsl:param name="pA0"/>
|
|
<xsl:param name="pStr"/>
|
|
|
|
<xsl:choose>
|
|
<xsl:when test="not(string($pStr))">
|
|
<xsl:copy-of select="$pA0"/>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:variable name="vFunResult">
|
|
<xsl:apply-templates select="$pFunc[1]">
|
|
<xsl:with-param name="arg0" select="$pFunc[position() > 1]"/>
|
|
<xsl:with-param name="arg1" select="$pA0"/>
|
|
<xsl:with-param name="arg2" select="substring($pStr,1,1)"/>
|
|
</xsl:apply-templates>
|
|
</xsl:variable>
|
|
|
|
<xsl:call-template name="str-foldl">
|
|
<xsl:with-param name="pFunc" select="$pFunc"/>
|
|
<xsl:with-param name="pStr" select="substring($pStr,2)"/>
|
|
<xsl:with-param name="pA0" select="ext:node-set($vFunResult)"/>
|
|
</xsl:call-template>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
|
|
</xsl:template>
|
|
|
|
|
|
<str-split2lines-func:str-split2lines-func/>
|
|
|
|
<xsl:template name="str-split-to-lines">
|
|
<xsl:param name="pStr"/>
|
|
<xsl:param name="pLineLength" select="60"/>
|
|
<xsl:param name="pDelimiters" select="' 
'"/>
|
|
<xsl:variable name="vsplit2linesFun"
|
|
select="document('')/*/str-split2lines-func:*[1]"/>
|
|
|
|
<xsl:variable name="vrtfParams">
|
|
<delimiters><xsl:value-of select="$pDelimiters"/></delimiters>
|
|
<lineLength><xsl:copy-of select="$pLineLength"/></lineLength>
|
|
</xsl:variable>
|
|
|
|
<xsl:variable name="vResult">
|
|
<xsl:call-template name="str-foldl">
|
|
<xsl:with-param name="pFunc" select="$vsplit2linesFun"/>
|
|
<xsl:with-param name="pStr" select="$pStr"/>
|
|
|
|
<xsl:with-param name="pA0" select="ext:node-set($vrtfParams)"/>
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
|
|
<xsl:for-each select="ext:node-set($vResult)/line">
|
|
<xsl:for-each select="word">
|
|
<xsl:value-of select="concat(., ' ')"/>
|
|
</xsl:for-each>
|
|
<xsl:value-of select="'
'"/>
|
|
</xsl:for-each>
|
|
</xsl:template>
|
|
|
|
|
|
<xsl:template match="str-split2lines-func:*">
|
|
<xsl:param name="arg1" select="/.."/>
|
|
<xsl:param name="arg2"/>
|
|
|
|
<xsl:copy-of select="$arg1/*[position() < 3]"/>
|
|
<xsl:copy-of select="$arg1/line[position() != last()]"/>
|
|
|
|
<xsl:choose>
|
|
<xsl:when test="contains($arg1/*[1], $arg2)">
|
|
<xsl:if test="string($arg1/word)">
|
|
<xsl:call-template name="fillLine">
|
|
<xsl:with-param name="pLine" select="$arg1/line[last()]"/>
|
|
<xsl:with-param name="pWord" select="$arg1/word"/>
|
|
<xsl:with-param name="pLineLength" select="$arg1/*[2]"/>
|
|
</xsl:call-template>
|
|
</xsl:if>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:copy-of select="$arg1/line[last()]"/>
|
|
<word><xsl:value-of select="concat($arg1/word, $arg2)"/></word>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
<!-- This template recognises every new word and accumulates the result, -->
|
|
<!-- which is a list of 'line' elements, each having a list of 'word' -->
|
|
<!-- children. After the last 'line' element there's a single 'word', in -->
|
|
<!-- which the 'current word; is being accumulated. Whenever the current -->
|
|
<!-- character is one of the specified delimiters, this signals the -->
|
|
<!-- formation of a new word. This word is either added to the last line -->
|
|
<!-- (if the total line length will not exceed the specified line-length), -->
|
|
<!-- or a new line is started and this word becomes the 1st in the new line -->
|
|
<xsl:template name="fillLine">
|
|
<xsl:param name="pLine" select="/.."/>
|
|
<xsl:param name="pWord" select="/.."/>
|
|
<xsl:param name="pLineLength" />
|
|
|
|
<xsl:variable name="vnWordsInLine" select="count($pLine/word)"/>
|
|
<xsl:variable name="vLineLength"
|
|
select="string-length($pLine) + $vnWordsInLine"/>
|
|
|
|
<xsl:choose>
|
|
<xsl:when test="not($vLineLength + string-length($pWord) > $pLineLength)">
|
|
<line>
|
|
<xsl:copy-of select="$pLine/*"/>
|
|
<xsl:copy-of select="$pWord"/>
|
|
</line>
|
|
</xsl:when>
|
|
<xsl:otherwise>
|
|
<xsl:copy-of select="$pLine"/>
|
|
<line>
|
|
<xsl:copy-of select="$pWord"/>
|
|
</line>
|
|
<word/>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
</xsl:stylesheet>
|