# coding: 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 Ralph Amissah All Rights Reserved. * License: GPL 3 or later: SiSU, a framework for document structuring, publishing and search Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 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: system environment, resource control and configuration details =end module SiSU_book_index class Book_index def initialize(md,data,env=nil) @md,@data,@env=md,data,env @rgx_idx=/#{Mx[:idx_o]}(?:.+?)#{Mx[:idx_c]}\s*/ #@rgx_idx=/\s*#{Mx[:idx_o]}(?:.+?)#{Mx[:idx_c]}\s*/ @rgx_idx_ocn_init=/#{Mx[:idx_o]}(.+?)#{Mx[:idx_c]}\s*#{Mx[:id_o]}~(\d+)\S+?#{Mx[:id_c]}/ @rgx_idx_ocn_seg=/(.+?)~(\d+)~(\S+)/ @rgx_idx_ocn=/(.+?)~(\d+)/ @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_to=Regexp.new("#{Mx[:id_o]}~(\\d+);(?:[oh]|[0-6]:)\\d+;\\w\\d+#{Mx[:id_c]}#{Mx[:id_o]}#@dp:#@dp#{Mx[:id_c]}|#{Mx[:id_o]}\S+?#{Mx[:id_c]}$") @env ||=SiSU_Env::Info_env.new(@md.fns) end def indexing_song @data=extract_book_index(@data) @data=clean_index(@data) @data end def extract_book_index(data) tuned_file=[] idx_array=[] data.each do |para| if para =~@rxp_seg; @seg=para[@rxp_seg,1] end idx_array << @rgx_idx_ocn_init.match(para)[0].gsub(@rgx_idx_ocn_init,"\\1~\\2~#{@seg}") if para =~ @rgx_idx_ocn_init tuned_file << para if para end #idx_array.each do |i| # i.gsub!(@rgx_idx_ocn_init,'\1~\2') #end idx_array=construct_idx_array(idx_array) if idx_array.length > 0 if idx_array.length > 0 if @md.cmd.inspect =~/M/ the_idx=construct_book_index(idx_array) screen_print(the_idx) if @md.cmd.inspect =~/M/ puts "\n---" path="#{@env.path.output}/#{@md.fnb}" @file_index_all=File.open("#{path}/#{@md.fn[:book_index]}",'w') screen_html(the_idx) @file_index_all.close puts "\n---" screen_sisu_markup(the_idx) end end tuned_file 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| idxl << { :rough_idx => i, :ocn => ocn, :seg => seg } end idxl else { :rough_idx => idx_list, :ocn => ocn, :seg => seg } end end idx_lst.flatten! idx_lst end def construct_book_index(idx_array) @the_idx={} idx_array.each do |idx| idx_lst=idx[:rough_idx].scan(/[^|:]+/) if idx_lst[0] =~/.+?\+\d+/ use,plus=/(.+?)\+(\d+)/.match(idx_lst[0])[1,2] else use=idx_lst[0] end @the_idx[use]={} unless @the_idx[use] and defined? @the_idx[use] idx_lst.each do |i| i.strip! i,r=/(.+?)\+(\d+)/.match(i)[1,2] if i =~/.+?\+\d+/ x=if idx_lst.length == 1 or idx_lst[0] == i @the_idx[use]['a1']=[] unless @the_idx[use]['a1'] and defined? @the_idx[use]['a1'] x=if r @the_idx[use]['a1'] << { :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]['a1'] << { :ocn => idx[:ocn], :seg => idx[:seg] } "#{i} #{idx[:ocn]}" end else @the_idx[use]['b1']={} unless @the_idx[use]['b1'] and defined? @the_idx[use]['b1'] @the_idx[use]['b1'][i]=[] unless @the_idx[use]['b1'][i] and defined? @the_idx[use]['b1'][i] x=if r @the_idx[use]['b1'][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]['b1'][i] << { :ocn => idx[:ocn], :seg => idx[:seg] } "#{idx_lst[0]}:#{i} #{idx[:ocn]}" end end end end the_idx=@the_idx.sort #p the_idx; p '-----' the_idx end def screen_print(the_idx) the_idx.each do |i| i.each do |x| if x.class == String print "\n" + x + ', ' elsif x.class == Array p 'array error? -->' print x elsif x.class == Hash if x['a1'].class == Array x['a1'].each do |a| if a[:range] print a[:range] + ', ' elsif a[:ocn] print a[:ocn] + ', ' else p 'error' end end end if x['b1'] m=x['b1'] m=m.sort m.each do |k,y| if k !~/a1/ print "\n\t" + k + ', ' #p y 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 screen_html(the_idx) @file_index_all << %{\n } the_idx.each do |i| i.each do |x| if x.class == String @file_index_all << %{\n

#{x}, } #@file_index_all << %{
\n#{x}, } print %{
\n#{x}, } elsif x.class == Array p 'array error? -->' print x elsif x.class == Hash if x['a1'].class == Array x['a1'].each do |a| if a[:range] @file_index_all << %{#{a[:range]}, } print %{#{a[:range]}, } elsif a[:ocn] @file_index_all << %{#{a[:ocn]}, } print %{#{a[:ocn]}, } else p 'error' end end @file_index_all << '

' end if x['b1'] m=x['b1'] m=m.sort m.each do |k,y| if k !~/a1/ @file_index_all << %{\n

#{k}, } #@file_index_all << %{
\n\t#{k}, } print %{
\n\t#{k}, } #p y y.each do |z| if z[:range] @file_index_all << %{#{z[:range]}, } print %{#{z[:range]}, } elsif z[:ocn] @file_index_all << %{#{z[:ocn]}, } print %{#{z[:ocn]}, } else p 'error' end end @file_index_all << '

' end end end end end end end def screen_sisu_markup(the_idx) the_idx.each do |i| i.each do |x| if x.class == String print %{\n\n#{Mx[:fa_bold_o]}#{x}#{Mx[:fa_bold_c]}, } #print %{\n\n#{Mx[:gr_o]}\n#{Mx[:fa_bold_o]}#{x}#{Mx[:fa_bold_c]}, } #print "\n" + x + ', ' elsif x.class == Array p 'array error? -->' print x elsif x.class == Hash if x['a1'].class == Array x['a1'].each do |a| if a[:range] print %{#{Mx[:lnk_o]}#{a[:range]}#{Mx[:lnk_c]}#{@env.url.root}/#{@md.fnb}/#{a[:seg]}.html##{a[:ocn]}, } elsif a[:ocn] print %{#{Mx[:lnk_o]}#{a[:ocn]}#{Mx[:lnk_c]}#{@env.url.root}/#{@md.fnb}/#{a[:seg]}.html##{a[:ocn]}, } else p 'error' end end end if x['b1'] m=x['b1'] m=m.sort m.each do |k,y| if k !~/a1/ print %{\n #{k}, } #print "\n\t" + k + ', ' y.each do |z| if z[:range] print %{#{Mx[:lnk_o]}#{z[:range]}#{Mx[:lnk_c]}#{@env.url.root}/#{@md.fnb}/#{z[:seg]}.html##{z[:ocn]}, } elsif z[:ocn] print %{#{Mx[:lnk_o]}#{z[:ocn]}#{Mx[:lnk_c]}#{@env.url.root}/#{@md.fnb}/#{z[:seg]}.html##{z[:ocn]}, } else p 'error' end end puts " #{Mx[:id_o]}~0;0:0;u0#{Mx[:id_c]}" end end end end end end end def clean_index(data) tuned_file=[] data.each do |para| para.gsub!(/\n*#{@rgx_idx}/m,'') tuned_file << para end tuned_file end end end __END__