From: Lady Date: Sat, 25 Oct 2025 01:06:15 +0000 (-0400) Subject: Support multiple destinations X-Git-Url: https://git.ladys.computer/Shushe/commitdiff_plain/1ba6bb315cf3e1c7120acff6c34149acf65f0120?ds=sidebyside;hp=d64a8d34c7638243f90421664268766df75a42d7 Support multiple destinations This commit enables transforming the same source file to multiple destinations, and provides a new variable for determining which destination is currently being written to. --- diff --git a/.metadata-format-changed-since b/.metadata-format-changed-since index b6faef5..36e448c 100644 --- a/.metadata-format-changed-since +++ b/.metadata-format-changed-since @@ -4,7 +4,7 @@ SPDX-License-Identifier: CC0-1.0 The following hash indicates a commit in which the metadata format generated by ⛩📰 书社 was different than it currently is :⁠— -338b26f8c92351bad03a180ad4b4f88e4cfeab76 +d64a8d34c7638243f90421664268766df75a42d7 The purpose of this file is to serve as a trackable dependency which will prompt a rebuild of metadata when the generation mechanism diff --git a/GNUmakefile b/GNUmakefile index 8f62e46..a3624cc 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -582,16 +582,16 @@ endif # (callable) Get the destination for the given source files, or return `.NOTDEF/$1´. # # The fallback here is because destinations are used to generate targets and thus must always be non·empty and should be unique, even when they haven’t been generated yet. -override destination = $(foreach file,$1,$(or $(patsubst $(file)|%,%,$(filter $(file)|%,$(sourcedestinationpair))),.NOTDEF/$1)) +override destination = $(foreach file,$1,$(subst ;, ,$(or $(patsubst $(file)|%,%,$(filter $(file)|%,$(sourcedestinationpair))),.NOTDEF/$1))) # Pair each source file with its compiled location. -override sourcecompiledpair := $(foreach file,$(sourcefiles),$(file)|$(BUILDDIR)/results/$(call destination,$(file))) +override sourcecompiledpair := $(foreach file,$(sourcefiles),$(file)|$(subst $(space),;,$(patsubst %,$(BUILDDIR)/results/%,$(call destination,$(file))))) # (callable) Get the location of the transformed X·M·L files for the given source files. -override compiled = $(foreach file,$1,$(patsubst $(file)|%,%,$(filter $(file)|%,$(sourcecompiledpair)))) +override compiled = $(foreach file,$1,$(subst ;, ,$(patsubst $(file)|%,%,$(filter $(file)|%,$(sourcecompiledpair))))) # (callable) Get the location of the source files for the given compiled file. -override uncompiled = $(foreach file,$1,$(patsubst %|$(file),%,$(filter %|$(file),$(sourcecompiledpair)))) +override uncompiled = $(foreach pair,$(sourcecompiledpair),$(foreach src,$(firstword $(subst |, , $(pair))),$(if $(filter $(subst ;, ,$(patsubst $(src)|%,%,$(pair))),$1),$(src),))) # (callable) Get the location of the final built files for the given source files. override built = $(foreach file,$1,$(patsubst $(BUILDDIR)/results/%,$(BUILDDIR)/public/%,$(call compiled,$(file)))) @@ -600,7 +600,7 @@ override built = $(foreach file,$1,$(patsubst $(BUILDDIR)/results/%,$(BUILDDIR)/ override unbuilt = $(foreach file,$1,$(call uncompiled,$(patsubst $(BUILDDIR)/public/%,$(BUILDDIR)/results/%,$(file)))) # (callable) Get the installed locations for the given source files. -override installed = $(foreach file,$1,$(DESTDIR)/$(call destination,$(file))) +override installed = $(foreach file,$1,$(patsubst %,$(DESTDIR)/%,$(call destination,$(file)))) # ─ ¶ Recipe Variable Definitions ───────────────────────────────────── @@ -624,7 +624,7 @@ install : $(call installed,$(recursivefiles) $(installablefiles)) ; # List all source files and includes and their computed types. list : - @$(PRINTF) '%b' $(call quote,$(foreach file,$(sort $(sourcefiles)) $(sort $(sourceincludes)),\0033[1m$(file)\0033[22m|$(call typeoffile,$(file))|[\0033[3m$(if $(filter $(file),$(xmlfiles)),xml,$(if $(filter $(file),$(plaintextfiles)),text,asset))$(if $(filter $(file),$(sourceincludes)),|include,)\0033[23m]$(if $(call dependencies,$(file))$(call recursives,$(file)), $(strip $(foreach recursive,$(call recursives,$(file)),\0033[93;41m•|Recursive|Dependency|\0033[39;49m|$(recursive)) $(foreach dependency,$(call dependencies,$(file)),\0033[2m•|Dependency|\0033[22m|$(dependency))))$(if $(filter $(file),$(sourcefiles)), →|<\0033[4m/$(call destination,$(file))\0033[24m>,) )) | $(TR) ' |' '\n ' + @$(PRINTF) '%b' $(call quote,$(foreach file,$(sort $(sourcefiles)) $(sort $(sourceincludes)),\0033[1m$(file)\0033[22m|$(call typeoffile,$(file))|[\0033[3m$(if $(filter $(file),$(xmlfiles)),xml,$(if $(filter $(file),$(plaintextfiles)),text,asset))$(if $(filter $(file),$(sourceincludes)),|include,)\0033[23m]$(if $(call dependencies,$(file))$(call recursives,$(file)), $(strip $(foreach recursive,$(call recursives,$(file)),\0033[93;41m•|Recursive|Dependency|\0033[39;49m|$(recursive)) $(foreach dependency,$(call dependencies,$(file)),\0033[2m•|Dependency|\0033[22m|$(dependency))))$(if $(filter $(file),$(sourcefiles)), $(foreach dest,$(call destination,$(file)),→|<\0033[4m/$(dest)\0033[24m>),) )) | $(TR) ' |' '\n ' # Lists out the destinations of all resulting files (relative to `DESTDIR´). listout : @@ -714,7 +714,7 @@ $(BUILDDIR)/transform.xslt : $(BUILDDIR)/transform.catalog $(BUILDDIR)/metadata $(call compiled,$(compilablefiles)) : $(BUILDDIR)/results/% : $$(call parseresult,$$(call uncompiled,$$@)) $$(call parseresult,$$(call dependencies,$$(call uncompiled,$$@))) $(BUILDDIR)/transform.catalog $(THISDIR)/lib/catalog2transform.xslt $(TRANSFORMLIBS) $$(call metadata,$$(call dependencies,$$(call uncompiled,$$@))) $(call inform,$(PRINTF) '%s\n' $(call quote,Compiling …) >&2) $(silent)$(call ensuredirectory,$(dir $@)) - $(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite --stringparam METADATA 'metadata' --stringparam BUILDTIME $$($(DATE) -u '+%Y-%m-%dT%H:%M:%SZ') --stringparam IDENTIFIER $(call quote,$(call localuri,$(call uncompiled,$@)))$(if $(THISREV), --stringparam THISREV $(call quote,$(THISREV)),)$(if $(SRCREV), --stringparam SRCREV $(call quote,$(SRCREV)),) $(call quote,$(BUILDDIR)/transform.xslt) $(call quote,$<) >|$(call quote,$@) + $(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite --stringparam METADATA 'metadata' --stringparam BUILDTIME $$($(DATE) -u '+%Y-%m-%dT%H:%M:%SZ') --stringparam IDENTIFIER $(call quote,$(call localuri,$(call uncompiled,$@)))$(if $(THISREV), --stringparam THISREV $(call quote,$(THISREV)),)$(if $(SRCREV), --stringparam SRCREV $(call quote,$(SRCREV)),) --stringparam DESTINATION $(call quote,$*) $(call quote,$(BUILDDIR)/transform.xslt) $(call quote,$<) >|$(call quote,$@) # Create the final files from the compiled results (or error in the case of recursive ones). $(call built,$(compilablefiles)) : $(BUILDDIR)/public/% : $(BUILDDIR)/results/% $(THISDIR)/lib/archive2extractor.xslt diff --git a/README.markdown b/README.markdown index 9b649d2..4671064 100644 --- a/README.markdown +++ b/README.markdown @@ -569,6 +569,9 @@ This behaviour can be customized by setting the `@书社:destination` This attribute is read after parsing, but before transformation (where it is silently dropped). +Multiple destinations can be provided if the same file should be output to multiple places. +The file is retransformed each time, with the value of the `DESTINATION` global param set appropriately. + ## Embedding Documents can be embedded in other documents using a `<书社:link>` @@ -708,6 +711,9 @@ The following params are made available globally in parsers and In transforms, the following params are additionally available :⁠— +- **`DESTINATION`:** + The destination being targeted by this transform. + - **`书社:about`:** R·D·F metadata about all of the documents ⛩📰 书社 knows about. Use `$书社:about//*[@rdf:about=$IDENTIFIER]` to get the metadata for diff --git a/lib/catalog2transform.xslt b/lib/catalog2transform.xslt index 0ba07f4..747225b 100644 --- a/lib/catalog2transform.xslt +++ b/lib/catalog2transform.xslt @@ -54,6 +54,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one + diff --git a/lib/expandmetadata.xslt b/lib/expandmetadata.xslt index 027aaa7..423924a 100644 --- a/lib/expandmetadata.xslt +++ b/lib/expandmetadata.xslt @@ -14,13 +14,14 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one @@ -89,34 +90,40 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one