]> Lady’s Gitweb - LesML/commitdiff
Support attributes inside of links 0.5.2
authorLady <redacted>
Wed, 17 Sep 2025 02:57:28 +0000 (22:57 -0400)
committerLady <redacted>
Tue, 31 Mar 2026 02:08:09 +0000 (22:08 -0400)
This commit changes the partitioning behaviour to allow for element
  nodes within the first part, assuming that the first part is not
  being restricted to an n·c·name.
This is required to enable attribute specifiers inside of the text of
  links.
Element nodes are still not allowed in the second part of the
  partition (the link target or attribute value).

parser.xslt

index 2ba0fd184c3235939da218cd373240880fb9737f75a1dabafe56cbe4f9a6081d..d9b2986eacaca5aa67b52d4fc6ab0bb4c25e26c09d764b4c5b26a4a0eae4beb6 100644 (file)
@@ -1056,42 +1056,73 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
                <param name="separator"/>
                <param name="ncname-keys" select="false()"/>
                <variable name="end-node" select="text()[contains(., $end-sigil)][1]"/>
-               <variable name="has-start-node" select="$end-node/preceding-sibling::text()[contains(., $start-sigil) and not(following-sibling::* or following-sibling::comment())] or string-length(substring-after($end-node, $start-sigil))>string-length(substring-after($end-node, $end-sigil))"/>
+               <variable name="has-start-node" select="$end-node/preceding-sibling::text()[contains(., $start-sigil)] or string-length(substring-after($end-node, $start-sigil))>string-length(substring-after($end-node, $end-sigil))"/>
                <choose>
                        <when test="$end-node and $has-start-node">
-                               <variable name="preceding">
+                               <variable name="preceding-fragment">
                                        <copy-of select="$end-node/preceding-sibling::node()"/>
                                        <value-of select="substring-before($end-node, $end-sigil)"/>
                                </variable>
-                               <variable name="start-node" select="exsl:node-set($preceding)/text()[contains(., $start-sigil) and not(following-sibling::*)][last()]"/>
+                               <variable name="preceding" select="exsl:node-set($preceding-fragment)/node()"/>
+                               <variable name="start-node" select="($preceding[self::text() and contains(., $start-sigil)])[last()][not($ncname-keys) or not(following-sibling::* or following-sibling::comment())]"/>
                                <variable name="start-tokens-fragment">
-                                       <call-template name="LesML:split">
-                                               <with-param name="source" select="string($start-node)"/>
-                                               <with-param name="separator" select="$start-sigil"/>
-                                       </call-template>
+                                       <if test="$start-node">
+                                               <call-template name="LesML:split">
+                                                       <with-param name="source" select="string($start-node)"/>
+                                                       <with-param name="separator" select="$start-sigil"/>
+                                               </call-template>
+                                       </if>
                                </variable>
                                <variable name="start-tokens" select="exsl:node-set($start-tokens-fragment)/*"/>
-                               <variable name="innards">
+                               <variable name="innards-fragment">
                                        <value-of select="$start-tokens[last()]"/>
-                                       <for-each select="$start-node/following-sibling::node()">
-                                               <value-of select="."/>
-                                       </for-each>
+                                       <copy-of select="$start-node/following-sibling::node()"/>
                                </variable>
+                               <variable name="innards" select="exsl:node-set($innards-fragment)/node()"/>
+                               <variable name="separator-node" select="($innards[self::text() and contains(., $separator)])[not($ncname-keys)*(last()-1)+1]"/>
                                <choose>
-                                       <when test="contains($innards, $separator)">
+                                       <when test="not($start-node) or $separator-node[following-sibling::* or following-sibling::comment()]">
+                                               <variable name="bad-start-node" select="($preceding[self::text() and contains(., $start-sigil)])[last()]"/>
+                                               <variable name="bad-start-tokens-fragment">
+                                                       <call-template name="LesML:split">
+                                                               <with-param name="source" select="string($bad-start-node)"/>
+                                                               <with-param name="separator" select="$start-sigil"/>
+                                                       </call-template>
+                                               </variable>
+                                               <element name="span" namespace="&xhtml;">
+                                                       <copy-of select="$bad-start-node/preceding-sibling::node()"/>
+                                                       <for-each select="exsl:node-set($bad-start-tokens-fragment)/*">
+                                                               <value-of select="."/>
+                                                               <if test="position()!=last()">
+                                                                       <processing-instruction name="LesML-Token-Escape">
+                                                                               <value-of select="$start-sigil"/>
+                                                                       </processing-instruction>
+                                                               </if>
+                                                       </for-each>
+                                                       <copy-of select="$bad-start-node/following-sibling::node()"/>
+                                                       <value-of select="$end-sigil"/>
+                                                       <value-of select="substring-after($end-node, $end-sigil)"/>
+                                                       <copy-of select="$end-node/following-sibling::node()"/>
+                                               </element>
+                                       </when>
+                                       <when test="$separator-node">
                                                <variable name="keyval-fragment">
                                                        <call-template name="LesML:split">
-                                                               <with-param name="source" select="$innards"/>
+                                                               <with-param name="source" select="$separator-node"/>
                                                                <with-param name="separator" select="$separator"/>
                                                        </call-template>
                                                </variable>
                                                <variable name="keyval" select="exsl:node-set($keyval-fragment)/*"/>
-                                               <variable name="key">
+                                               <variable name="key-fragment">
                                                        <choose>
                                                                <when test="$ncname-keys">
+                                                                       <for-each select="$separator-node/preceding-sibling::node()">
+                                                                               <value-of select="."/>
+                                                                       </for-each>
                                                                        <value-of select="$keyval[1]"/>
                                                                </when>
                                                                <otherwise>
+                                                                       <copy-of select="$separator-node/preceding-sibling::node()"/>
                                                                        <for-each select="$keyval[position()!=last()]">
                                                                                <value-of select="."/>
                                                                                <if test="position()!=last()">
@@ -1115,9 +1146,12 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
                                                                        <value-of select="$keyval[last()]"/>
                                                                </otherwise>
                                                        </choose>
+                                                       <for-each select="$separator-node/following-sibling::node()">
+                                                               <value-of select="."/>
+                                                       </for-each>
                                                </variable>
                                                <choose>
-                                                       <when test="not($ncname-keys) or /self::node()[translate(normalize-space($key), ' /([,*', '')=string($key) and exsldyn:evaluate(concat('not(self::html:', $key, ')'))]">
+                                                       <when test="not($ncname-keys) or /self::node()[translate(normalize-space($key-fragment), ' /([,*', '')=$key-fragment and exsldyn:evaluate(concat('not(self::html:', $key-fragment, ')'))]">
                                                                <element name="span" namespace="&xhtml;">
                                                                        <copy-of select="$start-node/preceding-sibling::node()"/>
                                                                        <for-each select="$start-tokens[position()!=last()]">
@@ -1128,7 +1162,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
                                                                        </for-each>
                                                                </element>
                                                                <element name="span" namespace="&xhtml;">
-                                                                       <value-of select="$key"/>
+                                                                       <copy-of select="$key-fragment"/>
                                                                </element>
                                                                <element name="span" namespace="&xhtml;">
                                                                        <value-of select="$value"/>
@@ -1172,7 +1206,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
                                                                <value-of select="$start-sigil"/>
                                                        </processing-instruction>
                                                        <value-of select="$start-tokens[last()]"/>
-                                                       <value-of select="$start-node/following-sibling::node()"/>
+                                                       <copy-of select="$start-node/following-sibling::node()"/>
                                                        <value-of select="$end-sigil"/>
                                                        <value-of select="substring-after($end-node, $end-sigil)"/>
                                                        <copy-of select="$end-node/following-sibling::node()"/>
@@ -1278,11 +1312,11 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
                                                                                </attribute>
                                                                                <processing-instruction name="LesML-All-Done"/>
                                                                                <choose>
-                                                                                       <when test="string($partitioned[2])=''">
+                                                                                       <when test="not($partitioned[2]/node())">
                                                                                                <value-of select="$partitioned[3]"/>
                                                                                        </when>
                                                                                        <otherwise>
-                                                                                               <value-of select="$partitioned[2]"/>
+                                                                                               <copy-of select="$partitioned[2]/node()"/>
                                                                                        </otherwise>
                                                                                </choose>
                                                                        </element>
This page took 0.271902 seconds and 4 git commands to generate.