<
p:declare-step xmlns:p=
"http://www.w3.org/ns/xproc" xmlns:px=
"http://www.daisy.org/ns/pipeline/xproc" xmlns:d=
"http://www.daisy.org/ns/pipeline/data" xmlns:cx=
"http://xmlcalabash.com/ns/extensions" xmlns:xs=
"http://www.w3.org/2001/XMLSchema" version=
"1.0" type=
"px:zedai-to-html" name=
"main" exclude-inline-prefixes=
"#all">
<
p:documentation>
Transforms a ZedAI (DAISY 4 XML) document into an EPUB 3 publication.
</
p:documentation>
<
p:input port=
"fileset.in" primary=
"true"/>
<
p:input port=
"in-memory.in" sequence=
"true"/>
<
p:output port=
"fileset.out" primary=
"true"/>
<
p:output port=
"in-memory.out" sequence=
"true">
<
p:pipe step=
"html" port=
"in-memory"/>
<
p:pipe step=
"resources" port=
"in-memory"/>
</
p:output>
<
p:output port=
"mapping">
<
p:documentation xmlns=
"http://www.w3.org/1999/xhtml">
<
p>A <
code>d:fileset</
code> document that contains a mapping from input file (ZedAI) to
output files (HTML) and contained <
code>id</
code> attributes.</
p>
</
p:documentation>
<
p:pipe step=
"html" port=
"mapping"/>
</
p:output>
<
p:option name=
"output-dir" required=
"true"/>
<
p:option name=
"chunk" select=
"'false'" cx:as=
"xs:string"/>
<
p:option name=
"chunk-size" required=
"false" select=
"'-1'"/>
<
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/fileset-utils/library.xpl">
<
p:documentation>
px:fileset-load
px:fileset-create
px:fileset-add-entries
px:fileset-join
px:fileset-filter
px:fileset-filter-in-memory
px:fileset-load
px:fileset-move
</
p:documentation>
</
p:import>
<
p:import href=
"http://www.daisy.org/pipeline/modules/common-utils/library.xpl">
<
p:documentation>
px:assert
</
p:documentation>
</
p:import>
<
p:import href=
"http://www.daisy.org/pipeline/modules/html-utils/library.xpl">
<
p:documentation>
px:html-chunker
px:html-outline
</
p:documentation>
</
p:import>
<
p:documentation>Retreive the ZedAI document from the input fileset.</
p:documentation>
<
p:group>
<
px:fileset-load media-types=
"application/z3998-auth+xml">
<
p:input port=
"in-memory">
<
p:pipe step=
"main" port=
"in-memory.in"/>
</
p:input>
</
px:fileset-load>
<
px:assert message=
"No XML documents with the ZedAI media type ('application/z3998-auth+xml') found in the fileset." test-count-min=
"1" error-code=
"PEZE00"/>
<
px:assert message=
"More than one XML document with the ZedAI media type ('application/z3998-auth+xml') found in the fileset; there can only be one ZedAI document." test-count-max=
"1" error-code=
"PEZE00"/>
</
p:group>
<
p:documentation>Convert the ZedAI Document into several XHTML Documents</
p:documentation>
<
p:group name=
"html">
<
p:output port=
"fileset" primary=
"true">
<
p:pipe step=
"zedai-to-html.fileset" port=
"result"/>
</
p:output>
<
p:output port=
"in-memory" sequence=
"true">
<
p:pipe step=
"zedai-to-html.html-chunks" port=
"result"/>
</
p:output>
<
p:output port=
"mapping">
<
p:pipe step=
"compose-mapping" port=
"result"/>
</
p:output>
<
p:variable name=
"zedai-basename" select=
"base-uri(/*)">
</
p:variable>
<
p:variable name=
"result-basename" select=
"concat( $output-dir, replace(replace($zedai-basename,'^.+/([^/]+)$','$1'),'^(.+)\.[^\.]+$','$1'), '.xhtml')">
<
p:empty/>
</
p:variable>
<
p:group name=
"zedai-to-html.html-single">
<
p:output port=
"result" primary=
"true">
<
p:pipe step=
"result" port=
"result"/>
</
p:output>
<
p:output port=
"mapping">
<
p:pipe step=
"mapping" port=
"result"/>
</
p:output>
<
p:xslt>
<
p:input port=
"stylesheet">
<
p:document href=
"../xslt/zedai-to-html.xsl"/>
</
p:input>
<
p:input port=
"parameters">
<
p:empty/>
</
p:input>
</
p:xslt>
<
px:html-outline fix-heading-ranks=
"outline-depth"/>
<
px:set-base-uri name=
"result">
<
p:with-option name=
"base-uri" select=
"$result-basename"/>
</
px:set-base-uri>
<
p:template name=
"mapping">
<
p:input port=
"template">
<
p:inline>
<
d:fileset>
<
d:file href=
"{base-uri(/*)}" original-href=
"{$zedai-basename}"/>
</
d:fileset>
</
p:inline>
</
p:input>
<
p:with-param name=
"zedai-basename" select=
"$zedai-basename"/>
</
p:template>
<
p:sink/>
</
p:group>
<
p:choose name=
"zedai-to-html.html-chunks">
<
p:documentation>Split XHTML document</
p:documentation>
<
p:when test=
"$chunk='true'">
<
p:output port=
"result" sequence=
"true" primary=
"true"/>
<
p:output port=
"mapping">
<
p:pipe step=
"chunker" port=
"mapping"/>
</
p:output>
<
px:html-chunker name=
"chunker">
<
p:with-option name=
"max-chunk-size" select=
"$chunk-size"/>
</
px:html-chunker>
</
p:when>
<
p:otherwise>
<
p:output port=
"result" sequence=
"true" primary=
"true"/>
<
p:output port=
"mapping">
<
p:inline><
d:fileset/></
p:inline>
</
p:output>
<
p:identity/>
</
p:otherwise>
</
p:choose>
<
p:sink/>
<
p:documentation>Construct HTML fileset</
p:documentation>
<
px:fileset-create>
<
p:with-option name=
"base" select=
"$output-dir"/>
</
px:fileset-create>
<
px:fileset-add-entries media-type=
"application/xhtml+xml">
<
p:input port=
"entries">
<
p:pipe step=
"zedai-to-html.html-chunks" port=
"result"/>
</
p:input>
<
p:with-param port=
"file-attributes" name=
"doctype" select=
"'<!DOCTYPE html>'"/>
</
px:fileset-add-entries>
<
px:fileset-join name=
"zedai-to-html.fileset"/>
<
p:sink/>
<
px:fileset-compose name=
"compose-mapping">
<
p:input port=
"source">
<
p:pipe step=
"zedai-to-html.html-single" port=
"mapping"/>
<
p:pipe step=
"zedai-to-html.html-chunks" port=
"mapping"/>
</
p:input>
</
px:fileset-compose>
<
p:sink/>
</
p:group>
<
p:identity>
<
p:input port=
"source">
<
p:pipe step=
"main" port=
"fileset.in"/>
</
p:input>
</
p:identity>
<
p:group name=
"resources">
<
p:documentation>
Fileset with everything except the ZedAI file, rebased from the ZedAI file to $output-dir.
</
p:documentation>
<
p:output port=
"fileset" primary=
"true"/>
<
p:output port=
"in-memory" sequence=
"true">
<
p:pipe step=
"move" port=
"result.in-memory"/>
</
p:output>
<
p:variable name=
"zedai-uri" select=
"(//d:file[@media-type='application/z3998-auth+xml'])[1]/resolve-uri(@href,base-uri(.))"/>
<
px:fileset-filter not-media-types=
"application/z3998-auth+xml"/>
<
p:documentation>
Remove files that are neither in memory nor on disk
</
p:documentation>
<
p:identity name=
"fileset.dirty"/>
<
px:fileset-filter-in-memory name=
"fileset.in-memory">
<
p:input port=
"source.in-memory">
<
p:pipe step=
"main" port=
"in-memory.in"/>
</
p:input>
</
px:fileset-filter-in-memory>
<
px:fileset-load name=
"in-memory">
<
p:input port=
"in-memory">
<
p:pipe step=
"main" port=
"in-memory.in"/>
</
p:input>
</
px:fileset-load>
<
p:sink/>
<
p:delete match=
"d:file[not(@original-href)]" name=
"fileset.on-disk">
<
p:input port=
"source">
<
p:pipe step=
"fileset.dirty" port=
"result"/>
</
p:input>
</
p:delete>
<
p:sink/>
<
px:fileset-join>
<
p:input port=
"source">
<
p:pipe step=
"fileset.in-memory" port=
"result"/>
<
p:pipe step=
"fileset.on-disk" port=
"result"/>
</
p:input>
</
px:fileset-join>
<
px:fileset-rebase>
<
p:with-option name=
"new-base" select=
"$zedai-uri"/>
</
px:fileset-rebase>
<
px:fileset-copy name=
"move">
<
p:input port=
"source.in-memory">
<
p:pipe step=
"in-memory" port=
"result"/>
</
p:input>
<
p:with-option name=
"target" select=
"$output-dir"/>
</
px:fileset-copy>
</
p:group>
<
p:sink/>
<
px:fileset-join>
<
p:input port=
"source">
<
p:pipe step=
"html" port=
"fileset"/>
<
p:pipe step=
"resources" port=
"fileset"/>
</
p:input>
</
px:fileset-join>
</
p:declare-step>