# encoding: utf-8 =begin * Name: SiSU * Description: a framework for document structuring, publishing and search * Author: Ralph Amissah * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 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: * Git * Ralph Amissah ** Description: system environment, resource control and configuration details =end module SiSU_DAL_BookIndex class BookIndex def initialize(md,data,env=nil) @md,@data,@env=md,data,env @rgx_idx=/#{Mx[:idx_o]}(?:.+?)#{Mx[:idx_c]}\s*/ @rgx_idx_ocn_seg=/(.+?)~(\d+)~(\S+)/ @rgx_idx_ocn=/(.+?)~(\d+)/ @env ||=SiSU_Env::InfoEnv.new(@md.fns) end def indexing_song data=@data data,sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx=extract_book_index(data) data=clean_and_insert_index(data,sisu_markup_idx_rel_html_seg) [data,sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx] end def extract_book_index(data) tuned_file=[] idx_array=[] data.each do |dob| if (dob.is ==:heading \ || dob.is ==:heading_insert) \ && dob.ln==4 @seg=dob.name end if defined? dob.idx \ and dob.idx.is_a?(String) \ and not dob.idx.empty? idx_array << "#{dob.idx}~#{dob.ocn}~#{@seg}" end tuned_file << dob if dob end idx_array=construct_idx_array(idx_array) if idx_array.length > 0 if idx_array.length > 0 the_idx=construct_book_index(idx_array) sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx=nil,nil,nil,nil if @md.book_idx idx=index(the_idx) sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx=idx[:sst_rel],idx[:sst_rel_html_seg],idx[:html],idx[:xhtml] end end [tuned_file,sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx] end def construct_idx_array(idx_array) idx_lst=[] idx_array.each do |idx| idx_list,ocn,seg=@rgx_idx_ocn_seg.match(idx)[1..3] idx_lst <<=if idx_list =~/;/ g=idx_list.scan(/[^;]+/) idxl=[] g.each do |i| i=i.strip idxl << { rough_idx: i, ocn: ocn, seg: seg } end idxl else { rough_idx: idx_list, ocn: ocn, seg: seg } end end idx_lst=idx_lst.flatten end def construct_book_index(idx_array) the_idx={} idx_array.each do |idx| if idx[:rough_idx] =~/[|]/ \ && idx[:rough_idx] !~/[:]/ if @md.opt.cmd =~/[MVv]/ p 'book index error? --> ' + idx[:rough_idx] end else idx_lst=idx[:rough_idx].scan(/[^|:]+/) idx_lst[0]=idx_lst[0].strip if idx_lst[0] =~/.+?\+\d+/ use,plus=/(.+?)\+(\d+)/.match(idx_lst[0])[1,2] else use=idx_lst[0] end use=use[0].chr.capitalize + use[1,use.length] the_idx[use]={} unless the_idx[use] and defined? the_idx[use] idx_lst.each do |i| i=i.strip i,r=/(.+?)\+(\d+)/.match(i)[1,2] if i =~/.+?\+\d+/ x=if idx_lst.length==1 or idx_lst[0].gsub(/\+\d+/,'')==i the_idx[use]['term_node_lev1']=[] unless the_idx[use]['term_node_lev1'] and defined? the_idx[use]['term_node_lev1'] x=if r the_idx[use]['term_node_lev1'] << { ocn: idx[:ocn], range: "#{idx[:ocn]}-#{idx[:ocn].to_i+r.to_i}", seg: idx[:seg] } "#{i} #{idx[:ocn]}-#{idx[:ocn].to_i+r.to_i}" else the_idx[use]['term_node_lev1'] << { ocn: idx[:ocn], seg: idx[:seg] } "#{i} #{idx[:ocn]}" end else the_idx[use]['term_node_lev2']={} unless the_idx[use]['term_node_lev2'] and defined? the_idx[use]['term_node_lev2'] the_idx[use]['term_node_lev2'][i]=[] unless the_idx[use]['term_node_lev2'][i] and defined? the_idx[use]['term_node_lev2'][i] x=if r the_idx[use]['term_node_lev2'][i] << { ocn: idx[:ocn], range: "#{idx[:ocn]}-#{idx[:ocn].to_i+r.to_i}", seg: idx[:seg] } "#{idx_lst[0]}:#{i} #{idx[:ocn]}-#{idx[:ocn].to_i+r.to_i}" else the_idx[use]['term_node_lev2'][i] << { ocn: idx[:ocn], seg: idx[:seg] } "#{idx_lst[0]}:#{i} #{idx[:ocn]}" end end end end end the_idx=the_idx.sort the_idx end def clean_xml(str) str=str.gsub(/&/,'&') str end def index(the_idx) @x=1 idx={} idx[:sst_rel_html_seg],idx[:sst_rel],idx[:html],idx[:xhtml]=[],[],[],[] h={obj: Mx[:br_page]} o=SiSU_DAL_DocumentStructure::ObjectLayout.new.break(h) idx[:sst_rel_html_seg] << o idx[:sst_rel] << o h={lv: '2', name: 'index', obj: "Index"} o=SiSU_DAL_DocumentStructure::ObjectHeading.new.heading(h) idx[:sst_rel_html_seg] << o idx[:sst_rel] << o h={lv: '4', name: 'idx', obj: " [Index] #{Mx[:pa_non_object_dummy_heading]}"} o=SiSU_DAL_DocumentStructure::ObjectHeading.new.heading(h) idx[:sst_rel_html_seg] << o idx[:sst_rel] << o alph=%W[9 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] idx[:html] << '

' idx[:xhtml] << '

' alph.each do |x| if x =~/[0-9]/ idx[:html] << '' idx[:xhtml] << '' else idx[:html] << %{#{x},#{$ep[:hsp]}} idx[:xhtml] << %{#{x},#{$ep[:hsp]}} end end idx[:html] << '

' idx[:xhtml] << '

' letter=alph.shift idx[:html] << %{\n

} idx[:xhtml] << %{\n

0 - 9

} the_idx.each do |i| i.each do |x| if x.is_a?(String) f=/^(\S)/.match(x)[1] if letter < f while letter < f if alph.length > 0 letter=alph.shift idx[:html] << %{\n

#{letter}

} idx[:xhtml] << %{\n

#{letter}

} else break end end end idx[:sst_rel_html_seg] << %{\n\n#{Mx[:fa_bold_o]}#{x},#{Mx[:fa_bold_c]} } idx[:sst_rel] << %{\n\n#{Mx[:fa_bold_o]}#{x},#{Mx[:fa_bold_c]} } aname=x.gsub(/\s+/,'_') idx[:html] << %{\n

#{x}, } c=clean_xml(x.dup) idx[:xhtml] << %{\n

#{c}, } @o=idx[:sst_rel_html_seg].index(idx[:sst_rel_html_seg].last) @t=idx[:sst_rel].index(idx[:sst_rel].last) @q=idx[:html].index(idx[:html].last) @r=idx[:xhtml].index(idx[:xhtml].last) print "\n" + x + ', ' if @md.opt.cmd =~/V/ elsif x.is_a?(Array) p 'array error? -->' print x elsif x.is_a?(Hash) if x['term_node_lev1'].is_a?(Array) x['term_node_lev1'].each do |a| if a[:range] idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{a[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}/#{a[:seg]}.html##{a[:ocn]}#{Mx[:rel_c]}, } idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{a[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{a[:ocn]}#{Mx[:rel_c]}, } idx[:html][@q]=idx[:html][@q] + %{#{a[:range]}, } idx[:xhtml][@q]=idx[:xhtml][@q] + %{#{a[:range]}, } print a[:range] + ', ' if @md.opt.cmd =~/V/ elsif a[:ocn] idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{a[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{a[:seg]}.html##{a[:ocn]}#{Mx[:rel_c]}, } idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{a[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{a[:ocn]}#{Mx[:rel_c]}, } idx[:html][@q]=idx[:html][@q] + %{#{a[:ocn]}, } idx[:xhtml][@q]=idx[:xhtml][@q] + %{#{a[:ocn]}, } print a[:ocn] + ', ' if @md.opt.cmd =~/V/ else p 'error' end end idx[:html][@q]=idx[:html][@q] + '

' idx[:xhtml][@r]=idx[:xhtml][@r] + '

' end if x['term_node_lev2'] m=x['term_node_lev2'] m=m.sort m.each do |k,y| if k !~/term_node_lev1/ idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{k}, } idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{k}, } idx[:html][@q]=idx[:html][@q] + %{\n

#{k}, } c=clean_xml(k.dup) idx[:xhtml][@r]=idx[:xhtml][@r] + %{\n

#{c}, } print "\n\t" + k + ', ' if @md.opt.cmd =~/V/ y.each do |z| if z[:range] idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{z[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:seg]}.html##{z[:ocn]}#{Mx[:rel_c]}, } idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{z[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:ocn]}#{Mx[:rel_c]}, } idx[:html][@q]=idx[:html][@q] + %{#{z[:range]}, } idx[:xhtml][@q]=idx[:xhtml][@q] + %{#{z[:range]}, } print z[:range] + ', ' if @md.opt.cmd =~/V/ elsif z[:ocn] idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{z[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:seg]}.html##{z[:ocn]}#{Mx[:rel_c]}, } idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{z[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:ocn]}#{Mx[:rel_c]}, } idx[:html][@q]=idx[:html][@q] + %{#{z[:ocn]}, } idx[:xhtml][@q]=idx[:xhtml][@q] + %{#{z[:ocn]}, } print z[:ocn] + ', ' if @md.opt.cmd =~/V/ else p 'error' end end idx[:html][@q]=idx[:html][@q] + '

' idx[:xhtml][@r]=idx[:xhtml][@r] + '

' end end end idx @x +=1 end end end print "\n" if @md.opt.cmd =~/V/ idx end def screen_print(the_idx) the_idx.each do |i| i.each do |x| if x.is_a?(String) print "\n" + x + ', ' elsif x.is_a?(Array) p 'array error? -->' print x elsif x.is_a?(Hash) if x['term_node_lev1'].is_a?(Array) x['term_node_lev1'].each do |a| if a[:range] print a[:range] + ', ' elsif a[:ocn] print a[:ocn] + ', ' else p 'error' end end end if x['term_node_lev2'] m=x['term_node_lev2'] m=m.sort m.each do |k,y| if k !~/term_node_lev1/ print "\n\t" + k + ', ' y.each do |z| if z[:range] print z[:range] + ', ' elsif z[:ocn] print z[:ocn] + ', ' else p 'error' end end end end end end end end end def output_idx(idx) if @md.book_idx path="#{@env.path.output}/#{@md.fnb}" Dir.mkdir(path) unless FileTest.directory?(path) puts "#{path}/#{@md.fn[:book_idx_html]} #{__FILE__}::#{__LINE__}" html_index_file=File.new("#{path}/#{@md.fn[:book_idx_html]}",'w') idx[:html].each {|x| html_index_file << x } html_index_file.close end end def clean_and_insert_index(data,sisu_markup_idx) tuned_file=[] data.each do |dob| tuned_file << dob if dob.obj =~/#{Mx[:br_endnotes]}/ \ and sisu_markup_idx sisu_markup_idx.each do |idx| tuned_file << idx end end end tuned_file end def clean_index(data) #check on use of dob tuned_file=[] data.each do |para| para=para.gsub(/\n*#{@rgx_idx}/m,'') tuned_file << para end tuned_file end end end __END__