# encoding: utf-8 =begin * Name: SiSU * Description: a framework for document structuring, publishing and search * Author: Ralph Amissah * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Ralph Amissah, All Rights Reserved. * License: GPL 3 or later: SiSU, a framework for document structuring, publishing and search Copyright (C) Ralph Amissah This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . If you have Internet connection, the latest version of the GPL should be available at these locations: * SiSU uses: * Standard SiSU markup syntax, * Standard SiSU meta-markup syntax, and the * Standard SiSU object citation numbering and system * Hompages: * Download: * Git * Ralph Amissah ** Description: epub formating, css template =end module SiSU_EPUB_Format include SiSU_Viz class ParagraphNumber def initialize(md,ocn) @md,@ocn=md,ocn.to_s @ocn ||='' end def ocn_display make=SiSU_Env::ProcessingSettings.new(@md) if make.build.ocn? ocn_class='ocn' if @ocn==nil \ or @ocn.to_i==0 \ or @ocn.empty? %{} else @ocn.gsub(/^(\d+|)$/, %{}) end else %{} end end def name (@ocn==nil || @ocn.empty?) ? '' : %{} end def id #w3c? "tidy" complains about numbers as identifiers ! annoying (@ocn==nil || @ocn.empty?) ? '' : %{id="o#{@ocn}"} end def goto (@ocn==nil || @ocn.empty?) ? '' : %{} end end class CSS def css_epub_xhtml <<-WOK /* SiSU epub css default stylesheet */ body { color: black; background: #ffffff; background-color: #ffffff; } /* table { margin-left: 5%; display: block; } tr { display: block; } th,td { display: inline; vertical-align: top; } */ a:link { color: #003399; text-decoration: none; } a:visited { color: #003399; text-decoration: none; } a:hover { color: #000000; background-color: #f9f9aa; } /* a:hover { border-bottom: 2px solid #777777; background-color: #fff3b6; } */ a:hover img { background-color: #ffffff; } a:active { color: #003399; text-decoration: underline; } a.lnkocn:link { color: #777777; text-decoration: none; } div { margin-left: 0; margin-right: 0; } div.p { margin-left: 5%; margin-right: 1%; } .norm, .bold, .verse, .group, .block, .alt { line-height: 133%; margin-left: 0em; margin-right: 2em; margin-top: 12px; margin-bottom: 0px; padding-left: 0em; text-indent: 0mm; } p, h0, h1, h2, h3, h4, h5, h6 { display: block; font-family: verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman; font-size: 100%; font-weight: normal; line-height: 133%; text-align: justify; margin-left: 0em; margin-right: 2em; text-indent: 0mm; margin-top: 4px; margin-bottom: 4px; } p.norm { } p.i1 {padding-left: 1em;} p.i2 {padding-left: 2em;} p.i3 {padding-left: 3em;} p.i4 {padding-left: 4em;} p.i5 {padding-left: 5em;} p.i6 {padding-left: 6em;} p.i7 {padding-left: 7em;} p.i8 {padding-left: 8em;} p.i9 {padding-left: 9em;} p.h0i0 { padding-left: 0em; text-indent: 0em; } p.h0i1 { padding-left: 1em; text-indent: -1em; } p.h0i2 { padding-left: 2em; text-indent: -2em; } p.h0i3 { padding-left: 3em; text-indent: -3em; } p.h0i4 { padding-left: 4em; text-indent: -4em; } p.h0i5 { padding-left: 5em; text-indent: -5em; } p.h0i6 { padding-left: 6em; text-indent: -6em; } p.h0i7 { padding-left: 7em; text-indent: -7em; } p.h0i8 { padding-left: 8em; text-indent: -8em; } p.h0i9 { padding-left: 9em; text-indent: -9em; } p.h1i0 { padding-left: 0em; text-indent: 1em; } p.h1i1 { padding-left: 1em; text-indent: 0em; } p.h1i2 { padding-left: 2em; text-indent: -1em; } p.h1i3 { padding-left: 3em; text-indent: -2em; } p.h1i4 { padding-left: 4em; text-indent: -3em; } p.h1i5 { padding-left: 5em; text-indent: -4em; } p.h1i6 { padding-left: 6em; text-indent: -5em; } p.h1i7 { padding-left: 7em; text-indent: -6em; } p.h1i8 { padding-left: 8em; text-indent: -7em; } p.h1i9 { padding-left: 9em; text-indent: -8em; } p.h2i0 { padding-left: 0em; text-indent: 2em; } p.h2i1 { padding-left: 1em; text-indent: 1em; } p.h2i2 { padding-left: 2em; text-indent: 0em; } p.h2i3 { padding-left: 3em; text-indent: -1em; } p.h2i4 { padding-left: 4em; text-indent: -2em; } p.h2i5 { padding-left: 5em; text-indent: -3em; } p.h2i6 { padding-left: 6em; text-indent: -4em; } p.h2i7 { padding-left: 7em; text-indent: -5em; } p.h2i8 { padding-left: 8em; text-indent: -6em; } p.h2i9 { padding-left: 9em; text-indent: -7em; } p.h3i0 { padding-left: 0em; text-indent: 3em; } p.h3i1 { padding-left: 1em; text-indent: 2em; } p.h3i2 { padding-left: 2em; text-indent: 1em; } p.h3i3 { padding-left: 3em; text-indent: 0em; } p.h3i4 { padding-left: 4em; text-indent: -1em; } p.h3i5 { padding-left: 5em; text-indent: -2em; } p.h3i6 { padding-left: 6em; text-indent: -3em; } p.h3i7 { padding-left: 7em; text-indent: -4em; } p.h3i8 { padding-left: 8em; text-indent: -5em; } p.h3i9 { padding-left: 9em; text-indent: -6em; } p.h4i0 { padding-left: 0em; text-indent: 4em; } p.h4i1 { padding-left: 1em; text-indent: 3em; } p.h4i2 { padding-left: 2em; text-indent: 2em; } p.h4i3 { padding-left: 3em; text-indent: 1em; } p.h4i4 { padding-left: 4em; text-indent: 0em; } p.h4i5 { padding-left: 5em; text-indent: -1em; } p.h4i6 { padding-left: 6em; text-indent: -2em; } p.h4i7 { padding-left: 7em; text-indent: -3em; } p.h4i8 { padding-left: 8em; text-indent: -4em; } p.h4i9 { padding-left: 9em; text-indent: -5em; } p.h5i0 { padding-left: 0em; text-indent: 5em; } p.h5i1 { padding-left: 1em; text-indent: 4em; } p.h5i2 { padding-left: 2em; text-indent: 3em; } p.h5i3 { padding-left: 3em; text-indent: 2em; } p.h5i4 { padding-left: 4em; text-indent: 1em; } p.h5i5 { padding-left: 5em; text-indent: 0em; } p.h5i6 { padding-left: 6em; text-indent: -1em; } p.h5i7 { padding-left: 7em; text-indent: -2em; } p.h5i8 { padding-left: 8em; text-indent: -3em; } p.h5i9 { padding-left: 9em; text-indent: -4em; } p.h6i0 { padding-left: 0em; text-indent: 6em; } p.h6i1 { padding-left: 1em; text-indent: 5em; } p.h6i2 { padding-left: 2em; text-indent: 4em; } p.h6i3 { padding-left: 3em; text-indent: 3em; } p.h6i4 { padding-left: 4em; text-indent: 2em; } p.h6i5 { padding-left: 5em; text-indent: 1em; } p.h6i6 { padding-left: 6em; text-indent: 0em; } p.h6i7 { padding-left: 7em; text-indent: -1em; } p.h6i8 { padding-left: 8em; text-indent: -2em; } p.h6i9 { padding-left: 9em; text-indent: -3em; } p.h7i0 { padding-left: 0em; text-indent: 7em; } p.h7i1 { padding-left: 1em; text-indent: 6em; } p.h7i2 { padding-left: 2em; text-indent: 5em; } p.h7i3 { padding-left: 3em; text-indent: 4em; } p.h7i4 { padding-left: 4em; text-indent: 3em; } p.h7i5 { padding-left: 5em; text-indent: 2em; } p.h7i6 { padding-left: 6em; text-indent: 1em; } p.h7i7 { padding-left: 7em; text-indent: 0em; } p.h7i8 { padding-left: 8em; text-indent: -1em; } p.h7i9 { padding-left: 9em; text-indent: -2em; } p.h8i0 { padding-left: 0em; text-indent: 8em; } p.h8i1 { padding-left: 1em; text-indent: 7em; } p.h8i2 { padding-left: 2em; text-indent: 6em; } p.h8i3 { padding-left: 3em; text-indent: 5em; } p.h8i4 { padding-left: 4em; text-indent: 4em; } p.h8i5 { padding-left: 5em; text-indent: 3em; } p.h8i6 { padding-left: 6em; text-indent: 2em; } p.h8i7 { padding-left: 7em; text-indent: 1em; } p.h8i8 { padding-left: 8em; text-indent: 0em; } p.h8i9 { padding-left: 9em; text-indent: -1em; } p.h9i0 { padding-left: 0em; text-indent: 9em; } p.h9i1 { padding-left: 1em; text-indent: 8em; } p.h9i2 { padding-left: 2em; text-indent: 7em; } p.h9i3 { padding-left: 3em; text-indent: 6em; } p.h9i4 { padding-left: 4em; text-indent: 5em; } p.h9i5 { padding-left: 5em; text-indent: 4em; } p.h9i6 { padding-left: 6em; text-indent: 3em; } p.h9i7 { padding-left: 7em; text-indent: 2em; } p.h9i8 { padding-left: 8em; text-indent: 1em; } p.h9i9 { padding-left: 9em; text-indent: 0em; } p.it0 { margin-left: 0em; margin-top: 6px; margin-bottom: 0px; line-height: 100%; } p.it1 { margin-left: 1em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it2 { margin-left: 2em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it3 { margin-left: 3em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it4 { margin-left: 4em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it5 { margin-left: 5em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it6 { margin-left: 6em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it7 { margin-left: 7em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it8 { margin-left: 8em; margin-top: 0px; margin-bottom: 0px; line-height: 100%; } p.it9 { margin-left: 9em; margin-bottom: 0px; margin-top: 0px; line-height: 100%; } p.group { } p.block { } p.alt { } p.verse { margin-bottom: 6px; } p.code { font-family: inconsolata, andale mono, courier new, courier, monospace; font-size: 90%; text-align: left; background-color: #eeeeee; } p.caption { text-align: left; font-size: 80%; display: inline; } p.endnote { font-size: 96%; line-height: 120%; text-align: left; margin-right: 2em; } p.endnote_indent { font-size: 96%; line-height: 120%; text-align: left; margin-left: 2em; margin-right: 2em; } p.center { text-align: center; } p.align_right { text-align: right; } p.bold { font-weight: bold; } p.bold_left { font-weight: bold; text-align: left; } p.centerbold { text-align: center; font-weight: bold; } p.em { font-weight: bold; font-style: normal; background: #fff3b6; } p.small { font-size: 80%; margin-top: 0px; margin-bottom: 0px; margin-right: 6px; text-align: left; } .tiny, .tiny_left, .tiny_right, .tiny_center { font-size: 10px; margin-top: 0px; margin-bottom: 0px; color: #777777; margin-right: 6px; text-align: left; } p.tiny { } p.tiny_left { margin-left: 0px; margin-right: 0px; text-align: left; } p.tiny_right { margin-right: 1em; text-align: right; } p.tiny_center { margin-left: 0px; margin-right: 0px; text-align: center; } p.concordance_word { line-height: 150%; font-weight: bold; display: inline; margin-top: 4px; margin-bottom: 1px; } p.concordance_count { font-size: 80%; color: #777777; display: inline; margin-left: 0em; } p.concordance_object { font-size: 80%; line-height: 120%; text-align: left; margin-left: 3em; margin-top: 1px; margin-bottom: 3px; } p.book_index_lev1 { line-height: 100%; margin-top: 4px; margin-bottom: 1px; } p.book_index_lev2 { line-height: 100%; text-align: left; margin-left: 3em; margin-top: 1px; margin-bottom: 3px; } p.quickref { font-size: 10px; font-style: italic; margin-top: 0px; margin-bottom: 0px; color: #777777; margin-right: 5px; text-align: left; } p.bigref { font-size: 11px; font-weight: bold; margin-top: 0px; margin-bottom: 0px; color: #777777; margin-right: 5px; text-align: center; } p.letter { font-weight: bold; font-size: 80%; margin-left: 0em; margin-top: 2px; margin-bottom: 2px; margin-right: 6px; text-align: left; color: white; background: #880000; } tt { font-family: inconsolata, andale mono, courier new, courier, monospace; background-color: #eeeeee; } label.ocn { width: 2%; float: right; top: 0; font-size: 10px; margin-top: 0px; margin-bottom: 5px; color: #777777; margin-right: 5px; text-align: right; background-color: #ffffff; } table { } tr { } th,td { vertical-align: top; text-align: left; } th { font-weight: bold; } p.left, th.left, td.left { text-align: left; } p.small_left, th.small_left, td.small_left { text-align: left; font-size: 80%; } p.right, th.right, td.right { text-align: right; } #horizontal_links { background: #eeeeee; margin-left: 5%; margin-right: 5%; } #horizontal { margin: 0; padding: 0 0 0 10px; border-top: 1px solid #000077; border-bottom: 1px solid #000077; } #horizontal li { margin: 0 0 0 0; padding: 0 16px 0 0; display: inline; list-style-type: none; text-align: left; background: none; } #horizontal a { line-height: 12px; margin: 0 0 0 0; text-decoration: none; color: #000077; } #horizontal a.active, #horizontal a:hover { border-bottom: 2px solid #777777; padding-bottom: 2px; color: #000077; } #horizontal a:hover { color: #000077; } #document_versions { position: absolute; top: 10mm; right: 2%; width: 12%; float: right; } #vertical_links { position: absolute; top: 10mm; right: 0px; width: 20%; background: #dddddd; float: right; } #vertical { padding: 0 12px 0px 0px; margin-left: 2%; margin-right: 2%; } #vertical li { display: block; list-style-type: none; } #vertical a { line-height: 12px; text-decoration: none; color: #000077; } #vertical a.active, #vertical a:hover { border-bottom: 2px solid #777777; padding-bottom: 2px; color: #000077; } ul, li { list-style-type: none; list-style: none; padding-left: 20px; display: block; font-family: verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman; font-weight: normal; line-height: 150%; text-align: justify; text-indent: 0mm; margin-left: 1em; margin-right: 2em; margin-top: 3px; margin-bottom: 3px; } li { background: url(../image/bullet_09.png) no-repeat 0px 6px; } ul { } li.bullet { margin-left: 0em; } li.i1 { margin-left: 1em; } li.i2 { margin-left: 2em; } li.i3 { margin-left: 3em; } li.i4 { margin-left: 4em; } li.i5 { margin-left: 5em; } li.i6 { margin-left: 6em; } li.i7 { margin-left: 7em; } li.i8 { margin-left: 8em; } li.i9 { margin-left: 9em; } li.doc, li.ref, li.refcenter { margin-top: 0px; margin-bottom: 0px; margin-right: 0px; font-size: 8px; font-style: normal; text-align: left; } li.doc { background: url(../image/bullet_09.png) no-repeat 0px 6px; padding-left: 16px; margin-left: 10px; margin-right: 0px; } li.ref { background: none; padding-left: 0; margin-left: 0; color: #777777; } li.refcenter { background: url(../image/bullet_09.png) no-repeat 0px 6px; padding-left: 20px; margin-left: 10%; font-size: 9px; color: #777777; text-align: center; } li.refbold { list-style-type: none; padding-left: 16px; margin-left: 0; margin-right: 10mm; font-weight: bold; } h0, h1, h2, h3, h4, h5, h6 { font-weight: bold; line-height: 120%; text-align: left; margin-top: 20px; margin-bottom: 10px; } h4.norm, h5.norm, h6.norm { margin-top: 10px; margin-bottom: 0px; } h1.center, h2.center, h3.center, h4.center, h5.center, h6.center { text-align: center; } h1 { font-size: 120%; } h2 { font-size: 115%; } h3 { font-size: 110%; } h4 { font-size: 105%; } h5 { font-size: 100%; } h6 { font-size: 100%; } h0 { font-size: 80%; } h1.i {margin-left: 2em;} h2.i {margin-left: 3em;} h3.i {margin-left: 4em;} h4.i {margin-left: 5em;} h5.i {margin-left: 6em;} h6.i {margin-left: 7em;} h7.i {margin-left: 8em;} h8.i {margin-left: 9em;} h9.i {margin-left: 10em;} .toc { font-weight: normal; margin-top: 6px; margin-bottom: 6px; } h1.toc { margin-left: 1em; font-size: 115%; line-height: 150%; } h2.toc { margin-left: 2em; font-size: 110%; line-height: 140%; } h3.toc { margin-left: 3em; font-size: 105%; line-height: 120%; } h4.toc { margin-left: 4em; font-size: 100%; line-height: 120%; } h5.toc { margin-left: 5em; font-size: 95%; line-height: 110%; } h6.toc { margin-left: 6em; font-size: 90%; line-height: 110%; } .microtoc { margin-top: 2px; margin-bottom: 2px; } h1.microtoc { margin-left: 0mm; font-size: 115%; } h2.microtoc { margin-left: 5mm; font-size: 110%; } h3.microtoc { margin-left: 10mm; font-size: 105%; } h4.microtoc { margin-left: 15mm; font-weight: normal; font-size: 100%; } h5.microtoc { margin-left: 20mm; font-weight: normal; font-size: 95%; } h6.microtoc { margin-left: 25mm; font-weight: normal; font-size: 90%; } .subtoc { margin-right: 34%; font-weight: normal; } h5.subtoc { margin-left: 2em; font-size: 80%; margin-top: 2px; margin-bottom: 2px; } h6.subtoc { margin-left: 3em; font-size: 75%; margin-top: 0px; margin-bottom: 0px; } div.substance { width: 100%; background-color: #ffffff; } div.ocn { width: 5%; float: right; top: 0; background-color: #ffffff; } div.endnote { width: 100%; background-color: #fffffff; } div.toc { position: absolute; float: left; margin: 0; padding: 0; padding-top: 0.5em; border: 0; width: 5%; background-color: #eeeeee; margin-right:1em; } div.summary { margin: 0; padding: 0; border-left: 2em solid #eeeeee; padding-left: 0em; background-color: #eeeeee; } div.content, div.main_column { margin: 0; padding: 0; border-left: 0% solid #ffffff; padding-left: 5%; } div.content:after { content:' '; clear:both; display:block; height:0; overflow:hidden } div.footer { clear:left; padding: 0.5em; font-size: 80%; margin: 0; } div.toc ul { list-style: none; padding: 0; margin: 0; } div.toc li ul a, li ul span.currentlink { font-weight: normal; font-size: 90%; padding-left: 2em; background-color: #eeeeee; } div.toc a, span.currentlink{ display:block; text-decoration: none; padding-left: 0.5em; color: #0000aa; } hr { width: 90%; } span.currentlink { text-decoration: none; background-color: #aaaaf9; } div.toc a:visited { color: #0000aa; } div.toc a:hover { color: #000000; background-color: #f9f9aa; } h1.c, h2.c, h3.c, h4.c, h5.c, h6.c, p.c { text-align: center } h1.red, h2.red, h3.red, h4.red, h5.red, h6.red { text-align: center; color: #ff0000; margin-left: 5mm; text-indent: 5mm; margin-top: 30px; margin-bottom: 20px; margin-right: 15mm; } h1.ruby, h2.ruby, h3.ruby, h4.ruby, h5.ruby, h6.ruby { text-align: center; color: #990000; margin-left: 5mm; text-indent: 5mm; margin-top: 30px; margin-bottom: 20px; margin-right: 15mm; } WOK end end module SanitizeXML def self.xml(x) if x.is_a?(String) x=x.gsub(/ /,' ') if Ep[:alt]==:on x.gsub(/&/,'&'). gsub(//,">"). gsub(/#{Dx[:url_o]}/,Dx[:url_o_xml]).gsub(/#{Dx[:url_c]}/,Dx[:url_o_xml]). #gsub(//,'>'). gsub(/\\\\/,'
'). gsub(/<br(?: \/)?>/,'
') else x end end end class HeadInformation include SiSU_Viz attr_reader :md,:rdf,:vz def initialize(md) @md=md # DublinCore 1 - title @vz=SiSU_Viz::Defaults.new @css=SiSU_Env::CSS_Stylesheet.new(md) @seg_name_xhtml=(SiSU_EPUB::Source::Seg.new.seg_name_xhtml || []) @seg_name_xhtml_tracker=(SiSU_EPUB::Source::Seg.new.seg_name_xhtml_tracker || []) @tocband_scroll,@tocband_segtoc=nil,nil @index,@metalink='index','#metadata' end def doc_type_xhtml <<-WOK WOK end =begin ~/epub |-- META-INF | `-- container.xml # simple, make sure full-path of rootfile points to metadata.opf |-- content | |-- 1.xhtml | |-- 2.xhtml | |-- 3.xhtml | |-- ... .xhtml | |-- concordance.xhtml | |-- css | | `-- xhtml.css | |-- endnotes.xhtml | |-- image | | |-- arrow_next_red.png | | |-- arrow_prev_red.png | | |-- arrow_up_red.png | | `-- bullet_09.png | |-- index.xhtml | |-- meta.xhtml | |-- metadata.xhtml | `-- toc.xhtml |-- metadata.opf #(i) metadata dc; (ii) manifest (contents); (iii) spine (mimetypes) |-- mimetype # application/epub+zip `-- toc.ncx #(i) head (ii) doc title (iii) navmap, list of navigation points (like chapters) =end def doc_type doc_type_xhtml end def mimetype <<-WOK application/epub+zip WOK end def metainf_container #container.xml file in META-INF directory #simple, make sure full-path of rootfile points to metadata.opf #epub_metadata.opf content.opf <<-WOK WOK end def sections(dob,fn_base) name=fn_base + Sfx[:epub_xhtml] dir_epub_cont=@md.env.processing_path.epub + '/' + Ep[:d_oebps] segfilename=dir_epub_cont + '/' + name output_epub_cont_seg=File.new(segfilename,'w') output_epub_cont_seg << %{#{doc_type} #{dob.obj} - #{@md.html_title} #{@css.xhtml_epub} #{@vz.color_body}
#{dob.ocn}

#{dob.obj}

} output_epub_cont_seg.close end def toc_ncx #list of navigation points (like chapters), table of contents, listing each navigation point (chapters and such) under the navigation map def structure open head_open head head_close doc_title doc_author navmap_open #navmap ... navmap_close close end def open <<-WOK WOK end def close <<-WOK WOK end def head_open <<-WOK WOK end def head depth=@md.lvs[1] + @md.lvs[2] + @md.lvs[3] + @md.lvs[4] title=SanitizeXML.xml(@md.title.full) author=SanitizeXML.xml(@md.author) <<-WOK #{title} by #{author} WOK end def head_close <<-WOK WOK end def doc_title txt=SanitizeXML.xml(@md.title.full) <<-WOK #{txt} WOK end def doc_author txt=SanitizeXML.xml(@md.author) <<-WOK #{txt} WOK end def navmap_open <<-WOK WOK end def navmap_sisu_toc(no) id_u=DISABLE[:epub][:ncx_navpoint_unique_id] \ ? '' : "-#{no}" <<-WOK Table of Contents WOK end def navpoint(dob,no,fn_base,hashtag=nil) fn=fn_base + Sfx[:epub_xhtml] name=hashtag ? fn + hashtag : fn id_u=DISABLE[:epub][:ncx_navpoint_unique_id] \ ? '' : "-#{no}" <<-WOK #{dob.obj} WOK end def navpoint_close <<-WOK WOK end def navmap_close <<-WOK WOK end self end def metadata_opf #(i) metadata dc; (ii) manifest (contents); (iii) spine (mimetypes) def structure package_open metadata_open metadata_close manifest_open manifest_close spine_open spine_close guide_open guide_close package_close end def package_open <<-WOK WOK end def package_close <<-WOK WOK end def metadata #metadata dc cover_image=if defined? @md.make.cover_image \ and @md.make.cover_image.is_a?(Hash) \ and @md.make.cover_image[:cover] =~/\S+/ %{\n <#{$ep[:o]}meta name="cover" content="cover_image" />} else '' end author=if defined? @md.creator.author \ and @md.creator.author =~/\S+/ m='' @md.creator.author_detail.each do |x| surname=x[:the] \ ? x[:the] : '' other_names=x[:others] \ ? ', ' + x[:others] : '' m=(m.empty?) \ ? (surname + other_names) : (m + '; ' + surname + ', ' + other_names) m=SanitizeXML.xml(m) end x=@md.creator.author.dup x=SanitizeXML.xml(x) %{\n #{x}} else '' end editor=if defined? @md.creator.editor \ and @md.creator.editor =~/\S+/ m='' @md.creator.editor_detail.each do |x| surname=x[:the] \ ? x[:the] : '' other_names=x[:others] \ ? ', ' + x[:others] : '' m=(m.empty?) \ ? (surname + other_names) : (m + '; ' + surname + ', ' + other_names) m=SanitizeXML.xml(m) end x=@md.creator.editor.dup x=SanitizeXML.xml(x) %{\n #{x}} else '' end translator=if defined? @md.creator.translator \ and @md.creator.translator =~/\S+/ m='' @md.creator.translator_detail.each do |x| surname=x[:the] \ ? x[:the] : '' other_names=x[:others] \ ? ', ' + x[:others] : '' m=(m.empty?) \ ? (surname + other_names) : (m + '; ' + surname + ', ' + other_names) m=SanitizeXML.xml(m) end x=@md.creator.translator.dup x=SanitizeXML.xml(x) %{\n #{x}} else '' end illustrator=if defined? @md.creator.illustrator \ and @md.creator.illustrator =~/\S+/ m='' @md.creator.illustrator_detail.each do |x| surname=x[:the] \ ? x[:the] : '' other_names=x[:others] \ ? ', ' + x[:others] : '' m=(m.empty?) \ ? (surname + other_names) : (m + '; ' + surname + ', ' + other_names) m=SanitizeXML.xml(m) end x=@md.creator.illustrator.dup x=SanitizeXML.xml(x) %{\n #{x}} else '' end date_published=if defined? @md.date.published \ and @md.date.published =~/\S+/ x=@md.date.published.dup x=SanitizeXML.xml(x) %{\n #{x}} else '' end subject=if defined? @md.classify.subject \ and @md.classify.subject =~/\S+/ x=@md.classify.subject.dup x=SanitizeXML.xml(x) %{\n #{x}} else '' end language=if defined? @md.opt.lng \ and @md.opt.lng =~/\S+/ language=@md.opt.lng.gsub(/
/,'
') %{\n #{language}} else '' end rights=if defined? @md.rights.all \ and @md.rights.all =~/\S+/ rights=SanitizeXML.xml(@md.rights.all) rights=rights.gsub(//,' ') %{\n #{rights}} else '' end f=SiSU_Env::FileOp.new(@md) <<-WOK <#{$ep[:o]}metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/" unique-identifier="urn:uuid:#{@md.dgst[1]}" version="2.0"> #{@md.title.full} #{cover_image}#{author}#{editor}#{translator}#{illustrator}#{language}#{date_published}#{subject}#{rights} #{f.output_path.epub.url.gsub(/http:\/\//,'')}/#{f.base_filename.epub} urn:uuid:#{@md.dgst[1]} WOK end def manifest_open <<-WOK WOK end def manifest_content_sisu_toc <<-WOK WOK end def manifest_cover_image_information(md) cover_image=if defined? md.make.cover_image \ and @md.make.cover_image.is_a?(Hash) \ and md.make.cover_image[:cover] =~/\S+/ <<-WOK WOK else '' end end def manifest_content(dob,fn_base,hashtag=nil) fn=fn_base + Sfx[:epub_xhtml] name=hashtag ? fn + hashtag : fn <<-WOK WOK end def manifest_images(imgs) imgs=imgs + ['arrow_next_red.png','arrow_prev_red.png','arrow_up_red.png','bullet_09.png'] images=[" \n"] imgs.each do |i| image,type=/(\S+?)\.(png|jpg|gif)/.match(i)[1,2] type=type.sub(/jpg/,'jpeg') images<<<<-WOK WOK end images=images.join('') images end def manifest_close <<-WOK WOK end def spine_open #spine: reading order of XHTML files from manifest, idref attribute refers back to id in manifest (exclude images, CSS etc.). <<-WOK WOK end def spine_cover_image <<-WOK WOK end def spine_sisu_toc <<-WOK WOK end def spine(dob,fn_base,hashtag=nil) fn=fn_base + Sfx[:epub_xhtml] name=hashtag ? fn + hashtag : fn <<-WOK WOK end def spine_close <<-WOK WOK end def guide_open #guide: presentation order of XHTML files by reader). <<-WOK WOK end def guide_cover_image <<-WOK WOK end def guide_sisu_toc <<-WOK WOK end def guide(dob,fn_base,hashtag=nil) fn=fn_base + Sfx[:epub_xhtml] name=hashtag ? fn + hashtag : fn name=name ? name : dob.name guide_name=(name =~/#{Sfx[:epub_xhtml]}/) ? name : (name + Sfx[:epub_xhtml]) <<-WOK WOK end def guide_close <<-WOK WOK end self end def table_close %{ #{@vz.table_close}} end def xhtml_close %{#{@vz.credits_sisu_epub} } end end class HeadToc < HeadInformation def initialize(md) super(md) @md=md @tocband_segtoc=make_seg end def manifest_link(text) %{ #{text}} end def concordance_link(text) if @md.concord_make %{ #{text} } else '' end end def head %{#{doc_type} #{@css.xhtml_epub} #{@vz.color_body}} end def concordance if @md.concord_make %{#{@vz.margin_css}

Concordance

#{@vz.table_close}} else %{#{@vz.margin_css} #{@vz.table_close}} end end def links_guide_open(type='horizontal') (type=='vertical') \ ? links_guide_vertical_open : links_guide_horizontal_open end def prefix_a end def rights def all rights=SanitizeXML.xml(@md.rights.all) %{

Rights: #{rights}

} end self end def prefix_b %{

Prefix: #{@md.prefix_b}} end def make_seg concord=concordance_link(@vz.nav_txt_concordance) %{
#{@vz.nav_txt_toc_link} #{concord} #{@vz.table_close}} end def manifest #check structure manifest=manifest_link(@vz.nav_txt_manifest) %{#{@vz.margin_txt_3} #{@vz.paragraph_font_small} #{manifest} #{@vz.table_close}} end def concordance #check structure concord=concordance_link(@vz.nav_txt_concordance) %{#{@vz.margin_txt_3} #{@vz.paragraph_font_small} #{concord} #{@vz.table_close}} end def metadata %{#{@vz.margin_css}

MetaData

#{@vz.table_close}} end end class HeadSeg < HeadInformation def initialize(md) super(md) end def head %{#{doc_type} #{@seg_name_xhtml[@seg_name_xhtml_tracker]} - #{@md.html_title} #{@css.xhtml_epub} #{@vz.color_body}} end def endnote_mark %{
} end end class HeadScroll < HeadToc def initialize(md) super(md) end def toc_owner_details %{#{@vz.margin_txt_3} #{@vz.paragraph_font_small} Owner Details #{$ep[:hsp]*3} #{@vz.table_close}} end end class FormatTextObject @vz=SiSU_Viz::Defaults.new attr_accessor :md,:t_o,:txt,:ocn,:format,:table,:link,:linkname,:paranum,:p_num,:headname,:banner,:url def initialize(md,t_o) @md,@t_o=md,t_o if t_o.is_a?(Hash) @txt =t_o[:txt] || nil @ocn =t_o[:ocn] || nil @ocn_display =t_o[:ocn_display] || nil @headname =t_o[:headname] || nil @trailer =t_o[:trailer] || nil @endnote_part_a =t_o[:endnote_part_a] || nil @endnote_part_b =t_o[:endnote_part_b] || nil @lnk_url =t_o[:lnk_url] || nil @lnk_txt =t_o[:lnk_txt] || nil @format =t_o[:format] || nil @target =t_o[:target] || nil #occasionally passed but not used if @format and not @format.empty? if @format=~/^\d:(\S+)/ #need more reliable marker #if @format =~ /#{Rx[:lv]}/ headname=$1 #format[/\d~(\S+)/m,1] @headname=(headname =~/^[a-zA-Z]/) \ ? %{} : %{} @headname=(headname =~/^[a-zA-Z]/) \ ? %{} : %{} end end elsif t_o.class.inspect =~/Object/ @dob=t_o if defined? t_o.is @named=nametags_seg(@dob) @txt=((defined? t_o.obj) ? t_o.obj : nil) @ocn=((defined? t_o.ocn) ? t_o.ocn.to_s : nil) @headname=((t_o.is==:heading and defined? t_o.name) ? t_o.name : nil) else if @md.opt.cmd =~/M/ p __FILE__ +':'+ __LINE__.to_s p t_o.class p caller end end if @txt and not @txt.empty? @txt=@txt.gsub(/#{Mx[:mk_o]}[-~]##{Mx[:mk_c]}/,'') end @p_num=ParagraphNumber.new(@md,@ocn) @vz=SiSU_Viz::Defaults.new end def nametags_seg(dob) #FIX tags='' if defined? dob.tags \ and dob.tags.length > 0 # insert tags "hypertargets" dob.tags.each do |t| tags=tags +%{} end end tags end def endnote_body %{

#{@txt}

} end def endnote_body_indent %{

#{@txt}

} end def no_paranum %{

#{@txt}

} end def para_form_css(tag,attrib,txt) # regular paragraphs shaped here ul=ulc='' ul,ulc="
    \n ","\n
" if @tag =~/li/ %{
#{@p_num.ocn_display} #{ul}<#{tag} class="#{attrib}" #{@p_num.id}> #{@named}#{txt} #{ulc}
} end def para para_form_css('p','norm',@txt) end def group para_form_css('p','group',@txt) end def block para_form_css('p','block',@txt) end def alt para_form_css('p','alt',@txt) end def verse para_form_css('p','verse',@txt) end def code para_form_css('p','code',@txt) end def center para_form_css('p','center',@txt) end def bold para_form_css('p','bold',@txt) end def bullet para_form_css('li','bullet',@txt) end def table @txt=if @t_o.obj !~/^
'). gsub(/#{Mx[:br_obj]}/,'

') para_form_css('p','norm',@txt) end def format(tag,attrib) para_form_css(tag,attrib,@txt) end def title_heading(tag,attrib) %{
<#{tag} class="#{attrib}"> #{@named}#{@txt}
} end def title_heading1 id_u=DISABLE[:epub][:per_section_title] \ ? '' : title_heading('h1','tiny') end def title_heading2 id_u=DISABLE[:epub][:per_section_title] \ ? '' : title_heading('h2','tiny') end def title_heading3 id_u=DISABLE[:epub][:per_section_title] \ ? '' : title_heading('h3','tiny') end def title_heading4 '' end def seg_heading_sub(tag,attrib,txt) txt=txt.gsub(/(?:#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})\s*/m,' ') %{
#{@p_num.ocn_display} <#{tag} class="#{attrib}" #{@p_num.id}>#{@p_num.name} #{@named}#{@txt}
} end def seg_heading4 %{
#{@p_num.ocn_display}

#{@txt}

} end def seg_heading5 seg_heading_sub('p','bold',@txt) end def seg_heading6 seg_heading_sub('p','bold',@txt) end def dl #check :trailer "
#{@txt} #{@trailer}
" end def table_css_end '

' end def gsub_body #unused @txt=case @txt when /^(?:#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]}\s*)?\((i+|iv|v|vi+|ix|x|xi+)\)/ @txt.gsub(/^\((i+|iv|v|vi+|ix|x|xi+)\)/,'(\1)'). gsub(/^(#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]})\s*\((i+|iv|v|vi+|ix|x|xi+)\)/,'\1(\2)') when /^(?:#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]}\s*)?\(?(\d|[a-z])+\)/ @txt.gsub(/^\((\d+|[a-z])+\)/,'(\1)'). gsub(/^(#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]})\s*\((\d+|[a-z])+\)/,'\1(\2)') when /^\s*\d{1,3}\.\s/ @txt.gsub(/^\s*(\d+\.)/,'\1') when /^\s*[A-Z]\.\s/ @txt.gsub(/^\s*([A-Z]\.)/,'\1') else @txt end end def bold_para %{#{@vz.margin_txt_0}

#{@txt}

#{@vz.margin_num_css} #{$ep[:hsp]*3} #{@vz.table_close}} end def bold_heading #unused @txt=@txt.gsub(/[1-9]~\S+/,''). gsub(/[1-9]~/,'') %{

#{@txt}

#{@vz.margin_num_css} #{$ep[:hsp]*3} #{@vz.table_close}} end def toc_head_copy_at @txt=SanitizeXML.xml(@txt) %{

#{@txt}

\n} end def center @txt=SanitizeXML.xml(@txt) %{

#{@txt}

\n} end def bold @txt=SanitizeXML.xml(@txt) %{

#{@txt}

\n} end def center_bold @txt=SanitizeXML.xml(@txt) %{

#{@txt}

\n} end end class FormatScroll < FormatTextObject def initialize(md,txt) super(md,txt) @vz=SiSU_Viz::Defaults.new end end class FormatSeg < FormatTextObject def initialize(md,txt) super(md,txt) end def endnote_seg_body(fn='') #FIX #url construction keep within single line... BUG WATCH 200408 fn='doc' if fn.to_s.empty? #you may wish to reconsider, sends to 'doc' where no segment info %{

#{@endnote_part_a}#{fn}#{Sfx[:epub_xhtml]}#{@endnote_part_b}

} end def clean(txt) txt=txt.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}/,''). gsub(/#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'') end def subtoc_lev(tag,attrib) @txt=clean(@txt) txt=if @txt \ and @txt =~/<\/?i>|/mi @txt.gsub(/<\/?i>|/mi,'') #removes name markers from subtoc, go directly to substantive text else @txt end note='' if txt =~/(#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})/m # had \s* at end note=$1 note=note.gsub(/[\n\s]+/m,' ') txt=txt.gsub(/(?:#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})\s*/m,' '). gsub(/#{$ep[:hsp]}\d+<\/sup>#{$ep[:hsp]}/m,''). gsub(/#{$ep[:hsp]}\d+<\/sup>#{$ep[:hsp]}/m,'') #remove end %{<#{tag} class="#{attrib}"> #{txt} #{note} } end def subtoc_lev5 subtoc_lev('h5','subtoc') if @txt end def subtoc_lev6 subtoc_lev('h6','subtoc') if @txt end def heading_sub(tag,attrib,txt) txt=txt.gsub(/(?:#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})\s*/m,' ') %{
#{@p_num.ocn_display} <#{tag} class="#{attrib}" #{@p_num.id}> #{@headname} #{@txt}
} end def heading4 %{
#{@p_num.ocn_display}

#{@t_o[:format]} #{@txt}

} end def heading5 heading_sub('p','bold',@txt) end def heading6 heading_sub('p','bold',@txt) end def navigation_heading4 %{

#{@txt}

#{@vz.table_close}} end def navigation_heading5 %{

#{@txt}

} end def navigation_heading6 %{

#{@txt}

} end def navigation_center %{

#{@txt}

} end end class FormatToc < FormatTextObject def initialize(md,txt) super(md,txt) end def links_guide %{
  • #{@lnk_txt}
  • } end def lev(tag,attrib) if @txt %{<#{tag} class="#{attrib}"> #{@txt} } else '' end end def lev1 lev('h1','toc') end def lev2 lev('h2','toc') end def lev3 lev('h3','toc') end def lev4 lev('h4','toc') end def lev5 lev('h5','toc') end def lev6 lev('h6','toc') end def lev0 #docinfo lev('h0','toc') end end end __END__