# encoding: utf-8 =begin * Name: SiSU ** Description: documents, structuring, processing, publishing, search *** epub formating, css template ** Author: Ralph Amissah ** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 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: ** Git =end module SiSU_XHTML_EPUB2_Format 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, h7 { 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: 0.8em; margin-bottom: 0.8em; } 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, h7 { font-weight: bold; line-height: 120%; text-align: left; margin-top: 20px; margin-bottom: 10px; } h4.norm, h5.norm, h6.norm, h7.norm { margin-top: 10px; margin-bottom: 0px; } h1.center, h2.center, h3.center, h4.center, h5.center, h6.center, h7.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%; } h7 { 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%; } h7.toc { margin-left: 7em; font-size: 90%; line-height: 105%; } .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%; } h7.microtoc { margin-left: 30mm; font-weight: normal; font-size: 85%; } .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; } h7.subtoc { margin-left: 4em; font-size: 70%; 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, h7.c, p.c { text-align: center } h1.red, h2.red, h3.red, h4.red, h5.red, h6.red, h7.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, h7.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 require_relative 'xhtml_parts' # xhtml_parts.rb 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_c_xml]). #gsub(//,'>'). gsub(/\\\\/,'
'). gsub(/<br(?: \/)?>/,'
') else x end end end class HeadInformation attr_reader :md,:rdf def initialize(md) @md=md # DublinCore 1 - title @css=SiSU_Env::CSS_Stylesheet.new(md) @seg_name_xhtml=(SiSU_XHTML_EPUB2::Source::Seg.new.seg_name_xhtml || []) @seg_name_xhtml_tracker=(SiSU_XHTML_EPUB2::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') txt=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'') output_epub_cont_seg << %{#{doc_type} #{dob.obj} - #{@md.html_title} #{@css.xhtml_epub}
} 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) dgst=(@md.dgst.is_a?(Array) and @md.dgst.length > 1) ? @md.dgst[1] : 'na' <<-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}" txt=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'') <<-WOK #{txt} 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 |i| surname=i[:the] \ ? i[:the] : '' other_names=i[:others] \ ? ', ' + i[: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 |i| surname=i[:the] \ ? i[:the] : '' other_names=i[:others] \ ? ', ' + i[: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 |i| surname=i[:the] \ ? i[:the] : '' other_names=i[:others] \ ? ', ' + i[: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 |i| surname=i[:the] \ ? i[:the] : '' other_names=i[:others] \ ? ', ' + i[: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) dgst=(@md.dgst.is_a?(Array) and @md.dgst.length > 1) ? @md.dgst[1] : 'na' <<-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:#{dgst}" 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:#{dgst} WOK end def manifest_open <<-WOK WOK end def manifest_content_sisu_toc <<-WOK WOK end def manifest_cover_image_information(md) 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 %{ #{the_table_close}} end def xhtml_close %{#{SiSU_Proj_XHTML::Bits.new.credits_sisu_epub} } end end class HeadToc < HeadInformation include SiSU_Parts_XHTML 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} } end def concordance if @md.concord_make %{#{the_margin.css}

Concordance

#{the_table_close}} else %{#{the_margin.css} #{the_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(the_nav.txt_concordance) %{
#{the_nav.txt_toc_link} #{concord} #{the_table_close}} end def manifest #check structure manifest=manifest_link(the_nav.txt_manifest) %{#{the_margin.txt_3} #{the_font.paragraph_font_small} #{manifest} #{the_table_close}} end def concordance #check structure concord=concordance_link(the_nav.txt_concordance) %{#{the_margin.txt_3} #{the_font.paragraph_font_small} #{concord} #{the_table_close}} end def metadata %{#{the_margin.css}

MetaData

#{the_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} } end def endnote_mark %{
} end end class HeadScroll < HeadToc def initialize(md) super(md) end def toc_owner_details %{#{the_margin.txt_3} #{the_font.paragraph_font_small} Owner Details #{$ep[:hsp]*3} #{the_table_close}} end end class FormatTextObject include SiSU_Parts_XHTML 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.act[:maintenance][:set]==:on 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) 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_heading0 DISABLE[:epub][:per_section_title] \ ? '' : title_heading('h1','tiny') end def title_heading1 DISABLE[:epub][:per_section_title] \ ? '' : title_heading('h1','tiny') end def title_heading2 DISABLE[:epub][:per_section_title] \ ? '' : title_heading('h2','tiny') end def title_heading3 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 seg_heading7 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 %{#{the_margin.txt_0}

#{@txt}

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

#{@txt}

#{the_margin.num_css} #{$ep[:hsp]*3} #{the_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) 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(/[\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 subtoc_lev7 subtoc_lev('h7','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 heading7 heading_sub('h7','bold',@txt) end def navigation_heading4 %{

#{@txt}

#{the_table_close}} end def navigation_heading5 %{

#{@txt}

} end def navigation_heading6 %{

#{@txt}

} end def navigation_heading7 %{

#{@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 lev7 lev('h7','toc') end def lev0 #docinfo lev('h0','toc') end end end __END__