From 65477054fd798728bf186aa2938727ddddbe86a5 Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Tue, 22 May 2007 02:06:46 +0100 Subject: Imported upstream version 0.52.7 --- lib/sisu/0.52/cgi.rb | 76 + lib/sisu/0.52/cgi_pgsql.rb | 214 +++ lib/sisu/0.52/cgi_sql_common.rb | 809 ++++++++++ lib/sisu/0.52/cgi_sqlite.rb | 207 +++ lib/sisu/0.52/character_encoding.rb | 369 +++++ lib/sisu/0.52/composite.rb | 215 +++ lib/sisu/0.52/concordance.rb | 311 ++++ lib/sisu/0.52/conf.rb | 245 +++ lib/sisu/0.52/css.rb | 1939 +++++++++++++++++++++++ lib/sisu/0.52/dal.rb | 1089 +++++++++++++ lib/sisu/0.52/dal_doc_str.rb | 220 +++ lib/sisu/0.52/dal_doc_str_code.rb | 153 ++ lib/sisu/0.52/dal_doc_str_tables.rb | 180 +++ lib/sisu/0.52/dal_syntax.rb | 330 ++++ lib/sisu/0.52/db_columns.rb | 209 +++ lib/sisu/0.52/db_create.rb | 530 +++++++ lib/sisu/0.52/db_drop.rb | 124 ++ lib/sisu/0.52/db_import.rb | 735 +++++++++ lib/sisu/0.52/db_indexes.rb | 95 ++ lib/sisu/0.52/db_load_tuple.rb | 94 ++ lib/sisu/0.52/db_remove.rb | 86 + lib/sisu/0.52/db_select.rb | 158 ++ lib/sisu/0.52/db_tests.rb | 104 ++ lib/sisu/0.52/dbi.rb | 119 ++ lib/sisu/0.52/defaults.rb | 2045 ++++++++++++++++++++++++ lib/sisu/0.52/digests.rb | 364 +++++ lib/sisu/0.52/docbook.rb | 561 +++++++ lib/sisu/0.52/errors.rb | 72 + lib/sisu/0.52/help.rb | 1906 ++++++++++++++++++++++ lib/sisu/0.52/html.rb | 719 +++++++++ lib/sisu/0.52/html_format.rb | 1056 +++++++++++++ lib/sisu/0.52/html_format_css.rb | 473 ++++++ lib/sisu/0.52/html_promo.rb | 382 +++++ lib/sisu/0.52/html_scroll.rb | 231 +++ lib/sisu/0.52/html_segments.rb | 471 ++++++ lib/sisu/0.52/html_table.rb | 141 ++ lib/sisu/0.52/html_tune.rb | 376 +++++ lib/sisu/0.52/hub.rb | 573 +++++++ lib/sisu/0.52/i18n.rb | 1528 ++++++++++++++++++ lib/sisu/0.52/manifest.rb | 528 +++++++ lib/sisu/0.52/odf.rb | 725 +++++++++ lib/sisu/0.52/odf_format.rb | 225 +++ lib/sisu/0.52/options.rb | 168 ++ lib/sisu/0.52/param.rb | 791 ++++++++++ lib/sisu/0.52/param_identify_markup.rb | 87 ++ lib/sisu/0.52/plaintext.rb | 473 ++++++ lib/sisu/0.52/plaintext_format.rb | 100 ++ lib/sisu/0.52/relaxng.rb | 1155 ++++++++++++++ lib/sisu/0.52/remote_put.rb | 103 ++ lib/sisu/0.52/response.rb | 61 + lib/sisu/0.52/rexml.rb | 118 ++ lib/sisu/0.52/screen_text_color.rb | 404 +++++ lib/sisu/0.52/semantics.rb | 388 +++++ lib/sisu/0.52/share_src.rb | 88 ++ lib/sisu/0.52/share_src_kdissert.rb | 82 + lib/sisu/0.52/shared_db.rb | 78 + lib/sisu/0.52/shared_html.rb | 55 + lib/sisu/0.52/shared_html_lite.rb | 180 +++ lib/sisu/0.52/shared_txt.rb | 299 ++++ lib/sisu/0.52/shared_xml.rb | 580 +++++++ lib/sisu/0.52/sisupod_make.rb | 316 ++++ lib/sisu/0.52/sitemaps.rb | 213 +++ lib/sisu/0.52/spell.rb | 91 ++ lib/sisu/0.52/sst_convert_markup.rb | 298 ++++ lib/sisu/0.52/sst_do_inline_footnotes.rb | 461 ++++++ lib/sisu/0.52/sst_from_kdissert.rb | 176 +++ lib/sisu/0.52/sst_from_xml.rb | 148 ++ lib/sisu/0.52/sst_identify_markup.rb | 322 ++++ lib/sisu/0.52/sst_to_s_xml_dom.rb | 563 +++++++ lib/sisu/0.52/sst_to_s_xml_node.rb | 636 ++++++++ lib/sisu/0.52/sst_to_s_xml_sax.rb | 434 ++++++ lib/sisu/0.52/sysenv.rb | 2517 ++++++++++++++++++++++++++++++ lib/sisu/0.52/termsheet.rb | 158 ++ lib/sisu/0.52/texinfo.rb | 408 +++++ lib/sisu/0.52/texinfo_format.rb | 507 ++++++ lib/sisu/0.52/texpdf.rb | 611 ++++++++ lib/sisu/0.52/texpdf_format.rb | 1222 +++++++++++++++ lib/sisu/0.52/update.rb | 123 ++ lib/sisu/0.52/urls.rb | 229 +++ lib/sisu/0.52/vocab.rb | 113 ++ lib/sisu/0.52/vocab_lex.rb | 144 ++ lib/sisu/0.52/webrick.rb | 163 ++ lib/sisu/0.52/wikispeak.rb | 391 +++++ lib/sisu/0.52/xhtml.rb | 483 ++++++ lib/sisu/0.52/xml.rb | 505 ++++++ lib/sisu/0.52/xml_dom.rb | 537 +++++++ lib/sisu/0.52/xml_format.rb | 339 ++++ lib/sisu/0.52/xml_tables.rb | 202 +++ lib/sisu/0.52/zap.rb | 73 + 89 files changed, 38580 insertions(+) create mode 100644 lib/sisu/0.52/cgi.rb create mode 100644 lib/sisu/0.52/cgi_pgsql.rb create mode 100644 lib/sisu/0.52/cgi_sql_common.rb create mode 100644 lib/sisu/0.52/cgi_sqlite.rb create mode 100644 lib/sisu/0.52/character_encoding.rb create mode 100644 lib/sisu/0.52/composite.rb create mode 100644 lib/sisu/0.52/concordance.rb create mode 100644 lib/sisu/0.52/conf.rb create mode 100644 lib/sisu/0.52/css.rb create mode 100644 lib/sisu/0.52/dal.rb create mode 100644 lib/sisu/0.52/dal_doc_str.rb create mode 100644 lib/sisu/0.52/dal_doc_str_code.rb create mode 100644 lib/sisu/0.52/dal_doc_str_tables.rb create mode 100644 lib/sisu/0.52/dal_syntax.rb create mode 100644 lib/sisu/0.52/db_columns.rb create mode 100644 lib/sisu/0.52/db_create.rb create mode 100644 lib/sisu/0.52/db_drop.rb create mode 100644 lib/sisu/0.52/db_import.rb create mode 100644 lib/sisu/0.52/db_indexes.rb create mode 100644 lib/sisu/0.52/db_load_tuple.rb create mode 100644 lib/sisu/0.52/db_remove.rb create mode 100644 lib/sisu/0.52/db_select.rb create mode 100644 lib/sisu/0.52/db_tests.rb create mode 100644 lib/sisu/0.52/dbi.rb create mode 100644 lib/sisu/0.52/defaults.rb create mode 100644 lib/sisu/0.52/digests.rb create mode 100644 lib/sisu/0.52/docbook.rb create mode 100644 lib/sisu/0.52/errors.rb create mode 100644 lib/sisu/0.52/help.rb create mode 100644 lib/sisu/0.52/html.rb create mode 100644 lib/sisu/0.52/html_format.rb create mode 100644 lib/sisu/0.52/html_format_css.rb create mode 100644 lib/sisu/0.52/html_promo.rb create mode 100644 lib/sisu/0.52/html_scroll.rb create mode 100644 lib/sisu/0.52/html_segments.rb create mode 100644 lib/sisu/0.52/html_table.rb create mode 100644 lib/sisu/0.52/html_tune.rb create mode 100644 lib/sisu/0.52/hub.rb create mode 100644 lib/sisu/0.52/i18n.rb create mode 100644 lib/sisu/0.52/manifest.rb create mode 100644 lib/sisu/0.52/odf.rb create mode 100644 lib/sisu/0.52/odf_format.rb create mode 100644 lib/sisu/0.52/options.rb create mode 100644 lib/sisu/0.52/param.rb create mode 100644 lib/sisu/0.52/param_identify_markup.rb create mode 100644 lib/sisu/0.52/plaintext.rb create mode 100644 lib/sisu/0.52/plaintext_format.rb create mode 100644 lib/sisu/0.52/relaxng.rb create mode 100644 lib/sisu/0.52/remote_put.rb create mode 100644 lib/sisu/0.52/response.rb create mode 100644 lib/sisu/0.52/rexml.rb create mode 100644 lib/sisu/0.52/screen_text_color.rb create mode 100644 lib/sisu/0.52/semantics.rb create mode 100644 lib/sisu/0.52/share_src.rb create mode 100644 lib/sisu/0.52/share_src_kdissert.rb create mode 100644 lib/sisu/0.52/shared_db.rb create mode 100644 lib/sisu/0.52/shared_html.rb create mode 100644 lib/sisu/0.52/shared_html_lite.rb create mode 100644 lib/sisu/0.52/shared_txt.rb create mode 100644 lib/sisu/0.52/shared_xml.rb create mode 100644 lib/sisu/0.52/sisupod_make.rb create mode 100644 lib/sisu/0.52/sitemaps.rb create mode 100644 lib/sisu/0.52/spell.rb create mode 100644 lib/sisu/0.52/sst_convert_markup.rb create mode 100644 lib/sisu/0.52/sst_do_inline_footnotes.rb create mode 100644 lib/sisu/0.52/sst_from_kdissert.rb create mode 100644 lib/sisu/0.52/sst_from_xml.rb create mode 100644 lib/sisu/0.52/sst_identify_markup.rb create mode 100644 lib/sisu/0.52/sst_to_s_xml_dom.rb create mode 100644 lib/sisu/0.52/sst_to_s_xml_node.rb create mode 100644 lib/sisu/0.52/sst_to_s_xml_sax.rb create mode 100644 lib/sisu/0.52/sysenv.rb create mode 100644 lib/sisu/0.52/termsheet.rb create mode 100644 lib/sisu/0.52/texinfo.rb create mode 100644 lib/sisu/0.52/texinfo_format.rb create mode 100644 lib/sisu/0.52/texpdf.rb create mode 100644 lib/sisu/0.52/texpdf_format.rb create mode 100644 lib/sisu/0.52/update.rb create mode 100644 lib/sisu/0.52/urls.rb create mode 100644 lib/sisu/0.52/vocab.rb create mode 100644 lib/sisu/0.52/vocab_lex.rb create mode 100644 lib/sisu/0.52/webrick.rb create mode 100644 lib/sisu/0.52/wikispeak.rb create mode 100644 lib/sisu/0.52/xhtml.rb create mode 100644 lib/sisu/0.52/xml.rb create mode 100644 lib/sisu/0.52/xml_dom.rb create mode 100644 lib/sisu/0.52/xml_format.rb create mode 100644 lib/sisu/0.52/xml_tables.rb create mode 100644 lib/sisu/0.52/zap.rb (limited to 'lib') diff --git a/lib/sisu/0.52/cgi.rb b/lib/sisu/0.52/cgi.rb new file mode 100644 index 00000000..83448613 --- /dev/null +++ b/lib/sisu/0.52/cgi.rb @@ -0,0 +1,76 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: generates naive cgi search form for search of sisu database (pgsql sqlite) + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah mailto:ralph@amissah.com + Ralph Amissah mailto:amissah@gmail.com + +=end +module SiSU_CGI #% database building documents + require SiSU_lib + '/sysenv' + require SiSU_lib + '/cgi_pgsql' + require SiSU_lib + '/cgi_sqlite' + include SiSU_CGI_pgsql + class SiSU_search + def initialize(opt) + @opt=opt + @webserv=@opt.files[0].to_s.strip + end + def search_info + a=%{ + For help on sisu search, type: + sisu --help search + For help on setting up hyperestraier for sisu, type: + sisu --help hyperestraier + } + tell=SiSU_Screen::Ansi.new(@opt.cmd,a) + tell.print_grey + end + def read + SiSU_CGI_sqlite::SiSU_search_sqlite.new(@opt,@webserv).sqlite + SiSU_CGI_pgsql::SiSU_search_pgsql.new(@opt,@webserv).pgsql + search_info unless @opt.cmd =~/q/ + end + end +end +__END__ diff --git a/lib/sisu/0.52/cgi_pgsql.rb b/lib/sisu/0.52/cgi_pgsql.rb new file mode 100644 index 00000000..a5a2ef93 --- /dev/null +++ b/lib/sisu/0.52/cgi_pgsql.rb @@ -0,0 +1,214 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: generates naive cgi search form for search of sisu database (pgsql sqlite) + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah mailto:ralph@amissah.com + Ralph Amissah mailto:amissah@gmail.com + +=end +module SiSU_CGI_pgsql #% database building documents + require SiSU_lib + '/sysenv' + require SiSU_lib + '/cgi_sql_common' + include SiSU_CGI_sql + class SiSU_search_pgsql < SiSU_CGI_common + def initialize(opt,webserv) + @opt,@webserv=opt,webserv + @env=SiSU_Env::Info_env.new('',opt) + @sys=SiSU_Env::System_call.new + @image_src="#{@env.url.webserv_cgi}/_sisu/image" + @common=SiSU_CGI_sql::SiSU_CGI_common.new(@webserv,@opt.cmd,@image_src,@env) + @db=SiSU_Env::Info_db.new + #p @db.port_psql + end + def pgsql + serve=[] + if @sys.psql + available_db_table=`psql --list` # system call requires psql + available_db=available_db_table.scan(/(SiSU_\S+)/) if not available_db_table.nil? + if available_db and available_db.class == Array + available_db.flatten.each do |x| + serve << x.gsub(/SiSU_(\S+)/,'\1') + end + else put "WARNING: no postgresql database available, (have you created one?)" + end + serve.sort! + f1,f2,f3=[],[],[] + serve.each do |x| + f1 << %{ \n} unless x =~/apache|sisu\/image/ #check + end + f2 << %{ selected_db=case cgi['db']\n} + serve.each do |x| + f2 << %{ when /SiSU_#{x}/; ''\n} unless x =~/apache|sisu\/image/ #check + end + end + f2 << " end\n" + if FileTest.writable?('.') + output=File.open('sisu_pgsql.cgi','w') + output << header0 << header1 << header_desc << header2 << f1 << buttons1 << buttons_note << buttons2 << search_request << search_statement << search_statement_common << search_query1 << @common.pages << search_query2 << @common.tail << @common.main1 << f2 << dbi_connect << @common.main2 + a=%{ generated sisu_pgsql.cgi, + BASED ON ALREADY EXISTING directories that could potentially be used to populate postgresql db, (-D) + } + tell=SiSU_Screen::Ansi.new(@opt.cmd,a) + tell.print_grey + c=case @webserv + when /pwd/; '' + else "if necessary make the directory /usr/lib/cgi-bin : + sudo cp -vi #{Dir.pwd}/sisu_pgsql.cgi /usr/lib/cgi-bin/. + sudo chmod -v 755 /usr/lib/cgi-bin/sisu_pgsql.cgi + (copy sisu_pgsql.cgi to your cgi directory) and set file permissions to 755" + end + a=%{#{c} + #{@env.webserv_base_cgi}/cgi-bin/sisu_pgsql.cgi + } + tell=SiSU_Screen::Ansi.new(@opt.cmd,a) + tell.warn + a="postgresql db used for present directory: #{@db.db_psql}" + b="\n\t(to create and populate postgresql database see 'man sisu' and in particular the -D flag)\n\t[the database to be used for this directory (#{@db.db_psql}) will have to be created manually if it does not exist,\n\tsee 'sisu --help sql'\n\tif you have permission to create databases:\n\t'sisu -d --createdb'\n\tor using postgresql tools directly:\n\t'createdb #{@db.db_psql}'\n\tfor a list of existing databases try 'psql --list']" + tell=SiSU_Screen::Ansi.new(@opt.cmd,a,b) + tell.txt_cyan + else puts 'failed in attempt to write sisu_pgsql.cgi 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' + @version='sisu_pgsql' + @image_src="#{@env.url.webserv_cgi}/_sisu/image" + @hosturl_db="#{@env.url.webserv_base_cgi}" + @hosturl_files="#{@env.url.webserv_files_from_db}" + @port="#{@db.port_psql}" + user='' # '#{@env.user}' + WOK_SQL + end + def search_statement + <<-'WOK_SQL' + class Dbi_search_string + def initialize(l,t,q) + @l,@t,@q=l,t,q + end + def string + search={ :search => [],:flag => false } + if @t =~/\S+/ or @q =~/\S+/ + if @t =~/\S+/; unescaped_search=CGI.unescape(@t) + elsif @q =~/\S+/; unescaped_search=CGI.unescape(@q) + end + search_construct=[] + unescaped_search.gsub!(/\s*(AND|OR)\s*/,"' \) \\1 #@l~\( '") + unescaped_search.gsub!(/(.+)/,"#@l~\( '\\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 buttons_note + ' case sensitive' + end + def search_query1 + <<-'WOK_SQL' + @search_text,@search_endnotes=[],[] + #% + search[:text].each{|x| @search_text << "#{x} AND " } + @search_text=@search_text.to_s.gsub!(/AND\s+$/,'') + @search_text.gsub!(/(documents\.clean~\(\s*'[^']+'\s*\)\s+(?:(?:AND|OR)\s+documents\.clean~\(\s*'[^']+'\s*\))+)/,'(\1)') + search[:endnotes].each{|x| @search_endnotes << "#{x} AND " } + @search_endnotes=@search_endnotes.to_s.gsub!(/AND\s+$/,'') + @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.title, metadata.creator, metadata.filename, metadata.suffix, documents.body, documents.seg, documents.ocn, metadata.tid FROM documents, metadata WHERE (#@search_text) AND documents.metadata_tid = metadata.tid ORDER BY metadata.title, documents.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.title, metadata.creator, metadata.filename, endnotes.body, endnotes.nr, endnotes.ocn, endnotes.metadata_tid FROM metadata, endnotes WHERE (#@search_endnotes) AND metadata.tid = endnotes.metadata_tid ORDER BY metadata.title, endnotes.nr} + @sql_statement[:range]=%{LIMIT #{limit} OFFSET #{offset} ;} + select=@sql_statement[:endnotes] + ' ' + @sql_statement[:range] + select + end + def sql_select_body_format + %{#{sql_select_body}} + end + def sql_select_endnotes_format + %{#{sql_select_endnotes}} + 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:Pg:database=#{@db};port=#{@port}" + @conn=DBI.connect(dbi,user) + WOK_SQL + end + end +end +__END__ diff --git a/lib/sisu/0.52/cgi_sql_common.rb b/lib/sisu/0.52/cgi_sql_common.rb new file mode 100644 index 00000000..ae4e170f --- /dev/null +++ b/lib/sisu/0.52/cgi_sql_common.rb @@ -0,0 +1,809 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: generates naive cgi search form for search of sisu database (pgsql sqlite) + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah mailto:ralph@amissah.com + Ralph Amissah mailto:amissah@gmail.com + +=end +module SiSU_CGI_sql + class SiSU_CGI_common + def initialize(webserv,cmd,image_src,dir) + @webserv,@cmd,@image_src,@env=webserv,cmd,image_src,dir + 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' + + Copyright (C) 2007 Ralph Amissah + Copyright (C) 2005 Ralph Amissah (first release edition) + Copyright (C) 1997 Ralph Amissah (first edition) + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah ralph@amissah.com + Ralph Amissah ralph.amissah@gmail.com + WOK_SQL + end + def header1 + <<-'WOK_SQL' +#Common TOP + @@limit,@@offset=1000,0 + @base="#@hosturl_db/cgi-bin/#@version.cgi" + @@canned_search_url=@base + class Form + def initialize(base,search_field,selected_db,checked_index,checked_text,checked_tip,checked_searched,checked_url,checked_echo,checked_sql,checked_all,checked_none,checked_ignore,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,@checked_index,@checked_text,@checked_tip,@checked_searched,@checked_url,@checked_echo,@checked_sql,@checked_all,@checked_none,@checked_ignore,@search_note,@the_can=base,search_field,selected_db,checked_index,checked_text,checked_tip,checked_searched,checked_url,checked_echo,checked_sql,checked_all,checked_none,checked_ignore,search_note,the_can + @tip=if checked_tip =~/\S/ + 'text:__; keywords:__; title:__; author:__; subject:__; description:__; publisher:__; contributor:__; date:__; type:__; format:__; identifier:__; source:__; language:__; relation:__; coverage:__; rights:__; comment:__; abstract:__; filename:__;' + else '' + end + end + def submission_form + search_form=<<-WOK + WOK_SQL + end + def header_desc + <<-WOK_SQL + + + + + SiSU search form (sample): SiSU information Structuring Universe + + + + + + + + + + +
SiSU --> + + +
+ WOK_SQL + end + def header2 + <<-'WOK_SQL' + +
+
+ + + + select which database to search + +
+ + + index + text / grep + +
+ + +
+ +
+ WOK_SQL + end + def buttons2 + <<-'WOK_SQL' +
+ #@tip + #@search_note + #@the_can +
+
+ + echo previous search + search result stats + url for search + available search fields + sql statement +
+ checks: + selected + all + none +
+ +
+ + WOK + end + end + WOK_SQL + end + def search_request + <<-'WOK_SQL' + class Search_request #% search_for + attr_accessor :text1,:keywords,:title,:author,:subject,:description,:publisher,: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=@keywords=@title=@author=@subject=@description=@publisher=@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:') + @keywords=text_to_match('key(?:words?)?:') + @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 + @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 + @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 @comment or @abstract or @rights or @subject or @publisher or @date or @filename + else + @text1=q['s1'] if q['s1']=~/\S/ + @keywords=q['key'] if q['key']=~/\S/ + @title=q['ti'] if q['ti']=~/\S/ + @author=q['au'] if q['au']=~/\S/ + @subject=q['sj'] if q['sj']=~/\S/ + @description=q['dsc'] if q['dsc']=~/\S/ + @publisher=q['pb'] if q['pb']=~/\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=q['fns'] if q['fns']=~/\S/ + @@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]; m[:braces].match(@search_field)[1] + elsif @search_field =~m[:string]; m[:string].match(@search_field)[1] + else + str=m[:word].match(@search_field)[1] + str.gsub!(/[()]/,'') + str + end + search_string.strip! + search_string.gsub!(/\s+/,'+') + search_string + #else + # "__" + end + end + end + WOK_SQL + end + def search_statement_common + <<-'WOK_SQL' + class Dbi_search_statement + attr_reader :text_search_flag,:sql_select_body_format,:sql_select_endnotes_format,:sql_offset,:sql_limit + def initialize(conn,search_for,q) + @conn=conn + @text_search_flag=false + @sql_statement={ :body=>'',:endnotes=>'',:range=>'' } + #@offset||=@@offset + #@offset+=@@limit + search={ :text => [],:endnotes => [] } + st=Dbi_search_string.new('documents.clean',search_for.text1,q['s1']).string + se=Dbi_search_string.new('endnotes.clean',search_for.text1,q['s1']).string + @text_search_flag=st[:flag] + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << se[:search] + end + st=Dbi_search_string.new('metadata.keywords',search_for.keywords,q['key']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.title',search_for.title,q['ti']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.creator',search_for.author,q['au']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.subject',search_for.subject,q['sj']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.description',search_for.description,q['dsc']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.publisher',search_for.publisher,q['pb']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.contributor',search_for.contributor,q['cntr']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.date',search_for.date,q['dt']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.type',search_for.type,q['ty']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.identifier',search_for.identifier,q['id']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.source',search_for.source,q['src']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.language',search_for.language,q['lang']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.relation',search_for.relation,q['rel']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.coverage',search_for.coverage,q['cov']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.rights',search_for.rights,q['cr']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.comment',search_for.comment,q['co']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.abstract',search_for.abstract,q['ab']).string + if st[:flag] + search[:text] << st[:search] + search[:endnotes] << st[:search] + end + st=Dbi_search_string.new('metadata.filename',search_for.filename,q['fns']).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_limit + @@limit + end + def sql_canned_search + @offset_next=sql_offset.to_i + sql_limit.to_i + @offset_previous=sql_offset.to_i - sql_limit.to_i + def current + @@canned_search_url.to_s + '<d=' + sql_limit.to_s + '&off=' + sql_offset.to_s + end + def next + @@canned_search_url.to_s + '<d=' + sql_limit.to_s + '&off=' + @offset_next.to_s + end + def previous + @offset_previous >= 0 ? (@@canned_search_url.to_s + '<d=' + sql_limit.to_s + '&off=' + @offset_previous.to_s) : '' + end + def start + @@canned_search_url.to_s + '<d=' + sql_limit.to_s + '&off=' + 0.to_s + end + self + end + def sql_canned_search_url + can=sql_canned_search + page=(sql_offset.to_i + sql_limit.to_i)/sql_limit.to_i + case page.to_s + when /^1$/ + %{

+ pg. #{page.to_s} +   > +
} + when /^2$/ + %{

+ <   + pg. #{page.to_s} +   > +
} + else + %{

+ |<   + <   + pg. #{page.to_s} +   > +
} + end + end + WOK_SQL + end + def tail + <<-WOK_SQL + def tail + <<-'WOK' +


+
+ + +

+ presentations' look and feel
+ generated by
+ SiSU in Ruby with the usual GPL (or OSS) suspects - Way Better!
+ SiSU
+ version 0.50
2007w11/1 (2007-03-12)
+ + + © Ralph Amissah
+ 1993, current 2007
+ GPL 2
+ w3 since October 3 1993
+ ralph@amissah.com
+

+
+ +

the usual GPL (or OSS) suspects:
Better - "performance, reliability, scalability, security
& total cost of ownership"
[not to mention flexibility & choice]

<<Way Better!>>

+ +
+ + 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'] =~/\S+/; + @stub=/SiSU_(\S+)/.match(cgi['db'])[1] + cgi['db'] + else + @stub='sisu' + 'SiSU_sisu' + end + checked_url,checked_searched,checked_tip,checked_echo,checked_sql,checked_all,checked_none,checked_ignore,selected_db='','','','','','','','' + if cgi['view']=~/text/; checked_index,checked_text='','checked' + else checked_index,checked_text='checked','' + end + 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_echo='checked' if cgi['echo'] =~/\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_url=checked_searched=checked_tip=checked_echo=checked_sql='checked' + checked_none='' + elsif cgi['checks'] =~/check_none/ #or cgi['a'].to_i==0 + checked_none='checked' + checked_all=checked_url=checked_searched=checked_tip=checked_echo=checked_sql='' + else checked_ignore='checked' + end + WOK_SQL + end + def main2 + <<-'WOK_SQL' + search_field=cgi['find'] if cgi['find'] # =~/\S+/ + @search_for=Search_request.new(search_field,q) #.analyze #% search_for + #% searches + #Canned_search.new(@base,@search_for.text1,cgi) + if @search_for.text1=~/\S+/ or @search_for.author=~/\S+/ #and search_field =~/\S/ + s1='s1=' + CGI.escape(@search_for.text1) if @search_for.text1=~/\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/ + 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/ + 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=if checked_all =~/checked/ + "#@base?#{s1}#{key}#{ti}#{au}#{sj}#{dsc}#{pb}#{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" + else "#@base?#{s1}#{key}#{ti}#{au}#{sj}#{dsc}#{pb}#{cntr}#{dt}#{ty}#{id}#{src}#{lang}#{rel}#{cov}#{cr}#{co}#{ab}#{dtc}#{dti}#{dtm}#{dta}#{dtv}#{fns}&db=#{cgi['db']}&view=#{cgi['view']}&u=1&e=1" + end + @search[:text][1]=%{documents.clean~'#{@search_for.text1}'} #s1 + @search[:endnotes][1]=%{endnotes.clean~'#{@search_for.text1}'} #s1 + canned_note='previous search url:' + else + @@canned_search_url="#@base?s1=United+Nations&db=documents&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|au|ti|fns)=[^&]+/) + af=canned_search.join('; ') + af.gsub!(/s1=/,'text: ') + af.gsub!(/au=/,'author: ') + af.gsub!(/ti=/,'title: ') + af.gsub!(/fns=/,'filename: ') + af.gsub!(/%2B/,' ') + analyze_format=af + st=af.split(/\s*;\s*/) + search_field=st.join("\n") + end + green=%{} + canned_search_url_txt=CGI.escapeHTML(@@canned_search_url) + the_can=%{#{canned_note}
#{canned_search_url_txt}

} + p_text=p_keywords=p_title=p_author=p_subject=p_description=p_publisher=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_subject=p_filename='' + p_text=%{text: #{green}#{@search_for.text1}

} if @search_for.text1 =~/\S+/ + p_keywords=%{keywords: #{green}#{@search_for.keywords}

} if @search_for.keywords =~/\S+/ + p_title=%{title: #{green}#{@search_for.title}
} if @search_for.title =~/\S+/ + p_author=%{author: #{green}#{@search_for.author}
} if @search_for.author =~/\S+/ + p_subject=%{subject: #{green}#{@search_for.subject}
} if @search_for.subject =~/\S+/ + p_description=%{description: #{green}#{@search_for.description}
} if @search_for.description =~/\S+/ + p_publisher=%{publisher: #{green}#{@search_for.publisher}
} if @search_for.publisher =~/\S+/ + p_contributor=%{contributor: #{green}#{@search_for.contributor}
} if @search_for.contributor =~/\S+/ + p_date=%{date: #{green}#{@search_for.date}
} if @search_for.date =~/\S+/ + p_type=%{type: #{green}#{@search_for.type}
} if @search_for.type =~/\S+/ + p_format=%{format: #{green}#{@search_for.format}
} if @search_for.format =~/\S+/ + p_identifier=%{identifier: #{green}#{@search_for.identifier}
} if @search_for.identifier =~/\S+/ + p_source=%{source: #{green}#{@search_for.source}
} if @search_for.source =~/\S+/ + p_language=%{language: #{green}#{@search_for.language}
} if @search_for.language =~/\S+/ + p_relation=%{relation: #{green}#{@search_for.relation}
} if @search_for.relation =~/\S+/ + p_coverage=%{coverage: #{green}#{@search_for.coverage}
} if @search_for.coverage =~/\S+/ + p_rights=%{rights: #{green}#{@search_for.rights}
} if @search_for.rights =~/\S+/ + p_comment=%{comment: #{green}#{@search_for.comment}
} if @search_for.comment =~/\S+/ + p_abstract=%{abstract: #{green}#{@search_for.abstract}
} if @search_for.abstract =~/\S+/ + p_filename=%{filename: #{green}#{@search_for.filename}
} if @search_for.filename =~/\S+/ + search_note=<<-WOK + +
previous selection:
+ database: #{green}#@db
; selected view: #{green}#{cgi['view']}
+ search string: "#{green}#{analyze_format}"
+ #{p_text} #{p_keywords} #{p_title} #{p_author} #{p_subject} #{p_description} #{p_publisher} #{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} + + WOK + #eg = %{canned search e.g.:
#{url}
find: #{analyze}
database: #{database}} + #dbi_canning + @header=Form.new(@base,search_field,selected_db,checked_index,checked_text,checked_tip,checked_searched,checked_url,checked_echo,checked_sql,checked_all,checked_none,checked_ignore,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=if @search_for.text1 =~/\S/ + @search_for.text1 + else 'Unavailable' + end + @search[:text]<<%{documents.clean~'#{CGI.unescape(s1)}'} + @search[:endnotes]<<%{endnotes.clean~'#{CGI.unescape(s1)}'} + #dbi_request + dbi_statement=Dbi_search_statement.new(@conn,@search_for,q) + @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 << '



Main Text:
' << sql_select_body + @endnotes << '



Endnotes:
' << sql_select_endnotes + else + end + #text_objects_body + s_contents.each do |c| #% text body + location=c['filename'][/(.+?)\.(?:_?sst|ssm)$/,1] + file_suffix=c['filename'][/.+?\.(_?sst|ssm)$/,1] + lang=if location =~ /\S+?~(\S\S\S?)$/ + l=location[/\S+?~(\S\S\S?)$/,1] + location.gsub!(/(\S+?)~\S\S\S?/,'\1') + l=".#{l}" + else '' + end + #metadata_found_body + if c['tid'].to_i != oldtid.to_i + title=%{#{c['title']} by #{c['creator']} pdf portraitpdf landscape manifest ?
} if file_suffix=~/s/ #hmm watch file_suffix + if @text_search_flag; title='

'+title + else title='
'+title + end + @counter_txt_doc+=1 + oldtid=c['tid'].to_i + else title='' + end + if @text_search_flag + if cgi['view']=~/text/ #% 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| + if g.to_s =~/(AND|OR)/ + search_regex << '|' + else search_regex << %{#{g.to_s}} + end + end + search_regex=search_regex.join(' ') + search_regex=search_regex.gsub(/\s*\|\s*/,'|') + search_regex.to_s + else nil + end + else nil + end + matched_para=(@search_regx.to_s.class==String && @search_regx.to_s=~/\S\S+/) ? (c['body'].gsub(/(#@search_regx)/,'\1')) : c['body'] #check + %{

ocn #{c['ocn']}:

#{matched_para}} + elsif c['suffix'] =~/1/ #doc + %{#{title}

ocn #{c['ocn']}:#{c['body']}} + end + @counter_txt_ocn+=1 + output=if c['seg'] =~/\S+/; title+text + else text + end + elsif cgi['view']=~/index/ #% idx body + if c['suffix'] !~/1/ #seg + index=%{#{c['ocn']}, } if @text_search_flag + elsif c['suffix'] =~/1/ #doc + index=%{#{c['ocn']}, } + end + if c['seg'] =~/\S+/ + if @text_search_flag + @counter_txt_ocn+=1 + output=title+index + end + else + @counter_txt_ocn+=1 + output=unless c['suffix'] =~/1/; title+index + else %{#{title}#{c['ocn'].sort}, } + end + end + end + else output=title + end + @counters_txt=if @counter_txt_doc > 0 + %{Found in the main body of #@counter_txt_doc documents, and at #@counter_txt_ocn locations within.
} + else '' + end + @body_main << output #+ details + end + #text_objects_endnote + oldtid = 0 + s_endnotes.each do |e| #% endnotes + location=e['filename'][/(.+?)\.(?:_?sst|ssm)$/,1] + file_suffix=e['filename'][/.+?\.(_?sst|ssm)$/,1] + lang=if location =~ /\S+?~(\S\S\S?)$/ + l=location[/\S+?~(\S\S\S?)$/,1] + 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 + title=%{


#{e['title']} by #{e['creator']} pdf portraitpdf landscape manifest ?
} if file_suffix=~/s/ + @counter_endn_doc+=1 + oldtid=e['metadata_tid'].to_i + else title = '' + end + if cgi['view']=~/text/ #% txt endnotes + @counter_endn_ocn+=1 + matched_endnote=(@search_regx.to_s.class==String && @search_regx.to_s=~/\S\S+/) ? (e['body'].to_s.gsub(/(#@search_regx)/,'\1')) : e['body'] #check + output=%{#{title}
note #{e['nr']} referred to from ocn #{e['ocn']}: #{matched_endnote}} + elsif cgi['view']=~/index/ #% idx endnotes + @counter_endn_ocn+=1 + output=%{#{title}#{e['nr']}#{e['ocn']}], } + end + @counters_endn=if @counter_endn_doc > 0 + %{Found in the endnotes of #@counter_endn_doc documents, and at #@counter_endn_ocn locations within.
} + end + @endnotes << output #+ details + else @endnotes=[] #does not take out yet + end + end + offset=dbi_statement.sql_offset.to_s + limit=dbi_statement.sql_limit.to_s + canned=dbi_statement.sql_canned_search_url.to_s + limit=dbi_statement.sql_limit.to_s + cgi.out{@header + @counters_txt + @counters_endn + @body_main.join + @endnotes.join + canned + @tail} #% print cgi_output_header+counters+body+endnotes + end + rescue Exception => e + s='
' + CGI::escapeHTML(e.backtrace.reverse.join("\n"))
+          s << CGI::escapeHTML(e.message) + '
' + cgi.out{s} + next + ensure # eg. disconnect from server + @conn.disconnect if @conn + end + end + WOK_SQL + end + end +end +__END__ +#@counter_txt_ocn +#@counter_endn_ocn + + + if cgi['checks'] =~/check_all/ or cgi['check_all'] =~/\S/ or cgi['a'].to_i==1 + checked_all=checked_url=checked_searched=checked_tip=checked_echo=checked_sql='checked' + checked_none='' + #elsif cgi['checks'] =~/check_fixed/ or cgi['check_fixed'] =~/\S/ + # #checked_ignore='checked' + # checked_fixed='checked' + # checked_url='checked' + # checked_searched='checked' + # checked_echo='checked' + # #checked_tip='checked' + # #checked_sql='checked' + # checked_tip=checked_sql=checked_none='' + #elsif cgi['checks'] =~/check_ignore/ or cgi['check_ignore'] =~/\S/ + # checked_ignore='checked' + # 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_echo='checked' if cgi['echo'] =~/\S/ + # checked_sql='checked' if cgi['sql'] =~/\S/ + # checked_none='' + elsif cgi['checks'] =~/check_none/ or cgi['a'].to_i==0 + checked_none='checked' + checked_all=checked_url=checked_searched=checked_tip=checked_echo=checked_sql='' + else checked_ignore='checked' + end diff --git a/lib/sisu/0.52/cgi_sqlite.rb b/lib/sisu/0.52/cgi_sqlite.rb new file mode 100644 index 00000000..d00237af --- /dev/null +++ b/lib/sisu/0.52/cgi_sqlite.rb @@ -0,0 +1,207 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: generates naive cgi search form for search of sisu database (pgsql sqlite) + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah mailto:ralph@amissah.com + Ralph Amissah mailto:amissah@gmail.com + +=end +module SiSU_CGI_sqlite #% database building documents + require SiSU_lib + '/sysenv' + require SiSU_lib + '/cgi_sql_common' + include SiSU_CGI_sql + class SiSU_search_sqlite < SiSU_CGI_common + def initialize(opt,webserv) + @opt,@webserv=opt,webserv + @env=SiSU_Env::Info_env.new('',opt) + @image_src="#{@env.url.webserv_cgi}/_sisu/image" + @common=SiSU_CGI_sql::SiSU_CGI_common.new(@webserv,@opt.cmd,@image_src,@env) + 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}/sisu_sqlite.db"); serve << x unless x =~/^_\S+/ + end + end + end + serve.sort! + f1,f2,f3=[],[],[] + serve.each do |x| + f1 << %{ \n} + end + f2 << %{ selected_db=case cgi['db']\n} + serve.each do |x| + f2 << %{ when /SiSU_#{x}/; ''\n} + end + f2 << " end\n" + #f3 + f3 << %{ db_name='sisu_sqlite.db'\n} + f3 << %{ db_sqlite=case cgi['db']\n} + serve.each do |x| + f3 << %{ when /SiSU_#{x}/; "#{@env.path.webserv}/#{x}/sisu_sqlite.db"\n} + end + f3 << " end\n" + if FileTest.writable?('.') + output=File.open('sisu_sqlite.cgi','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 + a=%{ generated sisu_sqlite.cgi, + BASED ON ALREADY CREATED sisu_sqlite.db OUTPUT, (-d) + } + tell=SiSU_Screen::Ansi.new(@opt.cmd,a) + tell.print_grey + c=case @webserv + when /pwd/; '' + else "if necessary make the directory /usr/lib/cgi-bin : + sudo cp -vi #{Dir.pwd}/sisu_sqlite.cgi /usr/lib/cgi-bin/. + sudo chmod -v 755 /usr/lib/cgi-bin/sisu_sqlite.cgi + (copy sisu_sqlite.cgi to your cgi directory) and set file permissions to 755" + end + a=%{#{c} + #{@env.webserv_base_cgi}/cgi-bin/sisu_sqlite.cgi + } + b='(to create and populate sisu sqlite database see "man sisu" and in particular the -d flag)' + tell=SiSU_Screen::Ansi.new(@opt.cmd,a,b) + tell.warn + else puts 'failed in attempt to write sisu_sqlite.cgi 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' + @version='sisu_sqlite' + @image_src="#{@env.url.webserv_cgi}/_sisu/image" + @hosturl_db="#{@env.url.webserv_base_cgi}" + @hosturl_files="#{@env.url.webserv_files_from_db}" + WOK_SQL + end + def search_statement + <<-'WOK_SQL' + class Dbi_search_string + def initialize(l,t,q) + @l,@t,@q=l,t,q + end + def string + search={ :search => [] } + search[:flag]=false + if @t =~/\S+/ or @q =~/\S+/ + if @t =~/\S+/; unescaped_search=CGI.unescape(@t) + elsif @q =~/\S+/; unescaped_search=CGI.unescape(@q) + end + search_construct=[] + unescaped_search.gsub!(/\s*(AND|OR)\s*/,"%' \) \\1 #@l LIKE \( '%") + unescaped_search.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].each{|x| @search_text << "#{x} AND " } + @search_text=@search_text.to_s.gsub!(/AND\s+$/,'') + @search_text.gsub!(/(documents\.clean\s+LIKE\s+\(\s*'%[^']+%'\s*\)\s+(?:(?:AND|OR)\s+documents\.clean\s+LIKE\s+\(\s*'%[^']+%'\s*\))+)/,'(\1)') + search[:endnotes].each{|x| @search_endnotes << "#{x} AND " } + @search_endnotes=@search_endnotes.to_s.gsub!(/AND\s+$/,'') + @search_text.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.title, metadata.creator, metadata.filename, metadata.suffix, documents.body, documents.seg, documents.ocn, metadata.tid FROM documents, metadata WHERE #{@search_text} AND documents.metadata_tid = metadata.tid ORDER BY metadata.title, documents.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.title, metadata.creator, metadata.filename, endnotes.body, endnotes.nr, endnotes.ocn, endnotes.metadata_tid FROM metadata, endnotes WHERE #{@search_endnotes} AND metadata.tid = endnotes.metadata_tid ORDER BY metadata.title, endnotes.nr} + @sql_statement[:range]=%{LIMIT #{limit} OFFSET #{offset} ;} + select=@sql_statement[:endnotes] + ' ' + @sql_statement[:range] + select + end + def sql_select_body_format + %{#{sql_select_body}} + end + def sql_select_endnotes_format + %{#{sql_select_endnotes}} + 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:SQLite:#{db_sqlite}" #sqlite3 ? + @conn=DBI.connect(@dbi) + WOK_SQL + end + end +end +__END__ diff --git a/lib/sisu/0.52/character_encoding.rb b/lib/sisu/0.52/character_encoding.rb new file mode 100644 index 00000000..743eac82 --- /dev/null +++ b/lib/sisu/0.52/character_encoding.rb @@ -0,0 +1,369 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules related to locales, character encoding for different output generators [requires kirbybase] + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_character_encode + require 'kirbybase' + require SiSU_lib + '/sysenv' + class Characters + attr_accessor(:character_encoding,:glyph,:dec,:hex,:rb,:html,:html_name,:tex,:tex_licr,:tex_alt,:name) + def initialize(&block) + instance_eval(&block) + end + end + class Create ', 62, '76', '\76', '>', '>', '', '', '', 'Greater than >' ], + ['?', 63, '77', '\77', '?', nil, '?', '?', '?', 'Punctuation Question mark ?' ], + ['@', 64, '100', '\100', '@', nil, '', '', '', 'Commercial at sign @' ], + ['A', 65, '101', '\101', 'A', nil, 'A', 'A', 'A', 'Captial A' ], + ['B', 66, '102', '\102', 'B', nil, 'B', 'B', 'B', 'Captial B' ], + ['C', 67, '103', '\103', 'C', nil, 'C', 'C', 'C', 'Captial C' ], + ['D', 68, '104', '\104', 'D', nil, 'D', 'D', 'D', 'Captial D' ], + ['E', 69, '105', '\105', 'E', nil, 'E', 'E', 'E', 'Captial E' ], + ['F', 70, '106', '\106', 'F', nil, 'F', 'F', 'F', 'Captial F' ], + ['G', 71, '107', '\107', 'G', nil, 'G', 'G', 'G', 'Captial G' ], + ['H', 72, '110', '\110', 'H', nil, 'H', 'H', 'H', 'Captial H' ], + ['I', 73, '111', '\111', 'I', nil, 'I', 'I', 'I', 'Captial I' ], + ['J', 74, '112', '\112', 'J', nil, 'J', 'J', 'J', 'Captial J' ], + ['K', 75, '113', '\113', 'K', nil, 'K', 'K', 'K', 'Captial K' ], + ['L', 76, '114', '\114', 'L', nil, 'L', 'L', 'L', 'Captial L' ], + ['M', 77, '115', '\115', 'M', nil, 'M', 'M', 'M', 'Captial M' ], + ['N', 78, '116', '\116', 'N', nil, 'N', 'N', 'N', 'Captial N' ], + ['O', 79, '117', '\117', 'O', nil, 'O', 'O', 'O', 'Captial O' ], + ['P', 80, '120', '\120', 'P', nil, 'P', 'P', 'P', 'Captial P' ], + ['Q', 81, '121', '\121', 'Q', nil, 'Q', 'Q', 'Q', 'Captial Q' ], + ['R', 82, '122', '\122', 'R', nil, 'R', 'R', 'R', 'Captial R' ], + ['S', 83, '123', '\123', 'S', nil, 'S', 'S', 'S', 'Captial S' ], + ['T', 84, '124', '\124', 'T', nil, 'T', 'T', 'T', 'Captial T' ], + ['U', 85, '125', '\125', 'U', nil, 'U', 'U', 'U', 'Captial U' ], + ['V', 86, '126', '\126', 'V', nil, 'V', 'V', 'V', 'Captial V' ], + ['W', 87, '127', '\127', 'W', nil, 'W', 'W', 'W', 'Captial W' ], + ['X', 88, '130', '\130', 'X', nil, 'X', 'X', 'X', 'Captial X' ], + ['Y', 89, '131', '\131', 'Y', nil, 'Y', 'Y', 'Y', 'Captial Y' ], + ['Z', 90, '132', '\132', 'Z', nil, 'Z', 'Z', 'Z', 'Captial Z' ], + ['[', 91, '133', '\133', '[', nil, '', '', '', 'Left square bracket [' ], + ['\\', 92, '134', '\134', '\', nil, '', '\textbackslash', '', 'Backslash \\'], + [']', 93, '135', '\135', ']', nil, '', '', '', 'Right square bracket ]' ], + ['^', 94, '136', '\136', '^', nil, '', '', '', 'Caret ^' ], + ['_', 95, '137', '\137', '_', nil, '{\_}', '\textunderscore', '', 'Underscore _' ], + ['`', 96, '140', '\140', '`', nil, '', '', '', 'Grave accent `' ], + ['a', 97, '141', '\141', 'a', nil, 'a', 'a', 'a', 'Small a' ], + ['b', 98, '142', '\142', 'b', nil, 'b', 'b', 'b', 'Small b' ], + ['c', 99, '143', '\143', 'c', nil, 'c', 'c', 'c', 'Small c' ], + ['d', 100, '144', '\144', 'd', nil, 'd', 'd', 'd', 'Small d' ], + ['e', 101, '145', '\145', 'e', nil, 'e', 'e', 'e', 'Small e' ], + ['f', 102, '146', '\146', 'f', nil, 'f', 'f', 'f', 'Small f' ], + ['g', 103, '147', '\147', 'g', nil, 'g', 'g', 'g', 'Small g' ], + ['h', 104, '150', '\150', 'h', nil, 'h', 'h', 'h', 'Small h' ], + ['i', 105, '151', '\151', 'i', nil, 'i', 'i', 'i', 'Small i' ], + ['j', 106, '152', '\152', 'j', nil, 'j', 'j', 'j', 'Small j' ], + ['k', 107, '153', '\153', 'k', nil, 'k', 'k', 'k', 'Small k' ], + ['l', 108, '154', '\154', 'l', nil, 'l', 'l', 'l', 'Small l' ], + ['m', 109, '155', '\155', 'm', nil, 'm', 'm', 'm', 'Small m' ], + ['n', 110, '156', '\156', 'n', nil, 'n', 'n', 'n', 'Small n' ], + ['o', 111, '157', '\157', 'o', nil, 'o', 'o', 'o', 'Small o' ], + ['p', 112, '160', '\160', 'p', nil, 'p', 'p', 'p', 'Small p' ], + ['q', 113, '161', '\161', 'q', nil, 'q', 'q', 'q', 'Small q' ], + ['r', 114, '162', '\162', 'r', nil, 'r', 'r', 'r', 'Small r' ], + ['s', 115, '163', '\163', 's', nil, 's', 's', 's', 'Small s' ], + ['t', 116, '164', '\164', 't', nil, 't', 't', 't', 'Small t' ], + ['u', 117, '165', '\165', 'u', nil, 'u', 'u', 'u', 'Small u' ], + ['v', 118, '166', '\166', 'v', nil, 'v', 'v', 'v', 'Small v' ], + ['w', 119, '167', '\167', 'w', nil, 'w', 'w', 'w', 'Small w' ], + ['x', 120, '170', '\170', 'x', nil, 'x', 'x', 'x', 'Small x' ], + ['y', 121, '171', '\171', 'y', nil, 'y', 'y', 'y', 'Small y' ], + ['z', 122, '172', '\172', 'z', nil, 'z', 'z', 'z', 'Small z' ], + ['{', 123, '173', '\173', '{', nil, '{\{}', '\{', '', 'Left curly brace {' ], + ['|', 124, '174', '\174', '|', nil, '', '', '', 'Vertical bar / pipe |' ], + ['}', 125, '175', '\175', '}', nil, '{\}}', '\}', '', 'Right curly brace }' ], + ['~', 126, '176', '\176', '~', nil, '', '', '', 'Tilde ~' ], + ['', 127, '177', '', '', nil, '', '', '', ' ' ], + ['', 128, '200', '', '€', nil, '', '', '', ' ' ], + ['', 129, '201', '', '', nil, '', '', '', ' ' ], + ['\'', 130, '202', '', '‚', nil, '', '', '', 'Low left single quote \''], + [' ', 131, '203', '', 'ƒ', nil, '', '', '', 'Florin ' ], + ['"', 132, '204', '', '„', nil, '', '', '', 'Low left double quote "' ], + ['…', 133, '205', '\342\200\246', '…', nil, '…', '\textellipsis', '', 'Ellipsis …' ], + ['†', 134, '206', '\342\200\240', '†', nil, '†', '\textdagger', '', 'Dagger †' ], + ['‡', 135, '207', '\342\200\241', '‡', nil, '‡', '\textdaggerbl', '', 'Double dagger ‡' ], + ['^', 136, '210', '', 'ˆ', nil, '', '', '', 'Circumflex ^' ], + ['', 137, '211', '', '‰', nil, '', '', '', 'Permil ' ], + ['', 138, '212', '', 'Š', nil, '', '', '', 'Capital S, caron ' ], + ['<', 139, '213', '', '‹', nil, '', '', '', 'Less than sign (see &060;) <' ], + ['', 140, '214', '', 'Œ', nil, '', '', '', 'Capital OE ligature ' ], + ['', 141, '215', '', '', nil, '', '', '', ' ' ], + ['', 142, '216', '', 'Ž', nil, '', '', '', 'Capital Z, caron ' ], + ['', 143, '217', '', '', nil, '', '', '', ' ' ], + ['', 144, '220', '', '', nil, '', '', '', ' ' ], + ['', 145, '221', '', '‘', nil, '', '', '', 'Left single quote ' ], + ['', 146, '222', '', '’', nil, '', '', '', 'Right single quote ' ], + ['', 147, '223', '', '“', nil, '', '', '', 'Left double quote ' ], + ['', 148, '224', '', '”', nil, '', '', '', 'Right double quote ' ], + ['', 149, '225', '', '•', nil, '', '', '', 'Bullet ' ], + ['-', 150, '226', '', '–', nil, '', '', '', 'En dash -' ], + ['', 151, '227', '', '—', nil, '', '', '', 'Em dash -' ], + ['~', 152, '230', '', '˜', nil, '', '', '', 'Tilde (see &126;) ~' ], + ['t', 153, '231', '', '™', nil, '', '', '', 'Trademark t' ], + ['', 154, '232', '', 'š', nil, '', '', '', 'small s, caron ' ], + ['', 155, '233', '', '›', nil, '', '', '', 'Greater than sign (see &062;) ' ], + ['', 156, '234', '', 'œ', nil, '', '', '', 'Small oe ligature ' ], + ['', 157, '235', '', '', nil, '', '', '', ' ' ], + ['', 158, '236', '', 'ž', nil, '', '', '', 'Small z, caron ' ], + ['', 159, '237', '', 'Ÿ', nil, '', '', '', 'Capital Y, umlaut ' ], + ['', 160, '240', '', ' ', ' ', '', '', '', 'Non-breaking space ' ], + ['¡', 161, '241', '\302\241', '¡', '¡', '¡', '', '', 'Inverted exclamation ' ], + ['¢', 162, '242', '\302\242', '¢', '¢', '¢', '', '', 'Cent sign ¢' ], + ['£', 163, '243', '\302\243', '£', '£', '£', '\textsterling', '', 'Pound sign £' ], + ['¤', 164, '244', '\302\244', '¤', '¤', '¤', '\textcurrency', '', 'General currency sign ' ], + ['¥', 165, '245', '\302\245', '¥', '¥', '¥', '', '', 'Yen sign ¥' ], + ['¦', 166, '246', '\302\246', '¦', '¦', '¦', '', '', 'Broken vertical bar ' ], + ['§', 167, '247', '\302\247', '§', '§', '§', '\textsection', '', 'Section sign §' ], + ['¨', 168, '250', '\302\250', '¨', '¨', '¨', '\"', '', 'Umlaut ' ], + ['©', 169, '251', '\302\251', '©', '©', '©', '\copyright', '\textcopyright', 'Copyright ©' ], + ['ª', 170, '252', '\302\252', 'ª', 'ª', 'ª', '', '', 'Feminine ordinal ª' ], + ['«', 171, '253', '\302\253', '«', '«', '«', '', '', 'Left angle quote «' ], + ['¬', 172, '254', '\302\254', '¬', '¬', '¬', '', '', 'Not sign ' ], + ['­', 173, '255', '\302\255', '­', '­', '­', '', '', 'Soft hyphen ' ], + ['®', 174, '256', '\302\256', '®', '®', '®', '', '', 'Registered trademark ®' ], + ['¯', 175, '257', '\302\257', '¯', '¯', '¯', '', '', 'Macron accent ' ], + ['°', 176, '260', '\302\260', '°', '°', '°', '', '', 'Degree sign °' ], + ['±', 177, '261', '\302\261', '±', '&plusmin;', '±', '', '', 'Plus or minus ±' ], + ['²', 178, '262', '\302\262', '²', '²', '²', '', '', 'Superscript 2 ²' ], + ['³', 179, '263', '\302\263', '³', '³', '³', '', '', 'Superscript 3 ³' ], + ['', 180, '264', '\302\264', '´', '´', ''', '', '', 'Acute accent ' ], + ['µ', 181, '265', '\302\265', 'µ', 'µ', 'µ', '', '', 'Micro sign (Greek mu) µ' ], + ['¶', 182, '266', '\302\266', '¶', '¶', '¶', '\textparagraph', '', 'Paragraph sign ¶' ], + ['·', 183, '267', '\302\267', '·', '·', %q{·}, '', %q{}, 'Middle dot ' ], + ['¸', 184, '270', '\302\270', '¸', '¸', '¸', '', '', 'Cedilla ' ], + ['¹', 185, '271', '\302\271', '¹', '¹', '¹', '', '', 'Superscript 1 ¹' ], + ['º', 186, '272', '\302\272', 'º', 'º', 'º', '', '', 'Masculine ordinal º' ], + ['»', 187, '273', '\302\273', '»', '»', '»', '', '', 'Right angle quote ' ], + ['¼', 188, '274', '\302\274', '¼', '¼', '¼', '', '', 'Fraction one quarter ¼' ], + ['½', 189, '275', '\302\275', '½', '½', '½', '', '', 'Fraction on half ½' ], + ['¾', 190, '276', '\302\276', '¾', '¾', '¾', '', '', 'Fraction three quarters ¾' ], + ['¿', 191, '277', '\302\277', '¿', '¿', '¿', '', '', 'Inverted question mark ¿' ], + ['À', 192, '300', '\303\200', 'À', 'À', 'À', '\`{A}', '', 'Capital A, grave accent À' ], + ['Á', 193, '301', '\303\201', 'Á', 'Á', 'Á', %q{\'{A}}, '', 'Capital A, acute accent Á' ], + ['Â', 194, '302', '\303\202', 'Â', 'Â', 'Â', '^{A}', '', 'Capital A, circumflex accent Â' ], + ['Ã', 195, '303', '\303\203', 'Ã', 'Ã', 'Ã', '~{A}', '', 'Capital A, tilde Ã' ], + ['Ä', 196, '304', '\303\204', 'Ä', 'Ä', 'Ä', '"{A}', '', 'Capital A, umlaut Ä' ], + ['Å', 197, '305', '\303\205', 'Å', 'Å', 'Å', 'r{A}', '', 'Capital A, ring Å' ], + ['Æ', 198, '306', '\303\206', 'Æ', 'Æ', 'Æ', 'AE', '', 'Capital AE ligature Æ' ], + ['Ç', 199, '307', '\303\207', 'Ç', 'Ç', 'Ç', '', '', 'Capital C, cedilla Ç' ], + ['È', 200, '310', '\303\210', 'È', 'È', 'È', '`{E}', '', 'Capital E, grave accent È' ], + ['É', 201, '311', '\303\211', 'É', 'É', 'É', ''{E}', '', 'Capital E, acute accent É' ], + ['Ê', 202, '312', '\303\212', 'Ê', 'Ê', 'Ê', '^{E}', '', 'Capital E, circumflex accent Ê' ], + ['Ë', 203, '313', '\303\213', 'Ë', 'Ë', 'Ë', '"{E}', '', 'Capital E, umlaut Ë' ], + ['Ì', 204, '314', '\303\214', 'Ì', 'Ì', 'Ì', '`{I}', '', 'Capital I, grave accent Ì' ], + ['Í', 205, '315', '\303\215', 'Í', 'Í', 'Í', ''{I}', '', 'Capital I, acute accent Í' ], + ['Î', 206, '316', '\303\216', 'Î', 'Î', 'Î', '^{I}', '', 'Capital I, circumflex accent Î' ], + ['Ï', 207, '317', '\303\217', 'Ï', 'Ï', 'Ï', '"{I}', '', 'Capital I, umlaut Ï' ], + ['Ð', 208, '320', '\303\220', 'Ð', 'Ð', 'Ð', '', '', 'Capital eth, Icelandic ' ], + ['Ñ', 209, '321', '\303\221', 'Ñ', 'Ñ', 'Ñ', '', '', 'Capital N, tilde Ñ' ], + ['Ò', 210, '322', '\303\222', 'Ò', 'Ò', 'Ò', '`{O}', '', 'Capital O, grave accent Ò' ], + ['Ó', 211, '323', '\303\223', 'Ó', 'Ó', 'Ó', ''{O}', '', 'Capital O, acute accent Ó' ], + ['Ô', 212, '324', '\303\224', 'Ô', 'Ô', 'Ô', '^{O}', '', 'Capital O, circumflex accent Ô' ], + ['Õ', 213, '325', '\303\225', 'Õ', 'Õ', 'Õ', '~{O}', '', 'Capital O, tilde Õ' ], + ['Ö', 214, '326', '\303\226', 'Ö', 'Ö', 'Ö', '"{O}', '', 'Capital O, umlaut Ö' ], + ['×', 215, '327', '\303\227', '×', '×', '×', '', '', 'Multiply sign ×' ], + ['Ø', 216, '330', '\303\230', 'Ø', 'Ø', 'Ø', 'O', '', 'Capital O, slash Ø' ], + ['Ù', 217, '331', '\303\231', 'Ù', 'Ù', 'Ù', '', '', 'Capital U, grave accent Ù' ], + ['Ú', 218, '332', '\303\232', 'Ú', 'Ú', 'Ú', '', '', 'Capital U, acute accent Ú' ], + ['Û', 219, '333', '\303\233', 'Û', 'Û', 'Û', '', '', 'Capital U, circumflex accent Û' ], + ['Ü', 220, '334', '\303\234', 'Ü', 'Ü', 'Ü', '', '', 'Capital U, umlaut Ü' ], + ['Ý', 221, '335', '\303\235', 'Ý', 'Ý', 'Ý', '', '', 'Capital Y, acute accent Ý' ], + ['Þ', 222, '336', '\303\236', 'Þ', 'Þ', 'Þ', '', '', 'Capital thorn, Icelandic Þ' ], + ['ß', 223, '337', '\303\237', 'ß', 'ß', 'ß', '', '', 'Small sz ligature, German ß' ], + ['à', 224, '340', '\303\240', 'à', 'à', 'à', '\`{a}', '', 'Small a, grave accent à' ], + ['á', 225, '341', '\303\241', 'á', 'á', 'á', %q{\'{a}}, '', 'Small a, acute accent á' ], + ['â', 226, '342', '\303\242', 'â', 'â', 'â', '\^{a}', '', 'Small a, circumflex accent â' ], + ['ã', 227, '343', '\303\243', 'ã', 'ã', 'ã', '\~{a}', '', 'Small a, tilde ã' ], + ['ä', 228, '344', '\303\244', 'ä', 'ä', 'ä', '\"{a}', '', 'Small a, umlaut ä' ], + ['å', 229, '345', '\303\245', 'å', 'å', 'å', '\r{a}', '', 'Small a, ring å' ], + ['æ', 230, '346', '\303\246', 'æ', 'æ', 'æ', '\ae', '', 'Small ae ligature æ' ], + ['ç', 231, '347', '\303\257', 'ç', 'ç', 'ç', '', '', 'Small c, cedilla ç' ], + ['è', 232, '350', '\303\250', 'è', 'è', 'è', '\`{e}', '', 'Small e, grave accent è' ], + ['é', 233, '351', '\303\251', 'é', 'é', 'é', %q{\'{e}}, '', 'Small e, acute accent é' ], + ['ê', 234, '352', '\303\252', 'ê', 'ê', 'ê', '\^{e}', '', 'Small e, circumflex accent ê' ], + ['ë', 235, '353', '\303\253', 'ë', 'ë', 'ë', '\"{e}', '', 'Small e, umlaut ë' ], + ['ì', 236, '354', '\303\254', 'ì', 'ì', 'ì', '\`{i}', '', 'Small i, grave accent ì' ], + ['í', 237, '355', '\303\255', 'í', 'í', 'í', '\'{i}', '', 'Small i, acute accent í' ], + ['î', 238, '356', '\303\256', 'î', 'î', 'î', '\^{i}', '', 'Small i, circumflex accent î' ], + ['ï', 239, '357', '\303\257', 'ï', 'ï', 'ï', '\"{i}', '', 'Small i, umlaut ï' ], + ['ð', 240, '360', '\303\260', 'ð', 'ð', 'ð', '', '', 'Small eth, Icelandic ð' ], + ['ñ', 241, '361', '\303\261', 'ñ', 'ñ', 'ñ', '', '', 'Small n, tilde ñ' ], + ['ò', 242, '362', '\303\262', 'ò', 'ò', 'ò', '\`{o}', '', 'Small o, grave accent ò' ], + ['ó', 243, '363', '\303\263', 'ó', 'ó', 'ó', %q{\'{o}}, '', 'Small o, acute accent ó' ], + ['ô', 244, '364', '\303\264', 'ô', 'ô', 'ô', '\^{o}', '', 'Small o, circumflex accent ô' ], + ['õ', 245, '365', '\303\265', 'õ', 'õ', 'õ', '\^{o}', '', 'Small o, tilde õ' ], + ['ö', 246, '366', '\303\266', 'ö', 'ö', 'ö', '\"{o}', '', 'Small o, umlaut ö' ], + ['÷', 247, '367', '\303\267', '÷', '÷', '÷', '', '', 'Divide sign ÷' ], + ['ø', 248, '370', '\303\270', 'ø', 'ø', 'ø', '', '', 'Small o, slash ø' ], + ['ù', 249, '371', '\303\271', 'ù', 'ù', 'ù', '\`{u}', '', 'Small u, grave accent ù' ], + ['ú', 250, '372', '\303\272', 'ú', 'ú', 'ú', %q{\'{u}}, '', 'Small u, acute accent ú' ], + ['û', 251, '373', '\303\273', 'û', 'û', 'û', '\^{u}', '', 'Small u, circumflex accent û' ], + ['ü', 252, '374', '\303\274', 'ü', 'ü', 'ü', '\"{u}', '', 'Small u, umlaut ü' ], + ['ý', 253, '375', '\303\275', 'ý', 'ý', 'ý', '', '', 'Small y, acute accent ý' ], + ['þ', 254, '376', '\303\276', 'þ', 'þ', 'þ', '', '', 'Small thorn, Icelandic þ' ], + ['ÿ', 255, '377', '\303\277', 'ÿ', 'ÿ', 'ÿ', '', '', 'Smally y, umlaut ÿ' ] +] + end + end +end +__END__ diff --git a/lib/sisu/0.52/composite.rb b/lib/sisu/0.52/composite.rb new file mode 100644 index 00000000..99069b8f --- /dev/null +++ b/lib/sisu/0.52/composite.rb @@ -0,0 +1,215 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: composite documents, assemble/build documents from other documents or parts of marked up text + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Assemble + require SiSU_lib + '/sysenv' + class Remote_image + def initialize + @env=SiSU_Env::Info_env.new + end + def image(dir) + images=[] + images[0]=dir + images + end + def download_images(images_array) #first element in array is source url + path="#{@env.path.processing}/external_document/image" + File.mkpath(path) unless FileTest.directory?(path) + download_from=images_array.shift + 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 download_doc_skin(doc_skin) #first element in array is source url + path="#{@env.path.processing}/external_document/skin/doc" + File.mkpath(path) unless FileTest.directory?(path) + download_from=doc_skin.shift + doc_skin.each do |i| + skin="#{path}/#{i}.rb" + unless FileTest.exists?(skin) + skinfile=File.new(skin,'w+') + open("#{download_from}/#{i}.rb") do |g| + skinfile << g.read + end + skinfile.close + end + end + end + end + class Composite + @@imager={} + def initialize(opt) + @opt=opt + @env=SiSU_Env::Info_env.new + end + def read + begin + @fns_array=IO.readlines(@opt.fns,'') + assembled=insertions? + write(assembled) + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + def write(assembled) + m=/(.+)?(\.ssm$)/m + assembled_file=File.new("#{@opt.fnb}._sst",'w+') + assembled.each{|a| assembled_file << a } + assembled_file.close + end + def download_images(download_from,images_array) + path="#{@env.path.processing}/external_document/image" + File.mkpath(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 download_doc_skin(doc_skin) #first element in array is source url + path="#{@env.path.processing}/external_document/skin/doc" + File.mkpath(path) unless FileTest.directory?(path) + download_from=doc_skin.shift + doc_skin.each do |i| + skin="#{path}/#{i}.rb" + unless FileTest.exists?(skin) + skinfile=File.new(skin,'w+') + open("#{download_from}/#{i}.rb") do |g| + skinfile << g.read + end + skinfile.close + end + end + end + def insertion(fni,insert_array) + file={ :prepared=>[],:images=>[] } + rgx_image=/([a-zA-Z0-9._-]+?\.(?:png|jpg|gif))/ + #file[:prepared] << "#% Date " << "\n" + file[:prepared] << "\n% |#{fni}|@|^|>>ok\n" + insert_array.each do |i| + i.gsub!(/^([12]|:?[AB])~\? /,'% [conditional heading:] \1~ ') #off conditional heading (consider syntax) + if i =~/^0~|^@\S+?:/ + i.gsub!(/\n/m,"\n% ") + i.gsub!(/\n%\s+$/m,'') + i.gsub!(/^0~|^@\S+?:/m,"\n% [imported header:] ") #off imported headers + end + file[:prepared] << i + file[:images] << i.scan(rgx_image).uniq if i =~rgx_image #flag + end + file[:prepared] << "\n% end import" << "\n\n" + file[:images].uniq! if file[:images].length > 0 + file[:images].flatten! if file[:images].length > 0 + file + end + def insertions? + data=@fns_array + tuned_file,imagedir=[],[] + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Composite Document',@opt.fns) + tell.grey_title_hi unless @opt.cmd =~/q/ + para=data.each do |para| + if para =~/^r\{(.+?)\}/ \ + or para =~/^(?:<<\s*)\{(.+?)\}(?:req(?:quire)?\b|\s*\})?/ \ + or para =~/^(?:<<\s*)\|(\S+?)\|@\|.+?\|(?:req(?:quire)?\b|\s*\})?/ \ + or para =~/^(?:<<\s*)<(?:URL|url):(\S+?)>(?:req(?:require)\b|\s*\})?/ \ + or para =~/^\{(.+?)\}(?:req(?:require)?)\b/ \ + or para =~/^\|(\S+?)\|@\|.+?\|(?:req(?:require)?)\b/ \ + or para =~/^<(?:URL|url):(\S+?)>(?:req(?:require))\b/ + loadfile=$1.strip + tell=SiSU_Screen::Ansi.new(@opt.cmd,'loading:',loadfile) + tell.txt_grey if @opt.cmd =~/[MVv]/ + tuned_file << if loadfile =~ /http:\/\/\S+?\.ss[ti]$/ # and NetTest + imagedir = /(http:\/\/\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.cmd).cX + puts "\t #{cX.fuschia}ERROR#{cX.off} #{cX.brown}#{@opt.fns}#{cX.off} #{cX.fuschia}requires invalid or non-existent file:#{cX.off} #{cX.brown}#{loadfile}#{cX.off}" + para + end + else tuned_file << para + end + tuned_file.compact! + end + if @@imager.length >0 + @@imager.each do |d,i| + i.flatten! + i.uniq! + download_images(d,i) + end + end + tuned_file + end + end +end +__END__ + diff --git a/lib/sisu/0.52/concordance.rb b/lib/sisu/0.52/concordance.rb new file mode 100644 index 00000000..5f251830 --- /dev/null +++ b/lib/sisu/0.52/concordance.rb @@ -0,0 +1,311 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: concordance file (html concordance, wordmap, linked index of words in document) + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Concordance + require SiSU_lib + '/param' + require SiSU_lib + '/sysenv' + require SiSU_lib + '/defaults' + require SiSU_lib + '/dal' + include SiSU_Param + include SiSU_Env + include SiSU_Viz + require SiSU_lib + '/html_format_css' + include SiSU_HTML_Format + class Source + def initialize(opt) + @opt=opt + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get + @env=SiSU_Env::Info_env.new(@md.fns) + loc=@env.url.output_tell + tool=if @md.cmd =~/[MVv]/; "#{@env.program.web_browser} #{loc}/#{@md.fnb}/#{@md.fn[:concordance]}" + else '' + end + tell=SiSU_Screen::Ansi.new(@md.cmd,"Concordance",tool) + tell.grey_title_hi unless @md.cmd =~/q/ + wordmax=200000 + unless @md.wc_words.nil? + if @md.wc_words < wordmax + SiSU_Concordance::Source::Words.new(@md).songsheet + else + tell=SiSU_Screen::Ansi.new(@md.cmd,"concordance skipped, large document has over #{wordmax} words (#{@md.wc_words})") + tell.warn unless @md.cmd =~/q/ + end + else + tell=SiSU_Screen::Ansi.new(@md.cmd,"wc (word count) is off, concordance will be processed for all files including those over the max set size of: #{wordmax} words") + tell.warn unless @md.cmd =~/q/ + SiSU_Concordance::Source::Words.new(@md).songsheet + end + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + end + end + private + class Doc_title + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + def initialize(lnk,md) + @md=md + @vz=SiSU_Env::Get_init.instance.skin + file_array=IO.readlines(@md.fns,'') + txt_path=%{#{@md.dir_out}} + SiSU_Env::Info_skin.new(@md).select + @md_title=@md.title + @fnb=@md.fnb + @env=SiSU_Env::Info_env.new + @lex_button=%{SiSU home -->} + @lnk=lnk + @doc_details =<
 

Manifest #{@md.title}

            TOC TOC - table of contents for individual articles

            Full Text Full text (with indexed table of contents)

            PDF portrait pdf version of the document (portrait)

            PDF landscape pdf version of the document (landscape)

Word index links are to html versions of the text the segmented version followed by the scroll (single document) version.
[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).]

+WOK + end + def create + < + + + + SiSU created WordIndex for: #{@md.dc_title} + + + + + + + + + #{@vz.js_head} + + + #{@vz.js_top} + + + +
+ #{@vz.banner_home_button_only} + + #{@env.widget_static.search_form} +
+ #@doc_details

(The word listing/index is Case sensitive: Capitalized words appear before lower case)

+

+ word (number of occurences)
linked references to word within document
+ [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.] +

+

+ (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 # [ http://[web host]/#@fnb/concordance.html#your_word ] +

+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

#@word

(#@freq)

\n\t

} + else n=@word.strip.gsub(/\s+/,'_') #also need to convert extended character set to html + %{\n

#@word

(#@freq)

\n\t

} + end + @@word_previous=@word.capitalize + w + end + end + class Words + require SiSU_lib + '/defaults' + require SiSU_lib + '/param' + include SiSU_Viz + include SiSU_Param + require SiSU_lib + '/html_format_css' + include SiSU_HTML_Format + require SiSU_lib + '/vocab' + require SiSU_lib + '/sysenv' + include SiSU_Screen + include Wordlists + @@dp=nil + def initialize(md) + begin + @vz=SiSU_Env::Get_init.instance.skin + @md=md + @env=SiSU_Env::Info_env.new(@md.fns) + @path="#{@env.path.output}/#{@md.fnb}" + @dal_array=SiSU_DAL::Source.new(@md).get # dal file drawn here + @freq=Hash.new(0) + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + @rxp_to=Regexp.new("<~(\\d+);(?:[oh]|[0-6]:)\\d+;\\w\\d+><#@dp:#@dp>$") + @rxp_lv1=Regexp.new('^1~') #line start markers removed, ('^1~') for exceptions \n\n4{{{ + @rxp_lv2=Regexp.new('^2~') + @rxp_lv3=Regexp.new('^3~') + @rxp_seg=Regexp.new('^4~(.+?)\s+') + @rxp_title=Regexp.new('^0~title\s*(.+?)\s*$') + @rxp_t1=Regexp.new('^T1') + @rxp_t2=Regexp.new('^T2') + @rxp_t3=Regexp.new('^T3') + @rxp_excluded1=Regexp.new(/(?:https?|ftp):\/\/\S+/mi) + @rxp_excluded0=Regexp.new(/^(?:to\d+|\d+| \s*| |EOF|thumb_\S+|snap_\S+|_+|-+|\S+?_\S+|[\d_]+\w\S+|[\w\d]{1,2}|\d{1,3}\w?|ii|iii|iv|vi|vii|viii|ix|xi|xii|xiii|xiv|xv|xvi|xvii|xviii|xix|xx|#@dp|[0-9a-f]{24,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\.?)$/mi) + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + end + end + def songsheet + begin + File.mkpath(@path) unless FileTest.directory?(@path) + @file_index_all=File.open("#@path/#{@md.fn[:concordance]}",'w') + map_para + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + @file_index_all.close + end + end + protected + def location_scroll(wordlocation,show) + @wordlocation=wordlocation + %{#@wordlocation; } + end + def location_seg(wordlocation,show) + @wordlocation,@show=wordlocation,show + @sfx='.html' #used for hardlinks, previous setting @sfx='', web server takes care of suffix + @word_location_seg=wordlocation.gsub(/(.+?)\#(\d+)/,"#{@md.fnl[:pre]}\\1#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}#\\2") unless wordlocation.nil? + case @wordlocation + when @rxp_t1 + %{[H]#@show, } + when @rxp_t2 + %{[H]#@show, } + when @rxp_t3 + %{[H]#@show, } + else %{#@show, } + end + end + def map_para + @seg,toy=nil,nil + @word_map={} + wordlist=Wordlists::Lists.new + lesser,greater,scanlist,special=wordlist.lesser,wordlist.greater,wordlist.scanlist,wordlist.special + #lesser,greater,scanlist=wordlist.lesser,wordlist.greater,wordlist.scanlist + @dal_array.each do |line| + if line !~/<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>$/ # lines to ignore: # are added but not part of authors substantive text; 0 are mostly machine generated + if line =~/^0~vocabulary\s+(.+)/ + vocab=$1 + unless vocab =~/none/ + load SiSU_lib + "/vocab_#{vocab}.rb" + lesser,greater,scanlist=wordlist.lesser,wordlist.greater,wordlist.scanlist + #special=wordlist.special ##KEEP did two loops + tell=SiSU_Screen::Ansi.new(@md.cmd,"\tloaded vocabulary: #{vocab}") + tell.puts_grey unless @md.cmd =~/q/ #check + end + end + if line =~@rxp_seg; @seg=line[@rxp_seg,1] + end + if line =~@rxp_to; toy=line[@rxp_to,1] + end + if toy =~/\d+/ and toy !~/^0$/ + for word in line.scan(scanlist) #%take in word or other match + #for word in line.scan(special) #%take in word or other match #KEEP was second loop + word=nil if word =~@rxp_excluded0 #watch + word=nil if word =~@rxp_excluded1 #watch + if word + #word.gsub!(/<\/?[i]>/,'') + word.gsub!(/<\/?\S+?>/,'') + word.strip! + word.gsub!(/[\.,;:"]$/,'') + word.gsub!(/["]/,'') + word.gsub!(/^\s*[\(]/,'') + word.gsub!(/[\(]\s*$/,'') + word.gsub!(/^(?:See|e\.?g\.?).+/,'') + word.gsub!(/^\s*[.,;:]\s*/,'') + word.strip! + word.gsub!(/^\d+(st|nd|rd|th)$/,'') + word.gsub!(/^(\d+\.?)+$/, '') + word = nil if word =~/^\s*$/ #watch + if word + word.capitalize! unless word =~/[A-Z][A-Z]/ or word =~/\w+\s\w+/ + #word.downcase! if word =~lesser + #word.capitalize! if word =~greater + @freq[word] +=1 + @word_map[word] ||= [] + if line !~@rxp_lv1 and line !~@rxp_lv2 and line !~@rxp_lv3 + @word_map[word] << location_seg("#@seg\##{toy}",toy) + else + @word_map[word] << case line + when @rxp_lv1; location_seg('T1',toy) + when @rxp_lv2; location_seg('T2',toy) + when @rxp_lv3; location_seg('T3',toy) + end + end + end + end + end + end + end + end + scr='Full Text scroll: doc#  ' + seg='' + @file_index_all << SiSU_Concordance::Source::Doc_title.new('toc',@md).create + for word in @freq.keys.sort! {|a,b| a.downcase<=>b.downcase} + keyword=SiSU_Concordance::Source::Word.new(word,@freq[word]).html + if keyword !~ @rxp_excluded0 + if @word_map[word][0] =~ /\d+/ + wm=[] + @file_index_all << %{#{keyword}#{seg}#{@word_map[word].uniq.compact}} + end + @file_index_all << '

' + end + # special cases endnotes and header levels 1 - 3 + end + credits=@vz.credits_splash + @file_index_all << "#{credits}\n" # footer + tell=SiSU_Screen::Ansi.new(@md.cmd,@md.fns,"#{@env.path.output_tell}/#{@md.fn[:concordance]}") + tell.flow if @md.cmd =~/[MV]/ + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/conf.rb b/lib/sisu/0.52/conf.rb new file mode 100644 index 00000000..192ffe2f --- /dev/null +++ b/lib/sisu/0.52/conf.rb @@ -0,0 +1,245 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: configuration + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Initialize + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Screen + require SiSU_lib + '/relaxng' + include SiSU_relaxng + require SiSU_lib + '/css' + include SiSU_Style + class Source + def initialize(opt) + @opt=opt + end + def read + SiSU_Config.new(@opt).make_homepage + SiSU_Config.new(@opt).css + SiSU_Config.new(@opt).dtd + SiSU_Config.new(@opt).cp_local_images + SiSU_Config.new(@opt).cp_external_images + SiSU_Config.new(@opt).cp_webserver_images if @opt.mod.inspect =~/--init(?:ialize)?=site/ + end + end + class SiSU_Config #config files such as css are not updated if they already exist unless forced using the --init=site modifier + require 'fileutils' + require SiSU_lib + '/sysenv' + include FileUtils #::Verbose + def initialize(opt) + @opt=opt + @env=SiSU_Env::Info_env.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' + #@path_dtd= @env.path.output + '/_sisu/dtd' + @pwd,@home=Dir.pwd,@env.path.home + end + def make_homepage + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','Make homepage','') + tell.colorize unless @opt.cmd =~/q/ + SiSU_Env::Create_site.new(@opt.cmd).homepage + end + def cp_local_images + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','Copy images','') + tell.colorize unless @opt.cmd =~/q/ + SiSU_Env::Create_site.new(@opt.cmd).cp_local_images + SiSU_Env::Create_site.new(@opt.cmd).cp_base_images #base images (nav etc.) used by all html + end + def cp_external_images + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','Copy external images','') + tell.colorize if @opt.cmd =~/V/ + SiSU_Env::Create_site.new(@opt.cmd).cp_external_images + end + def cp_webserver_images + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','Copy webserver/output file images','') + tell.colorize unless @opt.cmd =~/q/ + SiSU_Env::Create_site.new(@opt.cmd).cp_webserver_images + end + def css + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','Configuring CSSs','') + tell.colorize unless @opt.cmd =~/q/ + SiSU_Env::Create_site.new(@opt.cmd).cp_css + end + def dtd + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','Configuring DTDs','') + tell.colorize unless @opt.cmd =~/q/ + @rxng=SiSU_relaxng::RelaxNG.new + @path.each { |d| File.mkpath(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 + #use dtd + 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.path.dal + '/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::System_call.new(rnc_src,xsd_file) + schema.relaxng(@opt.cmd) + #rng + schema=SiSU_Env::System_call.new(rnc_src,rng_file) + schema.relaxng(@opt.cmd) + #rnc + cp(rnc_src,rnc_file) + chmod(0644,rnc_file) + end + def trang_rnc_model_output_dom + s=@suffix + rnc_src=@env.path.dal + '/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::System_call.new(rnc_src,xsd_file) + schema.relaxng(@opt.cmd) + #rng + schema=SiSU_Env::System_call.new(rnc_src,rng_file) + schema.relaxng(@opt.cmd) + #rnc + cp(rnc_src,rnc_file) + chmod(0644,rnc_file) + end + def trang_rnc_model_output_xhtml + s=@suffix + rnc_src=@env.path.dal + '/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::System_call.new(rnc_src,xsd_file) + schema.relaxng(@opt.cmd) + #rng + schema=SiSU_Env::System_call.new(rnc_src,rng_file) + schema.relaxng(@opt.cmd) + #rnc + cp(rnc_src,rnc_file) + chmod(0644,rnc_file) + end + def trang_rnc_model_input_sax + rnc_file=@env.path.dal + '/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::System_call.new(rnc_file,dtd_file) + schema.relaxng(@opt.cmd) + end + def trang_rnc_model_input_dom + rnc_file=@env.path.dal + '/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::System_call.new(rnc_file,dtd_file) + schema.relaxng(@opt.cmd) + end + def trang_rnc_model_input_node + rnc_file=@env.path.dal + '/node.rnc' + rng_file=@env.path.dal + '/node.rng' + 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::System_call.new(rnc_file,dtd_file) + schema.relaxng(@opt.cmd) + end + end +end +__END__ diff --git a/lib/sisu/0.52/css.rb b/lib/sisu/0.52/css.rb new file mode 100644 index 00000000..47f7e375 --- /dev/null +++ b/lib/sisu/0.52/css.rb @@ -0,0 +1,1939 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: css stylesheets + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Style + require SiSU_lib + '/sysenv' + require SiSU_lib + '/defaults' + class CSS + def initialize + @vz=SiSU_Env::Get_init.instance.skin + #@vz=SiSU_Viz::Skin.new + end + def fonts + @vz.font_fonts + end + def html_tables #stylesheet for css table_pages +< */ + h1.microtoc { + margin-left: 0mm; + font-size: 115%; + margin-top: 2px; + margin-bottom: 2px; + } + h2.microtoc { + margin-left: 5mm; + font-size: 110%; + margin-top: 2px; + margin-bottom: 2px; + } + h3.microtoc { + margin-left: 10mm; + font-size: 105%; + margin-top: 2px; + margin-bottom: 2px; + } + h4.microtoc { + margin-left: 15mm; + font-weight: normal; + font-size: 100%; + margin-top: 2px; + margin-bottom: 2px; + } + h5.microtoc { + margin-left: 20mm; + font-weight: normal; + font-size: 95%; + margin-top: 2px; + margin-bottom: 2px; + } + h6.microtoc { + margin-left: 25mm; + font-weight: normal; + font-size: 90%; + margin-top: 2px; + margin-bottom: 2px; + } +/* subtoc --> */ + h5.subtoc { + margin-left: 20mm; + margin-right: 34%; + font-weight: normal; + font-size: 80%; + margin-top: 2px; + margin-bottom: 2px; + } + h6.subtoc { + margin-left: 25mm; + margin-right: 34%; + font-weight: normal; + font-size: 75%; + margin-top: 0px; + margin-bottom: 0px; + } + 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; + } +/* + table.hidden { + color: #ffffff; + text-decoration: none; + } + td.hidden { + color: #ffffff; + background-color: #000000; + } + td.hidden a.active, div.hidden a:hover { + color: #ffffff; + background-color: #000000; + } + td.hidden a:hover { + text-decoration: none; + } + div.hidden a { + line-height: 12px; + margin: 0 0 0 0; + text-decoration: none; + color: #000077; + } + div.hidden a.active, div.hidden a:hover { + text-decoration: none; + } + div.hidden a:hover { + text-decoration: none; + } +*/ +WOK + end + def homepage #stylesheet for index, home page +< */ +/* + +*/ +/* subtoc --> */ + p.subtoc4 { + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 10%; + margin-right: 10%; + margin-top: 5px; + margin-bottom: 5px; + } + p.subtoc5 { + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 15%; + margin-right: 10%; + margin-top: 5px; + margin-bottom: 5px; + } + p.subtoc6 { + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 20%; + margin-right: 10%; + margin-top: 5px; + margin-bottom: 5px; + } + p.ocn { + display: block; + text-align: right; + vertical-align: super; + color: #999999; + font-size: xx-small; + margin-right: 0mm; + margin-top: 0px; + margin-bottom: 0px; + } + p.note { + 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; + } + 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 xhtml #stylesheet for xhtml +< #{@my_make_fns.meta}") if @md.cmd =~/M/ + tell.txt_grey unless @md.cmd =~/q/ + dal.each{|s| dal_array << "#{s.strip}\n\n" unless s.strip.empty?} + dal_array + end + def read_fnm + dal=[] + dal=if FileTest.file?(@fnm); File.open(@fnm){ |f| dal=Marshal.load(f)} + else SiSU_DAL::Source.new(@opt).create_dal + end + end + end + class Output + def initialize(md,data) + @md,@data=md,data + @my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns) + dir=SiSU_Env::Info_env.new(@md.fns) + @hard="#{dir.path.dal}/#{@md.fns}.meta" + end + def hard_output + if @md.cmd =~/M/ + filename_meta=@my_make.file_meta + @data.each {|s| filename_meta.puts s.strip + "\n\n" unless s.strip.empty?} + else File.unlink(@hard) if FileTest.file?(@hard) + end + end + def marshal + marshal_meta=@my_make.marshal_meta + File.open(marshal_meta,'w'){|f| Marshal.dump(@data.to_a,f)} + end + end + class Make + @@endnote={} + @@endnote_array=@@word_mode=[] + @@endnote_counter,@@endnote_counter_asterisk,@@endnote_counter_dag=1,1,1 + @@comment='%' + @@dp=nil + def initialize(md,data) + @md,@data=md,data + @@word_mode=[] + @env=SiSU_Env::Info_env.new(@md.fns) + @skin=SiSU_Env::Info_skin.new(@md) + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + l=SiSU_Env::Standardise_language.new.file_to_language(@md.fns) + @language=l[:l] + @tr=SiSU_Translate::Source.new(@md,@language) + end + def reset + @@flag_vocab=0 + @@endnote={} + @@endnote_array=@@word_mode=[] + @@endnote_counter,@@endnote_counter_asterisk,@@endnote_counter_dag=1,1,1 + @@line_mode='' + end + def song + reset + data=@data + @metafile="#{@env.path.dal}/#{@md.fns}.meta" + my_make_source_file=SiSU_Env::Create_file.new(@md.cmd,@md.fns) + data=data.join.split("\n\n") + data=SiSU_document_structure::Code.new(@md,data).code + data_new=[] + data.each do |x| + data_new << if x =~ /\n\n/m; x.split(/\n\n+/) + else x + end + end + data=data_new.flatten + data=SiSU_DAL::Make.new(@md,data).substitutions_and_insertions? + data=Syntax::Markup.new(@md,data).songsheet + data=SiSU_DAL::Make.new(@md,data).character_check + data=SiSU_DAL::Make.new(@md,data).images + data=SiSU_document_structure::Tables.new(@md,data).tables + data=SiSU_DAL::Make.new(@md,data).numbering_song + data=SiSU_DAL::Make.new(@md,data).endnotes + data=SiSU_DAL::Make.new(@md,data).object_digest + meta=SiSU_DAL::Make.new(@md,data).metadata + outputdata=data + meta + if @md.cmd =~/[mM]/ + SiSU_DAL::Output.new(@md,outputdata).hard_output + SiSU_DAL::Output.new(@md,outputdata).marshal + end + reset + outputdata + end + protected + def vocabulary + data=@data + vocab_insert,tuned_file=[],[] + data.each do |para| + if para =~/^1~/ and @@flag_vocab == 0 + vocab_insert << '0~vocabulary lex' << "\n\n" << para #watch consider + tuned_file << vocab_insert unless para.nil? + @@flag_vocab=1 + else tuned_file << para unless para.nil? + end + end + tuned_file + end + def character_check + require 'iconv' + reset + data=@data + @tuned_file=[] + endnote_no=1 + data.each do |para| + para.strip! + para.gsub!(/^([12])~\?\s+/,'\1~ ') #conditional header for incorporated document 2004w12 + para.gsub!(/^[{~}]\s*$/,'') + para.gsub!(/^#{@@comment}.*/,'') #remove comment and divider #% + para.gsub!(/<~#>|~#\s*/,'<~#>') + para.gsub!(/-#\s*/,'<-#><~#>') + #para.gsub!(/(#\{{3} arch-tag:|0\{{3}~cvs)\s+/, "0{{~rcs ") #KEEP ... ENABLE WIDER USE OF REVISION CONTROL + para.gsub!(/(~\{ )\s+/,'\1') + para.gsub!(/ \/\//,'
') #added 2004w29 + para.gsub!(/
/,'
') #needed by xml, xhtml etc. + #para.gsub!(/

/,'

') #consider + para.gsub!(/`/,"'") + para.gsub!(/\342\200\231/,"'") #if para =~/’/ #Avoid #‘ ’ #“ ” + para.gsub!(/\t/,' ') + para.gsub!(/�/,' ') #watch, replace with char code + para.gsub!(/[“”]/,'""') + para.gsub!(/[­–—]/,'-') #— – chk + para.gsub!(/·/,'*') + para.gsub!(/\\copy(?:right)?\b/,'©') + para.gsub!(/\\trademark\b|\\tm\b/,'®') + #non_utf8(para) + para=para + "\n" + case para + when /\^~/ # endnotes + #% Note must do this first (earlier loop) and then enter gathered data into ~^\d+ + sub_para=para.dup + @@endnote_array << sub_para.gsub!(/\n/,'').gsub!(/\^~\s+(.+)\s*/, %{~\{#{endnote_no} \\1 \}~}).strip + endnote_no+=1 + para=nil if para =~/\^~ .+/ #removes 'binary' endnote now in endnote array for later insertion + end + @tuned_file << para unless para.nil? + end + @tuned_file + end + def images + data=@data + tuned_file=[] + @rmgk=false + if SiSU_Env::Info_settings.new.program?('rmagick'); @rmgk=SiSU_Env::Load.new('RMagick').prog + else tell=SiSU_Screen::Ansi.new(@md.cmd,'use of RMagick is not enabled in sisurc.yml') + tell.warn if @md.cmd =~/[vVM]/ + end + data.each do |para| + para.strip! + if para =~/\{\s*\S+\.(?:png|jpg|gif)(?:\s*|\s+.+)?\}(?:(?:https?|ftp):\S+|image)/ + if para !~/\{\s*\S+\.(?:png|jpg|gif)\s+\d+x\d+\s+/ + m=/\{\s*(\S+\.(?:png|jpg|gif))/ + if @rmgk + imgs=para.scan(m).flatten + images=imgs.each do |image| + dir=SiSU_Env::Info_env.new(@md.fns) + path_image=[dir.path.image_source_local_tex,dir.path.image_source_remote_tex,dir.path.image_source_tex] + image_path=nil + path_image.each do |image_path| + break if FileTest.exists?("#{image_path}/#{image}") + end + if FileTest.exists?("#{image_path}/#{image}") + img=Magick::ImageList.new("#{image_path}/#{image}") + img_col,img_row=img.columns,img.rows + if img_col > img_row #landscape + if img_col> 640 #480 + img_col=640 #480 + img_row=((1.00*img_col/img.columns)*img.rows).round + end + else #portrait + if img_col> 640 #480 + img_col=640 #480 + img_row=((1.00*img_col/img.columns)*img.rows).round + end + if img_row > 640 + img_row=640 + img_col=((1.00*img_row/img.rows)*img.columns).round + end + end + para.gsub!(/(#{image})/,"#{image} #{img_col}x#{img_row}") + else para.gsub!(/\{\s*(\S+)\.(png|jpg|gif).+?\}((?:https?|ftp):\S+|image)/,'[ \1 (\2 missing) ]') + end + end + else + images=para.scan(m) do |image| + tell=SiSU_Screen::Ansi.new(@md.cmd,'where image dimensions have not been provided RMagick is required',image) + tell.warn #unless @opt.cmd =~/q/ + end + end + end + end + para.gsub!(/\{\s+(\S+\.(?:png|jpg|gif))\s+/i,'{\1 ') if para =~/\{\s+\S+\.(?:png|jpg|gif).+?\}(?:(?:https?|ftp):\S+|image)/ + tuned_file << para unless para.nil? + end + tuned_file + end + def output_filetypes_in_cmd(cmd_shortcut,source=nil) + #make list of file types in shortcut command (as configured), e.g. when sisu -3 is used + cf_defaults=SiSU_Env::Info_processing_flag.new + cmd_list=case cmd_shortcut.to_s + when /0/; cf_defaults.cf_0 + when /1/; cf_defaults.cf_1 + when /2/; cf_defaults.cf_2 + when /3/; cf_defaults.cf_3 + when /4/; cf_defaults.cf_4 + when /5/; cf_defaults.cf_5 + end + file_type_names=[] + file_type_names <<= if cmd_list =~ /y/; 'sisu_manifest.html' + end + file_type_names <<= if cmd_list =~ /h/; ['toc.html', 'doc.html'] + end + file_type_names <<= if cmd_list =~ /p/; ['landscape.pdf', 'portrait.pdf'] + end + file_type_names <<= if cmd_list =~ /o/; 'opendocument.odt' + end + file_type_names <<= if cmd_list =~ /b/; 'scroll.xhtml' + end + file_type_names <<= if cmd_list =~ /x/; 'sax.xml' + end + file_type_names <<= if cmd_list =~ /X/; 'dom.xml' + end + file_type_names <<= if cmd_list =~ /a/; 'plain.txt' + end + file_type_names <<= if cmd_list =~ /g/; 'wiki.txt' + end + file_type_names <<= if cmd_list =~ /w/; 'concordance.html' + end + file_type_names <<= if cmd_list =~ /N/; 'digest.txt' + end + file_type_names <<= if source and cmd_shortcut =~ /s/; source + end + file_type_names <<= if cmd_shortcut =~ /S/; 'sisupod.zip' + end + file_type_names=file_type_names.flatten + end + def substitutions_and_insertions? + data=@data + tuned_file=[] + 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 preceeds it) + data[0].gsub!(/^#!\s*\/usr\/bin\/sisu/,'') + data[0].gsub!(/^#!\s*\/usr\/bin\/env sisu/,'') + end + if data[0] =~ /^(SiSU\s+[\d.]*|sisu-[\d.]+)$/ # SiSU identifier + data[0].gsub!(/^(SiSU\s*[\d.]*)$/,'% \1') + data[0].gsub!(/^(sisu-[\d.]+)$/,'% \1') + end + data.each do |para| + para=if @md.markup_version.to_f >= 0.38 + SiSU_document_structure::Structure.new(@md,para).structure_markup_normalize + else para + end + #para.gsub!(//,'\1') #consider, would permit use of text hyperlinks if desired, dal_syntax more appropriate? + para.gsub!(/^((?:[1-9]|:?[A-C])~\S*)\s*$/,'\1~ [Note: heading marker::required title missing]~#') #conditional header for incorporated document 2004w12 + if para =~/^@\S+?:/ + para.gsub!(/^@(\S+?):\s+/,'0~\1 ') + para.gsub!(/^@(\S+?):([+-])\s+/,'0~\1\2 ') + end + if para !~/^%+\s/ and + para =~/^(?:_\*\s+)?\{(?:~\^\s+)?(.+?)\s\[(?:\d(?:[sS]+))\]\}(?:\.\.\/\S+?\/|\S+?\.(?:sst|ssm)\b)(?:\s+~\{.+?\}~)?(?:\s+\*~\S+)*\s*$/ + txt,cmd,source,url_dir,note,manifest=nil,nil,nil,nil,nil,nil + url_and_stub=SiSU_Env::Info_env.new.url + if defined? url_and_stub.remote + @output_url="#{url_and_stub.remote}" + if para =~/\{(.+?)\s\[(\d[sS]*)\]\}((\S+?)\.ss[tm])(\s+~\{.+?\}~)?/ + #syntax e.g.: { "Sphinx or Robot", Leena Krohn [3sS]}sphinx_or_robot.leena_krohn.1996.sst + txt,cmd,source,url_dir,note=$1,$2,$3,$4,$5 + elsif para =~/\{(.+?)\s\[(\d[sS]*)\]\}\.\.\/(\S+?)\/(\s+~\{.+?\}~)?/ + #syntax e.g.: { "Sphinx or Robot", Leena Krohn [3sS]}../sphinx_or_robot.leena_krohn.1996/ + txt,cmd,url_dir,note=$1,$2,$3,$4 + end + manifest="{#{txt} }#@output_url/#{url_dir}/toc.html#{note}\n\n" + 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 para =~/\{(?:~\^\s+)?(.+?)\s\[(\d[sS]*)\]\}\.\.\/(\S+?)\/(\s+~\{.+?\}~)?/ + txt,cmd,url_dir,note=$1,$2,$3,$4 + manifest="{ #{txt} }../#{url_dir}/toc.html#{note}\n\n" + end + end + tuned_file << manifest + output_filetypes_in_cmd(cmd,source).each do |o_f| + describe = case o_f + when /sisu_manifest.html/; '~^ document manifest' + when /toc.html/; ' html, segmented text' + when /doc.html/; ' html, scroll, document in one' + when /landscape.pdf/; ' pdf, landscape' + when /portrait.pdf/; ' pdf, portrait' + when /opendocument.odt/; ' open document' + when /scroll.xhtml/; ' xhtml scroll' + when /sax.xml/; ' xml, sax' + when /dom.xml/; ' xml, dom' + when /plain.txt/; ' plain text utf-8' + when /wiki.txt/; ' wiki text' + when /concordance.html/; ' concordance' + when /digest.txt/; ' dcc, document content certificate (digests)' + when /#{source}/; ' markup source text' + when /sisupod.zip/; ' zipped markup source pod' + else nil + end + if describe + if @output_url + tuned_file << "_1 {#{describe} }#@output_url/#{url_dir}/#{o_f}\n\n" if describe + else + tuned_file << "_1 { #{describe} }../#{url_dir}/#{o_f}\n\n" + end + end + end + elsif para =~/<:insert\d+!?>/ and para !~/^%\s+/ + @skin.select + ins=SiSU_Viz::Inserts.new + case para + when /^\s*<:insert1>\s*$/ + para=[] + ins.insert1.split(/\n\n/).each{|x| para << x } + when /^\s*<:insert2>\s*$/ + para=[] + ins.insert2.split(/\n\n/).each{|x| para << x } + when /^\s*<:insert3>\s*$/ + para=[] + ins.insert3.split(/\n\n/).each{|x| para << x << "\n"} + para=ins.insert3 + when /^\s*<:insert4>\s*$/ + para=[] + ins.insert4.split(/\n\n/).each{|x| para << x << "\n"} + para=ins.insert4 + when /^\s*<:insert5>\s*$/ + para=[] + ins.insert5.split(/\n\n/).each{|x| para << x << "\n"} + when /^\s*<:insert6>\s*$/ + para=[] + ins.insert6.split(/\n\n/).each{|x| para << x << "\n"} + when /^\s*<:insert7>\s*$/ + para=[] + ins.insert7.split(/\n\n/).each{|x| para << x << "\n"} + end + para.each{|x| tuned_file << x } + else tuned_file << para + end + tuned_file.flatten! + tuned_file.compact! + end + tuned_file + end + def numbering_song + data=@data + data=SiSU_DAL::Make.new(@md,data).number_plaintext_para + data=SiSU_DAL::Make.new(@md,data).name_endnote_seg + data=SiSU_DAL::Make.new(@md,data).auto_number_heading_ie_title + data=SiSU_DAL::Make.new(@md,data).ocn unless @md.markup =~/not_to/ + data=SiSU_DAL::Make.new(@md,data).minor_numbering #unless @md.markup =~/not_to/ + data=SiSU_DAL::Make.new(@md,data).name_para_seg_filename + data=SiSU_DAL::Make.new(@md,data).set_heading_seg unless @md.set_heading_seg + data=SiSU_DAL::Make.new(@md,data).set_heading_top unless @md.set_heading_top + data=SiSU_DAL::Make.new(@md,data).set_header_title unless @md.set_header_title + data + end + def number_plaintext_para + data=@data + @tuned_file=[] + data.each do |para| + para.gsub!(/(^|[^<][^v][^>])\n/,'\1 ') #messy, but idea is that tables should retain breaks + para.gsub!(/^/,"\n") unless para =~/¡/ + para.gsub!(/^\s+|\s$/,"\n") + @tuned_file << para + end + @tuned_file + end + def name_endnote_seg + data=@data + @tuned_file=[] + data.each do |para| + para.gsub!(/<:3>\s*<:ee>/, + "#{@@endnote['special_align']}


\r " + + "#{@@endnote['seg_name_3']}

" + + "#{@@endnote['special_align_close']}") + para.gsub!(/<:2>\s*<:ee>/, + "#{@@endnote['special_align']}


\r " + + "#{@@endnote['seg_name_2']}

" + + "#{@@endnote['special_align_close']}") + para.gsub!(/<:1>\s*<:ee>/, + "#{@@endnote['special_align']}


\r " + + "#{@@endnote['seg_name_1']}

" + + "#{@@endnote['special_align_close']}") + @tuned_file << para + end + # debug 2003w46 adding revision control info + if @md.flag_auto_endnotes and @md.flag_separate_endnotes_make + @tuned_file << "\n4~endnotes Endnotes <~0;0:0;u0>" #prob numbering, revisit + end + @tuned_file << "\n" + @tuned_file + end + def owner_details_seg + data << '4~owner.details Owner Details' + end + def number_sub_heading(para,num,title_no) + case para + when /#{num}~- /; para.gsub!(/#{num}~- /,"#{title_no} ") + when /^#{num}~#\s*/; para.gsub!(/^#{num}~#\s*/,"#{title_no} ") + when /^#{num}~[a-z_\.]+ / + para.gsub!(/^#{num}~([a-z_\.]+)\s+(.+)/i,%{#{num}~\\1 #{title_no} \\2 <:name##{title_no}>}) + else para.gsub!(/^#{num}~ /,"#{num}~#{title_no} #{title_no} ") #main + end + if @md.toc_lev_limit and @md.toc_lev_limit < num + para.gsub!(/^[5-8]~(?:~\S+)?\s*/,'!_ ') + end + para + end + def auto_number_heading_ie_title #also does some segment naming + data=@data + @tuned_file=[] + if @md.markup =~/num_top/ or @md.num_top # watch, 2003w23 + input="#{@md.markup}"[/num_top\=([1-6])/,1] if @md.markup + input||=@md.num_top if @md.num_top !~/^$/ + end + num_top=input.to_i + t_no1=t_no2=t_no3=t_no4=0 + no1=num_top; no2=(num_top + 1); no3=(num_top + 2); no4=(num_top + 3) + t_not=0 + data.each do |para| #@md.seg_names << [additions to segment names] + if (@md.markup =~/num_top/ or (@md.num_top and @md.num_top !~/^$/)) and para !~/^0~/ + if (para =~/^(?:#{no1}|^#{no2}|^#{no3}#{no4})~#/ and para !~/^4~endnotes?/) + t_not+=1 #; t_no2=0; t_no3=0 + para.gsub!(/^(#{no1})~#\s*/,"\\1~ps#{t_not} ") + para.gsub!(/^(#{no2})~#\s*/,"\\1~ps#{t_not} ") + para.gsub!(/^(#{no3})~#\s*/,"\\1~ps#{t_not} ") + para.gsub!(/^(#{no4})~#\s*/,"\\1~ps#{t_not} ") + end + if para =~/#{no1}~/ + @subnumber=1 + @subnumber=0 if para =~/#{no1}~/ + end + if para =~/^[0-6]~[ \w-]/ and para !~ /(?:[0-6]~[\w-]+-|4~endnotes|^[0-6]~([a-z_\.]+)\s+[\d.]+)\s/ and para !~/<~#>|<-#>/ + if para =~/^#{no1}~/ + t_no1+=1; t_no2=0; t_no3=0 + title_no="#{t_no1}" + if not @md.seg_names.nil? and not @md.seg_names.include?(title_no) + para.gsub!(/^#{no1}~\s+(\S+)#/,"#{no1}~#{title_no} \\1 #{title_no} ") #shift placement of auto-number to after first word, e.g. Article # not # Article, added on occasion of ABF (20040329) + para.gsub!(/^#{no1}\{\s+(Article|Clause|Section)\s+#/i,%{#{no1}~#{title_no} \\1 #{title_no}. }) + unless para =~/^#{no1}~\s+[\d.]+\s/ #fix -> if the title starts with a numbering scheme, do not auto-number, review + para.gsub!(/^#{no1}~\s+/,"#{no1}~#{title_no} #{title_no}. ") + end + @md.seg_names << title_no + #else puts "warning segment name #{title_no} already exists" + end + unless para =~/^#{no1}~([a-z_\.]+)\s+[A-Z]\.?\s/ #bug -> tmp fix, excludes A. B. C. lettering, but not roman numerals, is arbitrary, review required + para.gsub!(/^#{no1}~([a-z_\.]+)\s+(.+)/i,%{#{no1}~\\1 #{title_no}. \\2 <:name##{title_no}>}) + end + para.gsub!(/^#{no1}~#\s*/,"#{title_no}. ") + end + if para =~/^#{no2}~/ + t_no2+=1; t_no3=0 + title_no="#{t_no1}.#{t_no2}" + para=number_sub_heading(para,no2,title_no) + end + if para =~/^#{no3}~/ + t_no3+=1 + title_no="#{t_no1}.#{t_no2}.#{t_no3}" + para=number_sub_heading(para,no3,title_no) + end + elsif para =~ /^[0-6]~[\w-]+-/ # endnotes, watch2005 + para.gsub!(/^#{no1}~([a-z_\.]+)- /,"#{no1}~\\1 ") + para.gsub!(/^#{no2}~([a-z_\.]+)- /,"#{no2}~\\1 ") + para.gsub!(/^#{no3}~([a-z_\.]+)- /,"#{no3}~\\1 ") + end + elsif @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 + unless para =~ /^[0-6]~\S+/ #endnotes watch? + if para =~/^[1-6]~\s+([\d\.]+)/ #risky (must be unique) consider output to 4~~\d instead of 4~\d + name_num=$1 + para.gsub!(/^([1-6]~)\s+/,"\\1#{name_num} ") + end + end + if @md.toc_lev_limit + end + end + @tuned_file << para + end + @tuned_file + end + def ocn #and auto segment numbering increment + data=@data + @tuned_file=[] + object_array=SiSU_document_structure::OCN.new(@md,data).ocn + object_array.each do |o| + @tuned_file <<= if o.ocn; "#{o.txt} <~#{o.ocn};#{o.lv};#{o.type}>" + else o.txt + end + end + @tuned_file + end + def minor_numbering #and auto segment numbering increment + data=@data + @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 |para| + if para =~/\w|\S|<|\(/ + if para !~/^%% |^0~|^4~endnotes|^<\/center>|<:ee>|<:e[:_]>|^\^~ |<:e[:_]\d+?>|^<:p[bn]>|^<:\#|<:- |<[:!]!4|^(?:alt|code|group|poem|table)\{|^\}(?:alt|code|group|poem|table)|^\}table$|||||<\/tr>|


|\[endnotes\]|<:zz>|<:isbn-|<:journal-|<:conference-|/i #ocn here #  added with Tune.code #¡ + if para=~/^[1-8]~/; number_small,letter_small=0,0 #% 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) + end + if para =~/^#[ 1]/ + letter_small=0 + number_small=0 if para =~ /^#1/ + number_small+=1 + para.gsub!(/^#[ 1]/,"#{number_small}. ") #change 2004 + end + if para =~/^_# / + para.gsub!(/^_# /,"<:i1> #{letter[letter_small]}. ") #change 2004 + letter_small+=1 + end + end + end + @tuned_file << para + end + @tuned_file + end + def name_para_seg_filename + # 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 + data=@data + @tuned_file=[] + art_filename_auto=1 + @counter=1 + @unique_auto_name=[] + puts 'manual segment names, numbers used as names, risk warning (segmented html)' if not @md.seg_autoname_safe and @md.cmd =~/[MV]/ + data.each do |para| + para=SiSU_document_structure::Structure.new(@md,para).structure_markup + if para !~/^0~/ + if para =~/^[456]~ / + if para=~/^4/ and not @md.set_heading_seg + @md.set_heading_seg=true + end + if para =~/^[456]~(?:\s\S+)?\s+([\d.,:-]+)/m #heading starts with a recognised numeric or word followed by a recognised numerical construct, use that as name + pattern=$1 + pattern.gsub!(/(?:[:,-]|\W)/,'.') + pattern.gsub!(/\.$/,'') + if not @md.seg_names.nil? and not @md.seg_names.include?(pattern) + para.gsub!(/^([456])~\s*/,"\\1~#{pattern} ") + @md.seg_names << pattern + else puts 'warn, there may be a conflicting numbering scheme' if @md.cmd =~/[VM]/ + end + end + if para =~/^4~\s.+?;4:(\d+);/m #extract segment name from embedded document structure info + pattern=$1 + pattern.gsub!(/(?:[:,-]|\W)/,'.') + pattern.gsub!(/\.$/,'') + if not @md.seg_names.nil? and not @md.seg_names.include?(pattern) + para.gsub!(/^(4)~\s*/,"\\1~#{pattern} ") + @md.seg_names << pattern + else + para.gsub!(/^(4)~\s*/,"\\1~~#{pattern} ") + @md.seg_names << "~#{pattern}" + end + end + if para =~/^4~\s+/ #if still not segment name, provide a numerical one + if not @md.seg_names.nil? and not @md.seg_names.include?(art_filename_auto) + para.gsub!(/^4~\s+/,%{4~_#{art_filename_auto} }) + @md.seg_names << art_filename_auto + else puts 'segment name (numbering) error' + end + art_filename_auto+=1 + end + end + end + @tuned_file << if para =~/^([1-6])~/m and (@md.pagenew or @md.pagebreak); m=$1 #watch ref~ + para_tmp=[] + if @md.pagenew.to_s =~/#{m}/; para_tmp << "<:pn>\n" << para + end + if @md.pagebreak.to_s =~/#{m}/; para_tmp << "<:pb>\n" << para + end + para_result=unless para_tmp.length > 0; para + else para_tmp + end + else para + end + end + if @md.seg_names.length > 0 + @md.set_heading_seg=true + end + @tuned_file=@tuned_file.flatten + end + def set_heading_top #% make sure no false positives + unless @md.set_heading_top + puts "\tdocument contains no top level heading, (will have to manufacture one)" if @md.cmd =~/[MV]/ + data=@data + @tuned_file=[] + data.each do |para| + unless @md.set_heading_top + if para !~/^(?:@\S+:|0~\S+)\s/m and para !~/\A\s*\Z/m + @md.set_heading_top=true + head=if @md.title ; "1~ #{@md.title}" + else '1~ [no title provided]' + end + @tuned_file << head + end + end + @tuned_file << para + end + @tuned_file + end + end + def set_heading_seg #% make sure no false positives + unless @md.set_heading_seg + puts "\tdocument contains no segment level, (will have to manufacture one)" if @md.cmd =~/[MV]/ + data=@data + @tuned_file=[] + data.each do |para| + unless @md.set_heading_seg + if para !~/^(?:@\S+:|0~\S+|[123]~)/m and para !~/\A\s*\Z/m and para !~/<:p[bn]>/ + @md.set_heading_seg=true + head=if @md.title ; "4~seg [#{@md.title}]" + else '4~seg [segment]' + end + @tuned_file << head + end + end + @tuned_file << para + end + @tuned_file + end + end + def set_header_title #% make sure no false positives + unless @md.set_header_title + puts "\t no document title provided, (will have to manufacture one)" if @md.cmd =~/[MV]/ + data=@data + @tuned_file=[] + data.each do |para| + unless @md.set_header_title + if para !~/^%{1,2}\s/m and para !~/\A\s*\Z/m + @tuned_file << "0~title #{@md.heading_seg_first}" + @md.title=@md.heading_seg_first + @md.set_header_title=true + end + end + @tuned_file << para + end + @tuned_file + end + end + def endnotes + data=@data + @tuned_file=[] + endnote_no,endnote_ref=1,1 + #% endnote work zone + data.each do |para| + # manually numbered endnotes --> + if @md.mod.inspect =~/--no-asterisk|--no-annotate/ + para.gsub!(/~\[[*]\s.+?\]~/,'') + end + if @md.mod.inspect =~/--no-dagger|--no-annotate/ + para.gsub!(/~\[[+]\s.+?\]~/,'') + end + case para + # auto-numbered endnotes --> + when /~\{\s+.+?\}~|~\[[*+]\s+.+?\]~/ + para.gsub!(/\s*(\}~|\]~)/,' \1') # required 2003w31 + @word_mode=para.scan(/\S+/) + word_mode=SiSU_DAL::Make.new(@md,@word_mode).endnote_call_number + para=word_mode.join(' ') + endnote_ref+=1 + when /~\^(?:\s|$)|<:e>/ + #%Note inserts endnotes previously gathered from /^(|[-~]\{{3})/ (in earlier loop) + word_mode=para.scan(/\S+/) + word_mode=SiSU_DAL::Make.new(@md,word_mode).endnote_call_number + para=word_mode.join(' ') + endnote_ref+=1 + end + @tuned_file << para + end + @tuned_file + end + def endnote_call_number + data=@data + data.each do |word| + case word + when /~\{/ + unless word =~/~\{[*+]+/ + word.gsub!(/~\{/,"~\{#{@@endnote_counter} ") + @@endnote_counter+=1 + end + when /~\[/ + if word =~/~\[[+]/ + word.gsub!(/~\[[+]/,"~\[\+#{@@endnote_counter_dag} ") + @@endnote_counter_dag+=1 + else + word.gsub!(/~\[[*]?/,"~\[\*#{@@endnote_counter_asterisk} ") + @@endnote_counter_asterisk+=1 + end + when /~\^|<:e>/ + word.gsub!(/~\^|<:e>/,"#{@@endnote_array[@@endnote_counter-1]}") + @@endnote_counter+=1 + end + end + end + def metadata + data=@data + meta,@dc,@rc,@cvs,dctitle,add=Array.new(6){[]} + dir=SiSU_Env::Info_env.new(@md.fns) + base_html="#{dir.url.root}/#{@md.fnb}" + ocnm=ocnd=ocnv=0 + ocnm+=1 + header0='<:pn>' + header1="\n1~ Document Information <~0;0:0;m#{ocnm}>" + ocnm+=1 + header4="\n4~metadata MetaData <~0;m#{ocnm};m#{ocnm}>" + ocnm+=1; ocnd+=1 + head_no_dc="<~0;m#{ocnm};d#{ocnd}>" + ocnm+=1; ocnd+=1 + head_no_dc_tag="<~0;m#{ocnm};d#{ocnd}>" + data.each do |para| + case para + when /^0~(title|creator|author|translator|translated_by|illustrator|illustrated_by|prepared_by|digitized_by|description|publisher|contributor|date\.created|date\.issued|date\.available|date\.valid|date\.modified|date|type|format|rights|identifier|source|language)/i + m=$1 + ocnm+=1; ocnd+=1 + @dc << case para + when /^0~title/ + "\n#{@tr.dc_title}: #{@md.dc_title} <~0;m#{ocnm};d#{ocnd}>" + when /^0~(?:creator|author)/ + "\n#{@tr.creator}: #{@md.dc_creator} <~0;m#{ocnm};d#{ocnd}>" + when /0~(?:translator|translated_by)/ + "\n#{@tr.translator}: #{@md.translator} <~0;m#{ocnm};d#{ocnd}>" + when /^0~(?:illustrator|illustrated_by)/ + "\n#{@tr.illustrator}: #{@md.illustrator} <~0;m#{ocnm};d#{ocnd}>" + when /^0~prepared_by/ + "\n#{@tr.prepared_by}: #{@md.prepared_by} <~0;m#{ocnm};d#{ocnd}>" + when /^0~digitized_by/ + "\n#{@tr.digitized_by}: #{@md.digitized_by} <~0;m#{ocnm};d#{ocnd}>" + when /^0~description/ + "\n#{@tr.description}: #{@md.dc_description} <~0;m#{ocnm};d#{ocnd}>" + when /^0~subject/ + "\n#{@tr.subject}: #{@md.dc_subject} <~0;m#{ocnm};d#{ocnd}>" + when /^0~abstract/ + "\n#{@tr.abstract}: #{@md.dc_abstract} <~0;m#{ocnm};d#{ocnd}>" + when /^0~publisher/ + "\n#{@tr.publisher}: #{@md.dc_publisher} <~0;m#{ocnm};d#{ocnd}>" + when /^0~contributor/ + "\n#{@tr.contributor}: #{@md.dc_contributor} <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.created/ + "\n#{@tr.date_created}: #{@md.dc_date_created} <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.issued/ + "\n#{@tr.date_issued}: #{@md.dc_date_issued} <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.available/ + "\n#{@tr.date_available}: #{@md.dc_date_available} <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.modified/ + "\n#{@tr.date_modified}: #{@md.dc_date_modified} <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.valid/ + "\n#{@tr.date_valid}: #{@md.dc_date_valid} <~0;m#{ocnm};d#{ocnd}>" + when /^0~date/ + "\n#{@tr.date}: #{@md.dc_date} <~0;m#{ocnm};d#{ocnd}>" + when /^0~type/ + "\n#{@tr.type}: #{@md.dc_type} <~0;m#{ocnm};d#{ocnd}>" + when /^0~format/ + "\n#{@tr.format}: #{@md.dc_format} <~0;m#{ocnm};d#{ocnd}>" + when /^0~rights/ + "\n#{@tr.rights}: #{@md.dc_rights} <~0;m#{ocnm};d#{ocnd}>" + when /^0~identifier/ + "\n#{@tr.identifier}: #{@md.dc_identifier} <~0;m#{ocnm};d#{ocnd}>" + when /^0~source/ + "\n#{@tr.source}: #{@md.dc_source} <~0;m#{ocnm};d#{ocnd}>" + when /^0~language/ + "\n#{@tr.language}: #{@md.dc_language} <~0;m#{ocnm};d#{ocnd}>" + when /^0~language.original/ + "\n#{@tr.language_original}: #{@md.language_original} <~0;m#{ocnm};d#{ocnd}>" + when /^0~relation/ + "\n#{@tr.relation}: #{@md.dc_relation} <~0;m#{ocnm};d#{ocnd}>" + when /^0~coverage/ + "\n#{@tr.coverage}: #{@md.dc_coverage} <~0;m#{ocnm};d#{ocnd}>" + when /^0~keywords/ + "\n#{@tr.keywords}: #{@md.keywords} <~0;m#{ocnm};d#{ocnd}>" + when /^0~comments/ + "\n#{@tr.comments}: #{@md.comments} <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_loc/ + "\n#{@cls_dewey}: #{@md.cls_dewey} <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_dewey/ + "\n#{@tr.cls_dewey}: #{@md.cls_dewey} <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_gutenberg|0~cls_pg/ + "\n#{@tr.cls_gutenberg}: #{@md.cls_gutenberg} <~0;m#{ocnm};d#{ocnd}>" + #"\n#{@tr.cls_gutenberg}: #{@md.cls_pg} <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_isbn/ + "\n#{@tr.cls_isbn}: #{@md.cls_isbn} <~0;m#{ocnm};d#{ocnd}>" + when /^0~prefix(?:_a)?/ + "\n#{@tr.prefix_a}: #{@md.prefix_a} <~0;m#{ocnm};d#{ocnd}>" + when /^0~prefix_b/ + "\n#{@tr.prefix_b}: #{@md.prefix_b} <~0;m#{ocnm};d#{ocnd}>" + else para.gsub(/^0~(#{m})\s+(.+)/m,"\n#{m.capitalize}: \\2 <~0;m#{ocnm};d#{ocnd}>") + end + end + end + ocnm+=1; ocnv+=1 + head_no_rc="<~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + head_no_rc_tag="<~0;m#{ocnm};v#{ocnv}>" + data.each do |para| + case para + when /^0~(?:cvs|rcs)\+\s+/ #note the + sign to turn on use of cvs id + ocnm+=1; ocnv+=1 + @cvs << "#{@tr.sc_number}: #{@md.sc_number} <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + @cvs << "#{@tr.sc_date}: #{@md.sc_date} <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + @cvs << "CVS/RCS time: #{@md.sc_time} <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + when /^0~cvs[+\s]/ #enable pattern above instead if you wish the default to be to include cvs tags from all documents KEEP + when /^0~cvs\s+/ #enable pattern above instead if you wish the default to be to include cvs tags from all documents KEEP + end + end + if true #default version information + ocnm+=1; ocnv+=1 + if @md.sc_filename and @md.sc_filename.length > 3 + @rc << "#{@tr.sourcefile}: #{@md.sc_filename} <~0;m#{ocnm};v#{ocnv}>" + else @rc << "#{@tr.sourcefile}: #{@md.fns} <~0;m#{ocnm};v#{ocnv}>" + end + ocnm+=1; ocnv+=1 + if @md.file_encoding and @md.file_encoding.length > 3 #translate + @rc << "Filetype: #{@md.file_encoding} <~0;m#{ocnm};v#{ocnv}>" + end + ocnm+=1; ocnv+=1 + if @md.dgst #change. enable by default + @rc << "#{@tr.sourcefile_digest}, #{@md.dgst[0]} #{@md.dgst[1]} <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + end + if @md.dgst_skin #change. enable by default + @rc << "Skin_Digest: #{@md.dgst_skin[0]} #{@md.dgst_skin[1]} <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + end + @rc << "Generated #{head_no_rc}" if @rc.length > 0 + @rc << "#{@tr.last_generated}: #{Time.now} <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + if @md.sisu_version[:version] + @rc << "#{@tr.sisu_version}: #{@md.sisu_version[:project]} #{@md.sisu_version[:version]} of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]}) <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + end + @rc << "#{@tr.ruby_version}: #{@md.ruby_version} <~0;m#{ocnm};v#{ocnv}>" + end + meta << header0 + meta << header1 + meta << header4 + meta << "Document Manifest @\n #{base_html}/#{@md.fn[:manifest]} <~0;m#{ocnm};m#{ocnm}>" + meta << "Dublin Core (DC) #{head_no_dc}" if @dc.length > 0 + meta << "DC tags included with this document are provided here. #{head_no_dc_tag}" if @dc.length > 0 + @dc.each { |x| meta << x } + meta << "Version Information #{head_no_rc}" if @rc.length > 0 + if @cvs.length > 0 + meta << "Note the version information provided here, is specific to the host site. #{head_no_rc_tag}" + @cvs.each { |x| meta << x } + end + @rc.each { |x| meta << x } + ## ENDNOTE RELATED endnote related + meta << "\n" + meta=SiSU_DAL::Make.new(@md,meta).object_digest + end + def stamped(para,hash_class) + @tuned=[] + para=strip_clean_extra_spaces(para) + digest_all=hash_class.hexdigest(para) # print "#{hash_class.name}: "; puts digest_all #length==32 or 64 + stripped=strip_clean_of_markup(para) + digest_strip=hash_class.hexdigest(stripped) + case para + when /~\{[\d*+]+\s+.+?\}~|~\[[*+]\d+\s+.+?\]~/ + en_and_para,en_and_para_digest=[],[] + para.gsub!(/\s*(\}~|\]~)/,' \1') #watch + para_plus_en=para.scan(/.*?~\{.+?\}~|.*?~\[.+?\]~/) + para_tail=if para =~/(?:.*?~\{.+?\}~|.*?~\[.+?\]~)+([\s\S]+)/ + /(?:.*?~\{.+?\}~|.*?~\[.+?\]~)+(.+?<~\d+;(?:\w|[0-6]:)\d+;\w\d+>)/.match(para)[1] + else '' + end + para_plus_en << para_tail + para_plus_en.each {|e_p| en_and_para_digest << SiSU_DAL::Make.new(@md,e_p).endnote_digest } + para_new=en_and_para_digest.join(' ') + @tuned << para_new + '<' + digest_strip + ':' + digest_all + '>' unless para.nil? + else @tuned << para + '<' + digest_strip + ':' + digest_all + '>' unless para.nil? + end + @tuned.join + 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] + # vim==/<[0-9a-f]\{#{@@dl}\}\(:[0-9a-f]\{#{@@dl}\}\)\?>/ + require 'digest/md5' + require 'digest/sha2' + data=@data + @tuned_file=[] + data.each do |para| + if para=~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+>/ + if @env.digest.type =~/sha256/ + for hash_class in [ Digest::SHA256 ] + @tuned_file << stamped(para,hash_class) + end + else + for hash_class in [ Digest::MD5 ] + @tuned_file << stamped(para,hash_class) + end + end + else @tuned_file << para unless para.nil? + end + end + @tuned_file + #use md5 or to create hash of each dal object including ocn, & add into to each dal object + end + def endnote_digest + data=@data + para_bit=[] + data.each do |en_plus| + para_bit <<= case en_plus + when /~\{|~\[/ + if en_plus =~/~\{.+?\}~|~\[.+?\]~/ + para_txt,en_open,en_txt,en_close=/(.*?)(~\{|~\[)(.+?)(\}~|\]~)/m.match(en_plus)[1..4] + stripped_en=strip_clean_of_markup(en_txt) + if @env.digest.type =~/sha256/ + digest_en_strip=Digest::SHA256.hexdigest(stripped_en) + else + digest_en_strip=Digest::MD5.hexdigest(stripped_en) + end + para_txt + en_open + en_txt + '<' + digest_en_strip + '>' + en_close + else puts "Error Exception - problem encountered with:\n#{en_plus}" #arbitrary exception, tidy up + end + else en_plus + end + end + para_bit.join + end + def strip_clean_extra_spaces(s) # dal output tuned + s=s.dup + s=s.gsub(/[ ]+([,.;:?](?:$|\s))/,'\1') + s=s.gsub(/ [ ]+/,' ') + s=s.gsub(/^ [ ]+/,'') + s=s.gsub(/ [ ]+$/,'') + s=s.gsub(/(<\/[bi]>')[ ]+(s )/,'\1\2') + end + def strip_clean_of_markup(s) # used for digest, define rules, make same as in db clean + #consider: <\/?[ib]>|<(?:\/ )?br>|(.+?)<\/del> + s=s.dup + s=s.gsub(/(?:<\/?[ib]>|<~\d+;(?:\w|[0-6]:)\d+;\w\d+>|<#@dp:#@dp>|^[1-6]~\S+|~\{\d+\s.+?\}~)/,'') # markup and endnotes removed + #% same as db clean --> + s=s.gsub(/(.+?)<\/del>/,'DELETED(\1)') # deletions + s=s.gsub(/(\d+)<\/sup>/,'[\1]') + s=s.gsub(/(?: \\;)+/,' ') + #s=s.gsub(//,"[TABLE]\n") # tables + #s=s.gsub(//,'\1') # tables + #s=s.gsub(/¡¡\d+¡/,' ') # tables + #s=s.gsub(/¡/,' ') # tables tidy later + #s=s.gsub(/<.+?>/,'') + s=s.gsub(/\{.+?\.(?:png|jpg|gif).+?\}(?:https?|ftp)\\\:\S+ /,' [image] ') # else image names found in search + s=s.gsub(/\s\s+/,' ') + s=s.strip + end + end +end +__END__ +dal output, rules to simplify parsing +nodes === objects === paragraphs === text blocks separated by \n\n + +dal output: +:verse :group and :code have -end +:table is not used diff --git a/lib/sisu/0.52/dal_doc_str.rb b/lib/sisu/0.52/dal_doc_str.rb new file mode 100644 index 00000000..b2b18ca8 --- /dev/null +++ b/lib/sisu/0.52/dal_doc_str.rb @@ -0,0 +1,220 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: xml output (sax style) processing + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com + + * Notes: tidy -xml sax.xml >> index.tidy +=end +module SiSU_document_structure + require SiSU_lib + '/dal_doc_str_tables' + require SiSU_lib + '/dal_doc_str_code' + class Structure + def initialize(md,para) + @md,@para=md,para + end + def structure + structure_markup_normalize + structure_markup + @para + end + def structure_markup + @para=unless @para =~/[0-6]~/ + @para=case @para + when /^\s*#{@md.lv1}/; @para.sub!(/(?:<[:!]1!?>\s*)?(.+)/,'1~ \1') if @para !~/^1~/ + when /^\s*#{@md.lv2}/; @para.sub!(/(?:<[:!]2!?>\s*)?(.+)/,'2~ \1') if @para !~/^2~/ + when /^\s*#{@md.lv3}/; @para.sub!(/(?:<[:!]3!?>\s*)?(.+)/,'3~ \1') if @para !~/^3~/ + when /^\s*#{@md.lv4}/; @para.sub!(/(?:<[:!]4!?>\s*)?(.+)/,'4~ \1') if @para !~/^4~/ + when /^\s*#{@md.lv5}/; @para.sub!(/(?:<[:!]5!?>\s*)?(.+)/,'5~ \1') if @para !~/^5~/ + when /^\s*#{@md.lv6}/; @para.sub!(/(?:<[:!]6!?>\s*)?(.+)/,'6~ \1') if @para !~/^6~/ + else @para + end + else @para + end + end + def structure_markup_normalize + para=if @md.markup_version.to_f >= 0.38 #%convert internal representation, consider making 0.38 structure default ([A-C1-6] instead of [1-9]), requires downstream changes + #keep and implement, requires downstream changes: + #@para.gsub!(/^6~/,'9~') + #@para.gsub!(/^5~/,'8~') + #@para.gsub!(/^4~/,'7~') + @para.gsub!(/^[456]~/,'!_') + @para.gsub!(/^3~/,'6~') + @para.gsub!(/^2~/,'5~') + @para.gsub!(/^1~/,'4~') + @para.gsub!(/^:?C~/,'3~') + @para.gsub!(/^:?B~/,'2~') + @para.gsub!(/^:?A~/,'1~') + @para=if @para =~/^@(?:level|markup):\s/ + @para.gsub!(/3/,'6') + @para.gsub!(/2/,'5') + @para.gsub!(/1/,'4') + @para.gsub!(/:?C/,'3') + @para.gsub!(/:?B/,'2') + @para.gsub!(/:?A/,'1') + @para + else @para + end + else @para + end + end + end + class Struct + def initialize(o) + @o=o + end + def structure + def txt + @o[:txt] + end + def node + @o[:node] + end + def ocn + @o[:ocn] + end + def lv + @o[:lv] + end + def type + @o[:type] + end + self + end + end + class OCN + def initialize(md,data) + @md,@data=md,data + end + def ocn #and auto segment numbering increment + data=@data + @o_array=[] + node=ocn=ocn_dv=ocn_sp=ocnh=ocnh1=ocnh2=ocnh3=ocnh4=ocnh5=ocnh6=ocno=ocnp=ocnt=ocnc=ocng=ocni=ocnm=ocnu=ocnk=0 # h heading, o other, t table, g group, i image + 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 ) + node_count_flag=false + headings='' #where headings omitted an alternative form of ocn heading numbering is required for html and other linking... + #headings=if @md.ocn.inspect =~/skip=headings/; '^(?:[A-C]|[1-9])~\S* |' + #else '' + #end + regex_exclude_ocn_and_node = /#{headings}^%{1,4}\s|^@\S+?:\s|^0~|^4~endnotes|^<\/center>|<:ee>|<:e[:_]>|^\^~ |<:e[:_]\d+?>|^<:p[bn]>|^<:\#|<:- |<[:!]!4|||||<\/tr>|
|\[endnotes\]|<:zz>|<:isbn-|<:journal-|<:conference-|/i #ocn here #  added with Tune.code #¡ + regex_exclude_ocn = /^(?:alt|code|group|poem|table)\{|^\}(?:alt|code|group|poem|table)|^\}table$/ #ocn here #  added with Tune.code #¡ + data.each do |para| + o={} + if para =~/\w|\S|<|\(/ + if para !~ regex_exclude_ocn_and_node + if node_count_flag or para=~/^1~/ + node_count_flag=true + end + node+=1 if node_count_flag + if para !~ regex_exclude_ocn # regex_exclude_large previously excluded + unless para=~/<:#>|~#|-#/ # |^\s*\*\s*\*\s*\*\s*$ <-consider leaving un-numbered + ocn+=1 + if para=~/^[1-8]~(?:\s+|\S)/ or para =~@md.lv1 or para =~@md.lv2 or para =~@md.lv3 or para =~@md.lv4 or para =~@md.lv5 or para =~@md.lv6 + ocnh+=1 + if para=~/^1~(?:\s+|\S)/ or para =~@md.lv1; ocnh1+=1 + ocn_dv,ocn_sp="1:#{ocnh1}","h#{ocnh}" + elsif para=~/^2~(?:\s+|\S)/ or para =~@md.lv2; ocnh2+=1 + ocn_dv,ocn_sp="2:#{ocnh2}","h#{ocnh}" + elsif para=~/^3~(?:\s+|\S)/ or para =~@md.lv3; ocnh3+=1 + ocn_dv,ocn_sp="3:#{ocnh3}","h#{ocnh}" + elsif para=~/^4~(?:\s+|\S)/ or para =~@md.lv4; ocnh4+=1 + ocn_dv,ocn_sp="4:#{ocnh4}","h#{ocnh}" + elsif para=~/^5~(?:\s+|\S)/ or para =~@md.lv5; ocnh5+=1 + ocn_dv,ocn_sp="5:#{ocnh5}","h#{ocnh}" + elsif para=~/^6~(?:\s+|\S)/ or para =~@md.lv6; ocnh6+=1 + ocn_dv,ocn_sp="6:#{ocnh6}","h#{ocnh}" + end + else + ocno+=1 + if para=~//; ocnt+=1 #tables + ocn_dv,ocn_sp="o#{ocno}","t#{ocnt}" + elsif para=~/^<:code>/; ocnc+=1 + ocn_dv,ocn_sp="o#{ocno}","c#{ocnc}" + elsif para=~/^<:(?:group|alt|verse)>/; ocng+=1 + ocn_dv,ocn_sp="o#{ocno}","g#{ocng}" + elsif para=~/\{\S+?\.(?:png|jpg|gif)\s+/m; ocni+=1 + ocn_dv,ocn_sp="o#{ocno}","i#{ocni}" + else ocnp+=1 + ocn_dv,ocn_sp="o#{ocno}","p#{ocnp}" + end + end + o[:txt],o[:node],o[:ocn],o[:lv],o[:type]=para,node,ocn,ocn_dv,ocn_sp + else ocnu+=1 + #if para=~/-#/ #if implemented would remove need to keep <-#> + # ocnk+=1 + # ocn_dv,ocn_sp="k#{ocnk}","u#{ocnu}" + #else + # ocn_dv,ocn_sp="u#{ocnu}","u#{ocnu}" + #end + #para.gsub!(/<~#>|<-#>/,'') if para #get rid of need + para.gsub!(/<~#>/,'') if para + ocn_dv,ocn_sp="u#{ocnu}","u#{ocnu}" + o[:txt],o[:node],o[:ocn],o[:lv],o[:type]=para,node,0,ocn_dv,ocn_sp + end + else o[:txt],o[:node],o[:ocn],o[:lv],o[:type]=para,node,nil,nil,nil + end + else + para=if para !~/^%{1,4}\s/ + o[:txt],o[:node],o[:ocn],o[:lv],o[:type]=para,node,nil,nil,nil + else '' + end + end + end + para.gsub!(/\n\n/,"\n") if para =~/<:(?:code|verse|alt|group)>/ #newlines taken out + para.gsub!(/(<:(?:code-end)>)/,"\n\\1") if para =~/<:(?:code-end)>/ #newlines added check + if para =~//,"\\1~#{o[:ocn]};#{o[:lv]};#{o[:type]}>") + end + @o_array << Struct.new(o).structure if o + end + @o_array + end + end + class Code < SiSU_document_structure_code::Code + end + class Tables < SiSU_document_structure_tables::Tables + end +end +__END__ diff --git a/lib/sisu/0.52/dal_doc_str_code.rb b/lib/sisu/0.52/dal_doc_str_code.rb new file mode 100644 index 00000000..46a466b6 --- /dev/null +++ b/lib/sisu/0.52/dal_doc_str_code.rb @@ -0,0 +1,153 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: xml output (sax style) processing + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com + + * Notes: tidy -xml sax.xml >> index.tidy +=end +module SiSU_document_structure_code + class Instantiate < SiSU_Param::Parameters::Instructions + @@flag={} #Beware!! + def initialize + @@flag['table_to']=false + @@counter=@@column=@@columns=0 + @@line_mode='' + end + end + class Code + @@flag={} #Beware!! + def initialize(md,data) + @md,@data=md,data + Instantiate.new + end + def code + data=@data + tuned_file=[] + @tuned_group=[] + @@counter=0 + @verse_count=0 + data.each do |para| + para.gsub!(/(<:(?:code|verse|alt|group)>)\s/,'\1') #double check + para.gsub!(/(?:\n\s*\n)+/m,"\n") + if para =~/^code\{/ + @@flag['code']=true + @@counter=1 + para.gsub!(/^code\{.*/,'<:code>') + elsif para =~/^(?:poem)\{/ + @@flag['poem']=true + para.gsub!(/^(poem)\{.*/,'<:verse>') + elsif para =~/^(?:alt|group)\{/ #group not tested, stub 2005 + @@flag['group']=true + para.gsub!(/^(alt|group)\{.*/,'<:\1>') + end + if @@flag['code'] + if @@flag['code'] and para =~/^\}code/ + para.gsub!(/^\}code.*/,'<:code-end>') + @@flag['code']=false + end + if @@flag['code'] #or para =~/<:code-end>/ #and para =~/\S/ + sub_array=para.dup + @line_mode=sub_array.scan(/.+/) + SiSU_document_structure_code::Code.new(@md,@line_mode).code_lines('code') + para=@line_mode.join + end + elsif @@flag['poem'] or @@flag['group'] + if @@flag['poem'] and para =~/^\}(?:poem)/ + para.gsub!(/^\}(poem).*/,"\n<:verse-end>") + @@flag['poem']=false + elsif @@flag['group'] and para =~/^\}(?:alt|group)/ + para.gsub!(/^\}(alt|group).*/,'<:\1-end>') + @@flag['group']=false + end + if @@flag['poem'] or @@flag['group'] and para =~/\S/ \ + and para !~/<:(verse|code|alt|group)(-end)?>/ + sub_array=para.dup + @line_mode=sub_array.scan(/.+/) + type=if @@flag['poem']; 'poem' + else 'group' + end + SiSU_document_structure_code::Code.new(@md,@line_mode).code_lines(type) + div=if @@flag['poem'] and @verse_count > 0 + "\n" + '<:verse-end>' + "\n\n" + '<:verse>' + else '' + end + @verse_count+=1 if @@flag['poem'] + para = div + @line_mode.join + else para + end + end + if @@flag['code'] or @@flag['poem'] or @@flag['group'] + @tuned_group << para if para =~/\S+/ + elsif para =~/<:(?:code|alt|group|verse)-end>/ + @verse_count=0 + @tuned_group << para + if para =~/<:group-end>/ + tuned_file << @tuned_group.join("\n") + else + tuned_file << @tuned_group.join + end + @tuned_group=[] + else tuned_file << para + end + end + tuned_file + end + def code_lines(type='') + data=@data + data.each do |line| + if line =~/\S/ and line !~/^(?:alt|code|group|poem)\{|^\}(?:alt|code|group|poem)|<:(?:code|verse|alt|group).+/ + line.gsub!(/\s\s/,'  ') + line.gsub!(/^/,'<:codeline>') if type=='code' # try sort for texpdf special case + line.gsub!(/$/,'<:br>') #unless type=='code' + if @@flag['code']; @@counter+=1 + else + end + end + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/dal_doc_str_tables.rb b/lib/sisu/0.52/dal_doc_str_tables.rb new file mode 100644 index 00000000..e70490e5 --- /dev/null +++ b/lib/sisu/0.52/dal_doc_str_tables.rb @@ -0,0 +1,180 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: xml output (sax style) processing + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com + + * Notes: tidy -xml sax.xml >> index.tidy +=end +module SiSU_document_structure_tables + class Instantiate < SiSU_Param::Parameters::Instructions + @@flag={} + def initialize + @@flag['table_to']=false + @@counter=@@column=@@columns=0 + @@line_mode='' + end + end + class Tables + @@flag={} + def initialize(md,data) + @md,@data=md,data + Instantiate.new + end + def table_visual(para) + count=0 + @row=[] + table=[] + @rows=para.split(/;;/) + @rows.compact! #(c\d+?;.+?) + @rows.each do |row| + count +=1 + @row[count]=row.split(/\|/) + end + @row.compact! + widths=if @row[0].to_s =~/^\{(?:t|table)(?:~h)?\s+\d+;/ + col_width=@row[0].to_s.scan(/\d+/) + rem=(100 - col_width[0].to_i) + col_w=rem/(@row[1].length - 1) + "#{col_width[0].to_s};" + ("#{col_w};" * (@row[1].length-1)) + else + col_w=100/@row[1].length + "#{col_w};" * @row[1].length + end + @row.delete_if {|r| r[0] =~/\{(?:table|t)(?:~h)?(?:\s+c\d+;)?[\d; ]*\}/} + w=widths.split(/;/) + tuned_file=[] + tuned_file << if para =~/\{(?:t|table)~h(?:\sc\d+;)?[\d; ]*\}/ + "" + elsif para =~/\{(?:t|table)(?:\sc\d+;)?[\d; ]*\}/ + "" + end + @row.each do |l| + l << '' if l.length == (@row[1].length - 1) + table=[] + if l.length == @row[1].length + table << '' + n= -1 + l.each do |c| + n +=1 #'' + c + '' + table << if c =~/\A(?:\n)?\s*\Z/ + "¡¡#{w[n]}¡" + ' ' + else + "¡¡#{w[n]}¡" + c.strip + end + end + table << '!>' #'' + tuned_file << table.join + end + end + tuned_file << '' #'' + tuned_file=tuned_file.compact.join("\n") + end + def tables + data=@data + count=0 + @row,@tuned_file,@tuned_table=[],[],[] + data.each do |para| + para.gsub!(/\n\s+\n/,"\n") + para.gsub!(/\s+\n/,"\n") + para.gsub!(/<:hi>/,'') # bright yellow rgb(255,255,0) pale yellow rgb(255,255,200) + para.gsub!(/<:\/hi>/,%{}) + table=[] + if para =~/^\{(?:t|table)(?:~h)?(?:\sc\d+;)?[\d; ]*\}/ + @tuned_file << table_visual(para) + @tuned_file=@tuned_file.flatten + elsif @@flag['table_to'] or para[/table\{(?:~h)?/] + if para[/table\{(?:~h)?\s+c(\d+;.+)/] + instructions=$1 + @@column=instructions.split(/;\s*/) + @@columns=@@column[0] + para.gsub!(/table\{~h\s+(c\d+?;.+?)$/,'') + para.gsub!(/table\{\s+(c\d+?;.+?)$/,'') + @@flag['table_to']=true + end + if @@flag['table_to'] and para =~/\}table/ + para.gsub!(/^\}table\s*$/,"\n") + para.gsub!(/\n/,' ') #newlines taken out + para.strip! + @tuned_table << para + @tuned_table.delete('') + @tuned_file << @tuned_table.compact.join("\n") #@tuned_table.compact.join =~/\S+/ #would be preferable + para='' + @tuned_table=[] + @@flag['table_to']=false + end + if @@flag['table_to'] and para =~/\S/ + @@counter=1 + sub_array=para.dup + @@line_mode=sub_array.scan(/.+/) + Tables.new(@md,@@line_mode).tr_td + para=@@line_mode.join + para.gsub!(/(.*\S+.*)\Z/m,'') unless para =~// + para.strip! + @tuned_file << para + end + @tuned_file + end + @tuned_file + end + def tr_td + data=@data + data.each do |line| + if @@counter <= @@columns.to_i and line !~/(\}T\s*$|<:table[-_](close|end)>|)/ + line.gsub!(/(.+)/,"¡¡#{@@column[@@counter]}¡\\1") unless line =~/|<:br>' + @manmkp_ital='[i/]\\{.+?\\}[i/]' + tail_m_ital=%q{(?:\s|[.,;:?!'")]|~\^|~\\\{\s|$)} + tail_m_bold=%q{(?:(?:<\/i>)?(?:\s|[.,;:?!'")]|~\^|~\\\{\s|$))?} + bold_line=%q{^!_\s.+?(?:\n|$)} + @line_scan_ital=if defined? @md.make_italic[:str] and defined? @vz.markup_make_italic[:str] + /#@http_m|#{bold_line}|#@manmkp_ital#{tail_m_ital}|(?:#{@md.make_italic[:str]}|#{@vz.markup_make_italic[:str]})#{tail_m_ital}|\S+|\n/ + elsif defined? @md.make_italic[:str] + /#@http_m|#{bold_line}|#@manmkp_ital#{tail_m_ital}|#{@md.make_italic[:str]}#{tail_m_ital}|\S+|\n/ + 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/ + end + @manmkp_bold='^!_\s.+?(?:\n|$)|[*!b]\\{.+?\\}[*!b]|[*!][a-zA-Z0-9\-_]+[*!]' + @line_scan_bold=if (defined? @md.make_bold[:str] and @md.make_bold[:str]) and (defined? @vz.markup_make_bold[:str] and @vz.markup_make_bold[:str]) + /#@http_m|#{bold_line}|(?:#@manmkp_bold|#{@md.make_bold[:str]}|#{@vz.markup_make_bold[:str]})#{tail_m_bold}|\S+|\n/ + elsif defined? @md.make_bold[:str] and @md.make_bold[:str] + /#@http_m|#{bold_line}|(?:#@manmkp_bold|#{@md.make_bold[:str]})#{tail_m_bold}|\S+|\n/ + 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/ + end + end + def songsheet + @data.each do |line| + line=pre(line) + line=wordlist_italics(line) + line=wordlist_bold(line) + line=bodymarkup(line) + @data_new << line + end + @data_new + end + def pre(line) + line=line.dup + if line =~/\{(?:t|table)(?:~h)?\s*c?[\d; ]*\}/; line.gsub!(/(\n)/,';;\1') #markup for alternative tables + end + line + end + def wordlist_italics(line) + line=line.dup + if (defined? @md.make_italic[:str] and @md.make_italic[:str]) \ + or (defined? @vz.markup_make_italic[:str] and @vz.markup_make_italic[:str]) + line= if line !~/^(0~|%{1,4}\s)/ #!~/^(?:[0-6]~|!_|%+\s)/ + word=line.scan(@line_scan_ital) + word.flatten! + word.compact! #reinstated + line_array=[] + word.each do |w| + unless /#@manmkp_ital|#@http_m/.match(w) + if defined? @md.make_italic[:regx] and @md.make_italic[:regx] + w.gsub!(@md.make_italic[:regx],'\1') + elsif defined? @vz.markup_make_italic and @vz.markup_make_italic + w.gsub!(@vz.markup_make_italic,'\1') + end + end + line_array << w + end + line_array.join(' ') + else line + end + end + line + end + def embolden(given) + given.gsub!(/(?:^!_|^[789]~)\s+(.+?)\s+((?:[*]~\S+\s*)+)/,'\1 \2') + given.gsub!(/(?:^!_|^[789]~)\s+(.+?)\s*([~-]#)$/,'\1 \2') + given.gsub!(/(?:^!_\s+|^[789]~\s+)(.*)?\s*$/,'\1') + end + def wordlist_bold(line) + line=line.dup + if (defined? @md.make_bold[:str] and @md.make_bold[:str]) or (defined? @vz.markup_make_bold[:str] and @vz.markup_make_bold[:str]) + line=if line !~/^(?:[0-9]~|%+\s)/ + line_array=[] + word=line.scan(@line_scan_bold) + word.flatten! + word.compact! + word.each do |w| + unless /#@manmkp_bold|#@http_m/.match(w) + if defined? @md.make_bold[:regx] and @md.make_bold[:regx] #document header: 0~bold [bold word list] + w.gsub!(@md.make_bold[:regx],'\1') + elsif defined? @vz.markup_make_bold and @vz.markup_make_bold #defaults and skin adjusted bold word list + w.gsub!(@vz.markup_make_bold,'\1') + end + else + if w =~ /(?:^!_|^[789]~)\s+/; embolden(w) #bold paragraph/emphasize #may wish to remove think about 7{ 8{ conversion not satisfactory, as information is lost! + end + end + line_array << w + end + line_array.join(' ') + else line + end + else + if line !~/^(?:[0-9]~|%+\s)/ and line =~ /(?:^!_|^[789]~)\s+/; embolden(line) + end + end + line + end + def bodymarkup(line) + # << http://www.jus.uio.no/sisu/sisu_markup_table/markup >> + # See: data/sisu/sample/document_samples_sisu_markup/ + # !{emphasis}! e{emphasis}e emphasis + # *{bold text}* b{bold}b bold text + # _{underline}_ u{underline}u underline + # /{italics}/ i{italics}i italics + # "{citation}" c{citation}c citation #blockquote? + # ^{superscript}^ superscript + # ,{subscript}, subscript + # +{inserted text}+ inserted text + # -{deleted text}- deleted text + # {url address}:url + # {image.png}imageurl + # {image.png}png + # ~{endnote}~ + # !_ #bold/emphasise paragraph + # _" #blockquote paragraph + # _1 #indent paragraph 1 step + # _2 #indent paragraph 2 steps + # _* #bullet (list) + # _1* #bullet (list) indented + # _1* #bullet (list) indented + # # #numbered (list) level 1 + # _# #numbered (list) level 2 + line=line.dup + unless line =~/^0~|<:codeline>|<:code-end>/ + #special characters: ~ { } < > - _ / also used : ^ ! # + line_array=[] + line.gsub!(/^%{1,4} .+/mi,'') #remove comments + word=line.scan(/\S+|\n/) unless line =~/^(?:0~\S|%+\s)/ + if word + word.each do |w| # _ - / # | : ! ^ ~ + unless w =~/^[0-9]~|~\{|\}~|~\[|\]~|^\^~|~\^|\*~\S+|~#|\{t?~|\{table/ + w.gsub!(/\\~/,'~') #escaped special character + w.gsub!(/~/,'~') + end + w.gsub!(/^\<$/,'<') #escaped special character + w.gsub!(/^\>$/,'>') #escaped special character + line_array << w + end + line=line_array.join(' ') + line=line.strip + end + line.gsub!(/<(https?:\/\/\S+?)>/,'< \1 >') #catch problem markup + line.gsub!(/<:=(\S+?)>/,'{ c_\1.png 14x14 }http://www.jus.uio.no/sisu') #adjustment 2005w30 + line.gsub!(//,'<:\1>') #escaped special character + line.gsub!(/\\~/,'~') #escaped special character + line.gsub!(/\\\{/,'{') #escaped special character + line.gsub!(/\\\}/,'}') #escaped special character + line.gsub!(/\\\<>/,'>>') #escaped special character + line.gsub!(/\\\/,'>') #escaped special character + line.gsub!(/\\\_/,'_') #escaped special character + line.gsub!(/\\\-/,'-') #escaped special character + line.gsub!(/\\\+/,'+') #escaped special character + line.gsub!(/\\\//,'/') #escaped special character + line.gsub!(/\\\#/,'#') #escaped special character + line.gsub!(/\\\&/,'&') #& #escaped special character + line.gsub!(/\\\|/,'|') #not really a sisu special character but made available as possibility + line.gsub!(/\\\:/,':') #not really a sisu special character but made available as possibility + line.gsub!(/\\\!/,'!') #not really a sisu special character but made available as possibility + line.gsub!(/\\\^/,'^') #not really a sisu special character but made available as possibility + line.gsub!(/\\\,/,',') #not really a sisu special character but made available as possibility + #ADD --> + line.gsub!(/\\\\/,'\') #escaped special character + line.gsub!(/\\\*/,'*') #escaped special character + line.gsub!(/\\\!/,'!') #escaped special character + line.gsub!(/(?:^| )\*~([a-z0-9._-]+)/i,' <:name#\1>') #html name marker + line.gsub!(/^([56]~)(\S+)(.+)/,'\1\2 \3 <:name#\2>') #html name marker , however at present takes you to correct position within sub-toc, will nneed to clean from sub-toc leaving in main body only + line.gsub!(/(^| )\{~\^ (.+?)\s*\}((?:https?|ftp):\S+)\s+~\{(.+?)\}~/,'\1{ \2 }\3 ~{ \3 \4 }~') # watch + line.gsub!(/(^| )\{~\^ (.+?)\s*\}((?:https?|ftp):\S+?)(,?)?(?:\s|$)/,'\1{ \2 }\3\4 ~{ \3 }~ ') #text url endnote url shortcut {~^ [text] }http://url is { [text] }http://url ~{ http://url }~ [plus adjustment for commas] + line.gsub!(/<:?br>/,'
') #xml requires + # depreciated --> + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)e\{(.+?)\}e/,'\1\2') #emphasis + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)b\{(.+?)\}b/,'\1\2') #bold + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)u\{(.+?)\}u/,'\1\2') #underscore + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)c\{(.+?)\}c/,'\1\2') #cite /blockquote? + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)i\{(.+?)\}i/,'\1\2') #italics + # depreciated ^ + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)!\{(.+?)\}!/,'\1\2') #emphasis + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)\*\{(.+?)\}\*/,'\1\2') #bold + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)_\{(.+?)\}_/,'\1\2') #underscore + line.gsub!(/(^|\s+|['"]| |[\(\[]|\(|\>)\/\{(.+?)\}\//,'\1\2') #italics + line.gsub!(/(^|\s+|['"]| |\(|\>)\"\{(.+?)\}\"/,'\1\2') #cite /blockquote? + line.gsub!(/(^|[^\\])\^\{(.+?)\}\^/,'\1\2') #superscript + line.gsub!(/(^|\s+|['"]| |\(|\>|\S)9\{(.+?)\}9/,'\1\2') #superscript + line.gsub!(/(^|[^\\]),\{(.+?)\},/,'\1\2') #subscript + line.gsub!(/(^|\s+|['"]| |\(|\>)6\{(.+?)\}6/,'\1\2') #subscript + line.gsub!(/(^|\s+|['"]| |\(|\>)\+\{(.+?)\}\+/,'\1\2') #inserted text + line.gsub!(/(^|\s+|['"]| |\(|\>)v\{(.+?)\}v/,'\1\2') #inserted text + line.gsub!(/(^|\s+|['"]| |\(|\>)-\{(.+?)\}-/,'\1\2') #strikethrough - deleted text + line.gsub!(/(^|\s+|['"]| |\(|\>)x\{(.+?)\}x/,'\1\2') #deleted text + line.gsub!(/(^|\s+|['"]| |\(|\>)\*(\S+?)\*/,'\1\2') #bold single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>)\!(\S+?)\!/,'\1\2') #bold single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>)\/([\(\)a-zA-Z0-9']+?)\/([^a-zA-Z0-9]|[ ,.;:'"~$]|$)/,'\1\2\3') #italics single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>)_(\S+?)_/,'\1\2') #underscore single word, watch + line.gsub!(/(^|\s+)-([^{]\S+?)-( |$)/,'\1\2\3') #underscore single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>|\d+)\^(\S+?)\^/,'\1\2') #superscript single word, watch digit added + line.gsub!(/<[:e]\s+(.+?)!?>/,'~{ \1 }~') # not tested + line.gsub!(/^\s*_([12])(\*+)\s*/,'<:i\1> _* ') #bullets, shortcut + line.gsub!(/^\s*_([12])\s+/,'<:i\1> ') #indent + line.gsub!(/(?:
|
)\s*_[12]\s+/,'
') #indent used in endnotes, not implemented, replace when ready with: line.gsub!(/(?:
|
)\s*_([12])\s+/,'
<:i\1> ') + #line.gsub!(/^\s*_([12])\s+/,"<:i\\1> ") + #line.gsu!b!(/^\s*_([12])\s+/," ") #indent line + line.gsub!(/<:?br>/,'
') #adjustment 2004w41, from # line.gsub!(/
/,'
') + ##added + #line.gsub!(/(?:^!_\s+|^[78]~\s+|<:b>)(.*)?([~-]#)$/i,"\\1 \\2") #bold paragraph/emphasize #may wish to remove think about 7{ 8{ conversion not satisfactory, as information is lost! + #line.gsub!(/(?:^!_\s+|^[78]~\s+|<:b>)(.*)?\s*$/i,"\\1") #bold paragraph/emphasize #may wish to remove think about 7{ 8{ conversion not satisfactory, as information is lost! + #line.gsub!(/(?:(?:^| )!_ |^[78]~ |<:b>)(.*)\n/mi,"\\1 ") #bold paragraph/emphasize #may wish to remove think about 7{ 8{ conversion not satisfactory, as information is lost! + #line.gsub!(/^_" (.*)\n/i,"
\\1
") #blockquotes #introduce KEEP + line.gsub!(/<:hi>/,'') # bright yellow rgb(255,255,0) pale yellow rgb(255,255,200) + line.gsub!(/<:\/hi>/,'') + line.gsub!(/(<:verse>.+)/m,"\\1\n") + line.gsub!(/[ ]+($)/,'\1') + if line =~/(<:(?:verse|group)>)/; line.gsub!(/(<:(?:verse|group)>)/i,"\\1\n") #cosmetic + else line.gsub!(/(
)/i,"\\1\n") + end + else + line.gsub!(/<:codeline>/,"\n") + end + line + end + def tech #script markup planned to be more strict for technical documents + # !{emphasis}! e{emphasis}e emphasis + # *{bold text}* b{bold}b bold text + # _{underline}_ u{underline}u underline + # /{italics}/ i{italics}i italics + # "{citation}" c{citation}c citation + # ^{superscript}^ superscript + # ,{subscript}, subscript + # +{inserted text}+ inserted text + # -{deleted text}- deleted text + # {url address}:url + # {image.png}imageurl + # {image.png}png + # ~{endnote}~ + # +1 + # +2 + puts 'tech' + @data.each do |line| + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)e\{(.+?)\}e/,'\1\2') #emphasis + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)b\{(.+?)\}b/,'\1\2') #bold + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)u\{(.+?)\}u/,'\1\2') #underscore + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)c\{(.+?)\}c/,'\1\2') #cite + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)i\{(.+?)\}i/,'\1\2') #italics + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)!\{(.+?)\}!/,'\1\2') #emphasis + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)\*\{(.+?)\}\*/,'\1\2') #bold + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)_\{(.+?)\}_/,'\1\2') #underscore + line.gsub!(/(^|\s+|['"]|[\(\[]|\(|\>)\/\{(.+?)\}\//,'\1\2') #italics + line.gsub!(/(^|\s+|['"]|\(|\>)\"\{(.+?)\}\"/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>|\S)\^\{(.+?)\}\^/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>|\S)9\{(.+?)\}9/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>),\{(.+?)\},/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>)6\{(.+?)\}6/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>)\+\{(.+?)\}\+/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>)v\{(.+?)\}v/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>)-\{(.+?)\}-/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>)x\{(.+?)\}x/,'\1\2') + line.gsub!(/(^|\s+|['"]|\(|\>)\*(\S+?)\*/,'\1\2') #bold single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>)\!(\S+?)\!/,'\1\2') #bold single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>)\/([\(\)a-zA-Z0-9']+?)\/([ ,.;:'"~$]|[^a-zA-Z0-9])/,'\1\2\3') #italics single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>)_(\S+?)_/,'\1\2') #underscore single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>|\d+)\^(\S+?)\^/,'\1\2') #superscript single word, watch digit added + line.gsub!(/^\s*_([12])(\*+)\s*/,"<:i\\1> _* ") # bullets, shortcut + line.gsub!(/^\s*_([12])\s+/,'<:i\1> ') + line.gsub!(/<:?br>/,'
') + end + @data + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_columns.rb b/lib/sisu/0.52/db_columns.rb new file mode 100644 index 00000000..295e1ae2 --- /dev/null +++ b/lib/sisu/0.52/db_columns.rb @@ -0,0 +1,209 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_columns + class Column_size + def lt_title + 320 + end + def lt_subtitle + 320 + end + def lt_creator + 200 + end + def lt_illustrator + 200 + end + def lt_translator + 200 + end + def lt_prepared_by + 200 + end + def lt_digitized_by + 200 + end + def lt_subject + 400 + end + def lt_date + 10 + end + def lt_date_created + 10 + end + def lt_date_issued + 10 + end + def lt_date_available + 10 + end + def lt_date_modified + 10 + end + def lt_date_valid + 10 + end + def lt_type + 100 + end + def lt_description + 800 + end + def lt_publisher + 120 + end + def lt_contributor + 120 + end + def lt_format + 100 + end + def lt_identifier + 100 + end + def lt_source + 100 + end + def lt_language + 30 + end + def lt_language_char + 3 + end + def lt_language_original + 30 + end + def lt_language_original_char + 3 + end + def lt_relation + 100 + end + def lt_coverage + 100 + end + def lt_rights + 800 + end + def lt_copyright + 200 + end + def lt_owner + 100 + end + def lt_keywords + 200 + end + def lt_comment + 600 + end + def lt_loc + 30 + end + def lt_dewey + 30 + end + def lt_isbn + 16 + end + def lt_pg + 10 + end + def lt_abstract + 600 + end + def lt_skin + 100 + end + def lt_markup + 100 + end + def lt_links + 100 + end + def lt_information + 100 + end + def lt_contact + 100 + end + def lt_suffix + 600 + end + def lt_filename + 256 + end + def lt_types + 1 + end + def lt_subj + 64 + end + def document_clean # restriction not necessary #12000 #2712 + 60000 + end + def document_body + 16000 + end + def document_seg + 120 + end + def document_seg_full + 120 + end + def endnote_clean # restriction not necessary #12000 #2712 + 60000 + end + def endnote_body + 16000 + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_create.rb b/lib/sisu/0.52/db_create.rb new file mode 100644 index 00000000..d5fab27d --- /dev/null +++ b/lib/sisu/0.52/db_create.rb @@ -0,0 +1,530 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_create + require SiSU_lib + '/db_columns' + class Create < SiSU_DB_columns::Column_size + require SiSU_lib + '/sysenv' + @@dl=nil + def initialize(opt,conn='',sql_type='pg') + @opt,@conn,@sql_type=opt,conn,sql_type + @cX=SiSU_Screen::Ansi.new(@opt.cmd).cX + @comment=comment + @@dl ||=SiSU_Env::Info_env.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::Info_env.new(@opt.fns) + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','Create PG db:',%{"SiSU_#{@env.path.stub_pwd}"}) + tell.colorize unless @opt.cmd =~/q/ + SiSU_Env::System_call.new.create_pg_db(@env.path.stub_pwd) #watch use of path.stub_pwd instead of stub + end + def comment + @comment=Hash.new('') + case @sql_type + when /pg/ + @comment['metadata'] =%{ + COMMENT ON Table metadata + IS 'contains SiSU documents metadata with metadata'; + COMMENT ON COLUMN metadata.tid + IS 'unique'; + COMMENT ON COLUMN metadata.filename + IS 'document filename'; + COMMENT ON COLUMN metadata.title + IS 'metadata title (dublin core element 1)'; + COMMENT ON COLUMN metadata.subtitle + IS 'document subtitle'; + COMMENT ON COLUMN metadata.creator + IS 'metadata creator (dublin core element 2)'; + COMMENT ON COLUMN metadata.illustrator + IS 'metadata illustrator'; + COMMENT ON COLUMN metadata.translator + IS 'metadata translator'; + COMMENT ON COLUMN metadata.subject + IS 'metadata subject (dublin core element 3)'; + COMMENT ON COLUMN metadata.date + IS 'metadata date (dublin core element 7)'; + COMMENT ON COLUMN metadata.date_created + IS 'metadata date created (dublin core)'; + COMMENT ON COLUMN metadata.date_issued + IS 'metadata date of issue (dublin core)'; + COMMENT ON COLUMN metadata.date_available + IS 'metadata date available (dublin core)'; + COMMENT ON COLUMN metadata.date_valid + IS 'metadata date valid (dublin core)'; + COMMENT ON COLUMN metadata.date_modified + IS 'metadata date modified (dublin core)'; + COMMENT ON COLUMN metadata.type + IS 'metadata type (dublin core element 8)'; + COMMENT ON COLUMN metadata.description + IS 'metadata description (dublin core element 4)'; + COMMENT ON COLUMN metadata.publisher + IS 'metadata publisher (dublin core element 5)'; + COMMENT ON COLUMN metadata.contributor + IS 'metadata contributor (dublin core element 6)'; + COMMENT ON COLUMN metadata.prepared_by + IS 'metadata markup prepared by'; + COMMENT ON COLUMN metadata.digitized_by + IS 'metadata digitized by'; + COMMENT ON COLUMN metadata.format + IS 'metadata format (dublin core element 9)'; + COMMENT ON COLUMN metadata.identifier + IS 'metadata identifier (dublin core element 10)'; + COMMENT ON COLUMN metadata.source + IS 'metadata source (dublin core element 11)'; + COMMENT ON COLUMN metadata.language + IS 'metadata language (dublin core element 12)'; + COMMENT ON COLUMN metadata.language_original + IS 'metadata original language'; + COMMENT ON COLUMN metadata.relation + IS 'metadata (dublin core element 13)'; + COMMENT ON COLUMN metadata.coverage + IS 'metadata coverage (dublin core element 14)'; + COMMENT ON COLUMN metadata.rights + IS 'metadata rights / copyright / license (dublin core element 15)'; + COMMENT ON COLUMN metadata.owner + IS 'metadata owner'; + COMMENT ON COLUMN metadata.keywords + IS 'metadata keywords'; + COMMENT ON COLUMN metadata.comment + IS 'metadata comment'; + COMMENT ON COLUMN metadata.abstract + IS 'metadata abstract'; + COMMENT ON COLUMN metadata.loc + IS 'metadata library of congress'; + COMMENT ON COLUMN metadata.dewey + IS 'metadata dewey'; + COMMENT ON COLUMN metadata.isbn + IS 'metadata isbn'; + COMMENT ON COLUMN metadata.pg + IS 'metadata project gutenberg number'; + COMMENT ON COLUMN metadata.prefix_a + IS 'metadata prefix'; + COMMENT ON COLUMN metadata.prefix_b + IS 'metadata prefix'; + COMMENT ON COLUMN metadata.skin + IS 'metadata sisu skin'; + COMMENT ON COLUMN metadata.markup + IS 'metadata markup source'; + COMMENT ON COLUMN metadata.links + IS 'metadata links'; + COMMENT ON COLUMN metadata.information + IS 'metadata information'; + COMMENT ON COLUMN metadata.contact + IS 'metadata contact'; + COMMENT ON COLUMN metadata.suffix + IS 'metadata sisu suffix (output related)'; + COMMENT ON COLUMN metadata.filename + IS 'metadata source filename'; + COMMENT ON COLUMN metadata.types + IS 'document types scroll 1, seg 2, both 3'; + COMMENT ON COLUMN metadata.subj + IS 'subject areas - no way to populate at present as not mapped'; +/* + CREATE FUNCTION fileremoval() RETURNS opaque AS ' + BEGIN + DELETE FROM metadata WHERE tid=#@removetid; + DELETE FROM documents WHERE documents.metadata_tid=#@removetid; + DELETE FROM endnotes WHERE endnotes.metadata_tid=#@removetid; + DELETE FROM endnotes_asterisk WHERE endnotes_asterisk.metadata_tid=#@removetid; + DELETE FROM endnotes_plus WHERE endnotes_plus.metadata_tid=#@removetid; + DELETE FROM urls WHERE urls.metadata_tid=#@removetid; + END; + ' LANGUAGE 'plpgsql'; + CREATE TRIGGER removefile AFTER INSERT + PROCEDURE fileremoval(); +*/ + } + @comment['documents'] =%{ + COMMENT ON Table documents + IS 'contains searchable text of SiSU documents'; + COMMENT ON COLUMN documents.lid + IS 'unique'; + COMMENT ON COLUMN documents.metadata_tid + IS 'tie to title in metadata'; + COMMENT ON COLUMN documents.lev + IS 'doc level 1-6 \d\~'; + COMMENT ON COLUMN documents.seg + IS 'segment name from level 4'; + COMMENT ON COLUMN documents.ocn + IS 'object citation number'; + COMMENT ON COLUMN documents.en_a + IS 'first endnote number in text object (eg. NULL or 34) (used with en_z to create range)'; + COMMENT ON COLUMN documents.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 documents.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 documents.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 documents.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 documents.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 documents.types + IS 'document types seg scroll'; + COMMENT ON COLUMN documents.clean + IS 'text object - substantive text: clean, stripped of markup'; + COMMENT ON COLUMN documents.body + IS 'text object - substantive text: light html markup'; + COMMENT ON COLUMN documents.lev1 + IS 'document structure, level 1'; + COMMENT ON COLUMN documents.lev2 + IS 'document structure, level 2'; + COMMENT ON COLUMN documents.lev3 + IS 'document structure, level 3'; + COMMENT ON COLUMN documents.lev4 + IS 'document structure, level 4'; + COMMENT ON COLUMN documents.lev5 + IS 'document structure, level 5'; + COMMENT ON COLUMN documents.lev6 + IS 'document structure, level 6'; + } + @comment['endnotes'] =%{ + 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 '; + 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 documents.metadata_tid + IS 'tie to title in metadata - unique for each document'; + } + @comment['endnotes_asterisk'] =%{ + COMMENT ON Table endnotes_asterisk + IS 'contains searchable text of SiSU documents endnotes 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 '; + 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 documents.metadata_tid + IS 'tie to title in metadata - unique for each document'; + } + @comment['endnotes_plus'] =%{ + COMMENT ON Table endnotes_plus + IS 'contains searchable text of SiSU documents endnotes'; + 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 '; + 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 documents.metadata_tid + IS 'tie to title in metadata - unique for each document'; + } + @comment['urls'] =%{ + COMMENT ON Table urls + IS 'contains base url links to different SiSU output'; + COMMENT ON COLUMN documents.metadata_tid + IS 'tie to title in metadata - 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)'; + } + end + @comment + end + def output_dir? + dir=SiSU_Env::Info_env.new('') + if @opt.cmd =~/d/; dir.path.webserv_stub_ensure + end + end + def create_table_metadata + print %{ + currently using sisu dbi module + to be populated from documents files + create tables metadata + data import through ruby transfer + } unless @opt.cmd =~/q/ + @conn.execute(%{ + CREATE TABLE metadata ( + tid INT4 PRIMARY KEY, + title VARCHAR(#{lt_title}) NULL, + subtitle VARCHAR(#{lt_subtitle}) NULL, + creator VARCHAR(#{lt_creator}) NULL, + illustrator VARCHAR(#{lt_illustrator}) NULL, + translator VARCHAR(#{lt_translator}) NULL, + subject VARCHAR(#{lt_subject}) NULL, + date VARCHAR(#{lt_date}) NULL, + date_created VARCHAR(#{lt_date_created}) NULL, + date_issued VARCHAR(#{lt_date_issued}) NULL, + date_available VARCHAR(#{lt_date_available}) NULL, + date_valid VARCHAR(#{lt_date_valid}) NULL, + date_modified VARCHAR(#{lt_date_modified}) NULL, +/* date DATE, */ +/* date_created DATE, */ +/* date_issued DATE, */ +/* date_available DATE, */ +/* date_valid DATE, */ +/* date_modified DATE, */ + type VARCHAR(#{lt_type}) NULL, + description VARCHAR(#{lt_description}) NULL, + publisher VARCHAR(#{lt_publisher}) NULL, + contributor VARCHAR(#{lt_contributor}) NULL, + prepared_by VARCHAR(#{lt_prepared_by}) NULL, + digitized_by VARCHAR(#{lt_digitized_by}) NULL, + format VARCHAR(#{lt_format}) NULL, + identifier VARCHAR(#{lt_identifier}) NULL, + source VARCHAR(#{lt_source}) NULL, + language VARCHAR(#{lt_language}) NULL, + language_original VARCHAR(#{lt_language_original}) NULL, + relation VARCHAR(#{lt_relation}) NULL, + coverage VARCHAR(#{lt_coverage}) NULL, + rights VARCHAR(#{lt_rights}) NULL, + copyright VARCHAR(#{lt_copyright}) NULL, + owner VARCHAR(#{lt_owner}) NULL, + keywords VARCHAR(#{lt_keywords}) NULL, + comment VARCHAR(#{lt_comment}) NULL, + loc VARCHAR(#{lt_loc}) NULL, + dewey VARCHAR(#{lt_dewey}) NULL, + isbn VARCHAR(#{lt_isbn}) NULL, + pg VARCHAR(#{lt_pg}) NULL, + abstract VARCHAR(#{lt_abstract}) NULL, + prefix_a TEXT NULL, + prefix_b TEXT NULL, + skin VARCHAR(#{lt_skin}) NULL, + markup VARCHAR(#{lt_markup}) NULL, + links VARCHAR(#{lt_links}) NULL, + information VARCHAR(#{lt_information}) NULL, + contact VARCHAR(#{lt_contact}) NULL, + suffix VARCHAR(#{lt_suffix}) NULL, + filename VARCHAR(#{lt_filename}) NULL UNIQUE, + types CHAR(#{lt_types}) NULL, + subj VARCHAR(#{lt_subj}) NULL + ); + #{@comment['metadata']} + }) + end + def create_table # create documents base + print %{ + to be populated from documents files + create tables documents document_trade document_env + data import through ruby transfer + } unless @opt.cmd =~/q/ + @conn.execute(%{ + CREATE TABLE documents ( + lid INT4 PRIMARY KEY, + metadata_tid INT4 REFERENCES metadata, + ocn SMALLINT, + ocnd VARCHAR(6), + ocns VARCHAR(6), + clean TEXT NULL, + body TEXT NULL, + seg VARCHAR(#{document_seg}) NULL, + lev SMALLINT NULL, + 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, + digest_clean CHAR(#{@@dl}), + digest_all CHAR(#{@@dl}), + types CHAR(1) NULL + ); + #{@comment['documents']} + }) + end + def create_table_endnotes + print %{ + to be populated from documents files + create tables endnotes + data import through ruby transfer + } unless @opt.cmd =~/q/ + @conn.execute(%{ + CREATE TABLE endnotes ( + nid INT4 PRIMARY KEY, + document_lid INT4 REFERENCES documents, + nr SMALLINT, + clean TEXT NULL, + body TEXT NULL, + ocn SMALLINT, + ocnd VARCHAR(6), + ocns VARCHAR(6), + digest_clean CHAR(#{@@dl}), + metadata_tid INT4 REFERENCES metadata + ); + #{@comment['endnotes']} + }) + end + def create_table_endnotes_asterisk + print %{ + to be populated from documents files + create tables endnotes_asterisk + data import through ruby transfer + } unless @opt.cmd =~/q/ + @conn.execute(%{ + CREATE TABLE endnotes_asterisk ( + nid INT4 PRIMARY KEY, + document_lid INT4 REFERENCES documents, + nr SMALLINT, + clean TEXT NULL, + body TEXT NULL, + ocn SMALLINT, + ocnd VARCHAR(6), + ocns VARCHAR(6), + digest_clean CHAR(#{@@dl}), + metadata_tid INT4 REFERENCES metadata + ); + #{@comment['endnotes_asterisk']} + }) + end + def create_table_endnotes_plus + print %{ + to be populated from documents files + create tables endnotes_plus + data import through ruby transfer + } unless @opt.cmd =~/q/ + @conn.execute(%{ + CREATE TABLE endnotes_plus ( + nid INT4 PRIMARY KEY, + document_lid INT4 REFERENCES documents, + nr SMALLINT, + clean TEXT NULL, + body TEXT NULL, + ocn SMALLINT, + ocnd VARCHAR(6), + ocns VARCHAR(6), + digest_clean CHAR(#{@@dl}), + metadata_tid INT4 REFERENCES metadata + ); + #{@comment['endnotes_plus']} + }) + end + def create_table_urls # create documents file links mapping + print %{ + currently using sisu dbi module + to be populated from documents files + create tables urls + data import through ruby transfer + } unless @opt.cmd =~/q/ + @conn.execute(%{ + CREATE TABLE urls ( + metadata_tid INT4 REFERENCES metadata, + 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) + ); + #{@comment['urls']} + }) + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_drop.rb b/lib/sisu/0.52/db_drop.rb new file mode 100644 index 00000000..44f31d2a --- /dev/null +++ b/lib/sisu/0.52/db_drop.rb @@ -0,0 +1,124 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_drop + class Drop + def initialize(opt,conn='',sql_type='') + @opt,@conn,@sql_type=opt,conn,sql_type + end + def drop_tables #% drop all tables + begin + case @sql_type + when /sqlite/ + cascade='' + commit=@conn.commit + else + cascade='CASCADE' + commit='' + end + @conn.do(%{ + DROP TABLE metadata #{cascade}; + DROP TABLE documents #{cascade}; + DROP TABLE endnotes #{cascade}; + DROP TABLE endnotes_asterisk #{cascade}; + DROP TABLE endnotes_plus #{cascade}; + DROP TABLE urls #{cascade}; + }) + commit + rescue + end + end + def drop_indexes #% drop all indexes + #@conn.do(%{ + # DROP INDEX object_nr ON documents(ocn); + # DROP INDEX body ON documents(body); + # DROP INDEX clean ON documents(clean); + # DROP INDEX lev1 ON documents(lev1); + # DROP INDEX lev2 ON documents(lev2); + # DROP INDEX lev3 ON documents(lev3); + # DROP INDEX lev4 ON documents(lev4); + # DROP INDEX lev5 ON documents(lev5); + # DROP INDEX lev6 ON documents(lev6); + # DROP INDEX endnote_nr ON endnotes(nr); + # DROP INDEX endnote ON endnotes(body); + # DROP INDEX title ON metadata(title); + # DROP INDEX filename ON metadata(filename) + # /* + # DROP INDEX object_nr ON documents(ocn) CASCADE; + # DROP INDEX body ON documents(body) CASCADE; + # DROP INDEX clean ON documents(clean) CASCADE; + # DROP INDEX lev1 ON documents(lev1) CASCADE; + # DROP INDEX lev2 ON documents(lev2) CASCADE; + # DROP INDEX lev3 ON documents(lev3) CASCADE; + # DROP INDEX lev4 ON documents(lev4) CASCADE; + # DROP INDEX lev5 ON documents(lev5) CASCADE; + # DROP INDEX lev6 ON documents(lev6) CASCADE; + # DROP INDEX endnote_nr ON endnotes(nr) CASCADE; + # DROP INDEX endnote ON endnotes(body) CASCADE; + # DROP INDEX title ON metadata(title) CASCADE; + # DROP INDEX filename ON metadata(filename) CASCADE + # */ + #}) + end + def db_help #% help + puts %{ + not yet implemented + init createall + createtable + recreate\t(destroy and create) + createlex\t() + createmetadata\t() + import\t(import data) + index\t(create index) + droptables\t(where tables made and content imported) + dropall\t(where tables made, content imported and tables indexed) + } + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_import.rb b/lib/sisu/0.52/db_import.rb new file mode 100644 index 00000000..73161dc0 --- /dev/null +++ b/lib/sisu/0.52/db_import.rb @@ -0,0 +1,735 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_import + require SiSU_lib + '/db_columns' + require SiSU_lib + '/db_load_tuple' + require SiSU_lib + '/shared_html_lite' + class Import < SiSU_DB_columns::Column_size + include SiSU_Param + include SiSU_Screen + @@dl=nil + attr_accessor :tp + def initialize(opt,conn='',sql_type='pg') + @opt,@conn,@sql_type=opt,conn,sql_type + @cX=SiSU_Screen::Ansi.new(@opt.cmd).cX + @env=SiSU_Env::Info_env.new(@opt.fns) + @dal="#{@env.path.dal}" + if @opt.fns.empty? or @opt.cmd.empty?; @fnb='' + else + @md=SiSU_Param::Parameters.new(@opt).get + @fnb=@md.fnb + end + @suffix=@opt.fns[/(?:.+?)\.[_-]?sst/,1] + @fnm="#@dal/#{@opt.fns}.meta.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={} + sql='SELECT MAX(lid) FROM documents' + @col[:lid]=@conn.execute( sql ) { |x| x.fetch_all.to_s.to_i } + @col[:lid] ||=0 + sql='SELECT MAX(nid) FROM endnotes' + @id_n=@conn.execute( sql ) { |x| x.fetch_all.to_s.to_i } + @id_n ||=0 + @col[:lv1]=@col[:lv2]=@col[:lv3]=@col[:lv4]=@col[:lv5]=@col[:lv6]=0 + @db=SiSU_Env::Info_db.new + @@dl ||=SiSU_Env::Info_env.new.digest.length + end + def marshal_load + require SiSU_lib + '/dal' + @dal_array=SiSU_DAL::Source.new(@opt).get # dal file drawn here + #@dal_array.each { |x| puts x.inspect; sleep 1 } + tell=SiSU_Screen::Ansi.new(@opt.cmd,"#{@db.db_psql}::#{@opt.fns}") + tell.puts_blue unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Marshal Load',@fnm) + tell.print_grey if @opt.cmd =~/v/ + case @sql_type + when /sqlite/ #fix logic for sqlite ! + import_db_metadata(@dal_array) + import_documents(@dal_array) + import_db_urls(@dal_array,@fnm) #import OID on/off + @conn.commit #sqlite watch + else + file_exist=@conn.select_one(%{ SELECT metadata.tid FROM metadata WHERE metadata.filename ~ '#{@opt.fns}'; }) + unless file_exist + @conn.execute('BEGIN') + import_db_metadata(@dal_array) + import_documents(@dal_array) + import_db_urls(@dal_array,@fnm) #import OID on/off + @conn.execute('COMMIT') + else + @db=SiSU_Env::Info_db.new + puts "\n#{@cX.grey}file #{@cX.off} #{@cX.blue}#{@opt.fns}#{@cX.off} #{@cX.grey}already exists in database#{@cX.off} #{@cX.blue}#{@db.db_psql}#{@cX.off} #{@cX.brown}update instead?#{@cX.off}" + end + end + end + def special_character_escape(string) + string.gsub!(/'/,"''") + string.gsub!(/<:br>/,"
\n") + string.gsub!(/<:(?:code|alt|group|verse)(?:-end)?>/,'') + string.gsub!(/<:name#\S+?>/,'') + string.gsub!(/\{\s*(\S+?\.(?:png|jpg))(?:\s+\d+x\d+)?(.+?)\}\S+/,'[image: \1] \2') + string.gsub!(/\{\s*(.+?)\s*\}http:\/\/\S+?([.,!?]?(?:\s|$))/,'\1\2') + end + def unicode_special_character_escape(string) + #string.gsub!(/(["';:,])/, %{\\\\\\1}) + end + def strip_markup(string) #define rules, make same as in dal clean + string.gsub!(/(\d+)<\/sup>/,'[\1]') + string.gsub!(/<:i[12]>/,'') + string.gsub!(/(?: \\;)+/,' ') + string.gsub!(//,"[TABLE]\n") #tables + string.gsub!(//,'\1') #tables + string.gsub!(/¡¡\d+¡/,' ') #tables + string.gsub!(/¡/,' ') #tables tidy later + string.gsub!(/<.+?>/,'') + string.gsub!(/\{.+?\.(?:png|jpg|gif).+?\}(?:https?|ftp)\\\:\S+ /,' [image] ') # else image names found in search + string.gsub!(/\s\s+/,' ') + string.strip! + end + #% import into database tables + def import_db_metadata(dbi_unit) #% import documents - populate database + print %{ #{@cX.grey}import documents dbi_unit #{@cX.off} } unless @opt.cmd =~/q/ + @tp={} + @md=SiSU_Param::Parameters.new(@opt).get + if @md.title; @tp[:title]=@md.title + special_character_escape(@tp[:title]) + @tp[:title_f],@tp[:title_i]='title, ',"'#{@tp[:title]}', " + sql="SELECT MAX(tid) FROM metadata" + id_t=@conn.execute( sql ) { |x| x.fetch_all.to_s.to_i } + @@id_t=id_t if id_t + @@id_t ||=0 + @@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 0~title + puts %{\n#{@cX.grey}Processing file number#{@cX.off}: #{@cX.green}#{@@id_t}#{@@cX.off}} unless @opt.cmd =~/q/ + end + if @md.dc_title; @tp[:long_title]=@md.dc_title + #sql="SELECT MAX(tid) FROM metadata" + #id_t=@conn.execute( sql ) { |x| x.fetch_all.to_s.to_i } + #@@id_t=id_t if id_t + #@@id_t ||=0 + #@@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 0~title + #puts %{\n#{@cX.grey}Processing file number#{@cX.off}: #{@cX.green}#{@@id_t}#{@@cX.off}} + end + if @md.subtitle; @tp[:subtitle]=@md.subtitle + special_character_escape(@tp[:subtitle]) + @tp[:subtitle_f],@tp[:subtitle_i]='subtitle, ',"'#{@tp[:subtitle]}', " + end + if @md.dc_creator; @tp[:creator]=@md.dc_creator + special_character_escape(@tp[:creator]) + @tp[:creator_f],@tp[:creator_i]='creator, ',"'#{@tp[:creator]}', " + end + if @md.dc_contributor; @tp[:contributor]=@md.dc_contributor + special_character_escape(@tp[:contributor]) + @tp[:contributor_f],@tp[:contributor_i]='contributor, ',"'#{@tp[:contributor]}', " + end + if @md.translator; @tp[:translator]=@md.translator + special_character_escape(@tp[:translator]) + @tp[:translator_f],@tp[:translator_i]='translator, ',"'#{@tp[:translator]}', " + end + if @md.illustrator; @tp[:illustrator]=@md.illustrator + special_character_escape(@tp[:illustrator]) + @tp[:illustrator_f],@tp[:illustrator_i]='illustrator, ',"'#{@tp[:illustrator]}', " + end + if @md.dc_publisher; @tp[:publisher]=@md.dc_publisher + special_character_escape(@tp[:publisher]) + @tp[:publisher_f],@tp[:publisher_i]='publisher, ',"'#{@tp[:publisher]}', " + end + if @md.prepared_by; @tp[:prepared_by]=@md.prepared_by + special_character_escape(@tp[:prepared_by]) + @tp[:prepared_by_f],@tp[:prepared_by_i]='prepared_by, ',"'#{@tp[:prepared_by]}', " + end + if @md.digitized_by; @tp[:digitized_by]=@md.digitized_by + special_character_escape(@tp[:digitized_by]) + @tp[:digitized_by_f],@tp[:digitized_by_i]='digitized_by, ',"'#{@tp[:digitized_by]}', " + end + if @md.dc_subject; @tp[:subject]=@md.dc_subject + special_character_escape(@tp[:subject]) + @tp[:subject_f],@tp[:subject_i]='subject, ',"'#{@tp[:subject]}', " + end + if @md.dc_description; @tp[:description]=@md.dc_description + special_character_escape(@tp[:description]) + @tp[:description_f],@tp[:description_i]='description, ',"'#{@tp[:description]}', " + end + if @md.abstract; @tp[:abstract]=@md.abstract + special_character_escape(@tp[:abstract]) + @tp[:abstract_f],@tp[:abstract_i]='abstract, ',"'#{@tp[:abstract]}', " + end + if @md.dc_type; @tp[:type]=@md.dc_type + special_character_escape(@tp[:type]) + @tp[:type_f],@tp[:type_i]='type, ',"'#{@tp[:type]}', " + end + #if @md.owner; @tp[:owner]=@md.owner + # special_character_escape(@tp[:owner]) + # @tp[:owner_f],@tp[:owner_i]='owner, ',"'#{@tp[:owner}', " + #end + #if @md.copyright; @tp[:copyright]=@md.copyright + # special_character_escape(@tp[:copyright]) + # @tp[:copyright_f],@tp[:copyright_i]='copyright, ',"'#{@tp[:copyright]}', " + #end + if @md.dc_rights; @tp[:rights]=@md.dc_rights + special_character_escape(@tp[:rights]) + @tp[:rights_f],@tp[:rights_i]='rights, ',"'#{@tp[:rights]}', " + end + if @md.dc_date; @tp[:date]=@md.dc_date + special_character_escape(@tp[:date]) + @tp[:date_f],@tp[:date_i]='date, ',"'#{@tp[:date]}', " + end + if @md.dc_date_created; @tp[:date_created]=@md.dc_date_created + special_character_escape(@tp[:date_created]) + @tp[:date_created_f],@tp[:date_created_i]='date_created, ',"'#{@tp[:date_created]}', " + end + if @md.dc_date_issued; @tp[:date_issued]=@md.dc_date_issued + special_character_escape(@tp[:date_issued]) + @tp[:date_issued_f],@tp[:date_issued_i]='date_issued, ',"'#{@tp[:date_issued]}', " + end + if @md.dc_date_available; @tp[:date_available]=@md.dc_date_available + special_character_escape(@tp[:date_available]) + @tp[:date_available_f],@tp[:date_available_i]='date_available, ',"'#{@tp[:date_available]}', " + end + if @md.dc_date_modified; @tp[:date_modified]=@md.dc_date_modified + special_character_escape(@tp[:date_modified]) + @tp[:date_modified_f],@tp[:date_modified_i]='date_modified, ',"'#{@tp[:date_modified]}', " + end + if @md.dc_date_valid; @tp[:date_valid]=@md.dc_date_valid + special_character_escape(@tp[:date_valid]) + @tp[:date_valid_f],@tp[:date_valid_i]='date_valid, ',"'#{@tp[:date_valid]}', " + end + if @md.dc_language[:name]; @tp[:language]=@md.dc_language[:name] + special_character_escape(@tp[:language]) + @tp[:language_f],@tp[:language_i]='language, ',"'#{@tp[:language]}', " + end + if @md.language_original[:name]; @tp[:language_original]=@md.language_original[:name] + special_character_escape(@tp[:language_original]) + @tp[:language_original_f],@tp[:language_original_i]='language_original, ',"'#{@tp[:language_original]}', " + end + if @md.dc_format; @tp[:format]=@md.dc_format + special_character_escape(@tp[:format]) + @tp[:format_f],@tp[:format_i]='format, ',"'#{@tp[:format]}', " + end + if @md.dc_identifier; @tp[:identifier]=@md.dc_identifier + special_character_escape(@tp[:identifier]) + @tp[:identifier_f],@tp[:identifier_i]='identifier, ',"'#{@tp[:identifier]}', " + end + if @md.dc_source; @tp[:source]=@md.dc_source + special_character_escape(@tp[:source]) + @tp[:source_f],@tp[:source_i]='source, ',"'#{@tp[:source]}', " + end + if @md.dc_relation; @tp[:relation]=@md.dc_relation + special_character_escape(@tp[:relation]) + @tp[:relation_f],@tp[:relation_i]='relation, ',"'#{@tp[:relation]}', " + end + if @md.dc_coverage; @tp[:coverage]=@md.dc_coverage + special_character_escape(@tp[:coverage]) + @tp[:coverage_f],@tp[:coverage_i]='coverage, ',"'#{@tp[:coverage]}', " + end + if @md.keywords; @tp[:keywords]=@md.keywords + special_character_escape(@tp[:keywords]) + @tp[:keywords_f],@tp[:keywords_i]='keywords, ',"'#{@tp[:keywords]}', " + end + if @md.comments; @tp[:comments]=@md.comments + special_character_escape(@tp[:comments]) + @tp[:comments_f],@tp[:comments_i]='comments, ',"'#{@tp[:comments]}', " + end + if @md.cls_loc; @tp[:cls_loc]=@md.cls_loc + special_character_escape(@tp[:cls_loc]) + @tp[:cls_loc_f],@tp[:cls_loc_i]='cls_loc, ',"'#{@tp[:cls_loc]}', " + end + if @md.cls_dewey; @tp[:cls_dewey]=@md.cls_dewey + special_character_escape(@tp[:cls_dewey]) + @tp[:cls_dewey_f],@tp[:cls_dewey_i]='cls_dewey, ',"'#{@tp[:cls_dewey]}', " + end + if @md.cls_pg; @tp[:cls_pg]=@md.cls_pg + special_character_escape(@tp[:cls_pg]) + @tp[:cls_pg_f],@tp[:cls_pg_i]='cls_pg, ',"'#{@tp[:cls_pg]}', " + end + if @md.cls_isbn; @tp[:cls_isbn]=@md.cls_isbn + special_character_escape(@tp[:cls_isbn]) + @tp[:cls_isbn_f],@tp[:cls_isbn_i]='cls_isbn, ',"'#{@tp[:cls_isbn]}', " + end + if @md.prefix_a; @tp[:prefix_a]=@md.prefix_a + special_character_escape(@tp[:prefix_a]) + @tp[:prefix_a_f],@tp[:prefix_a_i]='prefix_a, ',"'#{@tp[:prefix_a]}', " + end + if @md.prefix_b; @tp[:prefix_b]=@md.prefix_b + special_character_escape(@tp[:prefix_b]) + @tp[:prefix_b_f],@tp[:prefix_b_i]='prefix_b, ',"'#{@tp[:prefix_b]}', " + end + #if @md.suffix; @tp[:suffix]=@md.suffix + # special_character_escape(@tp[:suffix]) + # @tp[:suffix_f],@tp[:suffix_i]='suffix, ',"'#{@tp[:suffix]}', " + #end + if @md.fns; @tp[:fns]=@md.fns + special_character_escape(@tp[:fns]) + @tp[:fns_f],@tp[:fns_i]="filename, ","'#{@tp[:fns]}', " + end + #if @md.en[:mismatch] > 0 + # id,info='WARNING document error in endnote markup, number mismatch',"endnotes: #{@md.en[:note]} != endnote reference marks: #{@md.en[:mark]} (difference = #{@md.en[:mismatch]})" + #end + if @md.wc_words; @tp[:wc_words]=@md.wc_words + @tp[:wc_words_f],@tp[:wc_words_i]='wc_words, ',"'#{@tp[:wc_words]}', " + end + if @md.dgst; @tp[:dgst]=@md.dgst + @tp[:dgst_f],@tp[:dgst_i]='dgst, ',"'#{@tp[:dgst]}', " + end + if @md.sc_number; @tp[:sc_number]=@md.sc_number + @tp[:sc_number_f],@tp[:sc_number_i]='sc_number, ',"'#{@tp[:sc_number]}', " + end + if @md.sc_date; @tp[:sc_date]=@md.sc_date + @tp[:sc_date_f],@tp[:sc_date_i]='sc_date, ',"'#{@tp[:sc_date]}', " + end + if @md.generated; @tp[:generated]=@md.generated + @tp[:generated_f],@tp[:generated_i]='generated, ',"'#{@tp[:generated]}', " + end + #if @md.sisu_version; special_character_escape(@md.sisu_version) + # #id,info='Generated by',"#{@md.sisu_version[:project]} #{@md.sisu_version[:version]} #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" + #end + #if @md.ruby_version; special_character_escape(@md.ruby_version) + SiSU_DB::Test.new(self,@opt).verify #% import title names, filenames (tuple) + @conn.execute(%{ + INSERT INTO metadata (#{@tp[:fns_f]} #{@tp[:suffix_f]} #{@tp[:title_f]} #{@tp[:subtitle_f]} #{@tp[:creator_f]} #{@tp[:illustrator_f]} #{@tp[:translator_f]} #{@tp[:subject_f]} #{@tp[:description_f]} #{@tp[:publisher_f]} #{@tp[:contributor_f]} #{@tp[:prepared_by_f]} #{@tp[:digitized_by_f]} #{@tp[:date_f]} #{@tp[:date_created_f]} #{@tp[:date_issued_f]} #{@tp[:date_valid_f]} #{@tp[:date_available_f]} #{@tp[:date_modified_f]} #{@tp[:type_f]} #{@tp[:format_f]} #{@tp[:identifier_f]} #{@tp[:source_f]} #{@tp[:language_f]} #{@tp[:language_original_f]} #{@tp[:relation_f]} #{@tp[:coverage_f]} #{@tp[:rights_f]} #{@tp[:copyright_f]} #{@tp[:owner_f]} #{@tp[:keywords_f]} #{@tp[:abstract_f]} #{@tp[:comment_f]} #{@tp[:loc_f]} #{@tp[:dewey_f]} #{@tp[:isbn_f]} #{@tp[:pg_f]} #{@tp[:prefix_a_f]} #{@tp[:prefix_b_f]} tid) VALUES (#{@tp[:fns_i]} #{@tp[:suffix_i]} #{@tp[:title_i]} #{@tp[:subtitle_i]} #{@tp[:creator_i]} #{@tp[:illustrator_i]} #{@tp[:translator_i]} #{@tp[:subject_i]} #{@tp[:description_i]} #{@tp[:publisher_i]} #{@tp[:contributor_i]} #{@tp[:prepared_by_i]} #{@tp[:digitized_by_i]} #{@tp[:date_i]} #{@tp[:date_created_i]} #{@tp[:date_issued_i]} #{@tp[:date_valid_i]} #{@tp[:date_available_i]} #{@tp[:date_modified_i]} #{@tp[:type_i]} #{@tp[:format_i]} #{@tp[:identifier_i]} #{@tp[:source_i]} #{@tp[:language_i]} #{@tp[:language_original_i]} #{@tp[:relation_i]} #{@tp[:coverage_i]} #{@tp[:rights_i]} #{@tp[:copyright_i]} #{@tp[:owner_i]} #{@tp[:keywords_i]} #{@tp[:abstract_i]} #{@tp[:comment_i]} #{@tp[:loc_i]} #{@tp[:dewey_i]} #{@tp[:isbn_i]} #{@tp[:pg_i]} #{@tp[:prefix_a_i]} #{@tp[:prefix_b_i]} #{@@id_t}); + }) + end + def import_documents(dbi_unit) #% import documents - populate main database table + #% import into substantive database tables (tuple) + begin + @col[:tid]=@@id_t + @en,@en_ast,@en_pls=[],[],[] + @col[:en_a]=nil + @col[:en_z]=nil + dbi_unit.each do |data| + #data.gsub!(/<[biu]>(.+?)<\/[biu]>/,'\1') # remove bold, italics, underscore + data.gsub!(/(.+?)<\/b>/,'\1') # remove bold, italics, underscore + data.gsub!(/(.+?)<\/i>/,'\1') # remove bold, italics, underscore + data.gsub!(/(.+?)<\/u>/,'\1') # remove bold, italics, underscore + #data.gsub!(/<:name#\S+?>/,'') + @col[:seg]=@@seg + if data =~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>/m # regular text + notedata=data.dup + if data[/^([123])~\s+(.+?)<~(\d+);((?:\w|[0-6]:)\d+);(\w\d+)><([0-9a-f]{#{@@dl}}):([0-9a-f]{#{@@dl}})>/] + @col[:lev],txt,@col[:ocn],@col[:ocnd],@col[:ocns],@col[:digest_clean],@col[:digest_all]=$1,$2,$3,$4,$5,$6,$7 + @col[:lid]+=1 + if txt =~/~\{.+?\}~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en << txt.scan(/~\{(\d+).+?\}~/) + txt.gsub!(/~\{(\d+).+?\}~/,'\1') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'\1') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'\1') + end + @col[:body]=SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:lev]).lev4_minus + special_character_escape(@col[:body]) + @col[:plaintext]=@col[:body].dup + strip_markup(@col[:plaintext]) + if @en[0]; @en_a,@en_z = @en[0].first,@en[0].last + end + if @en_ast[0]; @en_a_asterisk,@en_z_asterisk = @en_ast[0].first,@en_ast[0].last + end + if @en_pls[0]; @en_a_plus,@en_z_plus = @en_pls[0].first,@en_pls[0].last + end + t=SiSU_DB_tuple::Load_tuple.new(@conn,@col,@opt) + t.tuple + case @col[:lev] + when /1/; @col[:lv1]+=1 + when /2/; @col[:lv2]+=1 + when /3/; @col[:lv3]+=1 + end + @col[:lev]=@col[:plaintext]=@col[:body]='' + elsif data[/^4~(.+?)\s+(.+?)<~(\d+);((?:\w|[0-6]:)\d+);(\w\d+)><([0-9a-f]{#{@@dl}}):([0-9a-f]{#{@@dl}})>/] + @@seg,txt,@col[:ocn],@col[:ocnd],@col[:ocns],@col[:digest_clean],@col[:digest_all]=$1,$2,$3,$4,$5,$6,$7 + @col[:seg]=@@seg + @col[:lv4]+=1 + @col[:lid]+=1 + @col[:lev]=4 + if txt =~ /~\{.+?\}~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en << txt.scan(/~\{(\d+).+?\}~/) + txt.gsub!(/~\{(\d+).+?\}~/,'\1') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'\1') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'\1') + end + @col[:body]=SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:lev],@col[:seg]).lev4_plus + special_character_escape(@col[:body]) + @col[:plaintext]=@col[:body].dup + strip_markup(@col[:plaintext]) + if @en[0]; @en_a,@en_z = @en[0].first,@en[0].last + end + if @en_ast[0]; @en_a_asterisk,@en_z_asterisk = @en_ast[0].first,@en_ast[0].last + end + if @en_pls[0]; @en_a_plus,@en_z_plus = @en_pls[0].first,@en_pls[0].last + end + t=SiSU_DB_tuple::Load_tuple.new(@conn,@col,@opt) + t.tuple + @col[:lev]=@col[:plaintext]=@col[:body]='' + elsif data[/^5~(?:~\S+)?(.+?)<~(\d+);((?:\w|[0-6]:)\d+);(\w\d+)><([0-9a-f]{#{@@dl}}):([0-9a-f]{#{@@dl}})>/] # header lev5 seg level + txt,@col[:ocn],@col[:ocnd],@col[:ocns],@col[:digest_clean],@col[:digest_all]=$1,$2,$3,$4,$5,$6 + re=/^5~(.+?)\s+/ + @@seg_full=re.match(data)[1] if data=~re #create? + @@seg ||='' #nil # watch + @col[:seg]=@@seg + @col[:lv5]+=1 + @col[:lid]+=1 + @col[:lev]=5 + if txt =~ /~\{.+?\}~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en << txt.scan(/~\{(\d+).+?\}~/) + txt.gsub!(/~\{(\d+).+?\}~/,'\1') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'\1') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'\1') + end + @col[:body]=SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns],@col[:lev],@col[:seg]).lev4_plus + special_character_escape(@col[:body]) + @col[:plaintext]=@col[:body].dup + strip_markup(@col[:plaintext]) + if @en[0]; @en_a,@en_z = @en[0].first,@en[0].last + end + if @en_ast[0]; @en_a_asterisk,@en_z_asterisk = @en_ast[0].first,@en_ast[0].last + end + if @en_pls[0]; @en_a_plus,@en_z_plus = @en_pls[0].first,@en_pls[0].last + end + t=SiSU_DB_tuple::Load_tuple.new(@conn,@col,@opt) + t.tuple + @col[:lev]=@col[:plaintext]=@col[:body]='' + elsif data[/^6~(?:~\S+)?(.+?)<~(\d+);((?:\w|[0-6]:)\d+);(\w\d+)><([0-9a-f]{#{@@dl}}):([0-9a-f]{#{@@dl}})>/] # header lev6 seg level + txt,@col[:ocn],@col[:ocnd],@col[:ocns],@col[:digest_clean],@col[:digest_all]=$1,$2,$3,$4,$5,$6 + re=/^6~(.+?)\s+/ + @@seg_full=re.match(data)[1] if data=~re #create? + @@seg ||='' #nil # watch + @col[:seg]=@@seg + @col[:lv6]+=1 + @col[:lid]+=1 + @col[:lev]=6 + if txt =~ /~\{.+?\}~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en << txt.scan(/~\{(\d+).+?\}~/) + txt.gsub!(/~\{(\d+).+?\}~/,'\1') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'\1') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'\1') + end + @col[:body]=SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns],@col[:lev],@col[:seg]).lev4_plus + special_character_escape(@col[:body]) + @col[:plaintext]=@col[:body].dup + strip_markup(@col[:plaintext]) + if @en[0]; @en_a,@en_z = @en[0].first,@en[0].last + end + if @en_ast[0]; @en_a_asterisk,@en_z_asterisk = @en_ast[0].first,@en_ast[0].last + end + if @en_pls[0]; @en_a_plus,@en_z_plus = @en_pls[0].first,@en_pls[0].last + end + t=SiSU_DB_tuple::Load_tuple.new(@conn,@col,@opt) + t.tuple + @col[:lev]=@col[:plaintext]=@col[:body]='' + else #% regular text + @col[:lid]+=1 + txt='' + txt,@col[:ocn],@col[:ocnd],@col[:ocns],@col[:digest_clean],@col[:digest_all]=(/(.+?)<~(\d+);((?:\w|[0-6]:)\d+);(\w\d+)><([0-9a-f]{#{@@dl}}):([0-9a-f]{#{@@dl}})>/m).match(data).captures + if txt =~ /~\{.+?\}~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en << txt.scan(/~\{(\d+).+?\}~/) + txt.gsub!(/~\{(\d+).+?\}~/,'\1') + #txt.gsub!(/~\{(\d+).+?\}~/,'^[\1]') # remove endnote, keep endnote reference number, display as, e.g. [^1] + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'\1') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'\1') + end + if @sql_type=~/pg/ and txt.size > (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 + if @en[0]; @en_a,@en_z = @en[0].first,@en[0].last + end + if @en_ast[0]; @en_a_asterisk,@en_z_asterisk = @en_ast[0].first,@en_ast[0].last + end + if @en_pls[0]; @en_a_plus,@en_z_plus = @en_pls[0].first,@en_pls[0].last + end + @col[:body]=if txt=~// #watch + SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns]).html_table + elsif txt=~/<:i1>/ + SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns]).indent1 + elsif txt=~/<:i2>/ + SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns]).indent2 + else + SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns]).norm + end + special_character_escape(@col[:body]) + @col[:plaintext]=@col[:body].dup + strip_markup(@col[:plaintext]) + t=SiSU_DB_tuple::Load_tuple.new(@conn,@col,@opt) + t.tuple + @en,@en_ast,@en_pls=[],[],[] + @col[:en_a]=@col[:en_z]=nil + @col[:lev]=@col[:plaintext]=@col[:body]='' + end + if notedata =~ /~\{.+?\}~/ #% import into database endnotes tables + endnote_array=notedata.scan(/~\{.+?\}~/) + endnote_array.each do |inf| + if inf[/~\{\d+.+?<[0-9a-f]{#{@@dl}}>\}~/] # dal new endnotes 2003w31/1 + if inf[/~\{(\d+)(.+?)<([0-9a-f]{#{@@dl}})>\}~/] # dal new endnotes 2003w31/1 + en,txt,digest_clean=$1,$2,$3 + end + @id_n+=1 + body=SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns],en).endnote + special_character_escape(body) + special_character_escape(txt) + strip_markup(txt) + if txt.size > (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 + #puts "'#{@id_n}', '#{@col[:lid]}', '#{en}', '#{txt}', '#{body}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@@id_t}'" #% endnotes + @conn.execute(%{ + INSERT INTO endnotes (nid, document_lid, nr, clean, body, ocn, ocnd, ocns, metadata_tid, digest_clean) VALUES ('#{@id_n}', '#{@col[:lid]}', '#{en}', '#{txt}', '#{body}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@@id_t}', '#{digest_clean}'); + }) + end + end + end + word_mode=notedata.scan(/\S+/) + end + if notedata =~ /~\[\*.+?\]~/ #% import into database endnotes tables + endnote_array=notedata.scan(/~\[\*.+?\]~/) + endnote_array.each do |inf| + if inf[/~\[\*\d+.+?<[0-9a-f]{#{@@dl}}>\]~/] # dal new endnotes 2003w31/1 + if inf[/~\[[*](\d+)(.+?)<([0-9a-f]{#{@@dl}})>\]~/] # dal new endnotes 2003w31/1 + en,txt,digest_clean=$1,$2,$3 + end + @id_n+=1 + body=SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns],en).endnote + special_character_escape(body) + special_character_escape(txt) + strip_markup(txt) + if txt.size > (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 + #puts "'#{@id_n}', '#{@col[:lid]}', '#{en}', '#{txt}', '#{body}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@@id_t}'" #% endnotes + @conn.execute(%{ + INSERT INTO endnotes_asterisk (nid, document_lid, nr, clean, body, ocn, ocnd, ocns, metadata_tid, digest_clean) VALUES ('#{@id_n}', '#{@col[:lid]}', '#{en}', '#{txt}', '#{body}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@@id_t}', '#{digest_clean}'); + }) + end + end + end + word_mode=notedata.scan(/\S+/) + end + if notedata =~ /~\[\+.+?\]~/ #% import into database endnotes tables + endnote_array=notedata.scan(/~\[\+.+?\]~/) + endnote_array.each do |inf| + if inf[/~\[\+\d+.+?<[0-9a-f]{#{@@dl}}>\]~/] # dal new endnotes 2003w31/1 + if inf[/~\[[+](\d+)(.+?)<([0-9a-f]{#{@@dl}})>\]~/] # dal new endnotes 2003w31/1 + en,txt,digest_clean=$1,$2,$3 + end + @id_n+=1 + body=SiSU_Format_Shared::CSS_Format.new(txt,@col[:ocn],@col[:ocnd],@col[:ocns],en).endnote + special_character_escape(body) + special_character_escape(txt) + strip_markup(txt) + if txt.size > (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 + #puts "'#{@id_n}', '#{@col[:lid]}', '#{en}', '#{txt}', '#{body}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@@id_t}'" #% endnotes + @conn.execute(%{ + INSERT INTO endnotes_plus (nid, document_lid, nr, clean, body, ocn, ocnd, ocns, metadata_tid, digest_clean) VALUES ('#{@id_n}', '#{@col[:lid]}', '#{en}', '#{txt}', '#{body}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@@id_t}', '#{digest_clean}'); + }) + end + end + end + word_mode=notedata.scan(/\S+/) + end + end + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + def endnote_range(word_array) + @col[:en_a]=@col[:en_z]=nil + word_array.each do |w| + if w[/~[{\[][*+]?(\d+)\s+.+?[}\]]~/] # 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 + def import_db_urls(dbi_unit,meta) #% import documents OID - populate database + begin + @fnm=meta + @env=SiSU_Env::Info_env.new(@opt.fns) + base=@env.url.root + out=@env.path.output + markup,meta,latex,plaintext,html_toc,html_doc,xml_sax,xml_dom,pdf_p,pdf_l,concordance,sisupod='','','','','','','','','','','','' + markup_li,meta_li,latex_li,plaintext_li,html_li,xml_sax_li,xml_dom_li,pdf_p_li,pdf_l_li,concordance_li,sisupod_li='','','','','','','','','','','' + if @fnb.empty? or @fnb.nil?; p 'file output path error' #remove + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:plain]}")==true) + plaintext,plaintext_li='plaintext,', "'#{base}/#@fnb/#{@md.fn[:plain]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:toc]}")==true) + html_toc,html_toc_li='html_toc,', "'#{base}/#@fnb/#{@md.fn[:toc]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:doc]}")==true) + html_doc,html_doc_li='html_doc,', "'#{base}/#@fnb/#{@md.fn[:doc]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:xhtml]}")==true) + xhtml,xhtml_li='xhtml,', "'#{base}/#@fnb/#{@md.fn[:xhtml]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:sax]}")==true) + xml_sax,xml_sax_li='xml_sax,', "'#{base}/#@fnb/#{@md.fn[:sax]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:dom]}")==true) + xml_dom,xml_dom_li='xml_dom,', "'#{base}/#@fnb/#{@md.fn[:dom]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:odf]}")==true) + odf,odf_li='odf,', "'#{base}/#@fnb/#{@md.fn[:odf]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:pdf_p]}")==true) + pdf_p,pdf_p_li='pdf_p,', "'#{base}/#@fnb/#{@md.fn[:pdf_p]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:pdf_l]}")==true) + pdf_l,pdf_l_li='pdf_l,', "'#{base}/#@fnb/#{@md.fn[:pdf_l]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:concordance]}")==true) + concordance,concordance_li='concordance,', "'#{base}/#@fnb/#{@md.fn[:concordance]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@opt.fns}.tex")==true) + latex_p,latex_p_li='latex_p,', "'#{base}/#@fnb/#{@opt.fns}.tex'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@opt.fns}.landscape.tex")==true) + latex_l,latex_l_li='latex_l,', "'#{base}/#@fnb/#@opt.fns}.landscape.tex'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:digest]}")==true) + digest,digest_li='digest,', "'#{base}/#@fnb/#{@md.fn[:digest]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@md.fn[:manifest]}")==true) #revisit, was to be text, this is html + manifest,manifest_li='manifest,', "'#{base}/#@fnb/#{@md.fn[:manifest]}'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@opt.fns}.meta")==true) + markup,markup_li='markup,', "'#{base}/#@fnb/#{@opt.fns}.meta'," + end + if @opt.cmd !~/e/ or (@opt.cmd=~/e/ and FileTest.file?("#{out}/#@fnb/#{@opt.fns}.tgz")==true) + sisupod,sisupod_li='sisupod,', "'#{base}/#@fnb/#{@opt.fns}.tgz'," + end + @conn.execute(%{ + INSERT INTO urls (#{plaintext} #{html_toc} #{html_doc} #{xhtml} #{xml_sax} #{xml_dom} #{odf} #{pdf_p} #{pdf_l} #{concordance} #{latex_p} #{latex_l} #{manifest} #{digest} #{markup} #{sisupod} metadata_tid) VALUES (#{plaintext_li} #{html_toc_li} #{html_doc_li} #{xhtml_li} #{xml_sax_li} #{xml_dom_li} #{odf_li} #{pdf_p_li} #{pdf_l_li} #{concordance_li} #{latex_p_li} #{latex_l_li} #{manifest_li} #{digest_li} #{markup_li} #{sisupod_li} #{@@id_t}); + }) + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_indexes.rb b/lib/sisu/0.52/db_indexes.rb new file mode 100644 index 00000000..cd9b6e87 --- /dev/null +++ b/lib/sisu/0.52/db_indexes.rb @@ -0,0 +1,95 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_index + class Index # create documents Indexes def initialize(opt,conn='',sql_type='') + def initialize(opt,conn='',sql_type='') + @opt,@conn,@sql_type=opt,conn,sql_type + end + def create_indexes # check added from pg not tested + def base + print ' + create documents common indexes + ' unless @opt.cmd =~/q/ + @conn.execute(' + CREATE INDEX object_nr ON documents(ocn); + CREATE INDEX digest_clean ON documents(digest_clean); + CREATE INDEX digest_all ON documents(digest_all); + CREATE INDEX lev1 ON documents(lev1); + CREATE INDEX lev2 ON documents(lev2); + CREATE INDEX lev3 ON documents(lev3); + CREATE INDEX lev4 ON documents(lev4); + CREATE INDEX lev5 ON documents(lev5); + CREATE INDEX lev6 ON documents(lev6); + CREATE INDEX endnote_nr ON endnotes(nr); + CREATE INDEX digest_en ON endnotes(digest_clean); + CREATE INDEX endnote_nr_asterisk ON endnotes_asterisk(nr); + CREATE INDEX endnote_asterisk ON endnotes_asterisk(clean); + CREATE INDEX digest_en_asterisk ON endnotes_asterisk(digest_clean); + CREATE INDEX endnote_nr_plus ON endnotes_plus(nr); + CREATE INDEX endnote_plus ON endnotes_plus(clean); + CREATE INDEX digest_en_plus ON endnotes_plus(digest_clean); + CREATE INDEX title ON metadata(title); + CREATE INDEX filename ON metadata(filename) + ') unless @opt.cmd =~/q/ + end + def text + print ' + create documents text indexes + ' unless @opt.cmd =~/q/ + @conn.execute(' + CREATE INDEX clean ON documents(clean); + CREATE INDEX endnote ON endnotes(clean); + ') unless @opt.cmd =~/q/ + end + base + @opt.cmd=~/D/ || @opt.mod=~/psql/ ? '' : text + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_load_tuple.rb b/lib/sisu/0.52/db_load_tuple.rb new file mode 100644 index 00000000..1be35e5a --- /dev/null +++ b/lib/sisu/0.52/db_load_tuple.rb @@ -0,0 +1,94 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_tuple + class Load_tuple #% main database populate + require SiSU_lib + '/param' + include SiSU_Param + def initialize(conn,col,opt) + @conn,@col,@opt=conn,col,opt + @col[:lev]=@col[:lev].to_i + @col[:lev]=0 unless @col[:lev]=~/^[1-6]/ or @col[:lev]==1 or @col[:lev]==2 or @col[:lev]==3 or @col[:lev]==4 or @col[:lev]==5 or @col[:lev]==6 #changed from \d+ ?? + @col[:ocn]=0 unless @col[:ocn]=~/\d+/ + @cX=SiSU_Screen::Ansi.new(@opt.cmd).cX + end + def tuple #% import line + begin + if @col[:en_a] + #puts.inspect "#{@col[:lid]}, #{@col[:tid]}, #{@col[:lev]}, '#{@col[:plaintext]}', '#{@col[:body]}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@col[:seg]}', '#{@col[:lv1]}', '#{@col[:lv2]}', '#{@col[:lv3]}', '#{@col[:lv4]}', '#{@col[:lv5]}', '#{@col[:lv6]}', '#{@col[:en_a]}', '#{@col[:en_z]}'" + @conn.execute(%{ + INSERT INTO documents (lid, metadata_tid, lev, clean, body, ocn, ocnd, ocns, seg, lev1, lev2, lev3, lev4, lev5, lev6, en_a, en_z, digest_clean, digest_all) VALUES (#{@col[:lid]}, #{@col[:tid]}, #{@col[:lev]}, '#{@col[:plaintext]}', '#{@col[:body]}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@col[:seg]}', '#{@col[:lv1]}', '#{@col[:lv2]}', '#{@col[:lv3]}', '#{@col[:lv4]}', '#{@col[:lv5]}', '#{@col[:lv6]}', '#{@col[:en_a]}', '#{@col[:en_z]}', '#{@col[:digest_clean]}', '#{@col[:digest_all]}'); + }) + else + #puts.inspect "#{@col[:lid]}, #{@col[:tid]}, #{@col[:lev]}, '#{@col[:plaintext]}', '#{@col[:body]}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@col[:seg]}', '#{@col[:lv1]}', '#{@col[:lv2]}', '#{@col[:lv3]}', '#{@col[:lv4]}', '#{@col[:lv5]}', '#{@col[:lv6]}'" + @conn.execute(%{ + INSERT INTO documents (lid, metadata_tid, lev, clean, body, ocn, ocnd, ocns, seg, lev1, lev2, lev3, lev4, lev5, lev6, digest_clean, digest_all) VALUES (#{@col[:lid]}, #{@col[:tid]}, #{@col[:lev]}, '#{@col[:plaintext]}', '#{@col[:body]}', '#{@col[:ocn]}', '#{@col[:ocnd]}', '#{@col[:ocns]}', '#{@col[:seg]}', '#{@col[:lv1]}', '#{@col[:lv2]}', '#{@col[:lv3]}', '#{@col[:lv4]}', '#{@col[:lv5]}', '#{@col[:lv6]}', '#{@col[:digest_clean]}', '#{@col[:digest_all]}'); + }) + end + if @opt.cmd =~/v/ + if @col[:lev].to_s =~/[1235678]/ + lev=case @col[:lev].to_s + when /1/; ':A' + when /2/; ':B' + when /3/; ':C' + when /5/; ' 2' + when /6/; ' 3' + end + puts %{#{lev}>\t#{@col[:lv1]}\t#{@col[:lv2]}\t#{@col[:lv3]}\t#{@col[:lv4]}\t#{@col[:lv5]}\t#{@col[:lv6]}\t#{@col[:ocn]}\t#{@col[:ocnd]}\t#{@col[:ocns]}} + elsif @col[:lev].to_s =~/[4]/ + puts %{ #{@cX.green}1>#{@cX.off}\t#{@col[:lv1]}\t#{@col[:lv2]}\t#{@col[:lv3]}\t#{@col[:lv4]}\t#{@col[:lv5]}\t#{@col[:lv6]}\t#{@col[:ocn]}\t#{@col[:ocnd]}\t#{@col[:ocns]}\t#{@col[:seg]}} + end + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + #@conn.execute("COMMIT") + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_remove.rb b/lib/sisu/0.52/db_remove.rb new file mode 100644 index 00000000..81ec3643 --- /dev/null +++ b/lib/sisu/0.52/db_remove.rb @@ -0,0 +1,86 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_remove + class Remove + def initialize(opt,conn='' ) + @opt,@conn=opt,conn + @md=SiSU_Param::Parameters.new(@opt).get + @fnb=@md.fnb + @db=SiSU_Env::Info_db.new + end + def remove + del=@conn.select_one(%{ SELECT tid FROM metadata WHERE filename LIKE '#{@opt.fns}'; }) + if del + del_id=del.join + #@conn.execute("BEGIN") + @conn.execute(%{ + DELETE FROM endnotes WHERE metadata_tid LIKE '#{del_id}'; + DELETE FROM endnotes_asterisk WHERE metadata_tid LIKE '#{del_id}'; + DELETE FROM endnotes_plus WHERE metadata_tid LIKE '#{del_id}'; + DELETE FROM documents WHERE metadata_tid LIKE '#{del_id}'; + DELETE FROM urls WHERE metadata_tid LIKE '#{del_id}'; + DELETE FROM metadata WHERE tid LIKE '#{del_id}'; + /* + DELETE FROM documents WHERE documents.metadata_tid LIKE '#{del_id}'; + DELETE FROM endnotes WHERE endnotes.metadata_tid LIKE '#{del_id}'; + DELETE FROM endnotes_asterisk WHERE endnotes_asterisk.metadata_tid LIKE '#{del_id}'; + DELETE FROM endnotes_plus WHERE endnotes_plus.metadata_tid LIKE '#{del_id}'; + DELETE FROM urls WHERE urls.metadata_tid LIKE '#{del_id}'; + DELETE FROM metadata WHERE metadata.tid LIKE '#{del_id}'; + */ + }) + #@conn.execute("COMMIT") + else + tell=SiSU_Screen::Ansi.new(@opt.cmd,"no such file in database #{@db.db_psql}::#{@opt.fns}") + tell.puts_grey #if @opt.cmd.include? ?v + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_select.rb b/lib/sisu/0.52/db_select.rb new file mode 100644 index 00000000..a6db4bfa --- /dev/null +++ b/lib/sisu/0.52/db_select.rb @@ -0,0 +1,158 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_select + class Case + def initialize(opt,conn='',sql_type='pg') + @opt,@conn,@sql_type=opt,conn,sql_type + #@sdb=Create.new(@conn) + @sdb=SiSU_DB::Create.new(@opt,@conn,@sql_type) + @index=SiSU_DB::Index.new(@opt,@conn,@sql_type) + @sdb_no=SiSU_DB::Drop.new(@opt,@conn,@sql_type) + @sdb_import=SiSU_DB::Import.new(@opt,@conn,@sql_type) if @opt.mod.inspect =~/update|import/ + @remove=SiSU_DB::Remove.new(@opt,@conn) if @opt.mod.inspect =~/update|remove/ + @db=SiSU_Env::Info_db.new + end + def cases + @opt.mod.each do |mod| + case mod + when /^--createdb$/ + @sdb.output_dir? + begin + @sdb.create_db + rescue; @sdb.output_dir? + end + when /^--(?:init(?:ialize)?|create(?:all)?)$/ + @sdb.output_dir? + #@sdb.create_db + begin + @sdb.create_table_metadata + @sdb.create_table + @sdb.create_table_endnotes + @sdb.create_table_endnotes_asterisk + @sdb.create_table_endnotes_plus + @sdb.create_table_urls + @index.create_indexes + rescue; SiSU_Errors::Info_error.new($!,$@,'-D').error; @sdb.output_dir? + end + when /^--createtable(s)?$/ + @sdb.output_dir? + begin + @sdb.create_table_metadata + @sdb.create_table + @sdb.create_table_endnotes + @sdb.create_table_endnotes_asterisk + @sdb.create_table_endnotes_plus + @sdb.create_table_urls + @index.create_indexes + rescue; @sdb.output_dir? + end + when /^--recreate$/ + @sdb.output_dir? + begin + @sdb_no.drop_tables + @sdb.create_table_metadata + @sdb.create_table + @sdb.create_table_endnotes + @sdb.create_table_endnotes_asterisk + @sdb.create_table_endnotes_plus + @sdb.create_table_urls + @index.create_indexes + rescue; @sdb.output_dir? + end + when /^--cr(eate)?lex$/ + @sdb.output_dir? + begin + @sdb.create_table + rescue; @sdb.output_dir? + end + when /^--cr(eate)?metadata$/ + @sdb.output_dir? + begin + @sdb.create_table_metadata + rescue; @sdb.output_dir? + end + when /^--import$/ + @sdb_import.marshal_load + tell=case @sql_type + when /sqlite/; SiSU_Screen::Ansi.new(@opt.cmd,"sqlite #{@db.db_sqlite} database?") + when /pg/; SiSU_Screen::Ansi.new(@opt.cmd,"pgaccess or psql #{@db.db_psql} database?") + else '???' + end + tell.puts_grey if @opt.cmd =~/v/ + when /^--remove$/ + @remove.remove + when /^--update$/ + @remove.remove + @sdb_import.marshal_load + tell=SiSU_Screen::Ansi.new(@opt.cmd,"pgaccess or psql #{@db.db_psql} database?") + tell.puts_grey if @opt.cmd =~/v/ + when /^--index$/ + @index.create_indexes + when /^droptable(s)?$/ + @sdb_no.drop_tables + when /^--dropindex(es)?$/ + @sdb_no.drop_indexes + when /^--(?:dropall|drop)$/ + @sdb_no.drop_tables + #@sdb_no.drop_indexes + when /^--(?:db=)?(?:(?:sq)?lite|pg(?:sql)?|my(?:sql)?)$/ + else + help=SiSU_Help::Help.new + help.summary + help.commands + end + end + begin + @conn.commit if @sql_type =~/sqlite/ + rescue; @sdb.output_dir? + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/db_tests.rb b/lib/sisu/0.52/db_tests.rb new file mode 100644 index 00000000..8d6d7caf --- /dev/null +++ b/lib/sisu/0.52/db_tests.rb @@ -0,0 +1,104 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: modules shared by the different db types, dbi, postgresql, sqlite + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DB_tests + class Test + def initialize(info,opt) + @ck,@opt=info,opt + unless @opt.cmd =~/q/ + puts @ck.tp[:fns] + puts @ck.tp[:title] + puts @ck.tp[:creator] if @ck.tp[:creator] + end + end + def verify + unless @opt.cmd =~/q/ + puts @ck.tp[:fns].length.to_s + ' checklength ' + @ck.tp[:fns] if @ck.tp[:fns] and @ck.tp[:fns].length >@ck.lt_filename + puts @ck.tp[:title].length.to_s + ' checklength ' + @ck.tp[:title] if @ck.tp[:title] and @ck.tp[:title].length >@ck.lt_title + puts @ck.tp[:subtitle].length.to_s + ' checklength ' + @ck.tp[:subtitle] if @ck.tp[:subtitle] and @ck.tp[:subtitle].length >@ck.lt_subtitle + puts @ck.tp[:creator].length.to_s + ' checklength ' + @ck.tp[:creator] if @ck.tp[:creator] and @ck.tp[:creator].length >@ck.lt_creator + puts @ck.tp[:illustrator].length.to_s + ' checklength ' + @ck.tp[:illustrator] if @ck.tp[:illustrator] and @ck.tp[:illustrator].length >@ck.lt_illustrator + puts @ck.tp[:translator].length.to_s + ' checklength ' + @ck.tp[:translator] if @ck.tp[:translator] and @ck.tp[:translator].length >@ck.lt_translator + puts @ck.tp[:prepared_by].length.to_s + ' checklength ' + @ck.tp[:prepared_by] if @ck.tp[:prepared_by] and @ck.tp[:prepared_by].length >@ck.lt_prepared_by + puts @ck.tp[:digitized_by].length.to_s + ' checklength ' + @ck.tp[:digitized_by] if @ck.tp[:digitized_by] and @ck.tp[:digitized_by].length >@ck.lt_digitized_by + puts @ck.tp[:subject].length.to_s + ' checklength ' + @ck.tp[:subject] if @ck.tp[:subject] and @ck.tp[:subject].length >@ck.lt_subject + puts @ck.tp[:description].length.to_s + ' checklength ' + @ck.tp[:description] if @ck.tp[:description] and @ck.tp[:description].length >@ck.lt_description + puts @ck.tp[:publisher].length.to_s + ' checklength ' + @ck.tp[:publisher] if @ck.tp[:publisher] and @ck.tp[:publisher].length >@ck.lt_publisher + puts @ck.tp[:contributor].length.to_s + ' checklength ' + @ck.tp[:contributor] if @ck.tp[:contributor] and @ck.tp[:contributor].length >@ck.lt_contributor + puts @ck.tp[:date].length.to_s + ' checklength ' + @ck.tp[:date] if @ck.tp[:date] and @ck.tp[:date].length >@ck.lt_date + puts @ck.tp[:date_created].length.to_s + ' checklength ' + @ck.tp[:date_created] if @ck.tp[:date_created] and @ck.tp[:date_created].length >@ck.lt_date_created + puts @ck.tp[:date_issued].length.to_s + ' checklength ' + @ck.tp[:date_issued] if @ck.tp[:date_issued] and @ck.tp[:date_issued].length >@ck.lt_date_issued + puts @ck.tp[:date_valid].length.to_s + ' checklength ' + @ck.tp[:date_valid] if @ck.tp[:date_valid] and @ck.tp[:date_valid].length >@ck.lt_date_valid + puts @ck.tp[:date_available].length.to_s + ' checklength ' + @ck.tp[:date_available] if @ck.tp[:date_available] and @ck.tp[:date_available].length >@ck.lt_date_available + puts @ck.tp[:date_modified].length.to_s + ' checklength ' + @ck.tp[:date_modified] if @ck.tp[:date_modified] and @ck.tp[:date_modified].length >@ck.lt_date_modified + puts @ck.tp[:type].length.to_s + ' checklength ' + @ck.tp[:type] if @ck.tp[:type] and @ck.tp[:type].length >@ck.lt_type + puts @ck.tp[:format].length.to_s + ' checklength ' + @ck.tp[:format] if @ck.tp[:format] and @ck.tp[:format].length >@ck.lt_format + puts @ck.tp[:identifier].length.to_s + ' checklength ' + @ck.tp[:identifier] if @ck.tp[:identifier] and @ck.tp[:identifier].length >@ck.lt_identifier + puts @ck.tp[:source].length.to_s + ' checklength ' + @ck.tp[:source] if @ck.tp[:source] and @ck.tp[:source].length >@ck.lt_source + puts @ck.tp[:language].length.to_s + ' checklength ' + @ck.tp[:language] if @ck.tp[:language] and @ck.tp[:language].length >@ck.lt_language + puts @ck.tp[:language_original].length.to_s + ' checklength ' + @ck.tp[:language_original] if @ck.tp[:language_original] and @ck.tp[:language_original].length >@ck.lt_language_original + #puts @ck.tp[:language_char].length.to_s + ' checklength ' + @ck.tp[:language_char] if @ck.tp[:language_char] and @ck.tp[:language_char].length >@ck.lt_language_char + #puts @ck.tp[:language_original_char].length.to_s + ' checklength ' + @ck.tp[:language_original_char] if @ck.tp[:language_original_char] and @ck.tp[:language_original_char].length >@ck.lt_language_original_char + puts @ck.tp[:relation].length.to_s + ' checklength ' + @ck.tp[:relation] if @ck.tp[:relation] and @ck.tp[:relation].length >@ck.lt_relation + puts @ck.tp[:coverage].length.to_s + ' checklength ' + @ck.tp[:coverage] if @ck.tp[:coverage] and @ck.tp[:coverage].length >@ck.lt_coverage + puts @ck.tp[:rights].length.to_s + ' checklength ' + @ck.tp[:rights] if @ck.tp[:rights] and @ck.tp[:rights].length >@ck.lt_rights + puts @ck.tp[:copyright].length.to_s + ' checklength ' + @ck.tp[:copyright] if @ck.tp[:copyright] and @ck.tp[:copyright].length >@ck.lt_copyright + puts @ck.tp[:owner].length.to_s + ' checklength ' + @ck.tp[:owner] if @ck.tp[:owner] and @ck.tp[:owner].length >@ck.lt_owner + puts @ck.tp[:keywords].length.to_s + ' checklength ' + @ck.tp[:keywords] if @ck.tp[:keywords] and @ck.tp[:keywords].length >@ck.lt_keywords + puts @ck.tp[:abstract].length.to_s + ' checklength ' + @ck.tp[:abstract] if @ck.tp[:abstract] and @ck.tp[:abstract].length >@ck.lt_abstract + puts @ck.tp[:comment].length.to_s + ' checklength ' + @ck.tp[:comment] if @ck.tp[:comment] and @ck.tp[:comment].length >@ck.lt_comment + puts @ck.tp[:loc].length.to_s + ' checklength ' + @ck.tp[:loc] if @ck.tp[:loc] and @ck.tp[:loc].length >@ck.lt_loc + puts @ck.tp[:dewey].length.to_s + ' checklength ' + @ck.tp[:dewey] if @ck.tp[:dewey] and @ck.tp[:dewey].length >@ck.lt_dewey + puts @ck.tp[:isbn].length.to_s + ' checklength ' + @ck.tp[:isbn] if @ck.tp[:isbn] and @ck.tp[:isbn].length >@ck.lt_isbn + puts @ck.tp[:pg].length.to_s + ' checklength ' + @ck.tp[:pg] if @ck.tp[:pg] and @ck.tp[:pg].length >@ck.lt_pg + puts @ck.tp[:date] if @ck.tp[:date] !~/\d\d-\d\d-\d\d/ + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/dbi.rb b/lib/sisu/0.52/dbi.rb new file mode 100644 index 00000000..6c1b8adf --- /dev/null +++ b/lib/sisu/0.52/dbi.rb @@ -0,0 +1,119 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: postgresql module, dbi import frame + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_DBI #% database building + require SiSU_lib + '/help' + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Screen + require SiSU_lib + '/param' + include SiSU_Param + require SiSU_lib + '/shared_db' + include SiSU_DB + require SiSU_lib + '/shared_html_lite' + include SiSU_Format_Shared + class SiSU_SQL + def initialize(opt) + SiSU_Env::Load.new('dbi',true).prog + @opt=opt + @db=SiSU_Env::Info_db.new + if @opt.cmd =~/d/i or @opt.mod.inspect =~/--pg(?:sql)?|(?:sq)?lite/ + @sql_type=if @opt.cmd=~/D/ or @opt.mod.inspect =~/--pg(?:sql)?/; 'pg' + elsif @opt.cmd =~/d/ and @opt.mod.inspect =~/--(?:db[=-])?pg(?:sql)?/; 'pg' + elsif @opt.mod.inspect =~/--(?:sq)?lite/; 'sqlite' + elsif @opt.cmd =~/d/ and @opt.mod.inspect =~/--(?:db[=-])?(?:sq)?lite/; 'sqlite' + #elsif @opt.cmd =~/d/ and @opt.mod.select =~/--my(?:sql)?/; 'mysql' + else 'sqlite' + end + end + end + def read_psql + begin + db,user,dbi=@db.db_psql,@db.user,@db.dbi_psql + @conn=DBI.connect(dbi,user,db) + rescue + if @opt.mod.inspect=~/--(createall|create)/ + puts %{manually create the database: "#{db}" if it does not yet exist} + #sudo su -p postgres; createdb #{db}; #[createuser?] + end + SiSU_DB::Case.new(@opt,@conn,@sql_type).cases + @conn=DBI.connect(dbi,user,db) + ensure + end + end + def read_sqlite + begin + sql_type='sqlite' + dbi=@db.dbi_sqlite + @conn=DBI.connect(dbi) + rescue + ensure + end + end + def connect + case @sql_type + when /pg/; read_psql + when /sqlite/; read_sqlite + end + tell=SiSU_Screen::Ansi.new(@opt.cmd,"DBI (#@sql_type) #{@opt.mod}") + tell.dbi_title unless @opt.cmd =~/q/ + begin + SiSU_DB::Case.new(@opt,@conn,@sql_type).cases + rescue; SiSU_Errors::Info_error.new($!,$@,@cf,@opt.fns).error + ensure + end + begin + @conn.disconnect if @sql_type =~/sqlite/ + rescue + connect + end + end + end +end +__END__ + diff --git a/lib/sisu/0.52/defaults.rb b/lib/sisu/0.52/defaults.rb new file mode 100644 index 00000000..29027b7b --- /dev/null +++ b/lib/sisu/0.52/defaults.rb @@ -0,0 +1,2045 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: Default values (reset by skins) + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +$latex_run=nil +module SiSU_Viz + require 'uri' + require SiSU_lib + '/sysenv' + include SiSU_Env + require SiSU_lib + '/css' + include SiSU_Style + class Skin + #attr_accessor :glyph,:html,:php,:javascript,:path,:text,:url,:color,:icon,:font,:markup,:paragraph,:table,:table_do,:indent,:margin,:png,:nav_txt,:nav_png,:banner,:widget + def initialize + #@css=SiSU_Env::CSS_default.new + @fonts='verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman' # 'verdana, arial, georgia, tahoma, sans-serif, helvetica, "times new roman", times, roman' + @dir=SiSU_Env::Info_env.new + @date=SiSU_Env::Info_date.new + end + #% glyph + def glyph_bullet # • + '• ' # [• flagged] + end + #% html + def html_hardspace + ' ' + end + #% php + def php_persist + end + #% javascript #kxjs knxjs + def js_home + end + def js_infobox + end + def js_knxjs + end + def js_head + end + def js_top + end + def js_sisu + end + def js_home + end + def js_sponsor + end + def js_books + end + def js_journals + end + def js_conferences + end + def js_services + end + def js_catalogue + end + def js_doc + end + def js_toc + end + def js_seg + end + def js_mail + end + def js_manifest + end + def js_status + end + def js_next + end + def js_prev + end + def js_portrait + end + def js_landscape + end + def js_pdf + end + def js_odf + end + def js_concordance + end + def js_instruments + end + def js_external + end + def js_gopher + end + def js_ftp + end + def js_law + end + def js_disclaimer + end + def js_old + end + #% path + def path_stylesheet_home + %{ } + end + #% text #changed from txt to avoid naming conflicts #FOLLOW + def txt_generator + v=SiSU_Env::Info_version.new.get_version + %{ + } + end + def txt_generator_comment + v=SiSU_Env::Info_version.new.get_version + %{ } + end + def txt_hp + ' SiSU' + end + def txt_hp_alias + 'SiSU' + end + def txt_home + 'SiSU' + end + def txt_signature # used in latex/pdf footer + 'SiSU' + end + #% url + def url_urify(uri) + URI.parse(uri) + end + def url_sisu + 'http://www.jus.uio.no/sisu' + end + def url_root + '/sisu' #watch + end + def url_root_http + 'http://www.jus.uio.no/sisu' #watch + end + def url_home + 'http://www.jus.uio.no/sisu' # used in pdf header + end + def url_site #used as stub... where there are subdirectories and is different from home + url_home + #'http://www.jus.uio.no/sisu' # used in pdf header + end + def url_txt + 'www.jus.uio.no/sisu' + end + def url_path_image_base #used for html image display + '../_sisu/image_local' + end + def url_path_image #used for html image display + '../_sisu/image' + end + def url_path_ebook_dir + './ebook' + end + def url_path_ebook_images + '.' + end + def url_promo + '' + end + def url_promo_home + '' + end + #% color + def color_shadow + '"4"' + end + def color_body + %{} + end + def color_white + '"#ffffff"' + end + def color_black + '#000000' + end + def color_shadow #hmmm + '"4"' + end + def color_blue_dark + '#000099' + end + def color_blue + 'blue' + end + def color_blue_base + '#b9d4dd' + #'#eff6ff' #light + #'#c0d9d9' #light + #'#0044cc' #pale + #'#c0d9d9' #sky + end + def color_blue_ink + '#003399' + end + def color_blue_tinge + '#e3ecef' + #'#d7dddd' + #'#f2f5f7' + end + def color_blue_grey + '#8faebf' + end + def color_blue_murky + '#437389' + end + #def color_brown + # '#423a27' + #end + def color_beige + '#f1e8de' + #'#fff3b6'#custard + end + def color_subtleglow + '#dddccc' + end + def color_glow + '#fff0c3' + end + def color_rose + '#ffdec9' + end + def color_turquoise + '#1c869b' + end + def color_grey_pale + '#eeeeee' + # '#dddddd' #light + end + def color_grey_medium + '#cccccc' + end + def color_grey + '#999999' + end + def color_yellow_light + '#fff3b6' + end + def color_yellow + '#ffde14' + end + def color_yellow_dark + '#ffcc00' + end + def color_green_light + '#b7d398' # #e2efd5 #b7d398 #b1c999 # '#aed19e' + end + def color_green + '#0a8400' + end + def color_green_dark + '#086800' + end + def color_ruby + '#a00000' + end + def color_maroon + '#800000' + end + def color_paper + %{"#{color_white}"} + end + def color_band1 + %{"#{color_white}"} + #'"#777777"' + end + def color_band2 + %{"#{color_white}"} + #'"#cccccc"' + end + def color_body + %{\n\n} + end + def color_font_face #was font WATCH + "#{color_black}" + end + def color_surround + %{"#{color_white}"} + end + def color_band + %{"#{color_white}"} + end + def color_table1 + 'ffffcc' + end + def color_table2 + 'c0d0f0' + end + def color_band1 + '"#ffffff"' + end + def color_band2 + '"#ffffff"' + end + #% icon + def icon_ico + 'rb7.ico' + end + def icon_sisu + 'sisu.png' + end + def icon_manifest + 'bullet_red.png' + end + def icon_doc + 'b_doc.png' + end + def icon_toc + 'b_toc.png' + end + def icon_wmp + 'b_wmp.png' + end + def icon_odf + 'b_odf.png' + end + def icon_pdf + 'b_pdf.png' + end + def icon_pdf_portrait + 'b_pdf.png' + end + def icon_pdf_landscape + 'b_pdf.png' + end + def icon_status + 'b_status.png' + end + def icon_external + 'b_ext.png' + end + def icon_external_toc + 'b_ext_toc.png' + end + def icon_seg_toc + 'b_bluebell.png' + end + def icon_crosslink_toc + 'b_amber.png' + end + def icon_mail + 'b_mail.png' + end + def icon_para + 'b_para.png' + end + def icon_pdf + 'b_pdf.png' + end + def icon_ftp + 'b_ftp.png' + end + def icon_gopher + 'b_gopher.png' + end + def icon_choice + 'b_choice.png' + end + def icon_new + 'b_new.png' + end + def icon_book + 'b_amber.png' + # b_book.png + end + def icon_dot_clear + 'dot_clear.png' + end + def icon_dot_white + 'dot_white.png' + end + def icon_dot + icon_dot_white + end + def icon_amber + 'b_amber.png' + end + def icon_rose + 'b_rose.png' + end + def icon_bluebell + 'b_bluebell.png' + end + def icon_home_button + 'sisu.png' + end + def icon_home_banner + 'sisu.png' + end + def icon_site + 'b_home.png' + end + def icon_bluedot + 'blueband.png' + end + def icon_next + 'arrow_next_red.png' + end + def icon_previous + 'arrow_prev_red.png' + end + def icon_up + 'arrow_up_red.png' + end + #% font + def font_fonts + @fonts + end + def font_face + %{face="#{font_fonts}"} + end + def font_lmtoc_face + %{face="#{font_fonts}"} + end + def font_ebook_face + %{face="#{font_fonts}"} + end + def font_face_lmtoc + %{face="#{font_fonts}"} + end + def font_color + 'color="#000000"' + end + def font_size + 'size="4"' + end + def font_size_txt + 'size="4"' + end + def font_size_txt_00 + 'size="3"' + end + def font_size_endnote + 'size="3"' + end + def font_small + 'size="3"' + end + def font_tiny + 'size="2"' + end + #% markup + def markup_italics_list #regular expression of words to be italised + end + def markup_bold_list #regular expression of words to be made bold + 'SiSU' + end + def markup_make_italic + if defined? italics_list and italics_list + #make=italics_list.split(/;\s+/).join('|').strip + make={} + if italics_list + r=italics_list.dup + x=case r + when /\/i$/; 'i' + else '' + end + r.gsub!(/^\/(.+?)\/i?/,'\1') + r.gsub!(/\(/,'(?:') # avoid need to escape use of brackets within regex provided + m='\b(' + r + ')\b' + make[:str] + make[:regx]=if x =~/i/; /#{m}/i + else /#{m}/ + end + else nil + end + end + end + def markup_make_bold + if defined? bold_list and not bold_list.empty? + make={} + if bold_list + #make=bold_list.split(/;\s+/).join('|').strip + r=bold_list.dup + x=case r + when /\/i$/; 'i' + else '' + end + r.gsub!(/^\/(.+?)\/i?/,'\1') + r.gsub!(/\(/,'(?:') # avoid need to escape use of brackets within regex provided + m='\b(' + r + ')\b' + make[:str] + make[:regx]=if x =~/i/; /#{m}/i + else /#{m}/ + end + else nil + end + make + end + end + #% paragraph + def paragraph_txt + %{

} + end + def paragraph_txt_00 + %{

} + end + def paragraph_font_citation + %{} + end + def paragraph_endnote + %{

} + end + def paragraph_table + %{

} + end + def paragraph_table_xml + end + def paragraph_tiny + %{

} + end + def paragraph_small + %{

} # keep but not used? + end + def paragraph_font_tiny + %{} + end + def paragraph_font_small + %{} + end + def paragraph_heading_1 + %{

} + end + def paragraph_heading_1_center + %{

} + end + #% table + def table_close + ' +' + end + def table_close_centered_table + end + def table_align_A + end + def table_align_B + end + def table_align_C + end + def table_width_1 + '"100%"' + end + def table_width_2 + '"99%"' + end + def table_width_3 + '"94%"' + end + def table_width_4 + '"90%"' + end + def table_width_txt + '"94%"' + end + def table_width_txt_avgo + '"100%"' + end + def table_width_txt_r + '"96%"' + end + def table_cellpad_small_paper_margins + '"6"' + end + def table_cellpad_paper_margins + '"36"' + end + def table_cellpad_A + '"0"' + end + def table_cellpad_B + '"20"' + end + def table_cellpad_shadow + '"4"' + end + def table_cellpad_band + '"16"' + end + def table_cellpad_box + '"20"' + end + def table_table_align_A + '
' + end + def table_table_align_B + '
' + end + def table_table_align_C + ' ' + end + #% table_do + def table_do_table_paper + %{#{table_align_C}
\n

\n} + end + def table_do_table_surround + %{ + +
\n} + end + #% indent + def indent_level_0 + '"1%"' + end + def indent_level_1 + '"4%"' + end + def indent_level_2 + '"6%"' + end + def indent_level_3 + '"8%"' + end + def indent_level_4 + '"10%"' + end + #% margin + def margin_num + '

' + end + def margin_numless + '' + end + def margin_num_css + ' ' + end + def margin_num_header + '' + end + def margin_txt_00_1 + %{ + +
+} + end + def margin_txt_w1 + %{ + +
 } + end + def margin_txt_w2 + %{ + +
 } + end + def margin_txt_0 + %{ +
+} + end + def margin_txt_1 + %{ +
} + end + def margin_txt_2 + %{ + +
+} + end + def margin_txt_3 + %{ + +
+} + end + def margin_css + ' +
' + end + #% png + def png_ico + %{ } + end + def png_sisu #check url path + %{ + SiSU + } + end + def png_hp + dir=SiSU_Env::Info_env.new #(@fns) + %{ + #{txt_home} + } + end + def png_site + #dir=SiSU_Env::Info_env.new #(@fns) + %{@} + end + def png_homepage + png_site + end + def png_nav + %{Contents} + end + def png_manifest + %{Document Manifest} + end + def png_doc + %{Full Text} + end + def png_toc + %{TOC linked} + end + def png_odf + %{ODF/ODT} + end + def png_pdf + %{PDF} + end + def png_pdf_portrait + %{PDF portrait} + end + def png_pdf_landscape + %{PDF landscape} + end + def png_wmp + %{Concordance} + end + def png_para + %{Segment} + end + def png_status + %{Membership status} + end + def png_mark + %{*} + end + def png_doc_tiny + %{Doc} + end + def png_toc_tiny + %{TOC} + end + def png_status_tiny + %{Status, Member States} + end + def png_ftp + %{FTP} + end + def png_gopher + %{Gopher} + end + def png_crosslink + %{lateral hop} + end + def png_crosslink_ext + %{lateral hop} + end + def png_home + dir=SiSU_Env::Info_env.new #(@fns) + %{#{txt_home} -->} + end + def png_home_button + #dir=SiSU_Env::Info_env.new #(@fns) + %{#{txt_home} -->} + end + def png_book + %{Cameron May Books} + end + #% png_nav + def png_nav_home + end + def png_nav_toc + %{TOC} + end + def png_nav_doc + end + def png_nav_previous + %{<< previous} + end + def png_nav_next + %{next >>} + end + def png_nav_pre + png_nav_previous + end + def png_nav_nxt + png_nav_next + end + def png_nav_pdf + %{PDF} + end + def png_nav_pdf_portrait + %{pdf portrait} + end + def png_nav_pdf_landscape + %{pdf landscape} + end + def png_nav_dot_toc + %{^} + end + def png_nav_dot_previous + %{<} + end + def png_nav_dot_next + %{>} + end + def png_nav_dot_pre + png_nav_dot_previous + end + def png_nav_dot_nxt + png_nav_dot_next + end + #% nav_txt + def nav_txt_home + %{ + #{png_site}  + } + end + def nav_txt_home_button + %{ + #{png_home_button}  + } + end + def nav_txt_homepage + %{ + #{png_site} homepage  + } + end + def nav_txt_toc_link + %{ + #{png_toc}  toc  + } + end + def nav_txt_toc_link_verbose + %{ + #{png_toc}  segments' toc  + } + end + def nav_txt_doc_link + %{ + #{png_doc}  scroll  + } + end + def nav_txt_manifest + %{ + #{png_manifest}  ?  + } + end + def nav_txt_concordance + %{ +   A-Z  + } + end + def nav_txt_previous + ' +   << Previous   + + Full Text ' + end + def nav_txt_next + %{ +   Next     >>   + } + end + def nav_txt_odf + %{ + #{png_odf}  odt  + } + end + def nav_txt_pdfs + %{ + pdfs   + } + end + def nav_txt_pdf_portrait + %{ + #{png_pdf_portrait} +   pdf  + } + end + def nav_txt_pdf_landscape + %{ + #{png_pdf_landscape} +   pdf  + } + end + #% banner + def banner_home + %{
+ + #{png_site} + +
+ + an +
+ ( international | transnational ) +
+ commercial law & e-commerce +
+ infrastructure monitor
} + end + def banner_home_guide + %{
+ + #{png_doc} LM toc + + + #{png_doc} LM 20** + +
} + end + def banner_home_button_only + %{ + #{png_home_button} + } + end + def banner_home_button #yellow_dark now white + %{ + +
+ + #{png_home_button} + + +#{table_close}} + end + def banner_home_and_index_buttons #yellow_dark now white + %{ + + +
+ + +
+ + #{png_home} + +
+
+ + +
+ + +  This text's sub-  +
+  Table of Contents  +
+
+
+
+   +#{table_close}} + end + def banner_url_txt_sisu + %{SiSU} + end + def banner_band #yellow_dark now white + %{ + +
+ + #{png_home} + + +#{table_close}} + end + def banner_credit_band + %{ +
+ +
+ +
} + end + def banner_instrument_cover_band_scr + ' +
' + end + def banner_instrument_cover_band_seg + ' +
' + end + #% widget + def widget_promo # Array used to build promo from list.yml and promo.yml + # ['sisu_icon','sisu','sisu_search_libre','open_society','fsf','ruby'] + end + def widget_browsers +< + +
+

+ + If you have problems viewing pages on this site please update your browser: + +

+#{table_close} + + + + + + + + + +
+

+ + +  Epiphany + + ® | + +

+
+

+ + +  Galeon + + ® | + +

+
+

+ + + I-Explorer + + ® | + +

+
+

+ + + Kazehakase + ® |

+ +

+ + + Konqueror + ® |

+

+ + + Mozilla + + + Firefox + + ® | + +

+
+

+ + + Netscape + + ® | + +

+
+

+ + + Opera + + ® | + +

+
+

+ + + Safari + + ® + +

+#{table_close} + + + + + + + + + + +WOK + end + def widget_pdfviewers +<
+

+ + for console/text viewing: + +

+
+

+ + + elinks +  | + +

+
+

+ + + links2 +  | + +

+
+

+ + + w3m + + +

+
+

+ + for lightweight gui (X) viewing try: + +

+
+

+ + + Dillo + +  | + +

+
+

+ + +  Epiphany + + ® | + +

+
+

+ + +  Galeon +  | + +

+
+

+ + + links2 -g + + +

+#{table_close} +
+ +
+

+ + & for + + pdf + + viewings of this site we recommend stand alone viewers +
+ (rather than web browser plugins): +
+

+#{table_close} + + + + + + + + + + + + +
+

+ + + Acrobat Reader + + ® +  | + +

+
+

+ + + Evince + + ® + +

+
+

+ +  GhostView® , + + GV® + + & + + GSview® + +  | + +

+
+

+ + +  Xpdf + + ® + +

+#{table_close} +WOK + end + def widget_googlegroups +< +
+ Google Groups + + Subscribe to SiSU e-docs +
+ Email: + + + + +
+ +
+
+ + Browse Archives + at + + groups-beta.google.com +
+WOK + end + def widget_sisu + v=SiSU_Env::Info_version.new.get_version +< +
+

+ + presentations' look and feel +
+ generated by +
+ + SiSU + +
+ + #{v[:project]} + +
+ version #{v[:version]} +
+ #{v[:date_stamp]} (#{v[:date]}) +
+
+

+ +
+

+ + Generated by + + SiSU + +
+ #{v[:project]} #{v[:version]} #{v[:date_stamp]} +
+ + www.jus.uio.no/sisu + +
+ Using: +
+ Standard SiSU markup syntax, +
+ Standard SiSU meta-markup syntax, and the +
+ Standard SiSU object citation numbering and system, (object/text positioning system) +
+ © Ralph Amissah 1997, current #{@date.year}. +
+ All Rights Reserved. +
+ SiSU is the result of several years of research and development in electronic + publishing, commenced in 1993 and under active development since 1997. +
+ SiSU is released under + + GPL 2 + + or later + + http://www.gnu.org/copyleft/gpl.html + +
+ (SiSU's first public release on January 4th 2005) +
+
+

+

+ + © Ralph Amissah +
+ 1993, current #{@date.year} +
+ All Rights Reserved +
+ w3 since October 3 1993 +
+ + ralph@amissah.com + +
+
+

+WOK + end + def widget_way_better + < + + Developed +
+ using + + Ruby + +
+ on + + Debian/Gnu/Linux + + software infrastructure, +
+ & with the usual GPL (or OSS) suspects. +
+ Better - "performance, reliability, scalability, security +
+ & total cost of ownership" +
+ [not to mention flexibility & choice] +
+
+ Get With the Future +
+ + Way Better! + +
+

+#{table_close} +#{table_close} +WOK + end + def widget_wayBetter + widget_way_better + end + #% credits + def credits_itl_cover_band + %{ +
+ +
+ +
+ + +
+ +
+ \@ +
+ #{txt_home} +
+ #{banner_url_txt_sisu} +
+
+#{table_close*4}} + end + def credits_splash + %{
+ + +
+ #{widget_sisu}#{widget_way_better}#{widget_browsers}#{widget_pdfviewers} +
+
} + end + #% bottom + def bottom_surround + %{
#{table_close} +
+ +
+#{table_close} + + #{banner_band} +#{table_close} + +
+ + + +} + end + def scroll(text) + if @md.fns =~ /\.[_-]?sst$/ + scroll=%{ +} + end + end + def seg(text) + %{ +} + end + def search + env=SiSU_Env::Info_env.new(@md.fns,@md) + env.widget.search_form + end + def manifest + %{} + end + def pdf + pdf=if @md.programs[:pdf] and @cf_defaults.cf_0 =~/p/ + %{ + + +} + else '' + end + end + def odf + odf=if @cf_defaults.cf_0 =~/o/ + %{ +} + else '' + end + end + def concordance(text) + if @md.concord_make or @cf_defaults.cf_0 =~/w/ + %{} + else '' + end + end + end + class Head_toc < Head_information + def initialize(md) + super(md) + @md=md + @tocband_scroll,@tocband_segtoc=make_scroll,make_seg + end + def scroll_head_navigation_band + pdf=if @md.programs[:pdf] + < + #{make_seg_scroll_pdf} + +WOK + else '' + end + %{
+ #{table_close} + + #{credits_splash} +#{table_close} + +} + end + end + class Home < Skin + def initialize + @v=SiSU_Env::Info_version.new.get_version + @dir=SiSU_Env::Info_env.new + end + def redirect + < +SiSU + + + +SiSU informtion provided at www.jus.uio.no/sisu/SiSU

+If your browser supports redirection, you will be escorted there shortly. + + +WOK + end + def index + < + + +SiSU information Structuring Universe - Structured +information, Serialized Units - software for electronic texts, +documents, books, digital libraries in plaintext, html, XHTML, XML, +ODF (OpenDocument), LaTeX, PDF, SQL (PostgreSQL and SQLite), and +for search + + + + + + + + + + + + + +

+

+ + SiSU >> + +

+

+ SiSU information Structuring Universe +

+

+ Structured information, Serialized Units +

+

+software for electronic texts, document collections, books, digital libraries, and search +

+

+ with "atomic search" and text positioning system (shared text citation numbering: "ocn") +

+

+outputs include: plaintext, html, XHTML, XML, ODF (OpenDocument), LaTeX, PDF, SQL (PostgreSQL and SQLite) +

+
+ +
+

+ + SiSU + +

+

+ --- +

+

+ + What does SiSU do? Summary + +

+

+ --- +

+

+ + Book Samples and Markup Examples + +

+

+ --- +

+

+ + Object Citation Numbering - ocn + +

+

(a text positioning system)

+

+ --- +

+

+ + Search - "granular" + +

+ Of interest is the ease of streaming documents to a relational database, at an object (roughly paragraph) level and the potential for increased precision in the presentation of matches that results thereby. The ability to serialise html, LaTeX, XML, SQL, (whatever) is also inherent in / incidental to the design. For a description see the + + abandoned U.S. provisional patent application + +

+

+ --- +

+

+ + Download + +

+

+ --- +

+

+ + Changelog + +

+

+ --- +

+

+ + License + +

+

+ Gnu / Linux / Unix +

+

+ ============= +

+

+ + sisu man pages + +

+

+ --- +

+

+ document preparation can be on any platform, in any editor: + (syntax highlight support currently for: vim, kate, write, gedit, diakonos) +

+

+ + Syntax highlighting + +

+

+ ============= +

+

+ + * Composite document + +

+

+ the composite document is a superset of the following documents: +

+

+ + SiSU description + +

+

+ + SiSU examples + +

+

+ + SiSU chronology + +

+

+ + SiSU technical + +

+

+ + SiSU FAQ + +

+

+ + SiSU download + +

+

+ + SiSU changelog + +

+

+ + SiSU license + +

+

+ + SiSU standard + +

+

+ + SiSU abandoned provisional patent + +

+

+ Note: the placement of SiSU documents on the Net predate the release of SiSU. +

+
+
+

+ For less markup than the most elementary HTML you can have more. +

+

SiSU - Structured information, Serialized Units for electronic documents, is an information structuring, transforming, publishing and search framework with the following features:

+

+(i) markup syntax: +(a) +simpler than html, +(b) +mnemonic, influenced by mail/messaging/wiki markup practices, +(c) human readable, and easily writable,

+

(ii) +(a) +minimal markup requirement, +(b) +single file marked up for multiple outputs,

+

+notes +

+

+* +documents are prepared in a single UTF-8 file using a minimalistic mnemonic syntax. Typical literature, documents like "War and Peace" require almost no markup, and most of the headers are optional. +

+

+* +markup is easily readable/parsed by the human eye, (basic markup is simpler and more sparse than the most basic html), [this may also be converted to XML representations of the same input/source document]. +

+

+* +markup defines document structure (this may be done once in a header pattern-match description, or for heading levels individually); basic text attributes (bold, italics, underscore, strike-through etc.) as required; and semantic information related to the document (header information, extended beyond the Dublin core and easily further extended as required); the headers may also contain processing instructions. +

+

(iii) +(a) +multiple outputs primarily industry established and institutionally accepted open standard formats, include amongst others: plaintext (UTF-8); html; (structured) XML; ODF (Open Document text)l; LaTeX; PDF (via LaTeX); SQL type databases (currently PostgreSQL and SQLite). Also produces: concordance files; document content certificates (md5 or sha256 digests of headings, paragraphs, images etc.) and html manifests (and sitemaps of content). + +(b) + +takes advantage of the strengths implicit in these very different output types, (e.g. PDFs produced using typesetting of LaTeX, databases populated with documents at an individual object/paragraph level, making possible granular search (and related possibilities))

+

(iv) +outputs share a common numbering system (dubbed "object citation numbering" (ocn)) that is meaningful (to man and machine) across various digital outputs whether paper, screen, or database oriented, (PDF, html, XML, sqlite, postgresql), this numbering system can be used to reference content.

+

+(v) +SQL databases are populated at an object level (roughly headings, paragraphs, verse, tables) and become searchable with that degree of granularity, the output information provides the object/paragraph numbers which are relevant across all generated outputs; it is also possible to look at just the matching paragraphs of the documents in the database; [output indexing also work well with search indexing tools like hyperesteier].

+

+(vi) + use of semantic meta-tags in headers permit the addition of semantic information on documents, (the available fields are easily extended)

+

+(vii) +creates organised directory/file structure for (file-system) output, easily mapped with its clearly defined structure, with all text objects numbered, you know in advance where in each document output type, a bit of text will be found (e.g. from an SQL search, you know where to go to find the prepared html output or PDF etc.)... there is more; easy directory management and document associations, the document preparation (sub-)directory may be used to determine output (sub-)directory, the skin used, and the SQL database used,

+

+(viii) +"Concordance file" wordmap, consisting of all the words in a document and their (text/ object) locations within the text, (and the possibility of adding vocabularies),

+

+(ix) +document content certification and comparison considerations: +(a) +the document and each object within it stamped with an md5 hash making it possible to easily check or guarantee that the substantive content of a document is unchanged, +(b) +version control, documents integrated with time based source control system, default RCS or CVS with use of $Id$ tag, which SiSU checks +

+(x) +SiSU's minimalist markup makes for meaningful "diffing" of the substantive content of markup-files,

+

+(xi) +easily skinnable, document appearance on a project/site wide, directory wide, or document instance level easily controlled/changed,

+

+(xii) +in many cases a regular expression may be used (once in the document header) to define all or part of a documents structure obviating or reducing the need to provide structural markup within the document,

+

+(xiii) +prepared files may be batch process, documents produced are static files so this needs to be done only once but may be repeated for various reasons as desired (updated content, addition of new output formats, updated technology document presentations/representations)

+

+(xiv) +possible to pre-process, which permits: the easy creation of standard form documents, and templates/term-sheets, or; building of composite documents (master documents) from other sisu marked up documents, or marked up parts, i.e. import documents or parts of text into a main document should this be desired

+

+there is a considerable degree of future-proofing, output representations are "upgradeable", and new document formats may be added. +

+

+(xv) +there is a considerable degree of future-proofing, output representations are "upgradeable", and new document formats may be added: +(a) +modular, (thanks in no small part to Ruby) another output format required, write another module.... +(b) easy to update output formats (eg html, XHTML, LaTeX/PDF produced can be updated in program and run against whole document set), +(c) easy to add, modify, or have alternative syntax rules for input, should you need to,

+

+(xvi) +scalability, dependent on your file-system (ext3, Reiserfs, XFS, whatever) and on the relational database used (currently Postgresql and SQLite), and your hardware,

+

+(xvii) +only marked up files need be backed up, to secure the larger document set produced,

+

+(xviii) +document management,

+

+(xix) +Syntax highlighting for SiSU markup is available for a number of text editors.

+

(xx) remote operations: +(a) +run SiSU on a remote server, (having prepared sisu markup documents locally or on that server, i.e. this solution where sisu is installed on the remote server, would work whatever type of machine you chose to prepare your markup documents on), +(b) +generated document outputs may be posted by sisu to remote sites (using rsync/scp) +(c) +document source (plaintext utf-8) if shared on the net may be identified by its url and processed locally to produce the different document outputs.

+

+(xxi) +document source may be bundled together (automatically) with associated documents (multiple language versions or master document with inclusions) and images and sent as a zip file called a sisupod, if shared on the net these too may be processed locally to produce the desired document outputs, these may be downloaded, shared as email attachments, or processed by running sisu against them, either using a url or the filename. +

+

+(xxii) +for basic document generation, the only software dependency is Ruby, and a few standard Unix tools (this covers plaintext, html, XML, ODF, LaTeX). To use a database you of course need that, and to convert the LaTeX generated to PDF, a LaTeX processor like tetex or texlive. +

+

+as a developers tool it is flexible and extensible +

+
+

+More information on SiSU provided at www.jus.uio.no/sisu/SiSU

+
+
+

+SiSU ("SiSU information Structuring Universe" or "Structured information, Serialized Units"),1 is a Unix command line oriented framework for document structuring, publishing and search. Featuring minimalistic markup, multiple standard outputs, a common citation system, and granular search. +

+

+ Using markup applied to a document, SiSU can produce plain text, HTML, XHTML, XML, OpenDocument, LaTeX or PDF files, and populate an SQL database with objects2 (equating generally to paragraph-sized chunks) so searches may be performed and matches returned with that degree of granularity (e.g. your search criteria is met by these documents and at these locations within each document). Document output formats share a common object numbering system for locating content. This is particularly suitable for "published" works (finalized texts as opposed to works that are frequently changed or updated) for which it provides a fixed means of reference of content. +

+ +

+How it works +

+

+SiSU markup is fairly minimalistic, it consists of: a (largely optional) document header, made up of information about the document (such as when it was published, who authored it, and granting what rights) and any processing instructions; and markup within text which is related to document structure and typeface. SiSU must be able to discern the structure of a document, (text headings and their levels in relation to each other), either from information provided in the instruction header or from markup within the text (or from a combination of both). Processing is done against an abstraction of the document comprising of information on the document's structure and its objects,2 which the program serializes (providing the object numbers) and which are assigned hash sum values based on their content. This abstraction of information about document structure, objects, (and hash sums), provides considerable flexibility in representing documents different ways and for different purposes (e.g. search, document layout, publishing, content certification, concordance etc.), and makes it possible to take advantage of some of the strengths of established ways of representing documents, (or indeed to create new ones).

+

+1. also chosen for the meaning of the Finnish term "sisu". +

+

+2 objects include: headings, paragraphs, verse, tables, images, but not footnotes/endnotes which are numbered separately and tied to the object from which they are referenced.

+

+ More information on SiSU provided at: + + www.jus.uio.no/sisu/SiSU + +

+SiSU was developed in relation to legal documents, and is strong across a wide variety of texts (law, literature...(humanities, law and part of the social sciences)). SiSU handles images but is not suitable for formulae/ statistics, or for technical writing at this time.

+

+SiSU has been developed and has been in use for several years. Requirements to cover a wide range of documents within its use domain have been explored.

+

+ +ralph@amissah.com + +

+

+ +ralph.amissah@gmail.com + +

+

+2007 +

+

+w3 since October 3 1993 +

+
+ + +WOK + end + def home_toc + ' ' + end + end + class Inserts + end + class TeX < Skin + def initialize(papersize='') + @papersize=papersize + #@vz=SiSU_Env::Get_init.instance.skin #used within skins, however pulls in much that is not otherwise needed + end + def a4 + def portrait + def w + 160 + end + def h + 228 + end + def img_px + 450 + end + self + end + def landscape + def w + 262 + end + def h + 168 + end + def img_px + 348 + end + self + end + self + end + def letter + def portrait + def w + 166 + end + def h + 216 + end + def img_px + 468 + end + self + end + def landscape + def w + 234 + end + def h + 166 + end + def img_px + 310 + end + self + end + self + end + def legal + def portrait + def w + 168 + end + def h + 294 + end + def img_px + 474 + end + self + end + def landscape + def w + 314 + end + def h + 166 + end + def img_px + 420 + end + self + end + self + end + def b5 + def portrait + def w + 126 + end + def h + 180 + end + def img_px + 356 + end + self + end + def landscape + def w + 216 + end + def h + 136 + end + def img_px + 280 + end + self + end + self + end + def a5 + def portrait + def w + 100 + end + def h + 144 + end + def img_px + 280 + end + self + end + def landscape + def w + 176 + end + def h + 110 + end + def img_px + 230 + end + self + end + self + end + def dimensions + d=case @papersize + when /a4/; a4 + when /letter/; letter + when /legal/; legal + when /b5/; b5 + when /a5/; a5 + else a4 + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/digests.rb b/lib/sisu/0.52/digests.rb new file mode 100644 index 00000000..8aedbc62 --- /dev/null +++ b/lib/sisu/0.52/digests.rb @@ -0,0 +1,364 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: document digests (md5|sha256) and structure processing + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Notes: tidy -ascii index.xml >> index.tidy + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Digest_view + require SiSU_lib + '/dal' + require SiSU_lib + '/sysenv' + require SiSU_lib + '/i18n' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + pwd=Dir.pwd + class Source + @@dg=nil + def initialize(opt) + @opt=opt + @fnb=@opt.fnb + @@endnotes_para=[] + @@dg=nil + @dg=@@dg ||=SiSU_Env::Info_env.new.digest.type + @env=SiSU_Env::Info_env.new(@opt.fns) + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get + tool=if @opt.cmd =~/[MVv]/; "#{@env.program.text_editor} #{@env.path.output_tell}/#{@md.fnb}/#{@md.fn[:digest]}" + else '' + end + tell=SiSU_Screen::Ansi.new(@opt.cmd,"Document #@dg Digests",tool) + tell.green_hi_blue unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#{@md.fnb}/#{@md.fn[:digest]}") + tell.flow if @opt.cmd =~/[MV]/ + my_make=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns) + @dal_array=SiSU_DAL::Source.new(@opt).get # dal file drawn here + SiSU_Digest_view::Source::Scroll.new(@dal_array,@md).songsheet + SiSU_Env::Info_skin.new(@md).select + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + private + class Scroll <([0-9a-f]{#@dl}):([0-9a-f]{#@dl})>/ + ocn,h1,h2,d_clean,d_all=$1,$2,$3,$4,$5 + @ocn=ocn unless ocn.to_i == 0 + if para=~/~\{[\d*+]+.+?<[0-9a-f]{#@dl}>\}~/ + para_endnotes << para.scan(/~[{\[]([\d*+]+).+?<([0-9a-f]{#@dl})>[}\]]~/) + end + ima=[] + if para =~/\{(\S+\.(png|jpg|gif))\s.+?\}(?:(?:https?|ftp):\/\/\S+|image)/ + images=para.scan(/\{(\S+\.(?:png|jpg|gif))\s.+?\}(?:(?:https?|ftp):\/\/\S+|image)/).flatten + else image=nil + end + x=case para + when /^0~title/ + "\n" + ' '*0 +'@' + ' '*9 + when /^0~subtitle/ + "\n" + ' '*1 +'@' + ' '*8 + when /^1~/ + "\n" + ' '*2 +':A ' + ' '*6 +'- ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + when /^2~/ + "\n" + ' '*3 +':B ' + ' '*5 +'- ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + when /^3~/ + "\n" + ' '*4 +':C ' + ' '*4 +'- ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + when /^4~/ + "\n" + ' '*5 +'1' + ' '*4 +'- ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + when /^5~/ + "\n" + ' '*6 +'2' + ' '*3 +'- ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + when /^6~/ + "\n" + ' '*7 +'3' + ' '*2 +'- ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + else + if para =~/MD5\(\S+?\.sst\)=\s*([0-9a-f]{#@dl})<\/u>/ #watch + @n,@s=/MD5\((\S+?\.sst)\)=\s*([0-9a-f]{#@dl})<\/u>/.match(para)[1,2] + end + x=unless ocn =~ /^0$/ + if images and images.length > 0 # then get path of image & produce digest + @image_name,@image_dgst,@img=[],[],[] + images.each do |i| + image_source=if FileTest.file?("#{@env.path.image_source_local_tex}/#{i}") + @env.path.image_source_local_tex + elsif FileTest.file?("#{@env.path.image_source_remote_tex}/#{i}") + @env.path.image_source_remote_tex + elsif FileTest.file?("#{@env.path.image_source_tex}/#{i}") + @env.path.image_source_tex + else + tell=SiSU_Screen::Ansi.new(@md.cmd,"ERROR - image:", %{"#{i}" missing}, "search locations: #{@env.path.image_source_local_tex}, #{@env.path.image_source_remote_tex} and #{@env.path.image_source_tex}") + tell.error2 unless @md.cmd =~/q/ + nil + end + @img << /\S+\.(png|jpg|gif)/.match(i)[1] + not_found_msg='image not found' + if image_source + para_image = image_source + '/' + i + @image_name << i + @image_dgst << if @dg =~/^sha(?:2|256)$/; sys.sha256(para_image) + else sys.md5(para_image) + end + else + @image_name << ' '*16 + i + ' [image missing]' + @image_dgst << '' + @image_dgst[1]=not_found_msg + ' '*(32-not_found_msg.length) + end + end + line= "\n" + ' '*9 + ' - ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + "\n" + line_image=[] + c=0 + @image_name.each do |ok| + line_image << %{ #{@img[c]} #{@image_dgst[c][1]} #{@image_name[c]}} + c +=1 + end + line=line + line_image.join("\n") + else "\n" + ' '*9 + ' - ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + end + else + prefix='' + metad=[@tr.dc_title,@tr.creator,@tr.translator,@tr.illustrator,@tr.prepared_by,@tr.digitized_by,@tr.description,@tr.subject,@tr.abstract,@tr.publisher,@tr.contributor,@tr.date_created,@tr.date_issued,@tr.date_available,@tr.date_modified,@tr.date_valid,@tr.date,@tr.type,@tr.format,@tr.rights,@tr.identifier,@tr.source,@tr.language,@tr.language_original,@tr.relation,@tr.coverage,@tr.keywords,@tr.comments,@tr.cls_loc,@tr.cls_dewey,@tr.cls_gutenberg,@tr.cls_isbn,@tr.prefix_a,@tr.prefix_b,@tr.sourcefile,@tr.sourcefile_digest,@tr.last_generated,@tr.sisu_version,@tr.ruby_version,@tr.sc_number,@tr.sc_date,'Skin_Digest: ','Generated by: ','Ruby version: '] + metad.each do |n| + m=rgx_txt(n) + if m=~/\S+/ and para=~/^#{m}:/ + x,o=0,18 + while x < 2; o = o + 2 + x=o - n.length + end + space=' '*x + prefix="#{n.downcase}#{space}" + break + else prefix=' '*9 + end + end + m_dc_title=rgx_txt(@tr.dc_title) + m_creator=rgx_txt(@tr.creator) + m_sourcefile_digest=rgx_txt(@tr.sourcefile_digest) + m_sisu_version=rgx_txt(@tr.sisu_version) + m_last_generated=rgx_txt(@tr.last_generated) + m_ruby_version=rgx_txt(@tr.ruby_version) + case para + when /#{m_dc_title}: / + @t=/#{m_dc_title}: (.+?)<~\d;(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#@dl}:[0-9a-f]{#@dl}>/.match(para)[1].gsub(/<\/?u>/,'').strip + when /#{m_creator}: / + @c=/#{m_creator}: (.+?)<~\d;(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#@dl}:[0-9a-f]{#@dl}>/.match(para)[1].gsub(/<\/?u>/,'').strip + when /#{m_sourcefile_digest}.+?/ #watch + dgst_extra="\n" + ' '*21 +'source' +' '*4 + @md.dgst[1] + ' '*34 + @md.fns + when /Skin_Digest: / + dgst_extra="\n" + ' '*21 + 'skin' +' '*6 + @md.dgst_skin[1] + ' '*34 + /(skin_\S+?\.rb)/.match(@md.dgst_skin[0])[1] + when /#{m_sisu_version}: / + @v=/#{m_sisu_version}: (.+?)<~\d;(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#@dl}:[0-9a-f]{#@dl}>/.match(para)[1].gsub(/<\/?u>/,'').strip + when /#{m_last_generated}: / + @g=/#{m_last_generated}: (.+?)<~\d;(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#@dl}:[0-9a-f]{#@dl}>/.match(para)[1].gsub(/<\/?u>/,'').strip + # 'doc last generated' + when /#{m_ruby_version}: / + @r=/#{m_ruby_version}: (.+?)<~\d;(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#@dl}:[0-9a-f]{#@dl}>/.match(para)[1].gsub(/<\/?u>/,'').strip + end + dgst_extra ||='' + "\n" + prefix +' - ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + dgst_extra + "\n" + end + end + para_endnotes[0].each { |e| y << "\n" + ' '*(28-e[0].length) + "[#{e[0].to_s}] #{e[1].to_s}" } if para_endnotes[0] + if y; digests(x,y) + else digests(x) + end + end + end + manifest="#{@env.url.root}/#{@md.fnb}/sisu_manifest.html" + a=%{level (if any), ocn: digest clean (no markup/notes), digest all (includes markup & endnotes)\n [endnote number] endnote digest clean\n} + description("#@t\n") + description("#@c\n") + description("#{@md.fns}\n") + description("----------------------------------------------\n") + description("SiSU Document Content Certificate (Digest/DCC)\n") + description("----------------------------------------------\n") + description(" #@dg digests\n") + description("------------\n") + description("Sourcefile digest: #@s\n") + description(" source filename: #@n\n") + description("available outputs: #{manifest}\n") + description(" time generated: #@g\n") + description(" SiSU version used: #@v\n") + description(" Ruby version used: #@r\n") + description("------------\n") + description("Document Digest Tree (from dal):\n") + description(a) + #digests("------------\n") + #digests("#@v\n") + #digests("#@g\n") + #digests("#@r\n") + end + def dal_structure + #there will be a docubook mapping header, fairly complex variations + data=@data + l=Hash.new(0) + dal_structure1("------------\n") + dal_structure1("document structure[*]\n") + ocn,endnotes=nil,nil + data.each do |para| + x=case para + when /^0~/; l[0] +=1 + if para =~/^0~title/; '' #' '*0 +'@ == headers' + "\n" + ' '*0 +'headings:' + end + when /^1~/; l[1] +=1 + ' '*0 +':A' + when /^2~/; l[2] +=1 + ' '*1 +':B' + when /^3~/; l[3] +=1 + ' '*2 +':C' + when /^4~/; l[4] +=1 + ' '*3 +'1' + when /^5~/; l[5] +=1 + ' '*4 +'2' + when /^6~/; l[6] +=1 + ' '*5 +'3' + else nil + end + if para =~/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#@dl}:[0-9a-f]{#@dl}>/ + ocn=$1 unless $1.to_i == 0 + end + if para =~/~[{\[]([\d*+]+).+?<[0-9a-f]{#@dl}>[}\]]~/ + endnotes=$1 unless $1.to_i == 0 + end + dal_structure1("#{x}\n") if x and not x.empty? + end + dal_structure1(" [*] heading levels\n") + dal_structure2("------------\n") + dal_structure2("document structure[*]\n") + [0,1,2,3,4,5,6].each do |y| + v=case y.to_s + when /0/; '@ ' + when /1/; ':A' + when /2/; ':B' + when /3/; ':C' + when /4/; '1 ' + when /5/; '2 ' + when /6/; '3 ' + end + dal_structure2("#{v} = #{l[y]}\n") if l[y] > 0 + end + dal_structure2("objects (ocn) = #{ocn}\n") + dal_structure2("endnotes = #{endnotes}\n") + dal_structure2(" [*] number of headers (@) and of each heading level (:A to :C and 1 to 3)\n") + end + def supplementary + if defined? @md.sc_number and @md.sc_number + rcinfo("------------\n") + rcinfo("source control information\n") + rcinfo(" (the following information while not important for document content certification\n may help the publisher in locating the version referred to)\n") + rcinfo(" rcs version number: #{@md.sc_number}\n") + if defined? @md.sc_date and @md.sc_date + rcinfo(" rcs date: #{@md.sc_date}\n") + end + if defined? @md.sc_time and @md.sc_time + rcinfo(" rcs time: #{@md.sc_time}\n") + end + end + rcinfo("------------\n") + rcinfo("Note: the time generated related fields (text and digests) will vary between otherwise identical document outputs\n") + end + end + end +end +__END__ + diff --git a/lib/sisu/0.52/docbook.rb b/lib/sisu/0.52/docbook.rb new file mode 100644 index 00000000..a58eb17d --- /dev/null +++ b/lib/sisu/0.52/docbook.rb @@ -0,0 +1,561 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: xml (dom style) output processing + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com + + * Notes: tidy -xml dom.xml >> index.tidy +=end +module SiSU_Docbook + require SiSU_lib + '/defaults' + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/sysenv' + include SiSU_Env + require SiSU_lib + '/dal' + require SiSU_lib + '/shared_xml' + require SiSU_lib + '/xml_format' + include SiSU_XML_format + include SiSU_XML_munge + require SiSU_lib + '/rexml' + include SiSU_Rexml + @@alt_id_count,@@tablehead,@@number_of_cols=0,0,0 + @@tablefoot='' + class Source + def initialize(opt) + @opt=opt + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get + @env=SiSU_Env::Info_env.new(@opt.fns) + path=@env.path.output_tell + loc=@env.url.output_tell + tool=if @opt.cmd =~/[MV]/; "#{@env.program.web_browser} #{loc}/#{@md.fnb}/#{@md.fn[:docbook]}\n\t#{@env.program.xml_viewer} #{path}/#{@md.fnb}/#{@md.fn[:docbook]}" + elsif @opt.cmd =~/v/; "#{@env.program.web_browser} #{loc}/#{@md.fnb}/#{@md.fn[:docbook]}" + else '' + end + tell=SiSU_Screen::Ansi.new(@opt.cmd,'invert','XML DOM',tool) + tell.colorize unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#{@md.fnb}/#{@md.fn[:docbook]}") + tell.flow if @opt.cmd =~/[MV]/ + @dal_array=SiSU_DAL::Source.new(@opt).get # dal file drawn here + SiSU_Docbook::Source::Songsheet.new(@dal_array,@md,@env).songsheet + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure #file closed in songsheet + end + end + private + class Songsheet + def initialize(data,md='',dir='') + @data,@md,@env=data,md,dir + end + def songsheet + begin + SiSU_Docbook::Source::Scroll.new(@data,@md).songsheet + SiSU_Docbook::Source::Tidy.new(@md,@env).xml if @md.cmd =~/[vVM]/i # test wellformedness, comment out when not in use + SiSU_Rexml::Rexml.new(@md,@md.fn[:docbook]).xml if @md.cmd =~/M/ # test rexml parsing, comment out when not in use #debug + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + end + end + end + class Scroll + Heading,Heading_close,Contents=[],[],[] + Heading[0]='part' + Heading[1]='part level="1"' + Heading[2]='part level="2"' + Heading[3]='part level="3"' + Heading_close[1]=Heading[0] + Heading_close[2]=Heading[0] + Heading_close[3]=Heading[0] + #Contents[0]='preface' + Contents[1]='chapter' + Contents[2]='sect1' + Contents[3]='sect2' + @@xml={ :body=>[],:open=>[],:close=>[],:head=>[],:sc=[] } + @@dp=nil + require SiSU_lib + '/shared_txt' + include SiSU_text_utils + def initialize(data='',md='') + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + @regx=/^(?:(?:<:p[bn]>\s*)?\d~(?:(\S+))?\s+)?(.+?)\s*<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + @tab="\t" + @trans=SiSU_XML_munge::Trans.new(@md) + @sys=SiSU_Env::System_call.new + end + def songsheet + pre + markup + post + publish + end + protected + def xml_markup(para='') + para.gsub!(/~\{(\d+)\s+(.+?)\s*<#@dp>\}~/, + '\1 \2 ') + end + def xml_head(meta) + txt=meta.text + txt.gsub!(//,'') + txt.gsub!(/ & /,' and ') + @@xml[:head] <<=if meta.type == 'meta' + < +#{@tab*2}#{txt} +#{@tab} +WOK + else '' + end + end + def xml_sc(md='') + sc=if @md.sc_info + < + + #{@md.sc_filename} + + + #{@md.sc_number} + + + #{@md.sc_date} + + +WOK + else '' + end + @@xml[:sc]=sc + end + def xml_element(lv='',ocn='',para='',hname='',tag='',xml_element='') + lv=lv.to_i + n=lv - 1 + n1=lv + n2=lv + 1 + n3=lv + 2 + v=lv - 3 + tag='' + tag="\n#{@tab*n3}#{hname}\n" if hname + @@xml[:body] <<<#{para[@regx, 2]} +WOK + if lv == 4 + @copen[1]=true + @copen[2]=@copen[3]=false + elsif lv == 5 + @copen[2]=true + @copen[3]=false + elsif lv == 6 + @copen[3]=true + end + end + def xml_structure(lv='',ocn='',para='',hname='' ) + lv=lv.to_i + n=lv - 1 + n1=lv + n2=lv + 1 + n3=lv + 2 + v=lv - 3 + tag='' + tag="\n#{@tab*n3}#{hname}\n" if hname !=nil + #if para[@regx] + # paragraph="#{para[@regx, 2]}" + # util=SiSU_text_utils::Paragraph.new(paragraph, 70) + # wrapped=util.line_wrap + #end + case lv + when 1..3 + xml_element="<#{Heading[lv]}>" + 3.downto(lv) do |x| + y=x - 1 + @cont[1]=false if @cont[1] + @cont[2]=false if @cont[2] + @cont[3]=false if @cont[3] + ####### attempt to close contents + if @copen[3] # 6~ + [3,2,1].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[2] # 5~ + [2,1].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[1] # 4~ + [1].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + @copen[1]=@copen[2]=@copen[3]=false + end + @@xml[:body] << "#{@tab*y}\n" if @level[x] + @level[x]=false + end + when 4..6 + 6.downto(lv) do |x| + y=x - 1 + if @level[x] == true + u=x - 3; + @xml_contents_close[x]='' + end + end + cv=lv - 3 + if para =~/^4~\S+/ + m=/^4~(\S+)/.match(para)[1] + id=if m =~/^\d+$/; 'ch' + m + else 'ch_' + m + end + elsif para =~/^5~\S+/ + m=/^5~(\S+)/.match(para)[1] + id= 'sec_' + m + elsif para =~/^6~\S+/ + m=/^6~(\S+)/.match(para)[1] + id= 'subsec_' + m + else '' + end + xml_element=%{<#{Contents[cv]} id="#{id}">} #hmmm gsub were it possible + case lv + when 4 + if @copen[3] == true # 6~ + [3,2,1].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + elsif @copen[2] == true # 5~ + [2,1].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + elsif @copen[1] == true # 4~ + [1].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + end + @cont[1]=true + when 5 + if @copen[3] == true #6~ + [3,2].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + elsif @copen[2] == true #5~ + [2].each do |v| + @@xml[:body] << "#{@tab*n}\n" + end + end + @cont[2]=true + when 6 + [3].each do |v| + @@xml[:body] << "#{@tab*n}\n" if @copen[3] #watch should possibly be outside... + end + @cont[3]=true + end + end + xml_element(lv,ocn,para,hname,tag,xml_element) + @level[lv]=true + ((lv+1)..6).each { |x| @level[x]=false } + end + def group_structure(para='',ocn='') + para.gsub!(/<:group(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*7}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}\n} + end + def poem_structure(para='',ocn='') + para.gsub!(/<:verse(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*7}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}\n} + end + def code_structure(para='',ocn='') + para.gsub!(/<:code(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*7}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}\n} + end + #def table_structure(table='',ocn='') #tables + # @@xml[:body] << %{#{@tab*1}#{table}\n#{@tab*1}\n} # unless lv # main text, contents, body KEEP #{ocn} + # @endnotes=[] + #end + def tidywords(wordlist) + wordlist.each do |x| + x.gsub!(/&/,'&') unless x =~/&\S+;/ + end + end + def markup + data=@data + dir=SiSU_Env::Info_env.new(@md.fns) + xml_sc(@md) + @rcdc=false + @level,@cont,@copen,@xml_contents_close=[],[],[],[] + (0..6).each { |x| @cont[x]=@level[x]=false } + (4..6).each { |x| @xml_contents_close[x]='' } + data.each do |para| + wordlist=para.scan(/\S+|\n/) #\n needed for tables, check though added 2005w17 + para=tidywords(wordlist).join(' ').strip + para.gsub!(/<[-~]#>/,'') + para.gsub!(/<0;\w\d+;[um]\d+><#@dp:#@dp>/,'') + para.gsub!(/<:pb>\s*/,'') + para.gsub!(/\{(\S+?\.(?:png|jpg|gif)) .+?\}(?:(?:https?|ftp):\/\/\S+|image)/, + %{}) + #para.gsub!(/\{(\S+?\.png) \d+x\d+ \".+?\" \}(?:http:\/\/\S+|image)/,'\1') + para.gsub!(/ /,' ') + @trans.char_enc.utf8(para) if @sys.locale =~/utf-?8/i #% utf8 + if para =~/^0~(\S+)\s+(.+?)\Z/m # for headers + d_meta=SiSU_text_utils::Header_scan.new(@md,para).meta + if d_meta; xml_head(d_meta) + end + end + @rcdc=true if @rcdc ==false and (para =~/^\d~metadata/ or para =~/^1~\s+Document Information/) + if para !~/(^0~||)/ + if para =~/.+?<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + paranum=para[@regx, 3] + @p_num=SiSU_XML_format::Paragraph_number.new(@md,paranum) + end + @sto=SiSU_text_parts::Split_text_object.new(@md,para).lev_segname_para_ocn + ### problem in scroll, it appears tables are getting paragraph numbers + unless @rcdc + m=/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if para =~m + format_scroll=SiSU_XML_format::Format_scroll.new(@md,@sto.text) if @sto.format =~/i[12]|null/ + case @sto.format + when /^(1)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body1 + when /^(2)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body2 + when /^(3)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)/ # work on see SiSU_text_parts::Split_text_object + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body4 + when /^(5)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body5 + when /^(6)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body6 + #when /^(i1)$/ + # #format_scroll.gsubBody + # #para=@sto.lev_para_ocn.scrIndent1 + #when /^(i2)$/ + # format_scroll.gsubBody + # para=@sto.lev_para_ocn.scrIndent2 + #when /^(center)$/ + # para.gsub!(/(.+)/, + # %{
(\\1)
}) + # para=@sto.lev_para_ocn.scrPara + #when /^(b|bold)$/ + # para.gsub!(/(.+)/, + # %{(\\1)}) + # para=@sto.lev_para_ocn.scrPara + #when /null/ # see whether u can improve + # if (para !~/#{@margin.txt_0}|#{@margin.txt_1}|#{@margin.txt_2}/) + # #format_scroll.gsubBody + # #para=@sto.lev_para_ocn.scrPara + # end + else + matched=/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/mi.match(para) + stamp,ocn=matched[0],matched[1] + if para =~ /<:verse>/ + para.gsub!(/#{stamp}/,'') + poem_structure(para,ocn) + elsif para =~ /<:group>/ + para.gsub!(/#{stamp}/,'') + group_structure(para,ocn) + elsif para =~ /<:code>/ + para.gsub!(/#{stamp}/,'') + code_structure(para,ocn) + elsif para =~/#{para[@regx, 2]}\n" if para[@regx, 2] # main text, contents, body KEEP ocn = #{para[@regx, 3]} == #{ocn} + end + end + elsif para =~/(Note|Endnotes?)/ and para !~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + #format_scroll=MonoSiSU.new('
Note') + #para=format_scroll.boldPara + elsif para =~/(MetaData)/ and para =~/<~\d+;[m]\d+;\w\d+><#@dp:#@dp>$/ #debug 2003w46 add rc info + format_scroll=Format_scroll.new(@md,'
MetaData') + para=format_scroll.bold_para + elsif para =~/(Owner Details)/ and para !~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + format_scroll=Format_scroll.new(@md,'
Owner Details') + @@xml[:owner_details]=format_scroll.bold_para + para='' + elsif para =~/(.*)<:#>(.*)/ + one, two=$1,$2 + format_text=Format_text_object.new(one,two) + para=format_text.seg_no_paranum + end + para='' if para =~// and para =~/^(-\{{2}~\d+|)/ # -endnote + if para =~/.*<:#>.*$/ + para=case para + when /<:i1>/ + format_text=Format_text_object.new(para,'') + format_text.scr_inden_ocn_e_no_paranum + when /<:i2>/ + format_text=Format_text_object.new(para,'') + format_text.scr_inden_ocn_e_no_paranum + end + end + if para =~/<:center>/ + one, two=/(.*)<:center>(.*)/.match(para)[1,2] + format_text=Format_text_object.new(one, two) + para=format_text.center + end + else + end + para.gsub!(/<:\S+?>/,'') + para.gsub!(//,' ') + end + end + @content_flag=true + 6.downto(4) do |x| + y=x - 1; v=x - 3 + if @level[x] == true #2004w36 bug fix? watch/test previous logic broke on free.for.all @coontent_flag introduced + if @content_flag==true + @@xml[:body] << "\n#{@tab*y}\n" + @content_flag=false + else + @@xml[:body] << "\n#{@tab*y}\n" + end + end + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}\n" if @level[x] == true + end + end + def pre + rdf=SiSU_XML_tags::RDF.new(@md) + dir=SiSU_Env::Info_env.new + css=SiSU_Env::CSS_select.new(@md).docbook_xml + encoding=' +' + #encoding='' + @@xml[:open] =< +#{rdf.comment_xml} + +WOK + @@xml[:head] << "\n" + end + def post + @@xml[:head] << @@xml[:sc] + @@xml[:head] << "\n" + @@xml[:close] = "\n" + end + def publish + content=[] + data=@data + content << @@xml[:open] << @@xml[:head] << @@xml[:body] << @@xml[:metadata] + content << @@xml[:owner_details] if @md.stmp =~/\w\w/ + content << @@xml[:tail] << @@xml[:close] + Output.new(content.to_s,@md).xml + @@xml[:head],@@xml[:body],@@xml[:tail]=[],[],[] + end + end + class Output + include SiSU_Param + def initialize(data,md) + @data,@md=data,md + end + def xml + @sisu=[] + @data.each do |para| + para.gsub!(/<:\S+?>/,'') + para.gsub!(//,'') + para="#{para}\n" unless para.empty? + @sisu << para + end + new_file_data=@sisu.to_s + @sisu=new_file_data.scan(/.+/) + SiSU_Env::SiSU_file.new(@md).mkdir + filename_xml=SiSU_Env::SiSU_file.new(@md,@md.fn[:docbook]).mkfile + @sisu.each {|para| filename_xml.puts para} + filename_xml.close + end + end + class Tidy + def initialize(md,dir) + @md,@env=md,dir + @prog=SiSU_Env::Info_program.new + end + def xml + if @prog.tidy !=false + if @md.cmd =~/[VM]/ + tell=SiSU_Screen::Ansi.new(@md.cmd,'invert','Using XML Tidy','check document structure') + tell.colorize unless @md.cmd =~/q/ + tell.grey_open unless @md.cmd =~/q/ + tidyfile='/dev/null' #don't want one or screen output, check for alternative flags + tidy=SiSU_Env::System_call.new("#{@env.path.output}/#{@md.fnb}/#{@md.fn[:docbook]}",tidyfile) + tidy.well_formed? + tell.p_off unless @md.cmd =~/q/ + end + end + end + end + end +end +__END__ + diff --git a/lib/sisu/0.52/errors.rb b/lib/sisu/0.52/errors.rb new file mode 100644 index 00000000..a6646c8a --- /dev/null +++ b/lib/sisu/0.52/errors.rb @@ -0,0 +1,72 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: system environment, error screen reporting + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Errors + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Screen + class Info_error + ------------------------------------------ + #{@cX.green}~##{@cX.off} unnumbered paragraph (place marker at end of paragraph) + #{@cX.green}-##{@cX.off} unnumbered paragraph, delete when not required (place marker at end of paragraph) [used in dummy headings, eg. for segmented html] + ------------------------------------------ + manual page breaks (LaTeX/pdf) + #{@cX.green}<:pb>#{@cX.off} page break, which breaks a page, starting a new page in single column text and a new column in double column text + #{@cX.green}<:pn>#{@cX.off} page new, which starts a new page, in both single and double column text (leaving an empty column in double column text if necessary). + Note: page breaks are usually introduced to pdfs either as header instructions, indicating that pages should break at given levels + ------------------------------------------ + #{@cX.cyan}Composite documents#{@cX.off} + It is possible to build a document by requiring other documents. The documents required may complete documents that could be generated independently, or they could be markup snippets, prepared so as to be easily available to be placed within another text. If the calling document is a master document (built mainly from other documents), by convention it should be named with the suffix .ssc or .ssm The documents called if complete documents would have the suffix .sst, [.ssf, or .ssd], and if markup snippets .ssi. A temporary file of the composite document is built prior to processing with the same prefix and the suffix ._sst There are a number of alternative syntaxes for requiring external documents in order to permit use of ascii hypertext linking available in the vim editor. They are as follows (place at start of line): + + #{@cX.cyan}#basic sisu markup alternatives#{@cX.off} + #{@cX.green}{#{@cX.off}filename.si#{@cX.green}}require#{@cX.off} + #{@cX.green}<< {#{@cX.off}filename.si#{@cX.green}}#{@cX.off} + + #{@cX.cyan}#using textlink alternatives#{@cX.off} + #{@cX.green}|#{@cX.off}filename.si#{@cX.green}|@|^|require#{@cX.off} + #{@cX.green}<< |#{@cX.off}filename.si#{@cX.green}|@|^|#{@cX.off} + + #{@cX.cyan}#using thlnk alternatives#{@cX.off} + #{@cX.green}require#{@cX.off} + #{@cX.green}<< #{@cX.off} + + #{@cX.cyan}Composite documents - remote parts#{@cX.off} + Composite documents may be built from remote parts, by using the composite document syntax with a url. This makes sense using either sisu regular syntax (which is just a convenient way of marking up), or thlnk syntax, which also recognises remote urls, and permits hyperlinking ascii to the url location. + + #{@cX.cyan}Remote documents#{@cX.off} + SiSU will download and process remote locations if a url is provided instead of a filename. [this at present works only for sisu markup files without images] + + ------------------------------------------ + #{@cX.green}%#{@cX.off}#{@cX.off} add a comment to text, that will be removed prior to processing (place marker at beginning of line) + #{@cX.green}\\#{@cX.off}#{@cX.off} escape a sepcial character, whether general: { } < > or contextual special characters, (in combination with other characters) ~ - _ / % ^ and occasionally ! # + , + #{@cX.green}%%#{@cX.off}#{@cX.off} same as above but recognised by vim folds for placing fold in document text, in addition to headers and headings + ------------------------------------------ + + #{@cX.ruby}More HELP on Markup#{@cX.off} markup help is available on: + document wide instructions: headers (document structure) + general text markup: headings; endnotes; tables (which also includes a note on preformatted text) + configuration and customisation + document or site wide customisation: customise; skin +WOK + help_markup +# {../_sisu/image/tux.png http://www.jus.uio.no/sisu/ w=64 c=\"a better way\" }:image depreciated image eg +# old form + end + def example + help_markup + end + def example37 + print <to bold to indent for superscript for subscript text + +_1 at the beginning of a line indents the paragraph + +_2 at the beginning of a line double indents the paragraph + +Others include + +Other things to note: + +By default paragraphs are automatically numbered... and is the same across all output formats +This makes citation a lot easier... regardless of the form of output that is being looked at +It also permits the building of various addons, like the concordance feature which identifies each word and the paragraphs in which the word appears with links to the paragraph... + +Urls are automatically turned to live links in the html and pdf files created... +WOK + end + end +end +__END__ + diff --git a/lib/sisu/0.52/html.rb b/lib/sisu/0.52/html.rb new file mode 100644 index 00000000..cb6718d3 --- /dev/null +++ b/lib/sisu/0.52/html.rb @@ -0,0 +1,719 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: html generation, processing + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_HTML + require 'pstore' + require SiSU_lib + '/defaults' + require SiSU_lib + '/html_table' + require SiSU_lib + '/html_format_css' + require SiSU_lib + '/html_segments' + require SiSU_lib + '/html_scroll' + require SiSU_lib + '/html_promo' + include SiSU_HTML_seg + include SiSU_HTML_Format_type + include SiSU_HTML_promo + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/html_tune' + include SiSU_Tune + require SiSU_lib + '/dal' + require SiSU_lib + '/shared_xml' + class Source + def initialize(opt) + @opt=opt + end + def read + songsheet + end + def songsheet + begin + @md=SiSU_Param::Parameters.new(@opt).get + @fnb=@md.fnb + @env=SiSU_Env::Info_env.new(@opt.fns) + loc=@env.url.output_tell + tool=if @opt.cmd =~/z/; "#{@env.program.web_browser} #{loc}/#@fnb/#{@md.fn[:index]}" + elsif @opt.cmd =~/[MVv]/; "#{@env.program.web_browser} #{loc}/#@fnb/#{@md.fn[:index]}" + else '' + end + SiSU_Screen::Ansi.new(@opt.cmd,'HTML',tool).green_hi_blue unless @opt.cmd =~/q/ + SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#@fnb/#{@md.fn[:index]}").flow if @opt.cmd =~/[MV]/ + SiSU_Env::Info_skin.new(@md).select + data=nil + unless @md.markup =~/url_png/ + my_make=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns,@md) #Beware #FIX opt and md, both not necessary + SiSU_Env::SiSU_file.new(@md).mkdir + @tuned_file_array=SiSU_HTML::Source::Html_environment.new(@md).tuned_file_instructions + data=@tuned_file_array + else + data=IO.readlines(@opt.fns,'') #wasteful, not really necessary? + SiSU_HTML_nav_tune::Tune.new(data,@md).songsheet + @tuned_file_array=data #watch may not be what you want + end + scr_endnotes=SiSU_HTML::Source::Endnotes.new(data,@md).scroll unless @md.markup =~/url_png/ + toc=SiSU_HTML::Source::Toc.new(data,@md).songsheet + doc_ver=SiSU_HTML::Source::Links_guide.new(data,@md).doc_versions + links_guide=SiSU_HTML::Source::Links_guide.new(data,@md).toc + data=@tuned_file_array + scr_toc=SiSU_HTML::Source::Scroll_head_and_segtoc.new(data,@md,toc,links_guide,doc_ver).in_common + SiSU_HTML::Source::Seg.new(data,@md).songsheet #if not_scroll_only + data=@tuned_file_array + scr=SiSU_HTML::Source::Scroll.new(data,@md).songsheet + scroll=SiSU_HTML::Source::Scroll_output.new(scr_toc,scr[:body],scr_endnotes,scr[:metadata],scr[:owner_details],scr[:tails],@md).publish + SiSU_HTML::Source::Output.new(scroll,@md).scroll + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + unless @opt.cmd =~/[MV]/ #check maintenance flag + texfiles = Dir["#{@env.path.tune}/#{@opt.fns}*"] + texfiles.each do |f| + if FileTest.file?(f) + File.unlink(f) + end + end + end + SiSU_Env::Create_file.new(@opt.cmd,@opt.fns).param_instantiate + @@flag,@@scr,@@seg,@@seg_endnotes,@@seg_subtoc,@@seg_ad={},{},{},{},{},{} + @@seg_total,@@tracker,@@loop_count,@@tablehead,@@number_of_cols=0,0,0,0,0 + @@seg_name,@@seg_name_html,@@seg_name_php,@@seg_subtoc_array,@@seg_endnotes_array,@@segtocband,@@tablefoot=Array.new(7){[]} + @@filename_seg,@@seg_url,@@filename_segphp,@@fn,@@to_lev4,@@get_hash_to,@@get_hash_fn='','','','','','','' + @@is4=@@is3=@@is2=@@is1=@@header1=@@header2=@@header3=@@header4=0 + end + end + private + class Html_environment + def initialize(md) + @md=md + @vz=SiSU_Env::Get_init.instance.skin + @env,@css,@symlnk=SiSU_Env::Info_env.new(@md.fns),SiSU_Style::CSS.new,SiSU_Env::Create_system_link.new #home + end + def suffix_linkname #not used at present + sfx=if @md.cmd =~/h/; '.html' + else '' + end + end + def link_images + @symlnk.images + end + def directories + my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns) + @path={ :root=>my_make.html_root } + title=File.basename(@md.fns,'.rb') + SiSU_Env::SiSU_file.new(@md).mkdir + end + def tuned_file_instructions + @env=SiSU_Env::Info_env.new(@md.fns) + @tell=SiSU_Screen::Ansi.new(@md.cmd) + if @md + @md.sfx='' + @md.file_type='php' if @md.cmd =~/z/ + @md.sfx='' if @md.cmd =~/z/ + if @md.cmd =~/h/ or @md.fns =~/\~[a-z]{2,3}\.s?/ #multilingual document protection is a bit arbitrary, (needed by existing server configuration), add configuration overide... + if @md.cmd =~/H/ and @md.fns =~/\~[a-z]{2,3}\.s?/ + SiSU_Screen::Ansi.new(@md.cmd, + 'multilingual document, creating internal url links with filetype suffix', + "\n\t\t(overriding -H request, using -h mode instead)" + ).warn unless @md.cmd =~/q/ + end + @md.sfx='.html' + @md.pdf='.pdf' + end + end + @md.cmd=@md.cmd.gsub(/H/,'h') + @md.file_type='html' if @md.cmd =~/[hon]/ + directories + newfilename=%{#{@env.path.output}/#{@md.fnb}/#{@md.fn[:index]}} if @md.file_type =~/html/ + my_make_source_file=SiSU_Env::Create_file.new(@md.cmd,@md.fns) + @fnm=my_make_source_file.marshal_meta + @tune_verse_marshal=my_make_source_file.marshal_tune + if @md.markup !~/url_png/ and @md.cmd =~/[hozn]/ + dal_array=SiSU_DAL::Source.new(@md).get # dal file drawn here + @tuned_file_array=SiSU_Tune::Tune.new(dal_array,@md).songsheet + else + SiSU_HTML_nav_tune::Tune.new(@file_array,@md).songsheet #no doc passed originally... 2004w35, revist changes in conditional 2006 + end + require SiSU_lib + '/param' + @tuned_file_array + end + end + class Split_text_object + include SiSU_Viz + include SiSU_HTML_Format_type + @@dp=nil + attr_reader :format,:text,:ocn,:scroll_lev_para_ocn,:seg_lev_para_ocn + def initialize(md,para) + @md,@para=md,para + @format,@ocn='null','null' + #@format,@ocn=nil,nil + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def lev_segname_para_ocn #needs work 2003w29 + if @para =~/^\d~.+?<~\d+;(?:[ohmu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if @para[/^([1-6])~(\S+)\s+(\S.+?)<~(\d+);(?:[ohmu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m] + @format,segname,@text,@ocn=$1,$2,$3,$4 + @format="#@format~#{segname}" # + elsif @para[/^([1-6]~)\s+(\S.+?)<~(\d+);(?:[ohmu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m] + @format,@text,@ocn=$1,$2,$3 #,$4 + end + else + if @para[/^(?:_1\*|<:i[12]>\s*_\*)\s+(.+?)<~(\d+);(?:[ohu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m] + @format,@text,@ocn='_1*',$1,$2,$3 + elsif @para[/^(_\*)\s+(.+?)<~(\d+);(?:[ohu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m] + @format,@text,@ocn=$1,$2,$3 + elsif @para[/<:(i[12])>\s*(.+?)<~(\d+);(?:[ohu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m] + @format,@text,@ocn=$1,$2,$3 + elsif @para[/<:(code|alt|verse|group)>(.+?)<~(\d+);(?:[ohu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m] + @format,@text,@ocn=$1,$2,$3 + elsif @para[/(.+?)<~(\d+);(?:[ohu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m] + @text,@ocn=$1,$2 #,$3 + end + if @para !~/<~(\d+);(?:[ohu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$|^$/ #added 2002w06 + @text=@para[/(.+?)/m,1] + end + if @para[/^(\d)~\S*\s+(.+)/m] + @format,@text=$1,$2 + end + end + @seg_lev_para_ocn=if @para[/.+<~\d+;(?:[ohmu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/] + SiSU_HTML_Format_type::Format_seg.new(@md,@format,@text,@ocn) + end + @scroll_lev_para_ocn=if @para[/.+<~\d+;(?:[ohmu]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/] + SiSU_HTML_Format_type::Format_scroll.new(@md,@format,@text,@ocn) + end + self + end + end + class Links_guide + @links_guide_toc=[] + def initialize(data,md) + @data,@md=data,md + end + def doc_versions + format_head_toc=SiSU_HTML_Format_type::Head_toc.new(@md) + @doc_versions_toc=format_head_toc.document_versions_toc + end + def toc + @links_guide_toc=[] + format_head_toc=SiSU_HTML_Format_type::Head_toc.new(@md) + guide_type='horzontal' #values: horizontal or vertical + @links_guide_toc << format_head_toc.links_guide_open(guide_type) + if defined? @md.lnk and @md.lnk + @md.lnk.each do |l| + if defined? l[:say] + target=if l[:url] !~/^\.(\.)?\//; 'external' + else '_top' + end + s_lnk_url,s_lnk_lnk=l[:url],l[:say] + lev_para_ocn=SiSU_HTML_Format_type::Format_toc.new(@md,s_lnk_url,s_lnk_lnk,target) +#p lev_para_ocn.links_guide if s_lnk_lnk + @links_guide_toc << lev_para_ocn.links_guide if s_lnk_lnk + end + end + end + format_head_toc=SiSU_HTML_Format_type::Head_toc.new(@md) + @links_guide_toc << format_head_toc.links_guide_close #(guide_type) + @links_guide_toc + end + end + class Endnotes + include SiSU_Param + include SiSU_HTML_Format_type + def initialize(data,md) + @data,@md=data,md + end + def scroll + @scr_endnotes=[] + format_head_scroll=SiSU_HTML_Format_type::Head_scroll.new(@md) + @scr_endnotes << format_head_scroll.title_endnote + @data.each do |para| + pg=para.dup + if pg =~/~[{\[][\d*+]+ [],:scr=>[] } + @@seg_url='' + @@dp,@@firstseg=nil,nil + def initialize(data='',md=nil) + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + @pat_heading=/^(?:[1-6]~\S*)?(.*)<~(\d+);(?:[hm]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + @pat_strip_heading_name=/(.+?)<\/a>/ + @tell=SiSU_Screen::Ansi.new(@md.cmd) + end + def songsheet #extracts toc for scroll & seg + SiSU_Screen::Ansi.new(@md.cmd,'Toc').txt_grey unless @md.cmd =~/q/ + toc=nil + @@firstseg=nil + @data.each do |para| + if para =~/^([1-6]~|4~!)/ + para_toc=para.dup + para_toc.gsub!(/  [\d*+]+<\/sup> <\/a>\s+~[{\[].+?[}\]]~/m,'') #remove endnotes from toc + toc=case para_toc + when /^\s*1~(\S+)?/; Toc.new(para_toc,@md).level_1 + when /^\s*2~(\S+)?/; Toc.new(para_toc,@md).level_2 + when /^\s*3~(\S+)?/; Toc.new(para_toc,@md).level_3 + when /^\s*4~(\S+)?/; Toc.new(para_toc,@md).level_4 + when /^\s*5~(\S+)?/; Toc.new(para_toc,@md).level_5 + when /^\s*6~(\S+)?/; Toc.new(para_toc,@md).level_6 + when /^\s*4~!/; Toc.new(para_toc).level_crosslink + else + end + if @@firstseg.nil? and para=~/^4~\S+?/ + @@firstseg=/^4~(\S+)?/.match(para)[1] + end + if toc + begin + @@toc[:seg] << toc[:seg] if toc[:seg] + @@toc[:scr] << toc[:scr] if toc[:scr] + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + end + end + end + end + @md.firstseg=@@firstseg + @@toc + end + protected + def rss #sort all wrong, disabled but kept + @@toc[:seg] <<< +
+

+(relatively static) RSS feeds for DOCUMENTS:
+RSS feed http://www.jus.uio.no/lm/rssfeed/documents.xml
+RSS feed http://www.jus.uio.no/lm/rssfeed/tradelaw.xml
+RSS feed http://www.jus.uio.no/lm/rssfeed/environmental.xml
+

info@address.com
+

+
+WOK + end + def level_doc_owner_details + if @md.stmp =~/\w\w/ + format_head_scroll=SiSU_HTML_Format_type::Head_scroll.new(@md) + @@toc[:scr] << format_head_scroll.toc_owner_details + end + end + def level_endnotes + if @md.flag_endnotes + format_head_scroll=SiSU_HTML_Format_type::Head_scroll.new(@md) + @@toc[:scr] << format_head_scroll.toc_endnote + end + end + def level_metadata + format_head_toc=SiSU_HTML_Format_type::Head_toc.new(@md) + @@toc[:scr] << format_head_toc.metadata + @@toc[:seg] << format_head_toc.seg_metadata + end + def level_word_index + format_head_toc=SiSU_HTML_Format_type::Head_toc.new(@d0c) + @@toc[:scr] << format_head_toc.concordance + @@toc[:seg] << format_head_toc.concordance + end + def level_1 + para=@data + unless para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + para.gsub!(@pat_strip_heading_name,'\1') + end + para[@pat_heading] + linkname,link=$1,$2 if $& + p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,link) if link and link !~/#/ #% keep eye on link + title=unless para =~/Document Information/; linkname + else + link='metadata' + %{
#{linkname}} + end + toc={} + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,title) + toc[:seg]=format_toc.lev1 + title=if para =~/(<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>)$/ + m=/#{$1}/ + para.gsub!(m,'') + linkname + else #if para =~/Document Information/ + @@toc[:scr] << '
' + link='docinfo' + %{#{linkname}} + end + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,title) + toc[:scr]=format_toc.lev1 + toc + end + def level_2 + para=@data + unless para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + para.gsub!(@pat_strip_heading_name,'\1') + end + para[@pat_heading] + linkname,link=$1,$2 if $& + p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,link) if link and link !~/#/ + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,linkname) + toc={} + toc[:seg]=format_toc.lev2 + if para =~/(<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>)$/ + m=/#{$1}/ + para.gsub!(m,'') + title=linkname + else title=%{#{p_num.goto}#{linkname}} + end + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,title) + toc[:scr]=format_toc.lev2 + toc + end + def level_3 + para=@data + para.gsub!(@pat_strip_heading_name,'\1') + para.gsub(/(.*?)<\/a>(.*)/,'\1') #2002w42 altered gsub! - problematic? - suspect + para[@pat_heading] + linkname,link=$1,$2 if $& + p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,link) if link and link !~/#/ + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,linkname) + toc={} + toc[:seg]=format_toc.lev3 + if para =~/(<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>)$/ + m=/#{$1}/ + para.gsub!(m,'') + title=linkname + else title=%{#{p_num.goto}#{linkname}} + end + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,title) + toc[:scr]=format_toc.lev3 + toc + end + def level_4 + para=@data + unless para =~/~metadata/ + unless para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + para.gsub!(@pat_strip_heading_name,'\1') + para[@pat_heading] + linkname,link=$1,$2 if $& + p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,link) if link + end + para.gsub!(/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/,'') + if para =~/^4~/ + seg_link=para.gsub(/^\s*4~(\S+)\s+(.+?)$/, + %{ + \\2 + }) + @@seg_url=para[/^4~(\S+).+?$/,1] + elsif para =~/\d+.\d+.\d+.\d+|\d+.\d+.\d+|\d+.\d+|\d+/ + seg_link=para.gsub(/^\s*(#{@md.lv4}\s+)\s*(\d+.\d+.\d+.\d+|\d+.\d+.\d+|\d+.\d+|\d+)(.*)/, + %{\\1 \\2 \\3 }) + end + p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,link) if link + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,seg_link) + toc={} + toc[:seg]=format_toc.lev4 + if para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + m=/#{$1}/ + para.gsub!(m,'') + title=linkname + else title=%{#{p_num.goto}#{linkname}} if p_num + end + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,title) + toc[:scr]=format_toc.lev4 + toc + end + end + def level_5 + para=@data + if para !~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + para.gsub!(@pat_strip_heading_name,'\1') + end + para[@pat_heading] + linkname,link=$1,$2 if $& + p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,link) if link and link !~/#/ + toc={} + if para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + m=/#{$1}/ + para.gsub!(m,'') + title=linkname + else + lnk_n_txt=%{ + #{linkname} + } + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,lnk_n_txt) + toc[:seg]=format_toc.lev5 + title=%{#{p_num.goto}#{linkname}} + end + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,title) + toc[:scr]=format_toc.lev5 + toc + end + def level_6 + para=@data + if para !~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + para.gsub!(@pat_strip_heading_name,'\1') + end + para[@pat_heading] + linkname,link=$1,$2 if $& + p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,link) if link and link !~/#/ + toc={} + if para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + m=/#{$1}/ + para.gsub!(m,'') + title=linkname + else + lnk_n_txt=%{ + #{linkname} + } + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,lnk_n_txt) + toc[:seg]=format_toc.lev6 + title=%{#{p_num.goto}#{linkname}} + end + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,title) + toc[:scr]=format_toc.lev6 + toc + end + def level_crosslink + para=@data + if para !~/^4~!/ + para.gsub!(/^4~!\s+(\S+)\s+(.+)/, + %{ +
+ #{@png.crosslink_ext} +   \\2 + <\/a> +
+}) + else + para.gsub!(/^4~!\s+(\S+)\s+(.+)/, + %{
+ + + #{@png.crosslink} +   \\2 + <\/a> +
+}) + end + end + end + class Scroll_head_and_segtoc < Toc + def initialize(data,md='',toc='',links_guide_toc='',doc_versions_toc='') + @data,@md,@toc,@links_guide_toc,@doc_versions_toc=data,md,toc,links_guide_toc,doc_versions_toc + @env=SiSU_Env::Info_env.new(@md.fns) + @vz=SiSU_Env::Get_init.instance.skin + end + def in_common + toc_shared=[] + @segtoc=[] + SiSU_Screen::Ansi.new(@md.cmd,'Scroll & Segtoc').txt_grey unless @md.cmd =~/q/ + format_head_toc=SiSU_HTML_Format_type::Head_toc.new(@md) + dochead=format_head_toc.head + dochead.gsub!(/toc\.(html|php)/,'doc.\1') #kludge + ads=SiSU_HTML_promo::Ad.new(@md) + toc_shared << dochead << ads.div.major + @segtoc << format_head_toc.head << ads.div.major + toc_shared << format_head_toc.toc_head_escript if SiSU_HTML_Format_type::Head_toc.method_defined? :toc_head_escript + @segtoc << format_head_toc.toc_head_escript if SiSU_HTML_Format_type::Head_toc.method_defined? :toc_head_escript + toc_shared << format_head_toc.scroll_head_navigation_band + if @md.dc_rights + rights=format_head_toc.rights + rights=SiSU_Tune::Clean_html.new(rights).clean + end + if @md.prefix_b + prefix_b=format_head_toc.prefix_b + prefix_b=SiSU_Tune::Clean_html.new(prefix_b).clean + end + @seg_toc_band=format_head_toc.seg_head_navigation_band('pdf') #bug, vary depending on type of doc !! examine + @segtoc << @seg_toc_band + toc_shared << format_head_toc.scroll_head_title_banner_open + @segtoc << format_head_toc.seg_head_title_banner_open + tmp_head=nil + doc_title_endnote=@md.title.gsub(/(\*+)/,'\1') + tmp_head=doc_title_endnote + "\n" + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,tmp_head) + toc_shared << format_txt_obj.center_bold + @segtoc << format_txt_obj.center_bold + if not @md.subtitle.nil? and not @md.subtitle.empty? + tmp_head=@md.subtitle + "\n" + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,tmp_head) + toc_shared << format_txt_obj.center_bold + @segtoc << format_txt_obj.center_bold + end + if @md.dc_creator + creator_endnote=@md.dc_creator.gsub(/(\*+)/,%{ \\1}) + creator_endnote=%{© #{creator_endnote}} if creator_endnote =~/\S/ + tmp_head=creator_endnote + "\n" + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,tmp_head) + toc_shared << format_txt_obj.center_bold + @segtoc << format_txt_obj.center_bold + end + toc_shared << format_head_toc.copyat + @segtoc << format_head_toc.copyat + toc_shared << "#{@vz.table_close*1}\n" + @segtoc << "#{@vz.table_close*1}\n" + tmp_head=nil + if @md.prefix_a + tmp_head ||= %{

#{@md.prefix_a}\n} + toc_shared << tmp_head.dup + @segtoc << tmp_head.dup + end + tmp_head=nil + toc_shared << @doc_versions_toc + toc_shared << @links_guide_toc + toc_shared << rights if @md.dc_rights + toc_shared << prefix_b if @md.prefix_b + #Table of Contents added/appended here + toc_shared << @toc[:scr] + @segtoc << @doc_versions_toc + @segtoc << @links_guide_toc + @segtoc << @toc[:seg] + @segtoc << rights if @md.dc_rights + @segtoc << prefix_b if @md.prefix_b + #Segtoc tail added here + @segtoc << "

\n" #bugfix sort later DEBUGNOW + @segtoc << @seg_toc_band + ads=SiSU_HTML_promo::Ad.new(@md) + @segtoc << format_head_toc.seg_navigation_tail << ads.div.close << ads.display << format_head_toc.html_close + Output.new(@segtoc.to_s,@md).segtoc + @segtoc=[] + @toc[:scr],@toc[:seg]=[],[] + toc_shared + end + end + class Table < SiSU_HTML_table::Table + end + class Scroll < SiSU_HTML_scroll::Scroll + end + class Scroll_output + def initialize(scr_toc,scr_body,scr_endnotes,scr_metadata,scr_owner_details,scr_tails,md) + @scr_toc,@scr_body,@scr_endnotes,@scr_metadata,@scr_owner_details,@scr_tails,@md=scr_toc,scr_body,scr_endnotes,scr_metadata,scr_owner_details,scr_tails,md + end + def publish + scroll=[] + scroll << @scr_toc << @scr_body << @scr_endnotes << @scr_metadata << @scr_owner_details << @scr_tails + scroll.to_s + end + end + class Seg < SiSU_HTML_seg::Seg + end + class Output + include SiSU_Param + @@dp=nil + def initialize(data='',md='') + @data,@md=data,md + @my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns,@md) + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def scroll + begin + @sisu=[] + @data.each do |para| + para.strip! + para.gsub!(/<:.+?>/,'') + unless para =~/^\s*$/ + para="#{para}\n" + @sisu << para + end + end + @filename_html_scroll=@my_make.file_html_scroll(@md) + new_file_data=@sisu.to_s + @sisu=new_file_data.split(/\n\n/) + @sisu.each {|para| @filename_html_scroll.puts para,"\n"} + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + end + end + def segtoc + begin + @sisu=[] + @data.each do |para| + para.strip! + para.gsub!(/|<~\d+;(?:[ohm]|[0-6]:)\d+;\w\d+><#@dp:#@dp>/,'') + unless para =~/^\s*$/ + para="#{para}\n" + @sisu << para + end + end + new_file_data=@sisu.to_s + @filename_html_segtoc=@my_make.file_html_segtoc(@md) + @filename_html_index=@my_make.file_html_index(@md) + @sisu=new_file_data.split(/\n\n/) + @sisu.each {|para| @filename_html_segtoc.puts para,"\n"} + @sisu.each {|para| @filename_html_index.puts para,"\n"} + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + end + end + def seg + begin + @sisu=[] + @data.each do |para| + para.strip! + unless para =~/^\s*$/; @sisu << para + end + end + new_file_data=@sisu.to_s + @sisu=new_file_data.split(/\n\n/) + @sisu.each {|para| @newfile.puts para,"\n"} + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + end + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/html_format.rb b/lib/sisu/0.52/html_format.rb new file mode 100644 index 00000000..780b3253 --- /dev/null +++ b/lib/sisu/0.52/html_format.rb @@ -0,0 +1,1056 @@ +=begin + * Name: SiSU information Structuring Universe - Structured information, Serialized Units + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: base formatting template for html generation + + * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Ralph Amissah + + * License: GPL 2 or later + + Summary of GPL 2 + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + 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/copyleft/gpl.html + http://www.jus.uio.no/sisu/gpl2.fsf + + SiSU was first released to the public on January 4th 2005 + + SiSU uses: + + * Standard SiSU markup syntax, + * Standard SiSU meta-markup syntax, and the + * Standard SiSU object citation numbering and system + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_HTML_Format + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + class Paragraph_number + def initialize(md,paranum) + @md=md + @paranum=paranum[/(\d+)/m,1] + @paranum ||='' + @paranum='' if @md.mod.inspect =~/--no-ocn/ + end + def ocn_display + ocn_class=if @md.mod.inspect =~/--no-ocn/; 'ocn_off' + else 'ocn' + end + @paranum.gsub(/^(\d+|)$/, + %{

+   \\1 +

}) + end + def name + %{} + end + def id #w3c? "tidy" complains about numbers as identifiers ! annoying + %{id="o#@paranum"} + end + def goto + %{} + end + end + class Paragraph_id_ocn #used by table version #work area 2003w48 + attr_accessor :paranum,:font,:p_num + def initialize(md,paranum) + @paranum,@vz,@p_num=paranum,SiSU_Env::Get_init.instance.skin,SiSU_HTML_Format::Paragraph_number.new(md,paranum) #font + end + def txt + %{

#{@p_num.name} + } + end + def txt_00 + %{

#{@p_num.name} + } + end + def font_citation + %{} + end + def endnote + %{

#{@p_num.name} + } + end + def table + %{

#{@p_num.name} + } + end + def tiny + %{

#{@p_num.name} + } + end + def small + %{

#{@p_num.name} + } # keep but not used? + end + def font_tiny + %{} + end + def font_small + %{} + end + def header_ + %{

#{@p_num.name} + } + end + end + class Head_information + include SiSU_Viz + include SiSU_HTML_Format + include SiSU_Env + attr_reader :md,:sfx,:pdf,:rdf,:vz + def initialize(md='') + @md=md + @sfx,@pdf=@md.sfx,@md.pdf + @rdf=SiSU_XML_tags::RDF.new(md) + # DublinCore 1 - title + @vz=SiSU_Env::Get_init.instance.skin + @css=SiSU_Env::CSS_stylesheet.new(md) + @seg_name_html=(SiSU_HTML::Source::Seg.new.seg_name_html || []) + @seg_name_html_tracker=(SiSU_HTML::Source::Seg.new.seg_name_html_tracker || []) + case @md.file_type + when /php/; @index='index' # @index="index.php" + else @index='index' + end + @metalink='#metadata' + @tocband_scroll,@tocband_segtoc=nil,nil + end + def doc_type + %{ +\n} + end + def toc_head_escript #embedded script in this case PHP + # %{

PHP or other embedded script for object persistence may go HERE

} + end + def seg_head_escript #embedded script in this case PHP + # %{

PHP or other embedded script for object persistence may go HERE

} + end + def table_close + %{
+#{@vz.table_close}} + end + def buttons_home + %{ + #{@vz.banner_home_and_index_buttons} +} + end + def copyat + %{#{@vz.paragraph_heading_1_center}copy @ +
+ #{@vz.txt_home} + } + end + end + class Widget < Head_information + def initialize(md) + super(md) + @md=md + @cf_defaults=SiSU_Env::Info_processing_flag.new + end + def home + %{
+ + #{@vz.png_homepage} + + + #{text} + + + + #{text} + + + + #{@vz.nav_txt_manifest} + + + + #{@vz.nav_txt_pdf_portrait} + + + + #{@vz.nav_txt_pdf_landscape} + + + + #{@vz.nav_txt_odf} + + + + #{text} + +
+#{pdf} + +} + %{
+ #{@vz.banner_band} + +   +#{@vz.table_close} +

} + end + def seg_head_navigation_band(type='') + if type=~/pdf/ + @tocband_segtoc=make_scroll_seg_pdf + end + firstseg=%{ + #{@vz.png_nav_nxt} + } if @md.firstseg =~/\S+/ + %{ + + + +} + %{
+ #{@vz.banner_band} + + #@tocband_segtoc + +  #{firstseg}  +#{@vz.table_close} +

} + end + def manifest_link(text) + %{ + #{text} + } + end + def concordance_link(text) + if @md.concord_make + %{ + + #{text} + + } + else '' + end + end + def make_seg_scroll_pdf + wgt=Widget.new(@md) + scroll=%{

+ #{@vz.nav_txt_doc_link} +
+ + #{scroll} + #{wgt.seg(@vz.nav_txt_toc_link)}#{wgt.pdf}#{wgt.odf} + #{wgt.concordance(@vz.nav_txt_concordance)} + #{wgt.manifest} + #{wgt.search} + #{wgt.home} +
} + end + def make_scroll_seg_pdf + manifest=scroll=seg='' + wgt=Widget.new(@md) + seg=%{

+ #{@vz.nav_txt_toc_link} +
+ + #{seg} + #{wgt.scroll(@vz.nav_txt_doc_link)}#{wgt.pdf}#{wgt.odf} +
+ #{wgt.concordance(@vz.nav_txt_concordance)} + #{wgt.manifest} + #{wgt.search} + #{wgt.home} +
} + end + def head + %{#{doc_type} + + + #{@md.html_title} + + + #{@rdf.rdftoc} + #{@rdf.metatag_html} + #{@vz.font_css_table_file} + +#{@vz.color_body} + + + + #{@vz.js_top}} + end + def document_versions_toc + #document_version_hold + end + def links_guide_vertical_open #??? + url=(defined? @vz.url_hp) && @vz.url_hp =~/^http:\/\/\S+$/ ? @vz.url_hp : @vz.url_home + %{