-*- mode: org -*-
#+TITLE:       sisu configure site
#+DESCRIPTION: documents - structuring, various output representations & search
#+FILETAGS:    :sisu:config:
#+AUTHOR:      Ralph Amissah
#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
#+COPYRIGHT:   Copyright (C) 2015 - 2021 Ralph Amissah
#+LANGUAGE:    en
#+STARTUP:     content hideblocks hidestars noindent entitiespretty
#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
#+PROPERTY:    header-args  :exports code
#+PROPERTY:    header-args+ :noweb yes
#+PROPERTY:    header-args+ :eval no
#+PROPERTY:    header-args+ :results no
#+PROPERTY:    header-args+ :cache no
#+PROPERTY:    header-args+ :padline no

* conf.rb

#+BEGIN_SRC ruby  :tangle "../lib/sisu/conf.rb"
# <<sisu_document_header>>
module SiSU_Initialize
  require_relative 'se'                                 # se.rb
    include SiSU_Env
    include SiSU_Screen
  require_relative 'relaxng'                            # relaxng.rb
    include SiSU_Relaxng
  require_relative 'css'                                # css.rb
    include SiSU_Style
  class Source
    def initialize(opt)
      @opt=opt
    end
    def read
      ConfigSite.new(@opt).make_homepage
      ConfigSite.new(@opt).css
      ConfigSite.new(@opt).dtd
      ConfigSite.new(@opt).cp_local_images
      ConfigSite.new(@opt).cp_external_images
      ConfigSite.new(@opt).cp_webserver_images
    end
  end
  class ConfigSite #config files such as css are not updated if they already exist unless forced using the --init=site modifier
    require_relative 'se'                               # se.rb
    def initialize(opt)
      @opt=opt
      @env=SiSU_Env::InfoEnv.new(@opt.fns)
      @suffix={
        rnc: 'rnc',
        rng: 'rng',
        xsd: 'xsd',
      }
      @path={
        xml: @env.path.output + '/_sisu/xml',
        xsd: @env.path.output + '/_sisu/xml/xsd',
        rnc: @env.path.output + '/_sisu/xml/rnc',
        rng: @env.path.output + '/_sisu/xml/rng',
        style: @env.path.output + '/' + @env.path.style,
      }
      @pwd,@home=Dir.pwd,@env.path.home
    end
    def make_homepage
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Make homepage',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).homepage
    end
    def cp_local_images
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Copy images',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_local_images
      SiSU_Env::CreateSite.new(@opt).cp_webserver_images_local #this should not have been necessary
      SiSU_Env::CreateSite.new(@opt).cp_base_images #base images (nav etc.) used by all html
    end
    def cp_external_images
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Copy external images',
        ''
      ).colorize if @opt.act[:verbose_plus][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_external_images
    end
    def cp_webserver_images
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Copy webserver/output file images',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_webserver_images
    end
    def css
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Configuring CSSs',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      SiSU_Env::CreateSite.new(@opt).cp_css
    end
    def dtd
      SiSU_Screen::Ansi.new(
        @opt.act[:color_state][:set],
        'invert',
        'Configuring DTDs',
        ''
      ).colorize unless @opt.act[:quiet][:set]==:on
      @rxng=SiSU_Relaxng::RelaxNG.new
      @path.each { |d| FileUtils::mkdir_p(d[1]) \
      unless FileTest.directory?(d[1]) }
      #ugly code, sort later
      if @rxng.methods.join =~/[^_]dtd_sax\b/
        if @rxng.dtd_sax.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.output_sax}",'w')
          dtd << @rxng.dtd_sax
          dtd.close
        else trang_rnc_model_output_sax
        end
      else trang_rnc_model_output_sax
      end
      if @rxng.methods.join =~/[^_]dtd_dom\b/
        if @rxng.dtd_dom.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.output_dom}",'w')
          dtd << @rxng.dtd_dom
          dtd.close
        else trang_rnc_model_output_dom
        end
      else trang_rnc_model_output_dom
      end
      if @rxng.methods.join =~/[^_]dtd_node\b/
        if @rxng.dtd_node.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.input_node}",'w')
          dtd << @rxng.dtd_node
          dtd.close
        else trang_rnc_model_input_node
        end
      else trang_rnc_model_input_node
      end
      if @rxng.methods.join =~/[^_]dtd_xhtml\b/
        if @rxng.dtd_xhtml.length > 200
          dtd=File.new("#{@path[:style]}/#{@rxng.rng_name.output_xhtml}",'w')
          dtd << @rxng.dtd_xhtml
          dtd.close
        else trang_rnc_model_output_xhtml
        end
      else trang_rnc_model_output_xhtml
      end
    end
    def trang_rnc_model_output_sax
      s=@suffix
      rnc_src=@env.processing_path.ao + '/sax.' + s[:rnc]
      rnc_file=@path[:rnc] + '/' + @rxng.rnc_name.output_sax
      rng_file=@path[:rng] + '/' + @rxng.rng_name.output_sax
      xsd_file=@path[:xsd] + '/' + @rxng.xsd_name.output_sax
      rnc=File.new(rnc_src,'w')
      rnc << @rxng.rnc_model_output_sax
      rnc.close
      #xsd
      schema=SiSU_Env::SystemCall.new(rnc_src,xsd_file)
      schema.relaxng(@opt.selections.str)
      #rng
      schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
      schema.relaxng(@opt.selections.str)
      #rnc
      if FileTest.file?(rnc_src)
        FileUtils::cp(rnc_src,rnc_file)
        FileUtils::chmod(0644,rnc_file)
      else STDERR.puts %{\t*WARN* did not find rnc - "#{rnc_src}" [#{__FILE__}:#{__LINE__}]}
      end
    end
    def trang_rnc_model_output_dom
      s=@suffix
      rnc_src=@env.processing_path.ao + '/dom.' + s[:rnc]
      rnc_file=@path[:rnc] + '/' + @rxng.rnc_name.output_dom
      rng_file=@path[:rng] + '/' + @rxng.rng_name.output_dom
      xsd_file=@path[:xsd] + '/' + @rxng.xsd_name.output_dom
      rnc=File.new(rnc_src,'w')
      rnc << @rxng.rnc_model_output_dom
      rnc.close
      #xsd
      schema=SiSU_Env::SystemCall.new(rnc_src,xsd_file)
      schema.relaxng(@opt.selections.str)
      #rng
      schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
      schema.relaxng(@opt.selections.str)
      #rnc
      if FileTest.file?(rnc_src)
        FileUtils::cp(rnc_src,rnc_file)
        FileUtils::chmod(0644,rnc_file)
      else STDERR.puts %{\t*WARN* did not find rnc - "#{rnc_src}" [#{__FILE__}:#{__LINE__}]}
      end
    end
    def trang_rnc_model_output_xhtml
      s=@suffix
      rnc_src=@env.processing_path.ao + '/xhtml.' + s[:rnc]
      rnc_file=@path[:rnc] + '/' + @rxng.rnc_name.output_xhtml
      rng_file=@path[:rng] + '/' + @rxng.rng_name.output_xhtml
      xsd_file=@path[:xsd] + '/' + @rxng.xsd_name.output_xhtml
      rnc=File.new(rnc_src,'w')
      rnc << @rxng.rnc_model_output_xhtml
      rnc.close
      #xsd
      schema=SiSU_Env::SystemCall.new(rnc_src,xsd_file)
      schema.relaxng(@opt.selections.str)
      #rng
      schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
      schema.relaxng(@opt.selections.str)
      #rnc
      if FileTest.file?(rnc_src)
        FileUtils::cp(rnc_src,rnc_file)
        FileUtils::chmod(0644,rnc_file)
      else STDERR.puts %{\t*WARN* did not find rnc - "#{rnc_src}" [#{__FILE__}:#{__LINE__}]}
      end
    end
    def trang_rnc_model_input_sax
      rnc_file=@env.processing_path.ao + '/sax.rnc'
      dtd_file=@path[:xsd] + '/' + @rxng.rng_name.input_sax
      rnc=File.new(rnc_file,'w')
      rnc << @rxng.rnc_model_output_sax
      rnc.close
      schema=SiSU_Env::SystemCall.new(rnc_file,dtd_file)
      schema.relaxng(@opt.selections.str)
    end
    def trang_rnc_model_input_dom
      rnc_file=@env.processing_path.ao + '/dom.rnc'
      dtd_file=@path[:xsd] + '/' + @rxng.rng_name.input_dom
      rnc=File.new(rnc_file,'w')
      rnc << @rxng.rnc_model_output_dom
      rnc.close
      schema=SiSU_Env::SystemCall.new(rnc_file,dtd_file)
      schema.relaxng(@opt.selections.str)
    end
    def trang_rnc_model_input_node
      rnc_file=@env.processing_path.ao + '/node.rnc'
      dtd_file=@path[:xsd] + '/' + @rxng.rng_name.input_node
      rnc=File.new(rnc_file,'w')
      rnc << @rxng.rnc_model_input_node
      rnc.close
      schema=SiSU_Env::SystemCall.new(rnc_file,dtd_file)
      schema.relaxng(@opt.selections.str)
    end
  end
end
__END__
#+END_SRC

* document header

#+NAME: sisu_document_header
#+BEGIN_SRC text
encoding: utf-8
- Name: SiSU

  - Description: documents, structuring, processing, publishing, search
    config

  - Author: Ralph Amissah
    <ralph.amissah@gmail.com>

  - Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
    2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019,
    2020, 2021, Ralph Amissah,

  - License: GPL 3 or later:

    SiSU, a framework for document structuring, publishing and search

    Copyright (C) Ralph Amissah

    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the Free
    Software Foundation, either version 3 of the License, or (at your option)
    any later version.

    This program is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
    more details.

    You should have received a copy of the GNU General Public License along with
    this program. If not, see <http://www.gnu.org/licenses/>.

    If you have Internet connection, the latest version of the GPL should be
    available at these locations:
    <http://www.fsf.org/licensing/licenses/gpl.html>
    <http://www.gnu.org/licenses/gpl.html>

    <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html>

  - SiSU uses:
    - Standard SiSU markup syntax,
    - Standard SiSU meta-markup syntax, and the
    - Standard SiSU object citation numbering and system

  - Homepages:
    <http://www.sisudoc.org>

  - Git
    <https://git.sisudoc.org/projects/>
    <https://git.sisudoc.org/projects/?p=software/sisu.git;a=summary>
    <https://git.sisudoc.org/projects/?p=markup/sisu-markup-samples.git;a=summary>
#+END_SRC