=begin * Name: SiSU * Description: a framework for document structuring, publishing and search * Author: Ralph Amissah * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah All Rights Reserved. * License: GPL 3 or later: SiSU, a framework for document structuring, publishing and search Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . If you have Internet connection, the latest version of the GPL should be available at these locations: * SiSU uses: * Standard SiSU markup syntax, * Standard SiSU meta-markup syntax, and the * Standard SiSU object citation numbering and system * Hompages: * Download: * Ralph Amissah ** Description: SiSU information Structuring Universe, text structuring, processing, publishing, search =end module SiSU require "#{SiSU_lib}/sysenv" include SiSU_Screen @@pwd=Dir.pwd class Remote_download def initialize(requested_file) @requested_file=requested_file end def pod re_p_div=/http:\/\/([^\/]+)(\/\S+?)\/(sisupod(?:\.zip)?|[^\/]+?\.ssp)$/ re_p=/(sisupod(?:\.zip)?|[^\/]+?\.ssp)$/ if @requested_file =~ re_p_div @site,@pth,@pod= re_p_div.match(@requested_file).captures elsif @requested_file =~ re_p @pod= re_p.match(@requested_file).captures end def site @site end def path @pth end def dir_stub re_p_stub=/.+?([^\/]+)$/ pod_stub= re_p_stub.match(path).captures.join if path end def name_source @pod end def name pod_download_as=if name_source=~/(?:sisupod\.(?:zip|ssp))/; dir_stub + '.ssp' else name_source end end self end end class Op @@env=SiSU_Env::Info_env.new def initialize(opt,req,message) @opt,@req,@message=opt,req,message @n_do=0 end def pod_output(fns_pod) dir_pwd=@@env.path.pwd dir_pod=@@env.sisupod_gen(fns_pod) Dir.chdir(dir_pod) content=Dir.glob("*.ss[mt]").join(' ') if content =~/\.ss[mt]/ Dir.chdir(dir_pwd) @opt.fns=content #check system("cd #{dir_pod} sisu -CC #{@opt.cmd} #{@opt.mod.join(' ')} #{content} cd - ") end @pwd=`pwd`.strip Dir.chdir(@pwd) end def select require "#{SiSU_lib}/#@req" if @req =~/^conf$/; SiSU_Initialize::Source.new(@opt).read # -C end if not @opt.files.empty? @opt.files.each do |fns| env=SiSU_Env::Info_env.new(fns) if fns =~ /(?:sisupod(?:\.zip)?|\.ssp)$/ pod_name=Remote_download.new(fns).pod.name tell=SiSU_Screen::Ansi.new(@opt.cmd,pod_name) tell.puts_blue unless @opt.cmd =~/q/ @opt.files.shift pod_output(pod_name) break else put=fns.gsub(/(.+)?\.ssm\.sst$/,'\1.ssm') @opt.fns=fns if @req !~/(?:urls|remote)$/ if @req=~/^dal$/ \ and FileTest.file?(@opt.fns) \ and @opt.fns =~ /\.(?:(?:-|ssm\.)?sst|ssm)$/ if fns =~ /\.ssm$/; require "#{SiSU_lib}/composite" #pre-processing SiSU_Assemble::Composite.new(@opt).read @opt.fns=fns.gsub(/\.ssm$/,'.ssm.sst') end SiSU_DAL::Source.new(@opt).read # -m elsif FileTest.file?(env.source_file_with_path) case @opt.fns when /\.(?:(?:-|ssm\.)?sst|ssm)$/ case @req when /^dal$/ if fns =~ /\.ssm$/; require "#{SiSU_lib}/composite" #pre-processing SiSU_Assemble::Composite.new(@opt).read @opt.fns=fns.gsub(/\.ssm$/,'.ssm.sst') end SiSU_DAL::Source.new(@opt).read # -m when /^concordance$/; SiSU_Concordance::Source.new(@opt).read # -w when /^share_src$/; SiSU_Markup::Source.new(@opt).read # -s when /^sisupod_make$/; SiSU_Doc::Source.new(@opt).read # -S when /^source_kdissert$/; SiSU_Kdi_source::Source.new(@opt).read ## -S when /^digests$/; SiSU_Digest_view::Source.new(@opt).read # -N when /^xml_scaffold$/; SiSU_XML_scaffold::Source.new(@opt).read # -T when /^plaintext$/; SiSU_Plaintext::Source.new(@opt).read # -a -A -e -E -f when /^wikispeak$/; SiSU_Wikispeak::Source.new(@opt).read # -g when /^odf$/; SiSU_ODF::Source.new(@opt).read # -o when /^xml_md_oai_pmh_dc$/; SiSU_XML_metadata::OAI_PMH.new(@opt).read # -O when /^texpdf$/; SiSU_TeX::Source.new(@opt).read # -p when /^manpage$/; SiSU_manpage::Source.new(@opt).read # -i when /^texinfo$/; SiSU_TexInfo::Source.new(@opt).read # -I #when /^plaintext_exp$/; SiSU_Plaintext_exp::Source.new(@opt).read # -j #when /^manpage_exp$/; SiSU_manpage_exp::Source.new(@opt).read # -J #when /^docbook$/; SiSU_Docbook::Source.new(@opt).read # -B when /^html$/; SiSU_HTML::Source.new(@opt).read # -h -H when /^xml$/; SiSU_XML_SAX::Source.new(@opt).read # -x when /^xml_dom$/; SiSU_XML_DOM::Source.new(@opt).read # -X when /^xhtml$/; SiSU_XHTML::Source.new(@opt).read # -b when /^embedded$/; SiSU_Embedded::Source.new(@opt).read # -m (image and other content) when /^manifest$/; SiSU_Manifest::Source.new(@opt).read # -y when /^sitemaps$/; SiSU_Sitemaps::Source.new(@opt).read # -Y when /^zap$/; SiSU_Zap::Source.new(@opt).read # -Z when /^dbi$/; SiSU_DBI::SiSU_SQL.new(@opt).connect # -D -d end @n_do=@n_do+1 tell=SiSU_Screen::Ansi.new(@opt.cmd,@n_do,"#{@req.upcase} processed") tell.files_processed unless @opt.cmd =~/q/ ObjectSpace.garbage_collect else #print "not processed --> ", fns, "\n" end else Operations.new(@opt).not_found unless @req =~/^conf$/ end elsif FileTest.file?(put) case @req when /^urls$/; SiSU_urls::Source.new(@opt).read # -u -v -V -M when /^remote$/ case @message when /scp/; SiSU_Remote::Put.new(@opt).scp # -r when /rsync/; SiSU_Remote::Put.new(@opt).rsync # -R else #SiSU_Remote::Put.new(put,@opt.cmd).scp end end @n_do=@n_do+1 tell=SiSU_Screen::Ansi.new(@opt.cmd,@n_do,"#{@req.upcase} processed") tell.files_processed unless @opt.cmd =~/q/ else Operations.new(@opt).not_found end end end elsif @req =~/^dbi$/; SiSU_DBI::SiSU_SQL.new(@opt).connect # -D -d elsif @req=~/^sisupod_make$/; SiSU_Doc::Source.new(@opt).read # -S end Operations.new.counter end end class Operations @@n_do=0 def initialize(opt='') @opt=opt @cX=SiSU_Screen::Ansi.new(@opt).cX end def counter @@n_do=0 end def remote_put_base_site_rsync # -CR p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ require "#{SiSU_lib}/remote" SiSU_Remote::Put.new(@opt).rsync_base end def remote_put_base_site_rsync_match # -CCRZ p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ require "#{SiSU_lib}/remote" SiSU_Remote::Put.new(@opt).rsync_base_sync end def remote_put_base_site # -Cr p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ require "#{SiSU_lib}/remote" SiSU_Remote::Put.new(@opt).scp_base end def remote_put_base_site_all # -CCr p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ require "#{SiSU_lib}/remote" SiSU_Remote::Put.new(@opt).scp_base_all end def cgi # -F require "#{SiSU_lib}/cgi" SiSU_CGI::SiSU_search.new(@opt).read end def encoding # -K build character encoding db (uses KirbyBase) require "#{SiSU_lib}/character_encoding" SiSU_character_encode::Create.new.db end def termsheet # -t system("sisu_termsheet #{@opt.cmd} #{@opt.fns}\n") @@n_do=@@n_do+1 tell=SiSU_Screen::Ansi.new(@opt.cmd,@@n_do,'Termsheet(s) processed') tell.term_sheet_title unless @opt.cmd =~/q/ end def webrick # -W port=prt=@fns prt=if prt !~/\d+/; 'webrick default (sysenv)' else "webrick port set to #{prt}" end puts %{#{@cX.blue}<<#{@cX.off}#{@cX.green}Start Webrick web server on port: #{prt}#{@cX.off}#{@cX.blue}>> #{@cX.off*2} } system("sisu_webrick #{port}&\n") end def not_found puts "\n#{@cX.fuschia}FILE NOT FOUND:#{@cX.off} << #{@opt.fns} >> - requested #{@opt.cmd} processing skipped\n" end def convert_name_message(fns,type,i,o,rune) %{\nIn filename: "#{@cX.fuschia}#{fns}#{@cX.off}" << #{type} >> #{@cX.fuschia}is apre 0.36 markup filename.#{@cX.off} #{@cX.brown}Please rename your file.#{@cX.off}\n\tAs of sisu-0.37, SiSU markup files with #{@cX.brown}the extensions #{i} should be re-named #{o}#{@cX.off}\n\tif you have the program called 'rename' installed, the following rune should do the trick:\n\t\t#{rune}\n\talternatively try:\n\t\tsisu --convert --36to37 #{fns}\n\trequested #{@opt.cmd} processing skipped\n} end def not_recognised case @opt.fns when /(\.s[123])$/ type=@opt.fns.gsub(/\S+?(#{$1})/,'\1') rune=%q{rename 's/\.s[123]$/\.sst/' *.s{1,2,3}} puts convert_name_message(@opt.fns,type,'.s1 .s2 and .s3','.sst',rune) when /(\.r[123])$/ type=@opt.fns.gsub(/\S+?(#{$1})/,'\1') rune=%q{rename 's/\.r[123]$/\.ssm/' *.r{1,2,3}} puts convert_name_message(@opt.fns,type,'.r1 .r2 and .r3','.sst',rune) puts %{\n\tNote also that you will need to change the names of the files called/required\n\twithin the document text to build the composite document\n\t\t.s1 .s2 .s3 should be .sst \n\t\t.si should be .ssi\n\trequested #{@opt.cmd} processing skipped\n} when /(\.ssi)$/ puts "\n#{@cX.fuschia}component filetype:#{@cX.off} << #{@opt.fns} >> - is not a processed filetype, (it may be used as a component of a .ssm markup file)\n\trequested #{@opt.cmd} processing skipped\n" else puts "\n#{@cX.fuschia}FILETYPE NOT RECOGNISED:#{@cX.off} << #{@opt.fns} >> - is not a recognized filetype,\n\trequested #{@opt.cmd} processing skipped\n" end end end class Processing require 'fileutils' include FileUtils @@env=SiSU_Env::Info_env.new attr_accessor :op def initialize(opt) @opt=opt @msg,@msgs='',nil @tell=lambda { SiSU_Screen::Ansi.new(@opt.cmd,@msg,"#{@msgs.inspect if @msgs}") } end def op(req,msg) Op.new(@opt,req,msg).select if req and msg end def actions if @opt.mod.inspect =~/--convert|--to|--from/; require "#{SiSU_lib}/sst_convert_markup" end if @opt.cmd =~/([abCcDdFfgGHhIiJjLMmNnOopQqrRSsTtUuVvwWXxYyZ_0-9])/ \ and @opt.cmd =~/^-/ \ and @opt.mod.inspect !~/--(?:sitemaps|query|identify)/ \ or @opt.mod.inspect =~/--(?:(?:sq)?lite|pg(?:sql)?)/ #and @@tell=SiSU_Screen::Ansi.new(@opt.cmd) @cX=SiSU_Screen::Ansi.new(@opt.cmd).cX flag=SiSU_Env::Info_processing_flag.new extra='' if @opt.cmd !~/[mn]/ extra+=if @opt.cmd =~/[abghHhIiJjNOoptTwXxz]/ \ and @opt.cmd !~/[mn]/; 'm' #% add dal elsif ((@opt.cmd =~/[Dd]/ \ or (@opt.mod.inspect =~/--(?:(?:sq)?lite|pg(?:sql)?)/)) \ and @opt.mod.inspect !~/(?:remove|(?:(?:re)?create(?:all)?|dropall|drop)$)/) \ and @opt.cmd !~/[mn]/ 'm' #% add dal else '' end end if @opt.cmd !~/y/ extra+=if @opt.cmd =~/[abehHhIiJjNopsSstwXxz]/ \ and @opt.cmd !~/y/ 'y' #% add manifest elsif (@opt.cmd =~/[Dd]/ \ or @opt.mod.inspect =~/--(?:(?:sq)?lite|pg(?:sql)?)/) \ and @opt.files[0] !~/^remove$/ \ and @opt.cmd !~/y/ 'y' #% add manifest else '' end end @opt.cmd=@opt.cmd + extra if @opt.cmd =~/[vVM]/ #% version information if @opt.cmd =~/V/ \ and @opt.files.empty? #% environment SiSU_Help::Help.new('env',@opt).environment else SiSU_Help::Help.new('env',@opt).sisu_version end end if @opt.cmd =~/^-L$/; SiSU_Help::Help.new('license',@opt).help_request #% version information end if @opt.cmd =~/m/i #% -m for -C path={} path[:css]=@@env.path.output + '/_sisu/css' path[:xml]=@@env.path.output + '/_sisu/xml' path[:xsd]=path[:xml] + '/xsd' path[:xsd]=path[:xml] + '/rnc' path[:xsd]=path[:xml] + '/rng' #path_dtd="#{@@env.path.output}/_sisu/xml/dtd" re_p=/(sisupod(?:\.zip)?|[^\/]+?\.ssp)$/ unless @opt.files.join(',') =~ re_p #do not mix pods with source markup files in command line unless ( FileTest.directory?(path[:css]) \ and FileTest.directory?(path[:xsd]) ) @opt.cmd=@opt.cmd +='C' unless @opt.cmd =~/C/ #FIX end if @opt.cmd =~/M/; $VERBOSE=false #debug $VERBOSE=true # -M test other expected directories including images end end end if @opt.cmd =~/C/ #% -C initialize/configure op('conf','configure site') if @opt.cmd =~/R/ if @opt.mod.inspect =~/--init(?:ialize)?=site/ \ and @opt.cmd =~/RZ/ Operations.new(@opt).remote_put_base_site_rsync_match else Operations.new(@opt).remote_put_base_site_rsync end elsif @opt.cmd =~/r/ if @opt.mod.inspect =~/--init(?:ialize)?=site/ \ and @opt.cmd =~/CCr/ Operations.new(@opt).remote_put_base_site_all else Operations.new(@opt).remote_put_base_site end end end if @opt.cmd =~/F/ #% -F cgi sample search form Operations.new(@opt).cgi end if @opt.cmd =~/W/; Operations.new(@opt).webrick #% -W webrick #@argv==port end if @opt.cmd =~/k/ #% -k dummy, build character encoding table #Operations.new(@opt.cmd).encoding end if @opt.cmd =~/Z/; op('zap','Zap, deletions') #% -Z wipe previous output clean end if @opt.cmd =~/s/; op('share_src','SiSU markup source') #% -s sisu source end if @opt.cmd =~/m/ #% -m is remote url requested? (download if) @retry_count= -1 begin path_image='./_sisu/processing/external_document/image' path_skin='./_sisu/processing/external_document/skin/doc' @get_s,@get_p=[],[] re_s=/((?:https?|file):\/\/\S+?\.sst)/ re_p=/((?:https?|file):\/\/\S+?(?:\/sisupod(?:\.zip)?|\.ssp))/ @opt.files.each do |fns| if fns =~re_s @get_s << re_s.match(fns)[1] if re_s end if fns =~re_p @get_p << re_p.match(fns)[1] if re_p end end if @get_s.length > 0 #% remote markup file .sst require "#{SiSU_lib}/remote" SiSU_Remote::Get.new(@opt,@get_s).fns Operations.new.counter end if @get_p.length > 0 #% remote sisupod require "#{SiSU_lib}/remote" SiSU_Remote::Get.new(@opt,@get_p).sisupod end rescue; SiSU_Errors::Info_error.new($!,$@,@opt,@fns).error #ok @retry_count +=1 retry unless @retry_count > 1 ensure end @opt.files=@opt.files.collect {|x| x=x.gsub(/(?:https?|file):\/\/\S+\/(\S+)\.sst/,'\1.-sst') } end if @opt.cmd=~/m/; op('dal','dal') #% -m dal end @opt.files=@opt.files.collect {|x| x=x.gsub(/\.ssm$/,'.ssm.sst') } if @opt.cmd =~/S/ op('sisupod_make','sisupod (zip)') #% -S make sisupod if @opt.fns=~/\.kdi._sst/ op('share_src_kdissert','kdissert (kdi)') #% -S share kdissert source end end if @opt.cmd =~/N/; op('digests','digests') #% -N digest tree end if @opt.cmd =~/[hHz]/; op('html','html') #% -h -H -z html css end if @opt.cmd =~/a/; op('plaintext','plaintext') #% -a #-A -f -e -E plaintext -a creates ms-dos type; -A creates unix type, plaintext file end if @opt.cmd =~/g/; op('wikispeak','wikispeak') #% -g wiki end if @opt.cmd =~/o/; op('odf','OpenDocument') #% -o opendocument end if @opt.cmd =~/x/; op('xml','xml sax') #% -x xml sax type end if @opt.cmd =~/X/; op('xml_dom','xml dom') #% -X xml dom type end if @opt.cmd =~/b/; op('xhtml','xhtml sax') #% -b xhtml sax type end #if @opt.cmd =~/B/; op('docbook','docbook xml') #% -B docbook xml #end if @opt.cmd =~/w/; op('concordance','Concordance') #% -w concordance end if @opt.cmd =~/O/; op('xml_md_oai_pmh_dc','OAI PMH') #% -O open archive initiative, metadata harvesting end if @opt.cmd =~/t/ #% -t termsheet/standard form SiSU_Help::Help.new('termsheet').help_request @opt.files.each do |fns| if FileTest.file?(fns) @opt.fns=fns case @opt.fns when /\.(termsheet.rb)$/; Operations.new(@opt).termsheet else #print "not processed --> ", fns, "\n" end else Operations.new(@opt).not_found end end Operations.new.counter end if @opt.cmd =~/T/; op('xml_scaffold','XML scaffold') #% -T temporary tests end if @opt.cmd =~/p/; op('texpdf','LaTeX pdf') #% -p latex/ texpdf end if @opt.cmd =~/i/; op('manpage','manpage') #% -i manpage end if @opt.cmd =~/I/; op('texinfo','TeX Info') #% -I texinfo (i taken by db import) end #if @opt.cmd =~/j/; op('plaintext_exp','plaintext exp') #% -j plaintext #end #if @opt.cmd =~/J/; op('manpage_exp','manpage exp') #% -J manpage #end if @opt.cmd =~/D/ \ or @opt.mod.inspect =~/--pgsql/; op('dbi','postgresql') #% -D DB postgresql end if @opt.cmd =~/d/ \ or @opt.mod.inspect =~/--sqlite/; op('dbi','sqlite') #% -d DB sqlite end if @opt.cmd =~/G/; Operations.new(@opt).cgi #% -G cgi - used to make dbi intecface end if @opt.cmd=~/m/; op('embedded','Embedded Content') #% -m embedded content end if @opt.cmd =~/y/; op('manifest','Manifest') #% -y manifest end if @opt.cmd =~/Y/; op('sitemaps','Sitemap') #% -Y sitemap end if @opt.cmd =~/r/; op('remote','scp') #% -r copy to remote server end if @opt.cmd =~/R/; op('remote','rsync') #% -R copy to remote server end if @opt.cmd =~/[QuUvVM]/; op('urls','urls') #% -Q -u -v -V -M urls end @msg,@msgs="\tsisu -W [to start ruby web-server on output directory]\n",nil @tell.call.print_brown if @opt.cmd =~/[uUvVM]/ unless @opt.files.join.empty? if defined? @@env.path.processing \ and FileTest.directory?(@@env.path.processing) \ and @@env.path.processing =~/#{@@env.user}$/ #clean temporary processing directory of content as is located in public area cd(@@env.path.processing_base_tmp) do rm_rf(@@env.user) unless @opt.cmd =~/M/ end end elsif @opt.mod.inspect =~/--query/ require "#{SiSU_lib}/sst_identify_markup" puts SiSU_Markup::Markup_history.new(@opt).query elsif @opt.mod.inspect =~/--identify/ require "#{SiSU_lib}/sst_identify_markup" markup_version=SiSU_Markup::Markup_identify.new(@opt).markup_version? elsif @opt.mod.inspect =~/--about/ #% help instructions if @opt.mod.inspect =~/--about/ \ and not @opt.what.empty? SiSU_Help::Help.new(@opt.what,'color_off').help_request else SiSU_Help::Help.new('list','color_off').help_request end elsif @opt.mod.inspect =~/--sitemaps/ #% sitemaps require "#{SiSU_lib}/sitemaps" SiSU_Sitemaps::Source.new(@opt).read if @opt.cmd =~/R/ require "#{SiSU_lib}/remote" SiSU_Remote::Put.new(@opt).rsync_sitemaps end else #% help instructions unless @opt.mod.inspect =~/--convert|--to|--from/ if @opt.mod.inspect =~/--help/ \ and not @opt.what.empty? SiSU_Help::Help.new(@opt.what).help_request elsif @opt.mod.inspect =~/--help/; SiSU_Help::Help.new('list').help_request else SiSU_Help::Help.new('env',@opt).sisu_version tell=SiSU_Screen::Ansi.new(''," for HELP type:\n\tsisu --help [help request]\n\tman sisu\n or see the system or online documentation on SiSU:\n #{Config::CONFIG['datadir']}/doc/sisu/\n \n "); tell.puts_grey end end end @opt.files.each do |fns| if FileTest.file?(fns) @opt.fns=fns unless @opt.fns =~ /(?:\.(?:(?:-|ssm\.)?sst|ssm|ssp|sx[sdn]\.xml|termsheet.rb)|sisupod(?:\.zip)?)$/ if @opt.fns=~/\.kdi$/ \ and @opt.mod.inspect =~/--(?:convert(?:-from)?|from)[=-]kdi/ elsif @opt.fns=~/\.sx[sdn]\.xml$/ \ and @opt.mod.inspect =~/--(?:(?:convert(?:-from)?|from)[=-])?(?:xml2sst|sxml)/ elsif @opt.fns=~/\.ssi$/ \ and @opt.mod.inspect =~/--identify/ else Operations.new(@opt).not_recognised end end if @opt.fns =~/\.ssm\.sst$/ \ and @opt.cmd !~/[S_M]/ # rework necessry, revist, the _ flag is a hack, to keep ._sst files @msg,@msgs='temporary file removed',nil @tell.call.warn unless @opt.cmd =~/V/ File.unlink(@opt.fns) if File.exist?(@opt.fns) #CONSIDER end else #Operations.new(fns,'html').not_found end end end end begin #% select what to do require 'jcode' $KCODE='UTF8' require "#{SiSU_lib}/options" require "#{SiSU_lib}/sysenv" include SiSU_Env include SiSU_Screen require "#{SiSU_lib}/param" include SiSU_Param require "#{SiSU_lib}/defaults" include SiSU_Viz require "#{SiSU_lib}/help" include SiSU_Help require 'uri' home=ENV['HOME'] argv=$* @opt=SiSU_commandline::Options.new(argv) Processing.new(@opt).actions rescue; STDERR.puts SiSU_Screen::Ansi.new(@opt,$!,$@,nil).rescue #fix ensure Dir.chdir(@@pwd) end end __END__