From: Lady <redacted> Date: Mon, 28 Apr 2025 01:55:06 +0000 (-0400) Subject: Support hgroups with heading continuations X-Git-Tag: 0.5.0^0 X-Git-Url: https://git.ladys.computer/LesML/commitdiff_plain/refs/heads/current Support hgroups with heading continuations These are a bit interesting because continuation paragraphs can be placed _before_ the heading they “continue” (not just after). A block comment can be used to separate them from a preceding list or similar. --- diff --git a/README.markdown b/README.markdown index 1643af2..ac2d0dc 100644 --- a/README.markdown +++ b/README.markdown @@ -173,10 +173,12 @@ After this classification, each ordinary paragraph is further Comments produce X·M·L comment nodes and can be used to break up list items into separate lists. -- If the paragraph begins with `⋯`, it is a continuation paragraph - (`<html:div class="continuation">`). +- If the paragraph begins with `⋯`, it is a continuation paragraph. Continuation paragraphs may be used to continue a preceding div or list item. + If there is no such preceding div or list item, they will attach to + adjacent heading elements to form heading groups (`<html:hgroup>`). + Otherwise, they will be treated as ordinary paragraphs. - Otherwise, it is an ordinary paragraph. diff --git a/parser.xslt b/parser.xslt index 99ee743..5ba2248 100644 --- a/parser.xslt +++ b/parser.xslt @@ -705,9 +705,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </when> <when test="starts-with($text, '⋯') and &sigiled-text;"> <element name="div" namespace="&xhtml;"> - <attribute name="class"> - <text>continuation</text> - </attribute> + <processing-instruction name="LesML-Continuation"/> <element name="p" namespace="&xhtml;"> <call-template name="LesML:id-and-contents"> <with-param name="source" select="&unsigiled-text;"/> @@ -783,18 +781,60 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </element> </template> <template match="html:div" mode="LesML:finalize-tree"> - <if test="not(@class='continuation') or not(preceding-sibling::node()) or preceding-sibling::node()[position()=1 and not(self::html:div or self::html:li)]"> - <variable name="notcontinuation" select="following-sibling::node()[not(self::html:div and @class='continuation')][1]"/> - <copy> - <apply-templates select="@*|node()" mode="LesML:finalize-tree"/> - <for-each select="exslset:leading(following-sibling::node(), $notcontinuation)"> + <if test="not(processing-instruction()[local-name()='LesML-Continuation']) or not(preceding-sibling::node()[position()=1 and self::html:* and contains(' div li h1 h2 h3 h4 h5 h6 ', local-name())])"> + <variable name="notcontinuation" select="following-sibling::node()[not(self::html:div/processing-instruction()[local-name()='LesML-Continuation'])][1]"/> + <choose> + <when test="processing-instruction()[local-name()='LesML-Continuation'] and $notcontinuation[self::html:* and contains(' h1 h2 h3 h4 h5 h6 ', local-name())]"> + <variable name="notcontinuation2" select="$notcontinuation/following-sibling::node()[not(self::html:div/processing-instruction()[local-name()='LesML-Continuation'])][1]"/> + <element name="hgroup" namespace="&xhtml;"> + <apply-templates select="node()" mode="LesML:finalize-tree"/> + <for-each select="exslset:leading(following-sibling::node(), $notcontinuation2)"> + <choose> + <when test="self::html:div"> + <apply-templates select="node()" mode="LesML:finalize-tree"/> + </when> + <otherwise> + <copy> + <apply-templates select="@*|node()" mode="LesML:finalize-tree"/> + </copy> + </otherwise> + </choose> + </for-each> + </element> + </when> + <otherwise> <apply-templates select="node()" mode="LesML:finalize-tree"/> - </for-each> - </copy> + <for-each select="exslset:leading(following-sibling::node(), $notcontinuation)"> + <apply-templates select="node()" mode="LesML:finalize-tree"/> + </for-each> + </otherwise> + </choose> + </if> + </template> + <template match="html:h1|html:h2|html:h3|html:h4|html:h5|html:h6" mode="LesML:finalize-tree"> + <if test="not(preceding-sibling::node()[position()=1 and self::html:div/processing-instruction()[local-name()='LesML-Continuation']]) or preceding-sibling::node()[not(self::html:div/processing-instruction()[local-name()='LesML-Continuation'])][position()=1 and self::html:* and contains(' h1 h2 h3 h4 h5 h6 ', local-name())]"> + <choose> + <when test="following-sibling::node()[position()=1 and self::html:div]/processing-instruction()[local-name()='LesML-Continuation']"> + <variable name="notcontinuation" select="following-sibling::node()[not(self::html:div/processing-instruction()[local-name()='LesML-Continuation'])][1]"/> + <element name="hgroup" namespace="&xhtml;"> + <copy> + <apply-templates select="@*|node()" mode="LesML:finalize-tree"/> + </copy> + <for-each select="exslset:leading(following-sibling::node(), $notcontinuation)"> + <apply-templates select="node()" mode="LesML:finalize-tree"/> + </for-each> + </element> + </when> + <otherwise> + <copy> + <apply-templates select="@*|node()" mode="LesML:finalize-tree"/> + </copy> + </otherwise> + </choose> </if> </template> <template match="html:li" mode="LesML:finalize-tree"> - <if test="not(preceding-sibling::node()) or preceding-sibling::node()[not(preceding-sibling::* and self::html:div and @class='continuation')][position()=1 and not(self::html:li)]"> + <if test="not(preceding-sibling::node()) or preceding-sibling::node()[not(preceding-sibling::* and self::html:div/processing-instruction()[local-name()='LesML-Continuation'])][position()=1 and not(self::html:li)]"> <apply-templates select="." mode="LesML:finalize-list"/> </if> </template> @@ -812,10 +852,10 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </otherwise> </choose> </variable> - <variable name="notinlist" select="following-sibling::node()[not(self::html:div and @class='continuation' or self::html:li and (@data-level>$current-level or @data-level=$current-level and @class=$current-class))][1]"/> + <variable name="notinlist" select="following-sibling::node()[not(self::html:div/processing-instruction()[local-name()='LesML-Continuation'] or self::html:li and (@data-level>$current-level or @data-level=$current-level and @class=$current-class))][1]"/> <element name="{$wrapper}" namespace="&xhtml;"> <for-each select=".|exslset:leading(following-sibling::node(), $notinlist)[self::html:li and @data-level=$current-level]"> - <variable name="notcontinuation" select="following-sibling::node()[not(self::html:div and @class='continuation')][1]"/> + <variable name="notcontinuation" select="following-sibling::node()[not(self::html:div/processing-instruction()[local-name()='LesML-Continuation'])][1]"/> <copy> <apply-templates select="@*|node()" mode="LesML:finalize-tree"/> <for-each select="exslset:leading(following-sibling::node(), $notcontinuation)"> @@ -835,6 +875,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </apply-templates> </if> </template> + <template match="processing-instruction()[local-name()='LesML-Continuation']" mode="LesML:finalize-tree"/> <template match="processing-instruction()[local-name()='LesML-Token-Escape']" mode="LesML:finalize-tree"> <value-of select="."/> </template>