diff options
| author | Ralph Amissah <ralph@amissah.com> | 2022-04-28 12:21:24 -0400 | 
|---|---|---|
| committer | Ralph Amissah <ralph@amissah.com> | 2022-04-28 12:21:24 -0400 | 
| commit | 70d190dd7c1f13270e5acac8ec64e113b917ec8d (patch) | |
| tree | 70b2c52aaad12ca1ff85f3c2c10284060cc05144 /org/misc.org | |
| parent | debian/changelog (7.2.0-1) (diff) | |
| parent | project config minor, also .gitignore (diff) | |
Merge tag 'sisu_7.2.1' into debian
SiSU 7.2.1
Diffstat (limited to 'org/misc.org')
| -rw-r--r-- | org/misc.org | 4123 | 
1 files changed, 4123 insertions, 0 deletions
| diff --git a/org/misc.org b/org/misc.org new file mode 100644 index 00000000..abb23cc1 --- /dev/null +++ b/org/misc.org @@ -0,0 +1,4123 @@ +-*- mode: org -*- +#+TITLE:       sisu misc +#+DESCRIPTION: documents - structuring, various output representations & search +#+FILETAGS:    :sisu:misc: +#+AUTHOR:      Ralph Amissah +#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] +#+COPYRIGHT:   Copyright (C) 2015 - 2021 Ralph Amissah +#+LANGUAGE:    en +#+STARTUP:     content hideblocks hidestars noindent entitiespretty +#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t +#+PROPERTY:    header-args  :exports code +#+PROPERTY:    header-args+ :noweb yes +#+PROPERTY:    header-args+ :eval no +#+PROPERTY:    header-args+ :results no +#+PROPERTY:    header-args+ :cache no +#+PROPERTY:    header-args+ :padline no +#+PROPERTY:    header-args+ :mkdirp yes + +* misc sort +** air.rb + +#+HEADER: :tangle "../lib/sisu/air.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Air +  require_relative 'se_hub_particulars'                 # se_hub_particulars.rb +  class Source +    @@ao_array=[] +    @@fns=nil +    def initialize(opt) +      @opt=opt +      @@fns||@opt.fns +      @particulars=SiSU_Particulars::Combined.new(opt) +      #@env=@particulars.env +      #@md=@particulars.md +      #@ao_array=@particulars.ao_array +    end +    def read +    end +  protected +    def print +      puts @particulars.md.inspect +      puts @particulars.env.inspect +      puts @particulars.ao_array +    end +  end +end +__END__ +#+END_SRC + +** embedded.rb + +#+HEADER: :tangle "../lib/sisu/embedded.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Embedded +  require_relative 'dp'                                 # dp.rb +    include SiSU_Param +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  class Source +    def initialize(opt) +      @opt=opt +      @md=SiSU_Param::Parameters.new(@opt).get +      @env=SiSU_Env::InfoEnv.new(@md.fns) +      @rhost=SiSU_Env::InfoRemote.new(@opt).remote_host_base +      @base_src_dir=@opt.f_pth[:pth].sub(/\/#{@opt.f_pth[:lng]}$/,'') +      @f=SiSU_Env::FileOp.new(@md) +    end +    def read +      songsheet +    end +    def songsheet +      images +      audio +      multimedia +      begin +      rescue +        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +    def images +      src="#{@base_src_dir}/_sisu/image" +      ldest=@env.path.output +      img_dir="#{@env.path.output}/_sisu/image" +      @rhost.each do |remote_conn| +        if (@md.opt.act[:verbose][:set]==:on \ +        || @md.opt.act[:verbose_plus][:set]==:on \ +        || @md.opt.act[:maintenance][:set]==:on \ +        || @md.opt.act[:rsync][:set]==:on) \ +        and FileTest.directory?(src) +          FileUtils::mkdir_p(img_dir) unless FileTest.directory?(img_dir) +          src_ec=@f.place_file.images.rel + '/' + @md.ec[:image].join(" #{@f.output_path.images.rel}/") +          unless @opt.fns =~/\.-sst$/ +            SiSU_Env::SystemCall.new(src_ec,ldest,'q').rsync('--relative',@opt.base_path) +            #if @md.opt.selections.str.inspect =~/R/ #rsync to remote image directory +            #  SiSU_Env::SystemCall.new(src_ec,remote_rel,'q').rsync('--relative') +            #end +          end +        end +      end +    end +    def audio +      #p @md.ec[:audio] +      src="#{@base_src_dir}/_sisu/mm/audio" +      ldest="#{@env.path.webserv}/#{@env.path.base_markup_dir_stub}/_sisu/mm/audio" +      @rhost.each do |remote_conn| +        rdest="#{remote_conn[:name]}/#{@env.path.base_markup_dir_stub}/_sisu/mm/audio" +        if (@md.opt.act[:verbose][:set]==:on \ +        || @md.opt.act[:verbose_plus][:set]==:on \ +        || @md.opt.act[:maintenance][:set]==:on \ +        || @md.opt.act[:rsync][:set]==:on) \ +        and FileTest.directory?(src) +          FileUtils::mkdir_p(ldest) unless FileTest.directory?(ldest) +          src_ec="#{src}/" + @md.ec[:audio].join(" #{src}/") +          SiSU_Env::SystemCall.new(src_ec,"#{ldest}/.",'q').rsync +          if @md.opt.act[:rsync][:set]==:on #rsync to remote audio directory +            SiSU_Env::SystemCall.new(src_ec,"#{rdest}/.",'q').rsync +          end +        end +      end +    end +    def multimedia +      #p @md.ec[:multimedia] +      src="#{@base_src_dir}/_sisu/mm/video" +      ldest="#{@env.path.webserv}/#{@env.path.base_markup_dir_stub}/_sisu/mm/video" +      @rhost.each do |remote_conn| +        rdest="#{remote_conn[:name]}/#{@env.path.base_markup_dir_stub}/_sisu/mm/video" +        if (@md.opt.act[:verbose][:set]==:on \ +        || @md.opt.act[:verbose_plus][:set]==:on \ +        || @md.opt.act[:maintenance][:set]==:on \ +        || @md.opt.act[:rsync][:set]==:on) \ +        and FileTest.directory?(src) +          FileUtils::mkdir_p(ldest) unless FileTest.directory?(ldest) +          src_ec="#{src}/" + @md.ec[:multimedia].join(" #{src}/") +          SiSU_Env::SystemCall.new(src_ec,"#{ldest}/.",'q').rsync +          if @md.opt.act[:rsync][:set]==:on #rsync to remote video directory +            SiSU_Env::SystemCall.new(src_ec,"#{rdest}/.",'q').rsync +          end +        end +      end +    end +  end +end +__END__ +#+END_SRC + +** errors.rb + +#+HEADER: :tangle "../lib/sisu/errors.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Errors +  require_relative 'se'                                 # se.rb +    include SiSU_Env; include SiSU_Screen +  class Rescued <CreateFile +    def initialize(error,errorlist,cmd,fns='') +      @fns,@cmd,@error,@errorlist=fns,cmd,error,errorlist +      @cmd=(cmd \ +      && (cmd =~/c/)) \ +      ?  'Vc' +      : 'V' +    end +    def location +      file=@fns \ +      ? (SiSU_Env::CreateFile.new(@fns).file_error) +      : (File.new('/tmp/errorlog.sisu','w+')) +      file << @fns << "\n" << @error << "\n" << @errorlist +      file.close +      if @cmd=~/[vVM]/ +        SiSU_Screen::Ansi.new('',$!,$@).rescue do +          (block_given?) ? yield : __LINE__.to_s + ':' + __FILE__ +        end +      else +        SiSU_Screen::Ansi.new('',"rescued, exception raised, silenced").puts_grey +      end +    end +  end +end +__END__ +#+END_SRC + +** git.rb + +#+HEADER: :tangle "../lib/sisu/git.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Git +  require_relative 'dp'                                 # dp.rb +  require_relative 'se'                                 # se.rb +  require_relative 'ao'                                 # ao.rb +  class Source +    def initialize(opt,process=:complete) +      @opt,@process=opt,process +      @env=SiSU_Env::InfoEnv.new +      @md=SiSU_Param::Parameters.new(@opt).get +      @file=SiSU_Env::FileOp.new(@md) +      l=SiSU_Env::StandardiseLanguage.new(@md.opt.lng).language +      unless @opt.lng==l[:c] # @md.i18n[0]==l[:c] +        p "using: #{@opt.lng} (@make: :language:); filename #{@md.fns} filename language: #{l[:c]}, mismatch" +      end +      if @env.output_dir_structure.multilingual? +        m=/((.+?)(?:\~\w{2,3})?)\.((?:-|ssm\.)?sst|ssm)$/ #watch added match for sss +        fnb,fnt=@opt.fns[m,2],@opt.fns[m,3] +      else m=/(.+?)\.((?:-|ssm\.)?sst|ssm)$/ +        fnb=@fnn=@opt.fns[m,1] +        fnt=@opt.fns[m,2] +      end +      git_path_fnb=@env.processing_path.git + '/' + fnb +      lng=(@md.opt.lng) ? (@md.opt.lng) : (@md.i18n[0]) +      @git_path={ +        fnb:       git_path_fnb, +        doc:       git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:doc] + '/' + lng, +        po:        git_path_fnb + '/' + Gt[:po] + '/' + lng, +        pot:       git_path_fnb + '/' + Gt[:pot], +        conf:      git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:conf], +        image:     git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:image], +        audio:     git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:audio], +        video:     git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:video], +        conf:      git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:conf] +      } +      SiSU_AO::Source.new(@opt,nil,@process).read                            # -m +    end +    def create_file_structure_git +      make_dir_fnb +      if program_found? +        git_init +      end +    end +    def read +      create_file_structure_git +      populate.sisusrc_files +      #if program_found? +      #  git_commit +      #end +      unless @opt.act[:quiet][:set]==:on +        (@opt.act[:verbose][:set]==:on \ +        || @opt.act[:verbose_plus][:set]==:on \ +        || @opt.act[:maintenance][:set]==:on) \ +        ? SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            'Git path', +            @git_path[:fnb] +          ).green_hi_blue +        : SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            'Git path', +            @git_path[:fnb] +          ).green_title_hi +        if (@opt.act[:verbose][:set]==:on \ +        || @opt.act[:verbose_plus][:set]==:on \ +        || @opt.act[:maintenance][:set]==:on) +          SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            "Git path", +            "#{@opt.fns} -> #{@git_path[:fnb]}" +          ).warn +        end +      end +    end +    def program_found? +      found=`whereis git` +      (found =~/bin\/git\b/) ? true : false +    end +    def make_dir_fnb +      FileUtils::mkdir_p(@git_path[:fnb]) \ +        unless FileTest.directory?(@git_path[:fnb]) +      FileUtils::mkdir_p(@git_path[:doc]) \ +        unless FileTest.directory?(@git_path[:doc]) +      FileUtils::mkdir_p(@git_path[:po]) \ +        unless FileTest.directory?(@git_path[:po]) +      FileUtils::mkdir_p(@git_path[:pot]) \ +        unless FileTest.directory?(@git_path[:pot]) +      FileUtils::mkdir_p(@git_path[:conf]) \ +        unless FileTest.directory?(@git_path[:conf]) +      FileUtils::mkdir_p(@git_path[:image]) \ +        unless FileTest.directory?(@git_path[:image]) +      #FileUtils::mkdir_p(@git_path[:audio]) \ +      #  unless FileTest.directory?(@git_path[:audio]) +      #FileUtils::mkdir_p(@git_path[:video]) \ +      #  unless FileTest.directory?(@git_path[:video]) +    end +    def git_init +      unless FileTest.directory?("#{@git_path[:fnb]}/.git") +        pwd=Dir.pwd +        Dir.chdir(@git_path[:fnb]) +        system("git init ") +        Dir.chdir(pwd) +      end +    end +    def git_commit +      if program_found? +        if FileTest.directory?("#{@git_path[:fnb]}") +          pwd=Dir.pwd +          Dir.chdir(@git_path[:fnb]) +          system(" +            git add . \ +            && git commit -a +          ") +          Dir.chdir(pwd) +        end +      end +    end +    def populate +      def identify_language_versions +        print __FILE__ + ':' +        p __LINE__ +      end +      def copy_src_head +        if @opt.f_pth[:lng] \ +        and File.exist?("#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{@opt.fns}") +          FileUtils::cp_r( +            "#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{@opt.fns}", +            @git_path[:doc] +          ) +        elsif @opt.fns =~/\.ssm\.sst/ +          ssm=@opt.fns.gsub(/\.ssm\.sst/,'.ssm') +          FileUtils::cp_r( +            "#{@env.path.pwd}/#{ssm}", +            @git_path[:doc] +          ) +        elsif File.exist?("#{@env.path.pwd}/#{@opt.fns}") +          FileUtils::cp_r( +            "#{@env.path.pwd}/#{@opt.fns}", +            @git_path[:doc] +          ) +        end +      end +      def copy_related_sst_ssi +        doc_import=[] +        @rgx_doc_import=/^<<\s(\S+?\.ss[ti])/ +        file_array=IO.readlines(@opt.fns,'') +        file_array.each do |f| +          if f =~@rgx_doc_import +            doc_import = doc_import \ +            + f.scan(@rgx_doc_import).uniq.flatten +          end +        end +        doc_import.each do |f| +          if @opt.f_pth[:lng] +            FileUtils::cp_r( +              "#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{f}", +              @git_path[:doc] +            ) +          else +            FileUtils::cp_r( +              "#{@env.path.pwd}/#{f}", +              @git_path[:doc] +            ) +          end +        end +      end +      def locate_parse_file +        composite_src=@opt.fns=~/\.ssm$/ ? true : false +        if composite_src \ +        and not @opt.act[:ao][:set]==:on +          ##SiSU_Assemble::Composite.new(@opt).read +          #SiSU_AO::Source.new(@opt).read                                         # -m +          @env.processing_path.composite_file \ +          + '/' \ +          + @opt.fnb \ +          + '.ssm.sst' +        elsif composite_src +          @env.processing_path.composite_file \ +          + '/' \ +          + @opt.fnb \ +          + '.ssm.sst' +        else +          @env.path.pwd +          + '/' \ +          + @opt.fns +        end +      end +      def read_composite +        #print __FILE__ + ':' +        #p __LINE__ +      end +      def sisuyaml_rc +        sisurc=@env.path.sisurc_path +        if FileTest.file?(sisurc) +          FileUtils::cp_r(sisurc,@git_path[:conf]) +        end +      end +      def read_src +        print __FILE__ + ':' +        p __LINE__ +      end +      def composite_src? +        @opt.fns=~/\.ssm$/ ? true : false +      end +      def sisusrc_files +        populate.copy_src_head +        if composite_src? +          populate.copy_related_sst_ssi +        end +        #parse_file_name=locate_parse_file +        #parse_file=IO.readlines(parse_file_name,'') +        populate.sisuyaml_rc #(parse_file) +        #populate.extract_composite_source +        #populate.read_composite # or read_each_composite +        populate.identify_language_versions +      end +      self +    end +  end +end +__END__ +@file.output_path.sisugit +#+END_SRC + +** qrcode.rb + +#+HEADER: :tangle "../lib/sisu/qrcode.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_QRcode +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  require_relative 'prog_text_translation'              # prog_text_translation.rb +  require_relative 'se_hub_particulars'                 # se_hub_particulars.rb +    include SiSU_Particulars +  require_relative 'html'                               # html.rb +  require_relative 'dp'                                 # dp.rb +    include SiSU_Param +  require_relative 'generic_parts'                      # generic_parts.rb +  require_relative 'i18n'                               # i18n.rb +  class Source +    def initialize(opt) +      @opt=opt +      @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt) +      l=SiSU_Env::StandardiseLanguage.new(@opt.lng).language +      @doc_language=l[:n] +    end +    def read +      begin +        @env=SiSU_Env::InfoEnv.new(@opt.fns,@opt) +        @md=SiSU_Param::Parameters.new(@opt).get +        xbrowser=@env.program.web_browser +        browser=@env.program.console_web_browser +        unless @opt.act[:quiet][:set]==:on +          url_html="file://#{@md.file.output_path.manifest.dir}/#{@md.file.base_filename.manifest}" +          (@opt.act[:verbose][:set]==:on \ +          || @opt.act[:verbose_plus][:set]==:on \ +          || @opt.act[:maintenance][:set]==:on) \ +          ? SiSU_Screen::Ansi.new( +              @opt.act[:color_state][:set], +              'QR code', +              "#{xbrowser} #{url_html}" +            ).green_hi_blue +          : SiSU_Screen::Ansi.new( +              @opt.act[:color_state][:set], +              'QR code', +              "[#{@opt.f_pth[:lng_is]}] #{@opt.fns}" +            ).green_title_hi +          if (@opt.act[:verbose][:set]==:on \ +          || @opt.act[:verbose_plus][:set]==:on \ +          || @opt.act[:maintenance][:set]==:on) +            SiSU_Screen::Ansi.new( +              @opt.act[:color_state][:set], +              "#{browser} #{url_html}" +            ).grey_tab +          end +        end +        data=SiSU_HTML::Source::HTML_Environment.new(@particulars).tuned_file_instructions +        OutputInfo.new(@md).check_output(data) +      rescue +        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +    private +    class OutputInfo <Source +      include SiSU_Parts_Generic +      def initialize(md) +        @manifest={ txt: [], txt_title: [] } +        @md,@fns=md,md.fns +        @env=SiSU_Env::InfoEnv.new(@md.fns,@md.opt) +        @fnb=@md.fnb +        @base_url="#{@env.url.root}/#{@fnb}" +        @f=SiSU_Env::FileOp.new(@md) +        @base_path=@f.output_path.manifest.dir +        @@dg ||=SiSU_Env::InfoEnv.new.digest(@md.opt).type +        @dg=@@dg +        l=SiSU_Env::StandardiseLanguage.new(@md.opt.lng).language +        @language=l[:n] +        @translate=SiSU_Translate::Source.new(@md,@language) +        @f.make_path(@f.output_path.qrcode.dir) +      end +      def spaces +        Ax[:spaces] +      end +      def output_metadata +        fn=@f.base_filename.manifest_txt +        mn='' +        if @md.opt.act[:maintenance][:set]==:on +          fn=@f.base_filename.manifest_txt +          manifest=@f.write_file.manifest_txt +        end +        @manifest[:txt].each do |x| +          x=x.gsub(/\\\\/m,"\n") +          puts x if @md.opt.act[:verbose_plus][:set]==:on +          manifest << x if @md.opt.act[:maintenance][:set]==:on +          mn += x +        end +        manifest.close if @md.opt.act[:maintenance][:set]==:on +        cmd=SiSU_Env::SystemCall.new(mn,@f.place_file.qrcode_md.dir,@md.opt.selections.str) +        cmd.qrencode +      end +      def output_metadata_short +        mn='' +        @manifest[:txt_title].each do |x| +          mn += x +        end +        cmd=SiSU_Env::SystemCall.new(mn,@f.place_file.qrcode_title.dir,@md.opt.selections.str) +        cmd.qrencode +      end +      def summarize(id,file,pth='',rel='',url='',img='● ') +        size=(File.size("#{pth}/#{file}")/1024.00).to_s +        kb=/([0-9]+\.[0-9]{0,1})/m.match(size)[1] +        @manifest[:txt] <<<<WOK +#{id} #{kb} +  #{the_text.url_open}#{url}/#{file}#{the_text.url_close} +WOK +      end +      def summarize_html_seg(id,file,pth='',rel='',url='',img='● ') +        size=(File.size("#{pth}/#{file}")/1024.00).to_s +        kb=/([0-9]+\.[0-9]{0,1})/m.match(size)[1] +        @manifest[:txt] <<<<WOK +#{id} #{kb} +  #{the_text.url_open}#{url}/#{file}#{the_text.url_close} +WOK +      end +      def summarize_sources(id,file,pth,rel,url) +        sys=SiSU_Env::SystemCall.new +        dgst=case @dg +        when :sha512 +          (sys.sha512("#{pth}/#{file}")) #check +        when :md5 +          (sys.md5("#{pth}/#{file}")) +        else +          (sys.sha256("#{pth}/#{file}")) +        end +        dgst=dgst ? dgst : [ '', 'n/a' ] +        if (@md.opt.act[:verbose][:set]==:on \ +        || @md.opt.act[:verbose_plus][:set]==:on \ +        || @md.opt.act[:maintenance][:set]==:on) +          SiSU_Screen::Ansi.new( +            @md.opt.selections.str, +            "#{dgst[1]} #{file}" +          ).warn +        end +        size=(File.size("#{pth}/#{file}")/1024.00).to_s +        kb=/([0-9]+\.[0-9]{0,1})/m.match(size)[1] +        @manifest[:txt] <<<<WOK +#{id} #{dgst[1]} #{kb} +  #{the_text.url_open}#{url}/#{file}#{the_text.url_close} +WOK +      end +      def published_manifests? +        @f=SiSU_Env::FileOp.new(@md) #.base_filename +        @m=[] +        url=@f.output_path.base.url +        manifests={} +        mp,mn,mt=nil,nil,nil +        ln=SiSU_i18n::Languages.new.language.list +        Px[:lng_lst].each do |lc| +          if @env.output_dir_structure.by_language_code? +            mp="#{@f.output_path.base.dir}/#{lc}/manifest" +            mn="#{@md.fnb}.html" +            mt="#{mp}/#{mn}" +            mu="#{url}/#{lc}/manifest/#{mn}" +          elsif @env.output_dir_structure.by_filetype? +            mp="#{@f.output_path.base.dir}/manifest" +            mn="#{@md.fnb}.#{lc}.html" +            mt="#{mp}/#{mn}" +            mu="#{url}/manifest/#{mn}" +          else +            mp="#{@f.output_path.base.dir}/#{@md.fnb}" +            mn="sisu_manifest.#{lc}.html" +            mt="#{mp}/#{mn}" +            mu="#{url}/#{mn}" +          end +          if FileTest.directory?(mp) \ +          &&  FileTest.file?(mt) +            lng=ln[lc][:t] +            manifests[lc]={ ln: lng, fn: mn } +            @m << { mu: mu, l: lng } +          end +        end +        #manifests +        @m=@m.uniq +        @m +      end +      def languages(id,file) +        flv=published_manifests? +        flv.each do |l| +          SiSU_Translate::Source.new(@md,@language,l[:n]).language_list +          @manifest[:txt] << "#{l[:mu]} #{l[:l]}\n" +        end +      end +      def published_languages(id,file) +        flv=published_manifests? +        flv.each do |l| +          @manifest[:txt] << "#{l[:l]}  #{the_text.url_open}#{l[:mu]}#{the_text.url_close}\n" +        end +      end +      def metadata(id,info) +        info=info.to_s.gsub(/#{Mx[:br_line]}/,"\n") +        @manifest[:txt] << %{#{id}: #{info}\n} +      end +      def md_title_info(id,info) +        info=info.to_s.gsub(/#{Mx[:br_line]}/,"\n") +        @manifest[:txt_title] << %{#{info}\n} +      end +      def links(url,lnk,target) +        static=if url =~/^\.\// then url.gsub(/^\.(\.)?/,@base_url) +        elsif url =~/^\.\.\//   then url.gsub(/^\.(\.)?/,@env.url.root) +        else                         url +        end +        @manifest[:txt] << %{#{url} #{lnk} #{the_text.url_open}#{static}#{the_text.url_close}\n} +      end +      def output_tests +        if FileTest.file?(@f.place_file.html_segtoc.dir)==true +          pth=@f.output_path.html_seg.dir +          rel=@f.output_path.html_seg.rel_sm +          url=@f.output_path.html_seg.url +          id,file='HTML, table of contents (for segmented text)',@f.base_filename.html_segtoc +          summarize_html_seg(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.html_scroll.dir)==true +          pth=@f.output_path.html_scroll.dir +          rel=@f.output_path.html_scroll.rel_sm +          url=@f.output_path.html_scroll.url +          id,file='HTML, full length document',@f.base_filename.html_scroll +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.html_book_index.dir)==true +          pth=@f.output_path.html_seg.dir +          rel=@f.output_path.html_seg.rel_sm +          url=@f.output_path.html_seg.url +          id,file='HTML, (book type) index',@f.base_filename.html_book_index +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.html_concordance.dir)==true +          pth=@f.output_path.html_seg.dir +          rel=@f.output_path.html_seg.rel_sm +          url=@f.output_path.html_seg.url +          id,file='HTML, concordance file',@f.base_filename.html_concordance +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.epub.dir)==true +          id,file='EPUB (Electronic Publication, e-book standard)',@f.base_filename.epub +          pth=@f.output_path.epub.dir +          rel=@f.output_path.epub.rel_sm +          url=@f.output_path.epub.url +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_p_letter}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, U.S. letter size, portrait/vertical","#{@f.base_filename.pdf_p_letter}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_l_letter}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, U.S. letter size, landscape/horizontal","#{@f.base_filename.pdf_l_letter}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_p_a4}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, A4 size, portrait/vertical","#{@f.base_filename.pdf_p_a4}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_l_a4}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, A4 size, landscape/horizontal","#{@f.base_filename.pdf_l_a4}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_p_a5}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, A5 (book) size, portrait/vertical","#{@f.base_filename.pdf_p_a5}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_l_a5}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, A5 (book) size, landscape/horizontal","#{@f.base_filename.pdf_l_a5}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_p_b5}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, B5 (book) size, portrait/vertical","#{@f.base_filename.pdf_p_b5}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_l_b5}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, B5 (book) size, landscape/horizontal","#{@f.base_filename.pdf_l_b5}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_p_legal}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, U.S. legal size, portrait/vertical","#{@f.base_filename.pdf_p_legal}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@f.output_path.pdf.dir}/#{@f.base_filename.pdf_l_legal}")==true +          pth=@f.output_path.pdf.dir +          rel=@f.output_path.pdf.rel_sm +          url=@f.output_path.pdf.url +          id,file="PDF, U.S. legal size, landscape/horizontal","#{@f.base_filename.pdf_l_legal}" +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.odt.dir)==true +          pth=@f.output_path.odt.dir +          rel=@f.output_path.odt.rel_sm +          url=@f.output_path.odf.url +          id,file='ODF:ODT (Open Document Format)',@f.base_filename.odt +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.xhtml.dir)==true +          pth=@f.output_path.xhtml.dir +          rel=@f.output_path.xhtml.rel_sm +          url=@f.output_path.xhtml.url +          id,file='ODF:ODT (Open Document Format)',@f.base_filename.odt +          id,file='XHTML',@f.base_filename.xhtml +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.xml_sax.dir)==true +          pth=@f.output_path.xml_sax.dir +          rel=@f.output_path.xml_sax.rel_sm +          url=@f.output_path.xml_sax.url +          id,file='XML SAX',@f.base_filename.xml_sax +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.xml_dom.dir)==true +          pth=@f.output_path.xml_dom.dir +          rel=@f.output_path.xml_dom.rel_sm +          url=@f.output_path.xml_dom.url +          id,file='XML DOM',@f.base_filename.xml_dom +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.txt.dir)==true +          id='Plaintext (UTF-8)' +          #id=if @md.opt.selections.str =~/a/ then 'Plaintext (Unix (UTF-8) with footnotes)' +          #elsif @md.opt.selections.str =~/e/ then 'Plaintext (Unix (UTF-8) with endnotes)' +          #elsif @md.opt.selections.str =~/A/ then 'Plaintext (dos (UTF-8) with footnotes)' +          #elsif @md.opt.selections.str =~/E/ then 'Plaintext (dos (UTF-8) with endnotes)' +          #else                         'Plaintext (UTF-8)' +          #end +          pth=@f.output_path.txt.dir +          rel=@f.output_path.txt.rel_sm +          url=@f.output_path.txt.url +          file=@f.base_filename.txt +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@base_path}/#{@md.fns}.tex")==true +          id,file='LaTeX (portrait)',"#{@md.fns}.tex" +          pth,rel,url='','','' +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?("#{@base_path}/#{@md.fns}.tex")==true +          id,file='LaTeX (landscape)',"#{@md.fns}.landscape.tex" +          pth,rel,url='','','' +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.manpage.dir)==true +          pth=@f.output_path.manpage.dir +          rel=@f.output_path.manpage.rel_sm +          url=@f.output_path.manpage.url +          id,file='Manpage',@f.base_filename.manpage +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.texinfo.dir)==true +          pth=@f.output_path.texinfo.dir +          rel=@f.output_path.texinfo.rel_sm +          url=@f.output_path.texinfo.url +          id,file='Texinfo',@f.base_filename.texinfo +          summarize(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.hash_digest.dir)==true +          pth=@f.output_path.hash_digest.dir +          rel=@f.output_path.hash_digest.rel_sm +          url=@f.output_path.hash_digest.url +          id,file="Digest/DCC - Document Content Certificate (#{@dg})",@f.base_filename.hash_digest +          summarize(id,file,pth,rel,url) +        end +      end +      def published_versions +        id,file='Markup (SiSU source)',@md.fns +        #languages(id,file) +        published_languages(id,file) +      end +      def language_versions +        if FileTest.file?(@f.place_file.manifest.dir)==true +          id,file='Markup (SiSU source)',@md.fns +          published_languages(id,file) +        end +      end +      def source_tests +        if @md.fns =~/\.ssm\.sst$/                                                  #% decide whether to extract and include requested/required documents +          if FileTest.file?(@f.place_file.src.dir)==true +            pth=@f.output_path.src.dir +            rel=@f.output_path.src.rel +            url=@f.output_path.src.url +            id,file='Markup Composite File (SiSU source)',@f.base_filename.src +            summarize_sources(id,file,pth,rel,url) +          end +        else +          if FileTest.file?(@f.place_file.src.dir)==true +            pth=@f.output_path.src.dir +            rel=@f.output_path.src.rel +            url=@f.output_path.src.url +            id,file='Markup (SiSU source)',@f.base_filename.src +            summarize_sources(id,file,pth,rel,url) +          end +        end +        if FileTest.file?(@f.place_file.sisupod.dir)==true +          pth=@f.output_path.sisupod.dir +          rel=@f.output_path.sisupod.rel +          url=@f.output_path.sisupod.url +          id,file='SiSU doc (zip)',@f.base_filename.sisupod +          summarize_sources(id,file,pth,rel,url) +        end +        if FileTest.file?(@f.place_file.pot.dir)==true +          pth=@f.output_path.pot.dir +          rel=@f.output_path.pot.rel_sm +          url=@f.output_path.pot.url +          id,file='SiSU pot',@f.base_filename.pot +          summarize_sources(id,file,pth,rel,url) +        end +      end +      def metadata_tests +        if defined? @md.title.full \ +        and @md.title.full=~/\S+/ +          id,info=@translate.full_title,@md.title.full +          #id,info=@translate.full_title,%{"#{@md.title.full}"} +          metadata(id,info) +          md_title_info(id,info) +        end +        if defined? @md.creator.author \ +        and @md.creator.author=~/\S+/ +          id,info=@translate.author,@md.creator.author +          metadata(id,info) +          md_title_info(id,info) +        end +        if defined? @md.creator.editor \ +        and @md.creator.editor=~/\S+/ +          id,info=@translate.editor,@md.creator.editor +          metadata(id,info) +        end +        if defined? @md.creator.contributor \ +        and @md.creator.contributor=~/\S+/ +          id,info=@translate.contributor,@md.creator.contributor +          metadata(id,info) +        end +        if defined? @md.creator.translator \ +        and @md.creator.translator=~/\S+/ +          id,info=@translate.translator,%{(#{@md.creator.translator})} +          metadata(id,info) +          md_title_info(id,info) +        end +        if defined? @md.creator.illustrator \ +        and @md.creator.illustrator=~/\S+/ +          id,info=@translate.illustrator,@md.creator.illustrator +          metadata(id,info) +        end +        if defined? @md.publisher \ +        and @md.publisher=~/\S+/ #dc +          id,info=@translate.publisher,@md.publisher +          metadata(id,info) +        end +        if defined? @md.creator.prepared_by \ +        and @md.creator.prepared_by=~/\S+/ +          id,info=@translate.prepared_by,@md.creator.prepared_by +          metadata(id,info) +        end +        if defined? @md.creator.digitized_by \ +        and @md.creator.digitized_by=~/\S+/ +          id,info=@translate.digitized_by,@md.creator.digitized_by +          metadata(id,info) +        end +        if defined? @md.rights.all \ +        and @md.rights.all=~/\S+/ #dc +          id,info=@translate.rights,@md.rights.all +          metadata(id,info) +        end +        if defined? @md.date.published +          if defined? @md.date.published \ +          and @md.date.published=~/\S+/ #dc +            id,info=@translate.date,@md.date.published +            metadata(id,info) +            md_title_info(id,info) +          end +          if defined? @md.date.created \ +          and @md.date.created=~/\S+/ #dc +            id,info=@translate.date_created,@md.date.created +            metadata(id,info) +          end +          if defined? @md.date.issued \ +          and @md.date.issued=~/\S+/ #dc +            id,info=@translate.date_issued,@md.date.issued +            metadata(id,info) +          end +          if defined? @md.date.available \ +          and @md.date.available=~/\S+/ #dc +            id,info=@translate.date_available,@md.date.available +            metadata(id,info) +          end +          if defined? @md.date.modified \ +          and @md.date.modified=~/\S+/ #dc +            id,info=@translate.date_modified,@md.date.modified +            metadata(id,info) +          end +          if defined? @md.date.valid \ +          and @md.date.valid=~/\S+/ #dc +            id,info=@translate.date_valid,@md.date.valid +            metadata(id,info) +          end +        end +        if defined? @md.title.language \ +        and @md.title.language=~/\S+/ +          id,info=@translate.language,@md.title.language +          metadata(id,info) +        end +        if defined? @md.original.language \ +        and @md.original.language=~/\S+/ +          id,info=@translate.language_original,@md.original.language +          metadata(id,info) +        end +        if defined? @md.classify.subject \ +        and @md.classify.subject=~/\S+/ +          id,info=@translate.subject,@md.classify.subject +          metadata(id,info) +        end +        if defined? @md.classify.keywords \ +        and @md.classify.keywords=~/\S+/ +          id,info=@translate.keywords,@md.classify.keywords +          metadata(id,info) +        end +        if defined? @md.classify.loc \ +        and @md.classify.loc=~/\S+/ +          id,info=@translate.cls_loc,@md.classify.loc +          metadata(id,info) +        end +        if defined? @md.classify.dewey \ +        and @md.classify.dewey=~/\S+/ +          id,info=@translate.cls_dewey,@md.classify.dewey +          metadata(id,info) +        end +        if defined? @md.notes.description \ +        and @md.notes.description=~/\S+/ +          id,info=@translate.description,@md.notes.description +          metadata(id,info) +        end +        if defined? @md.notes.abstract \ +        and @md.notes.abstract=~/\S+/ +          id,info=@translate.abstract,@md.notes.abstract +          metadata(id,info) +        end +        if defined? @md.notes.comment \ +        and @md.notes.comment=~/\S+/ +          id,info=@translate.comments,@md.notes.comment +          metadata(id,info) +        end +        if defined? @md.notes.coverage \ +        and @md.notes.coverage=~/\S+/ +          id,info=@translate.coverage,@md.notes.coverage +          metadata(id,info) +        end +        if defined? @md.notes.relation \ +        and @md.notes.relation=~/\S+/ +          id,info=@translate.relation,@md.notes.relation +          metadata(id,info) +        end +        #if defined? @md.notes.source \ +        #and @md.notes.source=~/\S+/ +        #  id,info=@translate.source,@md.notes.source +        #  metadata(id,info) +        #end +        #if defined? @md.notes.history \ +        #and @md.notes.history=~/\S+/ +        #  id,info=@translate.history,@md.notes.history +        #  metadata(id,info) +        #end +        if defined? @md.notes.type \ +        and @md.notes.type=~/\S+/ #dc +          id,info=@translate.type,@md.type +          metadata(id,info) +        end +        if defined? @md.notes.format \ +        and @md.notes.format=~/\S+/ +          id,info=@transate.format,@md.notes.format +          metadata(id,info) +        end +        if defined? @md.notes.prefix_a \ +        and @md.notes.prefix_a=~/\S+/ +          id,info=@translate.prefix_a,@md.notes.prefix_a +          metadata(id,info) +        end +        if defined? @md.notes.prefix_b \ +        and @md.notes.prefix_b=~/\S+/ +          id,info=@translate.prefix_b,@md.notes.prefix_b +          metadata(id,info) +        end +        if defined? @md.original.source \ +        and @md.original.source=~/\S+/ +          id,info=@translate.source,@md.original.source +          metadata(id,info) +        end +        if defined? @md.identifier.oclc \ +        and @md.identifier.oclc=~/\S+/ +          id,info=@translate.cls_oclc,@md.identifier.oclc +          @manifest[:txt] << %{#{id}:\n} +          @manifest[:txt] << %{#{info}\n} +        end +        if defined? @md.identifier.isbn \ +        and @md.identifier.isbn=~/\S+/ +          id,info=@translate.cls_isbn,@md.identifier.isbn +          metadata(id,info) +        end +        if defined? @md.topic_register_array \ +        and @md.topic_register_array.length > 0 +          @manifest[:txt] << %{#{@translate.topic_register}:\n} +          @md.topic_register_array.each do |t| +            t.each_with_index do |st,i| +              if st.is_a?(Array) +                st.each do |v| +                  @manifest[:txt] << %{#{spaces*i}#{v}\n} +                end +              else @manifest[:txt] << %{#{spaces*i}#{st}\n} +              end +            end +          end +        end +        if @md.fns +          id,info=@translate.sourcefile,@md.fns +          metadata(id,info) +        end +        if @md.en[:mismatch] > 0 +          id,info='WARNING document error in endnote markup, number mismatch',"endnotes: #{@md.en[:note]} != endnote reference marks: #{@md.en[:mark]} (difference = #{@md.en[:mismatch]})" +          metadata(id,info) +        end +        if @md.wc_words +          id,info=@translate.word_count,@md.wc_words +          metadata(id,info) +        end +        if @md.dgst +          id,info="#{@translate.sourcefile_digest} (#{@dg})",@md.dgst[1] +          metadata(id,info) +        end +        if @md.sc_number +          id,info=@translate.sc_number,@md.sc_number +          metadata(id,info) +        end +        if @md.sc_date +          id,info=@translate.sc_date,"#{@md.sc_date} at #{@md.sc_time}" +          metadata(id,info) +        end +      end +      def check_output(data) +        begin +          @f=SiSU_Env::FileOp.new(@md) #.base_filename +          url=@f.output_path.base.url +          @en_manifest=if @env.output_dir_structure.by_language_code? +            "#{url}/en/manifest/#{@md.fnb}.html" +          elsif @env.output_dir_structure.by_filetype? +            "#{url}/manifest/#{@md.fnb}.#{@md.opt.lng}.html" +          else +            "#{url}/sisu_manifest.#{@md.opt.lng}.html" +          end +          @manifest[:txt] <<<<WOK +#{@translate.manifest_description_metadata} +  #{the_text.url_open}#{@en_manifest}#{the_text.url_close} +WOK +          metadata_tests +          @manifest[:txt_title] <<<<WOK +  #{the_text.url_open}#{@en_manifest}#{the_text.url_close} +WOK +          source_tests +          @manifest[:txt] <<<<WOK +#{@translate.language_version_list} +WOK +          language_versions +          output_metadata +          output_metadata_short +        rescue +          SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do +            __LINE__.to_s + ':' + __FILE__ +          end +        ensure +        end +      end +    end +  end +end +__END__ +#+END_SRC + +** relaxng.rb + +#+HEADER: :tangle "../lib/sisu/relaxng.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Relaxng +  require_relative 'se'                                 # se.rb +  class RelaxNG +    def gpl3_or_later +      @gpl3_or_later =<<RELAXNG +=begin + + * Name: SiSU generated relaxng + + * Description: generated relaxng for SiSU +   (SiSU is a framework for document structuring, publishing and search) + + * Author: Ralph Amissah + + * Copyright: (C) 1997 - 2013 Ralph Amissah All Rights Reserved. + + * License: GPL 3 or later: + +   SiSU, a framework for document structuring, publishing and search + +   Copyright: (C) 1997 - 2013 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/licenses/gpl.html> +   [http://www.gnu.org/licenses/gpl.html] +   <http://www.jus.uio.no/sisu/gpl.fsf> + + * SiSU uses: +   * Standard SiSU markup syntax, +   * Standard SiSU meta-markup syntax, and the +   * Standard SiSU object citation numbering and system + + * Homepages: +   [http://www.jus.uio.no/sisu] +   [http://www.sisudoc.org] + + * Ralph Amissah +   [ralph@amissah.com] +   [ralph.amissah@gmail.com] + +=end +RELAXNG +    end +    def rnc_name +      def output_sax +        'sisu_sax.rnc' +      end +      def output_dom +        'sisu_dom.rnc' +      end +      def output_xhtml +        'sisu_xhtml.rnc' +      end +      def input_sax +        'sisu_sax.rnc' +      end +      def input_dom +        'sisu_dom.rnc' +      end +      def input_node +        'sisu_node.rnc' +      end +      self +    end +    def rng_name +      def output_sax +        'sisu_sax.rng' +      end +      def output_dom +        'sisu_dom.rng' +      end +      def output_xhtml +        'sisu_xhtml.rng' +      end +      def input_sax +        'sisu_sax.rng' +      end +      def input_dom +        'sisu_dom.rng' +      end +      def input_node +        'sisu_node.rng' +      end +      self +    end +    def xsd_name +      def output_sax +        'sisu_sax.xsd' +      end +      def output_dom +        'sisu_dom.xsd' +      end +      def output_xhtml +        'sisu_xhtml.xsd' +      end +      def input_sax +        'sisu_sax.xsd' +      end +      def input_dom +        'sisu_dom.xsd' +      end +      def input_node +        'sisu_node.xsd' +      end +      self +    end +    def rnc_sisu_object_input +      @relaxng =<<RELAXNG +#%% sisu object model: input +#{gpl3_or_later} +#%% definitions +# dublin core: +element-semantic = +  element semantic { +  # dublin core: +  element title { text } +  & element creator { text }? +  & element subject { text }? +  & element description { text }? +  & element publisher { text }? +  & element contributor { text }? +  & element date { text }? +  & element date.created { text }? +  & element date.issued { text }? +  & element date.available { text }? +  & element date.valid { text }? +  & element date.modified { text }? +  & element type { text }? +  & element format { text }? +  & element identifier { text }? +  & element source { text }? +  & element relation { text }? +  & element coverage { text }? +  & element rights { text }? +  & element keywords { text }? +  # extended semantic metadata: +  & attribute subtitle { text }? +  & attribute illustrator { text }? +  & attribute translator { text }? +  & attribute prepared_by { text }? +  & attribute digitized_by { text }? +  & attribute language { text }? +  & attribute language.original { text }? +  & attribute classify.pg { text }? +  & attribute classify.isbn { text }? +  & attribute classify.dewey { text }? +  & attribute classify.loc { text }? +  & attribute prefix.a { text }? +  & attribute prefix.b { text }? +  & attribute suffix { text }? +  & attribute comments { text }? +  & attribute abstract { text }? +  # & attribute information { text }? +  & attribute contact { text }? +  & attribute links { text }? +  } +element-processing = +  element processing { +  attribute structure { text }? +  & attribute level { text }? +  & attribute markup { text }? +  & attribute bold { text }? +  & attribute italics { text }? +  & attribute papersize { text }? +  & attribute vocabulary { text }? +  & element date_scheme { text }? +  & element date.issued.scheme { text }? +  & element date.available.scheme { text }? +  & element date.valid.scheme { text }? +  & element date.modified.scheme { text }? +  }? +element-head = +  element head { +    # processing instructions, and semantic data, distinguish?: +    element metadata { +      element title { text }, +      element file { text }, +      element generator { text }, +      element-semantic, +      element-processing +    }+ +  } +# body text/contents +# includes <b> <i> <u> <del> <ins> <indent1> <bullet> etc. +element-txt = +  element txt { +    text* +    & element b { text }* +    & element i { text }* +    & element u { text }* +    & element ins { text }* +    & element del { text }* +  } +element-endnote = +  element endnote { +    element number { text }, +    element note { element-txt }+ +  }+ +element-para = +  element para { +    # attribute paragraph_format { text }, +    element-txt+ +    & element-endnote? +  } +element-external_space = +  element external_space { +    # ignored by sisu, provide program needs +    element program { +      # e.g. kdissert +      element name { text }, +      element xpos { text }, +      element ypos { text }, +      element font { text }, +      element outline_color { text }, +      element text_color { text }, +      element comment { text } +    }* +  }*, +#%% structure +  element document { +    # document head: +    element-head, +    # document body: +    element body { +      # object, a unit of text, usually a paragraph with any associated endnotes +      element node { +        element structure { +          # structure document using either node:heading levels or node:heading relationships: +          # (i) sisu default uses node:heading levels (1-6 or A-C,1-3) to build document structure +          element level { text }?, +          # (ii) sisu alternatively could use node:heading relationship information to build document structure +          element node.id { text }, +          element node.parent { text }, +          element node.child { text }* +        }, +        element node.objects { +          element object.heading { +            # nametag used only in headings, especially important for segmented html +            element nametag { text }, +            element-para +          }, +          element object.para { +            element-para +          }* +        }+, +        element-external_space +      }+ +    } +  } +RELAXNG +    end +    def rnc_sisu_object_ao +      @relaxng =<<RELAXNG +#%% sisu object model: ao +#{gpl3_or_later} +#%% definitions +# dublin core: +element-semantic = +  element semantic { +  # dublin core: +  element title { text } +  & element creator { text }? +  & element subject { text }? +  & element description { text }? +  & element publisher { text }? +  & element contributor { text }? +  & element date { text }? +  & element date.created { text }? +  & element date.issued { text }? +  & element date.available { text }? +  & element date.valid { text }? +  & element date.modified { text }? +  & element type { text }? +  & element format { text }? +  & element identifier { text }? +  & element source { text }? +  & element relation { text }? +  & element coverage { text }? +  & element rights { text }? +  & element keywords { text }? +  # extended semantic metadata: +  & attribute subtitle { text }? +  & attribute illustrator { text }? +  & attribute translator { text }? +  & attribute prepared_by { text }? +  & attribute digitized_by { text }? +  & attribute language { text }? +  & attribute language.original { text }? +  & attribute classify.pg { text }? +  & attribute classify.isbn { text }? +  & attribute classify.dewey { text }? +  & attribute classify.loc { text }? +  & attribute prefix.a { text }? +  & attribute prefix.b { text }? +  & attribute suffix { text }? +  & attribute comments { text }? +  & attribute abstract { text }? +  # & attribute information { text }? +  & attribute contact { text }? +  & attribute links { text }? +  } +element-processing = +  element processing { +  attribute structure { text }? +  & attribute level { text }? +  & attribute markup { text }? +  & attribute bold { text }? +  & attribute italics { text }? +  & attribute papersize { text }? +  & attribute vocabulary { text }? +  & element date_scheme { text }? +  & element date.issued.scheme { text }? +  & element date.available.scheme { text }? +  & element date.valid.scheme { text }? +  & element date.modified.scheme { text }? +  }? +element-head = +  element head { +    # processing instructions, and semantic data, distinguish?: +    element metadata { +      element title { text }, +      element file { text }, +      element generator { text }, +      element-semantic, +      element-processing +    }+ +  } +# body text/contents +# includes <b> <i> <u> <del> <ins> <indent1> <bullet> etc. +element-txt = +  element txt { +    text* +    & element b { text }* +    & element i { text }* +    & element u { text }* +    & element ins { text }* +    & element del { text }* +  } +element-checksum.endnote = element checksum.clean { text } +element-endnote = +  element endnote { +    element number { text }, +    element note { element-txt }+, +    element-checksum.endnote +  }+ +element-checksum.para = +  element checksum.para { +    element checksum.clean { text }, +    element checksum.marked { text } +  } +element-para = +  element para { +    # attribute paragraph_format { text }, +    element-txt+ +    & element-endnote? +  } +element-object = +  element object { +    element-para, +    element-checksum.para +  } +# object citation number, unique sequential number for objects: +element-ocn = element ocn { text } +element-object_structure_summary = +  element-ocn, +  # type: heading level value 1 -6, or normal text +  element type { text }, +  # type number: sequential number for designated type +  element type_number { text }, +  # type category: sequential number for designated category, e.g. sequentially counting all headers +  element category_number { text } +element-external_space = +  element external_space { +    # ignored by sisu, provide program needs +    element program { +      # e.g. kdissert +      element name { text }, +      element xpos { text }, +      element ypos { text }, +      element font { text }, +      element outline_color { text }, +      element text_color { text }, +      element comment { text } +    }* +  }*, +#%% structure +  element document { +    # document head: +    element-head, +    # document body: +    element body { +      # object, a unit of text, usually a paragraph with any associated endnotes +      element node { +        element structure { +          # structure document using either node:heading levels or node:heading relationships: +          # (i) sisu default uses node:heading levels (1-6 or A-C,1-3) to build document structure +          element level { text }?, +          # (ii) sisu alternatively could use node:heading relationship information to build document structure +          element node.id { text }, +          element node.parent { text }, +          element node.child { text }* +        }, +        element node.objects { +          element object.heading { +            element-object_structure_summary, +            # nametag used only in headings, especially important for segmented html +            element nametag { text }, +            element-object +          }, +          element object.para { +            element-object_structure_summary, +            element-object +          }* +        }+, +        element-external_space +      }+ +    } +  } +RELAXNG +    end +    def rnc_model_output_sax +      @relaxng =<<RELAXNG +#% sax output model, part of SiSU and distributed under the same license +default namespace = "" +namespace xl = "http://www.w3.org/1999/xlink" +start = +  element document { +    element head { +      (br +       | meta +       | element creator { +           attribute class { xsd:NCName }, +           (text +            | element link { +                attribute xl:href { xsd:anyURI }, +                attribute xl:type { xsd:NCName }, +                xsd:anyURI +              })+ +         } +       | element date { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_available { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_created { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_issued { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_modified { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_valid { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element keywords { +           attribute class { xsd:NCName }, +           text +         } +       | element language { +           attribute class { xsd:NCName }, +           xsd:NCName +         } +       | element meta { xsd:NMTOKEN } +       | element rights { +           attribute class { xsd:NCName }, +           (text | link)+ +         } +       | element source { +           attribute class { xsd:NCName }, +           text +         } +       | element structure { +           attribute class { xsd:NCName }, +           text +         } +       | element subject { +           attribute class { xsd:NCName }, +           text +         } +       | element title { +           attribute class { xsd:NCName }, +           text +         } +       | element type { +           attribute class { xsd:NCName }, +           text +         } +       | element source_control { +           (br +            | meta +            | element sc { +                attribute class { xsd:NCName }, +                text +              })+ +         })+ +    }, +    element body { +      element object { +        attribute id { text }, +        element ocn { +          text +        }, +        element text { +          attribute class { xsd:NCName }, +          (text +           | b +           | br +           | del +           | en +           | i +           | link +           | sub +           | sup +           | u +           | element image { +               attribute alt { text }?, +               attribute height { xsd:integer }?, +               attribute width { xsd:integer }?, +               attribute xl:actuate { xsd:NCName }, +               attribute xl:href { text }, +               attribute xl:show { xsd:NCName }, +               attribute xl:type { xsd:NCName } +             })+ +        }?, +        element table { +          attribute align { xsd:NCName }, +          attribute bgcolor { xsd:NCName }, +          attribute border { xsd:integer }, +          attribute cellpadding { xsd:integer }, +          attribute summary { text }, +          attribute width { text }, +          element tr { +            element td { +              attribute valign { xsd:NCName }, +              attribute width { text }, +              (text | b | i)+ +            }+ +          }+ +        }?, +        element endnote { +          attribute notenumber { xsd:integer }?, +          attribute symbol { text }?, +          (element number { xsd:integer } +           | element symbol { text }), +          element note { +            (text +             | b +             | br +             | del +             | i +             | link +             | sup +             | u +             | element em { xsd:NCName } +             | element sub { xsd:NCName })+ +          } +        }* +      }+ +    } +  } +meta = element meta { text } +br = element br { empty } +b = element b { (text | en | i | link | sup)+ } +i = element i { (text | b | br | sup)+ } +en = element en { text } +sub = element sub { xsd:NCName } +sup = element sup { xsd:NCName } +link = +  element link { +    attribute xl:href { xsd:anyURI }, +    attribute xl:type { xsd:NCName }, +    (xsd:anyURI | text | b | i | sup)+ +  } +u = element u { (text | b | i)+ } +del = element del { (text | b | i | link)+ } +RELAXNG +    end +    def rnc_model_output_dom +      @relaxng =<<RELAXNG +#% dom output model, part of SiSU and distributed under the same license +default namespace = "" +namespace xl = "http://www.w3.org/1999/xlink" +start = +  element document { +    element head { +      element header { +        meta, +        (element creator { text } +         | element date { xsd:NMTOKEN } +         | element date_available { xsd:NMTOKEN } +         | element date_created { xsd:NMTOKEN } +         | element date_issued { xsd:NMTOKEN } +         | element date_modified { xsd:NMTOKEN } +         | element date_valid { xsd:NMTOKEN } +         | element keywords { text } +         | element language { xsd:NCName } +         | element rights { (text | link)+ } +         | element source { text } +         | element structure { text } +         | element subject { text } +         | element title { text } +         | element type { text } +         | element source_control { +             (br +              | meta +              | element sc { +                  attribute class { xsd:NCName }, +                  text +                })+ +           }) +      }+ +    }, +    element body { +      element heading1 { +        heading, +        contents1*, +        element heading2 { +          heading, +          contents1*, +          element heading3 { +            heading, +            element contents1 { +              heading, +              content, +              element contents2 { +                heading, +                content, +                element contents3 { heading, content }* +              }* +            }+ +          }* +        }* +      }+ +    } +  } +meta = element meta { text } +br = element br { empty } +heading = element heading { object } +contents1 = +  element contents1 { +    heading, +    content, +    element contents2 { +      heading, +      content, +      element contents3 { heading, content }* +    }* +  } +content = element content { object* } +object = +  element object { +    attribute id { xsd:integer }, +    element ocn { text }, +    element nametag { text }?, +    (element table { +       attribute align { xsd:NCName }, +       attribute bgcolor { xsd:NCName }, +       attribute border { xsd:integer }, +       attribute cellpadding { xsd:integer }, +       attribute summary { text }, +       attribute width { text }, +       element tr { +         element td { +           attribute valign { xsd:NCName }, +           attribute width { text }, +           (text | b | i)+ +         }+ +       }+ +     } +     | element text { +         attribute class { xsd:NCName }?, +         (text +          | b +          | del +          | endnote +          | i +          | link +          | element br { empty } +          | element endnote { +              element number { xsd:integer }, +              element note { (text | i | link)+ } +            } +          | element image { +              attribute height { xsd:integer }, +              attribute width { xsd:integer }, +              attribute xl:actuate { xsd:NCName }, +              attribute xl:href { text }, +              attribute xl:show { xsd:NCName }, +              attribute xl:type { xsd:NCName } +            } +          | element sub { text })+ +       }) +  } +i = element i { text } +b = element i { text } +u = element u { (text | b | i)+ } +sub = element sub { xsd:NCName } +sup = element sup { xsd:NCName } +del = element del { (text | b | i | link)+ } +link = +  element link { +    attribute xl:href { xsd:anyURI }, +    attribute xl:type { xsd:NCName }, +    xsd:anyURI +  } +endnote = +  element endnote { +    (element number { xsd:integer } +     | element symbol { text }), +    element note { +      (text +       | b +       | br +       | del +       | i +       | link +       | sub +       | sup +       | u +       | element em { xsd:NCName } +       | element sub { xsd:NCName })+ +    } +  } +RELAXNG +    end +    def rnc_model_output_xhtml #not done +      @relaxng =<<RELAXNG +#% xhtml output model, part of SiSU and distributed under the same license +default namespace = "" +namespace xl = "http://www.w3.org/1999/xlink" +start = +  element document { +    element head { +      (br +       | element creator { +           attribute class { xsd:NCName }, +           (text +            | element link { +                attribute xl:href { xsd:anyURI }, +                attribute xl:type { xsd:NCName }, +                xsd:anyURI +              })+ +         } +       | element date { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_available { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_created { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_issued { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_modified { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element date_valid { +           attribute class { xsd:NCName }, +           xsd:NMTOKEN +         } +       | element language { +           attribute class { xsd:NCName }, +           xsd:NCName +         } +       | element keywords { +           attribute class { xsd:NCName }, +           text +         } +       | element meta { +           attribute content { text }?, +           attribute http-equiv { xsd:NCName }?, +           text +         } +       | element rights { +           attribute class { xsd:NCName }, +           (text | link)+ +         } +       | element source { +           attribute class { xsd:NCName }, +           text +         } +       | element structure { +           attribute class { xsd:NCName }, +           text +         } +       | element subject { +           attribute class { xsd:NCName }, +           text +         } +       | element title { +           attribute class { xsd:NCName }, +           text +         } +       | element type { +           attribute class { xsd:NCName }, +           xsd:NCName +         })+ +    }, +    element body { +      element object { +        attribute id { xsd:integer }, +        (element endnote { +           attribute notenumber { xsd:integer }?, +           attribute symbol { text }?, +           (text +            | b +            | br +            | del +            | i +            | link +            | sup +            | u +            | element em { xsd:NCName } +            | element sub { xsd:NCName })+ +         } +         | element ocn { text } +         | element text { +             attribute class { xsd:NCName }, +             (text +              | b +              | br +              | del +              | en +              | i +              | link +              | sup +              | u +              | element image { +                  attribute alt { text }?, +                  attribute height { xsd:integer }?, +                  attribute width { xsd:integer }?, +                  attribute xl:actuate { xsd:NCName }, +                  attribute xl:href { text }, +                  attribute xl:show { xsd:NCName }, +                  attribute xl:type { xsd:NCName } +                } +              | element sub { text })+ +           })+, +        element table { +          attribute align { xsd:NCName }, +          attribute bgcolor { xsd:NCName }, +          attribute border { xsd:integer }, +          attribute cellpadding { xsd:integer }, +          attribute summary { text }, +          attribute width { text }, +          element tr { +            element td { +              attribute valign { xsd:NCName }, +              attribute width { text }, +              (text | b | i)+ +            }+ +          }+ +        }? +      }+ +    } +  } +br = element br { empty } +en = element en { text } +sup = element sup { xsd:NCName } +i = element i { (text | b | br | sup)+ } +link = +  element link { +    attribute xl:href { xsd:anyURI }, +    attribute xl:type { xsd:NCName }, +    (text | b | i | sup)+ +  } +b = element b { (text | en | i | link | sup)+ } +u = element u { (text | b | i)+ } +del = element del { (text | b | i | link)+ } +RELAXNG +    end +    def rnc_model_input_sax +      @relaxng =<<RELAXNG +#% sax input model, part of SiSU and distributed under the same license +default namespace = "" +start = +  element document { +    element head { +      element header { +        attribute class { xsd:NCName }, +        (element creator { text } +         | element date { xsd:NMTOKEN } +         | element date.available { xsd:NMTOKEN } +         | element date.created { xsd:NMTOKEN } +         | element date.issued { xsd:NMTOKEN } +         | element date.modified { xsd:NMTOKEN } +         | element date.valid { xsd:NMTOKEN } +         | element italicize { text } +         | element language { xsd:NCName } +         | element links { text } +         | element markup { text } +         | element rights { text } +         | element subject { text } +         | element title { text } +         | element type { xsd:NCName } +         | element vocabulary { xsd:NCName }) +      }+ +    }, +    element body { +      element object { +        element text { +          attribute class { xsd:NCName }, +          (text +           | b +           | i +           | element endnote { +               attribute symbol { xsd:NCName }, +               (text +                | i +                | element br { empty })+ +             } +           | element u { i } +           | element image.path { text })+ +        }? +      }+ +    } +  } +i = element i { text } +b = element b { text } +RELAXNG +    end +    def rnc_model_input_dom +      @relaxng =<<RELAXNG +#% dom input model, part of SiSU and distributed under the same license +default namespace = "" +start = +  element document { +    element head { +      element header { +        attribute class { xsd:NCName }, +        (element creator { text } +         | element date { xsd:NMTOKEN } +         | element date.available { xsd:NMTOKEN } +         | element date.created { xsd:NMTOKEN } +         | element date.issued { xsd:NMTOKEN } +         | element date.modified { xsd:NMTOKEN } +         | element date.valid { xsd:NMTOKEN } +         | element italicize { text } +         | element language { xsd:NCName } +         | element links { text } +         | element markup { text } +         | element rights { text } +         | element subject { text } +         | element title { text } +         | element type { xsd:NCName } +         | element vocabulary { xsd:NCName }) +      }+ +    }, +    element body { +      element heading1 { +        heading, +        element heading2 { +          heading, +          contents1+, +          element heading3 { heading, contents1+ }+ +        } +      } +    } +  } +heading = element heading { object } +contents1 = +  element contents1 { +    heading, +    content, +    element contents2 { +      heading, +      content, +      element contents3 { heading, content }* +    }* +  } +object = +  element object { +    element text { +      (text +       | italic +       | element bold { xsd:NMTOKEN } +       | element endnote { +           element symbol { text }?, +           element note { +             (text +              | italic +              | element br { empty })+ +           } +         } +       | element underscore { italic } +       | element image.path { text } +       | element italic { text })+ +    } +  } +italic = element italic { text } +content = element content { object+ } +RELAXNG +    end +    def rnc_model_input_node +      @relaxng =<<RELAXNG +#% node input model, part of SiSU and distributed under the same license +default namespace = "" +start = +  element document { +    element head { +      element header { +        attribute class { xsd:NCName }, +        (element creator { text } +         | element date { xsd:NMTOKEN } +         | element date.available { xsd:NMTOKEN } +         | element date.created { xsd:NMTOKEN } +         | element date.issued { xsd:NMTOKEN } +         | element date.modified { xsd:NMTOKEN } +         | element date.valid { xsd:NMTOKEN } +         | element italicize { (text | i)+ } +         | element language { xsd:NCName } +         | element links { text } +         | element markup { text } +         | element rights { text } +         | element subject { text } +         | element title { text } +         | element type { xsd:NCName } +         | element vocabulary { xsd:NCName }) +      }+ +    }, +    element body { +      element object { +        (element text { +           attribute class { xsd:NCName }, +           (text +            | b +            | i +            | element br { empty } +            | element endnote { +                attribute symbol { xsd:NCName }, +                (text | i)+ +              } +            | element image.path { text } +            | element sub { text })+ +         } +         | (element ocn { empty }, +            element table { +              attribute align { xsd:NCName }, +              attribute bgcolor { xsd:NCName }, +              attribute border { xsd:integer }, +              attribute cellpadding { xsd:integer }, +              attribute summary { text }, +              attribute width { text }, +              element tr { +                element td { +                  attribute valign { xsd:NCName }, +                  attribute width { text }, +                  (text | b)+ +                }+ +              }+ +            })), +        element node { +          element id { xsd:integer }, +          element parent { xsd:integer }, +          element offspring { text }? +        } +      }+ +    } +  } +b = element b { text } +i = element i { text } +RELAXNG +    end +  end +end +__END__ +needs updating +#+END_SRC + +** remote.rb + +#+HEADER: :tangle "../lib/sisu/remote.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Remote +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  class Put +    def initialize(opt) +      @opt=opt +      @dir=SiSU_Env::InfoEnv.new(@opt.fns) +      @put=(@opt.fns =~/\.ssm\.sst$/) \ +      ? opt.fns.gsub(/(.+)?\.ssm\.sst$/,'\1.ssm') +      : opt.fns +      @remote=SiSU_Env::InfoRemote.new(opt) +    end +    def rsync +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement ->', +        @put +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.rsync.document +    end +    def rsync_base +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement ->', +        'rsync' +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.rsync.site_base +    end +    def rsync_base_sync +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement ->', +        'rsync and sync' +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.rsync.site_base_sync +    end +    def rsync_sitemaps +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement sitemaps ->', +        'rsync' +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.rsync_sitemaps +    end +    def rsync_harvest +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement metadata harvest ->', +        'rsync_harvest' +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.rsync.site_harvest +    end +    def scp +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement ->', +        @put +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.scp.document +    end +    def scp_base +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement of base site ->', +        'excluding images' +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.scp.site_base +    end +    def scp_base_all +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'Remote placement ->', +        'complete' +      ).dark_grey_title_hi unless @opt.act[:quiet][:set]==:on +      @remote.scp.site_base_all +    end +  end +  class Get +    def initialize(opt,get_s) +      @opt,@get_s=opt,get_s +      @msg,@msgs='',nil +      @tell=lambda { +        SiSU_Screen::Ansi.new(@opt.act[:color_state][:set], +        @msg, +        "#{@msgs.inspect if @msgs}") +      } +    end +    def fns +      begin +        require 'open-uri' +        require 'pp' +      rescue LoadError +        SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia). +          error('open-uri or pp NOT FOUND (LoadError)') +      end +      require_relative 'ao_composite'                   # ao_composite.rb +      @rgx_image=/(?:^|[^_\\])\{\s*(\S+?\.(?:png|jpg|gif))/ +      threads=[] +      for requested_page in @get_s +        re_fnb=/((?:https?|file):\/\/[^\/ ]+?\/[^\/ ]+?)\/\S+?\/([^\/]+?)\.ss(t)/ #revisit and remove DO +        threads << Thread.new(requested_page) do |url| +          open(url) do |f| +            raise "#{url} not found" unless f +            base_uri,fnb=re_fnb.match(url)[1..2] if re_fnb +            imagedir=base_uri + '/_sisu/image' #check on +            downloaded_file=File.new("#{fnb}.-sst",'w+') +            image_download_url=SiSU_Assemble::RemoteImage.new.image(imagedir) +            images=[] +            f.collect.each do |r|                            # work area +              unless r =~/^%+\s/ +                if r !~/^%+\s/ \ +                and r =~@rgx_image +                  images << r.scan(@rgx_image).uniq +                end +              end +              downloaded_file << r +            end +            if images \ +            and images.length > 1 +              images=images.flatten.uniq +              images.delete_if {|x| x =~/https?:\/\// } +              images=images.sort +              @msg,@msgs='downloading images:', [ images.join(',') ] +              @tell.call.warn unless @opt.act[:quiet][:set]==:on +              image_info=image_download_url + images +              SiSU_Assemble::RemoteImage.new.download_images(image_info) +              #SiSU_Assemble::RemoteImage.new.download_images(image_download_url,images) +              @msg,@msgs='downloading done',nil +              @tell.call.warn unless @opt.act[:quiet][:set]==:on +            end +            downloaded_file.close +          end +        end +      end +      threads.each {|thr| thr.join} if threads #and threads.length > 0 +    end +    def sisupod +      get_p=@get_s +      if get_p.length > 0                                     #% remote sisupod +        begin +          require 'net/http' +        rescue LoadError +          SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia). +            error('net/http NOT FOUND (LoadError)') +        end +        for requested_pod in get_p +          pod_info=RemoteDownload.new(requested_pod) +          Net::HTTP.start(pod_info.pod.site) do |http| +            resp=http.get("#{pod_info.pod.path}/#{pod_info.pod.name_source}") +            open(pod_info.pod.name,'wb') do |file| +              file.write(resp.body) +             end +          end +        end +      end +    end +  end +  class RemoteDownload +    def initialize(requested_file) +      @requested_file=requested_file +    end +    def pod +      re_p_div=/https?:\/\/([^\/]+)(\/\S+)\/(sisupod\.(?:txz|zip)|\S+?(?:\.ss[mt]\.(?:txz|zip))?|[^\/]+?\.ssp)$/ +      re_p=/(sisupod\.(?:txz|zip)|\S+?\.ss[mt]\.(?:txz|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.join +      end +      def site +        @site +      end +      def path +        @pth +      end +      def dir_stub +        re_p_stub=/.+?([^\/]+)$/ +        re_p_stub.match(path).captures.join if path +      end +      def name_source +        @pod +      end +      def name +        name_source +      end +      self +    end +  end +end +__END__ +#+END_SRC + +** rexml.rb + +#+HEADER: :tangle "../lib/sisu/rexml.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Rexml +  # load XML file for REXML parsing +  begin +    require 'rexml/document' \ +      if FileTest.directory?("#{RbConfig::CONFIG['rubylibdir']}/rexml") #RbConfig::CONFIG['sitedir'] +  rescue LoadError +    SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia). +      error('rexml/document NOT FOUND (LoadError)') +  end +  require_relative 'dp'                                 # dp.rb +    include SiSU_Param +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  class Rexml +    begin +      require 'rexml/document' \ +        if FileTest.directory?("#{RbConfig::CONFIG['rubylibdir']}/rexml") #RbConfig::CONFIG['sitedir'] +    rescue LoadError +      SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia). +        error('rexml/document NOT FOUND (LoadError)') +    end +    def initialize(md,fno) +      @md,@fno=md,fno +      @env=SiSU_Env::InfoEnv.new(@md.fns) +      @prog=SiSU_Env::InfoProgram.new #(md.fns) #if md +      if File.file?(@fno) +        @fnap=@fno #index.xml causes problems with index.html in server config +      end +      @e_head='/document/head' +      @e_title='/document/head/title' +      @e_object='/document/body/object' +      @e_ocn='/document/body/object/ocn' +      @e_text='/document/body/object/text' +      @e_endnote='/document/body/object/endnote' +    end +    def xml +      begin +        if FileTest.file?(@fnap) +          if @prog.rexml !=false \ +          and FileTest.directory?('/usr/lib/ruby/1.8/rexml/') #note values can be other than true +            xmlfile=IO.readlines(@fnap,'').join +            begin +              @xmldoc=REXML::Document.new xmlfile +              SiSU_Screen::Ansi.new( +                @md.opt.act[:color_state][:set], +                'invert', +                'REXML', +                "XML document #{@fnap} loaded" +              ).colorize unless @md.opt.act[:quiet][:set]==:on +              if (@opt.act[:verbose][:set]==:on \ +              || @opt.act[:verbose_plus][:set]==:on) +                @xmldoc.elements.each(@e_head) do |e| +                  SiSU_Screen::Ansi.new( +                    @md.opt.act[:color_state][:set], +                    'brown', +                    e +                  ).colorize unless @md.opt.act[:quiet][:set]==:on +                end +              end +            rescue REXML::ParseException +              puts 'broken XML' +            end +          end +        else +          SiSU_Screen::Ansi.new( +            @md.opt.act[:color_state][:set], +            'fuchsia', +            "File Not Found #{xmlfile}", +            'requested XML processing skipped' +          ).colorize unless @md.opt.act[:quiet][:set]==:on +          exit +        end +      rescue +        SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +  end +end +__END__ + misc +e.each do |element| +  element.each do |child| +    if child.is_a?(REXML::Text) +      puts "Text: #{child.to_s.inspect}" +    else +      puts "SubElement: #{child.name}" +    end +  end +end +#+END_SRC + +** sitemaps.rb + +#+HEADER: :tangle "../lib/sisu/sitemaps.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Sitemaps +  require_relative 'dp'                                 # dp.rb +    include SiSU_Param +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  require_relative 'xml_shared'                         # xml_shared.rb +    include SiSU_XML_Munge +  class Source +    def initialize(opt) +      @opt=opt +    end +    def read +      songsheet +    end +    def songsheet +      begin +        @sys=SiSU_Env::SystemCall.new +        fn_set_lang=SiSU_Env::StandardiseLanguage.new(@opt.lng).language +        @fn=SiSU_Env::EnvCall.new(@opt.fns).lang(fn_set_lang[:c]) +        if @opt.act[:sitemap][:set]==:on +          @md=SiSU_Param::Parameters.new(@opt).get +          @trans=SiSU_XML_Munge::Trans.new(@md) #check @md is required +          @env=SiSU_Env::InfoEnv.new(@md.fns) +#         @file=SiSU_Env::FileOp.new(@md) +          @rdf=SiSU_XML_Tags::RDF.new(@md) +          @fnb_utf8_xml=@md.fnb.dup +          @trans.char_enc.utf8(@fnb_utf8_xml) \ +            if @sys.locale =~/utf-?8/i +          output_map(sitemap) +        elsif @opt.selections.str =~/--sitemaps/ +          @sitemap_idx_fn='sitemapindex.xml' +          @env=SiSU_Env::InfoEnv.new +          output_idx(sitemap_index) +          SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            'sitemap index:', +            "#{@env.path.output}/#{@sitemap_idx_fn}" +          ).result unless @opt.act[:quiet][:set]==:on +        end +      rescue +        SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +    def make_file(path,filename) +      (File.writable?("#{path}/.")) \ +      ? (File.new("#{path}/#{filename}",'w+')) +      : (SiSU_Screen::Ansi.new( +           '', +           "is the file or directory writable?, could not create #{filename}" +         ).warn) +    end +    def output_map(sitemap) +      path=@md.file.output_path.sitemaps.dir +      filename=@fn[:sitemap] +      touch_path=@md.file.output_path.sitemaps.dir +      touch_filename=@fn[:sitemap_touch] +      SiSU_Env::FileOp.new(@md).make_path(path) +      file=SiSU_Env::FileOp.new(@md).make_file(path,filename) +      file << sitemap +      if FileTest.file?("#{touch_path}/#{touch_filename}") +        FileUtils::rm("#{touch_path}/#{touch_filename}") +      end +    end +    def output_idx(sitemap) +      path=@env.path.output +      filename=@sitemap_idx_fn +      make_path(path) +      file=make_file(path,filename) +      file << sitemap +    end +    def sitemap_index +      sitemap_files=Dir.glob("#{@env.path.sitemaps}/sitemap_*.xml") +      sitemap_idx=[] +      sitemap_idx << <<WOK +<?xml version="1.0" encoding="UTF-8"?> +<sitemapindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +   xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemaps/0.9 +   http://www.sitemaps.org/schemas/sitemaps/sitemap.xsd" +     xmlns="http://www.sitemaps.org/schemas/sitemapindex/0.9"> +WOK +      sitemap_files.each do |s| +        f=s.gsub(/.+?\/sitemap_([^\/]+?)\.xml$/,'\1') +        @trans.char_enc.utf8(f) \ +          if @sys.locale =~/utf-?8/i +sitemap_idx << <<WOK +  <sitemap> +    <loc>#{@env.path.url.remote}/#{f}/sitemap.xml</loc> +  </sitemap> +WOK +      end +      sitemap_idx << <<WOK +</sitemapindex> +WOK +      sitemap_idx.join +    end +    def sitemap +      if defined? @md.date.modified \ +      and @md.date.modified=~/\d{4}-\d{2}-\d{2}/ +        sitemap_date_modified +      else sitemap_no_date +      end +    end +    def sitemap_date_modified +<<WOK +<?xml version='1.0' encoding='UTF-8'?> +<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +  xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemaps/0.9 +  http://www.sitemaps.org/schemas/sitemaps/sitemap.xsd" +  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> +#{@rdf.comment_xml} +  <url> +    <loc>#{@env.path.url.remote}/#{@fnb_utf8_xml}/#{@fn[:toc]}</loc> +    <lastmod>#{@md.date.modified}</lastmod> +    <changefreq>monthly</changefreq> +    <priority>0.7</priority> +  </url> +  <url> +    <loc>#{@env.path.url.remote}/#{@fnb_utf8_xml}/#{@fn[:doc]}</loc> +    <lastmod>#{@md.date.modified}</lastmod> +    <priority>0.5</priority> +  </url> +  <url> +    <loc>#{@env.path.url.remote}/#{@fnb_utf8_xml}/#{@fn[:manifest]}</loc> +    <lastmod>#{@md.date.modified}</lastmod> +    <priority>0.5</priority> +  </url> +</urlset> +WOK +    end +    def sitemap_no_date +<<WOK +<?xml version="1.0" encoding="UTF-8"?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> +#{@rdf.comment_xml} +  <url> +    <loc>#{@env.path.url.remote}/#{@fnb_utf8_xml}/#{@fn[:toc]}</loc> +    <changefreq>monthly</changefreq> +    <priority>0.7</priority> +  </url> +  <url> +    <loc>#{@env.path.url.remote}/#{@fnb_utf8_xml}/#{@fn[:doc]}</loc> +    <priority>0.5</priority> +  </url> +  <url> +    <loc>#{@env.path.url.remote}/#{@fnb_utf8_xml}/#{@fn[:manifest]}</loc> +    <priority>0.5</priority> +  </url> +</urlset> +WOK +    end +  end +end +__END__ +,* sanitize xml, pass through filter to ensure is valid - done but needs testing +,* remote placement of sitemaps --sitemaps -R (probably makes more sense than doing against -Y [filename/wildcard]) - done but needs testing +,* gzip sitemaps - not before testing / after testing +,* issue with master documnts, naming and mapping, check multilingual + +<!-- Document processing information: +     * Generated by: SiSU 0.48.6 of 2006w45/6 (20061111) +     * Ruby version: ruby 1.8.5 (2006-08-25) [i486-linux] +     * +     * Last Generated on: Sat Nov 18 15:28:08 +0000 2006 +     * SiSU http://www.jus.uio.no/sisu +--> +#+END_SRC + +** termsheet.rb + +#+HEADER: :tangle "../lib/sisu/termsheet.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +require_relative 'se'                                   # se.rb +require_relative 'dp'                                   # dp.rb +  include SiSU_Param +@do,@done,@used,@html_output,@txt_input,@txt_output,@@report=Array.new(7){[]} +@@info=nil +@c=0 +@cX=SiSU_Screen::Ansi.new('yes').cX +@done << "\n#{@cX.blue_hi}#{@cX.black}Summary#{@cX.off*2}" +def talent(termsheet,flag) +  @@info=nil +  @@info=termsheet.gsub(/(.+?)\.termsheet\.rb/,'../facility_data/\1.html') +  @env=SiSU_Env::InfoEnv.new +  @dir_fd="#{@env.path.output}/facility_data" +  FileUtils::mkdir_p(@dir_fd) unless FileTest.directory?(@dir_fd)==true +  html_output=[] +  case termsheet +  when /.+?\.(termsheet)\.rb$/ +    @basename=termsheet[/(.+?)\.termsheet\.rb/, 1] +    @standard_form={} +    require termsheet +    include Termsheet +    @standard_form=Termsheet::StandardForms.new.standardforms +    puts %{\n#{@@cX.yellow_hi}#{@@cX.black}From#{@@cX.off*2}: #{@@cX.grey_hi}#{@@cX.black}#{@basename}.termsheet.rb#{@@cX.off*3}\n\n} +    @standard_form.each do |k,v| +      @c+=1 +      require v +      puts %{\n#{@@cX.blue_hi}#{@@cX.black}Producing the following#{@@cX.off*2}: #{@@cX.green}#{@basename}.#{k}#{@@cX.off}\n\n} +      @done << %{\n\t#{@@cX.grey}Documents generated#{@@cX.off}: #{@@cX.cyan}#{@basename}.#{k}#{@@cX.off}\n} +      @used << %{\n\t#{@@cX.grey}Using#{@@cX.off}: #{@@cX.ruby}#{v}#{@@cX.off}\n} +      html_output=<<WOK +<br /><a href="../#{@basename}.#{k}/landscape.pdf"> +<img border="0" width="18" height="15" src="../_sisu/image/b_pdf.png" alt="pdf landscape"></a>  +<a href="../#{@basename}.#{k}/portrait.pdf"> +<img border="0" width="15" height="18" src="../_sisu/image/b_pdf.png" alt="pdf portrait"></a>  +<a href="../#{@basename}.#{k}/sisu_manifest.html">#{@basename}.#{k}.sisu_manifest.html</a> +WOK +      @html_output << html_output +      @txt_input << %{\n\tForm #{@c}: <url:#{Dir.pwd}/#{v}>\n\t        |#{Dir.pwd}/#{v}|@|^|\n} +      @txt_output << %{\n\t#{k}: |../#{@basename}.#{k}/sisu_manifest.html|@|^|\n} +      @report_file_i=File.new("#{@dir_fd}/#{@basename}.txt",'w+') +      @report_file_o=File.new("#{@dir_fd}/#{@basename}.html",'w+') +      @filename_new=File.new("#{@basename}.#{k}.sst",'w+') +      @do << %{#{k}} +      @filename_new << @document +        # "require v" pulls in the composite @document +        # "termsheet" having all the variables required to complete the standard form @document +      @filename_new.close +    end +    @do.each do |x| +      system %{sisu -Nhwpo #{@basename}.#{x}.sst\n} +    end +  else print "not processed --> ", termsheet, "\n" +  end +  @done << %{\n\t#{@@cX.green}Summary:#{@@cX.off} #{@@cX.blue}#{@env.path.output}/facility_data/#{@basename}.html#{@@cX.off}\n} +  @done << %{\n\t#{@@cX.grey}From details provided in#{@@cX.off}: #{@@cX.green}#{termsheet}#{@@cX.off}\n} +  terms=%{\nTermsheet: <url:#{Dir.pwd}/#{termsheet}>\n           |#{Dir.pwd}/#{termsheet}|@|^|\n} +  @report_file_i << "<url:all.txt>\n|all.txt|@|^|\n" << terms << "\nForms:\n" << @txt_input  << "\nOutput Files\n" << @txt_output +  @report_file_o << %{<a href="toc.html">^</a><br />\n} << @html_output +  @@report << @done << @used << "\n" +  @done,@used=[],[] +end +require_relative 'dp'                                   # dp.rb +@argv=$* +@proc="#{@argv[0].to_s}" +if @proc =~  /^-?[wft]/ +  @argv.shift +  @argv.each do |termsheet| +    talent(termsheet,@proc) +  end +end +@env=SiSU_Env::InfoEnv.new +@dir_fd="#{@env.path.output}/facility_data" +@url="#{@env.url.webserv}/facility_data" +@@report << %{\n#{@@cX.grey}See#{@@cX.off}: #{@@cX.blue}#{@dir_fd}/all.txt\t#{@dir_fd}/toc.html\t#{@dir_fd}/#{@@cX.off}\n\n#{@@cX.grey}See#{@@cX.off}: #{@@cX.blue}#{@url}/all.txt\t#{@url}/toc.html\t#{@url}/#{@@cX.off}\n\n} +puts @@report +File.unlink("#{@dir_fd}/all.txt") if FileTest.file?("#{@dir_fd}/all.txt") +File.unlink("#{@dir_fd}/toc.html") if FileTest.file?("#{@dir_fd}/toc.html") +summary_file=File.new("#{@dir_fd}/all.txt",'w+') +summary_html=File.new("#{@dir_fd}/toc.html",'w+') +ls_txt=%x{ls #{@dir_fd}/*.txt} +report_thlnk=[] +ls_txt.scan(/.+/) +ls_txt.each {|x| report_thlnk << x.gsub!(/#{@dir_fd}\/(.+)/,"<url:\\1>\n|\\1|@|^|")} +report_thlnk.join("\n") +ls_html=%x{ls #{@dir_fd}/*.html} +report_html=[] +ls_html.split(/.+/) +ls_html.each {|x| report_html << x.gsub!(/#{@dir_fd}\/(.+)/,'<a href="\1">\1</a><br />')} +report_html.join("\n") +summary_file << "#{report_thlnk}" +summary_html << "#{report_html}" +__END__ +,** NOTE wrapper makes little sense without additional components, additional +   sample files must be provided - (saved till later as may confuse) +,*** bits +sisu -t x_bank.and.* +e.g. sisu -t x_bank.and.*.termsheet.rb +e.g. sisu_termsheet.rb -t x_bank.and.c*.termsheet.rb +program calls upon termsheet file with extension termsheet.rb +termsheet.rb calls upon relevant standard form files (to be used) with extension .sForm.rb +there is also a standard_terms.rb file - with terms/details that are  constant +the file produced is named after the termsheet.rb with that extension replaced with .er30 +from there scribbler.rb is called upon its usual metaVerse html and pdf  creation +! :-) +to test run +termsheet.rb -f dev.export.import.trade.facility.termsheet.rb +the term sheet calls the standard form or template that is to be run against it. +#+END_SRC + +** update.rb + +#+HEADER: :tangle "../lib/sisu/update.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_UpdateControlFlag +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  include SiSU_Param +  class Check +    def initialize(opt) +      @opt=opt +      @md=SiSU_Param::Parameters.new(@opt).get +    end +    def read +      begin +        @env=SiSU_Env::InfoEnv.new(@md.fns) +        out=@env.path.output +        base_path="#{out}/#{@md.fnb}" +        SiSU_Screen::Ansi.new( +          @md.opt.act[:color_state][:set], +          'Checking previous output', +          base_path +        ).green_hi_blue unless @md.opt.act[:quiet][:set]==:on +        SetCF.new(@md).set_flags +      rescue +        SiSU_Errors::Rescued.new($!,$@,@md.opt.selections.str,@md.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +    private +    class SetCF +      def initialize(md) +        @md=md +        @env=SiSU_Env::InfoEnv.new(@md.fns) +        out=@env.path.output +        @base_path="#{out}/#{@md.fnb}" +        @pdf_fn=SiSU_Env::FileOp.new(@md).base_filename +      end +      def set_flags #-mNhwpoabxXyv +        flag='-v' +        if FileTest.file?("#{@md.file.output_path.txt.dir}/#{@md.file.base_filename.txt}")==true +          flag=flag + 'a' +        end +        if FileTest.file?("#{@md.file.output_path.html_seg.dir}/#{@md.file.base_filename.html_seg}")==true \ +        or FileTest.file?("#{@md.file.output_path.html_scroll.dir}/#{@md.file.base_filename.html_scroll}")==true +          flag=flag + 'h' +        end +        if FileTest.file?("#{@md.file.output_path.xhtml.dir}/#{@md.file.base_filename.xhtml}")==true +          flag=flag + 'b' +        end +        if FileTest.file?("#{@md.file.output_path.xml_sax.dir}/#{@md.file.base_filename.xml_sax}")==true +          flag=flag + 'x' +        end +        if FileTest.file?("#{@md.file.output_path.xml_dom.dir}/#{@md.file.base_filename.xml_dom}")==true +          flag=flag + 'X' +        end +        if FileTest.file?("#{@md.file.output_path.epub.dir}/#{@md.file.base_filename.epub}")==true +          flag=flag + 'e' +        end +        if FileTest.file?("#{@md.file.output_path.odt.dir}/#{@md.file.base_filename.odt}")==true +          flag=flag + 'o' +        end +        if FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_p_a4}")==true \ +        or FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_l_a4}")==true \ +        or FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_p_letter}")==true \ +        or FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_l_letter}")==true +          flag=flag + 'p' +        end +        if FileTest.file?("#{@md.file.output_path.html_concordance.dir}/#{@md.file.base_filename.html_concordance}")==true +          flag=flag + 'w' +        end +        if FileTest.file?("#{@md.file.output_path.digest.dir}/#{@md.file.base_filename.digest}")==true +          flag=flag + 'N' +        end +        if FileTest.file?("#{@md.file.output_path.src.dir}/#{@md.file.base_filename.src}")==true +          flag=flag + 's' +        end +        if FileTest.file?("#{@md.file.output_path.sisupod.dir}/#{@md.file.base_filename.sisupod}")==true +          flag=flag + 'S' +        end +        puts flag +        flag +      end +    end +  end +end +__END__ +#+END_SRC + +** urls.rb + +#+HEADER: :tangle "../lib/sisu/urls.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Urls +  require_relative 'se_hub_particulars'                 # se_hub_particulars.rb +    include SiSU_Particulars +  require_relative 'se'                                 # se.rb +    include SiSU_Env; include SiSU_Screen +  class Source +    attr_reader :opt +    def initialize(opt) +      @opt=opt +    end +    def read +      begin +        SiSU_Urls::OutputUrls.new(@opt).songsheet if @opt.fnb +      rescue +        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +  end +  class OutputUrls +    attr_reader :fns,:fnb,:act,:dir,:m_regular,:u +    def initialize(opt) +      @opt=opt +      @particulars=SiSU_Particulars::CombinedSingleton.instance.get_env_md(opt) +      if @particulars.is_a?(NilClass) +        if @opt.act[:verbose_plus][:set]==:on \ +        or @opt.act[:maintenance][:set]==:on +          SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia). +            mark("@particulars is NilClass, acceptable e.g. for --harvest") +        end +        exit +      end +      @selections=@opt.selections.str +      @act=@opt.act +      @md=@particulars.md +      @env=@particulars.env +      @fnb=@env.fnb +      fn_set_lang=SiSU_Env::StandardiseLanguage.new(@opt.lng).language +      @fnl=@env.i18n.lang_filename(fn_set_lang[:c]) +      @fn=SiSU_Env::EnvCall.new(@opt.fns).lang(fn_set_lang[:c]) +      @m_regular=/(.+?)\.(?:(?:-|ssm\.)?sst|ssm)$/ +      @prog=@env.program +    end +    def songsheet +      begin +        (@opt.act[:urls_all][:set]==:on) \ +        ? urls_all \ +        : (urls_select unless @opt.act[:quiet][:set]==:on) +      rescue +        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +    def show +      def report(x) +        SiSU_Screen::Ansi.new( +          @opt.act[:color_state][:set], +          "[#{@opt.f_pth[:lng_is]}]", +          x[:cmd], +          x[:viewer] + ' ' \ +          + x[:f_pth] +        ).result +      end +      def maintenance(x) +        if @opt.act[:maintenance][:set]==:on +          SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            "[#{@opt.f_pth[:lng_is]}]", +            x[:cmd], +            x[:p_pth] +          ).maintenance +        end +      end +      self +    end +    def report_info +      def dal +        { +          cmd: '--ao', +          p_pth: @env.processing_path.ao + '/' \ +          + @opt.fns + '.meta', +          fn: 'ao', +         } +      end +      def hash_digests +        { +          cmd: '--hash-digests (sha512/sha256/md5)', +          viewer: @prog.web_browser, +          f_pth: @md.file.output_path.hash_digest.dir + '/' \ +          + @md.file.base_filename.hash_digest, +          fn: @fn[:digest], +         } +      end +      def text +        def txt +          { +            cmd: '--txt', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.txt.dir + '/' \ +            + @md.file.base_filename.txt, +            fn: @fn[:plain], +           } +        end +        def asciidoc +          { +            cmd: '--asciidoc', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.asciidoc.dir + '/' \ +            + @md.file.base_filename.asciidoc, +            fn: @fn[:txt_asciidoc], +           } +        end +        def markdown +          { +            cmd: '--markdown', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.markdown.dir + '/' \ +            + @md.file.base_filename.markdown, +            fn: @fn[:txt_markdown], +           } +        end +        def rst +          { +            cmd: '--rst', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.rst.dir + '/' \ +            + @md.file.base_filename.rst, +            fn: @fn[:txt_rst], +           } +        end +        def textile +          { +            cmd: '--textile', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.textile.dir + '/' \ +            + @md.file.base_filename.textile, +            fn: @fn[:txt_textile], +           } +        end +        def orgmode +          { +            cmd: '--orgmode', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.orgmode.dir + '/' \ +            + @md.file.base_filename.orgmode, +            fn: @fn[:txt_orgmode], +           } +        end +        self +      end +      def html +        def seg +          { +            cmd: '--html-seg', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.html_seg.dir + '/' \ +            + @md.file.base_filename.html_segtoc, +            p_pth: @env.processing_path.tune + '/' \ +            + @md.fns + '.tune', +            fn: @fn[:toc], +           } +        end +        def scroll +          { +            cmd: '--html-scroll', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.html_scroll.dir + '/' \ +            + @md.file.base_filename.html_scroll, +            p_pth: @env.processing_path.tune + '/' \ +            + @md.fns + '.tune', +            fn: @fn[:doc], +           } +        end +        def concordance +          { +            cmd: '--concordance', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.html_concordance.dir + '/' \ +            + @md.file.base_filename.html_concordance, +            fn: @fn[:concordance], +           } +        end +        self +      end +      def xhtml +        def xhtml +          { +            cmd: '--xhtml', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.xhtml.dir + '/' \ +            + @md.file.base_filename.xhtml, +            p_pth: @env.processing_path.tune + '/' \ +            + @md.fns + '.tune', +            fn: @fn[:xhtml], +           } +        end +        def epub +          { +            cmd: '--epub', +            viewer: @prog.epub_viewer, +            f_pth: @md.file.output_path.epub.dir + '/' \ +            + @md.file.base_filename.epub, +            p_pth: @env.processing_path.epub + '/' \ +            + Ep[:d_oebps] + '/' \ +            + 'index.xhtml', +            fn: @fn[:epub], +           } +        end +        self +      end +      def xml +        def odt +          { +            cmd: '--odt (ODF:ODT)', +            viewer: @prog.odf_viewer, +            f_pth: @md.file.output_path.odt.dir + '/' \ +            + @md.file.base_filename.odt, +            p_pth: @env.processing_path.odf + '/' \ +            + @opt.fns + '/' \ +            + 'odt/content.xml', +            fn: @fn[:odf], +           } +        end +        def docbook +          { +            cmd: '--docbook', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.xml_docbook_book.dir + '/' \ +            + @md.file.base_filename.xml_docbook_book, +            fn: @fn[:xml_docbook_book], +           } +        end +        def fictionbook +          { +            cmd: '--fictionbook', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.xml_fictionbook.dir + '/' \ +            + @md.file.base_filename.xml_fictionbook, +            fn: @fn[:xml_fictionbook], +           } +        end +        def sax +          { +            cmd: '--xml-sax', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.xml_sax.dir + '/' \ +            + @md.file.base_filename.xml_sax, +            fn: @fn[:sax], +           } +        end +        def dom +          { +            cmd: '--xml-dom', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.xml_dom.dir + '/' \ +            + @md.file.base_filename.xml_dom, +            fn: @fn[:dom], +           } +        end +        def scaffold_sisu +          { +            cmd: '--xml-scaffold-sisu', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.xml_scaffold_structure_sisu.dir + '/' \ +            + @md.file.base_filename.xml_scaffold_structure_sisu, +            fn: @fn[:xml_scaffold_structure_sisu], +           } +        end +        def scaffold_collapse +          { +            cmd: '--xml-scaffold-collapse', +            viewer: @prog.web_browser, +            f_pth: @md.file.output_path.xml_scaffold_structure_collapse.dir + '/' \ +            + @md.file.base_filename.xml_scaffold_structure_collapse, +            fn: @fn[:xml_scaffold_structure_collapse], +           } +        end +        self +      end +      def json +        { +          cmd: '--js (json)', +          viewer: @prog.web_browser, +          f_pth: @md.file.output_path.json.dir + '/' \ +          + @md.file.base_filename.json, +          fn: @fn[:json], +        } +      end +      def pdf +        def landscape +          { +            cmd: '--pdf (landscape)', +            viewer: @prog.pdf_viewer, +            f_pth: @md.file.output_path.pdf.dir + '/' \ +            + @md.file.base_filename.pdf_l \ +            + @md.papersize_array[0] + '.pdf', +            p_pth: @env.processing_path.tex + '/' \ +            + @opt.fns.gsub(/~/,'-') + '.' \ +            + @md.papersize_array[0] \ +            + '.landscape.tex', +            fn: @fn[:pdf_l], +           } +        end +        def portrait +          { +            cmd: '--pdf (portrait)', +            viewer: @prog.pdf_viewer, +            f_pth: @md.file.output_path.pdf.dir + '/' \ +            + @md.file.base_filename.pdf_p \ +            + @md.papersize_array[0] + '.pdf', +            p_pth: @env.processing_path.tex + '/' \ +            + @opt.fns.gsub(/~/,'-') + '.' \ +            + @md.papersize_array[0] \ +            + '.tex', +            fn: @fn[:pdf_p], +           } +        end +        self +      end +      def manpage +        { +          cmd: '--manpage', +          viewer: @prog.manpage_viewer, +          f_pth: @md.file.output_path.manpage.dir + '/' \ +          + @md.file.base_filename.manpage, +          fn: 'manpage', +         } +      end +      def texinfo +        { +          cmd: '--texinfo', +          viewer: '', +          f_pth: 'cd ' \ +          + @md.file.output_path.texinfo.dir + ' && ' \ +          + @env.program.texinfo + ' ' \ +          + @md.file.base_filename.info \ +          + '; cd -', +          fn: 'info', +         } +      end +      def db +        def psql +          { +            cmd: '--psql --update/--import', +            viewer: '', +            f_pth: @pwd_stub + '::' \ +            + @opt.fns \ +            + 'dbi psql', +            p_pth: @env.processing_path.postgresql + '/' \ +            + @md.fns \ +            + '.sql', +            fn: 'dbi psql', +           } +        end +        def sqlite +          { +            cmd: '--sqlite --update/--import', +            viewer: 'sqlite3 ', +            f_pth: @env.path.webserv + '/' \ +            + @md.opt.f_pth[:pth_stub] + '/' \ +            + 'sisu_sqlite.db', +            p_pth: @env.processing_path.sqlite + '/' \ +            + @md.fns \ +            + '.sql', +            fn: 'dbi sqlite3', +           } +        end +        def sqlite_discrete +          { +            cmd: '--sqlite', +            viewer: 'sqlite3 ', +            f_pth: @md.file.output_path.sqlite_discrete.dir + '/' \ +            + @md.file.base_filename.sqlite_discrete, +            p_pth: @env.processing_path.sqlite + '/' \ +            + @md.fns \ +            + '.sql', +            fn: 'dbi sqlite3', +           } +        end +        self +      end +      def po4a +        def po +          { +            cmd: '--po4a/--pot', +            viewer: @prog.web_browser, +            f_pth: @prog.text_editor + ' ' \ +            + @md.file.output_path.po.dir \ +            + '/' + y, +            fn: @fn[:pot], +           } +        end +        def pot +          { +            cmd: '--po4a/--pot', +            viewer: @prog.web_browser, +            f_pth: @prog.text_editor + ' ' \ +            + @md.file.output_path.pot.dir \ +            + '/' + y, +            fn: @fn[:pot], +           } +        end +        self +      end +      def source +        { +          cmd: '--source (sisu markup)', +          viewer: @prog.text_editor, +          f_pth: @md.file.output_path.src.dir + '/' \ +          + @opt.fno, +          p_pth: @md.file.output_path.src.dir + '/' \ +          + @opt.fno, +          fn: @opt.fno, +         } +      end +      def sisupod +        { +          cmd: '--sisupod', +          viewer: '', +          f_pth: @md.file.output_path.sisupod.dir + '/' \ +          + @opt.fno \ +          + '.txz', +          p_pth: @md.file.output_path.sisupod.dir + '/' \ +          + @opt.fno + '/' \ +          + 'sisupod/', +          fn: @fn[:sisupod], +         } +      end +      def ruby_profile +        { +          cmd: '--profile (ruby profiler)', +          fn: 'profile', +         } +      end +      def qrcode +        { +          cmd: '--qrcode', +          viewer: @prog.web_browser, +          f_pth: @md.file.output_path.manifest.dir + '/' \ +          + @md.file.base_filename.manifest, +          fn: @fn[:qrcode], +         } +      end +      def manifest +        { +          cmd: '--manifest', +          viewer: @prog.web_browser, +          f_pth: @md.file.output_path.manifest.dir + '/' \ +          + @md.file.base_filename.manifest, +          fn: @fn[:manifest], +         } +      end +      def sitemap +        { +          cmd: '--sitemap', +          viewer: @prog.web_browser, +          f_pth: @md.file.output_path.sitemaps.dir + '/' \ +          + @md.file.base_filename.sitemap, +          fn: @fn[:sitemap], +         } +      end +      self +    end +    def urls_select +      unless @opt.act[:quiet][:set]==:on +        i1='[' + @opt.f_pth[:lng_is] + ']' +        i2='file://' \ +        + @md.file.output_path.manifest.dir + '/' \ +        + @md.file.base_filename.manifest +        (@opt.act[:verbose][:set]==:on \ +        || @opt.act[:verbose_plus][:set]==:on \ +        || @opt.act[:maintenance][:set]==:on) \ +        ? SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            'URLs' +          ).green_title_hi +        : SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            'URL (output manifest)', +            i1, i2 +          ).grey_title_grey_blue +        if (@opt.act[:verbose][:set]==:on \ +        || @opt.act[:verbose_plus][:set]==:on \ +        || @opt.act[:maintenance][:set]==:on) +          SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            i1, i2, +          ).flow +        end +      end +      m=/.+\/(?:src\/)?(\S+)/im +      @pwd_stub="#{@env.url.output_tell}"[m,1] +      unless @opt.act[:quiet][:set]==:on +        if @opt.fns =~ @m_regular +          if (@opt.act[:verbose][:set]==:on \ +          || @opt.act[:verbose_plus][:set]==:on \ +          || @opt.act[:maintenance][:set]==:on) +            if @opt.act[:txt][:set]==:on +              show.report(report_info.text.txt) +              #show.maintenance(report_info.text.txt) +            end +            if @opt.act[:txt_textile][:set]==:on +              show.report(report_info.text.textile) +              #show.maintenance(report_info.text.textile) +            end +            if @opt.act[:txt_asciidoc][:set]==:on +              show.report(report_info.text.asciidoc) +              #show.maintenance(report_info.text.asciidoc) +            end +            if @opt.act[:txt_markdown][:set]==:on +              show.report(report_info.text.markdown) +              #show.maintenance(report_info.text.markdown) +            end +            if @opt.act[:txt_rst][:set]==:on +              show.report(report_info.text.rst) +              #show.maintenance(report_info.text.rst) +            end +            if @opt.act[:txt_orgmode][:set]==:on +              show.report(report_info.text.orgmode) +              #show.maintenance(report_info.text.orgmode) +            end +            if (@opt.act[:html][:set]==:on \ +            or @opt.act[:html_scroll][:set]==:on \ +            or @opt.act[:html_seg][:set]==:on) +              if @opt.act[:html_scroll][:set]==:on +                show.report(report_info.html.scroll) +                show.maintenance(report_info.html.scroll) +              end +              if @opt.act[:html_seg][:set]==:on +                show.report(report_info.html.seg) +                show.maintenance(report_info.html.seg) +              end +            end +            if @opt.act[:concordance][:set]==:on +              show.report(report_info.html.concordance) +              #show.maintenance(report_info.html.concordance) +            end +            if @opt.act[:xhtml][:set]==:on +              show.report(report_info.xhtml.xhtml) +              show.maintenance(report_info.xhtml.xhtml) +            end +            if @opt.act[:epub][:set]==:on +              show.report(report_info.xhtml.epub) +              show.maintenance(report_info.xhtml.epub) +            end +            if @opt.act[:odt][:set]==:on +              show.report(report_info.xml.odt) +              show.maintenance(report_info.xml.odt) +            end +            if @opt.act[:xml_dom][:set]==:on +              show.report(report_info.xml.dom) +              #show.maintenance(report_info.xml.dom) +            end +            if @opt.act[:xml_sax][:set]==:on +              show.report(report_info.xml.sax) +              #show.maintenance(report_info.xml.sax) +            end +            if @opt.act[:xml_docbook_book][:set]==:on +              show.report(report_info.xml.docbook) +              #show.maintenance(report_info.xml.docbook) +            end +            if @opt.act[:xml_fictionbook][:set]==:on +              show.report(report_info.xml.fictionbook) +              #show.maintenance(report_info.xml.fictionbook) +            end +            if @opt.act[:xml_scaffold_structure_sisu][:set]==:on +              show.report(report_info.xml.scaffold_structure_sisu) +              #show.maintenance(report_info.xml.scaffold_structure_sisu) +            end +            if @opt.act[:xml_scaffold_structure_collapse][:set]==:on +              show.report(report_info.xml.scaffold_collapse) +              #show.maintenance(report_info.xml.scaffold_collapse) +            end +            if @opt.act[:json][:set]==:on +              show.report(report_info.json) +              #show.maintenance(report_info.json) +            end +            if (@opt.act[:pdf][:set]==:on \ +            or @opt.act[:pdf_p][:set]==:on \ +            or @opt.act[:pdf_l][:set]==:on) +              if @opt.act[:pdf_p][:set]==:on +                show.report(report_info.pdf.portrait) +                show.maintenance(report_info.pdf.portrait) +              end +              if @opt.act[:pdf_l][:set]==:on +                show.report(report_info.pdf.landscape) +                show.maintenance(report_info.pdf.landscape) +              end +            end +            if @opt.act[:psql][:set]==:on +              show.report(report_info.db.psql) +              show.maintenance(report_info.db.psql) +            end +            if @opt.act[:sqlite_discrete][:set]==:on +              show.report(report_info.db.sqlite_discrete) +              show.maintenance(report_info.db.sqlite_discrete) +            end +            if @opt.act[:sqlite][:set]==:on +              show.report(report_info.db.sqlite) +              show.maintenance(report_info.db.sqlite) +            end +            if @opt.act[:texinfo][:set]==:on +              show.report(report_info.texinfo) +              #show.maintenance(report_info.texinfo) +            end +            if @opt.act[:manpage][:set]==:on +              show.report(report_info.manpage) +              #show.maintenance(report_info.manpage) +            end +            if @opt.act[:hash_digests][:set]==:on +              show.report(report_info.hash_digests) +              #show.maintenance(report_info.hash_digests) +            end +            if @opt.act[:po4a_shelf][:set]==:on +              #if @opt.fns =~/\S+?~\S{2}(?:_\S{2})?\.ss[mt]/ +              #else +              #end +            end +            if @opt.act[:share_source][:set]==:on +              show.report(report_info.source) +              show.maintenance(report_info.source) +            end +            if @opt.act[:sisupod][:set]==:on +              show.report(report_info.sisupod) +              show.maintenance(report_info.sisupod) +            end +            if @opt.act[:qrcode][:set]==:on +              show.report(report_info.qrcode) +              #show.maintenance(report_info.qrcode) +            end +            if @opt.act[:manifest][:set]==:on +              show.report(report_info.manifest) +              show.maintenance(report_info.manifest) +            end +          end +        end +      end +    end +    def urls_all +      i="(output manifest) [#{@opt.f_pth[:lng_is]}] #{@env.url.output_tell}/#{@fnb}/sisu_manifest.html" +      SiSU_Screen::Ansi.new( +        @opt.act[:color_state][:set], +        'URLs', +        i +      ).grey_title_hi +    end +  end +end +__END__ +#+END_SRC + +** webrick.rb + +#+HEADER: :tangle "../lib/sisu/webrick.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Webserv +  class WebrickStart +    begin +      require 'time' +      require 'webrick' +        include WEBrick +    rescue LoadError +      SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia). +        error('time or webrick NOT FOUND (LoadError)') +    end +    require_relative 'se'                                 # se.rb +      include SiSU_Env +      include SiSU_Screen +    def initialize +      @cX=SiSU_Screen::Ansi.new('yes').cX +      @env=SiSU_Env::InfoEnv.new +      port=SiSU_Env::InfoPort.new +      @host=@env.url.webrick +      @port=port.webrick +      @serve=[] +      Dir.foreach(@env.path.webserv) do |x| +        if x !~/^\./ \ +        and FileTest.directory?("#{@env.path.webserv}/#{x}") +          @serve << x +        end +      end +      @mount=[] +      @serve.each {|x| @mount << ["/#{x}", "#{@env.path.webserv}/#{x}"]} +      @pwd=Dir.pwd +      @week=Time.now.strftime(%{%Yw%W}) +      puts "\n" +      @mount.each { |x,y| +        puts "  * #{@cX.blue}#{@host}:#{@port}#{x}/#{@cX.off}" +      } +      get=Dir.pwd +      brick(@port,get) +    end +    def brick(port,get='') +      cgidir=if get=~/pwd/ then Dir.pwd +      else                      '/usr/lib/cgi-bin' +      end +      port=SiSU_Env::InfoPort.new.webrick +      begin +        s=HTTPServer.new( +          Port:         port, +          DocumentRoot: Dir::pwd + '/htdocs', +          CGIPathEnv:   ENV['PATH'] +        ) +        cgi_dir=File.expand_path(cgidir) +        @mount.each { |x,y|                                                        # mount subdirectories +          s.mount(x, HTTPServlet::FileHandler, y, true) +        } +        s.mount('/cgi-bin', HTTPServlet::FileHandler, cgi_dir, { FancyIndexing: true }) +        trap("INT"){ s.shutdown } +        s.start +      rescue +        SiSU_Errors::Rescued.new($!,$@,'-W',nil).location do #fix +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +    def wb_cgi +      begin                                                                          #% +        wb_s2='' +                                                                 #% writes file wb.cgi to shared directories ... +                                                                 #% wb_top +        wb_top=%q(#!/usr/bin/env ruby +        # * arch-tag: webrick info on environment, mounted directories, and contents of pwd +        begin +          require 'time' +          require 'cgi' +          require 'fcgi' +        rescue LoadError +          puts 'time, cgi or fcgi NOT FOUND (LoadError)' +        end +        ls=Dir.entries('./') +        dir_contents=[] +        ls.each { |x| dir_contents << "<a href=\"./#{x}/\">#{x}</a><br>" unless x =~/^(\.)+$/ } +        dir_contents=dir_contents.sort.join(' ') +        #host=ENV['HOSTNAME'] +        #host=%x{echo $HOSTNAME} +        ) +        wb_s1=<<-WOK + +  page=CGI.new "html3" +  page.out { +    page.html { +      page.head { page.title {"#{@host} Webrick Report"} } + +      page.body { +        page.h1 {"Webrick #{@host}"} + +        page.p {"Webrick is Ruby's built in webserver."} + +        page.center {"Host name: " + page.b{"#{@host} "} + "(#{@host})  port: " + page.b{"#{@port}"}} + +        page.center {"#{Time.now}"} + +        page.center {"#{Time.now.strftime(%{%Yw%W})}"} + +        page.p {''} + +        page.p {''} + +        page.p {page.b{"Webrick Served Directories: "}} + +        WOK +                                                               #% wb_s2 (mounts) +        @mount.each do |x,y| wb_s2 += <<-WOK +          page.p {%{<a href="#{@host}:#{@port}#{x}/">#{x}</a> } + +            %{<a href="#{@host}:#{@port}#{x}/">#{@host}:#{@port}#{x}</a> (mounts: #{y}/)   <a href="#{@host}:#{@port}#{x}/wb.cgi">info (wb.cgi)</a>}} + +          WOK +        end +                                                               #% wb_end +        wb_end=<<-WOK +        page.p {page.b{"Contents of PWD (see URL): "}} + +        page.p {"#\{dir_contents}"} +      } +    } +  } +        WOK +        @mount.each { |x,y|                                      #% wb puts +          puts y +            filename=File.new("#{y}/wb.cgi",'w') +            filename << wb_top +            filename << wb_s1 +            filename << wb_s2 +            filename << wb_end +            filename.close +            FileUtils::chmod(0755,"#{y}/wb.cgi &") if FileTest.file?("#{y}/wb.cgi &") +        } +      rescue +        SiSU_Errors::Rescued.new($!,$@,'-W',nil).location do #fix +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +  end +ensure +end +__END__ +#+END_SRC + +** wikispeak.rb + +#+HEADER: :tangle "../lib/sisu/wikispeak.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Wikispeak +  require_relative 'ao'                                 # ao.rb +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  include SiSU_Param +  require_relative 'plaintext_format'                   # plaintext_format.rb +    include Format +  require_relative 'html_parts'                         # html_parts.rb +  require_relative 'txt_shared' +  @@alt_id_count,@@alt_id_count=0,0 +  @@tablefoot='' +  class Source +    def initialize(opt) +      @opt=opt +      @@dostype='msdos footnotes' +    end +    def read +      begin +        @md=SiSU_Param::Parameters.new(@opt).get +        @env=SiSU_Env::InfoEnv.new(@opt.fns) +        path=@env.path.output_tell +        tool=(@opt.act[:verbose][:set]==:on \ +        || @opt.act[:verbose_plus][:set]==:on \ +        || @opt.act[:maintenance][:set]==:on) \ +        ? "#{@env.program.text_editor} #{path}/#{@md.fnb}/#{@md.fn[:wiki]}" +        : '' +        SiSU_Screen::Ansi.new( +          @opt.act[:color_state][:set], +          'Wikispeak', +          tool +        ).green_hi_blue unless @opt.act[:quiet][:set]==:on +        if (@opt.act[:verbose_plus][:set]==:on \ +        || @opt.act[:maintenance][:set]==:on) +          SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            @opt.fns, +            "#{@env.path.output_tell}/#{@md.fnb}/#{@md.fn[:wiki]}" +          ).flow +        end +        @ao_array=SiSU_AO::Source.new(@opt).get # ao file drawn here +        SiSU_Wikispeak::Source::Scroll.new(@ao_array,@md).songsheet +      rescue +        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do +          __LINE__.to_s + ':' + __FILE__ +        end +      ensure +      end +    end +    private +    class SplitTextObject <Source +      require_relative 'plaintext_format'               # plaintext_format.rb +        include Format +      @@alt_id_count=0 +      @@dp=nil +      attr_reader :format,:lev,:text,:ocn,:lev_para_ocn +      def initialize(para) +        @para=para +        @format,@ocn='ordinary','ordinary' +        @dp=@@dp ||=SiSU_Env::InfoEnv.new.digest.pattern +      end +      def lev_segname_para_ocn +        @text=nil +        if @para =~/^(\d~|<:.+?>).+?#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/ +          if /^(([1-6])~(\S+))\s+(\S.+?)#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/m.match(@para) +            @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,$5 +          elsif  /^(([1-6])~)\s+(\S.+?)#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/m.match(@para) +            @format,@lev,@text,@ocn=$1,$2,$3,$4 +          elsif /<:(.+?)>\s*(\S.+?)#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/m.match(@para) +            @format,@text,@ocn=$1,$2,$3 +          elsif /^(([1-6])~(\S+))\s+(\S.+?)#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;[um]\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/m.match(@para) +            @@alt_id_count+=1 +            @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,"x#{@@alt_id_count}" +          elsif  /^(([1-6])~)\s+(\S.+?)#{Mx[:id_o]}~(\d+);[um]\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/m.match(@para) +            @@alt_id_count+=1 +            @format,@lev,@text,@ocn=$1,$2,$3,"x#{@@alt_id_count}" +          end +        else +          if /(.+?)#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/m.match(@para) +            @text,@ocn=$1,$2 +          end +          if @para !~/#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$|^$/ #added 2002w06 +            @text=/(.+?)/m.match(@para)[1] +          end +          if /^((\d)~(?:~\S+)?)\s+(.+)/m.match(@para) +            @format,@lev,@text=$1,$2,$3 +          end +        end +        format=@format.dup +        @lev_para_ocn=if @para =~/.+#{Mx[:id_o]}~\d+;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/ +          Format::FormatTextObject.new(format,@text,@ocn) +        else +          Format::FormatTextObject.new(format,@text,"#{Mx[:id_o]}~(\d+);[um]\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}") +        end +        self +      end +    end +    class Scroll <Source +      include SiSU_TextUtils +      include SiSU_Parts_HTML +      @@endnotes_para=[] +      @@wiki={ body: [], open: [], close: [], head: [], metadata: [], tail: [], endnotes: [] } +      @@dp=nil +      def initialize(data,md) +        @data,@md=data,md +        @dp=@@dp ||=SiSU_Env::InfoEnv.new.digest.pattern +        @regx=/^(?:(?:#{Mx[:br_line]}\s*|#{Mx[:br_nl]}\s*)?#{Mx[:lv_o]}\d:(\S*?)#{Mx[:lv_c]}\s*)?(.+)/ #fix Mx[:lv_o] #m # 2004w18 pb pn removal added +        @tab="\t" +        @@dostype='unix footnotes' +        @br="\n" +      end +      def songsheet +        markup +        publish +      end +      # Used for extraction of endnotes from paragraphs +      def extract_endnotes(para='') #check +        para.scan(/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})([\d*+]+\s+.+?)\s*#{Mx[:id_o]}#{@dp}#{Mx[:id_c]}(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/) +      end +      def wiki_metadata(meta) +        util=SiSU_TextUtils::Wrap.new(meta.text,70,15,1) +        txt=util.line_wrap +        @@wiki[:metadata] <<= if meta.type=='meta' +          <<WOK + +#{@tab}#{meta.el}: #{txt} +WOK +        else '' +        end +      end +      def wiki_tail +        generator="Generated by: #{@md.project_details.project} #{@md.project_details.version} of #{@md.project_details.date_stamp} (#{@md.project_details.date})"  if @md.project_details.version +        lastdone="Last Generated on: #{Time.now}" +        rubyv="Ruby version: #{@md.ruby_version}" +        sc=if @md.sc_info +          "Source file:    #{@md.sc_filename}#{@br}Version number: #{@md.sc_number}#{@br}Version date:   #{@md.sc_date}#{@br}" +        else '' +        end +        @@wiki[:tail] <<<<WOK +#{@br} +Other versions of this document: #{@br} +manifest: +   #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:manifest]}#{@br} +html: +   #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:toc]}#{@br} +pdf: +   #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:pdf_p]} +   #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:pdf_l]}#{@br} +plaintext (plain text): +   #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:plain]}#{@br} +at: +   #{vz.url_site}#{@br} + +#{sc} +,* #{generator} +,* #{rubyv} +,* #{lastdone} +,* SiSU #{vz.url_sisu} +WOK +      end +      def wiki_structure(para='',lv='',ocn='',hname='') #% Used to extract the structure of a document +        lv=lv.to_i +        lv=nil if lv==0 +        extract_endnotes(para) +        para.gsub!(/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})(?:[\d*+]+)\s+(.+?)#{Mx[:id_o]}#{@dp}#{Mx[:id_c]}(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/,'<ref>\1</ref>') # endnote marker marked up +        para.gsub!(/^#{Rx[:lv]}\S*\s+/,'') # endnote marker marked up +        para.gsub!(/<\S+?>#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}/,'') # endnote marker marked up +        if lv +          @@wiki[:body] << case lv +          when 1    then '='*2 << para.strip << @br*2 +          when 2..3 then '='*2 << para.strip << @br*2 +          when 4    then '='*4 << para.strip << @br*2 +          when 5..6 then '='*4 << para.strip << @br*2 +          end +        else @@wiki[:body] << para << @br*2 # main text, contents, body KEEP +        end +      end +      def markup                                                               # Used for major markup instructions +        data=@data +        SiSU_Env::InfoEnv.new(@md.fns) +        @data_mod,@endnotes,@level,@cont,@copen,@wiki_contents_close=Array.new(6){[]} +        (0..6).each { |x| @cont[x]=@level[x]=false } +        (4..6).each { |x| @wiki_contents_close[x]='' } +        wiki_tail +        table_message='[table omitted, see other document formats]' +        data.each do |para| +          para.gsub!(/#{Mx[:gr_o]}Th?#{Mx[:tc_p]}.+/um,"#{@br}#{table_message}") #fix +          para.gsub!(/.+?<-#>/,'')                                           # remove dummy headings (used by html) #check +          para.gsub!(/_\*\s+/,'* ')                                           # bullet markup, marked down +          para.gsub!(/©/,'©')                                           # bullet markup, marked down +          para.gsub!(/&/,'&')                                           # bullet markup, marked down +          para.gsub!(/<sup>(.+?)<\/sup>/,'^\1^') +          para.gsub!(/<sub>(.+?)<\/sub>/,'[\1]') +          para.gsub!(/<i>(.+?)<\/i>/,"''\\1''") +          para.gsub!(/<b>(.+?)<\/b>/,"'''\\1'''") +          para.gsub!(/<u>(.+?)<\/u>/,'_\1_') +          para.gsub!(/#{Mx[:lnk_o]}(.+?)#{Mx[:lnk_c]}#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/,'[\2 \1]') +          para.gsub!(/#{Mx[:url_o]}(\S+?)#{Mx[:url_c]}/,'[\1]') +          para.gsub!(/<:(?:block|group|verse|alt|code)(?:-end)?>(?:\s+#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]})?/,'') +          para.gsub!(/<:p[bn]>/,'')                                         # remove page breaks +          para.gsub!(/^\s*#{Mx[:id_o]}~\d+;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/,'') # remove empty lines - check +          para.gsub!(/<a href=".+?">(.+?)<\/a>/m,'\1') +          para.gsub!(/<:name#\S+?>/,'')                                       # remove name links +          para.gsub!(/ |#{Mx[:nbsp]}/,' ')                               # decide on +          para.gsub!(/(?:^|[^_\\])#{Mx[:lnk_o]}(\S+?\.(?:png|jpg|gif)) .+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/,'    [ \1 ]') #"[ #{dir.url.images_local}\/\\1 ]") +          para.gsub!(/(?:^|[^_\\])#{Mx[:lnk_o]}\s*\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"\s*#{Mx[:lnk_c]}\S+/,'[image: "\1"]') +          if para =~/^@(\S+?):\s+(.+?)\Z/m # for headers +            d_meta=SiSU_TextUtils::HeaderScan.new(@md,para).meta +            if d_meta; wiki_metadata(d_meta) +            end +          end +          if para !~/(^@\S+?:|#{Mx[:br_endnotes]}|#{Mx[:br_eof]})/ +            if para =~@regx #/.+?<~\d+;\w\d+;\w\d+>.*/ #watch change +              paranum=para[@regx,3] +              @p_num=Format::ParagraphNumber.new(paranum) +            end +            @sto=SplitTextObject.new(para).lev_segname_para_ocn +            ### problem in scroll, it appears tables are getting paragraph numbers +            m=/#{Mx[:id_o]}~(\d+);(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/ +            if para =~m \ +            and para=~/\S+/ +              para=case @sto.format +              when /^(1)~(?:(\S+))?/ +                wiki_structure(para,$1,@sto.ocn,$2) +                @sto.lev_para_ocn.heading_body1 +              when /^(2)~(?:(\S+))?/ +                wiki_structure(para,$1,@sto.ocn,$2) +                @sto.lev_para_ocn.heading_body2 +              when /^(3)~(?:(\S+))?/ +                wiki_structure(para,$1,@sto.ocn,$2) +                @sto.lev_para_ocn.heading_body3 +              when /^(4)~(\S+)/ # work on see SiSU_text_parts::SplitTextObject +                wiki_structure(para,$1,@sto.ocn,$2) +                @sto.lev_para_ocn.heading_body4 +              when /^(5)~(?:(\S+))?/ +                wiki_structure(para,$1,@sto.ocn,$2) +                @sto.lev_para_ocn.heading_body5 +              when /^(6)~(?:(\S+))?/ +                wiki_structure(para,$1,@sto.ocn,$2) +                @sto.lev_para_ocn.heading_body6 +              else +                wiki_structure(para,nil,nil,nil) #watch may be problematic +                para +              end +            elsif para =~/#{table_message}/ +              @@wiki[:body] << para << @br +            elsif para =~/(Note|Endnotes?)/ \ +            and para !~/#{Mx[:id_o]}~\d+;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/ +            elsif para =~/(MetaData)/ \ +            and para =~/#{Mx[:id_o]}~(\d+);[um]\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/ #debug 2003w46 add rc info ####suspect visit +            elsif para.include? 'Owner Details' \ +            and para !~/#{Mx[:id_o]}~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}#{@dp}:#{@dp}#{Mx[:id_c]}$/ +            elsif para =~/(#{Mx[:tc_p]}|#{Mx[:gr_o]}Th?)/u #tables ! #fix +            elsif para =~/(.*)<!#!>(.*)/ +              one,two=$1,$2 +              format_text=FormatTextObject.new(one,two) +              para=format_text.seg_no_paranum +            end +            if (para =~/<a name="n\d+">/ \ +            and para =~/^(-\{{2}~\d+|<!e[:_]\d+!>)/) # -endnote +              para='' +            end +            case para +            when /<:i1>/ +              if para =~/.*<:#>.*$/ +                format_text=FormatTextObject.new(para,'') +                para=format_text.scr_indent_one_no_paranum +              end +            when /<:i2>/ +              if para =~/.*<:#>.*$/ +                format_text=FormatTextObject.new(para,'') +                para=format_text.scr_indent_one_no_paranum +              end +            end +            if para !~/#{the_margin.txt_0}|#{the_margin.txt_1}|#{the_margin.txt_2}/ +              # i don't get the condition for no paranum +            end +            if para =~/<:center>/ +              one,two=/(.*)<:center>(.*)/.match(para)[1,2] +              format_text=FormatTextObject.new(one,two) +              para=format_text.center +            end +            para.gsub!(/<!.+!>/,' ') if para ## Clean Prepared Text +            para.gsub!(/<:\S+>/,' ') if para ## Clean Prepared Text +          end +        end +      end +      def publish +        content=[] +        content << @@wiki[:open] +        content << @@wiki[:head] +        content << @@wiki[:body] +        Output.new(content.join,@md).wiki +        @@wiki[:head],@@wiki[:body],@@wiki[:tail],@@wiki[:metadata]=[],[],[],[] +      end +    end +    class Output <Source +      include SiSU_Param +      include SiSU_Env +      def initialize(content,md) +        @content,@md=content,md +      end +      def wiki                                                            #%wiki output +        SiSU_Env::FileOp.new(@md).mkdir +        filename_wiki=SiSU_Env::FileOp.new(@md,@md.fn[:wiki]).mkfile +        @sisu=[] +        @content.each do |para|                                                # this is a hack +          if para =~/^\S/ +            if para !~/^([*=-]|\.){5}/; filename_wiki.puts para           #unix wiki +            else                        filename_wiki.puts para           #unix wiki +            end +          else filename_wiki.puts para # if para =~/^\s/ +          end +        end +      end +    end +  end +end +__END__ +#+END_SRC + +** zap.rb + +#+HEADER: :tangle "../lib/sisu/zap.rb" +#+BEGIN_SRC ruby +#<<sisu_document_header>> +module SiSU_Zap +  require_relative 'se'                                 # se.rb +    include SiSU_Env +  class Source +    def initialize(opt) +      @opt=opt +      @env=SiSU_Env::InfoEnv.new(opt.fns) +    end +    def read +      zap_path="#{@env.path.output}/#{@env.fnb}" +      z=SiSU_Env::CleanOutput.new(@opt) +      if SiSU_Env::InfoSettings.new.permission?('zap') +        unless @opt.act[:quiet][:set]==:on +          tell=SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            "Clean files related to processing #{@opt.selections.str} ->", +            "#{@opt.fns} -> #{zap_path}" +          ) +          tell.warn +        end +        z.zap.remove_output +      else +        unless @opt.act[:quiet][:set]==:on +          tell=SiSU_Screen::Ansi.new( +            @opt.act[:color_state][:set], +            'use of -Z (zap) has not enabled in sisurc.yml' +          ) +          tell.warn +        end +      end +    end +  end +end +__END__ +#+END_SRC + +* document header + +#+NAME: sisu_document_header +#+BEGIN_SRC text +encoding: utf-8 +- Name: SiSU + +  - Description: documents, structuring, processing, publishing, search +    misc + +  - Author: Ralph Amissah +    <ralph.amissah@gmail.com> + +  - Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, +    2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019, +    2020, 2021, 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.sisudoc.org/sisu/en/manifest/gpl.fsf.html> + +  - SiSU uses: +    - Standard SiSU markup syntax, +    - Standard SiSU meta-markup syntax, and the +    - Standard SiSU object citation numbering and system + +  - Homepages: +    <http://www.sisudoc.org> + +  - Git +    <https://git.sisudoc.org/projects/> +    <https://git.sisudoc.org/projects/?p=software/sisu.git;a=summary> +    <https://git.sisudoc.org/projects/?p=markup/sisu-markup-samples.git;a=summary> +#+END_SRC | 
