X-Git-Url: https://git.ladys.computer/Shushe/blobdiff_plain/e4f65cee884c40d631209b5cbb711de161a2969a..0.7.4:/lib/catalog2parser.xslt?ds=sidebyside diff --git a/lib/catalog2parser.xslt b/lib/catalog2parser.xslt index d044503..3fdbdb2 100644 --- a/lib/catalog2parser.xslt +++ b/lib/catalog2parser.xslt @@ -1,8 +1,12 @@ <?xml version="1.0"?> <!-- +SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady> +SPDX-License-Identifier: MPL-2.0 +--> +<!-- ⁌ ⛩️📰 书社 ∷ lib/catalog2parser.xslt -© 2023 Lady [@ Lady’s Computer] +© 2023–2024 Lady [@ Lady’s 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/>. @@ -10,21 +14,162 @@ 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:catalog="urn:oasis:names:tc:entity:xmlns:xml:catalog" - xmlns:xsla="http://www.w3.org/1999/XSL/TransformAlias" - exclude-result-prefixes="catalog" + xmlns:exsl="http://exslt.org/common" + xmlns:exslstr="http://exslt.org/strings" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xslt="http://www.w3.org/1999/XSL/TransformAlias" + xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4" + exclude-result-prefixes="catalog exslstr" version="1.0" > - <namespace-alias stylesheet-prefix="xsla" result-prefix="#default"/> + <namespace-alias stylesheet-prefix="xslt" result-prefix="#default"/> <template match="/"> - <xsla:transform version="1.0"> + <xslt:transform version="1.0"> + <xslt:param name="BUILDTIME" select="'1972-12-31T00:00:00Z'"/> + <xslt:param name="CKSUM" select="false()"/> + <xslt:param name="IDENTIFIER" select="false()"/> + <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="书社:parsers"> + <html:dl> + <for-each select="//catalog:uri"> + <variable name="parser" select="document(@uri, .)"/> + <html:div> + <html:dt> + <value-of select="@name"/> + </html:dt> + <choose> + <when test="$parser/*/@书社:supported-media-types"> + <for-each select="exslstr:tokenize($parser/*/@书社:supported-media-types)"> + <if test="not(translate(., '0123456789abcdefghijklmnopqrstuvwxyz!#$&-^_.+/', ''))"> + <html:dd> + <value-of select="."/> + </html:dd> + </if> + </for-each> + </when> + <otherwise> + <for-each select="$parser//xsl:template[not(@name) and not(@mode)]"> + <variable name="match" select="@match"/> + <for-each select="namespace::*[local-name() and string()='http://www.w3.org/1999/xhtml']"> + <variable name="matchstart"> + <value-of select="local-name()"/> + <text>:</text> + <text>script[@type=</text> + </variable> + <if test="starts-with($match, $matchstart) and substring($match, string-length($match))=']' and contains($match, '/')"> + <variable name="inner" select="substring-before(substring-after($match, $matchstart), ']')"/> + <if test="starts-with($inner, '"') and substring($inner, string-length($inner))='"' or starts-with($inner, "'") and substring($inner, string-length($inner))="'""> + <variable name="type" select="substring($inner, 2, string-length($inner)-2)"/> + <if test="not(translate($type, '0123456789abcdefghijklmnopqrstuvwxyz!#$&-^_.+/', ''))"> + <html:dd> + <value-of select="$type"/> + </html:dd> + </if> + </if> + </if> + </for-each> + </for-each> + </otherwise> + </choose> + </html:div> + </for-each> + </html:dl> + </xslt:variable> <for-each select="//catalog:uri"> - <xsla:include href="{@uri}"/> + <xslt:include href="{@uri}"> + <if test="contains(@name, ':')"> + <attribute name="书社:id"> + <value-of select="@name"/> + </attribute> + </if> + </xslt:include> </for-each> - <xsla:template match="@*|node()" priority="-1"> - <xsla:copy> - <xsla:apply-templates select="@*|node()"/> - </xsla:copy> - </xsla:template> - </xsla:transform> + <xslt:template name="书社:apply-parsed-by"> + <xslt:param name="id"/> + <xslt:param name="media-type"/> + <xslt:param name="result" select="/.."/> + <xslt:for-each select="$result/node()"> + <xslt:choose> + <xslt:when test="self::*"> + <xslt:copy> + <xslt:if test="string($id)!=''"> + <xslt:attribute name="书社:parsed-by"> + <xslt:value-of select="$id"/> + <xslt:if test="@书社:parsed-by"> + <xslt:text> + <text> </text> + </xslt:text> + <xslt:value-of select="@书社:parsed-by"/> + </xslt:if> + </xslt:attribute> + </xslt:if> + <xslt:if test="string($media-type)!=''"> + <xslt:attribute name="书社:media-type"> + <xslt:value-of select="$media-type"/> + </xslt:attribute> + </xslt:if> + <xslt:copy-of select="@*[namespace-uri()!='urn:fdc:ladys.computer:20231231:Shu1She4' or local-name()!='parsed-by' and local-name()!='media-type']|node()"/> + </xslt:copy> + </xslt:when> + <xslt:otherwise> + <xslt:copy-of select="."/> + </xslt:otherwise> + </xslt:choose> + </xslt:for-each> + </xslt:template> + <xslt:template match="/"> + <xslt:variable name="parsedroot"> + <xslt:apply-templates select="node()" mode="书社:parse"/> + </xslt:variable> + <xslt:for-each select="exsl:node-set($parsedroot)/node()"> + <xslt:choose> + <xslt:when test="self::*"> + <xslt:copy> + <xslt:attribute name="书社:cksum"> + <xslt:value-of select="$CKSUM"/> + </xslt:attribute> + <xslt:copy-of select="@*|node()"/> + </xslt:copy> + </xslt:when> + <xslt:otherwise> + <xslt:copy-of select="."/> + </xslt:otherwise> + </xslt:choose> + </xslt:for-each> + </xslt:template> + <xslt:template match="@*|node()" priority="-1"> + <xslt:copy> + <xslt:apply-templates select="@*|node()" mode="书社:parse"/> + </xslt:copy> + </xslt:template> + <xslt:template match="html:script[@type]" mode="书社:parse" priority="1"> + <xslt:variable name="parserdiv" select="exsl:node-set($书社:parsers)//html:div[html:dd=current()/@type]"/> + <xslt:choose> + <xslt:when test="$parserdiv"> + <xslt:variable name="result"> + <xslt:apply-templates select="."/> + </xslt:variable> + <xslt:variable name="reparsed-result"> + <xslt:apply-templates select="exsl:node-set($result)/node()" mode="书社:parse"/> + </xslt:variable> + <xslt:call-template name="书社:apply-parsed-by"> + <xslt:with-param name="id" select="string($parserdiv/html:dt)"/> + <xslt:with-param name="media-type" select="string(@type)"/> + <xslt:with-param name="result" select="exsl:node-set($reparsed-result)"/> + </xslt:call-template> + </xslt:when> + <xslt:otherwise> + <xslt:apply-templates select="."/> + </xslt:otherwise> + </xslt:choose> + </xslt:template> + <xslt:template match="@*|node()" mode="书社:parse"> + <xslt:apply-templates select="."/> + </xslt:template> + </xslt:transform> </template> + <output method="xml" encoding="UTF-8"/> </transform>