There is only one level of paragraph quoting; quoted paragraphs may
not be quoted again.
+- If every line in the paragraph begins with zero or more white·space
+ characters followed by `|`, it is a “preformatted” paragraph and
+ white·space is not collapsed (`<html:pre>`).
+ A paragraph may be both quoted and preformatted.
+
- Otherwise, the paragraph is unquoted.
After this classification, each quoted or unquoted paragraph is further
classified by type based on its first character (which is must be
followed by white·space, or else the only thing on the line) :—
+- If the paragraph is preformatted, it is an ordinary paragraph.
+
- If the paragraph begins with `⁌`, it is a chapter heading
(`<html:h1>`).
- Successive list items of the same level and class are joined into
a single list.
+- Linebreaks in preformatted paragraphs are replaced with `<html:br>`.
+
Finally, any character can be escaped by instead providing its Unicode
codepoint in the form `<U+NNNN>`, where `NNNN` is one or more
hexadecimal digits.
</otherwise>
</choose>
</template>
+ <template name="LesML:break-and-unescape">
+ <param name="source"/>
+ <variable name="broken-fragment">
+ <call-template name="LesML:split">
+ <with-param name="source" select="$source"/>
+ <with-param name="separator" select="'
'"/>
+ </call-template>
+ </variable>
+ <variable name="broken" select="exsl:node-set($broken-fragment)/node()"/>
+ <for-each select="$broken">
+ <call-template name="LesML:unescape">
+ <with-param name="source" select="string()"/>
+ </call-template>
+ <if test="position()!=count($broken)">
+ <html:br/>
+ </if>
+ </for-each>
+ </template>
<template name="LesML:unescape">
<param name="source"/>
<choose>
<variable name="prev-last" select="$last-lines[($position)-1]"/>
<variable name="linespans" select="$lines[following-sibling::*[generate-id()=generate-id(current())] and (not($prev-last) or preceding-sibling::*[generate-id()=generate-id($prev-last)]) and normalize-space()!='']|."/>
<variable name="quoted" select="not($linespans[not(starts-with(., ' ') or starts-with(., '	'))])"/>
+ <variable name="preformatted" select="not($linespans[not(starts-with(normalize-space(), '|'))])"/>
<variable name="text">
<for-each select="$linespans">
- <value-of select="normalize-space()"/>
+ <choose>
+ <when test="$preformatted">
+ <value-of select="substring-after(., '|')"/>
+ </when>
+ <otherwise>
+ <value-of select="normalize-space()"/>
+ </otherwise>
+ </choose>
<if test="position()!=count($linespans)">
- <text> </text>
+ <choose>
+ <when test="$preformatted">
+ <text>
</text>
+ </when>
+ <otherwise>
+ <text> </text>
+ </otherwise>
+ </choose>
</if>
</for-each>
</variable>
<if test="string($text)!=''">
<variable name="par">
<choose>
+ <when test="$preformatted">
+ <html:pre>
+ <call-template name="LesML:id-and-contents">
+ <with-param name="source" select="$text"/>
+ </call-template>
+ </html:pre>
+ </when>
<when test="starts-with($text, '⁌') and &sigiled-text;">
<html:h1>
<call-template name="LesML:id-and-contents">
</copy>
</template>
<template match="text()" mode="LesML:finalize-tree">
- <call-template name="LesML:unescape">
+ <call-template name="LesML:break-and-unescape">
<with-param name="source" select="string(.)"/>
</call-template>
</template>