From fed01af686fb007454eafff9127b16a6516b50c0 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Sun, 17 Jun 2012 22:38:31 -0400
Subject: v3: shared_sisupod_source, common build for sisu (markup) source
 representations

* to be used by sisupod.txz, git, (and src)
  * sisupod_make (--sisupod)
  * share_source (--source)
  NOTE not used git at present
* changed representation of shared sisu source, include related files in
  directory rather than just markup file [reason for version bump]
  NOTE there are no changes to sisu markup (only the sharing of source files)
---
 lib/sisu/v3/constants.rb             |  18 +-
 lib/sisu/v3/git.rb                   |  50 ++---
 lib/sisu/v3/hub.rb                   |  79 +++++---
 lib/sisu/v3/manifest.rb              |   6 +-
 lib/sisu/v3/options.rb               |  22 +-
 lib/sisu/v3/param.rb                 |   2 +-
 lib/sisu/v3/po4a.rb                  |   4 +-
 lib/sisu/v3/share_src.rb             |  37 ++--
 lib/sisu/v3/shared_sisupod_source.rb | 377 +++++++++++++++++++++++++++++++++++
 lib/sisu/v3/sisupod_make.rb          | 305 +++-------------------------
 lib/sisu/v3/sysenv.rb                | 118 +++++------
 lib/sisu/v3/urls.rb                  |   8 +-
 12 files changed, 593 insertions(+), 433 deletions(-)
 create mode 100644 lib/sisu/v3/shared_sisupod_source.rb

(limited to 'lib')

diff --git a/lib/sisu/v3/constants.rb b/lib/sisu/v3/constants.rb
index c95178ea..2921b670 100644
--- a/lib/sisu/v3/constants.rb
+++ b/lib/sisu/v3/constants.rb
@@ -195,6 +195,7 @@ Px={
   lv5:                       '.',
   lv6:                       '.',
 }
+Px[:lng_lst_rgx]=Px[:lng_lst].join('|')
 Ep={
   d_oebps:                   'OEBPS',
   f_ncx:                     'toc.ncx',
@@ -223,16 +224,21 @@ Db={
   col_info_note:             2500,
 }
 Gt={
-  grotto:                    'sisu:',
+  grotto:                    'sisu_src',
+  git:                       'sisu:',
   src:                       'src',
+  pods:                      'pods',
+  sisupod:                   'sisupod',
   pod:                       'pod',
+  files:                     'files',
+  doc:                       'doc',
   po:                        'po4a/po',
   pot:                       'po4a/pot',
-  image:                     'mm/image',
-  audio:                     'mm/audio',
-  video:                     'mm/video',
-  conf:                      'conf',
-  skin:                      'conf/skin',                                      #Gt[:skin: 'conf/skin/doc'
+  image:                     'image',
+  audio:                     'audio',
+  video:                     'video',
+  conf:                      'doc/_sisu',
+  skin:                      'doc/_sisu/skin',                                  #Gt[:skin: 'conf/skin/doc'
 }
 DISABLE={
   epub: {
diff --git a/lib/sisu/v3/git.rb b/lib/sisu/v3/git.rb
index 313b46a9..7c0d573a 100644
--- a/lib/sisu/v3/git.rb
+++ b/lib/sisu/v3/git.rb
@@ -86,15 +86,15 @@ module SiSU_Git
       lng=(@md.opt.lng) ? (@md.opt.lng) : (@md.i18n[0])
       @git_path={
         fnb:       git_path_fnb,
-        src:       git_path_fnb + '/' + Gt[:src] + '/' + lng,
+        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[:conf],
-        skin:      git_path_fnb + '/' + Gt[:skin],
-        image:     git_path_fnb + '/' + Gt[:image],
-        audio:     git_path_fnb + '/' + Gt[:audio],
-        video:     git_path_fnb + '/' + Gt[:video],
-        conf:      git_path_fnb + '/' + Gt[:conf]
+        conf:      git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:conf],
+        skin:      git_path_fnb + '/' + Gt[:sisupod] + '/' + Gt[:skin],
+        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_DAL::Source.new(@opt).read                                         # -m
     end
@@ -107,9 +107,9 @@ module SiSU_Git
     def read
       create_file_structure_git
       populate.sisusrc_files
-      if program_found?
-        git_commit
-      end
+      #if program_found?
+      #  git_commit
+      #end
       unless @opt.cmd =~/q/
         @opt.cmd=~/[MVvz]/ \
         ? SiSU_Screen::Ansi.new(@opt.cmd,'Git path',@git_path[:fnb]).green_hi_blue
@@ -123,7 +123,7 @@ module SiSU_Git
     end
     def make_dir_fnb
       FileUtils::mkdir_p(@git_path[:fnb]) unless FileTest.directory?(@git_path[:fnb])
-      FileUtils::mkdir_p(@git_path[:src]) unless FileTest.directory?(@git_path[:src])
+      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])
@@ -141,14 +141,16 @@ module SiSU_Git
       end
     end
     def git_commit
-      if FileTest.directory?("#{@git_path[:fnb]}")
-        pwd=Dir.pwd
-        Dir.chdir(@git_path[:fnb])
-        system("
-          git add . \
-          && git commit -a
-        ")
-        Dir.chdir(pwd)
+      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
@@ -158,12 +160,12 @@ module SiSU_Git
       end
       def copy_src_head
         if @opt.f_pth[:lng]
-          FileUtils::cp_r("#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{@opt.fns}",@git_path[:src])
+          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[:src])
+          FileUtils::cp_r("#{@env.path.pwd}/#{ssm}",@git_path[:doc])
         else
-          FileUtils::cp_r("#{@env.path.pwd}/#{@opt.fns}",@git_path[:src])
+          FileUtils::cp_r("#{@env.path.pwd}/#{@opt.fns}",@git_path[:doc])
         end
       end
       def copy_related_sst_ssi
@@ -177,9 +179,9 @@ module SiSU_Git
         end
         doc_import.each do |f|
           if @opt.f_pth[:lng]
-            FileUtils::cp_r("#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{f}",@git_path[:src])
+            FileUtils::cp_r("#{@env.path.pwd}/#{@opt.f_pth[:lng]}/#{f}",@git_path[:doc])
           else
-            FileUtils::cp_r("#{@env.path.pwd}/#{f}",@git_path[:src])
+            FileUtils::cp_r("#{@env.path.pwd}/#{f}",@git_path[:doc])
           end
         end
       end
diff --git a/lib/sisu/v3/hub.rb b/lib/sisu/v3/hub.rb
index d5ab7bdd..f221c9a8 100644
--- a/lib/sisu/v3/hub.rb
+++ b/lib/sisu/v3/hub.rb
@@ -64,12 +64,11 @@ module SiSU
   class OptionLoopFiles
     def initialize(opt)
       @opt=opt
-      @r=Px[:lng_lst].join('|')
+      @r=Px[:lng_lst_rgx]
     end
     def loop_files_on_given_option
       @opt.files.each_with_index do |fno,i|
-        @opt.fns=fno
-        @opt.fno=fno
+        @opt.fno,@opt.fns=fno,fno
         @opt.f_pth=@opt.f_pths[i]
         if fno !~/\.-sst$/
           @opt.pth=@opt.paths[i]
@@ -113,7 +112,7 @@ module SiSU
       end
     end
     def manifest_on_files_translated
-      r=Px[:lng_lst].join('|')
+      r=Px[:lng_lst_rgx]
       number_of_files={}
       @opt.files.each_with_index do |fns,i|
         fn=fns.gsub(/(?:~(?:#{@r}))?\.ss[tm]$/,'')
@@ -385,14 +384,6 @@ p "#{__LINE__}:#{__FILE__}" if @opt.act[:maintenance][:set] ==:on
                 SiSU_DAL::Source.new(@opt).read
               end
             end
-            if @opt.act[:share_source][:set]==:on
-              if @opt.fno =~/\.ssm$/
-                SiSU_Screen::Ansi.new(@opt.cmd,'WARNING: share text source (--source) not available for composite files (.ssm),', 'composite (.ssm) source documents may be shared as a sisupod (--sisupod) (.txz)').warn unless @opt.cmd =~/q/
-              else
-                requires('share_src')                        # -s     share_src.rb
-                SiSU_Markup::Source.new(@opt).read
-              end
-            end
             if @opt.act[:qrcode][:set]==:on                #% --qrcode, -Q
               requires('qrcode')                           # -Q     qrcode.rb
               SiSU_QRcode::Source.new(@opt).read
@@ -468,34 +459,66 @@ p "#{__LINE__}:#{__FILE__}" if @opt.act[:maintenance][:set] ==:on
           end
         end
         def post_loop_files_on_given_option_do
-          if @opt.act[:sisupod][:set]==:on               #% --sisupod, -S make sisupod
-            requires('sisupod_make')                     # -S     sisupod_make.rb
+          if @opt.act[:share_source][:set]==:on \
+          or  @opt.act[:sisupod][:set]==:on \
+          or  @opt.act[:git][:set]==:on
             begin
+              requires('shared_sisupod_source')
               OptionLoopFiles.new(@opt).loop_files_on_given_option do
-                SiSU_Doc::Source.new(@opt).read
+                SiSU_Source::SiSUpodSource.new(@opt).read
+              end
+              if @opt.act[:share_source][:set]==:on
+#REDO
+                requires('share_src')                        # -s     share_src.rb
+                begin
+                ensure
+                  OptionLoopFiles.new(@opt).loop_files_on_given_option_bundle do
+                    SiSU_Markup::Source.new(@opt).read
+                  end
+                end
+              end
+              if @opt.act[:sisupod][:set]==:on               #% --sisupod, -S make sisupod
+                requires('sisupod_make')                     # -S     sisupod_make.rb
+                begin
+                ensure
+                  OptionLoopFiles.new(@opt).loop_files_on_given_option_bundle do
+                    SiSU_Doc::Source.new(@opt).sisupod_tar_xz
+                  end
+                end
+              end
+              if @opt.act[:git][:set]==:on                     #% --git, -g sisu git
+                requires('git')                                # -g     git.rb
+                begin
+                  OptionLoopFiles.new(@opt).loop_files_on_given_option do
+                    SiSU_Git::Source.new(@opt).read
+                  end
+                ensure
+                  OptionLoopFiles.new(@opt).loop_files_on_given_option_bundle do
+                    SiSU_Git::Source.new(@opt).git_commit
+                  end
+                end
               end
             ensure
-              OptionLoopFiles.new(@opt).loop_files_on_given_option_bundle do
-                SiSU_Doc::Source.new(@opt).sisupod_tar_xz
+              path_pod=@env.processing_path.processing_sisupod(@opt).paths
+              unless @opt.cmd =~/M/
+                FileUtils::rm_rf("#{path_pod[:sisupod]}/*") if FileTest.directory?(path_pod[:sisupod])
+                #FileUtils::rm_rf("#{path_pod[:fnb]}/*") if FileTest.directory?(path_pod[:fnb])
               end
             end
           end
-          if @opt.act[:images][:set]==:on                  #% --images, -j
-            requires('shared_images')
-            OptionLoopFiles.new(@opt).loop_files_on_given_option do
-              SiSU_Images::Source.new(@opt).read           # -j     shared_images.rb
-            end
-          end
           if @opt.act[:po4a][:set]==:on                    #% --po4a, -P
             requires('po4a')
-            OptionLoopFiles.new(@opt).loop_files_on_given_option do
-              SiSU_Po4a::Source.new(@opt).read             # -P     po4a.rb
+            begin
+              OptionLoopFiles.new(@opt).loop_files_on_given_option do
+                SiSU_Po4a::Source.new(@opt).read             # -P     po4a.rb
+              end
+            ensure
             end
           end
-          if @opt.act[:git][:set]==:on                     #% --git, -g sisu git
-            requires('git')
+          if @opt.act[:images][:set]==:on                  #% --images, -j
+            requires('shared_images')
             OptionLoopFiles.new(@opt).loop_files_on_given_option do
-              SiSU_Git::Source.new(@opt).read              # -g     git.rb
+              SiSU_Images::Source.new(@opt).read           # -j     shared_images.rb
             end
           end
           if @opt.cmd =~/T/                                #% -T termsheet/standard form
diff --git a/lib/sisu/v3/manifest.rb b/lib/sisu/v3/manifest.rb
index 092418fb..20983d7f 100644
--- a/lib/sisu/v3/manifest.rb
+++ b/lib/sisu/v3/manifest.rb
@@ -475,12 +475,10 @@ WOK
         end
       end
       def source_tests
-        if @md.fns =~/\.ssm\.sst$/                                                  #% decide whether to extract and include requested/required documents
-          req=@md.fns
+        if @md.fno =~/\.ssm$/                                                  #% 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
-            #rel=@f.output_path.src.rel_sm
+            rel=@f.output_path.src.rel_sm
             url=@f.output_path.src.url
             id,file='Markup Composite File (SiSU source)',@f.base_filename.src
             summarize_sources(id,file,pth,rel,url)
diff --git a/lib/sisu/v3/options.rb b/lib/sisu/v3/options.rb
index c7789f3a..7aa3622d 100644
--- a/lib/sisu/v3/options.rb
+++ b/lib/sisu/v3/options.rb
@@ -61,16 +61,16 @@ module SiSU_Commandline
   require_relative 'sysenv'                             # sysenv.rb
   @@base_path=nil
   class Options
-    attr_accessor :cmd,:mod,:act,:dir_structure_by,:f_pths,:files,:files_mod,:base_path,:base_stub,:sub_location,:paths,:lngs,:f_pth,:pth,:fno,:fns,:fnb,:fnc,:fncb,:lng,:lng_base,:what
+    attr_accessor :cmd,:mod,:act,:dir_structure_by,:f_pths,:files,:files_mod,:base_path,:base_stub,:sub_location,:paths,:lngs,:f_pth,:pth,:fno,:fns,:fnb,:fnc,:fng,:fncb,:lng,:lng_base,:what
     def initialize(a)
-      @cmd,@f_pth,@pth,@fno,@fns,@fnb,@fnc,@fncb,@what,@lng,@lng_base,@base_path,@base_stub,@sub_location='','','','','','','','','','','','','',''
+      @cmd,@f_pth,@pth,@fno,@fns,@fnb,@fnc,@fng,@fncb,@what,@lng,@lng_base,@base_path,@base_stub,@sub_location='','','','','','','','','','','','','',''
       @f_pths,@files,@files_mod,@paths,@mod,@act=Array.new(5){[]}
       @env=SiSU_Env::InfoEnv.new
       @lng_base=@env.language_default_set
       @dir_structure_by=SiSU_Env::EnvCall.new.output_dir_structure.by?
       @@base_path ||=Dir.pwd
       @base_path=@@base_path
-      r=Px[:lng_lst].join('|')
+      r=Px[:lng_lst_rgx]
       u=/.+?\/([^\/]+)(?:\/(?:#{r})$|$)/
       @base_stub=@base_path.gsub(u,'\1')
       @a=sisu_glob_rules(a)
@@ -139,8 +139,7 @@ module SiSU_Commandline
             end
           end
         end
-        r=Px[:lng_lst].join('|')
-        r=r.gsub(/\|#{@lng_base}\|/,'|')
+        r=Px[:lng_lst_rgx].gsub(/\|#{@lng_base}\|/,'|')
         @lang_regx=%r{(?:#{r})}
         z=if find_flag
           (f.length > 0) \
@@ -225,7 +224,7 @@ module SiSU_Commandline
               chdir #{pwd}
             ")
             Dir.chdir(pt.realpath.to_s + '/sisupod/doc')
-            r=Px[:lng_lst].join('|')
+            r=Px[:lng_lst_rgx]
             Dir.entries("#{fullname}/sisupod/doc").each do |d_lng|
               if d_lng =~/^(?:#{r})$/
                 Dir.chdir(pt.realpath.to_s + "/sisupod/doc/#{d_lng}")
@@ -816,12 +815,21 @@ module SiSU_Commandline
       @lng_base
     end
     def fno
-      @fno=if @fno and not @fno.empty?
+      @fno=if @fno \
+      and not @fno.empty?
         @fno
       else
         fns[/(.+?(?:sst|ssm))(?:\.sst)?/,1]
       end
     end
+    def fng
+      @fng=if @fng \
+      and not @fng.empty?
+        @fng
+      else
+        fno.gsub(/(?:~(?:#{Px[:lng_lst_rgx]}))?(\.ss[tm])$/,'\1')
+      end
+    end
     def fns
       @fns
     end
diff --git a/lib/sisu/v3/param.rb b/lib/sisu/v3/param.rb
index 78e42bd4..f6084aab 100644
--- a/lib/sisu/v3/param.rb
+++ b/lib/sisu/v3/param.rb
@@ -1054,7 +1054,7 @@ module SiSU_Param
       attr_accessor :make,:env,:path,:file,:fn,:fns,:fno,:fnb,:fnn,:fnt,:fnl,:flv,:fnz,:fnstex,:ocn,:sfx_src,:pdf,:file_type,:dir_out,:dir_tex,:dir_lout,:txt_path,:site_skin,:sisu,:sisu_version,:ruby_version,:title,:subtitle,:full_title,:html_title,:subtitle_tex,:creator,:classify,:author_home,:author,:author_title,:author_nationality,:authors,:authorship,:translator,:illustrator,:prepared_by,:digitized_by,:subject,:description,:publisher,:current_publisher,:contributor,:date,:date_created,:date_issued,:date_available,:date_valid,:date_modified,:date_translated,:date_added_to_site,:date_scheme,:date_created_scheme,:date_issued_scheme,:date_available_scheme,:date_valid_scheme,:date_modified_scheme,:type,:format,:identifier,:source,:language,:language_original,:relation,:coverage,:rights,:keywords,:comments,:abstract,:cls_loc,:cls_dewey,:cls_pg,:cls_isbn,:papersize,:papersize_array,:toc,:lv1,:lv2,:lv3,:lv4,:lv5,:lv6,:lvs,:pagenew,:pagebreak,:num_top,:toc_lev_limit,:flag_endnotes,:flag_auto_endnotes,:flag_separate_endnotes,:flag_separate_endnotes_make,:markup,:markup_instruction,:markup_version,:markup_declared,:flag_tables,:vocabulary,:doc_skin,:doc_css,:yaml,:lnk,:links,:prefix_a,:prefix_b,:suffix,:information,:contact,:icon,:image,:ad_url,:ad_png,:ad_alt,:ad_began,:flag_promo,:promo,:ad_home,:stmp,:stmpd,:sc_filename,:sc_number,:sc_date,:sc_time,:sc_info,:yamladdr,:locale,:wc_lines,:wc_words,:wc_bytes,:file_encoding,:filesize,:user,:home,:hostname,:pwd,:firstseg,:programs,:author_copymark,:i18n,:lang,:lang_code_insert,:en,:notes,:dgst,:dgst_skin,:generated,:tags,:tag_array,:concord_make,:seg_names,:seg_autoname_safe,:set_header_title,:set_heading_top,:set_heading_seg,:heading_seg_first,:heading_seg_first_flag,:base_program,:ec,:opt,:sem_tag,:book_idx,:topic_register,:topic_register_array,:original,:writing_focus,:audio,:daisy
       def initialize(fns_array,opt)
         @env=@path,@file=@fn=@fns=@fno=@fnb=@fnn=@fnt=@fnl=@flv=@fnz=@fnstex=@ocn=@sfx_src=@pdf=@file_type=@dir_out=@dir_tex=@dir_lout=@txt_path=@make=@flag_endnotes=@flag_auto_endnotes=@flag_separate_endnotes=@flag_separate_endnotes_make=@site_skin=@sisu=@sisu_version=@ruby_version=@title=@subtitle=@full_title=@html_title=@subtitle_tex=@creator=@classify=@author_home=@author=@author_title=@author_nationality=@translator=@illustrator=@prepared_by=@digitized_by=@subject=@description=@publisher=@current_publisher=@contributor=@date=@date_created=@date_issued=@date_available=@date_valid=@date_modified=@date_translated=@date_added_to_site=@date_scheme=@date_created_scheme=@date_issued_scheme=@date_available_scheme=@date_valid_scheme=@date_modified_scheme=@type=@format=@identifier=@source=@language=@language_original=@relation=@coverage=@rights=@keywords=@comments=@abstract=@cls_loc=@cls_dewey=@cls_pg=@cls_isbn=@papersize=@toc=@lv1=@lv2=@lv3=@lv4=@lv5=@lv6=@pagenew=@pagebreak=@num_top=@toc_lev_limit=@flag_tables=@vocabulary=@doc_skin=@doc_css=@yaml=@lnk=@links=@prefix_a=@prefix_b=@suffix=@information=@contact=@icon=@ad_url=@ad_png=@ad_alt=@ad_began=@promo=@ad_home=@stmp=@stmpd=@sc_filename=@sc_number=@sc_date=@sc_time=@sc_info=@yamladdr=@locale=@wc_lines=@wc_words=@wc_bytes=@file_encoding=@filesize=@firstseg=@programs=@author_copymark=@i18n=@lang=@lang_code_insert=@en=@notes=@dgst=@dgst_skin=@generated=@heading_seg_first=@base_program=@topic_register=@original=@writing_focus=@audio=nil
-        @data,@path,@fns,@opt=fns_array,opt.pth,opt.fns,opt #@data used as data
+        @data,@path,@fns,@fno,@opt=fns_array,opt.pth,opt.fns,opt.fno,opt #@data used as data
         @flag_tables,@set_header_title,@set_heading_top,@set_heading_seg,@heading_seg_first_flag,@flag_promo,@book_idx=false,false,false,false,false,false,false
         @seg_autoname_safe=true
         @daisy,@sem_tag=false,false
diff --git a/lib/sisu/v3/po4a.rb b/lib/sisu/v3/po4a.rb
index da066daf..7ce825ee 100644
--- a/lib/sisu/v3/po4a.rb
+++ b/lib/sisu/v3/po4a.rb
@@ -60,6 +60,7 @@ module SiSU_Po4a
   require_relative 'dal'                                # dal.rb
   require_relative 'sysenv'                             # sysenv.rb
     include SiSU_Env
+  require_relative 'composite'                          # composite.rb
   require_relative 'shared_metadata'                    # shared_metadata.rb
   require_relative 'po4a_set'                           # po4a_set.rb
   include SiSU_Param
@@ -72,8 +73,7 @@ module SiSU_Po4a
       #unless @opt.fns =~/(.+?\.(?:-|ssm\.)?sst)$/
       #  puts "#{@opt.fns} not a processed file type"
       #end
-      r=Px[:lng_lst].join('|')
-      r=r.gsub(/\|en\|/,'|')
+      r=Px[:lng_lst_rgx].gsub(/\|en\|/,'|')
       @lang_regx=%r{(?:#{r})}
       if opt.fns =~/\S+?~#{@lang_regx}\.ss[mti]/ \
       and opt.f_pth[:lng]!=@opt.lng_base
diff --git a/lib/sisu/v3/share_src.rb b/lib/sisu/v3/share_src.rb
index c4900f5f..2c446ecb 100644
--- a/lib/sisu/v3/share_src.rb
+++ b/lib/sisu/v3/share_src.rb
@@ -56,42 +56,31 @@
 
 =end
 module SiSU_Markup
+  require_relative 'shared_sisupod_source'              # shared_sisupod_source.rb
+    include SiSU_Source
   require_relative 'sysenv'                             # sysenv.rb
     include SiSU_Env
   pwd=Dir.pwd
-  class Source
-    def initialize(opt)
+  class Source < SiSU_Source::SiSUpodSource
+    def initialize(opt,build=nil,place=nil)
+      super(opt,build,place)
       @opt=opt
-      @env=SiSU_Env::InfoEnv.new(@opt.fns)
-      md=SiSU_Param::Parameters.new(@opt).get
-      @file=SiSU_Env::FileOp.new(md)
-      stub=@opt.fnb.gsub(/~[a-z]+$/,'')
     end
     def read
       unless @opt.cmd =~/q/
         @opt.cmd=~/[MVvz]/ \
         ? SiSU_Screen::Ansi.new(@opt.cmd,'Share Document Source!',@opt.fns).green_hi_blue
         : SiSU_Screen::Ansi.new(@opt.cmd,'Share Document Source!',@opt.fns).green_title_hi
-        SiSU_Screen::Ansi.new(@opt.cmd,"Copy sisu markup file to output directory","#{@opt.fns} -> #{@file.output_path.src.dir}").warn if @opt.cmd =~/[MVv]/
+        SiSU_Screen::Ansi.new(@opt.cmd,"Copy sisu markup file to output directory","#{@opt.fno} -> #{@file.output_path.src.dir}").warn if @opt.cmd =~/[MVv]/
       end
-      FileUtils::mkdir_p(@file.output_path.src.dir) unless FileTest.directory?(@file.output_path.src.dir)
-      if FileTest.directory?(@file.output_path.src.dir)
-        unless @opt.fns =~/\.ssm$/
-          if FileTest.file?(@opt.fns)
-            FileUtils::cp(@opt.fns,@file.output_path.src.dir)
-          else STDERR.puts %{\t*WARN* did not find - "#{@opt.fns}"}
-          end
-        else
-          req=@opt.fns.gsub(/(.+?\.ssm)$/,'\1.sst')
-          file="#{@env.processing_path.composite_file}/#{@opt.fnb}.ssm.sst"
-          if FileTest.file?(file)
-            FileUtils::cp(file,"#{@file.output_path.src.dir}/#{req}")
-          else STDERR.puts "*WARN* did not find #{file} to copy"
-          end
-        end
+      if FileTest.directory?(@path_pod[:fnb])
+        FileUtils::mkdir_p(@file.output_path.src.dir) unless FileTest.directory?(@file.output_path.src.dir)
+        v=(@opt.cmd =~/M/) ? 'v' : ''
+        system(%{
+          rsync -a#{v} #{@path_pod[:fnb]} #{@file.output_path.sisupod.dir}
+        })
       else
-        SiSU_Screen::Ansi.new(@opt.cmd,"*WARN* Output directory does not exist","#{@opt.fns} -> #{@file.output_path.src.dir}").warn if @opt.cmd =~/[MVv]/
-        exit
+        SiSU_Screen::Ansi.new('',"#{@opt.fno} not available").blue_tab if @opt.cmd=~/[MVv]/
       end
     end
   end
diff --git a/lib/sisu/v3/shared_sisupod_source.rb b/lib/sisu/v3/shared_sisupod_source.rb
new file mode 100644
index 00000000..2aff984c
--- /dev/null
+++ b/lib/sisu/v3/shared_sisupod_source.rb
@@ -0,0 +1,377 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+   2007, 2008, 2009, 2010, 2011, 2012 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
+
+ * Hompages:
+   <http://www.jus.uio.no/sisu>
+   <http://www.sisudoc.org>
+
+ * Download:
+   <http://www.sisudoc.org/sisu/en/SiSU/download.html>
+
+ * Ralph Amissah
+   <ralph@amissah.com>
+   <ralph.amissah@gmail.com>
+
+ ** Description: create sisupod filetype and copy it to output directory!
+
+=end
+module SiSU_Source
+  include SiSU_Env
+  class SiSUpodSource
+    require_relative 'sysenv'                           # sysenv.rb
+    require_relative 'particulars'                      # particulars.rb
+    def initialize(opt,build=nil,place=nil)
+      @opt=opt
+      m=/.+\/(?:src\/)?(\S+)/im
+      @date=SiSU_Env::InfoDate.new.dt
+      @env=SiSU_Env::InfoEnv.new(@opt.fns)
+      @ver=SiSU_Env::InfoVersion.instance.get_version
+      @v=(@opt.cmd =~/[VM]/) ? 'v' : ''
+      @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt)
+      @file=@particulars.file
+      @local_path="#{@file.output_path.sisupod.dir}"
+      processing_sisupod=@env.processing_path.processing_sisupod(@opt)
+      processing_sisupod.make
+      path_pod=processing_sisupod.paths[:sisupod]
+      path_pod_fnb=processing_sisupod.paths[:fnb]
+      FileUtils::mkdir_p(path_pod) unless FileTest.directory?(path_pod)
+      @path_pod={
+        fnb:       path_pod_fnb,
+        pod:       path_pod,
+        doc:       path_pod + '/' + Gt[:doc] + '/' + @opt.lng,
+        po:        path_pod + '/' + Gt[:po] + '/' + @opt.lng,
+        pot:       path_pod + '/' + Gt[:pot],
+        conf:      path_pod + '/' + Gt[:conf],
+        skin:      path_pod + '/' + Gt[:skin],
+        image:     path_pod + '/' + Gt[:image],
+        audio:     path_pod + '/' + Gt[:audio],
+        video:     path_pod + '/' + Gt[:video],
+        conf:      path_pod + '/' + Gt[:conf]
+      }
+    end
+    def read
+      unless @opt.cmd =~/q/
+        @opt.cmd=~/[MVv]/ \
+        ? SiSU_Screen::Ansi.new(@opt.cmd,'Assemble SiSU source',"[#{@opt.f_pth[:lng_is]}] #{@opt.fno}").green_hi_blue
+        : ''
+      end
+      unless @opt.fns.empty?
+        directories
+        pod_source_build #this needs to be built in case of multi-lingual for all of them, before single pass tar
+      end
+    end
+    def directories
+      SiSU_Env::InfoEnv.new.sisupod_v3(@opt)
+    end
+    def select_skin(skin='')                                                   #skin loading logic here
+      load "#{SiSU_lib}/defaults.rb"
+      @skin={}
+      skin_path = [
+        "#{@env.path.pwd}/_sisu/skin",
+        "#{@env.path.home}/.sisu/skin",
+        '/etc/sisu/skin',
+        "#{@path_pod[:pod]}/external_document/skin" #CHECK
+      ]
+      sk_doc,sk_dir="#{Gt[:doc]}/#{skin}.rb","dir/skin_#{@env.stub_pwd}.rb"
+      skin_path.each do |v|                                                    #document skin priority 1
+        if FileTest.file?("#{v}/#{sk_doc}")
+          @skin={ name_path: "#{v}/#{sk_doc}", type: :doc }
+          break
+        end
+      end
+      unless @skin.length > 0
+        skin_path.each do |v|                                                  #directory skin priority 2
+          if FileTest.file?("#{v}/#{sk_dir}")
+            @skin={ name_path: "#{v}/#{sk_dir}", type: :dir }
+            break
+          end
+        end
+      end
+      @skin
+    end
+    def images_extract(f,images)                                                # consider using param info
+      rgx_image=/(?:^|[^_\\])\{(?:\s*|\~\^\s+)(\S+?\.(?:png|jpg|gif)\b)/m
+      if f !~/^%+\s/ \
+      and f =~rgx_image
+        images << f.scan(rgx_image).uniq
+      end
+      images.flatten
+    end
+    def pod_source_build
+      @pwd=Dir.pwd
+      @rgx_rb_image=/["']\S*?([a-zA-Z0-9_-]+?\.(?:png|jpg|gif))["']/
+      @rgx_image=/(?:^|[^_\\])\{\s*(\S+?\.(?:png|jpg|gif))/
+      @rgx_skin=/^\s+:skin:\s+(\S+)/
+      @rgx_doc_import=/^<<\s*(\S+?\.ss[ti])/
+      file_array=IO.readlines(@opt.fno,'')
+      skin,images,doc_import=[],[],[]
+      doc_import_dir=@opt.sub_location
+      file_array.each do |f|                                                   #% work area
+        if f !~/^%+\s/
+          skin << f.scan(@rgx_skin).uniq.flatten if f =~@rgx_skin
+          f=f.gsub(/<:=(\S+?)>/,'{ c_\1.png 14x14 }image')                                                           # embedded symbol (image)
+          if f !~/^%+\s/ \
+          and f =~@rgx_image
+            images=images_extract(f,images)
+          end
+          if @opt.fno =~/\.ssm$/
+            doc_import << f.scan(@rgx_doc_import) if f =~@rgx_doc_import
+          end
+        end
+      end
+      if doc_import.length > 0
+        doc_import=doc_import.uniq.flatten
+        doc_import.each do |fn|
+          file_array=IO.readlines(fn,'')
+          file_array.each do |f|                                                   #% work area
+            if f !~/^%+\s/ \
+            and f =~@rgx_image
+              images=images_extract(f,images)
+            end
+          end
+        end
+      end
+      docskin=nil
+      if skin \
+      and skin.length > 0
+        docskin=skin.pop.flatten.join
+        skin_source=select_skin(docskin)
+      else
+        skin_source=select_skin
+      end
+      docskin_place="#{@path_pod[:skin]}/#{skin_source[:type].to_s}"
+      FileUtils::mkdir_p(docskin_place)
+      if skin_source[:type] == :dir
+        docskin_with_path="#{docskin_place}/skin_#{@env.stub_pwd}.rb"
+        docskin=[docskin_with_path.gsub(/.+?\/(skin_\S+?)\.rb/,'\1')]
+        docskin='skin_sisupod'
+      end
+      if skin_source \
+      and skin_source[:name_path]
+        unless skin_source[:name_path].nil? \
+        or skin_source[:name_path].empty?
+          if FileTest.file?(skin_source[:name_path])
+            FileUtils::cp(skin_source[:name_path],"#{docskin_place}/#{docskin}.rb")
+            skinfile_array=IO.readlines(skin_source[:name_path],'')
+            para_images=[]
+            skinfile_array.each do |f|                                           #% work area
+              unless f =~/^%+ / #hmmm
+                images << f.scan(@rgx_rb_image).uniq if f =~@rgx_rb_image
+                #does not really discriminate, may duplicate images in sisu file, and may take images from default image pool
+              end
+            end
+          else STDERR.puts %{\t*WARN* did not find - "#{skin_source[:name_path]}" [#{__FILE__}:#{__LINE__}]}
+          end
+        end
+      end
+      #1. mapping in doc dir?
+      #2. need images used by skin, scan skin??
+      if images \
+      and images.length > 1
+        images=images.flatten.uniq
+        images.delete_if {|x| x =~/https?:\/\// }
+        #images=images.sort
+        FileUtils::mkdir_p(@path_pod[:image])
+        #unattractive hard coding ... !
+        image_path='_sisu/image'
+        images_pwd="#{@env.path.pwd}/#{image_path}"
+        ##sequence copies base images, defaults used in all html outputs
+          #image_source_base='/usr/share/sisu/image'
+          #dir_pwd=Dir.pwd
+          #Dir.chdir(image_source_base)
+          #base_images=Dir.glob('*')
+          #base_images.each do |i|
+          #  FileUtils::cp_r(i,"#{images_path_pod}/#{i}")
+          #end
+          #Dir.chdir(dir_pwd)
+        if FileTest.directory?(images_pwd)
+          images=images.uniq
+          images.each do |i|
+            if FileTest.file?("#{images_pwd}/#{i}")
+              FileUtils::cp("#{images_pwd}/#{i}","#{@path_pod[:image]}/#{i}") if FileTest.file?("#{images_pwd}/#{i}")
+            else STDERR.puts %{\t*WARN* did not find image - "#{images_pwd}/#{i}" [#{__FILE__}:#{__LINE__}]}
+            end
+          end
+        else STDERR.puts %{\t*WARN* did not find - #{images_pwd} #{@path_pod[:image]} [#{__FILE__}:#{__LINE__}]}
+        end
+      end
+      if doc_import.length > 0 \
+      and @opt.fno =~/\.ssm$/
+        doc_import.each do |f|
+          if FileTest.file?("#{@env.path.pwd}#{doc_import_dir}/#{f}")
+            FileUtils::cp("#{@env.path.pwd}#{doc_import_dir}/#{f}","#{@path_pod[:doc]}/#{f}")
+          else STDERR.puts %{\t*WARN* did not find image - "#{@env.path.pwd}#{doc_import_dir}/#{f}" [#{__FILE__}:#{__LINE__}]}
+          end
+        end
+      end
+      x=@env.document_language_versions_found                                  #check multiple document language versions (param not used)
+      if x[:f] \
+      and x[:f].length > 0                                                     #store multiple document language versions, sisupod
+        x[:f].each do |f|
+          FileUtils::mkdir_p(@path_pod[:doc]) unless FileTest.directory?(@path_pod[:doc])
+          if f[:f] =~/\~(\S{2,3})\.ss[tm]$/
+            lng_f=$1
+            if @opt.lng == lng_f
+              if @opt.fno =~/\.ssm$/
+                if FileTest.file?("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}")
+                  FileUtils::cp("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}",
+                    "#{@path_pod[:doc]}/#{f[:n]}")
+                else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+                end
+              else
+                if FileTest.file?("#{@env.path.pwd}/#{f[:f]}")
+                  cpy= :no
+                  cpy=if f[:f] =~ /^#{@opt.f_pth[:lng_is]}\// \
+                  or f[:f] =~ /~#{@opt.f_pth[:lng_is]}\.sst/
+                    p "#{@env.path.pwd}/#{f[:f]} --> #{@path_pod[:doc]}/#{f[:n]}"
+                    :yes
+                  elsif f[:f] !~ /^(?:#{Px[:lng_lst_rgx]})\/|~(?:#{Px[:lng_lst_rgx]})\.sst/ \
+                  and @opt.f_pth[:lng_is] == 'en'
+                    p "#{@env.path.pwd}/#{f[:f]} --> #{@path_pod[:doc]}/#{f[:n]}"
+                    :yes
+                  else :no
+                  end
+                  if cpy == :yes
+                    FileUtils::cp("#{@env.path.pwd}/#{f[:f]}",
+                      "#{@path_pod[:doc]}/#{f[:n]}")
+                  end
+                else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+                end
+              end
+            end
+          else
+            if @opt.fno =~/\.ssm$/
+              if FileTest.file?("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}")
+                FileUtils::cp_r("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}",
+                  "#{@path_pod[:doc]}/#{f[:n]}")
+              else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+              end
+            else
+              if FileTest.file?("#{@env.path.pwd}/#{f[:f]}")
+                cpy= :no
+                cpy=if f[:f] =~ /^#{@opt.f_pth[:lng_is]}\// \
+                or f[:f] =~ /~#{@opt.f_pth[:lng_is]}\.sst/
+                  p "#{@env.path.pwd}/#{f[:f]} --> #{@path_pod[:doc]}/#{f[:n]}"
+                  :yes
+                elsif f[:f] !~ /^(?:#{Px[:lng_lst_rgx]})\/|~(?:#{Px[:lng_lst_rgx]})\.sst/ \
+                and @opt.f_pth[:lng_is] == 'en'
+                  p "#{@env.path.pwd}/#{f[:f]} --> #{@path_pod[:doc]}/#{f[:n]}"
+                  :yes
+                else :no
+                end
+                if cpy == :yes
+                  FileUtils::cp("#{@env.path.pwd}/#{f[:f]}",
+                    "#{@path_pod[:doc]}/#{f[:n]}")
+                end
+              else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+              end
+            end
+          end
+        end
+      end #NB not all possibilies met, revisit, also in case of composite file may wish to add README
+    end
+  end
+end
+__END__
+question?:                   should you permit the packing of multiple documents in single .xz ?
+
+  open @opt.fns, parse file
+    extract from file content:
+      images and copy each image from whatever image source to _sisu/sisupod/sisu/_sisu/image
+      skin and copy active skin from whatever source to _sisu/sisupod/sisu/_sisu/skin/doc
+      extract from skin images required by skin
+
+   remove previously existing contents of _/sisu/sisupod &
+   make directory structure:
+
+v3 -->
+   _sisu
+     sisupod
+       doc
+         manifest.txt
+         en/content.sst                [file content]
+         fr/content.sst
+         _sisu
+           conf
+             skin/
+               doc                     [relevant skin if any other than default]
+           image (ln -s ../../image)
+           audio (ln -s ../../audio)
+           video (ln -s ../../video)
+       image                           [all images for specific document gathered here]
+       audio
+       video
+
+v2 -->
+   _sisu
+     sisupod
+       content.sst                     [file content]
+       filename.sst                    [link to content.sst]
+       _sisu/
+         skin/
+           doc                         [relevant skin if any other than default]
+         image/                        [all images for specific document gathered here]
+
+sisu
+  _sisu
+    sisurc.yml
+    skin/
+      dir/
+      doc/
+      misc/
+      site/
+      yaml/
+    convert/
+    standard_terms/
+    image
+    processing
+      dal/
+      tex/
+      texinfo/
+      tune/
+    sisupod
+
+special case
+
+composite file (master), e.g.
+SiSU.ssm
diff --git a/lib/sisu/v3/sisupod_make.rb b/lib/sisu/v3/sisupod_make.rb
index 984d807d..7b7957ab 100644
--- a/lib/sisu/v3/sisupod_make.rb
+++ b/lib/sisu/v3/sisupod_make.rb
@@ -56,285 +56,42 @@
 
 =end
 module SiSU_Doc
-  include SiSU_Env
-  class Source
-    require_relative 'sysenv'                           # sysenv.rb
+  require_relative 'shared_sisupod_source'              # shared_sisupod_source.rb
+    include SiSU_Source
+  require_relative 'sysenv'                             # sysenv.rb
+    include SiSU_Env
+  class Source < SiSU_Source::SiSUpodSource
     require_relative 'response'                         # response.rb
-    require_relative 'particulars'                      # particulars.rb
-    def initialize(opt)
-      @opt=opt
-      m=/.+\/(?:src\/)?(\S+)/im
-      @date=SiSU_Env::InfoDate.new.dt
-      @env=SiSU_Env::InfoEnv.new(@opt.fns)
-      @ver=SiSU_Env::InfoVersion.instance.get_version
-      @ans=SiSU_Response::Response.new
-      pod_path="#{@env.processing_path.processing_sisupod(@opt)}"
-      @v=(@opt.cmd =~/[VM]/) ? 'v' : ''
-      @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt)
-      @file=@particulars.file
-      @local_path="#{@file.output_path.sisupod.dir}"
+    def initialize(opt,build=nil,place=nil)
+      super(opt,build,place)
       @zipfile=@opt.fno.gsub(/(?:\~\S{2,3})?(\.ss[tm])$/,'\1')
-      FileUtils::mkdir_p(pod_path) unless FileTest.directory?(pod_path)
-      FileUtils::rm_rf("#{@env.processing_path.processing_sisupod(@opt)}/*") if FileTest.directory?("#{@env.processing_path.processing_sisupod(@opt)}")
-    end
-    def read
-      unless @opt.cmd =~/q/
-        @opt.cmd=~/[MVv]/ \
-        ? SiSU_Screen::Ansi.new(@opt.cmd,'Share SiSU Document (txz)',"[#{@opt.f_pth[:lng_is]}] #{@opt.fno}").green_hi_blue
-        : SiSU_Screen::Ansi.new(@opt.cmd,'Share SiSU Document (txz)',"[#{@opt.f_pth[:lng_is]}] #{@opt.fno}").green_title_hi
-      end
-      unless @opt.fns.empty?
-        if @opt.cmd=~/[MVv]/
-          SiSU_Screen::Ansi.new(@opt.cmd,'Make sisu document (txz) and place in output directory',"#{@opt.fns} -> file://#{@file.output_path.sisupod.dir}/#{@zipfile}.txz").warn if @opt.cmd =~/[MVv]/
-        end
-        directories
-        sisupod_build
-        #sisupod_tar_xz
-      else
-        if @opt.cmd =~/[MVv]/
-          SiSU_Screen::Ansi.new(@opt.cmd,'Make (zip (txz)) of sisu work directory',"#{@env.stub_pwd}\_#{@date}.txz").warn
-          SiSU_Screen::Ansi.new(@opt.cmd,'').blue_tab
-        end
-        ans=@ans.response?('make sisupod of entire directory?')
-        if ans; sisupod_zip_directory
-        end
-      end
-    end
-    def sisupod_zip_directory
-      sisupod_directory="sisupod-#{@env.stub_pwd}-#{@date}.ssp"
-      unless File.symlink?('sisupod'); File.symlink(Dir.pwd,'sisupod')
-      end
-      re_base_dir='^sisupod/([^.][^/]*\.(ssm|ssi|sst)$|_sisu/)'
-      re_files='/[a-zA-Z0-9.~_-]+\.(ssm|ssi|sst|rb|css|png|jpg|gif|yaml)$'
-      re_ignore='/[.~_-][^/]+$'
-      if File.symlink?('sisupod')
-        info="SiSU sisupod #{@ver[:version]} directory contents #{sisupod_directory}"
-        system(%{
-          echo "#{info}"
-          echo "#{info}" > sisu_zip.txt
-          zip -qz #{sisupod_directory} sisu_zip.txt < sisu_zip.txt
-          for I in `find -H sisupod -print | \
-            egrep "#{re_base_dir}" | \
-            egrep "#{re_files}" | \
-            egrep -v "#{re_ignore}" `
-          do zip #{sisupod_directory} $I
-          done
-        })
-      else puts "the required systemlink 'sisupod' could not be created on the current directory: remove the file or directory named 'sisupod' within #{Dir.pwd}"
-      end
-      if @opt.cmd =~/[MVv]/
-        SiSU_Screen::Ansi.new(@opt.cmd,'Share SiSU Document (tar xz)',@opt.fns).green_hi_blue
-        SiSU_Screen::Ansi.new(@opt.cmd,'Zipped directory (tgz)',sisupod_directory).warn
-        SiSU_Screen::Ansi.new('',sisupod_directory).blue_tab
-      end
-    end
-    def directories
-      SiSU_Env::InfoEnv.new.sisupod_v3(@opt)
-    end
-    def select_skin(skin='')                                                   #skin loading logic here
-      load "#{SiSU_lib}/defaults.rb"
-      @skin={}
-      skin_path = [
-        "#{@env.path.pwd}/_sisu/skin",
-        "#{@env.path.home}/.sisu/skin",
-        '/etc/sisu/skin',
-        "#{@env.processing_path.processing_sisupod(@opt)}/external_document/skin"
-      ]
-      sk_doc,sk_dir="doc/#{skin}.rb","dir/skin_#{@env.stub_pwd}.rb"
-      skin_path.each do |v|                                                    #document skin priority 1
-        if FileTest.file?("#{v}/#{sk_doc}")
-          @skin={ name_path: "#{v}/#{sk_doc}", type: :doc }
-          break
-        end
-      end
-      unless @skin.length > 0
-        skin_path.each do |v|                                                  #directory skin priority 2
-          if FileTest.file?("#{v}/#{sk_dir}")
-            @skin={ name_path: "#{v}/#{sk_dir}", type: :dir }
-            break
-          end
-        end
-      end
-      @skin
-    end
-    def images_extract(f,images)                                                # consider using param info
-      rgx_image=/(?:^|[^_\\])\{(?:\s*|\~\^\s+)(\S+?\.(?:png|jpg|gif)\b)/m
-      if f !~/^%+\s/ \
-      and f =~rgx_image
-        images << f.scan(rgx_image).uniq
-      end
-      images.flatten
-    end
-    def sisupod_build                                                          #see also sisupod in sysenv
-      @pwd=Dir.pwd
-      @rgx_rb_image=/["']\S*?([a-zA-Z0-9_-]+?\.(?:png|jpg|gif))["']/
-      @rgx_image=/(?:^|[^_\\])\{\s*(\S+?\.(?:png|jpg|gif))/
-      @rgx_skin=/^\s+:skin:\s+(\S+)/
-      @rgx_doc_import=/^<<\s*(\S+?\.ss[ti])/
-      file_array=IO.readlines(@opt.fno,'')
-      skin,images,doc_import=[],[],[]
-      doc_import_dir=@opt.sub_location
-      file_array.each do |f|                                                   #% work area
-        if f !~/^%+\s/
-          skin << f.scan(@rgx_skin).uniq.flatten if f =~@rgx_skin
-          f=f.gsub(/<:=(\S+?)>/,'{ c_\1.png 14x14 }image')                                                           # embedded symbol (image)
-          if f !~/^%+\s/ \
-          and f =~@rgx_image
-            images=images_extract(f,images)
-          end
-          if @opt.fno =~/\.ssm$/
-            doc_import << f.scan(@rgx_doc_import) if f =~@rgx_doc_import
-          end
-        end
-      end
-      if doc_import.length > 0
-        doc_import=doc_import.uniq.flatten
-        doc_import.each do |fn|
-          file_array=IO.readlines(fn,'')
-          file_array.each do |f|                                                   #% work area
-            if f !~/^%+\s/ \
-            and f =~@rgx_image
-              images=images_extract(f,images)
-            end
-          end
-        end
-      end
-      docskin=nil
-      if skin \
-      and skin.length > 0
-        docskin=skin.pop.flatten.join
-        skin_source=select_skin(docskin)
-      else
-        skin_source=select_skin
-      end
-      docskin_place="#{@env.processing_path.processing_sisupod(@opt)}/doc/_sisu/skin/#{skin_source[:type].to_s}"
-      FileUtils::mkdir_p(docskin_place)
-      if skin_source[:type] == :dir
-        docskin_with_path="#{docskin_place}/skin_#{@env.stub_pwd}.rb"
-        docskin=[docskin_with_path.gsub(/.+?\/(skin_\S+?)\.rb/,'\1')]
-        docskin='skin_sisupod'
-      end
-      if skin_source \
-      and skin_source[:name_path]
-        unless skin_source[:name_path].nil? \
-        or skin_source[:name_path].empty?
-          if FileTest.file?(skin_source[:name_path])
-            FileUtils::cp(skin_source[:name_path],"#{docskin_place}/#{docskin}.rb")
-            skinfile_array=IO.readlines(skin_source[:name_path],'')
-            para_images=[]
-            skinfile_array.each do |f|                                           #% work area
-              unless f =~/^%+ / #hmmm
-                images << f.scan(@rgx_rb_image).uniq if f =~@rgx_rb_image
-                #does not really discriminate, may duplicate images in sisu file, and may take images from default image pool
-              end
-            end
-          else STDERR.puts %{\t*WARN* did not find - "#{skin_source[:name_path]}" [#{__FILE__}:#{__LINE__}]}
-          end
-        end
-      end
-      #1. mapping in doc dir?
-      #2. need images used by skin, scan skin??
-      if images \
-      and images.length > 1
-        images=images.flatten.uniq
-        images.delete_if {|x| x =~/https?:\/\// }
-        #images=images.sort
-        path_pod="#{@env.processing_path.processing_sisupod(@opt)}"
-        path_pod_conf="#{@env.processing_path.processing_sisupod(@opt)}/_sisu"
-        images_path_pod="#{path_pod}/image"
-        FileUtils::mkdir_p(images_path_pod)
-        #unattractive hard coding ... !
-        image_path='_sisu/image'
-        images_pwd="#{@env.path.pwd}/#{image_path}"
-        ##sequence copies base images, defaults used in all html outputs
-          #image_source_base='/usr/share/sisu/image'
-          #dir_pwd=Dir.pwd
-          #Dir.chdir(image_source_base)
-          #base_images=Dir.glob('*')
-          #base_images.each do |i|
-          #  FileUtils::cp_r(i,"#{images_path_pod}/#{i}")
-          #end
-          #Dir.chdir(dir_pwd)
-        if FileTest.directory?(images_pwd)
-          images=images.uniq
-          images.each do |i|
-            if FileTest.file?("#{images_pwd}/#{i}")
-              FileUtils::cp("#{images_pwd}/#{i}","#{images_path_pod}/#{i}") if FileTest.file?("#{images_pwd}/#{i}")
-            else STDERR.puts %{\t*WARN* did not find image - "#{images_pwd}/#{i}" [#{__FILE__}:#{__LINE__}]}
-            end
-          end
-        else STDERR.puts %{\t*WARN* did not find - #{images_pwd} #{images_path_pod} [#{__FILE__}:#{__LINE__}]}
-        end
-      end
-      if doc_import.length > 0 \
-      and @opt.fno =~/\.ssm$/
-        doc_import.each do |f|
-          if FileTest.file?("#{@env.path.pwd}#{doc_import_dir}/#{f}")
-            FileUtils::cp("#{@env.path.pwd}#{doc_import_dir}/#{f}","#{@env.processing_path.processing_sisupod(@opt)}/doc/#{@opt.lng}/#{f}")
-          else STDERR.puts %{\t*WARN* did not find image - "#{@env.path.pwd}#{doc_import_dir}/#{f}" [#{__FILE__}:#{__LINE__}]}
-          end
-        end
+      @ans=SiSU_Response::Response.new
+      if @opt.cmd=~/[MVv]/
+        SiSU_Screen::Ansi.new(@opt.cmd,'Assemble source for sisu document',"#{@opt.fns} -> file://#{@file.output_path.sisupod.dir}/#{@zipfile}.txz").warn
       end
-      x=@env.document_language_versions_found                                  #check multiple document language versions (param not used)
-      if x[:f] \
-      and x[:f].length > 0                                                     #store multiple document language versions, sisupod
-        x[:f].each do |f|
-          pth="#{@env.processing_path.processing_sisupod(@opt)}/doc/#{@opt.lng}"
-          FileUtils::mkdir_p(pth) unless FileTest.directory?(pth)
-          if f[:f] =~/\~(\S{2,3})\.ss[tm]$/
-            lng_f=$1
-            if @opt.lng == lng_f
-              if @opt.fno =~/\.ssm$/
-                if FileTest.file?("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}")
-                  FileUtils::cp("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}",
-                    "#{@env.processing_path.processing_sisupod(@opt)}/doc/#{@opt.lng}/#{f[:n]}")
-                else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
-                end
-              else
-                if FileTest.file?("#{@env.path.pwd}/#{f[:f]}")
-                  FileUtils::cp("#{@env.path.pwd}/#{f[:f]}",
-                    "#{@env.processing_path.processing_sisupod(@opt)}/doc/#{@opt.lng}/#{f[:n]}")
-                else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
-                end
-              end
-            end
-          else
-            if @opt.fno =~/\.ssm$/
-              if FileTest.file?("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}")
-                FileUtils::cp_r("#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}",
-                  "#{@env.processing_path.processing_sisupod(@opt)}/doc/#{@opt.lng}/#{f[:n]}")
-              else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}#{doc_import_dir}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
-              end
-            else
-              if FileTest.file?("#{@env.path.pwd}/#{f[:f]}")
-                FileUtils::cp("#{@env.path.pwd}/#{f[:f]}",
-                  "#{@env.processing_path.processing_sisupod(@opt)}/doc/#{@opt.lng}/#{f[:n]}")
-              else STDERR.puts %{\t*WARN* did not find - "#{@env.path.pwd}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
-              end
-            end
-          end
-        end
-      end #NB not all possibilies met, revisit, also in case of composite file may wish to add README
     end
     def sisupod_tar_xz
-      FileUtils::mkdir_p(@file.output_path.sisupod.dir) unless FileTest.directory?(@file.output_path.sisupod.dir)
-      tree=(@opt.cmd =~/[vVM]/ \
-      && SiSU_Env::SystemCall.new.program_found?('tree')) \
-      ? 'tree sisupod'
-      : ''
-      if FileTest.directory?(@env.processing_path.processing_sisupod(@opt))
-        Dir.chdir("#{@env.processing_path.root_dir}/#{@env.processing_path.user}/pods/#{@opt.fns}")
-        system(%{
-          #{tree}
-          tar -cJf #{@zipfile}.txz sisupod
-          #echo "#{@file.place_file.sisupod.dir}"
-        })
-        FileUtils::mv("#{@zipfile}.txz",@file.place_file.sisupod.dir)
-        FileUtils::rm_r(Dir.glob("sisupod/*"))
-        Dir.chdir(@env.path.pwd)
-        SiSU_Screen::Ansi.new('',"#{@opt.fns}.txz").blue_tab if @opt.cmd=~/[MVv]/
-      else
-        SiSU_Screen::Ansi.new('',"#{@opt.fns}.txz not built").blue_tab if @opt.cmd=~/[MVv]/
+      begin
+        FileUtils::mkdir_p(@file.output_path.sisupod.dir) unless FileTest.directory?(@file.output_path.sisupod.dir)
+        tree=(@opt.cmd =~/[vVM]/ \
+        && SiSU_Env::SystemCall.new.program_found?('tree')) \
+        ? 'tree sisupod'
+        : ''
+        if FileTest.directory?(@path_pod[:fnb])
+          Dir.chdir(@path_pod[:fnb])
+          system(%{
+            #{tree}
+            tar -cJf #{@zipfile}.txz sisupod
+            #echo "#{@file.place_file.sisupod.dir}"
+          })
+          FileUtils::mv("#{@zipfile}.txz",@file.place_file.sisupod.dir)
+          Dir.chdir(@env.path.pwd)
+          SiSU_Screen::Ansi.new('',"#{@opt.fns}.txz").blue_tab if @opt.cmd=~/[MVv]/
+        else
+          SiSU_Screen::Ansi.new('',"#{@opt.fns}.txz not built").blue_tab if @opt.cmd=~/[MVv]/
+        end
+      rescue
+      ensure
       end
     end
   end
diff --git a/lib/sisu/v3/sysenv.rb b/lib/sisu/v3/sysenv.rb
index 5e9533a2..1527e634 100644
--- a/lib/sisu/v3/sysenv.rb
+++ b/lib/sisu/v3/sysenv.rb
@@ -858,7 +858,7 @@ module SiSU_Env
       @language=(l.nil? || l.empty?) \
       ? SiSU_Env::InfoEnv.new.language_default_set
       : l
-      @r=%{(?:#{Px[:lng_lst].join('|')})}
+      @r=%{(?:#{Px[:lng_lst_rgx]})}
       @lang_info=SiSU_i18n::Languages.new
     end
     def lang_lst                              # from i18n
@@ -1010,7 +1010,7 @@ module SiSU_Env
       @stub_md=      @stub_pwd + '/sisu_site_metadata'
       pt=Pathname.new(Dir.pwd)
       stub=if output_dir_structure.by_language_code?
-        r=Px[:lng_lst].join('|')
+        r=Px[:lng_lst_rgx]
         stub=if Dir.pwd =~/.+?\/([^\/]+)(?:\/(#{r})$)/
           lng=pt.split[-1].to_s
           lng_part='/' + lng
@@ -1114,7 +1114,7 @@ module SiSU_Env
       #    image/                          [all images for specific document gathered here]
       #    audio/
       #    video/
-      spp="#{processing_path.processing}/sisupod"
+      spp="#{processing_path.processing}/#{Gt[:sisupod]}"
       sppc="#{spp}/doc/_sisu"
       lng_dirs=[]
       if FileTest.directory?(spp) \
@@ -1157,17 +1157,17 @@ module SiSU_Env
       #      skin/
       #        doc                  [relevant skin if any other than default]
       #      image                  [all images for specific document gathered here]
-      sisupod_processing_path="#{processing_path.processing}/sisupod"
+      sisupod_processing_path="#{processing_path.processing}/#{Gt[:sisupod]}"
       if FileTest.directory?(sisupod_processing_path) \
       or FileTest.file?(sisupod_processing_path)
         FileUtils::rm_rf(sisupod_processing_path)
       end
       paths=[]
       paths=[
-        "#{processing_path.processing}/sisupod/_sisu/skin/doc",
-        "#{processing_path.processing}/sisupod/_sisu/skin/dir",
-        "#{processing_path.processing}/sisupod/_sisu/skin/site",
-        "#{processing_path.processing}/sisupod/_sisu/image"
+        "#{processing_path.processing}/#{Gt[:sisupod]}/_sisu/skin/doc",
+        "#{processing_path.processing}/#{Gt[:sisupod]}/_sisu/skin/dir",
+        "#{processing_path.processing}/#{Gt[:sisupod]}/_sisu/skin/site",
+        "#{processing_path.processing}/#{Gt[:sisupod]}/_sisu/image"
       ]
       paths.each {|x| FileUtils::mkdir_p(x) unless FileTest.directory?(x) }
     end
@@ -1882,11 +1882,11 @@ WOK
         "#{path.webserv}/#{images}"
       end
       def output                                                               #web/webserv output directory... subdirectory into which further subdirectories are made based on file names
-        r=Px[:lng_lst].join('|')
+        r=Px[:lng_lst_rgx]
         u=/.+?\/([^\/]+)(?:\/(?:#{r})$|$)/
         base_stub=@sys.pwd.gsub(u,'\1')
-        if Dir.pwd =~/\/sisupod\/[^\/]+\/sisupod\/doc/
-          "#{path.webserv}/doc"
+        if Dir.pwd =~/\/#{Gt[:sisupod]}\/[^\/]+\/#{Gt[:pod]}\/#{Gt[:doc]}/
+          "#{path.webserv}/#{Gt[:doc]}"
         else
           "#{path.webserv}/#{base_stub}"
         end
@@ -2011,27 +2011,40 @@ WOK
         : ("#{root_dir}/#{stub_pwd}") # see defaults[:processing_path]
       end
       def processing_sisupod(opt=nil)                                                   #processing directory, used/needed for sisu work files, has sub-directories (dal,tex etc)
-        unless FileTest.directory?(root_dir)
-          FileUtils::mkdir_p(root_dir)
-          File.chmod(0777,root_dir)
-        end
-        if usr_dir?
+        @opt=opt
+        def paths
           processing_path_usr="#{root_dir}/#{user}"
-          FileUtils::mkdir_p(processing_path_usr) unless FileTest.directory?(processing_path_usr)
-          File.chmod(0700,processing_path_usr)
-        end
-        sisupod_processing_path=processing_path_usr + '/pods/' + opt.fno + '/sisupod'
-        FileUtils::mkdir_p(sisupod_processing_path) unless FileTest.directory?(sisupod_processing_path)
-        sisupod_processing_path_lng=if defined? opt.lng
-          sisupod_processing_path + '/doc/' + opt.lng
-        else
-          sisupod_processing_path + '/doc'
-        end
-        unless FileTest.directory?(sisupod_processing_path_lng)
-          FileUtils::mkdir_p(sisupod_processing_path_lng)
-          File.chmod(0700,sisupod_processing_path_lng)
+          processing_path_fnb=processing_path_usr + '/' + Gt[:pods] + '/' + @opt.fng
+          processing_path_sisupod=processing_path_fnb + '/' + Gt[:sisupod]
+          { fnb: processing_path_fnb, sisupod: processing_path_sisupod }
+        end
+        def make
+          unless FileTest.directory?(root_dir)
+            FileUtils::mkdir_p(root_dir)
+            File.chmod(0777,root_dir)
+          end
+          if usr_dir?
+            processing_path_usr="#{root_dir}/#{user}"
+            FileUtils::mkdir_p(processing_path_usr) unless FileTest.directory?(processing_path_usr)
+            File.chmod(0700,processing_path_usr)
+          end
+          fn_base_bundle=paths[:fnb]
+          sisupod_processing_path=paths[:sisupod]
+          FileUtils::mkdir_p(sisupod_processing_path) unless FileTest.directory?(sisupod_processing_path)
+          sisupod_processing_path_lng=if defined? @opt.lng
+            sisupod_processing_path + '/' + Gt[:doc] + '/' + @opt.lng
+          else
+            sisupod_processing_path + '/' + Gt[:doc]
+          end
+#p sisup  od_processing_path_lng
+          unless FileTest.directory?(sisupod_processing_path_lng)
+            #puts "a processing directory (#{sisupod_processing_path_lng}) is being created for use by sisu"
+            FileUtils::mkdir_p(sisupod_processing_path_lng)
+            File.chmod(0700,sisupod_processing_path_lng)
+          end
+          sisupod_processing_path
         end
-        sisupod_processing_path
+        self
       end
       def processing                                                             #processing directory, used/needed for sisu work files, has sub-directories (dal,tex etc)
         unless FileTest.directory?(root_dir)
@@ -2087,8 +2100,8 @@ WOK
         and not @rc['git']['dir'].nil? \
         and not @rc['git']['dir'].empty?
           x=(@rc['git']['dir'] =~/^(?:~|home)$/) \
-          ? home + '/' + 'sisu:'
-          : @rc['git']['dir'] + '/' + 'sisu:'
+          ? home + '/' + Gt[:git]
+          : @rc['git']['dir'] + '/' + Gt[:git]
         else defaults[:processing_git]
         end
         unless FileTest.directory?(pth)
@@ -2672,7 +2685,7 @@ WOK
     end
     def sisupod_gen_v3(fns_pod)
       pwd=Dir.pwd
-      sisupod_processing_path="#{processing_path.processing}/sisupod"
+      sisupod_processing_path="#{processing_path.processing}/#{Gt[:sisupod]}"
       if FileTest.directory?(sisupod_processing_path) \
       or FileTest.file?(sisupod_processing_path)
         FileUtils::rm_rf(sisupod_processing_path)
@@ -2688,7 +2701,7 @@ WOK
       if f_pod \
       && FileTest.file?(f_pod)
         tree=(SiSU_Env::SystemCall.new.program_found?('tree')) \
-        ? "tree #{processing_path.processing}/sisupod"
+        ? "tree #{processing_path.processing}/#{Gt[:sisupod]}"
         : ''
         if FileTest.directory?(processing_path.processing)
           Dir.chdir(processing_path.processing)
@@ -2703,7 +2716,7 @@ WOK
     end
     def sisupod_gen_v2(fns_pod)
       pwd=Dir.pwd
-      sisupod_processing_path="#{processing_path.processing}/sisupod"
+      sisupod_processing_path="#{processing_path.processing}/#{Gt[:sisupod]}"
       if FileTest.directory?(sisupod_processing_path) \
       or FileTest.file?(sisupod_processing_path)
         FileUtils::rm_rf(sisupod_processing_path)
@@ -3822,7 +3835,7 @@ WOK
       @pwd=Dir.pwd
       @env=SiSU_Env::InfoEnv.new
       pt=Pathname.new(@pwd)
-      r=Px[:lng_lst].join('|')
+      r=Px[:lng_lst_rgx]
       u=/.+?\/([^\/]+)(?:\/(?:#{r})$|$)/
       @pwd_stub=pt.realpath.to_s[u,1]
       @rc=@@rc ||=GetInit.instance.sisu_yaml.rc
@@ -4659,7 +4672,7 @@ WOK
         end
       end
       def src
-        @md.fns
+        @md.fno
       end
       def po #check
         (@fno.empty?) \
@@ -4710,10 +4723,8 @@ WOK
             "#{@md.opt.opt_act[:redirect][:inst]}/#{@md.fnb}"
           elsif output_dir_structure.dump?
             @md.opt.opt_act[:dump][:inst]
-          elsif output_dir_structure.by_language_code?
-            "#{output_path.base.dir}/#{@ft}/#{@md.opt.lng}"
           else
-            "#{output_path.base.dir}/#{@ft}"
+            "#{output_path.base.dir}/#{@ft}/#{@md.opt.fng}/#{Gt[:sisupod]}/#{Gt[:doc]}/#{@md.opt.lng}"
           end
         end
         def ab_pod
@@ -4745,11 +4756,7 @@ WOK
           end
         end
         def ab_src
-          if output_dir_structure.by_language_code?
-            "#{output_path.base.url}/#{@ft}/#{@md.opt.lng}"
-          else
-            "#{output_path.base.url}/#{@ft}"
-          end
+          "#{output_path.base.url}/#{@ft}/#{@md.opt.fng}/#{Gt[:sisupod]}/#{Gt[:doc]}/#{@md.opt.lng}"
         end
         def ab_pod
           "#{output_path.base.url}/#{@ft}"
@@ -4783,11 +4790,7 @@ WOK
           end
         end
         def ab_pod
-          if output_dir_structure.by_language_code?
-            "#{@ft}"
-          else
-            "#{@ft}"
-          end
+          "#{@ft}"
         end
         self
       end
@@ -4811,12 +4814,13 @@ WOK
           end
         end
         def ab_src
+          locate="#{@ft}/#{@md.opt.fng}/#{Gt[:sisupod]}/#{Gt[:doc]}/#{@md.opt.lng}"
           if output_dir_structure.dump_or_redirect?
             '.'
           elsif output_dir_structure.by_language_code?
-            "#{@ft}/#{@md.opt.lng}"
+            "../../#{locate}"
           else
-            "#{@ft}"
+            "../#{locate}"
           end
         end
         def ab_pod
@@ -4948,7 +4952,7 @@ WOK
       end
       def sisupod
         def ft
-          Gt[:src] + '/' + Gt[:pod]
+          Gt[:src]
         end
         def dir
           set_path(ft).dir.ab_pod
@@ -4969,7 +4973,7 @@ WOK
       end
       def po
         def dir
-          "#{output_path.base.dir}/po4a/#{@md.fnb}/po/#{@md.opt.lng}"
+          "#{output_path.base.dir}/#{Gt[:src]}/#{@md.opt.fng}/po4a/po/#{@md.opt.lng}"
         end
         def url
           "#{output_path.base.url}/po4a/#{@md.fnb}/po/#{@md.opt.lng}"
@@ -4978,7 +4982,7 @@ WOK
       end
       def pot
         def dir
-          "#{output_path.base.dir}/po4a/#{@md.fnb}/pot"
+         "#{output_path.base.dir}/#{Gt[:src]}/#{@md.opt.fng}/po4a/pot"
         end
         def url
           "#{output_path.base.url}/po4a/#{@md.fnb}/pot"
@@ -5649,7 +5653,7 @@ WOK
     def apply
       if @m.respond_to?(:make) \
       and @md.make.respond_to(:skin)
-        skin_path=unless @md.opt.f_pth[:pth] =~/\/\S+?\/sisupod\/\S+?\/sisupod\/doc/
+        skin_path=unless @md.opt.f_pth[:pth] =~/\/\S+?\/#{Gt[:sisupod]}\/\S+?\/#{Gt[:pod]}\/#{Gt[:doc]}/
           [
             "#{@env.path.pwd}/_sisu/skin",
             "#{@env.path.home}/.sisu/skin",
@@ -5657,7 +5661,7 @@ WOK
             "#{@env.processing_path.processing_sisupod(@md.opt)}/external_document/skin"
           ]
         else #sisupod
-          pt=/(\/\S+?\/sisupod\/\S+?\/sisupod\/doc)/.match(@md.opt.f_pth[:pth])[1]
+          pt=/(\/\S+?\/#{Gt[:sisupod]}\/\S+?\/#{Gt[:pod]}\/#{Gt[:doc]})/.match(@md.opt.f_pth[:pth])[1]
           [ "#{pt}/_sisu/skin" ]
         end
         sk_doc,sk_dir="doc/#{@md.make.skin}.rb","dir/skin_#{@env.stub_pwd}.rb"
diff --git a/lib/sisu/v3/urls.rb b/lib/sisu/v3/urls.rb
index 29c2f791..1dcf988f 100644
--- a/lib/sisu/v3/urls.rb
+++ b/lib/sisu/v3/urls.rb
@@ -90,10 +90,6 @@ module SiSU_Urls
       @fn=SiSU_Env::EnvCall.new(@opt.fns).lang(fn_set_lang[:c])
       @m_regular=/(.+?)\.(?:(?:-|ssm\.)?sst|ssm)$/
       @prog=@env.program
-      source=if @opt.fns =~/\.sst$/; @opt.fns
-      elsif @opt.fns =~/\.ssm\.sst/; "#{@fnb}.ssm.sst"
-      else 'not recognised file'
-      end
       @u ||= {
         'b --xhtml (XHTML)'=>@fn[:xhtml],
         'D[iu] --psql (DBI import/update postgresql)'=>'dbi psql',
@@ -111,7 +107,7 @@ module SiSU_Urls
         'p --pdf (PDF landscape)'=>@fn[:pdf_l],
         'p --pdf (PDF portrait)'=>@fn[:pdf_p],
         'E --profile (Ruby profiler)'=>'profile',
-        's --source (sisu markup)'=>source,
+        's --source (sisu markup)'=>@opt.fno,
         'S --sisupod (sisupod)'=>@fn[:sisupod],
         't --txt (Plain-text (endnotes))'=>@fn[:plain],
         'x --xml-sax (XML sax type)'=>@fn[:sax],
@@ -361,7 +357,7 @@ module SiSU_Urls
               end
               if x=~/--sisupod\b/ \
               and @opt.act[:sisupod][:set]==:on
-                (@opt.fns =~/\.ssm\.sst$/) \
+                (@opt.fno =~/\.ssm$/) \
                 ? y.gsub(/(?:\~\S{2,3})?(\.ssm.sst\.txz)$/,'.ssm.txz')
                 : y.gsub(/(?:\~\S{2,3})?(\.sst\.txz)$/,'\1')
                 show.source.pod(x,y)
-- 
cgit v1.2.3