X-Git-Url: https://git.ladys.computer/Shushe/blobdiff_plain/6773582e45aab385c96638fe9e90d811132a1005..310a9688453c345f50604f738701435ec6a737be:/lib/catalog2transform.xslt?ds=inline diff --git a/lib/catalog2transform.xslt b/lib/catalog2transform.xslt index 3fb4c33..d575a72 100644 --- a/lib/catalog2transform.xslt +++ b/lib/catalog2transform.xslt @@ -4,9 +4,9 @@ SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady> SPDX-License-Identifier: MPL-2.0 --> <!-- -⁌ ⛩️📰 书社 ∷ lib/catalog2transform.xslt +⁌ ⛩📰 书社 ∷ lib/catalog2transform.xslt -© 2023–2024 Lady [@ Lady’s Computer]. +© 2023–2024 Lady [@ Ladys Computer]. This Source Code Form is subject to the terms of the Mozilla Public License, v 2.0. 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/>. @@ -17,78 +17,67 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one ]> <transform xmlns="http://www.w3.org/1999/XSL/Transform" - xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:dct="http://purl.org/dc/terms/" xmlns:catalog="urn:oasis:names:tc:entity:xmlns:xml:catalog" xmlns:exsl="http://exslt.org/common" xmlns:exslstr="http://exslt.org/strings" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:nie="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#" + xmlns:nfo="http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xslt="http://www.w3.org/1999/XSL/TransformAlias" xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4" + xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:" + exclude-result-prefixes="catalog" version="1.0" > + <include href="literally.xslt"/> <namespace-alias stylesheet-prefix="xslt" result-prefix="#default"/> + <param name="METADATA" select="'about:blank'"/> + <variable name="builddir" select="document($METADATA)//书社vocab:BuildDirectory/@nfo:fileUrl"/> <template match="/"> - <xslt:transform exclude-result-prefixes="catalog" extension-element-prefixes="exsl exslstr" version="1.0"> + <variable name="ids"> + <for-each select="//catalog:uri[@name]"> + <书社:id> + <value-of select="@name"/> + </书社:id> + </for-each> + </variable> + <variable name="unique-ids"> + <for-each select="exsl:node-set($ids)/*"> + <if test="not(preceding-sibling::*[string(.)=string(current())])"> + <copy-of select="."/> + </if> + </for-each> + </variable> + <xslt:transform exclude-result-prefixes="nie nfo" extension-element-prefixes="exsl exslstr" version="1.0"> <xslt:param name="BUILDTIME" select="'1972-12-31T00:00:00Z'"/> - <xslt:param name="CKSUM" select="false()"/> - <xslt:param name="CATALOG" select="'catalog'"/> <xslt:param name="IDENTIFIER" select="false()"/> - <xslt:param name="PATH" select="'/unknown'"/> <xslt:param name="SRCREV" select="false()"/> - <xslt:param name="SRCTIME" select="'1972-12-31T00:00:00Z'"/> <xslt:param name="THISREV" select="false()"/> <xslt:variable name="书社:source" select="/"/> - <xslt:variable name="书社:expansion"> - <xslt:apply-templates select="$书社:source/node()" mode="书社:expand"/> + <xslt:variable name="书社:about-fragment"> + <apply-templates select="document($METADATA)" mode="书社:literally"> + <with-param name="extension-element-namespaces" select="'http://exslt.org/common http://exslt.org/strings'"/> + </apply-templates> </xslt:variable> - <xslt:variable name="书社:result"> - <xslt:apply-templates select="exsl:node-set($书社:expansion)/node()"/> - </xslt:variable> - <xslt:variable name="书社:destination"> - <xslt:choose> - <xslt:when test="string($书社:source/@书社:destination)!=''"> - <xslt:value-of select="$书社:source/@书社:destination"/> - </xslt:when> - <xslt:when test="starts-with($PATH, '/')"> - <xslt:value-of select="substring-after($PATH, '/')"/> - </xslt:when> - <xslt:otherwise> - <xslt:value-of select="$PATH"/> - </xslt:otherwise> - </xslt:choose> + <xslt:variable name="书社:about" select="exsl:node-set($书社:about-fragment)"/> + <xslt:variable name="书社:expansion-fragment"> + <xslt:apply-templates select="$书社:source/node()" mode="书社:expand"/> </xslt:variable> - <xslt:variable name="书社:pagedestination"> - <xslt:variable name="dir"> - <xslt:for-each select="exslstr:tokenize($书社:destination, '/')[not(position()=last())]"> - <xslt:value-of select="."/> - <xslt:text>/</xslt:text> - </xslt:for-each> - </xslt:variable> - <xslt:variable name="name" select="string(exslstr:tokenize($书社:destination, '/')[last()])"/> - <xslt:value-of select="$dir"/> - <xslt:choose> - <xslt:when test="contains($name, '%s')"> - <xslt:value-of select="$name"/> - </xslt:when> - <xslt:when test="contains($name, '.')"> - <xslt:value-of select="substring-before($name, '.')"/> - <xslt:text>%s.</xslt:text> - <xslt:value-of select="substring-after($name, '.')"/> - </xslt:when> - <xslt:otherwise> - <xslt:value-of select="$name"/> - <xslt:text>%s</xslt:text> - </xslt:otherwise> - </xslt:choose> + <xslt:variable name="书社:expansion" select="exsl:node-set($书社:expansion-fragment)"/> + <xslt:variable name="书社:result-fragment"> + <xslt:apply-templates select="$书社:expansion/node()"/> </xslt:variable> + <xslt:variable name="书社:result" select="exsl:node-set($书社:result-fragment)"/> + <xslt:variable name="书社:destination" select="string($书社:about//*[@rdf:about=$IDENTIFIER]/@书社vocab:destination)"/> <for-each select="//catalog:uri"> <xslt:include href="{@uri}"> - <if test="contains(@name, ':')"> - <attribute name="书社:id"> - <value-of select="@name"/> - </attribute> - </if> + <attribute name="书社:id"> + <value-of select="@name"/> + </attribute> </xslt:include> </for-each> <xslt:template name="书社:apply-attributes"> @@ -204,7 +193,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <xslt:param name="nodes" select="/.."/> <xslt:variable name="modalinput"> <xslt:copy-of select="$nodes"/> - <xslt:copy-of select="document('')/xslt:transform/xslt:include"/> + <apply-templates select="exsl:node-set($unique-ids)" mode="书社:literally"/> </xslt:variable> <xslt:variable name="metadata"> <xslt:copy-of select="$nodes[self::html:html]/html:head/node()|$nodes[self::html:head]/node()"/> @@ -249,7 +238,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:text> </xslt:for-each> <xslt:text> - <text>⛩️📰 书社</text> + <text>⛩📰 书社</text> </xslt:text> <xslt:if test="$THISREV"> <xslt:text> @@ -272,13 +261,13 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </html:html> </xslt:template> <xslt:template match="/" priority="1"> - <xslt:variable name="result-nodes" select="exsl:node-set($书社:result)/node()[not(self::书社:apply-attributes-to-root)]|exsl:node-set($书社:result)/书社:apply-attributes-to-root/descendant::node()[not(self::书社:apply-attributes-to-root) and not(ancestor::*[not(self::书社:apply-attributes-to-root)])]"/> + <xslt:variable name="result-nodes" select="$书社:result/node()[not(self::书社:apply-attributes-to-root)]|$书社:result/书社:apply-attributes-to-root/descendant::node()[not(self::书社:apply-attributes-to-root) and not(ancestor::*[not(self::书社:apply-attributes-to-root)])]"/> <xslt:variable name="root-with-attributes"> <xslt:choose> - <xslt:when test="$result-nodes/self::书社:*[local-name()='raw-text' or local-name()='base64-binary' or local-name()='archive']|$result-nodes/@书社:disable-output-wrapping|exsl:node-set($书社:result)//书社:apply-attributes-to-root/@书社:disable-output-wrapping"> + <xslt:when test="not($result-nodes/self::html:*) or $result-nodes/self::书社:*[local-name()='raw-text' or local-name()='base64-binary' or local-name()='archive'] or $result-nodes/@书社:disable-output-wrapping or $书社:result//书社:apply-attributes-to-root/@书社:disable-output-wrapping"> <xslt:call-template name="书社:apply-attributes"> <xslt:with-param name="and-version" select="true()"/> - <xslt:with-param name="context-nodes" select="exsl:node-set($书社:result)//书社:apply-attributes-to-root"/> + <xslt:with-param name="context-nodes" select="$书社:result//书社:apply-attributes-to-root"/> <xslt:with-param name="destination-nodes" select="$result-nodes"/> </xslt:call-template> </xslt:when> @@ -290,51 +279,35 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:variable> <xslt:call-template name="书社:apply-attributes"> <xslt:with-param name="and-version" select="true()"/> - <xslt:with-param name="context-nodes" select="exsl:node-set($书社:result)//书社:apply-attributes-to-root"/> + <xslt:with-param name="context-nodes" select="$书社:result//书社:apply-attributes-to-root"/> <xslt:with-param name="destination-nodes" select="exsl:node-set($wrapped-result)/node()"/> </xslt:call-template> </xslt:otherwise> </xslt:choose> </xslt:variable> - <xslt:apply-templates select="exsl:node-set($root-with-attributes)/node()" mode="书社:application"/> + <xslt:apply-templates select="exsl:node-set($root-with-attributes)/node()" mode="书社:apply"/> </xslt:template> <xslt:template match="@*|node()" priority="-1"> <xslt:copy> <xslt:apply-templates select="@*|node()"/> </xslt:copy> </xslt:template> - <xslt:template match="@*|node()" mode="书社:application"> + <xslt:template match="@*|node()" mode="书社:apply"> <xslt:copy> - <xslt:apply-templates select="@*|node()" mode="书社:application"/> + <xslt:apply-templates select="@*|node()" mode="书社:apply"/> </xslt:copy> </xslt:template> - <xslt:template match="@书社:destination[not(../self::书社:page)]|@书社:disable-output-wrapping|@书社:archived-as[../ancestor::*[not(self::书社:apply-attributes-to-root or self::书社:apply-attributes)]]" mode="书社:application" priority="1"/> - <xslt:template match="书社:archive|书社:page" mode="书社:application" priority="1"> + <xslt:template match="@书社:destination|@书社:disable-output-wrapping|@书社:archived-as[../ancestor::*[not(self::书社:apply-attributes-to-root or self::书社:apply-attributes)]]" mode="书社:apply" priority="1"/> + <xslt:template match="书社:archive" mode="书社:apply" priority="1"> <xslt:copy> <xslt:for-each select="@*"> <xslt:choose> - <xslt:when test="../self::书社:archive and local-name()='archived-as' and namespace-uri()='&书社;' and ../ancestor::*[not(self::书社:apply-attributes-to-root or self::书社:apply-attributes)]"/> + <xslt:when test="local-name()='archived-as' and namespace-uri()='&书社;' and ../ancestor::*[not(self::书社:apply-attributes-to-root or self::书社:apply-attributes)]"/> <xslt:otherwise> - <xslt:apply-templates select="." mode="书社:application"/> + <xslt:apply-templates select="." mode="书社:apply"/> </xslt:otherwise> </xslt:choose> </xslt:for-each> - <xslt:if test="self::书社:page and not(@书社:destination)"> - <xslt:attribute name="书社:destination"> - <xslt:value-of select="substring-before($书社:pagedestination, '%s')"/> - <xslt:text>%22%7B</xslt:text> - <xslt:choose> - <xslt:when test="@name"> - <xslt:value-of select="@name"/> - </xslt:when> - <xslt:otherwise> - <xslt:value-of select="count(ancestor::书社:page|preceding::书社:page)+1"/> - </xslt:otherwise> - </xslt:choose> - <xslt:text>%7D%22</xslt:text> - <xslt:value-of select="substring-after($书社:pagedestination, '%s')"/> - </xslt:attribute> - </xslt:if> <xslt:for-each select="node()"> <xslt:choose> <xslt:when test="self::*"> @@ -350,67 +323,53 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:otherwise> </xslt:choose> </xslt:variable> - <xslt:apply-templates select="exsl:node-set($component)/node()" mode="书社:application"/> + <xslt:apply-templates select="exsl:node-set($component)/node()" mode="书社:apply"/> </xslt:when> <xslt:otherwise> - <xslt:apply-templates select="." mode="书社:application"/> + <xslt:apply-templates select="." mode="书社:apply"/> </xslt:otherwise> </xslt:choose> </xslt:for-each> </xslt:copy> </xslt:template> - <xslt:template match="书社:apply-attributes" mode="书社:application" priority="1"> + <xslt:template match="书社:apply-attributes" mode="书社:apply" priority="1"> <xslt:variable name="children"> - <xslt:apply-templates mode="书社:application"/> + <xslt:apply-templates mode="书社:apply"/> </xslt:variable> <xslt:call-template name="书社:apply-attributes"> <xslt:with-param name="context-nodes" select="."/> <xslt:with-param name="destination-nodes" select="exsl:node-set($children)/node()"/> </xslt:call-template> </xslt:template> - <xslt:template match="书社:apply-attributes-to-root" mode="书社:application" priority="1"> - <xslt:apply-templates mode="书社:application"/> - </xslt:template> - <xslt:template match="/node()" mode="书社:expand" priority="0"> - <xslt:copy> - <xslt:attribute name="书社:identifier"> - <xslt:value-of select="$IDENTIFIER"/> - </xslt:attribute> - <xslt:choose> - <xslt:when test="self::html:*"> - <xslt:attribute name="itemscope">itemscope</xslt:attribute> - <xslt:attribute name="itemtype"> - <xslt:text> - <text>&书社;:document</text> - </xslt:text> - <xslt:for-each select="exslstr:tokenize(@itemtype)/token"> - <xslt:text> - <text> </text> - </xslt:text> - <xslt:value-of select="."/> - </xslt:for-each> - </xslt:attribute> - <xslt:apply-templates select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype'))]|node()" mode="书社:expand"/> - </xslt:when> - <xslt:otherwise> - <xslt:apply-templates select="@*|node()" mode="书社:expand"/> - </xslt:otherwise> - </xslt:choose> - </xslt:copy> + <xslt:template match="书社:apply-attributes-to-root" mode="书社:apply" priority="1"> + <xslt:apply-templates mode="书社:apply"/> </xslt:template> <xslt:template match="书社:link[@xlink:show='embed']" mode="书社:expand" priority="1"> <xslt:variable name="identifier" select="string(@xlink:href)"/> - <xslt:variable name="uri" select="substring-before(document($CATALOG)//catalog:uri[@name=$identifier]/@uri[1], '#')"/> + <xslt:variable name="included" select="$书社:about//*[@rdf:about=$identifier]"/> <xslt:choose> - <xslt:when test="$uri"> + <xslt:when test="$included"> + <xslt:variable name="uri"> + <xslt:text> + <value-of select="$builddir"/> + </xslt:text> + <xslt:choose> + <xslt:when test="$included/self::书社vocab:SourceFile"> + <xslt:text>/sources/</xslt:text> + </xslt:when> + <xslt:when test="$included/self::书社vocab:IncludeFile"> + <xslt:text>/includes/</xslt:text> + </xslt:when> + </xslt:choose> + <xslt:value-of select="$included/@书社vocab:path"/> + </xslt:variable> <xslt:variable name="expanded"> - <xslt:apply-templates select="document($uri)" mode="书社:expand"/> + <xslt:apply-templates select="document($uri)" mode="书社:expand"> + <xslt:with-param name="identifier" select="$identifier"/> + </xslt:apply-templates> </xslt:variable> <xslt:for-each select="exsl:node-set($expanded)/node()"> <xslt:copy> - <xslt:attribute name="书社:identifier"> - <xslt:value-of select="$identifier"/> - </xslt:attribute> <xslt:choose> <xslt:when test="self::html:*"> <xslt:attribute name="itemscope">itemscope</xslt:attribute> @@ -425,10 +384,10 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <xslt:value-of select="."/> </xslt:for-each> </xslt:attribute> - <xslt:copy-of select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype')) and not(namespace-uri()='&书社;' and local-name()='identifier')]|node()"/> + <xslt:copy-of select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype'))]|node()"/> </xslt:when> <xslt:otherwise> - <xslt:apply-templates select="@*[not(namespace-uri()='&书社;' and local-name()='identifier')]|node()" mode="书社:expand"/> + <xslt:apply-templates select="@*|node()" mode="书社:expand"/> </xslt:otherwise> </xslt:choose> </xslt:copy> @@ -441,6 +400,42 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:otherwise> </xslt:choose> </xslt:template> + <xslt:template match="/node()" mode="书社:expand" priority="0"> + <xslt:param name="identifier" select="$IDENTIFIER"/> + <xslt:copy> + <xslt:if test="self::*"> + <xslt:attribute name="书社:cksum"> + <xslt:value-of select="$书社:about//*[@rdf:about=$identifier]/nfo:hasHash[@nfo:hashAlgorithm='CRC32']/@nfo:hashValue"/> + </xslt:attribute> + <xslt:attribute name="书社:identifier"> + <xslt:value-of select="$identifier"/> + </xslt:attribute> + <xslt:attribute name="书社:mtime"> + <xslt:value-of select="$书社:about//*[@rdf:about=$identifier]/nfo:fileLastModified"/> + </xslt:attribute> + </xslt:if> + <xslt:choose> + <xslt:when test="self::html:*"> + <xslt:attribute name="itemscope">itemscope</xslt:attribute> + <xslt:attribute name="itemtype"> + <xslt:text> + <text>&书社;:document</text> + </xslt:text> + <xslt:for-each select="exslstr:tokenize(@itemtype)/token"> + <xslt:text> + <text> </text> + </xslt:text> + <xslt:value-of select="."/> + </xslt:for-each> + </xslt:attribute> + <xslt:apply-templates select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype') or namespace-uri()='&书社;' and (local-name()='cksum' or local-name()='identifier' or local-name()='mtime'))]|node()" mode="书社:expand"/> + </xslt:when> + <xslt:otherwise> + <xslt:apply-templates select="@*[not(namespace-uri()='&书社;' and (local-name()='cksum' or local-name()='identifier' or local-name()='mtime'))]|node()" mode="书社:expand"/> + </xslt:otherwise> + </xslt:choose> + </xslt:copy> + </xslt:template> <xslt:template match="@*|node()[not(self::书社:link) or not(@xlink:show='embed')]" mode="书社:expand" priority="-1"> <xslt:copy> <xslt:apply-templates select="@*|node()" mode="书社:expand"/>