d: po4a, initialize either directly with sst or passed through ao
authorRalph Amissah <ralph@amissah.com>
Fri, 16 Jan 2015 04:38:04 +0000 (23:38 -0500)
committerRalph Amissah <ralph@amissah.com>
Tue, 20 Jan 2015 04:46:16 +0000 (23:46 -0500)
* creates source language directory with source markup files
  (.sst .ssm .ssi) & the po4a.cfg configuration file, then runs
  po4a to place the markup source under po4a translation
  management
* --po4a-sst uses original sisu markup source as described above
* --po4a-ao passes sisu source markup through document abstraction
  before converting back to a sisu markup source markup equivalent
  of the original document, it does this in an attempt to get more
  uniform output, and put footnotes for example if any in a form
  that is easier to translate
  --po4a-ao -v --trans-en:fr,es en/live-manual.ssm
  --po4a-ao -v --trans-en:fr,es en/live-manual.ssm \
    es/live-manual.ssm
  in the latter example also runs sisu marked up "es" document
  through document abstraction and returns a sisu markup source
  version of the document, and against this gettext is (or can be
  run) to (attempt to) have the source and target languages
  together in the po/es file
* all quite rough, will need to be revisited,
* these for now replace the renamed --po4a-shelf (formerly --po4a)

14 files changed:
bin/sisu-misc-utils
lib/sisu/develop/hub.rb
lib/sisu/develop/hub_actions.rb
lib/sisu/develop/hub_options.rb
lib/sisu/develop/se_file_op.rb
lib/sisu/develop/se_programs.rb
lib/sisu/develop/shared_metadata.rb
lib/sisu/develop/src_po4a_share.rb [new file with mode: 0644]
lib/sisu/develop/src_po4a_sst_ao_sst.rb [new file with mode: 0644]
lib/sisu/develop/src_po4a_sst_ao_sst_set.rb [new file with mode: 0644]
lib/sisu/develop/src_po4a_sstm.rb [new file with mode: 0644]
lib/sisu/develop/src_shared.rb
lib/sisu/develop/src_sisupod_sstm.rb [moved from lib/sisu/develop/src_share.rb with 97% similarity]
lib/sisu/develop/urls.rb

index e5be5c093a8b15897a468135eaebaa0b98cc3f33..621d1442bf19dc0859377277e2f8293add6c6769 100644 (file)
@@ -130,9 +130,9 @@ module SiSUconf
   end
   class Configure < Thor
     $SiSU_Language_Codes=LanguageCodes.new
-    lib_filename='sisu_thor_lib'
-    #p "#{DetermineLibsPath.new.sisu_path_lib}/#{lib_filename}"
-    require "#{DetermineLibsPath.new.sisu_path_lib}/#{lib_filename}" # sisu_thor_lib.rb
+    paths= DetermineLibsPath.new
+    #p "#{paths.sisu_path_lib}/#{paths.processing.lib_filename}"
+    require "#{paths.sisu_path_lib}/#{paths.processing.lib_filename}" # sisu_thor_lib.rb
     @@source=@@targets=nil
     include SiSU_Po4a_Actions
     class_option :verbose, :type => :boolean
index df66892269de65f57e31f896436d308e4c522150..1b5ac580a1fc07b2f7de49d8e108b9533ac9a806 100644 (file)
@@ -133,6 +133,7 @@ module SiSU
       actions.outputs.each_file.xml?
       actions.outputs.each_file.pdf?
       actions.outputs.each_file.man_or_info?
+      actions.outputs.each_file.po4a_make?
       actions.outputs.each_file.sqlite_discrete?
       actions.outputs.each_file.manifest?
     end
@@ -181,6 +182,9 @@ module SiSU
       if defined? actions.outputs.loop_files.run_termsheet?
         actions.outputs.loop_files.run_termsheet?
       end
+      if defined? actions.outputs.loop_files.po4a_setup?
+        actions.outputs.loop_files.po4a_setup?
+      end
       if defined? actions.outputs.loop_files.sql?
         actions.outputs.loop_files.sql?
       end
index 44834cbae22470904290c3d99543115b52225e4e..7130615eef6b75289457f3a9bc780a6fc53605dd 100644 (file)
@@ -158,7 +158,7 @@ module SiSU_Hub_Actions
         def abstract_objects?
           if @opt.act[:ao][:set]==:on                    #% --ao --dal, -m
             if @opt.f_pths.length > 0
-              unless @opt.act[:po4a][:set]==:on          # --po4a, -P
+              unless @opt.act[:po4a_shelf][:set]==:on    # --po4a-shelf
                 if @opt.fno =~ /\.ssm$/
                   require_relative 'ao_composite'        # ao_composite.rb #pre-processing
                   SiSU_Assemble::Composite.new(@opt).read
@@ -548,15 +548,51 @@ module SiSU_Hub_Actions
             end
           end
         end
+        def po4a_make?
+          if @opt.act[:po4a_sst_ao_sst][:set]==:on               #% --po4a-ao
+            if @opt.f_pths.length > 0
+              require_relative 'src_po4a_sst_ao_sst'
+              SiSU_SStm_AO_SStm::Source.new(@opt).read_process_src_files # src_po4a_sst_ao_sst.rb
+            else
+              msg='sst request requires sisu markup files'
+              if (@opt.act[:verbose_plus][:set]==:on \
+              || @opt.act[:maintenance][:set]==:on)
+                SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:cyan).
+                  mark(msg)
+              else puts msg
+              end
+            end
+          end
+        end
+        def elasticsearch?
+          if @opt.act[:elasticsearch][:set]==:on         #% --elastic, -x
+            if @opt.f_pths.length > 0
+              require_relative 'json_elastic'            # json_elastic.rb
+              SiSU_Elastic::Source.new(@opt).read
+            else
+              msg='easticsearch request requires sisu markup files'
+              if (@opt.act[:verbose_plus][:set]==:on \
+              || @opt.act[:maintenance][:set]==:on)
+                SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:yellow).
+                  mark(msg)
+              else puts msg
+              end
+            end
+          end
+        end
         def manifest?
           if @opt.act[:manifest][:set]==:on              #% --manifest, -y
             if @opt.f_pths.length > 0
-              require_relative 'html_manifest'                # html_manifest.rb
-              ((@opt.act[:sisupod][:set]==:on \
-              || @opt.act[:share_source][:set]==:on) \
-              && @opt.f_pths.length < 2 ) \
-              ? nil
-              : SiSU_Manifest::Source.new(@opt).read
+              begin
+                require_relative 'html_manifest'           # html_manifest.rb
+                ((@opt.act[:sisupod][:set]==:on \
+                || @opt.act[:share_source][:set]==:on \
+                || @opt.act[:po4a_sstm][:set]==:on) \
+                && @opt.f_pths.length < 2 ) \
+                ? nil
+                : SiSU_Manifest::Source.new(@opt).read
+              rescue
+              end
             else
               msg='manifest request requires sisu markup files'
               if (@opt.act[:verbose_plus][:set]==:on \
@@ -588,8 +624,9 @@ module SiSU_Hub_Actions
       end
       def loop_files
         def share_source?
-          if @opt.act[:share_source][:set]==:on \
-          or @opt.act[:sisupod][:set]==:on \
+          if @opt.act[:sisupod][:set]==:on \
+          or @opt.act[:share_source][:set]==:on \
+          or @opt.act[:po4a_sstm][:set]==:on \
           or @opt.act[:git][:set]==:on
             begin
               if @opt.f_pths.length > 0
@@ -607,26 +644,6 @@ module SiSU_Hub_Actions
                 else puts msg
                 end
               end
-              if @opt.act[:share_source][:set]==:on
-                if @opt.f_pths.length > 0
-                  require_relative 'src_share'           # src_share.rb
-                  begin
-                  ensure
-                    SiSU_Hub_Loops::OptionLoopFiles.new(@opt).
-                    loop_files_on_given_option_bundle do
-                      SiSU_Markup::Source.new(@opt).read
-                    end
-                  end
-                else
-                  msg='share markup source request requires sisu markup files'
-                  if (@opt.act[:verbose_plus][:set]==:on \
-                  || @opt.act[:maintenance][:set]==:on)
-                    SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:cyan).
-                      mark(msg)
-                  else puts msg
-                  end
-                end
-              end
               if @opt.act[:sisupod][:set]==:on           #% --sisupod, -S
                 if @opt.f_pths.length > 0
                   require_relative 'src_sisupod_make'    # src_sisupod_make.rb
@@ -672,7 +689,8 @@ module SiSU_Hub_Actions
                 end
               end
               if (@opt.act[:sisupod][:set]==:on \
-              || @opt.act[:share_source][:set]==:on) \
+              || @opt.act[:share_source][:set]==:on \
+              || @opt.act[:po4a_sstm][:set]==:on) \
               and @opt.act[:manifest][:set]==:on         #% --manifest, -y
                 if @opt.f_pths.length > 0
                   require_relative 'html_manifest'            # html_manifest.rb
@@ -707,6 +725,66 @@ module SiSU_Hub_Actions
               end
             end
           end
+          if @opt.act[:share_source][:set]==:on
+            if @opt.f_pths.length > 0
+              require_relative 'src_sisupod_sstm'           # src_sisupod_sstm.rb
+              begin
+              ensure
+                SiSU_Hub_Loops::OptionLoopFiles.new(@opt).
+                loop_files_on_given_option_bundle do
+                  SiSU_Markup::Source_Sisupod.new(@opt).read
+                end
+              end
+            else
+              msg='share markup source request requires sisu markup files'
+              if (@opt.act[:verbose_plus][:set]==:on \
+              || @opt.act[:maintenance][:set]==:on)
+                SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:cyan).
+                  mark(msg)
+              else puts msg
+              end
+            end
+          end
+          if @opt.act[:po4a_sstm][:set]==:on                    #% --po4a-sst
+            if @opt.f_pths.length > 0
+              require_relative 'src_po4a_sstm'
+              begin
+                SiSU_Hub_Loops::OptionLoopFiles.new(@opt).
+                loop_files_on_given_option do
+                  SiSU_Markup::Source_Po4a.new(@opt).read       # src_po4a_sstm.rb
+                end
+              ensure
+              end
+            else
+              msg='sst request requires sisu markup files'
+              if (@opt.act[:verbose_plus][:set]==:on \
+              || @opt.act[:maintenance][:set]==:on)
+                SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:cyan).
+                  mark(msg)
+              else puts msg
+              end
+            end
+          end
+          if @opt.act[:po4a_sst_ao_sst][:set]==:on               #% --po4a-ao
+            if @opt.f_pths.length > 0
+              require_relative 'src_po4a_sst_ao_sst'
+              begin
+                SiSU_Hub_Loops::OptionLoopFiles.new(@opt).
+                loop_files_on_given_option do
+                  SiSU_SStm_AO_SStm::Source.new(@opt).read_setup # src_po4a_sst_ao_sst.rb
+                end
+              ensure
+              end
+            else
+              msg='sst request requires sisu markup files'
+              if (@opt.act[:verbose_plus][:set]==:on \
+              || @opt.act[:maintenance][:set]==:on)
+                SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:cyan).
+                  mark(msg)
+              else puts msg
+              end
+            end
+          end
           if @opt.act[:po4a_shelf][:set]==:on            #% --po4a-shelf
             if @opt.f_pths.length > 0
               require_relative 'src_po4a_shelf'
index c3f31a88af69954b103df2c2f61a38094d2c94b9..6e22c2ae4e9e7b88a20e9cbf1a67d6e53508a46f 100644 (file)
@@ -614,7 +614,7 @@ module SiSU_Commandline
           if ch =~/N/ then select_arr << '--digests'
             ch=ch.gsub(/[N]/,'')
           end
-          if ch =~/P/ then select_arr << '--po4a-shelf'
+          if ch =~/P/ then select_arr << '--po4a-sst'
             ch=ch.gsub(/[P]/,'')
           end
           if ch =~/d/ then select_arr << '--sqlite'
@@ -1301,11 +1301,32 @@ module SiSU_Commandline
         =~/"--harvest"/) \
         ? { bool: true, set: :on }
         : { bool: false, set: :na }
+        act[:po4a_sstm]=(select_arr.inspect \
+        =~/"--po4a-ss[tm]"/) \
+        ? { bool: true, set: :on }
+        : { bool: false, set: :na }
+        act[:po4a_sst_ao_sst]=(select_arr.inspect \
+        =~/"--po4a-ao(?:-ss[tm])?"/) \
+        ? { bool: true, set: :on }
+        : { bool: false, set: :na }
         act[:po4a_shelf]=(select_arr.inspect \
         =~/"--po4a-shelf"|"--pot?-shelf"/) \
         ? { bool: true, set: :on }
         : { bool: false, set: :na }
-        if act[:po4a_shelf][:set]==:on
+        if act[:po4a_shelf][:set]==:on \
+        or act[:po4a_sst_ao_sst][:set]==:on \
+        or act[:po4a_sstm][:set]==:on
+          act[:po4a_lang]=if select_arr.inspect \
+          =~/"--(?:trans|init)-([a-z]{2}):((?:(?:[a-z]{2}\b),?)+)/
+            lng_src,lng_trn=$1,$2.split(',')
+            { bool: true, set: :on, src: lng_src, trn: lng_trn }
+          elsif select_arr.inspect \
+          =~/"--trans"/
+            { bool: true, set: :on }
+            { bool: true, set: :on, src: 'en', trn: [] }
+          else
+            { bool: false, set: :na }
+          end
           act[:po4a_lang_trans]=if select_arr.inspect \
           =~/"--trans-([a-z]{2}):((?:(?:[a-z]{2}\b),?)+)/
             lng_src,lng_trn=$1,$2.split(',')
@@ -1450,8 +1471,9 @@ module SiSU_Commandline
         || act[:pdf_p][:set]==:on \
         || act[:pdf_l][:set]==:on \
         || act[:qrcode][:set]==:on \
-        || act[:share_source][:set]==:on \
         || act[:sisupod][:set]==:on \
+        || act[:share_source][:set]==:on \
+        || act[:po4a_sstm][:set]==:on \
         || act[:concordance][:set]==:on \
         || act[:sqlite_discrete][:set]==:on \
         || act[:sqlite_import][:set]==:on \
@@ -1499,8 +1521,9 @@ module SiSU_Commandline
         || act[:pdf_p][:set]==:on \
         || act[:pdf_l][:set]==:on \
         || act[:qrcode][:set]==:on \
-        || act[:share_source][:set]==:on \
         || act[:sisupod][:set]==:on \
+        || act[:share_source][:set]==:on \
+        || act[:po4a_sstm][:set]==:on \
         || act[:concordance][:set]==:on \
         || act[:xml_dom][:set]==:on \
         || act[:xml_sax][:set]==:on \
index 6b1346353161594bd914f4f3fc19c9b4ecabaab9..342f75f1634d19c4583c9ca9241d11b9eab241e9 100644 (file)
@@ -480,6 +480,12 @@ module SiSU_File_Op
         fn=base_filename.po
         make_file(path,fn)
       end
+      def po4a_sst(lng=@md.opt.lng)
+        path=output_path.po4a_sst(lng).dir
+        make_path(path)
+        fn=base_filename.po4a_sst
+        make_file(path,fn)
+      end
       self
     end
     def place_file
@@ -1465,6 +1471,9 @@ module SiSU_File_Op
         ? (@md.fn[:pot])
         : (@fno + '.pot')
       end
+      def po4a_sst #check
+        @fno
+      end
       def sisupod
         (@md.fns =~/\.ssm\.sst$/) \
         ? @md.fns.gsub(/(?:\~\S{2,3})?\.ssm\.sst$/,'.ssm.txz')
@@ -1826,6 +1835,21 @@ module SiSU_File_Op
         end
         self
       end
+      def po4a_sst(lng=@md.opt.lng)
+        @lng=lng
+        def dir
+          output_path.base.dir + '/' \
+            + Gt[:src] + '/' \
+            + @md.opt.fng + '/po4a/' \
+            + @lng
+        end
+        def url
+          output_path.base.url + '/po4a/' \
+            + @md.fnb \
+            + @lng
+        end
+        self
+      end
       def md_harvest
         manifest
         self
index 92a5a6fe4e2a5b7e29673a8aee0cdef7b6ff7e46..611507c4785e0ab43a9efbd5bb05a900858aa684 100644 (file)
@@ -134,6 +134,16 @@ module SiSU_Sys_Call
         false
       end
     end
+    def po4a                           #po4a
+      program='po4a'
+      program_ref="\n\t\tpo4a"
+      if program_found?(program); true
+      else
+        SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia).
+          warn("#{program} is not installed #{program_ref}")
+        false
+      end
+    end
     def zip                            #zip
       program='zip'
       program_ref="\n\t\tused to in the making of number of file formats, odf, epub"
index 6def47882bad2f49dc1408dfd3ec29c98c201686..3cfd72f18c3e012c6361b1c1166b73574d10a61a 100644 (file)
@@ -674,13 +674,13 @@ module SiSU_Metadata
 #         end
           nil
         end
-        def identifier
-          if defined? @md.classify.identifier \
-          and @md.classify.identifier
-            ' :identifier: ' + @md.classify.identifier
-          else nil
-          end
-        end
+        #def identifier
+        #  if defined? @md.classify.identifier \
+        #  and @md.classify.identifier
+        #    ' :identifier: ' + @md.classify.identifier
+        #  else nil
+        #  end
+        #end
         def loc
           if defined? @md.classify.loc \
           and @md.classify.loc
diff --git a/lib/sisu/develop/src_po4a_share.rb b/lib/sisu/develop/src_po4a_share.rb
new file mode 100644 (file)
index 0000000..3c34115
--- /dev/null
@@ -0,0 +1,309 @@
+# encoding: utf-8
+=begin
+
+* Name: SiSU
+
+** Description: documents, structuring, processing, publishing, search
+*** pot file generation
+
+** Author: Ralph Amissah
+  <ralph@amissah.com>
+  <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 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>
+
+** Git
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/src_po4a_share.rb;hb=HEAD>
+
+=end
+#module SiSU_SStm_AO_SStm
+module SiSU_Languages_Selected
+  require_relative 'utils_response'                   # utils_response.rb
+  def language
+    def sisu_languages_available
+      Px[:lng_lst]
+    end
+    def source_language_selected_str
+      @opt.act[:po4a_lang][:src] \
+      ? @opt.act[:po4a_lang][:src]
+      : 'en'
+    end
+    def translation_languages_selected
+      @opt.act[:po4a_lang][:trn] \
+      ? @opt.act[:po4a_lang][:trn]
+      : []
+    end
+    def translation_languages_available
+      sisu_languages_available - [source_language_selected_str]
+    end
+    def translation_languages_selected_that_are_available
+      translation_languages_selected & sisu_languages_available
+    end
+    def translation_languages_selected_that_are_available_str
+      translation_languages_selected_that_are_available.join(' ')
+    end
+    def translation_languages_selected_str
+      @opt.act[:po4a_lang][:trn].join(' ')
+    end
+    self
+  end
+end
+module SiSU_Po4a_Project
+  class Po4aCfg
+    include SiSU_Composite_Doc_Utils                    # composite doc, .ssm, extract all related insert files, array of filenames test
+    include SiSU_Response
+    include SiSU_Languages_Selected
+    def initialize(opt,file)
+      @opt,@file=opt,file
+    end
+    def song
+      if @opt.lng==language.source_language_selected_str
+        ans=response?('po4a config file')
+        if ans
+          po4a_cfg
+        end
+      end
+    end
+    def po4a_cfg_filename
+      'po4a.cfg'
+    end
+    def dir
+      def pwd
+        Dir.pwd
+      end
+      def po4a_
+        'po4a/' # ''
+      end
+      def pot
+        #po4a_ + 'pot'
+        'pot'
+      end
+      def po
+        #po4a_ + 'po'
+        'po'
+      end
+      self
+    end
+    def po4a_cfg_file
+      File.open("#{Dir.pwd}/#{po4a_cfg_filename}",'w')
+    end
+    def po4a_cfg
+      lng=language.source_language_selected_str
+      doc_import_list=composite_and_imported_filenames_array(@opt.fno)
+      po4a_cfg_arr=[]
+      po4a_cfg_arr \
+        << "[po4a_langs] #{language.translation_languages_selected_that_are_available_str}"
+      po4a_cfg_arr \
+        << "[po4a_paths] #{dir.pot}/$master.pot $lang:#{dir.po}/$lang/$master.po"
+      doc_import_list.each do |file_src|
+        file_src_fn=
+          file_src.gsub(/#{language.source_language_selected_str}\//,'')
+        po4a_cfg_arr \
+          << "[type: text] #{lng}/#{file_src} $lang:$lang/#{file_src_fn}"
+      end
+      file=@file.write_file.po4a_cfg
+      po4a_cfg_arr.each do |txt|
+      puts txt
+        file << txt << "\n"
+      end
+      file.close
+    end
+  end
+  class Po4aProject
+    include SiSU_Languages_Selected
+    include SiSU_Response
+    def initialize(opt,file)
+      @opt,@file=opt,file
+    end
+    def song
+      make_paths
+      if FileTest.directory?(@file.output_path.po4a.dir)
+        Dir.chdir(@file.output_path.po4a.dir)
+        dirs=Dir['*/']
+        dirs_language=[]
+        dirs.each do |x|
+          dirs_language << x.gsub(/\/$/,'')
+        end
+        dirs_translation = \
+          (language.translation_languages_available & dirs_language)
+      end
+      if (language.translation_languages_available & [@opt.lng]).length == 1
+        puts %{gettext for: #{dirs_translation}
+in #{Dir.pwd}}
+        ans=response?('gettext?')
+        if ans
+          gettext_if_any_build_src_trans_po
+        end
+      end
+      ans=response?('build project?')
+      if ans
+        build_src_master_to_pot_and_po_and_srcs
+      end
+    end
+    def flags
+      def debug
+        '-d -v'
+      end
+      def normal
+        ''
+      end
+      def quiet
+        '-q'
+      end
+      self
+    end
+    def build_src_master_to_pot_and_po_and_srcs
+      if SiSU_Sys_Call::SystemCall.new.po4a
+        pwd=Dir.pwd
+        #cmd='po4a --keep 0 -M UTF-8 --no-backups ' \
+        #+ '--package-name ' \
+        #+ 'sisu-manual' + ' ' \
+        #+ flags.normal + ' ' \
+        #+ filename.po4a_cfg
+        cmd='po4a --keep 0 -M UTF-8' \
+        + flags.normal + ' ' \
+        + @file.base_filename.po4a_cfg
+        Dir.chdir(@file.output_path.po4a.dir)
+        system("
+          cd #{@file.output_path.po4a.dir}
+          #{cmd}
+          cd -
+        "); puts cmd
+        Dir.chdir(pwd)
+      end
+    end
+    def gettext_if_any_build_src_trans_po
+        Dir.chdir(@file.output_path.po4a.dir)
+        dirs=Dir['*/']
+        dirs_language=[]
+        dirs.each do |x|
+          dirs_language << x.gsub(/\/$/,'')
+        end
+        dirs_translation = \
+          (language.translation_languages_available & dirs_language)
+        files_src=Dir.glob("./#{source_language_selected_str}/*.ss[tmi]")
+        dirs_translation.each do |lng|
+          files_src.each do |file|
+            fn=file.gsub(/\.\/#{source_language_selected_str}\//,'')
+            system("
+              po4a-gettextize -f text -M utf-8 \
+              -m ./#{source_language_selected_str}/#{fn} \
+              -l ./#{lng}/#{fn} \
+              -p ./po/#{lng}/#{fn}.po
+            ")
+            puts fn
+          end
+        end
+    end
+    def dir_mk(dir)
+      unless FileTest.directory?(dir)
+        FileUtils::mkdir_p(dir)
+      end
+    end
+    def make_paths
+      dir_mk(@file.output_path.pot.dir)
+      dir_mk(@file.output_path.po.dir)
+    end
+    def clean
+      #rm -f po/*/*.po~
+      #rm -rf ../build
+      FileUtils.rm_f Dir.glob("./#{dir.po}/*/*.po~")
+    end
+    def distclean
+      #rm -f po4a.cfg
+      #rm -rf $(LANGUAGES)
+      FileUtils::rm_f(filename.po4a_cfg)
+      FileUtils::rm_r(language.possible_translations,:force => true)
+      #FileUtils::rm_r(language.translation_languages_selected_that_are_available,:force => true)
+    end
+  end
+  class Po4aDistClean
+    include SiSU_Languages_Selected
+    include SiSU_Response
+    def initialize(opt,file)
+      @opt,@file=opt,file
+    end
+    def song
+      pwd=Dir.pwd
+      if FileTest.directory?(@file.output_path.po4a.dir)
+        Dir.chdir(@file.output_path.po4a.dir)
+        dirs=Dir['*/']
+        dirs_language=[]
+        dirs.each do |x|
+          dirs_language << x.gsub(/\/$/,'')
+        end
+        dirs_translation = \
+          (language.translation_languages_available & dirs_language)
+        if dirs_translation.length > 0
+          puts %{remove language translation directorie(s): #{dirs_translation}
+in #{Dir  .pwd}}
+          ans=response?('disclean?')
+          if ans
+            FileUtils::rm_f(@file.base_filename.po4a_cfg)
+            FileUtils::rm_r(dirs_translation,:force => true)
+            #FileUtils::rm_r(language.translation_languages_available,:force => true)
+          end
+        end
+        Dir.chdir(pwd)
+      end
+    end
+  end
+end
+#end
+__END__
+REMOVE
+&#033;\|&#035;\|&&#042;\|&#045;\|&#047;\|&#095;\|&#123;\|&#125;\|&#126;\|&#
+
+tables are problematic, difficult to reconstitute instruction, check
+
+metadata, move to top? and work on
+
+footnotes, different types, asterisk, also do you want to have separate
+paragraphs, or breaks within one block?
+
+where no ocn appropriately use ~# or -# or indeed 1~name-
+
+comments in document, what to do about them, not sure they are currently
+retained in dal, could be quite valuable to keep
+
+Translate Shell
+http://www.soimort.org/translate-shell/
+translate.google.com
diff --git a/lib/sisu/develop/src_po4a_sst_ao_sst.rb b/lib/sisu/develop/src_po4a_sst_ao_sst.rb
new file mode 100644 (file)
index 0000000..c1c8505
--- /dev/null
@@ -0,0 +1,893 @@
+# encoding: utf-8
+=begin
+
+* Name: SiSU
+
+** Description: documents, structuring, processing, publishing, search
+*** pot file generation
+
+** Author: Ralph Amissah
+  <ralph@amissah.com>
+  <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 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>
+
+** Git
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/src_po4a_sst_ao_sst.rb;hb=HEAD>
+
+=end
+module SiSU_SStm_AO_SStm
+  require_relative 'ao'                                 # ao.rb
+  require_relative 'se'                                 # se.rb
+    include SiSU_Env
+  require_relative 'ao_composite'                       # ao_composite.rb
+  require_relative 'shared_metadata'                    # shared_metadata.rb
+  require_relative 'src_po4a_share'                     # src_po4a_share.rb
+  require_relative 'src_po4a_sst_ao_sst_set'            # src_po4a_sst_ao_sst_set.rb
+  include SiSU_Param
+  require_relative 'object_munge'                       # object_munge.rb
+  require_relative 'utils_composite'                    # utils_composite.rb
+  require_relative 'utils_response'                     # utils_response.rb
+  class Source
+    include SiSU_Object_Munge
+    include SiSU_Languages_Selected
+    include SiSU_Response
+    @@md_src,@@md_master=
+          nil,      nil
+    @@auto_translation_ = :go
+    def initialize(opt,fn=nil)
+      @opt,@fn=opt,fn
+      #unless @opt.fns =~/(.+?\.(?:-|ssm\.)?sst)$/
+      #  puts "#{@opt.fns} not a processed file type"
+      #end
+      file_arr=SiSU_Info_Env::InfoEnv.new.
+        source_file_processing_array(@opt.fno)
+      SiSU_Param::Parameters::Instructions.new(file_arr,@opt).extract
+      r=Px[:lng_lst_rgx].gsub(/\|#{language.source_language_selected_str}\|/,'|')
+      @lang_regx=%r{(?:#{r})}
+      @@todo=if source_language_selected_str == opt.f_pth[:lng]
+        :same_file
+      else :compare
+      end
+      if opt.f_pth[:lng]==@opt.lng_base \
+      and opt.f_pth[:lng]==source_language_selected_str
+        @@md_master=SiSU_Param::Parameters.new(opt).get
+      end
+    end
+    def wrap_width_set(md,env)
+      if defined? md.make.plaintext_wrap \
+      and md.make.plaintext_wrap
+        md.make.plaintext_wrap
+      elsif defined? env.plaintext_wrap \
+      and env.plaintext_wrap
+        #env.plaintext_wrap # 78 use 75
+        75
+      else 75 #78
+      end
+    end
+    def process_file(md,env,file,wrap_width,fn)
+      if source_language_selected_str == @opt.f_pth[:lng]
+        @@ao_arr_lang_trans=
+          SiSU_AO::Source.new(
+            @opt,
+            fn,
+            :po4a
+          ).get # ao file drawn here
+      end
+      @ao_arr_lang_src=
+        SiSU_AO::Source.new(
+          @opt,
+          fn,
+          :po4a
+        ).get # ao file drawn here
+      SiSU_SStm_AO_SStm::Source::Scroll.new(
+        fn,
+        @ao_arr_lang_src,
+        @@ao_arr_lang_trans,
+        @@md_src,
+        @@md_master,
+        wrap_width
+      ).songsheet
+    end
+    def read_process_src_files
+      begin
+        src={}
+        src[:pth]=@opt.f_pth[:pth]
+        src[:files]=if @opt.fns =~ /\.(?:(?:-|ssm\.)sst|ssm)$/
+          @opt.fns=@opt.fns.gsub(/\.ssm\.sst$/,'.ssm')
+          SiSU_Assemble::CompositeFileList.new(@opt).read
+        else
+          [@opt.fns]
+        end
+        md=SiSU_Param::Parameters.new(@opt).get
+        env=SiSU_Env::InfoEnv.new(@opt.fns)
+        file=SiSU_Env::FileOp.new(md)
+        lng=/\/([^\/]+)$/.match(src[:pth])[1]
+        if language.source_language_selected_str == lng
+          SiSU_Po4a_Project::Po4aDistClean.new(@opt,file).song
+        end
+        wrap_width=wrap_width_set(md,env)
+        lng = /\/([^\/]+)$/.match(src[:pth])[1]
+        ans=response?('process files?')
+        if ans
+          src[:files].each do |fn|
+            puts "[#{lng}] #{fn}"
+            process_file(md,env,file,wrap_width,fn)
+          end
+        end
+      rescue
+        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do
+          __LINE__.to_s + ':' + __FILE__
+        end
+      ensure
+      end
+    end
+    def read_setup
+      begin
+        md=SiSU_Param::Parameters.new(@opt).get
+        file=SiSU_Env::FileOp.new(md)
+        SiSU_Po4a_Project::Po4aCfg.new(@opt,file).song
+        SiSU_Po4a_Project::Po4aProject.new(@opt,file).song
+      rescue
+        SiSU_Errors::Rescued.new($!,$@,@opt.selections.str,@opt.fns).location do
+          __LINE__.to_s + ':' + __FILE__
+        end
+      ensure
+      end
+    end
+    private
+    class Scroll <Source
+      include SiSU_Po4aUtils
+      @@endnotes={ para: [], end: [] }
+      def initialize(fn,data_src,data_master,md_src,md_master,wrap_width)
+        @fn,@data_src,@data_master,@md_src,@md_master,@wrap_width=
+         fn, data_src, data_master, md_src, md_master, wrap_width
+        @md=md_src
+        @tab="\t"
+        @@endnotes_=(@md.opt.selections.str =~/--endnote/) \
+        ? true
+        : false    # --footnote
+        @pot={
+          body: [],
+          open: [],
+          close: [],
+          head: [],
+          metadata: [],
+          tail: []
+        }
+      end
+      def br
+        (@md.opt.selections.str =~/--dos/) ? "\r\n" : "\n"  # --unix
+      end
+      def songsheet
+        fn=@fn
+        pot=compare_structure_src_trn(@data_src,@data_master,@@todo)
+        publish(fn,pot)
+      end
+      def pot_structure_wrap(orig,trans,indent=0,hang=0)
+        SiSU_Po4aUtils::Wrap.new(
+          @md,
+          orig,
+          trans,
+          @wrap_width,
+          indent,
+          hang
+        )
+      end
+      def wrap_endnotes(orig_notes='',trn_notes='')
+        #nt=@@endnotes_ ? 'endnote' : 'footnote'
+        @fn=0
+        a_l=orig_notes.length
+        0.upto(a_l-1) do |i|
+          @fn=if orig_notes[i].to_s =~/^\^~([\d*+]+)/ # provides endnote number within paragraph
+            @fn += 1
+          else @fn
+          end
+          #mark="^~ "
+          orig=(orig_notes[i].to_s =~/^\^~[\d*+]+/) \
+          ? (orig_notes[i].to_s.gsub(/^\^~[\d*+]+/,'^~'))
+          : orig_notes[i].to_s
+          trans=if trn_notes.is_a?(Array) \
+          and trn_notes.length==orig_notes.length
+            (trn_notes[i].to_s =~/^\^~[\d*+]+/) \
+            ? (trn_notes[i].to_s.gsub(/^\^~[\d*+]+/,'^~'))
+            : trn_notes[i].to_s
+          else ''
+          end
+          util=pot_structure_wrap(orig,trans)
+          wrap=util.line_wrap
+          wrap=if wrap =~ /^\s*\^~[\d*+]+\s+.+?\s*\Z/m
+            wrap.gsub(/^\s*(\^~[\d*+]+)\s+(.+?)\s*\Z/m, <<GSUB
+\\1 \\2
+GSUB
+                      )
+          else
+            wrap.gsub(/^(.+)\Z/m, <<GSUB
+\\1
+GSUB
+                      )
+          end
+          @@endnotes[:para] << wrap
+          @@endnotes[:end] << '' << wrap
+        end
+        @@endnotes[:para].each {|e| @pot[:body] << e << br}
+        @@endnotes[:para]=[]
+        @@endnotes
+      end
+      def pot_metadata_src
+        @po4a_identify_type='type: SiSU doc' #'type: Plain text'
+        meta_src=SiSU_Metadata::Summary.new(@md_src)
+        w=[]
+        w << [
+          meta_src.metadata_tags.title.main,
+          meta_src.metadata_tags.title.sub,
+          meta_src.metadata_tags.title.edition,
+          meta_src.metadata_tags.title.note,
+          meta_src.metadata_tags.title.short,
+          meta_src.metadata_tags.title.language,
+          meta_src.metadata_tags.title.language_char,
+        ]
+        w << [
+          meta_src.metadata_tags.creator.head,
+          meta_src.metadata_tags.creator.author,
+          meta_src.metadata_tags.creator.contributor,
+          meta_src.metadata_tags.creator.illustrator,
+          meta_src.metadata_tags.creator.photographer,
+          meta_src.metadata_tags.creator.translator,
+          meta_src.metadata_tags.creator.audio,
+          meta_src.metadata_tags.creator.digitized_by,
+          meta_src.metadata_tags.creator.prepared_by,
+        ]
+        w << [
+          meta_src.metadata_tags.rights.head,
+          meta_src.metadata_tags.rights.copyright.text,
+          meta_src.metadata_tags.rights.copyright.translation,
+          meta_src.metadata_tags.rights.copyright.illustrations,
+          meta_src.metadata_tags.rights.copyright.photographs,
+          meta_src.metadata_tags.rights.copyright.digitization,
+          meta_src.metadata_tags.rights.copyright.audio,
+          meta_src.metadata_tags.rights.license,
+        ]
+        w << [
+          meta_src.metadata_tags.classify.head,
+          meta_src.metadata_tags.classify.subject,
+          meta_src.metadata_tags.classify.topic_register,
+          meta_src.metadata_tags.classify.loc,
+          meta_src.metadata_tags.classify.dewey,
+        ]
+        w << [
+          meta_src.metadata_tags.date.head,
+          meta_src.metadata_tags.date.added_to_site,
+          meta_src.metadata_tags.date.available,
+          meta_src.metadata_tags.date.created,
+          meta_src.metadata_tags.date.issued,
+          meta_src.metadata_tags.date.modified,
+          meta_src.metadata_tags.date.published,
+          meta_src.metadata_tags.date.valid,
+        ]
+        w << [
+          meta_src.processing_tags.make.language,
+          meta_src.processing_tags.make.headings,
+          meta_src.processing_tags.make.num_top,
+          meta_src.processing_tags.make.breaks,
+          meta_src.processing_tags.make.emphasis,
+          meta_src.processing_tags.make.bold,
+          meta_src.processing_tags.make.italics,
+          meta_src.processing_tags.make.texpdf_font,
+        ]
+        w.each do |y|
+          z=''
+          y.each do |x|
+            if x
+              z += x + "\n" if x =~/^#|^msg(?:id|str)/
+              z += %{#{x}\n} if x =~/^@\S+?:(?: |$)/
+              z += %{#{x}\n} if x =~/^\s+:\S+?: /
+            end
+          end
+          @pot[:metadata] << z << br
+          #puts z unless z.empty?
+        end
+      end
+      def pot_metadata_src_trn
+        #@po4a_identify_type='type: Plain text'
+        meta_src=SiSU_Metadata::Summary.new(@md_src)
+        w=[]
+        w << [
+          meta_src.metadata_tags.title.main,
+          meta_src.metadata_tags.title.sub,
+          meta_src.metadata_tags.title.edition,
+          meta_src.metadata_tags.title.note,
+          meta_src.metadata_tags.title.short,
+          meta_src.metadata_tags.title.language,
+          meta_src.metadata_tags.title.language_char,
+        ]
+        w << [
+          meta_src.metadata_tags.creator.head,
+          meta_src.metadata_tags.creator.author,
+          meta_src.metadata_tags.creator.contributor,
+          meta_src.metadata_tags.creator.illustrator,
+          meta_src.metadata_tags.creator.photographer,
+          meta_src.metadata_tags.creator.translator,
+          meta_src.metadata_tags.creator.audio,
+          meta_src.metadata_tags.creator.digitized_by,
+          meta_src.metadata_tags.creator.prepared_by,
+        ]
+        w << [
+          meta_src.metadata_tags.rights.head,
+          meta_src.metadata_tags.rights.copyright.text,
+          meta_src.metadata_tags.rights.copyright.translation,
+          meta_src.metadata_tags.rights.copyright.illustrations,
+          meta_src.metadata_tags.rights.copyright.photographs,
+          meta_src.metadata_tags.rights.copyright.digitization,
+          meta_src.metadata_tags.rights.copyright.audio,
+          meta_src.metadata_tags.rights.license,
+        ]
+        w << [
+          meta_src.metadata_tags.classify.head,
+          meta_src.metadata_tags.classify.subject,
+          meta_src.metadata_tags.classify.topic_register,
+          meta_src.metadata_tags.classify.loc,
+          meta_src.metadata_tags.classify.dewey,
+        ]
+        w << [
+          meta_src.metadata_tags.date.head,
+          meta_src.metadata_tags.date.added_to_site,
+          meta_src.metadata_tags.date.available,
+          meta_src.metadata_tags.date.created,
+          meta_src.metadata_tags.date.issued,
+          meta_src.metadata_tags.date.modified,
+          meta_src.metadata_tags.date.published,
+          meta_src.metadata_tags.date.valid,
+        ]
+        w << [
+          meta_src.processing_tags.make.language,
+          meta_src.processing_tags.make.headings,
+          meta_src.processing_tags.make.num_top,
+          meta_src.processing_tags.make.breaks,
+          meta_src.processing_tags.make.emphasis,
+          meta_src.processing_tags.make.bold,
+          meta_src.processing_tags.make.italics,
+          meta_src.processing_tags.make.texpdf_font,
+        ]
+        w.each do |y|
+          z=''
+          y.each do |x|
+            if x
+              z += x + "\n" if x =~/^#|^msg(?:id|str)/
+              z += %{#{x}\n} if x =~/^@\S+?:(?: |$)/
+              z += %{#{x}\n} if x =~/^\s+:\S+?: /
+            end
+          end
+          @pot[:metadata] << z << br
+          #puts z unless z.empty?
+        end
+      end
+      def auto_translate?(set_to=nil)
+        @@auto_translation_=
+        if @md.opt.act[:po4a_lang_trans][:set]==:on
+          set_to \
+          ? set_to
+          : @@auto_translation_
+        else :skip
+        end
+      end
+      def auto_translation(src_txt,markup=:src) # check for an appropriate request flag
+        auto_translate?(:skip)
+        begin
+          src_txt_clean=clean_text(src_txt,markup)
+          src_txt_clean=src_txt_clean.
+            gsub(/\n/,' ').
+            gsub(/"/,'\"').
+            gsub(/([()])/,'\\\\\1')
+          trans=''
+          unless auto_translate? == :skip
+            require 'timeout'
+            Timeout::timeout(60) {
+              trans=`trans -b -no-ansi en:#{@md.opt.f_pth[:lng_is]} #{src_txt_clean}`.strip
+              unless trans.empty?
+                trans + ' {[G.Tr]}http://translate.google.com'
+              end
+            }
+          end
+          trans
+        rescue
+          auto_translate?(:skip)
+          p 'timeout issues with translation, skip remaining'
+        end
+      end
+      def pot_structure
+        def heading(dob_src='',notes_s='',dob_trn='',notes_t='')   #% used to extract the structure of a document
+          lv=n=n3=nil
+          lv=dob_src.ln
+          n=lv - 1
+          n3=lv + 2
+          util=nil
+          fn=(dob_src.name=~/[a-z\d]/i) ? dob_src.name : ''
+          mark="#{dob_src.lv}~#{fn} "
+          orig="#{mark}#{dob_src.obj}"
+          trans=((dob_trn=='') \
+          || (dob_src.obj == dob_trn.obj)) \
+          ? ''
+          : "#{mark}#{dob_trn.obj}"
+          if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
+          and trans.empty? \
+          and auto_translate?
+            trans=auto_translation(dob_src.obj,:src)
+          end
+          util=pot_structure_wrap(orig,trans)
+          wrapped=util.line_wrap
+          @pot[:body] << wrapped << br # main text, contents, body KEEP
+          if @@endnotes[:para] \
+          and notes_s.length > 0 \
+          and not @@endnotes_
+            @pot[:body] << br
+            wrap_endnotes(notes_s,notes_t)
+          elsif @@endnotes[:para] \
+          and @@endnotes_
+            @pot[:body] << br*2
+          end
+        end
+        def para(dob_src='',notes_s='',dob_trn='',notes_t='')      #% used to extract the structure of a document
+          util=nil
+          wrapped=if dob_src.indent =~/[1-9]/ \
+          and dob_src.indent == dob_src.hang
+            s_mark=desc=orig=trans=''
+            mark=if dob_src.bullet_
+              "_#{dob_src.indent}* "
+            else
+              "_#{dob_src.indent} "
+            end
+            orig="#{mark}#{dob_src.obj}"
+            trans=((dob_trn=='') \
+            || (dob_src.obj == dob_trn.obj)) \
+            ? ''
+            : "#{mark}#{dob_trn.obj}"
+            if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
+            and trans.empty? \
+            and auto_translate?
+              trans=auto_translation(dob_src.obj,:src)
+            end
+            util=pot_structure_wrap(orig,trans)
+          elsif dob_src.hang =~/[0-9]/ \
+          and dob_src.indent != dob_src.hang
+            s_mark=desc=orig=trans=''
+            mark="_#{dob_src.hang}_#{dob_src.indent} "
+            orig="#{mark}#{dob_src.obj}"
+            trans=((dob_trn=='') \
+            || (dob_src.obj == dob_trn.obj)) \
+            ? ''
+            : "#{mark}#{dob_trn.obj}"
+            if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
+            and trans.empty? \
+            and auto_translate?
+              trans=auto_translation(dob_src.obj,:src)
+            end
+            util=pot_structure_wrap(orig,trans)
+          else
+            s_mark=desc=orig=trans=''
+            if dob_src.bullet_
+              mark='_* '
+              orig="#{mark}#{dob_src.obj}"
+              trans=((dob_trn=='') \
+              || (dob_src.obj == dob_trn.obj)) \
+              ? ''
+              : "#{mark}#{dob_trn.obj}"
+              if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
+              and trans.empty? \
+              and auto_translate?
+                trans=auto_translation(dob_src.obj,:src)
+              end
+            else
+              mark=''
+              orig=dob_src.obj
+              trans=((dob_trn=='') \
+              || (dob_src.obj == dob_trn.obj)) \
+              ? ''
+              : "#{mark}#{dob_trn.obj}"
+              if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
+              and trans.empty? \
+              and auto_translate?
+                trans=auto_translation(dob_src.obj,:src)
+              end
+            end
+            util=pot_structure_wrap(orig,trans)
+          end
+          wrapped=util.line_wrap
+          @pot[:body] << wrapped << br # main text, contents, body KEEP
+          if @@endnotes[:para] \
+          and notes_s.length > 0 \
+          and not @@endnotes_
+            @pot[:body] << br
+            wrap_endnotes(notes_s,notes_t)
+          elsif @@endnotes[:para] \
+          and @@endnotes_
+            @pot[:body] << br*2
+          end
+        end
+        def block(dob_src='',notes_s='',dob_trn='',notes_t='')     #% used to extract the structure of a document
+          mark_o ="block{\n\n"
+          mark_c ="\n\n}block"
+          orig="#{mark_o}#{dob_src.obj}#{mark_c}"
+          trans=((dob_trn=='') \
+          || (dob_src.obj == dob_trn.obj)) \
+          ? ''
+          : "#{mark_o}#{dob_trn.obj}#{mark_c}"
+          if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
+          and trans.empty? \
+          and auto_translate?
+            trans=auto_translation(dob_src.obj,:src)
+          end
+          util=pot_structure_wrap(orig,trans)
+          unwrapped=util.no_line_wrap_block
+          @pot[:body] << unwrapped << br
+        end
+        def group(dob_src='',notes_s='',dob_trn='',notes_t='')     #% used to extract the structure of a document
+          mark_o ="group{\n\n"
+          mark_c ="\n\n}group"
+          orig="#{mark_o}#{dob_src.obj}#{mark_c}"
+          trans=((dob_trn=='') \
+          || (dob_src.obj == dob_trn.obj)) \
+          ? ''
+          : "#{mark_o}#{dob_trn.obj}#{mark_c}"
+          if @md.opt.f_pth[:lng_is] !=@md.opt.lng_base \
+          and trans.empty? \
+          and auto_translate?
+            trans=auto_translation(dob_src.obj,:src)
+          end
+          util=pot_structure_wrap(orig,trans)
+          unwrapped=util.no_line_wrap_block
+          @pot[:body] << unwrapped << br
+        end
+        def verse(dob_src='',notes_s='',dob_trn='',notes_t='')     #% used to extract the structure of a document
+          mark="poem{\n\nverse\n\nverse\n\n...\n\n}poem"
+          instruct=s_mark=''
+          if @md.opt.act[:maintenance][:set]==:on
+            instruct=%{\n# verse are part of the text block described as a poem, } \
+            + %{the first verse is preceeded by an opening marker, } \
+            + %{and the last verse by a closing marker, } \
+            + %{the content of which should remain unwrapped}
+            s_mark="\n# " + %{"\\n\\n#{mark}\\n\\n"}
+          end
+          orig=dob_src.obj
+          trans=(dob_trn=='') \
+          ? ''
+          : dob_trn.obj
+          util=pot_structure_wrap(orig,trans)
+          unwrapped=util.no_line_wrap_block
+          @pot[:body] << unwrapped << br
+        end
+        def code(dob_src='',notes_s='',dob_trn='',notes_t='')      #% used to extract the structure of a document
+          mark_o ="code{\n\n"
+          mark_c ="\n\n}code"
+          orig="#{mark_o}#{dob_src.obj}#{mark_c}"
+          trans=(dob_trn=='') \
+          ? ''
+          : "#{mark_o}#{dob_trn.obj}#{mark_c}"
+          util=pot_structure_wrap(orig,trans)
+          unwrapped=util.no_line_wrap_block
+          @pot[:body] << unwrapped << br
+        end
+        def table(dob_src='',notes_s='',dob_trn='',notes_t='')     #% used to extract the structure of a document
+          mark_o ="table{\n\n"
+          mark_c ="\n\n}table"
+          orig="#{mark_o}#{dob_src.obj}#{mark_c}"
+          orig=orig.gsub(/#{Mx[:tc_c]}/m,"\n")
+          trans=(dob_trn=='') \
+          ? ''
+          : "#{mark_o}#{dob_trn.obj}#{mark_c}"
+          trans=trans.gsub(/#{Mx[:tc_c]}/m,"\n")
+          util=pot_structure_wrap(orig,trans)
+          unwrapped=util.no_line_wrap_block
+          @pot[:body] << unwrapped << br
+        end
+        def idx_markup(idx)
+          struct=['={' + "\n  "]
+          idx.sort.each do |x|
+            x.each_with_index do |y,i0|
+              case y
+              when String
+                unless struct[-1] =~/=\{/
+                  struct << ' ;' + "\n  "
+                end
+                struct << y
+                if x[i0+1].class == Hash \
+                and x[i0+1][:sub].length > 0
+                  struct << ' :' + "\n    "
+                end
+              when Hash
+                if y[:plus].to_i > 0
+                  struct << '+' + y[:plus].to_s
+                end
+                if y[:sub].length > 0
+                  y[:sub].each_with_index do |z,i1|
+                    z.each_with_index do |a,i2|
+                      if z.length > 0
+                        struct << a[0]
+                        if a[1][:plus].to_i > 0
+                          struct << '+' + a[1][:plus].to_s
+                        end
+                        if (i1 + 1) < y[:sub].length
+                          struct << '|'
+                        end
+                      end
+                    end
+                  end
+                end
+              end
+            end
+          end
+          struct << "\n" + '}'
+          #puts struct.join
+          struct.join
+        end
+        def idx(dob_src='') #% used for book index but broken as original markup lost, already abstracted, fix
+          orig=pot_structure.idx_markup(dob_src.idx) #'={' + dob_src.idx + '}'
+          util=pot_structure_wrap(orig,'')
+          unwrapped=util.no_line_wrap_block
+          if @pot[:body][-1] == "\n"
+            @pot[:body][-1] = unwrapped #<< br
+            @pot[:body] << br
+          else # expect to catch all above, problem if wraps, must =~/^=\{/
+            @pot[:body] << unwrapped << br # places idx in separate object
+          end
+        end
+        self
+      end
+      def compare_structure_src_trn(data_src,data_trn,todo)
+        #@endnotes,@copen,@pot_contents_close=Array.new(3){[]}
+        a_l= data_src.length
+        s,t=0,0
+        0.upto(a_l-1) do |i|
+          if todo==:compare
+            unless data_src[s] \
+            and data_trn[t]
+              break
+            end
+            if data_src[s].of == :comment \
+            and data_trn[t].of == :comment \
+            and (data_src[s].is == data_trn[t].is)
+              s+=1;t+=1
+              next
+            end
+            if ((data_src[s].is == :comment) \
+            || (data_trn[t].is == :comment)) \
+            and (data_src[s].is != data_trn[t].is)
+              if data_src[s].is == :comment
+                if @md.opt.act[:maintenance][:set]==:on
+                  puts "src (comment):\n\t" \
+                  + data_src[s].obj
+                end
+                s+=1
+                #next if data_src[s].is == :comment
+              elsif data_trn[t].is == :comment
+                if @md.opt.act[:maintenance][:set]==:on
+                  puts "trans (comment):\n\t" \
+                  + data_trn[t].obj
+                end
+                t+=1
+                #next if data_trn[t].is == :comment
+              end
+            end
+            if ((defined? data_src[s].ocn) \
+            && (data_src[s].ocn.is_a?(Fixnum))) \
+            and ((defined? data_trn[t].ocn) \
+            && (data_trn[t].ocn.is_a?(Fixnum))) \
+            and (data_src[s].ocn == data_trn[t].ocn)
+              @m_s,@m_t=s,t
+            elsif ((defined? data_src[s].ocn) \
+            && (data_src[s].ocn.is_a?(Fixnum))) \
+            and ((defined? data_trn[t].ocn) \
+            && (data_trn[t].ocn.is_a?(Fixnum))) \
+            and (data_src[s].ocn != data_trn[t].ocn)
+              p '--- OCN ---'
+              p 'mis-match'
+              p data_src[s].ocn if defined? data_src[s].ocn
+              p data_src[s].obj if defined? data_src[s].obj
+              p data_trn[t].ocn if defined? data_trn[t].ocn
+              p data_trn[t].obj if defined? data_trn[t].obj
+              p '---'
+              p 'previous match'
+              p data_src[@m_s].ocn if defined? data_src[@m_s].ocn
+              p data_src[@m_s].obj if defined? data_src[@m_s].obj
+              p data_trn[@m_t].ocn if defined? data_trn[@m_t].ocn
+              p data_trn[@m_t].obj if defined? data_trn[@m_s].obj
+              exit
+            elsif (((defined? data_src[s].ocn) \
+            && (defined? data_trn[t].ocn)) \
+            and data_src[s].ocn.class != data_trn[t].ocn.class)
+              p '--- OCN class ---'
+              p 'mis-match'
+              p data_src[s].ocn if defined? data_src[s].ocn
+              p data_src[s].obj if defined? data_src[s].obj
+              p data_trn[t].ocn if defined? data_trn[t].ocn
+              p data_trn[t].obj if defined? data_trn[t].obj
+              #p '---'
+              #p 'previous match'
+              #p data_src[@m_s].ocn
+              #p data_src[@m_s].obj
+              #p data_trn[@m_t].ocn
+              #p data_trn[@m_t].obj
+            #elsif (defined? data_src[s].ocn != defined? data_trn[t].ocn) \
+            #and (data_src[s].ocn.nil? != data_trn[t].ocn.nil?)
+            #  p '--- missing OCN? ---'
+            #  p 'mis-match'
+            #  p data_src[s].ocn if defined? data_src[s].ocn
+            #  p data_src[s].obj
+            #  p data_trn[t].ocn if defined? data_trn[t].ocn
+            #  p data_trn[t].obj
+            else
+            end
+          end
+          notes_s=''
+          data_src[s],notes_s=markup(data_src[s])
+          data_src[s],nul=pot_data(data_src[s],notes_s)
+          s+=1;t+=1
+        end
+        @pot #watch
+      end
+      def pot_data(dob_src='',notes_s)
+        if dob_src.obj !~/(^#{Rx[:meta]}|#{Mx[:br_eof]}|#{Mx[:br_endnotes]})/
+          if defined? dob_src.ocn \
+          and dob_src.ocn.to_s =~/\d+/
+            paranum=dob_src.ocn.to_s
+            @p_num=SiSU_Po4aUtils::ParagraphNumber.new(paranum)
+          end
+          case dob_src.is
+          when :heading
+            pot_structure.heading(dob_src,notes_s)
+          when :para
+            pot_structure.para(dob_src,notes_s)
+          when :group
+            pot_structure.group(dob_src,notes_s)
+          when :block
+            pot_structure.block(dob_src,notes_s)
+          when :verse
+            pot_structure.verse(dob_src,notes_s)
+          when :code
+            pot_structure.code(dob_src,notes_s)
+          when :table
+            pot_structure.table(dob_src,notes_s)
+          end
+          if defined? dob_src.idx \
+          and not dob_src.idx.nil? \
+          and not dob_src.idx.empty?
+            pot_structure.idx(dob_src)
+          end
+          #if dob_src ## Clean Prepared Text
+          #  dob_src.obj=dob_src.obj.gsub(/<!.+!>/,' ').
+          #    gsub(/<:\S+>/,' ') if dob_src ## Clean Prepared Text
+          #end
+        end
+        #[dob_src,dob_trn]
+      end
+      def markup(dob)
+        dob,notes=objects.textface_marks_po4a(dob,:separate)
+        [dob,notes]
+      end
+      def publish(fn,pot)
+        content=[]
+        content << pot[:open]
+        content << pot[:head]
+        content << pot[:metadata]
+        content << pot[:body]
+        content << @@endnotes[:end] if @@endnotes_
+        Output.new(fn,content,@md,@process).po4a
+        @@endnotes={ para: [], end: [] }
+      end
+    end
+    class Output <Source
+      include SiSU_Param
+      include SiSU_Env
+      def initialize(fn,content,md,process=:complete)
+        @fn,@content,@md,@process=fn,content,md,process
+        @file=SiSU_Env::FileOp.new(md,fn)
+      end
+      def po4a                                                                 #%pot output
+        file_pot=@file.write_file.po4a_sst
+        #file_pot=(@md.opt.f_pth[:lng] == @md.opt.lng_base) \
+        #? @file.write_file.pot
+        #: @file.write_file.po
+        @sisu=[]
+        emptyline=0
+        @content.each do |para|                                                # this is a hack
+          if para.is_a?(Array) \
+          and para.length > 0
+            para.each do |line|
+              if line
+                line=line.gsub(/\s+$/m,'').
+                  gsub(/^\A[ ]*\Z/m,'')
+                if line=~/^\A[ ]*\Z/m
+                  emptyline+=1
+                else emptyline=0
+                end
+                file_pot.puts line if emptyline < 2                     #remove extra line spaces (fix upstream)
+              end
+            end
+          else file_pot.puts para          #unix plaintext # /^([*=-]|\.){5}/
+          end
+        end
+        file_pot.close
+        SiSU_Po4aUtils::PotNumber.new.reset
+        #po4a_git
+      end
+      def po4a_git
+        unless @md.opt.act[:maintenance][:set]==:on
+          require_relative 'git'                           # git.rb
+          git=SiSU_Git::Source.new(@md.opt,@process)
+          unless FileTest.directory?(@file.output_path.pot_git.dir)
+            git.create_file_structure_git
+          end
+          if @md.opt.f_pth[:lng] == @md.opt.lng_base
+            FileUtils::cp(
+              @file.place_file.pot.dir,
+              @file.output_path.pot_git.dir
+            )
+          else # naive, work on -->
+            FileUtils::cp(
+              @file.place_file.po.dir,
+              @file.output_path.po_git.dir
+            ) #unless FileTest.file?(@file.place_file.po_git.dir)
+          end
+          git.read
+        end
+      end
+    end
+  end
+end
+__END__
+REMOVE
+&#033;\|&#035;\|&&#042;\|&#045;\|&#047;\|&#095;\|&#123;\|&#125;\|&#126;\|&#
+
+tables are problematic, difficult to reconstitute instruction, check
+
+metadata, move to top? and work on
+
+footnotes, different types, asterisk, also do you want to have separate
+paragraphs, or breaks within one block?
+
+where no ocn appropriately use ~# or -# or indeed 1~name-
+
+comments in document, what to do about them, not sure they are currently
+retained in dal, could be quite valuable to keep
+
+Translate Shell
+http://www.soimort.org/translate-shell/
+translate.google.com
diff --git a/lib/sisu/develop/src_po4a_sst_ao_sst_set.rb b/lib/sisu/develop/src_po4a_sst_ao_sst_set.rb
new file mode 100644 (file)
index 0000000..4663086
--- /dev/null
@@ -0,0 +1,284 @@
+# encoding: utf-8
+=begin
+
+* Name: SiSU
+
+** Description: documents, structuring, processing, publishing, search
+*** po4a
+
+** Author: Ralph Amissah
+  <ralph@amissah.com>
+  <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 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>
+
+** Git
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/src_po4a_sst_ao_sst_set.rb;hb=HEAD>
+
+=end
+module SiSU_Po4aUtils
+  class Wrap
+    def initialize(md,orig='',trans='',n_char_max=76,n_indent=0,n_hang=nil)
+      @md,@orig,@trans,@n_char_max,@n_indent=
+       md, orig, trans, n_char_max, n_indent
+      @n_char_max_extend = n_char_max
+      @br="\n"
+      @n_hang=n_hang ? n_hang : @n_indent
+      @po4a_identify_type='type: SiSU doc'
+      #@po4a_identify_type='type: Plain text'
+    end
+    def line_wrap
+      space=' '
+      spaces_indent,spaces_hang=
+        "#{@br}#{space*@n_indent}",space*@n_hang
+      pot,i=[],0
+      pot_array=(@trans.empty?) ? [@orig] : [@orig,@trans]
+      pot_array.each do |pa|
+        line=0
+        out=[]
+        out[line]=''
+        @oldword='' #REMOVE @oldword
+        pa=pa.gsub(/<br>/,' <br> ').
+          gsub(/#{Mx[:br_nl]}/,"\n\n")
+        words=pa.scan(/\n\n|\\\\\\|<br>|\S+/m)
+        while words != ''
+          word=words.shift
+          if not word
+            out[line] unless out[line].empty? #check
+            break
+          elsif word =~/\n\n/
+            word="\n"
+            @n_char_max_extend = @n_char_max + out[line].length
+            line=line
+          elsif (out[line].length + word.length) > (@n_char_max_extend - @n_indent) \
+          and out[line] =~/\S+/
+            @n_char_max_extend = @n_char_max
+            out[line].squeeze!(' ')
+            line += 1
+          end
+          if word
+            out[line]=if out[line] \
+            and out[line] !~/\S+$/m
+              "#{out[line]}#{word}"
+            elsif out[line] \
+            and out[line] =~/\S+/
+              "#{out[line]} #{word}"
+            else "#{word.strip}"
+            end
+          end
+          @oldword=word if word =~/\S+/
+        end
+        x=out.join(spaces_indent).gsub(/\A\n+/m,'').insert(0,spaces_hang)
+        z=[]
+        x.split(/\n/).each do |y|
+          z << y
+        end
+        pot[i]=z.join("\n")
+        i +=1
+        pot
+      end
+      trans=(pot.length == 2) ? pot[1] : ''
+      po_str=<<WOK
+#{pot[0]}
+WOK
+#{trans}
+      po_str
+    end
+    def no_line_wrap_block
+      pot,i=[],0
+      pot_array=(@trans.empty?) ? [@orig] : [@orig,@trans]
+      pot_array.each do |pa|
+        z=[]
+        pa.split(/\n\n/).each do |y|
+          z << y if not y.empty?
+        end
+        pot[i]=z.join("\n")
+        i +=1
+        pot
+      end
+      trans=(pot.length == 2) ? pot[1] : ''
+      po_str=<<WOK
+#{pot[0]}
+WOK
+#{trans}
+      po_str
+    end
+    def line_wrap_indent1
+      @n_indent,@n_hang=2,2
+      line_wrap
+    end
+    def line_wrap_endnote
+      @n_indent,@n_hang=4,2
+      line_wrap
+    end
+    def array_wrap
+      if @orig.is_a?(Array)
+        @arr=[]
+        @orig.each do |line|
+          @arr << SiSU_TextUtils::Wrap.new(line,@n_char_max,@n_indent,@n_hang).line_wrap
+        end
+      end
+      @arr
+    end
+  end
+  class HeaderScan
+    def initialize(md,para)
+      @md,@p=md,para
+    end
+    def extract(tag,tag_content,type,attrib)
+      if dc_tag \
+      and dc_content
+        [dc_tag,dc_content,{dc_tag=>dc_content}]
+      else nil
+      end
+    end
+    def header(tag,tag_content,type='',attrib='') #this will break stuff and must be tested thoroughly 20060825
+      @tag,@tag_content,@type,@attrib=tag,tag_content,type,attrib
+      def label #element
+        @tag
+      end
+      def type
+        @type
+      end
+      def text
+        @tag_content
+      end
+      def info  #element text
+        @tag_content
+      end
+      def attribute
+        @attrib
+      end
+      def element
+        @tag
+      end
+      def attrib
+        @attrib
+      end
+      def el
+        @tag
+      end
+      self
+    end
+    def start_is_match
+      case @p
+      when /^#{Mx[:meta_o]}(title)#{Mx[:meta_c]}\s*(.+?)$/                      then header($1,@md.title.full,'meta','dc') #dc 1
+      when /^#{Mx[:meta_o]}(creator|author)#{Mx[:meta_c]}\s*(.+?)$/             then header('creator',$2,'meta','dc')    #dc 2
+      when /^#{Mx[:meta_o]}(subject)#{Mx[:meta_c]}\s*(.+?)$/                    then header($1,$2,'meta','dc')           #dc 3
+      when /^#{Mx[:meta_o]}(description)#{Mx[:meta_c]}\s*(.+?)$/                then header($1,$2,'meta','dc')           #dc 4
+      when /^#{Mx[:meta_o]}(publisher)#{Mx[:meta_c]}\s*(.+?)$/                  then header($1,$2,'meta','dc')           #dc 5
+      when /^#{Mx[:meta_o]}(contributor)#{Mx[:meta_c]}\s*(.+?)$/                then header($1,$2,'meta','dc')           #dc 6
+      when /^#{Mx[:meta_o]}(date)#{Mx[:meta_c]}\s*(.+?)$/                       then header($1,$2,'meta','dc')           #dc 7
+      when /^#{Mx[:meta_o]}(date\.created)#{Mx[:meta_c]}\s*(.+?)$/              then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(date\.issued)#{Mx[:meta_c]}\s*(.+?)$/               then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(date\.available)#{Mx[:meta_c]}\s*(.+?)$/            then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(date\.valid)#{Mx[:meta_c]}\s*(.+?)$/                then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(date\.modified)#{Mx[:meta_c]}\s*(.+?)$/             then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(type)#{Mx[:meta_c]}\s*(.+?)$/                       then header($1,$2,'meta','dc')           #dc 8
+      when /^#{Mx[:meta_o]}(format)#{Mx[:meta_c]}\s*(.+?)$/                     then header($1,$2,'meta','dc')           #dc 9
+      when /^#{Mx[:meta_o]}(identifier)#{Mx[:meta_c]}\s*(.+?)$/                 then header($1,$2,'meta','dc')           #dc 10
+      when /^#{Mx[:meta_o]}(source)#{Mx[:meta_c]}\s*(.+?)$/                     then header($1,$2,'meta','dc')           #dc 11
+      when /^#{Mx[:meta_o]}(language)#{Mx[:meta_c]}\s*(.+?)$/                   then header($1,$2,'meta','dc')           #dc 12
+      when /^#{Mx[:meta_o]}(relation)#{Mx[:meta_c]}\s*(.+?)$/                   then header($1,$2,'meta','dc')           #dc 13
+      when /^#{Mx[:meta_o]}(coverage)#{Mx[:meta_c]}\s*(.+?)$/                   then header($1,$2,'meta','dc')           #dc 14
+      when /^#{Mx[:meta_o]}(rights)#{Mx[:meta_c]}\s*(.+?)$/                     then header($1,$2,'meta','dc')           #dc 15
+      when /^#{Mx[:meta_o]}(keywords)#{Mx[:meta_c]}\s*(.+?)$/                   then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(copyright)#{Mx[:meta_c]}\s*(.+?)$/                  then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(translator|translated_by)#{Mx[:meta_c]}\s*(.+?)$/   then header('translator',$2)
+      when /^#{Mx[:meta_o]}(illustrator|illustrated_by)#{Mx[:meta_c]}\s*(.+?)$/ then header('illustrator',$2)
+      when /^#{Mx[:meta_o]}(prepared_by)#{Mx[:meta_c]}\s*(.+?)$/                then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(digitized_by)#{Mx[:meta_c]}\s*(.+?)$/               then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(comments?)#{Mx[:meta_c]}\s*(.+?)$/                  then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(abstract)#{Mx[:meta_c]}\s*(.+?)$/                   then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(tags?)#{Mx[:meta_c]}\s*(.+?)$/                      then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(catalogue)#{Mx[:meta_c]}\s*(.+?)$/                  then header($1,$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(class(?:ify)?_loc)#{Mx[:meta_c]}\s*(.+?)$/          then header('classify_loc',$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(class(?:ify)?_dewey)#{Mx[:meta_c]}\s*(.+?)$/        then header('classify_dewey',$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(class(?:ify)?_pg)#{Mx[:meta_c]}\s*(.+?)$/           then header('classify_pg',$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(class(?:ify)?_isbn)#{Mx[:meta_c]}\s*(.+?)$/         then header('classify_isbn',$2,'meta','extra')
+      when /^#{Mx[:meta_o]}(toc|structure)#{Mx[:meta_c]}\s*(.+?)$/              then header('structure',$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(level|page|markup)#{Mx[:meta_c]}\s*(.+?)$/          then header('markup',$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(bold)#{Mx[:meta_c]}\s*(.+?)$/                       then header($1,$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(italics|itali[sz]e)#{Mx[:meta_c]}\s*(.+?)$/         then header('italicize',$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(vocabulary|wordlist)#{Mx[:meta_c]}\s*(.+?)$/        then header('vocabulary',$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(css|stylesheet)#{Mx[:meta_c]}\s*(.+?)$/             then header('css',$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(links)#{Mx[:meta_c]}\s*(.+?)$/                      then header($1,$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(prefix)#{Mx[:meta_c]}\s*(.+?)$/                     then header($1,$2,'process','instruct') #add a & b
+      when /^#{Mx[:meta_o]}(suffix)#{Mx[:meta_c]}\s*(.+?)$/                     then header($1,$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(information)#{Mx[:meta_c]}\s*(.+?)$/                then header($1,$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(contact)#{Mx[:meta_c]}\s*(.+?)$/                    then header($1,$2,'process','instruct')
+      when /^#{Mx[:meta_o]}(rcs|cvs)#{Mx[:meta_c]}\s*(.+?)$/                    then header('version',$2,'process','instruct')
+      else nil
+      end
+    end
+    def dublin
+      (@p =~/^#{Mx[:meta_o]}\S+?#{Mx[:meta_c]}/) \
+      ? start_is_match
+      : nil
+    end
+    def meta
+      (@p =~/^#{Mx[:meta_o]}\S+?#{Mx[:meta_c]}/) \
+      ? start_is_match
+      : nil
+    end
+  end
+  class ParagraphNumber
+    def initialize(paranum)
+      @paranum=/(\d+)/m.match(paranum)[1]
+    end
+    def display
+      @paranum.gsub(/(\d+)/,'#\1')
+    end
+  end
+  class PotNumber
+    @@n=0
+    def initialize
+      @@n +=2
+    end
+    def num
+      @@n
+    end
+    def reset
+      @@n=0
+    end
+  end
+end
+__END__
diff --git a/lib/sisu/develop/src_po4a_sstm.rb b/lib/sisu/develop/src_po4a_sstm.rb
new file mode 100644 (file)
index 0000000..74c5ac2
--- /dev/null
@@ -0,0 +1,135 @@
+# encoding: utf-8
+=begin
+
+* Name: SiSU
+
+** Description: documents, structuring, processing, publishing, search
+*** share sisu source markup file, copy it to output directory!
+
+** Author: Ralph Amissah
+  <ralph@amissah.com>
+  <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 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>
+
+** Git
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/src_po4a_sstm.rb;hb=HEAD>
+
+=end
+module SiSU_Markup
+  require_relative 'src_shared'                         # src_shared.rb
+    include SiSU_Source
+  require_relative 'src_po4a_share'                     # src_po4a_share.rb
+  require_relative 'se'                                 # se.rb
+    include SiSU_Env
+  class Source_Po4a < SiSU_Source::SiSUpodSource
+    def initialize(opt,build=nil,place=nil)
+      super(opt,build,place)
+      @opt=opt
+      md=SiSU_Param::Parameters.new(opt).get
+      @file=SiSU_Env::FileOp.new(md,opt.fno)
+    end
+    def dir_mk(dir)
+      unless FileTest.directory?(dir)
+        FileUtils::mkdir_p(dir)
+      end
+    end
+    def make_paths
+      dir_mk(@file.output_path.pot.dir)
+      dir_mk(@file.output_path.po.dir)
+    end
+    def language
+      def source_language_selected_str
+        @opt.act[:po4a_lang][:src] \
+        ? @opt.act[:po4a_lang][:src]
+        : 'en'
+      end
+      self
+    end
+    def read
+      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],
+            'Share document markup text source',
+            @opt.fns
+          ).cyan_hi_blue
+        : SiSU_Screen::Ansi.new(
+            @opt.act[:color_state][:set],
+            'Share document markup text source',
+            @opt.fns
+          ).cyan_title_hi
+      end
+      make_paths
+      if FileTest.directory?(@path_pod[:fnb])
+        FileUtils::mkdir_p(@file.output_path.src.dir) \
+          unless FileTest.directory?(@file.output_path.src.dir)
+        v=(@opt.act[:maintenance][:set]==:on) \
+        ? 'v' : ''
+        system(%{
+          #rsync -a#{v} #{@path_pod[:fnb]}/sisupod/doc/* #{@file.output_path.po4a.dir}
+          rsync -a#{v} #{@path_pod[:fnb]}/sisupod/doc/#{language.source_language_selected_str}* #{@file.output_path.po4a.dir}
+          chbk=`pwd`
+          cd #{@file.output_path.sisupod.dir}
+          for I in `find -type d` ; do chmod 755 $I ; done
+          for I in `find -type f` ; do chmod 644 $I ; done
+          cd ${chbk}
+        })
+        md=SiSU_Param::Parameters.new(@opt).get
+        file=SiSU_Env::FileOp.new(md)
+        SiSU_Po4a_Project::Po4aCfg.new(@opt,file).song
+        SiSU_Po4a_Project::Po4aProject.new(@opt,file).song
+      else
+        if (@opt.act[:verbose][:set]==:on \
+        || @opt.act[:verbose_plus][:set]==:on \
+        || @opt.act[:maintenance][:set]==:on)
+          SiSU_Screen::Ansi.new(
+            '',
+            "#{@opt.fno} not available"
+          ).blue_tab
+        end
+      end
+    end
+  end
+end
+__END__
index 948342c77993115e4c9fe2a802fbf48f4c5bf981..150ce84eec2e93bb814460d7757a616bd2a8ed52 100644 (file)
@@ -171,12 +171,16 @@ module SiSU_Source
               )
             else
               STDERR.puts \
-                %{\t*WARN* did not find image - "#{images_pwd}/#{i}" [#{__FILE__}:#{__LINE__}]}
+                %{\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__}]}
+            %{\t*WARN* did not find - } \
+            + %{#{images_pwd} #{@path_pod[:image]} } \
+            + %{[#{__FILE__}:#{__LINE__}]}
         end
       end
       if doc_import_list.length > 0 \
@@ -189,7 +193,9 @@ module SiSU_Source
             )
           else
             STDERR.puts \
-              %{\t*WARN* did not find image - "#{@opt.base_path}#{doc_import_dir}/#{f}" [#{__FILE__}:#{__LINE__}]}
+              %{\t*WARN* did not find image - } \
+              + %{"#{@opt.base_path}#{doc_import_dir}/#{f}" } \
+              + %{[#{__FILE__}:#{__LINE__}]}
           end
         end
       end
@@ -213,7 +219,9 @@ module SiSU_Source
                   )
                 else
                   STDERR.puts \
-                    %{\t*WARN* did not find - "#{@opt.base_path}#{doc_import_dir}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+                    %{\t*WARN* did not find - } \
+                    + %{"#{@opt.base_path}#{doc_import_dir}/#{f[:f]}" } \
+                    + %{[#{__FILE__}:#{__LINE__}]}
                 end
               else
                 if FileTest.file?("#{@opt.base_path}/#{f[:f]}")
@@ -234,7 +242,9 @@ module SiSU_Source
                   end
                 else
                   STDERR.puts \
-                    %{\t*WARN* did not find - "#{@opt.base_path}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+                    %{\t*WARN* did not find - } \
+                    + %{"#{@opt.base_path}/#{f[:f]}" } \
+                    + %{[#{__FILE__}:#{__LINE__}]}
                 end
               end
             end
@@ -247,7 +257,9 @@ module SiSU_Source
                 )
               else
                 STDERR.puts \
-                  %{\t*WARN* did not find - "#{@opt.base_path}#{doc_import_dir}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+                  %{\t*WARN* did not find - } \
+                  + %{"#{@opt.base_path}#{doc_import_dir}/#{f[:f]}" } \
+                  + %{[#{__FILE__}:#{__LINE__}]}
               end
             else
               if FileTest.file?("#{@opt.base_path}#{doc_import_dir}/#{f[:f]}")
@@ -268,7 +280,9 @@ module SiSU_Source
                 end
               else
                 STDERR.puts \
-                  %{\t*WARN* did not find - "#{@opt.base_path}#{doc_import_dir}/#{f[:f]}" [#{__FILE__}:#{__LINE__}]}
+                  %{\t*WARN* did not find - } \
+                  + %{"#{@opt.base_path}#{doc_import_dir}/#{f[:f]}" } \
+                  + %{[#{__FILE__}:#{__LINE__}]}
               end
             end
           end
similarity index 97%
rename from lib/sisu/develop/src_share.rb
rename to lib/sisu/develop/src_sisupod_sstm.rb
index b499ed6ffb895f3432f83d0b78f5154d83c1ec69..e1ffd8cbd512111b2d9a1e9699ffe56d6d2d9dfc 100644 (file)
@@ -51,7 +51,7 @@
 
 ** Git
   <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
-  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/src_share.rb;hb=HEAD>
+  <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/develop/src_sisupod_sstm.rb;hb=HEAD>
 
 =end
 module SiSU_Markup
@@ -59,7 +59,7 @@ module SiSU_Markup
     include SiSU_Source
   require_relative 'se'                                 # se.rb
     include SiSU_Env
-  class Source < SiSU_Source::SiSUpodSource
+  class Source_Sisupod < SiSU_Source::SiSUpodSource
     def initialize(opt,build=nil,place=nil)
       super(opt,build,place)
       @opt=opt
index 6fa28a4bc0d78a688e6f96b4105d9e842e8579e8..85ec13163b12a0959cc395b13da7414b4d20f174 100644 (file)
@@ -658,7 +658,7 @@ module SiSU_Urls
               show.report(report_info.hash_digests)
               #show.maintenance(report_info.hash_digests)
             end
-            if @opt.act[:po4a][:set]==:on
+            if @opt.act[:po4a_shelf][:set]==:on
               #if @opt.fns =~/\S+?~\S{2}(?:_\S{2})?\.ss[mt]/
               #else
               #end