From 90051a7ea55acb043434b1c2483b878d602246ba Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Fri, 2 Apr 2021 19:37:00 -0400 Subject: org mode (ruby code within) --- org/xhtml.org | 5080 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5080 insertions(+) create mode 100644 org/xhtml.org (limited to 'org/xhtml.org') diff --git a/org/xhtml.org b/org/xhtml.org new file mode 100644 index 00000000..3fc576e9 --- /dev/null +++ b/org/xhtml.org @@ -0,0 +1,5080 @@ +-*- 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 + +* 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} + + +
+
+ #{dob.ocn} +

+ #{txt} +

+
+
+ + } +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 +- 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_SRC -- cgit v1.2.3