]> Lady’s Gitweb - LesML/commitdiff
Support attributes inside of links current 0.5.2
authorLady <redacted>
Wed, 17 Sep 2025 02:57:28 +0000 (22:57 -0400)
committerLady <redacted>
Wed, 17 Sep 2025 02:57:28 +0000 (22:57 -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 01889ded6a738c5b548883d72e69444ea8ccfe8f..bcc8a23d4dbaaa662ef8bb329d7a387c06b46123 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.172251 seconds and 4 git commands to generate.