diff options
author | Ralph Amissah <ralph@amissah.com> | 2009-07-04 11:57:29 -0400 |
---|---|---|
committer | Ralph Amissah <ralph@amissah.com> | 2009-07-04 11:57:29 -0400 |
commit | 7372f56054259457f77c64cbdb34e736531cfc0e (patch) | |
tree | e46b3ff01bd379cfb476dc8333b397765aef9681 /lib/sisu/v1/sysenv.rb | |
parent | changelog, update (diff) |
move lib to version 1 directory, (lib/sisu/v1) and make related changes
Diffstat (limited to 'lib/sisu/v1/sysenv.rb')
-rw-r--r-- | lib/sisu/v1/sysenv.rb | 3275 |
1 files changed, 3275 insertions, 0 deletions
diff --git a/lib/sisu/v1/sysenv.rb b/lib/sisu/v1/sysenv.rb new file mode 100644 index 00000000..17f0b6be --- /dev/null +++ b/lib/sisu/v1/sysenv.rb @@ -0,0 +1,3275 @@ +# coding: utf-8 +=begin + + * Name: SiSU + + * Description: a framework for document structuring, publishing and search + + * Author: Ralph Amissah + + * Copyright: (C) 1997 - 2009 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 <http://www.gnu.org/licenses/>. + + If you have Internet connection, the latest version of the GPL should be + available at these locations: + <http://www.fsf.org/licensing/licenses/gpl.html> + <http://www.gnu.org/licenses/gpl.html> + + <http://www.jus.uio.no/sisu/gpl.fsf/toc.html> + <http://www.jus.uio.no/sisu/gpl.fsf/doc.html> + <http://www.jus.uio.no/sisu/gpl.fsf/plain.txt> + + * SiSU uses: + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + * Hompages: + <http://www.jus.uio.no/sisu> + <http://www.sisudoc.org> + + * Download: + <http://www.jus.uio.no/sisu/SiSU/download.html> + + * Ralph Amissah + <ralph@amissah.com> + <ralph.amissah@gmail.com> + + ** Description: system environment, resource control and configuration details + +=end +@@cX=nil +@@current_document=Dir.pwd #nil #'' +module SiSU_Env + require 'fileutils' + require 'singleton' + include FileUtils::Verbose + @@noyaml=false + class Info_date + require 'date' + attr_accessor :dt,:t + def initialize + @dt,@t=Date.today.to_s,Time.now + end + def week + w=@t.strftime('%W') + "#{@t.year}w#{w}" + end + def month + "#{@t.year}#{@t.month}" + end + def year + @t.year + end + def weekonly + #@t.cweek + @t.strftime('%W') + end + def monthonly + @t.month + end + def year_static + '2009' + end + end + class Info_system + require 'rbconfig' + include Singleton + @@user,@@home,@@hostname,@@pwd,@@sisu_etc,@@host,@@arch,@@rbver,@@dir_arch,@@dir_sitearch,@@dir_bin,@@locale,@@rc,@@ad=ENV['USER'],ENV['HOME'],ENV['HOSTNAME'],ENV['PWD'],Config::CONFIG['sysconfdir'] + '/sisu',Config::CONFIG['host'],Config::CONFIG['arch'],%x{ruby -v}.strip,Config::CONFIG['archdir'],Config::CONFIG['sitearchdir'],Config::CONFIG['bindir'],%x{locale charmap}.strip,nil,{} # %x{ruby -v}.strip # Config::CONFIG['rb_ver'] + out=Config::CONFIG['localstatedir'] + etc=Config::CONFIG['sysconfdir'] + '/sisu' + share=Config::CONFIG['datadir'] + '/sisu' + data=Config::CONFIG['datadir'] + '/doc/sisu' + m=/.+\/(?:src\/)?(\S+)/m # m=/.+?\/(?:src\/)?([^\/]+)$/im # m=/.+\/(\S+)/m + @stub_pwd ||=@@pwd[m,1] + prcss_dir='_sisu_processing_' + prcss_dir_tmp_root="/tmp/#{prcss_dir}" + prcss_dir_stub="#{prcss_dir}/#{@stub_pwd}" + if @@user + tmp_processing="#{prcss_dir_tmp_root}/#{@@user}/#{@stub_pwd}" + tmp_processing_individual="#{prcss_dir_tmp_root}/#{@@user}/#{@stub_pwd}" + else #error + tmp_processing=tmp_processing_individual="/tmp/#{prcss_dir_stub}" + end + tmp_processing_home=if @@home \ + and File.writable?("#{@@home}/.") + "#{@@home}/#{prcss_dir_stub}" + else prcss_dir_stub + end + processing_path=tmp_processing_individual + processing_dir=prcss_dir + user=ENV['USER'] + port_pgsql=if defined? ENV['PGPORT'] \ + and not (ENV['PGPORT'].nil? \ + or ENV['PGPORT'].empty?) \ + and ENV['PGPORT']=~/^\d+$/ + ENV['PGPORT'] + else '5432' + end + IMAGES=:images + SISU_ETC=:sisu_etc + SISU_SHARE=:sisu_share + SAMPLE_DATA_PATH=:sample_data_path + IMAGE_STUB=:image_stub + STYLESHEET_STUB=:stylesheet_stub + IMAGE_LOCAL=:image_local + WEBSERV_PATH=:webserv_path + WEBSERV_MAN=:webserv_man + WEBSERV_PHP=:webserv_php + WEBSERV_CGI=:webserv_cgi + WEBSERV_RSS=:webserv_rss + WEBSERV_SQLITE=:webserv_sqlite + OUTPUT_LOCAL=:output_local + PROCESSING_DIR=:processing_dir + PROCESSING_PATH=:processing_path + PROCESSING_DIR_TMP_ROOT=:processing_dir_tmp_root + PROCESSING_PATH_TMP_BASE=:processing_path_tmp_base + PROCESSING_DAL=:processing_dal + PROCESSING_TUNE=:processing_tune + PROCESSING_LATEX=:processing_latex + PROCESSING_TEXINFO=:processing_texinfo + PROCESSING_LOUT=:processing_lout + PROCESSING_SQLITE=:processing_sqlite + PROCESSING_POSTGRESQL=:processing_postgresql + PROCESSING_ENCODING=:processing_encoding + PAPERSIZE=:papersize + LANGUAGE=:language + LANGUAGE_CODE=:language_code + MULTILINGUAL=:multilingual + CONCORD_MAX=:concord_max + DIGEST=:digest + WEBSERV_HOST_CGI=:webserv_host_cgi + WEBSERV_PORT_CGI=:webserv_port_cgi + POSTGRESQL_USER=:postgresql_user + POSTGRESQL_PORT=:postgresql_port + SQLITE_USER=:sqlite_user + SQLITE_PATH=:sqlite_path + SQLITE_PORT=:sqlite_port + DEFAULT_DIR={ + IMAGES => '_sisu/image', + SISU_ETC => etc, + SISU_SHARE => share, + SAMPLE_DATA_PATH => data, + IMAGE_STUB => '_sisu/image', + STYLESHEET_STUB => '_sisu/css', + IMAGE_LOCAL => @@pwd + '/_sisu/image', + WEBSERV_PATH => out + '/www', + #WEBSERV_DIR => www, # uncomment for urls... + #WEBSERV_IMAGE => out + '/www/_sisu/image', + WEBSERV_MAN => out + '/www/man', #alter + WEBSERV_PHP => out + '/www/php', + WEBSERV_CGI => '/usr/lib/cgi-bin', + WEBSERV_RSS => out + '/www/feed', + WEBSERV_SQLITE => out + '/www/sqlite', + OUTPUT_LOCAL => @@home + '/sisu_www', + PROCESSING_DIR => processing_dir, + PROCESSING_PATH => processing_path, + PROCESSING_DIR_TMP_ROOT => prcss_dir_tmp_root, + PROCESSING_PATH_TMP_BASE => processing_path, + PROCESSING_DAL => 'dal', + PROCESSING_TUNE => 'tune', + PROCESSING_LATEX => 'tex', + PROCESSING_TEXINFO => 'texinfo', + PROCESSING_LOUT => 'lout', + PROCESSING_SQLITE => 'sqlite', + PROCESSING_POSTGRESQL=> 'postgresql', + PROCESSING_ENCODING => 'encoding', + #TEXINFO_STUB => 'texinfo', + PAPERSIZE => 'A4', #A4, US_letter, book_b5, book_a5, US_legal + LANGUAGE => 'English', + LANGUAGE_CODE => 'en', #change, unecessary duplication though currently used + MULTILINGUAL => true, + CONCORD_MAX => 260000, + DIGEST => 'md5', + WEBSERV_HOST_CGI => ' http://localhost', + WEBSERV_PORT_CGI => 8081, #8111,8123,8081 + POSTGRESQL_USER => @@user, #'ralph', # change user !!! + POSTGRESQL_PORT => port_pgsql, + #POSGRESQL_LINKS_PATH => '', + SQLITE_USER => @@user, + SQLITE_PATH => @@user, #?? + SQLITE_PORT => '**', + } + @@default_dir=DEFAULT_DIR + m=/.+\/(?:src\/)?(\S+)/m # m=/.+?\/(?:src\/)?([^\/]+)$/im # m=/.+\/(\S+)/m + stub_pwd=@@pwd[m,1] + @@rc_path=["#@@pwd/_sisu","#@@home/.sisu",@@sisu_etc] + @@yamlrc_path=unless stub_pwd =~/^sisupod$/ + ["#@@pwd/_sisu","#@@home/.sisu",@@sisu_etc] + else #security policy: prevent reading of sisurc.yml in sisupod + ["#@@home/.sisu",@@sisu_etc] + end + @@ad_path=unless stub_pwd =~/^sisupod$/ + ["#@@pwd/_sisu/skin/yml","#@@home/.sisu/skin/yml","#{@@sisu_etc}/skin/yml"] + else #security policy: prevent reading of sisurc.yml in sisupod + ["#@@home/.sisu",@@sisu_etc] + end + attr_accessor :user,:home,:hostname,:pwd,:host,:arch,:rbver,:dir_arch,:dir_sitearch,:dir_bin,:locale,:webserv_path,:webserv_host_cgi,:webserv_port_cgi,:default_dir,:rc_path,:yamlrc_path,:ad_path + def initialize + @user,@home,@hostname,@pwd,@sisu_etc,@host,@arch,@rbver,@dir_arch,@dir_sitearch,@dir_bin,@locale,@default_dir,@rc_path,@yamlrc_path,@ad_path=@@user,@@home,@@hostname,@@pwd,@@sisu_etc,@@host,@@arch,@@rbver,@@dir_arch,@@dir_sitearch,@@dir_bin,@@locale,@@default_dir,@@rc_path,@@yamlrc_path,@@ad_path + #note rbver is duplicated in Info_version + end + end + class Load + def initialize(prog,mandatory=false) + @prog,@mandatory=prog,mandatory + end + def prog + load_prog=false + $:.each do |reqpath| + if FileTest.exist?("#{reqpath}/#@prog.rb") + load_prog=true + break + end + end + if load_prog \ + and @prog=~/dbi/ + require 'dbi' #revisit + end + if load_prog; require @prog + else + tell=if @mandatory; SiSU_Screen::Ansi.new(@cmd,"module required: #@prog") + else SiSU_Screen::Ansi.new(@cmd,"#@prog load requested") + end + tell.warn + end + load_prog + end + def prog? + load_prog=false + $:.each do |reqpath| + if FileTest.exist?("#{reqpath}/#@prog.rb"); load_prog=true + break + end + end + load_prog + end + end + class Get_init < Info_system + include Singleton + @@noyaml=false + @@rc,@@vz,@@tx=nil,nil,nil + @@ad={ :promo=>nil,:promo_list=>nil,:flag_promo=>false } + attr_accessor :yaml + def initialize + super() + end + def skin + @@vz ||=SiSU_Viz::Skin.new + end + def tex + @@tx ||=SiSU_Viz::TeX.new + end + def yamlrc + unless @@rc + @yamlrc_path.each do |v| + if @@noyaml \ + or FileTest.exist?("#{v}/noyaml") + puts "WARNING - YAML loading switched off, to enable delete the file:\n\t#{v}/noyaml\n\n" unless @@noyaml + @@noyaml=true + break + else + if FileTest.exist?("#{v}/sisurc.yml") + unless @@rc + require 'yaml' + @@rc ||= YAML::load(File::open("#{v}/sisurc.yml")) + end + break + end + unless @@rc + if FileTest.exist?("#{v}/sisurc.yaml") + unless @@rc + require 'yaml' + @@rc ||= YAML::load(File::open("#{v}/sisurc.yaml")) + end + break + end + end + end + end + end + @@rc + end + def ads #WORK AREA + tell_no_yaml='WARNING - YAML loading switched off, to enable delete the file:' + @ad_path.each do |v| + if @@noyaml \ + or FileTest.exist?("#{v}/noyaml") + puts tell_no_yaml + "\n\t#{v}/noyaml\n" unless @@noyaml + @@noyaml=true + break + else + #tell=SiSU_Screen::Ansi.new('','promo off (file not found): list.yml') + if FileTest.exist?("#{v}/list.yml") + unless @@ad[:promo_list] + require 'yaml' + @@ad[:promo_list] ||= YAML::load(File::open("#{v}/list.yml")) + end + @@ad[:flag_promo]=true + break + end + #tell.warn if @cmd=~/MV/ + @@ad[:flag_promo]=false + end + end + @ad_path.each do |v| + if @@noyaml \ + or FileTest.exist?("#{v}/noyaml") + puts tell_no_yaml + "\n\t#{v}/noyaml\n" unless @@noyaml + @@noyaml=true + break + else + #tell=SiSU_Screen::Ansi.new('','promo off (file not found): promo.yml') + if FileTest.exist?("#{v}/promo.yml") + unless @@ad[:promo] + require 'yaml' + @@ad[:promo] ||= YAML::load(File::open("#{v}/promo.yml")) + end + @@ad[:flag_promo]=true + break + end + #tell.warn if @cmd=~/MV/ + @@ad[:flag_promo]=false + end + end + @@ad + end + end + class Env_call + @@rc,@@fns,@@fnn,@@fnb,@@fnt,@@flv,@@fnz=nil,nil,nil,nil,nil,nil,nil + @@ad={} + attr_accessor :rc,:fnn,:fnb,:fnt,:fnv,:fnz,:ad + def initialize(fns='') + super() + @fns=fns + @sys=Info_system.instance + @rc=Get_init.instance.yamlrc + @ad=Get_init.instance.ads + if @fns \ + and @fns != '' \ + and @fns !=@@fns + @@fns,@@fnn,@@fnb,@@fnt,@@flv,@@fnz=@fns,nil,nil,nil,nil,nil + end + if @fns \ + and @fns != '' #watch + if multilingual + m=/((.+?)(?:\~\w{2,3})?)\.((?:-|ssm\.)?sst|ssm)$/ + @@fnn ||=@fns[m,1] + @@fnb ||=@fns[m,2] + @@fnt ||=@fns[m,3] + @@flv ||=document_language_versions_found[:f] + unless @@fns =~/\S+?\.zip/ + @@fnz ||=if @@fns =~/(?:\~\S{2,3})?\.(?:ssm\.sst|ssm)$/; @@fnb + '.ssm.zip' + elsif @@fnb; @@fnb + '.sst.zip' + else '' # e.g. termsheet + end + end + else m=/(.+?)\.((?:-|ssm\.)?sst|ssm)$/ + @@fnb ||=@fns[m,1] + @@fnm ||=@fns[m,1] + @@fnt ||=@fns[m,2] + unless @@fns =~/\S+?\.zip/ + @@fnz ||=if @@fns =~/(?:\~\S{2,3})?\.(?:ssm\.sst|ssm)$/; @@fnb + '.ssm.zip' + else @@fnb + '.sst.zip' + end + end + end + end + @fnn,@fnb,@fnt,@flv,@fnz=@@fnn,@@fnb,@@fnt,@@flv,@@fnz + end + def multilingual + if defined? @rc['default']['multilingual'] \ + and @rc['default']['multilingual'] != nil + @rc['default']['multilingual'] + else true + end + end + def document_language_versions_found + @fn={} + unless (@fns.nil? \ + or @fns.empty?) + if multilingual + m=/((.+?)(?:\~\w{2,3})?)\.((?:-|ssm\.)?sst$)/ + @fn[:b],@fn[:m],@fn[:t]=@fns[m,1],@fns[m,2],@fns[m,3] + else m=/(.+?)\.((?:-|ssm\.)?sst$)/ + @fn[:b]=@fn[:m]=@fns[m,1] + @fn[:t]=@fns[m,2] + end + end + lang=SiSU_Env::Standardise_language.new + langs=lang.codes + x=[] + if FileTest.file?("#{@fn[:m]}.#{@fn[:t]}"); x << "#{@fn[:m]}.#{@fn[:t]}" + end + x << @fns + langs.each do |l| + lng=SiSU_Env::Standardise_language.new(l) + if FileTest.file?("#{@fn[:m]}~#{lng.code}.#{@fn[:t]}") + x << "#{@fn[:m]}~#{lng.code}.#{@fn[:t]}" + elsif FileTest.file?("#{@fn[:m]}~#{lng.name}.#{@fn[:t]}") + x << "#{@fn[:m]}~#{lng.name}.#{@fn[:t]}" + end + end + @fn[:f]=x.uniq! + @fn + end + def published_manifests?(output_base) + ob=output_base + @fn={} + @m=[] + unless (@fns.nil? \ + or @fns.empty?) + if multilingual + m=/((.+?)(?:\~\w{2,3})?)\.((?:-|ssm\.)?sst$)/ + @fn[:b],@fn[:m],@fn[:t]=@fns[m,1],@fns[m,2],@fns[m,3] + #@fl[:v]=@env.document_language_versions_found + else m=/(.+?)\.((?:-|ssm\.)?sst$)/ + @fn[:b]=@fn[:m]=@fns[m,1] + @fn[:t]=@fns[m,2] + end + end + lang=SiSU_Env::Standardise_language.new + langs=lang.codes + x=[] + if FileTest.file?("#{@fn[:m]}.#{@fn[:t]}"); x << "#{@fn[:m]}.#{@fn[:t]}" + end + dir=SiSU_Env::Info_env.new(@fns) + @m << {:m => 'sisu_manifest.html', :l => 'English' } #fix later, default language + langs.each do |l| + lng=SiSU_Env::Standardise_language.new(l) + fns_c="#{@fn[:m]}~#{lng.code}.#{@fn[:t]}" + fns_l="#{@fn[:m]}~#{lng.name}.#{@fn[:t]}" + if FileTest.file?(fns_c) + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(fns_c) + lng=fn_set_lang[:l] + fn=SiSU_Env::Env_call.new(fns_c).lang(fn_set_lang[:c]) + @m << {:m => fn[:manifest], :l => lng } + elsif FileTest.file?(fns_l) + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(fns_l) + @fnl=dir.i18n.lang_filename(fn_set_lang[:c]) + fn=SiSU_Env::Env_call.new(fns_l).lang(fn_set_lang[:c]) + @m << {:m => fn[:manifest], :l => lng } + end + end + @m.uniq! + @m + end + def filename(code,name,suffix) + d=SiSU_Env::Info_env.new(@fns) + fnl=d.i18n.lang_filename(code) + if code + "#{fnl[:pre]}#{name}#{fnl[:mid]}#{suffix}#{fnl[:post]}" + else "#{name}#{suffix}" + end + end + def lang(code) + @fn={ + :html => filename(code,'','.html'), + :concordance => filename(code,'concordance','.html'), + :sax => filename(code,'sax','.xml'), + :dom => filename(code,'dom','.xml'), + :docbook => filename(code,'docbook','.xml'), + :xhtml => filename(code,'scroll','.xhtml'), + :pdf_l => filename(code,'landscape','.pdf'), + :pdf_p => filename(code,'portrait','.pdf'), + :pdf_l_a4 => filename(code,'landscape.a4','.pdf'), + :pdf_p_a4 => filename(code,'portrait.a4','.pdf'), + :pdf_l_a5 => filename(code,'landscape.a5','.pdf'), + :pdf_p_a5 => filename(code,'portrait.a5','.pdf'), + :pdf_l_b5 => filename(code,'landscape.b5','.pdf'), + :pdf_p_b5 => filename(code,'portrait.b5','.pdf'), + :pdf_l_letter => filename(code,'landscape.letter','.pdf'), + :pdf_p_letter => filename(code,'portrait.letter','.pdf'), + :pdf_l_legal => filename(code,'landscape.legal','.pdf'), + :pdf_p_legal => filename(code,'portrait.legal','.pdf'), + :toc => filename(code,'toc','.html'), + :doc => filename(code,'doc','.html'), + :index => filename(code,'index','.html'), + :odf => filename(code,'opendocument','.odt'), + :plain => filename(code,'plain','.txt'), + :manpage => filename(code,@fnb,'.1'), + :wiki => filename(code,'wiki','.txt'), + :digest => filename(code,'digest','.txt'), + :metadata => filename(code,'metadata','.html'), #chk + :manifest => filename(code,'sisu_manifest','.html'), + :oai_pmh => filename(code,'oai_pmh','.xml'), + :sitemap => filename(code,'sitemap','.xml'), + :sitemap_touch => filename(code,"sitemap_#@fnb",'.xml'), + :sxs => filename(code,@fnb,'.sxs.xml'), + :sxd => filename(code,@fnb,'.sxd.xml'), + :sxn => filename(code,@fnb,'.sxn.xml'), + :sisupod => filename(nil,@fnz,''), + :book_idx_html => filename(code,'book_index','.html'), + } + @fn + end + end + class System_call + @@locale_flag=false + def initialize(input='',output='',cmd='') + @input,@output,@cmd=input,output,cmd + @prog=SiSU_Env::Info_program.new + @sys=Info_system.instance + end + def program_found?(program) + found=`whereis #{program}` + state=if found =~/bin\/#{program}\b/; true + else false + end + end + def locale #locales utf8 or other + unless @@locale_flag + @@locale_flag=true + puts @sys.locale #unless @cmd =~/q/ # locale info UTF8 etc. KEEP + end + @sys.locale + end + def file_encoding(filename,cmd='') #file encoding + program='file' + fnsp=Info_env.new(filename).source_file_with_path + if program_found?(program) + encoding=%x{file -L #{fnsp}}.strip + encoding.gsub!(/#{fnsp}:(\s+|$)/,'') + encoding=if encoding \ + and not encoding.empty? + encoding + else 'UTF-8 assumed, encoding undetermined' + end + puts encoding if cmd =~/[VM]/ + encoding + else encoding='UTF-8 assumed, file encoding check program unavailable' + end + end + def wc #word count + program='wc' + if program_found?(program) \ + and locale !~/utf-?8/i + true + else + program_ref="(not available)" unless program_found?(program) + program_ref="(UTF-8)" if locale =~/utf-?8/i + #puts "\tWARN: #{program}\n\t\t using alternative to word count program #{program_ref}" + false + end + end + def rcs #rcs for document markup data + program='rcs' + program_ref="\n\t\tdocument version information requested" + if program_found?(program); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def cvs #cvs for document markup data + program='cvs' + program_ref="\n\t\tdocument version information requested" + if program_found?(program); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def openssl #openssl for digests + program='openssl' + program_ref="\n\t\tused to generate requested source document identification digest" + if program_found?(program); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def md5(filename) #md5 dgst + program='openssl' + program_ref="\n\t\tmd5 digest requested" + if program_found?(program) + pwd=Dir.pwd + Dir.chdir(File.dirname(filename)) + dgst=%x{openssl dgst -md5 #{File.basename(filename)}}.strip #use file name without file path + Dir.chdir(pwd) + dgst.scan(/\S+/) + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def sha256(filename) #sha dgst + program='openssl' + program_ref="\n\t\tsha digest requested" + if program_found?(program) + Dir.chdir(File.dirname(filename)) + dgst=%x{openssl dgst -sha256 #{File.basename(filename)}}.strip #use file name without file path + Dir.chdir(pwd) + dgst.scan(/\S+/) + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def psql #psql + program='psql' + program_ref="\n\t\tpsql requested" + if program_found?(program); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def create_pg_db(dbname_stub=nil) #createdb + unless dbname_stub + @pwd ||=Dir.pwd + m=/.+\/(?:src\/)?(\S+)/im # m=/.+?\/(?:src\/)?([^\/]+)$/im # m=/.+\/(\S+)/m + dbname_stub=@pwd[m,1] + end + program='createdb' + program_ref="\n\t\tcreatedb dbname SiSU_#{dbname_stub} #for postgresql database creation" + if program_found?(program); system("createdb SiSU_#{dbname_stub}") + else puts "\tWARN: #{program} is not available #{program_ref}" #if @cmd =~/v/ + end + end + def relaxng(cmd='') #trang - convert between different schema languages for XML + program='trang' + program_ref="\n\t\tsee http://www.thaiopensource.com/relaxng/trang.html" + if program_found?(program); system("trang #@input #@output") + else puts "\tWARN: #{program} is not installed #{program_ref}" if cmd =~/V/ + end + end + def rmagick #rmagick is a ruby library + program='identify' + program_ref="\n\t\tsee http://www.imagemagick.org/" + if program_found?(program); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def well_formed? #tidy - check for well formed xml xhtml etc. + program=@prog.tidy + program_ref="\n\t\tsee http://tidy.sourceforge.net/" + if program_found?(program); system("#{@prog.tidy} -xml #@input > #@output") + else puts "\tWARN: #{program} is not installed #{program_ref}" + end + end + def tex2pdf_engine + prog=['xetex','xelatex','pdflatex','pdfetex','pdftex'] + @pdfetex_flag=false + @cmd ||='' + @texpdf=nil + prog.each do |program| + if program_found?(program) + @texpdf=program if program =~/xetex|xelatex|pdftex|pdflatex/ + @pdfetex_flag=true + break + end + end + @texpdf + end + def latex2pdf(md,papersize='a4') #convert from latex to pdf + tell=((@cmd =~/[MVv]/) ? '' : '> /dev/null' ) + mode='batchmode' + #mode='nonstopmode' + program_ref="\n\t\tSee http://www.tug.org/applications/pdftex/\n\t\tOn Debian this is is included in tetex-extra" + texpdf=tex2pdf_engine + if @pdfetex_flag; + texpdf_cmd=case texpdf + when /xetex/ + if @input =~/landscape\.tex$/ + %{#{texpdf} -interaction=#{mode} -fmt=xelatex -papersize="#{papersize} -l" #@input #{tell}\n} + else + %{#{texpdf} -interaction=#{mode} -fmt=xelatex -papersize="#{papersize}" #@input #{tell}\n} + end + when /xelatex/ + if @input =~/landscape\.tex$/ + %{#{texpdf} -interaction=#{mode} -papersize="#{papersize} -l" #@input #{tell}\n} + else + %{#{texpdf} -interaction=#{mode} -papersize="#{papersize}" #@input #{tell}\n} + end + when /pdftex/; "#{texpdf} -interaction=#{mode} -fmt=pdflatex #@input #{tell}\n" + when /pdflatex/; "#{texpdf} -interaction=#{mode} #@input #{tell}\n" + end + system(texpdf_cmd) + else puts "\tWARN: none of the following programs are installed: #{program[0]}, #{program[1]}, #{program[2]} is installed. #{program_ref}" + end + end + def makeinfo #texinfo + program='makeinfo' + program_ref="\n\t\tsee http://www.gnu.org/software/texinfo/" + if program_found?(program); system("#{program} #@input\n") + else puts "\tWARN: #{program} is not installed #{program_ref}" + end + end + def scp + program='scp' + puts "scp -Cr #@input #@output" if @cmd =~/[vVM]/ + if program_found?(program); system("scp -Cr #@input #@output") + else puts "\tWARN: #{program} not found" + end + end + def rsync(action='') + program='rsync' + if program_found?(program) + vb=if @cmd =~/q/; 'q' + elsif @cmd =~/v/; 'v' + else '' + end + msg='' + msg=" && echo 'OK: #@input -> #@output'" unless @cmd =~/q/ + puts "rsync -az#{vb} #{action} #@input #@output" if @cmd =~/[vVM]/ + system("rsync -az#{vb} #{action} #@input #@output #{msg}") + else puts "\tWARN: #{program} not found" + end + end + def rm + if @cmd =~/^-Z[mMvVq]*$/; rm_rf(@input) + elsif @cmd =~/V/; rm(@input) + elsif @cmd !~/q/; rm(@input) + elsif @cmd =~/q/; rm(@input) + #elsif @cmd =~/q/; system("rm #{action} #@input") + else puts "\tWARN: operation ignored" + end + end + end + class Standardise_language + def initialize(l='') + @language=l + if @language.empty? + @language=Info_env.new.defaults[:language] + end + end + def language #use ISO_639-2 + lang={} + case @language + when /American|^us$/i; d,c,l=false,'en','American English' #depreciated, see iso 639-2 + when /English|^en$/i; d,c,l=false,'en','English' + when /French|Francais|^fr$/i; d,c,l=false,'fr','French' + when /German|^de$/i; d,c,l=false,'de','German' + when /Italian|^it$/i; d,c,l=false,'it','Italian' + when /Spanish|Espanol|^es$/i; d,c,l=false,'es','Spanish' + when /Brazilian(?: Portuguese)?|^br$/i; d,c,l=false,'pt','Brazilian Portuguese' #depreciated, see iso 639-2 + when /Portuguese|^pt$/i; d,c,l=false,'pt','Portuguese' + when /Swedish|Svensk|^sv$/i; d,c,l=false,'sv','Swedish' + when /Danish|Dansk|^da$/i; d,c,l=false,'da','Danish' + when /Finnish|Finsk|Suomi|^fi$/i; d,c,l=false,'fi','Finnish' + when /Norwegian|Norsk|^no$/i; d,c,l=false,'no','Norwegian' + when /Icelandic|^is$/i; d,c,l=false,'is','Icelandic' + when /Dutch|^nl$/i; d,c,l=false,'nl','Dutch' + when /Estonian|^et$/i; d,c,l=false,'et','Estonian' + when /Hungarian|^hu$/i; d,c,l=false,'hu','Hungarian' + when /Polish|^pl$/i; d,c,l=false,'pl','Polish' + when /Romanian|^ro$/i; d,c,l=false,'ro','Romanian' + when /Russian|^ru$/i; d,c,l=false,'ru','Russian' + when /Greek|^el$/i; d,c,l=false,'el','Greek' + when /Ukranian|^uk$/i; d,c,l=false,'uk','Ukranian' + when /Turkish|^tr$/i; d,c,l=false,'tr','Turkish' + #when /Serbian/i; d,c,l=false,'', 'Serbian' + #when /Welsh/i; d,c,l=false,'', 'Welsh' + #when /Basque/i; d,c,l=false,'', 'Basque' + #when /Breton/i; d,c,l=false,'', 'Breton' + #when /Catalan/i; d,c,l=false,'', 'Catalan' + #when /Galician/i; d,c,l=false,'', 'Galician' + #when /Saa?mi/i; d,c,l=false,'', 'Saami' + #when /Hebrew/i; d,c,l=false,'', 'Hebrew' + #when /Latin/i; d,c,l=false,'', 'Latin' + #when /Esperanto/i; d,c,l=false,'', 'Esperanto' + when /Slovenian|^sl$/i; d,c,l=false,'sl','Slovenian' + when /Croatian|^hr$/i; d,c,l=false,'hr','Croatian' + when /Slovak(?:ian)?|^sk$/i; d,c,l=false,'sk','Slovakian' + when /Czech|^cs$/i; d,c,l=false,'cs','Czech' + when /Bulgarian|^bg$/i; d,c,l=false,'bg','Bulgarian' + else d,c,l=true,'en','English (default)' + #else d,c,l=true,'xx','Default' + end + lang[:d],lang[:c],lang[:l]=d,c,l + lang + end + def name + language[:l].downcase + end + def title + language[:l] + end + def code + language[:c] + end + def file_to_language(file) + m=/.+?\~(\w{2,3})\.(?:-|ssm\.)?sst$/ + @language=if file =~m ; file[m,1] + else '' + end + language + end + def codes + codes=['us','en','fr','de','it','es','br','pt','sv','da','fi','no','is','nl','et','hu','pl','ro','ru','el','uk','tr','sk','hr','sl','cs','bg'] # remove us and br see iso-639-2 + end + end + class Info_env < Env_call + require 'fileutils' + include FileUtils + attr_accessor :filename,:sys,:home,:hostname,:user,:env,:rc,:www,:fnb,:fnn,:fnt,:flv,:webserv_path,:stub_pwd,:stub_src,:webserv_host_cgi,:webserv_port_cgi,:processing,:etc,:yamlrc_dir + @@image_flag,@@local_image=true,true #warning on @@image_flag + @@fb=@@man_path=nil,nil + def initialize(fns='',md=nil) + super() #you may not want to re-execute this static info so frequently! + @fns,@md=fns,md + @env=Env_call.new(fns) if fns + fnb=if @md \ + and defined? @md.fnb + @md.fnb + elsif defined? @env.fnb \ + and @env.fnb + @env.fnb + elsif not @fns.nil? \ + and not @fns.empty? + m=/(.+)?\.(?:(?:-|ssm\.)?sst|ssm)$/m + @fns[m,1] if not @fns.empty? + end + if fnb; @@fb ||=fnb + end + @sys=Info_system.instance + @fnb ||=@@fb #clean up this... used primarily for zap which is not passed normal parameters + @fixed_websev_root='' # @home + @pwd=@@pwd||=Dir.pwd + m=/.+\/(?:src\/)?(\S+)/m # m=/.+?\/(?:src\/)?([^\/]+)$/im # m=/.+\/(\S+)/m + @stub_pwd=@@pwd[m,1] + @stub_src=@stub_pwd + '/src' + @stub_pod=@stub_pwd + '/pod' + @stub_md=@stub_pwd + '/sisu_site_metadata' + end + def user + @sys.user + end + def hostname + @sys.hostname + end + def host + @sys.host + end + def arch + @sys.arch + end + def rbver + @sys.rbver + end + def locale + @sys.locale + end + def concord_max + concord_max=if defined? @rc['processing']['concord_max'] \ + and @rc['processing']['concord_max'] + @rc['processing']['concord_max'] + else defaults[:concord_max] + end + end + def current_document + @@current_document||=Dir.pwd + @@current_document + end + def stub_pwd #200412 + @stub_pwd + end + def stub_md_harvest + @stub_md + end + def stub_src + @stub_src + end + def stub_pod + @stub_pod + end + def sisupod + #path.processing + # sisupod + # sisu + # content.sst [file content] + # filename.sst [link to content.sst] + # _sisu + # conf + # skin/ + # doc [relevant skin if any other than default] + # image [all images for specific document gathered here] + sisupod_processing_path="#{path.processing}/sisupod" + if FileTest.directory?(sisupod_processing_path) \ + or FileTest.file?(sisupod_processing_path) + rm_rf(sisupod_processing_path) + end + paths=[] + paths=["#{path.processing}/sisupod/_sisu/skin/doc","#{path.processing}/sisupod/_sisu/skin/dir","#{path.processing}/sisupod/_sisu/skin/site","#{path.processing}/sisupod/_sisu/image"] + paths.each {|x| mkdir_p(x) unless FileTest.directory?(x) } + end + def defaults #multiple default directories + @default_dir ||=@sys.default_dir #DEFAULT_DIR + end + #def skin + # @@vz ||=SiSU_Viz::Skin.new + #end + def widget #needs (md) #move + @rc=SiSU_Env::Get_init.instance.yamlrc + @ad=SiSU_Env::Get_init.instance.ads + @vz=SiSU_Env::Get_init.instance.skin + @flag={ :ad=>false,:md=>false,:sk=>false,:rc=>false } + def promo? + @flag[:ad]=if @md.flag_promo && @ad[:flag_promo] + @flag[:md]=true + true + elsif defined? @vz.widget_promo \ + and not @vz.widget_promo.nil? \ + and @vz.widget_promo.class == Array \ + and @vz.widget_promo.length > 0 + @flag[:sk]=true + true + elsif defined? @rc['promo'] \ + and not @rc['promo'].nil? \ + and @rc['promo'].length > 0 + @flag[:rc]=true + true + else + false + end + @flag + end + def search? + searches=['sisu','hyperestraier'] + flag=false + if defined? @rc['search'] + searches.each do |type| + flag=if defined? @rc['search'][type] \ + and defined? @rc['search'][type]['action'] \ + and @rc['search'][type]['flag']==true \ + and @rc['search'][type]['action'] =~/https?:\/\// + flag=if promo?[:ad] + false + elsif defined? @vz.widget_search \ + and @vz.widget_search == true + true + elsif defined? @rc['search'][type]['flag'] \ + and @rc['search'][type]['flag'] == true + true + else false + end + else false + end + end + else false + end + #flag=true + flag + end + def search_fixed? + searches=['sisu','hyperestraier'] + flag=if defined? @rc['search'] + searches.each do |type| + if defined? @rc['search'][type] \ + and defined? @rc['search'][type]['action'] \ + and @rc['search'][type]['action'] =~/https?:\/\// \ + and defined? @rc['search'][type]['db'] \ + and @rc['search'][type]['db'] =~/\S+/ + flag=if promo?[:ad] + false + elsif defined? @vz.widget_search \ + and @vz.widget_search == true + true + elsif defined? @rc['search'][type]['flag'] \ + and @rc['search'][type]['flag'] == true + true + else false + end + else false + end + end + else false + end + end + def search_form(type='sisusearch',action=nil,db=nil,table=false) + rc=SiSU_Env::Get_init.instance.yamlrc + create_form_hyperestraier=if defined? rc['search']['sisu']['flag'] \ + and rc['search']['sisu']['flag']==true \ + and action \ + and action =~/https?:\/\// + true + else false + end + create_form_sisu=if action \ + and db \ + and action =~/https?:\/\// \ + and db =~/\S+/ + true + elsif widget.search? + db=if rc['search']['sisu']['flag']==true \ + and rc['search']['sisu']['db']=~/\S+/ + rc['search']['sisu']['db']=~/^SiSU_\S+/ \ + ? rc['search']['sisu']['db'] \ + : "SiSU_#{rc['search']['sisu']['db']}" + else nil + end + action=rc['search']['sisu']['action'] + true + else false + end + if table + table_open='<td align="center" bgcolor="#ffffff">' + table_close='</td>' + else + table_open='' + table_close='<br />' + end + form=if create_form_sisu \ + and type=~/sisusearch/ \ + and defined? rc['search']['sisu'] \ + and defined? rc['search']['sisu']['action'] + <<WOK +<!-- SiSU Search --> +#{table_open} +<a name="search"></a> +<form method="get" action="#{rc['search']['sisu']['action']}" target="_top"> +<font size="2"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="hidden" name="ltd" value="1000" /> +<input type="hidden" name="off" value="0" /> +<input type="radio" name="view" value="index" checked="checked" /> idx +<input type="radio" name="view" value="text" /> txt +<input type="submit" name="ignore" value="search" /> +<input type="checkbox" name="fns" value="#{@md.fnb}" /> +</font></form> +#{table_close} +<!-- SiSU Search --> +WOK + elsif create_form_hyperestraier \ + and type=~/hyperestraier/ \ + and defined? rc['search']['hyperestraier'] + <<WOK +<!-- SiSU Search using Hyperestraier --> +#{table_open} +<a name="search"></a> +<form method="get" action="#{rc['search']['hyperestraier']['action']}" target="_top"> +<font size="2"> +<input type="text" name="phrase" value="" size="24" maxlength="255" /> +<br /> +<input type="submit" value="search" /> +<input type="hidden" name="enc" value="UTF-8" /> +<font size="2"> +<a href="#{rc['search']['hyperestraier']['action']}">hyperestraier search</a> +</font></form> +#{table_close} +<!-- SiSU Search using Hyperestraier --> +WOK + else '' + end + form + end + def search_form_static(action=nil,db=nil) + rc=SiSU_Env::Get_init.instance.yamlrc + create_form=if rc['search']['sisu']['flag']==true \ + and action \ + and db \ + and action =~/https?:\/\// \ + and db =~/\S+/ + true + elsif widget.search_fixed? + db=if rc['search']['sisu']['flag']==true \ + and rc['search']['sisu']['db']=~/\S+/ + rc['search']['sisu']['db']=~/^SiSU_\S+/ \ + ? rc['search']['sisu']['db'] \ + : "SiSU_#{rc['search']['sisu']['db']}" + else nil + end + action=rc['search']['sisu']['action'] + true + else false + end + if create_form + %{<td align="center" bgcolor="#ffffff"> +<!-- SiSU Search --> +<a name="search"></a> +<form method="get" action="#{rc['search']['sisu']['action']}" target="_top"> +<font size="2"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="hidden" name="ltd" value="1000" /> +<input type="hidden" name="off" value="0" /> +<input type="radio" name="view" value="index" checked="checked" /> idx +<input type="radio" name="view" value="text" /> txt +<input type="submit" name="ignore" value="search" /> +<input type="checkbox" name="fns" value="#{@md.fnb}" /> +</font> +</form> +<!-- SiSU Search --> +</td> } + else '' + end + end + def search_action + action=if search? + else '' + end + end + self + end + def widget_static + @rc=SiSU_Env::Get_init.instance.yamlrc + @vz=SiSU_Env::Get_init.instance.skin + @flag={ :ad=>false,:md=>false,:sk=>false,:rc=>false } + def search? + flag=if defined? @rc['search'] \ + and defined? @rc['search']['sisu'] \ + and defined? @rc['search']['sisu']['action'] \ + and @rc['search']['sisu']['action'] =~/https?:\/\// \ + and defined? @rc['search']['sisu']['db'] \ + and @rc['search']['sisu']['db'] =~/\S+/ \ + and defined? @rc['search']['sisu']['db'] \ + and @rc['search']['sisu']['db'] =~/\S+/ + flag=if defined? @vz.widget_search \ + and @vz.widget_search == true + true + elsif defined? @rc['search']['sisu']['flag'] \ + and @rc['search']['sisu']['flag'] == true + true + else + false + end + else + false + end + end + def search_fixed? + flag=if defined? @rc['search'] \ + and defined? @rc['search']['sisu'] \ + and defined? @rc['search']['sisu']['action'] \ + and @rc['search']['sisu']['action'] =~/https?:\/\// \ + and defined? @rc['search']['sisu']['db'] \ + and @rc['search']['sisu']['db'] =~/\S+/ \ + and defined? @rc['search']['sisu']['db'] \ + and @rc['search']['sisu']['db'] =~/\S+/ + flag=if defined? @vz.widget_search \ + and @vz.widget_search == true + true + elsif defined? @rc['search']['sisu']['flag'] \ + and @rc['search']['sisu']['flag'] == true + true + else + false + end + else + false + end + end + def search_form(action=nil,db=nil) + rc=SiSU_Env::Get_init.instance.yamlrc + create_form=if defined? rc['search']['sisu']['flag'] \ + and rc['search']['sisu']['flag']==true \ + and action \ + and db \ + and action =~/https?:\/\// \ + and db =~/\S+/ + true + elsif widget_static.search? \ + and rc['search']['sisu']['flag']==true + db=if rc['search']['sisu']['db']=~/\S+/ + rc['search']['sisu']['db']=~/^SiSU_\S+/ ? rc['search']['sisu']['db'] : "SiSU_#{rc['search']['sisu']['db']}" + else nil + end + action=rc['search']['sisu']['action'] + true + else false + end + if create_form \ + and @fnb \ + and @fnb=~/\S+/ + %{<!-- SiSU Search --> +<a name="search"></a> +<form method="get" action="#{rc['search']['sisu']['action']}" target="_top"> +<font size="2"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="hidden" name="fns" value="#@fnb" /> +<input type="radio" name="view" value="index" /> idx +<input type="radio" name="view" value="text" checked="checked" /> txt +<input type="submit" name="ignore" value="search" /> +</font> +</form> +<!-- SiSU Search --> } + elsif create_form + %{<!-- SiSU Search --> +<a name="search"></a> +<form method="get" action="#{rc['search']['sisu']['action']}" target="_top"> +<font size="2"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="radio" name="view" value="index" checked="checked" /> idx +<input type="radio" name="view" value="text" /> txt +<input type="submit" /> +</font> +</form> +<!-- SiSU Search --> } + else '' + end + end + def search_action + action=if search? + else '' + end + end + self + end + def source_file_path + file=@fns.gsub(/\.ssm(?:\.sst)?/,'.ssm.sst') + pth=unless file =~/\.ssm\.sst$/; "#{Dir.pwd}" + else "#{path.composite_file}" + end + end + def source_file_with_path + file=@fns.gsub(/\.ssm(?:\.sst)?/,'.ssm.sst') + "#{source_file_path}/#{file}" + end + def read_source_file(fns) + fns_array=if RUBY_VERSION < '1.9' + x=unless fns =~/\.ssm.sst$/ + IO.readlines(fns,'') + else IO.readlines("#{path.composite_file}/#{fns}",'') + end + else #ruby version >= '1.9' + x=unless fns =~/\.ssm.sst$/ + IO.readlines(fns,'r:utf-8') + else IO.readlines("#{path.composite_file}/#{fns}",'r:utf-8') + end + end + end + def path #dir + def home + @sys.home + end + def pwd + @sys.pwd + end + def stub_pwd + @stub_pwd + end + def stub_src + @stub_src + end + def stub_pod + @stub_pod + end + def stub_md_harvest + @stub_md + end + def etc + defaults[:sisu_etc] #live/dynamic + # @sys.sisu_etc #broken: live/dynamic + # defaults[:sisu_etc] #live/dynamic + end + def arch + @sys.dir_arch + end + def sitearch + @sys.dir_sitearch + end + def bin + @sys.dir_bin + end + def share #shared data repository source directory + defaults[:sisu_share] + end + def style + defaults[:stylesheet_stub] + end + def sample_data #sample data repository source directory + defaults[:sample_data_path] + end + def rc + @sys.rc_path + end + def yamlrc + rc.each do |v| + if FileTest.exist?("#{v}/sisurc.yml") + @yamlrc_dir="#{v}/sisurc.yml" + break + end + end + unless @yamlrc_dir + rc.each do |v| + if FileTest.exist?("#{v}/sisurc.yaml") + @yamlrc_dir="#{v}/sisurc.yaml" + break + end + end + end + @yamlrc_dir + end + def man #check use + if defined? @rc['webserv']['man']; "#{webserv}/#{@rc['webserv']['man']}" + else defaults[:webserv_man] + end + end + def webserv_path #testing, check need, remove + webserv + end + def webserv #separation required for webrick which cannot use path.output (different requirements as no file is passed) + man_path=if @@man_path.nil? + man_path=if defined? @rc['webserv']['path'] \ + and @rc['webserv']['path'] =~/\S\S+/ + man_path=@@man_path=File.expand_path(@rc['webserv']['path']) + else nil + end + else manpath=@@man_path + end + @webserv_path=if defined? man_path \ + and File.writable?("#{man_path}/.") + man_path #web server path as configured in rc file + elsif FileTest.directory?(defaults[:webserv_path]) \ + and File.writable?("#{defaults[:webserv_path]}/.") #web server path default + defaults[:webserv_path] + else #create default directory under home and place output there + unless FileTest.directory?(defaults[:output_local]) + mkdir_p(defaults[:output_local]) + end + defaults[:output_local] + end + end + def webserv_stub_ensure + mkdir_p(path.webserv) unless FileTest.directory?(path.webserv) + mkdir_p("#{path.webserv}/#@stub_pwd") unless FileTest.directory?("#{path.webserv}/#@stub_pwd") + end + def webserv_map_pwd #dir + "#{path.webserv}/#{stub_pwd}" + end + def webserv_dir #fixed/hard path to /www web/presentation directory, on Debian /var/www subdirectories are created within it, depending on markup directory stub-name (last segment of markup directory name) + defaults[:webserv_dir] + end + def webserv_image #web/presentation directory, subdirectories are created within it, depending on markup directory stub-name (last segment of markup directory name) + images=if defined? @rc['webserv']['images'] + @rc['webserv']['images'] + else defaults[:images] + end + "#{path.webserv}/#{images}" + end + def output #web/webserv output directory... subdirectory into which further subdirectories are made based on file names + "#{path.webserv}/#@stub_pwd" + end + def output_src + "#{path.output}/src" + end + def output_md_harvest + "#{path.output}/sisu_site_metadata" + end + def output_pod + "#{path.output}/pod" + end + def output_harvest + "#{path.output}/sisu_site_metadata" + end + def manpage + "#{path.output}/man" + end + def sitemaps + "#{path.output}/sitemaps" + end + def encoding + pth="#{processing}/#{defaults[:processing_encoding]}" + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def processing_base_tmp + defaults[:processing_path_tmp_base] + end + def processing_dir_tmp_root + defaults[:processing_dir_tmp_root] + end + def processing_path_root + proposed_path_base=if defined? @rc['processing']['path'] \ + and not @rc['processing']['path'].nil? \ + and not @rc['processing']['path'].empty? + x=if @rc['processing']['path'] =~/^(?:~|home)$/ + home #fix + else @rc['processing']['path'] + end + else nil + end + proposed_dir=if defined? @rc['processing']['dir'] \ + and not @rc['processing']['dir'].nil? \ + and not @rc['processing']['dir'].empty? + @rc['processing']['dir'] + else defaults[:processing_dir] + end + path=if proposed_path_base \ + and FileTest.directory?(proposed_path_base) \ + and File.writable?("#{proposed_path_base}/.") + x=if proposed_dir + "#{proposed_path_base}/#{proposed_dir}" + else + "#{proposed_path_base}/#{defaults[:processing_dir]}" + end + else defaults[:processing_dir_tmp_root] + end + end + def processing_path_usr? + case processing_path_root + when /^\/home/; false + else true + end + end + def processing_path + if processing_path_usr? + "#{processing_path_root}/#{user}/#{stub_pwd}" + else + "#{processing_path_root}/#{stub_pwd}" # see defaults[:processing_path] + end + end + def processing #processing directory, used/needed for sisu work files, has sub-directories (dal,tex etc) + unless FileTest.directory?(processing_path_root) + mkdir_p(processing_path_root) + File.chmod(0777,processing_path_root) + end + if processing_path_usr? + processing_path_usr="#{processing_path_root}/#{user}" + mkdir_p(processing_path_usr) unless FileTest.directory?(processing_path_usr) + File.chmod(0700,processing_path_usr) + end + mkdir_p(processing_path) unless FileTest.directory?(processing_path) + File.chmod(0700,processing_path) + path_processing=[processing_path,defaults[:processing_path],defaults[:processing_path_home]] + processing=nil + path_processing.each do |v| # + processing=v + unless FileTest.directory?(processing) + puts "a processing directory (#{processing}) is being created for use by sisu" + mkdir_p(processing) + File.chmod(0700,processing) + end + break + end + processing + end + def composite_file + pth=path.dal #"#{processing}/composite" + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def dal + pth=if defined? @rc['processing']['dal'] \ + and not @rc['processing']['dal'].nil? \ + and not @rc['processing']['dal'].empty? + "#{processing}/#{@rc['processing']['dal']}" + else "#{processing}/#{defaults[:processing_dal]}" + end + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def tune + pth=if defined? @rc['processing']['tune'] \ + and not @rc['processing']['tune'].nil? \ + and not @rc['processing']['tune'].empty? + "#{processing}/#{@rc['processing']['tune']}" + else "#{processing}/#{defaults[:processing_tune]}" + end + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def odf + pth="#{processing}/odf" + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def tex + pth=if defined? @rc['processing']['latex'] \ + and not @rc['processing']['latex'].nil? \ + and not @rc['processing']['latex'].empty? + "#{processing}/#{@rc['processing']['latex']}" + else "#{processing}/#{defaults[:processing_latex]}" + end + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def texi + pth=if defined? @rc['processing']['texinfo'] \ + and not @rc['processing']['texinfo'].nil? \ + and not @rc['processing']['texinfo'].empty? + "#{processing}/#{@rc['processing']['texinfo']}" + else "#{processing}/#{defaults[:processing_texinfo]}" + end + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def texinfo #texinfo webserv, check + "#{processing}/#{defaults[:processing_texinfo]}" + end + def lout + pth=if defined? @rc['processing']['lout'] \ + and not @rc['processing']['lout'].nil? \ + and not @rc['processing']['lout'].empty? + "#{processing}/#{@rc['processing']['lout']}" + else "#{processing}/#{defaults[:processing_lout]}" + end + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def sqlite + pth=if defined? @rc['processing']['sqlite'] \ + and not @rc['processing']['sqlite'].nil? \ + and not @rc['processing']['sqlite'].empty? + "#{processing}/#{@rc['processing']['sqlite']}" + else "#{processing}/#{defaults[:processing_sqlite]}" + end + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def postgresql + pth=if defined? @rc['processing']['postgresql'] \ + and not @rc['processing']['postgresql'].nil? \ + and not @rc['processing']['postgresql'].empty? + "#{processing}/#{@rc['processing']['postgresql']}" + else "#{processing}/#{defaults[:processing_postgresql]}" + end + mkdir_p(pth) unless FileTest.directory?(pth) + pth + end + def feed + if defined? @rc['webserv']['feed']; "#{public_output}/#{@rc['webserv']['feed']}" + else defaults[:webserv_feed] + end + end + def feed_home + "#{public_output}/#{@rc['webserv']['feed_home']}" + end + def scripts #used previously only to include tla version info + if defined? @rc['project']['path']; "#{home}/#{@rc['project']['path']}" + end + end + def cgi + if defined? @rc['webserv']['cgi']; "#{@rc['webserv']['cgi']}" + else defaults[:webserv_cgi] + end + end + def php + if defined? @rc['webserv']['php']; "#{public_output}/#{@rc['webserv']['php']}" + else defaults[:webserv_php] + end + end + # programs + def output_tell + url.webserv_map_pwd + end + def image_source #image repository source directory + image_path=if defined? @rc['image']['path'] \ + and defined? @rc['image']['public'] + pth="#{@rc['image']['path']}" + "#{pth}/#{@rc['image']['public']}" + else + "#{share}/image" + end + end + def image_source_tex #image repository source directory + image_path=if defined? @rc['image']['path'] \ + and defined? @rc['image']['public'] + pth="#{@rc['image']['path']}" + "#{pth}/#{@rc['image']['public']}" + else + image=defaults[:image_stub] + "#{share}/image" + end + end + def image_external + "#{processing}/external_document/image" + end + def image_source_local_tex + if FileTest.directory?(defaults[:image_local]); defaults[:image_local] + end + end + def image_source_remote_tex + if FileTest.directory?(image_external); image_external + end + end + self + end + def url + def hostname + "http://#{@sys.hostname}" + end + def dir_url + "file://#{path.webserv}/#{stub_pwd}" + end + def localhost + "http://localhost/#{stub_pwd}" + end + def local + "http://#{hostname}/#@stub_pwd" + end + def root + if defined? @rc['webserv']['url_root'] \ + and @rc['webserv']['url_root'] =~/https?:\/\// + "#{@rc['webserv']['url_root']}/#@stub_pwd" + elsif defined? @rc['webserv']['url_root'] \ + and @rc['webserv']['url_root'] =~/localhost/ + "http://localhost/#@stub_pwd" + else "file://#{path.output}" + end + end + def remote + root + end + def src_txt + "#{root}/src" + end + def src_pod + "#{root}/pod" + end + def webserv_host_base + if defined? @rc['webserv']['host'] + case @rc['webserv']['host'] + when /https?:\/\//; @rc['webserv']['host'] + when /\S+/; "http://#{@rc['webserv']['host']}" + else defaults[:webserv_host_cgi] + end + else defaults[:webserv_host_cgi] + end + end + def webrick_port + if @md \ + and @md.cmd.inspect=~/-F/ \ + and @md.mod.inspect=~/port=(\d+)/ + $1 + else + if defined? @rc['webserv_cgi']['port'] + if @rc['webserv_cgi']['port'].nil? \ + and (defined? @md.mod \ + and not @md.mod.nil? \ + and @md.mod.inspect=~/webrick/) + defaults[:webserv_port_cgi] + elsif not @rc['webserv_cgi']['port'].nil? + @rc['webserv_cgi']['port'] + else defaults[:webserv_port_cgi] + end + else defaults[:webserv_port_cgi] + end + end + end + def webserv_port_cgi + if @md \ + and @md.cmd.inspect=~/-F/ \ + and @md.mod.inspect=~/port=(\d+)/ + $1 + else + if defined? @rc['webserv_cgi']['port'] + if @rc['webserv_cgi']['port'].nil? \ + and (defined? @md.mod \ + and not @md.mod.nil? \ + and @md.mod.inspect=~/webrick/) + defaults[:webserv_port_cgi] + elsif not @rc['webserv_cgi']['port'].nil? + @rc['webserv_cgi']['port'] + else nil + end + else nil + end + end + end + def webserv_cgi #web url for local webserv (localhost, or hostname) + if defined? @rc['webserv_cgi']['host'] \ + and not @rc['webserv_cgi']['host'].nil? + http=@rc['webserv_cgi']['host'] =~ /https?:\/\// ? '' : 'http://' #check https? missing + if webserv_port_cgi + "#{http}#{@rc['webserv_cgi']['host']}:#{webserv_port_cgi}/#@stub_pwd" + else "#{http}#{@rc['webserv_cgi']['host']}/#@stub_pwd" + end + else + http=webserv_host_base=~/https?:\/\// ? '' : 'http://' + if webserv_port_cgi + "#{http}#{webserv_host_base}:#{webserv_port_cgi}/#@stub_pwd" + else "#{http}#{webserv_host_base}/#@stub_pwd" + end + end + end + def webserv_base_cgi #web url for local webserv (localhost, or hostname) + if defined? @rc['webserv_cgi']['host'] \ + and not @rc['webserv_cgi']['host'].nil? + http=@rc['webserv_cgi']['host'] =~ /https?:\/\// ? '' : 'http://' + if webserv_port_cgi + "#{http}#{@rc['webserv_cgi']['host']}:#{webserv_port_cgi}" + else "#{http}#{@rc['webserv_cgi']['host']}" + end + else + http=webserv_host_base=~/https?:\/\// ? '' : 'http://' + if webserv_port_cgi + "#{http}#{webserv_host_base}:#{webserv_port_cgi}" + else "#{http}#{webserv_host_base}" + end + end + end + def webrick #must have a port #REMOVE + #port=":#{webserv_port_cgi}" + if defined? @rc['webserv_cgi']['host'] \ + and not @rc['webserv_cgi']['host'].nil? + http=if @rc['webserv_cgi']['host'] =~/http:\/\// + 'http://' + elsif @rc['webserv_cgi']['host'] =~/https:\/\// + 'https://' + else defaults + end + "#{http}#{@rc['webserv_cgi']['host']}" + elsif webserv_host_base \ + and not webserv_host_base.nil? + "#{http}#{webserv_host_base}" + else "#{http}localhost" end + end + def webserv #web url for local webserv (localhost, or hostname) + if path.webserv_dir \ + and path.webserv =~ /#{path.webserv_dir}/ #revisit + "#{path.webserv}/#@stub_pwd".gsub(/#{path.webserv_dir}/,"#{url.hostname}/#@stub_pwd") + elsif defined? @rc['webserv']['webrick_url'] \ + and @rc['webserv']['webrick_url'] == false + "file://#{path.webserv}/#@stub_pwd" + elsif webserv_port_cgi =~/\S+/ + "#{url.hostname}:#{webserv_port_cgi}/#@stub_pwd" + else "#{url.hostname}/#@stub_pwd" + end + end + def webserv_base #web url for local webserv (localhost, or hostname) + if path.webserv_dir \ + and path.webserv =~ /#{path.webserv_dir}/ #revisit + "#{path.webserv}/#@stub_pwd".gsub(/#{path.webserv_dir}/,"#{url.hostname}") + elsif defined? @rc['webserv']['webrick_url'] \ + and @rc['webserv']['webrick_url'] == false + "file://#{path.webserv}" + else "#{url.webrick_base}" + end + end + def webserv_files_from_db #sort this out, messy + if defined? @rc['webserv_cgi']['file_links'] + case @rc['webserv_cgi']['file_links'] + when /webserv_cgi/; url.webserv_base_cgi + when /webserv/; @rc['webserv']['url_root'] + when /https?:\/\//; @rc['webserv_cgi']['file_links'] + when /\S+/; "http://#{@rc['webserv_cgi']['file_links']}" + else webserv_base_cgi + end + else webserv_base_cgi + end + end + def sample_search_form_title + if defined? @rc['search']['sisu']['title'] \ + and @rc['search']['sisu']['title'] =~/\S+/ + @rc['search']['sisu']['title'] + else %{SiSU search form (sample):} + end + end + def output_tell + output_type=if defined? @rc['show_output_on'] \ + and @rc['show_output_on'] =~/^(?:filesystem|webserv|(?:local|remote)(?:_webserv)?|webrick)/ + @rc['show_output_on'] + else 'filesystem' + end + output=case output_type + when /^filesystem(?:_url)?/; url.dir_url + when /^remote(?:_webserv)?/; url.remote + when /^(?:webserv|local_webserv)/; url.local + when /^local(:\d+)/; url.hostname + $1 + '/' + stub_pwd + when /^localhost(:\d+)/; url.localhost + $1 + '/' + stub_pwd + when /^localhost/; url.localhost + when /^webrick/; url.webrick + when /^path/; url.webserv_map_pwd + else url.webserv_map_pwd + end + end + def images + '../_sisu/image' + end + def images_local + if FileTest.directory?(defaults[:image_local]) + if @@image_flag + images=Dir.glob("#{defaults[:image_local]}/*.{png,jpg,gif}") + pth="#{path.webserv}/#@stub_pwd" + mkdir_p("#{pth}/_sisu/image") unless FileTest.directory?("#{pth}/_sisu/image") + images.each { |i| File.install(i,"#{pth}/#{i}") } unless images.length > 0 + @@image_flag=false + end + '../_sisu/image' + else + if @@local_image==true + cmd=if @cmd; @cmd + else '' + end + tell=SiSU_Screen::Ansi.new(cmd,"WARNING - no local image directory or images:", defaults[:image_local] ) + tell.warn unless cmd =~/q/ + @@local_image=false + end + url.images + end + end + #def images_external #url_images_external #ex defaults url.path_png + # '../_sisu/image_external' + #end + def images_external + if FileTest.directory?(image_external) + if @@image_flag + images=Dir.glob("#{image_external}/*.{png,jpg,gif}") + pth="#{path.webserv}/#@stub_pwd" + mkdir_p("#{pth}/_sisu/image_external") unless FileTest.directory?("#{pth}/_sisu/image_external") + images.each { |i| File.install(i,"#{pth}/#{i}") } unless images.length > 0 + @@image_flag=false + end + '../_sisu/image_external' + else + if @@local_image==true + tell=SiSU_Screen::Ansi.new(@cmd,"WARNING - image directory for external images or no such images:", :image_external ) + tell.warn unless @cmd =~/q/ + @@local_image=false + end + url.images_external + end + end + self + end + def digest + def type + if defined? @rc['default']['digest'] \ + and @rc['default']['digest'] != nil + case @rc['default']['digest'] + when /^sha(?:2|256)?$/; 'sha256' + when /^md5$/; 'md5' + else 'md5' + end + else 'md5' + end + end + def length + case digest.type + when /sha256/; 64 + when /md5/; 32 + else 32 + end + end + def pattern + "[0-9a-f]{#{digest.length}}" #/[0-9a-f]{#{digest.length}}/ + end + self + end + def program + def text_editor + if defined? @rc['program_select']['editor'] \ + and @rc['program_select']['editor'] =~/\S\S+/ + @rc['program_select']['editor'] + elsif defined? @rc['program_select']['text_editor'] \ + and @rc['program_select']['text_editor'] =~/\S\S+/ + @rc['program_select']['text_editor'] + else 'editor' #'gvim -c :R -c :S' + end + end + def pdf_viewer + if defined? @rc['program_select']['pdf_viewer'] \ + and @rc['program_select']['pdf_viewer'] =~/\S\S+/ + @rc['program_select']['pdf_viewer'] + else 'pdf-viewer' #'evince' + end + end + def web_browser + if defined? @rc['program_select']['www_browser'] \ + and @rc['program_select']['www_browser'] =~/\S\S+/ + @rc['program_select']['www_browser'] + elsif defined? @rc['program_select']['web_browser'] \ + and @rc['program_select']['web_browser'] =~/\S\S+/ + @rc['program_select']['web_browser'] + else 'x-www-browser' #'kazehakase' 'galeon' + end + end + def www_browser + web_browser + end + def console_web_browser + if defined? @rc['program_select']['console_www_browser'] \ + and @rc['program_select']['console_www_browser'] =~/\S\S+/ + @rc['program_select']['console_www_browser'] + elsif defined? @rc['program_select']['console_web_browser'] \ + and @rc['program_select']['console_web_browser'] =~/\S\S+/ + @rc['program_select']['console_web_browser'] + else 'console-www-browser' #'lynx' 'links2' 'elinks' 'epiphany' + end + end + def console_www_browser + web_browser + end + def xml_viewer + if defined? @rc['program_select']['xml_viewer'] \ + and @rc['program_select']['xml_viewer'] =~/\S\S+/ + @rc['program_select']['xml_viewer'] + else text_editor + end + end + def xml_editor + xml_viewer + end + def odf_viewer + if defined? @rc['program_select']['odf_viewer'] \ + and @rc['program_select']['odf_viewer'] =~/\S\S+/ + @rc['program_select']['odf_viewer'] + else 'oowriter' #'odf-viewer','oowriter' + end + end + def manpage_generator + if defined? @rc['program_select']['man'] \ + and @rc['program_select']['man'] =~/\S\S+/ + @rc['program_select']['man'] + else 'nroff -man' #'nroff -man' #'groff -man -Tascii' + end + end + def file_encoding #file encoding + is='' + if defined? @rc['program_set']['file_encoding'] + is=@rc['program_set']['encoding'] + end + if is.nil? \ + or is==true + is='encoding' + end + is + end + def wc #wordcount + is='' + if defined? @rc['program_set']['wc'] + is=@rc['program_set']['wc'] + end + if is.nil? \ + or is==true + is='wc' + end + is + end + def tidy + if defined? @rc['program_set']['tidy'] + is=@rc['program_set']['tidy'] + end + if is.nil? \ + or is==true + is='tidy' + end + is + end + def rmagick + if defined? @rc['program_set']['rmagick'] + is=@rc['program_set']['rmagick'] + end + if is.nil? \ + or is==true + is='rmagick' + end + is + end + def rexml #should be part of ruby 1.8 but apparently not always + is=if FileTest.directory?("#{Config::CONFIG['rubylibdir']}/rexml") #Config::CONFIG['sitedir'] + true + else false + end + is=if defined? @rc['program_set']['rexml']; @rc['program_set']['rexml'] + else '' + end + if is.nil? \ + or is==true + is='rexml' + end + is + end + def pdflatex + is=if defined? @rc['program_set']['pdflatex']; @rc['program_set']['pdflatex'] + else '' + end + if is.nil? \ + or is==true + is='pdflatex' + end + is + end + def postgresql + is=if defined? @rc['program_set']['postgresql']; @rc['program_set']['postgresql'] + else '' + end + if is.nil? \ + or is==true + is='postgresql' + end + is + end + def sqlite + is=if defined? @rc['program_set']['sqlite']; @rc['program_set']['sqlite'] + else '' + end + if is.nil? \ + or is==true + is='sqlite' + end + is + end + self + end + def i18n + def language # language settings +## + m=/.+\/\S+?\~(\S+)/ + pwd=Dir.pwd + conf=if defined? @rc['default']['language']; @rc['default']['language'] + else nil + end + l=if pwd=~ m; pwd[m,1] #2 directory: by visible directory name + elsif conf; @rc['default']['language'] #3 config: from sisurc.yaml + else defaults[:language] #4 sisu: program default + end #1 document: param gets + SiSU_Env::Standardise_language.new(l) + end + def multilingual + if defined? @rc['default']['multilingual'] \ + and @rc['default']['multilingual'] != nil; @rc['default']['multilingual'] + else defaults[:multilingual] + end + end + def lang_filename(l) + @lang={} + x=if multilingual + x=if defined? @rc['default']['language_file'] \ + and @rc['default']['language_file'] != nil; @rc['default']['language_file'] + else 1 + end + else 0 + end + if (l != defaults[:language_code]) \ + or (language.code != defaults[:language_code]) #watch + if x==1; @lang[:pre],@lang[:mid],@lang[:post]="#{l}.",'','' + elsif x==2; @lang[:pre],@lang[:mid],@lang[:post]='',".#{l}",'' + elsif x==3; @lang[:pre],@lang[:mid],@lang[:post]='','',".#{l}" + else @lang[:pre],@lang[:mid],@lang[:post]='','','' + end + else @lang[:pre],@lang[:mid],@lang[:post]='','','' + end + @lang + end + self + end + def file_encoding + is='' + if defined? @rc['program_set']['file_encoding']; is=@rc['program_set']['encoding'] + end + if is.nil? \ + or is==true; is='encoding' + end + is + end + def papersize # paper settings, default overidden in param if set within document + if defined? @rc['default']['papersize']; @rc['default']['papersize'].downcase + else defaults[:papersize].downcase + end + end + def odf_structure + rm_rf("#{path.processing}/odf") + system("unzip -q #{path.share}/odf/odt.zip -d #{path.processing}") + end + def sisupod_gen(fns_pod) + pwd=Dir.pwd + sisupod_processing_path="#{path.processing}/sisupod" + if FileTest.directory?(sisupod_processing_path) \ + or FileTest.file?(sisupod_processing_path) + rm_rf(sisupod_processing_path) + end + unless FileTest.directory?(sisupod_processing_path) + mkdir_p(sisupod_processing_path) + end + if FileTest.file?("#{Dir.pwd}/#{fns_pod}") + system("unzip -q #{Dir.pwd}/#{fns_pod} -d #{path.processing}") + else + tell=SiSU_Screen::Ansi.new('',"file not found: #{fns_pod}") + tell.warn unless @cmd=~/q/ + end + sisupod_processing_path + end + end + class Info_processing_flag + attr_accessor :color,:cf_0,:cf_1,:cf_2,:cf_3,:cf_4,:cf_5 + def initialize + @rc=Get_init.instance.yamlrc + end + def color #processing flag shortcuts + if defined? @rc['flag']['color']; @rc['flag']['color'] + else false + end + end + def cf_0 #processing flag shortcuts + if defined? @rc['flag']['default'] \ + and not (@rc['flag']['default'].nil? \ + or @rc['flag']['default'].empty?) + @rc['flag']['default'] + else '-NhwpaobxXyYv' + end + end + def cf_1 #processing flag shortcuts + if defined? @rc['flag']['i'] \ + and not (@rc['flag']['i'].nil? \ + or @rc['flag']['i'].empty?) + @rc['flag']['i'] + else '-hwpoy' + end + end + def cf_2 #processing flag shortcuts + if defined? @rc['flag']['ii'] \ + and not (@rc['flag']['ii'].nil? \ + or @rc['flag']['ii'].empty?) + @rc['flag']['ii'] + else '-NhwpaobxXy' + end + end + def cf_3 #processing flag shortcuts + if defined? @rc['flag']['iii'] \ + and not (@rc['flag']['iii'].nil? \ + or @rc['flag']['iii'].empty?) + @rc['flag']['iii'] + else '-NhwpaobxXyY' + end + end + def cf_4 #processing flag shortcuts + if defined? @rc['flag']['iv'] \ + and not (@rc['flag']['iv'].nil? \ + or @rc['flag']['iv'].empty?) + @rc['flag']['iv'] + else '-NhwpaobxXDyY --import' + end + end + def cf_5 #processing flag shortcuts + if defined? @rc['flag']['v'] \ + and not (@rc['flag']['v'].nil? \ + or @rc['flag']['v'].empty?) + @rc['flag']['v'] + else '-NhwpaobxXDyY --update' + end + end + end + class Info_settings < Info_env + def permission?(prog) #program defaults + if defined? @rc['permission_set'][prog]; @rc['permission_set'][prog] + else false + end + end + def program?(prog) #program defaults + if defined? @rc['program_set'][prog]; @rc['program_set'][prog] + else false + end + end + end + class File_map < Info_env + attr_accessor :local_sisu_source + def initialize(opt='') #watch + super() + @opt=opt #,opt.fns,opt.cmd + #@file=@opt.fns #not always fns + @env=if @opt.fns \ + and not @opt.fns.empty? + SiSU_Env::Info_env.new(@opt.fns) + else + SiSU_Env::Info_env.new('dummy.sst') + end + if @opt.cmd =~/m/; @md=SiSU_Param::Parameters.new(@opt).get + end + ft=[] + if @md \ + and defined? @md.fn \ + and @md.fn # used for multilingual + if @md.cmd =~ /[hH]/ + ft << @md.fn[:html] + end + if @md.cmd =~ /w/ \ + and @md.cmd !~ /[hH]/ + ft << @md.fn[:concordance] + end + if @md.cmd =~ /y/ \ + and @md.cmd !~ /[hH]/ + ft << @md.fn[:manifest] + end + if @md.cmd =~ /p/; ft << @md.fn[:pdf_l] << @md.fn[:pdf_p] + end + if @md.cmd =~ /x/; ft << @md.fn[:sax] + end + if @md.cmd =~ /X/; ft << @md.fn[:dom] + end + if @md.cmd =~ /b/; ft << @md.fn[:xhtml] + end + if @md.cmd =~ /a/; ft << @md.fn[:plain] + end + if @md.cmd =~ /i/; ft << @md.fn[:manpage] + end + if @md.cmd =~ /g/; ft << @md.fn[:wiki] + end + if @md.cmd =~ /N/; ft << @md.fn[:digest] + end + if @md.cmd =~ /o/; ft << @md.fn[:odf] + end + if @md.cmd =~ /O/; ft << @md.fn[:oai_pmh] + end + if @md.cmd =~ /s/; ft << @md.fns + end + if @md.cmd =~ /S/; ft << @md.fn[:sisupod] << '.kdi' + end + @fnb=@md.fnb + else # still needed where/when param is not parsed + if @opt.cmd =~ /[hH]/; ft << '.html' << '.html.??' + end + if @opt.cmd =~ /w/ \ + and @opt.cmd !~ /[hH]/ + ft << 'concordance.html' << '??.concordance.html' << 'concordance.??.html' + end + if @opt.cmd =~ /y/ \ + and @opt.cmd !~ /[hH]/ + ft << 'sisu_manifest.html' << '??.sisu_manifest.html' << 'sisu_manifest.??.html' + end + if @opt.cmd =~ /p/; ft << 'landscape.pdf' << 'portrait.pdf' << '.pdf' + end + if @opt.cmd =~ /x/; ft << 'sax.xml' << '??.sax.xml' << 'sax.??.xml' + end + if @opt.cmd =~ /X/; ft << 'dom.xml' << '??.dom.xml' << 'dom.??.xml' + end + if @opt.cmd =~ /b/; ft << 'scroll.xhtml' << '??.scroll.xhtml' << 'scroll.??.xhtml' + end + if @opt.cmd =~ /i/; ft << '.1' << '??.man.1' << 'man.??.1' + end + if @opt.cmd =~ /a/; ft << 'plain.txt' << '??.plain.txt' << 'plain.??.txt' + end + if @opt.cmd =~ /g/; ft << 'wiki.txt' << '??.wiki.txt' << 'wiki.??.txt' + end + if @opt.cmd =~ /N/; ft << 'digest.txt' << '??.digest.txt' << 'digest.??.txt' + end + if @opt.cmd =~ /o/; ft << 'opendocument.odt' << '??.opendocument.odt' << 'opendocument.??.odt' + end + if @opt.cmd =~ /O/; ft << 'oai_pmh.xml' + end + if @opt.cmd =~ /s/; ft << '.sst' << '.ssi' << '.ssm' + end + if @opt.cmd =~ /S/; ft << '.zip' << '.kdi' + end + if @opt.mod.inspect =~ /sxm|sxs|xml/; ft << @fnb << '.sxs.xml' + end + if @opt.mod.inspect =~ /sxd/; ft << @fnb << '.sxd.xml' + end + if @opt.mod.inspect =~ /sxn/; ft << @fnb << '.sxn.xml' + end + end + ft=ft.uniq + filetypes=ft.join(',') + @filetypes=if filetypes !~/..+/; '' # -r called alone, copy all + elsif @opt.cmd =~/u/; '' # -u added, copy all, (used to create remote directory tree see output path), not the usual function of -u + elsif filetypes =~/\S+?,\S+/; '*{' + filetypes + '}' # more than one relevant file type + else '*' + filetypes # one relevant file type + end + @source_path=if @fnb \ + and not @fnb.empty? + "#{@env.path.output}/#@fnb" + else @env.path.output + end + @source_path_src=if @fnb \ + and not @fnb.empty? + "#{@env.path.output}/src" + else @env.path.output_src + end + @source_path_pod=if @fnb \ + and not @fnb.empty? + "#{@env.path.output}/pod" + else @env.path.output_pod + end + @source_path_harvest=if @fnb \ + and not @fnb.empty? + "#{@env.path.output}/sisu_site_metadata" + else @env.path.output_harvest + end + @local_sisu_source=if @filetypes =~/\S/; "#@source_path/#@filetypes" + else @source_path + end + end + end + class Clean_output + require 'fileutils' + include FileUtils::Verbose + def initialize(opt) + @opt=opt + z=File_map.new(@opt) + @zap=z.local_sisu_source + if @opt.cmd =~ /[hH]/ + @zap=Dir.glob(@zap).join(' ') + if @opt.cmd !~ /w/; @zap.gsub!(/#@source_path\/concordance.html/,'') + end + end + @env=SiSU_Env::Info_env.new + end + def zap + if @zap !~/\/\//; rm_rf(@zap) if FileTest.directory?(@zap) + else puts 'suspect zap request, ignored' + end + #Dir.unlink(@zap) if FileTest.directory?(@zap) + #System_call.new(@zap,'',@cmd).rm + end + def zap_map + if @opt.fnb \ + and not @opt.fnb.empty? + sm="#{@env.path.output}/sitemaps/sitemap_#{@opt.fnb}.xml" + rm(sm) if FileTest.file?(sm) + end + end + end + class Info_remote_host + def initialize + @rc=Get_init.instance.yamlrc + end + def remote_host #see Info_remote remote_host_base_general + r=[] + r=if (defined? @rc['remote'] \ + and @rc['remote'].class==Array) + r_array=@rc['remote'] + r_array.each_with_index do |renv,i| + r[i]={} + if defined? renv['user'] \ + and defined? renv['host'] + end + r[i][:user]=renv['user'] + r[i][:host]=renv['host'] + r[i][:path]=if defined? renv['path'] + renv['path'] + else '' + end + r[i][:name]="#{r[i][:user]}@#{r[i][:host]}:#{r[i][:path]}" + end + r + elsif (defined? @rc['remote'] \ + and @rc['remote'].class==Hash \ + and defined? @rc['remote']['user'] \ + and defined? @rc['remote']['host']) + r[0]={} + r[0][:user]=@rc['remote']['user'] + r[0][:host]=@rc['remote']['host'] + r[0][:path]=if defined? @rc['remote']['path'] + @rc['remote']['path'] + else '' + end + r[0][:name]="#{r[0][:user]}@#{r[0][:host]}:#{r[0][:path]}" + r + else + r[0]={} + r[0][:name]='.' + r[0][:user]='' + r[0][:host]='' + r[0][:path]='' + #puts "no remote host or user" + r + end + end + def rhost + def r1 + rhost1=if defined? SiSU_Env::Info_remote_host.new.remote_host[0][:name] + SiSU_Env::Info_remote_host.new.remote_host[0][:name] + else nil + end + end + def r2 + rhost2=if defined? SiSU_Env::Info_remote_host.new.remote_host[1][:name] + SiSU_Env::Info_remote_host.new.remote_host[1][:name] + else nil + end + end + def r3 + rhost3=if defined? SiSU_Env::Info_remote_host.new.remote_host[2][:name] + SiSU_Env::Info_remote_host.new.remote_host[2][:name] + else nil + end + end + def r4 + rhost4=if defined? SiSU_Env::Info_remote_host.new.remote_host[3][:name] + SiSU_Env::Info_remote_host.new.remote_host[3][:name] + else nil + end + end + def r5 + rhost5=if defined? SiSU_Env::Info_remote_host.new.remote_host[4][:name] + SiSU_Env::Info_remote_host.new.remote_host[4][:name] + else nil + end + end + def r6 + rhost6=if defined? SiSU_Env::Info_remote_host.new.remote_host[5][:name] + @ls + SiSU_Env::Info_remote_host.new.remote_host[5][:name] + else nil + end + end + self + end + end + class Info_remote < File_map + @@flag_remote=false + require 'socket' + def initialize(opt) + super(opt) # + @opt=opt + @rc=Get_init.instance.yamlrc + end + def remote_host_base_general + SiSU_Env::Info_remote_host.new.remote_host + end + def remote_host_base + remote_host_base_general.each do |remote_conn| + #host_ip=IPSocket.getaddress(remote[:host]) unless remote[:host].empty? + @@flag_remote=true if remote_conn[:name] =~/\S+?@\S+/ + #remote_conn[:name] + end + remote_host_base_general + end + def scp #sort out later using ruby libraries #not ideal, first time each file is sent, -r must be called separately for subdir to be built + self.remote_host_base.each do |remote_conn| + local_gen=@source_path + remote_gen=case @opt.cmd + when /u/; "#{remote_conn[:name]}/#{@env.path.stub_pwd}/." #creates remote directory tree, this is not the usual function of u + when /[abhHNopwxXy]/; "#{remote_conn[:name]}/#{@env.path.stub_pwd}/#{@fnb}/." + else "#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + end + #remote="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + local_src=@source_path_src + local_pod=@source_path_pod + remote_src="#{remote_conn[:name]}/#{@env.path.stub_src}/." + remote_pod="#{remote_conn[:name]}/#{@env.path.stub_pod}/." + src_txt=@opt.fnc + src_pod=@opt.fncb.gsub(/(\.ss[mt])(?:\.sst)?$/,'\1.zip') + if (local_gen =~/\S/ \ + and local_gen !~/\/\//) \ + and (remote_gen =~/\S/ \ + and remote_gen !~/\/\//) \ + and @@flag_remote==true \ + and @opt.cmd !~/U/ + System_call.new(local_gen,remote_gen).scp + if FileTest.file?("#{local_src}/#{src_txt}") + System_call.new("#{local_src}/#{src_txt}",remote_src).scp + end + if FileTest.file?("#{local_pod}/#{src_pod}") + System_call.new("#{local_src}/#{src_pod}",remote_pod).scp + end + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "#{local_gen} -> #{remote_gen}" + if FileTest.file?("#{local_src}/#{src_doc}") + puts "#{local_src}/#{src_doc}* -> #{remote_src}" + end + if FileTest.file?("#{local_pod}/#{src_doc}.zip") + puts "#{local_pod}/#{src_doc}* -> #{remote_pod}" + end + else + puts 'suspect scp request, ignored' + puts "#{local_gen} -> #{remote_gen} remote flag: #@@flag_remote" + puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + def rsync + self.remote_host_base.each do |remote_conn| + local_gen=@source_path + local_gen_image="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image" + local_gen_image_external="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image_external" + remote_gen="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + remote_images="#{remote_conn[:name]}/#{@env.path.stub_pwd}/_sisu/image/." + remote_images_external="#{remote_conn[:name]}/#{@env.path.stub_pwd}/_sisu/image_external/." + local_src=@source_path_src + local_pod=@source_path_pod + remote_src="#{remote_conn[:name]}/#{@env.path.stub_src}/." + remote_pod="#{remote_conn[:name]}/#{@env.path.stub_pod}/." + src_txt=@opt.fnc + src_pod=@opt.fncb.gsub(/(\.ss[mt])(?:\.sst)?$/,'\1.zip') + if (local_gen =~/\S/ \ + and local_gen !~/\/\//) \ + and (remote_gen =~/\S/ \ + and remote_gen !~/\/\//) \ + and @@flag_remote==true \ + and @opt.cmd !~/U/ + delete_extra_files='--delete' # '--delete-after' + System_call.new(local_gen,remote_gen,@opt.cmd).rsync(delete_extra_files) + if FileTest.file?("#{local_src}/#{src_txt}") + System_call.new("#{local_src}/#{src_txt}",remote_src,@opt.cmd).rsync + if defined? @md.ec[:image] and not @md.ec[:image].empty? + images="#{local_gen_image}/" + @md.ec[:image].join(" #{local_gen_image}/") + System_call.new(images,remote_images,@opt.cmd).rsync + images_external="#{local_gen_image_external}/" + @md.ec[:image].join(" #{local_gen_image_external}/") + System_call.new(images_external,remote_images_external,@opt.cmd).rsync + end + end + if FileTest.file?("#{local_pod}/#{src_pod}") + System_call.new("#{local_pod}/#{src_pod}",remote_pod,@opt.cmd).rsync + end + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "#{local_gen} -> #{remote_gen}" + if FileTest.file?("#{local_src}/#{src_doc}") \ + or FileTest.file?("#{local_src}/#{src_doc}.zip") + puts "#{local_src}/#{src_doc}* -> #{remote_src}" + end + else + puts 'suspect rsync request, ignored' + puts "#{local_gen} -> #{remote_gen} remote flag: #@@flag_remote" + puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + def scp_base #base site + self.remote_host_base.each do |remote_conn| + local=@source_path + remote="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + if defined? @rc['permission_set']['remote_base_site'] \ + and @rc['permission_set']['remote_base_site'] \ + and @@flag_remote==true \ + and @opt.cmd !~/U/ + puts "begin scp_base: #{local} -> #{remote}" + System_call.new("#{local}/#{@env.path.style}/",remote).scp + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "begin scp_base: #{local} -> #{remote}" + puts "#{local}/#{@env.path.style}/ -> #{remote}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + def scp_base_all #base site + self.remote_host_base.each do |remote_conn| + local=@source_path + remote="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + if defined? @rc['permission_set']['remote_base_site'] \ + and @rc['permission_set']['remote_base_site'] \ + and @@flag_remote==true \ + and @opt.cmd !~/U/ + puts "begin scp_base_all: #{local} -> #{remote}" + System_call.new("#{local}/_sisu/image_sys/",remote).scp + System_call.new("#{local}/_sisu/image/",remote).scp + System_call.new("#{local}/#{@env.path.style}/",remote).scp + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "scp_base_all: #{local} -> #{remote}" + puts "#{local}/_sisu/image_sys/ -> #{remote}" + puts "#{local}/_sisu/image/ -> #{remote}" + puts "#{local}/#{@env.path.style}/ -> #{remote}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + def rsync_base #base site + ldest="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu" + image_sys="#{@env.path.webserv}/_sisu/image_sys" + images="#{@env.path.webserv}/_sisu/image" + self.remote_host_base.each do |remote_conn| + remote="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + remote_conf="#{remote_conn[:name]}/_sisu" + if defined? @rc['permission_set']['remote_base_site'] \ + and @rc['permission_set']['remote_base_site'] \ + and @@flag_remote==true \ + and @opt.cmd !~/U/ + #puts "begin rsync_base: #{local} -> #{remote}" + System_call.new("#{image_sys}","#{remote_conf}").rsync + System_call.new("#{images}","#{remote_conf}").rsync + System_call.new("#{ldest}","#{remote}").rsync + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "rsync_base: #{local} -> #{remote}" + puts "#{local}/_sisu/image -> #{remote}" + puts "#{local}/_sisu/image_sys/ -> #{remote}" + puts "#{local}/#{@env.path.style}/ -> #{remote}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + def rsync_base_sync #base site + self.remote_host_base.each do |remote_conn| + local=@source_path + remote="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + if defined? @rc['permission_set']['remote_base_site'] \ + and @rc['permission_set']['remote_base_site'] \ + and @@flag_remote==true \ + and @opt.cmd !~/U/ + delete_extra_files='--delete' # '--delete-after' + puts "begin rsync_base_sync: #{local} -> #{remote}" + System_call.new("#{local}/_sisu/image_sys/",remote).rsync(delete_extra_files) + System_call.new("#{local}/_sisu/image/",remote).rsync(delete_extra_files) + System_call.new("#{local}/#{@env.path.style}/",remote).rsync(delete_extra_files) + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "rsync_base_sync: #{local} -> #{remote}" + puts "#{local}/_sisu/image_sys/ -> #{remote}" + puts "#{local}/_sisu/image/ -> #{remote}" + puts "#{local}/#{@env.path.style}/ -> #{remote}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + def rsync_sitemaps #sitemap directory + self.remote_host_base.each do |remote_conn| + local="#@source_path/sitemapindex.xml" + remote="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + if @@flag_remote + #if defined? @rc['permission_set']['remote_base_site'] and @rc['permission_set']['remote_base_site'] #and @@flag_remote==true and @opt.cmd !~/U/ + delete_extra_files='--delete' # '--delete-after' + System_call.new(local,remote).rsync(delete_extra_files) + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "rsync_sitemaps: #{local} -> #{remote}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + def rsync_harvest + self.remote_host_base.each do |remote_conn| + local=@source_path_harvest + remote="#{remote_conn[:name]}/#{@env.path.stub_pwd}/." + if @@flag_remote + delete_extra_files='--delete' # '--delete-after' + System_call.new(local,remote).rsync(delete_extra_files) + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "rsync_sitemaps: #{local} -> #{remote}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + end + class Info_version <Info_env + include Singleton + require 'rbconfig' + def get_version + @version={} + @pwd=ENV['PWD'] + yst_etc="#{defaults[:sisu_etc]}/version1.yml" + lib_path=`echo $RUBYLIB`.split(':') + if File.exist?(yst_etc); @version=YAML::load(File::open(yst_etc)) #unless @@noyaml + end + @version + end + def rbversion + #Config::CONFIG['ruby_version'] + %x{ruby -v}.strip + end + end + class Create_system_link #< Info_env #revisit problems created 2004w41 + def initialize + @env=SiSU_Env::Info_env.new + end + def images + unless FileTest.directory?("#{@env.path.output}/_sisu") + mkdir_p("#{@env.path.output}/_sisu") + end + unless File.exist?("#{@env.path.output}/_sisu/image_sys") \ + or File.symlink?("#{@env.path.output}/_sisu/image_sys") + File.symlink("../../_sisu/image_sys", "#{@env.path.output}/_sisu/image_sys") + end + end + def man_forms + #File.symlink("../../man/form", "#{@env.path.output}/man/form") unless File.symlink?("#{@env.path.output}/man/form") == true + end + def man_pdf + #File.symlink("../../man/form", "#{@env.path.output}/man/pdf") unless File.symlink?("#{@env.path.output}/man/pdf") == true + end + end + class Info_file < Info_env + def initialize(fns='') + @env=SiSU_Env::Info_env.new + @fns=fns + end + def basefilename + m=/(.+?)\.(?:(?:-|ssm\.)?sst|ssm)$/m + fnb=@fns[m,1] + end + def project + "#{@env.development}/sisu.lnk" + end + def project_info + "#{@env.datapriv_i}/sisu.er3" + end + def project_todo + "#{@env.development}/todo.txt" + end + def admin_self + "#{@env.path.home}/.corundum/dots.lnk" + end + def admin_root + '/root/.corundum/admin.txt' + end + end + class Info_db < Info_env + @@rc=nil + def initialize + @@pwd ||=Dir.pwd + @pwd=Dir.pwd + @env=SiSU_Env::Info_env.new + m=/.+\/(?:src\/)?(\S+)/m # m=/.+?\/(?:src\/)?([^\/]+)$/im # m=/.+\/(\S+)/m + @pwd_stub=@pwd[m,1] + @rc=@@rc ||=Get_init.instance.yamlrc + @defaults=Info_env.new.defaults + end + def engine + def default + if defined? @rc['db']['engine']['default'] \ + and @rc['db']['engine']['default']=~/postgresql|sqlite/ + @rc['db']['engine']['default'] + else 'sqlite' + end + end + self + end + def psql + def user + if defined? @rc['db']['postgresql']['user'] \ + and @rc['db']['postgresql']['user']=~/\S+/ + @rc['db']['postgresql']['user'] + else @env.user + end + end + def db #db_name + "SiSU_#@pwd_stub" + end + def port #PGPORT + if defined? @rc['db']['postgresql']['port'] \ + and ( @rc['db']['postgresql']['port'] =~/\d+/ \ + or @rc['db']['postgresql']['port'].class == Fixnum) + @rc['db']['postgresql']['port'] + else @defaults[:postgresql_port] + end + end + def dbi + "DBI:Pg:database=#{psql.db};port=#{psql.port}" + end + def password + if defined? @rc['db']['postgresql']['password'] \ + and @rc['db']['postgresql']['password']=~/\S+/ + @rc['db']['postgresql']['password'] + else '' + end + end + def host + if defined? @rc['db']['postgresql']['host'] \ + and @rc['db']['postgresql']['host']=~/(?:\S{1,3}\.){3}\S{1,3}|\S+?\.\S+/ + @rc['db']['postgresql']['host'] + else '' + end + end + def dbi + if psql.host =~/(?:\S{1,3}\.){3}\S{1,3}|\S+?\.\S+/ + "DBI:Pg:database=#{psql.db};host=#{psql.host};port=#{psql.port}" + else "DBI:Pg:database=#{psql.db};port=#{psql.port}" + end + end + def conn_dbi + DBI.connect(psql.dbi,psql.user,psql.db) + end + self + end + def mysql + def db + #"SiSU_#@pwd_stub" + end + def port + '**' + end + def dbi + "dbi:Mysql:database=#{mysql.db};port=#{mysql.port}" + end + self + end + def sqlite + def db + "#{@env.path.webserv}/#@pwd_stub/sisu_sqlite.db" + end + def dbi + "DBI:SQLite3:#{sqlite.db}" #sqlite3 ? + end + def sqlite3 + sqlite.db #sqlite3 ? + end + def conn_dbi + DBI.connect(sqlite.dbi) + end + def conn_sqlite3 + SQLite3::Database.new(sqlite.sqlite3) + end + self + end + end + class Info_port < Info_env + def initialize + @env=SiSU_Env::Info_env.new + end + def webrick + @env.url.webrick_port + end + end + class Info_program < Info_env #revisit + attr_accessor :editor,:wc,:tidy,:rexml,:pdflatex,:postgresql,:sqlite + def initialize + prog=SiSU_Env::Info_env.new.program + @editor,@wc,@tidy,@rexml,@pdflatex,@postgresql,@sqlite=prog.text_editor,prog.wc,prog.tidy,prog.rexml,prog.pdflatex,prog.postgresql,prog.sqlite + end + end + class Info_skin + def initialize(md=nil,skin=nil) + @md=md + @d_sk=if skin.class==String ; skin + elsif defined? md.doc_skin \ + and md.doc_skin + md.doc_skin + else nil + end + @home,@pwd=ENV['HOME'],ENV['PWD'] + m=/.+\/(?:src\/)?(\S+)/m # m=/.+?\/(?:src\/)?([^\/]+)$/im # m=/.+\/(\S+)/m + @pwd_stub=@pwd[m,1] + @env=SiSU_Env::Info_env.new + end + def select # skin loading logic here + load "#{SiSU_lib}/defaults.rb" + skin_path=[] + @env.sys.rc_path.each{|x| skin_path << "#{x}/skin"} + skin_path << "#{@env.path.processing}/external_document/skin" + #skin_path << "#{@env.path.processing}/external_document/_sisu/skin" #revisit + skin=true + if @pwd_stub =~/^sisupod$/ \ + and @md.mod.inspect !~/--trust/ + skin=false #security only run skins on sisupod if --trust flag is provided + end + doc_skin,dir_skin=nil,nil + if skin + unless @d_sk.nil? + sk_doc="doc/#@d_sk.rb" + skin_path.each do |v| #document skin priority 1 + if FileTest.file?("#{v}/#{sk_doc}") + doc_skin="#{v}/#{sk_doc}" + load doc_skin + break + end + end + end + unless doc_skin + sk_dir="dir/skin_#@pwd_stub.rb" + skin_path.each do |v| #directory skin priority 2 + if FileTest.file?("#{v}/#{sk_dir}") + dir_skin="#{v}/#{sk_dir}" + load dir_skin + break + end + end + end + end + sk=if doc_skin; doc_skin + elsif dir_skin; dir_skin + else nil + end + end + end + class CSS_default + def html + 'html.css' + end + def html_tables + 'html_tables.css' + end + def xhtml + 'xhtml.css' + end + def xml_sax + 'sax.css' + end + def xml_dom + 'dom.css' + end + def docbook_xml + 'docbook.css' + end + def homepage + 'homepage.css' + end + def harvest + 'harvest.css' + end + end + class CSS_select < Info_env + def initialize(md) + @md=md + @env=SiSU_Env::Info_env.new + end + def html + css=if @md.doc_css \ + and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_html.css") + "#{@md.doc_css}_html.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_html.css") + "#{@env.path.stub_pwd}_html.css" + else CSS_default.new.html + end + end + def html_tables + css=if @md.doc_css \ + and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_html_tables.css") + "#{@md.doc_css}_html_tables.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_html_tables.css") + "#{@env.path.stub_pwd}_html_tables.css" + else CSS_default.new.html_tables + end + end + def xhtml + css=if @md.doc_css \ + and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_xhtml.css") + "#{@md.doc_css}_xhtml.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_xhtml.css") + "#{@env.path.stub_pwd}_xhtml.css" + else CSS_default.new.xhtml + end + end + def xml_sax + css=if @md.doc_css \ + and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_xml_sax.css") + "#{@md.doc_css}_xml_sax.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_xml_sax.css") + "#{@env.path.stub_pwd}_xml_sax.css" + else CSS_default.new.xml_sax + end + end + def xml_dom + css=if @md.doc_css \ + and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_xml_dom.css") + "#{@md.doc_css}_xml_dom.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_xml_dom.css") + "#{@env.path.stub_pwd}_xml_dom.css" + else CSS_default.new.xml_dom + end + end + def docbook_xml + css=if @md.doc_css \ + and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_docbook.css") + "#{@md.doc_css}_xml_dom.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_docbook.css") + "#{@env.path.stub_pwd}_docbook.css" + else CSS_default.new.docbook_xml + end + end + def homepage + css=if @md.doc_css \ + and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_homepage.css") + "#{@md.doc_css}_homepage.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_homepage.css") + "#{@env.path.stub_pwd}_homepage.css" + else CSS_default.new.homepage + end + end + end + class CSS_stylesheet + def initialize(md) + @md=md + @css=CSS_select.new(@md) + @env=SiSU_Env::Info_env.new + end + def html + %{ <link rel="stylesheet" href="../#{@env.path.style}/#{@css.html}" type="text/css" />} + end + def html_tables + %{ <link rel="stylesheet" href="../#{@env.path.style}/#{@css.html_tables}" type="text/css" />} + end + end + class SiSU_file <Info_env #todo unify with Create_file + def initialize(md,fno='') + begin + @fno,@fns,@fnb=fno,md.fns,md.fnb + @env=SiSU_Env::Info_env.new(@fns) + @env_out="#{@env.path.output}/#@fnb" + rescue; STDERR.puts SiSU_Screen::Ansi.new(@cmd,$!,$@).rescue + ensure + end + end + def make_file(path,filename) + if File.writable?("#{path}/."); File.new("#{path}/#{filename}",'w+') + else SiSU_Screen::Ansi.new('',"is the file or directory writable?, could not create #{filename}").warn + end + end + def touch_file(path,filename) + if File.writable?("#{path}/."); + system("touch #{path}/#{filename}") + #File.new("#{path}/#{filename}",'w+') + else SiSU_Screen::Ansi.new('',"is the file or directory writable?, could not create #{filename}").warn + end + end + def make_path(path) + mkdir_p(path) unless FileTest.directory?(path) + end + def mkdir_initialize # not used but consider using + mkdir_p(@env.path.output) unless FileTest.directory?(@env.path.output) + mkdir_p("#{@env.path.output}/#@fnb") unless FileTest.directory?("#{@env.path.output}/#@fnb") + mkdir_p("#{@env.path.output}/#{@env.path.style}") unless FileTest.directory?("#{@env.path.output}/#{@env.path.style}") + mkdir_p(@env.path.dal) unless FileTest.directory?(@env.path.dal) + mkdir_p(@env.path.tune) unless FileTest.directory?(@env.path.tune) + end + def mkdir + dir=@env.path.output + txt_path="#{dir}/#@fnb" + mkdir_p(dir) unless FileTest.directory?(dir) + mkdir_p(txt_path) unless FileTest.directory?(txt_path) + mkdir_p("#{dir}/#{@env.path.style}") unless FileTest.directory?("#{dir}/#{@env.path.style}") + mkdir_p(@env.path.dal) unless FileTest.directory?(@env.path.dal) + mkdir_p(@env.path.tune) unless FileTest.directory?(@env.path.tune) + end + def mkfile #consider using more + path="#{@env.path.output}/#@fnb" + filename=@fno + file=make_file(path,filename) + end + def mkfile_man + path="#{@env.path.output}/man" + make_path(path) + filename=@fno + file=make_file(path,filename) + end + def mkfile_pwd + path=Dir.pwd + filename=@fno + file=make_file(path,filename) + end + end + class Create_file <Info_env #todo unify with SiSU_file + def initialize(cmd,fns,operation='') + @cmd=cmd + begin + super(fns) + @env=SiSU_Env::Info_env.new(fns) + ver=Info_version.instance + case operation #watch + when /pdf/; @env_out='' + when /sql/ + when /xml|plaintext|ascii/; @env_out="#{@env.path.output}/#@fnb" #check change of name to plaintext from ascii + else + if defined? @md.sfx_src \ + and @md.sfx_src =~/ss[ftsumc]/ + @env_suf='lm' + @env_out_root=@env.path.output + @env_out="#{@env.path.output}/#@fnb" + @env_tex=@env.path.tex + @env_lout=@env.path.lout + @@publisher='SiSU http://www.jus.uio.no/sisu' + @env_pdf="#@env_out_root/pdf" + end + end + rescue; STDERR.puts SiSU_Screen::Ansi.new(@cmd,$!,$@).rescue + ensure + end + end + def param_instantiate + @cX||=SiSU_Screen::Ansi.new(@cmd) + @@date=Info_date.new + @@proc=@@filename_txt=@@filename_texinfo=@@filename_lout_portrait=@@filename_lout_landscape=@@filename_html_scroll=@@filename_html_index=@@filename_html_segtoc=@@filename_semantic=@@filename_rss=@@newfile=@@drr=@@yaml=@@yamladdr=nil + @@publisher='SiSU scribe' + end + def html_root + #@env.path.output + end + def mkdir_pdf + Dir.mkdir(@env.path.tex) unless FileTest.directory?(@env.path.tex) + end + def file_generic(output_file='') + filename="#{@env.path.output}/#@fnb/#{output_file}" + File.new(filename,'w+') + end + def file_error + File.new('/tmp/errorlog.sisu','w+') + end + def file_meta + File.new("#{@env.path.dal}/#@fns.meta",'w+') + end + def file_meta_idx_html + File.new("#{@env.path.dal}/#@fns.idx.html",'w+') + end + def file_note + File.new("#{Dir.pwd}/#@fns.fn",'w+') + end + def marshal_meta + "#{@env.path.dal}/#@fns.meta.rbm" + end + def marshal_meta_idx_html + "#{@env.path.dal}/#@fns.idx_html.rbm" + end + def meta + "#{@env.path.dal}/#@fns.meta" + end + def file_tune + File.new("#{@env.path.tune}/#@fns.tune",'w+') + end + def marshal_tune + "#{@env.path.tune}/#@fns.marshal_tune" + end + def file_semantic + filename_semantic="./semantic.yaml" + @@filename_semantic=File.new(filename_semantic,'w+') + end + def file_rss + filename_rss="./semantic.xml" + @@filename_rss=File.new(filename_rss,'w+') + end + def file_html_scroll(md) + filename_scroll="#{@env.path.output}/#{md.fnb}/#{md.fnl[:pre]}doc#{md.fnl[:mid]}.html#{md.fnl[:post]}" + @@filename_html_scroll=File.new(filename_scroll,'w+') + end + def file_html_index(md) + filename_index="#{@env.path.output}/#{md.fnb}/#{md.fnl[:pre]}index#{md.fnl[:mid]}.html#{md.fnl[:post]}" + @@filename_html_index=File.new(filename_index,'w+') + end + def file_html_segtoc(md) + filename_segtoc="#{@env.path.output}/#{md.fnb}/#{md.fnl[:pre]}toc#{md.fnl[:mid]}.html#{md.fnl[:post]}" + File.new(filename_segtoc,'w+') + end + def file_texinfo + File.new("#{@env.path.texinfo}/#@fnb.texinfo",'w+') + end + end + class Create_site < Info_env + require "#{SiSU_lib}/css" + include SiSU_Style + def initialize(cmd) + @cmd=cmd + @env=SiSU_Env::Info_env.new + @home,@pwd=ENV['HOME'],ENV['PWD'] #@pwd=Dir.pwd + @rc=Get_init.instance.yamlrc + @vz=SiSU_Env::Get_init.instance.skin + @vz_home=SiSU_Viz::Home.new + end + def homepage + homepage_path=nil + @env.sys.rc_path.each do |v| + if FileTest.file?("#{v}/home/index.html") + homepage_path="#{v}/home/index.html" + break + end + end + mkdir_p("#{@env.path.webserv}/#{@env.path.stub_pwd}") unless FileTest.directory?("#{@env.path.webserv}/#{@env.path.stub_pwd}") + if homepage_path \ + and FileTest.file?(homepage_path) + cp(homepage_path,"#{@env.path.webserv}/#{@env.path.stub_pwd}/index.html") + cp(homepage_path,"#{@env.path.webserv}/#{@env.path.stub_pwd}/toc.html") + else + doc_skin=nil + sk_doc='doc/skin_sisu.rb' + @env.sys.rc_path.each do |v| #document skin priority 1 + if FileTest.file?("#{v}/skin/#{sk_doc}") + doc_skin="#{v}/skin/#{sk_doc}" + load doc_skin + break + end + end + filename_homepage=File.new("#{@env.path.webserv}/#{@env.path.stub_pwd}/index.html",'w') + filename_homepage_toc=File.new("#{@env.path.webserv}/#{@env.path.stub_pwd}/toc.html",'w') + filename_homepage << @vz_home.homepage + filename_homepage_toc << @vz_home.homepage + end + end + def cp_images(src_path,dest_path) + if FileTest.directory?(src_path) + cd(src_path) + source=Dir.glob("*.{png,jpg,gif,ico}") + mkdir_p(dest_path) unless FileTest.directory?(dest_path) + chmod(0755,dest_path) + source.each do |i| + cp_r(i,"#{dest_path}/#{i}") + chmod(0644,"#{dest_path}/#{i}") + end + cd(@pwd) + else puts "\tWARN, did not find - #{src_path}" + end + end + def cp_local_images + src="#@pwd/_sisu/image" + dest="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image" + cp_images(src,dest) + end + def cp_external_images + src="#{@env.path.processing}/external_document/image" + dest="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image_external" + cp_images(src,dest) + end + def cp_webserver_images + src=@env.path.image_source + dest="#{@env.path.webserv}/_sisu/image" + cp_images(src,dest) + end + def cp_webserver_images_local #this should not have been necessary + src=@env.path.image_source + dest="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image" + cp_images(src,dest) + end + def cp_base_images #fix images + src="#{@env.path.share}/image" + dest="#{@env.path.webserv}/_sisu/image_sys" + cp_images(src,dest) + end + def cp_css + mkdir_p("#{@env.path.output}/#{@env.path.style}") unless FileTest.directory?("#{@env.path.output}/#{@env.path.style}") + css_path=['/etc/sisu/css',"#@home/.sisu/css","#@pwd/_sisu/css"] #BROKEN + if defined? @rc['permission_set']['css_modify'] \ + and @rc['permission_set']['css_modify'] + tell=SiSU_Screen::Ansi.new(@cmd,"modify is css set to: #{@rc['permission_set']['css_modify']}") + css_path.each do |x| + if FileTest.directory?(x) + cd(x) + source=Dir.glob("*.{css}") + source.each do |i| + cp(i,"#{@env.path.output}/#{@env.path.style}") + end + cd(@pwd) + end + end + else tell=SiSU_Screen::Ansi.new(@cmd,"modify css is not set or is set to: false") + end + tell.warn if @cmd=~/[MV]/ + fn_css=SiSU_Env::CSS_default.new + css=SiSU_Style::CSS.new + path_style="#{@env.path.output}/#{@env.path.style}" + mkdir_p(path_style) unless FileTest.directory?(path_style) + style=File.new("#{path_style}/#{fn_css.homepage}",'w') + style << css.homepage + style.close + style=File.new("#{path_style}/#{fn_css.html_tables}",'w') + style << css.html_tables + style.close + style=File.new("#{path_style}/#{fn_css.html}",'w') + style << css.html + style.close + style=File.new("#{path_style}/#{fn_css.xml_sax}",'w') + style << css.xml_sax + style.close + style=File.new("#{path_style}/#{fn_css.xml_dom}",'w') + style << css.xml_dom + style=File.new("#{path_style}/#{fn_css.docbook_xml}",'w') + style << css.docbook_xml + style.close + style=File.new("#{path_style}/#{fn_css.xhtml}",'w') + style << css.xhtml + style=File.new("#{path_style}/#{fn_css.harvest}",'w') + style << css.harvest + style.close + end + end +end +module SiSU_Screen + require "#{SiSU_lib}/screen_text_color" +end +module SiSU_Errors + require "#{SiSU_lib}/errors" +end +__END__ +https? intro check 2007-09-22 + +fns_array=unless fns =~/\.ssm.sst$/ + if RUBY_VERSION < '1.9' + IO.readlines(fns,'') + else IO.readlines(fns,'r:utf-8') + end +else + if RUBY_VERSION < '1.9' + IO.readlines("#{path.composite_file}/#{fns}",'') + else IO.readlines("#{path.composite_file}/#{fns}",'r:utf-8') + end +end |