aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/sisu/v2/epub.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sisu/v2/epub.rb')
-rw-r--r--lib/sisu/v2/epub.rb658
1 files changed, 658 insertions, 0 deletions
diff --git a/lib/sisu/v2/epub.rb b/lib/sisu/v2/epub.rb
new file mode 100644
index 00000000..6df06025
--- /dev/null
+++ b/lib/sisu/v2/epub.rb
@@ -0,0 +1,658 @@
+# coding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997 - 2010, 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 <http://www.gnu.org/licenses/>.
+
+ If you have Internet connection, the latest version of the GPL should be
+ available at these locations:
+ <http://www.fsf.org/licensing/licenses/gpl.html>
+ <http://www.gnu.org/licenses/gpl.html>
+
+ <http://www.jus.uio.no/sisu/gpl.fsf/toc.html>
+ <http://www.jus.uio.no/sisu/gpl.fsf/doc.html>
+ <http://www.jus.uio.no/sisu/gpl.fsf/plain.txt>
+
+ * SiSU uses:
+ * Standard SiSU markup syntax,
+ * Standard SiSU meta-markup syntax, and the
+ * Standard SiSU object citation numbering and system
+
+ * Hompages:
+ <http://www.jus.uio.no/sisu>
+ <http://www.sisudoc.org>
+
+ * Download:
+ <http://www.jus.uio.no/sisu/SiSU/download.html>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: epub generation, processing
+
+=end
+module SiSU_EPUB
+ require 'pstore'
+ require "#{SiSU_lib}/particulars" # particulars.rb
+ include SiSU_Particulars
+ require "#{SiSU_lib}/defaults" # defaults.rb
+ include SiSU_Viz
+ require "#{SiSU_lib}/xhtml_table" # xhtml_table.rb
+ require "#{SiSU_lib}/epub_format" # epub_format.rb
+ include SiSU_EPUB_Format
+ require "#{SiSU_lib}/epub_segments" # epub_segments.rb
+ include SiSU_EPUB_seg
+ require "#{SiSU_lib}/epub_tune" # epub_tune.rb
+ include SiSU_EPUB_Tune
+ require "#{SiSU_lib}/epub_concordance" # epub_concordance.rb
+ class Source
+ def initialize(opt)
+ @opt=opt
+ @particulars=SiSU_Particulars::Combined_singleton.instance.get_all(opt)
+ end
+ def read
+ songsheet
+ end
+ def songsheet
+ begin
+ @md=@particulars.md
+ @fnb=@md.fnb
+ @env=@particulars.env
+ loc=@env.path.url.output_tell
+ tool=if @opt.cmd =~/z/; "#{@env.program.epub_viewer} #{loc}/epub/#{@fnb}.epub"
+ elsif @opt.cmd =~/[MVv]/; "#{@env.program.epub_viewer} #{loc}/epub/#{@fnb}.epub"
+ else ''
+ end
+ SiSU_Screen::Ansi.new(@opt.cmd,'EPUB',tool).green_hi_blue unless @opt.cmd =~/q/
+ SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{loc}/epub/#{@fnb}.epub").flow if @opt.cmd =~/[MV]/
+ @env.path.epub_bld #(@md)
+ @env.path.epub_cp_images(@md)
+ dir_epub=@env.path.epub
+ SiSU_Env::Info_skin.new(@md).select
+ data=nil
+ my_make=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns,@md) #Beware #FIX opt and md, both not necessary
+ SiSU_Env::SiSU_file.new(@md).mkdir
+ @tuned_file_array=SiSU_EPUB::Source::XHtml_environment.new(@particulars).tuned_file_instructions
+ data=@tuned_file_array
+ scr_endnotes=SiSU_EPUB::Source::Endnotes.new(@md,data).scroll
+ toc=SiSU_EPUB::Source::Toc.new(@md,data).songsheet
+ data=@tuned_file_array
+ scr_toc=SiSU_EPUB::Source::Scroll_head_and_segtoc.new(@md,toc).in_common #watch
+ SiSU_EPUB::Source::Seg.new(@md,data).songsheet
+ SiSU_EPUB::Source::Epub_output.new(@md).songsheet
+ rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error
+ ensure
+ unless @opt.cmd =~/[MV]/ #check maintenance flag
+ texfiles=Dir["#{@env.path.tune}/#{@opt.fns}*"]
+ texfiles.each do |f|
+ if FileTest.file?(f)
+ File.unlink(f)
+ end
+ end
+ end
+ SiSU_Env::Create_file.new(@opt.cmd,@opt.fns).param_instantiate
+ @@flag,@@scr,@@seg,@@seg_endnotes,@@seg_subtoc,@@seg_ad={},{},{},{},{},{}
+ @@seg_total,@@tracker,@@loop_count,@@tablehead,@@number_of_cols=0,0,0,0,0
+ @@seg_name,@@seg_name_html,@@seg_subtoc_array,@@seg_endnotes_array,@@segtocband,@@tablefoot=Array.new(7){[]}
+ @@filename_seg,@@seg_url,@@fn,@@to_lev4,@@get_hash_to,@@get_hash_fn='','','','','','',''
+ @@is4=@@is3=@@is2=@@is1=@@heading1=@@heading2=@@heading3=@@heading4=0
+ end
+ end
+ private
+ class XHtml_environment
+ def initialize(particulars)
+ @particulars=particulars
+ @md,@env=particulars.md,particulars.env
+ @vz=SiSU_Env::Get_init.instance.skin
+ @env,@css,@symlnk=particulars.env,SiSU_Style::CSS.new,SiSU_Env::Create_system_link.new #home
+ end
+ def link_images
+ @symlnk.images
+ end
+ def directories
+ my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns)
+ @path={ :root=>my_make.html_root }
+ title=File.basename(@md.fns,'.rb')
+ SiSU_Env::SiSU_file.new(@md).mkdir
+ end
+ def tuned_file_instructions
+ @tell=SiSU_Screen::Ansi.new(@md.cmd)
+ @md.cmd=@md.cmd.gsub(/H/,'h')
+ @md.file_type='html' if @md.cmd =~/[hon]/
+ directories
+ newfilename=%{#{@env.path.output}/#{@md.fnb}/#{@md.fn[:index]}} if @md.file_type =~/html/
+ dal_array=@particulars.dal_array # dal file drawn here
+ @tuned_file_array=SiSU_EPUB_Tune::Tune.new(dal_array,@md).songsheet
+ @tuned_file_array
+ end
+ end
+ class Endnotes
+ include SiSU_EPUB_Format
+ def initialize(md,data)
+ @md,@data=md,data
+ end
+ def scroll
+ @scr_endnotes=[]
+ format_head_scroll=SiSU_EPUB_Format::Head_scroll.new(@md)
+ @data.each do |dob|
+ pg=dob.dup
+ unless pg.is =~/^code/
+ if pg.obj =~/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})[\d*+]+ /
+ endnote_array=[]
+ if pg.obj=~/#{Mx[:en_a_o]}[\d*+].+?#{Mx[:en_a_c]}/m
+ endnote_array = pg.obj.scan(/#{Mx[:en_a_o]}[\d*+]+(.+?)#{Mx[:en_a_c]}/m)
+ end
+ if pg.obj=~/#{Mx[:en_b_o]}[\d*]+\s.+?#{Mx[:en_b_c]}/m
+ endnote_array = pg.obj.scan(/#{Mx[:en_b_o]}[\d*]+(.+?)#{Mx[:en_b_c]}/m)
+ end
+ if pg.obj=~/#{Mx[:en_b_o]}[\d+]+\s.+?#{Mx[:en_b_c]}/m
+ endnote_array = pg.obj.scan(/#{Mx[:en_b_o]}[\d+]+(.+?)#{Mx[:en_b_c]}/m)
+ end
+ endnote_array.flatten.each do |note|
+ txt_obj={:txt =>note}
+ format_scroll=SiSU_EPUB_Format::Format_scroll.new(@md,txt_obj)
+ @scr_endnotes << format_scroll.endnote_body
+ end
+ end
+ end
+ end
+ @scr_endnotes
+ end
+ end
+ class Toc
+ @@toc={ :seg=>[],:seg_mini=>[],:scr=>[],:ncx=>[],:opf=>[] }
+ @@seg_url=''
+ @@firstseg=nil
+ def initialize(md=nil,data='')
+ @md,@data=md,data
+ @vz=SiSU_Env::Get_init.instance.skin
+ @epub=SiSU_EPUB_Format::Head_information.new(@md)
+ @tell=SiSU_Screen::Ansi.new(@md.cmd) if @md
+ end
+ def songsheet #extracts toc for scroll & seg
+ SiSU_Screen::Ansi.new(@md.cmd,'Toc').txt_grey unless @md.cmd =~/q/
+ toc=nil
+ @@firstseg=nil
+ @@toc={ :seg=>[],:seg_mini=>[],:scr=>[],:ncx=>[],:opf=>[] }
+ md_opf_a_content,md_opf_a_spine=[],[]
+ @nav_no=1
+ @@toc[:ncx] << @epub.toc_ncx.open #epub ncx navmap
+ @@toc[:ncx] << @epub.toc_ncx.head_open << @epub.toc_ncx.head << @epub.toc_ncx.head_close
+ @@toc[:ncx] << @epub.toc_ncx.doc_title << @epub.toc_ncx.doc_author
+ @@toc[:ncx] << @epub.toc_ncx.navmap_open
+ @@toc[:opf] << @epub.metadata_opf.package_open
+ @@toc[:opf] << @epub.metadata_opf.metadata
+ @@toc[:opf] << @epub.metadata_opf.manifest_open
+ @@toc[:ncx] << @epub.toc_ncx.navmap_sisu_toc(@nav_no) #epub ncx navmap, toc
+ @@toc[:seg] << %{<div class="content">\n<div class="substance">}
+ @@toc[:scr] << %{<div class="content">\n<div class="substance">}
+ md_opf_a_content << @epub.metadata_opf.manifest_content_sisu_toc
+ md_opf_a_spine << @epub.metadata_opf.spine_sisu_toc
+ @ncxo=[nil,false,false,false,false,false,false]
+ @dob_toc2,@dob_toc3=nil,nil
+ @ncx_cls=[]
+ @data.each do |dob|
+ if dob.is=='heading' \
+ or dob.is=='heading_insert'
+ dob_toc=dob.dup
+ toc=case dob_toc.ln
+ when 1
+ Toc.new(@md,dob_toc).level_1
+ when 2
+ @nav_no+=1
+ @nav_no2=@nav_no
+ @ncx_cls << @epub.toc_ncx.navpoint_close if @ncxo[4]
+ @ncx_cls << @epub.toc_ncx.navpoint_close if @ncxo[3]
+ @ncx_cls << @epub.toc_ncx.navpoint_close if @ncxo[2]
+ @ncxo[2],@ncxo[3],@ncxo[4]=false,false,false
+ @dob_toc2=dob_toc
+ @ncxo[2]=true
+ Toc.new(@md,dob_toc).level_2
+ when 3
+ @nav_no+=1
+ @nav_no3=@nav_no
+ @ncx_cls << @epub.toc_ncx.navpoint_close if @ncxo[4]
+ @ncx_cls << @epub.toc_ncx.navpoint_close if @ncxo[3]
+ @ncxo[3],@ncxo[4]=false,false
+ @dob_toc3=dob_toc
+ @ncxo[3]=true
+ Toc.new(@md,dob_toc).level_3
+ when 4
+ @@toc[:ncx] << @ncx_cls if @ncx_cls.length > 0
+ @ncx_cls=[]
+ @@toc[:ncx] << @epub.toc_ncx.navpoint_top3(@dob_toc2,@nav_no2,dob_toc.name) if @dob_toc2 #epub ncx navmap
+ @@toc[:ncx] << @epub.toc_ncx.navpoint_top3(@dob_toc3,@nav_no3,dob_toc.name) if @dob_toc3 #epub ncx navmap
+ @dob_toc2,@dob_toc3=nil,nil
+ @nav_no+=1
+ @@toc[:ncx] << @epub.toc_ncx.navpoint_close if @ncxo[4]
+ @ncxo[4]=false
+ @@toc[:ncx] << @epub.toc_ncx.navpoint(dob_toc,@nav_no) if dob_toc #epub ncx navmap
+ @ncxo[4]=true
+ md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc)
+ md_opf_a_spine << @epub.metadata_opf.spine(dob_toc)
+ Toc.new(@md,dob_toc).level_4
+ when 5; Toc.new(@md,dob_toc).level_5
+ when 6; Toc.new(@md,dob_toc).level_6
+ else nil
+ end
+ toc.each do |k,d|
+ d.gsub!(/(?:#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})\s*/m,' ')
+ end if toc
+ if @@firstseg.nil? \
+ and dob.ln==4 \
+ and dob.name =~/\S+/
+ @@firstseg=dob.name
+ end
+ if toc
+ begin
+ @@toc[:seg] << toc[:seg]
+ @@toc[:scr] << toc[:seg]
+ @@toc[:seg_mini] << toc[:seg_mini] if toc[:seg_mini]
+ rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error
+ end
+ end
+ end
+ end
+ @@toc[:ncx] << @epub.toc_ncx.navpoint_close if @ncxo[4]
+ @@toc[:ncx] << @epub.toc_ncx.navpoint_close if @ncxo[3]
+ @@toc[:ncx] << @epub.toc_ncx.navpoint_close if @ncxo[2]
+ @ncxo[1],@ncxo[2],@ncxo[3],@ncxo[4]=false,false,false,false
+ md_opf_a_content << @epub.metadata_opf.manifest_images(@md.ec[:image])
+ @@toc[:seg] << "</div>\n</div>"
+ @@toc[:scr] << "</div>\n</div>"
+ @@toc[:ncx] << @epub.toc_ncx.navmap_close
+ @@toc[:ncx] << @epub.toc_ncx.close
+ @@toc[:opf] << md_opf_a_content << @epub.metadata_opf.manifest_close
+ @@toc[:opf] << @epub.metadata_opf.spine_open << md_opf_a_spine << @epub.metadata_opf.spine_close
+ @@toc[:opf] << @epub.metadata_opf.package_close
+ @@toc[:opf]=@@toc[:opf].flatten
+ Epub_output.new(@md,@@toc[:opf]).epub_metadata_opf
+ Epub_output.new(@md,@@toc[:ncx]).epub_toc_ncx
+ @md.firstseg=@@firstseg
+ @@toc
+ end
+ def minitoc
+ minitoc=@@toc[:seg_mini].join("\n")
+ '<div class="toc">' + minitoc + '</div>'
+ end
+ protected
+ def level_1
+ dob=@data
+ linkname,link=dob.obj.strip,dob.ocn
+ if link \
+ and link !~/#/ #% keep eye on link
+ p_num=SiSU_EPUB_Format::Paragraph_number.new(@md,link)
+ end
+ title=if dob.obj !~/Document Information/; linkname
+ else
+ link='metadata'
+ %{<b><a href="#{@md.fnl[:pre]}#{link}#{@md.fnl[:mid]}#{Sfx[:epub_xhtml]}#{@md.fnl[:post]}">#{linkname}</a></b>}
+ end
+ toc={}
+ txt_obj={:txt =>title}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:seg]=if dob.name =~/^meta/ \
+ and dob.obj =~/Document Information/ #check
+ format_toc.lev0
+ else format_toc.lev1
+ end
+ toc[:seg_mini]=if dob.name =~/^meta/ \
+ and dob.obj =~/Document Information/ #check
+ x=if @md.concord_make
+ format_toc.mini_concord_tail
+ else format_toc.mini_tail
+ end
+ else format_toc.mini_lev1
+ end
+ title=if dob.ocn ==0
+ if dob.name =~/^meta/ \
+ and dob.obj =~/Document Information/
+ %{<a href="#docinfo">#{linkname}</a>}
+ else linkname
+ end
+ else
+ @@toc[:scr] << '<br />'
+ link=if dob.ln; dob.ln
+ else ''
+ end
+ %{<b><a href="##{link}">#{linkname}</a></b>}
+ end
+ txt_obj={:txt =>title}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:scr]=if dob.name =~/^meta/ \
+ and dob.obj =~/Document Information/
+ format_toc.lev0
+ else format_toc.lev1
+ end
+ toc
+ end
+ def level_2
+ dob=@data
+ linkname,ocn=dob.obj.strip,dob.ocn
+ if ocn \
+ and ocn !~/#/
+ p_num=SiSU_EPUB_Format::Paragraph_number.new(@md,ocn)
+ end
+ txt_obj={:txt =>linkname}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc={}
+ toc[:seg]=format_toc.lev2
+ toc[:seg_mini]=format_toc.mini_lev2
+ if p_num
+ title=%{#{p_num.goto}#{linkname}</a>}
+ txt_obj={:txt =>title}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:scr]=format_toc.lev2
+ end
+ toc
+ end
+ def level_3
+ dob=@data
+ linkname,ocn=dob.obj.strip,dob.ocn
+ if ocn \
+ and ocn !~/#/
+ p_num=SiSU_EPUB_Format::Paragraph_number.new(@md,ocn)
+ end
+ txt_obj={:txt =>linkname}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc={}
+ toc[:seg]=format_toc.lev3
+ toc[:seg_mini]=format_toc.mini_lev3
+ if p_num
+ title=%{#{p_num.goto}#{linkname}</a>}
+ txt_obj={:txt =>title}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:scr]=format_toc.lev3
+ end
+ toc
+ end
+ def level_4
+ dob=@data
+ linkname,ocn=dob.obj.strip,dob.ocn
+ p_num=SiSU_EPUB_Format::Paragraph_number.new(@md,ocn) if ocn
+ if dob.ln==4
+ seg_link=%{ <a href="#{@md.fnl[:pre]}#{dob.name}#{@md.fnl[:mid]}#{Sfx[:epub_xhtml]}#{@md.fnl[:post]}">
+ #{dob.obj}
+ </a> }
+ @@seg_url=dob.name
+ elsif dob.obj =~/\d+.\d+.\d+.\d+|\d+.\d+.\d+|\d+.\d+|\d+/
+ seg_link=dob.obj.gsub(/^(\d+.\d+.\d+.\d+|\d+.\d+.\d+|\d+.\d+|\d+)(.*)/,
+ %{<a href="#{@md.fnl[:pre]}\\1#{@md.fnl[:mid]}#{Sfx[:epub_xhtml]}#{@md.fnl[:post]}">} +
+ %{\\1 \\2</a> })
+ end
+ p_num=SiSU_EPUB_Format::Paragraph_number.new(@md,ocn) if ocn
+ txt_obj={:txt =>seg_link}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc={}
+ toc[:seg]=format_toc.lev4
+ toc[:seg_mini]=format_toc.mini_lev4
+ title=%{#{p_num.goto}#{linkname}</a>} if p_num
+ txt_obj={:txt =>title}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:scr]=format_toc.lev4
+ toc
+ end
+ def level_5
+ dob=@data
+ linkname,ocn=dob.obj.strip,dob.ocn
+ toc={}
+ if ocn \
+ and ocn !~/#/
+ p_num=SiSU_EPUB_Format::Paragraph_number.new(@md,ocn)
+ lnk_n_txt=%{ <a href="#{@md.fnl[:pre]}#{@@seg_url}#{@md.fnl[:mid]}#{Sfx[:epub_xhtml]}#{@md.fnl[:post]}#o#{ocn}">
+ #{linkname}
+ </a>}
+ txt_obj={:txt =>lnk_n_txt}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:seg]=format_toc.lev5
+ toc[:seg_mini]=format_toc.mini_lev5
+ title=%{#{p_num.goto}#{linkname}</a>}
+ txt_obj={:txt =>title}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:scr]=format_toc.lev5
+ end
+ toc
+ end
+ def level_6
+ dob=@data
+ linkname,ocn=dob.obj.strip,dob.ocn
+ toc={}
+ if ocn \
+ and ocn !~/#/
+ p_num=SiSU_EPUB_Format::Paragraph_number.new(@md,ocn)
+ lnk_n_txt=%{ <a href="#{@md.fnl[:pre]}#{@@seg_url}#{@md.fnl[:mid]}#{Sfx[:epub_xhtml]}#{@md.fnl[:post]}#o#{ocn}">
+ #{linkname}
+</a>}
+ txt_obj={:txt =>lnk_n_txt}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:seg]=format_toc.lev6
+ toc[:seg_mini]=format_toc.mini_lev6
+ title=%{#{p_num.goto}#{linkname}</a>}
+ txt_obj={:txt =>title}
+ format_toc=SiSU_EPUB_Format::Format_toc.new(@md,txt_obj)
+ toc[:scr]=format_toc.lev6
+ end
+ toc
+ end
+ def level_crosslink
+ dob=@data
+ if dob !~/^4~!/
+ dob.gsub!(/^4~!\s+(\S+)\s+(.+)/,
+ %{<table><tr><td width =\"80\"></td>
+ <td><a href="http://\\1">
+ #{@png.crosslink_ext}
+ &nbsp;&nbsp;\\2
+ <\/a>
+ </td></tr></table>
+})
+ else
+ dob.gsub!(/^4~!\s+(\S+)\s+(.+)/,
+ %{<table><tr><td width ="80">
+ </td><td>
+ <a href="\\1">
+ #{@png.crosslink}
+ &nbsp;&nbsp;\\2
+ <\/a>
+ </td></tr></table>
+})
+ end
+ end
+ end
+ class Scroll_head_and_segtoc < Toc
+ def initialize(md='',toc='',links_guide_toc='')
+ @md,@toc,@links_guide_toc=md,toc,links_guide_toc
+ @vz=SiSU_Env::Get_init.instance.skin
+ end
+ def in_common
+ toc_shared=[]
+ segtoc=[]
+ SiSU_Screen::Ansi.new(@md.cmd,'Scroll & Segtoc').txt_grey unless @md.cmd =~/q/
+ format_head_toc=SiSU_EPUB_Format::Head_toc.new(@md)
+ dochead=format_head_toc.head
+ dochead.gsub!(/toc\.(html)/,'doc.\1') #kludge
+ toc_shared << dochead #<< ads.div.major
+ segtoc << format_head_toc.head #<< ads.div.major
+ toc_shared << format_head_toc.toc_head_escript if SiSU_EPUB_Format::Head_toc.method_defined? :toc_head_escript
+ segtoc << format_head_toc.toc_head_escript if SiSU_EPUB_Format::Head_toc.method_defined? :toc_head_escript
+ if @md.rights.all
+ rights=format_head_toc.rights.all
+ rights=SiSU_EPUB_Tune::Clean_xhtml.new(rights).clean
+ end
+ if defined? @md.notes.prefix_b \
+ and @md.notes.prefix_b
+ prefix_b=format_head_toc.prefix_b
+ prefix_b=SiSU_EPUB_Tune::Clean_xhtml.new(prefix_b).clean
+ end
+ seg_toc_band=format_head_toc.seg_head_navigation_band
+ seg_toc_band_bottom=format_head_toc.seg_head_navigation_band_bottom
+ tmp_head=nil
+ doc_title_endnote=@md.title.full.gsub(/(\*+)/,'<sup><a href="#endnotes">\1</a></sup>')
+ tmp_head=doc_title_endnote + "\n"
+ txt_obj={:txt =>tmp_head}
+ format_txt_obj=SiSU_EPUB_Format::Format_text_object.new(@md,txt_obj)
+ toc_shared << format_txt_obj.center_bold
+ segtoc << format_txt_obj.center_bold
+ if @md.creator.author
+ creator_endnote=@md.creator.author.gsub(/(\*+)/,%{&nbsp;<sup><a href="#notes">\\1</a></sup>})
+ tmp_head=creator_endnote + "\n"
+ txt_obj={:txt =>tmp_head}
+ format_txt_obj=SiSU_EPUB_Format::Format_text_object.new(@md,txt_obj)
+ toc_shared << format_txt_obj.center_bold
+ segtoc << format_txt_obj.center_bold
+ end
+ toc_shared << format_head_toc.copyat
+ segtoc << format_head_toc.copyat
+ segtoc << seg_toc_band
+ tmp_head=nil
+ if @md.prefix_a
+ tmp_head ||= %{#{@md.prefix_a}\n}
+ toc_shared << tmp_head.dup
+ segtoc << tmp_head.dup
+ end
+ tmp_head=nil
+ toc_shared << @links_guide_toc
+ toc_shared << rights if @md.rights.all
+ toc_shared << prefix_b if @md.prefix_b
+ #Table of Contents added/appended here
+ toc_shared << @toc[:scr]
+ segtoc << @links_guide_toc
+ segtoc << @toc[:seg]
+ segtoc << rights if @md.rights.all
+ segtoc << prefix_b if @md.prefix_b
+ #Segtoc tail added here
+ segtoc << seg_toc_band_bottom
+ segtoc << format_head_toc.xhtml_close
+ segtoc.flatten!.compact!
+ Epub_output.new(@md,segtoc).segtoc
+ segtoc=[]
+ @toc[:scr],@toc[:seg]=[],[]
+ toc_shared
+ end
+ end
+ class Table < SiSU_XHTML_table::Table_xhtml
+ end
+ class Seg < SiSU_EPUB_seg::Seg
+ end
+ class Epub_output
+ require 'fileutils'
+ include FileUtils #::Verbose
+ def initialize(md,output='')
+ @md,@output=md,output
+ @epub_out="#{@md.env.path.output}/epub"
+ @epub_doc="#{@md.fnb}.epub"
+ @epub_header=SiSU_EPUB_Format::Head_information.new(@md)
+ @make=SiSU_Env::Create_file.new(@md.cmd,@md.fns,@md)
+ end
+ def songsheet
+ mimetype
+ metainf_container
+ css
+ images if @md.ec[:image]
+ #concordance #uncomment to enable inclusion of concordance file
+ output_zip
+ end
+ def mimetype
+ out=@make.epub.mimetype
+ out<<@epub_header.mimetype
+ out.close
+ end
+ def metainf_container #container.xml file in META-INF directory
+ out=@make.epub.metainf_cont
+ out<<@epub_header.metainf_container
+ out.close
+ end
+ def css
+ out=@make.epub.xhtml_css
+ out << SiSU_EPUB_Format::Css.new.css_epub_xhtml
+ out.close
+ end
+ def epub_toc_ncx
+ begin
+ out=@make.epub.toc_ncx
+ @output.each do |para|
+ unless para =~/\A\s*\Z/
+ out.puts para
+ end
+ end
+ out.close
+ rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error
+ end
+ end
+ def epub_metadata_opf
+ begin
+ out=@make.epub.metadata
+ @output.each do |para|
+ unless para =~/\A\s*\Z/
+ out.puts para
+ end
+ end
+ out.close
+ rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error
+ end
+ end
+ def images
+ img_pth=@md.env.path.image_source_local_tex
+ @md.ec[:image].each do |x|
+ cp("#{img_pth}/#{x}","#{@md.env.path.epub}/OPS/image") if FileTest.directory?("#{@md.env.path.epub}/OPS/image")
+ end
+ end
+ def concordance
+ SiSU_EPUB_Concordance::Source.new(@md.opt).read
+ end
+ def output_zip
+ mkdir_p(@epub_out) unless FileTest.directory?(@epub_out)
+ system("
+ cd #{@md.env.path.epub}
+ zip -qXr9D #{@epub_doc} *
+ mv #{@epub_doc} #{@epub_out}/.
+ cd #{Dir.pwd}
+ ")
+ unless @md.cmd.inspect =~/M/
+ system("rm -r #{@md.env.path.epub}")
+ end
+ end
+ def segtoc
+ begin
+ filename_html_segtoc=@make.epub.xhtml_segtoc
+ filename_html_index=@make.epub.xhtml_index
+ @output.each do |para|
+ para.strip!
+ unless para =~/\A\s*\Z/
+ filename_html_segtoc.puts para,"\n"
+ filename_html_index.puts para,"\n"
+ end
+ end
+ filename_html_segtoc.close
+ filename_html_index.close
+ rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error
+ end
+ end
+ end
+ end
+end
+__END__