From 58c13f49d81e3a6448a0f4dabf44b3bfb52ea84c Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Mon, 1 Oct 2012 15:27:56 -0400 Subject: v3: odf, internal links/bookmarks, toc, book index --- lib/sisu/v3/odf.rb | 170 +++++++++++++++++++++++++++++------------------------ 1 file changed, 93 insertions(+), 77 deletions(-) (limited to 'lib/sisu/v3/odf.rb') diff --git a/lib/sisu/v3/odf.rb b/lib/sisu/v3/odf.rb index 4985b3dd..2830b24d 100644 --- a/lib/sisu/v3/odf.rb +++ b/lib/sisu/v3/odf.rb @@ -101,7 +101,7 @@ module SiSU_ODF require_relative 'defaults' # defaults.rb require_relative 'shared_txt' # shared_txt.rb @@img_count=0 - @@odf={ body: [], open: [], close: [], head: [], metadata: [], tail: [], endnotes: [] } + @@odf={ body: [], head: [], toc: [], metadata: [], tail: [], book_idx: [], endnotes: [] } @@docstart=true @@fns=nil def initialize(particulars) @@ -144,6 +144,19 @@ module SiSU_ODF end end end + def odf_book_idx + if @md.book_idx + idx_arr,idx_raw=[],SiSU_Particulars::CombinedSingleton.instance.get_idx_raw(@md.opt).raw_idx + idx_raw.each do |x| + x=if x.is_a?(String) + SiSU_ODF_Format::FormatBookIndex.new(x).book_idx_bookmark + else nil + end + idx_arr << x.strip if x.is_a?(String) + end + @@odf[:book_idx]=idx_arr.join + end + end def odf_metadata @@odf[:metadata]=SiSU_Metadata::Summary.new(@md).odf.metadata end @@ -162,8 +175,10 @@ module SiSU_ODF @@odf[:tail] << %{\nSiSU: <www.jus.uio.no/sisu> and <www.sisudoc.org>} @@odf[:tail] << "\n" end - def heading(dob,p_num='') - dob.obj=dob.obj.gsub(/#{Mx[:tag_o]}\S+?#{Mx[:tag_c]}/,'') #check + def set_bookmark_tag(dob) + tags=SiSU_ODF_Format::Tags.new.set_bookmark_tag(dob) + end + def heading(dob,p_num) m=/#{$1}/ breakpage='' if @md.fns \ @@ -180,7 +195,19 @@ module SiSU_ODF end end @@docstart=false - dob.obj=%{#{breakpage}#{dob.obj}#{p_num}} + dob.tmp=dob.obj + dob.obj=%{#{breakpage}#{p_num[:set_ref]}#{set_bookmark_tag(dob)}#{dob.obj}#{p_num[:display]}} + dob + end + def toc(dob,p_num) + m=/#{$1}/ + hardspace=(dob.lv =~/[A-C]/i) \ + ? '' + : '' + toc_heading=dob.ocn \ + ? %{#{dob.tmp}} + : dob.tmp + dob.obj=%{#{toc_heading}#{hardspace}} dob end def image_src(i) @@ -282,6 +309,10 @@ module SiSU_ODF end t end + def text_link_odf_bookmark(txt,url,trail) + map_nametags=SiSU_Particulars::CombinedSingleton.instance.get_map_nametags(@md).nametags_map + %{#{txt.strip}#{trail}} + end def text_link(dob) m=dob.obj.scan(/(#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]})/) #sort if m @@ -305,6 +336,19 @@ module SiSU_ODF txt=txt.gsub(/([)(\]\[])/,"\\\\\\1"). gsub(/([+?*])/,"\\\\\\1") # problems with + url=url.gsub(/([+?])/,"\\\\\\1") # problems with + + dob.obj=dob.obj.gsub(/#{Mx[:lnk_o]}[ ]*#{txt}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{url}#{Mx[:rel_c]}/m,text_link_odf_bookmark(txt,url,trail)). #make sure trailing ']' are not caught in url + gsub(/\\([)(\]\[?])/,'\1') #clumsy fix + end + m=nil + end + dob + end + def text_link_relative_(dob) + m=dob.obj.scan(/(#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:rel_o]}(\S+?)#{Mx[:rel_c]})/) #sort + if m + m.each do |i| + txt,url,trail=i[1],i[2] + txt=txt.gsub(/([)(\]\[])/,"\\\\\\1") dob.obj=dob.obj.gsub(/#{Mx[:lnk_o]}[ ]*#{txt}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{url}#{Mx[:rel_c]}/m,text_link_odf(txt,url,trail)). #make sure trailing ']' are not caught in url gsub(/\\([)(\]\[?])/,'\1') #clumsy fix end @@ -312,7 +356,7 @@ module SiSU_ODF end dob end - def normal(dob,p_num='') #P1 - P3 + def normal(dob,p_num) #P1 - P3 dob.obj=dob.obj.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]}/, @@ -322,12 +366,12 @@ module SiSU_ODF dob.obj= if dob.is==:para \ and dob.indent.to_s =~/[0-9]/ \ and dob.indent == dob.hang - %{#{dob.obj}#{p_num}} + %{#{p_num[:set_ref]}#{set_bookmark_tag(dob)}#{dob.obj}#{p_num[:display]}} elsif dob.is==:para \ and dob.hang.to_s =~/[0-9]/ \ and dob.indent != dob.hang - %{#{dob.obj}#{p_num}} - else %{#{dob.obj}#{p_num}} + %{#{p_num[:set_ref]}#{set_bookmark_tag(dob)}#{dob.obj}#{p_num[:display]}} + else %{#{p_num[:set_ref]}#{set_bookmark_tag(dob)}#{dob.obj}#{p_num[:display]}} end dob end @@ -390,12 +434,13 @@ module SiSU_ODF end def poem(dob,p_num) #P4 #same as group parray=[] - dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each do |parablock| + dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each_with_index do |parablock,i| + set_ref=(i==0) ? "#{p_num[:set_ref]}#{set_bookmark_tag(dob)}" : '' parablock=group_clean(parablock) - parray << %{#{parablock}} if parablock =~/\S+/ + parray << %{#{set_ref}#{parablock}} if parablock =~/\S+/ end dob.obj=parray.join \ - + %{#{p_num}} \ + + %{#{p_num[:display]}} \ + '' dob end @@ -407,7 +452,8 @@ module SiSU_ODF %{#{@brace_url.xml_open}\\1#{@brace_url.xml_close}}). gsub(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, %{#{@brace_url.xml_open}\\1#{@brace_url.xml_close}}) #http ftp matches with decoration - dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each do |parablock| + dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each_with_index do |parablock,i| + set_ref=(i==0) ? "#{p_num[:set_ref]}#{set_bookmark_tag(dob)}" : '' parablock=group_clean(parablock) parablock=parablock.gsub(/<text:a xlink:type="simple" xlink:href="(.+?)">/m,''). gsub(/<(\/text:a)>/,'<\1>'). @@ -415,10 +461,10 @@ module SiSU_ODF gsub(/<(text:p text:style-name="Footnote")>/,'<\1>'). gsub(/<(\/?text:(?:note-citation|note-body|note|p))>/,'<\1>') parablock=footnote(parablock) - parray << %{#{parablock}} if parablock =~/\S+/ + parray << %{#{set_ref}#{parablock}} if parablock =~/\S+/ end dob.obj=parray.join \ - + %{#{p_num}} \ + + %{#{p_num[:display]}} \ + '' dob end @@ -430,7 +476,8 @@ module SiSU_ODF %{#{@brace_url.xml_open}\\1#{@brace_url.xml_close}}). gsub(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/, %{#{@brace_url.xml_open}\\1#{@brace_url.xml_close}}) #http ftp matches with decoration - dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each do |parablock| + dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each_with_index do |parablock,i| + set_ref=(i==0) ? "#{p_num[:set_ref]}#{set_bookmark_tag(dob)}" : '' parablock=group_clean(parablock) parablock=parablock.gsub(/<text:a xlink:type="simple" xlink:href="(.+?)">/m,''). gsub(/<(\/text:a)>/,'<\1>'). @@ -438,10 +485,10 @@ module SiSU_ODF gsub(/<(text:p text:style-name="Footnote")>/,'<\1>'). gsub(/<(\/?text:(?:note-citation|note-body|note|p))>/,'<\1>') parablock=footnote(parablock) - parray << %{#{parablock}} if parablock =~/\S+/ + parray << %{#{set_ref}#{parablock}} if parablock =~/\S+/ end dob.obj=parray.join \ - + %{#{p_num}} \ + + %{#{p_num[:display]}} \ + '' dob end @@ -449,15 +496,16 @@ module SiSU_ODF if dob.is==:code dob.obj=dob.obj.gsub(/\s\s/,'  ') parray=[] - dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each do |parablock| + dob.obj.split(/#{Mx[:br_line]}|#{Mx[:br_nl]}/).each_with_index do |parablock,i| + set_ref=(i==0) ? "#{p_num[:set_ref]}#{set_bookmark_tag(dob)}" : '' parablock=group_clean(parablock) parablock=parablock.gsub(/^\s*$/,'
'). gsub(/#{Mx[:url_o]}_(\S+?)#{Mx[:url_c]}/, '\1') #http ftp matches escaped, no decoration - parray << %{#{parablock}} if parablock =~/\S+/ + parray << %{#{set_ref}#{parablock}} if parablock =~/\S+/ end dob.obj=parray.join \ - + %{#{p_num}} \ + + %{#{p_num[:display]}} \ + '' end dob @@ -490,18 +538,22 @@ module SiSU_ODF dob else dob end - p_num='' - if @env.odt_ocn? - if dob.is !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/ - if defined? dob.ocn \ - and not dob.ocn.nil? - p_num=SiSU_ODF_Format::ParagraphNumber.new(dob.ocn).display - end + p_num={ display: '', set_ref: '' } + if dob.is !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/ + if defined? dob.ocn \ + and dob.ocn.is_a?(Fixnum) + p_num=SiSU_ODF_Format::ParagraphNumber.new(dob.ocn).set_bookmark_and_display + #p_num=SiSU_ODF_Format::ParagraphNumber.new(dob.ocn).set_ref_and_display end end dob=footnote(dob) if dob.is==:heading @@odf[:body] << heading(dob,p_num).obj << @br*2 + if SiSU_Env::ProcessingSettings.new(md).build.toc? + if dob.lv =~/[A-C1]/i + @@odf[:toc] << toc(dob,p_num).obj + end + end elsif dob.is ==:verse @@odf[:body] << poem(dob,p_num).obj << @br*2 elsif dob.is==:group @@ -539,6 +591,7 @@ module SiSU_ODF else STDERR.puts %{\t*WARN* did not find image - "#{bullet}/bullet_09.png" [#{__FILE__}:#{__LINE__}]} end end + odf_book_idx odf_metadata data.each do |dob| #p dob.obj if dob.obj =~safe_characters and @md.opt.cmd =~/V/ #KEEP @@ -573,7 +626,7 @@ module SiSU_ODF dob.obj=dob.obj.gsub(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1'). gsub(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1'). gsub(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1'). - gsub(/#{Mx[:tag_o]}\S+?#{Mx[:tag_c]}/,''). #check + gsub(/#{Mx[:tag_o]}\S+?#{Mx[:tag_c]}/,''). #check gsub(/#{Mx[:mk_o]}#([a-zA-Z]+)#{Mx[:mk_c]}/,'&\1;'). gsub(/#{Mx[:mk_o]}(#[0-9]+)#{Mx[:mk_c]}/,'&\1;'). gsub(/#{Mx[:mk_o]}[~-]##{Mx[:mk_c]}/,'') @@ -693,14 +746,19 @@ WOK def publish divider='=' content=[] + br_pg=' ' data=@data - content << @@odf[:open] - content << @@odf[:head] - content << @@odf[:body] - content << @@odf[:metadata] - content << @@odf[:tail] + content << + @@odf[:head] << + @@odf[:toc] << + br_pg << + @@odf[:body] << + @@odf[:book_idx] << + br_pg << + @@odf[:metadata] << + @@odf[:tail] SiSU_ODF::Source::Output.new(content,@md,@env).odf - @@odf[:head],@@odf[:body],@@odf[:tail],@@odf[:metadata]=[],[],[],[] + @@odf={ head: [], toc: [], body: [], tail: [], book_idx: [], metadata: [] } end end class Output ● #bullet -dob.obj.gsub!(/^(#{Mx[:pa_o]}:i[1-9]#{Mx[:pa_c]})\s*#{Mx[:gl_bullet]}/,'\1 · ') #bullet -dob.obj.gsub!(/^#{Mx[:gl_bullet]}/,'· ') #bullet -- cgit v1.2.3