X-Git-Url: https://git.ladys.computer/LesML/blobdiff_plain/36d58e6ef941e53b6da13b83b0d73f1d95a3dffc..e50e25b85b0c333d21c518043eca0b50f21e1b39:/parser.xslt diff --git a/parser.xslt b/parser.xslt index 227e285..186e389 100644 --- a/parser.xslt +++ b/parser.xslt @@ -12,21 +12,23 @@ This Source Code Form is subject to the terms of the Mozilla Public License, v 2 If a copy of the M·P·L was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0/>. --> <!DOCTYPE transform [ + <!ENTITY LesML "urn:fdc:ladys.computer:20240512:LesML"> <!ENTITY section-break "*-.=_~·․‥…⁂⋯─━┄┅┈┉╌╍═╴╶╸╺☙❧ ・*-.=_~"> - <!ENTITY sigiled-text "(string-length($text)=1 or substring($text, 2, 1)=' ')"> - <!ENTITY unsigiled-text "substring($text, 3, string-length($text)-2)"> + <!ENTITY sigiled-text "(string-length($text)=1 or substring($text, 2, 1)=' ' or substring($text, 2, 1)='¶')"> + <!ENTITY unsigiled-text "concat(translate(substring($text, 2, 1), ' ', ''), substring($text, 3, string-length($text)-2))"> <!ENTITY xhtml "http://www.w3.org/1999/xhtml"> ]> <transform xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:LesML="urn:fdc:ladys.computer:20240512:LesML" xmlns:exsl="http://exslt.org/common" + xmlns:exsldyn="http://exslt.org/dynamic" xmlns:exslset="http://exslt.org/sets" xmlns:exslstr="http://exslt.org/strings" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4" exclude-result-prefixes="LesML" - extension-element-prefixes="exsl exslstr" + extension-element-prefixes="exsl exsldyn exslset exslstr" version="1.0" > <书社:id>urn:fdc:ladys.computer:20240512:LesML:parser.xslt</书社:id> @@ -119,31 +121,96 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </otherwise> </choose> </template> + <template name="LesML:comment-out"> + <param name="source"/> + <variable name="comment-split-fragment"> + <call-template name="LesML:split"> + <with-param name="source" select="$source"/> + <with-param name="separator" select="'--'"/> + </call-template> + </variable> + <comment> + <for-each select="exsl:node-set($comment-split-fragment)/*"> + <if test="string()='' or starts-with(., '‐')"> + <text>͏</text> + </if> + <value-of select="."/> + <if test="substring(., string-length(.), 1)='‐'"> + <text>͏</text> + </if> + <choose> + <when test="position()!=last()"> + <text>-͏-</text> + </when> + </choose> + </for-each> + </comment> + </template> <template name="LesML:id-and-contents"> <param name="source"/> - <choose> - <when test="starts-with($source, '¶')"> + <variable name="id-and-lang"> + <if test="starts-with($source, '¶')"> <choose> <when test="contains($source, ' ')"> - <variable name="id" select="substring-before(substring-after($source, '¶'), ' ')"/> - <if test="$id!=''"> - <attribute name="id"> - <value-of select="$id"/> - </attribute> - </if> - <value-of select="substring-after($source, ' ')"/> + <value-of select="substring-before(substring-after($source, '¶'), ' ')"/> </when> <otherwise> - <attribute name="id"> - <value-of select="substring-after($source, '¶')"/> - </attribute> + <value-of select="substring-after($source, '¶')"/> </otherwise> </choose> - </when> - <otherwise> - <value-of select="$source"/> - </otherwise> - </choose> + </if> + </variable> + <variable name="restoftext"> + <choose> + <when test="starts-with($source, '¶') and contains($source, ' ')"> + <value-of select="substring-after($source, ' ')"/> + </when> + <when test="starts-with($source, '¶')"/> + <otherwise> + <value-of select="$source"/> + </otherwise> + </choose> + </variable> + <variable name="maybe-langtag"> + <if test="substring($id-and-lang, string-length($id-and-lang), 1)='$' and contains($id-and-lang, '@')"> + <variable name="split-tag-fragment"> + <call-template name="LesML:split"> + <with-param name="source" select="substring($id-and-lang, 2, string-length($id-and-lang)-2)"/> + <with-param name="separator" select="'@'"/> + </call-template> + </variable> + <value-of select="exsl:node-set($split-tag-fragment)/*[last()]"/> + </if> + </variable> + <variable name="langtag"> + <if test="translate($maybe-langtag, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-', '')=''"> + <value-of select="$maybe-langtag"/> + </if> + </variable> + <variable name="id"> + <choose> + <when test="string($langtag)!=''"> + <value-of select="substring($id-and-lang, 1, string-length($id-and-lang)-(string-length($langtag)+2))"/> + </when> + <otherwise> + <value-of select="$id-and-lang"/> + </otherwise> + </choose> + </variable> + <if test="string($id)!=''"> + <attribute name="id"> + <value-of select="$id"/> + </attribute> + </if> + <if test="string($langtag)!=''"> + <attribute name="lang"> + <value-of select="$langtag"/> + </attribute> + <attribute name="xml:lang"> + <value-of select="$langtag"/> + </attribute> + </if> + <value-of select="$restoftext"/> </template> <template name="LesML:parse"> <param name="lines" select="/.."/> @@ -215,9 +282,9 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <variable name="docsep" select="$noshebang[starts-with(., '#!lesml') or starts-with(., '##')][1]"/> <variable name="doclines" select="exslset:leading($noshebang, $docsep)"/> <if test="starts-with($first-line, '##') and $first-line!='##'"> - <comment> - <value-of select="substring-after($first-line, '##')"/> - </comment> + <call-template name="LesML:comment-out"> + <with-param name="source" select="substring-after($first-line, '##')"/> + </call-template> </if> <if test="$doclines[normalize-space()!='']"> <variable name="record-separators" select="$doclines[starts-with(., '%%')]"/> @@ -293,9 +360,9 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </element> </if> <if test=".!='%%'"> - <comment> - <value-of select="substring-after(., '%%')"/> - </comment> + <call-template name="LesML:comment-out"> + <with-param name="source" select="substring-after(., '%%')"/> + </call-template> </if> </for-each> </element> @@ -595,9 +662,9 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </element> </when> <when test="starts-with($text, '#') and &sigiled-text;"> - <comment> - <value-of select="&unsigiled-text;"/> - </comment> + <call-template name="LesML:comment-out"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </when> <otherwise> <element name="p" namespace="&xhtml;"> @@ -625,7 +692,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </for-each> </variable> <variable name="inlined"> - <apply-templates select="exsl:node-set($blocked)/node()" mode="LesML:linkify"/> + <apply-templates select="exsl:node-set($blocked)/node()" mode="LesML:comment"/> </variable> <apply-templates select="exsl:node-set($inlined)/node()" mode="LesML:finalize-tree"/> </template> @@ -645,6 +712,28 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </call-template> </element> </template> + <template match="node()" mode="LesML:finalize-attributes"> + <variable name="notattr" select="following-sibling::node()[not(self::text() and translate(., ' 	', '')='' or self::LesML:attribute)]"/> + <for-each select="(.|exslset:leading(following-sibling::node(), $notattr)[self::LesML:attribute])/@*"> + <copy-of select="."/> + <if test="local-name()='lang' and namespace-uri()=''"> + <attribute name="xml:lang"> + <value-of select="."/> + </attribute> + </if> + </for-each> + </template> + <template match="LesML:attribute[preceding-sibling::node()[position()=1 and (self::text() or self::*)]]|text()[preceding-sibling::node()[position()=1 and self::*] and following-sibling::node()[position()=1 and self::LesML:attribute] and translate(., ' 	', '')='']" mode="LesML:finalize-tree" priority="2"/> + <template match="LesML:attribute|text()[following-sibling::node()[position()=1 and self::LesML:attribute]]" mode="LesML:finalize-tree" priority="1"> + <element name="span" namespace="&xhtml;"> + <apply-templates select="." mode="LesML:finalize-attributes"/> + <if test="self::text()"> + <call-template name="LesML:break-and-unescape"> + <with-param name="source" select="string(.)"/> + </call-template> + </if> + </element> + </template> <template match="html:blockquote" mode="LesML:finalize-tree"> <if test="not(preceding-sibling::node()) or preceding-sibling::node()[position()=1 and not(self::html:blockquote)]"> <variable name="notquote" select="following-sibling::node()[not(self::html:blockquote)][1]"/> @@ -737,8 +826,8 @@ 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-Link-Escape']" mode="LesML:finalize-tree"> - <text>🔗</text> + <template match="processing-instruction()[local-name()='LesML-Token-Escape']" mode="LesML:finalize-tree"> + <value-of select="."/> </template> <template match="text()" mode="LesML:finalize-tree"> <call-template name="LesML:break-and-unescape"> @@ -747,16 +836,89 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </template> <template match="@*|node()" mode="LesML:finalize-tree" priority="-1"> <copy> - <apply-templates select="@*|node()" mode="LesML:finalize-tree"/> + <apply-templates select="." mode="LesML:finalize-attributes"/> + <apply-templates select="node()" mode="LesML:finalize-tree"/> </copy> </template> + <template match="node()" mode="LesML:comment"> + <variable name="result"> + <choose> + <when test="self::*"> + <variable name="start-node" select="text()[contains(., '⌦')][1]"/> + <variable name="after-start"> + <if test="$start-node"> + <value-of select="substring-after($start-node, '⌦')"/> + </if> + </variable> + <variable name="has-end-node" select="contains($after-start, '⌫') or $start-node/following-sibling::text()[contains(., '⌫')]"/> + <choose> + <when test="$start-node and $has-end-node"> + <variable name="following"> + <value-of select="$after-start"/> + <copy-of select="$start-node/following-sibling::node()"/> + </variable> + <variable name="end-node" select="exsl:node-set($following)/text()[contains(., '⌫')][last()]"/> + <variable name="comment"> + <for-each select="$end-node/preceding-sibling::node()"> + <value-of select="."/> + </for-each> + <value-of select="substring-before($end-node, '⌫')"/> + </variable> + <variable name="rest-fragment"> + <element name="span" namespace="&xhtml;"> + <value-of select="substring-after($end-node, '⌫')"/> + <copy-of select="$end-node/following-sibling::node()"/> + </element> + </variable> + <variable name="commented-rest-fragment"> + <apply-templates select="exsl:node-set($rest-fragment)/node()" mode="LesML:comment"/> + </variable> + <copy> + <copy-of select="@*"/> + <copy-of select="$start-node/preceding-sibling::node()"/> + <copy-of select="substring-before($start-node, '⌦')"/> + <call-template name="LesML:comment-out"> + <with-param name="source" select="string($comment)"/> + </call-template> + <copy-of select="exsl:node-set($commented-rest-fragment)/*/node()"/> + </copy> + </when> + <otherwise> + <copy> + <copy-of select="@*"/> + <apply-templates select="node()" mode="LesML:comment"/> + </copy> + </otherwise> + </choose> + </when> + <when test="self::text()[contains(., '⌧')]"> + <variable name="split-fragment"> + <call-template name="LesML:split"> + <with-param name="source" select="string()"/> + <with-param name="separator" select="'⌧'"/> + </call-template> + </variable> + <for-each select="exsl:node-set($split-fragment)/node()"> + <value-of select="."/> + <if test="position()!=last()"> + <call-template name="LesML:comment-out"/> + </if> + </for-each> + </when> + <otherwise> + <copy-of select="."/> + </otherwise> + </choose> + </variable> + <apply-templates select="exsl:node-set($result)/node()" mode="LesML:attrify"/> + </template> <template match="node()" mode="LesML:inline"> <param name="element-name"/> <param name="element-namespace" select="'http://www.w3.org/1999/xhtml'"/> <param name="start-sigil"/> <param name="end-sigil"/> + <param name="class"/> <param name="role"/> - <param name="langtag-supported" select="false()"/> <choose> <when test="self::*"> <variable name="end-node" select="text()[contains(., $end-sigil)][1]"/> @@ -768,17 +930,6 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <value-of select="substring-before($end-node, $end-sigil)"/> </variable> <variable name="start-node" select="exsl:node-set($preceding)/text()[contains(., $start-sigil)][last()]"/> - <variable name="restoftext" select="substring-after($end-node, $end-sigil)"/> - <variable name="maybe-langtag"> - <if test="$langtag-supported and starts-with($restoftext, '@') and contains($restoftext, '$')"> - <value-of select="substring-before(substring-after($restoftext, '@'), '$')"/> - </if> - </variable> - <variable name="langtag"> - <if test="translate($maybe-langtag, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-', '')=''"> - <value-of select="$maybe-langtag"/> - </if> - </variable> <variable name="start-tokens-fragment"> <call-template name="LesML:split"> <with-param name="source" select="string($start-node)"/> @@ -802,27 +953,15 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <value-of select="$role"/> </attribute> </if> - <if test="string($langtag)!=''"> - <if test="$element-namespace='http://www.w3.org/1999/xhtml'"> - <attribute name="lang"> - <value-of select="$langtag"/> - </attribute> - </if> - <attribute name="xml:lang"> - <value-of select="$langtag"/> + <if test="string($class)!=''"> + <attribute name="class"> + <value-of select="$class"/> </attribute> </if> <value-of select="$start-tokens[last()]"/> <copy-of select="$start-node/following-sibling::node()"/> </element> - <choose> - <when test="string($langtag)!=''"> - <value-of select="substring-after($restoftext, '$')"/> - </when> - <otherwise> - <value-of select="$restoftext"/> - </otherwise> - </choose> + <value-of select="substring-after($end-node, $end-sigil)"/> <copy-of select="$end-node/following-sibling::node()"/> </copy> </variable> @@ -832,7 +971,6 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <with-param name="start-sigil" select="$start-sigil"/> <with-param name="end-sigil" select="$end-sigil"/> <with-param name="role" select="$role"/> - <with-param name="langtag-supported" select="$langtag-supported"/> </apply-templates> </when> <otherwise> @@ -844,7 +982,6 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <with-param name="start-sigil" select="$start-sigil"/> <with-param name="end-sigil" select="$end-sigil"/> <with-param name="role" select="$role"/> - <with-param name="langtag-supported" select="$langtag-supported"/> </apply-templates> </copy> </otherwise> @@ -855,110 +992,261 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </otherwise> </choose> </template> - <template match="node()" mode="LesML:linkify"> + <template match="*" mode="LesML:partition"> + <param name="start-sigil"/> + <param name="end-sigil"/> + <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))"/> + <choose> + <when test="$end-node and $has-start-node"> + <variable name="preceding"> + <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="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> + </variable> + <variable name="start-tokens" select="exsl:node-set($start-tokens-fragment)/*"/> + <variable name="innards"> + <value-of select="$start-tokens[last()]"/> + <for-each select="$start-node/following-sibling::node()"> + <value-of select="."/> + </for-each> + </variable> + <choose> + <when test="contains($innards, $separator)"> + <variable name="keyval-fragment"> + <call-template name="LesML:split"> + <with-param name="source" select="$innards"/> + <with-param name="separator" select="$separator"/> + </call-template> + </variable> + <variable name="keyval" select="exsl:node-set($keyval-fragment)/*"/> + <variable name="key"> + <choose> + <when test="$ncname-keys"> + <value-of select="$keyval[1]"/> + </when> + <otherwise> + <for-each select="$keyval[position()!=last()]"> + <value-of select="."/> + <if test="position()!=last()"> + <value-of select="$separator"/> + </if> + </for-each> + </otherwise> + </choose> + </variable> + <variable name="value"> + <choose> + <when test="$ncname-keys"> + <for-each select="$keyval[position()!=1]"> + <value-of select="."/> + <if test="position()!=last()"> + <value-of select="$separator"/> + </if> + </for-each> + </when> + <otherwise> + <value-of select="$keyval[last()]"/> + </otherwise> + </choose> + </variable> + <choose> + <when test="not($ncname-keys) or /self::node()[translate(normalize-space($key), ' /([,*', '')=string($key) and exsldyn:evaluate(concat('not(self::html:', $key, ')'))]"> + <element name="span" namespace="&xhtml;"> + <copy-of select="$start-node/preceding-sibling::node()"/> + <for-each select="$start-tokens[position()!=last()]"> + <value-of select="."/> + <if test="position()!=last()"> + <value-of select="$start-sigil"/> + </if> + </for-each> + </element> + <element name="span" namespace="&xhtml;"> + <value-of select="$key"/> + </element> + <element name="span" namespace="&xhtml;"> + <value-of select="$value"/> + </element> + <element name="span" namespace="&xhtml;"> + <value-of select="substring-after($end-node, $end-sigil)"/> + <copy-of select="$end-node/following-sibling::node()"/> + </element> + </when> + <otherwise> + <element name="span" namespace="&xhtml;"> + <copy-of select="$start-node/preceding-sibling::node()"/> + <for-each select="$start-tokens[position()!=last()]"> + <value-of select="."/> + <if test="position()!=last()"> + <value-of select="$start-sigil"/> + </if> + </for-each> + <processing-instruction name="LesML-Token-Escape"> + <value-of select="$start-sigil"/> + </processing-instruction> + <value-of select="$start-tokens[last()]"/> + <value-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()"/> + </element> + </otherwise> + </choose> + </when> + <otherwise> + <element name="span" namespace="&xhtml;"> + <copy-of select="$start-node/preceding-sibling::node()"/> + <for-each select="$start-tokens[position()!=last()]"> + <value-of select="."/> + <if test="position()!=last()"> + <value-of select="$start-sigil"/> + </if> + </for-each> + <processing-instruction name="LesML-Token-Escape"> + <value-of select="$start-sigil"/> + </processing-instruction> + <value-of select="$start-tokens[last()]"/> + <value-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()"/> + </element> + </otherwise> + </choose> + </when> + <when test="$end-node"> + <element name="span" namespace="&xhtml;"> + <copy-of select="$end-node/preceding-sibling::node()"/> + <value-of select="substring-before($end-node, $end-sigil)"/> + <processing-instruction name="LesML-Token-Escape"> + <value-of select="$end-sigil"/> + </processing-instruction> + <value-of select="substring-after($end-node, $end-sigil)"/> + <copy-of select="$end-node/following-sibling::node()"/> + </element> + </when> + <otherwise> + <processing-instruction name="LesML-All-Done"/> + </otherwise> + </choose> + </template> + <template match="node()" mode="LesML:attrify"> <variable name="result"> <choose> <when test="self::*"> - <variable name="end-node" select="text()[contains(., '>}')][1]"/> - <variable name="has-start-node" select="$end-node/preceding-sibling::text()[contains(., '{🔗') and not(following-sibling::*)] or string-length(substring-after($end-node, '{🔗'))>string-length(substring-after($end-node, '>}'))"/> + <variable name="partitioned-fragment"> + <apply-templates mode="LesML:partition" select="."> + <with-param name="start-sigil" select="'{@'"/> + <with-param name="end-sigil" select="'"}'"/> + <with-param name="separator" select="'="'"/> + <with-param name="ncname-keys" select="true()"/> + </apply-templates> + </variable> + <variable name="partitioned" select="exsl:node-set($partitioned-fragment)/node()"/> <choose> - <when test="$end-node and $has-start-node"> - <variable name="preceding"> - <copy-of select="$end-node/preceding-sibling::node()"/> - <value-of select="substring-before($end-node, '>}')"/> + <when test="count($partitioned)>1"> + <variable name="processed"> + <copy> + <copy-of select="@*"/> + <copy-of select="$partitioned[1]/node()"/> + <element name="LesML:attribute" namespace="&LesML;"> + <attribute name="{$partitioned[2]}"> + <value-of select="$partitioned[3]"/> + </attribute> + </element> + <copy-of select="$partitioned[4]/node()"/> + </copy> </variable> - <variable name="start-node" select="exsl:node-set($preceding)/text()[contains(., '{🔗') and not(following-sibling::*)][last()]"/> - <variable name="start-tokens-fragment"> - <call-template name="LesML:split"> - <with-param name="source" select="string($start-node)"/> - <with-param name="separator" select="'{🔗'"/> - </call-template> + <apply-templates select="exsl:node-set($processed)/node()" mode="LesML:attrify"/> + </when> + <when test="$partitioned[self::processing-instruction() and local-name()='LesML-All-Done']"> + <copy> + <copy-of select="@*"/> + <apply-templates select="node()" mode="LesML:attrify"/> + </copy> + </when> + <otherwise> + <variable name="processed"> + <copy> + <copy-of select="@*"/> + <copy-of select="$partitioned/node()"/> + </copy> </variable> - <variable name="start-tokens" select="exsl:node-set($start-tokens-fragment)/*"/> - <variable name="hyperlink"> - <value-of select="$start-tokens[last()]"/> - <for-each select="$start-node/following-sibling::node()"> - <choose> - <when test="self::text()"> - <value-of select="."/> - </when> - <when test="self::processing-instruction()[local-name()='LesML-Link-Escape']"> - <text>🔗</text> - </when> - </choose> - </for-each> + <apply-templates select="exsl:node-set($processed)/node()" mode="LesML:attrify"/> + </otherwise> + </choose> + </when> + <otherwise> + <copy-of select="."/> + </otherwise> + </choose> + </variable> + <apply-templates select="exsl:node-set($result)/node()" mode="LesML:linkify"/> + </template> + <template match="node()" mode="LesML:linkify"> + <variable name="result"> + <choose> + <when test="processing-instruction()[local-name()='LesML-All-Done']"> + <copy> + <copy-of select="@*|node()[not(self::processing-instruction() and local-name()='LesML-All-Done')]"/> + </copy> + </when> + <when test="self::*"> + <variable name="partitioned-fragment"> + <apply-templates mode="LesML:partition" select="."> + <with-param name="start-sigil" select="'{🔗'"/> + <with-param name="end-sigil" select="'>}'"/> + <with-param name="separator" select="'<'"/> + </apply-templates> + </variable> + <variable name="partitioned" select="exsl:node-set($partitioned-fragment)/node()"/> + <choose> + <when test="count($partitioned)>1"> + <variable name="processed"> + <copy> + <copy-of select="@*"/> + <copy-of select="$partitioned[1]/node()"/> + <element name="a" namespace="&xhtml;"> + <attribute name="href"> + <value-of select="$partitioned[3]"/> + </attribute> + <processing-instruction name="LesML-All-Done"/> + <choose> + <when test="string($partitioned[2])=''"> + <value-of select="$partitioned[3]"/> + </when> + <otherwise> + <value-of select="$partitioned[2]"/> + </otherwise> + </choose> + </element> + <copy-of select="$partitioned[4]/node()"/> + </copy> </variable> - <choose> - <when test="contains($hyperlink, '<')"> - <variable name="ltcomponents-fragment"> - <call-template name="LesML:split"> - <with-param name="source" select="$hyperlink"/> - <with-param name="separator" select="'<'"/> - </call-template> - </variable> - <variable name="ltcomponents" select="exsl:node-set($ltcomponents-fragment)/*"/> - <variable name="wrapped"> - <copy> - <copy-of select="@*"/> - <copy-of select="$start-node/preceding-sibling::node()"/> - <for-each select="$start-tokens[position()!=last()]"> - <value-of select="."/> - <if test="position()!=last()"> - <text>{🔗</text> - </if> - </for-each> - <element name="a" namespace="&xhtml;"> - <attribute name="href"> - <value-of select="$ltcomponents[last()]"/> - </attribute> - <choose> - <when test="count($ltcomponents)>2 or normalize-space($ltcomponents[1])!=''"> - <for-each select="$ltcomponents[position()!=last()]"> - <value-of select="."/> - <if test="position()!=last()"> - <text><</text> - </if> - </for-each> - </when> - <otherwise> - <value-of select="$ltcomponents[last()]"/> - </otherwise> - </choose> - </element> - <value-of select="substring-after($end-node, '>}')"/> - <copy-of select="$end-node/following-sibling::node()"/> - </copy> - </variable> - <apply-templates select="exsl:node-set($wrapped)/*" mode="LesML:linkify"/> - </when> - <otherwise> - <variable name="escaped"> - <copy> - <copy-of select="@*"/> - <copy-of select="$start-node/preceding-sibling::node()"/> - <for-each select="$start-tokens[position()!=last()]"> - <value-of select="."/> - <if test="position()!=last()"> - <text>{🔗</text> - </if> - </for-each> - <text>{</text> - <processing-instruction name="LesML-Link-Escape"/> - <copy-of select="$hyperlink"/> - <text>>}</text> - <value-of select="substring-after($end-node, '>}')"/> - <copy-of select="$end-node/following-sibling::node()"/> - </copy> - </variable> - <apply-templates select="exsl:node-set($escaped)/*" mode="LesML:linkify"/> - </otherwise> - </choose> + <apply-templates select="exsl:node-set($processed)/node()" mode="LesML:linkify"/> </when> - <otherwise> + <when test="$partitioned[self::processing-instruction() and local-name()='LesML-All-Done']"> <copy> <copy-of select="@*"/> <apply-templates select="node()" mode="LesML:linkify"/> </copy> + </when> + <otherwise> + <variable name="processed"> + <copy> + <copy-of select="@*"/> + <copy-of select="$partitioned/node()"/> + </copy> + </variable> + <apply-templates select="exsl:node-set($processed)/node()" mode="LesML:linkify"/> </otherwise> </choose> </when> @@ -1034,6 +1322,18 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <with-param name="end-sigil" select="'⟫'"/> </apply-templates> </variable> + <apply-templates select="exsl:node-set($result)/node()" mode="LesML:named"/> + </template> + <template match="node()" mode="LesML:named"> + <variable name="result"> + <apply-templates select="." mode="LesML:inline"> + <with-param name="element-name" select="'u'"/> + <with-param name="element-namespace" select="'&xhtml;'"/> + <with-param name="start-sigil" select="'⸶'"/> + <with-param name="end-sigil" select="'⸷'"/> + <with-param name="class" select="'name'"/> + </apply-templates> + </variable> <apply-templates select="exsl:node-set($result)/node()" mode="LesML:offset"/> </template> <template match="node()" mode="LesML:offset"> @@ -1043,7 +1343,6 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <with-param name="element-namespace" select="'&xhtml;'"/> <with-param name="start-sigil" select="'⟨'"/> <with-param name="end-sigil" select="'⟩'"/> - <with-param name="langtag-supported" select="true()"/> </apply-templates> </variable> <apply-templates select="exsl:node-set($result)/node()" mode="LesML:bolded"/>