X-Git-Url: https://git.ladys.computer/Shushe/blobdiff_plain/c4c2cfb24adfa62c6b4cbd819b7efe80438d8d08..7e39a36064ba7afc8c061ca5c2da125756014553:/lib/expandmetadata.xslt

diff --git a/lib/expandmetadata.xslt b/lib/expandmetadata.xslt
index e75fe23..f2efd18 100644
--- a/lib/expandmetadata.xslt
+++ b/lib/expandmetadata.xslt
@@ -13,7 +13,6 @@ 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:dct="http://purl.org/dc/terms/"
 	xmlns:exsl="http://exslt.org/common"
 	xmlns:nie="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#"
 	xmlns:nfo="http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#"
@@ -24,107 +23,106 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
 	extension-element-prefixes="exsl"
 	version="1.0"
 >
-	<variable name="builddir" select="//*[@rdf:about='about:shushe?builddir']/@nfo:fileUrl"/>
-	<variable name="files" select="/rdf:RDF/nfo:LocalFileDataObject[not(nie:interpretedAs/nfo:Folder)]"/>
-	<template name="书社:process-dependencies">
-		<param name="processed"/>
-		<param name="unprocessed"/>
-		<variable name="queue">
-			<copy-of select="exsl:node-set($unprocessed)/书社:dependency-root"/>
-			<for-each select="exsl:node-set($unprocessed)/书社:dependency">
-				<if test="not((exsl:node-set($processed)/书社:*|preceding-sibling::书社:*|following-sibling::书社:recursive-dependency)[string()=string(current())])">
-					<copy-of select="."/>
-				</if>
-			</for-each>
-		</variable>
-		<variable name="old">
-			<copy-of select="exsl:node-set($processed)/书社:dependency-root"/>
-			<copy-of select="exsl:node-set($processed)/书社:recursive-dependency"/>
-			<for-each select="exsl:node-set($unprocessed)/书社:recursive-dependency">
-				<if test="not((exsl:node-set($processed)/书社:recursive-dependency|preceding-sibling::书社:recursive-dependency)[string()=string(current())])">
-					<copy-of select="."/>
-				</if>
-			</for-each>
-			<for-each select="exsl:node-set($processed)/书社:dependency">
-				<if test="not(exsl:node-set($unprocessed)/书社:recursive-dependency[string()=string(current())])">
-					<copy-of select="."/>
-				</if>
-			</for-each>
-			<copy-of select="$queue"/>
-		</variable>
-		<variable name="new">
-			<for-each select="exsl:node-set($queue)/书社:*">
-				<for-each select="$files[@rdf:about=string(current()) and nie:interpretedAs/nfo:PlainTextDocument]">
-					<variable name="parent" select="@rdf:about"/>
-					<variable name="subdir">
+	<variable name="builddir" select="//书社vocab:BuildDirectory/@nfo:fileUrl"/>
+	<variable name="files" select="//书社vocab:SourceFile|//书社vocab:IncludeFile"/>
+	<template name="书社:collect-dependency-paths">
+		<param name="path" select="/.."/>
+		<variable name="parent" select="string($path/*[last()])"/>
+		<variable name="children-fragment">
+			<for-each select="$files[@rdf:about=$parent and nie:interpretedAs/nfo:PlainTextDocument]">
+				<variable name="uri" select="书社vocab:hasParsedFile/@nfo:fileUrl"/>
+				<for-each select="document($uri)//书社:link[@xlink:show='embed']">
+					<variable name="identifier" select="string(@xlink:href)"/>
+					<variable name="is-dir" select="substring($identifier, string-length($identifier))='/'"/>
+					<for-each select="$files/@rdf:about[string(.)=$identifier or $is-dir and starts-with(., $identifier)]">
+						<sort select="." data-type="text" lang="zxx" case-order="upper-first"/>
 						<choose>
-							<when test="starts-with($parent, 'about:shushe?include=')">
-								<text>/includes/</text>
-							</when>
-							<when test="starts-with($parent, 'about:shushe?source=')">
-								<text>/sources/</text>
+							<when test="$path/*[string(.)=string(current())]">
+								<书社:recursive-dependency>
+									<value-of select="."/>
+								</书社:recursive-dependency>
 							</when>
+							<otherwise>
+								<书社:dependency>
+									<value-of select="."/>
+								</书社:dependency>
+							</otherwise>
 						</choose>
-					</variable>
-					<for-each select="document(concat($builddir, $subdir, @nfo:fileName), .)//书社:link[@xlink:show='embed']">
-						<if test="exsl:node-set($old)/书社:dependency-root[string()=string(current()/@xlink:href)]">
-							<书社:recursive-dependency>
-								<value-of select="$parent"/>
-							</书社:recursive-dependency>
-						</if>
-						<if test="$files/@rdf:about[string()=string(current()/@xlink:href)]">
-							<书社:dependency>
-								<value-of select="@xlink:href"/>
-							</书社:dependency>
-						</if>
 					</for-each>
 				</for-each>
 			</for-each>
 		</variable>
+		<variable name="children" select="exsl:node-set($children-fragment)"/>
 		<choose>
-			<when test="exsl:node-set($new)/书社:dependency">
-				<call-template name="书社:process-dependencies">
-					<with-param name="processed">
-						<copy-of select="$old"/>
-					</with-param>
-					<with-param name="unprocessed">
-						<copy-of select="$new"/>
-					</with-param>
-				</call-template>
+			<when test="$children/*">
+				<for-each select="$children/书社:recursive-dependency">
+					<书社:dependency-path>
+						<copy-of select="$path[string(.)=string(current())]/preceding-sibling::*"/>
+						<copy-of select="."/>
+					</书社:dependency-path>
+				</for-each>
+				<for-each select="$children/书社:dependency">
+					<variable name="path-fragment">
+						<copy-of select="$path"/>
+						<copy-of select="."/>
+					</variable>
+					<call-template name="书社:collect-dependency-paths">
+						<with-param name="path" select="exsl:node-set($path-fragment)"/>
+					</call-template>
+				</for-each>
 			</when>
 			<otherwise>
-				<copy-of select="$old"/>
+				<书社:dependency-path>
+					<copy-of select="$path"/>
+				</书社:dependency-path>
 			</otherwise>
 		</choose>
 	</template>
-	<template match="rdf:RDF/nfo:LocalFileDataObject[not(nie:interpretedAs/nfo:Folder or nie:interpretedAs/nfo:PlainTextDocument)]" priority="1">
+	<template match="//书社vocab:SourceFile[not(nie:interpretedAs/nfo:PlainTextDocument)]" priority="1">
 		<copy>
-			<apply-templates select="@*|node()"/>
-			<if test="starts-with(@rdf:about, 'about:shushe?source=')">
-				<dct:hasFormat>
-					<nfo:LocalFileDataObject dct:creator="urn:fdc:ladys.computer:20231231:Shu1She4" nfo:fileName="{substring-after(@rdf:about, 'about:shushe?source=')}"/>
-				</dct:hasFormat>
-			</if>
+			<apply-templates select="@*"/>
+			<attribute name="书社vocab:destination">
+				<value-of select="@书社vocab:path"/>
+			</attribute>
+			<apply-templates select="node()"/>
 		</copy>
 	</template>
-	<template match="rdf:RDF/nfo:LocalFileDataObject[nie:interpretedAs/nfo:PlainTextDocument]" priority="1">
-		<variable name="parsed" select="document(concat($builddir, '/sources/', @nfo:fileName), .)"/>
+	<template match="//书社vocab:SourceFile[nie:interpretedAs/nfo:PlainTextDocument]" priority="1">
+		<variable name="parsed" select="document(书社vocab:hasParsedFile/@nfo:fileUrl)"/>
 		<variable name="destination-delim" select="concat('/', $parsed/*/@书社:destination, '/')"/>
 		<variable name="destination">
 			<choose>
-				<when test="not(starts-with(@rdf:about, 'about:shushe?source='))"/>
 				<when test="not(contains($destination-delim, '//') or contains($destination-delim, '/./') or contains($destination-delim, '/../'))">
 					<value-of select="$parsed/*/@书社:destination"/>
 				</when>
 				<otherwise>
-					<value-of select="substring-after(@rdf:about, 'about:shushe?source=')"/>
+					<value-of select="@书社vocab:path"/>
 				</otherwise>
 			</choose>
 		</variable>
 		<variable name="dependencies-fragment">
 			<apply-templates select="." mode="书社:dependencies"/>
 		</variable>
-		<variable name="dependencies" select="exsl:node-set($dependencies)"/>
+		<variable name="dependencies" select="exsl:node-set($dependencies-fragment)"/>
+		<copy>
+			<apply-templates select="@*"/>
+			<attribute name="书社vocab:destination">
+				<value-of select="$destination"/>
+			</attribute>
+			<apply-templates select="node()"/>
+			<for-each select="$dependencies/书社:dependency">
+				<书社vocab:hasDependencyOn rdf:resource="{.}"/>
+			</for-each>
+			<for-each select="$dependencies/书社:recursive-dependency">
+				<书社vocab:hasRecursiveDependencyOn rdf:resource="{.}"/>
+			</for-each>
+		</copy>
+	</template>
+	<template match="//书社vocab:IncludeFile[nie:interpretedAs/nfo:PlainTextDocument]" priority="1">
+		<variable name="dependencies-fragment">
+			<apply-templates select="." mode="书社:dependencies"/>
+		</variable>
+		<variable name="dependencies" select="exsl:node-set($dependencies-fragment)"/>
 		<copy>
 			<apply-templates select="@*|node()"/>
 			<for-each select="$dependencies/书社:dependency">
@@ -133,28 +131,63 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
 			<for-each select="$dependencies/书社:recursive-dependency">
 				<书社vocab:hasRecursiveDependencyOn rdf:resource="{.}"/>
 			</for-each>
-			<if test="$destination!=''">
-				<dct:hasFormat>
-					<nfo:LocalFileDataObject dct:creator="urn:fdc:ladys.computer:20231231:Shu1She4" nfo:fileName="{$destination}">
-					</nfo:LocalFileDataObject>
-				</dct:hasFormat>
-			</if>
 		</copy>
 	</template>
+	<template match="/">
+		<variable name="result-fragment">
+			<apply-templates/>
+		</variable>
+		<variable name="result" select="exsl:node-set($result-fragment)"/>
+		<copy-of select="$result/*"/>
+		<exsl:document href="dependencies" method="text" encoding="UTF-8">
+			<for-each select="$result/rdf:RDF/*[nie:interpretedAs/nfo:PlainTextDocument]">
+				<value-of select="@rdf:about"/>
+				<text>&#xA;</text>
+				<for-each select="书社vocab:hasRecursiveDependencyOn/@rdf:resource">
+					<text>&#x9;</text>
+					<text>-</text>
+					<value-of select="."/>
+					<text>&#xA;</text>
+				</for-each>
+				<for-each select="书社vocab:hasDependencyOn/@rdf:resource">
+					<text>&#x9;</text>
+					<value-of select="."/>
+					<text>&#xA;</text>
+				</for-each>
+			</for-each>
+		</exsl:document>
+		<exsl:document href="destinations" method="text" encoding="UTF-8">
+			<for-each select="$result//书社vocab:SourceFile">
+				<value-of select="@rdf:about"/>
+				<text>|</text>
+				<value-of select="@书社vocab:destination"/>
+				<text>&#xA;</text>
+			</for-each>
+		</exsl:document>
+	</template>
 	<template match="@*|node()">
 		<copy>
 			<apply-templates select="@*|node()"/>
 		</copy>
 	</template>
-	<template match="nfo:LocalFileDataObject" mode="书社:dependencies">
+	<template match="书社vocab:SourceFile|书社vocab:IncludeFile" mode="书社:dependencies">
 		<if test="nie:interpretedAs/nfo:PlainTextDocument">
-			<call-template name="书社:process-dependencies">
-				<with-param name="unprocessed">
-					<书社:dependency-root>
-						<value-of select="@rdf:about"/>
-					</书社:dependency-root>
-				</with-param>
-			</call-template>
+			<variable name="path-fragment">
+				<书社:dependency-root>
+					<value-of select="@rdf:about"/>
+				</书社:dependency-root>
+			</variable>
+			<variable name="paths-fragment">
+				<call-template name="书社:collect-dependency-paths">
+					<with-param name="path" select="exsl:node-set($path-fragment)"/>
+				</call-template>
+			</variable>
+			<for-each select="exsl:node-set($paths-fragment)/*/*[not(self::书社:dependency-root)]">
+				<if test="not(preceding::*[string(.)=string(current())])">
+					<copy-of select="."/>
+				</if>
+			</for-each>
 		</if>
 	</template>
+	<output method="xml" encoding="UTF-8"/>
 </transform>