# coding: utf-8 =begin * Name: SiSU * Description: a framework for document structuring, publishing and search * Author: Ralph Amissah * Copyright: (C) 1997 - 2011, Ralph Amissah, All Rights Reserved. * License: GPL 3 or later: SiSU, a framework for document structuring, publishing and search Copyright (C) Ralph Amissah This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . If you have Internet connection, the latest version of the GPL should be available at these locations: * SiSU uses: * Standard SiSU markup syntax, * Standard SiSU meta-markup syntax, and the * Standard SiSU object citation numbering and system * Hompages: * Download: * Ralph Amissah ** Description: epub generation, epub pre-processing =end require "#{SiSU_lib}/param" module SiSU_EPUB_Tune require "#{SiSU_lib}/sysenv" # sysenv.rb include SiSU_Env; include SiSU_Screen require "#{SiSU_lib}/epub_format" # epub_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 @cX=SiSU_Screen::Ansi.new(@md.cmd).cX end def hard_output my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns) @filename_tune=my_make.file_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 my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns) @marshal_tune=my_make.marshal_tune File.open(@marshal_tune,'w') {|f| Marshal.dump(@data.to_a,f)} end end class Clean_xhtml def initialize(html='') @html=html end def clean html=@html str=if html.class==String html else html.obj end str.gsub!(/#{Mx[:gl_o]}(#[0-9]{3})#{Mx[:gl_c]}/u,'&\1;') str.gsub!(/#{Mx[:gl_o]}#([a-z]{2,4})#{Mx[:gl_c]}/u,'&\1;') str.gsub!(/\*/u,'*') # * str.gsub!(/\+/u,'+') # + str.gsub!(/¢/u,'¢') # ¢ str.gsub!(/£/u,'£') # £ str.gsub!(/¥/u,'¥') # ¥ str.gsub!(/§/u,'§') # § str.gsub!(/©/u,'©') # © str.gsub!(/ª/u,'ª') # ª str.gsub!(/«/u,'«') # « str.gsub!(/®/u,'®') # ® str.gsub!(/°/u,'°') # ° str.gsub!(/±/u,'±') # ± str.gsub!(/²/u,'²') # ² str.gsub!(/³/u,'³') # ³ str.gsub!(/µ/u,'µ') # µ str.gsub!(/¶/u,'¶') # ¶ str.gsub!(/¹/u,'¹') # ¹ str.gsub!(/º/u,'º') # º str.gsub!(/»/u,'»') # » str.gsub!(/¼/u,'¼') # ¼ str.gsub!(/½/u,'½') # ½ str.gsub!(/¾/u,'¾') # ¾ str.gsub!(/×/u,'×') # × str.gsub!(/÷/u,'÷') # ÷ str.gsub!(/¿/u,'¿') # ¿ str.gsub!(/À/u,'À') # À str.gsub!(/Á/u,'Á') # Á str.gsub!(/Â/u,'Â') # Â str.gsub!(/Ã/u,'Ã') # Ã str.gsub!(/Ä/u,'Ä') # Ä str.gsub!(/Å/u,'Å') # Å str.gsub!(/Æ/u,'Æ') # Æ str.gsub!(/Ç/u,'Ç') # Ç str.gsub!(/È/u,'È') # È str.gsub!(/É/u,'É') # É str.gsub!(/Ê/u,'Ê') # Ê str.gsub!(/Ë/u,'Ë') # Ë str.gsub!(/Ì/u,'Ì') # Ì str.gsub!(/Í/u,'Í') # Í str.gsub!(/Î/u,'Î') # Î str.gsub!(/Ï/u,'Ï') # Ï str.gsub!(/Ð/u,'Ð') # Ð str.gsub!(/Ñ/u,'Ñ') # Ñ str.gsub!(/Ò/u,'Ò') # Ò str.gsub!(/Ó/u,'Ó') # Ó str.gsub!(/Ô/u,'Ô') # Ô str.gsub!(/Õ/u,'Õ') # Õ str.gsub!(/Ö/u,'Ö') # Ö str.gsub!(/Ø/u,'Ø') # Ø str.gsub!(/Ù/u,'Ù') # Ù str.gsub!(/Ú/u,'Ú') # Ú str.gsub!(/Û/u,'Û') # Û str.gsub!(/Ü/u,'Ü') # Ü str.gsub!(/Ý/u,'Ý') # Ý str.gsub!(/Þ/u,'Þ') # Þ str.gsub!(/ß/u,'ß') # ß str.gsub!(/à/u,'à') # à str.gsub!(/á/u,'á') # á str.gsub!(/â/u,'â') # â str.gsub!(/ã/u,'ã') # ã str.gsub!(/ä/u,'ä') # ä str.gsub!(/å/u,'å') # å str.gsub!(/æ/u,'æ') # æ str.gsub!(/ç/u,'ç') # ç str.gsub!(/è/u,'è') # è str.gsub!(/é/u,'é') # é str.gsub!(/ê/u,'ê') # ê str.gsub!(/ë/u,'ë') # ë str.gsub!(/ì/u,'ì') # ì str.gsub!(/í/u,'í') # í str.gsub!(/î/u,'î') # î str.gsub!(/ï/u,'ï') # ï str.gsub!(/ð/u,'ð') # ð str.gsub!(/ñ/u,'ñ') # ñ str.gsub!(/ò/u,'ò') # ò str.gsub!(/ó/u,'ó') # ó str.gsub!(/ô/u,'ô') # ô str.gsub!(/õ/u,'õ') # õ str.gsub!(/ö/u,'ö') # ö str.gsub!(/ø/u,'ø') # ø str.gsub!(/ù/u,'ù') # ú str.gsub!(/ú/u,'ú') # û str.gsub!(/û/u,'û') # ü str.gsub!(/ü/u,'ü') # ý str.gsub!(/þ/u,'þ') # þ str.gsub!(/ÿ/u,'ÿ') # ÿ str.gsub!(/ý/u,'ý') str.gsub!(/
/u,'
') str.gsub(/#{Mx[:nbsp]}/u,' ') str end end class Tune def initialize(data,md) @data,@md=data,md @vz=SiSU_Env::Get_init.instance.skin @env=SiSU_Env::Info_env.new(@md.fns) @sys=SiSU_Env::System_call.new @env=SiSU_Env::Info_env.new(@md.fns) @brace_url=SiSU_Viz::Skin.new.url_decoration end def songsheet begin @cX=SiSU_Screen::Ansi.new(@md.cmd).cX SiSU_Screen::Ansi.new(@md.cmd,'Tune').txt_grey if @md.cmd =~/[MVv]/ data=Tune.new(@data,@md).amp_html data=Tune.new(data,@md).endnotes_html data=Tune.new(data,@md).url_markup data=Tune.new(data,@md).markup if @md.cmd =~/M/ #Hard Output Tune Optional on/off here data=Output.new(data,@md).hard_output Output.new(data,@md).marshal end tuned=Tune.new(@data,@md).output rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error ensure end end def para_numbers data=@data @tuned_file=[] data.each do |dob| dob.gsub!(/#{Mx[:lv_o]}\d:(\S?)#{Mx[:lv_c]}/,'\0#\1. ') #fix Mx[:lv_o] @tuned_file << dob end end def markup @tuned_file=[] @data.each do |dob| dob.obj.gsub!(/#{Mx[:mk_o]}#([a-zA-Z]+)#{Mx[:mk_c]}/,'&\1;') dob.obj.gsub!(/#{Mx[:mk_o]}(#[0-9]+)#{Mx[:mk_c]}/,'&\1;') dob.obj.gsub!(/#{Mx[:br_line]}|#{Mx[:br_nl]}/,'
') unless dob.is=='table' dob.obj.gsub!(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1') dob.obj.gsub!(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'\1') # tt, kbd dob.obj.gsub!(/#{Mx[:mk_o]}:name#(\S+?)#{Mx[:mk_c]}/,'') dob.obj.gsub!(/^#{Mx[:gl_bullet]}/m,'●  ') dob.obj.gsub!(/#{Mx[:nbsp]}/,' ') dob.obj.gsub!(/<(p|br)>/,'<\1 />') dob=SiSU_EPUB_Tune::Clean_xhtml.new(dob).clean @tuned_file << dob end end def urls(data) @words=[] map_nametags=SiSU_Particulars::Combined_singleton.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='./image' ins=if u \ and u.strip !~/^image$/ %{#{caption}} else %{#{caption}} end 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.sub!(/^#*/,'') #make neater if map_nametags[u] \ and map_nametags[u][:segname] if u=~/^\d+$/ u.gsub!(/^(\d+)$/,"#{map_nametags[u][:segname]}#{Sfx[:xhtml]}#o\\1") if u !~/\// unless http_ else u.gsub!(/(\S+)/,"#{map_nametags[u][:segname]}#{Sfx[:xhtml]}#\\1") if u !~/\// unless http_ end elsif u =~/^:/ u.gsub!(/^:/,"#{@env.url.root}/") elsif u =~/^\.\.\// u.gsub!(/^\.\.\//,"#{@env.url.root}/") elsif u =~/https?:\/\// else p "NOT FOUND name_tags: #{u}" end ins=%{#{link}} word.gsub!(/#{Mx[:lnk_o]}.+?#{Mx[:lnk_c]}#{Mx[:url_o]}\S+?#{Mx[:url_c]}/,ins) word.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.gsub!(/<::\s+(\S+?)\s+!>/, %{\\1}) end if dob.obj =~/<:image\s+/ dob.obj.gsub!(/<:image\s+(http\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+>/, %{}) dob.obj.gsub!(/<:image\s+(http\S+)\s+(\S+)\s+>/, %{}) dob.obj.gsub!(/<:image\s+(\S+)\s+(\S+)\s+(\S+)\s+>/, %{}) dob.obj.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.gsub!(/.+/m,words) end dob.obj.gsub!(/\\copyright/i,%{©}) 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.gsub!(/!pick/,%{stellar}) dob.obj.gsub!(/!new/,%{ new}) dob.obj.gsub!(/<:h(.{1,7}?)>/,'\1') dob.obj.gsub!(/<:to(\d{1,7}?)>/,'to { \1 } ') dob.obj.gsub!(/#{Mx[:url_o]}_(\S+?)#{Mx[:url_c]}/,'\1') #http ftp matches escaped, no decoration dob.obj.gsub!(/#{Mx[:url_o]}([a-zA-Z0-9._-]+\@\S+?\.[a-zA-Z0-9._-]+)#{Mx[:url_c]}/,%{#{@brace_url.xml_open}\\1#{@brace_url.xml_close}}) dob.obj.gsub!(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/,%{#{@brace_url.xml_open}\\1#{@brace_url.xml_close}}) #http ftp matches with decoration if dob.obj =~/..\/\S+/ \ and dob.obj !~/(\"..\/\S+?\"|>\s*..\/\S+<)/ dob.obj.gsub!(/(\.\.\/\S+)/,'\1') end dob.obj.gsub!(//m,'\1>') #code-block: angle brackets special characters dob.obj.gsub!(/(^|[^}])_/m,'\1>') end @tuned_file << dob end end def amp_html data=@data data.each do |dob| dob.obj.gsub!(/&/u,'&') end data end def endnotes_html data=@data @tuned_file=[] a,s='_a','_s' ast,pls='*','+' data.each do |dob| unless dob.is =~/^code/ 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) dob.obj.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) dob.obj.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.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) dob.obj.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.strip! dob.obj.chomp! @tuned_file << dob end @tuned_file << "\n" if (@md.fns =~/\.sst0/) #remove @tuned_file end end end __END__