summaryrefslogtreecommitdiffstats
path: root/lib/sisu/v6
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sisu/v6')
-rw-r--r--lib/sisu/v6/air.rb86
-rw-r--r--lib/sisu/v6/ao.rb538
-rw-r--r--lib/sisu/v6/ao_character_check.rb108
-rw-r--r--lib/sisu/v6/ao_doc_objects.rb490
-rw-r--r--lib/sisu/v6/ao_doc_str.rb1472
-rw-r--r--lib/sisu/v6/ao_endnotes.rb129
-rw-r--r--lib/sisu/v6/ao_expand_insertions.rb451
-rw-r--r--lib/sisu/v6/ao_hash_digest.rb158
-rw-r--r--lib/sisu/v6/ao_idx.rb327
-rw-r--r--lib/sisu/v6/ao_images.rb166
-rw-r--r--lib/sisu/v6/ao_metadata.rb83
-rw-r--r--lib/sisu/v6/ao_misc_arrange.rb158
-rw-r--r--lib/sisu/v6/ao_numbering.rb487
-rw-r--r--lib/sisu/v6/ao_syntax.rb632
-rw-r--r--lib/sisu/v6/author_format.rb117
-rw-r--r--lib/sisu/v6/cgi.rb91
-rw-r--r--lib/sisu/v6/cgi_pgsql.rb297
-rw-r--r--lib/sisu/v6/cgi_sql_common.rb1086
-rw-r--r--lib/sisu/v6/cgi_sqlite.rb258
-rw-r--r--lib/sisu/v6/composite.rb263
-rw-r--r--lib/sisu/v6/concordance.rb381
-rw-r--r--lib/sisu/v6/conf.rb258
-rw-r--r--lib/sisu/v6/constants.rb369
-rw-r--r--lib/sisu/v6/css.rb3444
-rw-r--r--lib/sisu/v6/db_columns.rb2002
-rw-r--r--lib/sisu/v6/db_create.rb644
-rw-r--r--lib/sisu/v6/db_dbi.rb97
-rw-r--r--lib/sisu/v6/db_drop.rb196
-rw-r--r--lib/sisu/v6/db_import.rb803
-rw-r--r--lib/sisu/v6/db_indexes.rb125
-rw-r--r--lib/sisu/v6/db_load_tuple.rb329
-rw-r--r--lib/sisu/v6/db_remove.rb129
-rw-r--r--lib/sisu/v6/db_select.rb225
-rw-r--r--lib/sisu/v6/db_sqltxt.rb134
-rw-r--r--lib/sisu/v6/db_tests.rb121
-rw-r--r--lib/sisu/v6/dbi.rb149
-rw-r--r--lib/sisu/v6/dbi_discrete.rb185
-rw-r--r--lib/sisu/v6/defaults.rb1212
-rw-r--r--lib/sisu/v6/digests.rb397
-rw-r--r--lib/sisu/v6/embedded.rb155
-rw-r--r--lib/sisu/v6/errors.rb90
-rw-r--r--lib/sisu/v6/git.rb237
-rw-r--r--lib/sisu/v6/harvest.rb117
-rw-r--r--lib/sisu/v6/harvest_authors.rb410
-rw-r--r--lib/sisu/v6/harvest_topics.rb834
-rw-r--r--lib/sisu/v6/html.rb748
-rw-r--r--lib/sisu/v6/html_format.rb1437
-rw-r--r--lib/sisu/v6/html_lite_shared.rb326
-rw-r--r--lib/sisu/v6/html_minitoc.rb236
-rw-r--r--lib/sisu/v6/html_promo.rb446
-rw-r--r--lib/sisu/v6/html_scroll.rb230
-rw-r--r--lib/sisu/v6/html_segments.rb647
-rw-r--r--lib/sisu/v6/html_shared.rb69
-rw-r--r--lib/sisu/v6/html_table.rb69
-rw-r--r--lib/sisu/v6/html_tune.rb302
-rw-r--r--lib/sisu/v6/hub.rb797
-rw-r--r--lib/sisu/v6/i18n.rb708
-rw-r--r--lib/sisu/v6/manifest.rb1002
-rw-r--r--lib/sisu/v6/manpage.rb425
-rw-r--r--lib/sisu/v6/manpage_format.rb93
-rw-r--r--lib/sisu/v6/options.rb1204
-rw-r--r--lib/sisu/v6/param.rb1452
-rw-r--r--lib/sisu/v6/param_identify_markup.rb167
-rw-r--r--lib/sisu/v6/param_make.rb670
-rw-r--r--lib/sisu/v6/particulars.rb236
-rw-r--r--lib/sisu/v6/po4a.rb989
-rw-r--r--lib/sisu/v6/po4a_set.rb301
-rw-r--r--lib/sisu/v6/prog_text_translation.rb1708
-rw-r--r--lib/sisu/v6/qrcode.rb737
-rw-r--r--lib/sisu/v6/relaxng.rb1162
-rw-r--r--lib/sisu/v6/remote.rb206
-rw-r--r--lib/sisu/v6/response.rb79
-rw-r--r--lib/sisu/v6/rexml.rb129
-rw-r--r--lib/sisu/v6/screen_text_color.rb478
-rw-r--r--lib/sisu/v6/shared_images.rb142
-rw-r--r--lib/sisu/v6/shared_markup_alt.rb322
-rw-r--r--lib/sisu/v6/shared_metadata.rb1258
-rw-r--r--lib/sisu/v6/shared_sem.rb163
-rw-r--r--lib/sisu/v6/sitemaps.rb221
-rw-r--r--lib/sisu/v6/spell.rb105
-rw-r--r--lib/sisu/v6/src_kdissert_share.rb91
-rw-r--r--lib/sisu/v6/src_share.rb103
-rw-r--r--lib/sisu/v6/src_shared.rb313
-rw-r--r--lib/sisu/v6/src_sisupod_make.rb168
-rw-r--r--lib/sisu/v6/sst_convert_markup.rb329
-rw-r--r--lib/sisu/v6/sst_do_inline_footnotes.rb486
-rw-r--r--lib/sisu/v6/sst_from_xml.rb176
-rw-r--r--lib/sisu/v6/sst_identify_markup.rb488
-rw-r--r--lib/sisu/v6/sst_to_s_xml_sax.rb461
-rw-r--r--lib/sisu/v6/sysenv.rb6994
-rw-r--r--lib/sisu/v6/termsheet.rb168
-rw-r--r--lib/sisu/v6/texinfo.rb428
-rw-r--r--lib/sisu/v6/texinfo_format.rb549
-rw-r--r--lib/sisu/v6/texpdf.rb1092
-rw-r--r--lib/sisu/v6/texpdf_format.rb1689
-rw-r--r--lib/sisu/v6/txt_asciidoc.rb556
-rw-r--r--lib/sisu/v6/txt_markdown.rb591
-rw-r--r--lib/sisu/v6/txt_plain.rb583
-rw-r--r--lib/sisu/v6/txt_rst.rb552
-rw-r--r--lib/sisu/v6/txt_shared.rb243
-rw-r--r--lib/sisu/v6/txt_textile.rb545
-rw-r--r--lib/sisu/v6/update.rb143
-rw-r--r--lib/sisu/v6/urls.rb529
-rw-r--r--lib/sisu/v6/utils.rb170
-rw-r--r--lib/sisu/v6/webrick.rb189
-rw-r--r--lib/sisu/v6/wikispeak.rb375
-rw-r--r--lib/sisu/v6/xhtml.rb451
-rw-r--r--lib/sisu/v6/xhtml_epub2.rb818
-rw-r--r--lib/sisu/v6/xhtml_epub2_concordance.rb329
-rw-r--r--lib/sisu/v6/xhtml_epub2_format.rb2244
-rw-r--r--lib/sisu/v6/xhtml_epub2_segments.rb542
-rw-r--r--lib/sisu/v6/xhtml_epub2_tune.rb334
-rw-r--r--lib/sisu/v6/xhtml_shared.rb69
-rw-r--r--lib/sisu/v6/xhtml_table.rb103
-rw-r--r--lib/sisu/v6/xml_docbook5.rb277
-rw-r--r--lib/sisu/v6/xml_dom.rb561
-rw-r--r--lib/sisu/v6/xml_fictionbook2.rb372
-rw-r--r--lib/sisu/v6/xml_format.rb1429
-rw-r--r--lib/sisu/v6/xml_md_oai_pmh_dc.rb235
-rw-r--r--lib/sisu/v6/xml_odf_odt.rb821
-rw-r--r--lib/sisu/v6/xml_odf_odt_format.rb672
-rw-r--r--lib/sisu/v6/xml_sax.rb486
-rw-r--r--lib/sisu/v6/xml_scaffold_structure_collapsed.rb203
-rw-r--r--lib/sisu/v6/xml_scaffold_structure_sisu.rb206
-rw-r--r--lib/sisu/v6/xml_shared.rb753
-rw-r--r--lib/sisu/v6/xml_tables.rb203
-rw-r--r--lib/sisu/v6/zap.rb89
127 files changed, 68912 insertions, 0 deletions
diff --git a/lib/sisu/v6/air.rb b/lib/sisu/v6/air.rb
new file mode 100644
index 0000000..2af4038
--- /dev/null
+++ b/lib/sisu/v6/air.rb
@@ -0,0 +1,86 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/air.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_Air
+ require_relative 'particulars' # particulars.rb
+ class Source
+ @@ao_array=[]
+ @@fns=nil
+ def initialize(opt)
+ @opt=opt
+ @@fns||@opt.fns
+ @particulars=SiSU_Particulars::Combined.new(opt)
+ #@env=@particulars.env
+ #@md=@particulars.md
+ #@ao_array=@particulars.ao_array
+ end
+ def read
+ end
+ protected
+ def print
+ puts @particulars.md.inspect
+ puts @particulars.env.inspect
+ puts @particulars.ao_array
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao.rb b/lib/sisu/v6/ao.rb
new file mode 100644
index 0000000..6f7b1ac
--- /dev/null
+++ b/lib/sisu/v6/ao.rb
@@ -0,0 +1,538 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: preprocessing, (document abstraction), data abstraction used
+ in subsequent processing
+
+=end
+module SiSU_AO
+ require_relative 'defaults' # defaults.rb
+ include SiSU_Viz
+ require_relative 'sysenv' # sysenv.rb
+ include SiSU_Env
+ require_relative 'param' # param.rb
+ include SiSU_Param
+ require_relative 'ao_doc_objects' # ao.rb
+ require_relative 'ao_syntax' # ao_syntax.rb
+ include SiSU_AO_Syntax
+ require_relative 'ao_doc_str' # ao_doc_str.rb
+ require_relative 'ao_idx' # ao_idx.rb
+ require_relative 'ao_numbering' # ao_numbering.rb
+ require_relative 'ao_hash_digest' # ao_hash_digest.rb
+ require_relative 'ao_endnotes' # ao_endnotes.rb
+ require_relative 'ao_images' # ao_images.rb
+ require_relative 'ao_metadata' # ao_metadata.rb
+ require_relative 'ao_character_check' # ao_character_check.rb
+ require_relative 'ao_misc_arrange' # ao_misc_arrange.rb
+ require_relative 'ao_expand_insertions' # ao_expand_insertions.rb
+ require_relative 'prog_text_translation' # prog_text_translation.rb
+ require_relative 'shared_sem' # shared_sem.rb
+ class Instantiate < SiSU_Param::Parameters::Instructions
+ def initialize
+ @@flag_vocab=0
+ @@line_mode=''
+ end
+ end
+ class Source <Instantiate
+ @@ao_array=[]
+ @@idx_arr={ sst: [], tex: [], html: [], xhtml: [] }
+ @@map_arr={ nametags: [], ocn_htmlseg: [] }
+ @@fns=nil
+ def initialize(opt,fnx=nil)
+ @opt,@fnx=opt,fnx
+ @@fns ||=opt.fns
+ fn_use=if fnx \
+ and fnx =~/\.ss[tmi]$/
+ fnx
+ elsif opt.fns =~/\.ssm$/
+ opt.fns + '.sst'
+ else
+ opt.fns
+ end
+ @make_fns=SiSU_Env::InfoFile.new(fn_use)
+ @fnm=@make_fns.marshal.ao_metadata
+ @fnc=@make_fns.marshal.ao_content
+ @idx_sst=@make_fns.marshal.ao_idx_sst_rel_html_seg
+ @idx_raw=@make_fns.marshal.ao_idx_sst_rel
+ @idx_html=@make_fns.marshal.ao_idx_html
+ @idx_xhtml=@make_fns.marshal.ao_idx_xhtml
+ @map_nametags=@make_fns.marshal.ao_map_nametags
+ @map_ocn_htmlseg=@make_fns.marshal.ao_map_ocn_htmlseg
+ @env=SiSU_Env::InfoEnv.new
+ end
+ def read #creates ao
+ begin
+ @@ao_array=[]
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ create_ao
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@@fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ def get #reads ao, unless does not exist then creates first
+ begin
+ ao=[]
+ unless @@fns==@opt.fns \
+ or @@fns==@fnx
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ @@ao_array=[]
+ end
+ ao=(@@ao_array.empty?) \
+ ? read_fnc
+ : @@ao_array.dup
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ def get_idx_sst #reads ao idx.sst, #unless does not exist then creates first
+ begin
+ ao=[]
+ unless @@fns==@opt.fns \
+ or @@fns==@fnx
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ @@idx_arr[:sst]=[]
+ end
+ ao=(@@idx_arr[:sst].empty?) ? read_idx_sst : @@idx_arr[:sst].dup #check
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ def get_idx_raw
+ begin
+ ao=[]
+ unless @@fns==@opt.fns \
+ or @@fns==@fnx
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ @@idx_arr[:tex]=[]
+ end
+ ao=(@@idx_arr[:tex].empty?) ? read_idx_raw : @@idx_arr[:tex].dup #check
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ def get_idx_html #reads ao idx.html, #unless does not exist then creates first
+ begin
+ ao=[]
+ unless @@fns==@opt.fns \
+ or @@fns==@fnx
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ @@idx_arr[:html]=[]
+ end
+ ao=(@@idx_arr[:html].empty?) ? read_idx_html : @@idx_arr[:html].dup
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ def get_idx_xhtml #reads ao idx.xhtml, #unless does not exist then creates first
+ begin
+ ao=[]
+ unless @@fns==@opt.fns \
+ or @@fns==@fnx
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ @@idx_arr[:xthml]=[]
+ end
+ ao=(@@idx_arr[:xhtml].empty?) ? read_idx_xhtml : @@idx_arr[:xhtml].dup
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ def get_map_nametags #reads ao map.nametags, #unless does not exist then creates first
+ begin
+ ao=[]
+ unless @@fns==@opt.fns \
+ or @@fns==@fnx
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ @@map_arr[:nametags]=[]
+ end
+ ao=(@@map_arr[:nametags].empty?) ? read_map_nametags : @@map_arr[:nametags].dup
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ def get_map_ocn_htmlseg #reads ao map.ocn_htmlseg, #unless does not exist then creates first
+ begin
+ ao=[]
+ unless @@fns==@opt.fns \
+ or @@fns==@fnx
+ @@fns=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ @@map_arr[:ocn_htmlseg]=[]
+ end
+ ao=(@@map_arr[:ocn_htmlseg].empty?) ? read_map_ocn_htmlseg : @@map_arr[:ocn_htmlseg].dup
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_AO::Instantiate.new
+ end
+ end
+ protected
+ def create_ao
+ ao_array=[]
+ unless @opt.act[:quiet][:set]==:on
+ tell=(@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],'Document Abstraction')
+ : SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'Document Abstraction',"[#{@opt.f_pth[:lng_is]}] #{@opt.fno}")
+ tell.blue_title_hi
+ end
+ fn=(@fnx && @fnx =~/\.ss[tmi]$/) \
+ ? @fnx
+ : @opt.fns
+ if @opt.fno =~/\.txz$/
+ Dir.chdir(@opt.f_pth[:pth])
+ end
+ meta=file_array=@env.source_file_processing_array(fn)
+ @md=SiSU_Param::Parameters::Instructions.new(meta,@opt).extract
+ meta=nil
+ ao=SiSU_AO::Make.new(fn,@md,file_array).song
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ cf=SiSU_Env::CreateFile.new(fn)
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on)
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],@opt.fns,"~meta/#{@opt.fns}.meta").output
+ elsif @opt.act[:maintenance][:set]==:on
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],"ao -> #{cf.meta}").txt_grey
+ end
+ end
+ ao.each {|s| ao_array << s}
+ if @opt.act[:maintenance][:set]==:on
+ ao_array.each do |obj|
+ if defined? obj.parent
+ if defined? obj.ln
+ if defined? obj.node
+ puts %{#{obj.ln}: #{obj.ocn} : #{obj.parent} : #{obj.node} - #{obj.lc}}
+ else
+ puts %{#{obj.ln}: #{obj.ocn} : #{obj.parent}}
+ end
+ else
+ if defined? obj.node
+ puts %{ #{obj.ocn} : #{obj.parent} : #{obj.node} - #{obj.lc}}
+ else
+ puts %{ #{obj.ocn} : #{obj.parent}}
+ end
+ end
+ end
+ end
+ end
+ ao_array
+ end
+ def read_fnm
+ ao=[]
+ ao=(FileTest.file?(@fnm)) \
+ ? (File.open(@fnm,'r:utf-8'){ |f| ao=Marshal.load(f)})
+ : SiSU_AO::Source.new(@opt).create_ao
+ end
+ def read_fnc
+ ao=[]
+ ao=(FileTest.file?(@fnc)) \
+ ? (File.open(@fnc,'r:utf-8'){ |f| ao=Marshal.load(f)})
+ : SiSU_AO::Source.new(@opt).create_ao
+ end
+ def read_idx_sst
+ m=[]
+ m=(FileTest.file?(@idx_sst)) \
+ ? (File.open(@idx_sst,'r:utf-8'){ |f| m=Marshal.load(f)})
+ : nil
+ end
+ def read_idx_raw
+ m=[]
+ m=(FileTest.file?(@idx_raw)) \
+ ? (File.open(@idx_raw,'r:utf-8'){ |f| m=Marshal.load(f)})
+ : nil
+ end
+ def read_idx_html
+ m=[]
+ m=(FileTest.file?(@idx_html)) \
+ ? (File.open(@idx_html,'r:utf-8'){ |f| m=Marshal.load(f)})
+ : nil
+ end
+ def read_idx_xhtml
+ m=[]
+ m=(FileTest.file?(@idx_xhtml)) \
+ ? (File.open(@idx_xhtml,'r:utf-8'){ |f| m=Marshal.load(f)})
+ : nil
+ end
+ def read_map_nametags
+ m=[]
+ m=(FileTest.file?(@map_nametags)) \
+ ? (File.open(@map_nametags,'r:utf-8'){ |f| m=Marshal.load(f)})
+ : nil
+ end
+ def read_map_ocn_htmlseg
+ m=[]
+ m=(FileTest.file?(@map_ocn_htmlseg)) \
+ ? (File.open(@map_ocn_htmlseg,'r:utf-8'){ |f| m=Marshal.load(f)})
+ : nil
+ end
+ end
+ class Output
+ def initialize(fn,md,data)
+ @fn,@md,@data=fn,md,data
+ @cf=SiSU_Env::CreateFile.new(@fn)
+ @make=SiSU_Env::InfoFile.new(@fn)
+ @dir=SiSU_Env::InfoEnv.new(@fn)
+ end
+ def screen_dump(o)
+ if defined? o.of
+ print %{OF: #{o.of}; }
+ end
+ if defined? o.is
+ print %{IS: #{o.is.to_s}; }
+ end
+ if defined? o.ocn
+ print %{OCN: #{o.ocn}; }
+ end
+ if defined? o.node
+ print %{NODE: #{o.node}; }
+ end
+ if defined? o.parent
+ print %{Parent: #{o.parent}; }
+ end
+ if defined? o.obj and not o.obj.empty?
+ puts %{\n#{o.obj}; }
+ else "\n"
+ end
+ end
+ def screen_print(t_o)
+ if defined? t_o
+ print ' ' + t_o.to_s
+ end
+ end
+ def screen_output(data)
+ data.each do |o|
+ print o.class
+ screen_print(o.ocn)
+ screen_print(o.obj)
+ puts "\n"
+ end
+ end
+ def hard_output
+ if @md.opt.act[:maintenance][:set]==:on
+ filename_meta=@cf.metaverse.file_meta
+ @data.each {|o| filename_meta.puts o.inspect.sub(/:0x[0-9a-f]{8}\s/,': ')} #to make diffing easier
+ filename_txt=@cf.metaverse.file_txt
+ @data.each do |o|
+ if defined? o.ocn
+ filename_txt.puts case o.is
+ when :heading
+ "[#{o.is.to_s} #{o.lv}~#{o.name} [#{o.ocn}]] #{o.obj}"
+ else "[#{o.is.to_s} [#{o.ocn}]] #{o.obj}"
+ end
+ else
+ filename_txt.puts case o.is
+ when :meta
+ "[m~#{o.tag}] #{o.obj}"
+ else "[#{o.is.to_s}] #{o.obj}"
+ end
+ end
+ end
+ filename_debug=@cf.file_debug
+ @data.each do |o|
+ if defined? o.ocn
+ case o.is
+ when :heading
+ filename_debug.puts "#{o.is.to_s} #{o.lv}~#{o.name} odv=#{o.odv} osp=#{o.osp} [#{o.ocn}] -->\n\t#{o.obj}"
+ end
+ end
+ end
+ else
+ hard="#{@dir.processing_path.ao}/#{@md.fns}.meta"
+ File.unlink(hard) if FileTest.file?(hard)
+ hard="#{@dir.processing_path.ao}/#{@md.fns}.txt"
+ File.unlink(hard) if FileTest.file?(hard)
+ hard="#{@dir.processing_path.ao}/#{@md.fns}.debug.txt"
+ File.unlink(hard) if FileTest.file?(hard)
+ end
+ end
+ def make_marshal_content
+ marshal_ao=@make.marshal.ao_content
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Array)
+ end
+ def make_marshal_metadata
+ marshal_ao=@make.marshal.ao_metadata
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Array)
+ end
+ def idx_html_hard_output
+ if @md.book_idx \
+ and @md.opt.act[:maintenance][:set]==:on
+ filename_meta=@cf.file_meta_idx_html
+ if @data.is_a?(Array)
+ @data.each {|s| p s.inspect + "\n" unless s.is_a?(String)}
+ @data.each {|s| filename_meta.puts s.strip + "\n" unless s.strip.empty?}
+ end
+ else
+ hard_idx_html="#{@dir.processing_path.ao}/#{@md.fns}.idx.html"
+ File.unlink(hard_idx_html) if FileTest.file?(hard_idx_html)
+ end
+ end
+ def make_marshal_idx_sst_html_seg
+ marshal_ao=@make.marshal.ao_idx_sst_rel_html_seg
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Array)
+ end
+ def make_marshal_idx_sst_rel
+ marshal_ao=@make.marshal.ao_idx_sst_rel
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Array)
+ end
+ def make_marshal_idx_html
+ marshal_ao=@make.marshal.ao_idx_html
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Array)
+ end
+ def make_marshal_idx_xhtml
+ marshal_ao=@make.marshal.ao_idx_xhtml
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Array)
+ end
+ def make_marshal_map_nametags
+ marshal_ao=@make.marshal.ao_map_nametags
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Hash)
+ end
+ def make_marshal_map_name_ocn_htmlseg
+ marshal_ao=@make.marshal.ao_map_ocn_htmlseg
+ File.open(marshal_ao,'w'){|f| Marshal.dump(@data,f)} if @data.is_a?(Hash)
+ end
+ end
+ class Make
+ def initialize(fn,md,data)
+ @fn,@md,@data=fn,md,data
+ @env=SiSU_Env::InfoEnv.new(@md.fns)
+ end
+ def reset
+ @@flag_vocab=0
+ @@line_mode=''
+ end
+ def song
+ reset
+ data=@data
+ data=SiSU_AO_Insertions::Insertions.new(@md,data).expand_insertions? # ao_expand_insertions.rb
+ data=SiSU_AO_MiscArrangeText::SI.new(@md,data).prepare_text # ao_misc_arrange.rb
+ data,metadata=SiSU_AO_DocumentStructureExtract::Build.new(@md,data).identify_parts # ao_doc_str.rb
+ data=SiSU_AO_Syntax::Markup.new(@md,data).songsheet # ao_syntax.rb
+ data,endnote_array=SiSU_AO_CharacterCheck::Check.new(data).character_check_and_oldstyle_endnote_array # ao_character_check.rb
+ data=SiSU_AO_Images::Images.new(@md,data).images # ao_images.rb
+ data,tags_map,ocn_html_seg_map=SiSU_AO_Numbering::Numbering.new(@md,data).numbering_song # ao_numbering.rb
+ data,book_index_rel,book_index_rel_html_seg,html_idx,xhtml_idx=SiSU_AO_BookIndex::BookIndex.new(@md,data,@env).indexing_song if @md.book_idx # ao_idx.rb
+ data=SiSU_AO_Endnotes::Endnotes.new(@md,data,endnote_array).endnotes # ao_endnotes.rb
+ outputdata=data
+ if (@md.opt.act[:ao][:set]==:on \
+ || @md.opt.act[:maintenance][:set]==:on)
+ SiSU_AO::Output.new(@fn,@md,outputdata).hard_output
+ SiSU_AO::Output.new(@fn,@md,outputdata).make_marshal_content
+ SiSU_AO::Output.new(@fn,@md,metadata).make_marshal_metadata
+ SiSU_AO::Output.new(@fn,@md,html_idx).idx_html_hard_output
+ SiSU_AO::Output.new(@fn,@md,book_index_rel_html_seg).make_marshal_idx_sst_html_seg
+ SiSU_AO::Output.new(@fn,@md,book_index_rel).make_marshal_idx_sst_rel
+ SiSU_AO::Output.new(@fn,@md,html_idx).make_marshal_idx_html
+ SiSU_AO::Output.new(@fn,@md,xhtml_idx).make_marshal_idx_xhtml
+ SiSU_AO::Output.new(@fn,@md,tags_map).make_marshal_map_nametags
+ SiSU_AO::Output.new(@fn,@md,ocn_html_seg_map).make_marshal_map_name_ocn_htmlseg
+ end
+ reset
+ outputdata
+ end
+ protected
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_character_check.rb b/lib/sisu/v6/ao_character_check.rb
new file mode 100644
index 0000000..8774d7a
--- /dev/null
+++ b/lib/sisu/v6/ao_character_check.rb
@@ -0,0 +1,108 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_character_check.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_CharacterCheck
+ class Check
+ def initialize(data)
+ @data=data
+ @comment='%'
+ @endnote_array=[]
+ end
+ def character_check_and_oldstyle_endnote_array
+ data=@data
+ @tuned_file,@endnote_array=[],[]
+ endnote_no=1
+ data.each do |dob|
+ unless dob.is ==:table
+ dob.obj=dob.obj.strip.
+ gsub(/^[{~}]\s*$/,'').
+ gsub(/~#\s*/,"#{Mx[:pa_non_object_no_heading]}").
+ gsub(/-#\s*/,"#{Mx[:pa_non_object_dummy_heading]}").
+ gsub(/(#{Mx[:en_a_o]})\s*\s+/,'\1 ').
+ gsub(/(~\{\s*)\s+/,'\1 ').
+ gsub(/ \/\//,"#{Mx[:br_line]}").
+ gsub(/<br>/,"#{Mx[:br_line]}"). #needed by xml, xhtml etc.
+ gsub(/\t/,' ').
+ gsub(/\342\200\231/u,"'"). #if dob =~/’/ #Avoid #&lsquo; &rsquo; #&ldquo; &rdquo;
+ gsub(/\\copy(?:right)?\b/,'&#169;').
+ gsub(/\\trademark\b|\\tm\b/,'&#174;')
+ dob.obj=dob.obj + "\n"
+ unless dob.is ==:code
+ case dob.obj
+ when /\^~/ #% Note must do this first (earlier loop) and then enter gathered data into ~^\d+
+ sub_dob=dob.obj.dup
+ @endnote_array << sub_dob.gsub(/\n/,'').
+ gsub(/\^~\s+(.+)\s*/,%{#{Mx[:en_a_o]}#{endnote_no} \\1 #{Mx[:en_a_c]}}).
+ strip
+ endnote_no+=1
+ dob=nil if dob.obj =~/\^~ .+/ #watch, removes 'binary' endnote now in endnote array for later insertion
+ end
+ end
+ end
+ @tuned_file << dob if dob.is_a?(Object)
+ end
+ @tuned_file=@tuned_file.flatten.compact
+ [@tuned_file,@endnote_array]
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_doc_objects.rb b/lib/sisu/v6/ao_doc_objects.rb
new file mode 100644
index 0000000..15e949c
--- /dev/null
+++ b/lib/sisu/v6/ao_doc_objects.rb
@@ -0,0 +1,490 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_doc_objects.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: document abstraction
+
+=end
+module SiSU_AO_DocumentStructure
+ class Extract
+ def extract(h,o)
+ h ? h : o
+ end
+ end
+ class ObjectMetadata
+ attr_accessor :is,:of,:tags,:obj,:digest
+ def initialize
+ @tags={}
+ @is=@tmp=@digest=nil
+ @of=:meta
+ end
+ def metadata(tags)
+ of= @of #String, classification - group
+ is= :meta #String, classification - specific type
+ tags= tags || ((defined? o.tags) ? o.tags : {}) #String, metadata type/tag
+ obj= nil
+ @of,@is,@tags,@obj=of,is,tags,obj
+ self
+ end
+ end
+ class ObjectMeta
+ attr_accessor :obj,:is,:of,:tag,:digest,:tmp
+ def initialize
+ @is=@obj=@tag=@digest=@digest=@tmp=nil
+ @of=:meta
+ end
+ def metadata(h,o=nil)
+ of= @of #String, classification - group
+ is= :meta #String, classification - specific type
+ tag= h[:tag] || ((defined? o.tag) ? o.tag : nil) #String, metadata type/tag
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ @of,@is,@tag,@obj,@digest,@tmp=of,is,tag,obj,digest,tmp
+ self
+ end
+ end
+ class ObjectHeading
+ attr_accessor :obj,:is,:tags,:of,:lv,:ln,:lc,:toc_,:name,:idx,:ocn,:odv,:osp,:node,:parent,:ocn_,:note_,:autonum_,:digest,:tmp
+ def initialize
+ @of=:para
+ @is=@obj=@lv=@ln=@lc=@toc_=@name=@idx=@size=@ocn=@odv=@osp=@node=@parent=@ocn_=@note_=@autonum_=@digest=@tmp=nil
+ @tags=[]
+ end
+ def heading_ln(lv)
+ case lv
+ when /A/ then 0
+ when /B/ then 1
+ when /C/ then 2
+ when /D/ then 3
+ when /1/ then 4
+ when /2/ then 5
+ when /3/ then 6
+ when /4/ then 7
+ when /5/ then 8
+ when /6/ then 9
+ end
+ end
+ def heading_lv(ln)
+ case ln.to_s
+ when /0/ then 'A'
+ when /1/ then 'B'
+ when /2/ then 'C'
+ when /3/ then 'D'
+ when /4/ then '1'
+ when /5/ then '2'
+ when /6/ then '3'
+ when /7/ then '4'
+ when /8/ then '5'
+ when /9/ then '6'
+ end
+ end
+ def heading(h,o=nil)
+ if not h[:ln] \
+ and (h[:lv] and h[:lv]=~/[1-6A-D]/)
+ h[:ln]=heading_ln(h[:lv])
+ elsif not h[:lv] \
+ and (h[:ln] and h[:ln].to_s=~/[0-9]/)
+ h[:lv]=heading_lv(h[:ln])
+ end
+ of= @of #String, classification - group
+ is= :heading #String, classification - specific type
+ name= h[:name] || ((defined? o.name) ? o.name : nil) #String, named object?
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ node= h[:node] || ((defined? o.node) ? o.node : nil) #[Node relationship doc structure info]
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ lv= h[:lv] || ((defined? o.lv) ? o.lv : nil) #Alpha-numeric, document structure as used in markup, A-D then 1-6
+ ln= h[:ln] || ((defined? o.ln) ? o.ln : nil) #Integer, document structure level, for convenience in processing 1-9
+ lc= h[:lc] || ((defined? o.lc) ? o.lc : nil) #Integer, document structure collapsed level, convenience (collapse sisu's dual level document structure for markup with simple linear structure)
+ toc_= h[:toc_] || ((defined? o.toc_) ? o.toc_ : false) #Bool, do not include in toc, (relevant to headings)
+ ocn_=if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ autonum_= if h[:autonum_].nil? then ((defined? o.autonum_) ? o.autonum_ : true) #Bool? auto-numbering if requested default on, false suppresses
+ else h[:autonum_]
+ end
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@lv,@ln,@lc,@name,@tags,@obj,@idx,@ocn,@odv,@osp,@node,@parent,@toc_,@ocn_,@note_,@autonum_,@digest,@tmp=of,is,lv,ln,lc,name,tags,obj,idx,ocn,odv,osp,node,parent,toc_,ocn_,note_,autonum_,digest,tmp
+ self
+ end
+ def heading_insert(h,o=nil)
+ heading(h,o=nil)
+ @is= :heading_insert #String, classification - specific type
+ self
+ end
+ end
+ class ObjectPara
+ attr_accessor :obj,:is,:tags,:of,:name,:idx,:bullet_,:indent,:hang,:ocn,:odv,:osp,:parent,:note_,:image_,:ocn_,:digest,:tmp
+ def initialize
+ @of=:para
+ @is=@obj=@name=@idx=@bullet_=@indent=@hang=@size=@ocn=@odv=@osp=@parent=@note_=@image_=@ocn_=@digest=@tmp=nil
+ @tags=[]
+ end
+ def paragraph(h,o=nil)
+ of= @of #String, classification - group
+ is= :para #String, classification - specific type
+ name= h[:name] || ((defined? o.name) ? o.name : nil) #String, named object?
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ indent= h[:indent].to_s || ((defined? o.indent) ? o.indent.to_s : nil) #Integer, indent level
+ hang= h[:hang].to_s || ((defined? o.hang) ? o.hang.to_s : nil) #Integer, hanging indent level
+ bullet_=h[:bullet_] || ((defined? o.bullet_) ? o.bullet_ : false) #Bool, bulleted?
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ image_= h[:image_] || ((defined? o.image_) ? o.image_ : false) #Bool, images? (processing optimization)
+ ocn_=if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@name,@tags,@obj,@indent,@hang,@bullet_,@idx,@ocn,@odv,@osp,@parent,@image_,@note_,@ocn_,@digest,@tmp=of,is,name,tags,obj,indent,hang,bullet_,idx,ocn,odv,osp,parent,image_,note_,ocn_,digest,tmp
+ self
+ end
+ def docinfo(h,o=nil)
+ of= @of #String, classification - group
+ is= :docinfo #String, classification - specific type
+ name= h[:name] || ((defined? o.name) ? o.name : nil) #String, named object?
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : nil) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= nil #String, book index provided?
+ ocn= nil #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ indent= nil #Integer, indent level
+ hang= nil #Integer, indent level
+ bullet_=false #Bool, bulleted?
+ note_= false #Bool, endnotes/footnotes? (processing optimization)
+ image_= h[:image_] || ((defined? o.image_) ? o.image_ : false) #Bool, images? (processing optimization)
+ ocn_=if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@name,@tags,@obj,@indent,@hang,@bullet_,@idx,@ocn,@odv,@osp,@parent,@image_,@note_,@ocn_,@digest,@tmp=of,is,name,tags,obj,indent,hang,bullet_,idx,ocn,odv,osp,parent,image_,note_,ocn_,digest,tmp
+ self
+ end
+ end
+ class ObjectBlockTxt
+ attr_accessor :obj,:is,:of,:tags,:idx,:ocn,:odv,:osp,:parent,:note_,:number_,:ocn_,:digest,:tmp
+ def initialize
+ @of=:block
+ @is=@obj=@idx=@ocn=@odv=@osp=@parent=@note_=@number_=@ocn_=@digest=@tmp=nil
+ @tags=[]
+ end
+ def code(h,o=nil)
+ of= @of #String, classification - group #alt 'code'
+ is= :code #String, classification - specific type
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ number_= h[:number_] || ((defined? o.number_) ? o.number_ : false) #Bool, numbered or not?
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ ocn_= if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ num= h[:num] || ((defined? o.num) ? o.num : nil)
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@number_,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,number_,note_,ocn_,num,digest,tmp
+ self
+ end
+ def block(h,o=nil)
+ of= @of #String, classification - group
+ is= :block #String, classification - specific type
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ ocn_= if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ num= h[:num] || ((defined? o.num) ? o.num : nil)
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
+ self
+ end
+ def group(h,o=nil)
+ of= @of #String, classification - group
+ is= :group #String, classification - specific type
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ ocn_= if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ num= h[:num] || ((defined? o.num) ? o.num : nil)
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
+ self
+ end
+ def alt(h,o=nil) #see block
+ of= @of #String, classification - group
+ is= :alt #String, classification - specific type
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ ocn_= if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ num= h[:num] || ((defined? o.num) ? o.num : nil)
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
+ self
+ end
+ def verse(h,o=nil) #part of poem decide how you deal with this
+ of= @of #String, classification - group
+ is= :verse #String, classification - specific type
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ ocn_= if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ num= h[:num] || ((defined? o.num) ? o.num : nil)
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
+ @h=nil
+ self
+ end
+ end
+ class ObjectTable
+ attr_accessor :obj,:is,:of,:lv,:tags,:name,:idx,:indent,:hang,:size,:ocn,:number,:head_,:cols,:widths,:odv,:osp,:parent,:note_,:ocn_,:digest,:tmp
+ def initialize
+ @of=:block
+ @is=@obj=@lv=@name=@idx=@indent=@hang=@size=@ocn,@number,@head_,@cols,@widths=@odv=@osp=@parent=@note_=@ocn_=@num=@digest=@tmp=nil
+ @tags=[]
+ end
+ def table(h,o=nil)
+ of= @of #String, classification - group
+ is= :table #String, classification - specific type
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ cols= h[:cols] || ((defined? o.cols) ? o.cols : nil)
+ widths= h[:widths] || ((defined? o.widths) ? o.widths : nil)
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ head_= h[:head_] || ((defined? o.head_) ? o.head_ : false)
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ ocn_=if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ num= h[:num] || ((defined? o.num) ? o.num : nil)
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@tags,@cols,@widths,@obj,@idx,@ocn,@odv,@osp,@parent,@head_,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,cols,widths,obj,idx,ocn,odv,osp,parent,head_,note_,ocn_,num,digest,tmp
+ self
+ end
+ end
+ class ObjectImage
+ attr_accessor :obj,:is,:of,:lv,:idx,:size,:ocn,:parent,:note_,:ocn_,:digest,:tmp
+ def initialize
+ @of=:image
+ @is=@obj=@lv=@idx=@size=@ocn=@parent=@note_=@ocn_=@tmp=@digest=nil
+ @tags=[]
+ end
+ def image(h,o=nil) #not yet used, and what of a paragraph containing several images, consider
+ of= @of #String, classification - group
+ is= :image #String, classification - specific type
+ tags= h[:tags] || ((defined? o.tags) ? o.tags : []) #Array, associated object tags, names if any
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ size= h[:size] || ((defined? o.size) ? o.size : nil)
+ idx= h[:idx] || ((defined? o.idx) ? o.idx : nil) #String, book index provided?
+ ocn= h[:ocn] || ((defined? o.ocn) ? o.ocn : nil) #Integer, sequential on substantive-content objects
+ odv= h[:odv] || ((defined? o.odv) ? o.odv : nil)
+ osp= h[:osp] || ((defined? o.osp) ? o.osp : nil)
+ parent= h[:parent] || ((defined? o.parent) ? o.parent : nil) #[Node parent]
+ note_= h[:note_] || ((defined? o.note_) ? o.note_ : false) #Bool, endnotes/footnotes? (processing optimization)
+ ocn_=if h[:ocn_].nil? then ((defined? o.ocn_) ? o.ocn_ : true) #Bool? no ocn, non-substantive content, do not include in toc #consider
+ else h[:ocn_]
+ end
+ digest= h[:digest] || ((defined? o.digest) ? o.digest : nil) #hash digests, either sha256 or md5
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@tags,@obj,@size,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@digest,@tmp=of,is,tags,obj,size,idx,ocn,odv,osp,parent,note_,ocn_,digest,tmp
+ self
+ end
+ end
+ class ObjectStructure
+ attr_accessor :obj,:tag,:node,:lv,:ln,:lc,:status,:is,:of,:tmp
+ def initialize
+ @of=:structure
+ @is=@obj=@node=@lv=@ln=@lc=@status=@tmp=nil
+ end
+ def xml_dom(h,o=nil)
+ of= @of #String, classification - group
+ is= :xml_dom #String, classification - specific type
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : '') #String, text content
+ lv= h[:lv] || ((defined? o.lv) ? o.lv : nil) #Alpha-numeric, document structure as used in markup, A-D then 1-6
+ ln= h[:ln] || ((defined? o.ln) ? o.ln : nil) #Integer, document structure level, for convenience in processing 1-9
+ lc= h[:lc] || ((defined? o.lc) ? o.lc : nil) #Integer, document structure collapsed level, convenience (collapse sisu's dual level document structure for markup with simple linear structure)
+ node= h[:node] || ((defined? o.node) ? o.node : nil) #[Node relationship doc structure info]
+ status= h[:status] || ((defined? o.status) ? o.status : nil) #tag status open or close
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@obj,@status,@node,@lv,@ln,@lc,@tmp=of,is,obj,status,node,lv,ln,lc,tmp
+ self
+ end
+ end
+ class ObjectComment
+ attr_accessor :obj,:is,:of,:tmp
+ def initialize
+ @of=:comment
+ @is=@obj=@tmp=nil
+ end
+ def comment(h,o=nil)
+ of= @of #String, classification - group
+ is= :comment #String, classification - specific type
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@obj,@tmp=of,is,obj,tmp
+ self
+ end
+ end
+ class ObjectFlag
+ attr_accessor :obj,:is,:of,:flag,:mod,:tmp
+ def initialize
+ @of=:flag
+ @is=@obj=@flag=@mod=@tmp=nil
+ end
+ def flag(h,o=nil)
+ of= @of #String, classification - group
+ is= :flag #String, classification - specific type
+ obj= nil #String, text content
+ flag= h[:flag] || ((defined? o.flag) ? o.flag : nil) #String, text content
+ mod= h[:mod] || ((defined? o.mod) ? o.mod : nil) #String, text content
+ tmp= h[:flag] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@obj,@flag,@mod,@tmp=of,is,obj,flag,mod,tmp
+ self
+ end
+ def flag_ocn(h,o=nil)
+ of= @of #String, classification - group
+ is= :flag_ocn #String, classification - specific type
+ obj= nil #String, text content
+ flag= h[:flag] || ((defined? o.flag) ? o.flag : nil) #String, text content
+ mod= h[:mod] || ((defined? o.mod) ? o.mod : nil) #String, text content
+ tmp= h[:flag] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@obj,@flag,@mod,@tmp=of,is,obj,flag,mod,tmp
+ self
+ end
+ end
+ class ObjectLayout
+ attr_accessor :obj,:is,:of,:from,:tmp
+ def initialize
+ @of=:layout
+ @is=@obj=@from=@tmp=nil
+ end
+ def break(h,f=nil) #decide how to deal with
+ of= @of #String, classification - group
+ is= :break #String, classification - specific type
+ obj= h[:obj] #String, text content
+ from= f
+ tmp= h[:tmp] #available for processing, empty after use
+ @of,@is,@obj,@from,@tmp=of,is,obj,from,tmp
+ self
+ end
+ def insert(h,o=nil) #decide how to deal with, could mimic paragraph?
+ of= @of #String, classification - group
+ is= :insert #String, classification - specific type
+ obj= h[:obj] || ((defined? o.obj) ? o.obj : nil) #String, text content
+ tmp= h[:tmp] || ((defined? o.tmp) ? o.tmp : nil) #available for processing, empty after use
+ @of,@is,@obj,@tmp=of,is,obj,tmp
+ self
+ end
+ end
+end
+__END__
+# ~# |-# no paragraph number # -# not included in toc
diff --git a/lib/sisu/v6/ao_doc_str.rb b/lib/sisu/v6/ao_doc_str.rb
new file mode 100644
index 0000000..0cdd553
--- /dev/null
+++ b/lib/sisu/v6/ao_doc_str.rb
@@ -0,0 +1,1472 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_doc_str.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: document abstraction
+
+=end
+module SiSU_AO_DocumentStructureExtract
+ class Instantiate < SiSU_Param::Parameters::Instructions
+ @@flag={
+ ocn: :on,
+ code: :off,
+ poem: :off,
+ block: :off,
+ group: :off,
+ alt: :off,
+ table: :off,
+ table_to: :off,
+ }
+ def initialize
+ @@counter=@@column=@@columns=0
+ @@line_mode=''
+ end
+ end
+ class Build
+ @@flag={
+ ocn: :on,
+ code: :off,
+ poem: :off,
+ block: :off,
+ group: :off,
+ alt: :off,
+ table: :off,
+ table_to: :off,
+ }
+ def initialize(md,data)
+ @md,@data=md,data
+ SiSU_AO_DocumentStructureExtract::Instantiate.new
+ @pb=SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page])
+ @pbn=SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_new])
+ @pbl=SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_line])
+ end
+ def ln_get(lv)
+ case lv
+ when /A/ then 0
+ when /B/ then 1
+ when /C/ then 2
+ when /D/ then 3
+ when /1/ then 4
+ when /2/ then 5
+ when /3/ then 6
+ when /4/ then 7
+ when /5/ then 8
+ when /6/ then 9
+ end
+ end
+ def image_test(str)
+ str=~/\{\s*\S+?\.png.+?\}https?:\/\/\S+/ \
+ ? true
+ : false
+ end
+ def bullet_test(str)
+ (str=~/\*/) \
+ ? true
+ : false
+ end
+ def hang_and_indent_test(str)
+ hang_indent=if str=~/^_([1-9])[^_]/
+ [$1,$1]
+ elsif str=~/^__([1-9])/
+ [0,$1]
+ elsif str=~/^_([0-9])_([0-9])/
+ [$1,$2]
+ else
+ [0,0]
+ end
+ hang,indent=hang_indent[0],hang_indent[1]
+ [hang,indent]
+ end
+ def hang_and_indent_def_test(str1,str2)
+ hang_indent=if str1=~/^_([1-9])[^_]/
+ [$1,$1]
+ elsif str1=~/^__([1-9])/
+ [0,$1]
+ elsif str1=~/^_([0-9])_([0-9])/
+ [$1,$2]
+ else
+ [0,0]
+ end
+ obj=if str2 =~/^(.+?)\s+\\\\(?:\s+|\n)/
+ str2.gsub(/^(.+?)(\s+\\\\(?:\s+|\n))/,"#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}\\2")
+ else
+ str2.gsub(/^(.+?)\n/,"#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}\n")
+ end
+ hang,indent=hang_indent[0],hang_indent[1]
+ [hang,indent,obj]
+ end
+ def endnote_test?(str)
+ (str=~/~\{.+?\}~|~\[.+?\]~/) \
+ ? true
+ : false
+ end
+ def extract_tags(str,nametag=nil)
+ tags=[]
+ if str.nil?
+ else
+ if str =~/(?:^|[ ])\*~([a-z0-9._-]+)(?=[ #{Mx[:br_nl]}]|$)/
+ str=str.gsub(/(^|[ ])\*~([a-z0-9._-]+)(?=[ #{Mx[:br_nl]}]|$)/i,
+ "\\1#{Mx[:tag_o]}\\2#{Mx[:tag_c]}").
+ gsub(/ [ ]+/i,' ')
+ tags=str.scan(/#{Mx[:tag_o]}(\S+?)#{Mx[:tag_c]}/).flatten
+ str=str.gsub(/[ ]?#{Mx[:tag_o]}\S+?#{Mx[:tag_c]}[ ]?/,' ') #may be issues with spaces would leave one, but "code" blocks?
+ end
+ tags=nametag ? (tags << nametag) : tags
+ end
+ [str,tags]
+ end
+ def rgx_idx_ocn_seg
+ @rgx_idx_ocn_seg=/(.+?)\s*[+](\d+)/
+ end
+ def construct_idx_array_and_hash(idxraw)
+ idx_array_raw=idxraw.scan(/[^;]+/)
+ idx_hash,idx_array,idx_lst={},[],[]
+ idx_array_raw.each do |idx|
+ idx_lst=case idx
+ when /\S+?\s*:/
+ idx_couplet_tmp=[]
+ idx_couplet=idx.scan(/\s*[^:]+\s*/)
+ if idx_couplet[1] =~/[|]/
+ idx_couplet_tmp << idx_couplet[0] << idx_couplet[1].scan(/\s*[^|]+\s*/)
+ else
+ idx_couplet_tmp << idx_couplet[0] << [idx_couplet[1]]
+ end
+ idx_couplet=idx_couplet_tmp
+ else [idx]
+ end
+ term_nodes=[]
+ idx_lst.each do |term_node|
+ case term_node
+ when String
+ term_node=term_node[0].chr.capitalize + term_node[1,term_node.length]
+ term_node=(term_node =~/.+?[+]\d+/) \
+ ? term_node
+ : (term_node + '+0')
+ term_nodes << term_node
+ use,plus=rgx_idx_ocn_seg.match(term_node)[1,2]
+ @use=use.strip
+ idx_hash[@use]={ sub: [], plus: plus } unless idx_hash[@use] and defined? idx_hash[@use]
+ when Array
+ subterm_nodes=[]
+ term_node.each do |subterm_node|
+ subterm_node=(subterm_node =~/.+?[+]\d+/) \
+ ? subterm_node
+ : (subterm_node + '+0')
+ subterm_nodes << subterm_node
+ sub,sub_plus=rgx_idx_ocn_seg.match(subterm_node)[1,2]
+ idx_hash[@use]={ sub: [], plus: 0 } unless idx_hash[@use] and defined? idx_hash[@use]
+ idx_hash[@use][:sub] << {sub.strip => { plus: sub_plus }}
+ end
+ term_nodes << subterm_nodes
+ end
+ end
+ idx_array << term_nodes
+ end
+ { hash: idx_hash, array: idx_array }
+ end
+ def identify_parts
+ tuned_file=[]
+ @tuned_block,@tuned_code=[],[]
+ @@counter,@verse_count,@num_code_block,@num_poem,@num_group,@num_block,@num_alt,@num_table=0,0,0,0,0,0,0,0
+ @metadata={}
+ @data.each do |t_o|
+ if t_o =~/^--([+~-])[#]$/
+ h=case $1
+ when /[+]/
+ @@flag[:ocn]=:on
+ {flag: :ocn_on}
+ when /[~]/
+ @@flag[:ocn]=:off_headings_substantive
+ {flag: :ocn_off, mod: :headings_substantive}
+ when /[-]/
+ @@flag[:ocn]=:off_headings_exclude
+ {flag: :ocn_off, mod: :headings_exclude}
+ else
+ @@flag[:ocn]=:on
+ {flag: :ocn_on}
+ end
+ t_o=SiSU_AO_DocumentStructure::ObjectFlag.new.flag_ocn(h)
+ next
+ end
+ t_o=t_o.gsub(/(?:\n\s*\n)+/m,"\n") if @@flag[:code]==:off
+ if t_o !~/^(?:code|poem|alt|group|block)\{|^\}(?:code|poem|alt|group|block)|^(?:table\{|\{table)[ ~]/ \
+ and t_o !~/^[`]{3}\s+(?:code|poem|alt|group|block|table)|^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/ \
+ and @@flag[:code]==:off \
+ and @@flag[:poem]==:off \
+ and @@flag[:group]==:off \
+ and @@flag[:block]==:off \
+ and @@flag[:alt]==:off \
+ and @@flag[:table]==:off
+ unless t_o =~/^(?:@\S+?:|%+)\s/ # extract book index for paragraph if any
+ idx=if t_o=~/^=\{(.+)\}\s*$\Z/m; m=$1
+ m=m.split(/\n/).join(' ').
+ gsub(/\s+([|:;])\s+/,'\1').
+ gsub(/\s+([+]\d+)\s+/,'\1')
+ t_o=t_o.gsub(/\n=\{.+\}\s*$\Z/m,'')
+ idx_array_and_hash=construct_idx_array_and_hash(m)
+ idx_array_and_hash[:hash]
+ else nil
+ end
+ end
+ t_o=case t_o
+ when /^#{Mx[:meta_o]}\S+?#{Mx[:meta_c]}/ #metadata, header
+ if t_o=~/^#{Mx[:meta_o]}(\S+?)#{Mx[:meta_c]}\s*(.+)/m
+ tag,obj=$1,$2
+ @metadata[tag]=obj
+ end
+ t_o=nil
+ when /^%+\s/ #comment
+ t_o=if t_o=~/^%+\s+(.+)/
+ h={obj: $1}
+ SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ else nil
+ end
+ when /^:?([A-D1-6])\~/ #heading / lv
+ lv=$1
+ ln=ln_get(lv)
+ t_o=if t_o=~/^:?[A-D1-6]\~\s+(.+)/m
+ obj=$1
+ note=endnote_test?(obj)
+ obj,tags=extract_tags(obj)
+ if @@flag[:ocn]==:off_headings_exclude \
+ or @@flag[:ocn]==:off_headings_substantive
+ unless obj =~ /[~-][#]\s*$/
+ if @@flag[:ocn]==:off_headings_exclude
+ obj << ' -#'
+ elsif @@flag[:ocn]==:off_headings_substantive
+ obj << ' ~#'
+ end
+ end
+ end
+ h={ lv: lv, ln: ln, obj: obj, idx: idx, tags: tags }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h)
+ elsif t_o=~/^:?[A-D1-6]\~(\S+?)-\s+(.+)/m
+ name,obj=$1,$2
+ note=endnote_test?(obj)
+ obj,tags=extract_tags(obj)
+ if @@flag[:ocn]==:off_headings_exclude \
+ or @@flag[:ocn]==:off_headings_substantive
+ unless obj =~ /[~-][#]\s*$/
+ if @@flag[:ocn]==:off_headings_exclude
+ obj << ' -#'
+ elsif @@flag[:ocn]==:off_headings_substantive
+ obj << ' ~#'
+ end
+ end
+ end
+ h={ lv: lv, name: name, obj: obj, idx: idx, autonum_: false, tags: tags}
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h)
+ elsif t_o=~/^:?[A-D1-6]\~(\S+)\s+(.+)/m
+ name,obj=$1,$2
+ note=endnote_test?(obj)
+ obj,tags=extract_tags(obj,name)
+ if @@flag[:ocn]==:off_headings_exclude \
+ or @@flag[:ocn]==:off_headings_substantive
+ unless obj =~ /[~-][#]\s*$/
+ if @@flag[:ocn]==:off_headings_exclude
+ obj << ' -#'
+ elsif @@flag[:ocn]==:off_headings_substantive
+ obj << ' ~#'
+ end
+ end
+ end
+ h={ lv: lv, name: name, obj: obj, idx: idx, tags: tags }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h)
+ else nil
+ end
+ when /^_(?:[1-9]!?|[1-9]?\*)\s+/ #indented and/or bullet paragraph
+ t_o=if t_o=~/^(_(?:[1-9]?\*|[1-9]!?)\s+)(.+)/m
+ tst,obj=$1,$2
+ if t_o=~/^_[1-9]!\s+.+/m
+ hang,indent,obj=hang_and_indent_def_test(tst,obj)
+ else
+ hang,indent=hang_and_indent_test(tst)
+ end
+ bullet=bullet_test(tst)
+ image=image_test(obj)
+ note=endnote_test?(obj)
+ obj,tags=extract_tags(obj)
+ unless obj=~/\A\s*\Z/m
+ if @@flag[:ocn]==:off_headings_exclude \
+ or @@flag[:ocn]==:off_headings_substantive
+ unless obj =~ /[~-][#]\s*$/
+ obj << ' ~#'
+ end
+ end
+ h={ bullet_: bullet, hang: hang, indent: indent, obj: obj, idx: idx, note_: note, image_: image, tags: tags }
+ SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h)
+ end
+ else nil
+ end
+ when /^_[0-9]?_[0-9]!?\s+/ #hanging indent paragraph
+ t_o=if t_o=~/^(_[0-9]?_[0-9]!?\s+)(.+)/m
+ tst,obj=$1,$2
+ if t_o=~/^_[0-9]?_[0-9]!\s+.+/m
+ hang,indent,obj=hang_and_indent_def_test(tst,obj)
+ else
+ hang,indent=hang_and_indent_test(tst)
+ end
+ image=image_test(obj)
+ note=endnote_test?(obj)
+ obj,tags=extract_tags(obj)
+ unless obj=~/\A\s*\Z/m
+ if @@flag[:ocn]==:off_headings_exclude \
+ or @@flag[:ocn]==:off_headings_substantive
+ unless obj =~ /[~-][#]\s*$/
+ obj << ' ~#'
+ end
+ end
+ h={ hang: hang, indent: indent, obj: obj, idx: idx, note_: note, image_: image, tags: tags }
+ SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h)
+ end
+ else nil
+ end
+ when /^<(?:br)?:(?:pa?r|o(?:bj|---)?)>\s*$/ #[br:par] #[br:obj]
+ SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_obj])
+ when /^(?:-\\\\-|<:pb>)\s*$/ #[br:pg]
+ SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page],:markup)
+ when /^(?:=\\\\=|<:pn>)\s*$/ #[br:pgn]
+ SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_new],:markup)
+ when /^-\.\.-\s*$/ #[br:pgl]
+ SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_line],:markup)
+ else #paragraph
+ image=image_test(t_o)
+ note=endnote_test?(t_o)
+ obj,tags=extract_tags(t_o)
+ if @@flag[:ocn]==:off_headings_exclude \
+ or @@flag[:ocn]==:off_headings_substantive
+ unless obj =~ /[~-][#]\s*$/
+ obj << ' ~#'
+ end
+ end
+ unless obj=~/\A\s*\Z/m
+ h={ bullet_: false, indent: 0, hang: 0, obj: obj, idx: idx, note_: note, image_: image, tags: tags }
+ SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h)
+ end
+ end
+ elsif @@flag[:code]==:off
+ if t_o =~/^(?:code\{|[`]{3}\s+code)/
+ @@flag[:code]=case t_o
+ when /^code\{/ then :curls
+ when /^[`]{3}\s+code/ then :tics
+ else @@flag[:code] #error
+ end
+ @@counter=1
+ @codeblock_numbered=(t_o =~/^(?:code\{#|[`]{3}\s+code\s[#])/) ? true : false
+ @num_code_block +=1
+ h={ obj: "code block start #{@num_code_block}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ elsif t_o =~/^(?:poem\{|[`]{3}\s+poem)/
+ @@flag[:poem]=case t_o
+ when /^poem\{/ then :curls
+ when /^[`]{3}\s+poem/ then :tics
+ else @@flag[:poem] #error
+ end
+ @num_poem +=1
+ h={ obj: "poem start #{@num_poem}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ tuned_file << t_o
+ elsif t_o =~/^(?:group\{|[`]{3}\s+group)/
+ @@flag[:group]=case t_o
+ when /^group\{/ then :curls
+ when /^[`]{3}\s+group/ then :tics
+ else @@flag[:group] #error
+ end
+ @num_group +=1
+ h={ obj: "group text start #{@num_group}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ tuned_file << t_o
+ elsif t_o =~/^(?:block\{|[`]{3}\s+block)/
+ @@flag[:block]=case t_o
+ when /^block\{/ then :curls
+ when /^[`]{3}\s+block/ then :tics
+ else @@flag[:block] #error
+ end
+ @num_block +=1
+ h={ obj: "block text start #{@num_block}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ tuned_file << t_o
+ elsif t_o =~/^(?:alt\{|[`]{3}\s+alt)/
+ @@flag[:alt]=case t_o
+ when /^alt\{/ then :curls
+ when /^[`]{3}\s+alt/ then :tics
+ else @@flag[:alt] #error
+ end
+ @num_alt +=1
+ h={ obj: "alt text start #{@num_alt}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ tuned_file << t_o
+ elsif t_o =~/^(?:table\{|[`]{3}\s+table|\{table)[ ~]/
+ @num_table +=1
+ h={ obj: "table start #{@num_table}" }
+ ins=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ tuned_file << ins
+ if t_o=~/^table\{(?:~h)?\s+/
+ @@flag[:table]=:curls
+ @rows=''
+ case t_o
+ when /table\{~h\s+c(\d+);\s+(.+)/
+ cols=$1
+ col=$2.scan(/\d+/)
+ heading=true
+ when /table\{\s+c(\d+);\s+(.+)/
+ cols=$1
+ col=$2.scan(/\d+/)
+ heading=false
+ end
+ @h={ head_: heading, cols: cols, widths: col, idx: idx }
+ elsif t_o=~/^[`]{3}\s+table(?:~h)?\s+c\d+/
+ @@flag[:table]=:tics
+ @rows=''
+ case t_o
+ when /^[`]{3}\s+table~h\s+c(\d+);\s+(.+)/
+ cols=$1
+ col=$2.scan(/\d+/)
+ heading=true
+ when /^[`]{3}\s+table\s+c(\d+);\s+(.+)/
+ cols=$1
+ col=$2.scan(/\d+/)
+ heading=false
+ end
+ @h={ head_: heading, cols: cols, widths: col, idx: idx }
+ elsif t_o=~/^\{table(?:~h)?(?:\s+\d+;?)?\}\n.+\Z/m
+ m1,m2,hd=nil,nil,nil
+ tbl=/^\{table(?:~h)?(?:\s+\d+;?)?\}\n(.+)\Z/m.match(t_o)[1]
+ hd=((t_o =~/^\{table~h/) ? true : false)
+ tbl,tags=extract_tags(tbl)
+ rws=tbl.split(/\n/)
+ rows=''
+ cols=nil
+ rws.each do |r|
+ cols=(cols ? cols : (r.scan('|').length) +1)
+ r=r.gsub(/\s*\|\s*/m,"#{Mx[:tc_p]}") #r.gsub!(/\|/m,"#{Mx[:tc_p]}")
+ rows += r + Mx[:tc_c]
+ end
+ col=[]
+ if t_o =~/^\{table(?:~h)?\s+(\d+);?\}/ #width of col 1 given as %, usually when wider than rest that are even
+ c1=$1.to_i
+ width=(100 - c1)/(cols - 1)
+ col=[ c1 ]
+ (cols - 1).times { col << width }
+ else #all columns of equal width
+ width=100.00/cols
+ cols.times { col << width }
+ end
+ h={ head_: hd, cols: cols, widths: col, obj: rows, idx: idx, tags: tags, num: @num_table }
+ t_o=SiSU_AO_DocumentStructure::ObjectTable.new.table(h) unless h.nil?
+ tuned_file << t_o
+ h={ obj: "table end #{@num_table}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ t_o
+ elsif t_o=~/^[`]{3}\s+table(?:~h)?\s+/
+ m1,m2,hd=nil,nil,nil
+ h=case t_o
+ when /^[`]{3}\s+table~h\s+(.+?)\n(.+)\Z/m #two table representations should be consolidated as one
+ m1,tbl,hd=$1,$2,true
+ when /^[`]{3}\s+table\s+(.+?)\n(.+)\Z/m #two table representations should be consolidated as one
+ m1,tbl,hd=$1,$2,false
+ else nil
+ end
+ tbl,tags=extract_tags(tbl)
+ col=m1.scan(/\d+/)
+ rws=tbl.split(/\n/)
+ rows=''
+ rws.each do |r|
+ r=r.gsub(/\s*\|\s*/m,"#{Mx[:tc_p]}") #r.gsub!(/\|/m,"#{Mx[:tc_p]}")
+ rows += r + Mx[:tc_c]
+ end
+ h={ head_: hd, cols: col.length, widths: col, obj: rows, idx: idx, tags: tags, num: @num_table }
+ t_o=SiSU_AO_DocumentStructure::ObjectTable.new.table(h) unless h.nil?
+ tuned_file << t_o
+ h={ obj: "table end #{@num_table}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ t_o
+ elsif t_o=~/^\{table(?:~h)?\s+/
+ m1,m2,hd=nil,nil,nil
+ h=case t_o
+ when /\{table~h\s+(.+?)\}\n(.+)\Z/m #two table representations should be consolidated as one
+ m1,tbl,hd=$1,$2,true
+ when /\{table\s+(.+?)\}\n(.+)\Z/m #two table representations should be consolidated as one
+ m1,tbl,hd=$1,$2,false
+ else nil
+ end
+ tbl,tags=extract_tags(tbl)
+ col=m1.scan(/\d+/)
+ rws=tbl.split(/\n/)
+ rows=''
+ rws.each do |r|
+ r=r.gsub(/\s*\|\s*/m,"#{Mx[:tc_p]}") #r.gsub!(/\|/m,"#{Mx[:tc_p]}")
+ rows += r + Mx[:tc_c]
+ end
+ h={ head_: hd, cols: col.length, widths: col, obj: rows, idx: idx, tags: tags, num: @num_table }
+ t_o=SiSU_AO_DocumentStructure::ObjectTable.new.table(h) unless h.nil?
+ tuned_file << t_o
+ h={ obj: "table end #{@num_table}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ t_o
+ end
+ end
+ t_o
+ end
+ if @@flag[:table]==:curls or @@flag[:table]==:tics
+ if (@@flag[:table]==:curls \
+ and t_o =~/^\}table/) \
+ or (@@flag[:table]==:tics \
+ and t_o =~/^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/)
+ @@flag[:table]=:off
+ headings,columns,widths,idx=@h[:head_],@h[:cols],@h[:widths],@h[:idx]
+ @h={ head_: headings, cols: columns, widths: widths, idx: idx, obj: @rows }
+ t_o=SiSU_AO_DocumentStructure::ObjectTable.new.table(@h)
+ tuned_file << t_o
+ @h,@rows=nil,''
+ h={ obj: "table end #{@num_table}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ t_o
+ else
+ if t_o.is_a?(String) \
+ and t_o !~/^(?:table\{|[`]{3}\s+table)/
+ t_o=t_o.gsub(/^\n+/m,''). #check added for ruby 1.9.2 not needed in 1.8 series (tested in v2)
+ gsub(/\n+/m,"#{Mx[:tc_p]}")
+ @rows += t_o + Mx[:tc_c]
+ end
+ t_o=nil
+ end
+ end
+ if @@flag[:code]==:curls or @@flag[:code]==:tics
+ if (@@flag[:code]==:curls and t_o =~/^\}code/) \
+ or (@@flag[:code]==:tics and t_o =~/^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/)
+ @@flag[:code]=:off
+ obj=@tuned_code.join("\n")
+ tags=[]
+ h={ obj: obj, tags: tags, num: @num_code_block, number_: @codeblock_numbered }
+ t_o=SiSU_AO_DocumentStructure::ObjectBlockTxt.new.code(h)
+ @tuned_code=[]
+ tuned_file << t_o
+ h={ obj: "code block end #{@num_code_block}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ end
+ if (@@flag[:code]==:curls or @@flag[:code]==:tics) \
+ and t_o.is_a?(String)
+ sub_array=t_o.dup + "#{Mx[:br_nl]}"
+ @line_mode=[]
+ sub_array.scan(/.+/) {|w| @line_mode << w if w =~/[\S]+/}
+ t_o=SiSU_AO_DocumentStructureExtract::Build.new(@md,@line_mode).build_lines(:code).join
+ @tuned_code << t_o
+ t_o=nil
+ end
+ elsif (@@flag[:poem]==:curls or @@flag[:poem]==:tics) \
+ or (@@flag[:group]==:curls or @@flag[:group]==:tics) \
+ or (@@flag[:block]==:curls or @@flag[:block]==:tics) \
+ or (@@flag[:alt]==:curls or @@flag[:alt]==:tics)
+ if (@@flag[:poem]==:curls and t_o =~/^\}poem/) \
+ or (@@flag[:poem]==:tics and t_o =~/^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/)
+ @@flag[:poem]=:off
+ h={ obj: "poem end #{@num_poem}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ elsif (@@flag[:group]==:curls and t_o =~/^\}group/) \
+ or (@@flag[:group]==:tics and t_o =~/^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/)
+ @@flag[:group]=:off
+ obj,tags=extract_tags(@tuned_block.join("\n"))
+ h={ obj: obj, tags: tags, num: @num_group }
+ @tuned_block=[]
+ t_o=SiSU_AO_DocumentStructure::ObjectBlockTxt.new.group(h)
+ tuned_file << t_o
+ h={ obj: "group text end #{@num_group}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ elsif (@@flag[:block]==:curls and t_o =~/^\}block/) \
+ or (@@flag[:block]==:tics and t_o =~/^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/)
+ @@flag[:block]=:off
+ obj,tags=extract_tags(@tuned_block.join("\n"))
+ h={ obj: obj, tags: tags, num: @num_block }
+ @tuned_block=[]
+ t_o=SiSU_AO_DocumentStructure::ObjectBlockTxt.new.block(h)
+ tuned_file << t_o
+ h={ obj: "block text end #{@num_block}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ elsif (@@flag[:alt]==:curls and t_o =~/^\}alt/) \
+ or (@@flag[:alt]==:tics and t_o =~/^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/)
+ @@flag[:alt]=:off
+ obj,tags=extract_tags(@tuned_block.join("\n"))
+ h={ obj: obj, tags: tags, num: @num_alt }
+ t_o=SiSU_AO_DocumentStructure::ObjectBlockTxt.new.alt(h)
+ @tuned_block=[]
+ tuned_file << t_o
+ h={ obj: "alt text end #{@num_alt}" }
+ t_o=SiSU_AO_DocumentStructure::ObjectComment.new.comment(h)
+ end
+ if (@@flag[:poem]==:curls or @@flag[:poem]==:tics \
+ or @@flag[:group]==:curls or @@flag[:group]==:tics \
+ or @@flag[:alt]==:curls or @@flag[:alt]==:tics) \
+ and t_o =~/\S/ \
+ and t_o !~/^(?:\}(?:verse|code|alt|group|block)|(?:verse|code|alt|group|block)\{)/ \
+ and t_o !~/^[`]{3}\s+(?:code|poem|alt|group|block)|^[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$/ # fix logic
+ sub_array=t_o.dup
+ @line_mode=sub_array.scan(/.+/)
+ type=if @@flag[:poem]==:curls or @@flag[:poem]==:tics
+ t_o=SiSU_AO_DocumentStructureExtract::Build.new(@md,@line_mode).build_lines(type).join
+ poem=t_o.split(/\n\n/)
+ poem.each do |v|
+ v=v.gsub(/\n/m,"#{Mx[:br_nl]}\n")
+ obj,tags=extract_tags(v)
+ h={ obj: obj, tags: tags, num: @num_poem }
+ t_o=SiSU_AO_DocumentStructure::ObjectBlockTxt.new.verse(h)
+ tuned_file << t_o
+ end
+ :poem
+ else :group
+ end
+ end
+ @verse_count+=1 if @@flag[:poem]==:curls or @@flag[:poem]==:tics
+ end
+ if @@flag[:code]==:off
+ if @@flag[:poem]==:curls or @@flag[:poem]==:tics \
+ or @@flag[:group]==:curls or @@flag[:group]==:tics \
+ or @@flag[:alt]==:curls or @@flag[:alt]==:tics
+ if t_o.is_a?(String)
+ t_o=t_o.gsub(/\n/m,"#{Mx[:br_nl]}").
+ gsub(/[ ][ ]/m,"#{Mx[:nbsp]*2}").
+ gsub(/#{Mx[:nbsp]}\s/,"#{Mx[:nbsp]*2}")
+ t_o=t_o + Mx[:br_nl] if t_o =~/\S+/
+ elsif t_o.is==:group \
+ || t_o.is==:block \
+ || t_o.is==:alt \
+ || t_o.is==:verse
+ t_o.obj=t_o.obj.gsub(/\n/m,"#{Mx[:br_nl]}").
+ gsub(/[ ][ ]/m,"#{Mx[:nbsp]*2}").
+ gsub(/#{Mx[:nbsp]}\s/,"#{Mx[:nbsp]*2}")
+ end
+ @tuned_block << t_o if t_o =~/\S+/
+ else tuned_file << t_o
+ end
+ else tuned_file << t_o
+ end
+ end
+ if @md.flag_endnotes
+ tuned_file << @pb
+ h={ ln: 1, lc: 1, obj: 'Endnotes', autonum_: false }
+ tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+ h={ ln: 4, lc: 2, obj: 'Endnotes', name: 'endnotes', autonum_: false }
+ tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+ h={ obj: 'Endnotes' }
+ end
+ if @md.book_idx
+ tuned_file << @pb
+ h={ ln: 1, lc: 1, obj: 'Index', autonum_: false }
+ tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+ h={ ln: 4, lc: 2, obj: 'Index', name: 'book_index', autonum_: false }
+ tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+ h={ obj: 'Index' }
+ end
+ tuned_file << @pb
+ h={ ln: 1, lc: 1, obj: 'Metadata', autonum_: false, ocn_: false }
+ tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+ h={ ln: 4, lc: 2, obj: 'SiSU Metadata, document information', name: 'metadata', autonum_: false, ocn_: false }
+ tuned_file << SiSU_AO_DocumentStructure::ObjectHeading.new.heading_insert(h)
+ h={ obj: 'eof' }
+ meta=SiSU_AO_DocumentStructure::ObjectMetadata.new.metadata(@metadata)
+ [tuned_file,meta]
+ end
+ def table_rows_and_columns_array(table_str)
+ table=[]
+ table_str.split(/#{Mx[:tc_c]}/).each do |table_row|
+ table_row_with_columns=table_row.split(/#{Mx[:tc_p]}/)
+ table << table_row_with_columns
+ end
+ table
+ end
+ def meta_heading(h)
+ h={ lv: h[:lv], ln: h[:ln], name: h[:name], obj: h[:obj], ocn: '0' }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h)
+ end
+ def meta_para(str)
+ h={ obj: str, ocn_: false }
+ SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h)
+ end
+ def build_lines(type=:none)
+ lines,lines_new=@data,[]
+ lines.each do |line|
+ line=if line =~/\S/ \
+ and line !~/^(?:code\{|\}code)/ \
+ and line !~/^(?:[`]{3}\s+code|[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*$)/ \
+ and not line.is_a?(Hash) #watch
+ @@counter+=1 if @@flag[:code]==:curls or @@flag[:code]==:tics
+ line=line.gsub(/\s\s/,"#{Mx[:nbsp]*2}").
+ gsub(/#{Mx[:nbsp]}\s/,"#{Mx[:nbsp]*2}")
+ line=line.gsub(/^/,"#{Mx[:gr_o]}codeline#{Mx[:gr_c]}") if type==:code # REMOVE try sort for texpdf special case
+ line=if line =~/(?:https?|file|ftp):\/\/\S+$/
+ line.gsub(/\s*$/," #{Mx[:br_nl]}")
+ else line.gsub(/\s*$/,"#{Mx[:br_nl]}") #unless type=='code'
+ end
+ elsif line =~/^\s*$/
+ line.gsub(/\s*$/,"#{Mx[:br_nl]}")
+ else line
+ end
+ lines_new << line
+ end
+ lines_new
+ end
+ end
+ class Structure # this must happen early
+ def initialize(md,dob)
+ @md,@dob=md,dob
+ end
+ def structure
+ structure_markup
+ @dob
+ end
+ def structure_markup #build structure where structure provided only in meta header
+ @dob=if @dob.is==:para \
+ && (((@dob.hang !~/[1-9]/) && (@dob.indent !~/[1-9]/)) \
+ || (@dob.hang != @dob.indent)) \
+ and not @dob.bullet_
+ @dob=case @dob.obj
+ when /^#{@md.lv0}/
+ h={ lv: 'A', ln: 0 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,@dob)
+ when /^#{@md.lv1}/
+ h={ lv: 'B', ln: 1 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,@dob)
+ when /^#{@md.lv2}/
+ h={ lv: 'C', ln: 2 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,@dob)
+ when /^#{@md.lv3}/
+ h={ lv: 'D', ln: 3 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,@dob)
+ when /^#{@md.lv4}/
+ h={ lv: '1', ln: 4 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,@dob)
+ when /^#{@md.lv5}/
+ h={ lv: '2', ln: 5 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,@dob)
+ when /^#{@md.lv6}/
+ h={ lv: '3', ln: 6 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,@dob)
+ else @dob
+ end
+ else @dob
+ end
+ @dob
+ end
+ end
+ class OCN
+ def initialize(md,data)
+ @md,@data=md,data
+ end
+ def structure_info
+ def lv
+ %w[A~ B~ C~ D~ 1 2 3]
+ end
+ def possible_parents(child)
+ case child
+ when /A~/ then 'none'
+ when /B~/ then 'A~'
+ when /C~/ then 'B~'
+ when /D~/ then 'C~'
+ when /1/ then 'A~, B~, C~, D~'
+ when /2/ then '1'
+ when /3/ then '2'
+ end
+ end
+ def possible_children(parent)
+ case parent
+ when /A~/ then 'B~, 1'
+ when /B~/ then 'C~, 1'
+ when /C~/ then 'D~, 1'
+ when /D~/ then '1'
+ when /1/ then '2'
+ when /2/ then '3'
+ when /3/ then 'none'
+ end
+ end
+ self
+ end
+ def document_structure_check_info(node,node_parent,status=:ok)
+ node_ln=/^([0-6])/.match(node)[1].to_i
+ node_parent_ln=/^([0-6])/.match(node_parent)[1].to_i
+ if status==:error \
+ or @md.opt.act[:maintenance][:set]==:on
+ puts %{node: #{node}, parent node: #{node_parent} #{status.upcase}}
+ if status==:error
+ node_ln=/^([0-6])/.match(node)[1].to_i
+ node_parent_ln=/^([0-6])/.match(node_parent)[1].to_i
+ puts %{current level: #{structure_info.lv[node_ln]} (possible parent levels: #{structure_info.possible_parents(structure_info.lv[node_ln])})
+parent level: #{structure_info.lv[node_parent_ln]} (possible child levels: #{structure_info.possible_children(structure_info.lv[node_parent_ln])})
+-- }
+ end
+ end
+ end
+ def warning_incorrect_parent_level_or_level(txt)
+ puts %{warning,
+#{txt}
+has incorrect level and/or parent level}
+ end
+ def ocn #and auto segment numbering increment
+ data=@data
+ @o_array=[]
+ node=ocn=ocn_dv=ocn_sp=ocnh=ocnh0=ocnh1=ocnh2=ocnh3=ocnh4=ocnh5=ocnh6=ocno=ocnp=ocnt=ocnc=ocng=ocni=ocnu=0 # h heading, o other, t table, g group, i image
+ regex_exclude_ocn_and_node = /#{Rx[:meta]}|^@\S+?:\s|^4~endnotes|^#{Mx[:lv_o]}4:endnotes#{Mx[:lv_c]}|^\^~ |<:e[:_]\d+?>|^<:\#|<:- |<[:!]!4|<hr width|#{Mx[:br_endnotes]}|\A\s*\Z/mi #ocn here #&nbsp; added with Tune.code #¡
+ parent=node1=node2=node3=node4=node5=node6=nil
+ node0='0:0;0'
+ @collapsed_lv0=0
+ data.each do |dob|
+ h={}
+ if (dob.obj !~ regex_exclude_ocn_and_node || dob.is==:code) \
+ && (dob.of !=:comment \
+ && dob.of !=:layout \
+ && dob.of !=:meta) \
+ && dob.ocn_
+ #dob.ln now is determined, and set earlier, check how best to remove this -->
+ if dob.is==:heading
+ ln=case dob.lv
+ when 'A' then 0
+ when 'B' then 1
+ when 'C' then 2
+ when 'D' then 3
+ when '1' then 4
+ when '2' then 5
+ when '3' then 6
+ when '4' then 7
+ when '5' then 8
+ when '6' then 9
+ end
+ end
+ if not dob.obj =~/~#|-#/
+ ocn+=1
+ end
+ if dob.is==:heading \
+ and (ln.to_s =~/^[0-9]/ \
+ or ln.to_s =~@md.lv0 \
+ or ln.to_s =~@md.lv1 \
+ or ln.to_s =~@md.lv2 \
+ or ln.to_s =~@md.lv3 \
+ or ln.to_s =~@md.lv4 \
+ or ln.to_s =~@md.lv5 \
+ or ln.to_s =~@md.lv6)
+ if not dob.obj =~/~#|-#/
+ ocnh+=1
+ end
+ if ln==0 \
+ or ln=~@md.lv0
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ ocnh0+=1 #heading
+ node0="0:#{ocnh0};#{ocn}"
+ else
+ ocn_flag=false
+ node0="0:0;0"
+ end
+ document_structure_check_info(node0,node0)
+ @collapsed_lv0=0
+ collapsed_level=@collapsed_lv0
+ node,ocn_sp,parent=node0,"h#{ocnh}",'ROOT'
+ elsif ln==1 \
+ or ln=~@md.lv1
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ ocnh1+=1 #heading
+ node1="1:#{ocnh1};#{ocn}"
+ else
+ ocn_flag=false
+ node1="1:0;0"
+ end
+ parent=if node0
+ document_structure_check_info(node1,node0)
+ @collapsed_lv1=@collapsed_lv0+1
+ node0
+ else
+ document_structure_check_info(node0,node0,:error)
+ node0
+ end
+ collapsed_level=@collapsed_lv1
+ node,ocn_sp,parent=node1,"h#{ocnh}",node0 #FIX
+ elsif ln==2 \
+ or ln=~@md.lv2
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ ocnh2+=1
+ node2="2:#{ocnh2};#{ocn}"
+ else
+ ocn_flag=false
+ node2="2:0;0"
+ end
+ parent=if node1
+ document_structure_check_info(node2,node1)
+ @collapsed_lv2=@collapsed_lv1+1
+ node1
+ else
+ document_structure_check_info(node2,node0,:error)
+ node0
+ end
+ collapsed_level=@collapsed_lv2
+ node,ocn_sp=node2,"h#{ocnh}"
+ elsif ln==3 \
+ or ln=~@md.lv3
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ ocnh3+=1
+ node3="3:#{ocnh3};#{ocn}"
+ else
+ ocn_flag=false
+ node3="3:0;0"
+ end
+ parent=if node2
+ document_structure_check_info(node3,node2)
+ @collapsed_lv3=@collapsed_lv2+1
+ node2
+ elsif node1
+ warning_incorrect_parent_level_or_level(dob.obj)
+ puts %{parent is :A~ & this level #{dob.lv}
+either parent should be level :B~
+or this level should be level :B~ rather than #{dob.lv}}
+ document_structure_check_info(node3,node1,:error)
+ @collapsed_lv3=@collapsed_lv1+1
+ node1
+ else
+ document_structure_check_info(node3,node0,:error)
+ warning_incorrect_parent_level_or_level(dob.obj)
+ node0
+ end
+ collapsed_level=@collapsed_lv3
+ node,ocn_sp=node3,"h#{ocnh}"
+ elsif ln==4 \
+ or ln=~@md.lv4
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ ocnh4+=1
+ node4="4:#{ocnh4};#{ocn}"
+ else
+ ocn_flag=false
+ node4="4:0;0"
+ end
+ parent=if node3
+ document_structure_check_info(node4,node3)
+ @collapsed_lv4=@collapsed_lv3+1
+ node3
+ elsif node2
+ document_structure_check_info(node4,node2)
+ @collapsed_lv4=@collapsed_lv2+1
+ node2
+ elsif node1
+ document_structure_check_info(node4,node1)
+ @collapsed_lv4=@collapsed_lv1+1
+ node1
+ elsif node0
+ document_structure_check_info(node4,node0)
+ @collapsed_lv4=@collapsed_lv0+1
+ node0
+ else
+ warning_incorrect_parent_level_or_level(dob.obj)
+ document_structure_check_info(node4,node0,:error)
+ node0
+ end
+ collapsed_level=@collapsed_lv4
+ node,ocn_sp=node4,"h#{ocnh}"
+ elsif ln==5 \
+ or ln=~@md.lv5
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ ocnh5+=1
+ node5="5:#{ocnh5};#{ocn}"
+ else
+ ocn_flag=false
+ node5="5:0;0"
+ end
+ parent=if node4
+ document_structure_check_info(node5,node4)
+ @collapsed_lv5=@collapsed_lv4+1
+ node4
+ elsif node3
+ warning_incorrect_parent_level_or_level(dob.obj)
+ document_structure_check_info(node5,node3,:error)
+ @collapsed_lv5=@collapsed_lv3+1
+ node3
+ elsif node2
+ warning_incorrect_parent_level_or_level(dob.obj)
+ document_structure_check_info(node5,node2,:error)
+ @collapsed_lv5=@collapsed_lv2+1
+ node2
+ elsif node1
+ warning_incorrect_parent_level_or_level(dob.obj)
+ document_structure_check_info(node5,node1,:error)
+ @collapsed_lv5=@collapsed_lv1+1
+ node1
+ else
+ document_structure_check_info(node5,node0,:error)
+ node0
+ end
+ collapsed_level=@collapsed_lv5
+ node,ocn_sp=node5,"h#{ocnh}"
+ elsif ln==6 \
+ or ln=~@md.lv6
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ ocnh6+=1
+ node6="6:#{ocnh6};#{ocn}"
+ else
+ ocn_flag=false
+ node6="6:0;0"
+ end
+ parent=if node5
+ document_structure_check_info(node6,node5)
+ @collapsed_lv6=@collapsed_lv5+1
+ node5
+ elsif node4
+ warning_incorrect_parent_level_or_level(dob.obj)
+ puts "parent is level 4~ & this level #{dob.lv}
+either parent should be level 5~
+or this level should be 5~ rather #{dob.lv}" #level 6
+ document_structure_check_info(node6,node4,:error)
+ @collapsed_lv6=@collapsed_lv4+1
+ node4
+ elsif node3
+ warning_incorrect_parent_level_or_level(dob.obj)
+ document_structure_check_info(node6,node3,:error)
+ @collapsed_lv6=@collapsed_lv3+1
+ node3
+ elsif node2
+ warning_incorrect_parent_level_or_level(dob.obj)
+ document_structure_check_info(node6,node2,:error)
+ @collapsed_lv6=@collapsed_lv2+1
+ node2
+ elsif node1
+ warning_incorrect_parent_level_or_level(dob.obj)
+ document_structure_check_info(node6,node1,:error)
+ @collapsed_lv6=@collapsed_lv1+1
+ node1
+ else
+ document_structure_check_info(node6,node0,:error)
+ node0
+ end
+ collapsed_level=@collapsed_lv6
+ node,ocn_sp=node6,"h#{ocnh}"
+ end
+ else
+ if not dob.obj =~/~#|-#/
+ ocn_flag=true
+ else
+ ocn_flag=false
+ end
+ ocno+=1
+ if dob.is==:table
+ ocnt+=1
+ ocn_sp,parent="t#{ocnt}",node
+ elsif dob.is==:code
+ ocnc+=1
+ ocn_sp,parent="c#{ocnc}",node
+ elsif dob.is==:group \
+ || dob.is==:block \
+ || dob.is==:alt \
+ || dob.is==:verse
+ ocng+=1 #group, poem
+ ocn_sp,parent="g#{ocng}",node
+ elsif dob.is==:image #check
+ ocni+=1
+ ocn_sp,parent="i#{ocni}",node
+ else ocnp+=1 #paragraph
+ ocn_sp,parent="p#{ocnp}",node
+ end
+ end
+ if dob.is==:heading
+ if ocn_flag==true
+ dob.ln,dob.node,dob.ocn,dob.ocn_,dob.odv,dob.osp,dob.parent,dob.lc=ln,node,ocn,ocn_flag,ocn_dv,ocn_sp,parent,collapsed_level
+ else
+ ocnu+=1
+ dob.obj=dob.obj.gsub(/#{Mx[:fa_o]}[~-]##{Mx[:fa_c]}/,'') if dob.obj
+ ocn_dv,ocn_sp="u#{ocnu}","u#{ocnu}"
+ dob.ln,dob.node,dob.ocn,dob.ocn_,dob.odv,dob.osp,dob.parent,dob.lc=ln,node,nil,ocn_flag,ocn_dv,ocn_sp,parent,collapsed_level
+ end
+ else
+ if dob.of !=:meta \
+ && dob.of !=:comment \
+ && dob.of !=:layout
+ if ocn_flag == true
+ dob.ocn,dob.ocn_,dob.odv,dob.osp,dob.parent=ocn,ocn_flag,ocn_dv,ocn_sp,parent
+ else
+ ocnu+=1
+ dob.obj=dob.obj.gsub(/#{Mx[:fa_o]}[~-]##{Mx[:fa_c]}/,'') if dob.obj
+ ocn_dv,ocn_sp="u#{ocnu}","u#{ocnu}"
+ dob.ocn,dob.ocn_,dob.odv,dob.osp,dob.parent=nil,ocn_flag,ocn_dv,ocn_sp,parent
+ end
+ end
+ end
+ h
+ elsif dob.obj=~/#{Mx[:pa_non_object_no_heading]}/
+ dob.obj=dob.obj.gsub(/#{Mx[:pa_non_object_no_heading]}/,'')
+ if dob.is==:para
+ h={ obj: dob.obj, ocn_: false, ocn: nil, hang: dob.hang, indent: dob.indent, bullet_: dob.bullet_, tags: dob.tags, parent: dob.parent }
+ dob=SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h,dob)
+ elsif dob.is==:heading
+ h={ obj: dob.obj, ocn_: false, ocn: nil, toc_: true, parent: dob.parent }
+ dob=SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,dob)
+ end
+ elsif dob.obj=~/#{Mx[:pa_non_object_dummy_heading]}/
+ dob.obj=dob.obj.gsub(/#{Mx[:pa_non_object_dummy_heading]}/,'')
+ if dob.is==:para
+ h={ obj: dob.obj, ocn_: false, ocn: nil, hang: dob.hang, indent: dob.indent, bullet_: dob.bullet_, tags: dob.tags, parent: dob.parent }
+ dob=SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h,dob)
+ elsif dob.is==:heading
+ h={ obj: dob.obj, ocn_: false, ocn: nil, toc_: false, parent: dob.parent }
+ dob=SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h,dob)
+ end
+ else dob
+ end
+ if dob.is==:code \
+ || dob.is==:verse \
+ || dob.is==:alt \
+ || dob.is==:group \
+ || dob.is==:block
+ dob.obj=dob.obj.gsub(/\n\n/,"\n") #newlines taken out
+ end
+ @o_array << dob
+ end
+ @o_array
+ end
+ end
+ class XML
+ def initialize(md,data)
+ @data,@md=data,md
+ end
+ def dom
+ @s=[
+ 'A',
+ 'B',
+ 'C',
+ 'D',
+ '1',
+ '2',
+ '3'
+ ]
+ @sp=' '
+ tuned_file=structure_build
+ tuned_file
+ end
+ def structure_build
+ data=@data
+ tuned_file=[]
+ hs=[0,false,false,false]
+ t={ lv: @s[0], status: 'open' }
+ tuned_file << tags(t)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts "\nXML sisu structure outline --->\n"
+ puts "<#{@s[0]}>"
+ end
+ data.each_with_index do |o,i|
+ if o.is==:heading \
+ || o.is==:heading_insert
+ case o.ln
+ when 0
+ tuned_file << tag_close(o.ln,hs)
+ tuned_file << tag_open(o,@s)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(o.ln,hs)
+ puts_tag_open(o,@s)
+ end
+ hs=[0,true,false,false,false]
+ when 1
+ tuned_file << tag_close(o.ln,hs)
+ tuned_file << tag_open(o,@s)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(o.ln,hs)
+ puts_tag_open(o,@s)
+ end
+ hs=[1,true,true,false,false]
+ when 2
+ tuned_file << tag_close(o.ln,hs)
+ tuned_file << tag_open(o,@s)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(o.ln,hs)
+ puts_tag_open(o,@s)
+ end
+ hs=[2,true,true,true,false]
+ when 3
+ tuned_file << tag_close(o.ln,hs)
+ tuned_file << tag_open(o,@s)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(o.ln,hs)
+ puts_tag_open(o,@s)
+ end
+ hs=[3,true,true,true,true]
+ when 4
+ tuned_file << tag_close(o.ln,hs)
+ tuned_file << tag_open(o,@s)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(o.ln,hs)
+ puts_tag_open(o,@s)
+ end
+ hs[0]=4
+ when 5
+ tuned_file << tag_close(o.ln,hs)
+ tuned_file << tag_open(o,@s)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(o.ln,hs)
+ puts_tag_open(o,@s)
+ end
+ hs[0]=5
+ when 6
+ tuned_file << tag_close(o.ln,hs)
+ tuned_file << tag_open(o,@s)
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(o.ln,hs)
+ puts_tag_open(o,@s)
+ end
+ hs[0]=6
+ end
+ end
+ tuned_file << o
+ end
+ if @md.opt.act[:verbose_plus][:set]==:on
+ puts_tag_close(0,hs)
+ end
+ tuned_file << tag_close(0,hs)
+ tuned_file=tuned_file.flatten
+ end
+ def tags(o)
+ tag=(o[:status]=='open') \
+ ? %{<#{o[:lv]} id="#{o[:node]}">}
+ : "</#{o[:lv]}>"
+ ln=case o[:lv]
+ when 'A' then 0
+ when 'B' then 1
+ when 'C' then 2
+ when 'D' then 3
+ when '1' then 4
+ when '2' then 5
+ when '3' then 6
+ when '4' then 7
+ when '5' then 8
+ when '6' then 9
+ end
+ h={ tag: tag, node: o[:node], lv: o[:lv], ln: ln, status: o[:status] }
+ SiSU_AO_DocumentStructure::ObjectStructure.new.xml_dom(h) #downstream code utilise else ignore like comments
+ end
+ def tag_open(o,tag)
+ t={ lv: tag[o.ln], node: o.node, status: 'open' }
+ t_o=tags(t)
+ t_o
+ end
+ def tag_close(lev,hs)
+ ary=[]
+ case hs[0]
+ when 0
+ if (lev <= 0) and hs[0]
+ t={ lv: @s[0], status: 'close' }
+ ary << tags(t)
+ end
+ when 1
+ if (lev <= 1) and hs[1]
+ t={ lv: @s[1], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev==0)
+ t={ lv: @s[0], status: 'close' }
+ ary << tags(t)
+ end
+ when 2
+ if (lev <= 2) and hs[2]
+ t={ lv: @s[2], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 1) and hs[1]
+ t={ lv: @s[1], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev==0)
+ t={ lv: @s[0], status: 'close' }
+ ary << tags(t)
+ end
+ when 3
+ if (lev <= 3) and hs[3]
+ t={ lv: @s[3], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 2) and hs[2]
+ t={ lv: @s[2], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 1) and hs[1]
+ t={ lv: @s[1], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev==0)
+ t={ lv: @s[0], status: 'close' }
+ ary << tags(t)
+ end
+ when 4
+ if (lev <= 4)
+ t={ lv: @s[4], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 3) and hs[3]
+ t={ lv: @s[3], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 2) and hs[2]
+ t={ lv: @s[2], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 1) and hs[1]
+ t={ lv: @s[1], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev==0)
+ t={ lv: @s[0], status: 'close' }
+ ary << tags(t)
+ end
+ when 5
+ if (lev <= 5)
+ t={ lv: @s[5], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 4)
+ t={ lv: @s[4], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 3) and hs[3]
+ t={ lv: @s[3], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 2) and hs[2]
+ t={ lv: @s[2], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 1) and hs[1]
+ t={ lv: @s[1], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev==0)
+ t={ lv: @s[0], status: 'close' }
+ ary << tags(t)
+ end
+ when 6
+ if (lev <= 6)
+ t={ lv: @s[6], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 5)
+ t={ lv: @s[5], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 4)
+ t={ lv: @s[4], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 3) and hs[3]
+ t={ lv: @s[3], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 2) and hs[2]
+ t={ lv: @s[2], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev <= 1) and hs[1]
+ t={ lv: @s[1], status: 'close' }
+ ary << tags(t)
+ end
+ if (lev==0)
+ t={ lv: @s[0], status: 'close' }
+ ary << tags(t)
+ end
+ end
+ ary
+ end
+ def puts_tag_open(o,tag)
+ puts %{#{@sp*o.ln}<#{tag[o.ln]} id="#{o.node}">}
+ end
+ def puts_tag_close(lev,hs)
+ case hs[0]
+ when 0
+ #puts "#{@sp*0}</#{@s[0]}>" if (lev <= 0) and hs[0]
+ puts "</#{@s[0]}>" if (lev==0)
+ when 1
+ puts "#{@sp*1}</#{@s[1]}>" if (lev <= 1) and hs[1]
+ puts "</#{@s[0]}>" if (lev==0)
+ when 2
+ puts "#{@sp*2}</#{@s[2]}>" if (lev <= 2) and hs[2]
+ puts "#{@sp*1}</#{@s[1]}>" if (lev <= 1) and hs[1]
+ puts "</#{@s[0]}>" if (lev==0)
+ when 3
+ puts "#{@sp*3}</#{@s[3]}>" if (lev <= 3) and hs[3]
+ puts "#{@sp*2}</#{@s[2]}>" if (lev <= 2) and hs[2]
+ puts "#{@sp*1}</#{@s[1]}>" if (lev <= 1) and hs[1]
+ puts "</#{@s[0]}>" if (lev==0)
+ when 4
+ puts "#{@sp*4}</#{@s[4]}>" if (lev <= 4)
+ puts "#{@sp*3}</#{@s[3]}>" if (lev <= 3) and hs[3]
+ puts "#{@sp*2}</#{@s[2]}>" if (lev <= 2) and hs[2]
+ puts "#{@sp*1}</#{@s[1]}>" if (lev <= 1) and hs[1]
+ puts "</#{@s[0]}>" if (lev==0)
+ when 5
+ puts "#{@sp*5}</#{@s[5]}>" if (lev <= 5)
+ puts "#{@sp*4}</#{@s[4]}>" if (lev <= 4)
+ puts "#{@sp*3}</#{@s[3]}>" if (lev <= 3) and hs[3]
+ puts "#{@sp*2}</#{@s[2]}>" if (lev <= 2) and hs[2]
+ puts "#{@sp*1}</#{@s[1]}>" if (lev <= 1) and hs[1]
+ puts "</#{@s[0]}>" if (lev==0)
+ when 6
+ puts "#{@sp*6}</#{@s[6]}>" if (lev <= 6)
+ puts "#{@sp*5}</#{@s[5]}>" if (lev <= 5)
+ puts "#{@sp*4}</#{@s[4]}>" if (lev <= 4)
+ puts "#{@sp*3}</#{@s[3]}>" if (lev <= 3) and hs[3]
+ puts "#{@sp*2}</#{@s[2]}>" if (lev <= 2) and hs[2]
+ puts "#{@sp*1}</#{@s[1]}>" if (lev <= 1) and hs[1]
+ puts "</#{@s[0]}>" if (lev==0)
+ end
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_endnotes.rb b/lib/sisu/v6/ao_endnotes.rb
new file mode 100644
index 0000000..2150909
--- /dev/null
+++ b/lib/sisu/v6/ao_endnotes.rb
@@ -0,0 +1,129 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_doc_endnotes.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_Endnotes
+ class Endnotes
+ def initialize(md,data,endnote_array=nil)
+ @md,@data,@endnote_array=md,data,endnote_array
+ @endnote_counter,@endnote_counter_asterisk,@endnote_counter_dag=1,1,1
+ end
+ def endnotes
+ data=@data
+ @tuned_file=[]
+ endnote_ref=1
+ data.each do |dob|
+ # manually numbered endnotes <!e(\d)!> <!e_(\d)!> -->
+ if @md.opt.mod.inspect =~/--no-asterisk|--no-annotate/
+ dob.obj=dob.obj.gsub(/#{Mx[:en_b_o]}\s.+?#{Mx[:en_b_c]}/,'')
+ end
+ if @md.opt.mod.inspect =~/--no-dagger|--no-annotate/
+ dob.obj=dob.obj.gsub(/#{Mx[:en_b_o]}[+]\s.+?#{Mx[:en_b_c]}/,'')
+ end
+ if (defined? dob.obj) \
+ && (defined? dob.is) \
+ && dob.is !=:code
+ case dob.obj # auto-numbered endnotes <!e!> <!e_!> -->
+ when /#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}[*+]\s+.+?#{Mx[:en_b_c]}/
+ dob.obj=dob.obj.gsub(/\s*(#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/,'\1')
+ word_mode=dob.obj.scan(/\S+/m)
+ word_mode=endnote_call_number(word_mode)
+ dob.obj=word_mode.join(' ')
+ endnote_ref+=1
+ when /~\^(?:\s|$)|<:e>/ #%note inserts endnotes previously gathered from /^(<!e[:_]!>|[-~]\{{3})/ (in earlier loop)
+ word_mode=dob.obj.scan(/\S+/m)
+ word_mode=endnote_call_number(word_mode)
+ dob.obj=word_mode.join(' ')
+ endnote_ref+=1
+ end
+ end
+ @tuned_file << dob
+ end
+ @endnote_counter,@endnote_counter_asterisk,@endnote_counter_dag=1,1,1
+ @tuned_file=@tuned_file.flatten
+ end
+ def endnote_call_number(words)
+ words.each do |word|
+ case word
+ when /#{Mx[:en_a_o]}/
+ unless word =~/#{Mx[:en_a_o]}[*+]+/
+ word.gsub!(/#{Mx[:en_a_o]}/,"#{Mx[:en_a_o]}#{@endnote_counter} ")
+ @endnote_counter+=1
+ end
+ when /#{Mx[:en_b_o]}/
+ if word =~/#{Mx[:en_b_o]}[+]/
+ word.gsub!(/#{Mx[:en_b_o]}[+]/,"#{Mx[:en_b_o]}\+#{@endnote_counter_dag} ")
+ @endnote_counter_dag+=1
+ else
+ word.gsub!(/#{Mx[:en_b_o]}[*]?/,"#{Mx[:en_b_o]}\*#{@endnote_counter_asterisk} ")
+ @endnote_counter_asterisk+=1
+ end
+ when /~\^|<:e>/
+ if @endnote_array
+ word.gsub!(/~\^|<:e>/,"#{@endnote_array[@endnote_counter-1]}")
+ @endnote_counter+=1
+ end
+ end
+ end
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_expand_insertions.rb b/lib/sisu/v6/ao_expand_insertions.rb
new file mode 100644
index 0000000..65386c4
--- /dev/null
+++ b/lib/sisu/v6/ao_expand_insertions.rb
@@ -0,0 +1,451 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_expand_insertions.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_Insertions
+ class Insertions
+ def initialize(md,data)
+ @md,@data=md,data
+ end
+ def output_filetypes_in_cmd(cmd_shortcut,lnk=nil) #make list of file types in shortcut command (as configured), e.g. when sisu -3 is used
+ cf_defaults=SiSU_Env::InfoProcessingFlag.new
+ cmd_list=case cmd_shortcut.inspect
+ when /0/ then cf_defaults.cf_0
+ when /1/ then cf_defaults.cf_1
+ when /2/ then cf_defaults.cf_2
+ when /3/ then cf_defaults.cf_3
+ when /4/ then cf_defaults.cf_4
+ when /5/ then cf_defaults.cf_5
+ end
+ file_type_names={}
+ file_type_names[:gen],file_type_names[:src]=[],[]
+ file_type_names[:gen] <<= if cmd_list =~ /y/ then "~^ { document manifest }#{lnk[:manifest]}"
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /h/ then [" { html, segmented text }#{lnk[:html_toc]}"," { html, scroll, document in one }#{lnk[:html_doc]}"]
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /e/ then [" { epub }#{lnk[:epub]}"]
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /p/ then [" { pdf, landscape }#{lnk[:pdf_landscape]}"," { pdf, portrait }#{lnk[:pdf_portrait]}"]
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /o/ then " { odf:odt, open document text }#{lnk[:odt]}"
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /b/ then " { xhtml scroll }#{lnk[:xhtml]}"
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /x/ then " { xml, sax }#{lnk[:xml_sax]}"
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /X/ then " { xml, dom }#{lnk[:xml_dom]}"
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /a/ then " { plain text utf-8 }#{lnk[:txt]}"
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /g/ then 'wiki.txt'
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /w/ then " { concordance }#{lnk[:html_concordance]}"
+ end
+ file_type_names[:gen] <<= if cmd_list =~ /N/ then " { dcc, document content certificate (digests) }#{lnk[:digest]}"
+ end
+ file_type_names[:src] <<= if source and cmd_shortcut =~ /s/ then " { markup source text }#{lnk[:source]}"
+ end
+ file_type_names[:src] <<= if cmd_shortcut =~ /S/ then " { markup source (zipped) pod }#{lnk[:sisupod]}"
+ end
+ file_type_names[:gen]=file_type_names[:gen].flatten
+ file_type_names[:src]=file_type_names[:src].flatten
+ file_type_names
+ end
+ def by_language(linked_doc,lng,src=nil)
+ @linked_doc,@lng,@src=linked_doc,lng,src
+ @base_path="#{@md.file.output_path.base.url}/#{lng}"
+ def fnh
+ {
+ fn: @linked_doc,
+ }
+ end
+ def path_and_file(fn,pth)
+ "#{@base_path}/#{pth}/#{fn}"
+ end
+ def manifest
+ fn=@md.file.base_filename.manifest(fnh)
+ path_and_file(fn,'manifest')
+ end
+ def html_toc
+ fn=@md.file.base_filename.html_segtoc(fnh)
+ "#{@base_path}/html/#{@linked_doc}/#{fn}"
+ end
+ def html_doc
+ fn=@md.file.base_filename.html_scroll(fnh)
+ path_and_file(fn,'html')
+ end
+ def html_concordance
+ fn=@md.file.base_filename.html_concordance
+ "#{@base_path}/html/#{@linked_doc}/#{fn}"
+ end
+ def epub
+ fn=@md.file.base_filename.epub(fnh)
+ path_and_file(fn,'epub')
+ end
+ def pdf_landscape
+ fn=@md.file.base_filename.pdf_l_a4(fnh)
+ path_and_file(fn,'pdf')
+ end
+ def pdf_portrait
+ fn=@md.file.base_filename.pdf_p_a4(fnh)
+ path_and_file(fn,'pdf')
+ end
+ def odt
+ fn=@md.file.base_filename.odt(fnh)
+ path_and_file(fn,'odt')
+ end
+ def xhtml
+ fn=@md.file.base_filename.xhtml(fnh)
+ path_and_file(fn,'xhtml')
+ end
+ def xml_sax
+ fn=@md.file.base_filename.xml_sax(fnh)
+ path_and_file(fn,'xml_sax')
+ end
+ def xml_dom
+ fn=@md.file.base_filename.xml_dom(fnh)
+ path_and_file(fn,'xml_dom')
+ end
+ def txt
+ fn=@md.file.base_filename.txt(fnh)
+ path_and_file(fn,'txt')
+ end
+ def digest
+ fn=@md.file.base_filename.hash_digest(fnh)
+ path_and_file(fn,'digest')
+ end
+ def source
+ "#{@base_path}/src/#{@src}"
+ end
+ def sisupod
+ "#{@base_path}/src/#{@src}.zip"
+ end
+ self
+ end
+ def by_filetype(linked_doc,lng,src=nil)
+ @linked_doc,@lng,@src=linked_doc,lng,src
+ @lc=SiSU_Env::FilenameLanguageCodeInsert.new(@md.opt,lng).language_code_insert
+ @base_path="#{@md.file.output_path.base.url}"
+ def fnh
+ {
+ fn: @linked_doc,
+ lng: @lc,
+ }
+ end
+ def path_and_file(fn,pth)
+ "#{@base_path}/#{pth}/#{fn}"
+ end
+ def manifest
+ fn=@md.file.base_filename.manifest(fnh)
+ path_and_file(fn,'manifest')
+ end
+ def html_toc
+ fn=@md.file.base_filename.html_segtoc(fnh)
+ path_and_file(fn,'html')
+ end
+ def html_doc
+ fn=@md.file.base_filename.html_scroll(fnh)
+ path_and_file(fn,'html')
+ end
+ def html_concordance
+ fn=@md.file.base_filename.html_concordance
+ path_and_file(fn,'html')
+ end
+ def epub
+ fn=@md.file.base_filename.epub(fnh)
+ path_and_file(fn,'epub')
+ end
+ def pdf_landscape
+ fn=@md.file.base_filename.pdf_l_a4(fnh)
+ path_and_file(fn,'pdf')
+ end
+ def pdf_portrait
+ fn=@md.file.base_filename.pdf_p_a4(fnh)
+ path_and_file(fn,'pdf')
+ end
+ def odt
+ fn=@md.file.base_filename.odt(fnh)
+ path_and_file(fn,'odt')
+ end
+ def xhtml
+ fn=@md.file.base_filename.xhtml(fnh)
+ path_and_file(fn,'xhtml')
+ end
+ def xml_sax
+ fn=@md.file.base_filename.xml_sax(fnh)
+ path_and_file(fn,'xml_sax')
+ end
+ def xml_dom
+ fn=@md.file.base_filename.xml_dom(fnh)
+ path_and_file(fn,'xml_dom')
+ end
+ def txt
+ fn=@md.file.base_filename.txt(fnh)
+ path_and_file(fn,'txt')
+ end
+ def digest
+ fn=@md.file.base_filename.hash_digest(fnh)
+ path_and_file(fn,'digest')
+ end
+ def source
+ "#{@base_path}/src/#{@src}"
+ end
+ def sisupod
+ "#{@base_path}/src/#{@src}.zip"
+ end
+ self
+ end
+ def by_filename(linked_doc,lng,src=nil)
+ @linked_doc,@lng,@src=linked_doc,lng,src
+ @lc=SiSU_Env::FilenameLanguageCodeInsert.new(@md.opt,lng).language_code_insert
+ @base_path="#{@md.file.output_path.base.url}/#{@linked_doc}"
+ def fnh
+ {
+ fn: @linked_doc,
+ lng: @lc,
+ }
+ end
+ def path_and_file(fn,pth=nil)
+ (pth.nil?) \
+ ? "#{@base_path}/#{fn}"
+ : "#{@base_path}/#{pth}/#{fn}"
+ end
+ def manifest
+ fn=@md.file.base_filename.manifest(fnh)
+ path_and_file(fn)
+ end
+ def html_toc
+ fn=@md.file.base_filename.html_segtoc(fnh)
+ path_and_file(fn)
+ end
+ def html_doc
+ fn=@md.file.base_filename.html_scroll(fnh)
+ path_and_file(fn)
+ end
+ def html_concordance
+ fn=@md.file.base_filename.html_concordance
+ path_and_file(fn)
+ end
+ def epub
+ fn=@md.file.base_filename.epub(fnh)
+ path_and_file(fn,'epub')
+ end
+ def pdf_landscape
+ fn=@md.file.base_filename.pdf_l_a4(fnh)
+ path_and_file(fn)
+ end
+ def pdf_portrait
+ fn=@md.file.base_filename.pdf_p_a4(fnh)
+ path_and_file(fn)
+ end
+ def odt
+ fn=@md.file.base_filename.odt(fnh)
+ path_and_file(fn)
+ end
+ def xhtml
+ fn=@md.file.base_filename.xhtml(fnh)
+ path_and_file(fn)
+ end
+ def xml_sax
+ fn=@md.file.base_filename.xml_sax(fnh)
+ path_and_file(fn)
+ end
+ def xml_dom
+ fn=@md.file.base_filename.xml_dom(fnh)
+ path_and_file(fn)
+ end
+ def txt
+ fn=@md.file.base_filename.txt(fnh)
+ path_and_file(fn)
+ end
+ def digest
+ fn=@md.file.base_filename.hash_digest(fnh)
+ path_and_file(fn)
+ end
+ def source
+ "#{@base_path}/#{@src}"
+ end
+ def sisupod
+ "#{@base_path}/#{@src}.zip"
+ end
+ self
+ end
+ def expand_insertions?
+ data=@data
+ tuned_file,tuned_file_tmp=[],[]
+ codeblock_=false
+ data.each do |para|
+ codeblock_=if para =~/^(?:code\{|[`]{3}\s+code)/
+ true
+ elsif para =~/^(?:\}code|[`]{3}(?:\s|$))/m
+ false
+ else codeblock_
+ end
+ if para !~/^%+\s/ \
+ and not codeblock_ \
+ and para =~/\{(?:~\^\s+)?(.+?)\s\[(?:\d(?:[sS]*))\]\}(?:\.\.\/\S+?\/|\S+?\.ss[tm]\b)/
+ manifest=nil
+ @u=SiSU_Env::InfoEnv.new.url
+ m_cmd=''
+ if defined? @u.remote
+ if /(?<m_pre>.+?)\{(?<m_txt>.+?)\s\[(?<m_cmd>\d[sS]*)\]\}(?<m_source>(?<m_linked_doc>\S+?)\.ss[tm]\b)(?<m_note>.*)/m =~ para
+ m_pre=m_pre.strip
+ elsif /\{(?<m_txt>.+?)\s\[(?<m_cmd>\d[sS]*)\]\}(?<m_source>(?<m_linked_doc>\S+?)\.ss[tm]\b)(?<m_note>.*)/m =~ para
+ end
+ if m_linked_doc =~ /(\S+?)\/(\S+)/
+ m_linked_doc,m_linked_doc_lang=$1,$2
+ else
+ m_linked_doc,m_linked_doc_lang=m_linked_doc,@md.opt.lng_base
+ end
+ else
+ puts "error, does currently support relative paths (reltive paths were removed, as had problems for citation, and was not suited to all output types should possibly reconsider) #{__FILE__} #{__LINE__}"
+ if /\{(?:~\^\s+)?(?<m_txt>.+?)\s\[(?<m_cmd>\d[sS]*)\]\}\.\.\/(?<m_linked_doc>\S+?)\/(?<m_note>\s+#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]})?/ =~ para
+ end
+ end
+ lnk=case @md.opt.dir_structure_by
+ when :language
+ {
+ manifest: by_language(m_linked_doc,m_linked_doc_lang).manifest,
+ html_toc: by_language(m_linked_doc,m_linked_doc_lang).html_toc,
+ html_doc: by_language(m_linked_doc,m_linked_doc_lang).html_doc,
+ epub: by_language(m_linked_doc,m_linked_doc_lang).epub,
+ pdf_landscape: by_language(m_linked_doc,m_linked_doc_lang).pdf_landscape,
+ pdf_portrait: by_language(m_linked_doc,m_linked_doc_lang).pdf_landscape,
+ odt: by_language(m_linked_doc,m_linked_doc_lang).odt,
+ xhtml: by_language(m_linked_doc,m_linked_doc_lang).xhtml,
+ xml_sax: by_language(m_linked_doc,m_linked_doc_lang).xml_sax,
+ xml_dom: by_language(m_linked_doc,m_linked_doc_lang).xml_dom,
+ txt: by_language(m_linked_doc,m_linked_doc_lang).txt,
+ html_concordance: by_language(m_linked_doc,m_linked_doc_lang).html_concordance,
+ digest: by_language(m_linked_doc,m_linked_doc_lang).digest,
+ sisupod: by_language(m_linked_doc,m_linked_doc_lang,m_source).sisupod,
+ source: by_language(m_linked_doc,m_linked_doc_lang,m_source).source,
+ }
+ when :filetype
+ {
+ manifest: by_filetype(m_linked_doc,m_linked_doc_lang).manifest,
+ html_toc: by_filetype(m_linked_doc,m_linked_doc_lang).html_toc,
+ html_doc: by_filetype(m_linked_doc,m_linked_doc_lang).html_doc,
+ epub: by_filetype(m_linked_doc,m_linked_doc_lang).epub,
+ pdf_landscape: by_filetype(m_linked_doc,m_linked_doc_lang).pdf_landscape,
+ pdf_portrait: by_filetype(m_linked_doc,m_linked_doc_lang).pdf_landscape,
+ odt: by_filetype(m_linked_doc,m_linked_doc_lang).odt,
+ xhtml: by_filetype(m_linked_doc,m_linked_doc_lang).xhtml,
+ xml_sax: by_filetype(m_linked_doc,m_linked_doc_lang).xml_sax,
+ xml_dom: by_filetype(m_linked_doc,m_linked_doc_lang).xml_dom,
+ txt: by_filetype(m_linked_doc,m_linked_doc_lang).txt,
+ html_concordance: by_filetype(m_linked_doc,m_linked_doc_lang).html_concordance,
+ digest: by_filetype(m_linked_doc,m_linked_doc_lang).digest,
+ sisupod: by_filetype(m_linked_doc,m_linked_doc_lang,m_source).sisupod,
+ source: by_filetype(m_linked_doc,m_linked_doc_lang,m_source).source,
+ }
+ else
+ {
+ manifest: by_filename(m_linked_doc,m_linked_doc_lang).manifest,
+ html_toc: by_filename(m_linked_doc,m_linked_doc_lang).html_toc,
+ html_doc: by_filename(m_linked_doc,m_linked_doc_lang).html_doc,
+ epub: by_filename(m_linked_doc,m_linked_doc_lang).epub,
+ pdf_landscape: by_filename(m_linked_doc,m_linked_doc_lang).pdf_landscape,
+ pdf_portrait: by_filename(m_linked_doc,m_linked_doc_lang).pdf_landscape,
+ odt: by_filename(m_linked_doc,m_linked_doc_lang).odt,
+ xhtml: by_filename(m_linked_doc,m_linked_doc_lang).xhtml,
+ xml_sax: by_filename(m_linked_doc,m_linked_doc_lang).xml_sax,
+ xml_dom: by_filename(m_linked_doc,m_linked_doc_lang).xml_dom,
+ txt: by_filename(m_linked_doc,m_linked_doc_lang).txt,
+ html_concordance: by_filename(m_linked_doc,m_linked_doc_lang).html_concordance,
+ digest: by_filename(m_linked_doc,m_linked_doc_lang).digest,
+ sisupod: by_filename(m_linked_doc,m_linked_doc_lang,m_source).sisupod,
+ source: by_filename(m_linked_doc,m_linked_doc_lang,m_source).source,
+ }
+ end
+ linked_title="#{m_pre}{#{m_txt} }#{lnk[:manifest]}#{m_note}\n\n"
+ tuned_file_tmp << linked_title
+ output_filetypes=output_filetypes_in_cmd(m_cmd,lnk)
+ output_filetypes[:gen].each do |o_f|
+ describe = o_f
+ if describe
+ tuned_file_tmp << if @u.remote #to double space <:br> at beginning of entry
+ "#{Mx[:nbsp]*4} #{describe} "
+ else # remove ...
+ "[provide document placement host location]"
+ end
+ end
+ end
+ output_filetypes[:src].each do |o_f|
+ describe = o_f
+ if describe
+ tuned_file_tmp << if @u.remote
+ "#{Mx[:nbsp]*4} #{describe} "
+ else
+ "[provide document placement host location]"
+ end
+ end
+ end
+ tuned_file << 'group{' << tuned_file_tmp.join("\n") << '}group'
+ tuned_file_tmp=[]
+ else tuned_file << para
+ end
+ end
+ tuned_file
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_hash_digest.rb b/lib/sisu/v6/ao_hash_digest.rb
new file mode 100644
index 0000000..b2fd8bf
--- /dev/null
+++ b/lib/sisu/v6/ao_hash_digest.rb
@@ -0,0 +1,158 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_hash_digest.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_Hash
+ require_relative 'shared_markup_alt.rb' #shared_markup_alt.rb
+ class ObjectDigest
+ def initialize(md,data,env=nil)
+ @md,@data,@env=md,data,env
+ @env ||=SiSU_Env::InfoEnv.new(@md.fns)
+ end
+ def object_digest
+ # 1. clean/stripped text without any markup, paragraph, headings etc. without endnotes
+ # 2. endnotes clean/stripped text digest only (there may be several endnotes within a paragraph)
+ # 3. whole object, text with markup and any endnotes, (question: with or without the endnote digests??? presumption better without, [however may be easier to check with?])
+ # [digests should not include other digests]
+ data=@data.compact
+ @tuned_file=[]
+ sha_ =(@env.digest.type=='sha256' ? true : false)
+ sha_ ? (require 'digest/sha2') : (require 'digest/md5')
+ data.each do |t_o|
+ unless t_o.obj.is_a?(Array)
+ t_o.obj=t_o.obj.strip
+ end
+ if (t_o.of !=:structure \
+ && t_o.of !=:comment \
+ && t_o.of !=:layout) \
+ && t_o.ocn.is_a?(Fixnum)
+ if sha_
+ for hash_class in [ Digest::SHA256 ]
+ @tuned_file << stamped(t_o,hash_class)
+ end
+ else
+ for hash_class in [ Digest::MD5 ]
+ @tuned_file << stamped(t_o,hash_class)
+ end
+ end
+ else @tuned_file << t_o unless t_o.nil?
+ end
+ end
+ @tuned_file=@tuned_file.flatten
+ #use md5 or to create hash of each ao object including ocn, & add into to each ao object
+ end
+ def endnote_digest(data)
+ t_o_bit=[]
+ data.each do |en_plus|
+ t_o_bit <<= case en_plus
+ when /#{Mx[:en_a_o]}|#{Mx[:en_b_o]}/
+ if en_plus =~/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/
+ t_o_txt,en_open,en_txt,en_close=/(.*?)(#{Mx[:en_a_o]}|#{Mx[:en_b_o]})(.+?)(#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/m.match(en_plus)[1..4]
+ stripped_en=SiSU_TextRepresentation::Alter.new(en_txt).strip_clean_of_markup
+ digest_en_strip=if @env.digest.type =~/sha256/
+ Digest::SHA256.hexdigest(stripped_en)
+ else
+ Digest::MD5.hexdigest(stripped_en)
+ end
+ t_o_txt + en_open + en_txt + Mx[:id_o] + digest_en_strip + Mx[:id_c] + en_close
+ else STDERR.puts "Error Exception - problem encountered with:\n#{en_plus}" #arbitrary exception, tidy up
+ end
+ else en_plus
+ end
+ end
+ t_o_bit.join
+ end
+ def stamped(t_o,hash_class) #decide what hash information is most useful, is compromise necessary?
+ t_o.obj=SiSU_TextRepresentation::Alter.new(t_o).strip_clean_of_extra_spaces
+ #SiSU_TextRepresentation::Alter.new(t_o).strip_clean_of_markup #check
+ #SiSU_TextRepresentation::Alter.new(t_o).semi_revert_markup #check
+ #SiSU_TextRepresentation::ModifiedTextPlusHashDigest.new(@md,t_o).composite.dgst #check
+ unless t_o.is==:code
+ case t_o.obj
+ when /#{Mx[:en_a_o]}[\d*+]+\s+.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}[*+]\d+\s+.+?#{Mx[:en_b_c]}/m
+ en_and_t_o_digest=[]
+ t_o.obj=t_o.obj.gsub(/\s*(#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/m,' \1') #watch
+ t_o_plus_en=t_o.obj.scan(/.*?#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|.*?#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/m)
+ t_o_tail=if t_o.obj =~/(?:.*?#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|.*?#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})+([\s\S]+)/m
+ /(?:.*?#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|.*?#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]})+.*/m.match(t_o.obj)[1]
+ else ''
+ end
+ t_o_plus_en << t_o_tail
+ en_and_t_o_digest << endnote_digest(t_o_plus_en)
+ en_and_t_o_digest.join(' ')
+ else #@tuned << t_o + Mx[:id_o] + digest_strip + ':' + digest_all + Mx[:id_c] unless t_o.nil?
+ end
+ else #@tuned << t_o + Mx[:id_o] + digest_strip + ':' + digest_all + Mx[:id_c] unless t_o.nil?
+ end
+ t_o #KEEP intact
+ end
+ def strip_clean_extra_spaces(s) # ao output tuned
+ s=s.dup
+ s=s.gsub(/[ ]+([,.;:?](?:$|\s))/,'\1') unless s =~/#{Mx[:en_a_o]}|#{Mx[:en_b_o]}/
+ s=s.gsub(/ [ ]+/,' ').
+ gsub(/^ [ ]+/,'').
+ gsub(/ [ ]+$/,'').
+ gsub(/((?:#{Mx[:fa_bold_c]}|#{Mx[:fa_italics_c]})')[ ]+(s )/,'\1\2').
+ gsub(/((?:#{Mx[:fa_bold_c]}|#{Mx[:fa_italics_c]})')[ ]+(s )/,'\1\2')
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_idx.rb b/lib/sisu/v6/ao_idx.rb
new file mode 100644
index 0000000..cd6ab26
--- /dev/null
+++ b/lib/sisu/v6/ao_idx.rb
@@ -0,0 +1,327 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_idx.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_BookIndex
+ class BookIndex
+ def initialize(md,data,env=nil)
+ @md,@data,@env=md,data,env
+ @rgx_idx=/#{Mx[:idx_o]}(?:.+?)#{Mx[:idx_c]}\s*/
+ @rgx_idx_ocn_seg=/(.+?)~(\d+)~(\S+)/
+ @rgx_idx_ocn=/(.+?)~(\d+)/
+ @env ||=SiSU_Env::InfoEnv.new(@md.fns)
+ end
+ def indexing_song
+ data=@data
+ data,sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx=extract_book_index(data)
+ data=clean_and_insert_index(data,sisu_markup_idx_rel_html_seg)
+ [data,sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx]
+ end
+ def extract_book_index(data)
+ tuned_file=[]
+ idx_array=[]
+ data.each do |dob|
+ if (dob.is ==:heading \
+ || dob.is ==:heading_insert) \
+ && dob.ln==4
+ @seg=dob.name
+ end
+ if defined? dob.idx \
+ and dob.idx.is_a?(Hash)
+ idx_array << {idx: dob.idx, ocn: dob.ocn, seg: @seg }
+ end
+ tuned_file << dob if dob
+ end
+ if idx_array.length > 0
+ the_idx=construct_book_index(idx_array)
+ sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx=nil,nil,nil,nil
+ if @md.book_idx
+ idx=index(the_idx)
+ sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx=idx[:sst_rel],idx[:sst_rel_html_seg],idx[:html],idx[:xhtml]
+ end
+ end
+ [tuned_file,sisu_markup_idx_rel,sisu_markup_idx_rel_html_seg,html_idx,xhtml_idx]
+ end
+ def construct_book_index(idx_array)
+ the_idx={}
+ idx_array.each do |idx|
+ idx[:idx].each_pair do |term,term_info|
+ location=(term_info[:plus].to_i > 0) \
+ ? (%{#{idx[:ocn]}-#{idx[:ocn].to_i + term_info[:plus].to_i}})
+ : idx[:ocn].to_s
+ the_idx[term]={} unless the_idx[term] and defined? the_idx[term]
+ the_idx[term]['node_0_terms']=[] unless the_idx[term]['node_0_terms'] and defined? the_idx[term]['node_0_terms']
+ the_idx[term]['node_0_terms'] << { ocn: idx[:ocn], range: location, seg: idx[:seg] }
+ if term_info[:sub].is_a?(Array) \
+ and term_info[:sub].length > 0
+ term_info[:sub].each do |y|
+ y.each_pair do |subterm,subterm_info|
+ location=(subterm_info[:plus].to_i > 0) \
+ ? (%{#{idx[:ocn]}-#{idx[:ocn].to_i + subterm_info[:plus].to_i}})
+ : idx[:ocn].to_s
+ the_idx[term]={} unless the_idx[term] and defined? the_idx[term]
+ the_idx[term]['node_0_terms']=[] unless the_idx[term]['node_0_terms'] and defined? the_idx[term]['node_0_terms']
+ the_idx[term]['node_1_subterms']={} unless the_idx[term]['node_1_subterms'] and defined? the_idx[term]['node_1_subterms']
+ the_idx[term]['node_1_subterms'][subterm]=[] unless the_idx[term]['node_1_subterms'][subterm] and defined? the_idx[term]['node_1_subterms'][subterm]
+ the_idx[term]['node_1_subterms'][subterm] << { ocn: idx[:ocn], range: location, seg: idx[:seg] }
+ end
+ end
+ end
+ end
+ end
+ the_idx=the_idx.sort
+ the_idx
+ end
+ def clean_xml(str)
+ str=str.gsub(/&/,'&amp;')
+ str
+ end
+ def index(the_idx)
+ @x=1
+ idx={}
+ idx[:sst_rel_html_seg],idx[:sst_rel],idx[:html],idx[:xhtml]=[],[],[],[]
+ h={obj: Mx[:br_page]}
+ o=SiSU_AO_DocumentStructure::ObjectLayout.new.break(h)
+ idx[:sst_rel_html_seg] << o
+ idx[:sst_rel] << o
+ h={lv: '1', name: 'index', obj: "Index"}
+ o=SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h)
+ idx[:sst_rel_html_seg] << o
+ idx[:sst_rel] << o
+ h={lv: '4', name: 'idx', obj: " [Index] #{Mx[:pa_non_object_dummy_heading]}"}
+ o=SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h)
+ idx[:sst_rel_html_seg] << o
+ idx[:sst_rel] << o
+ alph=%W[9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
+ idx[:html] << '<p>'
+ idx[:xhtml] << '<p>'
+ alph.each do |x|
+ if x =~/[0-9]/
+ idx[:html] << ''
+ idx[:xhtml] << ''
+ else
+ idx[:html] << %{<a href="##{x}">#{x}</a>,#{$ep[:hsp]}}
+ idx[:xhtml] << %{<a href="##{x.downcase}">#{x}</a>,#{$ep[:hsp]}}
+ end
+ end
+ idx[:html] << '</p>'
+ idx[:xhtml] << '</p>'
+ letter=alph.shift
+ idx[:html] << %{\n<p class="book_index_lev1"><a name="numeral"></a></p>}
+ idx[:xhtml] << %{\n<p class="letter" id="numeral">0 - 9</p>}
+ the_idx.each do |i|
+ i.each do |x|
+ if x.is_a?(String)
+ f=/^(\S)/.match(x)[1]
+ if letter < f
+ while letter < f
+ if alph.length > 0
+ letter=alph.shift
+ idx[:html] << %{\n<p class="letter"><a name="#{letter}">#{letter}</a></p><p class="book_index_lev1"><a name="#{letter.downcase}"> </a></p>}
+ idx[:xhtml] << %{\n<p class="letter" id="#{letter.downcase}">#{letter}</p>}
+ else break
+ end
+ end
+ end
+ idx[:sst_rel_html_seg] << %{\n\n#{Mx[:fa_bold_o]}#{x},#{Mx[:fa_bold_c]} }
+ idx[:sst_rel] << %{\n\n#{Mx[:fa_bold_o]}#{x},#{Mx[:fa_bold_c]} }
+ aname=x.gsub(/\s+/,'_')
+ idx[:html] << %{\n<p class="book_index_lev1"><a name="#{aname}"><b>#{x}</b></a>, }
+ c=clean_xml(x.dup)
+ idx[:xhtml] << %{\n<p class="book_index_lev1"><b>#{c}</b>, }
+ @o=idx[:sst_rel_html_seg].index(idx[:sst_rel_html_seg].last)
+ @t=idx[:sst_rel].index(idx[:sst_rel].last)
+ @q=idx[:html].index(idx[:html].last)
+ @r=idx[:xhtml].index(idx[:xhtml].last)
+ print "\n" + x + ', ' if @md.opt.act[:verbose_plus][:set]==:on
+ elsif x.is_a?(Array)
+ p 'array error? -->'
+ print x
+ elsif x.is_a?(Hash)
+ if x['node_0_terms'].is_a?(Array)
+ x['node_0_terms'].each do |a|
+ if a[:range]
+ idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{a[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}/#{a[:seg]}.html##{a[:ocn]}#{Mx[:rel_c]}, }
+ idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{a[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{a[:ocn]}#{Mx[:rel_c]}, }
+ idx[:html][@q]=idx[:html][@q] + %{<a href="#{a[:seg]}.html##{a[:ocn]}">#{a[:range]}</a>, }
+ idx[:xhtml][@q]=idx[:xhtml][@q] + %{<a href="#{a[:seg]}.xhtml#o#{a[:ocn]}">#{a[:range]}</a>, }
+ print a[:range] + ', ' if @md.opt.act[:verbose_plus][:set]==:on
+ elsif a[:ocn]
+ idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{a[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{a[:seg]}.html##{a[:ocn]}#{Mx[:rel_c]}, }
+ idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{a[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{a[:ocn]}#{Mx[:rel_c]}, }
+ idx[:html][@q]=idx[:html][@q] + %{<a href="#{a[:seg]}.html##{a[:ocn]}">#{a[:ocn]}</a>, }
+ idx[:xhtml][@q]=idx[:xhtml][@q] + %{<a href="#{a[:seg]}.xhtml#o#{a[:ocn]}">#{a[:ocn]}</a>, }
+ print a[:ocn] + ', ' if @md.opt.act[:verbose_plus][:set]==:on
+ else p 'error'
+ end
+ end
+ idx[:html][@q]=idx[:html][@q] + '</p>'
+ idx[:xhtml][@r]=idx[:xhtml][@r] + '</p>'
+ end
+ if x['node_1_subterms']
+ x['node_1_subterms'].sort.each do |k,y|
+ if k !~/node_0_terms/
+ idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{k}, }
+ idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{k}, }
+ idx[:html][@q]=idx[:html][@q] + %{\n<p class="book_index_lev2">#{k}, }
+ c=clean_xml(k.dup)
+ idx[:xhtml][@r]=idx[:xhtml][@r] + %{\n<p class="book_index_lev2">#{c}, }
+ print "\n\t" + k + ', ' if @md.opt.act[:verbose_plus][:set]==:on
+ y.each do |z|
+ if z[:range]
+ idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{z[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:seg]}.html##{z[:ocn]}#{Mx[:rel_c]}, }
+ idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{z[:range]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:ocn]}#{Mx[:rel_c]}, }
+ idx[:html][@q]=idx[:html][@q] + %{<a href="#{z[:seg]}.html##{z[:ocn]}">#{z[:range]}</a>, }
+ idx[:xhtml][@q]=idx[:xhtml][@q] + %{<a href="#{z[:seg]}.xhtml#o#{z[:ocn]}">#{z[:range]}</a>, }
+ print z[:range] + ', ' if @md.opt.act[:verbose_plus][:set]==:on
+ elsif z[:ocn]
+ idx[:sst_rel_html_seg][@o]=idx[:sst_rel_html_seg][@o] + %{#{Mx[:lnk_o]}#{z[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:seg]}.html##{z[:ocn]}#{Mx[:rel_c]}, }
+ idx[:sst_rel][@t]=idx[:sst_rel][@t] + %{#{Mx[:lnk_o]}#{z[:ocn]}#{Mx[:lnk_c]}#{Mx[:rel_o]}#{z[:ocn]}#{Mx[:rel_c]}, }
+ idx[:html][@q]=idx[:html][@q] + %{<a href="#{z[:seg]}.html##{z[:ocn]}">#{z[:ocn]}</a>, }
+ idx[:xhtml][@q]=idx[:xhtml][@q] + %{<a href="#{z[:seg]}.xhtml#o#{z[:ocn]}">#{z[:ocn]}</a>, }
+ print z[:ocn] + ', ' if @md.opt.act[:verbose_plus][:set]==:on
+ else p 'error'
+ end
+ end
+ idx[:html][@q]=idx[:html][@q] + '</p>'
+ idx[:xhtml][@r]=idx[:xhtml][@r] + '</p>'
+ end
+ end
+ end
+ @x +=1
+ end
+ end
+ end
+ print "\n" if @md.opt.act[:verbose_plus][:set]==:on
+ idx
+ end
+ def screen_print(the_idx)
+ the_idx.each do |i|
+ i.each do |x|
+ if x.is_a?(String)
+ print "\n" + x + ', '
+ elsif x.is_a?(Array)
+ p 'array error? -->'
+ print x
+ elsif x.is_a?(Hash)
+ if x['node_0_terms'].is_a?(Array)
+ x['node_0_terms'].each do |a|
+ if a[:range]
+ print a[:range] + ', '
+ elsif a[:ocn]
+ print a[:ocn] + ', '
+ else p 'error'
+ end
+ end
+ end
+ if x['node_1_subterms']
+ x['node_1_subterms'].sort.each do |k,y|
+ if k !~/node_0_terms/
+ print "\n\t" + k + ', '
+ y.each do |z|
+ if z[:range]
+ print z[:range] + ', '
+ elsif z[:ocn]
+ print z[:ocn] + ', '
+ else p 'error'
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ def output_idx(idx)
+ if @md.book_idx
+ path="#{@env.path.output}/#{@md.fnb}"
+ Dir.mkdir(path) unless FileTest.directory?(path)
+ puts "#{path}/#{@md.fn[:book_idx_html]} #{__FILE__}::#{__LINE__}"
+ html_index_file=File.new("#{path}/#{@md.fn[:book_idx_html]}",'w')
+ idx[:html].each {|x| html_index_file << x }
+ html_index_file.close
+ end
+ end
+ def clean_and_insert_index(data,sisu_markup_idx)
+ tuned_file=[]
+ data.each do |dob|
+ tuned_file << dob
+ if dob.obj =~/#{Mx[:br_endnotes]}/ \
+ and sisu_markup_idx
+ sisu_markup_idx.each do |idx|
+ tuned_file << idx
+ end
+ end
+ end
+ tuned_file
+ end
+ def clean_index(data) #check on use of dob
+ tuned_file=[]
+ data.each do |para|
+ para=para.gsub(/\n*#{@rgx_idx}/m,'')
+ tuned_file << para
+ end
+ tuned_file
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_images.rb b/lib/sisu/v6/ao_images.rb
new file mode 100644
index 0000000..76721d6
--- /dev/null
+++ b/lib/sisu/v6/ao_images.rb
@@ -0,0 +1,166 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_images.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_Images
+ class Images
+ #require 'RMagick'
+ #include Magick
+ def initialize(md,data)
+ @md,@data=md,data
+ end
+ def images
+ data=@data
+ tuned_file=[]
+ @rmgk=false
+ imagemagick_=true #imagemagick_=SiSU_Env::InfoSettings.new.program?('rmagick')
+ if imagemagick_
+ begin
+ @rmgk=SiSU_Env::Load.new('RMagick').prog
+ rescue
+ @rmgk=false
+ end
+ else
+ if (@md.opt.act[:verbose][:set]==:on \
+ || @md.opt.act[:verbose_plus][:set]==:on \
+ || @md.opt.act[:maintenance][:set]==:on)
+ SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set],'*WARN* use of RMagick is not enabled in sisurc.yml').warn
+ end
+ end
+ data.each do |dob|
+ unless dob.is ==:table
+ dob.obj=dob.obj.strip
+ if dob.obj =~/#{Mx[:lnk_o]}\s*\S+\.(?:png|jpg|gif)(?:\s*|\s+.+)?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/
+ if dob.obj !~/#{Mx[:lnk_o]}\s*\S+\.(?:png|jpg|gif)\s+\d+x\d+/
+ m=/#{Mx[:lnk_o]}\s*(\S+\.(?:png|jpg|gif))/
+ if imagemagick_
+ imgs=dob.obj.scan(m).flatten
+ img_col=img_row=nil
+ images=imgs.each do |image|
+ dir=SiSU_Env::InfoEnv.new(@md.fns)
+ path_image=[dir.path.image_source_include_local,dir.path.image_source_include_remote,dir.path.image_source_include]
+ image_path=nil
+ path_image.each do |img_pth|
+ image_path=img_pth
+ break if FileTest.exist?("#{img_pth}/#{image}")
+ end
+ if FileTest.exist?("#{image_path}/#{image}")
+ if @rmgk
+ img=Magick::ImageList.new("#{image_path}/#{image}")
+ img_col,img_row=img.columns,img.rows
+ else
+ if (@md.opt.act[:verbose][:set]==:on \
+ || @md.opt.act[:verbose_plus][:set]==:on \
+ || @md.opt.act[:maintenance][:set]==:on)
+ SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set],'*WARN* RMagick not present, will attempt to use imagemagick (identify) directly').warn
+ end
+ imgk=SiSU_Env::SystemCall.new.imagemagick
+ gmgk=SiSU_Env::SystemCall.new.graphicksmagick
+ if imgk or gmgk
+ if imgk
+ imgsys=`identify #{image_path}/#{image}`.strip #system call
+ elsif gmgk
+ imgsys=`gm identify #{image_path}/#{image}`.strip #system call
+ end
+ img_col,img_row=/(\d+)x(\d+)/m.match(imgsys)[1,2]
+ img_col,img_row=img_col.to_i,img_row.to_i
+ end
+ end
+ row=((img && defined? img.rows) ? img.rows : img_row)
+ col=((img && defined? img.columns) ? img.columns : img_col)
+ if img_col > img_row #landscape
+ if img_col> 640
+ img_col=640
+ img_row=((1.00*img_col/col)*row).round
+ end
+ else #portrait
+ if img_col> 640
+ img_col=640
+ img_row=((1.00*img_col/col)*row).round
+ end
+ if img_row > 640
+ img_row=640
+ img_col=((1.00*img_row/row)*col).round
+ end
+ end
+ dob.obj=dob.obj.gsub(/(#{image})/,"#{image} #{img_col}x#{img_row}")
+ else dob.obj=dob.obj.gsub(/#{Mx[:lnk_o]}\s*(\S+)\.(png|jpg|gif).+?#{Mx[:lnk_c]}(#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/,'[ \1 (\2 missing) ]')
+ end
+ end
+ else
+ images=dob.obj.scan(m) do |image|
+ SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set],'*WARN* where image dimensions have not been provided RMagick or imagemagick is required',image).warn unless @md.opt.act[:quiet][:set]==:on
+ end
+ end
+ end
+ end
+ if dob.obj =~/#{Mx[:lnk_o]}\s*\S+\.(?:png|jpg|gif).+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/
+ dob.obj=dob.obj.gsub(/(#{Mx[:lnk_o]})\s*(\S+\.(?:png|jpg|gif))\s+/i,'\1\2 ')
+ end
+ end
+ tuned_file << dob unless dob.nil?
+ end
+ tuned_file
+ end
+ end
+end
+__END__
+imgsys=`identify #{image_path}/#{image}`.strip
diff --git a/lib/sisu/v6/ao_metadata.rb b/lib/sisu/v6/ao_metadata.rb
new file mode 100644
index 0000000..3ca232f
--- /dev/null
+++ b/lib/sisu/v6/ao_metadata.rb
@@ -0,0 +1,83 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_metadata.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_Metadata
+ class Metadata
+ def initialize(md,metad)
+ @md,@metadata=md,metad
+ l=SiSU_Env::StandardiseLanguage.new(@md.opt.lng).language
+ language=l[:n]
+ @tr=SiSU_Translate::Source.new(md,language)
+ end
+ def make_para(obj,ocn)
+ h={ obj: obj, ocn: 0 }
+ SiSU_AO_DocumentStructure::ObjectPara.new.paragraph(h)
+ end
+ def make_heading(obj,ocn,name,lv,ln)
+ h={ lv: lv, ln: ln, name: name, obj: obj, ocn: 0 }
+ SiSU_AO_DocumentStructure::ObjectHeading.new.heading(h)
+ end
+ def metadata
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_misc_arrange.rb b/lib/sisu/v6/ao_misc_arrange.rb
new file mode 100644
index 0000000..a2cbb6c
--- /dev/null
+++ b/lib/sisu/v6/ao_misc_arrange.rb
@@ -0,0 +1,158 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_misc_arrange.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_MiscArrangeText
+ class SI
+ def initialize(md,data)
+ @md,@data=md,data
+ end
+ def conditional_headings(para)
+ para=para.gsub(/^(:?A~)\s*$/,'\1~ @title @author'). #conditional header
+ gsub(/^((?:[1-9]|:?[A-D])~\S*)\s*$/,'\1~ [Note: heading marker::required title missing]~#') #conditional header for incorporated document 2004w12
+ if para =~/^@\S+?:/
+ para=para.gsub(/^@(\S+?):(\s+|$)/,"#{Mx[:meta_o]}\\1#{Mx[:meta_c]}\\2").
+ gsub(/^@(\S+?):([+-])(\s+|$)/,"#{Mx[:meta_o]}\\1\\2#{Mx[:meta_c]}\\3")
+ end
+ para
+ end
+ def code_blocks(para)
+ def ticks(para)
+ block_open,block_close,text=nil,nil,nil
+ if para =~/\A[`]{3}\s+.+?\n.+?\n[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*\Z/m
+ block_open,text,block_close=/\A([`]{3}\s+.+?)\n(.+?)\n([`]{3}(\s+[~-][#]|\s+\~\{.+?\}\~)?)\s*\Z/m.match(para)[1..3]
+ ((para=~/^[`]{3}\s+table(?:~h)?\s+/) \
+ and (para !~/^[`]{3}\s+table(?:~h)?\s+c\d+/)) \
+ ? para
+ : (para=[]; para << block_open << text << block_close)
+ elsif para =~/\A[`]{3}\s+.+?\n.*?\Z/m #look at, study
+ block_open,text=/\A([`]{3}(?:\s+.+?))\n(.*?)\Z/m.match(para)[1,2]
+ para=[]
+ if not text.to_s.empty?
+ para << block_open << text
+ else
+ para << block_open
+ end
+ elsif para =~/\A.+?\n[`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?\s*\Z/m
+ text,block_close=/\A(.+?)\n([`]{3}(?:\s+[~-][#]|\s+\~\{.+?\}\~)?)\s*\Z/m.match(para)[1,2]
+ para=[]
+ if not text.to_s.empty?
+ para << text.to_s << block_close
+ else
+ para << block_close
+ end
+ else para
+ end
+ para
+ end
+ def curly_braces(para)
+ block_open,block_close,text=nil,nil,nil
+ para=if para =~/\A(?:code|poem|alt|group|block|table)\{ .+?\n.+?\n\}(?:code|poem|alt|group|block|table)(?: [~-][#])?\s*\Z/m
+ block_open,text,block_close=/\A((?:code|poem|alt|group|block|table)\{ .+?)\n(.+?)\n(\}(?:code|poem|alt|group|block|table)(?: [~-][#])?)\s*\Z/m.match(para)[1..3]
+ para=[]
+ para << block_open << text << block_close
+ elsif para =~/\A(?:code|poem|alt|group|block|table)\{ .+?\n.+?\Z/m
+ block_open,text=/\A((?:code|poem|alt|group|block|table)\{ .+?)\n(.+?)\Z/m.match(para)[1,2]
+ para=[]
+ if not text.to_s.empty?
+ para << block_open << text
+ else
+ para << block_open
+ end
+ elsif para =~/\A.+?\n\}(?:code|poem|alt|group|block|table)(?: [~-][#])?\s*\Z/m
+ text,block_close=/\A(.+?)\n(\}(?:code|poem|alt|group|block|table)(?: [~-][#])?)\s*\Z/m.match(para)[1,2]
+ para=[]
+ if not text.to_s.empty?
+ para << text.to_s << block_close
+ else
+ para << block_close
+ end
+ else para
+ end
+ para
+ end
+ para=para =~/^```/m \
+ ? ticks(para)
+ : para
+ para=(para =~/^(?:code|poem|alt|group|block|table)\{|^\}(?:code|poem|alt|group|block|table)/m) \
+ ? curly_braces(para)
+ : para
+ end
+ def prepare_text
+ data=@data
+ data_new=[],[]
+ if data[0] =~ /^#!\s*(?:\/usr\/bin\/env sisu|\/usr\/bin\/sisu)/ # remove bang from top #! (however file is stripped, so will be removed provided no content precedes it)
+ data[0]=data[0].gsub(/^#!\s*\/usr\/bin\/sisu/,'').
+ gsub(/^#!\s*\/usr\/bin\/env sisu/,'')
+ end
+ if data[0] =~ /^(SiSU\s+[\d.]*|sisu-[\d.]+)$/ # SiSU identifier
+ data[0]=data[0].gsub(/^(SiSU\s*[\d.]*)$/,'% \1').
+ gsub(/^(sisu-[\d.]+)$/,'% \1')
+ end
+ data.each do |para|
+ para=conditional_headings(para)
+ data_new << code_blocks(para)
+ end
+ data_new=data_new.flatten
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_numbering.rb b/lib/sisu/v6/ao_numbering.rb
new file mode 100644
index 0000000..23d9fd7
--- /dev/null
+++ b/lib/sisu/v6/ao_numbering.rb
@@ -0,0 +1,487 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_numbering.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_AO_Numbering
+ class Numbering
+ attr_accessor :obj,:osp,:ocn,:lv,:name,:index,:comment
+ def initialize(md,data)
+ @md,@data=md,data
+ @obj=@type=@ocn=@lv=@name=@index=@comment=nil
+ end
+ def numbering_song
+ data=@data
+ data=number_plaintext_para(data)
+ data=auto_number_heading_ie_title(data.compact) #tr issue
+ data=ocn(data.compact) #watch
+ data=xml(data.compact)
+ data=minor_numbering(data.compact)
+ data,tags_map,ocn_html_seg_map=name_para_seg_filename(data)
+ data=set_heading_top(data) unless @md.set_heading_top
+ [data,tags_map,ocn_html_seg_map]
+ end
+ def number_plaintext_para(data)
+ @tuned_file=[]
+ data.each do |dob|
+ if (dob.of !=:block \
+ && dob.of !=:comment \
+ && dob.of !=:layout) \
+ && dob.ocn_ #and dob.obj !~ /#{Mx[:gr_o]}Th|#{Mx[:tc_o]}#{Mx[:tc_p]}#{Mx[:tc_p]}/ #FIX
+ dob.obj=dob.obj.gsub(/(.+)\n/,'\1 ') #messy, but idea is that tables should retain breaks
+ end
+ unless dob.obj.is_a?(Array)
+ dob.obj=dob.obj.gsub(/^\s+/,'').
+ gsub(/\s$/,"\n")
+ end
+ @tuned_file << dob
+ end
+ @tuned_file=@tuned_file.flatten
+ end
+ def number_sub_heading(dob,num,title_no)
+ unless dob.obj =~/\d+\.|(?:chapter|article|section|clause)\s+\d+/i #name selection arbitrary, fix
+ dob.obj=case dob.name
+ when /-/ then dob.obj.gsub(/^/,"#{title_no} ")
+ when /^#/ then dob.obj.gsub(/^/,"#{title_no} ")
+ when /^[a-z_\.]+/ then dob.obj.gsub(/^/,"#{title_no} ")
+ else
+ dob.name=title_no if dob.name=~/^$/ #where title contains title number
+ dob.obj.gsub(/^/,"#{title_no} ") if title_no =~/\d+/ #main, where title number is to be provided #watch changed placement
+ end
+ if @md.toc_lev_limit \
+ and @md.toc_lev_limit < num
+ dob.obj=dob.obj.gsub(/^/,'!_ ') #bold line, watch
+ end
+ end
+ dob
+ end
+ def heading_tag_clean(heading_tag)
+ heading_tag=heading_tag.gsub(/[ ]+/,'_').
+ gsub(/["']/,'').
+ gsub(/[\/]/,'-').
+ gsub(/#{Mx[:fa_bold_o]}|#{Mx[:fa_bold_c]}/,'').
+ gsub(/#{Mx[:fa_italics_o]}|#{Mx[:fa_italics_c]}/,'').
+ gsub(/#{Mx[:fa_underscore_o]}|#{Mx[:fa_underscore_c]}/,'').
+ gsub(/#{Mx[:fa_cite_o]}|#{Mx[:fa_cite_c]}/,'').
+ gsub(/#{Mx[:fa_insert_o]}|#{Mx[:fa_insert_c]}/,'').
+ gsub(/#{Mx[:fa_strike_o]}|#{Mx[:fa_strike_c]}/,'').
+ gsub(/#{Mx[:fa_superscript_o]}|#{Mx[:fa_superscript_c]}/,'').
+ gsub(/#{Mx[:fa_subscript_o]}|#{Mx[:fa_subscript_c]}/,'').
+ gsub(/#{Mx[:fa_hilite_o]}|#{Mx[:fa_hilite_c]}/,'').
+ gsub(/#{Mx[:gl_bullet]}/,'')
+ end
+ def auto_number_heading_ie_title(data) #also does some segment naming
+ @tuned_file=[]
+ if defined? @md.make.num_top \
+ and @md.make.num_top \
+ and @md.make.num_top !~/^$/
+ input||=@md.make.num_top
+ end
+ num_top=(input ? input.to_i : nil)
+ t_no1=t_no2=t_no3=0
+ if num_top
+ no1=num_top; no2=(num_top + 1); no3=(num_top + 2)
+ end
+ chapter_number_counter=0
+ data=data.compact
+ data.each do |dob| #@md.seg_names << [additions to segment names]
+ title_no=nil
+ dob=SiSU_AO_DocumentStructureExtract::Structure.new(@md,dob).structure_markup #must happen earlier, node info etc. require
+ if dob.is ==:heading \
+ && dob.autonum_ \
+ and defined? @md.make.num_top \
+ and @md.make.num_top !~/^$/
+ if dob.lv=='1' \
+ and dob.obj =~/^#\s|\s#(?:\s|$)/
+ chapter_number_counter +=1
+ dob.obj=dob.obj.gsub(/^#\s/,"#{chapter_number_counter} ").
+ gsub(/#([:,]?\s|[.]?$)/,"#{chapter_number_counter}\\1")
+ end
+ if dob.ln==no1
+ @subnumber=1
+ @subnumber=0 if dob.ln==no1
+ end
+ if dob.ln.to_s =~/^[0-6]/ \
+ and not dob.toc_ \
+ and dob.obj !~/#{Mx[:fa_o]}(?:~#|-#)#{Mx[:fa_c]}/ # <-- fix
+ if dob.ln==no1
+ t_no1+=1; t_no2=0; t_no3=0
+ title_no="#{t_no1}"
+ if @md.seg_names.is_a?(Array) \
+ and not @md.seg_names.include?(title_no)
+ if dob.ln==no1
+ dob.name="#{title_no}" if not dob.name
+ dob.tags=[title_no,dob.tags].flatten if title_no !~/^\d+$/ #check whether will work across file types with stop signs
+ tag=dob.obj.gsub(/(Article|Clause|Section|Chapter)\s+/,"\\1_#{title_no}").downcase
+ tag=heading_tag_clean(tag)
+ dob.tags=[tag,dob.tags].flatten if tag !~/^\d+$/ #check whether will work across file types with stop signs
+ dob.obj=(dob.obj =~/(Article|Clause|Section)\s+/) \
+ ? (dob.obj.gsub(/(Article|Clause|Section)\s+/,"\\1 #{title_no} "))
+ : (dob.obj.gsub(/^/,"#{title_no}. ")) #fix stop later
+ end
+ if dob.ln !=no1 \
+ and dob.obj =~/^[\d.]+\s/ #fix -> if the title starts with a numbering scheme, do not auto-number, review
+ dob.name ="#{title_no}" if not dob.name
+ dob.tags=[title_no,dob.tags].flatten if title_no !~/^\d+$/ #check whether will work across file types with stop signs
+ dob.obj=dob.obj.gsub(/^/,"#{title_no}. ")
+ end
+ @md.seg_names << title_no
+ end
+ if dob.ln!=no1 \
+ and dob.name!~/^[a-z_\.]+$/ \
+ and dob.obj !~/[A-Z]\.?\s/ #bug -> tmp fix, excludes A. B. C. lettering, but not roman numerals, is arbitrary, review required # not fixed, work on
+ dob.tags=[title_no,dob.tags].flatten if title_no !~/^\d+$/ #check whether will work across file types with stop signs
+ dob.obj=dob.obj.gsub(/^/i,"#{title_no}. ")
+ end
+ end
+ if dob.ln==no1 #watch because here you change dob.name
+ dob.tags=["h#{title_no}",dob.tags].flatten #check whether will work across file types with stop signs
+ end
+ if dob.ln==no2 #watch because here you change dob.name
+ t_no2+=1; t_no3=0
+ title_no="#{t_no1}.#{t_no2}"
+ dob.tags=["h#{title_no}",dob.tags].flatten #check whether will work across file types with stop signs
+ dob=number_sub_heading(dob,no2,title_no)
+ end
+ if dob.ln==no3 #watch because here you change dob.name
+ t_no3+=1
+ title_no="#{t_no1}.#{t_no2}.#{t_no3}"
+ dob.tags=["h#{title_no}",dob.tags].flatten #check whether will work across file types with stop signs
+ dob=number_sub_heading(dob,no3,title_no)
+ end
+ elsif dob.ln.to_s =~/^[0-6]/ \
+ and dob.name =~ /^[\w-]+-/ # endnotes, watch2005# endnotes, watch2005
+ dob.tags=[dob.name,dob.tags].flatten if dob.name !~/^\d+$/ #check whether will work across file types with stop signs
+ dob.name.gsub(/^([a-z_\.]+)-$/,'\1')
+ end
+ elsif dob.is ==:heading \
+ and dob.autonum_ \
+ and @md.markup =~/num_extract/ #AS DANGEROUS force enable with document, note already does this type of numbering for cisg, locate and coordinate logic, is currently misplaced in code, chengwei inspired 2004w23/4
+ #here lies a bug, as is nil when run from -Dv --update, FIX
+ if (dob.name.nil? or dob.name.empty?) \
+ and dob.ln.to_s =~/^[0-9]/ \
+ and dob.obj =~ /^([\d\.]+)/ #risky (must be unique) consider output to 4~~\d instead of 4~\d
+ dob.name=$1
+ dob.tags=[dob.name,dob.tags].flatten if dob.name !~/^\d+$/ #check whether will work across file types with stop signs
+ end
+ if @md.toc_lev_limit
+ end
+ elsif defined? dob.name \
+ and dob.name
+ dob.tags=[dob.name,dob.tags].flatten if dob.name !~/^\d+$/ #check whether will work across file types with stop signs
+ end
+ dob.tags=dob.tags.uniq if defined? dob.tags
+ @tuned_file << dob
+ end
+ @tuned_file=@tuned_file.flatten
+ end
+ def ocn(data) #and auto segment numbering increment
+ @tuned_file=SiSU_AO_DocumentStructureExtract::OCN.new(@md,data).ocn
+ @tuned_file
+ end
+ def xml(data)
+ @tuned_file=SiSU_AO_DocumentStructureExtract::XML.new(@md,data).dom
+ @tuned_file
+ end
+ def minor_numbering(data) #and auto segment numbering increment
+ @tuned_file=[]
+ number_small,letter_small=0,0
+ letter=%w( a b c d e f g h i j k l m n o p q r s t u v w x y z )
+ data.each do |dob|
+ if dob.of ==:heading \
+ || dob.of ==:heading_insert \
+ || dob.of ==:para \
+ || dob.of ==:block
+ if dob.is ==:heading \
+ and dob.ln.to_s=~/^[0-9]/ #% sub-number system, (baby numbering) reset with any change of major number (more obviously should be placed in number titles, but that is conditionally executed, check and move later)
+ number_small,letter_small=0,0
+ elsif dob.is ==:para
+ if dob.obj =~/^#[ 1]/ \
+ and dob.obj !~/^#\s+(?:~#)?$/
+ letter_small=0
+ number_small=0 if dob.obj =~ /^#1/
+ number_small+=1
+ dob.obj=dob.obj.gsub(/^#[ 1]/,"#{number_small}. ")
+ end
+ if dob.obj =~/^_# /
+ dob.obj=dob.obj.gsub(/^_# /,"#{letter[letter_small]}. ")
+ dob.indent='1'
+ letter_small+=1
+ end
+ end
+ end
+ @tuned_file << dob
+ end
+ @tuned_file=@tuned_file.flatten
+ end
+ def name_para_seg_filename(data) #segment naming, remaining
+ # paragraph name/numbering rules
+ # manual naming overrides, manual naming may be
+ # alpha-numeric characters mixed,
+ # numeric only (a number), if
+ # all segments have been named,
+ # the numbers used are over 1000 or
+ # it is not minded that auto-numbering uses a funny scheme for naming segments (not yet implemented)
+ # [for now a warning is printed for such documents on use of maintenance or very-verbose flag]
+ # auto-naming takes the form of giving numbers to segments
+ # the rules for which are as follows
+ # if the title/heading text starts with a numeric, then that is used (1 3.1 3rd etc.)
+ # otherwise the level 4 segment number from the embedded document structure info is used
+ # if there is none a sequential number is designated, preceded by an underscore
+ @tuned_file,@unique_auto_name=[],[]
+ tags={}
+ art_filename_auto=1
+ @counter=1
+ if not @md.seg_autoname_safe \
+ and (@md.opt.act[:verbose_plus][:set]==:on \
+ || @md.opt.act[:maintenance][:set]==:on)
+ puts 'manual segment names, numbers used as names, risk warning (segmented html)'
+ end
+ ocn_html_seg=[]
+ data.each do |dob|
+ if dob.is==:heading \
+ && dob.ln \
+ and dob.ln.to_s =~/^[456]/
+ if dob.ln==4 \
+ and not dob.name \
+ and not @md.set_heading_seg
+ @md.set_heading_seg=true
+ end
+ if dob.name !~/^\S+/ \
+ and dob.obj =~/^\s*(?:\S+\s+)?([\d.,:-]+)/m #heading starts with a recognised numeric or word followed by a recognised numerical construct, use that as name
+ possible_seg_name=$1
+ possible_seg_name=possible_seg_name.gsub(/(?:[:,-]|\W)/,'.').
+ gsub(/\.$/,'')
+ if @md.seg_names.is_a?(Array) \
+ and not @md.seg_names.include?(possible_seg_name)
+ dob.name=possible_seg_name
+ dob.tags=[dob.name,dob.tags].flatten if dob.name !~/^\d+$/
+ @md.seg_names << possible_seg_name
+ elsif (@md.opt.act[:verbose_plus][:set]==:on \
+ or @md.opt.act[:maintenance][:set]==:on)
+ puts 'warn, there may be a conflicting numbering scheme'
+ end
+ end
+ if dob.ln==4 \
+ and dob.name #extract segment name from embedded document structure info
+ if @md.seg_names.is_a?(Array) \
+ and not @md.seg_names.include?(dob.name)
+ dob.tags=[dob.name,dob.tags].flatten if dob.name !~/^\d+$/
+ @md.seg_names << dob.name
+ end
+ end
+ if dob.ln==4 \
+ and not dob.name #if still no segment name, provide a numerical one
+ pf='_' #pg='' #may use e.g. '' or '~' or '_'
+ segn_auto="#{pf}#{art_filename_auto.to_s}"
+ if @md.seg_names.is_a?(Array) \
+ and not @md.seg_names.include?(segn_auto)
+ dob.name=segn_auto
+ dob.tags=[dob.name,dob.tags].flatten if dob.name !~/^\d+$/ #check whether will work across file types with stop signs
+ @md.seg_names << segn_auto
+ else puts 'segment name (numbering) error'
+ end
+ art_filename_auto+=1
+ end
+ if dob.ln==4 \
+ and not dob.name #should not occur
+ puts "e r r o r -\t#{__FILE__}::#{__LINE__}\n#{dob.inspect}"
+ end
+ end
+ if (dob.is ==:heading \
+ || dob.is ==:heading_insert) \
+ && dob.ln==4
+ @seg=dob.name
+ end
+ @tuned_file << if dob.is==:heading \
+ && (@md.pagenew || @md.pagebreak || @md.pageline)
+ m=dob.ln.to_s
+ dob_tmp=[]
+ if @md.pagenew.inspect =~/#{m}/
+ dob_tmp << SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_new]) << dob
+ elsif @md.pagebreak.inspect =~/#{m}/
+ dob_tmp << SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page]) << dob
+ elsif @md.pageline.inspect =~/#{m}/
+ dob_tmp << SiSU_AO_DocumentStructure::ObjectLayout.new.break(Hx[:br_page_line]) << dob
+ end
+ unless dob_tmp.length > 0; dob
+ else dob_tmp
+ end
+ else dob
+ end
+ if defined? dob.ocn \
+ and dob.ocn
+ @segname=((dob.is==:heading || dob.is==:heading_insert) && dob.ln==4 && (defined? dob.name)) \
+ ? (dob.name)
+ : @segname
+ tags["#{dob.ocn}"]={ segname: @segname }
+ ocn_html_seg[dob.ocn]=if (dob.is==:heading || dob.is==:heading_insert)
+ if dob.ln =~/[0-3]/
+ { seg: nil, level: dob.ln }
+ else #elsif dob.ln =~/[4-6]/
+ { seg: @seg, level: dob.ln }
+ end
+ else
+ { seg: @seg, level: nil }
+ end
+ end
+ dob.tags=dob.tags.uniq if defined? dob.tags
+ if defined? dob.tags \
+ and dob.tags.length > 0
+ #@segname=((dob.is=='heading'|| dob.is=='heading_insert') && dob.ln==4 && (defined? dob.name)) \
+ #? (dob.name) \
+ #: @segname
+ dob.tags.each do |y|
+ tags[y]={ ocn: dob.ocn.to_s, segname: @segname }
+ end
+ end
+ dob
+ end
+ ocn_html_seg.each_with_index do |ocn,i|
+ if ocn \
+ and ocn[:level].to_s=~/[1-3]/
+ (1..4).each do |x|
+ if ocn_html_seg[i+x] and ocn_html_seg[i+x][:level]==4
+ ocn[:seg]=ocn_html_seg[i+x][:seg]
+ end
+ end
+ end
+ end
+ if @md.seg_names.length > 0
+ @md.set_heading_seg=true
+ end
+ tuned_file=@tuned_file.flatten
+ [tuned_file,tags,ocn_html_seg]
+ end
+ def set_heading_top(data) #% make sure no false positives
+ unless @md.set_heading_top
+ if (@md.opt.act[:verbose_plus][:set]==:on \
+ or @md.opt.act[:maintenance][:set]==:on)
+ puts "\tdocument contains no top level heading, (will have to manufacture one)"
+ end
+ @tuned_file=[]
+ data.each do |t_o|
+ unless @md.set_heading_top
+ if t_o !~/^(?:#{Rx[:meta]}|@\S+:)\s/m \
+ and t_o !~/\A\s*\Z/m
+ @md.set_heading_top=true
+ if defined? @md.title \
+ and @md.title \
+ and defined? @md.title.full \
+ and defined? @md.creator \
+ and @md.creator
+ head=@md.title.main ? ([@lv='1',@obj=@md.title.main]) : ([@lv='1',@obj='[no title provided]'])
+ @tuned_file << head
+ end
+ end
+ end
+ @tuned_file << t_o
+ end
+ @tuned_file=@tuned_file.flatten
+ end
+ end
+ def set_heading_seg(data) #% make sure no false positives
+ unless @md.set_heading_seg
+ if (@md.opt.act[:verbose_plus][:set]==:on \
+ or @md.opt.act[:maintenance][:set]==:on)
+ puts "\tdocument contains no segment level, (will have to manufacture one)"
+ end
+ @tuned_file=[]
+ data.each do |dob|
+ unless @md.set_heading_seg
+ if defined? dob.ln and dob.ln.to_s !~/^[0-3]/m \
+ and dob.obj !~/\A\s*\Z/m \
+ and dob.is !=:layout
+ @md.set_heading_seg=true
+ head=@md.title.main \
+ ? (dob.ln,dob.name,dob.obj=4,'seg',@md.title.main)
+ : (dob.ln,dob.name,dob.obj=4,'seg','[segment]')
+ @tuned_file << head
+ end
+ end
+ @tuned_file << dob
+ end
+ @tuned_file=@tuned_file.flatten
+ end
+ end
+ def set_header_title(data) #% make sure no false positives
+ unless @md.set_header_title
+ if (@md.opt.act[:verbose_plus][:set]==:on \
+ or @md.opt.act[:maintenance][:set]==:on)
+ puts "\t no document title provided, (will have to manufacture one)"
+ end
+ @tuned_file=[]
+ data.each do |t_o|
+ unless @md.set_header_title
+ if t_o !~/^%{1,2}\s/m \
+ and t_o !~/\A\s*\Z/m
+ @tuned_file << "#{Mx[:meta_o]}title#{Mx[:meta_c]} #{@md.heading_seg_first}"
+ @md.title.main=@md.heading_seg_first
+ @md.set_header_title=true
+ end
+ end
+ @tuned_file << t_o
+ end
+ @tuned_file=@tuned_file.flatten
+ end
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/ao_syntax.rb b/lib/sisu/v6/ao_syntax.rb
new file mode 100644
index 0000000..e3777f5
--- /dev/null
+++ b/lib/sisu/v6/ao_syntax.rb
@@ -0,0 +1,632 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/ao_syntax.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: Syntax for markup, input markup syntaxes, determined here
+
+=end
+module SiSU_AO_Syntax
+ class Words
+ def initialize(line,md,mkp)
+ @line,@md,@mkp=line,md,mkp
+ end
+ end
+ class Markup
+ def initialize(md='',data='')
+ @md,@data=md,data
+ @vz=SiSU_Viz::Defaults.new
+ @data_new=[]
+ url_and_stub=SiSU_Env::InfoEnv.new.url
+ @output_url="#{url_and_stub.remote}"
+ @env=SiSU_Env::InfoEnv.new
+ emph_set=if defined? @md.emphasis_set_to \
+ and not @md.emphasis_set_to.nil?
+ @md.emphasis_set_to
+ else @env.markup_emphasis
+ end
+ @emph=case emph_set
+ when /bold/
+ emph_italics=false
+ { o: Mx[:fa_bold_o], c: Mx[:fa_bold_c] }
+ when /italics/
+ emph_italics=true
+ { o: Mx[:fa_italics_o], c: Mx[:fa_italics_c] }
+ when /underscore/
+ emph_italics=false
+ { o: Mx[:fa_underscore_o], c: Mx[:fa_underscore_c] }
+ else p __LINE__.to_s + '::' + __FILE__
+ end
+ @http_m=%r{\{.+?\}https?://\S+|https?:\S+|:\S+|\.\.\/\S+|#\S+|\S+?\.png\b|[*]~\S+|^#{Mx[:meta_o]}.+|#{Mx[:gr_o]}(?:code|block|group|alt|verse)(?:-end)?#{Mx[:gr_c]}|#{Mx[:fa_o]}:br#{Mx[:fa_c]}}
+ @manmkp_ital=emph_italics \
+ ? '[i/*]\\{.+?\\}[i/*]'
+ : '[i/]\\{.+?\\}[i/]'
+ tail_m_ital=%q{(?:\s|[.,;:?!'")]|~\^|~\\\{\s|$)}
+ tail_m_bold=%{(?:(?:#{Mx[:fa_italics_c]})?(?:\s|[.,;:?!'")]|~\^|~\\\{\s|$))?}
+ bold_line=%{^!_\s.+?(?:#{Mx[:br_line]}|\n|$)}
+ #ital_line=%{^/_\s.+?(?:#{Mx[:br_line]}|\n|$)} #not implemented
+ @line_scan_ital=if defined? @md.italics_match_list[:str]
+ /#{@http_m}|#{bold_line}|#{@manmkp_ital}#{tail_m_ital}|#{@md.italics_match_list[:str]}#{tail_m_ital}|\S+|\n/i
+ elsif defined? @vz.markup_make_italic[:str]
+ /#{@http_m}|#{bold_line}|#{@manmkp_ital}#{tail_m_ital}|#{@vz.markup_make_italic[:str]}#{tail_m_ital}|\S+|\n/i
+ end
+ @manmkp_bold=emph_italics \
+ ? '^!_\s.+?(?:\n|$)|[!b]\\{.+?\\}[*!b]|[*!][a-zA-Z0-9\-_]+[!]'
+ : '^!_\s.+?(?:\n|$)|[*!b]\\{.+?\\}[*!b]|[*!][a-zA-Z0-9\-_]+[*!]'
+ @line_scan_bold=if (defined? @md.bold_match_list[:str] \
+ and @md.bold_match_list[:str]) \
+ and (defined? @vz.markup_make_bold[:str] \
+ and @vz.markup_make_bold[:str])
+ /#{@http_m}|#{bold_line}|(?:#{@manmkp_bold}|#{@md.bold_match_list[:str]}|#{@vz.markup_make_bold[:str]})#{tail_m_bold}|\S+|\n/i
+ elsif defined? @md.bold_match_list[:str] \
+ and @md.bold_match_list[:str]
+ /#{@http_m}|#{bold_line}|(?:#{@manmkp_bold}|#{@md.bold_match_list[:str]})#{tail_m_bold}|\S+|\n/i
+ elsif defined? @vz.markup_make_bold[:str] \
+ and @vz.markup_make_bold[:str]
+ /#{@http_m}|#{bold_line}|(?:#{@manmkp_bold}|#{@vz.markup_make_bold[:str]})#{tail_m_bold}|\S+|\n/i
+ end
+ end
+ def songsheet
+ @data=@data.compact
+ @data.each do |dob|
+ dob=breaks(dob)
+ dob=if @md.sem_tag then sem(dob) else dob end #revisit
+ dob=line_actions(dob)
+ dob=paragraph_set(dob)
+ dob=substitutions(dob)
+ dob=wordlist_italics(dob)
+ dob=wordlist_bold(dob)
+ dob=bodymarkup(dob)
+ @data_new << dob unless dob.nil?
+ end
+ @data_new
+ end
+ def sem(dob) #revisit
+ dob=SiSU_Sem::Tags.new(dob,@md).rm.all
+ end
+ def breaks(dob)
+ if dob.is !=:meta \
+ && dob.is !=:comment \
+ && dob.is !=:code \
+ && dob.is !=:table
+ dob.obj=dob.obj.gsub(/^-\\\\-\s*$/,"#{Mx[:br_page]}").
+ gsub(/^=\\\\=\s*$/,"#{Mx[:br_page_new]}").
+ gsub(/ \\\\(?: |$)/,"#{Mx[:br_line]}").
+ gsub(/(?:<:?pb>)/,"#{Mx[:br_page]}"). # depreciated
+ gsub(/(?:<:?pn>)/,"#{Mx[:br_page_new]}"). # depreciated
+ gsub(/(?:<:?br>|<br \/>)/,"#{Mx[:br_line]}"). # depreciated
+ gsub(/(?:^-\.\.-\s*$)/,"#{Mx[:br_page_line]}")
+ end
+ dob
+ end
+ def wordlist_italics(dob)
+ dob=dob.dup
+ if (defined? @md.italics_match_list[:str] \
+ and @md.italics_match_list[:str]) \
+ or (defined? @vz.markup_make_italic[:str] \
+ and @vz.markup_make_italic[:str])
+ dob.obj=if dob.is !=:meta \
+ && dob.is !=:heading \
+ && dob.is !=:heading_insert \
+ && dob.is !=:code \
+ && dob.is !=:comment
+ word=dob.obj.scan(@line_scan_ital)
+ word=word.flatten.compact
+ line_array=[]
+ word.each do |w|
+ unless /#{@manmkp_ital}|#{@http_m}/.match(w)
+ if defined? @md.italics_match_list[:regx] \
+ and @md.italics_match_list[:regx]
+ w=w.gsub(@md.italics_match_list[:regx],
+ "#{Mx[:fa_italics_o]}\\1#{Mx[:fa_italics_c]}")
+ elsif defined? @vz.markup_make_italic \
+ and @vz.markup_make_italic
+ w=w.gsub(@vz.markup_make_italic,
+ "#{Mx[:fa_italics_o]}\\1#{Mx[:fa_italics_c]}")
+ else w
+ end
+ end
+ line_array << w
+ end
+ line_array.join(' ')
+ else dob.obj
+ end
+ end
+ dob
+ end
+ def embolden(given)
+ given=given.gsub(/^!_\s+((?:\{|#{Mx[:lnk_o]})(?:~^ )?.+?(?:\}|#{Mx[:lnk_o]})https?:\/\/\S+.*?)([#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}])/,
+ "#{Mx[:fa_bold_o]} \\1 #{Mx[:fa_bold_c]}\\2").
+ gsub(/^!_\s+((?:\{|#{Mx[:lnk_o]})(?:~^ )?.+?(?:\}|#{Mx[:lnk_o]})https?:\/\/\S+.*)/,
+ "#{Mx[:fa_bold_o]} \\1 #{Mx[:fa_bold_c]}").
+ gsub(/(?:^!_|^#{Mx[:lv_o]}[7-9]:\S*?#{Mx[:lv_c]})\s*(.+?)([#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}])/,
+ "#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}\\2").
+ gsub(/(?:^!_|^#{Mx[:lv_o]}[7-9]:\S*?#{Mx[:lv_c]})\s*(.+?)\s+((?:[*]~\S+\s*)+)/,
+ "#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}\\2").
+ gsub(/(?:^!_|^#{Mx[:lv_o]}[7-9]:\S*?#{Mx[:lv_c]})\s*(.+?)\s*([~-]#)$/,
+ "#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}\\2").
+ gsub(/(?:^!_\s+|^#{Mx[:lv_o]}[7-9]:\S*?#{Mx[:lv_c]}\s*)(.*)?\s*$/,
+ "#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}")
+ end
+ def italicise(given)
+ given=given.gsub(/^\/_\s*(.+?)([#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}])/,
+ "#{Mx[:fa_italics_o]}\\1#{Mx[:fa_italics_c]}\\2").
+ gsub(/^\/_\s*(.+?)\s+((?:[*]~\S+\s*)+)/,
+ "#{Mx[:fa_italics_o]}\\1#{Mx[:fa_italics_c]}\\2").
+ gsub(/^\/_\s*(.+?)\s*([~-]#)$/,
+ "#{Mx[:fa_italics_o]}\\1#{Mx[:fa_italics_c]}\\2").
+ gsub(/^\/_\s+(.*)?\s*$/,
+ "#{Mx[:fa_italics_o]}\\1#{Mx[:fa_italics_c]}")
+ end
+ def line_actions(dob)
+ dob.obj=if (dob.is !=:heading \
+ && dob.is !=:heading_insert \
+ && dob.is !=:comment \
+ && dob.is !=:meta) \
+ and dob.obj =~ /^!_\s+/
+ embolden(dob.obj)
+ elsif dob.obj =~ /^\/_\s+/
+ italicise(dob.obj)
+ else dob.obj
+ end
+ dob
+ end
+ def paragraph_set(dob)
+ dob.obj=if dob.is !=:meta \
+ && dob.is !=:heading \
+ && dob.is !=:heading_insert \
+ && dob.is !=:code \
+ && dob.is !=:comment \
+ && dob.is !=:table
+ dob.obj.gsub(/\n/m,' ').
+ gsub(/ \s+/m,' ')
+ else dob.obj
+ end
+ dob
+ end
+ def substitutions(dob)
+ dob=dob.dup
+ dob=if defined? @md.substitution_match_list[:match_and_replace] \
+ and @md.substitution_match_list[:match_and_replace].is_a?(Array)
+ dob=if dob.is !=:meta \
+ && dob.is !=:heading_insert \
+ && dob.is !=:code \
+ && dob.is !=:comment \
+ && dob.is !=:table
+ if dob.obj =~/#{@md.substitution_match_list[:matches]}/
+ @md.substitution_match_list[:match_and_replace].each do |x|
+ dob.obj=if x[:case_s]==:i
+ dob.obj.gsub(/#{x[:match]}/mi,x[:replace])
+ else
+ dob.obj.gsub(/#{x[:match]}/m,x[:replace])
+ end
+ end
+ end
+ dob
+ else dob
+ end
+ dob
+ else dob
+ end
+ end
+ def wordlist_bold(dob)
+ dob=dob.dup
+ if (defined? @md.bold_match_list[:str] \
+ and @md.bold_match_list[:str]) \
+ or (defined? @vz.markup_make_bold[:str] \
+ and @vz.markup_make_bold[:str])
+ dob.obj=if dob.is !=:meta \
+ && dob.is !=:heading \
+ && dob.is !=:heading_insert \
+ && dob.is !=:code \
+ && dob.is !=:comment \
+ && dob.is !=:table
+ line_array=[]
+ word=dob.obj.scan(@line_scan_bold)
+ word=word.flatten.compact
+ word.each do |w|
+ unless /#{@manmkp_bold}|#{@http_m}/.match(w)
+ if defined? @md.bold_match_list[:regx] \
+ and @md.bold_match_list[:regx] #document header: @bold: [bold word list]
+ w=w.gsub(@md.bold_match_list[:regx],"#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}")
+ elsif defined? @vz.markup_make_bold \
+ and @vz.markup_make_bold #defaults adjusted bold word list
+ w=w.gsub(@vz.markup_make_bold,"#{Mx[:fa_bold_o]}\\1#{Mx[:fa_bold_c]}")
+ end
+ else
+ w=if w =~ /(?:^!_|^#{Mx[:lv_o]}[7-9]:\S*?#{Mx[:lv_c]})\s+/
+ embolden(w) #bold paragraph/emphasize #may wish to remove think about 7{ 8{ conversion not satisfactory, as information is lost!
+ elsif w =~/^\/_\s+/
+ italicise(w)
+ else w
+ end
+ end
+ line_array << w
+ end
+ line_array.join(' ')
+ else dob.obj
+ end
+ else
+ dob.obj=if dob.is==:heading \
+ and dob.ln.to_s =~/[7-9]/
+ embolden(dob.obj)
+ else dob.obj
+ end
+ end
+ dob
+ end
+ def fontface_lines(dob,leader)
+ while (dob.obj =~/#{Mx[:br_nl]}/ \
+ and dob.obj =~/(?:#{leader})([*!\/_#])\{(.+?)\}\1/m) \
+ and $2 =~/#{Mx[:br_nl]}/
+ dob=if dob.obj =~/#{Mx[:br_nl]}/ \
+ and dob.obj =~/(#{leader})([*!\/_#])\{(.+?)\}\2/m
+ lead,fce,txt=$1,$2,$3
+ dob=if txt =~/#{Mx[:br_nl]}/
+ lead_break=if dob.obj =~/^#{Mx[:br_nl]}/
+ dob.obj=dob.obj.sub(/^#{Mx[:br_nl]}/,'')
+ Mx[:br_nl]
+ else ''
+ end
+ txt="#{lead_break}#{fce}\{" + txt.split(Mx[:br_nl]).join("\}#{fce}#{Mx[:br_nl]}#{fce}\{") + "\}#{fce}"
+ dob.obj=dob.obj.sub(/(?:^|#{Mx[:gl_c]}|\s+|['"]|[#{Mx[:nbsp]}#{Mx[:fa_o_c]}#{Mx[:fa_c]}#{Mx[:lnk_o]}#{Mx[:br_nl]}#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:tc_c]}#{Mx[:tc_p]}]|[\(\[\{]|\>)([*!\/_#])\{.+?\}\1/m,"#{lead}#{txt}")
+ dob
+ else dob
+ end
+ end
+ dob
+ end
+ dob
+ end
+ def fontface(dob)
+ leader=/^|#{Mx[:gl_c]}|\s+|['"]|[#{Mx[:nbsp]}#{Mx[:fa_o_c]}#{Mx[:fa_c]}#{Mx[:lnk_o]}#{Mx[:br_nl]}#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:tc_c]}#{Mx[:tc_p]}]|[\(\[\{]|[、。]|\>/
+ dob=fontface_lines(dob,leader)
+ dob.obj=dob.obj.gsub(/(#{leader})\*\{(.+?)\}\*/m,
+ "\\1#{@emph[:o]}\\2#{@emph[:c]}"). #emphasis
+ gsub(/(#{leader})!\{(.+?)\}!/m,
+ "\\1#{Mx[:fa_bold_o]}\\2#{Mx[:fa_bold_c]}"). #bold
+ gsub(/(#{leader})\/\{(.+?)\}\//m,
+ "\\1#{Mx[:fa_italics_o]}\\2#{Mx[:fa_italics_c]}"). #italics
+ gsub(/(#{leader})_\{(.+?)\}_/m,
+ "\\1#{Mx[:fa_underscore_o]}\\2#{Mx[:fa_underscore_c]}"). #underscore
+ gsub(/(#{leader})#\{(.+?)\}#/m,
+ "\\1#{Mx[:fa_monospace_o]}\\2#{Mx[:fa_monospace_c]}"). #monospace
+ gsub(/(^|#{Mx[:gl_c]}|\s+|['"]|[#{Mx[:nbsp]}#{Mx[:fa_o_c]}#{Mx[:fa_c]}]|\(|\>)\"\{(.+?)\}\"/m,
+ "\\1#{Mx[:fa_cite_o]}\\2#{Mx[:fa_c_o]}cite#{Mx[:fa_c]}"). #cite /blockquote?
+ gsub(/(^|[^\\])\^\{(.+?)\}\^/m,
+ "\\1#{Mx[:fa_superscript_o]}\\2#{Mx[:fa_superscript_c]}"). #superscript
+ gsub(/(^|[^\\]),\{(.+?)\},/m,
+ "\\1#{Mx[:fa_subscript_o]}\\2#{Mx[:fa_subscript_c]}"). #subscript
+ gsub(/(^|#{Mx[:gl_c]}|\s+|['"]|#{Mx[:nbsp]}|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\+\{(.+?)\}\+/m,
+ "\\1#{Mx[:fa_insert_o]}\\2#{Mx[:fa_insert_c]}"). #inserted text
+ gsub(/(^|#{Mx[:gl_c]}|\s+|['"]|#{Mx[:nbsp]}|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)-\{(.+?)\}-/m,
+ "\\1#{Mx[:fa_strike_o]}\\2#{Mx[:fa_strike_c]}"). #strikethrough - deleted text
+ gsub(/(^|#{Mx[:gl_c]}|\s+|['"]|#{Mx[:nbsp]}|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>|\d+)\^(\S+?)\^/,
+ "\\1#{Mx[:fa_superscript_o]}\\2#{Mx[:fa_superscript_c]}") #superscript single word, watch digit added
+ dob
+ end
+ def bodymarkup(dob)
+ # << http://www.jus.uio.no/sisu/sisu_markup_table/markup >>
+ # See: data/sisu/sample/document_samples_sisu_markup/
+ ## fontface
+ # *{emphasis}* e{emphasis}e <strong>emphasis</strong>
+ # !{bold text}! b{bold}b <b>bold text</b>
+ # _{underline}_ u{underline}u <u>underline</u>
+ # /{italics}/ i{italics}i <i>italics</i>
+ # "{citation}" c{citation}c <cite>citation</cite> #blockquote?
+ # ^{superscript}^ <sup>superscript</sup>
+ # ,{subscript}, <sub>subscript</sub>
+ # +{inserted text}+ <ins>inserted text</ins>
+ # -{deleted text}- <del>deleted text</del>
+ # #{monospace text}#
+ #
+ # {url address}:url
+ # {image.png}imageurl
+ # {image.png}png
+ # ~{endnote}~ <!e endnote !>
+ # !_ #bold/emphasise paragraph
+ # _" #blockquote paragraph
+ # _1 <:i1> #indent paragraph 1 step
+ # _2 <:i2> #indent paragraph 2 steps
+ # _3 <:i3> #indent paragraph 3 steps
+ # _4 <:i4> #indent paragraph 4 steps
+ # _* #bullet (list) ●
+ # _1* #bullet (list) indented
+ # _1* #bullet (list) indented
+ # # #numbered (list) level 1
+ # _# #numbered (list) level 2
+ dob=dob.dup
+ if dob.is !=:meta \
+ && dob.is !=:comment \
+ && dob.is !=:code \
+ && dob.is !=:table
+ line_array=[]
+ word=dob.obj.scan(/\S+|\n/) #unless line =~/^(?:#{Mx[:meta_o]}|%+\s)/ #visit
+ if word
+ word.each do |w| # _ - / # | : ! ^ ~
+ unless w =~/~\{|\}~|~\[|\]~|^\^~|~\^|\*~\S+|~#|\{t?~|\{table|https?:\/\/\S+/ # do something earlier about table!!
+ w=w.gsub(/\\?~/,"#{Mx[:gl_o]}#126#{Mx[:gl_c]}") #escaped special character
+ end
+ w=w.gsub(/^\<$/,"#{Mx[:gl_o]}#lt#{Mx[:gl_c]}").gsub(/^\>$/,"#{Mx[:gl_o]}#gt#{Mx[:gl_c]}") #escaped special character
+ line_array << w
+ end
+ dob.obj=line_array.join(' ')
+ dob.obj=dob.obj.strip
+ end
+ dob.obj=dob.obj.gsub(/^([*#-.]{1,12})$/,'\1 ~#'). #ocn off for these paragraph separators
+ gsub(/~\{(.+?)\}~/m,Mx[:en_a_o] + '\1' + Mx[:en_a_c]).
+ gsub(/~\[([^*+].+?)\]~/m,Mx[:en_b_o] + '* \1' + Mx[:en_b_c]). #default if markup does not specify
+ gsub(/~\[(.+?)\]~/m,Mx[:en_b_o] + '\1' + Mx[:en_b_c])
+ if dob.is ==:heading \
+ and dob.ln ==0
+ dob.obj=dob.obj.gsub(/\s*@title\b/," #{@md.title.full}")
+ dob.obj=if defined? @md.creator.author \
+ and @md.creator.author
+ dob.obj.gsub(/\s+(?:@creator|@author)/,",#{Mx[:br_line]}#{@md.creator.author}")
+ else dob.obj.gsub(/\s+(?:@creator|@author)/,'')
+ end
+ end
+ if defined? @md.title \
+ and @md.title \
+ and defined? @md.title.full \
+ and defined? @md.creator \
+ and @md.creator
+ if dob.is ==:heading
+ dob.obj=dob.obj.gsub(/^\s*@title\s*$/,@md.title.full) if dob.lv =~/1/
+ dob.obj=if dob.lv =~/[23]/ \
+ and defined? @md.creator.author \
+ and @md.creator.author
+ dob.obj.gsub(/^\s*(?:(by\s+)?(?:@creator|@author))\s*$/,"\\1#{@md.creator.author}")
+ else dob.obj.gsub(/^\s*(?:(by\s+)?(?:@creator|@author))\s*$/,'\1')
+ end
+ end
+ end
+ dob.obj=dob.obj.gsub(/<(https?:\/\/\S+?)>/,'< \1 >'). #catch problem markup
+ gsub(/<:=(\S+?)>/,'{ c_\1.png 14x14 }image').
+ gsub(/<!(\S+)!>/,'<:\1>'). #escaped special character
+ gsub(/&nbsp;/,"#{Mx[:nbsp]}"). #escaped special character
+ gsub(/\\~/,"#{Mx[:gl_o]}#126#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\{/,"#{Mx[:gl_o]}#123#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\}/,"#{Mx[:gl_o]}#125#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\<</,"#{Mx[:gl_o]}#lt#{Mx[:gl_c]}#{Mx[:gl_o]}#lt#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\>>/,"#{Mx[:gl_o]}#gt#{Mx[:gl_c]}#{Mx[:gl_o]}#gt#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\</,"#{Mx[:gl_o]}#lt#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\>/,"#{Mx[:gl_o]}#gt#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\_/,"#{Mx[:gl_o]}#095#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\-/,"#{Mx[:gl_o]}#045#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\+/,"#{Mx[:gl_o]}#043#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\//,"#{Mx[:gl_o]}#047#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\#/,"#{Mx[:gl_o]}#035#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\&/,"#{Mx[:gl_o]}#038#{Mx[:gl_c]}"). #&amp; #escaped special character
+ gsub(/\\\|/,"#{Mx[:gl_o]}#124#{Mx[:gl_c]}"). #not really a sisu special character but made available as possibility
+ gsub(/\\\:/,"#{Mx[:gl_o]}#058#{Mx[:gl_c]}"). #not really a sisu special character but made available as possibility
+ gsub(/\\\!/,"#{Mx[:gl_o]}#033#{Mx[:gl_c]}"). #not really a sisu special character but made available as possibility
+ gsub(/\\\^/,"#{Mx[:gl_o]}#094#{Mx[:gl_c]}"). #not really a sisu special character but made available as possibility
+ gsub(/\\\,/,"#{Mx[:gl_o]}#044#{Mx[:gl_c]}"). #not really a sisu special character but made available as possibility
+ gsub(/\\\\/,"#{Mx[:gl_o]}#092#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\*/,"#{Mx[:gl_o]}#042#{Mx[:gl_c]}"). #escaped special character
+ gsub(/\\\!/,"#{Mx[:gl_o]}#033#{Mx[:gl_c]}") #escaped special character
+ if dob.obj=~/(?:https?:|ftp:|\{([^{}]+?)\}(?:#|:|[.]{1,2}\/))\S+/m
+ if dob.obj=~/(?:^|[#{Mx[:gl_c]}#{Mx[:nbsp]} ])\{~\^ (?:.+?)\s*\}(?:(?:https?:|ftp:|:|[.]{1,2}\/)\S+?)\s*#{Mx[:en_a_o]}(.+?)#{Mx[:en_a_c]}/m
+ dob.obj=dob.obj.gsub(/(^|[#{Mx[:gl_c]}#{Mx[:nbsp]} ])\{~\^ ([^}]+?)\s*\}((?:https?:|ftp:|:|[.]{1,2}\/)\S+?)\s*#{Mx[:en_a_o]}(.+?)#{Mx[:en_a_c]}/m,
+ "\\1#{Mx[:lnk_o]}\\2#{Mx[:lnk_c]}\\3 #{Mx[:en_a_o]}\\3 \\4#{Mx[:en_a_c]}") # watch
+ end
+ if dob.obj=~/(?:^|[#{Mx[:gl_c]}#{Mx[:nbsp]} ])\{~\^ (?:.+?)\s*\}(?:(?:https?:|ftp:|:|[.]{1,2}\/)\S+?)([;,.]?)(?=\s|[#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}]|$)/m
+ dob.obj=dob.obj.gsub(/(^|[#{Mx[:gl_c]}#{Mx[:nbsp]} ])\{~\^ (.+?)\s*\}((?:https?:|ftp:|:|[.]{1,2}\/)\S+?)([;,.]?)(?=\s|[#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}]|$)/m,
+ "\\1#{Mx[:lnk_o]}\\2#{Mx[:lnk_c]}\\3\\4 #{Mx[:en_a_o]}\\3#{Mx[:en_a_c]} ")
+ end
+ dob.obj=dob.obj.gsub(/(^|[^#])\{\s*([^{}]+?)\s*\}((?:https?:|:|[.]{2}\/|#)\S+?)(?=\s|[#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}#{Mx[:en_a_o]}#{Mx[:en_b_o]}]|$)/,
+ "\\1#{Mx[:lnk_o]}\\2#{Mx[:lnk_c]}\\3"). #linked (text or image, however text cannot include modified face, e.g. bold, ital, underline)
+ gsub(/(^|[#{Mx[:gl_c]}#{Mx[:lnk_c]}#{Mx[:en_a_o]}#{Mx[:en_b_o]}(\s])((?:https?|ftp):\/\/\S+?\.[^>< ]+?)([,.;'"]?)(?=[\s#{Mx[:en_a_c]}#{Mx[:en_b_c]}#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}]|$)/m,
+ %{\\1#{Mx[:url_o]}\\2#{Mx[:url_c]}\\3}).
+ gsub(/#{Mx[:lnk_c]}#(\S+?[^>< ]+?)([()\[\]]*[,.;:!?'"]{0,2})(?=[\s#{Mx[:en_a_c]}#{Mx[:en_b_c]}#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}]|$)/m,
+ %{#{Mx[:lnk_c]}#{Mx[:rel_o]}\\1#{Mx[:rel_c]}\\2}).
+ gsub(/#{Mx[:lnk_c]}:(\S+?[^>< ]+?)([()\[\]]*[,.;:!?'"]{0,2})(?=[\s#{Mx[:en_a_c]}#{Mx[:en_b_c]}#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}]|$)/m,
+ %{#{Mx[:lnk_c]}#{Mx[:rel_o]}:\\1#{Mx[:rel_c]}\\2}).
+ gsub(/#{Mx[:lnk_c]}[.]{2}\/(\S+?[^>< ]+?)([()\[\]]*[,.;:!?'"]{0,2})(?=[\s#{Mx[:en_a_c]}#{Mx[:en_b_c]}#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}]|$)/m,
+ %{#{Mx[:lnk_c]}#{Mx[:rel_o]}:\\1#{Mx[:rel_c]}\\2})
+ end
+ if dob.obj=~/_(?:https?|ftp):\S+/m # _http://url #CHECK
+ dob.obj=dob.obj.gsub(/(^|[#{Mx[:gl_c]}#{Mx[:lnk_c]}#{Mx[:en_a_o]}#{Mx[:en_b_o]}(\s])(_(?:https?|ftp):\/\/\S+?\.[^>< ]+?)([,.;'"]?)(?=[\s#{Mx[:en_a_c]}#{Mx[:en_b_c]}#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}]|$)/m,
+ %{\\1#{Mx[:url_o]}\\2#{Mx[:url_c]}\\3})
+ end
+ dob=fontface(dob)
+ dob.obj=dob.obj.gsub(/<[:e]\s+(.+?)!?>/,
+ "#{Mx[:en_a_o]}\\1#{Mx[:en_a_c]}"). #not tested
+ gsub(/(^|#{Mx[:br_nl]})\s*_\*\s*/,
+ "\\1#{Mx[:gl_bullet]}"). #bullets, shortcut
+ gsub(/=\{(.+?)\}/,
+ "#{Mx[:idx_o]}\\1#{Mx[:idx_c]}").
+ gsub(/^\s*_([1-9])\*\s*/,
+ "#{Mx[:pa_o]}:i\\1:\\1#{Mx[:pa_c]}#{Mx[:gl_bullet]}"). #bullets, shortcut
+ gsub(/^\s*_([1-9])\s+/,
+ "#{Mx[:pa_o]}:i\\1:\\1#{Mx[:pa_c]}"). #indent
+ gsub(/^\s*_([1-9])!\s+(.+?)\s*$/,
+ "#{Mx[:pa_o]}:i\\1:\\1#{Mx[:pa_c]}#{Mx[:fa_bold_o]}\\2#{Mx[:fa_bold_c]} "). #indent bold
+ gsub(/^\s*__([1-9])\s+/,
+ "#{Mx[:pa_o]}:i0:\\1#{Mx[:pa_c]}"). #hang
+ gsub(/^\s*__([1-9])!\s+(.+?)\s*$/,
+ "#{Mx[:pa_o]}:i0:\\1#{Mx[:pa_c]}#{Mx[:fa_bold_o]}\\2#{Mx[:fa_bold_c]} "). #hangdef
+ gsub(/^\s*_([0-9])_([0-9])\s+/,
+ "#{Mx[:pa_o]}:i\\1:\\2#{Mx[:pa_c]}"). #hang
+ gsub(/^\s*_([0-9])_([0-9])!\s+(.+?)\s*$/,
+ "#{Mx[:pa_o]}:i\\1:\\2#{Mx[:pa_c]}#{Mx[:fa_bold_o]}\\3#{Mx[:fa_bold_c]} "). #hangdef
+ gsub(/<:hi>/,"#{Mx[:fa_hilite_o]}"). #'<span style="background-color: rgb(255,240,196)">'). # bright yellow rgb(255,255,0) pale yellow rgb(255,255,200)
+ gsub(/<:\/hi>/,"#{Mx[:fa_hilite_c]}"). #'</span>').
+ gsub(/(#{Mx[:gr_o]}verse#{Mx[:gr_c]}.+)/m,"\\1\n").
+ gsub(/[ ]+($)/,'\1').
+ gsub(/\{\s*(.+?)\s*\}(https?:\S+?)([;,.]?)(?=\s|[#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}#{Mx[:en_a_o]}#{Mx[:en_b_o]}]|$)/,
+ "#{Mx[:lnk_o]}\\1#{Mx[:lnk_c]}#{Mx[:url_o]}\\2#{Mx[:url_c]}\\3"). #any remaining linked text or image
+ gsub(/\{\s*(.+?)\s*\}(#{Mx[:url_o]}\S+?#{Mx[:url_c]})/,
+ "#{Mx[:lnk_o]}\\1#{Mx[:lnk_c]}\\2"). #any remaining linked text or image
+ gsub(/(^|\s)([a-zA-Z0-9._-]+\@\S+?\.[a-zA-Z0-9._-]+)/,"\\1#{Mx[:url_o]}\\2#{Mx[:url_c]}").
+ gsub(/(^|[ ])\{\s*(.+?)\s*\}(\S+?)([;,.]?)(?=\s|[#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}#{Mx[:en_a_o]}#{Mx[:en_b_o]}]|$)/,
+ "\\1#{Mx[:lnk_o]}\\2#{Mx[:lnk_c]}\\3\\4"). #any remaining linked text or image
+ gsub(/\{\s*(.+?)\s*\}#([a-zA-Z0-9][a-zA-Z0-9_-]*)([;,.]?)(?=\s|[#{Mx[:br_line]}#{Mx[:br_paragraph]}#{Mx[:br_nl]}#{Mx[:en_a_o]}#{Mx[:en_b_o]}]|$)/,
+ "#{Mx[:lnk_o]}\\1#{Mx[:lnk_c]}#{Mx[:rel_o]}\\2#{Mx[:rel_c]}\\3"). #any remaining linked text or image, check need
+ gsub(/\{\s*(.+?)\s*\}(#{Mx[:rel_o]}\S+?#{Mx[:rel_c]})/,
+ "#{Mx[:lnk_o]}\\1#{Mx[:lnk_c]}\\2"). #any remaining linked text or image, check need
+ gsub(/\{\s*(.+?)\s*\}(image)/,
+ "#{Mx[:lnk_o]}\\1#{Mx[:lnk_c]}\\2") #linked image
+ elsif dob.is==:table
+ dob=fontface(dob)
+ elsif dob.is ==:code
+ dob.obj=dob.obj.gsub(/#{Mx[:meta_o]}(\S+?)#{Mx[:meta_c]}\s*/,'@\1: ').
+ gsub(/(^|#{Mx[:gl_c]}|\s)&lt;(br(?: \/)?)&gt;([\s,.]|$)/,'\1<\2>\3') #convert <br> <br /> back, clumsy
+ if dob.number_
+ codeline=[]
+ ln=1
+ dob.obj.split(/#{Mx[:gr_o]}codeline#{Mx[:gr_c]}|<br(?: \/)?>|\n/).each_with_index do |cl,i|
+ unless i == 0
+ cl=cl.gsub(Mx[:br_nl],'')
+ w=3-ln.to_s.length
+ cl = "#{ln}#{Mx[:nbsp]*w}#{Mx[:vline]}#{cl}#{Mx[:br_nl]}"
+ ln +=1
+ end
+ codeline << cl
+ end
+ codeline= codeline.join("")
+ dob.obj=codeline
+ else
+ dob.obj=dob.obj.gsub(/#{Mx[:gr_o]}codeline#{Mx[:gr_c]}/,"\n")
+ end
+ dob
+ else # @\S+?:
+ end
+ dob
+ end
+ def tech #script markup planned to be more strict for technical documents
+ # *{emphasis}* e{emphasis}e <strong>emphasis</strong>
+ # !{bold text}! b{bold}b <b>bold text</b>
+ # _{underline}_ u{underline}u <u>underline</u>
+ # /{italics}/ i{italics}i <i>italics</i>
+ # "{citation}" c{citation}c <cite>citation</cite>
+ # ^{superscript}^ <sup>superscript</sup>
+ # ,{subscript}, <sub>subscript</sub>
+ # +{inserted text}+ <ins>inserted text</ins>
+ # -{deleted text}- <del>deleted text</del>
+ # #{monospace text}#
+ # {url address}:url
+ # {image.png}imageurl
+ # {image.png}png
+ # ~{endnote}~ <!e endnote !>
+ # +1 <!i1!>
+ # +2 <!i2!>
+ puts 'tech'
+ @data.each do |line|
+ line=line.gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)e\{(.+?)\}e/,
+ "\\1#{@emph[:o]}\\2#{@emph[:c]}"). #emphasis
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)b\{(.+?)\}b/,
+ "\\1#{Mx[:fa_bold_o]}\\2#{Mx[:fa_bold_c]}"). #bold
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)u\{(.+?)\}u/,
+ "\\1#{Mx[:fa_underscore_o]}\\2#{Mx[:fa_underscore_c]}"). #underscore
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)c\{(.+?)\}c/,
+ "\\1#{Mx[:fa_cite_o]}\\2#{Mx[:fa_c_o]}cite#{Mx[:fa_c]}"). #cite
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)i\{(.+?)\}i/,
+ "\\1#{Mx[:fa_italics_o]}\\2#{Mx[:fa_italics_c]}"). #italics
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)!\{(.+?)\}!/,
+ "\\1#{Mx[:fa_bold_o]}\\2#{Mx[:fa_bold_c]}"). #bold
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)\*\{(.+?)\}\*/,
+ "\\1#{@emph[:o]}\\2#{@emph[:c]}"). #emphasis
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\>)_\{(.+?)\}_/,
+ "\\1#{Mx[:fa_underscore_o]}\\2#{Mx[:fa_underscore_c]}"). #underscore
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|[\(\[]|\(|\>)\/\{(.+?)\}\//,
+ "\\1#{Mx[:fa_italics_o]}\\2#{Mx[:fa_italics_c]}"). #italics
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\"\{(.+?)\}\"/,
+ "\\1#{Mx[:fa_cite_o]}\\2#{Mx[:fa_c_o]}cite#{Mx[:fa_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\^\{(.+?)\}\^/,
+ "\\1#{Mx[:fa_superscript_o]}\\2#{Mx[:fa_superscript_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)9\{(.+?)\}9/,
+ "\\1#{Mx[:fa_superscript_o]}\\2#{Mx[:fa_superscript_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>),\{(.+?)\},/,
+ "\\1#{Mx[:fa_subscript_o]}\\2#{Mx[:fa_subscript_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)6\{(.+?)\}6/,
+ "\\1#{Mx[:fa_subscript_o]}\\2#{Mx[:fa_subscript_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\+\{(.+?)\}\+/,
+ "\\1#{Mx[:fa_insert_o]}\\2#{Mx[:fa_insert_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)v\{(.+?)\}v/,
+ "\\1#{Mx[:fa_insert_o]}\\2#{Mx[:fa_insert_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)-\{(.+?)\}-/,
+ "\\1#{Mx[:fa_strike_o]}\\2#{Mx[:fa_strike_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)x\{(.+?)\}x/,
+ "\\1#{Mx[:fa_strike_o]}\\2#{Mx[:fa_strike_c]}").
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\*(\S+?)\*/,
+ "\\1#{@emph[:o]}\\2#{@emph[:c]}"). #emphasise single word, watch
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\!(\S+?)\!/,
+ "\\1#{Mx[:fa_bold_o]}\\2#{Mx[:fa_bold_c]}"). #bold single word, watch
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\/([\(\)a-zA-Z0-9']+?)\/([ ,.;:'"~$]|[^a-zA-Z0-9])/,
+ "\\1#{Mx[:fa_italics_o]}\\2#{Mx[:fa_italics_c]}\\3"). #italics single word, watch
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)_(\S+?)_/,
+ "\\1#{Mx[:fa_underscore_o]}\\2#{Mx[:fa_underscore_c]}"). #underscore single word, watch
+ gsub(/(^|\s+|['"]|#{Mx[:fa_o_c]}|#{Mx[:fa_c]}|\(|\>)\^(\S+?)\^/,
+ "\\1#{Mx[:fa_superscript_o]}\\2#{Mx[:fa_superscript_c]}"). #check #superscript single word, watch digit added
+ gsub(/^\s*_\([1-9]\)\(\*\+\)\s*/,
+ "#{Mx[:pa_o]}:i\\1#{Mx[:pa_c]}#{Mx[:fa_o]}\\2#{Mx[:fa_c_o]}"). #bullets, shortcut
+ gsub(/^\s*_\([1-9]\)\s+/,
+ "#{Mx[:pa_o]}:i\\1#{Mx[:pa_c]}"). #watch
+ gsub(/^\s*__\([1-9]\)\s+/,
+ "#{Mx[:pa_o]}:h\\1#{Mx[:pa_c]}"). #watch
+ #line.gsub(/^\s*__\([1-9]\)!\s+/,
+ # "#{Mx[:pa_o]}:hd\\1#{Mx[:pa_c]}"). #watch
+ gsub(/#{Mx[:br_line]}\s*_[12]\s+/,
+ "#{Mx[:br_line]} ") #indent used in endnotes, not implemented, replace when ready with: line.gsub(/(?:<br>|<br \/>)\s*_([12])\s+/,'<br><:i\1> ')
+ end
+ @data
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/author_format.rb b/lib/sisu/v6/author_format.rb
new file mode 100644
index 0000000..7b791bd
--- /dev/null
+++ b/lib/sisu/v6/author_format.rb
@@ -0,0 +1,117 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/author_format.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+module SiSU_FormatAuthor
+ class Author
+ def initialize(author_param)
+ @author_param=author_param
+ end
+ def author_details
+ @authors,@author_array=[],[]
+ authors=@author_param.scan(/[^;]+/)
+ authors.each do |a|
+ a=a.strip
+ if a =~/"(.+?)"/
+ @authors << { the: $1 }
+ @author_array << $1.upcase
+ else #if a =~/,/
+ x=a.scan(/[^,]+/)
+ x[0]=x[0].strip
+ x[1]=x[1].strip if x[1]
+ if x.length==1
+ @authors << { the: x[0] }
+ @author_array << x[0].upcase
+ elsif x.length==2
+ @authors << { the: x[0], others: x[1] }
+ @author_array << "#{x[0].upcase}, #{x[1]}"
+ else #p x.length
+ end
+ end
+ end
+ l = @authors.length
+ authors_string=''
+ @authors.each_with_index do |a,i|
+ authors_string += if a[:others]
+ if (l - i) > 1
+ "#{a[:others]} #{a[:the]}, "
+ else
+ "#{a[:others]} #{a[:the]}"
+ end
+ else
+ if (l - i) > 2
+ "#{a[:the]}, "
+ else
+ "#{a[:the]}"
+ end
+ end
+ end
+ {
+ last_first_a: authors,
+ last_first_format_a: @author_array,
+ authors_h: @authors,
+ authors_s: authors_string,
+ authors_param: @author_param
+ }
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/cgi.rb b/lib/sisu/v6/cgi.rb
new file mode 100644
index 0000000..a406534
--- /dev/null
+++ b/lib/sisu/v6/cgi.rb
@@ -0,0 +1,91 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/cgi.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: generates naive cgi search form for search of sisu database
+ (pgsql sqlite)
+
+=end
+module SiSU_CGI #% database building documents
+ require_relative 'sysenv' # sysenv.rb
+ require_relative 'cgi_pgsql' # cgi_pgsql.rb
+ require_relative 'cgi_sqlite' # cgi_sqlite.rb
+ class SearchSQL
+ def initialize(opt)
+ @opt=opt
+ @webserv=@opt.files[0].to_s.strip
+ end
+ def read
+ if @opt.mod.inspect =~/--db[=-]["']?(?:pg|pg?sql|postgres(?:ql)?)["']+/
+ SiSU_CGI_PgSQL::SearchPgSQL.new(@opt,@webserv).pgsql
+ elsif @opt.mod.inspect =~/--db[=-](?:sqlite)/
+ SiSU_CGI_SQLite::SearchSQLite.new(@opt,@webserv).sqlite
+ else
+ puts <<-WOK
+ please select database type for which sample search form should be built (pgsql or sqlite)
+ sisu --sample-search-form --db=sqlite
+ sisu --sample-search-form --db=pg
+ other options include
+ --webserv-cgi='[cgi-server-name]'
+ --webserv-output='[sisu-output-server-with-base-path]'
+ WOK
+ end
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/cgi_pgsql.rb b/lib/sisu/v6/cgi_pgsql.rb
new file mode 100644
index 0000000..2bcd42e
--- /dev/null
+++ b/lib/sisu/v6/cgi_pgsql.rb
@@ -0,0 +1,297 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/cgi_pgsql.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: generates naive cgi search form for search of sisu database (pgsql)
+
+=end
+module SiSU_CGI_PgSQL #% database building documents
+ require_relative 'sysenv' # sysenv.rb
+ require_relative 'cgi_sql_common' # cgi_sql_common.rb
+ include SiSU_CGI_SQL
+ class SearchPgSQL < CGI_Common
+ def initialize(opt,webserv)
+ @opt,@webserv=opt,webserv
+ @cX=SiSU_Screen::Ansi.new(opt.act[:color_state][:set]).cX
+ @env=SiSU_Env::InfoEnv.new('',opt)
+ @sys=SiSU_Env::SystemCall.new
+ @db=SiSU_Env::InfoDb.new
+ get_init=SiSU_Env::GetInit.new
+ @rc=get_init.sisu_yaml.rc
+ @name_of={}
+ @name_of[:output_dir_structure]=if @opt.dir_structure_by.to_s =~/(?:language|filetype|filename)/
+ @opt.dir_structure_by.to_s
+ else 'language'
+ end
+ @name_of[:lingual]=if @opt.lingual.to_s =~/(?:mono|multi)/
+ @opt.lingual.to_s
+ else 'multi'
+ end
+ if defined? @rc['search'] \
+ and defined? @rc['search']['sisu'] \
+ and defined? @rc['search']['sisu']['action'] \
+ and @rc['search']['sisu']['action'] =~/https?:\/\/\S+?\.cgi/ \
+ and defined? @rc['search']['sisu']['db'] \
+ and @rc['search']['sisu']['db'] =~/\S+/
+ @name_of[:db]=@rc['search']['sisu']['db']
+ else
+ @name_of[:db]=@env.path.stub_pwd #'sisu' #breaks if not present
+ false
+ end
+ @name_of[:host_url_cgi]="#{@env.url.webserv_base_cgi(@opt)}/cgi-bin"
+ @name_of[:host_url_docs]=@env.url.webserv_files_from_db(@opt)
+ @name_of[:cgi_script]=@env.url.cgi_sample_search_form_name(@opt)
+ @name_of[:user]=@db.psql.user(@opt)
+ @cgi_file_name=@name_of[:cgi_script]
+ @image_src="#{@env.url.webserv_base_cgi(@opt)}/_sisu/image_sys"
+ @common=SiSU_CGI_SQL::CGI_Common.new(@webserv,@opt,@image_src,@env)
+ end
+ def pgsql
+ serve=[]
+ if @sys.psql
+ available_db_table=`psql --list` # system call requires psql
+ available_db=available_db_table.scan(/(#{Db[:name_prefix]}\S+)/) if not available_db_table.nil?
+ if available_db \
+ and available_db.is_a?(Array)
+ available_db.flatten.each do |x|
+ serve << x.gsub(/#{Db[:name_prefix]}(\S+)/,'\1')
+ end
+ else STDERR.puts "WARNING: no postgresql database available, (have you created one?)"
+ end
+ serve=serve.sort
+ f1,f2='',''
+ serve.each do |x|
+ f1 << %{ <option value="#{Db[:name_prefix]}#{x}">#{x}</option>\n} unless x =~/apache|sisu\/image/ #check
+ end
+ end
+ f2 << %q{ selected_db=%{<option value="#{@db_name_prefix}#{@stub}">#{@stub}</option>}} + "\n"
+ if FileTest.writable?('.')
+ output=File.open(@cgi_file_name,'w')
+ output << header0 << header1 << header_desc << header2 << f1 << buttons1 << buttons1_pgsql << buttons2 << search_request << search_statement << search_statement_common << search_query1 << @common.pages << search_query2 << @common.tail << @common.main1 << f2 << dbi_connect << @common.main2 << @common.dir_structure << @common.main3
+ puts <<-WOK
+ generated sample search form: #{@cX.green}#{@cgi_file_name}#{@cX.off}
+ default database name: #{@cX.green}#{Db[:name_prefix]}#{@name_of[:db]}#{@cX.off} (#{@name_of[:db]})
+ db user: #{@cX.green}#{@name_of[:user]}#{@cX.off}
+ to modify use: #{@cX.brown}sisu --db-pg --db-user='#{@name_of[:user]}'#{@cX.off}
+ cgi & db host on: #{@cX.blue}#{@name_of[:host_url_cgi]}#{@cX.off}
+ to modify use: #{@cX.brown}sisu --db-pg --webserv-search='#{@name_of[:host_url_cgi]}'#{@cX.off}
+ sisu output on: #{@cX.blue}#{@name_of[:host_url_docs]}#{@cX.off}
+ to modify use: #{@cX.brown}sisu --db-pg --webserv-output='#{@name_of[:host_url_docs]}'#{@cX.off}
+ cgi search form link name: #{@cX.green}#{@name_of[:cgi_script]}#{@cX.off}
+ to modify use: #{@cX.brown}sisu --db-pg --cgi-search-form-name='#{@name_of[:cgi_script]}'#{@cX.off}
+ #{@cX.fuchsia}(settings priority: command line; sisurc.yml; else defaults)#{@cX.off}
+
+ #{@cX.fuchsia}BASED ON ALREADY EXISTING databases#{@cX.off} (default database name: #{@db.psql.db})
+ NOTE it is first necessary to createdb,
+ use sisu to create the tables & populate the postgresql db
+
+ the database to be used for this directory (#{@db.psql.db})
+ will have to be created manually if it does not exist:
+ using postgresql tools directly (the following may work):
+ (i) if you are not yet a postgresql user,
+ #{@cX.brown}sudo su postgres
+ createuser -d -a #{@env.user}
+ exit#{@cX.off}
+ (ii) create the database:
+ #{@cX.brown}createdb #{@db.psql.db}#{@cX.off}
+ [for a list of existing databases try 'psql --list']"
+
+ now you can use sisu to create the database tables and populate the database with documents
+
+ sisu --pg --dropall # removes existing postgresql db & tables
+ sisu --pg --createall -v # creates postgresql db & tables
+ sisu --pg --update -v *.sst *.ssm # populate the db
+ sisu --sample-search-form --pg # creates the postgresql search form
+ # this should be done after creating the db
+ # to be searched
+ sisu --webrick & # starts ruby webrick web server
+
+ # if necessary make the directory '/usr/lib/cgi-bin'
+ # here we copy the postgresql search form to cgi-bin
+ # (copy #{@cgi_file_name} to your cgi directory)
+ # set file permissions to 755
+ WOK
+ a=case @webserv
+ when /pwd/ then ''
+ else <<-WOK
+
+ sudo cp -vi #{Dir.pwd}/#{@cgi_file_name} /usr/lib/cgi-bin/.; \\
+ sudo chmod -v 755 /usr/lib/cgi-bin/#{@cgi_file_name}
+ WOK
+ end
+ SiSU_Screen::Ansi.new(opt.act[:color_state][:set],a).warn
+ a=<<-WOK
+ #{@env.webserv_base_cgi(@opt)}/cgi-bin/#{@cgi_file_name}
+ WOK
+ SiSU_Screen::Ansi.new(opt.act[:color_state][:set],a).print_blue
+ a="\n\t(to create and populate postgresql database see 'man sisu' and in particular the --pg option)\n\t[the database to be used for this directory (#{@db.psql.db}) will have to be created manually if it does not exist,\n\tusing postgresql tools directly: 'createdb #{@db.psql.db}' for a list of existing databases try 'psql --list']"
+ SiSU_Screen::Ansi.new(opt.act[:color_state][:set],a).txt_grey
+ else puts 'failed in attempt to write #{@cgi_file_name} to present directory, is directory writable?'
+ end
+ end
+ def header0
+ <<-WOK_SQL
+#!/usr/bin/env ruby
+=begin
+#{about}
+ * Description: generates naive cgi search form for search of sisu database (pgsql)
+#{gpl}
+=end
+ require 'cgi'
+ require 'fcgi'
+ require 'dbi'
+ @stub_default='#{@name_of[:db]}'
+ @image_src='#{@image_src}'
+ @hosturl_cgi='#{@name_of[:host_url_cgi]}'
+ @hosturl_files='#{@name_of[:host_url_docs]}'
+ @output_dir_structure_by='#{@name_of[:output_dir_structure]}'
+ @lingual='#{@name_of[:lingual]}'
+ @port='#{@db.psql.port}'
+ @db_name_prefix='#{Db[:name_prefix]}'
+ @user='#{@name_of[:user]}' # check user name for access to pg database: e.g. www-data or '#{@env.user}'
+ @base='#{@name_of[:host_url_cgi]}/#{@name_of[:cgi_script]}'
+ WOK_SQL
+ end
+ def search_statement
+ <<-'WOK_SQL'
+ class DBI_SearchString
+ def initialize(l,t,q,cse=false)
+ @l,@t,@q,@c=l,t,q,cse
+ end
+ def string
+ search={ search: [], flag: false }
+ if @t =~/\S+/ or @q =~/\S+/
+ if @t =~/\S+/ then unescaped_search=CGI.unescape(@t)
+ elsif @q =~/\S+/ then unescaped_search=CGI.unescape(@q)
+ end
+ search_construct=[]
+ unescaped_search=if @c
+ unescaped_search.gsub(/\s*(AND|OR)\s*/,"' \) \\1 #{@l}~\( '").
+ gsub(/(.+)/,"#{@l}~\( '\\1' \)")
+ else
+ unescaped_search.gsub(/\s*(AND|OR)\s*/,"' \) \\1 #{@l}~*\( '").
+ gsub(/(.+)/,"#{@l}~*\( '\\1' \)")
+ end
+ search_construct << unescaped_search
+ search_construct=search_construct.join(' ')
+ search[:search] << search_construct
+ search[:flag]=true
+ search
+ end
+ search
+ end
+ end
+ WOK_SQL
+ end
+ def search_query1
+ <<-'WOK_SQL'
+ @search_text,@search_endnotes='',''
+ @search_text=search[:text].flatten.join(' AND ')
+ @search_text=@search_text.gsub(/(doc_objects\.clean~[*]?\(\s*'[^']+'\s*\)\s+(?:(?:AND|OR)\s+doc_objects\.clean~[*]?\(\s*'[^']+'\s*\))+)/,'(\1)')
+ @search_endnotes=search[:endnotes].flatten.join(' AND ')
+ @search_endnotes=@search_endnotes.gsub(/(endnotes\.clean~\(\s*'[^']+'\s*\)\s+(?:(?:AND|OR)\s+endnotes\.clean~\(\s*'[^']+'\s*\))+)/,'(\1)')
+ end
+ WOK_SQL
+ end
+ def search_query2
+ <<-'WOK_SQL'
+ def sql_select_body
+ limit ||=@@limit
+ offset ||=@@offset
+ @sql_statement[:body]=%{SELECT metadata_and_text.title, metadata_and_text.creator_author, metadata_and_text.src_filename, metadata_and_text.language_document_char, metadata_and_text.notes_suffix, doc_objects.body, doc_objects.seg, doc_objects.ocn, metadata_and_text.tid FROM doc_objects, metadata_and_text WHERE (#{@search_text}) AND doc_objects.metadata_tid = metadata_and_text.tid ORDER BY metadata_and_text.language_document_char, metadata_and_text.title, metadata_and_text.src_filename, doc_objects.ocn}
+ @sql_statement[:range]=%{LIMIT #{limit} OFFSET #{offset} ;}
+ select=@sql_statement[:body] + ' ' + @sql_statement[:range]
+ select
+ end
+ def sql_select_endnotes
+ limit ||=@@limit
+ offset ||=@@offset
+ @sql_statement[:endnotes]=%{SELECT metadata_and_text.title, metadata_and_text.creator_author, metadata_and_text.src_filename, metadata_and_text.language_document_char, endnotes.body, endnotes.nr, endnotes.ocn, endnotes.metadata_tid FROM metadata_and_text, endnotes WHERE (#{@search_endnotes}) AND metadata_and_text.tid = endnotes.metadata_tid ORDER BY metadata_and_text.language_document_char, metadata_and_text.title, metadata_and_text.src_filename, endnotes.nr}
+ @sql_statement[:range]=%{LIMIT #{limit} OFFSET #{offset} ;}
+ select=@sql_statement[:endnotes] + ' ' + @sql_statement[:range]
+ select
+ end
+ def sql_select_body_format
+ %{<font color="#666666" size="2">#{sql_select_body}</font>}
+ end
+ def sql_select_endnotes_format
+ %{<font color="#666666" size="2">#{sql_select_endnotes}</font>}
+ end
+ def contents
+ @conn.select_all(sql_select_body)
+ end
+ def endnotes
+ @conn.select_all(sql_select_endnotes)
+ end
+ end
+ WOK_SQL
+ end
+ def buttons1_pgsql
+ <<-'WOK_SQL'
+ <input type="checkbox" name="casesense" #{@checked_case}> case sensitive
+ WOK_SQL
+ end
+ def dbi_connect
+ <<-'WOK_SQL'
+ dbi="dbi:Pg:database=#{@db};port=#{@port}"
+ @conn=DBI.connect(dbi,@user)
+ WOK_SQL
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/cgi_sql_common.rb b/lib/sisu/v6/cgi_sql_common.rb
new file mode 100644
index 0000000..44d0688
--- /dev/null
+++ b/lib/sisu/v6/cgi_sql_common.rb
@@ -0,0 +1,1086 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/cgi_sql_common.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: generates naive cgi search form for search of sisu database (pgsql sqlite)
+
+=end
+module SiSU_CGI_SQL
+ class CGI_Common
+ def initialize(webserv,opt,image_src,dir)
+ @webserv,@opt,@image_src,@env=webserv,opt,image_src,dir
+ @cmd=opt.cmd
+ end
+ def about
+ <<-'WOK_SQL'
+ * Name: SiSU information Structuring Universe
+ * Author: Ralph Amissah
+ * http://www.jus.uio.no/sisu
+ * http://www.jus.uio.no/sisu/SiSU/download
+ WOK_SQL
+ end
+ def gpl
+ <<-'WOK_SQL'
+ * Name: SiSU generated sample cgi search form
+
+ * Description: generated sample cgi search form for SiSU
+ (SiSU is a framework for document structuring, publishing and search)
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997 - 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/licenses/gpl.html>
+ <http://www.gnu.org/licenses/gpl.html>
+ <http://www.jus.uio.no/sisu/gpl.fsf>
+
+ * SiSU uses:
+ * Standard SiSU markup syntax,
+ * Standard SiSU meta-markup syntax, and the
+ * Standard SiSU object citation numbering and system
+
+ * Hompages:
+ <http://www.jus.uio.no/sisu>
+ <http://www.sisudoc.org>
+
+ * Download:
+ <http://www.jus.uio.no/sisu/SiSU/download.html>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+ WOK_SQL
+ end
+ def header1
+ <<-'WOK_SQL'
+#Common TOP
+ @@offset=0
+ @@canned_search_url=@base
+ @color_heading='#DDFFAA'
+ @color_match='#ffff48'
+ class Form
+ def initialize(base,search_field,selected_db,result_type,checked_sql_limit,checked_tip,checked_stats,checked_searched,checked_url,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,search_note,the_can='')
+ search_note='' if checked_searched !~/\S/
+ the_can='' if checked_url !~/\S/
+ search_field='' if checked_echo !~/\S/
+ @base,@search_field,@selected_db,@result_type,@checked_sql_limit,@checked_tip,@checked_stats,@checked_searched,@checked_url,@checked_case,@checked_echo,@checked_sql,@checked_all,@checked_none,@checked_selected,@checked_default,@search_note,@the_can=base,search_field,selected_db,result_type,checked_sql_limit,checked_tip,checked_stats,checked_searched,checked_url,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,search_note,the_can
+ @tip=if checked_tip =~/\S/
+ '<font size="2" color="#666666">text:__; fulltxt:__; keywords:__; title:__; author:__; topic_register:__; subject:__; description:__; publisher:__; editor:__; contributor:__; date:__; type:__; format:__; identifier:__; source:__; language:__; relation:__; coverage:__; rights:__; comment:__; abstract:__; filename:__;</font><br />'
+ else ''
+ end
+ end
+ def submission_form
+ search_form=<<-WOK
+ WOK_SQL
+ end
+ def header_desc
+ <<-WOK_SQL
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>
+ SiSU search form (sample): SiSU information Structuring Universe
+ </title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+ <meta name="sourcefile" content="SiSU._sst" />
+ <link rel="generator" href="http://www.jus.uio.no/sisu" />
+ <link rel="shortcut icon" href="#{@image_src}/rb7.ico" />
+ <link rel="stylesheet" href="../_sisu/css/html.css" type="text/css" />
+ </head>
+ <body bgcolor="#ffffff" text="#000000" link="#003090" lang="en" xml:lang="en">
+ <table summary="band" border="0" cellpadding="3" cellspacing="0">
+ <tr><td width="20%">
+ <table summary="home button / home information" border="0" cellpadding="3" cellspacing="0">
+ <tr><td align="left" bgcolor="#ffffff">
+ <br /><a href="http://sisudoc.org/" target="_top">
+ <b>SiSU</b>
+ </a>
+ <br /><a href="http://git.sisudoc.org/" target="_top">
+ git
+ </a>
+ </td></tr>
+ </table>
+ </td>
+ <td>
+ <label for="find"><b>#{@env.sample_search_form_title(@opt.dir_structure_by)}</b></label>
+ </td></tr>
+ </table>
+ WOK_SQL
+ end
+ def header2
+ <<-'WOK_SQL'
+ <form action="#{@base}" id="Test Form" method="post">
+ <table cellpadding="2">
+ <tr><td valign=\"top\">
+ <textarea id="find" name="find" type="text" rows="6" cols="40" maxlength="256">#{@search_field}</textarea>
+ </td>
+ <td valign=\"top\">
+ #{@tip}
+ #{@search_note}
+ #{@the_can}
+ </td></tr></table>
+ <td valign=\"top\"><tr><td>
+ <!input type="text" id="find" name="find" value="#{@search_field}" />
+ <!input type="text" id="find" name="find" value="" />
+ <font size="2" color="#222222">
+ <b>to search:</b> select which database to search (drop-down menu below); enter your search query (in the form above); and <b>click on the search button</b> (below)
+ <br />
+ <select name="db" size="1">
+ #{@selected_db}
+ WOK_SQL
+ end
+ def buttons1
+ <<-'WOK_SQL'
+ </select>
+ <input type="submit" value="SiSU search" />
+ <input type="radio" name="view" value="index" #{@result_type[:index]}> index
+ <input type="radio" name="view" value="text" #{@result_type[:text]}> text / grep
+ WOK_SQL
+ end
+ def buttons2
+ <<-'WOK_SQL'
+ <br />
+ match limit:
+ <input type="radio" name="sql_match_limit" value="1000" #{@checked_sql_limit[:l1000]}> 1,000
+ <input type="radio" name="sql_match_limit" value="2500" #{@checked_sql_limit[:l2500]}> 2,500
+ <br />
+ <input type="checkbox" name="echo" #{@checked_echo}> echo query
+ <input type="checkbox" name="stats" #{@checked_stats}> result stats
+ <input type="checkbox" name="url" #{@checked_url}> search url
+ <input type="checkbox" name="searched" #{@checked_searched}> searched
+ <input type="checkbox" name="tip" #{@checked_tip}> available fields
+ <input type="checkbox" name="sql" #{@checked_sql}> sql statement
+ <br />
+ checks:
+ <input type="radio" name="checks" value="check_default" #{@checked_default}> default
+ <input type="radio" name="checks" value="check_selected" #{@checked_selected}> selected
+ <input type="radio" name="checks" value="check_all" #{@checked_all}> all
+ <input type="radio" name="checks" value="check_none" #{@checked_none}> none
+ </font>
+ </td></tr>
+ </table>
+ </form>
+ WOK
+ end
+ end
+ WOK_SQL
+ end
+ def search_request
+ <<-'WOK_SQL'
+ class SearchRequest #% search_for
+ attr_accessor :text1,:fulltext,:keywords,:title,:author,:topic_register,:subject,:description,:publisher,:editor,:contributor,:date,:type,:format,:identifier,:source,:language,:relation,:coverage,:rights,:comment,:abstract,:owner,:date_created,:date_issued,:date_modified,:date_available,:date_valid,:filename
+ def initialize(search_field='',q='')
+ @search_field,@q=search_field,q
+ @text1=@fulltext=@keywords=@title=@author=@topic_register=@subject=@description=@publisher=@editor=@contributor=@date=@type=@format=@identifier=@source=@language=@relation=@coverage=@rights=@comment=@abstract=@owner=@date_created=@date_issued=@date_modified=@date_available=@date_valid=@filename=''
+ if @search_field=~/\S/
+ @text1=text_to_match('text:')
+ @fulltext=text_to_match('fulltxt:')
+ @topic_register=text_to_match('topic_register:')
+ @title=text_to_match('title:') # DublinCore 1 - title
+ @author=text_to_match('(?:author|creator)s?:') # DublinCore 2 - creator/author
+ @subject=text_to_match('subj(?:ect)?:') # DublinCore 3 - subject
+ @description=text_to_match('description:') # DublinCore 4 - description
+ @publisher=text_to_match('pub(?:lisher)?:') # DublinCore 5 - publisher
+ @editor=text_to_match('editor:')
+ @contributor=text_to_match('contributor:') # DublinCore 6 - contributor
+ @date=text_to_match('date:') # DublinCore 7 - date dd-mm-yy
+ @type=text_to_match('type:') # DublinCore 8 - type
+ @format=text_to_match('format:') # DublinCore 9 - format
+ @identifier=text_to_match('identifier:') # DublinCore 10 - identifier
+ @source=text_to_match('source:') # DublinCore 11 - source
+ @language=text_to_match('language:') # DublinCore 12 - language
+ @relation=text_to_match('relation:') # DublinCore 13 - relation
+ @coverage=text_to_match('coverage:') # DublinCore 14 - coverage
+ @rights=text_to_match('rights:') # DublinCore 15 - rights
+ @keywords=text_to_match('key(?:words?)?:')
+ @comment=text_to_match('comment:')
+ @abstract=text_to_match('abs(?:tract)?:')
+ @owner=text_to_match('owner:')
+ @date_created=text_to_match('date_created:')
+ @date_issued=text_to_match('date_issued:')
+ @date_modified=text_to_match('date_modified:')
+ @date_available=text_to_match('date_available:')
+ @date_valid=text_to_match('date_valid:')
+ @filename=text_to_match('filename:')
+ @text1=text_to_match unless @keywords or @author or @title or @text1 or @fulltext or @comment or @abstract or @rights or @subject or @publisher or @date or @filename or @topic_register
+ else
+ @text1=q['s1'] if q['s1']=~/\S/
+ @fulltext=q['ft'] if q['ft']=~/\S/
+ @keywords=q['key'] if q['key']=~/\S/
+ @title=q['ti'] if q['ti']=~/\S/
+ @author=q['au'] if q['au']=~/\S/
+ @topic_register=q['tr'] if q['tr']=~/\S/
+ @subject=q['sj'] if q['sj']=~/\S/
+ @description=q['dsc'] if q['dsc']=~/\S/
+ @publisher=q['pb'] if q['pb']=~/\S/
+ @editor=q['cntr'] if q['cntr']=~/\S/
+ @contributor=q['cntr'] if q['cntr']=~/\S/
+ @date=q['dt'] if q['dt']=~/\S/
+ @type=q['ty'] if q['ty']=~/\S/
+ @identifier=q['id'] if q['id']=~/\S/
+ @source=q['src'] if q['src']=~/\S/
+ @language=q['lang'] if q['lang']=~/\S/
+ @relation=q['rel'] if q['rel']=~/\S/
+ @coverage=q['cov'] if q['cov']=~/\S/
+ @rights=q['cr'] if q['cr']=~/\S/
+ @comment=q['co'] if q['co']=~/\S/
+ @abstract=q['ab'] if q['ab']=~/\S/
+ @date_created=q['dtc'] if q['dtc']=~/\S/
+ @date_issued=q['dti'] if q['dti']=~/\S/
+ @date_modified=q['dtm'] if q['dtm']=~/\S/
+ @date_available=q['dta'] if q['dta']=~/\S/
+ @date_valid=q['dtv'] if q['dtv']=~/\S/
+ @filename=if q['doc'] and q['search'] !~/search db/ then q['doc']
+ elsif q['fns']=~/\S/ then q['fns']
+ end
+ @@limit=q['ltd'] if q['ltd']=~/\d+/ # 1000
+ @@offset=q['off'] if q['off']=~/\d+/ # 0
+ end
+ end
+ def text_to_match(identifier='')
+ m={
+ string: /#{identifier}\s*(.+?)/,
+ string: /#{identifier}\s*(.+?)(?:;|\n|\r|$)/,
+ word: /#{identifier}[\s(]*(\S+)/
+ }
+ search_string=if @search_field =~m[:word]
+ search_string=if @search_field =~m[:braces] then m[:braces].match(@search_field)[1]
+ elsif @search_field =~m[:string] then m[:string].match(@search_field)[1]
+ else
+ str=m[:word].match(@search_field)[1]
+ str=str.gsub(/[()]/,'')
+ str
+ end
+ search_string=search_string.strip.gsub(/\s+/,'+')
+ #else
+ # "__"
+ end
+ end
+ end
+ WOK_SQL
+ end
+ def search_statement_common
+ <<-'WOK_SQL'
+ class DBI_SearchStatement
+ attr_reader :text_search_flag,:sql_select_body_format,:sql_select_endnotes_format,:sql_offset,:sql_limit
+ def initialize(conn,search_for,q,c)
+ @conn=conn
+ @text_search_flag=false
+ @sql_statement={ body: '', endnotes: '', range: '' }
+ #@offset||=@@offset
+ #@offset+=@@limit
+ search={ text: [], endnotes: [] }
+ cse=(c =~/\S/) ? true : false
+ st=DBI_SearchString.new('doc_objects.clean',search_for.text1,q['s1'],cse).string
+ se=DBI_SearchString.new('endnotes.clean',search_for.text1,q['s1'],cse).string
+ @text_search_flag=st[:flag]
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << se[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.fulltext',search_for.fulltext,q['ft'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.title',search_for.title,q['ti'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.creator_author',search_for.author,q['au'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.classify_topic_register',search_for.topic_register,q['tr'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.classify_subject',search_for.subject,q['sj'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.classify_keywords',search_for.keywords,q['key'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.notes_description',search_for.description,q['dsc'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.publisher',search_for.publisher,q['pb'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.creator_editor',search_for.editor,q['cntr'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.creator_contributor',search_for.contributor,q['cntr'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.date_published',search_for.date,q['dt'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.notes_type',search_for.type,q['ty'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.original_source',search_for.source,q['src'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.language_document_char',search_for.language,q['lang'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.notes_relation',search_for.relation,q['rel'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.notes_coverage',search_for.coverage,q['cov'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.rights_all',search_for.rights,q['cr'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.notes_comment',search_for.comment,q['co'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.notes_abstract',search_for.abstract,q['ab'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ st=DBI_SearchString.new('metadata_and_text.src_filename',search_for.filename,q['fns'],cse).string
+ if st[:flag]
+ search[:text] << st[:search]
+ search[:endnotes] << st[:search]
+ end
+ @@limit=q['ltd'] if q['ltd']=~/\d+/ # 1000
+ @@offset=q['off'] if q['off']=~/\d+/ # 0
+ WOK_SQL
+ end
+ def pages
+ <<-'WOK_SQL'
+ def sql_offset
+ @@offset
+ end
+ def sql_match_limit
+ @@limit
+ end
+ def sql_canned_search
+ @offset_next=sql_offset.to_i + sql_match_limit.to_i
+ @offset_previous=sql_offset.to_i - sql_match_limit.to_i
+ def current
+ @@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + sql_offset.to_s
+ end
+ def next
+ @@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + @offset_next.to_s
+ end
+ def previous
+ @offset_previous >= 0 \
+ ? (@@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + @offset_previous.to_s)
+ : ''
+ end
+ def start
+ @@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + 0.to_s
+ end
+ self
+ end
+ def pre_next(beyond_limit,img)
+ can=sql_canned_search
+ page=(sql_offset.to_i + sql_match_limit.to_i)/sql_match_limit.to_i
+ if beyond_limit
+ if page.to_s =~ /^1$/
+ %{<br /><center>
+ pg. #{page.to_s}
+ <a href="#{can.next}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_next_red.png" alt="&nbsp;&gt;&gt;" />
+ </a>
+ </center>}
+ elsif page.to_s =~ /^2$/
+ %{<br /><center>
+ <a href="#{can.previous}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
+ </a>
+ pg. #{page.to_s}
+ <a href="#{can.next}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_next_red.png" alt="&nbsp;&gt;&gt;" />
+ </a>
+ </center>}
+ else
+ %{<br /><center>
+ <a href="#{can.start}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="|&lt;&nbsp;" />
+ </a>
+ <a href="#{can.previous}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
+ </a>
+ pg. #{page.to_s}
+ <a href="#{can.next}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_next_red.png" alt="&nbsp;&gt;&gt;" />
+ </a>
+ </center>}
+ end
+ else
+ if page.to_s =~ /^1$/ then ''
+ elsif page.to_s =~ /^2$/
+ %{<br /><center>
+ <a href="#{can.previous}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
+ </a>
+ pg. #{page.to_s}
+ </center>}
+ else
+ %{<br /><center>
+ <a href="#{can.start}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="|&lt;&nbsp;" />
+ </a>
+ <a href="#{can.previous}">
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
+ </a>
+ pg. #{page.to_s}
+ </center>}
+ end
+ end
+ end
+ WOK_SQL
+ end
+ def tail
+ v=SiSU_Env::InfoVersion.instance.get_version
+ <<-WOK_SQL
+ def tail
+ <<-'WOK'
+ <br /><hr /><br />
+<table summary="SiSU summary" bgcolor="#ffffff" cellpadding="2" border="0">
+ <!-- widget sisu -->
+<tr><td valign="top" width="10%">
+ <table summary="home button / home information" border="0" cellpadding="3" cellspacing="0">
+ <tr><td align="left" bgcolor="#ffffff">
+ <br /><a href="http://sisudoc.org/" target="_top">
+ <b>SiSU</b>
+ </a>
+ <br /><a href="http://git.sisudoc.org/" target="_top">
+ git
+ </a>
+ </td></tr>
+ </table>
+</td>
+<td valign="top" width="45%">
+<!-- SiSU Rights -->
+ <p class="tiny_left"><font color="#666666" size="2">
+ Generated by
+ #{v[:project]} #{v[:version]} #{v[:date]} (#{v[:date_stamp]})
+ <br />
+ <a href="http://www.sisudoc.org" >
+ <b>#{v[:project]}</b></a> <sup>&copy;</sup> Ralph Amissah
+ 1993, current 2014.
+ All Rights Reserved.
+ <br />
+ #{v[:project]} is software for document structuring, publishing and search,
+ <br />
+ <a href="http://www.jus.uio.no/sisu" >
+ www.jus.uio.no/sisu
+ </a>
+ and
+ <a href="http://www.sisudoc.org" >
+ www.sisudoc.org
+ </a>
+ sources
+ <a href="http://git.sisudoc.org" >
+ git.sisudoc.org
+ </a>
+ <br />
+ <i>w3 since October 3 1993</i>
+ <a href="mailto:ralph@amissah.com" >
+ ralph@amissah.com
+ </a>
+ <br />
+ mailing list subscription
+ <a href="http://lists.sisudoc.org/listinfo/sisu" >
+ http://lists.sisudoc.org/listinfo/sisu
+ </a>
+ <br />
+ <a href="mailto:sisu@lists.sisudoc.org" >
+ sisu@lists.sisudoc.org
+ </a>
+ </font></p>
+</td><td valign="top" width="45%">
+ <p class="tiny_left"><font color="#666666" size="2">
+ #{v[:project]} using:
+ <br />Standard SiSU markup syntax,
+ <br />Standard SiSU meta-markup syntax, and the
+ <br />Standard SiSU <u>object citation numbering</u> and system, (object/text identifying/locating system)
+ <br />
+ <sup>&copy;</sup> Ralph Amissah 1997, current 2014.
+ All Rights Reserved.
+ </font></p>
+</td></tr>
+ <!-- widget way better -->
+<tr><td valign="top" width="10%">
+ <p class="tiny_left"><font color="#666666" size="2">
+ <a href="http://www.gnu.org/licenses/gpl.html">
+ .:
+ </a>
+ </font></p>
+</td><td valign="top" width="45%">
+ <p class="tiny_left"><font color="#666666" size="2">
+ SiSU is released under
+ <a href="http://www.gnu.org/licenses/gpl.html">GPL&nbsp;v3</a>
+ or later,
+ <a href="http://www.gnu.org/licenses/gpl.html">
+ http://www.gnu.org/licenses/gpl.html
+ </a>
+ </font></p>
+</td><td valign="top" width="45%">
+ <p class="tiny_left"><font color="#666666" size="2">
+ #{v[:project]}, developed using
+ <a href="http://www.ruby-lang.org/en/">
+ Ruby
+ </a>
+ on
+ <a href="http://www.debian.org/">
+ Debian/Gnu/Linux
+ </a>
+ software infrastructure,
+ with the usual GPL (or OSS) suspects.
+ </font></p>
+</td></tr>
+</table>
+ <a name="bottom" id="bottom"></a><a name="down" id="down"></a><a name="end" id="end"></a><a name="finish" id="finish"></a><a name="stop" id="stop"></a><a name="credits" id="credits"></a>
+ </body></html>
+ WOK
+ end
+ WOK_SQL
+ end
+ def main1
+ <<-'WOK_SQL'
+ @tail=tail
+ @counter_txt_doc,@counter_txt_ocn,@counter_endn_doc,@counter_endn_ocn=0,0,0,0
+ @counters_txt,@counters_endn,@sql_select_body,@sql_select_endnotes='','','',''
+ FCGI.each_cgi do |cgi|
+ begin # all code goes in begin section
+ @search={ text: [], endnotes: [] }
+ q=CGI.new
+ @db=if cgi['db'] =~ /#{@db_name_prefix}(\S+)/
+ @stub=$1
+ cgi['db']
+ else
+ @stub=@stub_default
+ @db_name_prefix + @stub
+ end
+ checked_url,checked_stats,checked_searched,checked_tip,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,selected_db='','','','','','','','',''
+ result_type=(cgi['view']=~/text/) \
+ ? result_type={ index: '', text: 'checked'}
+ : result_type={ index: 'checked', text: ''}
+ @@limit=if cgi['sql_match_limit'].to_s=~/2500/
+ checked_sql_limit={ l1000: '', l2500: 'checked'}
+ '2500'
+ else
+ checked_sql_limit={ l1000: 'checked', l2500: ''}
+ '1000'
+ end
+ checked_echo='checked' if cgi['echo'] =~/\S/
+ checked_stats='checked' if cgi['stats'] =~/\S/
+ checked_url='checked' if cgi['url'] =~/\S/ or cgi['u'].to_i==1
+ checked_searched='checked' if cgi['searched'] =~/\S/
+ checked_tip='checked' if cgi['tip'] =~/\S/
+ checked_case='checked' if cgi['casesense'] =~/\S/
+ checked_sql='checked' if cgi['sql'] =~/\S/
+ if cgi['checks'] =~/check_all/ or cgi['check_all'] =~/\S/ or cgi['a'].to_i==1
+ checked_all='checked'
+ checked_echo=checked_stats=checked_url=checked_searched=checked_tip=checked_sql='checked'
+ checked_none=''
+ elsif cgi['checks'] =~/check_none/
+ checked_none='checked'
+ checked_all=checked_url=checked_stats=checked_searched=checked_tip=checked_echo=checked_sql=''
+ elsif cgi['checks'] =~/check_selected/
+ checked_selected='checked'
+ elsif cgi['checks'] =~/check_default/
+ checked_default='checked'
+ checked_echo=checked_stats=checked_url='checked'
+ checked_searched=checked_tip=checked_case=checked_sql=''
+ else
+ checked_selected='checked'
+ checked_echo=checked_stats=checked_url='checked'
+ checked_searched=checked_tip=checked_case=checked_sql=''
+ end
+ WOK_SQL
+ end
+ def main2
+ <<-'WOK_SQL'
+ search_field=cgi['find'] if cgi['find'] # =~/\S+/
+ @search_for=SearchRequest.new(search_field,q) #.analyze #% search_for
+ #% searches
+ #Canned_search.new(@base,@search_for.text1,cgi)
+ if @search_for.text1=~/\S+/ or @search_for.fulltext=~/\S+/ or @search_for.author=~/\S+/ or @search_for.topic_register=~/\S+/ #and search_field =~/\S/
+ s1='s1=' + CGI.escape(@search_for.text1) if @search_for.text1=~/\S/
+ ft='&ft=' + CGI.escape(@search_for.fulltext) if @search_for.fulltext=~/\S/
+ key='key=' + CGI.escape(@search_for.keywords) if @search_for.keywords=~/\S/
+ ti='&ti=' + CGI.escape(@search_for.title) if @search_for.title=~/\S/
+ au='&au=' + CGI.escape(@search_for.author) if @search_for.author=~/\S/
+ tr='&tr=' + CGI.escape(@search_for.topic_register) if @search_for.topic_register=~/\S/
+ sj='&sj=' + CGI.escape(@search_for.subject) if @search_for.subject=~/\S/
+ dsc='&dsc=' + CGI.escape(@search_for.description) if @search_for.description=~/\S/
+ pb='&pb=' + CGI.escape(@search_for.publisher) if @search_for.publisher=~/\S/
+ edt='&edt=' + CGI.escape(@search_for.editor) if @search_for.editor=~/\S/
+ cntr='&cntr=' + CGI.escape(@search_for.contributor) if @search_for.contributor=~/\S/
+ dt='&dt=' + CGI.escape(@search_for.date) if @search_for.date=~/\S/
+ ty='&ty=' + CGI.escape(@search_for.type) if @search_for.type=~/\S/
+ id='&id=' + CGI.escape(@search_for.identifier) if @search_for.identifier=~/\S/
+ src='&src=' + CGI.escape(@search_for.source) if @search_for.source=~/\S/
+ lang='&lang=' + CGI.escape(@search_for.language) if @search_for.language=~/\S/
+ rel='&rel=' + CGI.escape(@search_for.relation) if @search_for.relation=~/\S/
+ cov='&cov=' + CGI.escape(@search_for.coverage) if @search_for.coverage=~/\S/
+ cr='&cr=' + CGI.escape(@search_for.rights) if @search_for.rights=~/\S/
+ co='&co=' + CGI.escape(@search_for.comment) if @search_for.comment=~/\S/
+ ab='&ab=' + CGI.escape(@search_for.abstract) if @search_for.abstract=~/\S/
+ dtc='&dtc=' + CGI.escape(@search_for.date_created) if @search_for.date_created=~/\S/
+ dti='&dti=' + CGI.escape(@search_for.date_issued) if @search_for.date_issued=~/\S/
+ dtm='&dtm=' + CGI.escape(@search_for.date_modified) if @search_for.date_modified=~/\S/
+ dta='&dta=' + CGI.escape(@search_for.date_available) if @search_for.date_available=~/\S/
+ dtv='&dtv=' + CGI.escape(@search_for.date_valid) if @search_for.date_valid=~/\S/
+ fns='&fns=' + CGI.escape(@search_for.filename) if @search_for.filename=~/\S/
+ @@canned_search_url=(checked_all =~/checked/) \
+ ? "#{@base}?#{s1}#{ft}#{key}#{ti}#{au}#{tr}#{sj}#{dsc}#{pb}#{edt}#{cntr}#{dt}#{ty}#{id}#{src}#{lang}#{rel}#{cov}#{cr}#{co}#{ab}#{dtc}#{dti}#{dtm}#{dta}#{dtv}#{fns}&db=#{cgi['db']}&view=#{cgi['view']}&a=1"
+ : "#{@base}?#{s1}#{ft}#{key}#{ti}#{au}#{tr}#{sj}#{dsc}#{pb}#{edt}#{cntr}#{dt}#{ty}#{id}#{src}#{lang}#{rel}#{cov}#{cr}#{co}#{ab}#{dtc}#{dti}#{dtm}#{dta}#{dtv}#{fns}&db=#{cgi['db']}&view=#{cgi['view']}"
+ mod=ft=~/\S+/ ? (ft.gsub(/ft/,'s1')) : s1
+ @canned_base_url="#{@base}?#{mod}&db=#{cgi['db']}"
+ if checked_case=~/\S/
+ @search[:text][1]=%{doc_objects.clean~'#{@search_for.text1}'} #s1
+ @search[:endnotes][1]=%{endnotes.clean~'#{@search_for.text1}'} #s1
+ else
+ @search[:text][1]=%{doc_objects.clean~*'#{@search_for.text1}'} #s1
+ @search[:endnotes][1]=%{endnotes.clean~*'#{@search_for.text1}'} #s1
+ end
+ canned_note='search url:'
+ else
+ @@canned_search_url="#{@base}?db=#{@db}&view=index"
+ canned_note='search url example:'
+ end
+ if search_field =~/\S+/
+ analyze_format=search_field.gsub(/\s*\n/,'; ')
+ elsif checked_all =~/checked/ or checked_url =~/checked/
+ canned_search=@@canned_search_url.scan(/(?:s1|ft|au|ti|fns|tr)=[^&]+/)
+ af=canned_search.join('; ')
+ af=af.gsub(/s1=/,'text: ').
+ gsub(/ft=/,'fulltxt: ').
+ gsub(/au=/,'author: ').
+ gsub(/ti=/,'title: ').
+ gsub(/fns=/,'filename: ').
+ gsub(/tr=/,'topic_register: ').
+ gsub(/%2B/,' ')
+ analyze_format=af
+ st=af.split(/\s*;\s*/)
+ search_field=st.join("\n")
+ end
+ green=%{<font size="2" color="#004000">}
+ canned_search_url_txt=CGI.escapeHTML(@@canned_search_url)
+ the_can=%{<font size="2" color="#666666">#{canned_note} <a href="#{@@canned_search_url}">#{canned_search_url_txt}</a></font><br />}
+ p_text=p_fulltext=p_keywords=p_title=p_author=p_topic_register=p_subject=p_description=p_publisher=p_editor=p_contributor=p_date=p_type=p_format=p_identifier=p_source=p_language=p_relation=p_coverage=p_rights=p_comment=p_abstract=p_filename=''
+ p_filename=%{filename: #{green}#{@search_for.filename}</font><br />} if @search_for.filename =~/\S+/
+ p_text=%{text: #{green}#{@search_for.text1}</font><br />} if @search_for.text1 =~/\S+/
+ p_fulltext=%{fulltxt: #{green}#{@search_for.fulltext}</font><br />} if @search_for.fulltext =~/\S+/
+ p_title=%{title: #{green}#{@search_for.title}</font><br />} if @search_for.title =~/\S+/
+ p_author=%{author: #{green}#{@search_for.author}</font><br />} if @search_for.author =~/\S+/
+ p_editor=%{editor: #{green}#{@search_for.editor}</font><br />} if @search_for.editor=~/\S+/
+ p_contributor=%{contributor: #{green}#{@search_for.contributor}</font><br />} if @search_for.contributor =~/\S+/
+ p_date=%{date: #{green}#{@search_for.date}</font><br />} if @search_for.date =~/\S+/
+ p_rights=%{rights: #{green}#{@search_for.rights}</font><br />} if @search_for.rights =~/\S+/
+ p_topic_register=%{topic_register: #{green}#{@search_for.topic_register}</font><br />} if @search_for.topic_register =~/\S+/
+ p_subject=%{subject: #{green}#{@search_for.subject}</font><br />} if @search_for.subject =~/\S+/
+ p_keywords=%{keywords: #{green}#{@search_for.keywords}</font><br />} if @search_for.keywords =~/\S+/
+ p_identifier=%{identifier: #{green}#{@search_for.identifier}</font><br />} if @search_for.identifier =~/\S+/
+ p_type=%{type: #{green}#{@search_for.type}</font><br />} if @search_for.type =~/\S+/
+ p_format=%{format: #{green}#{@search_for.format}</font><br />} if @search_for.format =~/\S+/
+ p_relation=%{relation: #{green}#{@search_for.relation}</font><br />} if @search_for.relation =~/\S+/
+ p_coverage=%{coverage: #{green}#{@search_for.coverage}</font><br />} if @search_for.coverage =~/\S+/
+ p_description=%{description: #{green}#{@search_for.description}</font><br />} if @search_for.description =~/\S+/
+ p_abstract=%{abstract: #{green}#{@search_for.abstract}</font><br />} if @search_for.abstract =~/\S+/
+ p_comment=%{comment: #{green}#{@search_for.comment}</font><br />} if @search_for.comment =~/\S+/
+ p_publisher=%{publisher: #{green}#{@search_for.publisher}</font><br />} if @search_for.publisher =~/\S+/
+ p_source=%{source: #{green}#{@search_for.source}</font><br />} if @search_for.source =~/\S+/
+ p_language=%{language: #{green}#{@search_for.language}</font><br />} if @search_for.language =~/\S+/
+ search_note=<<-WOK
+ <font size="2" color="#666666">
+ <b>database:</b> #{green}#{@db}</font>; <b>selected view:</b> #{green}#{cgi['view']}</font>
+ <b>search string:</b> "#{green}#{analyze_format}</font>"<br />
+ #{p_text} #{p_fulltext} #{p_keywords} #{p_title} #{p_author} #{p_topic_register} #{p_subject} #{p_description} #{p_publisher} #{p_editor} #{p_contributor} #{p_date} #{p_type} #{p_format} #{p_identifier} #{p_source} #{p_language} #{p_relation} #{p_coverage} #{p_rights} #{p_comment} #{p_abstract} #{p_filename}
+ </font>
+ WOK
+ #eg = %{canned search e.g.:<br /> <a href="#{url}">#{url}</a><br />find: #{analyze}<br />database: #{database}}
+ #% dbi_canning
+ @header=Form.new(@base,search_field,selected_db,result_type,checked_sql_limit,checked_tip,checked_stats,checked_searched,checked_url,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,search_note,the_can).submission_form #% form
+ unless q['s1'] =~/\S/ or q['au'] =~/\S/ or @search[:text][1] =~/\S/
+ print "Content-type: text/html\n\n"
+ puts (@header+@tail)
+ else #% searches
+ s1=(@search_for.text1 =~/\S/) \
+ ? @search_for.text1
+ : 'Unavailable'
+ if checked_case=~/\S/
+ @search[:text]<<%{doc_objects.clean~'#{CGI.unescape(s1)}'}
+ @search[:endnotes]<<%{endnotes.clean~'#{CGI.unescape(s1)}'}
+ else
+ @search[:text]<<%{doc_objects.clean~*'#{CGI.unescape(s1)}'}
+ @search[:endnotes]<<%{endnotes.clean~*'#{CGI.unescape(s1)}'}
+ end
+ #% dbi_request
+ dbi_statement=DBI_SearchStatement.new(@conn,@search_for,q,checked_case)
+ @text_search_flag=false
+ @text_search_flag=dbi_statement.text_search_flag
+ s_contents=dbi_statement.contents
+ s_endnotes=dbi_statement.endnotes
+ @body_main,@endnotes='',''
+ @search_regx=nil
+ oldtid=0
+ if @text_search_flag
+ if checked_sql =~/\S/
+ sql_select_body=dbi_statement.sql_select_body_format
+ sql_select_endnotes=dbi_statement.sql_select_endnotes_format
+ else sql_select_body,sql_select_endnotes='',''
+ end
+ @body_main << '<p><hr><br /><b>Main Text:</b><br />' << sql_select_body
+ @endnotes << '<p><hr><br /><b>Endnotes:</b><br />' << sql_select_endnotes
+ else
+ end
+ @hostpath="#{@hosturl_files}/#{@stub}"
+ WOK_SQL
+ end
+ def dir_structure #@opt.dir_structure_by
+ <<-'WOK_SQL'
+ def path_manifest(fn,ln=nil)
+ case @output_dir_structure_by
+ when 'filename'
+ @lingual =='mono' \
+ ? "#{@hostpath}/#{fn}/sisu_manifest.html"
+ : "#{@hostpath}/#{fn}/sisu_manifest.#{ln}.html"
+ when 'filetype'
+ @lingual =='mono' \
+ ? "#{@hostpath}/manifest/#{fn}.html"
+ : "#{@hostpath}/manifest/#{fn}.#{ln}.html"
+ else
+ "#{@hostpath}/#{ln}/manifest/#{fn}.html"
+ end
+ end
+ def path_html_seg(fn,ln=nil)
+ case @output_dir_structure_by
+ when 'filename'
+ "#{@hostpath}/#{fn}"
+ when 'filetype'
+ "#{@hostpath}/html/#{fn}"
+ else
+ "#{@hostpath}/#{ln}/html/#{fn}"
+ end
+ end
+ def path_toc(fn,ln=nil)
+ if @output_dir_structure_by =='filename' \
+ or @output_dir_structure_by =='filetype'
+ @lingual =='mono' \
+ ? "#{path_html_seg(fn,ln)}/toc.html"
+ : "#{path_html_seg(fn,ln)}/toc.#{ln}.html"
+ else
+ "#{path_html_seg(fn,ln)}/toc.html"
+ end
+ end
+ def path_filename(fn,seg,ln=nil)
+ if @output_dir_structure_by =='filename' \
+ or @output_dir_structure_by =='filetype'
+ @lingual =='mono' \
+ ? "#{path_html_seg(fn,ln)}/#{seg}.html"
+ : "#{path_html_seg(fn,ln)}/#{seg}.#{ln}.html"
+ else
+ "#{path_html_seg(fn,ln)}/#{seg}.html"
+ end
+ end
+ def path_endnotes(fn,ln=nil)
+ if @output_dir_structure_by =='filename' \
+ or @output_dir_structure_by =='filetype'
+ @lingual =='mono' \
+ ? "#{path_html_seg(fn,ln)}/endnotes.html"
+ : "#{path_html_seg(fn,ln)}/endnotes.#{ln}.html"
+ else
+ "#{path_html_seg(fn,ln)}/endnotes.html"
+ end
+ end
+ def path_html_doc(fn,ln=nil)
+ case @output_dir_structure_by
+ when 'filename'
+ @lingual =='mono' \
+ ? "#{path_html_seg(fn,ln)}/scroll.html"
+ : "#{path_html_seg(fn,ln)}/scroll.#{ln}.html"
+ when 'filetype'
+ @lingual =='mono' \
+ ? "#{@hostpath}/html/#{fn}.html"
+ : "#{@hostpath}/html/#{fn}.#{ln}.html"
+ else
+ "#{@hostpath}/#{ln}/html/#{fn}.html"
+ end
+ end
+ WOK_SQL
+ end
+ def main3
+ <<-'WOK_SQL'
+ #% text_objects_body
+ s_contents.each do |c| #% text body
+ location=c['src_filename'][/(.+?)\.(?:ssm\.sst|sst)$/,1]
+ file_suffix=c['src_filename'][/.+?\.(ssm\.sst|sst)$/,1]
+ lang=if location =~ /\S+?~(\S\S\S?)$/
+ l=location[/\S+?~(\S\S\S?)$/,1]
+ location=location.gsub(/(\S+?)~\S\S\S?/,'\1')
+ l=".#{l}"
+ else ''
+ end
+ #% metadata_found_body
+ if c['tid'].to_i != oldtid.to_i
+ ti=c['title']
+ can_txt_srch=(cgi['view']=~/index/) \
+ ? %{<a href="#{@canned_base_url}&fns=#{c['src_filename']}&lang=#{c['language_document_char']}&view=text"><img border="0" width="24" height="16" src="#{@image_src}/b_search.png" alt="search"></a>&nbsp;}
+ : %{<a href="#{@canned_base_url}&fns=#{c['src_filename']}&lang=#{c['language_document_char']}&view=index"><img border="0" width="24" height="16" src="#{@image_src}/b_search.png" alt="search"></a>&nbsp;}
+ title=%{<span style="background-color: #{@color_heading}"><a href="#{path_toc(location,c['language_document_char'])}"><img border="0" width="15" height="18" src="#{@image_src}/b_toc.png" alt="toc html">&nbsp;#{ti}</a></span> [#{c['language_document_char']}] by #{c['creator_author']} <a href="#{path_manifest(location,c['language_document_char'])}"><img border="0" width="15" height="15" src="#{@image_src}/b_info.png" alt="manifest"></a> #{can_txt_srch}<br />} if file_suffix=~/s/ #hmm watch file_suffix
+ title=@text_search_flag \
+ ? '<br /><hr>'+title
+ : '<br />'+title
+ @counter_txt_doc+=1
+ oldtid=c['tid'].to_i
+ else title=''
+ end
+ if @text_search_flag
+ if cgi['view']=~/text/ \
+ or (cgi['view']!~/index/ and cgi['search'] !~/search db/) #% txt body
+ text=if c['suffix'] !~/1/ #seg
+ if @search_for.text1 =~/\S+/ \
+ or q['s1'] =~/\S+/ #% only this branch is working !!
+ unescaped_search=if @search_for.text1 =~/\S+/
+ CGI.unescape(@search_for.text1)
+ elsif q['s1'] =~/\S+/
+ CGI.unescape(q['s1'])
+ else nil
+ end
+ @search_regx=if unescaped_search #check
+ search_regex=[]
+ build=unescaped_search.scan(/\S+/).each do |g|
+ (g.to_s =~/(AND|OR)/) \
+ ? (search_regex << '|')
+ : (search_regex << %{#{g.to_s}})
+ end
+ search_regex=search_regex.join(' ')
+ search_regex=search_regex.gsub(/\s*\|\s*/,'|')
+ Regexp.new(search_regex, Regexp::IGNORECASE)
+ else nil
+ end
+ else nil
+ end
+ matched_para=(@search_regx.to_s.class==String && @search_regx.to_s=~/\S\S+/) \
+ ? (c['body'].gsub(/(<a\s+href="https?:\/\/[^><\s]+#{@search_regx}[^>]+?>|#{@search_regx})/mi,%{<span style="background-color: #{@color_match}">\\1</span>}))
+ : c['body']
+ %{<hr><p><font size="2">ocn <b><a href="#{path_filename(location,c['seg'],c['language_document_char'])}##{c['ocn']}">#{c['ocn']}</a></b>:</font></p>#{matched_para}}
+ elsif c['suffix'] =~/1/ #doc
+ %{#{title}<hr><p><font size="2">ocn #{c['ocn']}:#{c['body']}}
+ end
+ @counter_txt_ocn+=1
+ output=title+text
+ else #elsif cgi['view']=~/index/ #% idx body
+ if c['suffix'] !~/1/ #seg
+ index=%{<a href="#{path_filename(location,c['seg'],c['language_document_char'])}##{c['ocn']}">#{c['ocn']}</a>, } if @text_search_flag
+ elsif c['suffix'] =~/1/ #doc #FIX
+ index=%{<a href="#{path_html_doc(location,c['language_document_char'])}##{c['ocn']}">#{c['ocn']}</a>, }
+ end
+ if c['seg'] =~/\S+/
+ if @text_search_flag
+ @counter_txt_ocn+=1
+ output=title+index
+ end
+ else
+ @counter_txt_ocn+=1
+ output=c['suffix'] !~/1/ \
+ ? title+index
+ : %{#{title}#{c['ocn'].sort}, }
+ end
+ end
+ else output=title
+ end
+ @counters_txt=if @counter_txt_doc > 0
+ if checked_stats =~/\S/
+ @@lt_t=(@counter_txt_ocn==dbi_statement.sql_match_limit.to_i) ? true : false
+ start=(@@offset.to_i+1).to_s
+ range=(@@offset.to_i+@counter_txt_ocn.to_i).to_s
+ %{<hr /><font size="2" color="#666666">Found #{@counter_txt_ocn} times in the main body of #{@counter_txt_doc} documents [ matches #{start} to #{range} ]</font><br />}
+ else ''
+ end
+ else ''
+ end
+ @body_main << output #+ details
+ end
+ #text_objects_endnote
+ oldtid = 0
+ s_endnotes.each do |e| #% endnotes
+ location=e['src_filename'][/(.+?)\.(?:ssm\.sst|sst)$/,1]
+ file_suffix=e['src_filename'][/.+?\.(ssm\.sst|sst)$/,1]
+ lang=if location =~ /\S+?~(\S\S\S?)$/
+ l=location[/\S+?~(\S\S\S?)$/,1]
+ location=location.gsub(/(\S+?)~\S\S\S?/,'\1')
+ l=".#{l}"
+ else ''
+ end
+ #metadata_found_endnotes
+ if @text_search_flag
+ if e['metadata_tid'].to_i != oldtid.to_i
+ ti=e['title']
+ can_txt_srch=(cgi['view']=~/index/) \
+ ? %{<a href="#{@canned_base_url}&fns=#{e['src_filename']}&lang=#{e['language_document_char']}&view=text"><img border="0" width="24" height="16" src="#{@image_src}/b_search.png" alt="search"></a>&nbsp;}
+ : %{<a href="#{@canned_base_url}&fns=#{e['src_filename']}&lang=#{e['language_document_char']}&view=index"><img border="0" width="24" height="16" src="#{@image_src}/b_search.png" alt="search"></a>&nbsp;}
+ title=%{<br /><hr><span style="background-color: #{@color_heading}"><a href="#{path_toc(location,e['language_document_char'])}"><img border="0" width="15" height="18" src="#{@image_src}/b_toc.png" alt="toc html">&nbsp;#{ti}</a></span> [#{e['language_document_char']}] by #{e['creator_author']} #{can_txt_srch}<a href="#{path_toc(location,e['language_document_char'])}"><img border="0" width="15" height="18" src="#{@image_src}/b_toc.png" alt="toc html"></a>&nbsp;<a href="#{path_manifest(location,e['language_document_char'])}"><img border="0" width="15" height="15" src="#{@image_src}/b_info.png" alt="manifest"></a><br />} if file_suffix=~/s/
+ @counter_endn_doc+=1
+ oldtid=e['metadata_tid'].to_i
+ else title = ''
+ end
+ if cgi['view']=~/text/ \
+ or (cgi['view']!~/index/ and cgi['search'] !~/search db/) #% txt endnotes
+ @counter_endn_ocn+=1
+ matched_endnote=(@search_regx.to_s.is_a?(String) \
+ && @search_regx.to_s=~/\S\S+/) \
+ ? (matched=e['body'].gsub(/(<a\s+href="https?:\/\/[^><\s]+#{@search_regx}[^>]+?>|#{@search_regx})/mi,%{<span style="background-color: #{@color_match}">\\1</span>}))
+ : e['body']
+ output=%{#{title}<hr><font size="2">note <b><a href="#{path_endnotes(location,e['language_document_char'])}#_#{e['nr']}">#{e['nr']}</a></b> referred to from ocn <a href="#{path_html_doc(location,e['language_document_char'])}##{e['ocn']}">#{e['ocn']}</a>:</font> #{matched_endnote}}
+ else #elsif cgi['view']=~/index/ #doc #FIX #% idx endnotes
+ @counter_endn_ocn+=1
+ output=%{#{title}<a href="#{path_endnotes(location,e['language_document_char'])}#_#{e['nr']}">#{e['nr']}</a> [&sect; <a href="#{path_html_doc(location,e['language_document_char'])}##{e['ocn']}">#{e['ocn']}</a>], }
+ end
+ @counters_endn=if @counter_endn_doc > 0
+ if checked_stats =~/\S/
+ @@lt_e=@counter_endn_ocn==dbi_statement.sql_match_limit.to_i \
+ ? true
+ : false
+ start=(@@offset.to_i+1).to_s
+ range=(@@offset.to_i+@counter_endn_ocn.to_i).to_s
+ %{<font size="2" color="#666666">Found #{@counter_endn_ocn} times in the endnotes of #{@counter_endn_doc} documents [ matches #{start} to #{range} ]</font><br />}
+ else ''
+ end
+ end
+ @endnotes << output #+ details
+ else @endnotes='' #does not take out yet
+ end
+ end
+ offset=dbi_statement.sql_offset.to_s
+ limit=dbi_statement.sql_match_limit.to_s
+ @@lt_t ||=false; @@lt_e ||=false
+ canned=(@@lt_t or @@lt_e) \
+ ? dbi_statement.pre_next(true,@image_src).to_s
+ : dbi_statement.pre_next(false,@image_src).to_s
+ limit=dbi_statement.sql_match_limit.to_s
+ cgi.out{@header.force_encoding("UTF-8") + @counters_txt.force_encoding("UTF-8") + @counters_endn.force_encoding("UTF-8") + canned.force_encoding("UTF-8") + @body_main.force_encoding("UTF-8") + @endnotes.force_encoding("UTF-8") + canned.force_encoding("UTF-8") + @tail.force_encoding("UTF-8")} #% print cgi_output_header+counters+body+endnotes
+ end
+ rescue Exception => e
+ s='<pre>' + CGI::escapeHTML(e.backtrace.reverse.join("\n"))
+ s << CGI::escapeHTML(e.message) + '</pre>'
+ cgi.out{s}
+ next
+ ensure # eg. disconnect from server
+ @conn.disconnect if @conn
+ end
+ end
+ WOK_SQL
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/cgi_sqlite.rb b/lib/sisu/v6/cgi_sqlite.rb
new file mode 100644
index 0000000..fff0f98
--- /dev/null
+++ b/lib/sisu/v6/cgi_sqlite.rb
@@ -0,0 +1,258 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/cgi_sql_sqlite.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: generates naive cgi search form for search of sisu database (sqlite)
+
+=end
+module SiSU_CGI_SQLite #% database building documents
+ require_relative 'sysenv' # sysenv.rb
+ require_relative 'cgi_sql_common' # cgi_sql_common.rb
+ include SiSU_CGI_SQL
+ class SearchSQLite < CGI_Common
+ def initialize(opt,webserv)
+ @opt,@webserv=opt,webserv
+ @cX=SiSU_Screen::Ansi.new(opt.act[:color_state][:set]).cX
+ @env=SiSU_Env::InfoEnv.new('',opt)
+ @image_src="#{@env.url.webserv_cgi(@opt)}/_sisu/image_sys"
+ @name_of={}
+ @name_of[:output_dir_structure]=if @opt.dir_structure_by.to_s =~/(?:language|filetype|filename)/
+ @opt.dir_structure_by.to_s
+ else 'language'
+ end
+ @name_of[:lingual]=if @opt.lingual.to_s =~/(?:mono|multi)/
+ @opt.lingual.to_s
+ else 'multi'
+ end
+ @common=SiSU_CGI_SQL::CGI_Common.new(@webserv,@opt,@image_src,@env)
+ @cgi_file_name=@env.url.cgi_sample_search_form_name(@opt)
+ @name_of_sqlite_db_file='sisu_sqlite.db'
+ end
+ def sqlite
+ serve=[]
+ Dir.foreach(@env.path.webserv) do |x|
+ if x !~/^\./ \
+ and FileTest.directory?("#{@env.path.webserv}/#{x}")
+ if FileTest.file?("#{@env.path.webserv}/#{x}/#{@name_of_sqlite_db_file}")
+ serve << x unless x =~/^_\S+/
+ end
+ end
+ end
+ serve=serve.sort
+ f1,f2,f3='','',''
+ serve.each do |x|
+ f1 << %{ <option value="#{Db[:name_prefix]}#{x}">#{x}</option>\n}
+ end
+ f2 << %{ selected_db=case cgi['db']\n}
+ serve.each do |x|
+ f2 << %{ when /#{Db[:name_prefix]}#{x}/ then '<option value="#{Db[:name_prefix]}#{x}">#{x}</option>'\n}
+ end
+ f2 << " end\n"
+ f3 << %{ db_name='#{@name_of_sqlite_db_file}'\n}
+ f3 << %{ db_sqlite=case cgi['db']\n}
+ serve.each do |x|
+ f3 << %{ when /#{Db[:name_prefix]}#{x}/ then "#{@env.path.webserv}/#{x}/\#{db_name}"\n}
+ end
+ f3 << %{ else '#{@env.path.webserv}/#{serve[0]}/\#{db_name}'\n end\n}
+ if FileTest.writable?('.')
+ output=File.open(@cgi_file_name,'w')
+ output << header0 << header1 << header_desc << header2 << f1 << buttons1 << buttons2 << search_request << search_statement << search_statement_common << search_query1 << @common.pages << search_query2 << @common.tail << @common.main1 << f2 << f3 << dbi_connect << @common.main2 << @common.dir_structure << @common.main3
+ puts <<-WOK
+ generated sample search form: #{@cX.green}#{@cgi_file_name}#{@cX.off}
+ default database name: #{@cX.green}#{Db[:name_prefix]}#{@env.path.stub_pwd}#{@cX.off} (#{@env.path.stub_pwd})
+ cgi & db host on: #{@cX.blue}#{@env.url.webserv_base_cgi(@opt)}#{@cX.off}
+ to modify use: #{@cX.brown}sisu --db-sqlite --webserv-search='#{@env.url.webserv_base_cgi(@opt)}'#{@cX.off}
+ sisu output on: #{@cX.blue}#{@env.url.webserv_files_from_db(@opt)}#{@cX.off}
+ to modify use: #{@cX.brown}sisu --db-sqlite --webserv-output='#{@env.url.webserv_files_from_db(@opt)}'#{@cX.off}
+ cgi search form link name: #{@cX.green}#{@env.url.cgi_sample_search_form_name(@opt)}#{@cX.off}
+ to modify use: #{@cX.brown}sisu --db-sqlite --cgi-search-form-name='#{@env.url.cgi_sample_search_form_name(@opt)}'#{@cX.off}
+ #{@cX.fuchsia}(settings priority: command line; sisurc.yml; else defaults)#{@cX.off}
+
+ #{@cX.fuchsia}NOTE it is first necessary to create the database and tables and populate it#{@cX.off}
+
+ sisu --sqlite --dropall # removes existing postgresql db & tables
+ sisu --sqlite --createall -v # creates postgresql db & tables
+ sisu --sqlite --update -v *.sst *.ssm # populate the db
+ sisu --sample-search-form --sqlite # creates the postgresql search form
+ # this should be done after creating the db
+ # to be searched
+ sisu --webrick & # starts ruby webrick web server
+
+ # if necessary make the directory '/usr/lib/cgi-bin'
+ # here we copy the postgresql search form to cgi-bin
+ # (copy #{@cgi_file_name} to your cgi directory)
+ # set file permissions to 755
+ WOK
+ a=case @webserv
+ when /pwd/ then ''
+ else <<-WOK
+
+ sudo cp -vi #{Dir.pwd}/#{@cgi_file_name} /usr/lib/cgi-bin/.; \\
+ sudo chmod -v 755 /usr/lib/cgi-bin/#{@cgi_file_name}
+ WOK
+ end
+ b='(to create and populate sisu sqlite database see "man sisu" and in particular the -d flag)'
+ SiSU_Screen::Ansi.new(opt.act[:color_state][:set],a,b).warn
+ a=<<-WOK
+
+ #{@env.webserv_base_cgi(@opt)}/cgi-bin/#{@cgi_file_name}
+
+ WOK
+ SiSU_Screen::Ansi.new(opt.act[:color_state][:set],a).print_blue
+ else puts "failed in attempt to write #{@cgi_file_name} to present directory, is directory writable?"
+ end
+ end
+ def header0
+ <<-WOK_SQL
+#!/usr/bin/env ruby
+=begin
+#{about}
+ * Description: generates naive cgi search form for search of sisu database (sqlite)
+#{gpl}
+=end
+ require 'cgi'
+ require 'fcgi'
+ require 'dbi'
+ @stub_default='sisu_sqlite'
+ @image_src='#{@image_src}'
+ @hosturl_cgi='#{@env.url.webserv_base_cgi(@opt)}/cgi-bin'
+ @hosturl_files='#{@env.url.webserv_files_from_db(@opt)}'
+ @output_dir_structure_by='#{@name_of[:output_dir_structure]}'
+ @lingual='#{@name_of[:lingual]}'
+ @db_name_prefix='#{Db[:name_prefix]}'
+ @base='#{@env.url.webserv_base_cgi(@opt)}/cgi-bin/#{@env.url.cgi_sample_search_form_name(@opt)}' #fix sqlite
+ WOK_SQL
+ end
+ def search_statement
+ <<-'WOK_SQL'
+ class DBI_SearchString
+ def initialize(l,t,q,cse=false)
+ @l,@t,@q=l,t,q
+ end
+ def string
+ search={ search: [], flag: false }
+ if @t =~/\S+/ or @q =~/\S+/
+ if @t =~/\S+/ then unescaped_search=CGI.unescape(@t)
+ elsif @q =~/\S+/ then unescaped_search=CGI.unescape(@q)
+ end
+ search_construct=[]
+ unescaped_search=unescaped_search.gsub(/\s*(AND|OR)\s*/,"%' \) \\1 #{@l} LIKE \( '%").
+ gsub(/(.+)/,"#{@l} LIKE \( '%\\1%' \)")
+ search_construct << unescaped_search
+ search_construct=search_construct.join(' ')
+ search[:search] << search_construct
+ search[:flag]=true
+ search
+ end
+ search
+ end
+ end
+ WOK_SQL
+ end
+ def search_query1
+ <<-'WOK_SQL'
+ @search_text,@search_endnotes='',''
+ @search_text=search[:text].flatten.join(' AND ')
+ @search_text=@search_text.gsub(/(doc_objects\.clean\s+LIKE\s+\(\s*'%[^']+%'\s*\)\s+(?:(?:AND|OR)\s+doc_objects\.clean\s+LIKE\s+\(\s*'%[^']+%'\s*\))+)/,'(\1)')
+ @search_endnotes=search[:endnotes].flatten.join(' AND ')
+ @search_endnotes=@search_endnotes.gsub(/(endnotes\.clean\s+LIKE\s+\(\s*'%[^']+%'\s*\)\s+(?:(?:AND|OR)\s+endnotes\.clean\s+LIKE\s+\(\s*'%[^']+%'\s*\))+)/,'(\1)')
+ end
+ WOK_SQL
+ end
+ def search_query2
+ <<-'WOK_SQL'
+ def sql_select_body
+ limit ||=@@limit
+ offset ||=@@offset
+ @sql_statement[:body]=%{SELECT metadata_and_text.title, metadata_and_text.creator_author, metadata_and_text.src_filename, metadata_and_text.language_document_char, metadata_and_text.notes_suffix, doc_objects.body, doc_objects.seg, doc_objects.ocn, metadata_and_text.tid FROM doc_objects, metadata_and_text WHERE #{@search_text} AND doc_objects.metadata_tid = metadata_and_text.tid ORDER BY metadata_and_text.language_document_char, metadata_and_text.title, metadata_and_text.src_filename, doc_objects.ocn}
+ @sql_statement[:range]=%{LIMIT #{limit} OFFSET #{offset} ;}
+ select=@sql_statement[:body] + ' ' + @sql_statement[:range]
+ select
+ end
+ def sql_select_endnotes
+ limit ||=@@limit
+ offset ||=@@offset
+ @sql_statement[:endnotes]=%{SELECT metadata_and_text.title, metadata_and_text.creator_author, metadata_and_text.src_filename, metadata_and_text.language_document_char, endnotes.body, endnotes.nr, endnotes.ocn, endnotes.metadata_tid FROM metadata_and_text, endnotes WHERE #{@search_endnotes} AND metadata_and_text.tid = endnotes.metadata_tid ORDER BY metadata_and_text.language_document_char, metadata_and_text.title, metadata_and_text.src_filename, endnotes.nr}
+ @sql_statement[:range]=%{LIMIT #{limit} OFFSET #{offset} ;}
+ select=@sql_statement[:endnotes] + ' ' + @sql_statement[:range]
+ select
+ end
+ def sql_select_body_format
+ %{<font color="#666666" size="2">#{sql_select_body}</font>}
+ end
+ def sql_select_endnotes_format
+ %{<font color="#666666" size="2">#{sql_select_endnotes}</font>}
+ end
+ def contents
+ @conn.select_all(sql_select_body)
+ end
+ def endnotes
+ @conn.select_all(sql_select_endnotes)
+ end
+ end
+ WOK_SQL
+ end
+ def dbi_connect
+ <<-'WOK_SQL'
+ @dbi="DBI:SQLite3:#{db_sqlite}" #sqlite3 ?
+ @conn=DBI.connect(@dbi)
+ WOK_SQL
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/composite.rb b/lib/sisu/v6/composite.rb
new file mode 100644
index 0000000..044f31c
--- /dev/null
+++ b/lib/sisu/v6/composite.rb
@@ -0,0 +1,263 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/composite.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: composite documents, assemble/build documents from other
+ documents or parts of marked up text
+
+=end
+module SiSU_Assemble
+ require_relative 'sysenv' # sysenv.rb
+ class RemoteImage
+ def initialize
+ @env=SiSU_Env::InfoEnv.new
+ end
+ def image(dir)
+ images=[]
+ images[0]=dir
+ images
+ end
+ def download_images(images_info)
+ path="#{@env.processing_path.processing}/external_document/image"
+ FileUtils::mkdir_p(path) unless FileTest.directory?(path)
+ download_from=images_info.shift
+ images_info.each do |i|
+ image="#{path}/#{i}"
+ imagefile=File.new(image,'w+')
+ open("#{download_from}/#{i}") do |g|
+ imagefile << g.read
+ end
+ imagefile.close
+ end
+ output_path="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image_external"
+ FileUtils::mkdir_p(output_path) unless FileTest.directory?(output_path)
+ SiSU_Env::SystemCall.new("#{path}/*",output_path,'q').rsync
+ end
+ end
+ class Composite
+ @@imager={}
+ def initialize(opt)
+ @opt=opt
+ @env=SiSU_Env::InfoEnv.new
+ end
+ def read
+ begin
+ pwd=Dir.pwd
+ Dir.chdir(@opt.f_pth[:pth])
+ @fns_array=IO.readlines(@opt.fno,'')
+ assembled=insertions?
+ write(assembled)
+ Dir.chdir(pwd)
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ end
+ end
+ def write(assembled)
+ assembled_file=File.new("#{@env.processing_path.composite_file}/#{@opt.fnb}.ssm.sst",'w+')
+ assembled.each {|a| assembled_file << a }
+ assembled_file.close
+ end
+ def download_images(download_from,images_array)
+ path="#{@env.processing_path.processing}/external_document/image"
+ FileUtils::mkdir_p(path) unless FileTest.directory?(path)
+ images_array.each do |i|
+ image="#{path}/#{i}"
+ unless FileTest.exists?(image)
+ imagefile=File.new(image,'w+')
+ open("#{download_from}/#{i}") do |g|
+ imagefile << g.read
+ end
+ imagefile.close
+ end
+ end
+ end
+ def insertion(fni,insert_array)
+ file={ prepared: [], images: [] }
+ rgx_image=/(?:^|[^_\\])\{\s*(\S+?\.(?:png|jpg|gif))/
+ file[:prepared] << "\n% |#{fni}|@|^|>>ok\n"
+ @code_flag=false
+ insert_array.each do |i|
+ @code_flag=if i =~/^code\{/ then true
+ elsif i =~/^\}code/ then false
+ else @code_flag
+ end
+ if not @code_flag \
+ and i !~/^%+\s/
+ i=i.gsub(/^([123]|:?[ABC])~\? /,'% [conditional heading:] \1~ ') #off conditional heading (consider syntax)
+ if i =~/^@\S+?:/
+ i=i.gsub(/\n/m,"\n% ").
+ gsub(/\n%\s+$/m,'').
+ gsub(/^@\S+?:/m,"\n% [imported header:] ") #off imported headers
+ end
+ end
+ file[:prepared] << i
+ if i !~/^%+\s/ \
+ and i =~rgx_image
+ file[:images] << i.scan(rgx_image).uniq
+ end
+ end
+ file[:prepared] << "\n% end import" << "\n\n"
+ if file[:images].length > 0
+ file[:images]=file[:images].flatten.uniq
+ file[:images].delete_if {|x| x =~/https?:\/\// }
+ end
+ file
+ end
+ def insertions?
+ data=@fns_array
+ tuned_file,imagedir=[],[]
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'Composite Document',"[#{@opt.f_pth[:lng_is]}] #{@opt.fno}").grey_title_hi unless @opt.act[:quiet][:set]==:on
+ data.each do |para|
+ if para =~/^<<\s+(\S+?\.ss[it])$/ \
+ or para =~/^<<\{(\S+?\.ss[it])\}$/ \
+ or para =~/^(?:<<\s*)\|(\S+?)\|@\|.+?\|(?:req(?:quire)?\b|\s*\})?/ \
+ or para =~/^r\{(.+?)\}/ #depreciated
+ loadfile=$1.strip
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'loading:',loadfile).txt_grey
+ end
+ tuned_file << if loadfile =~ /(?:https?|file):\/\/\S+?\.ss[ti]$/ # and NetTest
+ imagedir = /((?:https?|file):\/\/\S+?)\/[^\/]+?\.ss[ti]$/.match(loadfile).captures.join + '/_sisu/image' #watch
+ require 'uri'
+ image_uri=URI.parse(imagedir)
+ require 'open-uri'
+ require 'pp'
+ insert=open(loadfile)
+ insert_array=insert.dup
+ insert.close
+ file=insertion(loadfile,insert_array)
+ @@imager[image_uri] ||=[]
+ @@imager[image_uri] << file[:images]
+ file[:prepared]
+ elsif loadfile =~ /\.ss[ti]$/ \
+ and FileTest.file?(loadfile)
+ insert_array=IO.readlines(loadfile,'')
+ file=insertion(loadfile,insert_array)
+ file[:prepared]
+ else
+ cX=SiSU_Screen::Ansi.new(@opt.act[:color_state][:set]).cX
+ STDERR.puts "\t #{cX.fuchsia}ERROR#{cX.off} #{cX.brown}#{@opt.fns}#{cX.off} #{cX.fuchsia}requires invalid or non-existent file:#{cX.off} #{cX.brown}#{loadfile}#{cX.off}"
+ para
+ end
+ else tuned_file << para
+ end
+ tuned_file=tuned_file.flatten.compact
+ end
+ if @@imager.length >0
+ @@imager.each do |d,i|
+ i=i.flatten.uniq
+ image_info=d + i
+ download_images(image_info.flatten)
+ end
+ end
+ tuned_file
+ end
+ end
+ class CompositeFileList
+ @@imager={}
+ def initialize(opt)
+ @opt=opt
+ @env=SiSU_Env::InfoEnv.new
+ end
+ def read
+ begin
+ @opt.fns=@opt.fns.gsub(/\.ssm\.sst$/,'.ssm') #FIX earlier, hub
+ @fns_array=IO.readlines(@opt.fns,'')
+ insertions?
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ end
+ end
+ def insertions?
+ data=@fns_array
+ tuned_file=[]
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'Composite Document',@opt.fno).grey_title_hi unless @opt.act[:quiet][:set]==:on
+ @ssm=[@opt.fns]
+ data.each do |para|
+ if para =~/^<<\s+(\S+?\.ss[it])$/
+ loadfile=$1.strip
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'loading:',loadfile).txt_grey
+ end
+ tuned_file << if loadfile =~ /(?:https?|file):\/\/\S+?\.ss[ti]$/
+ @ssm << loadfile
+ elsif loadfile =~ /\.ss[ti]$/ \
+ and FileTest.file?(loadfile)
+ @ssm << loadfile
+ else
+ cX=SiSU_Screen::Ansi.new(@opt.act[:color_state][:set]).cX
+ STDERR.puts "\t #{cX.fuchsia}ERROR#{cX.off} #{cX.brown}#{@opt.fns}#{cX.off} #{cX.fuchsia}requires invalid or non-existent file:#{cX.off} #{cX.brown}#{loadfile}#{cX.off}"
+ para
+ end
+ end
+ end
+ @ssm
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/concordance.rb b/lib/sisu/v6/concordance.rb
new file mode 100644
index 0000000..a20178a
--- /dev/null
+++ b/lib/sisu/v6/concordance.rb
@@ -0,0 +1,381 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/concordance.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: concordance file (html concordance, wordmap, linked index of
+ words in document)
+
+=end
+module SiSU_Concordance
+ require_relative 'particulars' # particulars.rb
+ include SiSU_Particulars
+ require_relative 'sysenv' # sysenv.rb
+ include SiSU_Env
+ require_relative 'defaults' # defaults.rb
+ include SiSU_Viz
+ require_relative 'html_format' # html_format.rb
+ include SiSU_HTML_Format
+ require_relative 'html_minitoc' # html_minitoc.rb
+ class Source
+ def initialize(opt)
+ @opt=opt
+ @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt)
+ end
+ def read
+ begin
+ @env,@md=@particulars.env,@particulars.md
+ @env.url.output_tell
+ unless @md.opt.act[:quiet][:set]==:on
+ tool=(@md.opt.act[:verbose][:set]==:on \
+ || @md.opt.act[:verbose_plus][:set]==:on \
+ || @md.opt.act[:maintenance][:set]==:on) \
+ ? "#{@env.program.web_browser} #{@md.file.output_path.html_concordance.dir}/#{@md.file.base_filename.html_concordance}"
+ : "[#{@opt.f_pth[:lng_is]}] #{@opt.fno}"
+ (@md.opt.act[:verbose][:set]==:on \
+ || @md.opt.act[:verbose_plus][:set]==:on \
+ || @md.opt.act[:maintenance][:set]==:on) \
+ ? SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],"Concordance",tool).green_hi_blue
+ : SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'Concordance',tool).green_title_hi
+ end
+ wordmax=@env.concord_max
+ unless @md.wc_words.nil?
+ if @md.wc_words < wordmax
+ SiSU_Concordance::Source::Words.new(@particulars).songsheet
+ else
+ SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set],"concordance skipped, large document has over #{wordmax} words (#{@md.wc_words})").warn unless @md.opt.act[:quiet][:set]==:on
+ end
+ else
+ SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set],"wc (word count) is off, concordance will be processed for all files including those over the max set size of: #{wordmax} words").warn unless @md.opt.act[:quiet][:set]==:on
+ SiSU_Concordance::Source::Words.new(@particulars).songsheet
+ end
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@md.opt.cmd,@md.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ SiSU_Env::CreateSite.new(@opt.cmd).cp_css
+ end
+ end
+ private
+ class DocTitle
+ include SiSU_Viz
+ #revisit, both requires (html & xml_shared) needed for stand alone operation (sisu -w [filename])
+ require_relative 'xml_shared' # xml_shared.rb
+ require_relative 'html' # html.rb
+ def initialize(particulars)
+ @particulars,@md=particulars,particulars.md
+ @data=SiSU_HTML::Source::HTML_Environment.new(particulars).tuned_file_instructions
+ @file=SiSU_Env::FileOp.new(@md)
+ @fnb=@md.fnb
+ @lex_button=%{<a href="http://www.jus.uio.no/sisu/" target="_top"><img border="0" height="44" width="144" valign="center" src="#{@file.path_rel_links.html_seg_2}_sisu/image/sisu.png" alt="SiSU home --&gt;"></a>}
+ @doc_details =<<WOK
+<table summary="links to text related to this rudimentary index" width="96%" border="0" bgcolor="white" cellpadding="0" align="center"><tr><td width="2%" align="right">&nbsp;</td><td width="94%" valign="top" align="justify"><h1 class="small"><a href="#{@md.file.base_filename.html_segtoc}"><b>#{@md.title.full}</b></a></h1><p class="bold">#{@md.author}</p></td></tr></table>
+WOK
+ @make=SiSU_Env::ProcessingSettings.new(@md)
+ end
+ def create
+ head_banner=SiSU_HTML_Format::HeadToc.new(@md)
+ minitoc=SiSU_HTML_MiniToc::TocMini.new(@md,@data).songsheet.join("\n")
+ stylesheet=SiSU_Style::CSS_HeadInfo.new(@md).stylesheet
+ if @make.build.manifest_minitoc?
+ toc='<div class="toc">' + minitoc + '</div>'
+ div_class='content'
+ else
+ toc=''
+ div_class='content0'
+ end
+ top_band=if @make.build.html_top_band?
+ head_banner.concordance_navigation_band
+ else ''
+ end
+ <<WOK
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+ <title>
+ SiSU created WordIndex for: #{@md.title.full}
+ </title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+ <meta name="Description" content="&nbsp;SiSU created">
+ <meta name="keywords" content="word index for #{@md.title.full}">
+ <meta name="generator" content="SiSU (Linux &amp; Ruby!)">
+ <link rel="generator" href="http://www.jus.uio.no/sisu" />
+ <link rel="shortcut icon" href="../_sisu/image/rb7.ico" />
+ #{stylesheet.css_head_seg}
+</head>
+<body>
+ #{top_band}
+ #{toc}
+<div class="#{div_class}">
+ #{@doc_details}
+<p>Word index links are to html versions of the text the segmented version followed by the scroll (single document) version.<br />[For segmented text references [T1], [T2] or [T3] appearing without a link, indicates that the word appears in a title (or subtitle) of the text (that is identifiable by the appended object citation number).]</p>
+<p>(The word listing/index is Case sensitive: Capitalized words appear before lower case)</p>
+ <p>
+ <b>word</b> (number of occurences)<br />linked references to word within document <br />
+ [if number of occurences exceed number of references - word occurs more than once in at least one reference. Footnote/endnotes are either assigned to the paragraph from which they are referenced or ignored, so it is relevant to check the footnotes referenced from within a paragraph as well.]
+ </p>
+ <p>
+ (After the page is fully loaded) you can jump directly to a word by appending a hash (#) and the word to the url for this text, (do not forget that words are case sensitive, and may be listed twice (starting with and without an upper case letter)), #your_word # [&nbsp;http://[web host]/#{@fnb}/concordance.html#your_word&nbsp;]
+ </p>
+WOK
+ end
+ end
+ class Word
+ @@word_previous=''
+ def initialize(word,freq)
+ @word,@freq=word,freq
+ end
+ def html
+ w=if @word.capitalize==@@word_previous
+ %{\n<p class="concordance_word">#{@word}</p><p class="concordance_count">(#{@freq})</p>\n\t<p class="concordance_object"> }
+ else n=@word.strip.gsub(/\s+/,'_') #also need to convert extended character set to html
+ %{\n<p class="concordance_word"><a name="#{n}">#{@word}</a></p><p class="concordance_count">(#{@freq})</p>\n\t<p class="concordance_object"> }
+ end
+ @@word_previous=@word.capitalize
+ w
+ end
+ end
+ class Words
+ require_relative 'i18n' # i18n.rb
+ include SiSU_i18n
+ require_relative 'defaults' # defaults.rb
+ include SiSU_Viz
+ require_relative 'html_format' # html_format.rb
+ include SiSU_HTML_Format
+ require_relative 'sysenv' # sysenv.rb
+ include SiSU_Screen
+ @@dp=nil
+ def initialize(particulars)
+ @particulars=particulars
+ begin
+ @env,@md,@ao_array=particulars.env,particulars.md,particulars.ao_array
+ @file=SiSU_Env::FileOp.new(@md)
+ @freq=Hash.new(0)
+ @dp=@@dp ||=SiSU_Env::InfoEnv.new.digest.pattern
+ @rxp_lv1=/^#{Mx[:lv_o]}1:/ #fix @rxp_lv # Mx[:lv_o]
+ @rxp_lv2=/^#{Mx[:lv_o]}2:/ #fix @rxp_lv # Mx[:lv_o]
+ @rxp_lv3=/^#{Mx[:lv_o]}3:/ #fix @rxp_lv # Mx[:lv_o]
+ @rxp_title=Regexp.new("^#{Mx[:meta_o]}title#{Mx[:meta_c]}\s*(.+?)\s*$")
+ @rxp_t1=Regexp.new('^T1')
+ @rxp_t2=Regexp.new('^T2')
+ @rxp_t3=Regexp.new('^T3')
+ @rxp_excluded1=/#{Mx[:url_o]}\S+?#{Mx[:url_c]}|#{Mx[:rel_o]}\S+?#{Mx[:rel_c]}/
+ @rxp_excluded0=/^(?:#{Mx[:fa_bold_o]}|#{Mx[:fa_italics_o]})?(?:to\d+|\d+|&nbsp;|#{Mx[:br_endnotes]}|EOF|#{Mx[:br_eof]}|thumb_\S+|snap_\S+|_+|-+|[(]?(?:ii+|iv|vi+|ix|xi+|xiv|xv|xvi+|xix|xx)[).]?|\S+?_\S+|[\d_]+\w\S+|[\w\d]{1,2}|\d{1,3}\w?|#{@dp}|[0-9a-f]{16,64}|\d{2,3}x\d{2,3}|\S{0,2}sha\d|\S{0,3}\d{4}w\d\d|\b\w\d+|\d_all\b|e\.?g\.?)(?:#{Mx[:fa_bold_c]}|#{Mx[:fa_italics_c]})?$/mi #this regex causes and cures a stack dump in ruby 1.9 !!!
+ @rgx_splitlist=%r{[—.,;:#{Mx[:nbsp]}-]}mi
+ @alph=SiSU_i18n::Alphabet.new(@md.opt.lng).hash_arrays
+ @alphlst=SiSU_i18n::Alphabet.new(@md.opt.lng).hash_strings
+ @rgx_scanlist=%r{#{Mx[:fa_italics_o]}[#{@alphlst[:l]}#{@alphlst[:u]}0-9"\s]{2,12}#{Mx[:fa_italics_c]}|#{Mx[:fa_bold_o]}[#{@alphlst[:l]}#{@alphlst[:u]}0-9"\s]{2,12}#{Mx[:fa_bold_c]}|(?:https?|file)://\S+|<\S+?>|[#{@alphlst[:l]}#{@alphlst[:u]}]+|\w+}mi
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@md.opt.cmd,@md.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ end
+ end
+ def songsheet
+ begin
+ FileUtils::mkdir_p(@file.output_path.html_concordance.dir) unless FileTest.directory?(@file.output_path.html_concordance.dir)
+ @file_concordance=File.open(@file.place_file.html_concordance.dir,'w')
+ map_para
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@md.opt.cmd,@md.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ @file_concordance.close
+ end
+ end
+ protected
+ def location_scroll(wordlocation,show)
+ %{<a href="doc#{@md.lang_code_insert}#{Sfx[:html]}\##{wordlocation}">#{wordlocation}</a>; }
+ end
+ def location_seg(wordlocation,show) ##fix
+ unless wordlocation.nil?
+ wl=wordlocation.gsub(/(.+?)\#(\d+)/,"\\1#{@md.lang_code_insert}#{Sfx[:html]}#\\2")
+ case wordlocation
+ when /#{@rxp_t1}|@rxp_t2}|#{@rxp_t3}/
+ %{[<a href="doc#{@md.lang_code_insert}#{Sfx[:html]}##{show}">H</a>]#{show}, }
+ when /(.+?)\#(\d+)/
+ %{<a href="#{wl}">#{show}</a>, }
+ end
+ end
+ end
+ def map_para
+ @seg,ocn=nil,nil
+ @word_map={}
+ @ao_array.each do |line|
+ if defined? line.ocn \
+ and line.ocn.to_s =~/\d/
+ if (line.is ==:heading \
+ || line.is ==:heading_insert) \
+ && line.ln==4
+ @seg=line.name
+ end
+ ocn=line.ocn.to_s
+ if ocn =~/\d+/ \
+ and ocn !~/^0$/
+ line.obj=line.obj.gsub(/#{@rxp_excluded1}/,' ')
+ line.obj=line.obj.split(@rgx_splitlist).join(' ') #%take in word or other match
+ for word in line.obj.scan(@rgx_scanlist) #%take in word or other match
+ if word =~ /^([#{@alphlst[:l]}])/
+ firstletter=$1
+ flu=firstletter.tr(@alphlst[:l],@alphlst[:u])
+ word=word.gsub(/^#{firstletter}/,flu )
+ end
+ word=word.gsub(/#{Mx[:lnk_o]}|#{Mx[:lnk_c]}|#{Mx[:url_o]}|#{Mx[:url_c]}/,'').
+ gsub(/#{Mx[:fa_o]}\S+?#{Mx[:fa_o_c]}/,'').
+ gsub(/#{Mx[:fa_c_o]}\S+?#{Mx[:fa_c]}/,'').
+ gsub(/#{Mx[:gl_o]}#[a-z]+#{Mx[:gl_c]}/,'').
+ gsub(/#{Mx[:gl_o]}#[0-9]+#{Mx[:gl_c]}/,'')
+ word=word.gsub(/[0-9a-f]{10,}/,' ') if word =~/[0-9]/
+ word=word.gsub(/#{Mx[:br_line]}/,' ').
+ gsub(/^ +/,'').
+ gsub(/^\S$/,'')
+ word=nil if word.empty?
+ word=nil if word =~@rxp_excluded0 #watch
+ word=nil if word =~/^\S$/
+ if word
+ word=word.gsub(/#{Mx[:br_nl]}|#{Mx[:br_line]}/,' ').
+ gsub(/#{Mx[:fa_o]}[a-z]{1,7}#{Mx[:fa_o_c]}|#{Mx[:fa_c_o]}[a-z]{1,7}#{Mx[:fa_c]}/,'').
+ gsub(/#{Mx[:en_a_o]}(?:\d|[*+])*|#{Mx[:en_b_o]}(?:\d|[*+])*|#{Mx[:en_a_c]}|#{Mx[:en_b_c]}/mi,'').
+ gsub(/#{Mx[:fa_o]}\S+?#{Mx[:fa_o_c]}/,'').
+ gsub(/#{Mx[:fa_c_o]}\S+?#{Mx[:fa_c]}/,'').
+ gsub(/<\/?\S+?>/,'').
+ gsub(/^\@+/,'').
+ strip.
+ gsub(/#{Mx[:tc_p]}.+/,'').
+ gsub(/[\.,;:"]$/,'').
+ gsub(/["]/,'').
+ gsub(/^\s*[\(]/,'').
+ gsub(/[\(]\s*$/,'').
+ gsub(/^(?:See|e\.?g\.?).+/,'').
+ gsub(/^\s*[.,;:]\s*/,'').
+ strip.
+ gsub(/^\(?[a-zA-Z]\)$/,'').
+ gsub(/^\d+(st|nd|rd|th)$/,'').
+ gsub(/^(\d+\.?)+$/, '').
+ gsub(/#{Mx[:mk_o]}|#{Mx[:mk_c]}/,'').
+ gsub(/:name#\S+/,'').
+ gsub(/^\S$/,'')
+ word=nil if word =~/^\S$/
+ word=nil if word =~/^\s*$/ #watch
+ if word
+ unless word =~/[A-Z][A-Z]/ \
+ or word =~/\w+\s\w+/
+ word=word.capitalize
+ end
+ @freq[word] +=1
+ @word_map[word] ||= []
+ if line !~ /#{@rxp_lv1}|#{@rxp_lv2}|#{@rxp_lv3}/
+ loc_=%{#{location_seg("#{@seg}\##{ocn}",ocn).to_s}}
+ unless loc_.empty?
+ @word_map[word] << loc_
+ end
+ else
+ @word_map[word] << case line
+ when @rxp_lv1 then location_seg('T1',ocn) #fix @rxp_lv # Mx[:lv_o]
+ when @rxp_lv2 then location_seg('T2',ocn) #fix @rxp_lv # Mx[:lv_o]
+ when @rxp_lv3 then location_seg('T3',ocn) #fix @rxp_lv # Mx[:lv_o]
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ seg=''
+ head=SiSU_Concordance::Source::DocTitle.new(@particulars).create
+ head=head.gsub(/#{Xx[:html_relative2]}/m,@file.path_rel_links.html_seg_2).
+ gsub(/#{Xx[:html_relative1]}/m,@file.path_rel_links.html_seg_1)
+ @file_concordance << head
+ @file_concordance << '<p>'
+ alph=@alph[:u]
+ alph.each {|x| @file_concordance << %{<a href="##{x}">#{x}</a>,&nbsp;}}
+ @file_concordance << '</p>'
+ letter=alph.shift
+ @file_concordance << %{\n<p class="letter"><a name="A">A</a></p>}
+ for word in @freq.keys.sort! {|a,b| a.downcase<=>b.downcase}
+ f=/^(\S)/.match(word)[1]
+ if letter < f.upcase
+ while letter < f.upcase
+ if alph.length > 0
+ letter=alph.shift
+ @file_concordance << %{\n<p class="letter"><a name="#{letter}">#{letter}</a></p>}
+ else break
+ end
+ end
+ end
+ keyword=SiSU_Concordance::Source::Word.new(word,@freq[word]).html
+ if keyword !~ @rxp_excluded0
+ if @word_map[word][0] =~ /\d+/
+ @file_concordance << %{#{keyword}#{seg}#{@word_map[word].uniq.compact.join}}
+ end
+ @file_concordance << '</p>'
+ end
+ # special cases endnotes and header levels 1 - 3
+ end
+ @file_concordance << %{</div></body>\n</html>} # footer
+ if @md.opt.act[:verbose_plus][:set]==:on \
+ || @md.opt.act[:maintenance][:set]==:on
+ SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set],@md.fns,"#{@md.file.output_path.html_concordance.dir}/#{@md.file.base_filename.html_concordance}").flow
+ end
+ end
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/conf.rb b/lib/sisu/v6/conf.rb
new file mode 100644
index 0000000..c233319
--- /dev/null
+++ b/lib/sisu/v6/conf.rb
@@ -0,0 +1,258 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/conf.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: configuration
+
+=end
+module SiSU_Initialize
+ require_relative 'sysenv' # sysenv.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 #if @opt.mod.inspect =~/--init(?:ialize)?=site/
+ 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 'sysenv' # sysenv.rb
+ def initialize(opt)
+ @opt=opt
+ @env=SiSU_Env::InfoEnv.new(@opt.fns)
+ @suffix,@path={},{}
+ @suffix[:rnc]='rnc'
+ @suffix[:rng]='rng'
+ @suffix[:xsd]='xsd'
+ @path[:xml]= @env.path.output + '/_sisu/xml'
+ @path[:xsd]= @env.path.output + '/_sisu/xml/xsd'
+ @path[:rnc]= @env.path.output + '/_sisu/xml/rnc'
+ @path[:rng]= @env.path.output + '/_sisu/xml/rng'
+ @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.cmd).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.cmd).cp_local_images
+ SiSU_Env::CreateSite.new(@opt.cmd).cp_webserver_images_local #this should not have been necessary
+ SiSU_Env::CreateSite.new(@opt.cmd).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.cmd).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.cmd).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.cmd).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("#{@env.path.output}/#{@env.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("#{@env.path.output}/#{@env.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("#{@env.path.output}/#{@env.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("#{@env.path.output}/#{@env.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.cmd)
+ #rng
+ schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
+ schema.relaxng(@opt.cmd)
+ #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.cmd)
+ #rng
+ schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
+ schema.relaxng(@opt.cmd)
+ #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.cmd)
+ #rng
+ schema=SiSU_Env::SystemCall.new(rnc_src,rng_file)
+ schema.relaxng(@opt.cmd)
+ #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.cmd)
+ 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.cmd)
+ 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.cmd)
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/constants.rb b/lib/sisu/v6/constants.rb
new file mode 100644
index 0000000..34ff92e
--- /dev/null
+++ b/lib/sisu/v6/constants.rb
@@ -0,0 +1,369 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+ constants
+
+ * 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=lib/sisu/v6/constants.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: system environment, resource control and configuration details
+
+=end
+#Ax,Xx,Mx,Rx,Hx,Dx,Px,Ep,Db,Gt,Tex=Array.new(11){{}}
+YEAR='2014'
+Sfx={
+ txt: '.txt',
+ txt_textile: '.textile',
+ txt_asciidoc: '.ad',
+ txt_markdown: '.md',
+ txt_rst: '.rst',
+ html: '.html',
+ xhtml: '.xhtml',
+ xml: '.xml',
+ xml_sax: '.sax.xml',
+ xml_dom: '.dom.xml',
+ xml_scaffold: '.scaffold.xml',
+ xml_scaffold_structure_sisu: '.scaffold.sisu.xml',
+ xml_scaffold_structure_collapse: '.scaffold.collapse.xml',
+ xml_docbook: '.docbook.xml',
+ xml_docbook_article: '.article.docbook.xml',
+ xml_docbook_book: '.book.docbook.xml',
+ xml_fictionbook: '.fb2',
+ epub: '.epub',
+ epub_xhtml: '.xhtml',
+ odt: '.odt',
+ pdf: '.pdf',
+ manpage: '.1',
+ info: '.info',
+ texinfo: '.texinfo',
+ sql: '.sql.db',
+}
+Ax={
+ tab: "\t",
+}
+Xx={
+ protect: '☞',
+ segment: 'Ф',
+ relative_path: '☼',
+ html_relative2: '※※',
+ html_relative1: '※',
+}
+Mx={
+ meta_o: '〔@', meta_c: '〕',
+ lv_o_0: 0,
+ lv_o_1: 1,
+ lv_o_2: 2,
+ lv_o_3: 3,
+ lv_o_4: 4,
+ lv_o_5: 5,
+ lv_o_6: 6,
+ lv_o_7: 7,
+ lv_o_8: 8,
+ lv_o_9: 9,
+ lv_o: '〔', lv_c: '〕',
+ en_a_o: '【', en_a_c: '】', #endnote Mx[:en_a_o]='~{'; Mx[:en_a_c]='}~'
+ en_b_o: '〖', en_b_c: '〗', #endnote Mx[:en_b_o]='~['; Mx[:en_b_c]=']~'
+ bl_o: '〔', bl_c: '〕', #block text mark
+ gr_o: '〔', gr_c: '〕', #group text mark #REPLACE & RETIRE
+ id_o: '〔', id_c: '〕', #object id mark
+ tc_o: '『', tc_c: "』", #table row mark #Mx[:tc_c]="』\n"
+ tc_p: '┆', #table col/misc mark
+ pa_o: '〔', pa_c: '〕', #affects paragraph mark
+ mk_o: '〔', mk_c: '〕', #generic mark
+ gl_o: '〔', gl_c: '〕', #glyph
+ fa_o: '〔', fa_o_c: '¤', fa_c_o: '¤', fa_c: '〕',
+ idx_o: '▩', idx_c: '▩',
+ nbsp: '░', #'▭ '
+ br_line: '╱', #lB ▌ 9612 ┘ ¶
+ br_nl: '╲', #lB ▌ 』 ┘
+ br_paragraph: '█', #FB █ 9608 # PP ∥ 8741 #▐ #'┘' #'¶' #FB █ 9608 lB ▌ 9612 RB ▐ 9616
+ br_obj: 'break_obj',
+ br_page_line: '▭',
+ br_page: '┼',
+ br_page_new: '╋',
+ lnk_o: '⌠', lnk_c: '⌡', #'⌈' '⌋' '⌠' '⌡' #Mx[:lnk_o: '◁'; Mx[:lnk_c: '▷' #‹ ›
+ url_o: '◘', url_c: '◙',
+ rel_o: '⌈', rel_c: '⌋',
+ tag_o: '⌊', tag_c: '⌉',
+ sm_set_o: '◢', sm_set_c: '◣',
+ sm_subset_o: '◢', sm_subset_c: '◣',
+ vline: '┆', # ¦ |
+}
+Mx[:fa_bold_o]= "#{Mx[:fa_o]}b#{Mx[:fa_o_c]}"
+Mx[:fa_bold_c]= "#{Mx[:fa_c_o]}b#{Mx[:fa_c]}"
+Mx[:fa_italics_o]= "#{Mx[:fa_o]}i#{Mx[:fa_o_c]}"
+Mx[:fa_italics_c]= "#{Mx[:fa_c_o]}i#{Mx[:fa_c]}"
+Mx[:fa_underscore_o]= "#{Mx[:fa_o]}u#{Mx[:fa_o_c]}"
+Mx[:fa_underscore_c]= "#{Mx[:fa_c_o]}u#{Mx[:fa_c]}"
+Mx[:fa_cite_o]= "#{Mx[:fa_o]}cite#{Mx[:fa_o_c]}"
+Mx[:fa_cite_c]= "#{Mx[:fa_c_o]}cite#{Mx[:fa_c]}"
+Mx[:fa_insert_o]= "#{Mx[:fa_o]}ins#{Mx[:fa_o_c]}"
+Mx[:fa_insert_c]= "#{Mx[:fa_c_o]}ins#{Mx[:fa_c]}"
+Mx[:fa_strike_o]= "#{Mx[:fa_o]}del#{Mx[:fa_o_c]}"
+Mx[:fa_strike_c]= "#{Mx[:fa_c_o]}del#{Mx[:fa_c]}"
+Mx[:fa_superscript_o]= "#{Mx[:fa_o]}sup#{Mx[:fa_o_c]}"
+Mx[:fa_superscript_c]= "#{Mx[:fa_c_o]}sup#{Mx[:fa_c]}"
+Mx[:fa_subscript_o]= "#{Mx[:fa_o]}sub#{Mx[:fa_o_c]}"
+Mx[:fa_subscript_c]= "#{Mx[:fa_c_o]}sub#{Mx[:fa_c]}"
+Mx[:fa_hilite_o]= "#{Mx[:fa_o]}hi#{Mx[:fa_o_c]}"
+Mx[:fa_hilite_c]= "#{Mx[:fa_c_o]}hi#{Mx[:fa_c]}"
+Mx[:fa_monospace_o]= "#{Mx[:fa_o]}mono#{Mx[:fa_o_c]}"
+Mx[:fa_monospace_c]= "#{Mx[:fa_c_o]}mono#{Mx[:fa_c]}"
+Mx[:gl_bullet]= "#{Mx[:gl_o]}●#{Mx[:gl_c]}"
+Mx[:br_endnotes]= "#{Mx[:mk_o]}ENDNOTES#{Mx[:mk_c]}"
+Mx[:br_eof]= "#{Mx[:mk_o]}EOF#{Mx[:mk_c]}"
+Mx[:pa_non_object_dummy_heading]="#{Mx[:pa_o]}-##{Mx[:pa_c]}" #unnumbered paragraph, delete when not required [used in dummy headings, eg. for segmented html] (place marker at end of paragraph)
+Mx[:pa_non_object_no_heading]="#{Mx[:pa_o]}~##{Mx[:pa_c]}" #unnumbered paragraph (place marker at end of paragraph)
+Hx={
+ br_obj: { obj: Mx[:br_obj] }, # line sep
+ br_page_line: { obj: Mx[:br_page_line] }, # line across page
+ br_page: { obj: Mx[:br_page] }, # newpage
+ br_page_new: { obj: Mx[:br_page_new] }, # clearpage
+}
+#Mx[:sm_set_o]='∈ '; Mx[:sm_set_c]='∋ '
+#Mx[:sm_subset_o]='∈ '; Mx[:sm_subset_c]='∋ '
+Rx={
+ mx_fa_clean: /#{Mx[:fa_o]}.+?#{Mx[:fa_c]}|#{Mx[:pa_o]}.+?#{Mx[:pa_c]}|#{Mx[:mk_o]}.+?#{Mx[:mk_c]}/,
+ lv: /〔([0-9]):(\S*?)〕/,
+ lv_0: /#{Mx[:lv_o_0]}(\S*?)#{Mx[:lv_c]}/,
+ lv_1: /#{Mx[:lv_o_1]}(\S*?)#{Mx[:lv_c]}/,
+ lv_2: /#{Mx[:lv_o_2]}(\S*?)#{Mx[:lv_c]}/,
+ lv_3: /#{Mx[:lv_o_3]}(\S*?)#{Mx[:lv_c]}/,
+ lv_4: /#{Mx[:lv_o_4]}(\S*?)#{Mx[:lv_c]}/,
+ lv_5: /#{Mx[:lv_o_5]}(\S*?)#{Mx[:lv_c]}/,
+ lv_6: /#{Mx[:lv_o_6]}(\S*?)#{Mx[:lv_c]}/,
+ lv_7: /#{Mx[:lv_o_7]}(\S*?)#{Mx[:lv_c]}/,
+ lv_8: /#{Mx[:lv_o_8]}(\S*?)#{Mx[:lv_c]}/,
+ lv_9: /#{Mx[:lv_o_9]}(\S*?)#{Mx[:lv_c]}/,
+ meta: /#{Mx[:meta_o]}(\S+?)#{Mx[:meta_c]}/,
+}
+Dx={
+ ocn_o: '「', ocn_c: '」',
+ url_o: '‹', url_c: '›',
+ url_o_xml: '&lt;', url_c_xml: '&gt;',
+ rel_o: '‹', rel_c: '›',
+ lt_xml: '&lt;', gt_xml: '&gt;',
+}
+Tex={
+ backslash: "\\\\",
+ backslash: "\\\\",
+ tilde: '\\\\\\~',
+}
+Px={
+ bold_o: '*', bold_c: '*',
+ italics_o: '/', italics_c: '/',
+ underscore_o: '_', underscore_c: '_',
+ #emphasis_o: '*', emphasis_c: '*',
+ #bold_o: '!', bold_c: '!',
+ cite_o: '"', cite_c: '"',
+ insert_o: '+', insert_c: '+',
+ strike_o: '-', strike_c: '-',
+ superscript_o: '^', superscript_c: '^',
+ subscript_o: '[', subscript_c: ']',
+ hilite_o: '*', hilite_c: '*',
+ monospace_o: '', monospace_c: '',
+ po_bold_o: '!{', po_bold_c: '}!',
+ po_italics_o: '/{', po_italics_c: '}/',
+ po_underscore_o: '_{', po_underscore_c: '}_',
+ po_cite_o: '"{', po_cite_c: '}"',
+ po_insert_o: '+{', po_insert_c: '}+',
+ po_strike_o: '-{', po_strike_c: '}-',
+ po_superscript_o: '^{', po_superscript_c: '}^',
+ po_subscript_o: ',{', po_subscript_c: '},',
+ po_hilite_o: '*{', po_hilite_c: '}*',
+ po_monospace_o: '#{', po_monospace_c: '}#',
+ lng_lst: SiSU_is[:language_list],
+ lv1: '*',
+ lv2: '=',
+ lv3: '=',
+ lv4: '-',
+ lv5: '.',
+ lv6: '.',
+}
+Px[:lng_lst_rgx]=Px[:lng_lst].join('|')
+Ep={
+ alt: :on,
+ d_oebps: 'OEBPS',
+ d_image: 'OEBPS/image',
+ d_css: 'OEBPS/css',
+ f_ncx: 'toc.ncx',
+ f_opf: 'content.opf',
+}
+$ep=if Ep[:alt]==:on
+ {
+ o: 'opf:',
+ hsp: ' ',
+ }
+else
+ {
+ o: '',
+ hsp: '&nbsp;',
+ }
+end
+Db={
+ name_prefix: "SiSU#{SiSU_is[:version_dir]}a_",
+ name_prefix_db: "sisu_#{SiSU_is[:version_dir]}a_",
+ col_title: 800,
+ col_title_part: 400,
+ col_title_edition: 10,
+ col_name: 600,
+ col_creator_misc_short: 100,
+ col_language: 100,
+ col_language_char: 6,
+ col_date_text: 10,
+ col_txt_long: 600,
+ col_txt_short: 200,
+ col_identify_hash: 256,
+ col_library: 30,
+ col_small: 16,
+ col_filename: 256,
+ col_digest: 64,
+ col_filesize: 10,
+ col_info_note: 2500,
+}
+Gt={
+ grotto: 'sisu_src',
+ git: 'sisu:',
+ src: 'src',
+ pods: 'pods',
+ sisupod: 'sisupod',
+ pod: 'pod',
+ files: 'files',
+ doc: 'doc',
+ po: 'po4a/po',
+ pot: 'po4a/pot',
+ image: 'image',
+ audio: 'audio',
+ video: 'video',
+ conf: 'doc/_sisu',
+}
+S_CONF={
+ header_make: 'sisu_document_make',
+ rc_yml: 'sisurc.yml',
+}
+ANSI_C={
+ red: "\033[#{31}m",
+ green: "\033[#{32}m",
+ yellow: "\033[#{33}m",
+ blue: "\033[#{34}m",
+ fuchsia: "\033[#{35}m",
+ cyan: "\033[#{36}m",
+ inv_red: "\033[#{41}m",
+ inv_green: "\033[#{42}m",
+ inv_yellow: "\033[#{43}m",
+ inv_blue: "\033[#{44}m",
+ inv_fuchsia: "\033[#{45}m",
+ inv_cyan: "\033[#{46}m",
+ b_red: "\033[#{91}m",
+ b_green: "\033[#{92}m",
+ b_yellow: "\033[#{93}m",
+ b_blue: "\033[#{94}m",
+ b_fuchsia: "\033[#{95}m",
+ b_cyan: "\033[#{96}m",
+ off: "\033[m"
+}
+DISABLE={
+ epub: {
+ internal_navigation: true,
+ per_section_title: true,
+ ncx_navpoint_unique_id: true,
+ },
+}
+DEVELOPER={
+ maintenance: :false,
+}
+__END__
+utils.rb
+consider:
+ 〔comment〕
+ 〔links?????〕
+ import document?
+check:
+ bold line
+
+┆┆⋮┇┊┋
+『』
+「」
+〔〕
+【】
+
+ #˝ " λ Ω β α π Ѫ Ж Я Ѳ ѳ Ф ㈣
+ Ѳ ѳ Ф
+ ♩ ♭  ✠  ▭ ▬ ▪
+【】〖〗◢ ◣ ◀ ▶ ◘ ◙
+《》「」
+ ‹ › ∗ 
+'〔lv1〕','〔lv2〕','〔lv3〕','〔lv4〕','〔lv5〕','〔lv6〕','〔lv7〕','〔lv8〕','〔lv9〕'
+'〔 Ѳ1〕','〔 Ѳ2〕','〔 Ѳ3〕','〔 Ѳ4〕','〔 Ѳ5〕','〔Ѳ6〕','〔Ѳ7〕','〔Ѳ8〕','〔Ѳ9〕'
+◁▷
+◀this is text or an image▶ http://
+p __FILE__ +':'+ __LINE__.to_s
+p __FILE__ + ' ' + __LINE__.to_s + ' ' + html
+puts "#{__FILE__} #{__LINE__} #{o.inspect}"
+puts __FILE__ + ' ' + __LINE__.to_s + '--> ' + o.inspect
+puts %{-\t#{__FILE__}::#{__LINE__}::#{caller}:\n"#{name}"}
+p "\t" + txt.obj + " << #{__FILE__} #{__LINE__} >>"
+p (__FILE__ + ' ' + __LINE__.to_s + '--> ' + dob.inspect) if dob.is==:heading
+data.each {|o| p (__FILE__ + ' ' + __LINE__.to_s + '--> ' + o.inspect) if o.is==:heading}
+puts "#{__FILE__} #{__LINE__} #{para}" if @opt.act[:maintenance][:set]==:on
+puts "#{__FILE__} #{__LINE__} #{t_o}" if @opt.act[:maintenance][:set]==:on
+ dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 dl ┐ 9488 dL ┑ 9489 Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 Ur ┖ 9494 UR ┗ 9495 ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 vr ├
+ dr ┌ 9484 dR ┍ 9485 Dr ┎ 9486 DR ┏ 9487 dl ┐ 9488 dL ┑ 9489 Dl ┒ 9490 LD ┓ 9491 ur └ 9492 uR ┕ 9493 Ur ┖ 9494 UR ┗ 9495 ul ┘ 9496 uL ┙ 9497 Ul ┚ 9498 UL ┛ 9499 vr ├
+ └ ┘
+Iu ⌠ 8992 Il ⌡ <7 ⌈ 8968 >7 ⌉ 8969 7< ⌊ 8970 7> ⌋ 8971
+<" 『 12302 >" 』 12303
+<' 「 12300 >' 」 12301
diff --git a/lib/sisu/v6/css.rb b/lib/sisu/v6/css.rb
new file mode 100644
index 0000000..81cb115
--- /dev/null
+++ b/lib/sisu/v6/css.rb
@@ -0,0 +1,3444 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/css.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: css stylesheets
+
+=end
+module SiSU_Style
+ require_relative 'sysenv' # sysenv.rb
+ require_relative 'defaults' # defaults.rb
+ class CSS_HeadInfo
+ def initialize(md,ft='html')
+ @md,@ft=md,ft
+ @env=SiSU_Env::InfoEnv.new('',md)
+ @fn_css ||=SiSU_Env::CSS_Default.new
+ @o_str ||=SiSU_Env::ProcessingSettings.new(md).output_dir_structure
+ css_copy
+ end
+ def stylesheet
+ def css_path
+ SiSU_Env::CSS_Stylesheet.new(@md)
+ end
+ def css_embed_content
+ @css_embed_content ||=SiSU_Style::CSS.new
+ end
+ def css_embed?
+ if @ft=='html' \
+ && @o_str.dump_or_redirect?
+ true
+ else
+ false
+ end
+ end
+ def css_embed(css)
+ <<-WOK
+ <style TYPE="text/css">
+ #{css}
+ </style>
+ WOK
+ end
+ def css_action
+ css=case @ft
+ when 'html'
+ css=css_embed_content.html
+ css_embed(css)
+ when 'xhtml'
+ css_path.xhtml
+ when 'xml_sax'
+ css_path.xml_sax
+ when 'xml_dom'
+ css_path.xml_dom
+ else
+ css_embed_content.html
+ end
+ end
+ def css_head
+ (css_embed?) \
+ ? css_action
+ : "#{css_path.html}#{css_path.html_seg}"
+ end
+ def css_head_seg
+ (css_embed?) \
+ ? css_action
+ : css_path.html_seg
+ end
+ def css_head_xml
+ css_action
+ end
+ self
+ end
+ def css_copy
+ if @o_str.dump_or_redirect?
+ css=SiSU_Style::CSS.new
+ if @o_str.dump?
+ css_pth="#{@md.opt.opt_act[:dump][:inst]}/#{@env.path.style}"
+ elsif @o_str.redirect?
+ css_pth="#{@md.opt.opt_act[:redirect][:inst]}/#{@md.fnb}/#{@env.path.style}"
+ end
+ FileUtils::mkdir_p(css_pth) unless FileTest.directory?(css_pth)
+ case @ft
+ when 'html'
+ style=File.new("#{css_pth}/#{@fn_css.html}",'w')
+ style << css.html
+ style.close
+ when 'xhtml'
+ style=File.new("#{css_pth}/#{@fn_css.xhtml}",'w')
+ style << css.xhtml
+ style.close
+ when 'xml_sax'
+ style=File.new("#{css_pth}/#{@fn_css.xml_sax}",'w')
+ style << css.xml_sax
+ style.close
+ when 'xml_dom'
+ style=File.new("#{css_pth}/#{@fn_css.xml_dom}",'w')
+ style << css.xml_dom
+ style.close
+ css_path.xml_dom
+ end
+ end
+ end
+ end
+ class CSS
+ def initialize
+ @vz=SiSU_Viz::Defaults.new
+ end
+ def fonts
+ @vz.font_fonts
+ end
+ def html_tables #stylesheet for css table_pages
+<<WOK
+/* SiSU table output stylesheet */
+ body {
+ color: black;
+ background: #{@vz.color_white};
+ }
+ p {
+ display: block;
+ line-height: 1.5;
+ font-family: #{fonts};
+ }
+ a:link {
+ color: #{@vz.color_blue_ink};
+ text-decoration: none;
+ }
+ a:visited {
+ color: #{@vz.color_blue_ink};
+ text-decoration: none;
+ /* background-color: #{@vz.color_blue_tinge}; */
+ }
+ a:hover {
+ color: #{@vz.color_black};
+ text-decoration: underline;
+ background-color: #{@vz.color_yellow_light};
+ }
+ a:active {
+ color: #{@vz.color_blue_ink};
+ text-decoration: underline;
+ }
+WOK
+ end
+ def harvest
+ <<WOK
+/* SiSU harvest css default stylesheet */
+ body {
+ color: black;
+ background: #ffffff;
+ background-color: #ffffff;
+ }
+ a:link {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:visited {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:hover {
+ color: #000000;
+ background-color: #f9f9aa;
+ }
+ a:hover img {
+ background-color: #ffffff;
+ }
+ a:active {
+ color: #003399;
+ text-decoration: underline;
+ }
+
+ .norm, .bold {
+ line-height: 150%;
+ margin-left: 1em;
+ margin-right: 2em;
+ margin-top: 10px;
+ margin-bottom: 0px;
+ text-indent: 0mm;
+ }
+ p, h0, h1, h2, h3, h4, h5, h6 {
+ display: block;
+ font-family: verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman;
+ font-size: 100%;
+ font-weight: normal;
+ line-height: 150%;
+ /* text-align: justify; */
+ margin-left: 1em;
+ text-indent: 0mm;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ margin-right: 6px;
+ text-align: left;
+ }
+ h1 {
+ font-size: 120%;
+ font-weight: bold;
+ color: white;
+ background: #000088;
+ margin-left: 0em;
+ }
+ p.work {
+ font-size: 80%;
+ margin-left: 5em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-right: 6px;
+ text-align: left;
+ }
+ p.author {
+ font-size: 100%;
+ margin-left: 2em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-right: 6px;
+ text-align: left;
+ }
+ p.publication {
+ font-size: 80%;
+ margin-left: 4em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-right: 6px;
+ text-align: left;
+ }
+ p.letter {
+ font-weight: bold;
+ font-size: 60%;
+ margin-left: 1em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-right: 6px;
+ text-align: left;
+ color: white;
+ background: #880000;
+ }
+ p.lev0 {
+ font-size: 120%;
+ margin-left: 1em;
+ color: white;
+ background: #000000;
+ }
+
+ p.lev1 {
+ font-size: 110%;
+ margin-left: 2em;
+ color: white;
+ background: #444444;
+ }
+
+ p.lev2 {
+ font-size: 100%;
+ margin-left: 3em;
+ background: #888888;
+ }
+
+ p.lev3 {
+ font-size: 90%;
+ margin-left: 4em;
+ background: #bbbbbb;
+ }
+
+ p.lev4 {
+ font-size: 80%;
+ margin-left: 5em;
+ background: #eeeeee;
+ }
+
+ p.lev5 {
+ font-size: 80%;
+ margin-left: 6em;
+ }
+WOK
+ end
+ def html #stylesheet for css html pages== html.css
+<<WOK
+/* SiSU css default stylesheet */
+ body {
+ color: black;
+ background: #ffffff;
+ background-color: #ffffff;
+ }
+/*
+ table {
+ margin-left: 5%;
+ display: block;
+ }
+ tr {
+ display: block;
+ }
+ th,td {
+ display: inline;
+ vertical-align: top;
+ }
+*/
+ a:link {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:visited {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:hover {
+ color: #000000;
+ background-color: #f9f9aa;
+ }
+ a.lnkocn:link {
+ color: #777777;
+ text-decoration: none;
+ }
+/*
+ a:hover {
+ border-bottom: 2px solid #777777;
+ background-color: #fff3b6;
+ }
+*/
+ a:hover img {
+ background-color: #ffffff;
+ }
+ a:active {
+ color: #003399;
+ text-decoration: underline;
+ }
+ div {
+ margin-left: 0;
+ margin-right: 0;
+ }
+ div.p {
+ margin-left: 5%;
+ margin-right: 1%;
+ }
+
+ #top_band {
+ position: absolute;
+ top: 0;
+ bottom: 80px;
+ width: 100%;
+ }
+ #top_band_search {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ margin-left: 75%;
+ width: 20%;
+ }
+ #column_left {
+ position: absolute;
+ top: 80px;
+ left: 0;
+ margin-left: 1%;
+ width: 20%;
+ }
+ #column_center {
+ position: absolute;
+ top: 80px;
+ margin-left: 20%;
+ width: 55%;
+ }
+ #column_right {
+ position: absolute;
+ top: 80px;
+ right: 0px;
+ margin-left: 75%;
+ width: 25%;
+ }
+ #pane_major {
+ position: absolute;
+ top: 0px;
+ left: 0;
+ margin-left: 0;
+ width: 80%;
+ }
+ #pane_minor {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ margin-left: 75%;
+ width: 20%;
+ background-color: #aaaaaa;
+ }
+
+ .norm, .bold, .verse, .group, .block, .alt {
+ line-height: 133%;
+ margin-left: 0em;
+ margin-right: 2em;
+ margin-top: 12px;
+ margin-bottom: 0px;
+ padding-left: 0em;
+ text-indent: 0em;
+ }
+ p, h0, h1, h2, h3, h4, h5, h6 {
+ display: block;
+ font-family: verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman;
+ font-size: 100%;
+ font-weight: normal;
+ line-height: 133%;
+ text-align: justify;
+ margin-left: 0em;
+ margin-right: 2em;
+ text-indent: 0mm;
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+ }
+
+ /* indent */
+
+ p.norm { }
+ p.i1 {padding-left: 1em;}
+ p.i2 {padding-left: 2em;}
+ p.i3 {padding-left: 3em;}
+ p.i4 {padding-left: 4em;}
+ p.i5 {padding-left: 5em;}
+ p.i6 {padding-left: 6em;}
+ p.i7 {padding-left: 7em;}
+ p.i8 {padding-left: 8em;}
+ p.i9 {padding-left: 9em;}
+
+ /* hanging indent */
+
+ p.h0i0 {
+ padding-left: 0em;
+ text-indent: 0em;
+ }
+ p.h0i1 {
+ padding-left: 1em;
+ text-indent: -1em;
+ }
+ p.h0i2 {
+ padding-left: 2em;
+ text-indent: -2em;
+ }
+ p.h0i3 {
+ padding-left: 3em;
+ text-indent: -3em;
+ }
+ p.h0i4 {
+ padding-left: 4em;
+ text-indent: -4em;
+ }
+ p.h0i5 {
+ padding-left: 5em;
+ text-indent: -5em;
+ }
+ p.h0i6 {
+ padding-left: 6em;
+ text-indent: -6em;
+ }
+ p.h0i7 {
+ padding-left: 7em;
+ text-indent: -7em;
+ }
+ p.h0i8 {
+ padding-left: 8em;
+ text-indent: -8em;
+ }
+ p.h0i9 {
+ padding-left: 9em;
+ text-indent: -9em;
+ }
+
+ p.h1i0 {
+ padding-left: 0em;
+ text-indent: 1em;
+ }
+ p.h1i1 {
+ padding-left: 1em;
+ text-indent: 0em;
+ }
+ p.h1i2 {
+ padding-left: 2em;
+ text-indent: -1em;
+ }
+ p.h1i3 {
+ padding-left: 3em;
+ text-indent: -2em;
+ }
+ p.h1i4 {
+ padding-left: 4em;
+ text-indent: -3em;
+ }
+ p.h1i5 {
+ padding-left: 5em;
+ text-indent: -4em;
+ }
+ p.h1i6 {
+ padding-left: 6em;
+ text-indent: -5em;
+ }
+ p.h1i7 {
+ padding-left: 7em;
+ text-indent: -6em;
+ }
+ p.h1i8 {
+ padding-left: 8em;
+ text-indent: -7em;
+ }
+ p.h1i9 {
+ padding-left: 9em;
+ text-indent: -8em;
+ }
+
+ p.h2i0 {
+ padding-left: 0em;
+ text-indent: 2em;
+ }
+ p.h2i1 {
+ padding-left: 1em;
+ text-indent: 1em;
+ }
+ p.h2i2 {
+ padding-left: 2em;
+ text-indent: 0em;
+ }
+ p.h2i3 {
+ padding-left: 3em;
+ text-indent: -1em;
+ }
+ p.h2i4 {
+ padding-left: 4em;
+ text-indent: -2em;
+ }
+ p.h2i5 {
+ padding-left: 5em;
+ text-indent: -3em;
+ }
+ p.h2i6 {
+ padding-left: 6em;
+ text-indent: -4em;
+ }
+ p.h2i7 {
+ padding-left: 7em;
+ text-indent: -5em;
+ }
+ p.h2i8 {
+ padding-left: 8em;
+ text-indent: -6em;
+ }
+ p.h2i9 {
+ padding-left: 9em;
+ text-indent: -7em;
+ }
+
+ p.h3i0 {
+ padding-left: 0em;
+ text-indent: 3em;
+ }
+ p.h3i1 {
+ padding-left: 1em;
+ text-indent: 2em;
+ }
+ p.h3i2 {
+ padding-left: 2em;
+ text-indent: 1em;
+ }
+ p.h3i3 {
+ padding-left: 3em;
+ text-indent: 0em;
+ }
+ p.h3i4 {
+ padding-left: 4em;
+ text-indent: -1em;
+ }
+ p.h3i5 {
+ padding-left: 5em;
+ text-indent: -2em;
+ }
+ p.h3i6 {
+ padding-left: 6em;
+ text-indent: -3em;
+ }
+ p.h3i7 {
+ padding-left: 7em;
+ text-indent: -4em;
+ }
+ p.h3i8 {
+ padding-left: 8em;
+ text-indent: -5em;
+ }
+ p.h3i9 {
+ padding-left: 9em;
+ text-indent: -6em;
+ }
+
+ p.h4i0 {
+ padding-left: 0em;
+ text-indent: 4em;
+ }
+ p.h4i1 {
+ padding-left: 1em;
+ text-indent: 3em;
+ }
+ p.h4i2 {
+ padding-left: 2em;
+ text-indent: 2em;
+ }
+ p.h4i3 {
+ padding-left: 3em;
+ text-indent: 1em;
+ }
+ p.h4i4 {
+ padding-left: 4em;
+ text-indent: 0em;
+ }
+ p.h4i5 {
+ padding-left: 5em;
+ text-indent: -1em;
+ }
+ p.h4i6 {
+ padding-left: 6em;
+ text-indent: -2em;
+ }
+ p.h4i7 {
+ padding-left: 7em;
+ text-indent: -3em;
+ }
+ p.h4i8 {
+ padding-left: 8em;
+ text-indent: -4em;
+ }
+ p.h4i9 {
+ padding-left: 9em;
+ text-indent: -5em;
+ }
+
+ p.h5i0 {
+ padding-left: 0em;
+ text-indent: 5em;
+ }
+ p.h5i1 {
+ padding-left: 1em;
+ text-indent: 4em;
+ }
+ p.h5i2 {
+ padding-left: 2em;
+ text-indent: 3em;
+ }
+ p.h5i3 {
+ padding-left: 3em;
+ text-indent: 2em;
+ }
+ p.h5i4 {
+ padding-left: 4em;
+ text-indent: 1em;
+ }
+ p.h5i5 {
+ padding-left: 5em;
+ text-indent: 0em;
+ }
+ p.h5i6 {
+ padding-left: 6em;
+ text-indent: -1em;
+ }
+ p.h5i7 {
+ padding-left: 7em;
+ text-indent: -2em;
+ }
+ p.h5i8 {
+ padding-left: 8em;
+ text-indent: -3em;
+ }
+ p.h5i9 {
+ padding-left: 9em;
+ text-indent: -4em;
+ }
+
+ p.h6i0 {
+ padding-left: 0em;
+ text-indent: 6em;
+ }
+ p.h6i1 {
+ padding-left: 1em;
+ text-indent: 5em;
+ }
+ p.h6i2 {
+ padding-left: 2em;
+ text-indent: 4em;
+ }
+ p.h6i3 {
+ padding-left: 3em;
+ text-indent: 3em;
+ }
+ p.h6i4 {
+ padding-left: 4em;
+ text-indent: 2em;
+ }
+ p.h6i5 {
+ padding-left: 5em;
+ text-indent: 1em;
+ }
+ p.h6i6 {
+ padding-left: 6em;
+ text-indent: 0em;
+ }
+ p.h6i7 {
+ padding-left: 7em;
+ text-indent: -1em;
+ }
+ p.h6i8 {
+ padding-left: 8em;
+ text-indent: -2em;
+ }
+ p.h6i9 {
+ padding-left: 9em;
+ text-indent: -3em;
+ }
+
+ p.h7i0 {
+ padding-left: 0em;
+ text-indent: 7em;
+ }
+ p.h7i1 {
+ padding-left: 1em;
+ text-indent: 6em;
+ }
+ p.h7i2 {
+ padding-left: 2em;
+ text-indent: 5em;
+ }
+ p.h7i3 {
+ padding-left: 3em;
+ text-indent: 4em;
+ }
+ p.h7i4 {
+ padding-left: 4em;
+ text-indent: 3em;
+ }
+ p.h7i5 {
+ padding-left: 5em;
+ text-indent: 2em;
+ }
+ p.h7i6 {
+ padding-left: 6em;
+ text-indent: 1em;
+ }
+ p.h7i7 {
+ padding-left: 7em;
+ text-indent: 0em;
+ }
+ p.h7i8 {
+ padding-left: 8em;
+ text-indent: -1em;
+ }
+ p.h7i9 {
+ padding-left: 9em;
+ text-indent: -2em;
+ }
+
+ p.h8i0 {
+ padding-left: 0em;
+ text-indent: 8em;
+ }
+ p.h8i1 {
+ padding-left: 1em;
+ text-indent: 7em;
+ }
+ p.h8i2 {
+ padding-left: 2em;
+ text-indent: 6em;
+ }
+ p.h8i3 {
+ padding-left: 3em;
+ text-indent: 5em;
+ }
+ p.h8i4 {
+ padding-left: 4em;
+ text-indent: 4em;
+ }
+ p.h8i5 {
+ padding-left: 5em;
+ text-indent: 3em;
+ }
+ p.h8i6 {
+ padding-left: 6em;
+ text-indent: 2em;
+ }
+ p.h8i7 {
+ padding-left: 7em;
+ text-indent: 1em;
+ }
+ p.h8i8 {
+ padding-left: 8em;
+ text-indent: 0em;
+ }
+ p.h8i9 {
+ padding-left: 9em;
+ text-indent: -1em;
+ }
+
+ p.h9i0 {
+ padding-left: 0em;
+ text-indent: 9em;
+ }
+ p.h9i1 {
+ padding-left: 1em;
+ text-indent: 8em;
+ }
+ p.h9i2 {
+ padding-left: 2em;
+ text-indent: 7em;
+ }
+ p.h9i3 {
+ padding-left: 3em;
+ text-indent: 6em;
+ }
+ p.h9i4 {
+ padding-left: 4em;
+ text-indent: 5em;
+ }
+ p.h9i5 {
+ padding-left: 5em;
+ text-indent: 4em;
+ }
+ p.h9i6 {
+ padding-left: 6em;
+ text-indent: 3em;
+ }
+ p.h9i7 {
+ padding-left: 7em;
+ text-indent: 2em;
+ }
+ p.h9i8 {
+ padding-left: 8em;
+ text-indent: 1em;
+ }
+ p.h9i9 {
+ padding-left: 9em;
+ text-indent: 0em;
+ }
+
+ p.it0 {
+ margin-left: 0em;
+ margin-top: 6px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it1 {
+ margin-left: 1em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it2 {
+ margin-left: 2em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it3 {
+ margin-left: 3em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it4 {
+ margin-left: 4em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it5 {
+ margin-left: 5em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it6 {
+ margin-left: 6em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it7 {
+ margin-left: 7em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it8 {
+ margin-left: 8em;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ line-height: 100%;
+ }
+ p.it9 {
+ margin-left: 9em;
+ margin-bottom: 0px;
+ margin-top: 0px;
+ line-height: 100%;
+ }
+
+ p.block { }
+
+ p.group { }
+
+ p.alt { }
+
+ p.verse {
+ margin-bottom: 6px;
+ }
+
+ p.code {
+ font-family: inconsolata, andale mono, courier new, courier, monospace;
+ font-size: 90%;
+ text-align: left;
+ background-color: #eeeeee;
+ }
+
+ p.caption {
+ text-align: left;
+ font-size: 80%;
+ display: inline;
+ }
+
+ p.endnote {
+ font-size: 96%;
+ line-height: 120%;
+ text-align: left;
+ margin-right: 15mm;
+ }
+ p.endnote_indent {
+ font-size: 96%;
+ line-height: 120%;
+ text-align: left;
+ margin-left: 2em;
+ margin-right: 15mm;
+ }
+
+ p.center {
+ text-align: center;
+ }
+ p.bold {
+ font-weight: bold;
+ }
+ p.bold_left {
+ font-weight: bold;
+ text-align: left;
+ }
+ p.centerbold {
+ text-align: center;
+ font-weight: bold;
+ }
+ p.em {
+ font-weight: bold;
+ font-style: normal;
+ background: #fff3b6;
+ }
+
+ p.small {
+ font-size: 80%;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-right: 6px;
+ text-align: left;
+ }
+
+ .tiny, .tiny_left, .tiny_right, .tiny_center {
+ font-size: 10px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ color: #777777;
+ margin-right: 6px;
+ text-align: left;
+ }
+ p.tiny { }
+ p.tiny_left {
+ margin-left: 0px;
+ margin-right: 0px;
+ text-align: left;
+ }
+ p.tiny_right {
+ margin-right: 1em;
+ text-align: right;
+ }
+ p.tiny_center {
+ margin-left: 0px;
+ margin-right: 0px;
+ text-align: center;
+ }
+
+ p.pane, p.pane_title, p.pane_blurb, p.pane_link, p.pane_indent {
+ font-size: 80%;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-left: 2mm;
+ margin-right: 4px;
+ text-align: left;
+ }
+ p.pane { }
+ p.pane_title {
+ font-weight: bold;
+ margin-bottom: 0px;
+ }
+ p.pane_blurb {
+ font-size: 10px;
+ margin-bottom: 0px;
+ }
+ p.pane_link {
+ font-size: 10px;
+ margin-bottom: 0px;
+ margin-left: 4mm;
+ }
+ p.pane_indent {
+ font-size: 10px;
+ margin-bottom: 0px;
+ margin-left: 4mm;
+ }
+
+ p.concordance_word {
+ line-height: 150%;
+ font-weight: bold;
+ display: inline;
+ margin-top: 4px;
+ margin-bottom: 1px;
+ }
+ p.concordance_count {
+ font-size: 80%;
+ color: #777777;
+ display: inline;
+ margin-left: 0em;
+ }
+ p.concordance_object {
+ font-size: 80%;
+ line-height: 120%;
+ text-align: left;
+ margin-left: 3em;
+ margin-top: 1px;
+ margin-bottom: 3px;
+ }
+ p.book_index_lev1 {
+ line-height: 100%;
+ margin-top: 4px;
+ margin-bottom: 1px;
+ }
+ p.book_index_lev2 {
+ line-height: 100%;
+ text-align: left;
+ margin-left: 3em;
+ margin-top: 1px;
+ margin-bottom: 3px;
+ }
+
+ p.quickref {
+ font-size: 10px;
+ font-style: italic;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ color: #777777;
+ margin-right: 5px;
+ text-align: left;
+ }
+ p.bigref {
+ font-size: 11px;
+ font-weight: bold;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ color: #777777;
+ margin-right: 5px;
+ text-align: center;
+ }
+
+ p.letter {
+ font-weight: bold;
+ font-size: 80%;
+ margin-left: 0em;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ margin-right: 6px;
+ text-align: left;
+ color: white;
+ background: #880000;
+ }
+
+ tt {
+ font-family: inconsolata, andale mono, courier new, courier, monospace;
+ background-color: #eeeeee;
+ }
+
+ label.ocn {
+ width: 2%;
+ float: right;
+ top: 0;
+ font-size: 10px;
+ margin-top: 0px;
+ margin-bottom: 5px;
+ color: #777777;
+ margin-right: 5px;
+ text-align: right;
+ background-color: #ffffff;
+ }
+
+ table { }
+ tr { }
+ th,td {
+ vertical-align: top;
+ text-align: left;
+ }
+ th {
+ font-weight: bold;
+ }
+
+ p.left,th.left,td.left {
+ text-align: left;
+ }
+ p.small_left,th.small_left,td.small_left {
+ text-align: left;
+ font-size: 80%;
+ }
+ p.right,th.right,td.right {
+ text-align: right;
+ }
+
+ #horizontal_links {
+ background: #eeeeee;
+ margin-left: 5%;
+ margin-right: 5%;
+ }
+ #horizontal {
+ margin: 0;
+ padding: 0 0 0 10px;
+ border-top: 1px solid #000077;
+ border-bottom: 1px solid #000077;
+ }
+ #horizontal li {
+ margin: 0 0 0 0;
+ padding: 0 16px 0 0;
+ display: inline;
+ list-style-type: none;
+ text-align: left;
+ background: none;
+ }
+ #horizontal a {
+ line-height: 12px;
+ margin: 0 0 0 0;
+ text-decoration: none;
+ color: #000077;
+ }
+ #horizontal a.active, #horizontal a:hover {
+ border-bottom: 2px solid #777777;
+ padding-bottom: 2px;
+ color: #000077;
+ }
+ #horizontal a:hover {
+ color: #000077;
+ }
+
+ #document_versions {
+ position: absolute;
+ top: 10mm;
+ right: 2%;
+ width: 12%;
+ float: right;
+ }
+
+ #vertical_links {
+ position: absolute;
+ top: 10mm;
+ right: 0px;
+ width: 20%;
+ background: #dddddd;
+ float: right;
+ }
+ #vertical {
+ padding: 0 12px 0px 0px;
+ margin-left: 2%;
+ margin-right: 2%;
+ }
+ #vertical li {
+ display: block;
+ list-style-type: none;
+ }
+ #vertical a {
+ line-height: 12px;
+ text-decoration: none;
+ color: #000077;
+ }
+ #vertical a.active, #vertical a:hover {
+ border-bottom: 2px solid #777777;
+ padding-bottom: 2px;
+ color: #000077;
+ }
+
+ ul, li {
+ list-style-type: none;
+ list-style: none;
+ padding-left: 20px;
+ display: block;
+ font-family: verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman;
+ font-weight: normal;
+ line-height: 150%;
+ text-align: left;
+ text-indent: 0mm;
+ margin-left: 1em;
+ margin-right: 2em;
+ margin-top: 3px;
+ margin-bottom: 3px;
+ }
+
+ li {
+ background: url(../image/bullet_09.png) no-repeat 0px 6px;
+ }
+
+ ul {
+ }
+ li.bullet { margin-left: 1em; }
+ li.i1 { margin-left: 2em; }
+ li.i2 { margin-left: 3em; }
+ li.i3 { margin-left: 4em; }
+ li.i4 { margin-left: 5em; }
+ li.i5 { margin-left: 6em; }
+ li.i6 { margin-left: 7em; }
+ li.i7 { margin-left: 8em; }
+ li.i8 { margin-left: 9em; }
+ li.i9 { margin-left: 10em; }
+
+ li.doc, li.ref, li.refcenter {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-right: 0px;
+ font-size: 8px;
+ font-style: normal;
+ text-align: left;
+ }
+ li.doc {
+ background: url(../image/bullet_09.png) no-repeat 0px 6px;
+ padding-left: 16px;
+ margin-left: 10px;
+ margin-right: 0px;
+ }
+ li.ref {
+ background: none;
+ padding-left: 0;
+ margin-left: 0;
+ color: #777777;
+ }
+ li.refcenter {
+ background: url(../image/bullet_09.png) no-repeat 0px 6px;
+ padding-left: 20px;
+ margin-left: 10%;
+ font-size: 9px;
+ color: #777777;
+ text-align: center;
+ }
+ li.refbold {
+ list-style-type: none;
+ padding-left: 16px;
+ margin-left: 0;
+ margin-right: 10mm;
+ font-weight: bold;
+ }
+
+ h0, h1, h2, h3, h4, h5, h6 {
+ font-weight: bold;
+ line-height: 120%;
+ text-align: left;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ h4.norm, h5.norm, h6.norm {
+ margin-top: 10px;
+ margin-bottom: 0px;
+ }
+ h1.center, h2.center, h3.center, h4.center, h5.center, h6.center {
+ text-align: center;
+ }
+ h1 { font-size: 120%; }
+ h2 { font-size: 115%; }
+ h3 { font-size: 110%; }
+ h4 { font-size: 105%; }
+ h5 { font-size: 100%; }
+ h6 { font-size: 100%; }
+ h0 { font-size: 80%; }
+
+ h1.i {margin-left: 2em;}
+ h2.i {margin-left: 3em;}
+ h3.i {margin-left: 4em;}
+ h4.i {margin-left: 5em;}
+ h5.i {margin-left: 6em;}
+ h6.i {margin-left: 7em;}
+ h7.i {margin-left: 8em;}
+ h8.i {margin-left: 9em;}
+ h9.i {margin-left: 10em;}
+ h1.top_band {
+ display: inline;
+ text-align: left;
+ margin-top: 0;
+ margin-left: 4mm;
+ text-indent: 0mm;
+ font-weight: bold;
+ font-size: 120%;
+ }
+ h2.top_band_tiny {
+ font-size: 10px;
+ font-weight: normal;
+ margin-top: 0px;
+ margin-left: 4mm;
+ text-indent: 0mm;
+ margin-bottom: 0px;
+ color: #777777;
+ margin-left: 140px;
+ margin-right: 0px;
+ text-align: left;
+ }
+
+ p.top_band {
+ display: inline;
+ text-align: left;
+ margin-top: 0;
+ margin-left: 140px;
+ text-indent: 0mm;
+ font-weight: bold;
+ font-size: 120%;
+ }
+ p.top_band_tiny {
+ font-size: 10px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ color: #777777;
+ margin-left: 140px;
+ margin-right: 0px;
+ text-align: left;
+ }
+ p.top_band_image {
+ float: left;
+ display: inline;
+ text-align: left;
+ margin-top: 0;
+ margin-left: 1mm;
+ text-indent: 0mm;
+ margin-right: 1mm;
+ }
+
+ .banner, .subbanner {
+ font-weight: bold;
+ text-align: center;
+ margin-left: 10mm;
+ margin-right: 15mm;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+
+ h1.banner {
+ font-size: 120%;
+ }
+ h1.subbanner {
+ font-size: 115%;
+ }
+ h2.banner {
+ font-size: 110%;
+ }
+ h3.banner {
+ color: #990000;
+ font-size: 105%;
+ }
+ h4.banner {
+ color: #ff0000;
+ font-size: 100%;
+ }
+ h5.banner {
+ }
+ h6.banner {
+ }
+
+ .toc {
+ font-weight: normal;
+ margin-top: 6px;
+ margin-bottom: 6px;
+ }
+ h1.toc {
+ margin-left: 1em;
+ font-size: 115%;
+ line-height: 150%;
+ }
+ h2.toc {
+ margin-left: 2em;
+ font-size: 110%;
+ line-height: 140%;
+ }
+ h3.toc {
+ margin-left: 3em;
+ font-size: 105%;
+ line-height: 120%;
+ }
+ h4.toc {
+ margin-left: 4em;
+ font-size: 100%;
+ line-height: 120%;
+ }
+ h5.toc {
+ margin-left: 5em;
+ font-size: 95%;
+ line-height: 110%;
+ }
+ h6.toc {
+ margin-left: 6em;
+ font-size: 90%;
+ line-height: 110%;
+ }
+
+ .microtoc {
+ margin-top: 2px;
+ margin-bottom: 2px;
+ }
+
+ h1.microtoc {
+ margin-left: 0mm;
+ font-size: 115%;
+ }
+ h2.microtoc {
+ margin-left: 5mm;
+ font-size: 110%;
+ }
+ h3.microtoc {
+ margin-left: 10mm;
+ font-size: 105%;
+ }
+ h4.microtoc {
+ margin-left: 15mm;
+ font-weight: normal;
+ font-size: 100%;
+ }
+ h5.microtoc {
+ margin-left: 20mm;
+ font-weight: normal;
+ font-size: 95%;
+ }
+ h6.microtoc {
+ margin-left: 25mm;
+ font-weight: normal;
+ font-size: 90%;
+ }
+
+ .subtoc {
+ margin-right: 34%;
+ font-weight: normal;
+ }
+ h5.subtoc {
+ margin-left: 2em;
+ font-size: 80%;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ }
+ h6.subtoc {
+ margin-left: 3em;
+ font-size: 75%;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+
+ div.substance {
+ width: 100%;
+ background-color: #ffffff;
+ }
+ div.ocn {
+ width: 5%;
+ float: right;
+ top: 0;
+ background-color: #ffffff;
+ }
+ div.endnote {
+ width: 95%;
+ background-color: #fffffff;
+ }
+ div.toc {
+ position: absolute;
+ float: left;
+ margin: 0;
+ padding: 0;
+ padding-top: 0.5em;
+ border: 0;
+ width: 13em;
+ background-color: #eeeeee;
+ margin-right:1em;
+ }
+ div.summary {
+ margin: 0;
+ padding: 0;
+ border-left: 13em solid #eeeeee;
+ padding-left: 1em;
+ background-color: #eeeeee;
+ }
+ div.content, div.main_column {
+ margin: 0;
+ padding: 0;
+ border-left: 13em solid #ffffff;
+ padding-left: 1em;
+ padding-right: 1em;
+ }
+ div.content0, div.main_column0 {
+ margin: 0;
+ padding: 0;
+ border-left: 0% solid #ffffff;
+ padding-left: 5%;
+ }
+ div.scroll {
+ margin: 0;
+ padding: 0;
+ padding-left: 1em;
+ padding-right: 1em;
+ }
+ div.content:after {
+ content:' ';
+ clear:both;
+ display:block;
+ height:0;
+ overflow:hidden
+ }
+ div.footer {
+ clear:left;
+ padding: 0.5em;
+ font-size: 80%;
+ margin: 0;
+ }
+ div.toc ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ }
+ div.toc li ul a, li ul span.currentlink
+ {
+ font-weight: normal;
+ font-size: 90%;
+ padding-left: 2em;
+ background-color: #eeeeee;
+ }
+ div.toc a, span.currentlink{
+ display:block;
+ text-decoration: none;
+ padding-left: 0.5em;
+ color: #0000aa;
+ }
+ hr {
+ width: 90%;
+ }
+
+ span.currentlink {
+ text-decoration: none;
+ background-color: #aaaaf9;
+ }
+
+ div.toc a:visited {
+ color: #0000aa;
+ }
+ div.toc a:hover {
+ color: #000000;
+ background-color: #f9f9aa;
+ }
+
+ .minitoc {
+ font-weight: normal;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ }
+ h1.minitoc, h2.minitoc, h3.minitoc {
+ margin-left: 0em;
+ font-weight: bold;
+ text-align: left;
+ font-size: 90%;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ }
+ h4.minitoc {
+ margin-left: 0em;
+ font-size: 90%;
+ }
+ h5.minitoc {
+ margin-left: 1em;
+ font-size: 85%;
+ }
+ h6.minitoc {
+ margin-left: 2em;
+ font-size: 85%;
+ }
+ h0.minitoc {
+ margin-left: 0em;
+ font-size: 90%;
+ }
+
+ h1.c, h2.c, h3.c, h4.c, h5.c, h6.c, p.c {
+ text-align: center
+ }
+ h1.red, h2.red, h3.red, h4.red, h5.red, h6.red {
+ text-align: center;
+ color: #ff0000;
+ margin-left: 5mm;
+ text-indent: 5mm;
+ margin-top: 30px;
+ margin-bottom: 20px;
+ margin-right: 15mm;
+ }
+ h1.ruby, h2.ruby, h3.ruby, h4.ruby, h5.ruby, h6.ruby {
+ text-align: center;
+ color: #990000;
+ margin-left: 5mm;
+ text-indent: 5mm;
+ margin-top: 30px;
+ margin-bottom: 20px;
+ margin-right: 15mm;
+ }
+WOK
+ end
+ def homepage #stylesheet for index, home page
+<<WOK
+ body {color: black; background: #{@vz.color_white}; margin:10px 10px 0px 10px; padding:0px;}
+ p { line-height: 1.5 }
+ a:link {color: #{@vz.color_blue_ink}; text-decoration: none; }
+ a:visited {color: #{@vz.color_blue_ink}; text-decoration: none; }
+ a:hover {color: #{@vz.color_black}; text-decoration: underline; background-color: #{@vz.color_yellow_light};}
+ a:active {color: #{@vz.color_blue_ink}; text-decoration: underline;}
+ #banner {
+ background:#{@vz.color_white};
+ }
+ #column_left {
+ width:25%;
+ float:left;
+ background:#b9d4dd;
+ padding-bottom:10px;
+ }
+ #column_center {
+ width:55%;
+ float:left;
+ background:#{@vz.color_white};
+ padding-bottom:10px;
+ }
+ #column_right {
+ width:20%;
+ float:left;
+ background:#b9d4dd;
+ padding-bottom:10px;
+ }
+ p,h1,pre {
+ font-family: #{fonts};
+ margin:0px 10px 10px 10px;
+ }
+ h1 {
+ font-size:14px;
+ padding-top:10px;
+ }
+ #column_right p { font-size:12px}
+ #banner h1 { margin:0px; padding:10px}
+WOK
+ end
+ def xhtml #stylesheet for xhtml
+<<WOK
+/* SiSU css xhtml & sax.xml default style */
+ document {
+ display: block;
+ margin-left: 0mm;
+ margin-right: 0mm;
+ }
+ head {
+ display: block;
+ margin-bottom: 20px;
+ background-color: #dddddd;
+ }
+ metadata {
+ display: block;
+ }
+ meta {
+ display: inline;
+ line-height: 1;
+ font-size: 10px;
+ color: #990000;
+ margin-right: 2mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+
+ }
+ data,md {
+ display: inline;
+ line-height: 1;
+ font-size: 10px;
+ color: #000099;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ source_control {
+ display: block;
+ }
+ dc {
+ display: block;
+ font-family: #{fonts};
+ color: blue;
+ background-color: #dddddd;
+ font-weight: normal;
+ text-align: justify;
+ font-size: xx-small;
+ line-height: 120%;
+ margin-left: 5%;
+ margin-right: 5mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ sc {
+ display: inline;
+ color: green;
+ }
+ keywords,copyright {
+ display: block;
+ font-family: #{fonts};
+ color: red;
+ background-color: #dddddd;
+ font-weight: normal;
+ text-align: justify;
+ font-size: xx-small;
+ line-height: 120%;
+ margin-left: 5%;
+ margin-right: 5mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ table {
+ margin-left: 5%;
+ display: block;
+ }
+ tr {
+ display: block;
+ }
+ th,td {
+ display: inline;
+ }
+ body {
+ color: black;
+ background: #ffffff;
+ }
+ a:link {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:visited {
+ color: #003399;
+ text-decoration: none;
+ /* background-color: #e3ecef; */
+ }
+ a:hover {
+ color: #000000;
+ text-decoration: underline;
+ background-color: #fff3b6;
+ }
+ a:hover IMG {
+ background-color: #ffffff;
+ }
+ a:active {
+ color: #003399;
+ text-decoration: underline;
+ }
+ object {
+ display: block;
+ margin-left: 2mm;
+ margin-right: 2mm;
+ margin-top: 4px;
+ margin-bottom: 8px;
+ }
+ text,text[class|="norm"] {
+ display: block;
+ font-family: #{fonts};
+ text-align: justify;
+ font-weight: normal;
+ font-size: 100%;
+ line-height: 150%;
+ margin-left: 5%;
+ margin-right: 5%;
+ margin-top: 2px;
+ margin-bottom: 0px;
+ }
+ text[class|="h1"] {
+ font-size: 120%;
+ font-weight: bold;
+ text-align: left;
+ line-height: 120%;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ text[class|="h2"] {
+ font-weight: bold;
+ font-size: 110%;
+ text-align: left;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ text[class|="h3"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="h4"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="h5"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="h6"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="indent0"] {
+ padding-left: 10%;
+ }
+ text[class|="indent1"] {
+ padding-left: 15%;
+ }
+ text[class|="indent2"] {
+ padding-left: 20%;
+ }
+ text[class|="indent3"] {
+ padding-left: 25%;
+ }
+ text[class|="indent4"] {
+ padding-left: 30%;
+ }
+ text[class|="indent5"] {
+ padding-left: 35%;
+ }
+ text[class|="indent6"] {
+ padding-left: 40%;
+ }
+ text[class|="indent7"] {
+ padding-left: 45%;
+ }
+ text[class|="indent8"] {
+ padding-left: 50%;
+ }
+ text[class|="indent9"] {
+ padding-left: 55%;
+ }
+
+ text[class|="hang0_indent0"] {
+ padding-left: 10%;
+ text-indent: 0%;
+ }
+ text[class|="hang0_indent1"] {
+ padding-left: 15%;
+ text-indent: -5%;
+ }
+ text[class|="hang0_indent2"] {
+ padding-left: 20%;
+ text-indent: -10%;
+ }
+ text[class|="hang0_indent3"] {
+ padding-left: 25%;
+ text-indent: -15%;
+ }
+ text[class|="hang0_indent4"] {
+ padding-left: 30%;
+ text-indent: -20%;
+ }
+ text[class|="hang0_indent5"] {
+ padding-left: 35%;
+ text-indent: -25%;
+ }
+ text[class|="hang0_indent6"] {
+ padding-left: 40%;
+ text-indent: -30%;
+ }
+ text[class|="hang0_indent7"] {
+ padding-left: 45%;
+ text-indent: -35%;
+ }
+ text[class|="hang0_indent8"] {
+ padding-left: 50%;
+ text-indent: -40%;
+ }
+ text[class|="hang0_indent9"] {
+ padding-left: 55%;
+ text-indent: -45%;
+ }
+
+ text[class|="hang1_indent0"] {
+ padding-left: 10%;
+ text-indent: 5%;
+ }
+ text[class|="hang1_indent1"] {
+ padding-left: 15%;
+ text-indent: 0%;
+ }
+ text[class|="hang1_indent2"] {
+ padding-left: 20%;
+ text-indent: -5%;
+ }
+ text[class|="hang1_indent3"] {
+ padding-left: 25%;
+ text-indent: -10%;
+ }
+ text[class|="hang1_indent4"] {
+ padding-left: 30%;
+ text-indent: -15%;
+ }
+ text[class|="hang1_indent5"] {
+ padding-left: 35%;
+ text-indent: -20%;
+ }
+ text[class|="hang1_indent6"] {
+ padding-left: 40%;
+ text-indent: -25%;
+ }
+ text[class|="hang1_indent7"] {
+ padding-left: 45%;
+ text-indent: -30%;
+ }
+ text[class|="hang1_indent8"] {
+ padding-left: 50%;
+ text-indent: -35%;
+ }
+ text[class|="hang1_indent9"] {
+ padding-left: 55%;
+ text-indent: -40%;
+ }
+
+ text[class|="hang2_indent0"] {
+ padding-left: 10%;
+ text-indent: 10%;
+ }
+ text[class|="hang2_indent1"] {
+ padding-left: 15%;
+ text-indent: 5%;
+ }
+ text[class|="hang2_indent2"] {
+ padding-left: 20%;
+ text-indent: 0%;
+ }
+ text[class|="hang2_indent3"] {
+ padding-left: 25%;
+ text-indent: -5%;
+ }
+ text[class|="hang2_indent4"] {
+ padding-left: 30%;
+ text-indent: -10%;
+ }
+ text[class|="hang2_indent5"] {
+ padding-left: 35%;
+ text-indent: -15%;
+ }
+ text[class|="hang2_indent6"] {
+ padding-left: 40%;
+ text-indent: -20%;
+ }
+ text[class|="hang2_indent7"] {
+ padding-left: 45%;
+ text-indent: -25%;
+ }
+ text[class|="hang2_indent8"] {
+ padding-left: 50%;
+ text-indent: -30%;
+ }
+ text[class|="hang2_indent9"] {
+ padding-left: 55%;
+ text-indent: -35%;
+ }
+
+ text[class|="hang3_indent0"] {
+ padding-left: 10%;
+ text-indent: 15%;
+ }
+ text[class|="hang3_indent1"] {
+ padding-left: 15%;
+ text-indent: 10%;
+ }
+ text[class|="hang3_indent2"] {
+ padding-left: 20%;
+ text-indent: 5%;
+ }
+ text[class|="hang3_indent3"] {
+ padding-left: 25%;
+ text-indent: 0%;
+ }
+ text[class|="hang3_indent4"] {
+ padding-left: 30%;
+ text-indent: -5%;
+ }
+ text[class|="hang3_indent5"] {
+ padding-left: 35%;
+ text-indent: -10%;
+ }
+ text[class|="hang3_indent6"] {
+ padding-left: 40%;
+ text-indent: -15%;
+ }
+ text[class|="hang3_indent7"] {
+ padding-left: 45%;
+ text-indent: -20%;
+ }
+ text[class|="hang3_indent8"] {
+ padding-left: 50%;
+ text-indent: -25%;
+ }
+ text[class|="hang3_indent9"] {
+ padding-left: 55%;
+ text-indent: -30%;
+ }
+
+ text[class|="hang4_indent0"] {
+ padding-left: 10%;
+ text-indent: 20%;
+ }
+ text[class|="hang4_indent1"] {
+ padding-left: 15%;
+ text-indent: 15%;
+ }
+ text[class|="hang4_indent2"] {
+ padding-left: 20%;
+ text-indent: 10%;
+ }
+ text[class|="hang4_indent3"] {
+ padding-left: 25%;
+ text-indent: 5%;
+ }
+ text[class|="hang4_indent4"] {
+ padding-left: 30%;
+ text-indent: 0%;
+ }
+ text[class|="hang4_indent5"] {
+ padding-left: 35%;
+ text-indent: -5%;
+ }
+ text[class|="hang4_indent6"] {
+ padding-left: 40%;
+ text-indent: -10%;
+ }
+ text[class|="hang4_indent7"] {
+ padding-left: 45%;
+ text-indent: -15%;
+ }
+ text[class|="hang4_indent8"] {
+ padding-left: 50%;
+ text-indent: -20%;
+ }
+ text[class|="hang4_indent9"] {
+ padding-left: 55%;
+ text-indent: -25%;
+ }
+
+ text[class|="hang5_indent0"] {
+ padding-left: 10%;
+ text-indent: 25%;
+ }
+ text[class|="hang5_indent1"] {
+ padding-left: 15%;
+ text-indent: 20%;
+ }
+ text[class|="hang5_indent2"] {
+ padding-left: 20%;
+ text-indent: 15%;
+ }
+ text[class|="hang5_indent3"] {
+ padding-left: 25%;
+ text-indent: 10%;
+ }
+ text[class|="hang5_indent4"] {
+ padding-left: 30%;
+ text-indent: 5%;
+ }
+ text[class|="hang5_indent5"] {
+ padding-left: 35%;
+ text-indent: 0%;
+ }
+ text[class|="hang5_indent6"] {
+ padding-left: 40%;
+ text-indent: -5%;
+ }
+ text[class|="hang5_indent7"] {
+ padding-left: 45%;
+ text-indent: -10%;
+ }
+ text[class|="hang5_indent8"] {
+ padding-left: 50%;
+ text-indent: -15%;
+ }
+ text[class|="hang5_indent9"] {
+ padding-left: 55%;
+ text-indent: -20%;
+ }
+
+ text[class|="hang6_indent0"] {
+ padding-left: 10%;
+ text-indent: 30%;
+ }
+ text[class|="hang6_indent1"] {
+ padding-left: 15%;
+ text-indent: 25%;
+ }
+ text[class|="hang6_indent2"] {
+ padding-left: 20%;
+ text-indent: 20%;
+ }
+ text[class|="hang6_indent3"] {
+ padding-left: 25%;
+ text-indent: 15%;
+ }
+ text[class|="hang6_indent4"] {
+ padding-left: 30%;
+ text-indent: 10%;
+ }
+ text[class|="hang6_indent5"] {
+ padding-left: 35%;
+ text-indent: 5%;
+ }
+ text[class|="hang6_indent6"] {
+ padding-left: 40%;
+ text-indent: 0%;
+ }
+ text[class|="hang6_indent7"] {
+ padding-left: 45%;
+ text-indent: -5%;
+ }
+ text[class|="hang6_indent8"] {
+ padding-left: 50%;
+ text-indent: -10%;
+ }
+ text[class|="hang6_indent9"] {
+ padding-left: 55%;
+ text-indent: -15%;
+ }
+
+ text[class|="hang7_indent0"] {
+ padding-left: 10%;
+ text-indent: 35%;
+ }
+ text[class|="hang7_indent1"] {
+ padding-left: 15%;
+ text-indent: 30%;
+ }
+ text[class|="hang7_indent2"] {
+ padding-left: 20%;
+ text-indent: 25%;
+ }
+ text[class|="hang7_indent3"] {
+ padding-left: 25%;
+ text-indent: 20%;
+ }
+ text[class|="hang7_indent4"] {
+ padding-left: 30%;
+ text-indent: 15%;
+ }
+ text[class|="hang7_indent5"] {
+ padding-left: 35%;
+ text-indent: 10%;
+ }
+ text[class|="hang7_indent6"] {
+ padding-left: 40%;
+ text-indent: 5%;
+ }
+ text[class|="hang7_indent7"] {
+ padding-left: 45%;
+ text-indent: 0%;
+ }
+ text[class|="hang7_indent8"] {
+ padding-left: 50%;
+ text-indent: -5%;
+ }
+ text[class|="hang7_indent9"] {
+ padding-left: 55%;
+ text-indent: -10%;
+ }
+
+ text[class|="hang8_indent0"] {
+ padding-left: 10%;
+ text-indent: 40%;
+ }
+ text[class|="hang8_indent1"] {
+ padding-left: 15%;
+ text-indent: 35%;
+ }
+ text[class|="hang8_indent2"] {
+ padding-left: 20%;
+ text-indent: 30%;
+ }
+ text[class|="hang8_indent3"] {
+ padding-left: 25%;
+ text-indent: 25%;
+ }
+ text[class|="hang8_indent4"] {
+ padding-left: 30%;
+ text-indent: 20%;
+ }
+ text[class|="hang8_indent5"] {
+ padding-left: 35%;
+ text-indent: 15%;
+ }
+ text[class|="hang8_indent6"] {
+ padding-left: 40%;
+ text-indent: 10%;
+ }
+ text[class|="hang8_indent7"] {
+ padding-left: 45%;
+ text-indent: 5%;
+ }
+ text[class|="hang8_indent8"] {
+ padding-left: 50%;
+ text-indent: 0%;
+ }
+ text[class|="hang8_indent9"] {
+ padding-left: 55%;
+ text-indent: -5%;
+ }
+
+ text[class|="hang9_indent0"] {
+ padding-left: 10%;
+ text-indent: 45%;
+ }
+ text[class|="hang9_indent1"] {
+ padding-left: 15%;
+ text-indent: 40%;
+ }
+ text[class|="hang9_indent2"] {
+ padding-left: 20%;
+ text-indent: 35%;
+ }
+ text[class|="hang9_indent3"] {
+ padding-left: 25%;
+ text-indent: 30%;
+ }
+ text[class|="hang9_indent4"] {
+ padding-left: 30%;
+ text-indent: 25%;
+ }
+ text[class|="hang9_indent5"] {
+ padding-left: 35%;
+ text-indent: 20%;
+ }
+ text[class|="hang9_indent6"] {
+ padding-left: 40%;
+ text-indent: 15%;
+ }
+ text[class|="hang9_indent7"] {
+ padding-left: 45%;
+ text-indent: 10%;
+ }
+ text[class|="hang9_indent8"] {
+ padding-left: 50%;
+ text-indent: 5%;
+ }
+ text[class|="hang9_indent9"] {
+ padding-left: 55%;
+ text-indent: 0%;
+ }
+
+ text[class|="indent_bullet"] {
+ text-indent: 0%;
+ }
+ text[class|="indent_bullet0"] {
+ text-indent: 0%;
+ }
+ text[class|="indent_bullet1"] {
+ text-indent: 10%;
+ }
+ text[class|="indent_bullet2"] {
+ text-indent: 15%;
+ }
+ text[class|="indent_bullet3"] {
+ text-indent: 20%;
+ }
+ text[class|="indent_bullet4"] {
+ text-indent: 25%;
+ }
+ text[class|="indent_bullet5"] {
+ text-indent: 30%;
+ }
+ text[class|="indent_bullet6"] {
+ text-indent: 35%;
+ }
+ text[class|="indent_bullet7"] {
+ text-indent: 40%;
+ }
+ text[class|="indent_bullet8"] {
+ text-indent: 45%;
+ }
+ text[class|="indent_bullet9"] {
+ text-indent: 50%;
+ }
+ text[class|="verse"], text[class|="block"], text[class|="group"], text[class|="code"] {
+ text-align: left;
+ }
+ ocn {
+ display: block;
+ text-align: right;
+ vertical-align: super;
+ color: #990000;
+ font-size: xx-small;
+ margin-right: 0mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ named {
+ display: block;
+ margin-right: 0mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ endnote {
+ display: block;
+ font-size: small;
+ font-family: #{fonts};
+ font-weight: normal;
+ line-height: 150%;
+ text-align: justify;
+ margin-left: 10%;
+ margin-right: 5%;
+ margin-top: 4px;
+ margin-bottom: 0px;
+ }
+ endnote_indent {
+ display: block;
+ font-size: small;
+ font-family: #{fonts};
+ font-weight: normal;
+ line-height: 150%;
+ text-align: justify;
+ margin-left: 15%;
+ margin-right: 5%;
+ margin-top: 4px;
+ margin-bottom: 0px;
+ }
+ en {
+ font-size: xx-small;
+ vertical-align: super;
+ }
+ i { font-style: italic; }
+ b { font-style: bold; }
+ u { text-decoration: underline; }
+ br { display: block; }
+
+ text[class|="table"] {
+ display: table;
+ /* display: block; */
+ text-align: left;
+ }
+
+ table {
+ margin-left: 0%;
+ display: block;
+ /* display: table; */
+ width: 100%;
+ }
+ tr {
+ display: block;
+ /* display: table-row; */
+ }
+ th, td {
+ display: table-cell;
+ /* display: inline; */
+ vertical-align: top;
+ }
+ p.left, th.left, td.left {
+ text-align: left;
+ }
+ p.small_left, th.small_left, td.small_left {
+ text-align: left;
+ font-size: 80%;
+ }
+ p.right, th.right, td.right {
+ text-align: right;
+ }
+
+ .svg_outer {
+ display: block;
+ margin-bottom: 0;
+ margin-left: 0;
+ margin-right: 0;
+ margin-top: 0;
+ padding-bottom: 0;
+ padding-left: 0;
+ padding-right: 0;
+ padding-top: 0;
+ text-align: left;
+ }
+ .svg_inner {
+ display: block;
+ text-align: center;
+ }
+WOK
+ end
+ def xml_sax #stylesheet for xml sax
+ xhtml
+ end
+ def xml_dom #sylesheet for xml dom, work on, starts from copy of css_xhtml
+<<WOK
+/* SiSU css dom.xml default style */
+ document {
+ display: block;
+ margin-left: 0mm;
+ margin-right: 0mm;
+ }
+ head {
+ display: block;
+ margin-bottom: 20px;
+ background-color: #dddddd;
+ }
+ header {
+ display: block;
+ }
+ meta {
+ display: inline;
+ line-height: 1;
+ font-size: 10px;
+ color: #990000;
+ margin-right: 2mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+
+ }
+ md {
+ display: inline;
+ line-height: 1;
+ font-size: 10px;
+ color: #000099;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ source_control {
+ display: block;
+ }
+ dc {
+ display: block;
+ font-family: #{fonts};
+ color: blue;
+ background-color: #dddddd;
+ font-weight: normal;
+ text-align: justify;
+ font-size: xx-small;
+ line-height: 120%;
+ margin-left: 5%;
+ margin-right: 5mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ sc {
+ display: inline;
+ color: green;
+ }
+ keywords,copyright {
+ display: block;
+ font-family: #{fonts};
+ color: red;
+ background-color: #dddddd;
+ font-weight: normal;
+ text-align: justify;
+ font-size: xx-small;
+ line-height: 120%;
+ margin-left: 5%;
+ margin-right: 5mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ body {
+ color: black;
+ background: #ffffff;
+ }
+ a:link {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:visited {
+ color: #003399;
+ text-decoration: none;
+ /* background-color: #e3ecef; */
+ }
+ a:hover {
+ color: #000000;
+ text-decoration: underline;
+ background-color: #fff3b6;
+ }
+ a:hover IMG {
+ background-color: #ffffff;
+ }
+ a:active {
+ color: #003399;
+ text-decoration: underline;
+ }
+ object {
+ display: block;
+ margin-left: 2mm;
+ margin-right: 2mm;
+ margin-top: 4px;
+ margin-bottom: 8px;
+ }
+ heading {
+ font-weight: bold;
+ }
+ contents {
+ font-weight: normal;
+ }
+ text {
+ display: block;
+ font-family: #{fonts};
+ text-align: justify;
+ font-size: 100%;
+ line-height: 150%;
+ margin-left: 5%;
+ margin-right: 5%;
+ margin-top: 2px;
+ margin-bottom: 0px;
+ }
+ text[class|="norm"] {
+ font-weight: normal;
+ }
+ text[class|="h1"] {
+ font-size: 120%;
+ font-weight: bold;
+ text-align: left;
+ line-height: 120%;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ text[class|="h2"] {
+ font-weight: bold;
+ font-size: 110%;
+ text-align: left;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ text[class|="h3"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="h4"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="h5"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="h6"] {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ text[class|="indent0"] {
+ padding-left: 10%;
+ }
+ text[class|="indent1"] {
+ padding-left: 15%;
+ }
+ text[class|="indent2"] {
+ padding-left: 20%;
+ }
+ text[class|="indent3"] {
+ padding-left: 25%;
+ }
+ text[class|="indent4"] {
+ padding-left: 30%;
+ }
+ text[class|="indent5"] {
+ padding-left: 35%;
+ }
+ text[class|="indent6"] {
+ padding-left: 40%;
+ }
+ text[class|="indent7"] {
+ padding-left: 45%;
+ }
+ text[class|="indent8"] {
+ padding-left: 50%;
+ }
+ text[class|="indent9"] {
+ padding-left: 55%;
+ }
+
+ text[class|="hang0_indent0"] {
+ padding-left: 10%;
+ text-indent: 0%;
+ }
+ text[class|="hang0_indent1"] {
+ padding-left: 15%;
+ text-indent: -5%;
+ }
+ text[class|="hang0_indent2"] {
+ padding-left: 20%;
+ text-indent: -10%;
+ }
+ text[class|="hang0_indent3"] {
+ padding-left: 25%;
+ text-indent: -15%;
+ }
+ text[class|="hang0_indent4"] {
+ padding-left: 30%;
+ text-indent: -20%;
+ }
+ text[class|="hang0_indent5"] {
+ padding-left: 35%;
+ text-indent: -25%;
+ }
+ text[class|="hang0_indent6"] {
+ padding-left: 40%;
+ text-indent: -30%;
+ }
+ text[class|="hang0_indent7"] {
+ padding-left: 45%;
+ text-indent: -35%;
+ }
+ text[class|="hang0_indent8"] {
+ padding-left: 50%;
+ text-indent: -40%;
+ }
+ text[class|="hang0_indent9"] {
+ padding-left: 55%;
+ text-indent: -45%;
+ }
+
+ text[class|="hang1_indent0"] {
+ padding-left: 10%;
+ text-indent: 5%;
+ }
+ text[class|="hang1_indent1"] {
+ padding-left: 15%;
+ text-indent: 0%;
+ }
+ text[class|="hang1_indent2"] {
+ padding-left: 20%;
+ text-indent: -5%;
+ }
+ text[class|="hang1_indent3"] {
+ padding-left: 25%;
+ text-indent: -10%;
+ }
+ text[class|="hang1_indent4"] {
+ padding-left: 30%;
+ text-indent: -15%;
+ }
+ text[class|="hang1_indent5"] {
+ padding-left: 35%;
+ text-indent: -20%;
+ }
+ text[class|="hang1_indent6"] {
+ padding-left: 40%;
+ text-indent: -25%;
+ }
+ text[class|="hang1_indent7"] {
+ padding-left: 45%;
+ text-indent: -30%;
+ }
+ text[class|="hang1_indent8"] {
+ padding-left: 50%;
+ text-indent: -35%;
+ }
+ text[class|="hang1_indent9"] {
+ padding-left: 55%;
+ text-indent: -40%;
+ }
+
+ text[class|="hang2_indent0"] {
+ padding-left: 10%;
+ text-indent: 10%;
+ }
+ text[class|="hang2_indent1"] {
+ padding-left: 15%;
+ text-indent: 5%;
+ }
+ text[class|="hang2_indent2"] {
+ padding-left: 20%;
+ text-indent: 0%;
+ }
+ text[class|="hang2_indent3"] {
+ padding-left: 25%;
+ text-indent: -5%;
+ }
+ text[class|="hang2_indent4"] {
+ padding-left: 30%;
+ text-indent: -10%;
+ }
+ text[class|="hang2_indent5"] {
+ padding-left: 35%;
+ text-indent: -15%;
+ }
+ text[class|="hang2_indent6"] {
+ padding-left: 40%;
+ text-indent: -20%;
+ }
+ text[class|="hang2_indent7"] {
+ padding-left: 45%;
+ text-indent: -25%;
+ }
+ text[class|="hang2_indent8"] {
+ padding-left: 50%;
+ text-indent: -30%;
+ }
+ text[class|="hang2_indent9"] {
+ padding-left: 55%;
+ text-indent: -35%;
+ }
+
+ text[class|="hang3_indent0"] {
+ padding-left: 10%;
+ text-indent: 15%;
+ }
+ text[class|="hang3_indent1"] {
+ padding-left: 15%;
+ text-indent: 10%;
+ }
+ text[class|="hang3_indent2"] {
+ padding-left: 20%;
+ text-indent: 5%;
+ }
+ text[class|="hang3_indent3"] {
+ padding-left: 25%;
+ text-indent: 0%;
+ }
+ text[class|="hang3_indent4"] {
+ padding-left: 30%;
+ text-indent: -5%;
+ }
+ text[class|="hang3_indent5"] {
+ padding-left: 35%;
+ text-indent: -10%;
+ }
+ text[class|="hang3_indent6"] {
+ padding-left: 40%;
+ text-indent: -15%;
+ }
+ text[class|="hang3_indent7"] {
+ padding-left: 45%;
+ text-indent: -20%;
+ }
+ text[class|="hang3_indent8"] {
+ padding-left: 50%;
+ text-indent: -25%;
+ }
+ text[class|="hang3_indent9"] {
+ padding-left: 55%;
+ text-indent: -30%;
+ }
+
+ text[class|="hang4_indent0"] {
+ padding-left: 10%;
+ text-indent: 20%;
+ }
+ text[class|="hang4_indent1"] {
+ padding-left: 15%;
+ text-indent: 15%;
+ }
+ text[class|="hang4_indent2"] {
+ padding-left: 20%;
+ text-indent: 10%;
+ }
+ text[class|="hang4_indent3"] {
+ padding-left: 25%;
+ text-indent: 5%;
+ }
+ text[class|="hang4_indent4"] {
+ padding-left: 30%;
+ text-indent: 0%;
+ }
+ text[class|="hang4_indent5"] {
+ padding-left: 35%;
+ text-indent: -5%;
+ }
+ text[class|="hang4_indent6"] {
+ padding-left: 40%;
+ text-indent: -10%;
+ }
+ text[class|="hang4_indent7"] {
+ padding-left: 45%;
+ text-indent: -15%;
+ }
+ text[class|="hang4_indent8"] {
+ padding-left: 50%;
+ text-indent: -20%;
+ }
+ text[class|="hang4_indent9"] {
+ padding-left: 55%;
+ text-indent: -25%;
+ }
+
+ text[class|="hang5_indent0"] {
+ padding-left: 10%;
+ text-indent: 25%;
+ }
+ text[class|="hang5_indent1"] {
+ padding-left: 15%;
+ text-indent: 20%;
+ }
+ text[class|="hang5_indent2"] {
+ padding-left: 20%;
+ text-indent: 15%;
+ }
+ text[class|="hang5_indent3"] {
+ padding-left: 25%;
+ text-indent: 10%;
+ }
+ text[class|="hang5_indent4"] {
+ padding-left: 30%;
+ text-indent: 5%;
+ }
+ text[class|="hang5_indent5"] {
+ padding-left: 35%;
+ text-indent: 0%;
+ }
+ text[class|="hang5_indent6"] {
+ padding-left: 40%;
+ text-indent: -5%;
+ }
+ text[class|="hang5_indent7"] {
+ padding-left: 45%;
+ text-indent: -10%;
+ }
+ text[class|="hang5_indent8"] {
+ padding-left: 50%;
+ text-indent: -15%;
+ }
+ text[class|="hang5_indent9"] {
+ padding-left: 55%;
+ text-indent: -20%;
+ }
+
+ text[class|="hang6_indent0"] {
+ padding-left: 10%;
+ text-indent: 30%;
+ }
+ text[class|="hang6_indent1"] {
+ padding-left: 15%;
+ text-indent: 25%;
+ }
+ text[class|="hang6_indent2"] {
+ padding-left: 20%;
+ text-indent: 20%;
+ }
+ text[class|="hang6_indent3"] {
+ padding-left: 25%;
+ text-indent: 15%;
+ }
+ text[class|="hang6_indent4"] {
+ padding-left: 30%;
+ text-indent: 10%;
+ }
+ text[class|="hang6_indent5"] {
+ padding-left: 35%;
+ text-indent: 5%;
+ }
+ text[class|="hang6_indent6"] {
+ padding-left: 40%;
+ text-indent: 0%;
+ }
+ text[class|="hang6_indent7"] {
+ padding-left: 45%;
+ text-indent: -5%;
+ }
+ text[class|="hang6_indent8"] {
+ padding-left: 50%;
+ text-indent: -10%;
+ }
+ text[class|="hang6_indent9"] {
+ padding-left: 55%;
+ text-indent: -15%;
+ }
+
+ text[class|="hang7_indent0"] {
+ padding-left: 10%;
+ text-indent: 35%;
+ }
+ text[class|="hang7_indent1"] {
+ padding-left: 15%;
+ text-indent: 30%;
+ }
+ text[class|="hang7_indent2"] {
+ padding-left: 20%;
+ text-indent: 25%;
+ }
+ text[class|="hang7_indent3"] {
+ padding-left: 25%;
+ text-indent: 20%;
+ }
+ text[class|="hang7_indent4"] {
+ padding-left: 30%;
+ text-indent: 15%;
+ }
+ text[class|="hang7_indent5"] {
+ padding-left: 35%;
+ text-indent: 10%;
+ }
+ text[class|="hang7_indent6"] {
+ padding-left: 40%;
+ text-indent: 5%;
+ }
+ text[class|="hang7_indent7"] {
+ padding-left: 45%;
+ text-indent: 0%;
+ }
+ text[class|="hang7_indent8"] {
+ padding-left: 50%;
+ text-indent: -5%;
+ }
+ text[class|="hang7_indent9"] {
+ padding-left: 55%;
+ text-indent: -10%;
+ }
+
+ text[class|="hang8_indent0"] {
+ padding-left: 10%;
+ text-indent: 40%;
+ }
+ text[class|="hang8_indent1"] {
+ padding-left: 15%;
+ text-indent: 35%;
+ }
+ text[class|="hang8_indent2"] {
+ padding-left: 20%;
+ text-indent: 30%;
+ }
+ text[class|="hang8_indent3"] {
+ padding-left: 25%;
+ text-indent: 25%;
+ }
+ text[class|="hang8_indent4"] {
+ padding-left: 30%;
+ text-indent: 20%;
+ }
+ text[class|="hang8_indent5"] {
+ padding-left: 35%;
+ text-indent: 15%;
+ }
+ text[class|="hang8_indent6"] {
+ padding-left: 40%;
+ text-indent: 10%;
+ }
+ text[class|="hang8_indent7"] {
+ padding-left: 45%;
+ text-indent: 5%;
+ }
+ text[class|="hang8_indent8"] {
+ padding-left: 50%;
+ text-indent: 0%;
+ }
+ text[class|="hang8_indent9"] {
+ padding-left: 55%;
+ text-indent: -5%;
+ }
+
+ text[class|="hang9_indent0"] {
+ padding-left: 10%;
+ text-indent: 45%;
+ }
+ text[class|="hang9_indent1"] {
+ padding-left: 15%;
+ text-indent: 40%;
+ }
+ text[class|="hang9_indent2"] {
+ padding-left: 20%;
+ text-indent: 35%;
+ }
+ text[class|="hang9_indent3"] {
+ padding-left: 25%;
+ text-indent: 30%;
+ }
+ text[class|="hang9_indent4"] {
+ padding-left: 30%;
+ text-indent: 25%;
+ }
+ text[class|="hang9_indent5"] {
+ padding-left: 35%;
+ text-indent: 20%;
+ }
+ text[class|="hang9_indent6"] {
+ padding-left: 40%;
+ text-indent: 15%;
+ }
+ text[class|="hang9_indent7"] {
+ padding-left: 45%;
+ text-indent: 10%;
+ }
+ text[class|="hang9_indent8"] {
+ padding-left: 50%;
+ text-indent: 5%;
+ }
+ text[class|="hang9_indent9"] {
+ padding-left: 55%;
+ text-indent: 0%;
+ }
+
+ text[class|="indent_bullet"] {
+ text-indent: 0%;
+ }
+ text[class|="indent_bullet0"] {
+ text-indent: 0%;
+ }
+ text[class|="indent_bullet1"] {
+ padding-left: 10%;
+ }
+ text[class|="indent_bullet2"] {
+ padding-left: 15%;
+ }
+ text[class|="indent_bullet3"] {
+ padding-left: 20%;
+ }
+ text[class|="indent_bullet4"] {
+ padding-left: 25%;
+ }
+ text[class|="indent_bullet5"] {
+ padding-left: 30%;
+ }
+ text[class|="indent_bullet6"] {
+ padding-left: 35%;
+ }
+ text[class|="indent_bullet7"] {
+ padding-left: 40%;
+ }
+ text[class|="indent_bullet8"] {
+ padding-left: 45%;
+ }
+ text[class|="indent_bullet9"] {
+ padding-left: 50%;
+ }
+ text[class|="verse"], text[class|="block"], text[class|="group"], text[class|="code"] {
+ text-align: left;
+ }
+ table {
+ margin-left: 5%;
+ display: block;
+ }
+ tr {
+ display: block;
+ }
+ th, td {
+ display: inline;
+ }
+ nametag {
+ display: none;
+ }
+ number {
+ padding-right: 4px;
+ }
+ ocn {
+ font-weight: normal;
+ display: block;
+ text-align: right;
+ vertical-align: super;
+ color: #990000;
+ font-size: xx-small;
+ margin-right: 0mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ endnote {
+ display: block;
+ font-size: small;
+ font-family: #{fonts};
+ font-weight: normal;
+ line-height: 150%;
+ text-align: justify;
+ margin-left: 10%;
+ margin-right: 5%;
+ margin-top: 4px;
+ margin-bottom: 0px;
+ }
+ endnote_indent {
+ display: block;
+ font-size: small;
+ font-family: #{fonts};
+ font-weight: normal;
+ line-height: 150%;
+ text-align: justify;
+ margin-left: 15%;
+ margin-right: 5%;
+ margin-top: 4px;
+ margin-bottom: 0px;
+ }
+ en {
+ font-size: xx-small;
+ vertical-align: super;
+ }
+ i { font-style: italic; }
+ b { font-style: bold; }
+ u { text-decoration: underline; }
+ br { display: block; }
+WOK
+ end
+ def docbook_xml #stylesheet for docbook
+<<WOK
+/* SiSU css docbook.xml default style */
+ book {
+ display: block;
+ margin-left: 0mm;
+ margin-right: 0mm;
+ }
+ bookinfo {
+ display: block;
+ margin-bottom: 20px;
+ background-color: #dddddd;
+ }
+ source_control {
+ display: block;
+ }
+ dc,sc {
+ display: block;
+ font-family: #{fonts};
+ color: blue;
+ background-color: #dddddd;
+ font-weight: normal;
+ text-align: justify;
+ font-size: xx-small;
+ line-height: 120%;
+ margin-left: 5%;
+ margin-right: 5mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ sc {
+ color: green;
+ }
+ keywords,copyright {
+ display: block;
+ font-family: #{fonts};
+ color: red;
+ background-color: #dddddd;
+ font-weight: normal;
+ text-align: justify;
+ font-size: xx-small;
+ line-height: 120%;
+ margin-left: 5%;
+ margin-right: 5mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ body {
+ color: black;
+ background: #ffffff;
+ }
+ a:link {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:visited {
+ color: #003399;
+ text-decoration: none;
+ /* background-color: #e3ecef; */
+ }
+ a:hover {
+ color: #000000;
+ text-decoration: underline;
+ background-color: #fff3b6;
+ }
+ a:hover IMG {
+ background-color: #ffffff;
+ }
+ a:active {
+ color: #003399;
+ text-decoration: underline;
+ }
+ object {
+ display: block;
+ margin-left: 2mm;
+ margin-right: 2mm;
+ margin-top: 4px;
+ margin-bottom: 8px;
+ }
+ part {
+ display: block;
+ /* font-weight: bold; */
+ }
+ contents {
+ font-weight: normal;
+ }
+ para {
+ display: block;
+ font-family: #{fonts};
+ /* font-weight: normal; */
+ text-align: justify;
+ font-size: 100%;
+ line-height: 150%;
+ margin-left: 5%;
+ margin-right: 5%;
+ margin-top: 2px;
+ margin-bottom: 0px;
+ }
+ para.verse, para.block, para.group, para.code {
+ text-align: left;
+ }
+ para.norm {
+ font-family: #{fonts};
+ font-weight: normal;
+ }
+ para.h1, title {
+ display: block;
+ font-family: #{fonts};
+ font-size: 120%;
+ font-weight: bold;
+ text-align: left;
+ line-height: 120%;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ para.h2 {
+ font-weight: bold;
+ font-size: 110%;
+ text-align: left;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ para.h3 {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ para.h4 {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ para.h5 {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ para.h6 {
+ font-size: 110%;
+ font-weight: bold;
+ text-align: left;
+ }
+ table {
+ margin-left: 5%;
+ display: block;
+ }
+ tr {
+ display: block;
+ }
+ th, td {
+ display: inline;
+ }
+ nametag {
+ display: none;
+ }
+ number {
+ padding-right: 4px;
+ }
+ ocn {
+ font-weight: normal;
+ display: block;
+ text-align: right;
+ vertical-align: super;
+ color: #990000;
+ font-size: xx-small;
+ margin-right: 0mm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ }
+ endnote {
+ display: block;
+ font-size: small;
+ font-family: #{fonts};
+ font-weight: normal;
+ line-height: 150%;
+ text-align: justify;
+ margin-left: 10%;
+ margin-right: 5%;
+ margin-top: 4px;
+ margin-bottom: 0px;
+ }
+ endnote_indent {
+ display: block;
+ font-size: small;
+ font-family: #{fonts};
+ font-weight: normal;
+ line-height: 150%;
+ text-align: justify;
+ margin-left: 15%;
+ margin-right: 5%;
+ margin-top: 4px;
+ margin-bottom: 0px;
+ }
+ en {
+ font-size: xx-small;
+ vertical-align: super;
+ }
+ i { font-style: italic; }
+ b { font-style: bold; }
+ u { text-decoration: underline; }
+ br { display: block; }
+WOK
+ end
+ def css_xhtml_p #stylesheet for ...
+<<WOK
+ body {
+ color: black;
+ background: #ffffff;
+ }
+ a:link {
+ color: #003399;
+ text-decoration: none;
+ }
+ a:visited {
+ color: #003399;
+ text-decoration: none;
+ /* background-color: #e3ecef; */
+ }
+ a:hover {
+ color: #000000;
+ text-decoration: underline;
+ background-color: #fff3b6;
+ }
+ a:hover IMG {
+ background-color: #ffffff;
+ }
+ a:active {
+ color: #003399;
+ text-decoration: underline;
+ }
+ object {
+ display: block;
+ margin-top: 3px;
+ margin-bottom: 3px;
+ margin-right: 5mm;
+ }
+ p {
+ display: block;
+ font-family: #{fonts};
+ font-size: 100%;
+ font-weight: normal;
+ line-height: 150%;
+ text-align: justify;
+ margin-left: 10mm;
+ margin-top: 3px;
+ margin-bottom: 0px;
+ margin-right: 5mm
+ }
+ p.norm { }
+ p.endnote {
+ font-size: 100%;
+ margin-left: 20%;
+ text-indent: 5%
+ }
+ p.endnote_indent {
+ font-size: 100%;
+ margin-left: 25%;
+ text-indent: 5%
+ }
+ p.h1 {
+ font-family: #{fonts};
+ font-weight: bold;
+ line-height: 120%;
+ margin-left: 10mm;
+ margin-right: 10mm;
+ text-align: left;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ p.h2 {
+ font-weight: bold;
+ font-size: 110%;
+ margin-left: 10mm;
+ margin-right: 15mm;
+ text-align: left;
+ margin-top: 20px;
+ margin-bottom: 10px;
+ }
+ p.h3 {
+ font-size: 150%;
+ font-weight: bold;
+ text-align: left;
+ }
+ p.h4 {
+ font-size: 150%;
+ font-weight: bold;
+ text-align: left;
+ }
+ p.h5 {
+ font-size: 150%;
+ font-weight: bold;
+ text-align: left;
+ }
+ p.h6 {
+ font-size: 150%;
+ font-weight: bold;
+ text-align: left;
+ }
+ ocn {
+ display: block;
+ text-align: right;
+ vertical-align: super;
+ color: #990000;
+ font-size: xx-small;
+ margin-top: 0px;
+ margin-bottom: 6px;
+ }
+ en {
+ font-size: xx-small;
+ vertical-align: super;
+ }
+ i { font-style: italic; }
+ b { font-style: bold; }
+ u { text-decoration: underline; }
+ br { display: block; }
+WOK
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_columns.rb b/lib/sisu/v6/db_columns.rb
new file mode 100644
index 0000000..1b21cf9
--- /dev/null
+++ b/lib/sisu/v6/db_columns.rb
@@ -0,0 +1,2002 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_columns.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbColumns
+ require_relative 'sysenv' # sysenv.rb
+ require_relative 'db_sqltxt' # db_sqltxt.rb
+ class Columns < SiSU_DbText::Prepare
+ def initialize(md=nil)
+ @md=md
+ @db=SiSU_Env::InfoDb.new #watch
+ @lang ||=SiSU_i18n::Languages.new
+ if defined? md.opt.mod \
+ and md.opt.mod.inspect=~/import|update/ \
+ and FileTest.exist?(md.fns)
+ txt_arr=IO.readlines(md.fns,'')
+ src=txt_arr.join("\n")
+ if @db.share_source?
+ @sisutxt=special_character_escape(src)
+ else @sisutxt=''
+ end
+ @fulltext=clean_searchable_text(txt_arr)
+ else @sisutxt,@fulltext='',''
+ end
+ end
+#% structures
+ #def column_define
+ # def varchar(name,size)
+ # "#{name} VARCHAR(#{size}) NULL,"
+ # end
+ #end
+=begin
+#% title
+@title:
+ :subtitle:
+ :short:
+ :edition:
+ :language:
+ :note:
+=end
+ def column
+ def title # DublinCore 1 - title
+ def name
+ 'title'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_title]}) NOT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata full document title [DC1]';}
+ end
+ def tuple
+ if defined? @md.title.full \
+ and @md.title.full=~/\S+/
+ txt=@md.title.full
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def title_main
+ def name
+ 'title_main'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_title_part]}) NOT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata main document title';}
+ end
+ def tuple
+ if defined? @md.title.main \
+ and @md.title.main=~/\S+/
+ txt=@md.title.main
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def title_sub
+ def name
+ 'title_sub'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_title_part]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document subtitle';}
+ end
+ def tuple
+ if defined? @md.title.sub \
+ and @md.title.sub=~/\S+/
+ txt=@md.title.sub
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def title_short
+ def name
+ 'title_short'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_title_part]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document short title if any';}
+ end
+ def tuple
+ if defined? @md.title.short \
+ and @md.title.short=~/\S+/
+ txt=@md.title.short
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def title_edition
+ def name
+ 'title_edition'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_title_edition]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document edition (version)';}
+ end
+ def tuple
+ if defined? @md.title.edition \
+ and @md.title.edition=~/\S+/
+ txt=@md.title.edition
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def title_note
+ def name
+ 'title_note'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes associated with title';}
+ end
+ def tuple
+ if defined? @md.title.note \
+ and @md.title.note=~/\S+/
+ txt=@md.title.note
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def title_language
+ def name
+ 'title_language'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document language [DC12]';}
+ end
+ def tuple
+ if @lang.list[@md.opt.lng][:n]
+ txt=@lang.list[@md.opt.lng][:n]
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def title_language_char # consider
+ def name
+ 'title_language_char'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language_char]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document language iso code';}
+ end
+ def tuple
+ if defined? @md.opt.lng \
+ and @md.opt.lng=~/\S+/
+ txt=@md.opt.lng
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% creator
+@creator:
+ :author:
+ :editor:
+ :contributor:
+ :illustrator:
+ :photographer:
+ :translator:
+ :prepared_by:
+ :digitized_by:
+ :audio:
+ :video:
+=end
+ def creator_author # DublinCore 2 - creator/author (author)
+ def name
+ 'creator_author'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document author (creator) [DC2]';}
+ end
+ def tuple
+ if defined? @md.creator.author_detail \
+ and @md.creator.author_detail.is_a?(Array) \
+ and @md.creator.author_detail.length > 0
+ txt=''
+ @md.creator.author_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_author_honorific # consider
+ def name
+ 'creator_author_hon'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_creator_misc_short]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document author honorific (title e.g, Ms. Dr. Prof.)';}
+ end
+ def tuple
+ if defined? @md.creator.author_hon \
+ and @md.creator.author_hon=~/\S+/
+ txt=@md.creator.author_hon
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_author_nationality # consider
+ def name
+ 'creator_author_nationality'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_creator_misc_short]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata nationality of document author (creator)';}
+ end
+ def tuple
+ if defined? @md.creator.author_nationality_detail \
+ and @md.creator.author_nationality=~/\S+/
+ txt=@md.creator.author_nationality_detail
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_editor
+ def name
+ 'creator_editor'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document editor name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.editor_detail \
+ and @md.creator.editor_detail.is_a?(Array) \
+ and @md.creator.editor_detail.length > 0
+ txt=@md.creator.editor_detail #dc
+ txt=''
+ @md.creator.editor_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_contributor # DublinCore 6 - contributor
+ def name
+ 'creator_contributor'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document contributor name(s) [DC6]';}
+ end
+ def tuple
+ if defined? @md.creator.contributor_detail \
+ and @md.creator.contributor_detail.is_a?(Array) \
+ and @md.creator.contributor_detail.length > 0
+ txt=@md.creator.contributor_detail #dc
+ txt=''
+ @md.creator.contributor_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_illustrator
+ def name
+ 'creator_illustrator'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document illustrator name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.illustrator_detail \
+ and @md.creator.illustrator_detail.is_a?(Array) \
+ and @md.creator.illustrator_detail.length > 0
+ txt=@md.creator.illustrator_detail
+ txt=''
+ @md.creator.illustrator_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_photographer
+ def name
+ 'creator_photographer'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document photographer name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.photographer_detail \
+ and @md.creator.photographer_detail.is_a?(Array) \
+ and @md.creator.photographer_detail.length > 0
+ txt=@md.creator.photographer_detail
+ txt=''
+ @md.creator.photographer_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_translator
+ def name
+ 'creator_translator'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document translator name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.translator_detail \
+ and @md.creator.translator_detail.is_a?(Array) \
+ and @md.creator.translator_detail.length > 0
+ txt=''
+ @md.creator.translator_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_prepared_by
+ def name
+ 'creator_prepared_by'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document prepared by name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.prepared_by_detail \
+ and @md.creator.prepared_by_detail.is_a?(Array) \
+ and @md.creator.prepared_by_detail.length > 0
+ txt=@md.creator.prepared_by_detail
+ txt=''
+ @md.creator.prepared_by_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_digitized_by
+ def name
+ 'creator_digitized_by'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document digitized by name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.digitized_by_detail \
+ and @md.creator.digitized_by_detail.is_a?(Array) \
+ and @md.creator.digitized_by_detail.length > 0
+ txt=@md.creator.digitized_by_detail
+ txt=''
+ @md.creator.digitized_by_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_audio
+ def name
+ 'creator_audio'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document audio by name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.audio_detail \
+ and @md.creator.audio_detail.is_a?(Array) \
+ and @md.creator.audio_detail.length > 0
+ txt=@md.creator.audio_detail
+ txt=''
+ @md.creator.audio_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def creator_video
+ def name
+ 'creator_video'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document video by name(s)';}
+ end
+ def tuple
+ if defined? @md.creator.video_detail \
+ and @md.creator.video_detail.is_a?(Array) \
+ and @md.creator.video_detail.length > 0
+ txt=''
+ @md.creator.video_detail.each do |h|
+ txt=txt + %{#{h[:the]}, #{h[:others]}; }
+ end
+ txt=txt.gsub(/[;, ]+\s*$/,'')
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% language
+#taken from other fields
+@title:
+ :language:
+@original:
+ :language:
+#not available -->
+#@language:
+# :document:
+# :original:
+=end
+ def language_document
+ def name
+ 'language_document'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document language';}
+ end
+ def tuple
+ if @lang.list[@md.opt.lng][:n]
+ txt=@lang.list[@md.opt.lng][:n]
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def language_document_char
+ def name
+ 'language_document_char'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language_char]}) NOT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document language';}
+ end
+ def tuple
+ #modify check, is now required, SiSUv3d_
+ if defined? @md.opt.lng \
+ and @md.opt.lng=~/\S+/
+ txt=@md.opt.lng
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def language_original
+ def name
+ 'language_original'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata original document/text language';}
+ end
+ def tuple
+ if defined? @md.language.original \
+ and @md.language.original=~/\S+/
+ txt=@md.language.original
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def language_original_char
+ def name
+ 'language_original_char'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language_char]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document language';}
+ end
+ def tuple
+ if defined? @md.language.original_char \
+ and @md.language.original_char=~/\S+/
+ txt=@md.language.original_char
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% date
+@date:
+ :added_to_site:
+ :available:
+ :created:
+ :issued:
+ :modified:
+ :published:
+ :valid:
+ :translated:
+ :original_publication:
+=end
+ def date_added_to_site
+ def name
+ 'date_added_to_site'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ #"#{name} DATE,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date added to site';}
+ end
+ def tuple
+ if defined? @md.date.added_to_site \
+ and @md.date.added_to_site=~/\S+/
+ txt=@md.date.added_to_site
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_available
+ def name
+ 'date_available'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date added to site [DC]';}
+ end
+ def tuple
+ if defined? @md.date.available \
+ and @md.date.available=~/\S+/
+ txt=@md.date.available
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_created
+ def name
+ 'date_created'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date created [DC]';}
+ end
+ def tuple
+ if defined? @md.date.created \
+ and @md.date.created=~/\S+/
+ txt=@md.date.created
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_issued
+ def name
+ 'date_issued'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date issued [DC]';}
+ end
+ def tuple
+ if defined? @md.date.issued \
+ and @md.date.issued=~/\S+/
+ txt=@md.date.issued
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_modified
+ def name
+ 'date_modified'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date modified [DC]';}
+ end
+ def tuple
+ if defined? @md.date.modified \
+ and @md.date.modified=~/\S+/
+ txt=@md.date.modified
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_published
+ def name
+ 'date_published'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date published [DC7]';}
+ end
+ def tuple
+ if defined? @md.date.published \
+ and @md.date.published=~/\S+/
+ txt=@md.date.published
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_valid
+ def name
+ 'date_valid'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date valid [DC]';}
+ end
+ def tuple
+ if defined? @md.date.valid \
+ and @md.date.valid=~/\S+/
+ txt=@md.date.valid
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_translated
+ def name
+ 'date_translated'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date translated';}
+ end
+ def tuple
+ if defined? @md.date.translated \
+ and @md.date.translated=~/\S+/
+ txt=@md.date.translated
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_original_publication
+ def name
+ 'date_original_publication'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_date_text]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date of original publication';}
+ end
+ def tuple
+ if defined? @md.date.original_publication \
+ and @md.date.original_publication=~/\S+/
+ txt=@md.date.original_publication
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def date_generated
+ def name
+ 'date_generated'
+ end
+ def create_column #choose other representation of time
+ "#{name} VARCHAR(30) NULL,"
+ #"#{name} VARCHAR(10) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata date of sisu generation of document, automatically populated';}
+ end
+ def tuple #choose other representation of time
+ if defined? @md.generated \
+ and @md.generated.to_s=~/\S+/
+ txt=@md.generated.to_s
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% publisher
+@publisher:
+=end
+ def publisher
+ def name
+ 'publisher'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document publisher [DC5]';}
+ end
+ def tuple
+ if defined? @md.publisher \
+ and @md.publisher=~/\S+/
+ txt=@md.publisher
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+##% current
+# def current_publisher
+# def name
+# 'current_publisher'
+# end
+# def size
+# 10
+# end
+# def create_column
+# "#{name} VARCHAR(#{current_publisher.size}) NULL,"
+# end
+# def tuple
+# t=if defined? @md.current.publisher \
+# and @md.current.publisher=~/\S+/
+# txt=@md.current.publisher
+# txt=special_character_escape(txt)
+# "'#{txt}', "
+# end
+# end
+# self
+# end
+=begin
+#% original
+@original:
+ :publisher:
+ #:date: #repeated under date
+ :language:
+ :institution:
+ :nationality:
+ :source:
+=end
+ def original_publisher
+ def name
+ 'original_publisher'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document original publisher [DC5]';}
+ end
+ def tuple
+ if defined? @md.original.publisher \
+ and @md.original.publisher=~/\S+/
+ txt=@md.original.publisher
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def original_language
+ def name
+ 'original_language'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document original language';}
+ end
+ def tuple
+ if defined? @md.original.language \
+ and @md.original.language=~/\S+/
+ txt=@md.original.language
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def original_language_char # consider
+ def name
+ 'original_language_char'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language_char]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document original language iso character';}
+ end
+ def tuple
+ if defined? @md.original.language_char \
+ and @md.original.language_char=~/\S+/
+ txt=@md.original.language_char
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def original_source
+ def name
+ 'original_source'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document original source [DC11]';}
+ end
+ def tuple
+ if defined? @md.original.source \
+ and @md.original.source=~/\S+/
+ txt=@md.original.source
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def original_institution
+ def name
+ 'original_institution'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_name]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document original institution';}
+ end
+ def tuple
+ if defined? @md.original.institution \
+ and @md.original.institution=~/\S+/
+ txt=@md.original.institution
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def original_nationality
+ def name
+ 'original_nationality'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_language]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document original nationality';}
+ end
+ def tuple
+ if defined? @md.original.nationality \
+ and @md.original.nationality=~/\S+/
+ txt=@md.original.nationality
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% rights
+@rights:
+ #:copyright: #mapped to :text: used where no other copyrights and included in :all:
+ :text:
+ :translation:
+ :illustrations:
+ :photographs:
+ :preparation:
+ :digitization:
+ :audio:
+ :video:
+ :license:
+ :all:
+=end
+ def rights_all
+ def name
+ 'rights'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata rights associated with document (composite) [DC15]';}
+ end
+ def tuple
+ if defined? @md.rights.all \
+ and @md.rights.all=~/\S+/
+ txt=@md.rights.all
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_text
+ def name
+ 'rights_copyright_text'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_text \
+ and @md.rights.copyright_text=~/\S+/
+ txt=@md.rights.copyright_text
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_translation
+ def name
+ 'rights_copyright_translation'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text translation (if any)';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_translation \
+ and @md.rights.copyright_translation=~/\S+/
+ txt=@md.rights.copyright_translation
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_illustrations
+ def name
+ 'rights_copyright_illustrations'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text illustrations (if any)';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_illustrations \
+ and @md.rights.copyright_illustrations=~/\S+/
+ txt=@md.rights.copyright_illustrations
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_photographs
+ def name
+ 'rights_copyright_photographs'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text photographs (if any)';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_photographs \
+ and @md.rights.copyright_photographs=~/\S+/
+ txt=@md.rights.copyright_photographs
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_preparation
+ def name
+ 'rights_copyright_preparation'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text preparation (if any)';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_preparation \
+ and @md.rights.copyright_preparation=~/\S+/
+ txt=@md.rights.copyright_preparation
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_digitization
+ def name
+ 'rights_copyright_digitization'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text digitization (if any)';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_digitization \
+ and @md.rights.copyright_digitization=~/\S+/
+ txt=@md.rights.copyright_digitization
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_audio
+ def name
+ 'rights_copyright_audio'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text audio (if any)';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_audio \
+ and @md.rights.copyright_audio=~/\S+/
+ txt=@md.rights.copyright_audio
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_copyright_video
+ def name
+ 'rights_copyright_video'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata copyright associated for document text video (if any)';}
+ end
+ def tuple
+ if defined? @md.rights.copyright_video \
+ and @md.rights.copyright_video=~/\S+/
+ txt=@md.rights.copyright_video
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def rights_license
+ def name
+ 'rights_license'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata license granted for use of document if any)';}
+ end
+ def tuple
+ if defined? @md.rights.license \
+ and @md.rights.license=~/\S+/
+ txt=@md.rights.license
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% identifier
+@identifier:
+ :oclc:
+ :isbn:
+=end
+ def identifier_oclc
+ def name
+ 'identifier_oclc'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_library]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata identifier document Online Computer Library Center number';}
+ end
+ def tuple
+ if defined? @md.identifier.oclc \
+ and @md.identifier.oclc=~/\S+/
+ txt=@md.identifier.oclc
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def identifier_isbn
+ def name
+ 'identifier_isbn'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_small]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata identifier document isbn (if any)';}
+ end
+ def tuple
+ if defined? @md.identifier.isbn \
+ and @md.identifier.isbn=~/\S+/
+ txt=@md.identifier.isbn
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% classify
+@classify:
+ :topic_register:
+ :subject:
+ :keywords:
+ :type:
+ :loc:
+ :dewey:
+=end
+ def classify_topic_register
+ def name
+ 'classify_topic_register'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_info_note]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document topic register (semi-structured document subject information)';}
+ end
+ def tuple
+ if defined? @md.classify.topic_register \
+ and @md.classify.topic_register=~/\S+/
+ txt=@md.classify.topic_register
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def classify_subject
+ def name
+ 'classify_subject'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_txt_long]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document subject matter [DC3]';}
+ end
+ def tuple
+ if defined? @md.classify.subject \
+ and @md.classify.subject=~/\S+/
+ txt=@md.classify.subject
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def classify_loc
+ def name
+ 'classify_loc'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_library]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document Library of Congress';}
+ end
+ def tuple
+ if defined? @md.classify.loc \
+ and @md.classify.loc=~/\S+/
+ txt=@md.classify.loc
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def classify_dewey
+ def name
+ 'classify_dewey'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_library]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document Dewey';}
+ end
+ def tuple
+ if defined? @md.classify.dewey \
+ and @md.classify.dewey=~/\S+/
+ txt=@md.classify.dewey
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def classify_keywords
+ def name
+ 'classify_keywords'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_txt_long]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document keywords';}
+ end
+ def tuple
+ if defined? @md.classify.keywords \
+ and @md.classify.keywords=~/\S+/
+ txt=@md.classify.keywords
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% notes
+@notes:
+ :abstract:
+ :description:
+ :comment:
+ :coverage:
+ :relation:
+ :format:
+ :history:
+ :prefix:
+ :prefix_a:
+ :prefix_b:
+ :suffix:
+=end
+ def notes_abstract
+ def name
+ 'notes_abstract'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes abstract';}
+ end
+ def tuple
+ if defined? @md.notes.abstract \
+ and @md.notes.abstract=~/\S+/
+ txt=@md.notes.abstract
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_description
+ def name
+ 'notes_description'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes description [DC4]';}
+ end
+ def tuple
+ if defined? @md.notes.description \
+ and @md.notes.description=~/\S+/
+ txt=@md.notes.description
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_comment
+ def name
+ 'notes_comment'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes comment';}
+ end
+ def tuple
+ if defined? @md.notes.comment \
+ and @md.notes.comment=~/\S+/
+ txt=@md.notes.comment
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_coverage
+ def name
+ 'notes_coverage'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_txt_short]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document coverage [DC14]';}
+ end
+ def tuple
+ if defined? @md.classify.coverage \
+ and @md.classify.coverage=~/\S+/
+ txt=@md.classify.coverage
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_relation
+ def name
+ 'notes_relation'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_txt_short]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document relation [DC13]';}
+ end
+ def tuple
+ if defined? @md.classify.relation \
+ and @md.classify.relation=~/\S+/
+ txt=@md.classify.relation
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_history #check, consider removal
+ def name
+ 'notes_history'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_txt_long]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes history';}
+ end
+ def tuple
+ if defined? @md.notes.history \
+ and @md.notes.history=~/\S+/
+ txt=@md.notes.history
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_type #check
+ def name
+ 'notes_type'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_txt_long]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata notes document type [DC8]';}
+ end
+ def tuple
+ if defined? @md.notes.type \
+ and @md.notes.type=~/\S+/
+ txt=@md.notes.type
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_format
+ def name
+ 'notes_format'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_txt_long]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata classify document format [DC9]';}
+ end
+ def tuple
+ if defined? @md.classify.format \
+ and @md.classify.format=~/\S+/
+ txt=@md.classify.format
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_prefix
+ def name
+ 'notes_prefix'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes prefix';}
+ end
+ def tuple
+ if defined? @md.notes.prefix \
+ and @md.notes.prefix=~/\S+/
+ txt=@md.notes.prefix
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_prefix_a
+ def name
+ 'notes_prefix_a'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes prefix_a';}
+ end
+ def tuple
+ if defined? @md.notes.prefix_a \
+ and @md.notes.prefix_a=~/\S+/
+ txt=@md.notes.prefix_a
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_prefix_b
+ def name
+ 'notes_prefix_b'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes prefix_b';}
+ end
+ def tuple
+ if defined? @md.notes.prefix_b \
+ and @md.notes.prefix_b=~/\S+/
+ txt=@md.notes.prefix_b
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def notes_suffix
+ def name
+ 'notes_suffix'
+ end
+ def create_column # keep text
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document notes suffix';}
+ end
+ def tuple
+ if defined? @md.notes.suffix \
+ and @md.notes.suffix=~/\S+/
+ txt=@md.notes.suffix
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% src
+=end
+ def src_filename
+ def name
+ 'src_filename'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_filename]}) NOT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'sisu markup source text filename';}
+ end
+ def tuple
+ if defined? @md.fns \
+ and @md.fns=~/\S+/
+ txt=@md.fns
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def src_fingerprint
+ def name
+ 'src_fingerprint' #hash/digest, sha256 or md5
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_digest]}) NULL,"
+ #"#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'sisu markup source text fingerprint, hash digest sha256 (or md5)';}
+ end
+ def tuple
+ if defined? @md.dgst \
+ and @md.dgst.is_a?(Array) \
+ and @md.dgst[1]=~/\S+/
+ txt=@md.dgst[1]
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def src_filesize
+ def name
+ 'src_filesize'
+ end
+ def create_column
+ "#{name} VARCHAR(#{Db[:col_filesize]}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'sisu markup source text file size';}
+ end
+ def tuple
+ if defined? @md.filesize \
+ and @md.filesize=~/\S+/
+ txt=@md.filesize
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def src_word_count
+ def name
+ 'src_word_count'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'sisu markup source text word count';}
+ end
+ def tuple
+ if defined? @md.wc_words \
+ and @md.wc_words=~/\S+/
+ txt=@md.wc_words
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def src_txt # consider naming sisusrc
+ def name
+ 'src_text'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'sisu markup source text (if shared)';}
+ end
+ def tuple
+ if @md.opt.mod.inspect=~/import|update/ \
+ and FileTest.exist?(@md.fns)
+ ["#{name}, ","'#{@sisutxt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+=begin
+#% misc
+@links:
+=end
+ def fulltext
+ def name
+ 'fulltext'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'document full text clean, searchable';}
+ end
+ def tuple
+ if @md.opt.mod.inspect=~/import|update/ \
+ and FileTest.exist?(@md.fns)
+ ["#{name}, ","'#{@fulltext}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ def links
+ def name
+ 'links'
+ end
+ def create_column
+ "#{name} TEXT NULL,"
+ #"#{name} VARCHAR(#{links.size}) NULL,"
+ end
+ def column_comment
+ %{COMMENT ON COLUMN metadata_and_text.#{name}
+ IS 'metadata document links';}
+ end
+ def tuple
+ if defined? @md.links \
+ and @md.links=~/\S+/
+ txt=@md.links
+ txt=special_character_escape(txt)
+ ["#{name}, ","'#{txt}', "]
+ else ['','']
+ end
+ end
+ self
+ end
+ self
+ end
+ end
+ class ColumnSize
+ def document_clean # restriction not necessary
+ 60000
+ end
+ def document_body
+ 16000
+ end
+ def document_seg
+ 120
+ end
+ def document_seg_full
+ 120
+ end
+ def endnote_clean # restriction not necessary
+ 60000
+ end
+ def endnote_body
+ 16000
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_create.rb b/lib/sisu/v6/db_create.rb
new file mode 100644
index 0000000..661059a
--- /dev/null
+++ b/lib/sisu/v6/db_create.rb
@@ -0,0 +1,644 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_create.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbCreate
+ require_relative 'db_columns' # db_columns.rb
+ class Create < SiSU_DbColumns::Columns
+ require_relative 'sysenv' # sysenv.rb
+ @@dl=nil
+ def initialize(opt,conn,file,sql_type='pg')
+ @opt,@conn,@file,@sql_type=opt,conn,file,sql_type
+ @cX=SiSU_Screen::Ansi.new(@opt.act[:color_state][:set]).cX
+ @comment=(@sql_type=='pg') \
+ ? (SiSU_DbCreate::Comment.new(@conn,@sql_type))
+ : nil
+ @@dl ||=SiSU_Env::InfoEnv.new.digest.length
+ end
+ def available
+ DBI.available_drivers.each do |driver|
+ puts "Driver: #{driver}"
+ DBI.data_sources(driver).each do |dsn|
+ puts "\tDatasource: #{dsn}"
+ end
+ end
+ end
+ def create_db
+ @env=SiSU_Env::InfoEnv.new(@opt.fns)
+ tell=(@sql_type=='sqlite') \
+ ? SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'Create SQLite db tables in:',%{"#{@file}"})
+ : SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'Create pgSQL db tables in:',%{"#{Db[:name_prefix]}#{@env.path.stub_pwd}"})
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ tell.dark_grey_title_hi
+ end
+ SiSU_Env::SystemCall.new.create_pg_db(@env.path.stub_pwd) if @sql_type=='pg' #watch use of path.stub_pwd instead of stub
+ end
+ def output_dir?
+ dir=SiSU_Env::InfoEnv.new('')
+ if @opt.cmd =~/d/
+ dir.path.webserv_stub_ensure
+ end
+ end
+ def create_table
+ def metadata_and_text
+ if (@opt.act[:verbose_plus][:set]==:on \
+ or @opt.act[:maintenance][:set]==:on)
+ print %{
+ currently using sisu dbi module
+ to be populated from document files
+ create tables metadata_and_text
+ data import through ruby transfer
+ }
+ end
+ create_metadata_and_text=%{
+ CREATE TABLE metadata_and_text (
+ tid BIGINT PRIMARY KEY,
+ /* title */
+ #{column.title.create_column}
+ #{column.title_main.create_column}
+ #{column.title_sub.create_column}
+ #{column.title_short.create_column}
+ #{column.title_edition.create_column}
+ #{column.title_note.create_column}
+ #{column.title_language.create_column}
+ #{column.title_language_char.create_column}
+ /* creator */
+ #{column.creator_author.create_column}
+ #{column.creator_author_honorific.create_column}
+ #{column.creator_author_nationality.create_column}
+ #{column.creator_editor.create_column}
+ #{column.creator_contributor.create_column}
+ #{column.creator_illustrator.create_column}
+ #{column.creator_photographer.create_column}
+ #{column.creator_translator.create_column}
+ #{column.creator_prepared_by.create_column}
+ #{column.creator_digitized_by.create_column}
+ #{column.creator_audio.create_column}
+ #{column.creator_video.create_column}
+ /* language */
+ #{column.language_document.create_column}
+ #{column.language_document_char.create_column}
+ #{column.language_original.create_column}
+ #{column.language_original_char.create_column}
+ /* date */
+ #{column.date_added_to_site.create_column}
+ #{column.date_available.create_column}
+ #{column.date_created.create_column}
+ #{column.date_issued.create_column}
+ #{column.date_modified.create_column}
+ #{column.date_published.create_column}
+ #{column.date_valid.create_column}
+ #{column.date_translated.create_column}
+ #{column.date_original_publication.create_column}
+ #{column.date_generated.create_column}
+ /* publisher */
+ #{column.publisher.create_column}
+ /* original */
+ #{column.original_publisher.create_column}
+ #{column.original_language.create_column}
+ #{column.original_language_char.create_column}
+ #{column.original_source.create_column}
+ #{column.original_institution.create_column}
+ #{column.original_nationality.create_column}
+ /* rights */
+ #{column.rights_all.create_column}
+ #{column.rights_copyright_text.create_column}
+ #{column.rights_copyright_translation.create_column}
+ #{column.rights_copyright_illustrations.create_column}
+ #{column.rights_copyright_photographs.create_column}
+ #{column.rights_copyright_preparation.create_column}
+ #{column.rights_copyright_digitization.create_column}
+ #{column.rights_copyright_audio.create_column}
+ #{column.rights_copyright_video.create_column}
+ #{column.rights_license.create_column}
+ /* classify */
+ #{column.classify_topic_register.create_column}
+ #{column.classify_subject.create_column}
+ #{column.classify_loc.create_column}
+ #{column.classify_dewey.create_column}
+ #{column.classify_keywords.create_column}
+ /* identifier */
+ #{column.identifier_oclc.create_column}
+ #{column.identifier_isbn.create_column}
+ /* notes */
+ #{column.notes_abstract.create_column}
+ #{column.notes_description.create_column}
+ #{column.notes_comment.create_column}
+ #{column.notes_history.create_column}
+ #{column.notes_coverage.create_column}
+ #{column.notes_relation.create_column}
+ /* column.notes_source.create_column */
+ #{column.notes_type.create_column}
+ #{column.notes_format.create_column}
+ #{column.notes_prefix.create_column}
+ #{column.notes_prefix_a.create_column}
+ #{column.notes_prefix_b.create_column}
+ #{column.notes_suffix.create_column}
+ /* src */
+ #{column.src_filename.create_column}
+ #{column.src_fingerprint.create_column}
+ #{column.src_filesize.create_column}
+ #{column.src_word_count.create_column}
+ #{column.src_txt.create_column}
+ /* misc */
+ #{column.fulltext.create_column}
+ #{column.links.create_column.gsub(/,$/,'')}
+/* subj VARCHAR(64) NULL, */
+/* contact VARCHAR(100) NULL, */
+/* information VARCHAR(100) NULL, */
+/* types CHAR(1) NULL, */
+/* writing_focus_nationality VARCHAR(100) NULL, */
+ );
+ }
+ @conn.execute(create_metadata_and_text)
+ @comment.psql.metadata_and_text if @comment
+ end
+ def doc_objects # create doc_objects base
+ if (@opt.act[:verbose_plus][:set]==:on \
+ or @opt.act[:maintenance][:set]==:on)
+ print %{
+ to be populated from documents files
+ create tables doc_objects
+ data import through ruby transfer
+ }
+ end
+ create_doc_objects=%{
+ CREATE TABLE doc_objects (
+ lid BIGINT PRIMARY KEY,
+ metadata_tid BIGINT REFERENCES metadata_and_text,
+ ocn SMALLINT,
+ ocnd VARCHAR(6),
+ ocns VARCHAR(6),
+ clean TEXT NULL,
+ body TEXT NULL,
+ book_idx TEXT NULL,
+ seg VARCHAR(256) NULL,
+ lev_an VARCHAR(1),
+ lev SMALLINT NULL,
+ lev0 SMALLINT,
+ lev1 SMALLINT,
+ lev2 SMALLINT,
+ lev3 SMALLINT,
+ lev4 SMALLINT,
+ lev5 SMALLINT,
+ lev6 SMALLINT,
+ en_a SMALLINT NULL,
+ en_z SMALLINT NULL,
+ en_a_asterisk SMALLINT NULL,
+ en_z_asterisk SMALLINT NULL,
+ en_a_plus SMALLINT NULL,
+ en_z_plus SMALLINT NULL,
+ t_of VARCHAR(16),
+ t_is VARCHAR(16),
+ node VARCHAR(16) NULL,
+ parent VARCHAR(16) NULL,
+ digest_clean CHAR(#{@@dl}),
+ digest_all CHAR(#{@@dl}),
+ types CHAR(1) NULL
+ );
+ }
+ @conn.execute(create_doc_objects)
+ @comment.psql.doc_objects if @comment
+ end
+ def endnotes
+ if (@opt.act[:verbose_plus][:set]==:on \
+ or @opt.act[:maintenance][:set]==:on)
+ print %{
+ to be populated from document files
+ create tables endnotes
+ data import through ruby transfer
+ }
+ end
+ create_endnotes=%{
+ CREATE TABLE endnotes (
+ nid BIGINT PRIMARY KEY,
+ document_lid BIGINT REFERENCES doc_objects,
+ nr SMALLINT,
+ clean TEXT NULL,
+ body TEXT NULL,
+ ocn SMALLINT,
+ ocnd VARCHAR(6),
+ ocns VARCHAR(6),
+ digest_clean CHAR(#{@@dl}),
+ metadata_tid BIGINT REFERENCES metadata_and_text
+ );
+ }
+ @conn.execute(create_endnotes)
+ @comment.psql.endnotes if @comment
+ end
+ def endnotes_asterisk
+ if (@opt.act[:verbose_plus][:set]==:on \
+ or @opt.act[:maintenance][:set]==:on)
+ print %{
+ to be populated from document files
+ create tables endnotes_asterisk
+ data import through ruby transfer
+ }
+ end
+ create_endnotes_asterisk=%{
+ CREATE TABLE endnotes_asterisk (
+ nid BIGINT PRIMARY KEY,
+ document_lid BIGINT REFERENCES doc_objects,
+ nr SMALLINT,
+ clean TEXT NULL,
+ body TEXT NULL,
+ ocn SMALLINT,
+ ocnd VARCHAR(6),
+ ocns VARCHAR(6),
+ digest_clean CHAR(#{@@dl}),
+ metadata_tid BIGINT REFERENCES metadata_and_text
+ );
+ }
+ @conn.execute(create_endnotes_asterisk)
+ @comment.psql.endnotes_asterisk if @comment
+ end
+ def endnotes_plus
+ if (@opt.act[:verbose_plus][:set]==:on \
+ or @opt.act[:maintenance][:set]==:on)
+ print %{
+ to be populated from document files
+ create tables endnotes_plus
+ data import through ruby transfer
+ }
+ end
+ create_endnotes_plus=%{
+ CREATE TABLE endnotes_plus (
+ nid BIGINT PRIMARY KEY,
+ document_lid BIGINT REFERENCES doc_objects,
+ nr SMALLINT,
+ clean TEXT NULL,
+ body TEXT NULL,
+ ocn SMALLINT,
+ ocnd VARCHAR(6),
+ ocns VARCHAR(6),
+ digest_clean CHAR(#{@@dl}),
+ metadata_tid BIGINT REFERENCES metadata_and_text
+ );
+ }
+ @conn.execute(create_endnotes_plus)
+ @comment.psql.endnotes_plus if @comment
+ end
+ def urls # create doc_objects file links mapping
+ if (@opt.act[:verbose_plus][:set]==:on \
+ or @opt.act[:maintenance][:set]==:on)
+ print %{
+ currently using sisu dbi module
+ to be populated from doc_objects files
+ create tables urls
+ data import through ruby transfer
+ }
+ end
+ create_urls=%{
+ CREATE TABLE urls (
+ metadata_tid BIGINT REFERENCES metadata_and_text,
+ plaintext varchar(512),
+ html_toc varchar(512),
+ html_doc varchar(512),
+ xhtml varchar(512),
+ xml_sax varchar(512),
+ xml_dom varchar(512),
+ odf varchar(512),
+ pdf_p varchar(512),
+ pdf_l varchar(512),
+ concordance varchar(512),
+ latex_p varchar(512),
+ latex_l varchar(512),
+ digest varchar(512),
+ manifest varchar(512),
+ markup varchar(512),
+ sisupod varchar(512)
+ );
+ }
+ @conn.execute(create_urls)
+ @comment.psql.urls if @comment
+ end
+ self
+ end
+ end
+ class Comment < SiSU_DbColumns::Columns
+ def initialize(conn,sql_type='pg')
+ @conn=conn
+ if sql_type =~ /pg/; psql
+ end
+ end
+ def psql
+ def conn_execute_array(sql_arr)
+ @conn.transaction do |conn|
+ sql_arr.each do |sql|
+ conn.execute(sql)
+ end
+ end
+ end
+ def metadata_and_text
+ sql_arr=[
+ %{COMMENT ON Table metadata_and_text
+ IS 'contains SiSU metadata and fulltext for search (including source .sst if shared)';},
+ %{COMMENT ON COLUMN metadata_and_text.tid
+ IS 'unique';},
+ %{#{column.title.column_comment}},
+ %{#{column.title_main.column_comment}},
+ %{#{column.title_sub.column_comment}},
+ %{#{column.title_short.column_comment}},
+ %{#{column.title_edition.column_comment}},
+ %{#{column.title_note.column_comment}},
+ %{#{column.title_language.column_comment}},
+ %{#{column.title_language_char.column_comment}},
+ %{#{column.creator_author.column_comment}},
+ %{#{column.creator_author_honorific.column_comment}},
+ %{#{column.creator_author_nationality.column_comment}},
+ %{#{column.creator_editor.column_comment}},
+ %{#{column.creator_contributor.column_comment}},
+ %{#{column.creator_illustrator.column_comment}},
+ %{#{column.creator_photographer.column_comment}},
+ %{#{column.creator_translator.column_comment}},
+ %{#{column.creator_prepared_by.column_comment}},
+ %{#{column.creator_digitized_by.column_comment}},
+ %{#{column.creator_audio.column_comment}},
+ %{#{column.creator_video.column_comment}},
+ %{#{column.language_document.column_comment}},
+ %{#{column.language_document_char.column_comment}},
+ %{#{column.language_original.column_comment}},
+ %{#{column.language_original_char.column_comment}},
+ %{#{column.date_added_to_site.column_comment}},
+ %{#{column.date_available.column_comment}},
+ %{#{column.date_created.column_comment}},
+ %{#{column.date_issued.column_comment}},
+ %{#{column.date_modified.column_comment}},
+ %{#{column.date_published.column_comment}},
+ %{#{column.date_valid.column_comment}},
+ %{#{column.date_translated.column_comment}},
+ %{#{column.date_original_publication.column_comment}},
+ %{#{column.date_generated.column_comment}},
+ %{#{column.publisher.column_comment}},
+ %{#{column.original_publisher.column_comment}},
+ %{#{column.original_language.column_comment}},
+ %{#{column.original_language_char.column_comment}},
+ %{#{column.original_source.column_comment}},
+ %{#{column.original_institution.column_comment}},
+ %{#{column.original_nationality.column_comment}},
+ %{#{column.rights_all.column_comment}},
+ %{#{column.rights_copyright_text.column_comment}},
+ %{#{column.rights_copyright_translation.column_comment}},
+ %{#{column.rights_copyright_illustrations.column_comment}},
+ %{#{column.rights_copyright_photographs.column_comment}},
+ %{#{column.rights_copyright_preparation.column_comment}},
+ %{#{column.rights_copyright_digitization.column_comment}},
+ %{#{column.rights_copyright_audio.column_comment}},
+ %{#{column.rights_copyright_video.column_comment}},
+ %{#{column.rights_license.column_comment}},
+ %{#{column.classify_topic_register.column_comment}},
+ %{#{column.classify_subject.column_comment}},
+ %{#{column.classify_loc.column_comment}},
+ %{#{column.classify_dewey.column_comment}},
+ %{#{column.classify_keywords.column_comment}},
+ %{#{column.identifier_oclc.column_comment}},
+ %{#{column.identifier_isbn.column_comment}},
+ %{#{column.notes_abstract.column_comment}},
+ %{#{column.notes_comment.column_comment}},
+ %{#{column.notes_description.column_comment}},
+ %{#{column.notes_history.column_comment}},
+ %{#{column.notes_coverage.column_comment}},
+ %{#{column.notes_relation.column_comment}},
+ %{#{column.notes_type.column_comment}},
+ %{#{column.notes_format.column_comment}},
+ %{#{column.notes_prefix.column_comment}},
+ %{#{column.notes_prefix_a.column_comment}},
+ %{#{column.notes_prefix_b.column_comment}},
+ %{#{column.notes_suffix.column_comment}},
+ %{#{column.src_filename.column_comment}},
+ %{#{column.src_fingerprint.column_comment}},
+ %{#{column.src_filesize.column_comment}},
+ %{#{column.src_word_count.column_comment}},
+ %{#{column.src_txt.column_comment}},
+ %{#{column.fulltext.column_comment}},
+ %{#{column.links.column_comment}},
+ ]
+ conn_execute_array(sql_arr)
+ end
+ def doc_objects
+ sql_arr=[
+ %{COMMENT ON Table doc_objects
+ IS 'contains searchable text of SiSU document objects';},
+ %{COMMENT ON COLUMN doc_objects.lid
+ IS 'unique';},
+ %{COMMENT ON COLUMN doc_objects.metadata_tid
+ IS 'tie to title in metadata_and_text';},
+ %{COMMENT ON COLUMN doc_objects.lev_an
+ IS 'doc level A-D 1-6';},
+ %{COMMENT ON COLUMN doc_objects.lev
+ IS 'doc level 0-6 \d\~';},
+ %{COMMENT ON COLUMN doc_objects.seg
+ IS 'segment name from level number 4 (lv 1)';},
+ %{COMMENT ON COLUMN doc_objects.ocn
+ IS 'object citation number';},
+ %{COMMENT ON COLUMN doc_objects.en_a
+ IS 'first endnote number in text object (eg. NULL or 34) (used with en_z to create range)';},
+ %{COMMENT ON COLUMN doc_objects.en_z
+ IS 'last endnote number within text object (eg. NULL, 34 or say 47) (used with en_a to create range)';},
+ %{COMMENT ON COLUMN doc_objects.en_a_asterisk
+ IS 'first endnote number in text object (eg. NULL or 34) (used with en_z_asterisk to create range)';},
+ %{COMMENT ON COLUMN doc_objects.en_z_asterisk
+ IS 'last endnote number within text object (eg. NULL, 34 or say 47) (used with en_a_asterisk to create range)';},
+ %{COMMENT ON COLUMN doc_objects.en_a_plus
+ IS 'first endnote number in text object (eg. NULL or 34) (used with en_z_plus to create range)';},
+ %{COMMENT ON COLUMN doc_objects.en_z_plus
+ IS 'last endnote number within text object (eg. NULL, 34 or say 47) (used with en_a_plus to create range)';},
+ %{COMMENT ON COLUMN doc_objects.types
+ IS 'document types seg scroll';},
+ %{COMMENT ON COLUMN doc_objects.clean
+ IS 'text object - substantive text: clean, stripped of markup';},
+ %{COMMENT ON COLUMN doc_objects.body
+ IS 'text object - substantive text: light html markup';},
+ %{COMMENT ON COLUMN doc_objects.book_idx
+ IS 'book index creation information for paragraph, if provided';},
+ %{COMMENT ON COLUMN doc_objects.lev0
+ IS 'document structure, level number 0';},
+ %{COMMENT ON COLUMN doc_objects.lev1
+ IS 'document structure, level number 1';},
+ %{COMMENT ON COLUMN doc_objects.lev2
+ IS 'document structure, level number 2';},
+ %{COMMENT ON COLUMN doc_objects.lev3
+ IS 'document structure, level number 3';},
+ %{COMMENT ON COLUMN doc_objects.lev4
+ IS 'document structure, level number 4';},
+ %{COMMENT ON COLUMN doc_objects.lev5
+ IS 'document structure, level number 5';},
+ %{COMMENT ON COLUMN doc_objects.lev6
+ IS 'document structure, level number 6';},
+ %{COMMENT ON COLUMN doc_objects.t_of
+ IS 'document structure, type of object (object is of)';},
+ %{COMMENT ON COLUMN doc_objects.t_is
+ IS 'document structure, object is';},
+ %{COMMENT ON COLUMN doc_objects.node
+ IS 'document structure, object node if heading';},
+ %{COMMENT ON COLUMN doc_objects.parent
+ IS 'document structure, object parent (is a heading)';}
+ ]
+ conn_execute_array(sql_arr)
+ end
+ def endnotes
+ sql_arr=[
+ %{COMMENT ON Table endnotes
+ IS 'contains searchable text of SiSU documents endnotes';},
+ %{COMMENT ON COLUMN endnotes.nid
+ IS 'unique';},
+ %{COMMENT ON COLUMN endnotes.document_lid
+ IS 'ties to text block from which referenced';},
+ %{COMMENT ON COLUMN endnotes.nr
+ IS 'endnote number <!e_(\d+)!>';},
+ %{COMMENT ON COLUMN endnotes.clean
+ IS 'endnote substantive content, stripped of markup';},
+ %{COMMENT ON COLUMN endnotes.body
+ IS 'endnote substantive content';},
+ %{COMMENT ON COLUMN endnotes.ocn
+ IS 'object citation no# <\~(\d+)> from which endnote is referenced';},
+ %{COMMENT ON COLUMN doc_objects.metadata_tid
+ IS 'tie to title in metadata_and_text - unique for each document';}
+ ]
+ conn_execute_array(sql_arr)
+ end
+ def endnotes_asterisk
+ sql_arr=[
+ %{COMMENT ON Table endnotes_asterisk
+ IS 'contains searchable text of SiSU documents endnotes marked with asterisk';},
+ %{COMMENT ON COLUMN endnotes_asterisk.nid
+ IS 'unique';},
+ %{COMMENT ON COLUMN endnotes_asterisk.document_lid
+ IS 'ties to text block from which referenced';},
+ %{COMMENT ON COLUMN endnotes_asterisk.nr
+ IS 'endnote number <!e_(\d+)!>';},
+ %{COMMENT ON COLUMN endnotes_asterisk.clean
+ IS 'endnote substantive content, stripped of markup';},
+ %{COMMENT ON COLUMN endnotes_asterisk.body
+ IS 'endnote substantive content';},
+ %{COMMENT ON COLUMN endnotes_asterisk.ocn
+ IS 'object citation no# <\~(\d+)> from which endnote is referenced';},
+ %{COMMENT ON COLUMN doc_objects.metadata_tid
+ IS 'tie to title in metadata_and_text - unique for each document';}
+ ]
+ conn_execute_array(sql_arr)
+ end
+ def endnotes_plus
+ sql_arr=[
+ %{COMMENT ON Table endnotes_plus
+ IS 'contains searchable text of SiSU documents endnotes marked with plus';},
+ %{COMMENT ON COLUMN endnotes_plus.nid
+ IS 'unique';},
+ %{COMMENT ON COLUMN endnotes_plus.document_lid
+ IS 'ties to text block from which referenced';},
+ %{COMMENT ON COLUMN endnotes_plus.nr
+ IS 'endnote number <!e_(\d+)!>';},
+ %{COMMENT ON COLUMN endnotes_plus.clean
+ IS 'endnote substantive content, stripped of markup';},
+ %{COMMENT ON COLUMN endnotes_plus.body
+ IS 'endnote substantive content';},
+ %{COMMENT ON COLUMN endnotes_plus.ocn
+ IS 'object citation no# <\~(\d+)> from which endnote is referenced';},
+ %{COMMENT ON COLUMN doc_objects.metadata_tid
+ IS 'tie to title in metadata_and_text - unique for each document';},
+ ]
+ conn_execute_array(sql_arr)
+ end
+ def urls
+ sql_arr=[
+ %{COMMENT ON Table urls
+ IS 'contains base url links to different SiSU output';},
+ %{COMMENT ON COLUMN doc_objects.metadata_tid
+ IS 'tie to title in metadata_and_text - unique for each document, the mapping of rows is one to one';},
+ %{COMMENT ON COLUMN urls.plaintext
+ IS 'plaintext utf-8';},
+ %{COMMENT ON COLUMN urls.html_toc
+ IS 'table of contents for segmented html document';},
+ %{COMMENT ON COLUMN urls.html_doc
+ IS 'html document (scroll)';},
+ %{COMMENT ON COLUMN urls.xhtml
+ IS 'xhtml document (scroll)';},
+ %{COMMENT ON COLUMN urls.xml_sax
+ IS 'xml sax oriented document (scroll)';},
+ %{COMMENT ON COLUMN urls.xml_dom
+ IS 'xml dom oriented document (scroll)';},
+ %{COMMENT ON COLUMN urls.odf
+ IS 'opendocument format text';},
+ %{COMMENT ON COLUMN urls.pdf_p
+ IS 'pdf portrait';},
+ %{COMMENT ON COLUMN urls.pdf_l
+ IS 'pdf landscape';},
+ %{COMMENT ON COLUMN urls.concordance
+ IS 'rudimentary document index linked to html';},
+ %{COMMENT ON COLUMN urls.latex_p
+ IS 'latex portrait';},
+ %{COMMENT ON COLUMN urls.latex_l
+ IS 'latex_landscape';},
+ %{COMMENT ON COLUMN urls.markup
+ IS 'markup';},
+ %{COMMENT ON COLUMN urls.sisupod
+ IS 'SiSU document format .tgz (all SiSU information on document)';},
+ ]
+ conn_execute_array(sql_arr)
+ end
+ self
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_dbi.rb b/lib/sisu/v6/db_dbi.rb
new file mode 100644
index 0000000..6e5f125
--- /dev/null
+++ b/lib/sisu/v6/db_dbi.rb
@@ -0,0 +1,97 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_dbi.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbDBI
+ require_relative 'db_columns' # db_columns.rb
+ require_relative 'db_tests' # db_tests.rb
+ require_relative 'db_create' # db_create.rb
+ require_relative 'db_select' # db_select.rb
+ require_relative 'db_indexes' # db_indexes.rb
+ require_relative 'db_drop' # db_drop.rb
+ require_relative 'db_remove' # db_remove.rb
+ require_relative 'db_load_tuple' # db_load_tuple.rb
+ require_relative 'db_import' # db_import.rb
+ class ColumnSize < SiSU_DbColumns::ColumnSize # db_columns.rb
+ end
+ class Test < SiSU_DbTests::Test # db_tests.rb
+ end
+ class Create <SiSU_DbCreate::Create # db_create.rb
+ end
+ class Case <SiSU_DbSelect::Case # db_select.rb
+ end
+ class Index <SiSU_DbIndex::Index # db_indexes.rb
+ end
+ class Drop <SiSU_DbDrop::Drop # db_drop.rb
+ end
+ class Remove <SiSU_DbRemove::Remove # db_remove.rb
+ end
+ class LoadDocuments <SiSU_DbTuple::LoadDocuments # db_load_tuple.rb
+ end
+ class LoadMetadata <SiSU_DbTuple::LoadMetadata # db_load_tuple.rb
+ end
+ class LoadUrls <SiSU_DbTuple::LoadUrls # db_update urls
+ end
+ class Import <SiSU_DbImport::Import #<SiSU_DB::ColumnSize # db_import.rb
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_drop.rb b/lib/sisu/v6/db_drop.rb
new file mode 100644
index 0000000..94fc5e9
--- /dev/null
+++ b/lib/sisu/v6/db_drop.rb
@@ -0,0 +1,196 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_drop.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbDrop
+ class Drop
+ require_relative 'response' # response.rb
+ def initialize(opt,conn,db_info,sql_type='')
+ @opt,@conn,@db_info,@sql_type=opt,conn,db_info,sql_type
+ @ans=SiSU_Response::Response.new
+ case @sql_type
+ when /sqlite/
+ cascade=''
+ else
+ cascade='CASCADE'
+ end
+ @drop_table=[
+ "DROP TABLE metadata_and_text #{cascade};",
+ "DROP TABLE doc_objects #{cascade};",
+ "DROP TABLE urls #{cascade};",
+ "DROP TABLE endnotes #{cascade};",
+ "DROP TABLE endnotes_asterisk #{cascade};",
+ "DROP TABLE endnotes_plus #{cascade};",
+ ]
+ end
+ def drop
+ def tables #% drop all tables
+ begin
+ msg_sqlite="as not all disk space is recovered after dropping the database << #{@db_info.sqlite.db} >>, you may be better off deleting the file, and recreating it as necessary"
+ case @sql_type
+ when /sqlite/
+ puts msg_sqlite
+ ans=@ans.response?('remove sql database?')
+ if ans \
+ and File.exist?(@db_info.sqlite.db)
+ @conn.close
+ File.unlink(@db_info.sqlite.db)
+ db=SiSU_Env::InfoDb.new
+ conn=db.sqlite.conn_sqlite3
+ sdb=SiSU_DbDBI::Create.new(@opt,conn,@db_info,@sql_type)
+ sdb_index=SiSU_DbDBI::Index.new(@opt,conn,@db_info,@sql_type)
+ sdb.output_dir?
+ begin
+ sdb.create_db
+ sdb.create_table.metadata_and_text
+ sdb.create_table.doc_objects
+ sdb.create_table.endnotes
+ sdb.create_table.endnotes_asterisk
+ sdb.create_table.endnotes_plus
+ sdb.create_table.urls
+ sdb_index.create_indexes
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,'-D').location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ sdb.output_dir?
+ end
+ exit
+ else
+ @conn.transaction
+ @drop_table.each do |d|
+ @conn.execute(d)
+ end
+ @conn.commit
+ end
+ else
+ @drop_table.each do |d|
+ @conn.execute(d)
+ end
+ end
+ rescue
+ case @sql_type
+ when /sqlite/
+ ans=@ans.response?('remove sql database?')
+ if ans and File.exist?(@db_info.sqlite.db); File.unlink(@db_info.sqlite.db)
+ end
+ else
+ @drop_table.each do |d|
+ @conn.execute(d)
+ end
+ end
+ ensure
+ end
+ end
+ def indexes
+ def conn_execute_array(sql_arr)
+ @conn.transaction do |conn|
+ sql_arr.each do |sql|
+ conn.execute(sql)
+ end
+ end
+ end
+ def base #% drop base indexes
+ print "\n drop documents common indexes\n" unless @opt.act[:quiet][:set]==:on
+ sql_arr=[
+ %{DROP INDEX idx_title;},
+ %{DROP INDEX idx_author;},
+ %{DROP INDEX idx_filename;},
+ %{DROP INDEX idx_topics;},
+ %{DROP INDEX idx_ocn;},
+ %{DROP INDEX idx_digest_clean;},
+ %{DROP INDEX idx_digest_all;},
+ %{DROP INDEX idx_lev0;},
+ %{DROP INDEX idx_lev1;},
+ %{DROP INDEX idx_lev2;},
+ %{DROP INDEX idx_lev3;},
+ %{DROP INDEX idx_lev4;},
+ %{DROP INDEX idx_lev5;},
+ %{DROP INDEX idx_lev6;},
+ %{DROP INDEX idx_endnote_nr;},
+ %{DROP INDEX idx_digest_en;},
+ %{DROP INDEX idx_endnote_nr_asterisk;},
+ %{DROP INDEX idx_endnote_asterisk;},
+ %{DROP INDEX idx_digest_en_asterisk;},
+ %{DROP INDEX idx_endnote_nr_plus;},
+ %{DROP INDEX idx_endnote_plus;},
+ %{DROP INDEX idx_digest_en_plus},
+ ]
+ conn_execute_array(sql_arr)
+ end
+ def text #% drop TEXT indexes, sqlite
+ print "\n drop documents TEXT indexes\n" unless @opt.act[:quiet][:set]==:on
+ sql_arr=[
+ %{DROP INDEX idx_clean;},
+ %{DROP INDEX idx_endnote},
+ ]
+ conn_execute_array(sql_arr)
+ end
+ self
+ end
+ indexes.base
+ @opt.cmd=~/D/ || ((@opt.mod=~/psql/) ? '' : indexes.text)
+ self
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_import.rb b/lib/sisu/v6/db_import.rb
new file mode 100644
index 0000000..e9fc4d5
--- /dev/null
+++ b/lib/sisu/v6/db_import.rb
@@ -0,0 +1,803 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_import.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbImport
+ require_relative 'db_columns' # db_columns.rb
+ require_relative 'db_load_tuple' # db_load_tuple.rb
+ require_relative 'db_sqltxt' # db_sqltxt.rb
+ require_relative 'html_lite_shared' # html_lite_shared.rb
+ require 'sqlite3'
+ class Import < SiSU_DbText::Prepare
+ include SiSU_Param
+ include SiSU_Screen
+ @@dl=nil
+ @@hname=nil
+ attr_accessor :tp
+ def initialize(opt,conn,file_maint,sql_type='pg')
+ @opt,@conn,@file_maint,@sql_type=opt,conn,file_maint,sql_type
+ @cX=SiSU_Screen::Ansi.new(@opt.act[:color_state][:set]).cX
+ @env=SiSU_Env::InfoEnv.new(@opt.fns)
+ @dal="#{@env.processing_path.ao}"
+ @fnb=if @opt.fns.empty? \
+ or @opt.cmd.empty?
+ ''
+ else
+ @md=SiSU_Param::Parameters.new(@opt).get
+ @md.fnb
+ end
+ @fnc="#{@dal}/#{@opt.fns}.content.rbm"
+ @@seg,@@seg_full='','' #create? consider placing field just before clean text as opposed to seg which contains seg(.html) name info seg_full would contain seg info for levels 5 & 6 where available eg seg_full may be 7.3 (level 5) and 7.3.1 (level 6) where seg is 7
+ @col=Hash.new('')
+ @col[:ocn]=''
+ @counter={}
+ @db=SiSU_Env::InfoDb.new
+ if @sql_type=='sqlite'
+ @driver_sqlite3=(@conn.inspect.match(/^(.{10})/)[1]==@db.sqlite.conn_sqlite3.inspect.match(/^(.{10})/)[1]) \
+ ? true
+ : false
+ end
+ sql='SELECT MAX(lid) FROM doc_objects'
+ begin
+ @col[:lid] ||=0
+ @col[:lid]=@driver_sqlite3 \
+ ? @conn.execute( sql ).join.to_i
+ : @conn.execute( sql ) { |x| x.fetch_all.flatten[0] }
+ rescue
+ puts "#{__FILE__}:#{__LINE__}" if @opt.act[:maintenance][:set]==:on
+ end
+ @col[:lid]=0 if @col[:lid].nil? or @col[:lid].to_s.empty?
+ sql='SELECT MAX(nid) FROM endnotes'
+ begin
+ @id_n=@driver_sqlite3 \
+ ? @conn.execute( sql ).join.to_i
+ : @id_n=@conn.execute( sql ) { |x| x.fetch_all.flatten[0] }
+ @id_n ||=0
+ rescue
+ puts "#{__FILE__}:#{__LINE__}" if @opt.act[:maintenance][:set]==:on
+ end
+ @id_n =0 if @col[:lid].nil? or @col[:lid].to_s.empty?
+ @col[:lv0]=@col[:lv1]=@col[:lv2]=@col[:lv3]=@col[:lv4]=@col[:lv5]=@col[:lv6]=0
+ @db=SiSU_Env::InfoDb.new
+ @pdf_fn=SiSU_Env::FileOp.new(@md).base_filename
+ @@dl ||=SiSU_Env::InfoEnv.new.digest.length
+ end
+ def marshal_load
+ require_relative 'ao' # ao.rb
+ @ao_array=SiSU_AO::Source.new(@opt).get # ao file drawn here
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],"#{@db.psql.db}::#{@opt.fns}").puts_blue
+ end
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],'Marshal Load',@fnc).puts_grey if @opt.act[:verbose][:set]==:on
+#%
+ select_first_match=%{
+ SELECT metadata_and_text.tid
+ FROM metadata_and_text
+ WHERE metadata_and_text.src_filename = '#{@md.fns}'
+ AND metadata_and_text.language_document_char = '#{@opt.lng}'
+ ;} # note, for .ssm: @md.fns (is set during runtime & is) != @opt.fns @md.opt.fns
+ file_exist=@sql_type=~/sqlite/ \
+ ? @conn.get_first_value(select_first_match)
+ : @conn.select_one(select_first_match)
+ if not file_exist
+ t_d=[] # transaction_data
+ t_d << db_import_metadata
+ t_d << db_import_documents(@ao_array)
+ t_d << db_import_urls(@ao_array,@fnc) #import OID on/off
+ t_d=t_d.flatten
+ if (@opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ puts @conn.class if defined? @conn.class
+ puts @conn.driver_name if defined? @conn.driver_name
+ puts @conn.driver if defined? @conn.driver
+ end
+ begin #% sql
+ if @sql_type=~/sqlite/
+ @conn.transaction do |conn|
+ t_d.each do |sql|
+ conn.execute(sql)
+ end
+ end
+ #also 'execute' works for sqlite
+ #@conn.execute("BEGIN")
+ # t_d.each do |sql|
+ # @conn.execute(sql)
+ # end
+ #@conn.execute("COMMIT")
+ else
+ #'do' works for postgresql
+ @conn.do("BEGIN")
+ t_d.each do |sql|
+ @conn.do(sql)
+ end
+ @conn.do("COMMIT")
+ end
+ rescue DBI::DatabaseError => e
+ STDERR.puts "Error code: #{e.err}"
+ STDERR.puts "Error message: #{e.errstr}"
+ STDERR.puts "Error SQLSTATE: #{e.state}"
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ sqlfn="#{@env.processing_path.sql}/#{@md.fnb}.sql"
+ sql=File.new(sqlfn,'w')
+ t_d.each {|i| sql.puts i}
+ p sqlfn
+ if @opt.act[:maintenance][:set]==:on
+ puts sql
+ p @conn.methods.sort
+ puts "#{__FILE__}:#{__LINE__}"
+ end
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ sqlfn="#{@env.processing_path.sql}/#{@md.fnb}.sql"
+ sql=File.new(sqlfn,'w')
+ t_d.each {|i| sql.puts i}
+ p sqlfn
+ if @opt.act[:maintenance][:set]==:on
+ puts sql
+ p @conn.methods.sort
+ puts "#{__FILE__}:#{__LINE__}"
+ end
+ ensure
+ end
+ else
+ if file_exist
+ @db=SiSU_Env::InfoDb.new
+ puts "\n#{@cX.grey}file #{@cX.off} #{@cX.blue}#{@opt.fns}#{@cX.off} in language code #{cX.blue}#{@opt.lng}#{cX.off} #{@cX.grey}already exists in database#{@cX.off} #{@cX.blue}#{@db.psql.db}#{@cX.off} #{@cX.brown}update instead?#{@cX.off}"
+ end
+ end
+ end
+ def pf_db_import_transaction_open
+ end
+ def pf_db_import_transaction_close
+ end
+ def book_idx_hash_to_str(book_idx)
+ book_idx=book_idx ? book_idx : ''
+ book_idx_str,book_subidx_part='',''
+ if not book_idx.empty?
+ book_idx_str=''
+ book_idx.each_pair do |k0,v0|
+ book_idx_str << %{#{k0}+#{v0[:plus]}}
+ book_subidx_part=''
+ if v0[:sub].length > 0
+ v0[:sub].each do |subterms|
+ subterms.each_pair do |k1,v1|
+ book_subidx_part << %{\n #{k1}+#{v1[:plus]} | }
+ end
+ end
+ book_idx_str=book_idx_str + ':' + book_subidx_part
+ end
+ end
+ end
+ book_idx_str
+ end
+ def db_import_metadata #% import documents - populate database
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ print %{ #{@cX.grey}import documents dbi_unit #{@cX.off} }
+ end
+ @tp={}
+ @md=SiSU_Param::Parameters.new(@opt).get
+#% sisutxt & fulltxt
+ if FileTest.exist?(@md.fns)
+ txt_arr=IO.readlines(@md.fns,'')
+ src=txt_arr.join("\n")
+ src=special_character_escape(src)
+ @tp[:sisutxt_f],@tp[:sisutxt_i]='sisutxt, ',"'#{src}', "
+ txt=clean_searchable_text(txt_arr)
+ #txt=special_character_escape(txt)
+ @tp[:fulltxt_f],@tp[:fulltxt_i]='fulltxt, ',"'#{txt}', "
+ end
+#% title
+ if defined? @md.title.full \
+ and @md.title.full=~/\S+/ # DublinCore 1 - title
+ #@tp[:title]=@md.title.full
+ #special_character_escape(@tp[:title])
+ #@tp[:title_f],@tp[:title_i]='title, ',"'#{@tp[:title]}', "
+ sql='SELECT MAX(tid) FROM metadata_and_text;'
+ begin
+ @@id_t ||=0
+ id_t=if @driver_sqlite3
+ @conn.execute( sql ).join.to_i # { |x| id_t=x.join.to_i }
+ else
+ @conn.execute( sql ) { |x| x.fetch_all.flatten[0] }
+ end
+ @@id_t=id_t if id_t
+ rescue
+ puts "#{__FILE__} #{__LINE__}" if @opt.act[:maintenance][:set]==:on
+ end
+ @@id_t+=1 #bug related, needs to be performed once at start of file, but consider moving, as, placed here it means program will fail if document header lacks @title:
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ puts %{\n#{@cX.grey}Processing file number#{@cX.off}: #{@cX.green}#{@@id_t}#{@@cX.off}}
+ end
+ end
+ ################ CLEAR ##############
+ SiSU_DbDBI::Test.new(self,@opt).verify #% import title names, filenames (tuple)
+ t=SiSU_DbTuple::LoadMetadata.new(@conn,@@id_t,@md,@file_maint)
+ tuple=t.tuple
+ tuple
+ end
+ def db_import_documents(ao_array) #% import documents - populate main database table, import into substantive database tables (tuple)
+ begin
+ @col[:tid]=@@id_t
+ @en,@en_ast,@en_pls,@tuple_array=[],[],[],[]
+ @col[:en_a],@col[:en_z]=nil,nil
+ ao_array.each do |data|
+ data.obj.gsub!(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_superscript_o]}(.+?)#{Mx[:fa_superscript_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_subscript_o]}(.+?)#{Mx[:fa_subscript_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_insert_o]}(.+?)#{Mx[:fa_insert_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_cite_o]}(.+?)#{Mx[:fa_cite_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_strike_o]}(.+?)#{Mx[:fa_strike_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:fa_monospace_o]}(.+?)#{Mx[:fa_monospace_c]}/,'\1')
+ data.obj.gsub!(/#{Mx[:gl_o]}(●)#{Mx[:gl_c]}\s*/,'\1 ')
+ data.obj.gsub!(/#{Mx[:tag_o]}\S+?#{Mx[:tag_c]}/,'') #check
+ @col[:seg]=@@seg
+ if data.of ==:para \
+ || data.of ==:heading \
+ || data.of ==:heading_insert \
+ || data.of ==:block \
+ || data.of ==:group # regular text what of code-blocks grouped text etc.
+ notedata=data.obj.dup
+ #% :headings
+ if data.is==:heading \
+ && (data.ln.inspect=~/[0-3]/)
+ (
+ @col[:lev],
+ txt,@col[:ocn],
+ @col[:lev_an],
+ @col[:ocnd],@col[:ocns],
+ @col[:t_of],@col[:t_is],
+ @col[:node],@col[:parent],
+ @col[:digest_clean],@col[:digest_all]=
+ data.ln,
+ data.obj,data.ocn,
+ data.lv,
+ data.odv,data.osp,
+ data.of,data.is,
+ data.node,data.parent,
+ '',''
+ )
+ @col[:lid]+=1
+ txt=endnotes(txt).extract_any
+ body=SiSU_FormatShared::CSS_Format.new(@md,data).lev4_minus
+ @col[:body]=special_character_escape(body)
+ plaintext=@col[:body].dup
+ plaintext=strip_markup(plaintext)
+ @col[:plaintext]=clean_searchable_text(plaintext)
+ book_idx=book_idx_hash_to_str(data.idx)
+ @col[:book_idx]=clean_searchable_text(book_idx)
+ if @en[0] then @en_a,@en_z=@en[0].first,@en[0].last
+ end
+ if @en_ast[0] then @en_a_asterisk,@en_z_asterisk=@en_ast[0].first,@en_ast[0].last
+ end
+ if @en_pls[0] then @en_a_plus,@en_z_plus=@en_pls[0].first,@en_pls[0].last
+ end
+ t=SiSU_DbTuple::LoadDocuments.new(@conn,@col,@opt,@file_maint)
+ @tuple_array << t.tuple
+ case @col[:lev]
+ when /0/ then @col[:lv0]+=1
+ when /1/ then @col[:lv1]+=1
+ when /2/ then @col[:lv2]+=1
+ when /3/ then @col[:lv3]+=1
+ end
+ @col[:lev]=@col[:plaintext]=@col[:body]=''
+ elsif data.is==:heading \
+ && data.ln==4
+ (
+ @@seg,txt,
+ @col[:ocn],@col[:lev_an],
+ @col[:ocnd],@col[:ocns],
+ @col[:t_of],@col[:t_is],
+ @col[:node],@col[:parent],
+ @col[:digest_clean],@col[:digest_all]=
+ data.name,data.obj,
+ data.ocn,data.lv,
+ data.odv,data.osp,
+ data.of,data.is,
+ data.node,data.parent,
+ '',''
+ )
+ @col[:seg]=@@seg
+ @col[:lv4]+=1
+ @col[:lid]+=1
+ @col[:lev]=4
+ @hname=if @col[:seg] \
+ and not @col[:seg].to_s.empty?
+ @@hname=@col[:seg].to_s
+ else @@hname
+ end
+ @env=SiSU_Env::InfoEnv.new(@md.fns)
+ @base_url="#{@env.url.root}/#{@md.fnb}/#{@hname}.html"
+ txt=endnotes(txt).extract_any
+ body=SiSU_FormatShared::CSS_Format.new(@md,data).lev4_plus
+ @col[:body]=special_character_escape(body)
+ plaintext=@col[:body].dup
+ plaintext=strip_markup(plaintext)
+ @col[:plaintext]=clean_searchable_text(plaintext)
+ book_idx=book_idx_hash_to_str(data.idx)
+ @col[:book_idx]=clean_searchable_text(book_idx)
+ @en_a,@en_z=@en[0].first,@en[0].last if @en[0]
+ @en_a_asterisk,@en_z_asterisk=@en_ast[0].first,@en_ast[0].last if @en_ast[0]
+ @en_a_plus,@en_z_plus=@en_pls[0].first,@en_pls[0].last if @en_pls[0]
+ t=SiSU_DbTuple::LoadDocuments.new(@conn,@col,@opt,@file_maint)
+ @tuple_array << t.tuple
+ @col[:lev]=@col[:plaintext]=@col[:body]=''
+ elsif data.is==:heading \
+ && data.ln==5
+ (
+ txt,
+ @col[:ocn],@col[:lev_an],
+ @col[:ocnd],@col[:ocns],
+ @col[:t_of],@col[:t_is],
+ @col[:node],@col[:parent],
+ @col[:digest_clean],@col[:digest_all]=
+ data.obj,
+ data.ocn,data.lv,
+ data.odv,data.osp,
+ data.of,data.is,
+ data.node,data.parent,
+ '',''
+ )
+ @@seg_full=data.name if data.is==:heading \
+ && data.ln==5 \
+ && data.name #check data.name
+ @@seg ||='' #nil # watch
+ @col[:seg]=@@seg
+ @col[:lv5]+=1
+ @col[:lid]+=1
+ @col[:lev]=5
+ @hname=if @col[:seg] \
+ and not @col[:seg].to_s.empty?
+ @@hname=@col[:seg].to_s
+ else @@hname
+ end
+ @env=SiSU_Env::InfoEnv.new(@md.fns)
+ @base_url="#{@env.url.root}/#{@md.fnb}/#{@hname}.html"
+ txt=endnotes(txt).extract_any
+ body=SiSU_FormatShared::CSS_Format.new(@md,data).lev4_plus
+ @col[:body]=special_character_escape(body)
+ plaintext=@col[:body].dup
+ plaintext=strip_markup(plaintext)
+ @col[:plaintext]=clean_searchable_text(plaintext)
+ book_idx=book_idx_hash_to_str(data.idx)
+ @col[:book_idx]=clean_searchable_text(book_idx)
+ @en_a,@en_z=@en[0].first,@en[0].last if @en[0]
+ @en_a_asterisk,@en_z_asterisk=@en_ast[0].first,@en_ast[0].last if @en_ast[0]
+ @en_a_plus,@en_z_plus=@en_pls[0].first,@en_pls[0].last if @en_pls[0]
+ t=SiSU_DbTuple::LoadDocuments.new(@conn,@col,@opt,@file_maint)
+ @tuple_array << t.tuple
+ @col[:lev]=@col[:plaintext]=@col[:body]=''
+ elsif data.is==:heading \
+ && data.ln==6
+ txt,@col[:ocn],@col[:lev_an],@col[:ocnd],@col[:ocns],@col[:t_of],@col[:t_is],@col[:node],@col[:parent],@col[:digest_clean],@col[:digest_all]=data.obj,data.ocn,data.lv,data.odv,data.osp,data.of,data.is,data.node,data.parent,'',''
+ @@seg_full=data.name if data.is==:heading && data.ln==6 && data.name #check data.name
+ @@seg ||='' #nil # watch
+ @col[:seg]=@@seg
+ @col[:lv6]+=1
+ @col[:lid]+=1
+ @col[:lev]=6
+ @hname=if @col[:seg] \
+ and not @col[:seg].to_s.empty?
+ @@hname=@col[:seg].to_s
+ else @@hname
+ end
+ @env=SiSU_Env::InfoEnv.new(@md.fns)
+ @base_url="#{@env.url.root}/#{@md.fnb}/#{@hname}.html"
+ txt=endnotes(txt).extract_any
+ body=SiSU_FormatShared::CSS_Format.new(@md,data).lev4_plus
+ @col[:body]=special_character_escape(body)
+ plaintext=@col[:body].dup
+ plaintext=strip_markup(plaintext)
+ @col[:plaintext]=clean_searchable_text(plaintext)
+ book_idx=book_idx_hash_to_str(data.idx)
+ @col[:book_idx]=clean_searchable_text(book_idx)
+ @en_a,@en_z=@en[0].first,@en[0].last if @en[0]
+ @en_a_asterisk,@en_z_asterisk=@en_ast[0].first,@en_ast[0].last if @en_ast[0]
+ @en_a_plus,@en_z_plus=@en_pls[0].first,@en_pls[0].last if @en_pls[0]
+ t=SiSU_DbTuple::LoadDocuments.new(@conn,@col,@opt,@file_maint)
+ @tuple_array << t.tuple
+ @col[:lev]=@col[:plaintext]=@col[:body]=''
+ #% :structure :layout :comment
+ elsif data.of==:structure \
+ || data.of==:layout \
+ || data.of==:comment
+ #added watch
+ #% :
+ else #% regular text
+ @col[:lid]+=1
+ (
+ txt=''
+ txt,@col[:ocn],
+ @col[:ocnd],@col[:ocns],
+ @col[:t_of],@col[:t_is],
+ @col[:node],@col[:parent],
+ @col[:digest_clean],@col[:digest_all],
+ @col[:lev]=
+ data.obj,data.ocn,
+ data.odv,data.osp,
+ data.of,data.is,
+ '',data.parent,
+ '','',
+ 9
+ )
+ @hname=if @col[:seg] \
+ and not @col[:seg].to_s.empty?
+ @@hname=@col[:seg].to_s
+ else @@hname
+ end
+ @env=SiSU_Env::InfoEnv.new(@md.fns)
+ @base_url="#{@env.url.root}/#{@md.fnb}/#{@hname}.html"
+ txt=endnotes(txt).extract_any
+ if @sql_type=~/pg/ \
+ and txt.size > (SiSU_DbColumns::ColumnSize.new.document_clean - 1) # examine pg build & remove limitation
+ puts "\n\nTOO LARGE (TXT - see error log)\n\n"
+ open("#{Dir.pwd}/pg_documents_error_log",'a') do |error|
+ error.puts("\n#{@opt.fns}\nTEXT BODY\n#{@col[:body].size} object #{@col[:ocn]} -> #{@col[:body].slice(0..500)}")
+ end
+ txt=%{\n\nLARGE TEXT BLOCK OMITTED\n\n}
+ end
+ @en_a,@en_z=@en[0].first,@en[0].last if @en[0]
+ @en_a_asterisk,@en_z_asterisk=@en_ast[0].first,@en_ast[0].last if @en_ast[0]
+ @en_a_plus,@en_z_plus=@en_pls[0].first,@en_pls[0].last if @en_pls[0]
+ body=if data.is==:table
+ SiSU_FormatShared::CSS_Format.new(@md,data).html_table
+ elsif data.is==:code
+ SiSU_FormatShared::CSS_Format.new(@md,data).code
+ elsif defined? data.indent \
+ and defined? data.hang \
+ and data.indent =~/[1-9]/ \
+ and data.indent == data.hang
+ SiSU_FormatShared::CSS_Format.new(@md,data).indent(data.indent)
+ elsif defined? data.indent \
+ and defined? data.hang \
+ and data.hang =~/[0-9]/ \
+ and data.indent != data.hang
+ SiSU_FormatShared::CSS_Format.new(@md,data).hang_indent(data.hang,data.indent)
+ else
+ SiSU_FormatShared::CSS_Format.new(@md,data).norm
+ end
+ @col[:body]=special_character_escape(body)
+ plaintext=@col[:body].dup
+ plaintext=strip_markup(plaintext)
+ @col[:plaintext]=clean_searchable_text(plaintext)
+ book_idx=book_idx_hash_to_str(data.idx)
+ @col[:book_idx]=clean_searchable_text(book_idx)
+ t=SiSU_DbTuple::LoadDocuments.new(@conn,@col,@opt,@file_maint)
+ @tuple_array << t.tuple
+ @en,@en_ast,@en_pls=[],[],[]
+ @col[:en_a]=@col[:en_z]=nil
+ @col[:lev]=@col[:plaintext]=@col[:body]=@col[:words]=''
+ end
+ if notedata =~/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}/ #% import into database endnotes tables
+ endnote_array=notedata.scan(/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}/)
+ endnote_array.each do |inf|
+ if inf[/#{Mx[:en_a_o]}\d+.+?#{Mx[:en_a_c]}/]
+ if inf[/#{Mx[:en_a_o]}(\d+)(.+?)#{Mx[:en_a_c]}/]
+ nr,txt,digest_clean=$1,$2.strip,0
+ end
+ @id_n+=1
+ txt=special_character_escape(txt)
+ body=SiSU_FormatShared::CSS_Format.new(@md,data).endnote(nr,txt)
+ txt=strip_markup(txt)
+ if txt.size > (SiSU_DbColumns::ColumnSize.new.endnote_clean - 1)
+ puts "\n\nTOO LARGE (ENDNOTE - see error log)\n\n"
+ open("#{Dir.pwd}/pg_documents_error_log",'a') do |error|
+ error.puts("\n#{@opt.fns}\nENDNOTE\n#{txt.size} object #{@col[:ocn]},#{@col[:ocnd]},#{@col[:ocns]} -> #{txt.slice(0..500)}")
+ end
+ txt=%{\n\nLARGE TEXT BLOCK OMITTED\n\n}
+ end
+ if txt
+ en={
+ type: 'endnotes',
+ id: @id_n,
+ lid: @col[:lid],
+ nr: nr,
+ txt: txt,
+ body: body,
+ ocn: @col[:ocn],
+ ocnd: @col[:ocnd],
+ ocns: @col[:ocns],
+ id_t: @@id_t,
+ hash: digest_clean
+ }
+ t=SiSU_DbTuple::LoadEndnotes.new(@conn,en,@opt,@file_maint)
+ @tuple_array << t.tuple
+ end
+ end
+ end
+ word_mode=notedata.scan(/\S+/)
+ end
+ if notedata =~/#{Mx[:en_b_o]}\*.+?#{Mx[:en_b_c]}/ #% import into database endnotes tables
+ endnote_array=notedata.scan(/#{Mx[:en_b_o]}\*.+?#{Mx[:en_b_c]}/)
+ endnote_array.each do |inf|
+ if inf[/#{Mx[:en_b_o]}\*\d+.+?#{Mx[:en_b_c]}/] # dal new endnotes 2003w31/1
+ if inf[/#{Mx[:en_b_o]}[*](\d+)(.+?)#{Mx[:en_b_c]}/] # dal new endnotes 2003w31/1
+ nr,txt,digest_clean=$1,$2.strip,0
+ end
+ @id_n+=1
+ txt=special_character_escape(txt)
+ body=SiSU_FormatShared::CSS_Format.new(@md,data).endnote(nr,txt)
+ txt=strip_markup(txt)
+ if txt.size > (SiSU_DbColumns::ColumnSize.new.endnote_clean - 1)
+ puts "\n\nTOO LARGE (ENDNOTE - see error log)\n\n"
+ open("#{Dir.pwd}/pg_documents_error_log",'a') do |error|
+ error.puts("\n#{@opt.fns}\nENDNOTE\n#{txt.size} object #{@col[:ocn]},#{@col[:ocnd]},#{@col[:ocns]} -> #{txt.slice(0..500)}")
+ end
+ txt=%{\n\nLARGE TEXT BLOCK OMITTED\n\n}
+ end
+ if txt
+ en={
+ type: 'endnotes_asterisk',
+ id: @id_n,
+ lid: @col[:lid],
+ nr: nr,
+ txt: txt,
+ body: body,
+ ocn: @col[:ocn],
+ ocnd: @col[:ocnd],
+ ocns: @col[:ocns],
+ id_t: @@id_t,
+ hash: digest_clean
+ }
+ t=SiSU_DbTuple::LoadEndnotes.new(@conn,en,@opt,@file_maint)
+ @tuple_array << t.tuple
+ end
+ end
+ end
+ word_mode=notedata.scan(/\S+/)
+ end
+ if notedata =~/#{Mx[:en_b_o]}\+.+?#{Mx[:en_b_c]}/ #% import into database endnotes tables
+ endnote_array=notedata.scan(/#{Mx[:en_b_o]}\+.+?#{Mx[:en_b_c]}/)
+ endnote_array.each do |inf|
+ if inf[/#{Mx[:en_b_o]}\+\d+.+?#{Mx[:en_b_c]}/] # dal new endnotes 2003w31/1
+ if inf[/#{Mx[:en_b_o]}[+](\d+)(.+?)#{Mx[:en_b_c]}/] # dal new endnotes 2003w31/1
+ nr,txt,digest_clean=$1,$2.strip,0
+ end
+ @id_n+=1
+ txt=special_character_escape(txt)
+ body=SiSU_FormatShared::CSS_Format.new(@md,data).endnote(nr,txt)
+ txt=strip_markup(txt)
+ if txt.size > (SiSU_DbColumns::ColumnSize.new.endnote_clean - 1)
+ puts "\n\nTOO LARGE (ENDNOTE - see error log)\n\n"
+ open("#{Dir.pwd}/pg_documents_error_log",'a') do |error|
+ error.puts("\n#{@opt.fns}\nENDNOTE\n#{txt.size} object #{@col[:ocn]},#{@col[:ocnd]},#{@col[:ocns]} -> #{txt.slice(0..500)}")
+ end
+ txt=%{\n\nLARGE TEXT BLOCK OMITTED\n\n}
+ end
+ if txt
+ en={
+ type: 'endnotes_plus',
+ id: @id_n,
+ lid: @col[:lid],
+ nr: nr,
+ txt: txt,
+ body: body,
+ ocn: @col[:ocn],
+ ocnd: @col[:ocnd],
+ ocns: @col[:ocns],
+ id_t: @@id_t,
+ hash: digest_clean
+ }
+ t=SiSU_DbTuple::LoadEndnotes.new(@conn,en,@opt,@file_maint)
+ @tuple_array << t.tuple
+ end
+ end
+ end
+ word_mode=notedata.scan(/\S+/)
+ end
+ end
+ end
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ end
+ @tuple_array
+ end
+ def endnotes(txt)
+ @txt=txt
+ def extract_any
+ if @txt =~/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})[*+]?(\d+)\s+.+?(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/
+ endnotes(@txt).range
+ @en << endnotes(@txt).standard if @txt =~/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}/
+ @en_ast << endnotes(@txt).asterisk if @txt =~/#{Mx[:en_b_o]}\*.+?#{Mx[:en_b_c]}/
+ @en_pls << endnotes(@txt).plus if @txt =~/#{Mx[:en_b_o]}\+.+?#{Mx[:en_b_c]}/
+ @txt=endnotes(@txt).clean_text
+ end
+ @txt
+ end
+ def standard
+ (@txt =~/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}/) \
+ ? @txt.scan(/#{Mx[:en_a_o]}(\d+).+?#{Mx[:en_a_c]}/)
+ : nil
+ end
+ def asterisk
+ (@txt =~/#{Mx[:en_b_o]}\*.+?#{Mx[:en_b_c]}/) \
+ ? @txt.scan(/#{Mx[:en_b_o]}[*](\d+).+?#{Mx[:en_b_c]}/)
+ : nil
+ end
+ def plus
+ (@txt =~/#{Mx[:en_b_o]}\+.+?#{Mx[:en_b_c]}/) \
+ ? @txt.scan(/#{Mx[:en_b_o]}[+](\d+).+?#{Mx[:en_b_c]}/)
+ : nil
+ end
+ def clean_text(base_url=nil)
+ @txt=if base_url
+ @txt.gsub(/#{Mx[:en_a_o]}(\d+).+?#{Mx[:en_a_c]}/,%{<sup><a href="#{base_url}#_\\1" name="-\\1">\\1</a></sup>}).
+ gsub(/#{Mx[:en_b_o]}([*]\d+).+?#{Mx[:en_b_c]}/,%{<sup><a href="#{base_url}#_\\1" name="-\\1">\\1</a></sup>}).
+ gsub(/#{Mx[:en_b_o]}([+]\d+).+?#{Mx[:en_b_c]}/,%{<sup><a href="#{base_url}#_\\1" name="-\\1">\\1</a></sup>})
+ else
+ @txt.gsub(/#{Mx[:en_a_o]}(\d+).+?#{Mx[:en_a_c]}/,'<sup>\1</sup>').
+ gsub(/#{Mx[:en_b_o]}([*]\d+).+?#{Mx[:en_b_c]}/,'<sup>\1</sup>').
+ gsub(/#{Mx[:en_b_o]}([+]\d+).+?#{Mx[:en_b_c]}/,'<sup>\1</sup>')
+ end
+ @txt
+ end
+ def range
+ @col[:en_a]=@col[:en_z]=nil
+ if @txt =~/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}([*]\d+).+?#{Mx[:en_b_c]}|#{Mx[:en_b_o]}([+]\d+).+?#{Mx[:en_b_c]}/
+ word_array=@txt.scan(/\S+/)
+ word_array.each do |w|
+ if w[/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})[*+]?(\d+)\s+.+?(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/] # not tested since change 2003w31
+ @col[:en_a]=$1 unless @col[:en_a]
+ @col[:en_z]=@col[:en_a].dup unless @col[:en_a]
+ @col[:en_z]=$1 if @col[:en_a]
+ end
+ end
+ end
+ @col
+ end
+ self
+ end
+ def db_import_urls(dbi_unit,content) #% import documents OID - populate database
+ begin
+ @fnc=content
+ @env=SiSU_Env::InfoEnv.new(@opt.fns)
+ f,u={},{}
+ if @fnb.empty? \
+ or @fnb.nil?
+ p 'file output path error' #remove
+ end
+ if FileTest.file?("#{@md.file.output_path.txt.dir}/#{@md.file.base_filename.txt}")==true
+ f[:txt],u[:txt]='plaintext,', "'#{@md.file.output_path.txt.url}/#{@md.file.base_filename.txt}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.html_seg.dir}/#{@md.file.base_filename.html_segtoc}")==true
+ f[:html_toc],u[:html_toc]='html_toc,', "'#{@md.file.output_path.html_seg.url}/#{@md.file.base_filename.html_segtoc}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.html_scroll.dir}/#{@md.file.base_filename.html_scroll}")==true
+ f[:html_doc],u[:html_doc]='html_doc,', "'#{@md.file.output_path.html_scroll.url}/#{@md.file.base_filename.html_scroll}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.xhtml.dir}/#{@md.file.base_filename.xhtml}")==true
+ f[:xhtml],u[:xhtml]='xhtml,', "'#{@md.file.output_path.xhtml.url}/#{@md.file.base_filename.xhtml}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.xml_sax.dir}/#{@md.file.base_filename.xml_sax}")==true
+ f[:xml_sax],u[:xml_sax]='xml_sax,', "'#{@md.file.output_path.xml_sax.url}/#{@md.file.base_filename.xml_sax}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.xml_dom.dir}/#{@md.file.base_filename.xml_dom}")==true
+ f[:xml_dom],u[:xml_dom]='xml_dom,', "'#{@md.file.output_path.xml_dom.url}/#{@md.file.base_filename.xml_dom}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.epub.dir}/#{@md.file.base_filename.epub}")==true
+ f[:epub],u[:epub]='epub,', "'#{@md.file.output_path.epub.url}/#{@md.file.base_filename.epub}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.odt.dir}/#{@md.file.base_filename.odt}")==true
+ f[:odf],u[:odf]='odf,', "'#{@md.file.output_path.odt.url}/#{@md.file.base_filename.odt}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_p_a4}")==true #\
+ #or FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_p_letter}")==true
+ f[:pdf_p],u[:pdf_p]='pdf_p,', "'#{@md.file.output_path.pdf.url}/#{@pdf_fn.pdf_p_a4}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_l_a4}")==true #\
+ #or FileTest.file?("#{@md.file.output_path.pdf.dir}/#{@pdf_fn.pdf_l_letter}")==true
+ f[:pdf_l],u[:pdf_l]='pdf_l,', "'#{@md.file.output_path.pdf.url}/#{@pdf_fn.pdf_l_a4}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.html_concordance.dir}/#{@md.file.base_filename.html_concordance}")==true
+ f[:concordance],u[:concordance]='concordance,', "'#{@md.file.output_path.html_concordance.url}/#{@md.file.base_filename.html_concordance}',"
+ end
+ #if FileTest.file?("#{@md.file.output_path.x.dir}/#{@md.file.base_filename.x}")==true
+ # f[:latex_p],u[:latex_p]='latex_p,', "'#{@md.file.output_path.x.url}/#{@md.file.base_filename.x}',"
+ #end
+ ##if FileTest.file?("#{out}/#{@fnb}/#{@opt.fns}.tex")==true
+ ## f[:latex_p],u[:latex_p]='latex_p,', "'#{base}/#{@fnb}/#{@opt.fns}.tex',"
+ ##end
+ #if FileTest.file?("#{@md.file.output_path.x.dir}/#{@md.file.base_filename.x}")==true
+ # f[:latex_l],u[:latex_l]='latex_l,', "'#{@md.file.output_path.x.url}/#{@md.file.base_filename.x}',"
+ #end
+ ##if FileTest.file?("#{out}/#{@fnb}/#{@opt.fns}.landscape.tex")==true
+ ## f[:latex_l],u[:latex_l]='latex_l,', "'#{base}/#{@fnb}/#{@opt}.fns}.landscape.tex',"
+ ##end
+ if FileTest.file?("#{@md.file.output_path.digest.dir}/#{@md.file.base_filename.digest}")==true
+ f[:digest],u[:digest]='digest,', "'#{@md.file.output_path.digest.url}/#{@md.file.base_filename.digest}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.manifest.dir}/#{@md.file.base_filename.manifest}")==true #revisit, was to be text, this is html
+ f[:manifest],u[:manifest]='manifest,', "'#{@md.file.output_path.manifest.url}/#{@md.file.base_filename.manifest}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.src.dir}/#{@md.file.base_filename.src}")==true
+ f[:markup],u[:markup]='markup,', "'#{@md.file.output_path.src.url}/#{@md.file.base_filename.src}',"
+ end
+ if FileTest.file?("#{@md.file.output_path.sisupod.dir}/#{@md.file.base_filename.sisupod}")==true
+ f[:sisupod],u[:sisupod]='sisupod,', "'#{@md.file.output_path.sisupod.url}/#{@md.file.base_filename.sisupod}',"
+ end
+ t=SiSU_DbTuple::LoadUrls.new(@conn,f,u,@@id_t,@opt,@file_maint)
+ tuple=t.tuple
+ rescue
+ SiSU_Errors::Rescued.new($!,$@,@opt.cmd,@opt.fns).location do
+ __LINE__.to_s + ':' + __FILE__
+ end
+ ensure
+ end
+ tuple
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_indexes.rb b/lib/sisu/v6/db_indexes.rb
new file mode 100644
index 0000000..f293012
--- /dev/null
+++ b/lib/sisu/v6/db_indexes.rb
@@ -0,0 +1,125 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_indexes.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbIndex
+ class Index # create documents Indexes def initialize(opt,conn='',sql_type='')
+ def initialize(opt,conn,file,sql_type='')
+ @opt,@conn,@file,@sql_type=opt,conn,file,sql_type
+ end
+ def create_indexes # check added from pg not tested
+ def conn_execute_array(sql_arr)
+ @conn.transaction do |conn|
+ sql_arr.each do |sql|
+ conn.execute(sql)
+ end
+ end
+ end
+ def base
+ if (@opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ print "\n create documents common indexes\n"
+ end
+ sql_arr=[
+ %{CREATE INDEX idx_ocn ON doc_objects(ocn);},
+ %{CREATE INDEX idx_digest_clean ON doc_objects(digest_clean);},
+ %{CREATE INDEX idx_digest_all ON doc_objects(digest_all);},
+ %{CREATE INDEX idx_lev0 ON doc_objects(lev0);},
+ %{CREATE INDEX idx_lev1 ON doc_objects(lev1);},
+ %{CREATE INDEX idx_lev2 ON doc_objects(lev2);},
+ %{CREATE INDEX idx_lev3 ON doc_objects(lev3);},
+ %{CREATE INDEX idx_lev4 ON doc_objects(lev4);},
+ %{CREATE INDEX idx_lev5 ON doc_objects(lev5);},
+ %{CREATE INDEX idx_lev6 ON doc_objects(lev6);},
+ %{CREATE INDEX idx_endnote_nr ON endnotes(nr);},
+ %{CREATE INDEX idx_digest_en ON endnotes(digest_clean);},
+ %{CREATE INDEX idx_endnote_nr_asterisk ON endnotes_asterisk(nr);},
+ %{CREATE INDEX idx_endnote_asterisk ON endnotes_asterisk(clean);},
+ %{CREATE INDEX idx_digest_en_asterisk ON endnotes_asterisk(digest_clean);},
+ %{CREATE INDEX idx_endnote_nr_plus ON endnotes_plus(nr);},
+ %{CREATE INDEX idx_endnote_plus ON endnotes_plus(clean);},
+ %{CREATE INDEX idx_digest_en_plus ON endnotes_plus(digest_clean);},
+ %{CREATE INDEX idx_title ON metadata_and_text(title);},
+ %{CREATE INDEX idx_author ON metadata_and_text(creator_author);},
+ %{CREATE INDEX idx_filename ON metadata_and_text(src_filename);},
+ %{CREATE INDEX idx_language ON metadata_and_text(language_document_char);},
+ %{CREATE INDEX idx_topics ON metadata_and_text(classify_topic_register)},
+ ]
+ conn_execute_array(sql_arr)
+ end
+ def text
+ if (@opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ print "\n create documents TEXT indexes\n"
+ end
+ sql_arr=[
+ %{CREATE INDEX idx_clean ON doc_objects(clean);},
+ %{CREATE INDEX idx_endnote ON endnotes(clean);}
+ ]
+ conn_execute_array(sql_arr)
+ end
+ base
+ @opt.cmd=~/D/ || ((@opt.mod=~/psql/) ? '' : text)
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_load_tuple.rb b/lib/sisu/v6/db_load_tuple.rb
new file mode 100644
index 0000000..c474025
--- /dev/null
+++ b/lib/sisu/v6/db_load_tuple.rb
@@ -0,0 +1,329 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_load_tuple.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbTuple
+ require_relative 'db_columns' # db_columns.rb
+ class LoadDocuments
+ require_relative 'param' # param.rb
+ include SiSU_Param
+ def initialize(conn,col,opt,file_maint)
+ @conn,@col,@opt,@file_maint=conn,col,opt,file_maint
+ @col[:lev]=@col[:lev].to_i
+ unless @col[:lev].inspect=~/^[0-6]/ \
+ or @col[:lev]==0..6
+ @col[:lev]=9
+ end
+ @col[:ocn]=0 unless @col[:ocn].inspect=~/\d+/
+ @cX=SiSU_Screen::Ansi.new(@opt.act[:color_state][:set]).cX
+ end
+ def tuple #% import line
+ sql_entry=if @col[:en_a]
+ "INSERT INTO doc_objects (lid, metadata_tid, lev, lev_an, clean, body, book_idx, ocn, ocnd, ocns, seg, lev0, lev1, lev2, lev3, lev4, lev5, lev6, en_a, en_z, t_of, t_is, node, parent, digest_clean, digest_all) " +
+ "VALUES (#{@col[:lid]}, #{@col[:tid]}, #{@col[:lev]}, '#{@col[:lev_an]}', '#{@col[:plaintext]}', '#{@col[:body]}', '#{@col[:book_idx]}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@col[:seg]}', '#{@col[:lv0]}', '#{@col[:lv1]}', '#{@col[:lv2]}', '#{@col[:lv3]}', '#{@col[:lv4]}', '#{@col[:lv5]}', '#{@col[:lv6]}', '#{@col[:en_a]}', '#{@col[:en_z]}', '#{@col[:t_of]}', '#{@col[:t_is]}', '#{@col[:node]}', '#{@col[:parent]}', '#{@col[:digest_clean]}', '#{@col[:digest_all]}');"
+ else
+ "INSERT INTO doc_objects (lid, metadata_tid, lev, lev_an, clean, body, book_idx, ocn, ocnd, ocns, seg, lev0, lev1, lev2, lev3, lev4, lev5, lev6, t_of, t_is, node, parent, digest_clean, digest_all) " +
+ "VALUES (#{@col[:lid]}, #{@col[:tid]}, #{@col[:lev]}, '#{@col[:lev_an]}', '#{@col[:plaintext]}', '#{@col[:body]}', '#{@col[:book_idx]}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@col[:seg]}', '#{@col[:lv0]}', '#{@col[:lv1]}', '#{@col[:lv2]}', '#{@col[:lv3]}', '#{@col[:lv4]}', '#{@col[:lv5]}', '#{@col[:lv6]}', '#{@col[:t_of]}', '#{@col[:t_is]}', '#{@col[:node]}', '#{@col[:parent]}', '#{@col[:digest_clean]}', '#{@col[:digest_all]}');"
+ end
+ if @opt.act[:verbose_plus][:set]==:on
+ if @opt.act[:maintenance][:set]==:on
+ puts @file_maint.inspect
+ puts sql_entry
+ end
+ @file_maint.puts sql_entry
+ else
+ if @opt.act[:verbose_plus][:set]==:on
+ puts sql_entry
+ @file_maint.puts sql_entry
+ end
+ end
+ if @opt.act[:verbose][:set]==:on
+ if @col[:lev].inspect =~/[0-356]/
+ lev=case @col[:lev].inspect
+ when /0/ then ':A'
+ when /1/ then ':B'
+ when /2/ then ':C'
+ when /3/ then ':D'
+ when /5/ then ' 2'
+ when /6/ then ' 3'
+ end
+ puts %{#{lev}>\t#{@col[:lv0]}\t#{@col[:lv1]}\t#{@col[:lv2]}\t#{@col[:lv3]}\t#{@col[:lv4]}\t#{@col[:lv5]}\t#{@col[:lv6]}\t#{@col[:ocn]}\t#{@col[:node]}\t#{@col[:ocns]}}
+ elsif @col[:lev].inspect =~/[4]/
+ puts %{ #{@cX.green}1>#{@cX.off}\t#{@col[:lv0]}\t#{@col[:lv1]}\t#{@col[:lv2]}\t#{@col[:lv3]}\t#{@col[:lv4]}\t#{@col[:lv5]}\t#{@col[:lv6]}\t#{@col[:ocn]}\t#{@col[:node]}\t#{@col[:ocns]}\t#{@col[:seg]}}
+ end
+ end
+ sql_entry
+ end
+ end
+ class LoadMetadata #< SiSU_DbColumns::Columns
+ def initialize(conn,id,md,file_maint)
+ @conn,@id,@md,@file_maint=conn,id,md,file_maint
+ @tp=SiSU_DbColumns::Columns.new(md)
+ end
+ def tuple
+ sql_entry="INSERT INTO metadata_and_text (
+#{@tp.column.title.tuple[0]}
+#{@tp.column.title_main.tuple[0]}
+#{@tp.column.title_sub.tuple[0]}
+#{@tp.column.title_short.tuple[0]}
+#{@tp.column.title_edition.tuple[0]}
+#{@tp.column.title_note.tuple[0]}
+#{@tp.column.title_language.tuple[0]}
+#{@tp.column.title_language_char.tuple[0]}
+#{@tp.column.creator_author.tuple[0]}
+#{@tp.column.creator_author_honorific.tuple[0]}
+#{@tp.column.creator_author_nationality.tuple[0]}
+#{@tp.column.creator_editor.tuple[0]}
+#{@tp.column.creator_contributor.tuple[0]}
+#{@tp.column.creator_illustrator.tuple[0]}
+#{@tp.column.creator_photographer.tuple[0]}
+#{@tp.column.creator_translator.tuple[0]}
+#{@tp.column.creator_prepared_by.tuple[0]}
+#{@tp.column.creator_digitized_by.tuple[0]}
+#{@tp.column.creator_audio.tuple[0]}
+#{@tp.column.creator_video.tuple[0]}
+#{@tp.column.language_document.tuple[0]}
+#{@tp.column.language_document_char.tuple[0]}
+#{@tp.column.language_original.tuple[0]}
+#{@tp.column.language_original_char.tuple[0]}
+#{@tp.column.date_added_to_site.tuple[0]}
+#{@tp.column.date_available.tuple[0]}
+#{@tp.column.date_created.tuple[0]}
+#{@tp.column.date_issued.tuple[0]}
+#{@tp.column.date_modified.tuple[0]}
+#{@tp.column.date_published.tuple[0]}
+#{@tp.column.date_valid.tuple[0]}
+#{@tp.column.date_translated.tuple[0]}
+#{@tp.column.date_original_publication.tuple[0]}
+#{@tp.column.date_generated.tuple[0]}
+#{@tp.column.publisher.tuple[0]}
+#{@tp.column.original_publisher.tuple[0]}
+#{@tp.column.original_language.tuple[0]}
+#{@tp.column.original_language_char.tuple[0]}
+#{@tp.column.original_source.tuple[0]}
+#{@tp.column.original_institution.tuple[0]}
+#{@tp.column.original_nationality.tuple[0]}
+#{@tp.column.rights_all.tuple[0]}
+#{@tp.column.rights_copyright_text.tuple[0]}
+#{@tp.column.rights_copyright_translation.tuple[0]}
+#{@tp.column.rights_copyright_illustrations.tuple[0]}
+#{@tp.column.rights_copyright_photographs.tuple[0]}
+#{@tp.column.rights_copyright_preparation.tuple[0]}
+#{@tp.column.rights_copyright_digitization.tuple[0]}
+#{@tp.column.rights_copyright_audio.tuple[0]}
+#{@tp.column.rights_copyright_video.tuple[0]}
+#{@tp.column.rights_license.tuple[0]}
+#{@tp.column.classify_topic_register.tuple[0]}
+#{@tp.column.classify_subject.tuple[0]}
+#{@tp.column.classify_loc.tuple[0]}
+#{@tp.column.classify_dewey.tuple[0]}
+#{@tp.column.classify_keywords.tuple[0]}
+#{@tp.column.identifier_oclc.tuple[0]}
+#{@tp.column.identifier_isbn.tuple[0]}
+#{@tp.column.notes_abstract.tuple[0]}
+#{@tp.column.notes_description.tuple[0]}
+#{@tp.column.notes_comment.tuple[0]}
+#{@tp.column.notes_history.tuple[0]}
+#{@tp.column.notes_format.tuple[0]}
+#{@tp.column.notes_relation.tuple[0]}
+#{@tp.column.notes_coverage.tuple[0]}
+#{@tp.column.notes_type.tuple[0]}
+#{@tp.column.notes_prefix.tuple[0]}
+#{@tp.column.notes_prefix_a.tuple[0]}
+#{@tp.column.notes_prefix_b.tuple[0]}
+#{@tp.column.notes_suffix.tuple[0]}
+#{@tp.column.src_filename.tuple[0]}
+#{@tp.column.src_fingerprint.tuple[0]}
+#{@tp.column.src_filesize.tuple[0]}
+#{@tp.column.src_word_count.tuple[0]}
+#{@tp.column.src_txt.tuple[0]}
+#{@tp.column.fulltext.tuple[0]}
+#{@tp.column.links.tuple[0]}
+tid)
+" +
+ "VALUES (
+#{@tp.column.title.tuple[1]}
+#{@tp.column.title_main.tuple[1]}
+#{@tp.column.title_sub.tuple[1]}
+#{@tp.column.title_short.tuple[1]}
+#{@tp.column.title_edition.tuple[1]}
+#{@tp.column.title_note.tuple[1]}
+#{@tp.column.title_language.tuple[1]}
+#{@tp.column.title_language_char.tuple[1]}
+#{@tp.column.creator_author.tuple[1]}
+#{@tp.column.creator_author_honorific.tuple[1]}
+#{@tp.column.creator_author_nationality.tuple[1]}
+#{@tp.column.creator_editor.tuple[1]}
+#{@tp.column.creator_contributor.tuple[1]}
+#{@tp.column.creator_illustrator.tuple[1]}
+#{@tp.column.creator_photographer.tuple[1]}
+#{@tp.column.creator_translator.tuple[1]}
+#{@tp.column.creator_prepared_by.tuple[1]}
+#{@tp.column.creator_digitized_by.tuple[1]}
+#{@tp.column.creator_audio.tuple[1]}
+#{@tp.column.creator_video.tuple[1]}
+#{@tp.column.language_document.tuple[1]}
+#{@tp.column.language_document_char.tuple[1]}
+#{@tp.column.language_original.tuple[1]}
+#{@tp.column.language_original_char.tuple[1]}
+#{@tp.column.date_added_to_site.tuple[1]}
+#{@tp.column.date_available.tuple[1]}
+#{@tp.column.date_created.tuple[1]}
+#{@tp.column.date_issued.tuple[1]}
+#{@tp.column.date_modified.tuple[1]}
+#{@tp.column.date_published.tuple[1]}
+#{@tp.column.date_valid.tuple[1]}
+#{@tp.column.date_translated.tuple[1]}
+#{@tp.column.date_original_publication.tuple[1]}
+#{@tp.column.date_generated.tuple[1]}
+#{@tp.column.publisher.tuple[1]}
+#{@tp.column.original_publisher.tuple[1]}
+#{@tp.column.original_language.tuple[1]}
+#{@tp.column.original_language_char.tuple[1]}
+#{@tp.column.original_source.tuple[1]}
+#{@tp.column.original_institution.tuple[1]}
+#{@tp.column.original_nationality.tuple[1]}
+#{@tp.column.rights_all.tuple[1]}
+#{@tp.column.rights_copyright_text.tuple[1]}
+#{@tp.column.rights_copyright_translation.tuple[1]}
+#{@tp.column.rights_copyright_illustrations.tuple[1]}
+#{@tp.column.rights_copyright_photographs.tuple[1]}
+#{@tp.column.rights_copyright_preparation.tuple[1]}
+#{@tp.column.rights_copyright_digitization.tuple[1]}
+#{@tp.column.rights_copyright_audio.tuple[1]}
+#{@tp.column.rights_copyright_video.tuple[1]}
+#{@tp.column.rights_license.tuple[1]}
+#{@tp.column.classify_topic_register.tuple[1]}
+#{@tp.column.classify_subject.tuple[1]}
+#{@tp.column.classify_loc.tuple[1]}
+#{@tp.column.classify_dewey.tuple[1]}
+#{@tp.column.classify_keywords.tuple[1]}
+#{@tp.column.identifier_oclc.tuple[1]}
+#{@tp.column.identifier_isbn.tuple[1]}
+#{@tp.column.notes_abstract.tuple[1]}
+#{@tp.column.notes_comment.tuple[1]}
+#{@tp.column.notes_description.tuple[1]}
+#{@tp.column.notes_history.tuple[1]}
+#{@tp.column.notes_format.tuple[1]}
+#{@tp.column.notes_relation.tuple[1]}
+#{@tp.column.notes_coverage.tuple[1]}
+#{@tp.column.notes_type.tuple[1]}
+#{@tp.column.notes_prefix.tuple[1]}
+#{@tp.column.notes_prefix_a.tuple[1]}
+#{@tp.column.notes_prefix_b.tuple[1]}
+#{@tp.column.notes_suffix.tuple[1]}
+#{@tp.column.src_filename.tuple[1]}
+#{@tp.column.src_fingerprint.tuple[1]}
+#{@tp.column.src_filesize.tuple[1]}
+#{@tp.column.src_word_count.tuple[1]}
+#{@tp.column.src_txt.tuple[1]}
+#{@tp.column.fulltext.tuple[1]}
+#{@tp.column.links.tuple[1]}
+#{@id}
+);"
+ if @md.opt.act[:maintenance][:set]==:on
+ puts "maintenance mode on: creating sql transaction file (for last transaction set (document) only):\n\t#{@file_maint.inspect}"
+ @file_maint.puts sql_entry
+ else
+ if @md.opt.act[:verbose_plus][:set]==:on
+ @file_maint.puts sql_entry
+ end
+ end
+ sql_entry
+ end
+ end
+ class LoadUrls
+ def initialize(conn,f,u,id,opt,file_maint)
+ @conn,@f,@u,@id,@opt,@file_maint=conn,f,u,id,opt,file_maint
+ end
+ def tuple
+ sql_entry="INSERT INTO urls (#{@f[:txt]} #{@f[:html_toc]} #{@f[:html_doc]} #{@f[:xhtml]} #{@f[:xml_sax]} #{@f[:xml_dom]} #{@f[:odf]} #{@f[:pdf_p]} #{@f[:pdf_l]} #{@f[:concordance]} #{@f[:latex_p]} #{@f[:latex_l]} #{@f[:manifest]} #{@f[:digest]} #{@f[:markup]} #{@f[:sisupod]} metadata_tid) " +
+ "VALUES (#{@u[:txt]} #{@u[:html_toc]} #{@u[:html_doc]} #{@u[:xhtml]} #{@u[:xml_sax]} #{@u[:xml_dom]} #{@u[:odf]} #{@u[:pdf_p]} #{@u[:pdf_l]} #{@u[:concordance]} #{@u[:latex_p]} #{@u[:latex_l]} #{@u[:manifest]} #{@u[:digest]} #{@u[:markup]} #{@u[:sisupod]} #{@id});"
+ if @opt.act[:maintenance][:set]==:on
+ @file_maint.puts sql_entry
+ else
+ if @opt.act[:verbose_plus][:set]==:on
+ @file_maint.puts sql_entry
+ end
+ end
+ sql_entry
+ end
+ end
+ class LoadEndnotes
+ def initialize(conn,en,opt,file_maint)
+ @conn,@en,@opt,@file_maint=conn,en,opt,file_maint
+ end
+ def tuple
+ sql_entry="INSERT INTO #{@en[:type]} (nid, document_lid, nr, clean, body, ocn, ocnd, ocns, metadata_tid, digest_clean) " +
+ "VALUES ('#{@en[:id]}', '#{@en[:lid]}', '#{@en[:nr]}', '#{@en[:txt]}', '#{@en[:body]}', '#{@en[:ocn]}', '#{@en[:ocnd]}', '#{@en[:ocns]}', '#{@en[:id_t]}', '#{@en[:hash]}');"
+ if @opt.act[:maintenance][:set]==:on
+ @file_maint.puts sql_entry
+ else
+ if @opt.act[:verbose_plus][:set]==:on
+ @file_maint.puts sql_entry
+ end
+ end
+ sql_entry
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_remove.rb b/lib/sisu/v6/db_remove.rb
new file mode 100644
index 0000000..650c84a
--- /dev/null
+++ b/lib/sisu/v6/db_remove.rb
@@ -0,0 +1,129 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_remove.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbRemove
+ class Remove
+ def initialize(opt,conn,file,sql_type)
+ @opt,@conn,@file,@sql_type=opt,conn,file,sql_type
+ @md=SiSU_Param::Parameters.new(@opt).get
+ @fnb=@md.fnb
+ @db=SiSU_Env::InfoDb.new
+ end
+ def remove
+ driver_sqlite3=if @sql_type=='sqlite'
+ (@conn.inspect.match(/^(.{10})/)[1]==@db.sqlite.conn_sqlite3.inspect.match(/^(.{10})/)[1]) \
+ ? true
+ : false
+ end
+ del_id=if driver_sqlite3
+ remove_selected=%{
+ SELECT tid
+ FROM metadata_and_text
+ WHERE src_filename = '#{@md.fns}'
+ AND metadata_and_text.language_document_char = '#{@opt.lng}'
+ ;} # note, for .ssm: @md.fns (is set during runtime & is) != @opt.fns @md.opt.fns
+ @conn.get_first_value(remove_selected).to_i
+ else
+ remove_selected=%{
+ SELECT metadata_and_text.tid
+ FROM metadata_and_text
+ WHERE metadata_and_text.src_filename = '#{@md.fns}'
+ AND metadata_and_text.language_document_char = '#{@opt.lng}'
+ ;} # note, for .ssm: @md.fns (is set during runtime & is) != @opt.fns @md.opt.fns
+ x=@conn.select_one(remove_selected)
+ x ? (x.join.to_i) : nil
+ end
+ if del_id
+ sql_entry=[
+ "DELETE FROM endnotes WHERE metadata_tid = '#{del_id}';",
+ "DELETE FROM endnotes_asterisk WHERE metadata_tid = '#{del_id}';",
+ "DELETE FROM endnotes_plus WHERE metadata_tid = '#{del_id}';",
+ "DELETE FROM doc_objects WHERE metadata_tid = '#{del_id}';",
+ "DELETE FROM urls WHERE metadata_tid = '#{del_id}';",
+ "DELETE FROM metadata_and_text WHERE metadata_and_text.tid = '#{del_id}';",
+ ]
+ if driver_sqlite3
+ @conn.transaction
+ sql_entry.each do |s|
+ @conn.execute(s)
+ end
+ @conn.commit if driver_sqlite3
+ else
+ sql_entry.each do |s|
+ @conn.execute(s)
+ end
+ end
+ if @opt.act[:maintenance][:set]==:on
+ @file.puts sql_entry
+ end
+ else
+ if (@opt.act[:verbose][:set]==:on \
+ || @opt.act[:verbose_plus][:set]==:on \
+ || @opt.act[:maintenance][:set]==:on)
+ SiSU_Screen::Ansi.new(@opt.cmd,"no such file in database #{@db.psql.db}::#{@opt.fns}").puts_grey
+ end
+ end
+ end
+ end
+end
+__END__
diff --git a/lib/sisu/v6/db_select.rb b/lib/sisu/v6/db_select.rb
new file mode 100644
index 0000000..56b424d
--- /dev/null
+++ b/lib/sisu/v6/db_select.rb
@@ -0,0 +1,225 @@
+# encoding: utf-8
+=begin
+
+ * Name: SiSU
+
+ * Description: a framework for document structuring, publishing and search
+
+ * Author: Ralph Amissah
+
+ * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+ 2007, 2008, 2009, 2010, 2011, 2012, 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=lib/sisu/v6/db_select.rb;hb=HEAD>
+
+ * Ralph Amissah
+ <ralph@amissah.com>
+ <ralph.amissah@gmail.com>
+
+ ** Description: modules shared by the different db types, dbi, postgresql,
+ sqlite
+
+=end
+module SiSU_DbSelect
+ class Case
+ def initialize(opt,conn='',sql_type='pg')
+ @opt,@conn,@sql_type=opt,conn,sql_type
+ @db=SiSU_Env::InfoDb.new
+ @file_maint=sql_maintenance_file
+ @sdb=SiSU_DbDBI::Create.new(@opt,@conn,@file_maint,@sql_type) # db_dbi.rb
+ @sdb_index=SiSU_DbDBI::Index.new(@opt,@conn,@file_maint,@sql_type) # db_dbi.rb
+ @sdb_no=SiSU_DbDBI::Drop.new(@opt,@conn,@db,@sql_type) # db_dbi.rb
+ if @opt.mod.inspect =~/update|import/
+ @sdb_import=SiSU_DbDBI::Import.new(@opt,@conn,@file_maint,@sql_type)
+ @sdb_remove_doc=SiSU_DbDBI::Remove.new(@opt,@conn,@file_maint,@sql_type)
+ elsif @opt.mod.inspect =~/remove/
+ @sdb_remove_doc=SiSU_DbDBI::Remove.new(@opt,@conn,@file_maint,@sql_type)
+ end
+ end
+ def db_exist?
+ if @sql_type=='sqlite' \
+ and (not (FileTest.file?(@db.sqlite.db)) or FileTest.zero?(@db.sqlite.db))
+ puts %{no