#!/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 |-- mimetype |-- META-INF directory | `-- container.xml |-- content.opf |-- toc.ncx |-- 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. ~~~ '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. ~~~ 'Generate_`mimetype` s:put nl 'application/epub+zip 'epub/mimetype file:spew ~~~ Then create `META-INF/container.xml`. ~~~ 'Generate_`container.xml` s:put nl 'epub/META-INF/container.xml file:open-for-writing !FID { ' ' ' '____ ' ' } [ file:s:put file:nl ] a:for-each @FID file:close ~~~ # Create the TOC NCX file ~~~ 'Generate_`TOC.ncx` s:put nl 'epub/TOC.ncx file:open-for-writing !FID { ' ' ' '____ '____ ' ' '____ ' ' } [ file:s:put file:nl ] a:for-each #0 TOC [ over dup dup '____Chapter_%n s:format file:s:put file:nl n:inc ] a:for-each drop { ' ' } [ file:s:put file:nl ] a:for-each @FID file:close ~~~ cover # Create the CONTENT.OPF Create `content.opf`. This will need to lest all of the files that are used in the book. ~~~ '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 '____works.forth.retro-manual file:s:put file:nl '____en file:s:put file:nl '____Charles_Childers file:s:put file:nl '__ 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 ~~~ 'Convert_chapters_to_XHTML s:put nl 'retro_tools/book-chapters-to-xhtml.retro unix:system ~~~ # Assemble the pieces ~~~ 'Relocate_files s:put nl 'epub unix:chdir 'cp_-r_../chapters_. unix:system ~~~ # Zip Everything ~~~ 'Create_epub s:put nl 'zip_-0Xqv_../book.epub_mimetype unix:system 'zip_-Xr9Dqv_../book.epub_content.opf unix:system 'zip_-Xr9Dqv_../book.epub_TOC.ncx 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 ~~~ 'Cleanup s:put nl 'cp_-r_chapters_~/atua unix:system 'rm_-rf_epub_chapters unix:system ~~~