<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step" xmlns:cx="http://xmlcalabash.com/ns/extensions" xmlns:px="http://www.daisy.org/ns/pipeline/xproc" xmlns:d="http://www.daisy.org/ns/pipeline/data" version="1.0" px:input-filesets="zedai" px:output-filesets="epub3 mp3" type="px:zedai-to-epub3.script" name="main"> <p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h1 px:role="name">ZedAI to EPUB 3</h1> <p px:role="desc">Transforms a ZedAI (DAISY 4 XML) document into an EPUB 3 publication.</p> <a px:role="homepage" href="http://daisy.github.io/pipeline/Get-Help/User-Guide/Scripts/zedai-to-epub3/"> Online documentation </a> </p:documentation> <p:input port="source" primary="true" px:media-type="application/z3998-auth+xml"> <p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">ZedAI document</h2> <p px:role="desc">Input ZedAI.</p> </p:documentation> </p:input> <p:output port="status" px:media-type="application/vnd.pipeline.status+xml"> <p:pipe step="load-convert-store" port="status"/> </p:output> <p:option name="include-tts-log" select="p:system-property('d:org.daisy.pipeline.tts.log')" px:type="boolean"><p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">Enable TTS log</h2> <p px:role="desc" xml:space="preserve">Whether or not to make the TTS log available. The TTS log contains a great deal of additional information that is not present in the main job log and that is helpful for troubleshooting. Most of the log entries concern particular chunks of text of the input document. The default can be changed using the [`org.daisy.pipeline.tts.log`](http://daisy.github.io/pipeline/Get-Help/User-Guide/Text-To-Speech/#common-settings) property. </p> </p:documentation> </p:option> <p:output port="tts-log" sequence="true"><p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">TTS log</h2> <p px:role="desc">Log file with information about text-to-speech process.</p> </p:documentation> <p:pipe step="load-convert-store" port="tts-log"/> </p:output> <p:option name="result" required="true" px:output="result" px:type="anyDirURI" px:media-type="text"> <p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">EPUB</h2> <p px:role="desc">The resulting EPUB 3 publication.</p> </p:documentation> </p:option> <p:input port="tts-config" px:media-type="application/vnd.pipeline.tts-config+xml"><p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">Text-to-speech configuration file</h2> <p px:role="desc" xml:space="preserve">Configuration file for text-to-speech. [More details on the configuration file format](http://daisy.github.io/pipeline/Get-Help/User-Guide/Text-To-Speech/).</p> </p:documentation> <p:inline><d:config/></p:inline> </p:input> <p:option xmlns:_="tts" name="_:stylesheet" select="''" required="false" px:type="anyURI" px:sequence="true" px:separator=" " px:media-type="text/css text/x-scss"><p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">Style sheets</h2> <p px:role="desc" xml:space="preserve">A list of CSS style sheets to take into account. Must be a space separated list of URIs, absolute or relative to the input. Style sheets specified through this option are called "[user style sheets](https://www.w3.org/TR/CSS2/cascade.html#cascade)". Style sheets can also be attached to the source document. These are referred to as "[author style sheets](https://www.w3.org/TR/CSS2/cascade.html#cascade)". They can be linked (using an ['xml-stylesheet' processing instruction](https://www.w3.org/TR/xml-stylesheet) or a ['link' element](https://www.w3.org/Style/styling-XML#External)), embedded (using a ['style' element](https://www.w3.org/Style/styling-XML#Embedded)) and/or inlined (using '[style' attributes](https://www.w3.org/TR/css-style-attr/)). Only author styles that apply to "[speech](https://www.w3.org/TR/CSS2/aural.html)" media are taken into account. All style sheets are applied at once, but the order in which they are specified has an influence on the [cascading order](https://www.w3.org/TR/CSS2/cascade.html#cascading-order). Author styles take precedence over user styles. </p> </p:documentation> </p:option> <p:option name="lexicon" select="p:system-property('d:org.daisy.pipeline.tts.default-lexicon')" required="false" px:type="anyURI" px:sequence="true" px:separator=" " px:media-type="application/pls+xml"><p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">Lexicons</h2> <p px:role="desc" xml:space="preserve">A list of PLS lexicons to take into account. Must be a space separated list of URIs, absolute or relative to the input. Lexicons can also be attached to the source document, using a ['link' element](http://kb.daisy.org/publishing/docs/text-to-speech/pls.html#ex-07). PLS lexicons allow you to define custom pronunciations of words. It is meant to help TTS processors deal with ambiguous abbreviations and pronunciation of proper names. When a word is defined in a lexicon, the processor will use the provided pronunciation instead of the default rendering. The syntax of a PLS lexicon is defined in [Pronunciation Lexicon Specification (PLS) Version 1.0](https://www.w3.org/TR/pronunciation-lexicon), extended with regular expression matching. To enable regular expression matching, add the "regex" attribute, as follows: ~~~xml <lexicon xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" version="1.0" alphabet="ipa" xml:lang="en"> <lexeme regex="true"> <grapheme>([0-9]+)-([0-9]+)</grapheme> <alias>between $1 and $2</alias> </lexeme> </lexicon> ~~~ The regex feature works only with alias-based substitutions. The regex syntax used is that from [XQuery 1.0 and XPath 2.0](https://www.w3.org/TR/xpath-functions/#regex-syntax). Whether or not the regex attribute is set to "true", the grapheme matching can be made more accurate by specifying the "positive-lookahead" and "negative-lookahead" attributes: ~~~xml <lexicon version="1.0" xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" alphabet="ipa" xml:lang="en"> <lexeme> <grapheme positive-lookahead="[ ]+is">SB</grapheme> <alias>somebody</alias> </lexeme> <lexeme> <grapheme>SB</grapheme> <alias>should be</alias> </lexeme> <lexeme xml:lang="fr"> <grapheme positive-lookahead="[ ]+[cC]ity">boston</grapheme> <phoneme>bɔstøn</phoneme> </lexeme> </lexicon> ~~~ Graphemes with "positive-lookahead" will match if the beginning of what follows matches the "position-lookahead" pattern. Graphemes with "negative-lookahead" will match if the beginning of what follows does not match the "negative-lookahead" pattern. The lookaheads are case-sensitive while the grapheme contents are not. The lexemes are matched in this order: 1. Graphemes with regex="false" come first, no matter if there is a lookahead or not; 2. then come graphemes with regex="true" and no lookahead; 3. then graphemes with regex="true" and one or two lookaheads. Within these categories, lexemes are matched in the same order as they appear in the lexicons.</p> </p:documentation> </p:option> <p:option name="audio" select="'false'" required="false" px:type="boolean"><p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">Enable text-to-speech</h2> <p px:role="desc">Whether to use a speech synthesizer to produce audio files.</p> </p:documentation> </p:option> <p:option xmlns:_="zedai" name="_:chunk-size" select="'-1'" required="false" px:type="integer"><p:documentation xmlns="http://www.w3.org/1999/xhtml"> <h2 px:role="name">Chunk size</h2> <p px:role="desc" xml:space="preserve">The maximum size of HTML files in kB. Specify "-1" for no maximum. Top-level sections in the ZedAI become separate HTML files in the resulting EPUB, and are further split up if they exceed the given maximum size.</p> </p:documentation> </p:option> <p:import href="zedai-to-epub3.convert.xpl"/> <p:import href="http://www.daisy.org/pipeline/modules/epub-utils/library.xpl"> <p:documentation> px:epub3-store </p:documentation> </p:import> <p:import href="http://www.daisy.org/pipeline/modules/file-utils/library.xpl"/> <p:import href="http://www.daisy.org/pipeline/modules/fileset-utils/library.xpl"> <p:documentation> px:fileset-delete </p:documentation> </p:import> <p:import href="http://www.daisy.org/pipeline/modules/common-utils/library.xpl"/> <p:import href="http://www.daisy.org/pipeline/modules/zedai-utils/library.xpl"/> <p:variable name="input-uri" select="base-uri(/)"/> <px:normalize-uri name="output-dir-uri"> <p:with-option name="href" select="concat($result,'/')"/> </px:normalize-uri> <p:sink/> <p:group name="load-convert-store"> <p:output port="status"> <p:pipe step="convert" port="status"/> </p:output> <p:output port="tts-log"> <p:pipe step="convert" port="tts-log"/> </p:output> <p:variable name="output-dir-uri" select="/c:result/string()"> <p:pipe step="output-dir-uri" port="normalized"/> </p:variable> <p:variable name="epub-file-uri" select="concat($output-dir-uri,replace($input-uri,'^.*/([^/]*?)(\.[^/\.]*)?$','$1'),'.epub')"/> <px:zedai-load name="load"> <p:input port="source"> <p:pipe port="source" step="main"/> </p:input> </px:zedai-load> <px:zedai-to-epub3 name="convert"> <p:input port="in-memory.in"> <p:pipe step="load" port="in-memory.out"/> </p:input> <p:input port="tts-config"> <p:pipe step="main" port="tts-config"/> </p:input> <p:with-option xmlns:_="tts" name="stylesheet" select="string-join( for $s in tokenize($_:stylesheet,'\s+')[not(.='')] return resolve-uri($s,$input-uri), ' ')"/> <p:with-option name="lexicon" select="for $l in tokenize($lexicon,'\s+')[not(.='')] return resolve-uri($l,$input-uri)"/> <p:with-option name="output-dir" select="$temp-dir"/> <p:with-option name="audio" select="$audio"/> <p:with-option xmlns:_="zedai" name="chunk-size" select="$_:chunk-size"/> <p:with-option name="include-tts-log" select="$include-tts-log"/> </px:zedai-to-epub3> <px:epub3-store name="store"> <p:with-option name="href" select="$epub-file-uri"/> <p:input port="in-memory.in"> <p:pipe port="in-memory.out" step="convert"/> </p:input> </px:epub3-store> <px:fileset-delete cx:depends-on="store"> <p:input port="source"> <p:pipe step="convert" port="temp-audio-files"/> </p:input> </px:fileset-delete> </p:group> </p:declare-step>