diff options
author | Ralph Amissah <ralph@amissah.com> | 2011-06-09 22:12:11 -0400 |
---|---|---|
committer | Ralph Amissah <ralph@amissah.com> | 2011-06-09 22:16:27 -0400 |
commit | a6651effc29a5805599657e3cbeb6c44de62be1e (patch) | |
tree | 586359de7649041283bf6b41ebe1e1ef5be3429f /lib | |
parent | v3: sysenv, limit/prevent the creation of spurious language output directories (diff) |
v3: harvest, work for alt output structures; for each language
* paths to document manifests etc. for the possible output dir structures
* author and topic lists for available documents, by availability in each
language
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sisu/v3/harvest.rb | 80 | ||||
-rw-r--r-- | lib/sisu/v3/harvest_authors.rb | 233 | ||||
-rw-r--r-- | lib/sisu/v3/harvest_topics.rb | 458 | ||||
-rw-r--r-- | lib/sisu/v3/hub.rb | 2 |
4 files changed, 446 insertions, 327 deletions
diff --git a/lib/sisu/v3/harvest.rb b/lib/sisu/v3/harvest.rb index aaec9046..47380c2e 100644 --- a/lib/sisu/v3/harvest.rb +++ b/lib/sisu/v3/harvest.rb @@ -58,45 +58,51 @@ ** Description: system environment, resource control and configuration details =end -def help - puts <<WOK - harvest --harvest extracts document index metadata - +module SiSU_Harvest + @@the_idx_topics,@@the_idx_authors={},{} + class Source + require_relative 'options' # options.rb + require_relative 'harvest_topics' # harvest_topics.rb + require_relative 'harvest_authors' # harvest_authors.rb + require_relative 'sysenv' # sysenv.rb + include SiSU_Env + def initialize(opt) + @opt=opt + @env=SiSU_Env::Info_env.new + end + def read + harvest_pth="#{@env.path.webserv}/#{@opt.base_stub}" + mkdir_p(harvest_pth) unless FileTest.directory?(harvest_pth) + cases(@opt,@env) + end + def help + puts <<WOK + harvest --harvest extracts document index metadata + WOK -end -def css(opt) - require_relative 'css' # css.rb - css=SiSU_Style::CSS.new - fn_css=SiSU_Env::CSS_default.new - style=File.new("#{@env.path.pwd}/#{fn_css.harvest}",'w') - style << css.harvest - style.close -end -def cases(opt) - case opt.mod.inspect - when/--harvest/i - css(opt) if opt.cmd.inspect =~/M/ - HARVEST_authors::Songsheet.new(opt).songsheet - HARVEST_topics::Songsheet.new(opt).songsheet - if opt.cmd.inspect =~/R/ - require_relative 'remote' # remote.rb - SiSU_Remote::Put.new(opt).rsync_harvest end - else - help + def css(opt) + require_relative 'css' # css.rb + css=SiSU_Style::CSS.new + fn_css=SiSU_Env::CSS_default.new + style=File.new("#{@env.path.pwd}/#{fn_css.harvest}",'w') + style << css.harvest + style.close + end + def cases(opt,env) + case opt.mod.inspect + when/--harvest/i + css(opt) if opt.cmd.inspect =~/M/ + HARVEST_authors::Songsheet.new(opt,env).songsheet + HARVEST_topics::Songsheet.new(opt,env).songsheet + if opt.cmd.inspect =~/R/ + require_relative 'remote' # remote.rb + SiSU_Remote::Put.new(opt).rsync_harvest + end + else + help + end + end end end -require_relative 'options' # options.rb -require_relative 'harvest_topics' # harvest_topics.rb -require_relative 'harvest_authors' # harvest_authors.rb -require_relative 'sysenv' # sysenv.rb - include SiSU_Env -@env=SiSU_Env::Info_env.new -@@the_idx_topics,@@the_idx_authors={},{} -argv=$* -opt=SiSU_commandline::Options.new(argv) -argv.shift -harvest_pth="#{@env.path.webserv}/#{@env.stub_md_harvest}" -mkdir_p(harvest_pth) unless FileTest.directory?(harvest_pth) -cases(opt) __END__ diff --git a/lib/sisu/v3/harvest_authors.rb b/lib/sisu/v3/harvest_authors.rb index 75d2a810..c59a9111 100644 --- a/lib/sisu/v3/harvest_authors.rb +++ b/lib/sisu/v3/harvest_authors.rb @@ -59,47 +59,45 @@ =end module HARVEST_authors require_relative 'author_format' # author_format.rb - @@the_idx_authors=[] class Songsheet - def initialize(opt) - @opt=opt + @@the_idx_authors={} + def initialize(opt,env) + @opt,@env=opt,env @file_list=opt.files - @env=SiSU_Env::Info_env.new end def songsheet - files,idx_array=[],[] - @file_list.each do |f| - (f =~/.+?\.ss[tm]$/) \ - ? (files << f[/(.+?\.ss[tm])$/,1]) \ - : (print "not .sst or .ssm ? << #{f} >> ") - end - files.each do |filename| - file_array=[] + puts 'authors:' + idx_array={} + @opt.f_pths.each do |y| + lang_hash_file_array={} + name=y[:f] + filename=y[:pth] + '/' + y[:f] File.open(filename,'r') do |file| file.each_line("\n\n") do |line| if line =~/^@(?:title|creator|date):(?:\s|$)/m - file_array << line + lang_hash_file_array[y[:lng_is]] ||= [] + lang_hash_file_array[y[:lng_is]] << line elsif line =~/^@\S+?:(?:\s|$)/m \ or line =~/^(?:\s*\n|%+ )/ else break end end end - idx_array=HARVEST_authors::Harvest.new(file_array,filename,idx_array).extract_harvest + lang_hash_file_array.each_pair do |lang,a| + idx_array[lang] ||= [] + idx_array=HARVEST_authors::Harvest.new(@opt,@env,a,filename,name,idx_array,lang).extract_harvest + end end the_idx=HARVEST_authors::Index.new(idx_array,@@the_idx_authors).construct_book_author_index HARVEST_authors::Output_index.new(@opt,the_idx).html_print.html_songsheet - harvest_pth="#{@env.path.webserv}/#{@env.stub_md_harvest}" - puts "file://#{harvest_pth}/harvest_authors.html" - puts "file://#{@env.path.pwd}/harvest_authors.html" if @opt.cmd.inspect =~/M/ end end class Harvest - def initialize(data,filename,idx_array) - @data,@filename,@idx_array=data,filename,idx_array + def initialize(opt,env,data,filename,name,idx_array,lang) + @opt,@env,@data,@filename,@name,@idx_array,@lang=opt,env,data,filename,name,idx_array,lang end def extract_harvest - data,filename,idx_array=@data,@filename,@idx_array + data,filename,name,idx_array,lang=@data,@filename,@name,@idx_array,@lang @title,@subtitle,@fulltitle,@author,@author_format,@date=nil,nil,nil,nil,nil,nil @authors=[] rgx={} @@ -123,22 +121,25 @@ module HARVEST_authors break if @title and @subtitle and @author and @date end @fulltitle=@subtitle ? (@title + ' - ' + @subtitle) : @title - if @title and @author_format + if @title \ + and @author_format creator=FORMAT::Author.new(@author_format.strip).author_details @authors,@authorship=creator[:authors],creator[:authorship] - file=if filename=~/~[a-z]{2,3}\.ss[mt]$/ - lang='.' + /~([a-z]{2,3})\.ss[mt]$/.match(filename)[1] - filename.sub(/~[a-z]{2,3}\.ss[mt]$/,'') + file=if name=~/~[a-z]{2,3}\.ss[mt]$/ + name.sub(/~[a-z]{2,3}\.ss[mt]$/,'') else - lang='' - filename.sub(/\.ss[mt]$/,'') + name.sub(/\.ss[mt]$/,'') end - page="sisu_manifest#{lang}.html" - idx_array <<= { filename: filename, file: file, date: @date, title: @fulltitle, author: creator, page: page } + page=if @env.output_dir_structure.by_language_code? + "#{lang}/sisu_manifest.html" + else + "sisu_manifest.#{lang}.html" + end + idx_array[lang] <<= { filename: filename, file: file, date: @date, title: @fulltitle, author: creator, page: page, lang: lang } else #p "missing author field: #{@filename} title: #{@title}; author: #{@author_format}" end - idx_array.flatten! + idx_array[lang].flatten! idx_array end end @@ -152,38 +153,55 @@ module HARVEST_authors end def construct_book_author_index idx_array=@idx_array - idx_array.each do |idx| - idx[:author][:last_first_format_a].each do |author| - author.strip! - if @@the_idx_authors[author].class==NilClass - @@the_idx_authors[author]={ md: [] } + idx_array.each_pair do |lang,idx_array| + @@the_idx_authors[lang] ||= {} + idx_array.each do |idx| + idx[:author][:last_first_format_a].each do |author| + author.strip! + if @@the_idx_authors[lang][author].class==NilClass + @@the_idx_authors[lang][author]={ md: [] } + end + @@the_idx_authors[lang][author][:md] << { filename: idx[:filename], file: idx[:file], author: idx[:author], title: idx[:title], date: idx[:date], page: idx[:page], lang: idx[:lang] } end - @@the_idx_authors[author][:md] << { filename: idx[:filename], file: idx[:file], author: idx[:author], title: idx[:title], date: idx[:date], page: idx[:page] } end end @the_idx=@@the_idx_authors end end class Output_index + require_relative 'i18n' # i18n.rb + require 'fileutils' + include FileUtils def initialize(opt,the_idx) @opt,@the_idx=opt,the_idx @env=SiSU_Env::Info_env.new - @rc=Get_init.instance.sisu_yaml.rc + @rc=SiSU_Env::Get_init.instance.sisu_yaml.rc @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] @letter=@alph.shift @vz=SiSU_Env::Get_init.instance.skin end def html_file_open - @output={} - harvest_pth="#{@env.path.webserv}/#{@env.stub_md_harvest}" - @output[:html]=File.new("#{harvest_pth}/harvest_authors.html",'w') - @output[:html_mnt]=(@opt.cmd.inspect =~/M/) \ - ? File.new("#{@env.path.pwd}/harvest_authors.html",'w') \ - : nil + @the_idx.keys.each do |lng| + @output ||={} + @output[lng] ||={} + harvest_pth,file='','' + if @env.output_dir_structure.by_language_code? + harvest_pth="#{@env.path.webserv}/#{@opt.base_stub}/#{lng}/manifest" + file="#{harvest_pth}/authors.html" + else + harvest_pth="#{@env.path.webserv}/#{@opt.base_stub}/manifest" + file="#{harvest_pth}/authors.#{lng}.html" + end + mkdir_p(harvest_pth) unless FileTest.directory?(harvest_pth) + puts "file://#{file}" + @output[lng][:html]=File.new(file,'w') + end end def html_file_close - @output[:html].close - @output[:html_mnt].close if @output[:html_mnt].class==File + @the_idx.keys.each do |lng| + @output[lng][:html].close + @output[lng][:html_mnt].close if @output[lng][:html_mnt].class==File + end end def html_print def html_songsheet @@ -194,19 +212,36 @@ module HARVEST_authors html_tail html_file_close end - def html_head_adjust(type='') - css_path=if @env.output_dir_structure.by_language_code? + def html_head_adjust(lng,type='') + css_path,topics='','' + if @env.output_dir_structure.by_language_code? css_path=(type !~/maintenance/) \ ? '../../_sisu/css/harvest.css' \ : 'harvest.css' + topics='topics.html' elsif @env.output_dir_structure.by_filetype? css_path=(type !~/maintenance/) \ ? '../_sisu/css/harvest.css' \ : 'harvest.css' + topics="topics.#{lng}.html" elsif @env.output_dir_structure.by_filename? css_path=(type !~/maintenance/) \ ? '../_sisu/css/harvest.css' \ : 'harvest.css' + topics="topics.#{lng}.html" + end + ln=SiSU_i18n::Languages.new.language.list + harvest_languages='' + @the_idx.keys.each do |lng| + if @env.output_dir_structure.by_language_code? + harvest_pth="../../#{lng}/manifest" + file="#{harvest_pth}/authors.html" + else @env.output_dir_structure.by_filetype? + harvest_pth='.' + file="#{harvest_pth}/authors.#{lng}.html" + end + l=ln[lng][:t] + harvest_languages += %{<a href="#{file}">#{l}</a> } end sv=SiSU_Env::Info_version.instance.get_version <<WOK @@ -228,27 +263,35 @@ module HARVEST_authors <a name="up" id="up"></a> <a name="start" id="start"></a> <h1>SiSU Metadata Harvest - Authors</h1> -<p>[<a href="../index.html"> HOME </a>] also see <a href="harvest_topics.html">SiSU Metadata Harvest - Topics</a></p> +<p>[<a href="../index.html"> HOME </a>] also see <a href="#{topics}">SiSU Metadata Harvest - Topics</a></p> <p>#{@env.widget_static.search_form}</p> <hr /> +<p class="tiny">#{harvest_languages}</p> +<hr /> WOK end def html_head - @output[:html_mnt] << html_head_adjust('maintenance') if @opt.cmd.inspect =~/M/ - @output[:html] << html_head_adjust + @the_idx.keys.each do |lng| + @output[lng][:html_mnt] << html_head_adjust(lng,'maintenance') if @opt.cmd.inspect =~/M/ + @output[lng][:html] << html_head_adjust(lng) + end end def html_alph a=[] a << '<p>' @alph.each do |x| - a << ((x =~/[0-9]/) ? '' : %{<a href="##{x}">#{x}</a>, }) + a << ((x =~/[0-9]/) \ + ? '' \ + : %{<a href="##{x}">#{x}</a>, }) + end + a=a.join + @the_idx.keys.each do |lng| + @output[lng][:html_mnt] << a if @opt.cmd.inspect =~/M/ + @output[lng][:html] << a end - @output[:html_mnt] << a.join if @output[:html_mnt].class==File - @output[:html] << a.join end def html_tail - a=[] - a <<<<WOK + a =<<WOK <hr /> <a name="bottom" id="bottom"></a> <a name="down" id="down"></a> @@ -260,27 +303,25 @@ WOK </body> </html> WOK - @output[:html_mnt] << a if @output[:html_mnt].class==File - @output[:html] << a - end - def do_html(html) - @output[:html_mnt] << html if @output[:html_mnt].class==File - @output[:html] << html + @the_idx.keys.each do |lng| + @output[lng][:html_mnt] << a if @output[lng][:html_mnt].class==File + @output[lng][:html] << a + end end - def do_string(attrib,string) - html=%{<p class="#{attrib}">#{string}</p>} - do_html(html) + def do_html(lng,html) + @output[lng][:html_mnt] << html if @output[lng][:html_mnt].class==File + @output[lng][:html] << html end - def do_string_name(attrib,string) + def do_string_name(lng,attrib,string) f=/^(\S)/.match(string[0])[1] if @letter < f while @letter < f if @alph.length > 0 @letter=@alph.shift - if @output[:html_mnt].class==File - @output[:html_mnt] << %{\n<p class="letter"><a name="#{@letter}"></p>#{@letter}</a><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} + if @output[lng][:html_mnt].class==File + @output[lng][:html_mnt] << %{\n<p class="letter"><a name="#{@letter}"></p>#{@letter}</a><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} end - @output[:html] << %{\n<p class="letter"><a name="#{@letter}">#{@letter}</a></p><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} + @output[lng][:html] << %{\n<p class="letter"><a name="#{@letter}">#{@letter}</a></p><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} else break end end @@ -288,37 +329,35 @@ WOK end def html_body the_idx=@the_idx - the_idx.sort.each do |a| - do_string_name('',a) - name=a[0].sub(/(.+?)(?:,.+|$)/,'\1').gsub(/\s+/,'_') - x = %{<p class="author"><a name="#{name}">#{a[0]}</a></p>} - if @output[:html_mnt].class==File - @output[:html_mnt] << x - end - @output[:html] << x - works=[] - a[1][:md].each do |x| - if @env.output_dir_structure.by_language_code? - manifest_pth="#{@env.path.output}/#{x[:file]}" - manifest_at_local=@env.path.output + '/' + 'en' + '/' + 'manifest/' + x[:file] + '.manifest.html' - manifest_at=x[:file] + '.manifest.html' - elsif @env.output_dir_structure.by_filetype? - #manifest_pth_2="#{@env.path.output}/#{x[:file]}" - manifest_name=x[:file] - manifest_at_local=manifest_name + 'manifest.html' - manifest_at=x[:file] + '.manifest.html' - elsif @env.output_dir_structure.by_filename? - manifest_at_local="#{@env.path.output}/#{x[:file]}/#{x[:page]}" - manifest_at="../#{x[:file]}/#{x[:page]}" + the_idx.each_pair do |lng,lng_array| + lng_array.sort.each do |a| + do_string_name(lng,'',a) + name=a[0].sub(/(.+?)(?:,.+|$)/,'\1').gsub(/\s+/,'_') + x = %{<p class="author"><a name="#{name}">#{a[0]}</a></p>} + if @output[lng][:html_mnt].class==File + @output[lng][:html_mnt] << x + end + @output[lng][:html] << x + works=[] + a[1][:md].each do |x| + if @env.output_dir_structure.by_language_code? + manifest_pth="#{@env.path.output}/#{x[:file]}" + manifest_at=x[:file] + '.html' + elsif @env.output_dir_structure.by_filetype? + manifest_name=x[:file] + manifest_at=x[:file] + '.' + lng + '.html' + elsif @env.output_dir_structure.by_filename? + manifest_at="../#{x[:file]}/#{x[:page]}" + end + work=[ "#{x[:date]} #{x[:title]}", %{<p class="publication">#{x[:date]} <a href="#{manifest_at}">#{x[:title]}</a>, #{x[:author][:authors_s]}</p>} ] + works<<=(@output[lng][:html_mnt].class==File) \ + ? (work.concat([%{<p class="publication">[<a href="#{x[:file]}.sst">src</a>] #{x[:date]} <a href="file://#{manifest_at}">#{x[:title]}</a>, #{x[:author][:authors_s]} -- [<a href="#{x[:file]}.sst">#{x[:file]}.sst</a>]</p>}])) \ + : work + end + works.sort_by {|x| x[0]}.each do |x| + @output[lng][:html] << x[1] + @output[lng][:html_mnt] << x[2] if @output[lng][:html_mnt].class==File end - work=[ "#{x[:date]} #{x[:title]}", %{<p class="publication">#{x[:date]} <a href="#{manifest_at}">#{x[:title]}</a>, #{x[:author][:authors_s]}</p>} ] - works<<=(@output[:html_mnt].class==File) \ - ? (work.concat([%{<p class="publication">[<a href="#{x[:file]}.sst">src</a>] #{x[:date]} <a href="file://#{manifest_at_local}">#{x[:title]}</a>, #{x[:author][:authors_s]} -- [<a href="#{x[:file]}.sst">#{x[:file]}.sst</a>]</p>}])) \ - : work - end - works.sort_by {|x| x[0]}.each do |x| - @output[:html] << x[1] - @output[:html_mnt] << x[2] if @output[:html_mnt].class==File end end end diff --git a/lib/sisu/v3/harvest_topics.rb b/lib/sisu/v3/harvest_topics.rb index 3ca72326..c3204de9 100644 --- a/lib/sisu/v3/harvest_topics.rb +++ b/lib/sisu/v3/harvest_topics.rb @@ -60,47 +60,46 @@ =end module HARVEST_topics require_relative 'author_format' # author_format.rb + include SiSU_Viz class Songsheet - def initialize(opt) - @opt=opt + @@the_idx_topics={} + def initialize(opt,env) + @opt,@env=opt,env @file_list=opt.files - @env=SiSU_Env::Info_env.new end def songsheet - files,idx_array=[],[] - @file_list.each do |f| - (f =~/.+?\.ss[tm]$/) \ - ? (files << f[/(.+?\.ss[tm])$/,1]) \ - : (print "not .sst or .ssm ? << #{f} >> ") - end - files.each do |filename| - file_array=[] + puts 'topics:' + idx_array={} + @opt.f_pths.each do |y| + lang_hash_file_array={} + name=y[:f] + filename=y[:pth] + '/' + y[:f] File.open(filename,'r') do |file| file.each_line("\n\n") do |line| if line =~/^@(?:title|creator|classify):(?:\s|$)/m - file_array << line + lang_hash_file_array[y[:lng_is]] ||= [] + lang_hash_file_array[y[:lng_is]] << line elsif line =~/^@\S+?:(?:\s|$)/m \ or line =~/^(?:\s*\n|%+ )/ else break end end end - idx_array=HARVEST_topics::Harvest.new(@opt,file_array,filename,idx_array).extract_harvest + lang_hash_file_array.each_pair do |lang,a| + idx_array[lang] ||= [] + idx_array=HARVEST_topics::Harvest.new(@opt,@env,a,filename,name,idx_array,lang).extract_harvest + end end - the_idx=HARVEST_topics::Index.new(idx_array,@@the_idx_topics).construct_book_topic_index - #HARVEST_topics::Output_index.new('',the_idx).screen_print.cycle if @opt.cmd.inspect =~/[VM]/ + the_idx=HARVEST_topics::Index.new(@opt,@env,idx_array,@@the_idx_topics).construct_book_topic_index HARVEST_topics::Output_index.new(@opt,the_idx).html_print.html_songsheet - harvest_pth="#{@env.path.webserv}/#{@env.stub_md_harvest}" - puts "file://#{harvest_pth}/harvest_topics.html" - puts "file://#{@env.path.pwd}/harvest_topics.html" if @opt.cmd.inspect =~/M/ end end class Harvest - def initialize(opt,data,filename,idx_array) - @opt,@data,@filename,@idx_array=opt,data,filename,idx_array + def initialize(opt,env,data,filename,name,idx_array,lang) + @opt,@env,@data,@filename,@name,@idx_array,@lang=opt,env,data,filename,name,idx_array,lang end def extract_harvest - data,filename,idx_array=@data,@filename,@idx_array + data,filename,name,idx_array,lang=@data,@filename,@name,@idx_array,@lang @idx_lst,@title,@subtitle,@fulltitle,@author,@author_format=nil,nil,nil,nil,nil,nil rgx={} rgx[:author]=/^@creator:(?:[ ]+|.+?:author:[ ]+)(.+?)(?:\||\n)/m @@ -128,118 +127,130 @@ module HARVEST_topics and @idx_list creator=FORMAT::Author.new(@author_format.strip).author_details @authors,@authorship=creator[:authors],creator[:authorship] - file=if filename=~/~[a-z]{2,3}\.ss[mt]$/ - lang='.' + /~([a-z]{2,3})\.ss[mt]$/.match(filename)[1] - filename.sub(/~[a-z]{2,3}\.ss[mt]$/,'') + file=if name=~/~[a-z]{2,3}\.ss[mt]$/ + name.sub(/~[a-z]{2,3}\.ss[mt]$/,'') + else + name.sub(/\.ss[mt]$/,'') + end + page=if @env.output_dir_structure.by_language_code? + #fix + end + page=if @env.output_dir_structure.by_language_code? + "#{lang}/sisu_manifest.html" else - lang='' - filename.sub(/\.ss[mt]$/,'') + "sisu_manifest.#{lang}.html" end - page="sisu_manifest#{lang}.html" - idx_array <<=if @idx_list =~/;/ + idx_array[lang] <<=if @idx_list =~/;/ g=@idx_list.scan(/[^;]+/) idxl=[] g.each do |i| i.strip! - idxl << { filename: filename, file: file, rough_idx: i, title: @fulltitle, author: creator, page: page } + idxl << { filename: filename, file: file, rough_idx: i, title: @fulltitle, author: creator, page: page, lang: lang } end idxl - else { filename: filename, file: file, rough_idx: @idx_list, title: @fulltitle, author: creator, page: page } + else { filename: filename, file: file, rough_idx: @idx_list, title: @fulltitle, author: creator, page: page, lang: lang } end else p "missing required field in #{@filename} - [title]: <<#{@title}>>; [author]: <<#{@author_format}>>; [idx]: <<#{@idx_list}>>" if @opt.cmd.inspect =~/[VM]/ end - idx_array.flatten! + idx_array[lang].flatten! idx_array end end class Index - def initialize(idx_array,the_idx) - @idx_array,@the_idx=idx_array,the_idx + def initialize(opt,env,idx_array,the_idx) + @opt,@env,@idx_array,@the_idx=opt,env,idx_array,the_idx @@the_idx_topics=@the_idx end def capital(txt) txt[0].chr.capitalize + txt[1,txt.length] end - def contents(hash,idx) + def contents(lang,hash,idx) names='' idx[:author][:last_first_format_a].each do |n| s=n.sub(/(.+?)(?:,.+|$)/,'\1').gsub(/\s+/,'_') - names += %{<a href="harvest_authors.html##{s}">#{n}</a>, } + names=if @env.output_dir_structure.by_language_code? + names += %{<a href="authors.html##{s}">#{n}</a>, } + else + names += %{<a href="authors.#{lang}.html##{s}">#{n}</a>, } + end end hash << { filename: idx[:filename], file: idx[:file], author: names, title: idx[:title], page: idx[:page] } end def construct_book_topic_index idx_array=@idx_array - idx_array.each do |idx| - @lv0,@lv1,@lv2,@lv3,@lv4={},{},{},{},{} - if idx[:rough_idx] - idx_lst=idx[:rough_idx].scan(/[^:]+/) - else - puts "no topic register in: << #{idx[:filename]} >>" - next - end - idx_lst_alt=[] - idx_lst.each {|lev| idx_lst_alt << lev.scan(/[^|]+/)} - depth = idx_lst_alt.length - 1 - range = 0..depth - range.each do |t| - if idx_lst_alt[t] - case t - when 0 - lev0=idx_lst_alt[t] - lev0.each do |lv0| - lv0=capital(lv0) - if @@the_idx_topics[lv0].class==NilClass - @@the_idx_topics[lv0]={ md: [] } + idx_array.each_pair do |lang,idx_array| + @@the_idx_topics[lang] ||= {} + idx_array.each do |idx| + @lv0,@lv1,@lv2,@lv3,@lv4={},{},{},{},{} + if idx[:rough_idx] + idx_lst=idx[:rough_idx].scan(/[^:]+/) + else + puts "no topic register in: << #{idx[:filename]} >>" + next + end + idx_lst_alt=[] + idx_lst.each {|lev| idx_lst_alt << lev.scan(/[^|]+/)} + depth = idx_lst_alt.length - 1 + range = 0..depth + range.each do |t| + if idx_lst_alt[t] + case t + when 0 + lev0=idx_lst_alt[t] + lev0.each do |lv0| + lv0=capital(lv0) + if @@the_idx_topics[lang][lv0].class==NilClass + @@the_idx_topics[lang][lv0]={ md: [] } + end + @lv0=lv0 if lev0.length==1 + j=@@the_idx_topics[lang][lv0][:md] + contents(lang,j,idx) if idx_lst_alt.length - 1 == t end - @lv0=lv0 if lev0.length==1 - j=@@the_idx_topics[lv0][:md] - contents(j,idx) if idx_lst_alt.length - 1 == t - end - when 1 - lev1=idx_lst_alt[t] - lev1.each do |lv1| - lv1=capital(lv1) - if @@the_idx_topics[@lv0][lv1].class==NilClass - @@the_idx_topics[@lv0][lv1]={ md: [] } + when 1 + lev1=idx_lst_alt[t] + lev1.each do |lv1| + lv1=capital(lv1) + if @@the_idx_topics[lang][@lv0][lv1].class==NilClass + @@the_idx_topics[lang][@lv0][lv1]={ md: [] } + end + @lv1=lv1 if lev1.length==1 + j=@@the_idx_topics[lang][@lv0][lv1][:md] + contents(lang,j,idx) if idx_lst_alt.length - 1 == t end - @lv1=lv1 if lev1.length==1 - j=@@the_idx_topics[@lv0][lv1][:md] - contents(j,idx) if idx_lst_alt.length - 1 == t - end - when 2 - lev2=idx_lst_alt[t] - lev2.each do |lv2| - lv2=capital(lv2) - if @@the_idx_topics[@lv0][@lv1][lv2].class==NilClass - @@the_idx_topics[@lv0][@lv1][lv2]={ md: [] } + when 2 + lev2=idx_lst_alt[t] + lev2.each do |lv2| + lv2=capital(lv2) + if @@the_idx_topics[lang][@lv0][@lv1][lv2].class==NilClass + @@the_idx_topics[lang][@lv0][@lv1][lv2]={ md: [] } + end + @lv2=lv2 if lev2.length==1 + j=@@the_idx_topics[lang][@lv0][@lv1][lv2][:md] + contents(lang,j,idx) if idx_lst_alt.length - 1 == t end - @lv2=lv2 if lev2.length==1 - j=@@the_idx_topics[@lv0][@lv1][lv2][:md] - contents(j,idx) if idx_lst_alt.length - 1 == t - end - when 3 - lev3=idx_lst_alt[t] - lev3.each do |lv3| - lv3=capital(lv3) - if @@the_idx_topics[@lv0][@lv1][@lv2][lv3].class==NilClass - @@the_idx_topics[@lv0][@lv1][@lv2][lv3]={ md: [] } + when 3 + lev3=idx_lst_alt[t] + lev3.each do |lv3| + lv3=capital(lv3) + if @@the_idx_topics[lang][@lv0][@lv1][@lv2][lv3].class==NilClass + @@the_idx_topics[lang][@lv0][@lv1][@lv2][lv3]={ md: [] } + end + @lv3=lv3 if lev3.length==1 + j=@@the_idx_topics[lang][@lv0][@lv1][@lv2][lv3][:md] + contents(lang,j,idx) if idx_lst_alt.length - 1 == t end - @lv3=lv3 if lev3.length==1 - j=@@the_idx_topics[@lv0][@lv1][@lv2][lv3][:md] - contents(j,idx) if idx_lst_alt.length - 1 == t - end - when 4 - lev4=idx_lst_alt[t] - lev4.each do |lv4| - lv4=capital(lv4) - if @@the_idx_topics[@lv0][@lv1][@lv2][@lv3][lv4].class==NilClass - @@the_idx_topics[@lv0][@lv1][@lv2][@lv3][lv4]={ md: [] } + when 4 + lev4=idx_lst_alt[t] + lev4.each do |lv4| + lv4=capital(lv4) + if @@the_idx_topics[lang][@lv0][@lv1][@lv2][@lv3][lv4].class==NilClass + @@the_idx_topics[lang][@lv0][@lv1][@lv2][@lv3][lv4]={ md: [] } + end + @lv4=lv4 if lev4.length==1 + j=@@the_idx_topics[lang][@lv0][@lv1][@lv2][@lv3][lv4][:md] + contents(lang,j,idx) if idx_lst_alt.length - 1 == t end - @lv4=lv4 if lev4.length==1 - j=@@the_idx_topics[@lv0][@lv1][@lv2][@lv3][lv4][:md] - contents(j,idx) if idx_lst_alt.length - 1 == t end end end @@ -249,25 +260,42 @@ module HARVEST_topics end end class Output_index + require_relative 'i18n' # i18n.rb + require 'fileutils' + include FileUtils def initialize(opt,the_idx) @opt,@the_idx=opt,the_idx @env=SiSU_Env::Info_env.new - @rc=Get_init.instance.sisu_yaml.rc + @rc=SiSU_Env::Get_init.instance.sisu_yaml.rc @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] @letter=@alph.shift @vz=SiSU_Env::Get_init.instance.skin end def html_file_open - @output={} - harvest_pth="#{@env.path.webserv}/#{@env.stub_md_harvest}" - @output[:html]=File.new("#{harvest_pth}/harvest_topics.html",'w') - if @opt.cmd.inspect =~/-M/ - @output[:html_mnt]=File.new("#{@env.path.pwd}/harvest_topics.html",'w') + @the_idx.keys.each do |lng| + @output ||={} + @output[lng] ||={} + harvest_pth,file='','' + if @env.output_dir_structure.by_language_code? + harvest_pth="#{@env.path.webserv}/#{@opt.base_stub}/#{lng}/manifest" + file="#{harvest_pth}/topics.html" + else @env.output_dir_structure.by_filetype? + harvest_pth="#{@env.path.webserv}/#{@opt.base_stub}/manifest" + file="#{harvest_pth}/topics.#{lng}.html" + end + mkdir_p(harvest_pth) unless FileTest.directory?(harvest_pth) + puts "file://#{file}" + @output[lng][:html]=File.new(file,'w') + if @opt.cmd.inspect =~/-M/ + @output[lng][:html_mnt]=File.new("#{@env.path.pwd}/topics.html",'w') + end end end def html_file_close - @output[:html].close - @output[:html_mnt].close if @output[:html_mnt].class==File + @the_idx.keys.each do |lng| + @output[lng][:html].close + @output[lng][:html_mnt].close if @output[lng][:html_mnt].class==File + end end def html_print def html_songsheet @@ -278,19 +306,36 @@ module HARVEST_topics html_tail html_file_close end - def html_head_adjust(type='') - css_path=if @env.output_dir_structure.by_language_code? + def html_head_adjust(lng,type='') + css_path,authors='','' + if @env.output_dir_structure.by_language_code? css_path=(type !~/maintenance/) \ ? '../../_sisu/css/harvest.css' \ : 'harvest.css' + authors='authors.html' elsif @env.output_dir_structure.by_filetype? css_path=(type !~/maintenance/) \ ? '../_sisu/css/harvest.css' \ : 'harvest.css' + authors="authors.#{lng}.html" elsif @env.output_dir_structure.by_filename? css_path=(type !~/maintenance/) \ ? '../_sisu/css/harvest.css' \ : 'harvest.css' + authors="authors.#{lng}.html" + end + ln=SiSU_i18n::Languages.new.language.list + harvest_languages='' + @the_idx.keys.each do |lng| + if @env.output_dir_structure.by_language_code? + harvest_pth="../../#{lng}/manifest" + file="#{harvest_pth}/topics.html" + else @env.output_dir_structure.by_filetype? + harvest_pth='.' + file="#{harvest_pth}/topics.#{lng}.html" + end + l=ln[lng][:t] + harvest_languages += %{<a href="#{file}">#{l}</a> } end sv=SiSU_Env::Info_version.instance.get_version <<WOK @@ -312,29 +357,35 @@ module HARVEST_topics <a name="up" id="up"></a> <a name="start" id="start"></a> <h1>SiSU Metadata Harvest - Topics</h1> -<p>[<a href="../index.html"> HOME </a>] also see <a href="harvest_authors.html">SiSU Metadata Harvest - Authors</a></p> +<p>[<a href="../index.html"> HOME </a>] also see <a href="#{authors}">SiSU Metadata Harvest - Authors</a></p> <p>#{@env.widget_static.search_form}</p> <hr /> +<p class="tiny">#{harvest_languages}</p> +<hr /> WOK end def html_head - @output[:html_mnt] << html_head_adjust('maintenance') if @opt.cmd.inspect =~/M/ - @output[:html] << html_head_adjust + @the_idx.keys.each do |lng| + @output[lng][:html_mnt] << html_head_adjust(lng,'maintenance') if @opt.cmd.inspect =~/M/ + @output[lng][:html] << html_head_adjust(lng) + end end def html_alph a=[] a << '<p>' @alph.each do |x| - a << (x =~/[0-9]/) \ + a << ((x =~/[0-9]/) \ ? '' \ - : %{<a href="##{x}">#{x}</a>, } + : %{<a href="##{x}">#{x}</a>, }) + end + a=a.join + @the_idx.keys.each do |lng| + @output[lng][:html_mnt] << a if @opt.cmd.inspect =~/M/ + @output[lng][:html] << a end - @output[:html_mnt] << a if @opt.cmd.inspect =~/M/ - @output[:html] << a.join end def html_tail - a=[] - a <<<<WOK + a =<<WOK <hr /> <a name="bottom" id="bottom"></a> <a name="down" id="down"></a> @@ -346,107 +397,116 @@ WOK </body> </html> WOK - @output[:html_mnt] << a if @output[:html_mnt].class==File - @output[:html] << a + @the_idx.keys.each do |lng| + @output[lng][:html_mnt] << a if @output[lng][:html_mnt].class==File + @output[lng][:html] << a + end end - def do_html(html) - @output[:html] << html + def do_html(lng,html) + @output[lng][:html] << html end - def do_html_maintenance(html) - @output[:html_mnt] << html if @output[:html_mnt].class==File + def do_html_maintenance(lng,html) + @output[lng][:html_mnt] << html if @output[lng][:html_mnt].class==File end - def do_string(attrib,string) + def do_string(lng,attrib,string) html=%{<p class="#{attrib}">#{string}</p>} - do_html(html) - do_html_maintenance(html) if @output[:html_mnt].class==File + do_html(lng,html) + do_html_maintenance(lng,html) if @output[lng][:html_mnt].class==File end - def do_string_default(attrib,string) + def do_string_default(lng,attrib,string) html=%{<p class="#{attrib}">#{string}</p>} - do_html(html) + do_html(lng,html) end - def do_string_maintenance(attrib,string) + def do_string_maintenance(lng,attrib,string) html=%{<p class="#{attrib}">#{string}</p>} - do_html_maintenance(html) if @output[:html_mnt].class==File + do_html_maintenance(lng,html) if @output[lng][:html_mnt].class==File end - def do_string_name(attrib,string) + def do_string_name(lng,attrib,string) f=/^(\S)/.match(string)[1] if @letter < f while @letter < f if @alph.length > 0 @letter=@alph.shift - if @output[:html_mnt].class==File - @output[:html_mnt] << %{\n<p class="letter"><a name="#{@letter}">#{@letter}</a></p><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} + if @output[lng][:html_mnt].class==File + @output[lng][:html_mnt] << %{\n<p class="letter"><a name="#{@letter}">#{@letter}</a></p><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} end - @output[:html] << %{\n<p class="letter"><a name="#{@letter}">#{@letter}</a></p><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} + @output[lng][:html] << %{\n<p class="letter"><a name="#{@letter}">#{@letter}</a></p><p class="book_index_lev1"><a name="#{@letter.downcase}"></a></p>} else break end end end name=string.strip.gsub(/\s+/,'_') html=%{<p class="#{attrib}"><a name="#{name}">#{string}</a></p>} - do_html(html) - do_html_maintenance(html) if @output[:html_mnt].class==File + do_html(lng,html) + do_html_maintenance(lng,html) if @output[lng][:html_mnt].class==File end - def do_array(lv,array) + def do_array(lng,lv,array) lv+=1 array.each do |b| - do_case(lv,b) + do_case(lng,lv,b) end end - def do_hash_md(attrib,hash) + def do_hash_md(lng,attrib,hash) if @env.output_dir_structure.by_language_code? - manifest_at=hash[:file] + '.manifest.html' + manifest_at=hash[:file] + '.html' elsif @env.output_dir_structure.by_filetype? - manifest_at=hash[:file] + '.manifest.html' + manifest_at=hash[:file] + '.' + lng + '.html' elsif @env.output_dir_structure.by_filename? manifest_at="../#{hash[:file]}/#{hash[:page]}" end html=%{<a href="#{manifest_at}">#{hash[:title]}</a> - #{hash[:author]}} - do_string_default(attrib,html) + do_string_default(lng,attrib,html) end - def do_hash_md_maintenance(attrib,hash) - if @output[:html_mnt].class==File #should not be run for presentation output + def do_hash_md_maintenance(lng,attrib,hash) + if @output[lng][:html_mnt].class==File #should not be run for presentation output html=%{[<a href="#{hash[:file]}.sst">src</a>] <a href="file://#{@env.path.output}/#{hash[:file]}/#{hash[:page]}">#{hash[:title]}</a> - #{hash[:author]}} - do_string_maintenance(attrib,html) + do_string_maintenance(lng,attrib,html) end end - def do_hash(lv,hash) + def do_hash(lng,lv,hash) lv+=1 key=[] hash.each_key do |m| if m == :md - do_case(lv,hash[m]) - elsif m != :title and m != :author and m != :filename and m != :file and m != :rough_idx and m != :page + do_case(lng,lv,hash[m]) + elsif m != :title \ + and m != :author \ + and m != :filename \ + and m != :file \ + and m != :rough_idx \ + and m != :page key << m elsif m == :title - do_hash_md('work',hash) - do_hash_md_maintenance('work',hash) + do_hash_md(lng,'work',hash) + do_hash_md_maintenance(lng,'work',hash) end end if key.length > 0 key.sort.each do |m| attrib="lev#{lv}" - lv==0 ? do_string_name(attrib,m) : do_string(attrib,m) - do_case(lv,hash[m]) + lv==0 ? do_string_name(lng,attrib,m) : do_string(lng,attrib,m) + do_case(lng,lv,hash[m]) end end end - def do_case(lv,a) + def do_case(lng,lv,a) y = a.class case when y==String attrib="lev#{lv}" - lv==0 ? do_string_name(attrib,a) : do_string(attrib,a) + lv==0 ? do_string_name(lng,attrib,a) : do_string(lng,attrib,a) when y==Array - do_array(lv,a) + do_array(lng,lv,a) when y==Hash - do_hash(lv,a) + do_hash(lng,lv,a) end end def html_body the_idx=@the_idx - the_idx.sort.each do |a| - do_case(-1,a) + the_idx.each_pair do |lng,lng_array| + lng_array.sort.each do |a| + do_case(lng,-1,a) + end end end self @@ -456,102 +516,116 @@ WOK s=' '*4 puts s*lv + string end - def do_array(lv,array) + def do_array(lng,lv,array) lv+=1 array.each do |b| - do_case(lv,b) + do_case(lng,lv,b) end end - def do_hash_md(lv,hash) + def do_hash_md(lng,lv,hash) string=hash[:title] + ' - ' + hash[:author] - do_string(lv,string) + do_string(lng,lv,string) end - def do_hash(lv,hash) + def do_hash(lng,lv,hash) lv+=1 key=[] hash.each_key do |m| if m == :md - do_case(lv,hash[m]) - elsif m != :title and m != :author and m != :filename and m != :file and m != :rough_idx and m != :page + do_case(lng,lv,hash[m]) + elsif m != :title \ + and m != :author \ + and m != :filename \ + and m != :file \ + and m != :rough_idx \ + and m != :page key << m elsif m == :title - do_hash_md(lv,hash) + do_hash_md(lng,lv,hash) end end if key.length > 0 key.sort.each do |m| - do_string(lv,m) - do_case(lv,hash[m]) + do_string(lng,lv,m) + do_case(lng,lv,hash[m]) end end end - def do_case(lv,a) + def do_case(lng,lv,a) s=' '*4 y = a.class case when y==String - do_string(lv,a) + do_string(lng,lv,a) when y==Array - do_array(lv,a) + do_array(lng,lv,a) when y==Hash - do_hash(lv,a) + do_hash(lng,lv,a) end end def cycle the_idx=@the_idx - the_idx.each do |a| - do_case(-1,a) + the_idx.keys.each do |lng| + the_idx[lng].each do |a| + do_case(lng,-1,a) + end end end self end def screen_print_unsorted - def do_string(lv,string) + def do_string(lng,lv,string) s=' '*4 puts s*lv + string end - def do_array(lv,array) + def do_array(lng,lv,array) lv+=1 array.each do |b| - do_case(lv,b) + do_case(lng,lv,b) end end - def do_hash_md(lv,hash) + def do_hash_md(lng,lv,hash) string=hash[:title] + ' - ' + hash[:author] - do_string(lv,string) + do_string(lng,lv,string) end - def do_hash(lv,hash) + def do_hash(lng,lv,hash) lv+=1 hash.each_key do |m| if m == :md - do_case(lv,hash[m]) + do_case(lng,lv,hash[m]) else - if m != :title and m != :author and m != :filename and m != :file and m != :rough_idx and m != :page - do_string(lv,m) - do_case(lv,hash[m]) + if m != :title \ + and m != :author \ + and m != :filename \ + and m != :file \ + and m != :rough_idx \ + and m != :page + do_string(lng,lv,m) + do_case(lng,lv,hash[m]) elsif m == :title - do_hash_md(lv,hash) + do_hash_md(lng,lv,hash) else end end end end - def do_case(lv,a) + def do_case(lng,lv,a) s=' '*4 y = a.class case when y==String - do_string(lv,a) + do_string(lng,lv,a) when y==Array - do_array(lv,a) + do_array(lng,lv,a) when y==Hash - do_hash(lv,a) + do_hash(lng,lv,a) end end def cycle the_idx=@the_idx - the_idx.each do |a| - do_case(-1,a) + the_idx.keys.each do |lng| + the_idx[lng].each do |a| + do_case(lng,-1,a) + end end end self diff --git a/lib/sisu/v3/hub.rb b/lib/sisu/v3/hub.rb index 5eac0b03..7b847d4f 100644 --- a/lib/sisu/v3/hub.rb +++ b/lib/sisu/v3/hub.rb @@ -290,13 +290,13 @@ p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ end if @opt.act[:harvest] require_relative 'harvest' # harvest.rb + SiSU_Harvest::Source.new(@opt).read # -h -H html.rb elsif @opt.mod.inspect =~/--convert|--to|--from/ require_relative 'sst_convert_markup' # sst_convert_markup.rb elsif @opt.cmd =~/([AabCcDdeFfGgHhIiJjkLMmNnOoPpQqRrSsTtUuVvwWXxYyZ_0-9])/ \ and @opt.cmd =~/^-/ \ and @opt.mod.inspect !~/--(?:sitemaps|query|identify)/ \ or @opt.mod.inspect =~/--(?:(?:sq)?lite|pg(?:sql)?)/ - @@tell=SiSU_Screen::Ansi.new(@opt.cmd) @cX=SiSU_Screen::Ansi.new(@opt.cmd).cX flag=SiSU_Env::Info_processing_flag.new if @opt.cmd =~/[vVM]/ #% version information |