<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:px="http://www.daisy.org/ns/pipeline/xproc" xmlns:pxi="http://www.daisy.org/ns/pipeline/xproc-internal" xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:cx="http://xmlcalabash.com/ns/extensions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:err="http://www.w3.org/ns/xproc-error" version="1.0" type="px:epub3-ocf-finalize" name="main"> <p:input port="source" primary="true"/> <p:input port="metadata" sequence="true"> <p:empty/> </p:input> <p:input port="rights" sequence="true"> <p:empty/> </p:input> <p:input port="signature" sequence="true"> <p:empty/> </p:input> <p:option name="create-odf-manifest" select="'false'" cx:as="xs:string"/> <p:option name="epub-dir"/> <p:output port="result" primary="true"> <p:pipe port="result" step="fileset-finalized"/> </p:output> <p:output port="container"> <p:pipe port="result" step="create-container-descriptor"/> </p:output> <p:output port="in-memory.out" sequence="true"> <p:pipe port="result" step="create-container-descriptor"/> <p:pipe port="result" step="create-odf-manifest"/> <p:pipe port="metadata" step="main"/> <p:pipe port="rights" step="main"/> <p:pipe port="signature" step="main"/> </p:output> <p:import href="http://www.daisy.org/pipeline/modules/fileset-utils/library.xpl"> <p:documentation> px:fileset-add-entry </p:documentation> </p:import> <p:import href="http://www.daisy.org/pipeline/modules/file-utils/library.xpl"> <p:documentation> px:set-base-uri </p:documentation> </p:import> <p:import href="http://www.daisy.org/pipeline/modules/odf-utils/library.xpl"> <p:documentation> px:odf-manifest-from-fileset </p:documentation> </p:import> <p:declare-step type="pxi:fileset-add-ocf-entry" name="store-in-ocf"> <p:input port="fileset" primary="true"/> <p:input port="source" sequence="true"/> <p:option name="path" required="true"/> <p:option name="media-type"/> <p:output port="result"/> <p:wrap-sequence wrapper="wrapper"> <p:input port="source"> <p:pipe port="source" step="store-in-ocf"/> </p:input> </p:wrap-sequence> <p:choose> <p:when test="count(wrapper/*)=0"> <p:identity> <p:input port="source"> <p:pipe port="fileset" step="store-in-ocf"/> </p:input> </p:identity> </p:when> <p:when test="count(wrapper/*)>1"> <p:error code="err:EOU001"> <p:input port="source"> <p:inline> <c:message>It is a dynamic error if more than one document appears on the source port.</c:message> </p:inline> </p:input> </p:error> </p:when> <p:otherwise> <p:unwrap match="/wrapper"/> <p:choose> <p:when test="p:value-available('media-type')"> <px:fileset-add-entry> <p:with-option name="href" select="$path"/> <p:with-option name="media-type" select="$media-type"/> <p:input port="source.fileset"> <p:pipe port="fileset" step="store-in-ocf"/> </p:input> </px:fileset-add-entry> </p:when> <p:otherwise> <px:fileset-add-entry> <p:with-option name="href" select="$path"/> <p:input port="source.fileset"> <p:pipe port="fileset" step="store-in-ocf"/> </p:input> </px:fileset-add-entry> </p:otherwise> </p:choose> </p:otherwise> </p:choose> </p:declare-step> <p:wrap-sequence name="opf-files" wrapper="wrapper"> <p:input port="source" select="//*[@media-type='application/oebps-package+xml' or ends-with(@href,'.opf')]"> <p:pipe port="source" step="main"/> </p:input> </p:wrap-sequence> <p:sink/> <p:group name="create-container-descriptor"> <p:output port="result"/> <p:xslt> <p:with-param name="result-base" select="/*/@result-base"> <p:pipe port="result" step="result-base"/> </p:with-param> <p:input port="source"> <p:pipe port="result" step="opf-files"/> </p:input> <p:input port="stylesheet"> <p:document href="ocf-finalize.create-container-descriptor.xsl"/> </p:input> <p:input port="parameters"> <p:empty/> </p:input> </p:xslt> <px:set-base-uri> <p:with-option name="base-uri" select="resolve-uri('META-INF/container.xml',/*/@result-base)"> <p:pipe port="result" step="result-base"/> </p:with-option> </px:set-base-uri> </p:group> <p:sink/> <p:group xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" name="create-odf-manifest"> <p:output port="result" sequence="true"/> <p:identity> <p:input port="source"> <p:pipe port="result" step="before-odf"/> </p:input> </p:identity> <p:choose> <p:when test="$create-odf-manifest = 'true'"> <px:fileset-add-entry media-type="application/epub+zip" href="."/> <px:odf-manifest-from-fileset/> <px:set-base-uri> <p:with-option name="base-uri" select="resolve-uri('META-INF/manifest.xml',/*/@result-base)"> <p:pipe port="result" step="result-base"/> </p:with-option> </px:set-base-uri> </p:when> <p:otherwise> <p:identity/> </p:otherwise> </p:choose> <p:filter select="/manifest:manifest"/> </p:group> <p:choose name="check-fileset"> <p:xpath-context> <p:pipe port="result" step="opf-files"/> </p:xpath-context> <p:when test="not(wrapper/*)"> <p:error code="err:EOU002"> <p:input port="source"> <p:inline> <c:message>No OPF was found in the source file set.</c:message> </p:inline> </p:input> </p:error> </p:when> <p:otherwise> <p:identity> <p:input port="source"> <p:pipe port="source" step="main"/> </p:input> </p:identity> </p:otherwise> </p:choose> <pxi:fileset-add-ocf-entry path="META-INF/container.xml" media-type="application/xml"> <p:input port="source"> <p:pipe port="result" step="create-container-descriptor"/> </p:input> </pxi:fileset-add-ocf-entry> <pxi:fileset-add-ocf-entry path="META-INF/metadata.xml" media-type="application/xml"> <p:input port="source"> <p:pipe port="metadata" step="main"/> </p:input> </pxi:fileset-add-ocf-entry> <pxi:fileset-add-ocf-entry path="META-INF/rights.xml" media-type="application/xml"> <p:input port="source"> <p:pipe port="rights" step="main"/> </p:input> </pxi:fileset-add-ocf-entry> <pxi:fileset-add-ocf-entry path="META-INF/signature.xml" media-type="application/xml"> <p:input port="source"> <p:pipe port="signature" step="main"/> </p:input> </pxi:fileset-add-ocf-entry> <p:identity name="before-odf"/> <pxi:fileset-add-ocf-entry path="META-INF/manifest.xml" media-type="application/xml"> <p:input port="source"> <p:pipe port="result" step="create-odf-manifest"/> </p:input> </pxi:fileset-add-ocf-entry> <p:identity name="fileset-finalized"/> <p:identity> <p:input port="source"> <p:inline> <result-base/> </p:inline> </p:input> </p:identity> <p:choose> <p:when test="p:value-available('epub-dir')"> <p:add-attribute match="/*" attribute-name="result-base"> <p:with-option name="attribute-value" select="$epub-dir"/> </p:add-attribute> </p:when> <p:otherwise> <p:add-attribute match="/*" attribute-name="result-base"> <p:with-option name="attribute-value" select="base-uri(/*)"> <p:pipe port="source" step="main"/> </p:with-option> </p:add-attribute> </p:otherwise> </p:choose> <p:identity name="result-base"/> <p:sink/> </p:declare-step>