-*- mode: org -*- #+TITLE: sisu xhtml including epub #+DESCRIPTION: documents - structuring, various output representations & search #+FILETAGS: :sisu:xhtml: #+AUTHOR: Ralph Amissah #+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] #+COPYRIGHT: Copyright (C) 2015 - 2021 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty #+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :eval no #+PROPERTY: header-args+ :results no #+PROPERTY: header-args+ :cache no #+PROPERTY: header-args+ :padline no #+PROPERTY: header-args+ :mkdirp yes * xhtml.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml.rb" <> module SiSU_XHTML require_relative 'se_hub_particulars' # se_hub_particulars.rb include SiSU_Particulars require_relative 'se' # se.rb include SiSU_Env require_relative 'xml_shared' # xml_shared.rb include SiSU_XML_Munge require_relative 'xml_format' # xml_format.rb include SiSU_XML_Format require_relative 'xml_persist' # xml_persist.rb require_relative 'rexml' # rexml.rb include SiSU_Rexml require_relative 'shared_metadata' # shared_metadata.rb @@alt_id_count=0 @@tablefoot='' class Source def initialize(opt) @opt=opt @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt) end def read begin @env,@md,@ao_array=@particulars.env,@particulars.md,@particulars.ao_array unless @opt.act[:quiet][:set]==:on tool=if (@opt.act[:verbose_plus][:set]==:on \ || @opt.act[:maintenance][:set]==:on) "#{@env.program.web_browser} file://#{@md.file.output_path.xhtml.dir}/#{@md.file.base_filename.xhtml}" elsif @opt.act[:verbose][:set]==:on "#{@env.program.web_browser} file://#{@md.file.output_path.xhtml.dir}/#{@md.file.base_filename.xhtml}" else "[#{@opt.f_pth[:lng_is]}] #{@opt.fno}" end (@opt.act[:verbose][:set]==:on \ || @opt.act[:verbose_plus][:set]==:on \ || @opt.act[:maintenance][:set]==:on) \ ? SiSU_Screen::Ansi.new( @opt.act[:color_state][:set], 'XHTML', tool ).green_hi_blue : SiSU_Screen::Ansi.new( @opt.act[:color_state][:set], 'XHTML', tool ).green_title_hi if (@opt.act[:verbose_plus][:set]==:on \ || @opt.act[:maintenance][:set]==:on) SiSU_Screen::Ansi.new( @opt.act[:color_state][:set], @opt.fns, "/#{@md.file.output_path.xhtml.dir}/#{@md.file.base_filename.xhtml}" ).flow end end SiSU_XHTML::Source::Songsheet.new(@particulars).song rescue SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do __LINE__.to_s + ':' + __FILE__ end ensure SiSU_Env::CreateSite.new(@opt).cp_css Dir.chdir(@opt.f_pth[:pth]) end end private class Songsheet def initialize(particulars) @env,@md,@ao_array,@particulars=particulars.env,particulars.md,particulars.ao_array,particulars @file=SiSU_Env::FileOp.new(@md) end def song begin SiSU_XHTML::Source::Scroll.new(@particulars).songsheet if (@md.opt.act[:verbose][:set]==:on \ || @md.opt.act[:verbose_plus][:set]==:on \ || @md.opt.act[:maintenance][:set]==:on) SiSU_XHTML::Source::Tidy.new(@md,@file.place_file.xhtml.dir).xml # test wellformedness, comment out when not in use end SiSU_Rexml::Rexml.new(@md,@file.place_file.xhtml.dir).xml if @md.opt.act[:maintenance][:set]==:on # test rexml parsing, comment out when not in use #debug rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end ensure end end end class Scroll require_relative 'xhtml_shared' # xhtml_shared.rb #check already called require_relative 'txt_shared' # txt_shared.rb include SiSU_TextUtils require_relative 'css' # css.rb def initialize(particulars) @env,@md,@ao_array=particulars.env,particulars.md,particulars.ao_array @tab="\t" @trans=SiSU_XML_Munge::Trans.new(@md) @sys=SiSU_Env::SystemCall.new @per=SiSU_XML_Persist::Persist.new end def songsheet begin pre @data=markup(@ao_array) post publish ensure SiSU_XML_Persist::Persist.new.persist_init end end protected def embedded_endnotes(dob='') dob.obj=dob.obj.gsub(/#{Mx[:en_a_o]}(\d+)\s+(.+?)#{Mx[:en_a_c]}/, '\1\2 '). gsub(/#{Mx[:en_b_o]}([*+]\d+)\s+(.+?)#{Mx[:en_b_c]}/, '\1\2 '). gsub(/#{Mx[:en_a_o]}([*+]+)\s+(.+?)#{Mx[:en_a_c]}/, '\1\2 ') end def extract_endnotes(dob='') notes=dob.obj.scan(/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})([\d*+]+\s+.+?)(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/) notes.flatten.each do |e| s=e.to_s util=SiSU_TextUtils::Wrap.new(s,70) wrap=util.line_wrap wrap=wrap.gsub(/^(\d+)\s+(.+?)\s*\Z/m, < #{Ax[:tab]*2}\\1. \\2 #{Ax[:tab]*1} WOK ). gsub(/^([*+]\d+)\s+(.+?)\s*\Z/m, < #{Ax[:tab]*2}\\1 \\2 #{Ax[:tab]*1} WOK ). gsub(/^([*+]+)\s+(.+?)\s*\Z/m, < #{Ax[:tab]*2}\\1 \\2 #{Ax[:tab]*1} WOK ) #KEEP alternative presentation of endnotes # wrap=wrap.gsub(/^(\d+)\s+(.+?)\s*\Z/m, < ##{Ax[:tab]*2}\\1. \\2 ##{Ax[:tab]*1}

#WOK #) @endnotes << wrap end end def xml_head metadata=SiSU_Metadata::Summary.new(@md).xhtml_scroll.metadata @per.head << metadata end def name_tags(dob) 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 xml_structure(dob,type='norm') if dob.is ==:para \ || dob.is ==:heading named=name_tags(dob) if dob.is==:heading lv=dob.ln dob.ln + 2 else lv=nil end extract_endnotes(dob) dob.obj=dob.obj.gsub(/#{Mx[:en_a_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_a_c]}/,'\1'). #footnote/endnote clean gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'\1') util=SiSU_TextUtils::Wrap.new(dob.obj,70) wrapped=util.line_wrap @per.body << if defined? dob.ocn %{#{Ax[:tab]*0}} else "#{Ax[:tab]*0}" end @per.body << %{#{Ax[:tab]*1}#{named}\n#{Ax[:tab]*2}#{wrapped}\n#{Ax[:tab]*1}} unless lv # main text, contents, body KEEP @per.body << %{#{Ax[:tab]*1}#{named}\n#{Ax[:tab]*2}#{wrapped}\n#{Ax[:tab]*1}} if lv # main text, contents, body KEEP @per.body << @endnotes.compact.join if @endnotes.length > 0 # main text, endnotes KEEP @per.body << "#{Ax[:tab]*1}#{dob.ocn}" if defined? dob.ocn @per.body << "#{Ax[:tab]*0}" @endnotes=[] end end def block_structure(dob) named=name_tags(dob) dob=@trans.markup_block(dob) dob.obj=dob.obj.strip. gsub(/#{Mx[:en_a_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_a_c]}/,'\1'). #footnote/endnote clean gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'\1') #footnote/endnote clean @per.body << %{#{Ax[:tab]*0}} @per.body << %{#{Ax[:tab]*1}#{dob.ocn}} @per.body << %{#{Ax[:tab]*1}#{named}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*2}#{dob.obj}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*1}} @per.body << "#{Ax[:tab]*0}" end def group_structure(dob) named=name_tags(dob) dob=@trans.markup_group(dob) dob.obj=dob.obj.strip. gsub(/#{Mx[:en_a_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_a_c]}/,'\1'). #footnote/endnote clean gsub(/#{Mx[:en_b_o]}([\d*+]+)\s+(?:.+?)#{Mx[:en_b_c]}/,'\1') #footnote/endnote clean @per.body << %{#{Ax[:tab]*0}} @per.body << %{#{Ax[:tab]*1}#{dob.ocn}} @per.body << %{#{Ax[:tab]*1}#{named}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*2}#{dob.obj}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*1}} @per.body << "#{Ax[:tab]*0}" end def poem_structure(dob) named=name_tags(dob) dob=@trans.markup_group(dob) dob.obj=dob.obj.strip @per.body << %{#{Ax[:tab]*0}} @per.body << %{#{Ax[:tab]*1}#{dob.ocn}} @per.body << %{#{Ax[:tab]*1}#{named}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*2}#{dob.obj}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*1}} @per.body << "#{Ax[:tab]*0}" end def code_structure(dob) named=name_tags(dob) dob=@trans.markup_group(dob) dob.obj=dob.obj.gsub(/\s\s/,'  ').strip @per.body << %{#{Ax[:tab]*0}} @per.body << %{#{Ax[:tab]*1}#{dob.ocn}} @per.body << %{#{Ax[:tab]*1}#{named}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*2}#{dob.obj}#{Ax[:tab]*1}} @per.body << %{#{Ax[:tab]*1}} @per.body << "#{Ax[:tab]*0}" end def table_structure(dob) named=name_tags(dob) table=SiSU_XHTML_Shared::TableXHTML.new(dob) @per.body << %{#{Ax[:tab]*0}} @per.body << %{#{Ax[:tab]*1}#{dob.ocn}} @per.body << %{#{Ax[:tab]*2}#{named}#{table.table.obj}} @per.body << "#{Ax[:tab]*0}" end def markup(data) @endnotes=[] @rcdc=false @level,@cont,@copen,@xml_contents_close=[],[],[],[] xml_head (0..7).each { |x| @cont[x]=@level[x]=false } (4..7).each { |x| @xml_contents_close[x]='' } data.each do |dob| dob=@trans.markup(dob) if @rcdc==false \ and (dob.obj =~/~meta/ \ and dob.obj =~/Document Information/) @rcdc=true end if dob.obj !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/ if defined? dob.ocn #look to move to format section ocn=(dob.ocn.to_s =~/\d+/) ? dob.ocn : nil @p_num=SiSU_XML_Format::ParagraphNumber.new(@md,ocn) end if not @rcdc x=SiSU_XML_Format::FormatSeg.new(@md,dob) if dob.is==:heading xml_structure(dob) dob.obj=case dob.ln when 0 then x.heading_body0 when 1 then x.heading_body1 when 2 then x.heading_body2 when 3 then x.heading_body3 when 4 then x.heading_body4 when 5 then x.heading_body5 when 6 then x.heading_body6 when 7 then x.heading_body7 end else if dob.is ==:verse poem_structure(dob) elsif dob.is ==:group group_structure(dob) elsif dob.is ==:block block_structure(dob) elsif dob.is ==:code code_structure(dob) elsif dob.is ==:table table_structure(dob) elsif dob.is ==:para \ and dob.indent.to_s =~/[1-9]/ \ and dob.bullet_==true xml_structure(dob,"indent_bullet#{dob.indent}") elsif dob.is ==:para \ and dob.indent.to_s =~/[1-9]/ \ and dob.indent == dob.hang xml_structure(dob,"indent#{dob.indent}") elsif dob.is==:para \ and dob.hang.to_s =~/[0-9]/ \ and dob.indent != dob.hang xml_structure(dob,"hang#{dob.hang.to_s}_indent#{dob.indent.to_s}") else xml_structure(dob) end end if dob.obj =~/.*<:#>.*$/ #investigate removal dob.obj=if dob.obj =~ /#{Mx[:pa_o]}:i[1-9]#{Mx[:pa_c]}/ txt_obj={ txt: dob } format_text=FormatTextObject.new(@md,txt_obj) format_text.scr_inden_ocn_e_no_paranum end end else # end dob.obj=dob.obj.gsub(/#{Mx[:pa_o]}:\S+#{Mx[:pa_c]}/,'') if dob.obj end end 6.downto(4) do |x| y=x - 1; v=x - 3 @per.body << "#{Ax[:tab]*5}\n#{Ax[:tab]*y}" if @level[x]==true end 3.downto(1) do |x| y=x - 1 @per.body << "#{Ax[:tab]*y}" if @level[x]==true end end def pre rdf=SiSU_XML_Tags::RDF.new(@md) @per.head,@per.body=[],[] stylesheet=SiSU_Style::CSS_HeadInfo.new(@md,'xhtml').stylesheet encoding=(@sys.locale =~/utf-?8/i) \ ? '' : '' @per.open =< WOK @per.head << %{\n\t} @per.body << '' end def post @per.head << '' @per.body << '' @per.close = '' end def publish content=[] content << @per.open << @per.head << @per.body << @per.metadata content << @per.tail << @per.close content=content.flatten.compact Output.new(content,@md).xhtml @@xml={} end end class Output def initialize(data,md) @data,@md=data,md @file=SiSU_Env::FileOp.new(@md) end def xhtml SiSU_Env::FileOp.new(@md).mkdir filename_xml=@file.write_file.xhtml @data.each do |str| str=str.gsub(/\A\s+\Z/m,'') #str.gsub(/^\s+$/,'') filename_xml.puts str unless str.empty? end filename_xml.close end end class Tidy def initialize(md,file) @md,@file=md,file @prog=SiSU_Env::InfoProgram.new end def xml if @prog.tidy !=false if (@md.opt.act[:verbose_plus][:set]==:on \ || @md.opt.act[:maintenance][:set]==:on) unless @md.opt.act[:quiet][:set]==:on SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], 'invert', 'Using XML Tidy', 'check document structure' ).colorize tell=SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], 'invert', '', '' ) tell.grey_open end tidyfile='/dev/null' #don't want one or screen output, check for alternative flags tidy=SiSU_Env::SystemCall.new(@file,tidyfile) tidy.well_formed? tell.p_off unless @md.opt.act[:quiet][:set]==:on end end end end end end __END__ ,** Notes: tidy -xml scroll.xhtml >> index.tidy #+END_SRC * epub2.rb ** xhtml_epub2.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_epub2.rb" <> module SiSU_XHTML_EPUB2 begin require 'pstore' rescue LoadError SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia). error('pstore NOT FOUND (LoadError)') end require_relative 'se_hub_particulars' # se_hub_particulars.rb include SiSU_Particulars require_relative 'xml_shared' # xml_shared.rb include SiSU_XML_Munge require_relative 'xhtml_table' # xhtml_table.rb require_relative 'xhtml_epub2_format' # xhtml_epub2_format.rb include SiSU_XHTML_EPUB2_Format require_relative 'xhtml_epub2_segments' # xhtml_epub2_segments.rb include SiSU_XHTML_EPUB2_Seg require_relative 'xhtml_epub2_tune' # xhtml_epub2_tune.rb include SiSU_XHTML_EPUB2_Tune require_relative 'xhtml_epub2_concordance' # xhtml_epub2_concordance.rb require_relative 'xhtml_epub2_persist' # xhtml_epub2_persist.rb class Source def initialize(opt) @opt=opt @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt) end def read begin songsheet ensure Dir.chdir(@opt.f_pth[:pth]) end end def songsheet begin @md=@particulars.md @fnb=@md.fnb @env=@particulars.env unless @opt.act[:quiet][:set]==:on tool=(@opt.act[:verbose][:set]==:on \ || @opt.act[:verbose_plus][:set]==:on \ || @opt.act[:maintenance][:set]==:on) \ ? "#{@env.program.epub_viewer} #{@md.file.output_path.epub.dir}/#{@md.file.base_filename.epub}" : "[#{@opt.f_pth[:lng_is]}] #{@opt.fno}" (@opt.act[:verbose][:set]==:on \ || @opt.act[:verbose_plus][:set]==:on \ || @opt.act[:maintenance][:set]==:on) \ ? SiSU_Screen::Ansi.new( @opt.act[:color_state][:set], 'EPUB', tool ).green_hi_blue : SiSU_Screen::Ansi.new( @opt.act[:color_state][:set], 'EPUB', tool ).green_title_hi if (@opt.act[:verbose_plus][:set]==:on \ || @opt.act[:maintenance][:set]==:on) SiSU_Screen::Ansi.new( @opt.act[:color_state][:set], @opt.fns, "#{@md.file.output_path.epub.dir}/#{@md.file.base_filename.epub}" ).flow end end @env.processing_path.epub_bld #(@md) @env.processing_path.epub_cp_images(@md) data=nil SiSU_Env::FileOp.new(@md).mkdir.output.epub @tuned_file_array=SiSU_XHTML_EPUB2::Source::XHTML_Environment.new(@particulars).tuned_file_instructions data=@tuned_file_array per=SiSU_XHTML_EPUB2::Source::Toc.new(@md,data).songsheet data=@tuned_file_array SiSU_XHTML_EPUB2::Source::ScrollHeadAndSegToc.new(@md,per).in_common #watch SiSU_XHTML_EPUB2::Source::Seg.new(@md,data).songsheet SiSU_XHTML_EPUB2::Source::Output.new(@md).songsheet rescue SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do __LINE__.to_s + ':' + __FILE__ end ensure unless (@opt.act[:verbose_plus][:set]==:on \ || @opt.act[:maintenance][:set]==:on) texfiles=Dir["#{@env.processing_path.tune}/#{@opt.fns}*"] texfiles.each do |f| if FileTest.file?(f) File.unlink(f) end end end SiSU_Env::Clear.new(@opt.selections.str,@opt.fns).param_instantiate @@flag,@@scr,@@seg,@@seg_endnotes,@@seg_subtoc={},{},{},{},{} @@tracker=0 @@seg_name,@@seg_name_html,@@seg_subtoc_array,@@seg_endnotes_array,@@tablefoot=Array.new(5){[]} @@filename_seg,@@seg_url,@@to_lev4,@@get_hash_to,@@get_hash_fn='','','','','' end end private class XHTML_Environment def initialize(particulars) @particulars=particulars @md,@env=particulars.md,particulars.env @env,@css=particulars.env,SiSU_Style::CSS.new end def directories SiSU_Env::FileOp.new(@md).mkdir.output.epub end def tuned_file_instructions @tell=SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set]) directories ao_array=@particulars.ao_array # ao file drawn here @tuned_file_array=SiSU_XHTML_EPUB2_Tune::Tune.new(ao_array,@md).songsheet @tuned_file_array end end class Endnotes include SiSU_XHTML_EPUB2_Format def initialize(md,data) @md,@data=md,data end def scroll @scr_endnotes=[] @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_XHTML_EPUB2_Format::FormatScroll.new(@md,txt_obj) @scr_endnotes << format_scroll.endnote_body end end end end @scr_endnotes end end class Toc @@seg_url='' @@firstseg=nil def initialize(md=nil,data='') @md,@data=md,data @epub=SiSU_XHTML_EPUB2_Format::HeadInformation.new(@md) @tell=SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set]) if @md @make=SiSU_Env::ProcessingSettings.new(@md) @per=SiSU_XHTML_EPUB2_Persist::PersistTOC.new end def songsheet #extracts toc for scroll & seg begin if (@md.opt.act[:verbose][:set]==:on \ || @md.opt.act[:verbose_plus][:set]==:on \ || @md.opt.act[:maintenance][:set]==:on) SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], 'Toc' ).txt_grey end toc=nil @@firstseg=nil SiSU_XHTML_EPUB2_Persist::PersistTOC.new.persist_init md_opf_a_content,md_opf_a_spine,md_opf_a_guide=[],[],[] @nav_no=0 @s_a_no,@s_b_no,@s_c_no,@s_d_no,@lv5_no,@lv6_no=0,0,0,0,0,0 @per.ncx << @epub.toc_ncx.open #epub ncx navmap @per.ncx << @epub.toc_ncx.head_open << @epub.toc_ncx.head << @epub.toc_ncx.head_close @per.ncx << @epub.toc_ncx.doc_title << @epub.toc_ncx.doc_author @per.ncx << @epub.toc_ncx.navmap_open @per.opf << @epub.metadata_opf.package_open @per.opf << @epub.metadata_opf.metadata @per.opf << @epub.metadata_opf.manifest_open @per.seg << %{
\n
} @per.scr << %{
\n
} if defined? @md.make.cover_image \ and @md.make.cover_image.is_a?(Hash) \ and @md.make.cover_image[:cover] =~/\S+/ md_opf_a_content << @epub.metadata_opf.manifest_cover_image_information(@md) md_opf_a_spine << @epub.metadata_opf.spine_cover_image md_opf_a_guide << @epub.metadata_opf.guide_cover_image end md_opf_a_content << @epub.metadata_opf.manifest_content_sisu_toc if @make.build.toc? md_opf_a_spine << @epub.metadata_opf.spine_sisu_toc md_opf_a_guide << @epub.metadata_opf.guide_sisu_toc end @ncxo=[false,false,false,false,false,false,false] @dob_toc2,@dob_toc3=nil,nil @ncx_cls=[] @level_a_first_occurrence=true @data.each do |dob| if dob.is==:heading \ || dob.is==:heading_insert dob_toc=dob.dup toc=case dob_toc.ln when 0 @s_a_no +=1 lv_name='section_a' + @s_a_no.to_s @nav_no+=1 @nav_no2=@nav_no @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[5] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[4] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[3] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[2] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[1] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[0] @ncxo[0],@ncxo[1],@ncxo[2],@ncxo[3],@ncxo[4],@ncxo[5],@ncxo[6],@ncxo[7]= true, false, false, false, false, false, false, false @epub.sections(dob_toc,lv_name) if @level_a_first_occurrence \ && @make.build.toc? @per.ncx << @epub.toc_ncx.navmap_sisu_toc(@nav_no) #epub ncx navmap, toc @nav_no+=1 @level_a_first_occurrence=false end @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_0 when 1 @s_b_no +=1 lv_name='section_b' + @s_b_no.to_s @nav_no+=1 @nav_no2=@nav_no @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[5] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[4] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[3] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[2] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[1] @ncxo[1],@ncxo[2],@ncxo[3],@ncxo[4],@ncxo[5],@ncxo[6],@ncxo[7]= true, false, false, false, false, false, false @epub.sections(dob_toc,lv_name) @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_1 when 2 @s_c_no +=1 lv_name='section_c' + @s_c_no.to_s @nav_no+=1 @nav_no2=@nav_no @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[5] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[4] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[3] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[2] @ncxo[2],@ncxo[3],@ncxo[4],@ncxo[5],@ncxo[6],@ncxo[7]= true, false, false, false, false, false @epub.sections(dob_toc,lv_name) @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_2 when 3 @s_d_no +=1 lv_name='section_d' + @s_d_no.to_s @nav_no+=1 @nav_no3=@nav_no @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[5] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[4] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[3] @ncxo[3],@ncxo[4],@ncxo[5],@ncxo[6],@ncxo[7]= true, false, false, false, false @epub.sections(dob_toc,lv_name) @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_3 when 4 @ncx_cls=[] lv_name=dob_toc.name @nav_no+=1 @dob_name=dob.name @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[5] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[4] @ncxo[4],@ncxo[5],@ncxo[6],@ncxo[7]= true, false, false, false @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_4 when 5 @ncx_cls=[] hashtag='#o' + dob_toc.ocn.to_s lv_name=@dob_name @nav_no+=1 @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[5] @ncxo[5],@ncxo[6],@ncxo[7]= true, false, false @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name,hashtag) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name,hashtag) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name,hashtag) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name,hashtag) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_5 when 6 @ncx_cls=[] hashtag='#o' + dob_toc.ocn.to_s lv_name=@dob_name @nav_no+=1 @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @ncxo[6],@ncxo[7]= true, false @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name,hashtag) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name,hashtag) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name,hashtag) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name,hashtag) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_6 when 7 @ncx_cls=[] hashtag='#o' + dob_toc.ocn.to_s lv_name=@dob_name @nav_no+=1 @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[7] @ncxo[7]=true @per.ncx << @epub.toc_ncx.navpoint(dob_toc,@nav_no,lv_name,hashtag) if dob_toc md_opf_a_content << @epub.metadata_opf.manifest_content(dob_toc,lv_name,hashtag) md_opf_a_spine << @epub.metadata_opf.spine(dob_toc,lv_name,hashtag) md_opf_a_guide << @epub.metadata_opf.guide(dob_toc,lv_name,hashtag) SiSU_XHTML_EPUB2::Source::Toc.new(@md,dob_toc).level_7 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 @per.seg << toc[:seg] @per.scr << toc[:seg] rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end end end end end @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[6] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[5] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[4] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[3] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[2] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[1] @per.ncx << @epub.toc_ncx.navpoint_close if @ncxo[0] @ncxo[0],@ncxo[1],@ncxo[2],@ncxo[3],@ncxo[4],@ncxo[5],@ncxo[6]=false,false,false,false,false,false,false md_opf_a_content << @epub.metadata_opf.manifest_images(@md.ec[:image]) @per.seg << "
\n
" @per.scr << "
\n
" @per.ncx << @epub.toc_ncx.navmap_close @per.ncx << @epub.toc_ncx.close @per.opf << md_opf_a_content << @epub.metadata_opf.manifest_close @per.opf << @epub.metadata_opf.spine_open << md_opf_a_spine << @epub.metadata_opf.spine_close @per.opf << @epub.metadata_opf.guide_open << md_opf_a_guide << @epub.metadata_opf.guide_close @per.opf << @epub.metadata_opf.package_close @per.opf=@per.opf.flatten SiSU_XHTML_EPUB2::Source::Output.new(@md,@per.opf).epub_metadata_opf SiSU_XHTML_EPUB2::Source::Output.new(@md,@per.ncx).epub_toc_ncx @md.firstseg=@@firstseg @per ensure SiSU_XHTML_EPUB2_Persist::Persist.new.persist_init end end protected def level_0 dob=@data linkname=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip link=dob.ocn title=linkname toc={} txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:seg]=format_toc.lev1 title=if dob.ocn ==0 then linkname else @per.scr << '
' link=(dob.ln) \ ? dob.ln : '' %{#{linkname}} end txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:scr]=format_toc.lev1 toc end def level_1 dob=@data linkname=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip link=dob.ocn title=if dob.obj !~/Document Information/ linkname else link='metadata' %{#{linkname}} end toc={} txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:seg]=if dob.name =~/^meta/ \ and dob.obj =~/Document Information/ #check format_toc.lev0 else format_toc.lev1 end title=if dob.ocn ==0 if dob.name =~/^meta/ \ and dob.obj =~/Document Information/ %{#{linkname}} else linkname end else @per.scr << '
' link=(dob.ln) \ ? dob.ln : '' %{#{linkname}} end txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.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=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip ocn=dob.ocn if ocn \ and ocn !~/#/ p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,ocn) end txt_obj={ txt: linkname } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc={} toc[:seg]=format_toc.lev2 if p_num title=%{#{p_num.goto}#{linkname}} txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:scr]=format_toc.lev2 end toc end def level_3 dob=@data linkname=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip ocn=dob.ocn if ocn \ and ocn !~/#/ p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,ocn) end txt_obj={ txt: linkname } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc={} toc[:seg]=format_toc.lev3 if p_num title=%{#{p_num.goto}#{linkname}} txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:scr]=format_toc.lev3 end toc end def level_4 dob=@data linkname=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip ocn=dob.ocn p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,ocn) if ocn if dob.ln==4 seg_link=%{ #{dob.obj} } @@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+)(.*)/, %{} + %{\\1 \\2 }) end p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,ocn) if ocn txt_obj={ txt: seg_link } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc={} toc[:seg]=format_toc.lev4 title=%{#{p_num.goto}#{linkname}} if p_num txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:scr]=format_toc.lev4 toc end def level_5 dob=@data linkname=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip ocn=dob.ocn toc={} if ocn \ and ocn.to_s !~/#/ p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,ocn) lnk_n_txt=%{ #{linkname} } txt_obj={ txt: lnk_n_txt } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:seg]=format_toc.lev5 title=%{#{p_num.goto}#{linkname}} txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:scr]=format_toc.lev5 end toc end def level_6 dob=@data linkname=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip ocn=dob.ocn toc={} if ocn \ and ocn.to_s !~/#/ p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,ocn) lnk_n_txt=%{ #{linkname} } txt_obj={ txt: lnk_n_txt } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:seg]=format_toc.lev6 title=%{#{p_num.goto}#{linkname}} txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:scr]=format_toc.lev6 end toc end def level_7 dob=@data linkname=dob.obj.gsub(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/,'').strip ocn=dob.ocn toc={} if ocn \ and ocn.to_s !~/#/ p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,ocn) lnk_n_txt=%{ #{linkname} } txt_obj={ txt: lnk_n_txt } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:seg]=format_toc.lev7 title=%{#{p_num.goto}#{linkname}} txt_obj={ txt: title } format_toc=SiSU_XHTML_EPUB2_Format::FormatToc.new(@md,txt_obj) toc[:scr]=format_toc.lev7 end toc end end class ScrollHeadAndSegToc < Toc def initialize(md='',per='',links_guide_toc='') @md,@per,@links_guide_toc=md,per,links_guide_toc end def in_common toc_shared=[] segtoc=[] if (@md.opt.act[:verbose][:set]==:on \ || @md.opt.act[:verbose_plus][:set]==:on \ || @md.opt.act[:maintenance][:set]==:on) SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], 'Scroll & Segtoc' ).txt_grey end format_head_toc=SiSU_XHTML_EPUB2_Format::HeadToc.new(@md) dochead=format_head_toc.head dochead=dochead.gsub(/toc\.(html)/,'doc.\1') #kludge toc_shared << dochead #<< ads.div.major segtoc << format_head_toc.head #<< ads.div.major if defined? @md.rights.all \ and @md.rights.all rights=format_head_toc.rights.all rights=SiSU_XHTML_EPUB2_Tune::CleanXHTML.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_XHTML_EPUB2_Tune::CleanXHTML.new(prefix_b).clean end tmp_head=nil doc_title_endnote=@md.title.full.gsub(/(\*+)/,'\1') tmp_head=doc_title_endnote + "\n" txt_obj={ txt: tmp_head } format_txt_obj=SiSU_XHTML_EPUB2_Format::FormatTextObject.new(@md,txt_obj) toc_shared << format_txt_obj.center_bold segtoc << format_txt_obj.center_bold if defined? @md.creator.author \ and @md.creator.author creator_endnote=@md.creator.author.gsub(/(\*+)/,%{#{$ep[:hsp]}\\1}) tmp_head=creator_endnote + "\n" txt_obj={ txt: tmp_head } format_txt_obj=SiSU_XHTML_EPUB2_Format::FormatTextObject.new(@md,txt_obj) toc_shared << format_txt_obj.center_bold segtoc << format_txt_obj.center_bold end tmp_head=nil if defined? @md.prefix_a \ and @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 if defined? @md.rights.all \ and @md.rights.all toc_shared << rights end if defined? @md.prefix_b \ and @md.prefix_b toc_shared << prefix_b end #Table of Contents added/appended here toc_shared << @per.scr segtoc << @links_guide_toc segtoc << @per.seg if defined? @md.rights.all \ and @md.rights.all segtoc << rights end if defined? @md.prefix_b \ and @md.prefix_b segtoc << prefix_b end #Segtoc tail added here segtoc << format_head_toc.xhtml_close segtoc=segtoc.flatten.compact #watch SiSU_XHTML_EPUB2::Source::Output.new(@md).make_cover_image SiSU_XHTML_EPUB2::Source::Output.new(@md,segtoc).make_segtoc segtoc=[] @per.scr,@per.seg=[],[] toc_shared end end class Table < SiSU_XHTML_Table::TableXHTML end class Seg < SiSU_XHTML_EPUB2_Seg::Seg end class Output def initialize(md,output='') @md,@output=md,output @epub_doc="#{@md.fnb}.epub" @epub_header=SiSU_XHTML_EPUB2_Format::HeadInformation.new(@md) @make=SiSU_Env::ProcessingSettings.new(@md) @make_file=SiSU_Env::CreateFile.new(@md.fns) 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_file.epub.mimetype out<<@epub_header.mimetype out.close end def metainf_container #container.xml file in META-INF directory out=@make_file.epub.metainf_cont out<<@epub_header.metainf_container out.close end def css out=@make_file.epub.xhtml_css out << SiSU_XHTML_EPUB2_Format::CSS.new.css_epub_xhtml out.close end def epub_toc_ncx begin out=@make_file.epub.toc_ncx @output.each do |para| unless para =~/\A\s*\Z/ out.puts para end end out.close rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end end end def epub_metadata_opf begin out=@make_file.epub.metadata @output.each do |para| unless para =~/\A\s*\Z/ out.puts para end end out.close rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end end end def images img_pth=@md.env.path.image_source_include img_src_pth=unless @md.opt.f_pth[:pth] =~/\/\S+?\/sisupod\/\S+?\/sisupod\/doc/ @md.file.output_path.epub.rel_image else pt=/(\/\S+?\/sisupod\/\S+?\/sisupod)\/doc/.match(@md.opt.f_pth[:pth])[1] pt + '/image' end @md.ec[:image].each do |x| if FileTest.directory?("#{@md.env.processing_path.epub}/#{Ep[:d_oebps]}/image") \ && FileTest.file?("#{img_src_pth}/#{x}") FileUtils::cp("#{img_src_pth}/#{x}","#{@md.env.processing_path.epub}/#{Ep[:d_oebps]}/image") elsif FileTest.directory?("#{@md.env.processing_path.epub}/#{Ep[:d_oebps]}/image") \ && FileTest.file?("#{img_pth}/#{x}") FileUtils::cp("#{img_pth}/#{x}","#{@md.env.processing_path.epub}/#{Ep[:d_oebps]}/image") else STDERR.puts %{\t*WARN* did not find image - "#{x}" in #{img_src_pth} or #{img_pth} [#{__FILE__}:#{__LINE__}]} end end end def concordance SiSU_XHTML_EPUB2_Concordance::Source.new(@md.opt).read end def output_zip FileUtils::mkdir_p(@md.file.output_path.epub.dir) unless FileTest.directory?(@md.file.output_path.epub.dir) if FileTest.directory?(@md.env.processing_path.epub) \ and SiSU_Env::SystemCall.new.zip pwd=Dir.pwd Dir.chdir(@md.env.processing_path.epub) system(" zip -qXr9D #{@epub_doc} * ") FileUtils::mv(@epub_doc, @md.file.place_file.epub.dir) Dir.chdir(pwd) unless @md.opt.act[:maintenance][:set]==:on FileUtils::rm_r(@md.env.processing_path.epub) end else SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia).mark('*EXITED epub* zip program not found') unless SiSU_Env::SystemCall.new.zip end end def make_cover_image begin if @md.make.cover_image? \ and @md.make.cover_image.is_a?(Hash) \ and @md.make.cover_image[:cover] =~/\S+/ filename_xhtml=@make_file.epub.xhtml_cover_image cover_image=< Cover
WOK filename_xhtml.puts cover_image,"\n" filename_xhtml.close end rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end end end def make_segtoc begin if @make.build.toc? filename_xhtml=@make_file.epub.xhtml_index @output.each do |para| para=para.strip unless para =~/\A\s*\Z/ filename_xhtml.puts para,"\n" end end filename_xhtml.close end rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end end end end end end __END__ #+END_SRC ** xhtml_epub2_concordance.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_epub2_concordance.rb" <> module SiSU_XHTML_EPUB2_Concordance require_relative 'se_hub_particulars' # se_hub_particulars.rb include SiSU_Particulars require_relative 'se' # se.rb include SiSU_Env require_relative 'xhtml_parts' # xhtml_parts.rb require_relative 'xhtml_epub2_format' # xhtml_epub2_format.rb include SiSU_XHTML_EPUB2_Format class Source def initialize(opt) @opt=opt @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt) end def read begin @env,@md=@particulars.env,@particulars.md wordmax=@env.concord_max unless @md.wc_words.nil? if @md.wc_words < wordmax SiSU_XHTML_EPUB2_Concordance::Source::Words.new(@particulars).songsheet else SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], "*WARN* concordance skipped, large document has over #{wordmax} words (#{@md.wc_words})" ).warn unless @md.opt.act[:quiet][:set]==:on end else SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], "*WARN* wc (word count) is off, concordance will be processed for all files including those over the max set size of: #{wordmax} words" ).warn unless @md.opt.act[:quiet][:set]==:on SiSU_XHTML_EPUB2_Concordance::Source::Words.new(@particulars).songsheet end rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end ensure end end private class DocTitle #revisit, both requires (html & xml_shared) needed for stand alone operation (sisu -w [filename]) require_relative 'xhtml_epub2' # xhtml_epub2.rb def initialize(particulars) @particulars,@md=particulars,particulars.md @data=SiSU_XHTML_EPUB2::Source::XHTML_Environment.new(particulars).tuned_file_instructions @fnb=@md.fnb @lex_button=%{SiSU home} @doc_details =<#{$ep[:hsp]}

#{@md.title.full}

#{@md.creator.author}

WOK end def create @css=SiSU_Env::CSS_Stylesheet.new(@particulars.md) format_head_toc=SiSU_XHTML_EPUB2_Format::HeadToc.new(@md) dochead=format_head_toc.head < #{@doc_details}

Word index links are to html versions of the text the segmented version followed by the scroll (single document) version.
[For segmented text references [T1], [T2] or [T3] appearing without a link, indicates that the word appears in a title (or subtitle) of the text (that is identifiable by the appended object citation number).]

(The word listing/index is Case sensitive: Capitalized words appear before lower case)

word (number of occurences)
linked references to word within document
[if number of occurences exceed number of references - word occurs more than once in at least one reference. Footnote/endnotes are either assigned to the paragraph from which they are referenced or ignored, so it is relevant to check the footnotes referenced from within a paragraph as well.]

(After the page is fully loaded) you can jump directly to a word by appending a hash (#) and the word to the url for this text, (do not forget that words are case sensitive, and may be listed twice (starting with and without an upper case letter)), #your_word # [#{$ep[:hsp]}http://[web host]/#{@fnb}/concordance.html#your_word#{$ep[:hsp]}]

WOK end end class Word @@word_previous='' def initialize(word,freq) @word,@freq=word,freq end def html w=if @word.capitalize==@@word_previous %{\n

#{@word}

(#{@freq})

\n\t

} else n=@word.strip.gsub(/\s+/,'_') #also need to convert extended character set to html %{\n

#{@word}

(#{@freq})

\n\t

} end @@word_previous=@word.capitalize w end end class Words require_relative 'xhtml_epub2_format' # xhtml_epub2_format.rb include SiSU_XHTML_EPUB2_Format require_relative 'se' # se.rb include SiSU_Screen def initialize(particulars) @particulars=particulars begin @env,@md,@ao_array=particulars.env,particulars.md,particulars.ao_array @path="#{@env.processing_path.epub}" @freq=Hash.new(0) @rxp_lv0=/^#{Mx[:lv_o]}0:/ @rxp_lv1=/^#{Mx[:lv_o]}1:/ @rxp_lv2=/^#{Mx[:lv_o]}2:/ @rxp_lv3=/^#{Mx[:lv_o]}3:/ @rxp_seg=/^#{Mx[:lv_o]}4:(\S+?)#{Mx[:lv_c]}/ @rxp_title=Regexp.new("^#{Mx[:meta_o]}title#{Mx[:meta_c]}\s*(.+?)\s*$") @rxp_t0=Regexp.new('^T0') @rxp_t1=Regexp.new('^T1') @rxp_t2=Regexp.new('^T2') @rxp_t3=Regexp.new('^T3') @rxp_excluded1=/(?:https?|file|ftp):\/\/\S+/ @rxp_excluded0=/^(?:#{Mx[:fa_bold_o]}|#{Mx[:fa_italics_o]})?(?:to\d+|\d+| |#{Mx[:br_endnotes]}|EOF|#{Mx[:br_eof]}|thumb_\S+|snap_\S+|_+|-+|[(]?(?:ii+|iv|vi+|ix|xi+|xiv|xv|xvi+|xix|xx)[).]?|\S+?_\S+|[\d_]+\w\S+|[\w\d]{1,2}|\d{1,3}\w?|[0-9a-f]{16,64}|\d{2,3}x\d{2,3}|\S{0,2}sha\d|\S{0,3}\d{4}w\d\d|\b\w\d+|\d_all\b|e\.?g\.?)(?:#{Mx[:fa_bold_c]}|#{Mx[:fa_italics_c]})?$/mi #this regex causes and cures a stack dump in ruby 1.9 !!! @rgx_splitlist=%r{[—.,;:-]+|#{Mx[:nbsp]}+}mi @rgx_scanlist=%r{#{Mx[:fa_italics_o]}[a-zA-Z0-9"\s]{2,12}#{Mx[:fa_italics_c]}|#{Mx[:fa_bold_o]}[a-zA-Z0-9"\s]{2,12}#{Mx[:fa_bold_c]}|#{Mx[:url_o]}https?://\S+?#{Mx[:url_c]}|file://\S+|<\S+?>|\w+|[a-zA-Z]+}mi rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end end end def songsheet begin #fix to use p __LINE__.to_s + ':' + __FILE__ p "#{@path}/content/#{@md.fn[:epub_concord]}" p "#{@md.file.output_path.epub.dir}/#{@md.file.base_filename.epub}" @file_concordance=File.open("#{@path}/content/#{@md.fn[:epub_concord]}",'w') map_para rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end ensure @file_concordance.close end end protected def location_scroll(wordlocation,show) @wordlocation=wordlocation %{#{@wordlocation}; } end def location_seg(wordlocation,show) @wordlocation,@show=wordlocation,show @word_location_seg=wordlocation.gsub(/(.+?)\#(\d+)/,"\\1#{Sfx[:epub_xhtml]}#o\\2") unless wordlocation.nil? case @wordlocation when @rxp_t1 %{[H]#{@show}, } when @rxp_t2 %{[H]#{@show}, } when @rxp_t3 %{[H]#{@show}, } else %{#{@show}, } end end def map_para @seg,toy=nil,nil @word_map={} @ao_array.each do |line| if defined? line.ocn if (line.is ==:heading \ || line.is ==:heading_insert) \ && line.ln==4 @seg=line.name end if line.ocn.to_s =~/\d+/ then toy=line.ocn.to_s end if toy =~/\d+/ \ and toy !~/^0$/ line.obj=line.obj.split(@rgx_splitlist).join(' ') #%take in word or other match for word in line.obj.scan(@rgx_scanlist) #%take in word or other match word=word.gsub(/#{Mx[:lnk_o]}|#{Mx[:lnk_c]}|#{Mx[:url_o]}|#{Mx[:url_c]}/,''). gsub(/#{Mx[:fa_o]}\S+?#{Mx[:fa_o_c]}/,''). gsub(/#{Mx[:fa_c_o]}\S+?#{Mx[:fa_c]}/,''). gsub(/#{Mx[:gl_o]}#[a-z]+#{Mx[:gl_c]}/,''). gsub(/#{Mx[:gl_o]}#[0-9]+#{Mx[:gl_c]}/,''). gsub(/^\S$/,'') word=nil if word.empty? word=nil if word =~@rxp_excluded0 #watch word=nil if word =~@rxp_excluded1 #watch word=nil if word =~/^\S$/ if word word=word.gsub(/#{Mx[:br_nl]}|#{Mx[:br_line]}/,' '). gsub(/#{Mx[:fa_o]}[a-z]{1,7}#{Mx[:fa_o_c]}|#{Mx[:fa_c_o]}[a-z]{1,7}#{Mx[:fa_c]}/,''). gsub(/#{Mx[:mk_o]}(?:[0-9a-f]{32}:[0-9a-f]{32}|[0-9a-f]{64}:[0-9a-f]{64})#{Mx[:mk_c]}/,''). gsub(/#{Mx[:mk_o]}(?:[0-9a-f]{32}|[0-9a-f]{64})#{Mx[:mk_c]}/,''). gsub(/#{Mx[:en_a_o]}(?:\d|[*+])*|#{Mx[:en_b_o]}(?:\d|[*+])*|#{Mx[:en_a_c]}|#{Mx[:en_b_c]}/mi,''). gsub(/#{Mx[:fa_o]}\S+?#{Mx[:fa_o_c]}/,'').gsub(/#{Mx[:fa_c_o]}\S+?#{Mx[:fa_c]}/,''). gsub(/<\/?\S+?>/,''). gsub(/^\@+/,''). strip. gsub(/#{Mx[:tc_p]}.+/,''). gsub(/[\.,;:"]$/,''). gsub(/["]/,''). gsub(/^\s*[\(]/,''). gsub(/[\(]\s*$/,''). gsub(/^(?:See|e\.?g\.?).+/,''). gsub(/^\s*[.,;:]\s*/,''). strip. gsub(/^\(?[a-zA-Z]\)$/,''). gsub(/^\d+(st|nd|rd|th)$/,''). gsub(/^(\d+\.?)+$/, ''). gsub(/#{Mx[:mk_o]}|#{Mx[:mk_c]}/,''). gsub(/:name#\S+/,''). gsub(/^\S$/,'') word=nil if word =~/^\S$/ word=nil if word =~/^\s*$/ #watch if word unless word =~/[A-Z][A-Z]/ \ or word =~/\w+\s\w+/ word=word.capitalize end @freq[word] +=1 @word_map[word] ||= [] if line !~@rxp_lv0 \ and line !~@rxp_lv1 \ and line !~@rxp_lv2 \ and line !~@rxp_lv3 @word_map[word] << location_seg("#{@seg}\##{toy}",toy) else @word_map[word] << case line when @rxp_lv0 then location_seg('T0',toy) when @rxp_lv1 then location_seg('T1',toy) when @rxp_lv2 then location_seg('T2',toy) when @rxp_lv3 then location_seg('T3',toy) end end end end end end end end seg='' @file_concordance << SiSU_XHTML_EPUB2_Concordance::Source::DocTitle.new(@particulars).create alph=%W[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z] @file_concordance << '

' alph.each {|x| @file_concordance << %{#{x},#{$ep[:hsp]}}} @file_concordance << '

' letter=alph.shift @file_concordance << %{\n

A

} for word in @freq.keys.sort! {|a,b| a.downcase<=>b.downcase} f=/^(\S)/.match(word)[1] if letter < f.upcase while letter < f.upcase if alph.length > 0 letter=alph.shift @file_concordance << %{\n

#{letter}

} else break end end end keyword=SiSU_XHTML_EPUB2_Concordance::Source::Word.new(word,@freq[word]).html if keyword !~ @rxp_excluded0 if @word_map[word][0] =~ /\d+/ @file_concordance << %{#{keyword}#{seg}#{@word_map[word].uniq.compact.join}} end @file_concordance << '

' end # special cases endnotes and header levels 1 - 3 end credits=SiSU_Proj_XHTML::Bits.new.credits_sisu_epub @file_concordance << %{#{credits}\n} # footer end end end end __END__ #+END_SRC ** xhtml_epub2_format.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_epub2_format.rb" <> 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) @per=SiSU_XHTML_EPUB2_Persist::Persist.new @per.seg_name_x=SiSU_XHTML_EPUB2::Seg.new.seg_name_x @per.seg_name_x_tracker=SiSU_XHTML_EPUB2::Seg.new.seg_name_x_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} #{@per.seg_name_x[@per.seg_name_x_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__ #+END_SRC ** xhtml_epub2_persist.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_epub2_persist.rb" <> module SiSU_XHTML_EPUB2_Persist class Persist @@persist=nil attr_accessor :is0,:is1,:is2,:is3,:is4,:heading0,:heading1,:heading2,:heading3,:heading4, :title, :nav, :tocband_banner, :tocband_bannerless, :headings, :heading_endnotes, :main, :endnote_all, :tail, :credits, :heading_idx, :idx, :seg_endnotes, :seg_endnotes_array, :closed, :get_hash_fn, :get_hash_to, :seg_subtoc, :seg_subtoc_array, :fn, :seg_name ,:seg_name_x,:seg_name_x_tracker def initialize(args=nil) @@persist=args=(args ? args : (@@persist || persist_init_hash_values)) @is0=args[:is0] @is1=args[:is1] @is2=args[:is2] @is3=args[:is3] @is4=args[:is4] @heading0=args[:heading0] @heading1=args[:heading1] @heading2=args[:heading2] @heading3=args[:heading3] @heading4=args[:heading4] @title=args[:title] @nav=args[:nav] @tocband_banner=args[:tocband_banner] @tocband_bannerless=args[:tocband_bannerless] @headings=args[:headings] @heading_endnotes=args[:heading_endnotes] @main=args[:main] @endnote_all=args[:endnote_all] @tail=args[:tail] @credits=args[:credits] #@heading_idx=args[:heading_idx] @idx=args[:idx] @seg_endnotes=args[:seg_endnotes] @seg_endnotes_array=args[:seg_endnotes_array] @closed=args[:closed] @get_hash_to=args[:get_hash_to] @get_hash_fn=args[:get_hash_fn] @seg_subtoc=args[:seg_subtoc] @seg_subtoc_array=args[:seg_subtoc_array] @fn=args[:fn] @seg_name=args[:seg_name] @seg_name_x=args[:seg_name_x] @seg_name_x_tracker=args[:seg_name_x_tracker] end def is0 @is0 end def is1 @is1 end def is2 @is2 end def is3 @is3 end def is4 @is4 end def heading0 @heading0 end def heading1 @heading1 end def heading2 @heading2 end def heading3 @heading3 end def heading4 @heading4 end def title @title end def nav @nav end def tocband_banner @tocband_banner end def tocband_bannerless @tocband_bannerless end def headings @headings end def heading_endnotes @heading_endnotes end def main @main end def endnote_all @endnote_all end def tail @tail end def credits @credits end def heading_idx @heading_idx end def idx @idx end def seg_endnotes @seg_endnotes end def seg_endnotes_array @seg_endnotes_array end def closed @closed end def get_hash_to @get_hash_to end def get_hash_fn @get_hash_fn end def seg_subtoc @seg_subtoc end def seg_subtoc_array @seg_subtoc_array end def fn @fn end def seg_name @seg_name end def seg_name_x @seg_name_x end def seg_name_x_tracker @seg_name_x_tracker end def persist_init_hash_values { is0: 0, is1: 0, is2: 0, is3: 0, is4: 0, heading0: '', heading1: '', heading2: '', heading3: '', heading4: '', tocband_banner: [], tocband_bannerless: [], title: [], nav: [], headings: [], main: [], idx: [], tail: [], credits: [], endnote_all: [], heading_endnotes: '', seg_endnotes: {}, seg_endnotes_array: [], closed: [], get_hash_fn: '', get_hash_to: '', seg_subtoc: {}, seg_subtoc_array: [], fn: '', seg_name: [], seg_name_x: [], seg_name_x_tracker: 0, } end def persist_init @@persist=nil Persist.new(persist_init_hash_values) end end class PersistTOC @@persist=nil attr_accessor :seg,:seg_mini,:scr,:ncx,:opf def initialize(args=nil) @@persist=args=(args ? args : (@@persist || persist_init_hash_values)) @seg=args[:seg] @seg_mini=args[:seg_mini] @scr=args[:scr] @ncx=args[:ncx] @opf=args[:opf] end def seg @seg end def seg_mini @seg_mini end def scr @scr end def ncx @ncx end def opf @opf end def persist_init_hash_values { seg: [], seg_mini: [], scr: [], ncx: [], opf: [], } end def persist_init @@persist=nil PersistTOC.new(persist_init_hash_values) end end end __END__ #+END_SRC ** xhtml_epub2_segments.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_epub2_segments.rb" <> module SiSU_XHTML_EPUB2_Seg require_relative 'xhtml_shared' # xhtml_shared.rb require_relative 'xhtml_epub2' # xhtml_epub2.rb require_relative 'xhtml_epub2_persist' # xhtml_epub2_persist.rb require_relative 'shared_metadata' # shared_metadata.rb class Output def initialize(md,outputfile,per,type='') @md, @output_epub_cont_seg,@per,@type= md,outputfile, per, type end def output if @per.title =~/\S/ filename_seg=[] filename_seg \ << @per.title \ << @per.nav if @type=='endnotes' @per.headings=[] #watch txt_obj={ txt: 'Endnotes', ocn_display: ''} format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings \ << format_seg.title_heading1 filename_seg \ << @per.heading_endnotes \ << @per.headings \ << %{\n
    \n} \ << @per.endnote_all \ << '
    ' elsif @type=='idx' @per.headings=[] txt_obj={ txt: 'Index', ocn_display: ''} format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings << format_seg.title_heading1 filename_seg \ << @per.heading_idx \ << @per.headings \ << %{\n
    \n} \ << @per.idx \ << '
    ' elsif @type=='metadata' metadata=SiSU_Metadata::Summary.new(@md).xhtml_display.metadata @per.headings=[] txt_obj={ txt: 'Metadata', ocn_display: ''} format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings \ << format_seg.title_heading1 filename_seg \ << @per.heading_idx \ << @per.headings \ << %{\n
    \n} \ << metadata \ << '
    ' elsif @type=='sisu_manifest' env=SiSU_Env::InfoEnv.new(@md.fns) path_and_name,url_and_name= \ "#{env.path.output}/#{@md.fnb}/sisu_manifest.html", "#{env.url.root}/#{@md.fnb}/sisu_manifest.html" manifest=if FileTest.file?("#{path_and_name}")==true <A list of available output types may be available at the following url:

    #{url_and_name}

    WOK else '' end @per.headings=[] txt_obj={ txt: 'Manifest', ocn_display: ''} format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings \ << format_seg.title_heading1 filename_seg \ << @per.heading_idx \ << @per.headings \ << %{\n
    \n} \ << manifest \ << '
    ' else filename_seg \ << @per.headings \ << @per.main \ << "\n\n" end filename_seg \ << @per.tail \ << @per.nav \ << @per.closed filename_seg=filename_seg.flatten.compact #watch filename_seg.each do |str| unless str =~/\A\s*\Z/ @output_epub_cont_seg \ << str.strip end end @output_epub_cont_seg.close end end end class Seg @@seg_name=[] @@seg_url='' @@tracker=0 attr_reader :seg_name_x,:seg_name_x_tracker def initialize(md='',data='') @md,@data=md,data @per=SiSU_XHTML_EPUB2_Persist::Persist.new @seg_name_x=@per.seg_name_x=(@@seg_name || []) @seg_name_x_tracker=@per.seg_name_x_tracker=(@@tracker || 0) @make=SiSU_Env::ProcessingSettings.new(@md) if @md end def songsheet begin data=get_subtoc_endnotes(@data,@per) data=articles(data,@per) SiSU_XHTML_EPUB2_Seg::Seg.new.cleanup(@md,@per) # (((( added )))) #### (((( END )))) #### rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end ensure SiSU_XHTML_EPUB2_Persist::Persist.new.persist_init @@seg_name=@per.seg_name=[] end end protected def articles(data,per) @per=per tracking,newfile=0,0 printed_endnote_seg='n' idx_xhtml=nil if @md.book_idx idx_xhtml=SiSU_Particulars::CombinedSingleton. instance.get_idx_xhtml(@md).xhtml_idx idx_xhtml.each do |x| @per.idx << x end @per.heading_idx='' end data.each do |dob| if (dob.is == :heading \ || dob.is == :heading_insert) \ && dob.ln == 4 @@seg_name << dob.name @per.seg_name = @@seg_name dob.name end end @per.seg_name_x=@per.seg_name @per.seg_name.length testforartnum=@per.seg_name_x if (@md.opt.act[:verbose][:set]==:on \ || @md.opt.act[:verbose_plus][:set]==:on \ || @md.opt.act[:maintenance][:set]==:on) SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], @per.seg_name.length ) end SiSU_Particulars::CombinedSingleton. instance.get_map_nametags(@md).nametags_map #p map_nametags data.each do |dob| #if defined? dob.obj \ #and dob.obj =~/href="#{Xx[:segment]}#+\S+?"/ # ##Consider: remove, reinstate earlier? # #while dob.obj =~/href="#{Xx[:segment]}#+(\S+?)"/ # # m=$1 # # if map_nametags[m][:segname] # # dob.obj=dob.obj.sub(/href="#{Xx[:segment]}#+(\S+?)"/,%{href="#{map_nametags[m][:segname]}#{Sfx[:html]}#\\1"}) # # else # # p "NOT FOUND name_tags: #{m}" # # dob.obj=dob.obj.sub(/href="#{Xx[:segment]}#+(\S+?)"/,%{href="#\\1"}) # not satisfactory # # end # #end #end if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==4 @per.heading4=dob.obj @per.is4=newfile=1 end if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==3 @per.heading3=dob.obj @per.is4,@per.is3=0,1 end if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==2 @per.heading2=dob.obj @per.is4,@per.is3,@per.is2=0,0,1 end if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==1 @per.heading1=dob.obj @per.is4,@per.is3,@per.is2,@per.is1=0,0,0,1 end if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==0 @per.heading0=dob.obj @per.is4,@per.is3,@per.is2,@per.is1,@per.is0=0,0,0,0,1 end if (@per.is0 && !@per.is1 && !@per.is2 && !@per.is3 && !@per.is4) if not (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==0 $_ #; check end end if @per.is4==1 dir_epub_cont="#{@md.env.processing_path.epub}/#{Ep[:d_oebps]}" if newfile==1 \ or dob.obj =~/^#{Mx[:br_endnotes]}|^#{Mx[:br_eof]}/ newfile=0 if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==4 if tracking != 0 tail(@md,@per) #SiSU_XHTML_EPUB2_Seg::Seg.new(@md,@per).tail segfilename="#{dir_epub_cont}/#{@per.seg_name_x[tracking-1]}#{Sfx[:epub_xhtml]}" output_epub_cont_seg=File.new(segfilename,'w') if @per.seg_name_x[tracking-1] if dob.is==:heading \ or @per.seg_name_x[tracking-1] !~/endnotes|book_index|metadata/ SiSU_XHTML_EPUB2_Seg::Output.new(@md,output_epub_cont_seg,@per).output elsif dob.is==:heading_insert if @per.seg_name_x[tracking-1]=='endnotes' SiSU_XHTML_EPUB2_Seg::Output.new(@md,output_epub_cont_seg,@per,'endnotes').output elsif @per.seg_name_x[tracking-1]=='book_index' SiSU_XHTML_EPUB2_Seg::Output.new(@md,output_epub_cont_seg,@per,'idx').output @per.idx=[] elsif @per.seg_name_x[tracking-1]=='metadata' # navigation bug FIX SiSU_XHTML_EPUB2_Seg::Output.new(@md,output_epub_cont_seg,@per,'metadata').output else puts "#{__FILE__}::#{__LINE__}" end else puts "#{__FILE__}::#{__LINE__}" end SiSU_XHTML_EPUB2_Seg::Seg.new.reinitialise(per) heading_art(dob) head(dob) if @per.seg_name_x[tracking] =='metadata' segfilename="#{dir_epub_cont}/#{@per.seg_name_x[tracking]}#{Sfx[:epub_xhtml]}" output_epub_cont_seg=File.new(segfilename,'w') SiSU_XHTML_EPUB2_Seg::Output.new(@md,output_epub_cont_seg,@per,'metadata').output SiSU_XHTML_EPUB2_Seg::Seg.new.reinitialise(per) #BUG navigation bug with items following metadata, and occurring before manifest, this becomes a bug ... work area for book index, FIX end #@output_epub_cont_seg.closed #%(((( EOF )))) --> end if tracking==0 heading_art(dob) head(dob) end end tracking=tracking+1 end if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==4 \ && dob.name @per.get_hash_to=dob.name @per.get_hash_fn=dob.name end if dob.obj.is_a?(String) markup(dob) elsif dob.obj.is_a?(Array) dob.obj.each do |pg| markup(pg) end end if testforartnum[tracking-1] =~/endnote/ if printed_endnote_seg=='n' printed_endnote_seg='y' end end end end data end def heading_art(dob) @per.title=SiSU_XHTML_EPUB2_Format::HeadSeg.new(@md).head end def head(dob) clean=/|<:.*?>$/ @p_num ||= '' if @per.is0==1 if defined? @md.creator.author \ and @md.creator.author @author=%{#{@md.creator.author}\n} end @p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,dob.ocn) txt_obj={ txt: @per.heading0, ocn_display: @p_num.ocn_display } format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings << format_seg.title_heading0.gsub(clean,'') @per.heading0=@per.heading0. gsub(/#{$ep[:hsp]}#{$ep[:hsp]}[\d*+]+<\/sup>#{$ep[:hsp]}<\/a>/,'') end if @per.is1==1 @p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,dob.ocn) txt_obj={ txt: @per.heading1, ocn_display: @p_num.ocn_display } format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings << format_seg.title_heading1.gsub(clean,'') @per.heading1=@per.heading1. gsub(/#{$ep[:hsp]}#{$ep[:hsp]}[\d*+]+<\/sup>#{$ep[:hsp]}<\/a>/,'') end if @per.is2==1 heading2=@per.heading2 @p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,dob.ocn) txt_obj={ txt: heading2, ocn_display: @p_num.ocn_display } format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings << format_seg.title_heading2.gsub(clean,'') @per.heading2=@per.heading2. gsub(/#{$ep[:hsp]}#{$ep[:hsp]}[\d*+]+<\/sup>#{$ep[:hsp]}<\/a>/,'') end if @per.is3==1 heading3=@per.heading3 @p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,dob.ocn) txt_obj={ txt: heading3, ocn_display: @p_num.ocn_display } format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings << format_seg.title_heading3.gsub(clean,'') @per.heading3=@per.heading3. gsub(/#{$ep[:hsp]}#{$ep[:hsp]}[\d*+]+<\/sup>#{$ep[:hsp]}<\/a>/,'') end if @per.is4==1 heading4=@per.heading4 @p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,dob.ocn) txt_obj={ txt: heading4, ocn_display: @p_num.ocn_display } format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) @per.headings \ << format_seg.title_heading4.gsub(clean,'') end @@tracker=@@tracker+1 end def markup(dob) @debug=[] if dob.is ==:heading \ || dob.is ==:heading_insert \ || dob.is ==:para #extend as necessary FIX @p_num=SiSU_XHTML_EPUB2_Format::ParagraphNumber.new(@md,dob.ocn) end sto=SiSU_XHTML_EPUB2_Format::FormatTextObject.new(@md,dob) dob_xhtml=if dob.is==:heading \ || dob.is==:heading_insert \ || dob.is==:para dob_xhtml=if dob.is==:heading \ or dob.is==:heading_insert if dob.ln==4 sto.seg_heading4 # work on see SplitTextObject elsif dob.ln==5 sto.seg_heading5 elsif dob.ln==6 sto.seg_heading6 elsif dob.ln==7 sto.seg_heading7 end elsif dob.is==:para if dob.indent \ and dob.hang \ and dob.indent =~/[0-9]/ \ and dob.hang =~/[0-9]/ if dob.bullet_ (dob.indent =~/[1-9]/) \ ? sto.format('li',"i#{dob.indent}") : sto.format('li','bullet') elsif dob.indent == dob.hang sto.format('p',"i#{dob.indent}") elsif dob.indent != dob.hang sto.format('p',"h#{dob.hang}i#{dob.indent}") else sto.para end else sto.para end end elsif dob.is ==:block \ || dob.is ==:group \ || dob.is ==:alt sto.para #fix this should be block type specific #FIX elsif dob.is==:verse sto.verse elsif dob.is==:code sto.code elsif dob.is==:table sto.table elsif dob.is==:break sto.break end if @md.flag_separate_endnotes # may need to revisit, check dob.obj=dob.obj.gsub(/"\s+href="##{Mx[:note_ref]}(\d+)">/, %{" href=\"endnotes#{Sfx[:epub_xhtml]}##{Mx[:note_ref]}\\1">}) #endnote- twice #removed file type end if (dob.is ==:heading \ || dob.is==:heading_insert \ || dob.is==:para) \ && (not dob.ocn or dob.ocn.to_s.empty?) format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,dob) end if (dob.is==:heading \ || dob.is==:heading_insert \ || dob.is==:para) \ and dob.note_ #dob.obj =~/ \n} @per.main << dob_xhtml if @make.build.segsubtoc? @per.main << @per.seg_subtoc[@per.get_hash_fn] #% insertion of sub-toc end else @per.main << dob_xhtml end end def tail(md,per) @md,@per=md,per format_head_seg=SiSU_XHTML_EPUB2_Format::HeadSeg.new(@md) if @md.flag_auto_endnotes \ and @per.seg_endnotes[@per.get_hash_fn] @per.tail << %{\n
    \n
    \n} if @per.seg_endnotes[@per.get_hash_fn].flatten.length > 0 @per.tail << format_head_seg.endnote_mark @per.tail << @per.seg_endnotes[@per.get_hash_fn].flatten #endnotes deposited at end of individual segments ||@|EXTRACTION OF ENDNOTES| end @per.tail << '
    ' @per.tail << '
    ' #this div closes div class content end @per.closed=[] @per.closed << format_head_seg.xhtml_close end def reinitialise(per) per.headings,per.main,per.tail,per.credits=Array.new(4){[]} end def cleanup(md,per) reinitialise(per) @@tracker=0 @per.seg_endnotes,@per.seg_subtoc={},{} @per.seg_endnotes_array,@per.seg_subtoc_array=[],[] per.endnote_all=[] end def get_subtoc_endnotes(data,per) #get endnotes & sub-table of contents subtoc @per=per data.each do |dob| dob.obj=dob.obj.gsub(/
    (.+?)<\/a>/mi,'\1') if @md.flag_auto_endnotes if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln.to_s =~/^[1-4]/ \ and not @per.fn.to_s.empty? @per.seg_endnotes[@per.fn]=[] @per.seg_endnotes[@per.fn] << @per.seg_endnotes_array @per.seg_endnotes_array=[] if dob.ln==4 end if (dob.is==:heading \ || dob.is==:heading_insert) \ && dob.ln==4 #% EXTRACTION OF SUB-TOCs & SEGMENT NAME, after EXTRACTION OF ENDNOTES & SUB-TOCs @per.seg_subtoc[@per.fn]=@per.seg_subtoc_array @per.seg_subtoc_array=[] if dob.name \ and dob.obj @per.fn=dob.name else @per.fn=(dob.name =~/\S+/) \ ? dob.name : '' end end end if dob.is==:heading \ && dob.ln.to_s =~/^[5-7]/ case dob.ln when 5 format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,dob) subtoc=format_seg.subtoc_lev5 #keep and make available, this is the subtoc when 6 format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,dob) subtoc=format_seg.subtoc_lev6 #keep and make available, this is the subtoc when 7 format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,dob) subtoc=format_seg.subtoc_lev7 #keep and make available, this is the subtoc end @per.seg_subtoc_array << subtoc end if @md.flag_auto_endnotes ast,pls='*','+' if dob.obj =~/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})(?:\d|#{ast}|#{pls})+ / \ and dob.is !=:code # endnote- endnote_array=[] if dob.obj=~/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}/m endnote_array << dob.obj.scan(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}/m) end if dob.obj=~/#{Mx[:en_b_o]}#{ast}\d+\s.+?#{Mx[:en_b_c]}/m endnote_array \ << dob.obj.scan(/#{Mx[:en_b_o]}#{ast}\d+\s.+?#{Mx[:en_b_c]}/m) end if dob.obj=~/#{Mx[:en_b_o]}#{pls}\d+\s.+?#{Mx[:en_b_c]}/m endnote_array \ << dob.obj.scan(/#{Mx[:en_b_o]}#{pls}\d+\s.+?#{Mx[:en_b_c]}/m) end endnote_array=endnote_array.flatten #.compact #check compacting endnote_array.each do |note| note_match=note.dup note_match_seg=note.dup e_n=note_match_seg[/(?:#{Mx[:en_a_o]}(?:\d|#{ast}|#{pls})+|#{Mx[:en_b_o]}(?:#{ast}|#{pls})\d+)\s+(.+?)(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/m,1] try=e_n.split(//) try.each do |e| txt_obj={ txt: e } format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) note_match=if e =~/#{Mx[:pa_o]}i[1-9]#{Mx[:pa_c]}/ format_seg.endnote_body_indent else format_seg.endnote_body end @per.seg_endnotes_array << note_match end try.join('
    ') #% creation of separate end segment/page of all endnotes referenced back to reference segment m=/(?:#{Mx[:en_a_o]}(?:\d|#{ast}|#{pls})+|#{Mx[:en_b_o]}(?:#{ast}|#{pls})\d+)\s+(.+?href=")(##{Mx[:note_ref]}(?:\d|_a|_b)+".+)(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/mi endnote_part_a=note_match_seg[m,1] endnote_part_b=note_match_seg[m,2] txt_obj={ endnote_part_a: endnote_part_a, endnote_part_b: endnote_part_b } format_seg=SiSU_XHTML_EPUB2_Format::FormatSeg.new(@md,txt_obj) note_match_all_seg=format_seg.endnote_seg_body(@per.fn) #BUG WATCH 200408 @per.endnote_all << note_match_all_seg end dob.obj=dob.obj.gsub(/(?:#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})\s*/m,' ') end end end end end end __END__ #+END_SRC ** xhtml_epub2_tune.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_epub2_tune.rb" <> require_relative 'dp' # dp.rb module SiSU_XHTML_EPUB2_Tune require_relative 'se' # se.rb include SiSU_Env; include SiSU_Screen require_relative 'xhtml_parts' # xhtml_parts.rb require_relative 'xhtml_epub2_format' # xhtml_epub2_format.rb #watch @@line_mode='' @@endnote_array=[] @@endnote_call_counter=1 @@table_align='
     \; ' @@table_align_close='    
    ' @@counter,@@column,@columns=0,0,0 class Output def initialize(data,md) @data,@md=data,md @file=SiSU_Env::InfoFile.new(@md.fns) @cX=SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set]).cX end def hard_output @filename_tune=@file.write_file_processing.html_tune data=[] @data.each {|x| x.obj.strip; data << x if not x.obj.empty?} #1.9 array? data.each do |dob| @filename_tune.puts dob, "\n" #check end end def marshal File.open(@file.marshal.xhtml_tune,'w') {|f| Marshal.dump(@data.to_a,f)} end end class CleanXHTML def initialize(html='') @html=html end def clean html=@html str=if html.is_a?(String) html else html.obj end str=str.gsub(/#{Mx[:gl_o]}(#[0-9]{3})#{Mx[:gl_c]}/u,'&\1;'). gsub(/#{Mx[:gl_o]}#([a-z]{2,4})#{Mx[:gl_c]}/u,'&\1;'). gsub(/
    /u,'
    '). gsub(/#{Mx[:nbsp]}/u,$ep[:hsp]) end end class Tune include SiSU_Parts_XHTML def initialize(data,md) @data,@md=data,md @sys=SiSU_Env::SystemCall.new @env=SiSU_Env::InfoEnv.new(@md.fns) end def songsheet begin @cX=SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set]).cX if (@md.opt.act[:verbose][:set]==:on \ || @md.opt.act[:verbose_plus][:set]==:on \ || @md.opt.act[:maintenance][:set]==:on) SiSU_Screen::Ansi.new( @md.opt.act[:color_state][:set], 'Tune' ).txt_grey end data=SiSU_XHTML_EPUB2_Tune::Tune.new(@data,@md).amp_angle_brackets data=SiSU_XHTML_EPUB2_Tune::Tune.new(data,@md).endnotes_html data=SiSU_XHTML_EPUB2_Tune::Tune.new(data,@md).url_markup data=SiSU_XHTML_EPUB2_Tune::Tune.new(data,@md).markup if @md.opt.act[:maintenance][:set]==:on #Hard Output Tune Optional on/off here data=SiSU_XHTML_EPUB2_Tune::Output.new(data,@md).hard_output SiSU_XHTML_EPUB2_Tune::Output.new(data,@md).marshal end SiSU_XHTML_EPUB2_Tune::Tune.new(@data,@md).output rescue SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do __LINE__.to_s + ':' + __FILE__ end ensure end end def markup @tuned_file=[] @data.each do |dob| dob.obj=dob.obj.gsub(/#{Mx[:mk_o]}#([a-zA-Z]+)#{Mx[:mk_c]}/,'&\1;'). gsub(/#{Mx[:mk_o]}(#[0-9]+)#{Mx[:mk_c]}/,'&\1;') dob.obj=dob.obj.gsub(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'
    ') unless dob.is==:table dob.obj=dob.obj.gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'\1'). gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'\1'). gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1'). gsub(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'\1'). gsub(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'\1'). gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1'). gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1'). gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1'). gsub(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'\1'). # tt, kbd gsub(/#{Mx[:mk_o]}:name#(\S+?)#{Mx[:mk_c]}/,''). gsub(/#{Mx[:gl_bullet]}/m,"●#{$ep[:hsp]*2}"). gsub(/#{Dx[:url_o]}/,Dx[:url_o_xml]).gsub(/#{Dx[:url_c]}/,Dx[:url_c_xml]). gsub(/#{Mx[:nbsp]}/,$ep[:hsp]). gsub(/<(p|br)>/,'<\1 />') dob.obj=SiSU_XHTML_EPUB2_Tune::CleanXHTML.new(dob.obj).clean @tuned_file << dob end end def urls(data) @words=[] map_nametags=SiSU_Particulars::CombinedSingleton.instance.get_map_nametags(@md).nametags_map #p map_nametags data.each do |word| @words << if word=~/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}|image)/ http_=true if word =~/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}#{Mx[:url_o]}\S+?#{Mx[:url_c]}/ m,u=/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/.match(word).captures elsif word =~/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}/ http_=false m,u=/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:rel_o]}(\S+?)#{Mx[:rel_c]}/.match(word).captures elsif word =~/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}image/ m,u=/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}(image)/.match(word).captures end case m when /\.png|\.jpg|\.gif|c=|\s\d+x\d+/ w,h=/\s(\d+)x(\d+)/.match(m).captures if m =~/\s\d+x\d+/ w=%{width="#{w}"} if w h=%{height="#{h}"} if h c=m[/"(.+?)"/m,1] caption=%{

    #{c}

    } if c png=m.scan(/\S+/)[0] image_path=@md.file.output_path.epub.rel_image #image_path=@env.url.images_epub ins=if u \ and u.strip !~/^image$/ %{
    #{caption}} else %{#{caption}} end word=word.gsub(/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/,ins) else link=m[/(.+)/m] png=m.scan(/\S+/)[0].strip link=link.strip u=u.sub(/^#*/,'') #make neater if map_nametags[u] \ and map_nametags[u][:segname] u=unless http_ u=if u=~/^\d+$/ u.gsub(/^(\d+)$/,"#{map_nametags[u][:segname]}#{Sfx[:xhtml]}#o\\1") if u !~/\// else u.gsub(/(\S+)/,"#{map_nametags[u][:segname]}#{Sfx[:xhtml]}#\\1") if u !~/\// end else u end elsif u =~/^:/ u=u.gsub(/^:/,"#{@env.url.root}/") elsif u =~/^\.\.\// u=u.gsub(/^\.\.\//,"#{@env.url.root}/") elsif u =~/https?:\/\// else p "NOT FOUND name_tags: #{u}" end ins=%{#{link}} word=word.gsub(/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}#{Mx[:url_o]}\S+?#{Mx[:url_c]}/,ins). gsub(/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}/,ins) end word else word end word end @words=@words.join(' ') end def url_markup data=@data @tuned_file=[] data.each do |dob| unless dob.is==:code if dob.obj =~/<::\s+/ #watch dob.obj=dob.obj.gsub(/<::\s+(\S+?)\s+!>/, %{\\1}) end if dob.obj =~/<:image\s+/ dob.obj=dob.obj.gsub(/<:image\s+(http\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+>/, %{}). gsub(/<:image\s+(http\S+)\s+(\S+)\s+>/, %{}). gsub(/<:image\s+(\S+)\s+(\S+)\s+(\S+)\s+>/, %{}). gsub(/<:image\s+(\S+)\s+>/, %{}) end if dob.obj =~/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}|image)/ @word_mode=dob.obj.scan(/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}|image)[()\[\]]*[,.;:!?'"]{0,2}|(?:#{Mx[:gl_o]}\S+?#{Mx[:gl_c]})+|[^#{Mx[:lnk_o]}#{Mx[:lnk_c]}]+/mu) words=urls(@word_mode) dob.obj=dob.obj.gsub(/.+/m,words) end dob.obj=dob.obj.gsub(/\\copyright/i,%{©}) dob.obj=if (dob.obj !~/\<:ad\s+\.\.\//) dob.obj.gsub(/\<:ad\s+(\S+)?\s+(\S+\.png)\s+(.+)?\;\s+(.+)?\;\s*!\>/, %{\n
    \\3
    \n}) else dob.obj.gsub(/\<:ad\s+(\S+)?\s+(\S+\.png)\s+(.+)?\;\s+(.+)?\;\s*\>/, %{\n
    \\3
    \n}) end dob.obj=dob.obj.gsub(/!pick/,%{stellar}). gsub(/!new/,%{#{$ep[:hsp]}new}). gsub(/<:h(.{1,7}?)>/,'\1'). gsub(/<:to(\d{1,7}?)>/,%{to#{$ep[:hsp]}\{#{$ep[:hsp]}\\1#{$ep[:hsp]}\} }). gsub(/#{Mx[:url_o]}_(\S+?)#{Mx[:url_c]}/,'\1'). #http ftp matches escaped, no decoration gsub(/#{Mx[:url_o]}([a-zA-Z0-9._-]+\@\S+?\.[a-zA-Z0-9._-]+)#{Mx[:url_c]}/,%{#{the_url_decoration.xml_open}\\1#{the_url_decoration.xml_close}}). gsub(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/,%{#{the_url_decoration.xml_open}\\1#{the_url_decoration.xml_close}}) #http ftp matches with decoration if dob.obj =~/..\/\S+/ \ and dob.obj !~/(\"..\/\S+?\"|>\s*..\/\S+<)/ dob.obj=dob.obj.gsub(/(\.\.\/\S+)/,'\1') end dob.obj=dob.obj.gsub(//m,'>') end @tuned_file << dob end end def amp_angle_brackets data,data_new=@data,[] data.each do |dob| dob.obj=dob.obj. gsub(/&/u,'&'). gsub(//u,'>') data_new << dob end data_new end def endnotes_html data=@data @tuned_file=[] a,s='_a','_s' ast,pls='*','+' data.each do |dob| unless dob.is ==:code dob.obj=dob.obj.gsub(/(#{Mx[:en_a_o]}|#{Mx[:en_b_o]})(\d+)\s+(.+?)(#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/, %{#{Mx[:nbsp]}#{Mx[:nbsp]}\\2#{Mx[:nbsp]} } + #note- endnote- %{\\1\\2 #{Mx[:nbsp]}\\2. \\3 \\4}). #endnote- note- (careful may have switched) gsub(/(#{Mx[:en_b_o]})[*](\d+)\s+(.+?)(#{Mx[:en_b_c]})/, %{#{Mx[:nbsp]}#{Mx[:nbsp]}#{ast}\\2#{Mx[:nbsp]} } + #note- endnote- %{\\1#{ast}\\2 #{Mx[:nbsp]}#{ast}\\2. \\3 \\4}). #endnote- note- (careful may have switched) gsub(/(#{Mx[:en_b_o]})[+](\d+)\s+(.+?)(#{Mx[:en_b_c]})/, %{#{Mx[:nbsp]}#{Mx[:nbsp]}#{pls}\\2#{Mx[:nbsp]} } + #note- endnote- %{\\1#{pls}\\2 #{Mx[:nbsp]}#{pls}\\2. \\3 \\4}) #endnote- note- (careful may have switched) # double-check there may here be a bug if dob.obj =~/#{Mx[:en_a_o]}([*+]+)\s+.+?#{Mx[:en_a_c]}/ m=$1.length.to_i dob.obj=dob.obj.gsub(/(#{Mx[:en_a_o]})[*]+\s+(.+?)(#{Mx[:en_a_c]})/, %{#{Mx[:nbsp]}#{Mx[:nbsp]}#{ast*m}#{Mx[:nbsp]} } + #note- endnote- %{\\1#{ast*m} #{Mx[:nbsp]}#{ast*m} \\2 \\3}). #endnote- note- (careful may have switched) gsub(/(#{Mx[:en_a_o]})([+]+)\s+(.+?)(#{Mx[:en_a_c]})/, %{#{Mx[:nbsp]}#{Mx[:nbsp]}#{pls*m}#{Mx[:nbsp]} } + #note- endnote- %{\\1#{pls*m} #{Mx[:nbsp]}#{pls*m} \\2 \\3}) #endnote- note- (careful may have switched) end end @tuned_file << dob end end def output data=@data @tuned_file=[] data.each do |dob| dob.obj=dob.obj.strip.chomp @tuned_file << dob end @tuned_file << "\n" if (@md.fns =~/\.sst0/) #remove @tuned_file end end end __END__ #+END_SRC * xhtml shared ** xhtml_parts.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_parts.rb" <> module SiSU_Parts_XHTML require_relative 'generic_parts' # generic_parts.rb include SiSU_Parts_Generic def the_line_break '
    ' end def the_table_close '
    ' end def the_url def home 'http://www.sisudoc.org/' # used in pdf header end def site #used as stub... where there are subdirectories and is different from home home end self end def the_url_decoration def xml_open #'<' Dx[:url_o] end def xml_close #'>' Dx[:url_c] end def txt_open '<' end def txt_close '>' end self end def the_margin def txt_0 %{
    } end def txt_1 %{
    } end def txt_2 %{
    } end def txt_3 %{
    } end def css '} else %{} end nc+=1 end trc=(trc.is_a?(Array)) ? trc.flatten.join : trc trc=" #{trc}\n" nr+=1 table_rows << trc end table_rows=table_rows.flatten.join table_obj.obj=%{
    ' end def num_css ' ' end self end def the_font def set_fonts 'verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman' #'verdana, arial, georgia, tahoma, sans-serif, helvetica, "times new roman", times, roman' end def set_small 'size="3"' end def set_tiny 'size="2"' end def paragraph_font_tiny %{} end def paragraph_font_small %{} end self end def the_nav def txt_concordance %{   A-Z  } end def txt_toc_link %{   toc  } end def txt_manifest #{png_manifest} document manifest %{ [ document manifest ] } end def txt_concordance %{   A-Z  } end self end end module SiSU_Proj_XHTML require_relative 'se' # se.rb include SiSU_Env class Bits include SiSU_Parts_HTML def initialize @v=SiSU_Env::InfoVersion.instance.get_version end def credits_sisu_epub %{

    EPUB generated by #{@v.project} v#{@v.version}, GPL3

    } '' end end end __END__ #+END_SRC ** xhtml_shared.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_shared.rb" <> module SiSU_XHTML_Shared require_relative 'xhtml_table' # xhtml_table.rb class TableXHTML < SiSU_XHTML_Table::TableXHTML end end __END__ #+END_SRC ** xhtml_table.rb #+BEGIN_SRC ruby :tangle "../lib/sisu/xhtml_table.rb" <> module SiSU_XHTML_Table require_relative 'xhtml_parts' # xhtml_parts.rb class TableXHTML include SiSU_Parts_XHTML @@tablefoot=[] #watch def initialize(table) @table_obj=table end def table table_obj=@table_obj if table_obj.obj !~/^/,the_line_break) trc <<= if table_obj.head_ and nr==0; %{
    #{c}#{c}
    \n#{table_rows}
    } table_obj end end end __END__ #+END_SRC * document header #+NAME: sisu_document_header #+BEGIN_SRC text #encoding: utf-8 =begin - Name: SiSU - Description: documents, structuring, processing, publishing, search xhtml - Author: Ralph Amissah - Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019, 2020, 2021, 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 - Homepages: - Git =end #+END_SRC