#!/usr/bin/env ruby
# encoding: utf-8
#SiSU: copyright (C) 1997 - 2014 Ralph Amissah; License GPL 3, see appended program information
class Orient
  require 'singleton'
  include Singleton
  def initialize #(called_as_,argv)
    super()
    @called_as,@argv=$0,$*
  end
  def version
    def stable
     '5'
    end
    def unstable
     '6'
    end
    def default
     stable
    end
    self
  end
  def sisu_called_from_directory
    @@sisu_called_from_directory ||= Dir.pwd
  end
  def sisu_run_from
    if processing.called_as == processing.file_full_path \
    and File.dirname(processing.file_full_path) != Config::CONFIG['bindir']
      :full_path_to_sisu_bin_in_sisu_dir_tree
    elsif processing.file_full_path =~/\/gems\// \
    and  processing.file_full_path =~/\/sisu-[#{version.stable}#{version.unstable}]\.(?:\d+|[a-z])\.(?:\d+|[a-z])\//
      :gem_install
    else
      :system_install
    end
  end
  def processing
    def called_as
      @called_as
    end
    def argv
      @argv
    end
    def argv_str
      argv.inspect
    end
    def file_full_path
      __FILE__
    end
    def stable
      'v' + version.stable
    end
    def unstable
      'v' + version.unstable
    end
    def default
      'v' + version.default
    end
    def stable_bin_file_regex
      %r{\bsisu#{version.stable}$}
    end
    def unstable_bin_file_regex
      %r{\bsisu#{version.unstable}$}
    end
    def stable_gem_regex
      %r{\/sisu-#{version.stable}\.(?:\d+|[a-z])\.(?:\d+|[a-z])\/}
    end
    def unstable_gem_regex
      %r{\/sisu-#{version.unstable}\.(?:\d+|[a-z])\.(?:\d+|[a-z])\/}
    end
    def stable_modifier_regex
      %r{"(?:--v#{version.stable}|--current|--stable)"}
    end
    def unstable_modifier_regex
      %r{"(?:--v#{version.unstable}|--current|--stable)"}
    end
    self
  end
  def sisu_lib
    "sisu/#{select_version_check}"
  end
  def sisu_path_lib
    if sisu_path_specified_lib \
    && FileTest.file?("#{sisu_path_specified_lib}/#{sisu_lib}/hub.rb")
      "#{sisu_path_specified_lib}/#{sisu_lib}"
    else sisu_lib
    end
  end
  def sisu_version_info_path
    "#{sisu_path_base_system_data}/#{select_version_check}/v/version.yml"
  end
  def select_version_check
    if sisu_run_from == :full_path_to_sisu_bin_in_sisu_dir_tree \
    or sisu_run_from == :system_install
      case processing.called_as
      when processing.stable_bin_file_regex         then processing.stable
      when processing.unstable_bin_file_regex       then processing.unstable
      else
        case processing.argv_str
        when processing.stable_modifier_regex       then processing.stable
        when processing.unstable_modifier_regex     then processing.unstable
        else                                             processing.default
        end
      end
    elsif sisu_run_from == :gem_install
      case processing.file_full_path
      when processing.stable_gem_regex              then processing.stable
      when processing.unstable_gem_regex            then processing.unstable
      else                                               processing.default
      end
    else                                                 processing.default
    end
  end
  def paths_set
    if sisu_run_from == :system_install \
    and processing.called_as =~ /^#{Config::CONFIG['bindir']}\/sisu[#{version.stable}#{version.unstable}]?$/
      :set_path_system
    elsif sisu_run_from == :full_path_to_sisu_bin_in_sisu_dir_tree \
    and processing.called_as !~ /^#{Config::CONFIG['bindir']}\/sisu[#{version.stable}#{version.unstable}]?$/ \
    && File.expand_path(processing.called_as) =~/bin\/sisu[#{version.stable}#{version.unstable}]?$/ \
    && FileTest.file?(processing.called_as)
      :set_dir_tree_full_path
    elsif sisu_run_from==:gem_install
      :set_gem_path
    else nil
    end
  end
  def sisu_path_base
    case paths_set
    when :set_path_system
      Config::CONFIG['datadir'] + '/sisu'
    when :set_dir_tree_full_path
      File.expand_path(processing.called_as).sub(/\/bin\/sisu[#{version.stable}#{version.unstable}]?$/,'')
    when :set_gem_path
      Gem::Specification.find_by_name("sisu").gem_dir
    else nil
    end
  end
  def sisu_path_base_system_data
    case paths_set
    when :set_path_system
      Config::CONFIG['datadir'] + '/sisu'
    when :set_dir_tree_full_path
      File.expand_path(processing.called_as).sub(/\/bin\/sisu[#{version.stable}#{version.unstable}]?$/,'/data/sisu')
    when :set_gem_path
      Gem::Specification.find_by_name("sisu").gem_dir + '/data/sisu'
    else nil
    end
  end
  def sisu_path_specified_lib
    if (processing.called_as !~ /^#{Config::CONFIG['bindir']}\/sisu[#{version.stable}#{version.unstable}]?$/)
      File.expand_path(processing.called_as).sub(/bin\/sisu[#{version.stable}#{version.unstable}]?$/,'lib')
    else nil
    end
  end
  def language_list
    def codes
      %w[am bg bn br ca cs cy da de el en eo es et eu fi fr ga gl he hi hr hy ia is it ja ko la lo lt lv ml mr nl nn no oc pl pt pt_BR ro ru sa se sk sl sq sr sv ta te th tk tr uk ur us vi zh]
    end
    def regex
      codes.join('|')
    end
    self
  end
  def sisu_is
    {
      run_from:              sisu_run_from,
      version_dir:           select_version_check,
      path_base:             sisu_path_base,
      path_base_system_data: sisu_path_base_system_data,
      path_lib:              sisu_path_lib,
      version_info_path:     sisu_version_info_path,
      language_list:         language_list.codes,
    }
  end
  def get_processing_info
    def sortout
      unless @clm_pf
        processing_files={}
        command_line_modifiers=[]
        processing.argv.each do |x|
          if x =~/^-+/
            command_line_modifiers << x
          elsif x =~/\.ss[tm]/
            if x =~/\//
              markup_path,markup_file =(/(\S+\/)((?:#{language_list.regex})?[^\/]+)/).match(x)[1,2]
              if not processing_files[markup_path]
                processing_files[markup_path]=[]
              end
              processing_files[markup_path] << markup_file
            else
              if not processing_files['./']
                processing_files['./']=[]
              end
              processing_files['./'] << x
            end
          end
        end
      end
      @clm_pf ||={
        command_line_modifiers: command_line_modifiers,
        processing_files:       processing_files,
      }
    end
    def command_line_modifiers
      sortout[:command_line_modifiers]
    end
    def processing_files
      sortout[:processing_files]
    end
    self
  end
  def control
    require "#{sisu_is[:path_lib]}/hub"
    if get_processing_info.processing_files. length > 0
      get_processing_info.processing_files.each_pair do |markup_dir,markup_file|
        $sisu_document_markup_directory=markup_dir.gsub(/\/$/,'')
        argv_sub=get_processing_info.command_line_modifiers + markup_file
        if FileTest.directory?(markup_dir)
          system("cd #{markup_dir}")
          Dir.chdir(markup_dir)
          $sisu_document_markup_directory_base_fixed_path=Dir.pwd.gsub(/\/(?:#{language_list.regex})$/,'')
          SiSU::HubMaster.new(argv_sub)
        elsif markup_dir =~/https?:/
          markup_file.each do |mf|
            (FileTest.file?(mf)) \
            ? (puts 'requested remote file already exists in current directory ' + Dir.pwd + ' using ' + mf)
            : (system("wget #{markup_dir}/#{mf}"))
          end
          $sisu_document_markup_directory_base_fixed_path=Dir.pwd.gsub(/\/(?:#{language_list.regex})$/,'')
          argv_sub=command_line_modifiers + markup_file
          SiSU::HubMaster.new(argv_sub)
        else p "Error directory specified #{markup_dir} not found"
        end
        Dir.chdir(sisu_called_from_directory)
        system("cd #{sisu_called_from_directory}")
      end
    else
      $sisu_document_markup_directory=Dir.pwd.gsub(/\/$/,'')
      $sisu_document_markup_directory_base_fixed_path=Dir.pwd.gsub(/(^|\/)(?:#{language_list.regex})$/,'')
      SiSU::HubMaster.new(processing.argv)
    end
  end
end
#% sisu select source & branch, begin
$VERBOSE=nil
require 'rbconfig'
require 'rubygems'
begin
  require 'singleton'
  s=Orient.instance
  SiSU_is=s.sisu_is
  s.control
rescue #% -
  STDERR.puts 'ERROR'
  STDERR.puts $!
  STDERR.puts $@
  puts %{
                   #{%x{ruby -v}.strip.to_s}
                   #{RUBY_VERSION}
    ruby version:  #{Config::CONFIG['RUBY_PROGRAM_VERSION']}p#{Config::CONFIG['PATCHLEVEL']}
    ruby named:    #{Config::CONFIG['ruby_version']}
    rubylib:       #{Config::CONFIG['rubylibdir']}
    rubylib local: #{Config::CONFIG['sitelibdir']}
    gem dir:       #{Gem.dir}
    gem path:      #{Gem.path}
  }
  system(%{echo "
    system RUBYPATH: ${RUBYPATH}
    system RUBYLIB:  ${RUBYLIB}
  "})
end
__END__

 * 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, 2013, 2014 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>

 * Git
   <http://sources.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
   <http://sources.sisudoc.org/?p=code/sisu.git;a=blob;f=bin/sisu;hb=HEAD>

 * Ralph Amissah
   <ralph@amissah.com>
   <ralph.amissah@gmail.com>