X-Git-Url: https://git.ladys.computer/LesML/blobdiff_plain/16020b1dc994098540d8189a39151785ece0e793..1192f5c276e839eaf6b7bbad5d31b0175a3e52ed:/parser.xslt diff --git a/parser.xslt b/parser.xslt index 8772693..99ee743 100644 --- a/parser.xslt +++ b/parser.xslt @@ -12,23 +12,27 @@ 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 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 LesML "urn:fdc:ladys.computer:20240512:LesML"> + <!ENTITY section-break ""> + <!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> + <param name="LESML_SECTION_BREAK_CHARS" select="'*-.=_~·․‥…⁂⋯─━┄┅┈┉╌╍═╴╶╸╺☙❧ ・*-.=_~'"/> <template name="LesML:split"> <param name="source"/> <param name="separator" select="'
'"/> @@ -118,31 +122,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="/.."/> @@ -212,13 +281,13 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <variable name="params" select="exsl:node-set($params-fragment)/*"/> <variable name="noshebang" select="$lines[position()>1 or not(starts-with(., '#!lesml') or starts-with(., '##'))]"/> <variable name="docsep" select="$noshebang[starts-with(., '#!lesml') or starts-with(., '##')][1]"/> - <variable name="doclines" select="$noshebang[not($docsep) or following-sibling::*[generate-id()=generate-id($docsep)]]"/> + <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="$shebang!='' or $doclines[normalize-space()!='']"> + <if test="$doclines[normalize-space()!='']"> <variable name="record-separators" select="$doclines[starts-with(., '%%')]"/> <element name="article" namespace="&xhtml;"> <for-each select="$params/html:div/html:dt[string()=' LANG ']"> @@ -242,14 +311,14 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <for-each select="$record-separators"> <variable name="position" select="position()"/> <variable name="prev-separator" select="$record-separators[($position)-1]"/> - <variable name="fields" select="$noshebang[following-sibling::*[generate-id()=generate-id(current())] and (not($prev-separator) or preceding-sibling::*[generate-id()=generate-id($prev-separator)])]"/> + <variable name="fields" select="exslset:leading(exslset:trailing($doclines, $prev-separator), .)"/> <if test="$fields"> <element name="dl" namespace="&xhtml;"> <for-each select="$fields"> <choose> - <when test="starts-with(., ' ') and $fields[generate-id()=generate-id(current()/preceding-sibling::*[1])]"/> + <when test="starts-with(., ' ') and exslset:leading($fields, .)"/> <otherwise> - <variable name="next" select="following-sibling::*[not(starts-with(., ' '))]"/> + <variable name="next" select="exslset:intersection(following-sibling::*[not(starts-with(., ' '))][1], $fields)"/> <element name="div" namespace="&xhtml;"> <element name="dt" namespace="&xhtml;"> <value-of select="normalize-space(substring-before(., ':'))"/> @@ -273,7 +342,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <value-of select="$firstline"/> </otherwise> </choose> - <for-each select="following-sibling::*[starts-with(., ' ') and not(preceding-sibling::*[generate-id()=generate-id($next)])]"> + <for-each select="exslset:intersection(following-sibling::*[starts-with(., ' ')], exslset:leading($fields, $next))"> <variable name="nextline" select="normalize-space(.)"/> <choose> <when test="substring($nextline, string-length($nextline))='\' and following-sibling::*[position()=1 and starts-with(., ' ')]"> @@ -292,9 +361,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> @@ -304,329 +373,376 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <text>body</text> </attribute> <call-template name="LesML:paragraphize"> - <with-param name="lines" select="$doclines[not($record-separators) or preceding-sibling::*[generate-id()=generate-id($record-separators[last()])]]"/> + <with-param name="lines" select="exslset:trailing($doclines, $record-separators[last()])"/> </call-template> </element> </element> </if> <if test="$docsep"> <call-template name="LesML:parse"> - <with-param name="lines" select="$docsep|$lines[preceding-sibling::*[generate-id()=generate-id($docsep)]]"/> + <with-param name="lines" select="$docsep|exslset:trailing($lines, $docsep)"/> <with-param name="parent-params" select="$params"/> </call-template> </if> </template> - <template name="LesML:paragraphize"> + <template name="LesML:block"> <param name="lines" select="/.."/> - <variable name="last-lines" select="$lines[normalize-space()!='' and normalize-space(following-sibling::*[1])='']|$lines[last()]"/> - <variable name="blocked"> - <for-each select="$last-lines"> - <variable name="position" select="position()"/> - <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"> - <choose> - <when test="$preformatted"> - <value-of select="substring-after(., '|')"/> - </when> - <otherwise> - <value-of select="normalize-space()"/> - </otherwise> - </choose> - <if test="position()!=count($linespans)"> + <variable name="last-lines" select="$lines[normalize-space()!='' and (normalize-space(following-sibling::*[1])='' or position()=last())]"/> + <for-each select="$last-lines"> + <variable name="position" select="position()"/> + <variable name="prev-last" select="$last-lines[($position)-1]"/> + <variable name="linespans" select="(exslset:intersection(exslset:trailing($lines, $prev-last), exslset:leading($lines, .))|.)[normalize-space()!='']"/> + <variable name="prefix" select="substring(translate(., ' 	', ''), 1, 1)"/> + <variable name="all-prefixed" select="not($linespans[not(starts-with(translate(., ' 	', ''), $prefix))])"/> + <variable name="quoted" select="$all-prefixed and $prefix='»'"/> + <variable name="bracketed" select="$all-prefixed and $prefix=']'"/> + <choose> + <when test="count($linespans)=1 and translate(., concat($LESML_SECTION_BREAK_CHARS, ' 	'), '')=''"> + <element name="hr" namespace="&xhtml;"/> + </when> + <when test="$quoted or $bracketed"> + <variable name="innerlines-fragment"> + <for-each select="$linespans"> + <variable name="inner"> + <value-of select="substring-after(., $prefix)"/> + </variable> + <copy> + <choose> + <when test="starts-with($inner, ' ') or starts-with($inner, '	')"> + <value-of select="substring($inner, 1+count(exslstr:tokenize($inner, '')[normalize-space()='' and not(preceding-sibling::*[normalize-space()!=''])]))"/> + </when> + <otherwise> + <value-of select="$inner"/> + </otherwise> + </choose> + </copy> + </for-each> + </variable> + <variable name="blocked-fragment"> + <call-template name="LesML:block"> + <with-param name="lines" select="exsl:node-set($innerlines-fragment)/*"/> + </call-template> + </variable> + <variable name="innerpars" select="exsl:node-set($blocked-fragment)/node()"/> + <choose> + <when test="$quoted and $innerpars[position()=last() and self::html:footer]"> + <element name="figure" namespace="&xhtml;"> + <element name="blockquote" namespace="&xhtml;"> + <copy-of select="$innerpars[position()!=last()]"/> + </element> + <element name="figcaption" namespace="&xhtml;"> + <copy-of select="$innerpars[last()]/node()"/> + </element> + </element> + </when> + <when test="$quoted"> + <element name="blockquote" namespace="&xhtml;"> + <copy-of select="$innerpars"/> + </element> + </when> + <when test="$bracketed"> + <element name="footer" namespace="&xhtml;"> + <copy-of select="$innerpars"/> + </element> + </when> + </choose> + </when> + <otherwise> + <variable name="preformatted" select="$all-prefixed and $prefix='|'"/> + <variable name="text"> + <for-each select="$linespans"> <choose> <when test="$preformatted"> - <text>
</text> + <value-of select="substring-after(., '|')"/> </when> <otherwise> - <text> </text> + <value-of select="normalize-space()"/> </otherwise> </choose> - </if> - </for-each> - </variable> - <if test="string($text)!=''"> - <variable name="par"> - <choose> - <when test="$preformatted"> - <element name="pre" namespace="&xhtml;"> + <if test="position()!=count($linespans)"> + <choose> + <when test="$preformatted"> + <text>
</text> + </when> + <otherwise> + <text> </text> + </otherwise> + </choose> + </if> + </for-each> + </variable> + <choose> + <when test="$preformatted"> + <element name="pre" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="$text"/> + </call-template> + </element> + </when> + <when test="string($text)=''"/> + <when test="starts-with($text, '⁌') and &sigiled-text;"> + <element name="h1" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> + </element> + </when> + <when test="starts-with($text, '§') and &sigiled-text;"> + <element name="h2" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> + </element> + </when> + <when test="starts-with($text, '❦') and &sigiled-text;"> + <element name="h3" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> + </element> + </when> + <when test="starts-with($text, '✠') and &sigiled-text;"> + <element name="h4" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> + </element> + </when> + <when test="starts-with($text, '•') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>unordered</text> + </attribute> + <attribute name="data-level"> + <text>1</text> + </attribute> + <element name="p" namespace="&xhtml;"> <call-template name="LesML:id-and-contents"> - <with-param name="source" select="$text"/> + <with-param name="source" select="&unsigiled-text;"/> </call-template> </element> - </when> - <when test="starts-with($text, '⁌') and &sigiled-text;"> - <element name="h1" namespace="&xhtml;"> + </element> + </when> + <when test="starts-with($text, '🔢') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>ordered</text> + </attribute> + <attribute name="data-level"> + <text>1</text> + </attribute> + <element name="p" namespace="&xhtml;"> <call-template name="LesML:id-and-contents"> <with-param name="source" select="&unsigiled-text;"/> </call-template> </element> - </when> - <when test="starts-with($text, '§') and &sigiled-text;"> - <element name="h2" namespace="&xhtml;"> + </element> + </when> + <when test="starts-with($text, '◦') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>unordered</text> + </attribute> + <attribute name="data-level"> + <text>2</text> + </attribute> + <element name="p" namespace="&xhtml;"> <call-template name="LesML:id-and-contents"> <with-param name="source" select="&unsigiled-text;"/> </call-template> </element> - </when> - <when test="starts-with($text, '❦') and &sigiled-text;"> - <element name="h3" namespace="&xhtml;"> + </element> + </when> + <when test="starts-with($text, '🔠') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>ordered</text> + </attribute> + <attribute name="data-level"> + <text>2</text> + </attribute> + <element name="p" namespace="&xhtml;"> <call-template name="LesML:id-and-contents"> <with-param name="source" select="&unsigiled-text;"/> </call-template> </element> - </when> - <when test="starts-with($text, '✠') and &sigiled-text;"> - <element name="h4" namespace="&xhtml;"> + </element> + </when> + <when test="starts-with($text, '▪') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>unordered</text> + </attribute> + <attribute name="data-level"> + <text>3</text> + </attribute> + <element name="p" namespace="&xhtml;"> <call-template name="LesML:id-and-contents"> <with-param name="source" select="&unsigiled-text;"/> </call-template> </element> - </when> - <when test="starts-with($text, '•') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>unordered</text> - </attribute> - <attribute name="data-level"> - <text>1</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> - </element> - </when> - <when test="starts-with($text, '🔢') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>ordered</text> - </attribute> - <attribute name="data-level"> - <text>1</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> - </element> - </when> - <when test="starts-with($text, '◦') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>unordered</text> - </attribute> - <attribute name="data-level"> - <text>2</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> - </element> - </when> - <when test="starts-with($text, '🔠') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>ordered</text> - </attribute> - <attribute name="data-level"> - <text>2</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> - </element> - </when> - <when test="starts-with($text, '▪') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>unordered</text> - </attribute> - <attribute name="data-level"> - <text>3</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> - </element> - </when> - <when test="starts-with($text, '🔡') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>ordered</text> - </attribute> - <attribute name="data-level"> - <text>3</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> - </element> - </when> - <when test="starts-with($text, '⁃') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>unordered</text> - </attribute> - <attribute name="data-level"> - <text>4</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> - </element> - </when> - <when test="starts-with($text, '🔣') and &sigiled-text;"> - <element name="li" namespace="&xhtml;"> - <attribute name="class"> - <text>ordered</text> - </attribute> - <attribute name="data-level"> - <text>4</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> + </element> + </when> + <when test="starts-with($text, '🔡') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>ordered</text> + </attribute> + <attribute name="data-level"> + <text>3</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </element> - </when> - <when test="starts-with($text, '🛈') and &sigiled-text;"> - <element name="div" namespace="&xhtml;"> - <attribute name="role"> - <text>note</text> - </attribute> - <attribute name="class"> - <text>info</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> + </element> + </when> + <when test="starts-with($text, '⁃') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>unordered</text> + </attribute> + <attribute name="data-level"> + <text>4</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </element> - </when> - <when test="starts-with($text, '⯑') and &sigiled-text;"> - <element name="div" namespace="&xhtml;"> - <attribute name="role"> - <text>note</text> - </attribute> - <attribute name="class"> - <text>query</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> + </element> + </when> + <when test="starts-with($text, '🔣') and &sigiled-text;"> + <element name="li" namespace="&xhtml;"> + <attribute name="class"> + <text>ordered</text> + </attribute> + <attribute name="data-level"> + <text>4</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </element> - </when> - <when test="starts-with($text, '⚠︎') and &sigiled-text;"> - <element name="div" namespace="&xhtml;"> - <attribute name="role"> - <text>note</text> - </attribute> - <attribute name="class"> - <text>warn</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> + </element> + </when> + <when test="starts-with($text, '🛈') and &sigiled-text;"> + <element name="div" namespace="&xhtml;"> + <attribute name="role"> + <text>note</text> + </attribute> + <attribute name="class"> + <text>info</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </element> - </when> - <when test="starts-with($text, '※') and &sigiled-text;"> - <element name="div" namespace="&xhtml;"> - <attribute name="role"> - <text>note</text> - </attribute> - <attribute name="class"> - <text>note</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> + </element> + </when> + <when test="starts-with($text, '⯑') and &sigiled-text;"> + <element name="div" namespace="&xhtml;"> + <attribute name="role"> + <text>note</text> + </attribute> + <attribute name="class"> + <text>query</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </element> - </when> - <when test="starts-with($text, '☡') and &sigiled-text;"> - <element name="div" namespace="&xhtml;"> - <attribute name="role"> - <text>note</text> - </attribute> - <attribute name="class"> - <text>caution</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> + </element> + </when> + <when test="starts-with($text, '⚠︎') and &sigiled-text;"> + <element name="div" namespace="&xhtml;"> + <attribute name="role"> + <text>note</text> + </attribute> + <attribute name="class"> + <text>warn</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </element> - </when> - <when test="starts-with($text, '⋯') and &sigiled-text;"> - <element name="div" namespace="&xhtml;"> - <attribute name="class"> - <text>continuation</text> - </attribute> - <element name="p" namespace="&xhtml;"> - <call-template name="LesML:id-and-contents"> - <with-param name="source" select="&unsigiled-text;"/> - </call-template> - </element> + </element> + </when> + <when test="starts-with($text, '※') and &sigiled-text;"> + <element name="div" namespace="&xhtml;"> + <attribute name="role"> + <text>note</text> + </attribute> + <attribute name="class"> + <text>note</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> </element> - </when> - <when test="starts-with($text, '#') and &sigiled-text;"> - <comment> - <value-of select="&unsigiled-text;"/> - </comment> - </when> - <otherwise> + </element> + </when> + <when test="starts-with($text, '☡') and &sigiled-text;"> + <element name="div" namespace="&xhtml;"> + <attribute name="role"> + <text>note</text> + </attribute> + <attribute name="class"> + <text>caution</text> + </attribute> <element name="p" namespace="&xhtml;"> <call-template name="LesML:id-and-contents"> - <with-param name="source" select="$text"/> + <with-param name="source" select="&unsigiled-text;"/> </call-template> </element> - </otherwise> - </choose> - </variable> - <choose> - <when test="translate(string($text), '§ion-break; ', '')=''"> - <element name="hr" namespace="&xhtml;"/> + </element> </when> - <when test="$quoted"> - <element name="blockquote" namespace="&xhtml;"> - <copy-of select="$par"/> + <when test="starts-with($text, '⋯') and &sigiled-text;"> + <element name="div" namespace="&xhtml;"> + <attribute name="class"> + <text>continuation</text> + </attribute> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> + </element> </element> </when> + <when test="starts-with($text, '#') and &sigiled-text;"> + <call-template name="LesML:comment-out"> + <with-param name="source" select="&unsigiled-text;"/> + </call-template> + </when> <otherwise> - <copy-of select="$par"/> + <element name="p" namespace="&xhtml;"> + <call-template name="LesML:id-and-contents"> + <with-param name="source" select="$text"/> + </call-template> + </element> </otherwise> </choose> - </if> - </for-each> + </otherwise> + </choose> + </for-each> + </template> + <template name="LesML:paragraphize"> + <param name="lines" select="/.."/> + <variable name="blocked-fragment"> + <call-template name="LesML:block"> + <with-param name="lines" select="$lines"/> + </call-template> </variable> - <variable name="inlined"> - <apply-templates select="exsl:node-set($blocked)/node()" mode="LesML:linkify"/> + <variable name="inlined-fragment"> + <apply-templates select="exsl:node-set($blocked-fragment)/node()" mode="LesML:comment"/> </variable> - <apply-templates select="exsl:node-set($inlined)/node()" mode="LesML:finalize-tree"/> + <apply-templates select="exsl:node-set($inlined-fragment)/node()" mode="LesML:finalize-tree"/> </template> <template match="html:script[@type='text/lesml']"> <variable name="lines-fragment"> @@ -638,55 +754,40 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </with-param> </call-template> </variable> - <call-template name="LesML:parse"> - <with-param name="lines" select="exsl:node-set($lines-fragment)/*"/> - </call-template> + <element name="div" namespace="&xhtml;"> + <call-template name="LesML:parse"> + <with-param name="lines" select="exsl:node-set($lines-fragment)/*"/> + </call-template> + </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]"/> - <variable name="contents"> - <copy-of select="node()"/> - <for-each select="following-sibling::node()[not($notquote) or following-sibling::node()[generate-id()=generate-id($notquote)]]"> - <copy-of select="node()"/> - </for-each> - </variable> - <variable name="content-nodes" select="exsl:node-set($contents)/node()"/> - <variable name="laststarttext" select="$content-nodes[last()]/self::html:p[not(@class) and not(@role)]/node()[self::text() or self::*][position()=1 and self::text()]"/> - <choose> - <when test="starts-with($laststarttext, '— ')"> - <variable name="caption"> - <copy-of select="$laststarttext/preceding-sibling::node()"/> - <value-of select="substring-after($laststarttext, '— ')"/> - <copy-of select="$laststarttext/following-sibling::node()"/> - </variable> - <element name="figure" namespace="&xhtml;"> - <copy> - <apply-templates select="@*|$content-nodes[position()!=last()]" mode="LesML:finalize-tree"/> - </copy> - <element name="figcaption" namespace="&xhtml;"> - <for-each select="$content-nodes[last()]"> - <copy> - <apply-templates select="@*|exsl:node-set($caption)/node()" mode="LesML:finalize-tree"/> - </copy> - </for-each> - </element> - </element> - </when> - <otherwise> - <copy> - <apply-templates select="@*|$content-nodes" mode="LesML:finalize-tree"/> - </copy> - </otherwise> - </choose> - </if> + <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: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="following-sibling::node()[not($notcontinuation) or following-sibling::node()[generate-id()=generate-id($notcontinuation)]]"> + <for-each select="exslset:leading(following-sibling::node(), $notcontinuation)"> <apply-templates select="node()" mode="LesML:finalize-tree"/> </for-each> </copy> @@ -713,11 +814,11 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </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]"/> <element name="{$wrapper}" namespace="&xhtml;"> - <for-each select=".|following-sibling::html:li[@data-level=$current-level and (not($notinlist) or following-sibling::node()[generate-id()=generate-id($notinlist)])]"> + <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]"/> <copy> <apply-templates select="@*|node()" mode="LesML:finalize-tree"/> - <for-each select="following-sibling::node()[not($notcontinuation) or following-sibling::node()[generate-id()=generate-id($notcontinuation)]]"> + <for-each select="exslset:leading(following-sibling::node(), $notcontinuation)"> <apply-templates select="node()" mode="LesML:finalize-tree"/> </for-each> <if test="$notcontinuation/self::html:li[@data-level>$current-level]"> @@ -734,8 +835,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"> @@ -744,16 +845,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]"/> @@ -765,17 +939,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)"/> @@ -799,27 +962,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> @@ -829,7 +980,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> @@ -841,7 +991,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> @@ -852,110 +1001,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> @@ -1031,6 +1331,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"> @@ -1040,7 +1352,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"/>