# 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(data)
@data=data
end
def indexing_song
@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=/(.+?)~(\d+)/
@data=extract_book_index(@data)
@data=clean_index(@data)
@data
end
def extract_book_index(data)
tuned_file=[]
idx_array=[]
data.each do |para|
idx_array << @rgx_idx_ocn_init.match(para)[0].gsub(@rgx_idx_ocn_init,'\1~\2') 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
the_idx=construct_book_index(idx_array)
screen_print(the_idx)
end
tuned_file
end
def construct_idx_array(idx_array)
idx_lst=[]
idx_array.each do |idx|
idx_list,ocn=@rgx_idx_ocn.match(idx)[1,2]
idx_lst <<=if idx_list =~/;/
g=idx_list.scan(/[^;]+/)
idxl=[]
g.each do |i|
idxl << { :rough_idx => i, :ocn => ocn }
end
idxl
else { :rough_idx => idx_list, :ocn => ocn }
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}" }
"#{i} #{idx[:ocn]}-#{idx[:ocn].to_i+r.to_i}"
else
@the_idx[use]['a1'] << { :ocn => idx[:ocn] }
"#{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}" }
"#{idx_lst[0]}:#{i} #{idx[:ocn]}-#{idx[:ocn].to_i+r.to_i}"
else
@the_idx[use]['b1'][i] << { :ocn => idx[:ocn] }
"#{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 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__