From: Lady <redacted>
Date: Sat, 3 Aug 2024 17:21:55 +0000 (-0400)
Subject: Add H·T·M·L microdata to archive children
X-Git-Tag: 0.12.3~1
X-Git-Url: https://git.ladys.computer/Shushe/commitdiff_plain/dcd6da9bf7c21c6e5cf799df62598087a7c1fffa?ds=inline;hp=f97ddff396fdd93bd22839ffc494df45258404bf

Add H·T·M·L microdata to archive children

These attributes (`@itemscope` and `@itemtype`) are normally added at
the beginning of expansion to the root node of the document, prior to
it being wrapped. With archives, they should be added to archive
children as part of the processing which happens during application,
just prior to the wrapping which likewise occurs there. Having these
attributes present is important for title microdata processing (which
happens as a part of wrapping) to work correctly.

As part of this work, microdata handling is improved slightly in all
cases.

Note: If the `@itemscope` or `@itemtype` attributes were already
present on the children of the archive element, for example because
the child was the result of an embed, they will not necessicarily be
adjusted. It’s necessary to remove any embed typing during normal
processing if document typing is desired during the application phase.
---

diff --git a/lib/catalog2transform.xslt b/lib/catalog2transform.xslt
index 3cb8a2d..05ca7d5 100644
--- a/lib/catalog2transform.xslt
+++ b/lib/catalog2transform.xslt
@@ -307,19 +307,55 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
 					<xslt:for-each select="node()">
 						<xslt:choose>
 							<xslt:when test="self::*">
-								<xslt:variable name="component">
-									<xslt:choose>
-										<xslt:when test="self::书社:*[local-name()='raw-text' or local-name()='base64-binary' or local-name()='archive']|@书社:disable-output-wrapping">
-											<xslt:copy-of select="."/>
-										</xslt:when>
-										<xslt:otherwise>
-											<xslt:call-template name="书社:wrap">
-												<xslt:with-param name="nodes" select="."/>
-											</xslt:call-template>
-										</xslt:otherwise>
-									</xslt:choose>
+								<xslt:variable name="component-fragment">
+									<xslt:copy>
+										<xslt:choose>
+											<xslt:when test="self::html:*">
+												<xslt:variable name="existing-types" select="exslstr:tokenize(@itemtype)"/>
+												<xslt:attribute name="itemscope">itemscope</xslt:attribute>
+												<xslt:attribute name="itemtype">
+													<xslt:for-each select="$existing-types/token">
+														<xslt:if test="position()!=1">
+															<xslt:text>
+																<text> </text>
+															</xslt:text>
+														</xslt:if>
+														<xslt:value-of select="."/>
+													</xslt:for-each>
+													<xslt:if test="not($existing-types/token[string()='&书社;:embed' or string()='&书社;:document'])">
+														<xslt:if test="$existing-types/token">
+															<xslt:text>
+																<text> </text>
+															</xslt:text>
+														</xslt:if>
+														<xslt:text>
+															<text>&书社;:document</text>
+														</xslt:text>
+													</xslt:if>
+												</xslt:attribute>
+												<xslt:copy-of select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype'))]|node()"/>
+											</xslt:when>
+											<xslt:otherwise>
+												<xslt:copy-of select="@*|node()"/>
+											</xslt:otherwise>
+										</xslt:choose>
+									</xslt:copy>
+								</xslt:variable>
+								<xslt:variable name="wrapped-component-fragment">
+									<xslt:for-each select="exsl:node-set($component-fragment)/*">
+										<xslt:choose>
+											<xslt:when test="self::书社:*[local-name()='raw-text' or local-name()='base64-binary' or local-name()='archive']|@书社:disable-output-wrapping">
+												<xslt:copy-of select="."/>
+											</xslt:when>
+											<xslt:otherwise>
+												<xslt:call-template name="书社:wrap">
+													<xslt:with-param name="nodes" select="."/>
+												</xslt:call-template>
+											</xslt:otherwise>
+										</xslt:choose>
+									</xslt:for-each>
 								</xslt:variable>
-								<xslt:apply-templates select="exsl:node-set($component)/node()" mode="书社:apply"/>
+								<xslt:apply-templates select="exsl:node-set($wrapped-component-fragment)/node()" mode="书社:apply"/>
 							</xslt:when>
 							<xslt:otherwise>
 								<xslt:apply-templates select="." mode="书社:apply"/>
@@ -363,17 +399,27 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
 								<xslt:copy>
 									<xslt:choose>
 										<xslt:when test="self::html:*">
+											<xslt:variable name="existing-types" select="exslstr:tokenize(@itemtype)"/>
 											<xslt:attribute name="itemscope">itemscope</xslt:attribute>
 											<xslt:attribute name="itemtype">
-												<xslt:text>
-													<text>&书社;:embed</text>
-												</xslt:text>
-												<xslt:for-each select="exslstr:tokenize(@itemtype)/token[string()!='&书社;:document']">
-													<xslt:text>
-														<text> </text>
-													</xslt:text>
+												<xslt:for-each select="$existing-types/token[string()!='&书社;:document']">
+													<xslt:if test="position()!=1">
+														<xslt:text>
+															<text> </text>
+														</xslt:text>
+													</xslt:if>
 													<xslt:value-of select="."/>
 												</xslt:for-each>
+												<xslt:if test="not($existing-types/token[string()='&书社;:embed'])">
+													<xslt:if test="$existing-types/token[string()!='&书社;:document']">
+														<xslt:text>
+															<text> </text>
+														</xslt:text>
+													</xslt:if>
+													<xslt:text>
+														<text>&书社;:embed</text>
+													</xslt:text>
+												</xslt:if>
 											</xslt:attribute>
 											<xslt:copy-of select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype'))]|node()"/>
 										</xslt:when>
@@ -408,17 +454,27 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
 					</xslt:if>
 					<xslt:choose>
 						<xslt:when test="self::html:*">
+							<xslt:variable name="existing-types" select="exslstr:tokenize(@itemtype)"/>
 							<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:for-each select="$existing-types/token">
+									<xslt:if test="position()!=1">
+										<xslt:text>
+											<text> </text>
+										</xslt:text>
+									</xslt:if>
 									<xslt:value-of select="."/>
 								</xslt:for-each>
+								<xslt:if test="not($existing-types/token[string()='&书社;:embed' or string()='&书社;:document'])">
+									<xslt:if test="$existing-types/token">
+										<xslt:text>
+											<text> </text>
+										</xslt:text>
+									</xslt:if>
+									<xslt:text>
+										<text>&书社;:document</text>
+									</xslt:text>
+								</xslt:if>
 							</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>