#!/usr/bin/env retro This tool is intended to be used to create an epub version of the standard documentation. An epub is just a .zip file containing a bunch of XHTML files and a few files containing metadata. Our structure will look like: Book Root Directory |-- META-INF directory | `-- container.xml |-- mimetype |-- content.opf |-- toc.ncx |-- stylesheet.css |-- cover.xhtml |-- toc.xhtml |-- chapters/... Begin by defining some helper functions for writing to a file. ~~~ 'tools/book-chapters.retro include 'FID var :file:s:put [ @FID file:write ] s:for-each ; :file:nl ASCII:CR @FID file:write ; :unix:mkdir 'mkdir_-p_%s s:format unix:system ; ~~~ Create the directories needed. ~~~ 'STEP:_Create_directories s:put nl { 'chapters 'chapters/building 'chapters/general 'chapters/internals 'chapters/tech-notes 'chapters/techniques 'chapters/toolchain 'chapters/toolchain/info 'chapters/toolchain/man 'epub 'epub/META-INF } [ dup tab s:put nl unix:mkdir ] a:for-each ~~~ Then create the `mimetype` file. This is supposed to be written without a trailing newline. ~~~ 'STEP:_Generate_`mimetype` s:put nl 'application/epub+zip 'epub/mimetype file:spew ~~~ Then create `META-INF/container.xml`. ~~~ 'STEP:_Generate_`container.xml` s:put nl 'epub/META-INF/container.xml file:open-for-writing !FID ' file:s:put file:nl ' file:s:put file:nl ' file:s:put file:nl ' file:s:put file:nl ' file:s:put file:nl ' file:s:put file:nl @FID file:close ~~~ Create `content.opf`. This will need to lest all of the files that are used in the book. Manifest: '____ file:s:put file:nl Spine: '____ file:s:put file:nl ~~~ 'STEP:_Generate_`content.opf` s:put nl 'epub/content.opf file:open-for-writing !FID ' file:s:put file:nl ' file:s:put file:nl '__ file:s:put file:nl '____RETRO_Forth_:_User_Manual file:s:put file:nl '____...bookid... file:s:put file:nl '__ file:s:put file:nl '__ file:s:put file:nl #0 TOC [ over swap '____ s:format file:s:put file:nl n:inc ] a:for-each drop '__ file:s:put file:nl '__ file:s:put file:nl #0 TOC [ drop dup '____ s:format file:s:put file:nl n:inc ] a:for-each drop '__ file:s:put file:nl '__ file:s:put file:nl '__ file:s:put file:nl ' file:s:put file:nl @FID file:close ~~~ # Generate the Chapters ~~~ 'STEP:_Convert_chapters_to_XHTML s:put nl 'retro_tools/book-chapters-to-xhtml.retro unix:system ~~~ # Assemble the pieces ~~~ 'STEP:_Relocate_files s:put nl 'epub unix:chdir 'cp_-r_../chapters_. unix:system ~~~ # Zip Everything ~~~ 'STEP:_Create_epub s:put nl 'zip_-0Xqv_../book.epub_mimetype unix:system 'zip_-Xr9Dqv_../book.epub_content.opf unix:system 'zip_-Xr9Dqv_../book.epub_META-INF unix:system 'zip_-Xr9Dqv_../book.epub_chapters unix:system '.. unix:chdir ~~~ # Clean Up Cleanup is the final step. Remove the temporary epub directory ~~~ 'STEP:_Cleanup s:put nl 'rm_-rf_epub_chapters unix:system ~~~