diff options
Diffstat (limited to 'lib')
89 files changed, 38580 insertions, 0 deletions
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 << %{ <option value="SiSU_#{x}">#{x}</option>\n} unless x =~/apache|sisu\/image/ #check + end + f2 << %{ selected_db=case cgi['db']\n} + serve.each do |x| + f2 << %{ when /SiSU_#{x}/; '<option value="SiSU_#{x}">#{x}</option>'\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 + ' <font size="2" color="#666666">case sensitive</font>' + 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 + %{<font color="#666666" size="2">#{sql_select_body}</font>} + end + def sql_select_endnotes_format + %{<font color="#666666" size="2">#{sql_select_endnotes}</font>} + end + def contents + @conn.select_all(sql_select_body) + end + def endnotes + @conn.select_all(sql_select_endnotes) + end + end + WOK_SQL + end + def dbi_connect + <<-'WOK_SQL' + dbi="dbi: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/ + '<font size="2" color="#666666">text:__; keywords:__; title:__; author:__; subject:__; description:__; publisher:__; contributor:__; date:__; type:__; format:__; identifier:__; source:__; language:__; relation:__; coverage:__; rights:__; comment:__; abstract:__; filename:__;</font>' + else '' + end + end + def submission_form + search_form=<<-WOK + WOK_SQL + end + def header_desc + <<-WOK_SQL + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + <html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title> + SiSU search form (sample): SiSU information Structuring Universe + </title> + <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> + <meta name="sourcefile" content="SiSU._sst" /> + <link rel="generator" href="http://www.jus.uio.no/sisu" /> + <link rel="shortcut icon" href="#@image_src/rb7.ico" /> + <link rel="stylesheet" href="../_sisu/css/html.css" type="text/css" /> + </head> + <body bgcolor="#ffffff" text="#000000" link="#003090" lang="en" xml:lang="en"> + <table summary="band" border="0" cellpadding="3" cellspacing="0"> + <tr><td align="left" bgcolor="#ffffff"><a href="http://www.jus.uio.no/sisu/" target="_top"><img border="0" src="#@image_src/sisu.png" alt="SiSU -->" /></a></td><td> +<!-- <p class="tiny"><a href="http://www.jus.uio.no/sisu/SiSU/"> http://www.jus.uio.no/sisu/SiSU/</a></p> --> + <label for="find"><b>#{@env.sample_search_form_title}</b></label> + </td></tr> + </table> + WOK_SQL + end + def header2 + <<-'WOK_SQL' + <table cellpadding="0"> + <tr><td valign=\"top\"> + <form action="#@base" id="Test Form" method="post"> + <!input type="text" id="find" name="find" value="#@search_field" /> + <!input type="text" id="find" name="find" value="" /> + <font size="2" color="#222222"> + select which database to search + </font> + <br /> + <select name="db" size="1"> + #@selected_db + WOK_SQL + end + def buttons1 + <<-'WOK_SQL' + </select> + <font size="2" color="#222222"> + <input type="radio" name="view" value="index" #@checked_index> index + <input type="radio" name="view" value="text" #@checked_text> text / grep + </font> + </td></tr></table> + <table cellpadding="2"> + <tr><td valign=\"top\"> + <textarea id="find" name="find" type="text" rows="4" cols="30" maxlength="256">#@search_field</textarea> + <br /><input type="submit" value="SiSU search" /> + WOK_SQL + end + def buttons2 + <<-'WOK_SQL' + </td> + <td valign=\"top\"> + #@tip + #@search_note + #@the_can + </td></tr></table><table><tr><td> + <font size="2" color="#222222"> + <input type="checkbox" name="echo" #@checked_echo> echo previous search + <input type="checkbox" name="searched" #@checked_searched> search result stats + <input type="checkbox" name="url" #@checked_url> url for search + <input type="checkbox" name="tip" #@checked_tip> available search fields + <input type="checkbox" name="sql" #@checked_sql> sql statement + <br /> + checks: + <input type="radio" name="checks" value="check_ignore" #@checked_ignore> selected + <input type="radio" name="checks" value="check_all" #@checked_all> all + <input type="radio" name="checks" value="check_none" #@checked_none> none + </font> + + </td></tr> + </table> + </form> + WOK + end + end + WOK_SQL + end + def search_request + <<-'WOK_SQL' + class 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$/ + %{<hr /><br /><center> + pg. #{page.to_s} + <a href="#{can.next}"> ></a> + </center>} + when /^2$/ + %{<hr /><br /><center> + <a href="#{can.previous}">< </a> + pg. #{page.to_s} + <a href="#{can.next}"> ></a> + </center>} + else + %{<hr /><br /><center> + <a href="#{can.start}">|< </a> + <a href="#{can.previous}">< </a> + pg. #{page.to_s} + <a href="#{can.next}"> ></a> + </center>} + end + end + WOK_SQL + end + def tail + <<-WOK_SQL + def tail + <<-'WOK' + <br /><hr /><br /> + <center><table align="center"bgcolor="#ffffff"><tr><td><font color="#666666"><table summary="" bgcolor="#ffffff" cellpadding="4" border="0" align="center"> + + <tr align="center"> + <td align="center"><p class="center"><font color="#666666" size="2"> + presentations' look and feel<br /> + generated by<br /> + <a href="http://www.jus.uio.no/sisu" ><img border="0" src="#@image_src/sisu.png" alt="SiSU in Ruby with the usual GPL (or OSS) suspects - Way Better!" width="120" height="38"></a><br /> + <a href="http://www.jus.uio.no/sisu" >SiSU</a><br /> + version 0.50<br />2007w11/1 (2007-03-12)<br /> + + <table summary="SiSU rights" bgcolor="#ffffff" cellpadding="4" border="0" align="center" width="40%"> + <sup>©</sup> Ralph Amissah<br /> + 1993, current 2007<br /> + GPL 2<br /> + <i>w3 since October 3 1993</i><br /> + <a href="mailto://ralph@amissah.com" >ralph@amissah.com</a><br /> + </font></p> + </td></tr></table> + + <p><center><font color="#666666" size="2">the usual GPL (or OSS) suspects:<br />Better - "performance, reliability, scalability, security<br />& total cost of ownership"<br /><i>[not to mention flexibility & choice]</i><br /><br /><<<a href="http://www.jus.uio.no/sisu/">Way Better!</a>>></font></center></p><tr align="center"><td align="center"> + + </font></center></td></tr></table></center> <a name="bottom" id="bottom"></a><a name="down" id="down"></a><a name="end" id="end"></a><a name="finish" id="finish"></a><a name="stop" id="stop"></a><a name="credits" id="credits"></a> + </body></html> + WOK + end + WOK_SQL + end + def main1 + <<-'WOK_SQL' + @tail=tail + @counter_txt_doc,@counter_txt_ocn,@counter_endn_doc,@counter_endn_ocn=0,0,0,0 + @counters_txt,@counters_endn,@sql_select_body,@sql_select_endnotes='','','','' + FCGI.each_cgi do |cgi| + begin # all code goes in begin section + @search={ :text => [],:endnotes => [] } + q=CGI.new + @db=if cgi['db'] =~/\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=%{<font size="2" color="#004000">} + canned_search_url_txt=CGI.escapeHTML(@@canned_search_url) + the_can=%{<font size="2" color="#666666">#{canned_note}<br /> <a href="#{@@canned_search_url}">#{canned_search_url_txt}</a></font><br />} + 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}</font><br />} if @search_for.text1 =~/\S+/ + p_keywords=%{keywords: #{green}#{@search_for.keywords}</font><br />} if @search_for.keywords =~/\S+/ + p_title=%{title: #{green}#{@search_for.title}</font><br />} if @search_for.title =~/\S+/ + p_author=%{author: #{green}#{@search_for.author}</font><br />} if @search_for.author =~/\S+/ + p_subject=%{subject: #{green}#{@search_for.subject}</font><br />} if @search_for.subject =~/\S+/ + p_description=%{description: #{green}#{@search_for.description}</font><br />} if @search_for.description =~/\S+/ + p_publisher=%{publisher: #{green}#{@search_for.publisher}</font><br />} if @search_for.publisher =~/\S+/ + p_contributor=%{contributor: #{green}#{@search_for.contributor}</font><br />} if @search_for.contributor =~/\S+/ + p_date=%{date: #{green}#{@search_for.date}</font><br />} if @search_for.date =~/\S+/ + p_type=%{type: #{green}#{@search_for.type}</font><br />} if @search_for.type =~/\S+/ + p_format=%{format: #{green}#{@search_for.format}</font><br />} if @search_for.format =~/\S+/ + p_identifier=%{identifier: #{green}#{@search_for.identifier}</font><br />} if @search_for.identifier =~/\S+/ + p_source=%{source: #{green}#{@search_for.source}</font><br />} if @search_for.source =~/\S+/ + p_language=%{language: #{green}#{@search_for.language}</font><br />} if @search_for.language =~/\S+/ + p_relation=%{relation: #{green}#{@search_for.relation}</font><br />} if @search_for.relation =~/\S+/ + p_coverage=%{coverage: #{green}#{@search_for.coverage}</font><br />} if @search_for.coverage =~/\S+/ + p_rights=%{rights: #{green}#{@search_for.rights}</font><br />} if @search_for.rights =~/\S+/ + p_comment=%{comment: #{green}#{@search_for.comment}</font><br />} if @search_for.comment =~/\S+/ + p_abstract=%{abstract: #{green}#{@search_for.abstract}</font><br />} if @search_for.abstract =~/\S+/ + p_filename=%{filename: #{green}#{@search_for.filename}</font><br />} if @search_for.filename =~/\S+/ + search_note=<<-WOK + <font size="2" color="#666666"> + <br /><b>previous selection</b>:<br /> + database: #{green}#@db</font>; selected view: #{green}#{cgi['view']}</font><br /> + search string: "#{green}#{analyze_format}</font>"<br /> + #{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} + </font> + WOK + #eg = %{canned search e.g.:<br /> <a href="#{url}">#{url}</a><br />find: #{analyze}<br />database: #{database}} + #dbi_canning + @header=Form.new(@base,search_field,selected_db,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 << '<p><hr><br /><b>Main Text:</b><br />' << sql_select_body + @endnotes << '<p><hr><br /><b>Endnotes:</b><br />' << 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=%{<span style="background-color: #DDFFAA"><a href="#@hosturl_files/#@stub/#{location}/toc#{lang}.html">#{c['title']}</a></span> by #{c['creator']} <a href="#@hosturl_files/#@stub/#{location}/portrait#{lang}.pdf"><img border="0" width="15" height="18" src="#@image_src/b_pdf.png" alt="pdf portrait"></a><a href="#@hosturl_files/#@stub/#{location}/landscape#{lang}.pdf"><img border="0" width="18" height="15" src="#@image_src/b_pdf.png" alt="pdf landscape"></a> <a href="#@hosturl_files/#@stub/#{location}/sisu_manifest#{lang}.html"><img border="0" width="12" height="12" src="#@image_src/bullet_red.png" alt="manifest"><font size="2"> ?</font></a><br />} if file_suffix=~/s/ #hmm watch file_suffix + if @text_search_flag; title='<br /><hr>'+title + else title='<br />'+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)/,'<span style="background-color: #ffff48">\1</span>')) : c['body'] #check + %{<hr><p><font size="2">ocn <b><a href="#@hosturl_files/#@stub/#{location}/#{c['seg']}#{lang}.html##{c['ocn']}">#{c['ocn']}</a></b>:</font></p>#{matched_para}} + elsif c['suffix'] =~/1/ #doc + %{#{title}<hr><p><font size="2">ocn #{c['ocn']}:#{c['body']}} + end + @counter_txt_ocn+=1 + output=if c['seg'] =~/\S+/; title+text + else text + end + elsif cgi['view']=~/index/ #% idx body + if c['suffix'] !~/1/ #seg + index=%{<a href="#@hosturl_files/#@stub/#{location}/#{c['seg']}#{lang}.html##{c['ocn']}">#{c['ocn']}</a>, } if @text_search_flag + elsif c['suffix'] =~/1/ #doc + index=%{<a href="#@hosturl_files/#@stub/#{location}/doc#{lang}.html##{c['ocn']}">#{c['ocn']}</a>, } + end + if c['seg'] =~/\S+/ + if @text_search_flag + @counter_txt_ocn+=1 + output=title+index + end + else + @counter_txt_ocn+=1 + output=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 + %{<font size="2" color="#666666">Found in the main body of #@counter_txt_doc documents, and at #@counter_txt_ocn locations within.</font><br />} + 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=%{<br /><hr><span style="background-color: #DDFFAA"><a href="#@hosturl_files/#@stub/#{location}/toc#{lang}.html">#{e['title']}</a></span> by #{e['creator']} <a href="#@hosturl_files/#@stub/#{location}/portrait.pdf"><img border="0" width="15" height="18" src="#@image_src/b_pdf.png" alt="pdf portrait"></a><a href="#@hosturl_files/#@stub/#{location}/landscape.pdf"><img border="0" width="18" height="15" src="#@image_src/b_pdf.png" alt="pdf landscape"></a> <a href="#@hosturl_files/#@stub/#{location}/sisu_manifest#{lang}.html"><img border="0" width="12" height="12" src="#@image_src/bullet_red.png" alt="manifest"><font size="2"> ?</font></a><br />} 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)/,'<span style="background-color: #ffff48">\1</span>')) : e['body'] #check + output=%{#{title}<hr><font size="2">note <b><a href="#@hosturl_files/#@stub/#{location}/endnotes.html##{e['nr']}">#{e['nr']}</a></b> referred to from ocn <a href="#@hosturl_files/#@stub/#{location}/doc.html##{e['ocn']}">#{e['ocn']}</a>:</font> #{matched_endnote}} + elsif cgi['view']=~/index/ #% idx endnotes + @counter_endn_ocn+=1 + output=%{#{title}<a href="#@hosturl_files/#@stub/#{location}/endnotes.html#_#{e['nr']}">#{e['nr']}</a> [§ <a href="#@hosturl_files/#@stub/#{location}/doc.html##{e['ocn']}">#{e['ocn']}</a>], } + end + @counters_endn=if @counter_endn_doc > 0 + %{<font size="2" color="#666666">Found in the endnotes of #@counter_endn_doc documents, and at #@counter_endn_ocn locations within.</font><br />} + 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='<pre>' + CGI::escapeHTML(e.backtrace.reverse.join("\n")) + s << CGI::escapeHTML(e.message) + '</pre>' + cgi.out{s} + next + ensure # eg. disconnect from server + @conn.disconnect if @conn + end + end + WOK_SQL + end + end +end +__END__ +#@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 << %{ <option value="SiSU_#{x}">#{x}</option>\n} + end + f2 << %{ selected_db=case cgi['db']\n} + serve.each do |x| + f2 << %{ when /SiSU_#{x}/; '<option value="SiSU_#{x}">#{x}</option>'\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 + %{<font color="#666666" size="2">#{sql_select_body}</font>} + end + def sql_select_endnotes_format + %{<font color="#666666" size="2">#{sql_select_endnotes}</font>} + end + def contents + @conn.select_all(sql_select_body) + end + def endnotes + @conn.select_all(sql_select_endnotes) + end + end + WOK_SQL + end + def dbi_connect + <<-'WOK_SQL' + @dbi="DBI: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 <Characters + def initialize + #NOTE places character_encoding.tbl in correct subdirectory ./_sisu_processing/encoding + #@env=SiSU_Env::Info_env.new + #env=@env.path.encoding + #@db=KirbyBase.new(:local,nil,nil,env) + @db=KirbyBase.new #default database location, pwd + @ce_tbl=@db.create_table(:character_encoding, :glyph,:String, :dec,:Integer, :hex,:String, :rb,:String, :html,:String, :html_name,:String, :tex,:String, :tex_licr,:String, :tex_alt,:String, :name,:String) + end + def db + x=Character_encoding.new.table + #x.each {|y| puts y[2].inspect} + x.each do |c| + #puts "#{c[0]}, #{c[1]}, #{c[2]}, #{c[3]}, #{c[4]}, #{c[5]}, #{c[6]}, #{c[7]}, #{c[8]}, #{c[9]}" + @ce_tbl.insert(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9]) + end + end + end + class Query + def initialize(find='',show='') + #NOTE character_encoding.tbl not read from subdirectory ./_sisu_processing/encoding + @db=KirbyBase.new #default database location, pwd + @ce_tbl=@db.get_table(:character_encoding) + @find=find + end + def selected(selected,show) + @y=[] + selected.each do |x| + @y<<case show + when 'glyph'; x.glyph + when 'dec'; x.dec + when 'hex'; x.hex + when 'rb'; x.rb + when 'html'; x.html + when 'html_name'; x.html_name + when 'tex'; x.tex + when 'ot1'; x.ot1 + when 'ts1'; x.ts1 + when 'name'; x.name + else x.hex + end + end + #@ce_tbl.select(:glyph,:name) { |r| r.hex == hex }.each do |r| + # puts '%s %s' % [r.glyph, r.name] + #end + #:glyph,:dec,:hex,:rb,:html,:html_name,:tex,:tex_licr,:tex_alt,:name + #list=['number','glyph','html','hex','rb','tex','ot1','ts1','name'] + end + def hex(hex,show) + select=@ce_tbl.select(:glyph,:dec,:hex,:rb,:html,:html_name,:tex,:tex_licr,:tex_alt,:name) { |r| r.hex == hex } + selected(select,show) + @y + end + def dec(dec,show) + select=@ce_tbl.select(:glyph,:dec,:hex,:rb,:html,:html_name,:tex,:tex_licr,:tex_alt,:name) { |r| r.dec == dec } + selected(select,show) + @y + end + def name(name,show) + select=@ce_tbl.select(:glyph,:dec,:hex,:rb,:html,:html_name,:tex,:tex_licr,:tex_alt,:name) { |r| r.name =~ /#{name}/ } + selected(select,show) + @y + end + def report + puts @ce_tbl.select(:glyph,:dec,:hex,:rb,:html,:html_name,:tex,:tex_licr,:tex_alt,:name).to_report + end + def table + selected=@ce_tbl.select + #selected=@ce_tbl.select(:glyph,:dec,:hex,:rb,:html,:html_name,:tex,:tex_licr,:tex_alt,:name) + selected.each do |c| + puts '%s %s %s %s %s %s %s %s %s %s' % [c.glyph,c.dec,c.hex,c.rb,c.html,c.html_name,c.tex,c.tex_licr,c.tex_alt,c.name] + #puts "#{c.glyph}, #{c.dec}, #{c.hex}, #{c.rb}, #{c.html}, #{c.name}, #{c.tex}, #{c.tec_licr}, #{c.tex_alt}, #{c.c_name}" + end + end + end + class Character_encoding + def table + x=[] +#:glyph, :dec,:hex, :rb, :xml , :html_name, :tex, :tex_licr, :tex_alt, :name + x=[ + ['', 9, '', '', '	', nil, '', '', '', 'Horizontal tab' ], + ['', 15, '', '', '', nil, '', '', '', 'Line feed' ], + ['', 17, '', '', '', nil, '', '', '', 'Carriage return' ], + [' ', 32, '40', '\40', ' ', nil, '', '', '', 'Space' ], + ['!', 33, '41', '\41', '!', nil, '!', '!', '!', 'Punctuation Exclamation !' ], + ['', 34, '42', '\42', '"', '"', '', '', '', 'Punctuation Quotation mark' ], + ['#', 35, '43', '\43', '#', nil, '{\#}', '\#', '', 'Hash mark #' ], + ['$', 36, '44', '\44', '$', nil, '{\$}', '\textdollar', '', 'Dollar sign $' ], + ['%', 37, '45', '\45', '%', nil, '{\%}', '\%', '', 'Percent sign %' ], + ['&', 38, '46', '\46', '&', '&', '{\&}', '\&', '', 'Ampersand &' ], + ['\'', 39, '47', '\47', ''', nil, '', '', '', 'Apostrophe \''], + ['(', 40, '50', '\50', '(', nil, '', '', '', 'Left parenthesis (' ], + [')', 41, '51', '\51', ')', nil, '', '', '', 'Right parenthesis )' ], + ['*', 42, '52', '\52', '*', nil, '', '', '', 'Asterisk *' ], + ['+', 43, '53', '\53', '+', nil, '', '', '', 'Plus sign +' ], + [',', 44, '54', '\54', ',', nil, ',', ',', ',', 'Puncutation Comma ,' ], + ['-', 45, '55', '\55', '-', nil, '-', '-', '-', 'Puncutation Hyphen -' ], + ['.', 46, '56', '\56', '.', nil, '.', '.', '.', 'Puncutation Period .' ], + ['/', 47, '57', '\57', '/', nil, '/', '/', '/', 'Puncutation Slash /' ], + ['0', 48, '60', '\60', '0', nil, '0', '0', '0', 'Digit zero 0' ], + ['1', 49, '61', '\61', '1', nil, '1', '1', '1', 'Digit one 1' ], + ['2', 50, '62', '\62', '2', nil, '2', '2', '2', 'Digit two 2' ], + ['3', 51, '63', '\63', '3', nil, '3', '3', '3', 'Digit three 3' ], + ['4', 52, '64', '\64', '4', nil, '4', '4', '4', 'Digit four 4' ], + ['5', 53, '65', '\65', '5', nil, '5', '5', '5', 'Digit five 5' ], + ['6', 54, '66', '\66', '6', nil, '6', '6', '6', 'Digit six 6' ], + ['7', 55, '67', '\67', '7', nil, '7', '7', '7', 'Digit seven 7' ], + ['8', 56, '70', '\70', '8', nil, '8', '8', '8', 'Digit eight 8' ], + ['9', 57, '71', '\71', '9', nil, '9', '9', '9', 'Digit nine 9' ], + [':', 58, '72', '\72', ':', nil, '', '', '', 'Punctuation Colon :' ], + [';', 59, '73', '\73', ';', nil, '', '', '', 'Punctuation Semicolon ;' ], + ['<', 60, '74', '\74', '<', '<', '', '', '', 'Less than <' ], + ['=', 61, '75', '\75', '=', nil, '', '', '', 'Equals sign =' ], + ['>', 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=%{<a href="http://www.jus.uio.no/sisu/" target="_top"><img border="0" height="44" width="144" valign="center" src="../_sisu/image/sisu.png" alt="SiSU home -->"></a>} + @lnk=lnk + @doc_details =<<WOK +<table summary="links to text related to this rudimentary index" width="96%" border="0" bgcolor="white" cellpadding="0" align="center"><tr><td width="2%" align="right"> </td><td width="94%" valign="top" align="justify"><p align="justify"><font size="3" color="#000000" face="times new roman"><a href="#{@md.fn[:manifest]}" #{@vz.js_toc}><img border="0" height="12" width="12" src="../_sisu/image/bullet_red.png" alt="Manifest"> <b>#{@md.title}</b></a></font></p><p><font size="3" color="#000000" face="times new roman"> <a href="#{@md.fn[:toc]}" #{@vz.js_toc}><img border="0" height="15" width="15" src="../_sisu/image/b_toc.png" alt="TOC"> TOC - table of contents for individual articles</a></font></p><p><font size="3" color="#000000" face="times new roman"> <a href="#{@md.fn[:doc]}" #{@vz.js_doc}><img border="0" height="15" width="15" src="../_sisu/image/b_doc.png" alt="Full Text"> Full text (with indexed table of contents)</a></font></p><p><font size="3" color="#000000" face="times new roman"> <a href="#{@md.fn[:pdf_p]}" #{@vz.js_portrait}><img border="0" height="18" width="15" src="../_sisu/image/b_pdf.png" alt="PDF portrait"> pdf version of the document (portrait)</a></font></p><p><font size="3" color="#000000" face="times new roman"> <a href="#{@md.fn[:pdf_l]}" #{@vz.js_landscape}><img border="0" height="15" width="18" src="../_sisu/image/b_pdf.png" alt="PDF landscape"> pdf version of the document (landscape)</a></font></p> </td></tr></table><p>Word index links are to html versions of the text the segmented version followed by the scroll (single document) version.<br />[For segmented text references [T1], [T2] or [T3] appearing without a link, indicates that the word appears in a title (or subtitle) of the text (that is identifiable by the appended object citation number).]</p> +WOK + end + def create + <<WOK +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> + <title> + SiSU created WordIndex for: #{@md.dc_title} + </title> + <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> + <meta name="Description" content=" SiSU created"> + <meta name="keywords" content="word index for #{@md.dc_title}"> + <meta name="generator" content="SiSU (Linux & Ruby!)"> + <link rel="generator" href="http://www.jus.uio.no/sisu" /> + <link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> + <link rel="stylesheet" href="../_sisu/css/html.css" type="text/css" /> + #{@vz.js_head} +</head> +<body> + #{@vz.js_top} + <table summary="home button" width="100%" border="0" cellpadding="3" bgcolor= "#ffffff" align="center"><tr> + <td align="left" valign="top" bgcolor="#ffffff" width="20%"> + #{@vz.banner_home_button_only} + </td> + <td width="80%" align="right"> + #{@env.widget_static.search_form} + </td> + </tr></table> + #@doc_details<p>(The word listing/index is Case sensitive: Capitalized words appear before lower case)</p> + <p> + <b>word</b> (number of occurences)<br />linked references to word within document <br /> + [if number of occurences exceed number of references - word occurs more than once in at least one reference. Footnote/endnotes are either assigned to the paragraph from which they are referenced or ignored, so it is relevant to check the footnotes referenced from within a paragraph as well.] + </p> + <p> + (After the page is fully loaded) you can jump directly to a word by appending a hash (#) and the word to the url for this text, (do not forget that words are case sensitive, and may be listed twice (starting with and without an upper case letter)), #your_word # [ http://[web host]/#@fnb/concordance.html#your_word ] + </p> +WOK + end + end + class Word + @@word_previous='' + def initialize(word,freq) + @word,@freq=word,freq + end + def html + w=if @word.capitalize==@@word_previous + %{\n<p class="concordance_word">#@word</p><p class="concordance_count">(#@freq)</p>\n\t<p class="concordance_object"> } + else n=@word.strip.gsub(/\s+/,'_') #also need to convert extended character set to html + %{\n<p class="concordance_word"><a name="#{n}">#@word</a></p><p class="concordance_count">(#@freq)</p>\n\t<p class="concordance_object"> } + end + @@word_previous=@word.capitalize + w + end + end + class Words + require 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 <!pn!>\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 + %{<a href="#{@md.fnl[:pre]}doc#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}\##@wordlocation">#@wordlocation</a>; } + 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 + %{[<a href="#{@md.fnl[:pre]}doc#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}##@show">H</a>]#@show, } + when @rxp_t2 + %{[<a href="#{@md.fnl[:pre]}doc#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}##@show">H</a>]#@show, } + when @rxp_t3 + %{[<a href="#{@md.fnl[:pre]}doc#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}##@show">H</a>]#@show, } + else %{<a href="#@word_location_seg">#@show</a>, } + 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='<font size="1" color="#777777" face=times new roman><img border="0" height="15" width="15" src="../_sisu/image/b_doc.png" alt="Full Text"> scroll: </font><font size="1" color="#222222" face=times new roman>doc# </font> ' + 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 << '</p>' + end + # special cases endnotes and header levels 1 - 3 + end + credits=@vz.credits_splash + @file_index_all << "#{credits}</body>\n</html>" # 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 +<<WOK +/* SiSU table output stylesheet */ + body { + color: black; + background: #{@vz.color_white}; + } + p { + display: block; + line-height: 1.5; + font-family: #{fonts}; + } + a:link { + color: #{@vz.color_blue_ink}; + text-decoration: none; + } + a:visited { + color: #{@vz.color_blue_ink}; + text-decoration: none; + /* background-color: #{@vz.color_blue_tinge}; */ + } + a:hover { + color: #{@vz.color_black}; + text-decoration: underline; + background-color: #{@vz.color_yellow_light}; + } + a:active { + color: #{@vz.color_blue_ink}; + text-decoration: underline; + } +WOK + end + def html #stylesheet for css html pages == html.css +<<WOK +/* SiSU css default stylesheet */ + body { + color: black; + background: #{@vz.color_white}; + } +/* + table { + margin-left: 5%; + display: block; + } + tr { + display: block; + } + th, td { + display: inline; + } +*/ + a:link { + color: #{@vz.color_blue_ink}; + text-decoration: none; + } + a:visited { + color: #{@vz.color_blue_ink}; + text-decoration: none; + } +/* + a:hover { + color: #{@vz.color_black}; + border-bottom: 2px solid #777777; + background-color: #{@vz.color_yellow_light}; + } +*/ + a:hover img { + background-color: #{@vz.color_white}; + } + a:active { + color: #{@vz.color_blue_ink}; + text-decoration: underline; + } + div { + margin-left: 0; + margin-right: 0; + } + div.p { + margin-left: 5%; + margin-right: 1%; + } + #top_band { + position: absolute; + top: 0; + bottom: 80px; + width: 100%; + } + #top_band_search { + position: absolute; + top: 0px; + right: 0px; + margin-left: 75%; + width: 20%; + } + #column_left { + position: absolute; + top: 80px; + left: 0; + margin-left: 0; + width: 20%; + } + #column_center { + position: absolute; + top: 80px; + margin-left: 20%; + width: 55%; + } + #column_right { + position: absolute; + top: 80px; + right: 0px; + margin-left: 75%; + width: 25%; + } + #pane_major { + position: absolute; + top: 0px; + left: 0; + margin-left: 0; + width: 80%; + } + #pane_minor { + position: absolute; + top: 0px; + right: 0px; + margin-left: 75%; + width: 20%; + } + p { + display: block; + font-family: #{fonts}; + font-size: 100%; + font-weight: normal; + line-height: 150%; + text-align: left; + margin-left: 10mm; + text-indent: 0mm; + margin-top: 3px; + margin-bottom: 3px; + margin-right: 5mm; + } + p.norm { + text-align: justify; + } + p.code { + font-family: monospace; + text-align: left; + } + p.caption { + text-align: left; + font-size: 80%; + display: inline; + } + p.endnote { + font-family: #{fonts}; + font-size: 96%; + font-weight: normal; + line-height: 120%; + text-align: left; + margin-left: 10mm; + text-indent: 0mm; + margin-top: 3px; + margin-bottom: 3px; + margin-right: 15mm; + } + p.endnote_indent { + font-family: #{fonts}; + font-size: 96%; + font-weight: normal; + line-height: 120%; + text-align: left; + margin-left: 15mm; + text-indent: 0mm; + margin-top: 3px; + margin-bottom: 3px; + margin-right: 15mm; + } + p.center { + text-align: center; + } + p.bold { + font-weight: bold; + } + p.centerbold { + text-align: center; + font-weight: bold; + } + p.em { + font-weight: bold; + font-style: normal; + background: #fff3b6; + } + p.ocn, p.paranum { + font-size: 10px; + margin-top: 0px; + margin-bottom: 5px; + color: #777777; + margin-right: 5px; + text-align: right; + } + p.ocn_off, p.no_paranum { + display: none; + font-size: 10px; + margin-top: 0px; + margin-bottom: 5px; + color: #777777; + margin-right: 5px; + text-align: right; + } + p.small { + font-size: 80%; + margin-top: 0px; + margin-bottom: 0px; + margin-right: 6px; + text-align: left; + } + p.tiny { + font-size: 10px; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + margin-right: 6px; + text-align: left; + } + p.tiny_left { + font-size: 10px; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + margin-left: 0px; + margin-right: 0px; + text-align: left; + } + p.tiny_right { + font-size: 10px; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + margin-right: 5mm; + text-align: right; + } + p.pane { + font-size: 80%; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 2mm; + margin-right: 4px; + text-align: left; + } + p.pane_title { + font-weight: bold; + font-size: 80%; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 2mm; + margin-right: 4px; + text-align: left; + } + p.pane_blurb { + font-size: 10px; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 2mm; + margin-right: 4px; + text-align: left; + } + p.pane_link { + font-size: 10px; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 4mm; + margin-right: 4px; + text-align: left; + } + p.pane_indent { + font-size: 10px; + margin-top: 0px; + margin-bottom: 0px; + margin-left: 4mm; + margin-right: 4px; + text-align: left; + } + p.concordance_word { + line-height: 150%; + font-weight: bold; + display: inline; + margin-top: 4px; + margin-bottom: 1px; + } + p.concordance_count { + font-size: 80%; + color: #777777; + display: inline; + margin-left: 0mm; + text-indent: 0mm; + } + p.concordance_object { + font-size: 80%; + font-weight: normal; + line-height: 120%; + text-align: left; + margin-left: 15mm; + text-indent: 0mm; + margin-top: 1px; + margin-bottom: 3px; + } + p.quickref{ + font-size: 10px; + font-style: italic; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + margin-right: 5px; + text-align: left; + } + p.bigref{ + font-size: 11px; + font-weight: bold; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + margin-right: 5px; + text-align: center; + } + p.i1 {margin-left: 20mm;} + p.i2 {margin-left: 25mm;} + p.i3 {margin-left: 30mm;} + p.i4 {margin-left: 35mm;} + p.i5 {margin-left: 40mm;} + p.i6 {margin-left: 45mm;} + + table { } + tr { } + th, td { } + p.left, th.left, td.left { + text-align: left; + } + p.right, th.right, td.right { + text-align: right; + } + + h1, h2, h3, h4, h5, h6 { + display: block; + font-family: #{fonts}; + font-weight: bold; + line-height: 120%; + margin-left: 10mm; + margin-right: 10mm; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + h1.center, h2.center, h3.center, h4.center, h5.center, h6.center { + text-align: center; + } + ul { + list-style: none; + } + ul.horizontal { + list-style: none; + } + ul.vertical { + list-style: none; + } + li { + background: url(../image/bullet_red.png) no-repeat 0px 6px; + padding-left: 20px; + display: block; + font-family: #{fonts}; + /* font-size: 100%; */ + font-weight: normal; + line-height: 100%; + text-align: left; + margin-left: 10mm; + text-indent: 0mm; + margin-top: 0px; + margin-bottom: 0px; + margin-right: 5mm; + } + li.bullet { + line-height: 150%; + margin-left: 0mm; + margin-right: 0mm; + margin-top: 3px; + margin-bottom: 3px; + } + li.i1 { + margin-left: 20mm; + line-height: 150%; + margin-left: 5mm; + margin-right: 5mm; + margin-top: 3px; + margin-bottom: 3px; + } + li.i2 { + margin-left: 30mm; + line-height: 150%; + margin-top: 3px; + margin-bottom: 3px; + } + #horizontal_links { + background: #eeeeee; + margin-left: 5%; + margin-right: 5%; + } + #horizontal { + margin: 0; + padding: 0 0 0 10px; + border-top: 1px solid #000077; + border-bottom: 1px solid #000077; + } + #horizontal li { + margin: 0 0 0 0; + padding: 0 16px 0 0; + display: inline; + list-style-type: none; + text-align: left; + background: none; + } + #horizontal a { + /* font-weight: normal; */ + /* float: left; */ + line-height: 12px; + margin: 0 0 0 0; + text-decoration: none; + color: #000077; + } + #horizontal a.active, #horizontal a:hover { + border-bottom: 2px solid #777777; + padding-bottom: 2px; + /* font-weight: bold; */ + color: #000077; + } + #horizontal a:hover { + color: #000077; + } + #document_versions { + position: absolute; + top: 10mm; + right: 2%; + width: 12%; + /* background: #ffffff; */ + float: right; + } + #vertical_links { + position: absolute; + top: 10mm; + right: 0px; + width: 20%; + background: #dddddd; + float: right; + } + #vertical { + /* background: none; */ + padding: 0 12px 0px 0px; + /* border-top: 2px solid #000077; */ + /* border-bottom: 2px solid #000077; */ + /* margin-left: 33%; */ + margin-left: 2%; + margin-right: 2%; + } +/* + #vertical { + padding: 0 12px 0px 0px; + border-top: 2px solid #000077; + border-bottom: 2px solid #000077; + margin-left: 33%; + margin-right: 33%; + } */ + #vertical li { + display: block; + list-style-type: none; + } + #vertical a { + /* font-weight: normal; */ + line-height: 12px; + text-decoration: none; + color: #000077; + } + #vertical a.active, #vertical a:hover { + border-bottom: 2px solid #777777; + padding-bottom: 2px; + /* font-weight: bold; */ + color: #000077; + } + li.doc { + background: url(../image/bullet_doc.png) no-repeat 0 0; + padding-left: 16px; + margin-left: 10px; + margin-top: 0px; + margin-bottom: 0px; + margin-right: 0px; + font-size: 8px; + font-style: normal; + text-align: left; + } + li.ref { + background: none; + padding-left: 0; + margin-left: 0; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + font-size: 8px; + font-style: normal; + text-align: left; + } + li.refcenter { + /* background: url(../image/bullet_doc.png) no-repeat 0 0; */ + background: none; + padding-left: 20px; + margin-left: 10%; + font-size: 9px; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + text-align: center; + } + li.refbold { + background: url(../image/bullet_doc.png) no-repeat 0 0; + /* padding-left: 0px; */ + padding-left: 16px; + margin-left: 0; + margin-top: 0px; + margin-bottom: 0px; + margin-right: 10mm; + font-size: 8px; + font-weight: bold; + text-align: left; + } + h1 { + font-size: 120%; + margin-top: 20px; + } + h2 { + font-size: 115%; + margin-top: 20px; + } + h3 { + font-size: 110%; + margin-top: 20px; + } + h4 { + font-size: 105%; + } + h5 { + font-size: 100%; + } + h6 { + font-size: 100%; + } + h1.norm, h2.norm, h3.norm { + font-size: 110%; + margin-left: 10mm; + margin-right: 15mm; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + h1.top_band { + display: inline; + text-align: left; + margin-top: 0; + margin-left: 4mm; + text-indent: 0mm; + font-weight: bold; + font-size: 120%; + } + h2.top_band_tiny { + font-size: 10px; + font-weight: normal; + margin-top: 0px; + margin-left: 4mm; + text-indent: 0mm; + margin-bottom: 0px; + color: #777777; + margin-left: 140px; + margin-right: 0px; + text-align: left; + } + p.top_band { + display: inline; + text-align: left; + margin-top: 0; + margin-left: 140px; + text-indent: 0mm; + font-weight: bold; + font-size: 120%; + } + p.top_band_tiny { + font-size: 10px; + margin-top: 0px; + margin-bottom: 0px; + color: #777777; + margin-left: 140px; + margin-right: 0px; + text-align: left; + } + p.top_band_image { + float: left; + display: inline; + text-align: left; + margin-top: 0; + margin-left: 1mm; + text-indent: 0mm; + margin-right: 1mm; + } + h4.norm, h5.norm, h6.norm { + font-size: 100%; + margin-left: 10mm; + margin-right: 15mm; + text-align: left; + margin-top: 10px; + margin-bottom: 0px; + } + h1.i {margin-left: 10mm;} + h2.i {margin-left: 15mm;} + h3.i {margin-left: 20mm;} + h4.i {margin-left: 25mm;} + h5.i {margin-left: 30mm;} + h6.i {margin-left: 35mm;} + h1.banner { + font-weight: bold; + text-align: center; + font-size: 120%; + margin-left: 10mm; + margin-right: 15mm; + margin-top: 20px; + margin-bottom: 10px; + } + h1.subbanner { + font-weight: bold; + text-align: center; + font-size: 115%; + margin-left: 10mm; + margin-right: 15mm; + margin-top: 20px; + margin-bottom: 10px; + } + h2.banner { + font-weight: bold; + text-align: center; + font-size: 110%; + margin-left: 10mm; + margin-right: 15mm; + margin-top: 20px; + margin-bottom: 10px; + } + h3.banner { + font-weight: bold; + text-align: center; + color: #990000; + font-size: 105%; + margin-left: 10mm; + margin-right: 15mm; + margin-top: 20px; + margin-bottom: 10px; + } + h4.banner { + font-weight: bold; + text-align: center; + color: #ff0000; + font-size: 100%; + margin-left: 10mm; + margin-right: 15mm; + margin-top: 20px; + margin-bottom: 10px; + } + h5.banner { + font-weight: bold; + } + h6.banner { + font-weight: bold; + } + h1.toc { + margin-left: 0mm; + font-size: 115%; + margin-top: 6px; + margin-bottom: 6px; + line-height: 150%; + } + h2.toc { + margin-left: 5mm; + font-size: 110%; + margin-top: 6px; + margin-bottom: 6px; + line-height: 140%; + } + h3.toc { + margin-left: 10mm; + font-size: 105%; + margin-top: 6px; + margin-bottom: 6px; + line-height: 120%; + } + h4.toc { + margin-left: 15mm; + font-weight: normal; + font-size: 100%; + margin-top: 6px; + margin-bottom: 6px; + line-height: 120%; + } + h5.toc { + margin-left: 20mm; + font-weight: normal; + font-size: 95%; + margin-top: 6px; + margin-bottom: 6px; + line-height: 110%; + } + h6.toc { + margin-left: 25mm; + font-weight: normal; + font-size: 90%; + margin-top: 6px; + margin-bottom: 6px; + line-height: 110%; + } +/* microtoc (for later) --> */ + 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 +<<WOK + body {color: black; background: #{@vz.color_white}; margin:10px 10px 0px 10px; padding:0px;} + p { line-height: 1.5 } + a:link {color: #{@vz.color_blue_ink}; text-decoration: none; } + a:visited {color: #{@vz.color_blue_ink}; text-decoration: none; } + a:hover {color: #{@vz.color_black}; text-decoration: underline; background-color: #{@vz.color_yellow_light};} + a:active {color: #{@vz.color_blue_ink}; text-decoration: underline;} + #banner { + background:#{@vz.color_white}; + } + #column_left { + width:25%; + float:left; + background:#b9d4dd; + padding-bottom:10px; + } + #column_center { + width:55%; + float:left; + background:#{@vz.color_white}; + padding-bottom:10px; + } + #column_right { + width:20%; + float:left; + background:#b9d4dd; + padding-bottom:10px; + } + p,h1,pre { + font-family: #{fonts}; + margin:0px 10px 10px 10px; + } + h1 { + font-size:14px; + padding-top:10px; + } + #column_right p { font-size:12px} + #banner h1 { margin:0px; padding:10px} +WOK + end + def html_bk #stylesheet for html... check use +<<WOK + document { + display: block; + margin-left: 0mm; + margin-right: 0mm; + } + head { + display: block; + margin-bottom: 20px; + background-color: #dddddd; + } + dc,keywords,copyright { + display: block; + font-family: #{fonts}; + color: blue; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small%; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + keywords,copyright { + display: block; + font-family: #{fonts}; + color: red; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small%; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + table { + margin-left: 5%; + display: block; + } + tr { + display: block; + } + th, td { + display: inline; + } + th.left { + text-align: left; + } + td.right { + text-align: right; + } + body { + color: black; + background: #ffffff; + } + a:link { + color: #003399; + text-decoration: none; + } + a:visited { + color: #003399; + text-decoration: none; + /* background-color: #e3ecef; */ + } + a:hover { + color: #000000; + text-decoration: underline; + background-color: #fff3b6; + } + a:hover IMG { + background-color: #ffffff; + } + a:active { + color: #003399; + text-decoration: underline; + } + p { + display: block; + font-family: #{fonts}; + font-weight: normal; + text-align: justify; + font-size: 100%; + line-height: 150%; + margin-left: 5%; + margin-right: 5%; + margin-top: 2px; + margin-bottom: 0px; + } + p.norm { + } + p.h1 { + font-family: #{fonts}; + font-size: 120%; + font-weight: bold; + text-align: left; + line-height: 120%; + margin-top: 20px; + margin-bottom: 10px; + } + p.h2 { + font-weight: bold; + font-size: 110%; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + p.h3 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + p.h4 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + p.h5 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + p.h6 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + p.toc1 { + font-weight: bold; + font-size: small; + text-align: left; + line-height: 100%; + margin-left: 5%; + margin-right: 5%; + margin-top: 10px; + margin-bottom: 5px; + } + p.toc2 { + font-weight: bold; + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 5%; + margin-right: 10%; + margin-top: 10px; + margin-bottom: 5px; + } + p.toc3 { + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 5%; + margin-right: 10%; + margin-top: 10px; + margin-bottom: 5px; + } + p.toc4 { + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 10%; + margin-right: 10%; + margin-top: 5px; + margin-bottom: 5px; + } + p.toc5 { + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 15%; + margin-right: 10%; + margin-top: 5px; + margin-bottom: 5px; + } + p.toc6 { + font-size: x-small; + text-align: left; + line-height: 100%; + margin-left: 20%; + margin-right: 10%; + margin-top: 5px; + margin-bottom: 5px; + } +/* microtoc for use later --> */ +/* + +*/ +/* 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 +<<WOK +/* SiSU css xhtml & sax.xml default style */ + document { + display: block; + margin-left: 0mm; + margin-right: 0mm; + } + head { + display: block; + margin-bottom: 20px; + background-color: #dddddd; + } + meta { + display: inline; + line-height: 1; + font-size: 10px; + color: #990000; + margin-right: 2mm; + margin-top: 0px; + margin-bottom: 0px; + + } + title,subtitle,creator,author,translator,translated_by,illustrator,illustrated_by,prepared_by,digitized_by,type,subject,description,contributor,publisher,format,identifier,source,language,relation,coverage,rights,keywords,comment,comments,abastract,tags,catalogue,date,date_created,date_issued,date_available,date_modified,date_valid,structure,sc { + display: inline; + line-height: 1; + font-size: 10px; + color: #000099; + margin-top: 0px; + margin-bottom: 0px; + } + source_control { + display: block; + } + dc { + display: block; + font-family: #{fonts}; + color: blue; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + sc { + display: inline; + color: green; + } + keywords,copyright { + display: block; + font-family: #{fonts}; + color: red; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + table { + margin-left: 5%; + display: block; + } + tr { + display: block; + } + th,td { + display: inline; + } + body { + color: black; + background: #ffffff; + } + a:link { + color: #003399; + text-decoration: none; + } + a:visited { + color: #003399; + text-decoration: none; + /* background-color: #e3ecef; */ + } + a:hover { + color: #000000; + text-decoration: underline; + background-color: #fff3b6; + } + a:hover IMG { + background-color: #ffffff; + } + a:active { + color: #003399; + text-decoration: underline; + } + object { + display: block; + margin-left: 2mm; + margin-right: 2mm; + margin-top: 4px; + margin-bottom: 8px; + } + text,text[class|="norm"] { + display: block; + font-family: #{fonts}; + text-align: justify; + font-weight: normal; + font-size: 100%; + line-height: 150%; + margin-left: 5%; + margin-right: 5%; + margin-top: 2px; + margin-bottom: 0px; + } + text[class|="h1"] { + font-size: 120%; + font-weight: bold; + text-align: left; + line-height: 120%; + margin-top: 20px; + margin-bottom: 10px; + } + text[class|="h2"] { + font-weight: bold; + font-size: 110%; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + text[class|="h3"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="h4"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="h5"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="h6"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="indent1"] { + margin-left: 10%; + } + text[class|="indent2"] { + margin-left: 15%; + } + text[class|="verse"], text[class|="group"], text[class|="code"] { + text-align: left; + } + ocn { + display: block; + text-align: right; + vertical-align: super; + color: #990000; + font-size: xx-small; + margin-right: 0mm; + margin-top: 0px; + margin-bottom: 0px; + } + endnote { + display: block; + font-size: small; + font-family: #{fonts}; + font-weight: normal; + line-height: 150%; + text-align: justify; + margin-left: 10%; + margin-right: 5%; + margin-top: 4px; + margin-bottom: 0px; + } + endnote_indent { + display: block; + font-size: small; + font-family: #{fonts}; + font-weight: normal; + line-height: 150%; + text-align: justify; + margin-left: 15%; + margin-right: 5%; + margin-top: 4px; + margin-bottom: 0px; + } + en { + font-size: xx-small; + vertical-align: super; + } + i { font-style: italic; } + b { font-style: bold; } + u { text-decoration: underline; } + br { display: block; } +WOK + end + def xml_sax #stylesheet for xml sax + xhtml + end + def xml_dom #sylesheet for xml dom, work on, starts from copy of css_xhtml +<<WOK +/* SiSU css dom.xml default style */ + document { + display: block; + margin-left: 0mm; + margin-right: 0mm; + } + head { + display: block; + margin-bottom: 20px; + background-color: #dddddd; + } + header { + display: block; + } + meta { + display: inline; + line-height: 1; + font-size: 10px; + color: #990000; + margin-right: 2mm; + margin-top: 0px; + margin-bottom: 0px; + + } + title,subtitle,creator,author,translator,translated_by,illustrator,illustrated_by,prepared_by,digitized_by,type,subject,description,contributor,publisher,format,identifier,source,language,relation,coverage,rights,keywords,comment,comments,abastract,tags,catalogue,date,date_created,date_issued,date_available,date_modified,date_valid,structure,sc { + display: inline; + line-height: 1; + font-size: 10px; + color: #000099; + margin-top: 0px; + margin-bottom: 0px; + } + source_control { + display: block; + } + dc { + display: block; + font-family: #{fonts}; + color: blue; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + sc { + display: inline; + color: green; + } + keywords,copyright { + display: block; + font-family: #{fonts}; + color: red; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + body { + color: black; + background: #ffffff; + } + a:link { + color: #003399; + text-decoration: none; + } + a:visited { + color: #003399; + text-decoration: none; + /* background-color: #e3ecef; */ + } + a:hover { + color: #000000; + text-decoration: underline; + background-color: #fff3b6; + } + a:hover IMG { + background-color: #ffffff; + } + a:active { + color: #003399; + text-decoration: underline; + } + object { + display: block; + margin-left: 2mm; + margin-right: 2mm; + margin-top: 4px; + margin-bottom: 8px; + } + heading { + font-weight: bold; + } + contents { + font-weight: normal; + } + text { + display: block; + font-family: #{fonts}; + text-align: justify; + font-size: 100%; + line-height: 150%; + margin-left: 5%; + margin-right: 5%; + margin-top: 2px; + margin-bottom: 0px; + } + text[class|="norm"] { + font-weight: normal; + } + text[class|="h1"] { + font-size: 120%; + font-weight: bold; + text-align: left; + line-height: 120%; + margin-top: 20px; + margin-bottom: 10px; + } + text[class|="h2"] { + font-weight: bold; + font-size: 110%; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + text[class|="h3"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="h4"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="h5"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="h6"] { + font-size: 110%; + font-weight: bold; + text-align: left; + } + text[class|="indent1"] { + margin-left: 10%; + } + text[class|="indent2"] { + margin-left: 15%; + } + text[class|="verse"], text[class|="group"], text[class|="code"] { + text-align: left; + } + table { + margin-left: 5%; + display: block; + } + tr { + display: block; + } + th, td { + display: inline; + } + nametag { + display: none; + } + number { + padding-right: 4px; + } + ocn { + font-weight: normal; + display: block; + text-align: right; + vertical-align: super; + color: #990000; + font-size: xx-small; + margin-right: 0mm; + margin-top: 0px; + margin-bottom: 0px; + } + endnote { + display: block; + font-size: small; + font-family: #{fonts}; + font-weight: normal; + line-height: 150%; + text-align: justify; + margin-left: 10%; + margin-right: 5%; + margin-top: 4px; + margin-bottom: 0px; + } + endnote_indent { + display: block; + font-size: small; + font-family: #{fonts}; + font-weight: normal; + line-height: 150%; + text-align: justify; + margin-left: 15%; + margin-right: 5%; + margin-top: 4px; + margin-bottom: 0px; + } + en { + font-size: xx-small; + vertical-align: super; + } + i { font-style: italic; } + b { font-style: bold; } + u { text-decoration: underline; } + br { display: block; } +WOK + end + def docbook_xml #stylesheet for docbook +<<WOK +/* SiSU css docbook.xml default style */ + book { + display: block; + margin-left: 0mm; + margin-right: 0mm; + } + bookinfo { + display: block; + margin-bottom: 20px; + background-color: #dddddd; + } + source_control { + display: block; + } + dc,sc { + display: block; + font-family: #{fonts}; + color: blue; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + sc { + color: green; + } + keywords,copyright { + display: block; + font-family: #{fonts}; + color: red; + background-color: #dddddd; + font-weight: normal; + text-align: justify; + font-size: xx-small; + line-height: 120%; + margin-left: 5%; + margin-right: 5mm; + margin-top: 0px; + margin-bottom: 0px; + } + body { + color: black; + background: #ffffff; + } + a:link { + color: #003399; + text-decoration: none; + } + a:visited { + color: #003399; + text-decoration: none; + /* background-color: #e3ecef; */ + } + a:hover { + color: #000000; + text-decoration: underline; + background-color: #fff3b6; + } + a:hover IMG { + background-color: #ffffff; + } + a:active { + color: #003399; + text-decoration: underline; + } + object { + display: block; + margin-left: 2mm; + margin-right: 2mm; + margin-top: 4px; + margin-bottom: 8px; + } + part { + display: block; + /* font-weight: bold; */ + } + contents { + font-weight: normal; + } + para { + display: block; + font-family: #{fonts}; + /* font-weight: normal; */ + text-align: justify; + font-size: 100%; + line-height: 150%; + margin-left: 5%; + margin-right: 5%; + margin-top: 2px; + margin-bottom: 0px; + } + para.verse, para.group, para.code { + text-align: left; + } + para.norm { + font-family: #{fonts}; + font-weight: normal; + } + para.h1, title { + display: block; + font-family: #{fonts}; + font-size: 120%; + font-weight: bold; + text-align: left; + line-height: 120%; + margin-top: 20px; + margin-bottom: 10px; + } + para.h2 { + font-weight: bold; + font-size: 110%; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + para.h3 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + para.h4 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + para.h5 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + para.h6 { + font-size: 110%; + font-weight: bold; + text-align: left; + } + table { + margin-left: 5%; + display: block; + } + tr { + display: block; + } + th, td { + display: inline; + } + nametag { + display: none; + } + number { + padding-right: 4px; + } + ocn { + font-weight: normal; + display: block; + text-align: right; + vertical-align: super; + color: #990000; + font-size: xx-small; + margin-right: 0mm; + margin-top: 0px; + margin-bottom: 0px; + } + endnote { + display: block; + font-size: small; + font-family: #{fonts}; + font-weight: normal; + line-height: 150%; + text-align: justify; + margin-left: 10%; + margin-right: 5%; + margin-top: 4px; + margin-bottom: 0px; + } + endnote_indent { + display: block; + font-size: small; + font-family: #{fonts}; + font-weight: normal; + line-height: 150%; + text-align: justify; + margin-left: 15%; + margin-right: 5%; + margin-top: 4px; + margin-bottom: 0px; + } + en { + font-size: xx-small; + vertical-align: super; + } + i { font-style: italic; } + b { font-style: bold; } + u { text-decoration: underline; } + br { display: block; } +WOK + end + def css_xhtml_p #stylesheet for ... +<<WOK + body { + color: black; + background: #ffffff; + } + a:link { + color: #003399; + text-decoration: none; + } + a:visited { + color: #003399; + text-decoration: none; + /* background-color: #e3ecef; */ + } + a:hover { + color: #000000; + text-decoration: underline; + background-color: #fff3b6; + } + a:hover IMG { + background-color: #ffffff; + } + a:active { + color: #003399; + text-decoration: underline; + } + object { + display: block; + margin-top: 3px; + margin-bottom: 3px; + margin-right: 5mm; + } + p { + display: block; + font-family: #{fonts}; + font-size: 100%; + font-weight: normal; + line-height: 150%; + text-align: justify; + margin-left: 10mm; + margin-top: 3px; + margin-bottom: 0px; + margin-right: 5mm + } + p.norm { + } + p.endnote { + font-size: 100%; + margin-left: 20%; + text-indent: 5% + } + p.endnote_indent { + font-size: 100%; + margin-left: 25%; + text-indent: 5% + } + p.h1 { + font-family: #{fonts}; + font-weight: bold; + line-height: 120%; + margin-left: 10mm; + margin-right: 10mm; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + p.h2 { + font-weight: bold; + font-size: 110%; + margin-left: 10mm; + margin-right: 15mm; + text-align: left; + margin-top: 20px; + margin-bottom: 10px; + } + p.h3 { + font-size: 150%; + font-weight: bold; + text-align: left; + } + p.h4 { + font-size: 150%; + font-weight: bold; + text-align: left; + } + p.h5 { + font-size: 150%; + font-weight: bold; + text-align: left; + } + p.h6 { + font-size: 150%; + font-weight: bold; + text-align: left; + } + ocn { + display: block; + text-align: right; + vertical-align: super; + color: #990000; + font-size: xx-small; + margin-top: 0px; + margin-bottom: 6px; + } + en { + font-size: xx-small; + vertical-align: super; + } + i { font-style: italic; } + b { font-style: bold; } + u { text-decoration: underline; } + br { display: block; } +WOK + end + end +end + +__END__ + diff --git a/lib/sisu/0.52/dal.rb b/lib/sisu/0.52/dal.rb new file mode 100644 index 00000000..43a4f015 --- /dev/null +++ b/lib/sisu/0.52/dal.rb @@ -0,0 +1,1089 @@ +=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: preprocessing, (document abstraction), data abstraction used in subsequent 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_DAL + require SiSU_lib + '/defaults' + require SiSU_lib + '/sysenv' + require SiSU_lib + '/param' + require SiSU_lib + '/dal_syntax' + require SiSU_lib + '/dal_doc_str' + require SiSU_lib + '/i18n' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + include Syntax + class Instantiate < SiSU_Param::Parameters::Instructions + def initialize + @@flag_vocab=0 + @@endnote={} + @@endnote_array=@@word_mode=[] + @@endnote_counter,@@endnote_counter_asterisk,@@endnote_counter_dag=1,1,1 #added + @@line_mode='' + end + end + class Source <Instantiate + @@dal_array=[] + @@fns=nil + def initialize(opt) + @opt=opt + @@fns||@opt.fns + @my_make_fns=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns) + @fnm=@my_make_fns.marshal_meta + SiSU_Env::Create_system_link.new.images + end + def read #creates dal + begin + dal=[] + @@dal_array=[] + @@fns=@opt.fns + create_dal + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + Instantiate.new + end + end + def get #reads dal, unless does not exist then creates first + begin + dal=[] + unless @@fns==@opt.fns + @@fns=@opt.fns + @@dal_array=[] + end + dal=if @@dal_array.empty?; read_fnm + else @@dal_array.dup #check + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + Instantiate.new + end + end + protected + def create_dal + dal_array=[] + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Document Abstraction') + tell.green_title_hi unless @opt.cmd =~/q/ + file_array=IO.readlines(@opt.fns,'') + file_array.each do |l| + if l =~/\r\n/; l.gsub!(/\r\n/,"\n") + end + end + meta=file_array.dup + meta=meta.join.split("\n\n") #check whether can be eliminated, some of these are large objects to have twice + @md=SiSU_Param::Parameters::Instructions.new(meta,@opt).extract + meta=nil + dal=SiSU_DAL::Make.new(@md,file_array).song + SiSU_Screen::Ansi.new(@md.cmd,@md.fns,"~meta/#{@md.fns}.meta").output if @md.cmd =~/v/ + tell=SiSU_Screen::Ansi.new(@md.cmd,"dal -> #{@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!(/ \/\//,'<br />') #added 2004w29 + para.gsub!(/<br>/,'<br />') #needed by xml, xhtml etc. + #para.gsub!(/<p>/,'<p />') #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!(/<url:(\S+?)>/,'\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']} <p /><br />\r " + + "#{@@endnote['seg_name_3']} <p /> " + + "#{@@endnote['special_align_close']}") + para.gsub!(/<:2>\s*<:ee>/, + "#{@@endnote['special_align']} <p /><br />\r " + + "#{@@endnote['seg_name_2']} <p />" + + "#{@@endnote['special_align_close']}") + para.gsub!(/<:1>\s*<:ee>/, + "#{@@endnote['special_align']} <p /><br />\r " + + "#{@@endnote['seg_name_1']} <p /> " + + "#{@@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<ENDNOTES>" + @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$|<table|<\/table>|<td|<\/td>|<th|<\/th>|<tr>|<\/tr>|<hr width|<:4-endnotes>|\[endnotes\]|<:zz>|<:isbn-|<:journal-|<:conference-|<ENDNOTES?>/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 <!e(\d)!> <!e_(\d)!> --> + 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 <!e!> <!e_!> --> + 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 /^(<!e[:_]!>|[-~]\{{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}: <u>#{@md.dc_title}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~(?:creator|author)/ + "\n#{@tr.creator}: <u>#{@md.dc_creator}</u> <~0;m#{ocnm};d#{ocnd}>" + when /0~(?:translator|translated_by)/ + "\n#{@tr.translator}: <u>#{@md.translator}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~(?:illustrator|illustrated_by)/ + "\n#{@tr.illustrator}: <u>#{@md.illustrator}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~prepared_by/ + "\n#{@tr.prepared_by}: <u>#{@md.prepared_by}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~digitized_by/ + "\n#{@tr.digitized_by}: <u>#{@md.digitized_by}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~description/ + "\n#{@tr.description}: <u>#{@md.dc_description}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~subject/ + "\n#{@tr.subject}: <u>#{@md.dc_subject}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~abstract/ + "\n#{@tr.abstract}: <u>#{@md.dc_abstract}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~publisher/ + "\n#{@tr.publisher}: <u>#{@md.dc_publisher}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~contributor/ + "\n#{@tr.contributor}: <u>#{@md.dc_contributor}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.created/ + "\n#{@tr.date_created}: <u>#{@md.dc_date_created}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.issued/ + "\n#{@tr.date_issued}: <u>#{@md.dc_date_issued}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.available/ + "\n#{@tr.date_available}: <u>#{@md.dc_date_available}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.modified/ + "\n#{@tr.date_modified}: <u>#{@md.dc_date_modified}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~date.valid/ + "\n#{@tr.date_valid}: <u>#{@md.dc_date_valid}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~date/ + "\n#{@tr.date}: <u>#{@md.dc_date}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~type/ + "\n#{@tr.type}: <u>#{@md.dc_type}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~format/ + "\n#{@tr.format}: <u>#{@md.dc_format}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~rights/ + "\n#{@tr.rights}: <u>#{@md.dc_rights}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~identifier/ + "\n#{@tr.identifier}: <u>#{@md.dc_identifier}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~source/ + "\n#{@tr.source}: <u>#{@md.dc_source}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~language/ + "\n#{@tr.language}: <u>#{@md.dc_language}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~language.original/ + "\n#{@tr.language_original}: <u>#{@md.language_original}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~relation/ + "\n#{@tr.relation}: <u>#{@md.dc_relation}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~coverage/ + "\n#{@tr.coverage}: <u>#{@md.dc_coverage}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~keywords/ + "\n#{@tr.keywords}: <u>#{@md.keywords}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~comments/ + "\n#{@tr.comments}: <u>#{@md.comments}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_loc/ + "\n#{@cls_dewey}: <u>#{@md.cls_dewey}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_dewey/ + "\n#{@tr.cls_dewey}: <u>#{@md.cls_dewey}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_gutenberg|0~cls_pg/ + "\n#{@tr.cls_gutenberg}: <u>#{@md.cls_gutenberg}</u> <~0;m#{ocnm};d#{ocnd}>" + #"\n#{@tr.cls_gutenberg}: <u>#{@md.cls_pg}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~cls_isbn/ + "\n#{@tr.cls_isbn}: <u>#{@md.cls_isbn}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~prefix(?:_a)?/ + "\n#{@tr.prefix_a}: <u>#{@md.prefix_a}</u> <~0;m#{ocnm};d#{ocnd}>" + when /^0~prefix_b/ + "\n#{@tr.prefix_b}: <u>#{@md.prefix_b}</u> <~0;m#{ocnm};d#{ocnd}>" + else para.gsub(/^0~(#{m})\s+(.+)/m,"\n#{m.capitalize}: <u>\\2</u> <~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}: <u>#{@md.sc_number}</u> <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + @cvs << "#{@tr.sc_date}: <u>#{@md.sc_date}</u> <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + @cvs << "CVS/RCS time: <u>#{@md.sc_time}</u> <~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}: <u>#{@md.sc_filename}</u> <~0;m#{ocnm};v#{ocnv}>" + else @rc << "#{@tr.sourcefile}: <u>#{@md.fns}</u> <~0;m#{ocnm};v#{ocnv}>" + end + ocnm+=1; ocnv+=1 + if @md.file_encoding and @md.file_encoding.length > 3 #translate + @rc << "Filetype: <u>#{@md.file_encoding}</u> <~0;m#{ocnm};v#{ocnv}>" + end + ocnm+=1; ocnv+=1 + if @md.dgst #change. enable by default + @rc << "#{@tr.sourcefile_digest}, #{@md.dgst[0]} <u>#{@md.dgst[1]}</u> <~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]} <u>#{@md.dgst_skin[1]}</u> <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + end + @rc << "<b>Generated</b> #{head_no_rc}" if @rc.length > 0 + @rc << "#{@tr.last_generated}: <u>#{Time.now}</u> <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + if @md.sisu_version[:version] + @rc << "#{@tr.sisu_version}: <u>#{@md.sisu_version[:project]}</u> <u>#{@md.sisu_version[:version]}</u> of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]}) <~0;m#{ocnm};v#{ocnv}>" + ocnm+=1; ocnv+=1 + end + @rc << "#{@tr.ruby_version}: <u> #{@md.ruby_version}</u> <~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 << "<b>Dublin Core</b> (DC) #{head_no_dc}" if @dc.length > 0 + meta << "<i>DC tags included with this document are provided here.</i> #{head_no_dc_tag}" if @dc.length > 0 + @dc.each { |x| meta << x } + meta << "<b>Version Information</b> #{head_no_rc}" if @rc.length > 0 + if @cvs.length > 0 + meta << "<i>Note the version information provided here, is specific to the host site.</i> #{head_no_rc_tag}" + @cvs.each { |x| meta << x } + end + @rc.each { |x| meta << x } + ## ENDNOTE RELATED endnote related + meta << "\n<EOF>" + 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>(.+?)<\/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>(.+?)<\/del>/,'DELETED(\1)') # deletions + s=s.gsub(/<sup>(\d+)<\/sup>/,'[\1]') + s=s.gsub(/(?: \\;)+/,' ') + #s=s.gsub(/<!T[h]?¡.+?!>/,"[TABLE]\n") # tables + #s=s.gsub(/<!¡¡\d+(.+?)!>/,'\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|<table|<\/table>|<td|<\/td>|<th|<\/th>|<tr>|<\/tr>|<hr width|<:4-endnotes>|\[endnotes\]|<:zz>|<:isbn-|<:journal-|<:conference-|<ENDNOTES?>/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=~/<!TZ!>/; 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 =~/<!Th?¡/; para.gsub!(/(<!Th?¡.+?!)>/,"\\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; ]*\}/ + "<!Th¡ c#{@row[2].length}; #{widths}!>" + elsif para =~/\{(?:t|table)(?:\sc\d+;)?[\d; ]*\}/ + "<!T¡ c#{@row[2].length}; #{widths}!>" + end + @row.each do |l| + l << '' if l.length == (@row[1].length - 1) + table=[] + if l.length == @row[1].length + table << '<!' #'<tr>' + n= -1 + l.each do |c| + n +=1 #'<td>' + c + '</td>' + table << if c =~/\A(?:\n)?\s*\Z/ + "¡¡#{w[n]}¡" + ' ' + else + "¡¡#{w[n]}¡" + c.strip + end + end + table << '!>' #'</tr>' + tuned_file << table.join + end + end + tuned_file << '<!TZ!>' #'</table>' + 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>/,'<span style="background-color: rgb(255,240,196)">') # bright yellow rgb(255,255,0) pale yellow rgb(255,255,200) + para.gsub!(/<:\/hi>/,%{</span>}) + 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+?;.+?)$/,'<!Th¡ \1!>') + para.gsub!(/table\{\s+(c\d+?;.+?)$/,'<!T¡ \1!>') + @@flag['table_to']=true + end + if @@flag['table_to'] and para =~/\}table/ + para.gsub!(/^\}table\s*$/,"<!TZ!>\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,'<!\1!>') unless para =~/<!Th?¡/ + end + para.gsub!(/\n/,' ') + para.strip! + @tuned_table << para + else + para.gsub!(/\n/,' ') unless para =~/<:(?:code|verse|alt|group)>/ + 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)>|<!TZ!>)/ + line.gsub!(/(.+)/,"¡¡#{@@column[@@counter]}¡\\1") unless line =~/<!Th?¡/ + @@counter+=1 + end + end + data + end + end +end +__END__ diff --git a/lib/sisu/0.52/dal_syntax.rb b/lib/sisu/0.52/dal_syntax.rb new file mode 100644 index 00000000..53d55da2 --- /dev/null +++ b/lib/sisu/0.52/dal_syntax.rb @@ -0,0 +1,330 @@ +=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: Syntax for markup, input markup syntaxes, determined here + + * 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 Syntax + class Words + def initialize(line,md,mkp) + @line,@md,@mkp=line,md,mkp + end + end + class Markup + def initialize(md='',data='') + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @data_new=[] + @http_m='\{.+?\}http://\S+|http:\S+|\.\.\/\S+|\S+?\.png\b|[*]~\S+|^0~.+|<:(?:code|group|alt|verse)(?:-end)?>|<: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],'<i>\1</i>') + elsif defined? @vz.markup_make_italic and @vz.markup_make_italic + w.gsub!(@vz.markup_make_italic,'<i>\1</i>') + 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*)+)/,'<b>\1</b> \2') + given.gsub!(/(?:^!_|^[789]~)\s+(.+?)\s*([~-]#)$/,'<b>\1</b> \2') + given.gsub!(/(?:^!_\s+|^[789]~\s+)(.*)?\s*$/,'<b>\1</b>') + 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],'<b>\1</b>') + elsif defined? @vz.markup_make_bold and @vz.markup_make_bold #defaults and skin adjusted bold word list + w.gsub!(@vz.markup_make_bold,'<b>\1</b>') + 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 <strong>emphasis</strong> + # *{bold text}* b{bold}b <b>bold text</b> + # _{underline}_ u{underline}u <u>underline</u> + # /{italics}/ i{italics}i <i>italics</i> + # "{citation}" c{citation}c <cite>citation</cite> #blockquote? + # ^{superscript}^ <sup>superscript</sup> + # ,{subscript}, <sub>subscript</sub> + # +{inserted text}+ <ins>inserted text</ins> + # -{deleted text}- <del>deleted text</del> + # {url address}:url + # {image.png}imageurl + # {image.png}png + # ~{endnote}~ <!e endnote !> + # !_ #bold/emphasise paragraph + # _" #blockquote paragraph + # _1 <!i1!> #indent paragraph 1 step + # _2 <!i2!> #indent paragraph 2 steps + # _* #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!(/<!(\S+)!>/,'<:\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!(/\\\#/,'#') #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 <a name="\\1"></a> + line.gsub!(/^([56]~)(\S+)(.+)/,'\1\2 \3 <:name#\2>') #html name marker <a name="\\1"></a>, 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>/,'<br />') #xml requires + # depreciated --> + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)e\{(.+?)\}e/,'\1<b>\2</b>') #emphasis + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)b\{(.+?)\}b/,'\1<b>\2</b>') #bold + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)u\{(.+?)\}u/,'\1<u>\2</u>') #underscore + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)c\{(.+?)\}c/,'\1<cite>\2</cite>') #cite /blockquote? + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)i\{(.+?)\}i/,'\1<i>\2</i>') #italics + # depreciated ^ + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)!\{(.+?)\}!/,'\1<em>\2</em>') #emphasis + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)\*\{(.+?)\}\*/,'\1<b>\2</b>') #bold + line.gsub!(/(^|\s+|['"]| |[\(\[\{]|\>)_\{(.+?)\}_/,'\1<u>\2</u>') #underscore + line.gsub!(/(^|\s+|['"]| |[\(\[]|\(|\>)\/\{(.+?)\}\//,'\1<i>\2</i>') #italics + line.gsub!(/(^|\s+|['"]| |\(|\>)\"\{(.+?)\}\"/,'\1<cite>\2</cite>') #cite /blockquote? + line.gsub!(/(^|[^\\])\^\{(.+?)\}\^/,'\1<sup>\2</sup>') #superscript + line.gsub!(/(^|\s+|['"]| |\(|\>|\S)9\{(.+?)\}9/,'\1<sup>\2</sup>') #superscript + line.gsub!(/(^|[^\\]),\{(.+?)\},/,'\1<sub>\2</sub>') #subscript + line.gsub!(/(^|\s+|['"]| |\(|\>)6\{(.+?)\}6/,'\1<sub>\2</sub>') #subscript + line.gsub!(/(^|\s+|['"]| |\(|\>)\+\{(.+?)\}\+/,'\1<ins>\2</ins>') #inserted text + line.gsub!(/(^|\s+|['"]| |\(|\>)v\{(.+?)\}v/,'\1<ins>\2</ins>') #inserted text + line.gsub!(/(^|\s+|['"]| |\(|\>)-\{(.+?)\}-/,'\1<del>\2</del>') #strikethrough - deleted text + line.gsub!(/(^|\s+|['"]| |\(|\>)x\{(.+?)\}x/,'\1<del>\2</del>') #deleted text + line.gsub!(/(^|\s+|['"]| |\(|\>)\*(\S+?)\*/,'\1<b>\2</b>') #bold single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>)\!(\S+?)\!/,'\1<b>\2</b>') #bold single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>)\/([\(\)a-zA-Z0-9']+?)\/([^a-zA-Z0-9]|[ ,.;:'"~$]|$)/,'\1<i>\2</i>\3') #italics single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>)_(\S+?)_/,'\1<u>\2</u>') #underscore single word, watch + line.gsub!(/(^|\s+)-([^{]\S+?)-( |$)/,'\1<del>\2</del>\3') #underscore single word, watch + line.gsub!(/(^|\s+|['"]| |\(|\>|\d+)\^(\S+?)\^/,'\1<sup>\2</sup>') #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!(/(?:<br>|<br \/>)\s*_[12]\s+/,'<br> ') #indent used in endnotes, not implemented, replace when ready with: line.gsub!(/(?:<br>|<br \/>)\s*_([12])\s+/,'<br><:i\1> ') + #line.gsub!(/^\s*_([12])\s+/,"<:i\\1> ") + #line.gsu!b!(/^\s*_([12])\s+/,"<!i\\1!> ") #indent line + line.gsub!(/<:?br>/,'<br />') #adjustment 2004w41, from # line.gsub!(/<br>/,'<br />') + ##added + #line.gsub!(/(?:^!_\s+|^[78]~\s+|<:b>)(.*)?([~-]#)$/i,"<b>\\1</b> \\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,"<b>\\1</b>") #bold paragraph/emphasize #may wish to remove think about 7{ 8{ conversion not satisfactory, as information is lost! + #line.gsub!(/(?:(?:^| )!_ |^[78]~ |<:b>)(.*)\n/mi,"<b>\\1</b> ") #bold paragraph/emphasize #may wish to remove think about 7{ 8{ conversion not satisfactory, as information is lost! + #line.gsub!(/^_" (.*)\n/i,"<blockquote>\\1</blockquote> ") #blockquotes #introduce KEEP + line.gsub!(/<:hi>/,'<span style="background-color: rgb(255,240,196)">') # bright yellow rgb(255,255,0) pale yellow rgb(255,255,200) + line.gsub!(/<:\/hi>/,'</span>') + line.gsub!(/(<:verse>.+)/m,"\\1\n") + line.gsub!(/[ ]+($)/,'\1') + if line =~/(<:(?:verse|group)>)/; line.gsub!(/(<:(?:verse|group)>)/i,"\\1\n") #cosmetic + else line.gsub!(/(<br \/>)/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 <strong>emphasis</strong> + # *{bold text}* b{bold}b <b>bold text</b> + # _{underline}_ u{underline}u <u>underline</u> + # /{italics}/ i{italics}i <i>italics</i> + # "{citation}" c{citation}c <cite>citation</cite> + # ^{superscript}^ <sup>superscript</sup> + # ,{subscript}, <sub>subscript</sub> + # +{inserted text}+ <ins>inserted text</ins> + # -{deleted text}- <del>deleted text</del> + # {url address}:url + # {image.png}imageurl + # {image.png}png + # ~{endnote}~ <!e endnote !> + # +1 <!i1!> + # +2 <!i2!> + puts 'tech' + @data.each do |line| + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)e\{(.+?)\}e/,'\1<b>\2</b>') #emphasis + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)b\{(.+?)\}b/,'\1<b>\2</b>') #bold + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)u\{(.+?)\}u/,'\1<u>\2</u>') #underscore + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)c\{(.+?)\}c/,'\1<cite>\2</cite>') #cite + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)i\{(.+?)\}i/,'\1<i>\2</i>') #italics + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)!\{(.+?)\}!/,'\1<em>\2</em>') #emphasis + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)\*\{(.+?)\}\*/,'\1<b>\2</b>') #bold + line.gsub!(/(^|\s+|['"]|[\(\[]|\>)_\{(.+?)\}_/,'\1<u>\2</u>') #underscore + line.gsub!(/(^|\s+|['"]|[\(\[]|\(|\>)\/\{(.+?)\}\//,'\1<i>\2</i>') #italics + line.gsub!(/(^|\s+|['"]|\(|\>)\"\{(.+?)\}\"/,'\1<cite>\2</cite>') + line.gsub!(/(^|\s+|['"]|\(|\>|\S)\^\{(.+?)\}\^/,'\1<sup>\2</sup>') + line.gsub!(/(^|\s+|['"]|\(|\>|\S)9\{(.+?)\}9/,'\1<sup>\2</sup>') + line.gsub!(/(^|\s+|['"]|\(|\>),\{(.+?)\},/,'\1<sub>\2</sub>') + line.gsub!(/(^|\s+|['"]|\(|\>)6\{(.+?)\}6/,'\1<sub>\2</sub>') + line.gsub!(/(^|\s+|['"]|\(|\>)\+\{(.+?)\}\+/,'\1<ins>\2</ins>') + line.gsub!(/(^|\s+|['"]|\(|\>)v\{(.+?)\}v/,'\1<ins>\2</ins>') + line.gsub!(/(^|\s+|['"]|\(|\>)-\{(.+?)\}-/,'\1<del>\2</del>') + line.gsub!(/(^|\s+|['"]|\(|\>)x\{(.+?)\}x/,'\1<del>\2</del>') + line.gsub!(/(^|\s+|['"]|\(|\>)\*(\S+?)\*/,'\1<b>\2</b>') #bold single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>)\!(\S+?)\!/,'\1<b>\2</b>') #bold single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>)\/([\(\)a-zA-Z0-9']+?)\/([ ,.;:'"~$]|[^a-zA-Z0-9])/,'\1<i>\2</i>\3') #italics single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>)_(\S+?)_/,'\1<u>\2</u>') #underscore single word, watch + line.gsub!(/(^|\s+|['"]|\(|\>|\d+)\^(\S+?)\^/,'\1<sup>\2</sup>') #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>/,'<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 <!e_(\d+)!>'; + COMMENT ON COLUMN endnotes.clean + IS 'endnote substantive content, stripped of markup'; + COMMENT ON COLUMN endnotes.body + IS 'endnote substantive content'; + COMMENT ON COLUMN endnotes.ocn + IS 'object citation no# <\~(\d+)> from which endnote is referenced'; + COMMENT ON COLUMN 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 <!e_(\d+)!>'; + COMMENT ON COLUMN endnotes_asterisk.clean + IS 'endnote substantive content, stripped of markup'; + COMMENT ON COLUMN endnotes_asterisk.body + IS 'endnote substantive content'; + COMMENT ON COLUMN endnotes_asterisk.ocn + IS 'object citation no# <\~(\d+)> from which endnote is referenced'; + COMMENT ON COLUMN 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 <!e_(\d+)!>'; + COMMENT ON COLUMN endnotes_plus.clean + IS 'endnote substantive content, stripped of markup'; + COMMENT ON COLUMN endnotes_plus.body + IS 'endnote substantive content'; + COMMENT ON COLUMN endnotes_plus.ocn + IS 'object citation no# <\~(\d+)> from which endnote is referenced'; + COMMENT ON COLUMN 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>/,"<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!(/<sup>(\d+)<\/sup>/,'[\1]') + string.gsub!(/<:i[12]>/,'') + string.gsub!(/(?: \\;)+/,' ') + string.gsub!(/<!T[h]?¡.+?!>/,"[TABLE]\n") #tables + string.gsub!(/<!¡¡\d+(.+?)!>/,'\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>(.+?)<\/b>/,'\1') # remove bold, italics, underscore + data.gsub!(/<i>(.+?)<\/i>/,'\1') # remove bold, italics, underscore + data.gsub!(/<u>(.+?)<\/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+).+?\}~/,'<sup>\1</sup>') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'<sup>\1</sup>') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'<sup>\1</sup>') + 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+).+?\}~/,'<sup>\1</sup>') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'<sup>\1</sup>') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'<sup>\1</sup>') + 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+).+?\}~/,'<sup>\1</sup>') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'<sup>\1</sup>') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'<sup>\1</sup>') + 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+).+?\}~/,'<sup>\1</sup>') + end + if txt =~/~\[\*.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_ast << txt.scan(/~\[[*](\d+).+?\]~/) + txt.gsub!(/~\[([*]\d+).+?\]~/,'<sup>\1</sup>') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'<sup>\1</sup>') + 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+).+?\}~/,'<sup>\1</sup>') + #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+).+?\]~/,'<sup>\1</sup>') + end + if txt =~/~\[\+.+?\]~/ + word_mode=txt.scan(/\S+/) + endnote_range(word_mode) + @en_pls << txt.scan(/~\[[+](\d+).+?\]~/) + txt.gsub!(/~\[([+]\d+).+?\]~/,'<sup>\1</sup>') + 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=~/<!T[h]?¡.+?!~\d+;\w\d+;\w\d+>/ #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 + %{ <link rel="stylesheet" href="./#{@dir.path.style}/index.css" type="text/css" />} + end + #% text #changed from txt to avoid naming conflicts #FOLLOW + def txt_generator + v=SiSU_Env::Info_version.new.get_version + %{ <meta name="generator" content="#{v[:project]} #{v[:version]} of #{v[:date_stamp]} (#{v[:date]}) (n*x and Ruby!)" /> + <link rel="generator" href="http://www.jus.uio.no/sisu" />} + end + def txt_generator_comment + v=SiSU_Env::Info_version.new.get_version + %{ <!- #{v[:project]} #{v[:version]} of #{v[:date_stamp]} (#{v[:date]}) (n*x and Ruby!)" http://www.jus.uio.no/sisu ->} + 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 + %{<body bgcolor="#ffffff" text="#000000" link="#003090" lang="en" xml:lang="en">} + 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<body bgcolor="#ffffff" text="#000000" link="#003090" lang="en" xml:lang="en">\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 + %{<p class="normal">} + end + def paragraph_txt_00 + %{<p class="justify">} + end + def paragraph_font_citation + %{<font #{font_size_txt} #{font_face}>} + end + def paragraph_endnote + %{<p class="endnote">} + end + def paragraph_table + %{<p align="left"><font #{font_small} #{font_color} #{font_face}>} + end + def paragraph_table_xml + end + def paragraph_tiny + %{<p class="tiny">} + end + def paragraph_small + %{<p class="small">} # keep but not used? + end + def paragraph_font_tiny + %{<font #{font_tiny} #{font_face}>} + end + def paragraph_font_small + %{<font #{font_small} #{font_face}>} + end + def paragraph_heading_1 + %{<h1>} + end + def paragraph_heading_1_center + %{<h1 class="center">} + end + #% table + def table_close + '</td></tr> +</table>' + 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 + '<center>' + end + def table_table_align_B + '<center>' + end + def table_table_align_C + ' ' + end + #% table_do + def table_do_table_paper + %{#{table_align_C} <table summary="table paper" width=#{table_width_2} border="0" cellpadding=#{table_cellpad_paper_margins} bgcolor=#{color_paper} align="Justify"><tr><td>\n<font color="#000000"><p />\n} + end + def table_do_table_surround + %{<table summary="table surround" width="100%" border="0" cellpadding="0" bgcolor="#ffffff" align="center"><tr><td>\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 + '</p> </td><td width="4%" align="right" valign="top">' + end + def margin_numless + '</td><td width="4%" align="right" valign="top">' + end + def margin_num_css + '</td> +<td width="2%" align="right" valign="top"> ' + end + def margin_num_header + '</td> +<td width="4%" align="right" valign="top">' + end + def margin_txt_00_1 + %{<table summary="" width=#{table_width_txt} border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td width=#{indent_level_1} align="right"> +</td> +<td valign="top" align="left" width=#{indent_level_1_c2w100}>} + end + def margin_txt_w1 + %{<table summary="" width=#{table_width_txt_r} border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td width="6%" align="right"> </td> +<td width="90%" valign="top" align="justify">} + end + def margin_txt_w2 + %{<table summary="" width=#{table_width_txt_r} border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td width="10%" align="right"> </td> +<td width="86%" valign="top" align="justify">} + end + def margin_txt_0 + %{<table summary="" width=#{table_width_txt} border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td width=#{indent_level_0} align="right"> +</td><td valign="top" align="justify">} + end + def margin_txt_1 + %{<table summary="" width=#{table_width_txt} border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td width=#{indent_level_1} align="right"></td><td valign="top" align="justify">} + end + def margin_txt_2 + %{<table summary="" width=#{table_width_txt} border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td width=#{indent_level_2} align="right"> +</td> +<td valign="top" align="justify">} + end + def margin_txt_3 + %{<table summary="" width=#{table_width_txt} border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td width=#{indent_level_3} align="right"> +</td> +<td valign="top" align="justify">} + end + def margin_css + '<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><td valign="top" align="justify"> ' + end + #% png + def png_ico + %{ <link rel="shortcut icon" href="../_sisu/image/#{icon_ico}" />} + end + def png_sisu #check url path + %{ <a href="#{@url.sisu}"> + <img border="0" width="160" height="60" src="#{url_path_image}/#{icon_sisu}" alt="SiSU" /> + </a>} + end + def png_hp + dir=SiSU_Env::Info_env.new #(@fns) + %{ <a href="#{url.site}"> + <img border="0" width="160" height="60" src="#{@dir.url.images_local}/#{icon_home_banner}" alt="#{txt_home}" /> + </a>} + end + def png_site + #dir=SiSU_Env::Info_env.new #(@fns) + %{<img src="#{url_path_image}/#{icon_site}" alt="@" border="0" />} + end + def png_homepage + png_site + end + def png_nav + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_bluebell}" alt="Contents" />} + end + def png_manifest + %{<img border="0" height="12" width="12" src="#{url_path_image}/#{icon_manifest}" alt="Document Manifest" />} + end + def png_doc + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_doc}" alt="Full Text" />} + end + def png_toc + %{<img border="0" height="18" width="15" src="#{url_path_image}/#{icon_toc}" alt="TOC linked" />} + end + def png_odf + %{<img border="0" height="18" width="18" src="#{url_path_image}/#{icon_odf}" alt="ODF/ODT" />} + end + def png_pdf + %{<img border="0" height="18" width="15" src="#{url_path_image}/#{icon_pdf}" alt="PDF" />} + end + def png_pdf_portrait + %{<img border="0" height="18" width="15" src="#{url_path_image}/#{icon_pdf}" alt="PDF portrait" />} + end + def png_pdf_landscape + %{<img border="0" height="15" width="18" src="#{url_path_image}/#{icon_pdf}" alt="PDF landscape" />} + end + def png_wmp + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_wmp}" alt="Concordance" />} + end + def png_para + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_para}" alt="Segment" />} + end + def png_status + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_status}" alt="Membership status" />} + end + def png_mark + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_rose}" alt="*" />} + end + def png_doc_tiny + %{<img border="0" height="8" width="8" src="#{url_path_image}/#{icon_doc}" alt="Doc" />} + end + def png_toc_tiny + %{<img border="0" height="8" width="8" src="#{url_path_image}/#{icon_toc}" alt="TOC" />} + end + def png_status_tiny + %{<img border="0" height="8" width="8" src="#{url_path_image}/#{icon_status}" alt="Status, Member States" />} + end + def png_ftp + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_ftp}" alt="FTP" />} + end + def png_gopher + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_gopher}" alt="Gopher" />} + end + def png_crosslink + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_crosslink_toc}" alt="lateral hop" />} + end + def png_crosslink_ext + %{<img border="0" height="15" width="15" src="#{url_path_image}/#{icon_external_toc}" alt="lateral hop" />} + end + def png_home + dir=SiSU_Env::Info_env.new #(@fns) + %{<img border="0" src="#{dir.url.images_local}/#{icon_home_button}" alt="#{txt_home} -->" />} + end + def png_home_button + #dir=SiSU_Env::Info_env.new #(@fns) + %{<img border="0" src="#{url_path_image_base}/#{icon_home_button}" alt="#{txt_home} -->" />} + end + def png_book + %{<img border="2" height="15" width="15" src="#{url_path_image}/#{icon_book}" alt="Cameron May Books" />} + end + #% png_nav + def png_nav_home + end + def png_nav_toc + %{<img border="0" width="22" height="22" src="#{url_path_image}/#{icon_up}" alt="TOC" />} + end + def png_nav_doc + end + def png_nav_previous + %{<img border="0" width="22" height="22" src="#{url_path_image}/#{icon_previous}" alt="<< previous" />} + end + def png_nav_next + %{<img border="0" width="22" height="22" src="#{url_path_image}/#{icon_next}" alt="next >>" />} + end + def png_nav_pre + png_nav_previous + end + def png_nav_nxt + png_nav_next + end + def png_nav_pdf + %{<img border="0" height="18" width="15" src="#{url_path_image}/#{icon_pdf}" alt="PDF" />} + end + def png_nav_pdf_portrait + %{<img border="0" width="15" height="18" src="#{url_path_image}/#{icon_pdf}" alt="pdf portrait" />} + end + def png_nav_pdf_landscape + %{<img border="0" width="18" height="15" src="#{url_path_image}/#{icon_pdf}" alt="pdf landscape" />} + end + def png_nav_dot_toc + %{<img border="0" width="100%" height="20" src="#{url_path_image}/#{icon_dot}" alt="^" />} + end + def png_nav_dot_previous + %{<img border="0" width="100%" height="20" src="#{url_path_image}/#{icon_dot}" alt="<" />} + end + def png_nav_dot_next + %{<img border="0" width="100%" height="20" src="#{url_path_image}/#{icon_dot}" alt=">" />} + 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 + %{ <font face="#{font_fonts}" size="2"> + #{png_site} + </font> } + end + def nav_txt_home_button + %{ <font face="#{font_fonts}" size="2"> + #{png_home_button} + </font> } + end + def nav_txt_homepage + %{ <font face="#{font_fonts}" size="2"> + #{png_site} homepage + </font> } + end + def nav_txt_toc_link + %{ <font face="#{font_fonts}" size="2"> + #{png_toc} toc + </font> } + end + def nav_txt_toc_link_verbose + %{ <font face="#{font_fonts}" size="2"> + #{png_toc} segments' toc + </font> } + end + def nav_txt_doc_link + %{ <font face="#{font_fonts}" size="2"> + #{png_doc} scroll + </font> } + end + def nav_txt_manifest + %{ <font face="#{font_fonts}" size="2"> + #{png_manifest} ? + </font> } + end + def nav_txt_concordance + %{ <font face="#{font_fonts}" size="2"> + A-Z + </font> } + end + def nav_txt_previous + ' <font face="" size="2"> + <b><<</b> Previous + </font> + Full Text ' + end + def nav_txt_next + %{ <font face="#{font_fonts}" size="2"> + Next <b>>></b> + </font> } + end + def nav_txt_odf + %{ <font face="#{font_fonts}" size="2"> + #{png_odf} odt + </font> } + end + def nav_txt_pdfs + %{ <font face="#{font_fonts}" size="2"> + pdfs + </font> } + end + def nav_txt_pdf_portrait + %{ <font face="#{font_fonts}" size="2"> + #{png_pdf_portrait} + pdf + </font> } + end + def nav_txt_pdf_landscape + %{ <font face="#{font_fonts}" size="2"> + #{png_pdf_landscape} + pdf + </font> } + end + #% banner + def banner_home + %{ <center> + <a href="#{url_site}/" target="_top" #{js_home}> + #{png_site} + </a> + <br /> + <font size="2" color="#444444"> + an + <br /> + ( international | transnational ) + <br /> + commercial law & e-commerce + <br /> + infrastructure monitor</font></center>} + end + def banner_home_guide + %{ <br /> + <a href="#{url_site}/" target="_top" #{js_home}> + #{png_doc} LM toc + </a> + <a href="../treaties.and.organisations/lm.chronological" target="_top" #{js_instruments}> + #{png_doc} LM 20** + </a> + <br />} + end + def banner_home_button_only + %{<a href="#{url_site}/" #{js_home}> + #{png_home_button} + </a>} + end + def banner_home_button #yellow_dark now white + %{<table summary="home button" width="100%" border="0" cellpadding="3" bgcolor= "#ffffff" align="center"> +<tr><td align="left" valign="middle" bgcolor="#{color_white}" width="10%"> + <a href="#{url_site}/" #{js_home}> + #{png_home_button} + </a> +</td> +<td width="90%"> +#{table_close}} + end + def banner_home_and_index_buttons #yellow_dark now white + %{<table summary="home and index buttons" bgcolor=#{color_band1}> +<tr><td width="20%"> +<table summary="home button" width="100%" border="0" cellpadding="3" align="center"> +<tr><td align="center" valign="middle" bgcolor="#{color_white}"> + <a href="#{url_site}/" target="_top" #{js_home}> + #{png_home} + </a> +</td></tr> +</table> +</td> +<td width="60%"> +<table summary="other contents buttons" border="0" cellpadding="3" cellspacing="0"> +<tr><td align="center" bgcolor=#{color_band2}> + <font face="arial" size="2"> + <a href="toc" target="_top" #{js_toc}> + This text's sub- + <br /> + Table of Contents + </a> + </font> +</td></tr> +</table> +</td> +<td width="20%"> + +#{table_close}} + end + def banner_url_txt_sisu + %{<a href="#{url_sisu}/sisu" target="_top" #{js_home}>SiSU</a>} + end + def banner_band #yellow_dark now white + %{<table summary="home button" width="100%" border="0" cellpadding="3" bgcolor= "#ffffff" align="center"> +<tr><td align="left" valign="middle" bgcolor="#{color_white}"> + <a href="#{url_site}/" target="_top" #{js_home}> + #{png_home} + </a> +</td> +<td width="90%"> +#{table_close}} + end + def banner_credit_band + %{<table summary="credits table yellow" width="80%" border="1" cellpadding="0" bgcolor="#{color_yellow_dark}" align="center"> +<tr><td align="center"> +<table summary="salmon" width="100%" border="0" cellpadding="0" bgcolor="#ffdec9"> +<tr><td align="center"> +<table summary="credits white background" width="100%" border="0" cellpadding="6" bgcolor="#ffffff"> +<tr><td align="center">} + end + def banner_instrument_cover_band_scr + '<table summary="scroll instrument cover band" width="100%" border="0" cellpadding="8" bgcolor="#ffffff" align="center"> +<tr><td align="center">' + end + def banner_instrument_cover_band_seg + '<table summary="segment instrument cover band, title, author, location" width="100%" border="0" cellpadding="8" bgcolor="#ffffff" align="center"> +<tr><td align="center">' + 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 +<<WOK +<tr align="center"><td align="center"> +<table summary="browser suggestions" bgcolor="#ffffff" cellpadding="4" border="0"> +<tr><td> + <p> + <font color="#666666" size="2"> + If you have problems viewing pages on this site please update your browser: + </font> + </p> +#{table_close} +<table summary="browser suggestions" bgcolor="#ffffff" cellpadding="4" border="0"> +<tr><td> + <p> + <font color="#666666" size="1"> + <a href="http://www.gnome.org/projects/epiphany/" target="external"> + Epiphany + </a> + <sup>®</sup> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://galeon.sourceforge.net/" target="external"> + Galeon + </a> + <sup>®</sup> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://www.microsoft.com/windows/ie/default.asp" target="external"> + I-Explorer + </a> + <sup>®</sup> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://kazehakase.sourceforge.jp/" target="external"> + Kazehakase</a> + <sup>®</sup> |</font></p></td> +<td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://www.konqueror.org/" target="external"> + Konqueror</a> + <sup>®</sup> |</font></p></td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://www.mozilla.org/" target="external"> + Mozilla + </a> + <a href="http://www.mozilla.org/products/firefox/" target="external"> + <b>Firefox</b> + </a> + <sup>®</sup> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://home.netscape.com/comprod/mirror/client_download.html" target="external"> + Netscape + </a> + <sup>®</sup> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://www.opera.com/" target="external"> + Opera + </a> + <sup>®</sup> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://www.apple.com/safari/" target="external"> + Safari + </a> + <sup>®</sup> + </font> + </p> +#{table_close} +<table summary="lightweight browser and text browser suggestions" bgcolor="#ffffff" cellpadding="4" border="0"> +<tr><td> + <p> + <font color="#666666" size="1"> + for console/text viewing: + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://elinks.or.cz/" target="external"> + <b>elinks</b> + </a> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://atrey.karlin.mff.cuni.cz/~clock/twibright/links" target="external"> + <b>links2</b> + </a> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://w3m.sourceforge.net/" target="external"> + <b>w3m</b> + </a> + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + for lightweight gui (X) viewing try: + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://www.dillo.org/" target="external"> + Dillo + </a> + | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://www.gnome.org/projects/epiphany/" target="external"> + Epiphany + </a> + <sup>®</sup> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://galeon.sourceforge.net/" target="external"> + Galeon + </a> | + </font> + </p> +</td> +<td> + <p> + <font color="#666666" size="1"> + <a href="http://atrey.karlin.mff.cuni.cz/~clock/twibright/links" target="external"> + <b>links2 -g</b> + </a> + </font> + </p> +#{table_close} +</td></tr> +WOK + end + def widget_pdfviewers +<<WOK +<tr align="center"><td align="center"> +<table summary="pdf viewer suggestions" bgcolor="#ffffff" cellpadding="4" border="0"> +<tr><td> + <p class="center"> + <font color="#666666" size="1"> + & for + <a href="http://www.adobe.com/products/acrobat/adobepdf.html" target="external"> + pdf + </a> + viewings of this site we recommend stand alone viewers + <br /> + (rather than web browser plugins): + </font> + </p> +#{table_close} +<table summary="" bgcolor="#ffffff" cellpadding="4" border="0" align="center"> +<tr align="center"><td align="center"> + <p class="center"> + <font color="#666666" size="1"> + <a href="http://www.adobe.com/products/acrobat/readstep2.html" target="external"> + Acrobat Reader + </a> + <sup>®</sup> + | + </font> + </p> +</td> +<td> + <p class="center"> + <font color="#666666" size="1"> + <a href="http://www.gnome.org/projects/evince/" target="external"> + <b>Evince</b> + </a> + <sup>®</sup> + </font> + </p> +</td> +<td> + <p class="center"><font color="#666666" size="1"> + <a href="http://www.cs.wisc.edu/~ghost/gv/" target="external"> + GhostView<sup>®</sup> </a>, + <a href="http://wwwthep.physik.uni-mainz.de/~plass/gv/" target="external"> + GV<sup>®</sup> + </a> + & + <a href="http://www.cs.wisc.edu/~ghost/gsview/" target="external"> + GSview<sup>®</sup> + </a> + | + </font> + </p> +</td> +<td> + <p class="center"> + <font color="#666666" size="1"> + <a href="http://www.foolabs.com/xpdf/" target="external"> + Xpdf + </a> + <sup>®</sup> + </font> + </p> +#{table_close} +WOK + end + def widget_googlegroups +<<WOK +<table style="border:1px solid #aa0033; font-size:small" align=center> +<tr><td rowspan=3> + <img src="http://groups-beta.google.com/groups/img/groups_medium.gif" height=58 width=150 alt="Google Groups" /> +</td> +<td colspan=2 align=center> + <b>Subscribe to SiSU e-docs</b> +</td> +</tr> +<form action="http://groups-beta.google.com/group/SiSU_e-docs/boxsubscribe"> + <tr><td> + Email: + <input type=text name=email> + </td> + <td> + <table style="background-color:#ffcc33;padding:2px;border:2px outset #ffcc33;"> + <tr><td> + <input type=submit name="sub" value="Subscribe"> + </td></tr> + </table> + </td></tr> +</form> +<tr><td colspan=2 align=center> + <a href="http://groups-beta.google.com/group/SiSU_e-docs"> + Browse Archives + </a> at + <a href="http://groups-beta.google.com/"> + groups-beta.google.com</a> + </td></tr> +</table> +WOK + end + def widget_sisu + v=SiSU_Env::Info_version.new.get_version +<<WOK +<table summary="" bgcolor="#ffffff" cellpadding="4" border="0" align="center"> +<tr align="center"><td align="center"> + <p class="center"> + <font color="#666666" size="2"> + presentations' look and feel + <br /> + generated by + <br /> + <a href="#{url_sisu}" #{js_sisu}> + <img border="0" src="../_sisu/image/sisu.png" alt="SiSU" width="120" height="39" /> + </a> + <br /> + <a href="#{url_sisu}" #{js_sisu}> + #{v[:project]} + </a> + <br /> + version #{v[:version]} + <br /> + #{v[:date_stamp]} (#{v[:date]}) + <br /> + </font> + </p> +<table summary="SiSU rights" bgcolor="#ffffff" cellpadding="4" border="0" align="center" width="40%"> +<tr align="center"><td align="left"> + <p class="left"> + <font color="#666666" size="2"> + Generated by + <a href="#{url_sisu}" #{js_sisu}> + SiSU + </a> + <br /> + #{v[:project]} #{v[:version]} #{v[:date_stamp]} + <br /> + <a href="#{url_sisu}" #{js_sisu}> + www.jus.uio.no/sisu + </a> + <br /> + Using: + <br /> + Standard SiSU markup syntax, + <br /> + Standard SiSU meta-markup syntax, and the + <br /> + Standard SiSU <u>object citation numbering</u> and system, (object/text positioning system) + <br /> + <sup>©</sup> Ralph Amissah 1997, current #{@date.year}. + <br /> + All Rights Reserved. + <br /> + SiSU is the result of several years of research and development in electronic + publishing, commenced in 1993 and under active development since 1997. + <br /> + <b>SiSU is released under + <a href="http://www.gnu.org/copyleft/gpl.html"> + GPL 2 + </a> + or later</b> + <a href="http://www.gnu.org/copyleft/gpl.html"> + http://www.gnu.org/copyleft/gpl.html + </a> + <br /> + (SiSU's first public release on January 4<sup>th</sup> 2005) + <br /> + </font> + </p> + <p class="center"> + <font color="#666666" size="3"> + <sup>©</sup> Ralph Amissah + <br /> + 1993, current #{@date.year} + <br /> + All Rights Reserved + <br /> + <i>w3 since October 3 1993</i> + <br /> + <a href="mailto://ralph@amissah.com" #{js_mail}> + ralph@amissah.com + </a> + <br /> + </font> + </p> +WOK + end + def widget_way_better + <<WOK + <p class="center"> + <font color="#666666" size="2"> + Developed + <br /> + using + <a href="http://www.ruby-lang.org/en/"> + Ruby + </a> + <br /> + on + <a href="http://www.debian.org/"> + Debian/Gnu/Linux + </a> + software infrastructure, + <br /> + & with the usual GPL (or OSS) suspects. + <br /> + Better - "performance, reliability, scalability, security + <br /> + & total cost of ownership" + <br /> + [not to mention flexibility & choice] + <br /> + <br /> + Get With the Future + <br /> + <a href="http://www.jus.uio.no/sisu/"> + Way Better! + </a> + </font> + </p> +#{table_close} +#{table_close} +WOK + end + def widget_wayBetter + widget_way_better + end + #% credits + def credits_itl_cover_band + %{<table summary="itl cover band" width="88%" border="0" cellpadding="0" bgcolor="blue"> +<tr><td> +<table summary="" width="100%" border="0" cellpadding="8" bgcolor="#000099"> +<tr><td> +<table summary="" width="99%" border="1" cellpadding="0" bgcolor="#ffcc00"> +<tr><td> +<table summary="" width="100%" border="1" cellpadding="0" bgcolor="#ffffff"> +<tr><td align="center"> + <font #{font_face}> + <br /> + \@ + <br /> + #{txt_home} + <br /> + #{banner_url_txt_sisu} + <br /> + </font> +#{table_close*4}} + end + def credits_splash + %{ <center> +<table align="center"bgcolor="#ffffff"> +<tr><td> + #{widget_sisu}#{widget_way_better}#{widget_browsers}#{widget_pdfviewers} +</td></tr> +</table> +</center>} + end + #% bottom + def bottom_surround + %{</td> +<td align="center" valign="bottom">#{table_close}<table summary="" border="0" width="100%" valign="top"> +<tr><td valign="top" width="20%"><table summary="" width="100%" border="0" cellpadding="0" bgcolor="#e3ecef" align="center"> +<tr><td valign="top"> +#{table_close} +</td> +<td align="center" valign="top"> + #{banner_band} +#{table_close} +<table summary="" border="0" width="100%" valign="top"> +<tr><td valign="top" width="20%"> +<table summary="" width="100%" border="0" cellpadding="0" bgcolor="#e3ecef" align="center"> +<tr><td valign="top"> + #{table_close} +</td> +<td align="center" valign="top"> + #{credits_splash} +#{table_close} +</body> +</html>} + end + end + class Home < Skin + def initialize + @v=SiSU_Env::Info_version.new.get_version + @dir=SiSU_Env::Info_env.new + end + def redirect + <<WOK +<html><head> +<title>SiSU</title> +<meta http-equiv="refresh" content="0, url=http://www.jus.uio.no/sisu/SiSU/"> +</head> +<body> +SiSU informtion provided at <a href="http://www.jus.uio.no/sisu/SiSU/">www.jus.uio.no/sisu/SiSU</a><p /> +If your browser supports redirection, you will be escorted there shortly. +</body> +</html> +WOK + end + def index + <<WOK +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> +<head> +<title>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</title> +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +<meta name="dc.title" content= +"SiSU information Structuring Universe, Structured information Serialised Units, 2007" /> +<meta name="dc.creator" content="Ralph Amissah" /> +<meta name="dc.subject" content= +"document structuring, ebook, publishing, PDF, LaTeX, XML, ODF, SQL, postgresql, sqlite, electronic book, electronic publishing, electronic document, electronic citation, data structure, citation systems, granular search, digital library" /> +<meta name="dc.publisher" content= +"SiSU http://www.jus.uio.no/sisu" /> +<meta name="dc.language" content="en" /> +<meta name="dc.rights" content="Copyright Ralph Amissah" /> +<meta name="generator" content="#{@v[:project]} #{@v[:version]} of #{@v[:date_stamp]} (#{@v[:date]}) (n*x and Ruby!)" /> +<link rel="generator" href="http://www.jus.uio.no/sisu/SiSU" /> +<link rel="stylesheet" href="./#{@dir.path.style}/html.css" type="text/css" /> +<link rel="shortcut icon" href="./_sisu/image/rb7.ico" /> +</head> +<body> +<div id="top_band"> +<p class="top_band_image"> + <a href="http://www.jus.uio.no/sisu/SiSU" target="_top" > + <img border="0" src="./_sisu/image/sisu.png" alt="SiSU >>"> + </a> +</p> +<h1 class="top_band"> + SiSU information Structuring Universe +</h1> +<h2 class="top_band_tiny"> + Structured information, Serialized Units +</h2> +<h2 class="top_band_tiny"> +software for electronic texts, document collections, books, digital libraries, and search +</h2> +<h2 class="top_band_tiny"> + with "atomic search" and text positioning system (shared text citation numbering: "<i>ocn</i>") +</h2> +<h2 class="top_band_tiny"> +outputs include: plaintext, html, XHTML, XML, ODF (OpenDocument), LaTeX, PDF, SQL (PostgreSQL and SQLite) +</h2> +</div> +<div id="top_band_search"> +<!-- Search SiSU --> +<a name="search"></a><form method="get" action="http://search.sisudoc.org" target="_top"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="submit" name="ignore" value="search" /> +<input type="hidden" name="db" value="SiSU_sisu" /> +<input type="hidden" name="a" value="1" /> +<input type="radio" name="view" value="index" checked="checked" /> idx +<input type="radio" name="view" value="text" /> txt +</form> +<!-- Search SiSU --> +</div> +<div id="column_left"> +<p class="bold"> + <a href="http://www.jus.uio.no/sisu/SiSU" target="_top" > + SiSU + </a> +</p> +<p class="tiny"> + --- +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU/1.html#summary" target="_top" > + What does SiSU do? Summary + </a> +</p> +<p class="tiny"> + --- +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU/2.html" target="_top" > + Book Samples and Markup Examples + </a> +</p> +<p class="tiny"> + --- +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU/1.html#ocn" target="_top" > + Object Citation Numbering - <i>ocn</i> + </a> +</p> +<p class="tiny">(a text positioning system)</p> +<p class="tiny"> + --- +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU/1.html#search" target="_top" > + Search - "<i>granular</i>" + </a> +<p class="tiny"> + 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 + <a href="http://www.jus.uio.no/sisu/sisu_provisional_patent_application_200408" target="_top" > + abandoned U.S. provisional patent application + </a> +</p> +<p class="tiny"> + --- +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU/download.html" target="_top" > + <b>Download</b> + </a> +</p> +<p class="tiny"> + --- +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU/changelog.html" target="_top" > + Changelog + </a> +</p> +<p class="tiny"> + --- +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU/license.html" target="_top" > + License + </a> +</p> +<p class="tiny"> + Gnu / Linux / Unix +</p> +<p class="tiny"> + ============= +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/man" target="_top" > + sisu man pages + </a> +</p> +<p class="tiny"> + --- +</p> +<p class="tiny"> + document preparation can be on any platform, in any editor: + (syntax highlight support currently for: vim, kate, write, gedit, diakonos) +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/syntax_highlight" target="_top" > + Syntax highlighting + </a> +</p> +<p class="tiny"> + ============= +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/SiSU" target="_top" > + * Composite document + </a> +</p> +<p class="tiny"> + the composite document is a superset of the following documents: +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_description" target="_top" > + SiSU description + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_examples" target="_top" > + SiSU examples + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_chronology" target="_top" > + SiSU chronology + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_technical_info" target="_top" > + SiSU technical + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_faq" target="_top" > + SiSU FAQ + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_download" target="_top" > + SiSU download + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_changelog" target="_top" > + SiSU changelog + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_license" target="_top" > + SiSU license + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_standard" target="_top" > + SiSU standard + </a> +</p> +<p class="small"> + <a href="http://www.jus.uio.no/sisu/sisu_provisional_patent_application_200408" target="_top" > + SiSU abandoned provisional patent + </a> +</p> +<p class="tiny"> + Note: the placement of SiSU documents on the Net predate the release of SiSU. +</p> +</div> +<div id="column_center"> +<p class="bold"> + For less markup than the most elementary HTML you can have more. +</p> +<p><a href="http://www.jus.uio.no/sisu/SiSU" target="_top" ><b>SiSU</b> - Structured information, Serialized Units</a> for electronic documents, is an information structuring, transforming, publishing and search framework with the following features:</p> +<p> +<b>(i)</b> markup syntax: +<b>(a)</b> +simpler than html, +<b>(b)</b> +mnemonic, influenced by mail/messaging/wiki markup practices, +<b>(c)</b> human readable, and easily writable,</p> +<p><b>(ii)</b> +<b>(a)</b> +minimal markup requirement, +<b>(b)</b> +single file marked up for multiple outputs,</p> +<p><b> +notes +</b></p> +<p class="small"> +<b>*</b> +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. +</p> +<p class="small"> +<b>*</b> +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]. +</p> +<p class="small"> +<b>*</b> +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. +</p> +<p><b>(iii)</b> +<b>(a)</b> +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>(b) +</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))</p> +<p><b>(iv)</b> +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.</p> +<p> +<b>(v)</b> +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].</p> +<p> +<b>(vi)</b> + use of semantic meta-tags in headers permit the addition of semantic information on documents, (the available fields are easily extended)</p> +<p> +<b>(vii)</b> +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,</p> +<p> +<b>(viii)</b> +"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),</p> +<p> +<b>(ix)</b> +document content certification and comparison considerations: +<b>(a)</b> +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>(b)</b> +version control, documents integrated with time based source control system, default RCS or CVS with use of $Id$ tag, which SiSU checks +<p> +<b>(x)</b> +SiSU's minimalist markup makes for meaningful "diffing" of the substantive content of markup-files,</p> +<p> +<b>(xi)</b> +easily skinnable, document appearance on a project/site wide, directory wide, or document instance level easily controlled/changed,</p> +<p> +<b>(xii)</b> +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,</p> +<p> +<b>(xiii)</b> +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)</p> +<p> +<b>(xiv)</b> +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</p> +<p> +there is a considerable degree of future-proofing, output representations are "upgradeable", and new document formats may be added. +</p> +<p> +<b>(xv)</b> +there is a considerable degree of future-proofing, output representations are "upgradeable", and new document formats may be added: +<b>(a)</b> +modular, (thanks in no small part to Ruby) another output format required, write another module.... +<b>(b)</b> easy to update output formats (eg html, XHTML, LaTeX/PDF produced can be updated in program and run against whole document set), +<b>(c)</b> easy to add, modify, or have alternative syntax rules for input, should you need to,</p> +<p> +<b>(xvi)</b> +scalability, dependent on your file-system (ext3, Reiserfs, XFS, whatever) and on the relational database used (currently Postgresql and SQLite), and your hardware,</p> +<p> +<b>(xvii)</b> +only marked up files need be backed up, to secure the larger document set produced,</p> +<p> +<b>(xviii)</b> +document management,</p> +<p> +<b>(xix)</b> +Syntax highlighting for SiSU markup is available for a number of text editors.</p> +<p><b>(xx)</b> remote operations: +<b>(a)</b> +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>(b)</b> +generated document outputs may be posted by sisu to remote sites (using rsync/scp) +<b>(c)</b> +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.</p> +<p> +<b>(xxi)</b> +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. +</p> +<p> +<b>(xxii)</b> +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. +</p> +<p> +as a developers tool it is flexible and extensible +</p> +<br /> +<p class="small"> +More information on <a href="http://www.jus.uio.no/sisu/SiSU/"><b>SiSU</b></a> provided at <a href="http://www.jus.uio.no/sisu/SiSU/">www.jus.uio.no/sisu/SiSU</a></p> +</div> +<div id="column_right"> +<p class="tiny"> +SiSU ("SiSU information Structuring Universe" or "Structured information, Serialized Units"),<sup>1</sup> 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. +</p> +<p class="tiny"> + 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 objects<sup>2</sup> (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. +</p> + +<p class="small"> +How it works +</p> +<p class="tiny"> +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,<sup>2</sup> 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).</p> +<p class="tiny"> +<sup>1.</sup> also chosen for the meaning of the Finnish term "sisu". +</p> +<p class="tiny"> +<sup>2</sup> 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.</p> +<p class="small"> + More information on <a href="http://www.jus.uio.no/sisu/SiSU/"><b>SiSU</b></a> provided at: + <a href="http://www.jus.uio.no/sisu/SiSU/"> + www.jus.uio.no/sisu/SiSU + </a> +<p class="tiny"> +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.</p> +<p class="tiny"> +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.</p> +<p class="small"> +<a href="mailto://ralph@amissah.com"> +ralph@amissah.com +</a> +</p> +<p class="small"> +<a href="mailto://ralph.amissah@gmail.com"> +ralph.amissah@gmail.com +</a> +</p> +<p class="small"> +2007 +</p> +<p class="tiny"> +w3 since October 3 1993 +</p> +</div> +</body> +</html> +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 <Source + @@dl=nil + @@description,@@digests,@@dal_structure1,@@dal_structure2,@@sc_info=[],[],[],[],[] + def initialize(data='',md='') + @data,@md=data,md + SiSU_Env::SiSU_file.new(@md).mkdir + @@dg ||=SiSU_Env::Info_env.new.digest.type + @@dl ||=SiSU_Env::Info_env.new.digest.length + @dg,@dl=@@dg,@@dl + @env=SiSU_Env::Info_env.new(@md.fns) + l=SiSU_Env::Standardise_language.new.file_to_language(@md.fns) + @language=l[:l] + @tr=SiSU_Translate::Source.new(@md,@language) + end + def songsheet + #source parser, based on dal creation - dal parser ... + @@description,@@digests,@@dal_structure1,@@dal_structure2,@@sc_info=[],[],[],[],[] + message_digest + dal_structure + supplementary + output + end + def description(f,e='') + puts f + e.to_s if @md.cmd =~/V/ + @@description << f << e + end + def digests(f,e='') + puts f + e.to_s if @md.cmd =~/V/ + @@digests << f << e + end + def dal_structure1(f,e='') + puts f + e.to_s if @md.cmd =~/V/ + @@dal_structure1 << f << e + end + def dal_structure2(f,e='') + puts f + e.to_s if @md.cmd =~/V/ + @@dal_structure2 << f << e + end + def rcinfo(f,e='') + puts f + e.to_s if @md.cmd =~/V/ + @@sc_info << f << e + end + def output + filename_digest=SiSU_Env::SiSU_file.new(@md,@md.fn[:digest]).mkfile + filename_digest << @@description << @@digests << @@dal_structure1 << @@dal_structure2 << @@sc_info + end + def rgx_txt(txt) + txt=txt.gsub(/([()])/,"\\\\\\1") + end + def message_digest + #there will be a docbook mapping header, fairly complex variations + data=@data + sys=SiSU_Env::System_call.new + l=Hash.new(0) + @p=[] + @g,@v,@r='','','' + data.each do |para| + x=nil + y,para_endnotes=[],[] + if para =~/<~(\d+);((?:\w|[0-6]:)\d+);(\w\d+)><([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*<u>([0-9a-f]{#@dl})<\/u>/ #watch + @n,@s=/MD5\((\S+?\.sst)\)=\s*<u>([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}.+?<u>/ #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>\}~/, + '<footnote><para>\1 \2</para></footnote> ') + end + def xml_head(meta) + txt=meta.text + txt.gsub!(/<br(?: \/)?>/,'') + txt.gsub!(/ & /,' and ') + @@xml[:head] <<=if meta.type == 'meta' + <<WOK +#{@tab}<#{meta.el}> +#{@tab*2}#{txt} +#{@tab}</#{meta.el}> +WOK + else '' + end + end + def xml_sc(md='') + sc=if @md.sc_info + <<WOK + <source_control> + <sc class="sourcefile"> + #{@md.sc_filename} + </sc> + <sc class="number"> + #{@md.sc_number} + </sc> + <sc class="date"> + #{@md.sc_date} + </sc> + </source_control> +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}<nametag>#{hname}</nametag>\n" if hname + @@xml[:body] <<<<WOK +#{@tab*n}#{xml_element} +#{@tab*n1}<title>#{para[@regx, 2]}</title> +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}<nametag>#{hname}</nametag>\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}</#{Contents[v]}>\n" + end + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[2] # 5~ + [2,1].each do |v| + @@xml[:body] << "#{@tab*n}</#{Contents[v]}>\n" + end + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[1] # 4~ + [1].each do |v| + @@xml[:body] << "#{@tab*n}</#{Contents[v]}>\n" + end + @copen[1]=@copen[2]=@copen[3]=false + end + @@xml[:body] << "#{@tab*y}</#{Heading_close[x]}>\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}</#{Contents[v]}>\n" + end + elsif @copen[2] == true # 5~ + [2,1].each do |v| + @@xml[:body] << "#{@tab*n}</#{Contents[v]}>\n" + end + elsif @copen[1] == true # 4~ + [1].each do |v| + @@xml[:body] << "#{@tab*n}</#{Contents[v]}>\n" + end + end + @cont[1]=true + when 5 + if @copen[3] == true #6~ + [3,2].each do |v| + @@xml[:body] << "#{@tab*n}</#{Contents[v]}>\n" + end + elsif @copen[2] == true #5~ + [2].each do |v| + @@xml[:body] << "#{@tab*n}</#{Contents[v]}>\n" + end + end + @cont[2]=true + when 6 + [3].each do |v| + @@xml[:body] << "#{@tab*n}</#{Contents[v]}>\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}<para class="group">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</para>\n} + end + def poem_structure(para='',ocn='') + para.gsub!(/<:verse(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*7}<para class="verse">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</para>\n} + end + def code_structure(para='',ocn='') + para.gsub!(/<:code(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*7}<para class="code">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</para>\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)/, + %{<imagedata fileref="#{dir.url.images_local}\/\\1"/>}) + #para.gsub!(/\{(\S+?\.png) \d+x\d+ \".+?\" \}(?:http:\/\/\S+|image)/,'<image>\1</image>') + 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~|<ENDNOTES>|<EOF>)/ + 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!(/(.+)/, + # %{<center>(\\1)</center>}) + # para=@sto.lev_para_ocn.scrPara + #when /^(b|bold)$/ + # para.gsub!(/(.+)/, + # %{<b>(\\1)</b>}) + # 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 =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para,ocn) + para=table.table_split + @@xml[:body] << para + #@@xml[:body] << table_structure(para,ocn) + else #xml_structure(para, nil, nil, nil) + xml_markup(para) + @@xml[:body] << "#{@tab*7}<para>#{para[@regx, 2]}</para>\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('<br /><a name="notes">Note</a>') + #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,'<br /><a name="metadata">MetaData</a>') + 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,'<br /><a name="owner.details">Owner Details</a>') + @@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 =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\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}</#{Contents[v]}>\n" + @content_flag=false + else + @@xml[:body] << "\n#{@tab*y}</#{Contents[v]}>\n" + end + end + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}</#{Heading_close[x]}>\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='<?xml version="1.0"?> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V5.0//EN" + "http://www.oasis-open.org/docbook/xml/5.0/docbook.dtd">' + #encoding='<?xml version="1.0" encoding="utf-8"?>' + @@xml[:open] =<<WOK +#{encoding} +<?xml-stylesheet type="text/css" href="../#{dir.path.style}/#{css}"?> +#{rdf.comment_xml} +<book> +WOK + @@xml[:head] << "<bookinfo>\n" + end + def post + @@xml[:head] << @@xml[:sc] + @@xml[:head] << "</bookinfo>\n" + @@xml[:close] = "</book>\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 <Create_file + def initialize(error,errorlist,cmd,fns='') + @fns,@cmd,@error,@errorlist=fns,cmd,error,errorlist + @cmd=if cmd and cmd =~/c/; 'Vc' + else 'V' + end + end + def error #creates file errorlog.sisu in pwd of last error reported + file=if @fns; SiSU_Env::Create_file.new(@cmd,@fns).file_error + else File.new('/tmp/errorlog.sisu','w+') + end + file << @fns << "\n" << @error << "\n" << @errorlist + file.close + if @cmd=~/[vVM]/; STDERR.puts SiSU_Screen::Ansi.new('',$!,$@).rescue + else SiSU_Screen::Ansi.new('',"rescued, exception reaised, silenced").puts_grey + end + end + end +end + diff --git a/lib/sisu/0.52/help.rb b/lib/sisu/0.52/help.rb new file mode 100644 index 00000000..a8f1a5ce --- /dev/null +++ b/lib/sisu/0.52/help.rb @@ -0,0 +1,1906 @@ +=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: online help + + * 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_Help + require SiSU_lib + '/sysenv' + require SiSU_lib + '/param' + include SiSU_Screen + class Help + def initialize(request='',color='') + @request,@color=request,color + if color =~/color_off/; @cX=SiSU_Screen::Ansi.new('k').cX + else @cX=SiSU_Screen::Ansi.new('yes').cX + end + fns='dummy_file_ref.sst' + @env=SiSU_Env::Info_env.new(fns) + @db=SiSU_Env::Info_db.new + m=/.+\/(\S+)/m + @output_stub=Dir.pwd[m,1] + end + def help_request + begin + gotten=nil + regx=/^(list|com(?:mands)?|mod(?:ifiers)|markup|syntax|example(?:37|38)?|head(?:ers?)?|(?:heading|title|level|structure)s?|endnotes|footnotes|tables?|customise|skin|dir(?:ectories)?|paths?|lang(?:uage)?|modules|setup|conf(?:ig(?:ure)?)?|standards?|li[cs]en[sc]e|scratch|install|termsheet|dublin(?:core)?|dc|customise|styles?|appearance|theme|env(ironment)?|dir(?:ector(?:y|ies))?|metaverse|abstract|features|summary|(?:short)?cuts?|sisu|about|ext(?:ernal)?(?:_?prog(?:rams)?)?)|utf-?8|plaintext|html|xml|xhtml|odf|odt|opendocument|css|pdf|latex|tex|(?:tex)?info|search|(?:hyper)?est(?:raier)?|searchform|cgi|sql|db|postgresql|pg?sql|sqlite|convert|php|webrick|sitemaps?|ya?ml|ansi|colors|-[AabcDdEeFHhIMmNnopqrRSstUuVvwXxyZz0-9]|-[Ddcv]|-[CcFLSVvW]/ + help_info=%{#{@cX.blue_hi}SiSU help#{@cX.off} #{@cX.ruby}~#{@cX.off} #{@request}} + help_list=%{#{@cX.blue}sisu --help#{@cX.off} #{@cX.cyan}type keyword else "enter" to exit help:\n\tkeywords include:#{@cX.off} #{@cX.brown}list, (com)mands, short(cuts), (mod)ifiers, (env)ironment, markup, syntax, headers, headings, endnotes, tables, example, customise, skin, (dir)ectories, path, (lang)uage, db, install, setup, (conf)igure, convert, external_programs, dublincore, termsheet, search, sql, hyper(est)raier, features, external_programs, license#{@cX.off} \n} + help_prompt=%{#{@cX.fuschia}exit, [or carriage return to exit help] #{@cX.off}\n#{@cX.blue_hi}SiSU help#{@cX.off} #{@cX.ruby}~#{@cX.off} } + until gotten =~/exit|quit|bye|q|^\s*$/ and ( @request.nil? or @request.empty? ) + @help=Help.new(@request,@color) + if @request + puts help_info + gotten=@request + @request=nil + end + case gotten + when /h((?:elp)| )|~/i + @help.summary + help_@request + when /list/; @help.summary + when /com(mands)?/; @help.commands + when /mod(ifiers)?/; @help.modifiers + when /markup|syntax/; @help.markup + when /example\b/; @help.example + when /example37/; @help.example37 + when /example38/; @help.example38 + when /(?:heading|title|level)s?|structure/; @help.headings + when /head(ers?)?/; @help.headers + when /dublin(core)?|dc/; @help.dublin_core + when /(?:foot|end)notes/; @help.endnotes + when /tables?/; @help.tables + when /customise|skin/; @help.customise + when /modules/; @help.modules + when /env(ironment)?/; @help.environment + when /dir(ector(y|ies))?/; @help.directories + when /paths?/; @help.path + when /setup/; @help.setup + when /conf(?:ig(?:ure)?)?/; @help.configure + when /standards?/; @help.standards + when /lang(?:uage)?/; @help.languages + when /li[cs]en[sc]e/; @help.license + when /scratch/; @help.scratch + when /install/; @help.install + when /termsheet/; @help.termsheet + when /customise|styles?|appearance|theme/; @help.customise + when /metaverse/; @help.dal + when /plaintext|ascii|-[aAeE]/; @help.plaintext + when /utf-?8/i; @help.utf8 + when /html|-[hH]/; @help.html + when /css/; @help.css + when /xhtml|-b/; @help.xhtml + when /xml|-[xX]/; @help.xml + when /odf|odt|opendocument|-o/; @help.odf + when /php/; @help.php + when /pdf|-p/; @help.pdf + when /latex|tex/; @help.latex + when /(tex)?info/; @help.texinfo + when /lout/; @help.lout + when /concordance|index|-w/; @help.concordance + when /search\b/; @help.help_search + when /(?:hyper)?est(?:raier)?/; @help.hyperestraier + when /db|database|sql|postgresql|sqlite|pg?sql|-[dD]/; @help.sql + when /searchform|cgi/; @help.cgi + when /convert/; @help.convert + when /webrick|-W/; @help.webrick + when /abstract|features|summary|about|sisu/; @help.abstract + when /ext(?:ernal)?(?:_?prog(?:rams)?)?/; @help.external_programs + when /ya?ml/; @help.yaml + when /sitemaps?/; @help.sitemap + when /(?:short)?cuts?/; @help.shortcuts + when /ansi|colors?/; SiSU_Screen::Ansi.new('c').colors + else @help.summary + end + print help_list + print help_prompt + gotten=nil + gotten=gets + end + rescue + #STDERR.puts Ansi.new($!, $@).rescue + # dies silently... for now, silence of use in connection with "sisu ~ commands" etc. + ensure + end + end + def summary + print <<WOK +if you have not done so, typing sisu on its own or "sisu --help", should give you this sisu help summary and the sisu (interactive help mode) help promt, from which help on each keyword can be obtained. + +alternatively typing #{@cX.orange}sisu --help#{@cX.off} #{@cX.green}[keyword]#{@cX.off} at the command prompt will provide the sisu help page requested and return to the command prompt (if nothing is found it will print this page and return to the command prompt) + + Keywords (related to using SiSU) + #{@cX.green}help#{@cX.off} or #{@cX.green}list#{@cX.off} this sisu help summary + #{@cX.green}commands#{@cX.off} sisu --help commands + #{@cX.green}environment#{@cX.off} sisu --help env + ------------------------------------------ + Preparing Documents for SiSU + #{@cX.green}markup#{@cX.off} sisu --help markup (an incomplete overview) + #{@cX.green}headers#{@cX.off} sisu --help headers (document-wide instructions, meta-data) + #{@cX.green}structure#{@cX.off} sisu --help structure (document structure, headings, tables of contents) + #{@cX.green}endnotes#{@cX.off} sisu --help endnotes + #{@cX.green}tables#{@cX.off} sisu --help tables + #{@cX.green}example 0.37#{@cX.off} sisu --help example37 + #{@cX.green}example 0.38#{@cX.off} sisu --help example + ------------------------------------------ + #{@cX.green}search#{@cX.off} sisu --help search + ------------------------------------------ + #{@cX.green}customise#{@cX.off} sisu --help customise + ------------------------------------------ + SiSU's License + #{@cX.green}license#{@cX.off} sisu --help license +WOK + # #{@cX.cyan}sisu_convert#{@cX.off} program for initial (very basic and partial) conversion to sisu file format (html and word97 supported) + end + def abstract + print <<WOK +Features: +#{@cX.cyan}(i)#{@cX.off} minimal markup requirement +#{@cX.cyan}(ii)#{@cX.off} single file marked up for multiple outputs +#{@cX.cyan}(iii)#{@cX.off} markup is simpler than html +#{@cX.cyan}(iv)#{@cX.off} the simple syntax is mnemonic, influenced by mail/messaging/wiki markup practices +#{@cX.cyan}(v)#{@cX.off} human readable, and easily writable +#{@cX.cyan}(vi)#{@cX.off} multiple outputs include amongst others: html; pdf via LaTeX; (structured) XML; sql - currently PostgreSQL and sqlite; plaintext, (also texinfo) +#{@cX.cyan}(vii)#{@cX.off} all text objects (headings and paragraphs) are numbered identically, for citation purposes, in all outputs (html, pdf, sql etc.) +#{@cX.cyan}(viii)#{@cX.off} creates organised directory/file structure for output +#{@cX.cyan}(ix)#{@cX.off} 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 (eg. from an sql search, you know where to go to find the prepared html output or pdf etc.)... there is more +#{@cX.cyan}(x)#{@cX.off} use of Dublin Core and other meta-tags to permit the addition of some semantic information on documents, and making easy integration of rdf/rss feeds etc. +#{@cX.cyan}(xi)#{@cX.off} very easily skinnable, document appearance on a project/site wide, or document instance level easily controlled/changed +#{@cX.cyan}(xii)#{@cX.off} 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 +#{@cX.cyan}(xiii)#{@cX.off} is a batch processor for handling large document sets, ... though once generated they need not be re-generated, unless changes are made to the desired presentation of a particular output type +#{@cX.cyan}(xiv)#{@cX.off} possible to pre-process, which permits the easy creation of standard form documents, and templates/term-sheets +#{@cX.cyan}(xv)#{@cX.off} extremely modular, (thanks in no small part to Ruby) another output format required, write another module.... +#{@cX.cyan}(xvi)#{@cX.off} easy to update output formats (eg html, xhtml, latex/pdf produced can be updated in program and run against whole document set) +#{@cX.cyan}(xvii)#{@cX.off} easy to add, modify, or have alternative syntax rules for input, should you need to +#{@cX.cyan}(xviii)#{@cX.off} "Concordance" wordmap, consisting of all the words in a document and their (text object) locations within the text +#{@cX.cyan}(xix)#{@cX.off} tied to revision control system, only code and marked up file need be backed up, to be sure of the much larger document set +#{@cX.cyan}(xx)#{@cX.off} syntax highlighting files for markup, primarily (g)vim so far. + +SiSU was developed in relation to legal documents, and so is strong across a wide variety of texts (law, literature...), though weak on formulae/statistics, it does handle images. An assumption has been document sets that are to be preserved and maintained over time (also a result of the legal text origin). SiSU has been developed and used over a number of years, and the requirements to cover a wide range of documents have been thoroughly explored. + +There is more detailed information available on it from: + #{@cX.blue}http://www.jus.uio.no/sisu#{@cX.off} + * plaintext + * html + * XML (structured) + * LaTeX/pdf + * texinfo + * sql (at present postgresql & sqlite) + +A couple of sample inputs and outputs: + +The markup for "War and Peace" (chosen because it is a large text & to test the use of SiSU on Project Gutenberg's plaintext), this is the markup, very little after the headers (there is an insert of their legal notices). Took no time at all, it is a particularly simple text to markup though +A simple document and a more demanding document + #{@cX.blue}http://www.jus.uio.no/sisu/sample/war.and.peace.leo.tolstoy.er20 http://www.jus.uio.no/sisu/sample/autonomy.markup1.er30#{@cX.off} +Some resulting outputs: + html #{@cX.blue}http://www.jus.uio.no/sisu/war.and.peace.leo.tolstoy/ http://www.jus.uio.no/sisu/autonomy.markup1/#{@cX.off} + #{@cX.blue}http://www.jus.uio.no/sisu/autonomy.markup1/doc#{@cX.off} + pdf #{@cX.blue}http://www.jus.uio.no/sisu/war.and.peace.leo.tolstoy/portrait http://www.jus.uio.no/sisu/autonomy.markup1/portrait + #{@cX.blue}http://www.jus.uio.no/sisu/war.and.peace.leo.tolstoy/landscape http://www.jus.uio.no/sisu/autonomy.markup1/landscape#{@cX.off} + plaintext #{@cX.blue}http://www.jus.uio.no/sisu/war.and.peace.leo.tolstoy/doc.txt http://www.jus.uio.no/sisu/autonomy.markup1/doc.txt#{@cX.off} +WOK + end + def commands + print <<WOK + + #{@cX.ruby}-A#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces plaintext with dos linefeeds. Without markup, (object numbers are omitted), has footnotes at end of each para‐ graph that contains them [ -a for equivalent Unix (ascii) output file] [see -E for endnotes] + + #{@cX.ruby}-a#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces plaintext with Unix linefeeds. Without markup, (object numbers are omitted), has footnotes at end of each para‐ graph that contains them [ -A for equivalent dos (ascii) output file] [see -e for endnotes] + + #{@cX.ruby}-b#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces xhtml/XML output for browser viewing (sax parsing) + + #{@cX.ruby}-C#{@cX.off} initialise shared output directory (config files such as css and dtd files are not updated if they already exist unless modifier is used) #{@cX.ruby}-C --init=site#{@cX.off} configure/initialise site more extensive than -C on its own, shared output directory files/force update, existing shared output config files such as css and dtd files are updated if this modifier is used. in a new markup document working directory should initialise the corresponding output directory, though SiSU will automatically do this, the first time it is run (for processing) in a given directory. + + #{@cX.ruby}-c#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} screen toggle ansi screen colour on or off depending on default set (unless -c flag is used: if sisurc colour default is set to ´true´, output to screen will be with colour, if sisurc colour default is set to ´false´ or is undefined screen output will be without colour) + + #{@cX.ruby}-D#{@cX.off} #{@cX.green}[instruction]#{@cX.off} #{@cX.green}[filename]#{@cX.off} database instruction, see database section below + + #{@cX.ruby}-d#{@cX.off} #{@cX.green}[instruction]#{@cX.off} #{@cX.green}[filename]#{@cX.off} database instruction, see database section below [only -D currently available] + + #{@cX.ruby}-E#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces plaintext with dos linefeeds, and without markup, endnotes follow the main text (in -a endnotes follow the paragraphs that contain them). There are no object numbers [see -e for Unix (ascii) output file] [see -A for footnotes] + + #{@cX.ruby}-e#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces plaintext with Unix linefeeds, and without markup, endnotes follow the main text. Object numbers are omitted. [ -E for equivalent dos (ascii) output file] [ -a for footnotes] + + #{@cX.ruby}-F#{@cX.off} generate examples of (naive) cgi search form for sqlite and pgsql depends on your already having used sisu to populate an sqlite and/or pgsql database, (the sqlite version scans the output directories for existing sisu_sqlite databases, so it is first necessary to create them, before generating the search form) see -d -D and the database section below. If the optional parameter webrick is passed, the cgi examples created will be set up to use the default port set for use by the webrick server, (otherwise the port is left blank and the system setting used, usually 80). The samples are dumped in the present work directory which must be writable, (with screen instructions given that they be copied to the cgi-bin directory). + + #{@cX.ruby}-H#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces html (css version) (creates html (using css)), with url link suffixes (.html .pdf etc.) omitted ("Hide"). For web servers that are confireud so as not to require file extensions to locate and serve files. [behaviour switched see -h] + + #{@cX.ruby}-h#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces html (hardlinks i.e. with name suffixes in links/local urls). html, with internal document links that include the document suffix, ie whether it is .html or .pdf (required for browsing directly off a file system, and works with most web servers). [behaviour switched see -H] + + #{@cX.ruby}-I#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces texinfo file with its myriad of possibilities + + #{@cX.ruby}-L#{@cX.off} prints license information + + #{@cX.ruby}-M#{@cX.off} #{@cX.green}[filename/wildcard/url]#{@cX.off} maintenance mode, files created for processing are not deleted, and their locations are indicated (also see -V) + + #{@cX.ruby}-m#{@cX.off} #{@cX.green}[filename/wildcard/url]#{@cX.off} create (new)metaVerse (used in all subsequent processing). Produce a meta file, the first step in processing, and the file all subsequent processing utilize. (Should usually be run together with other commands to ensure that the lated version of markup source document is used, i.e. add -m flag to other flags required). + + #{@cX.ruby}-N#{@cX.off} #{@cX.green}[filename/wildcard/url]#{@cX.off} document content certificate as md5 digest tree of document produced (as digest.txt), the digest for the document, and digests for each object contained within the document (together with information on software versions that produced it). Try -mNV for verbose digest output to screen + + #{@cX.ruby}-n#{@cX.off} #{@cX.green}[filename/wildcard/url]#{@cX.off} skip meta-markup (building of "metaverse"), this skips the equivalent of -m + + #{@cX.ruby}-p#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces LaTeX pdf (portrait & landscape). Default paper size is set in config file, or document header, or provided with additional command line parameter, e.g. --papersize='a4' preset sizes include: 'A4', U.S. 'letter' and 'legal' and book sizes 'A5' and 'B5' (system defaults to A4). + + #{@cX.ruby}-q#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} quiet, less output to screen + + #{@cX.ruby}-r#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} copies sisu output files to remote host using scp (default). This requires that sisurc.yml has been provided with information on hostname and user name, and that you have your "keys" and ssh agent in place. + + #{@cX.ruby}-S#{@cX.off} #produces a sisupod, a zipped sisu directory of markup files including sisu markup source files and the directories local configuration file, images and skins. Note: this only includes the configuration files or skins contained in ./_sisu not those in ~/.sisu The resulting tar gzip file has a .zip suffix added to the markup source directory name. To tar and gzip individual files see the -Z [filename/wildcard] option. Note: (this option is tested only with zsh) + + #{@cX.ruby}-S#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces a sisupod a zipped sisu of the content assocated with the specified sisu markup documnt, i.e. including sisu markup source file, (and associated documents if a master file, or available in multilingual versions), together with related images and skin. The resulting zipped file has a .zip suffix added to the markup source file name by default, though a .ssp suffix is also recognised. The directory structure of the unzipped file is understood by sisu, and sisu commands can be run within it. SiSU commands can be run against a sisupod contained in a local directory, or provided as a url on a remote site. As there is a security issue with skins provided by other users, they are not applied unless the flag --trust or --trusted is added to the command instruction, it is recommended that file that are not your own are treated as untrusted. This provides a convenient way of packing documents files for sending Note: if you wish to send multiple files, it quickly becomes more space efficient to tar and gzip the sisu markup directory, (without the _sisu_processing subdirectory) rather than the individual files for sending). See the -S option without [filename/wildcard] + + #{@cX.ruby}-t#{@cX.off} #{@cX.green}[filename/wildcard (*.termsheet.rb)]#{@cX.off} standard form document builder, preprocessing feature + + #{@cX.ruby}-U#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} prints url list/map for the available processing flags options and resulting files that could be requested, (can be used to get a list of processing options in relation to a file, together with information on the output that would be produced), -u provides url mapping for those flags requested for processing. The default assumes sisu_webrick is running and provides webrick url mappings where appropriate, but these can be switched to file system paths in sisurc.yml + + #{@cX.ruby}-u#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} provides url mapping of output files for the flags requested for processing, also see -U + + #{@cX.ruby}-V#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} on its own provides SiSU version and environment information (sisu --help env) + + #{@cX.ruby}-V#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} even more verbose than -v the -V flag provides some additional information, also see -M + + #{@cX.ruby}-v#{@cX.off} on its own, provides SiSU version information. + + #{@cX.ruby}-v#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} provides more verbose output of what is being built, where it is being built (and error messages if any), as with -u flag provides a url mapping of files created for each of the processing flag requests + + #{@cX.ruby}-X#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces XML output with deep document structure, in the nature of dom + + #{@cX.ruby}-x#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces XML output (sax parsing) + + #{@cX.ruby}-W#{@cX.off} #{@cX.green}[port]#{@cX.off} starts ruby´s webrick webserver, points at sisu output directories (default port is set) + + #{@cX.ruby}-w#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces concordance, a rudimentary index of all the words in a document + + #{@cX.ruby}-Z#{@cX.off} Zap, if used with other processing flags #{@cX.green}deletes output files#{@cX.off} of the type about to be processed, prior to processing. If -Z is used as the lone processing related flag (or in conjunction with a combination of -[mMvVq]), will remove the related document output directory. + + #{@cX.ruby}-z#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} produces php (zend) [feature disabled, depreciated] + + #{@cX.ruby}-0#{@cX.off} [with -h or -H or -p] turn display of text object numbering off (implemented for html (css) and LaTeX/pdf output) [digit not uppercase o] + + #{@cX.ruby}databases#{@cX.off} + + #{@cX.ruby}dbi - database interface -D or --pgsql set for postgresql -d or --sqlite set for sqlite#{@cX.off} + + #{@cX.ruby}-D#{@cX.off} #{@cX.ruby}--create#{@cX.off} creates empty postgresql db and required tables & indexes (rb.dbi) [#{@cX.ruby}-d --create#{@cX.off} sqlite equivalent] it may be necessary to first run sisu #{@cX.ruby}-D#{@cX.off} #{@cX.ruby}--createdb#{@cX.off} + + #{@cX.ruby}-Di#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} or #{@cX.ruby}-D#{@cX.off} #{@cX.ruby}--import#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} imports data specified to postgresql db (rb.dbi) [#{@cX.ruby}-d --import#{@cX.off} sqlite equivalent] + + #{@cX.ruby}-Du#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} or #{@cX.ruby}-D#{@cX.off} #{@cX.ruby}--update#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} updates/imports specified data to postgresql db (rb.dbi) [#{@cX.ruby}-d --update#{@cX.off} sqlite equivalent] + + #{@cX.ruby}-D#{@cX.off} #{@cX.ruby}--remove#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} removes specified data to postgresql db (rb.dbi) [#{@cX.ruby}-d --remove#{@cX.off} sqlite equivalent] + + #{@cX.ruby}-D#{@cX.off} #{@cX.ruby}--dropall#{@cX.off} kills data" and drops (postgresql) db, tables & indexes [#{@cX.ruby}-d --dropall#{@cX.off} sqlite equivalent] + + #{@cX.ruby}-D#{@cX.off} #{@cX.ruby}--recreate#{@cX.off} kills data" and drops (postgresql or sqlite) db, tables & indexes, then creates an empty db with tables and indexes [#{@cX.ruby}-d --recreate#{@cX.off} sqlite equivalent] + + also see command #{@cX.green}shortcuts#{@cX.off}, and shorthand mappings for multiple flags +WOK + end + def shortcuts + cf_defaults=SiSU_Env::Info_processing_flag.new + print <<WOK + + #{@cX.ruby}Shorthand for multiple flags#{@cX.off} + + #{@cX.ruby}--update#{@cX.off} #{@cX.green}[filename/wildcard]#{@cX.off} Checks existing file output and runs the flags required to update this output. This means that if only html and pdf output was requested on previous runs, only the -hp files will be applied, and only these will be generated this time, together with the summary. This can be very convenient, if you offer different outputs of different files, and just want to do the same again. + + #{@cX.ruby}-1#{@cX.off} to #{@cX.ruby}-5#{@cX.off} #{@cX.green}[filename or wildcard]#{@cX.off} + #{@cX.green}Default shorthand mappings#{@cX.off} (note that the defaults can be changed in the #{@cX.green}sisurc.yml#{@cX.off} file): + + (these can be turned off if unavailable in sisurc.yml under program_set:) + #{@cX.green}processing shortcut defaults set to:#{@cX.off} + color defaut set (on==true) #{@cX.blue}#{cf_defaults.color}#{@cX.off} + sisu -1 #{@cX.blue}#{cf_defaults.cf_1}#{@cX.off} + sisu -2 #{@cX.blue}#{cf_defaults.cf_2}#{@cX.off} + sisu -3 #{@cX.blue}#{cf_defaults.cf_3}#{@cX.off} + sisu -4 #{@cX.blue}#{cf_defaults.cf_4}#{@cX.off} + sisu -5 #{@cX.blue}#{cf_defaults.cf_5}#{@cX.off} + defaults may be changed in active sisurc.yml file under 'flag:' + + add -v for verbose mode and -c (color toggle), e.g. + sisu -2vc [filename or wildcard] +WOK + end + def modifiers + print <<WOK + + #{@cX.ruby}Command flag modifiers#{@cX.off} + + #{@cX.ruby}--no-ocn#{@cX.off} [with -h -H or -p] switches off object citation numbering. Produce output without identifying numbers in margins of html or LaTeX/pdf output. + + #{@cX.ruby}--no-annotate#{@cX.off} strips output text of editor endnotes~[* square brackets ]~ denoted by asterisk or dagger/plus sign + + #{@cX.ruby}--no-asterisk#{@cX.off} strips output text of editor endnotes~[* square brackets ]~ denoted by asterisk + + #{@cX.ruby}--no-dagger#{@cX.off} strips output text of editor endnotes~[+ square brackets ]~ denoted by dagger/plus sign + +WOK + end + def misccom + <<WOK + #{@cX.cyan}misc#{@cX.off} + #{@cX.green}-s#{@cX.off} [filename or wildcard] #{@cX.green}spellcheck#{@cX.off} (aspell previously ispell + \t#{@cX.green}mailer examples#{@cX.off} + from vim mail.er10 (not gvim) issue command + \t:! ruby -S mailer.rb instruction/landscape|a4l|portrait|a4p/ email@address/alias subject line + \t:! ruby -S mailer.rb a4l ralph@amissah.com testing continues + from vim mail.er10 use your vim alias \\mail or \\mutt (modify command line as required) + #{@cX.green}feeds rss/rdf#{@cX.off} + #{@cX.blue}-R #{@cX.off} (yaml|rss) extraction of semantic data into yaml file for auto build of xml feeds (rss, rdf) #{@cX.fuschia}[work area]#{@cX.off} + #{@cX.green}-R #{@cX.off} yaml extraction of semantic data into yaml file for auto build of xml feeds (rss, rdf) + #{@cX.green}-R #{@cX.off} rss creates rss2.0 feed +WOK + end + def markup + print <<WOK +sisu + Note: files for SiSU should be in UTF-8 character encoding. + + #{@cX.cyan}Data text markup#{@cX.off} (alternative to available html subset) + #{@cX.green}% SiSU 0.38#{@cX.off} [statement on first line of document, declared file-type identifier, SiSU markup document, markup used is version 0.38] + #{@cX.green}:A~#{@cX.off} heading/title [levels :A to :C available (and beneath that 1 to 6)] + #{@cX.green}1~#{@cX.off}filename heading [segmentation level, levels 1 to 6 available] + #{@cX.green}!{#{@cX.off}emphasis#{@cX.green}}!#{@cX.off} + #{@cX.green}*{#{@cX.off}bold text#{@cX.green}}*#{@cX.off} + #{@cX.green}_{#{@cX.off}underscore#{@cX.green}}_#{@cX.off} + #{@cX.green}/{#{@cX.off}italics#{@cX.green}}/#{@cX.off} + #{@cX.green}"{#{@cX.off}citation#{@cX.green}}"#{@cX.off} + #{@cX.green}^{#{@cX.off}superscript#{@cX.green}}^#{@cX.off} + #{@cX.green},{#{@cX.off}subscript#{@cX.green}},#{@cX.off} + #{@cX.green}+{#{@cX.off}inserted text#{@cX.green}}+#{@cX.off} + #{@cX.green}-{#{@cX.off}strikethrough#{@cX.green}}-#{@cX.off} + ------------------------------------------ + #{@cX.cyan}Indentation and bullets#{@cX.off} + #{@cX.green}_1#{@cX.off} indent paragraph one level + #{@cX.green}_2#{@cX.off} indent paragraph two steps + #{@cX.green}_*#{@cX.off} bullet text + #{@cX.green}_1*#{@cX.off} bullet text, first indent + ------------------------------------------ + #{@cX.cyan}Numbered List#{@cX.off} (not to be confused with headings/titles, (document structure)) + #{@cX.green}##{@cX.off} numbered list numbered list 1., 2., 3, etc. + #{@cX.green}_##{@cX.off} numbered list numbered list indented second level a., b., c., d., etc. + ------------------------------------------ + #{@cX.cyan}Endnotes#{@cX.off} + #{@cX.green}~{#{@cX.off}footnote/endnote#{@cX.green}}~#{@cX.off} endnote#{@cX.green}~{#{@cX.off}self contained endnote marker & endnote in one#{@cX.green}}~#{@cX.off} + #{@cX.green}~{*#{@cX.off}asterisk footnote/endnote#{@cX.green}}~#{@cX.off} + editor's annotations, square bracket notes + #{@cX.green}~[*#{@cX.off}numbered asterisk footnote/endnote series#{@cX.green}]~#{@cX.off} + #{@cX.green}~[+#{@cX.off}numbered dagger/plus sign footnote/endnote series#{@cX.green}]~#{@cX.off} + --- + alternative endnote pair notation + #{@cX.green}~^#{@cX.off} endnote marker + #{@cX.green}^~#{@cX.off} endnote text following the paragraph in which the marker occurs + ------------------------------------------ + #{@cX.cyan}Links#{@cX.off} + http://url.org on its own would be automatically marked up and hyperlinked to itself + #{@cX.green}{#{@cX.off} [text to link] #{@cX.green}}#{@cX.off}http://url.org + #{@cX.green}{#{@cX.off}image.png#{@cX.green}}#{@cX.off}http://url.org + #{@cX.green}{#{@cX.off}image.png#{@cX.green}}#{@cX.off}image #{@cX.green}{#{@cX.off}tux.png 64#{@cX.green}x#{@cX.off}80#{@cX.green}}#{@cX.off}image + Linked image example + #{@cX.green}{#{@cX.off} SiSU Geek Writer #{@cX.green}}#{@cX.off}http://www.jus.uio.no/sisu/ url example + #{@cX.green}{#{@cX.off}tux.png 64#{@cX.green}x#{@cX.off}80 "a better way" #{@cX.green}}#{@cX.off}http://www.jus.uio.no/sisu/ image example with all options (width x height) + Note: png and jpg support only (no gif support) + + shortcut - hyper-linked text with endnote providing the url information + #{@cX.green}{~^#{@cX.off} [text to link] #{@cX.green}}#{@cX.off}http://url.org maps to #{@cX.green}{#{@cX.off} [text to link] #{@cX.green}}#{@cX.off}http://url.org #{@cX.green}~{#{@cX.off} http://url.org #{@cX.green}}~#{@cX.off} + produces hyper-linked text within a document/paragraph, with an endnote providing the url for the text location used in the hyperlink + + shortcut: + #{@cX.green}{#{@cX.off} [text to link] #{@cX.green}[3sS]}#{@cX.off}markup_source_filename.sst + if a server host name has been provided/configured, will provide a list of available output types that would be generated using the shortcut command and the markup file provided, i.e. output generated using the command (as configured): + "sisu -3sS markup_source_filename.sst" + using server host, directory stub, filename to compose the link. + ------------------------------------------ + adding fixed names in html, manual location marker/tagging + #{@cX.green}*~[name]#{@cX.off} <a name="[name]"> + ------------------------------------------ + #{@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}<url:#{@cX.off}filename.si#{@cX.green}>require#{@cX.off} + #{@cX.green}<< <url:#{@cX.off}filename.si#{@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 +# <!image http://www.jus.uio.no/sisu/ ../_sisu/image/tux.png width=\"64\" height=\"80\" !> old form + end + def example + help_markup + end + def example37 + print <<WOK +% SiSU 0.16 - 0.37 + +0~title Working Sample Document + +0~subtitle Demonstrating markup + +0~creator Ralph Amissah + +0~date + +0~markup num_top=4 + +0~bold [regular expression of words/phrases to be made bold] + +0~italics [regular expression of words/phrases to italicise] + +0~links { SiSU }http://www.jus.uio.no/sisu { FSF }http://www.fsf.org + +1~ A Sample Document + +2~ just for fun + +4~ This is Chapter One or Article One + +Ordinary Text follows here. The Title would be a Chapter or Article depending on the type of document you were working to produce. + +4~ This would be Chapter Two or Article Two + +And so on. + +Assuming sisu is configured properly so it has been instructed where to put the work files and ouput files, you would generate this text once saved, with the suffix .sst if saved as example.sst, by typing sisu -mhwxp example.sst while in the directory in which the file is saved. + +_1 -m initial processing, -h html (css based), -w concordance for html, -x xml, -p pdf output, generated via latex, there are of course additional options + +_1 for a listing type: sisu ~ commands + +_1 for an outline of sisu markup type: sisu ~ markup + +The example ends here. +WOK + help_markup + end + def example38 + print <<WOK +% SiSU 0.38 + +@title: Working Sample Document + +@subtitle: Demonstrating markup + +@creator: Ralph Amissah + +@date: + +@markup: num_top=4 + +@bold: [regular expression of words/phrases to be made bold] + +@italics: [regular expression of words/phrases to italicise] + +@links: { SiSU }http://www.jus.uio.no/sisu { FSF }http://www.fsf.org + +:A~ A Sample Document + +:B~ just for fun + +1~ This is Chapter One or Article One + +Ordinary Text follows here. The Title would be a Chapter or Article depending on the type of document you were working to produce. + +1~ This would be Chapter Two or Article Two + +And so on. + +Assuming sisu is configured properly so it has been instructed where to put the work files and ouput files, you would generate this text once saved, with the suffix .sst if saved as example.sst, by typing sisu -mhwxp example.sst while in the directory in which the file is saved. + +_1 -m initial processing, -h html (css based), -w concordance for html, -x xml, -p pdf output, generated via latex, there are of course additional options + +_1 for a listing type: sisu ~ commands + +_1 for an outline of sisu markup type: sisu ~ markup + +The example ends here. +WOK + help_markup + end + def headers + print <<WOK +Header tags appear at the beginning of a document and provide meta information on the document (such as the Dublin Core), or information as to how the document as a whole is to be processed. +All header instructions take either the form #{@cX.green}@headername:#{@cX.off} or #{@cX.green}0~headername#{@cX.off}. All Dublin Core meta tags are available +#{@cX.green}@indentifier:#{@cX.off} information or instructions +or +#{@cX.green}0~indentifier#{@cX.off} information or instructions +where the #{@cX.green}"identifier"#{@cX.off} is a tag recognised by the program, and the #{@cX.green}"information"#{@cX.off} or #{@cX.green}"instructions"#{@cX.off} belong to the tag/indentifier specified + Note: a header where used should only be used once; all headers apart from 0~title are optional; the @structure: or 0~toc header is used to describe document structure, and can be useful to know. +This is a sample header (#{@cX.fuschia}Dublin Core in fuschia,#{@cX.off} #{@cX.cyan}other information headers in cyan,#{@cX.off} #{@cX.ruby}markup instructions in red#{@cX.off}): + +#{@cX.fuschia}@title:#{@cX.off} My Title - This is now the Title of the Document and used as such + +#{@cX.cyan}@subtitle:#{@cX.off} The Subtitle if any + +#{@cX.fuschia}@creator:#{@cX.off} [or ~author] Ralph Amissah + +#{@cX.fuschia}@subject:#{@cX.off} (whatever your subject) + +#{@cX.fuschia}@description:#{@cX.off} + +#{@cX.fuschia}@publisher:#{@cX.off} + +#{@cX.fuschia}@contributor:#{@cX.off} + +#{@cX.fuschia}@translator:#{@cX.off} [or ~translated_by] + +#{@cX.fuschia}@illustrator:#{@cX.off} [or ~illustrated_by] + +#{@cX.fuschia}@prepared_by:#{@cX.off} [or ~digitized_by] + +#{@cX.fuschia}@date:#{@cX.off} 2000-08-27 +\t[ also #{@cX.fuschia}@date.created:#{@cX.off} #{@cX.fuschia}@date.issued:#{@cX.off} #{@cX.fuschia}@date.available:#{@cX.off} #{@cX.fuschia}@date.valid:#{@cX.off} #{@cX.fuschia}@date.modified:#{@cX.off} ] + +#{@cX.fuschia}@type:#{@cX.off} article + +#{@cX.fuschia}@format:#{@cX.off} + +#{@cX.fuschia}@identifier:#{@cX.off} + +#{@cX.fuschia}@source:#{@cX.off} + +#{@cX.fuschia}@language:#{@cX.off} [country code for language if available, or language, English, en is the default setting] (en - English, fr - French, de - German, it - Italian, es - Spanish, pt - Portuguese, sv - Swedish, da - Danish, fi - Finnish, no - Norwegian, is - Icelandic, nl - Dutch, et - Estonian, hu - Hungarian, pl - Polish, ro - Romanian, ru - Russian, el - Greek, uk - Ukranian, tr - Turkish, sk - Slovak, sl - Slovenian, hr - Croatian, cs - Czech, bg - Bul garian ) [however, encodings are not available for all of the languages listed.] + +#{@cX.fuschia}@relation:#{@cX.off} + +#{@cX.fuschia}@coverage:#{@cX.off} + +#{@cX.fuschia}@rights:#{@cX.off} copyright, all rights reserved, public domain, copyleft, creative commons variant, etc. + +#{@cX.cyan}@owner:#{@cX.off} + +#{@cX.cyan}@keywords:#{@cX.off} text document generation processing management latex pdf structured xml citation [your keywords here, used for example by rss feeds, and in sql searches] + +#{@cX.cyan}@abstract:#{@cX.off} [paper abstract, placed after table of contents] + +#{@cX.cyan}@comment:#{@cX.off} [...] + +#{@cX.cyan}@catalogue:#{@cX.off} #{@cX.green}loc=#{@cX.off}[Library of Congress classification]; #{@cX.green}dewey=#{@cX.off}[Dewey classification]; #{@cX.green}isbn=#{@cX.off}[ISBN]; #{@cX.green}pg=#{@cX.off}[Project Gutenberg text number] + +#{@cX.cyan}@classify_loc:#{@cX.off} [Library of Congress classification] + +#{@cX.cyan}@classify_dewey:#{@cX.off} [Dewey classification] + +#{@cX.cyan}@classify_isbn:#{@cX.off} [ISBN] + +#{@cX.cyan}@classify_pg:#{@cX.off} [Project Gutenberg text number] + +#{@cX.cyan}@prefix_a:#{@cX.off} [prefix is placed just before table of contents - not implemented] + +#{@cX.cyan}@prefix_b:#{@cX.off} or #{@cX.cyan}@prefix:#{@cX.off} [prefix is placed just after table of contents] + +#{@cX.cyan}@rcs:#{@cX.off} $Id$ [used by rcs or cvs to embed version (revision control) information into document, rcs or cvs can usefully provide a history of updates to a document ] + +#{@cX.ruby}@structure:#{@cX.off} PART; CHAPTER; SECTION; ARTICLE; none; none; + structure can be defined by a match words or regular expression (the regular expression is assumed to start at the beginning of a line of text i.e. ^) + can be used within text instead, without this header tag, and may be used to suppliment the instructions provided in this header tag if provided + +#{@cX.ruby}@level:#{@cX.off} newpage=3; breakpage=4 [paragraph level, used by latex to breakpages, the page is optional eg. in newpage] + +#{@cX.ruby}@markup:#{@cX.off} num_top=4 [various markup instructions, eg: num_top=4 headings tobe numbered, starting at heading level 4... the default is to provide 3 levels, as in 1 level 4, 1.1 level 5, 1.1.1 level 6, markup to be merged within level] + +#{@cX.ruby}@bold:#{@cX.off} [list of words to make bold with semi colon separator] + +#{@cX.ruby}@italics:#{@cX.off} [list of words to italize with semi colon separator] + +#{@cX.ruby}@vocabulary:#{@cX.off} name of taxonomy/vocabulary/wordlist to use against document + +#{@cX.ruby}@skin:#{@cX.off} skin_doc_[name_of_desired_document_skin] + +#{@cX.ruby}@links:#{@cX.off} http://google.com; Google; + +#{@cX.ruby}@@promo:#{@cX.off} sisu, ruby, search_libre_docs, open_society [places content in right pane in html, makes use of list.yml and promo.yml, commented out sample in document sample: free_as_in_freedom.richard_stallman_cru‐ sade_for_free_software.sam_williams.sst] + +#{@cX.grey}% header ends here, NB only @title: is mandatory [this would be a comment]#{@cX.off} +#{@cX.grey}% NOTE: headings/levels below refer to 0.38 expermental markup + (a conversion script provided in sisu-examples, modify.rb makes conversion between 0.37 and 0.38 markup simple)#{@cX.off} + +#{@cX.blue}:A~#{@cX.off} Top level heading [this is usually the same as the title @title: ] + +#{@cX.blue}:B~#{@cX.off} Second level heading [this is a heading level divider] + +#{@cX.blue}:C~#{@cX.off} Third level heading [this is a heading level divider] + +#{@cX.blue}1~#{@cX.off} Top level heading preceding substantive text of document or sub-heading 5, the heading level that would normally be marked 1. or 2. or 3. etc. in a document + +#{@cX.blue}2~#{@cX.off} Second level heading preceding substantive text of document or sub-heading 6, the heading level that would normally be marked 1.1 or 1.2 or 1.3 or 2.1 etc in a document + +#{@cX.blue}3~#{@cX.off} Third level heading preceding substantive text of document, that would normally be marked 1.1.1 or 1.1.2 or 1.2.1 or 2.1.1 etc. in a document + +WOK + help_markup + end + def headers37 + print <<WOK +Header tags appear at the beginning of a document and provide meta information on the document (such as the Dublin Core), or information as to how the document as a whole is to be processed. +All header instructions take either the form #{@cX.green}@headername:#{@cX.off} or #{@cX.green}0~headername#{@cX.off}. All Dublin Core meta tags are available +#{@cX.green}@indentifier:#{@cX.off} information or instructions +or +#{@cX.green}0~indentifier#{@cX.off} information or instructions +where the #{@cX.green}"identifier"#{@cX.off} is a tag recognised by the program, and the #{@cX.green}"information"#{@cX.off} or #{@cX.green}"instructions"#{@cX.off} belong to the tag/indentifier specified + Note: a header where used should only be used once; all headers apart from 0~title are optional; the 0~toc header is used to describe document structure, and can be useful to know. +This is a sample header (#{@cX.fuschia}Dublin Core in fuschia,#{@cX.off} #{@cX.cyan}other information headers in cyan,#{@cX.off} #{@cX.ruby}markup instructions in red#{@cX.off}): + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}title#{@cX.off} My Title - This is now the Title of the Document and used as such + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}subtitle#{@cX.off} The Subtitle if any + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}creator#{@cX.off} [or ~author] Ralph Amissah + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}subject#{@cX.off} (whatever your subject) + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}description#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}publisher#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}contributor#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}translator#{@cX.off} [or ~translated_by] + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}illustrator#{@cX.off} [or ~illustrated_by] + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}prepared_by#{@cX.off} [or ~digitized_by] + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}date#{@cX.off} 2000-08-27 +\t[ also #{@cX.green}0~#{@cX.off}#{@cX.fuschia}date.created#{@cX.off} #{@cX.green}0~#{@cX.off}#{@cX.fuschia}date.issued#{@cX.off} #{@cX.green}0~#{@cX.off}#{@cX.fuschia}date.available#{@cX.off} #{@cX.green}0~#{@cX.off}#{@cX.fuschia}date.valid#{@cX.off} #{@cX.green}0~#{@cX.off}#{@cX.fuschia}date.modified#{@cX.off} ] + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}type#{@cX.off} article + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}format#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}identifier#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}source#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}language#{@cX.off} [country code for language if available, or language, English, en is the default setting] (en - English, fr - French, de - German, it - Italian, es - Spanish, pt - Portuguese, sv - Swedish, da - Danish, fi - Finnish, no - Norwegian, is - Icelandic, nl - Dutch, et - Estonian, hu - Hungarian, pl - Polish, ro - Romanian, ru - Russian, el - Greek, uk - Ukranian, tr - Turkish, sk - Slovak, sl - Slovenian, hr - Croatian, cs - Czech, bg - Bul garian ) [however, encodings are not available for all of the languages listed.] + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}relation#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}coverage#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.fuschia}rights#{@cX.off} copyright, all rights reserved, public domain, copyleft, creative commons variant, etc. + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}owner#{@cX.off} + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}keywords#{@cX.off} text document generation processing management latex pdf structured xml citation [your keywords here, used for example by rss feeds, and in sql searches] + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}abstract#{@cX.off} [paper abstract, placed after table of contents] + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}comment#{@cX.off} [...] + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}classify_loc#{@cX.off} Library of Congress classification + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}classify_dewey#{@cX.off} Dewey classification system + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}classify_isbn#{@cX.off} ISBN + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}classify_pg#{@cX.off} Project Gutenberg text number + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}prefix_a#{@cX.off} [prefix is placed just before table of contents - not implemented] + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}prefix_b#{@cX.off} or #{@cX.green}0~#{@cX.off}#{@cX.cyan}prefix#{@cX.off} [prefix is placed just after table of contents] + +#{@cX.green}0~#{@cX.off}#{@cX.cyan}rcs#{@cX.off} $Id$ [used by rcs or cvs to embed version (revision control) information into document, rcs or cvs can usefully provide a history of updates to a document ] + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}toc#{@cX.off} PART; CHAPTER; SECTION; ARTICLE; none; none; +optional, where document structure can be defined by a match words or regular expression (the regular expression is assumed to start at the beginning of a line of text i.e. ^) +default markers 1~ to 6~ can be used within text instead, without this header tag, and may be used to suppliment the instructions provided in this header tag if provided + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}level#{@cX.off} newpage=3; breakpage=4 [paragraph level, used by latex to breakpages, the page is optional eg. in newpage] + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}markup#{@cX.off} num_top=4 [various markup instructions, eg: num_top=4 headings tobe numbered, starting at heading level 4... the default is to provide 3 levels, as in 1 level 4, 1.1 level 5, 1.1.1 level 6, markup to be merged within level] + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}bold#{@cX.off} [list of words to make bold with semi colon separator] + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}italics#{@cX.off} [list of words to italize with semi colon separator] + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}vocabulary#{@cX.off} name of taxonomy/vocabulary/wordlist to use against document + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}skin#{@cX.off} skin_doc_[name_of_desired_document_skin] + +#{@cX.green}0~#{@cX.off}#{@cX.ruby}links#{@cX.off} http://google.com; Google; + +#{@cX.grey}% header ends here, NB only 0~title is mandatory [this would be a comment]#{@cX.off} + +#{@cX.blue}1~#{@cX.off} Top level heading [this is usually the same as the title 0~title ] + +#{@cX.blue}2~#{@cX.off} Second level heading [this is a heading level divider] + +#{@cX.blue}3~#{@cX.off} Third level heading [this is a heading level divider] + +#{@cX.blue}4~#{@cX.off} Top level heading preceding substantive text of document or sub-heading 5, the heading level that would normally be marked 1. or 2. or 3. etc. in a document + +#{@cX.blue}5~#{@cX.off} Second level heading preceding substantive text of document or sub-heading 6, the heading level that would normally be marked 1.1 or 1.2 or 1.3 or 2.1 etc in a document + +#{@cX.blue}6~#{@cX.off} Third level heading preceding substantive text of document, that would normally be marked 1.1.1 or 1.1.2 or 1.2.1 or 2.1.1 etc. in a document + +WOK + help_markup + end + def customise + print <<WOK + There are a number of files that control the appearance of a site or a document i.e. + + #{@cX.blue}(i)#{@cX.off} files that control #{@cX.green}site-wide appearance#{@cX.off}: + + #{@cX.green}defaults.rb#{@cX.off} initial values used by program, not necessary to change + + skins are placed in a configuration directory beneath the markup directory ./_sisu/skin/doc or in ~/.sisu/skin/doc + if a skin is also to be used for a directory or site wide presentations, rather than being called for a single document then a softlink is placed from ~/.sisu/skin/dir or ~/.sisu/skin/site respectively to the relevant skin within ~/.sisu/skin/doc + + rules for skin loading are in #{@cX.green}sysenv.rb#{@cX.off} + the skin loading heuristics / hierarchy is currently as follows: + + a. if there is a skin requested within a document, thent that skin is used + 0~skin skin_lm (would load skin ~/.sisu/skin/doc/skin_lm.rb) + + b. use it if there is a "dir" skin with the same name as the source directory "stub" i.e. + if working in a directory called /home/myhome/workdir/lm + then if ~/.sisu/skin/dir/skin_lm.rb were found it would be used and skin_lm.rb would be a softlink to the relevant skin in the document skin directory (where all the actual skins are kept) + + x. [additionally though discouraged a special rule can be set up in sysenv AddSkin.select (which could override b if desired)] + + #{@cX.green}skin_site_#{@cX.off}#{@cX.cyan}[name of site skin in use]#{@cX.off}#{@cX.green}.rb#{@cX.off} this file is called by skin.rb + if there are several such files, site appearance may be changed by + requesting the skin_site desired from skin.rb + and + + #{@cX.blue}(ii)#{@cX.off} presentation maintenance: + if you have a body of documents the easiest way to give them a particular appearance/skin, is to associate that directory with a skin, all files in that directory take on the specified appearance, changing appearance of documents once directories are set up is as simple as copying the files from one directory to another (or renaming the directory); or associating the directory with a different skin. + + see also directories +WOK + end + def configure + print <<WOK + see the following topics + install + setup + and note for initial configuration it is necessary to run: + sisu -C + (this places the default CSS files and DTDs in place) +WOK + end + def path + help_env + puts <<WOK + +If you have problems check permissions (and if in home directory ownership). + +#{@cX.green}directory paths as currently set#{@cX.off}: + output docs: #{@cX.blue}#{@env.path.webserv}#{@cX.off} + cgi scripts: #{@cX.blue}#{@env.path.cgi}#{@cX.off} + processing: #{@cX.blue}#{@env.path.processing}#{@cX.off} + sisu meta markup: #{@cX.blue}#{@env.path.dal}#{@cX.off} + html tuning: #{@cX.blue}#{@env.path.tune}#{@cX.off} + latex: #{@cX.blue}#{@env.path.tex}#{@cX.off} + texinfo: #{@cX.blue}#{@env.path.texi}#{@cX.off} + images: + source: #{@cX.blue}#{@env.path.image_source}#{@cX.off} + latex source: #{@cX.blue}#{@env.path.image_source_tex}#{@cX.off} + note images are also sourced from within your pwd - #{@cX.blue}#{Dir.pwd}/_sisu/sisu/image_local#{@cX.off} if it exists + #{@cX.grey}[ texinfo: #{@env.path.texinfo} - check duplication ]#{@cX.off} + + #{@cX.green}resource configuraton files#{@cX.off} to change the paths specified above, are searched for in the following order: + under the current SiSU markup data directory: #{@cX.blue}#{Dir.pwd}/_sisu/sisurc.yml#{@cX.off} + under the home directory ~/.sisu: #{@cX.blue}#{@env.path.home}/.sisu/sisurc.yml#{@cX.off} + in the "/etc" directory: #{@cX.blue}#{@env.path.etc}/sisurc.yml#{@cX.off} + default file paths are set by the program SiSU + + #{@cX.green}skins#{@cX.off} for document appearances on a site, directory or per document basis are located in subdirectories #{@cX.blue}doc/#{@cX.off} #{@cX.blue}dir/#{@cX.off} and #{@cX.blue}site/#{@cX.off} within: + #{@cX.blue}#{Dir.pwd}/_sisu/skin#{@cX.off} + #{@cX.blue}#{@env.path.home}/.sisu/skin#{@cX.off} + #{@cX.blue}#{@env.path.etc}/skin#{@cX.off} + default appearances are set by the program SiSU in the absence of skins + + #{@cX.green}Note on subdirectories for output documents#{@cX.off} + The last part of the name of the directory you choose to work from is used as the major sub-directory in which output files are placed, + i.e. if you are working in a directory called #{@cX.blue}#{@env.path.home}/ebook#{@cX.off} + the output files will be placed in a sub-directory named after the processed text within #{@cX.blue}#{@env.path.webserv}/ebook#{@cX.off} + ( Within this major sub-directory, a sub-directory is made with the name of each document processed, into which output files - html, pdf, xml, plaintext etc. are placed (texinfo being an exception at present) ) + + #{@cX.green}sisu -C#{@cX.off} [#{@cX.green}--init=site#{@cX.off}] configure/initialise shared output directory files initialize shared output directory (config files such as css and dtd files are not updated if they already exist unless modifier is used). -C --init=site configure/initialise site more extensive than -C on its own, shared output directory files/force update, existing shared output config files such as css and dtd files are updated if this modifier is used. in a new markup document working directory should initialise the corresponding output directory, though SiSU will automatically do this, the first time it is run (for processing) in a given directory. + + There are additional details, ... this should get you started. + + See also + sisu --help directory +WOK + help_env + end + def directories + help_env + print <<WOK + + the directory structure used by sisu is controlled by the configuration files #{@cX.blue}sisurc.yml#{@cX.off} + + there are separate directories for the following: + + (a) #{@cX.green}data directories#{@cX.off} + the directories in which you place the SiSU marked-up data files that are to be processed + there may be as many directories and files as you choose to have, + you are currently in: #{@cX.blue}#{Dir.pwd}#{@cX.off} + + (b) #{@cX.green}output directory#{@cX.off} + by default files in the data directory are output to + a sub-directory within the output directory (usually the web document directory), or to an sql database + of the same name as the stub or last portion of the data directory name + by way of example + you are currently in: #{@cX.blue}#{Dir.pwd}#{@cX.off} + the document output directory is set to: #{@cX.blue}#{@env.path.webserv}#{@cX.off} + documents from your current directory will be placed in: #{@cX.blue}#{@env.path.output}#{@cX.off} + + the final output is placed in subdirectories either as configured by default in the program or as modified by SiSU configuration files + subdirectories are created within the main output directory, based on the name of the data directory + subsubdirectories are created the sub-directory contained in the main output directory based on the name of the file + (subdirectories are created in this (output) sub-directory named after the data file) + for this reason it is a convention to give descriptive names to the data file. + The default output directory is #{@cX.green}~/sisu_www#{@cX.off} + The output directory is currently set to: + #{@cX.blue}#{@env.path.webserv}#{@cX.off} + Output files, are currently set to be produced in: + processed document output: #{@cX.blue}#{@env.path.output}#{@cX.off} + a document in the current directory #{@cX.blue}#{Dir.pwd}#{@cX.off} + will have its output placed in: #{@cX.blue}#{@env.path.output}/#@output_stub#{@cX.off} + + NB: the verbose flag v included in the generate command string, should + result in a list of output filenames together with their paths. + The flag U on its own (e.g. sisu -U gpl2.fsf.sst) should provide a list + of output files that could be generated together with their paths. + + (c) #{@cX.green}configuration files#{@cX.off} + SiSU program defaults are set within the program, and may be adjusted in the yml file #{@cX.blue}sisurc.yml#{@cX.off} which is searched for in the following paths, which are prioritized as listed (the first one found is loaded): +### + under the current SiSU markup data directory: #{@cX.blue}#{@env.path.pwd}/_sisu/sisurc.yml#{@cX.off} + under the home directory ~/.sisu: #{@cX.blue}#{@env.path.home}/.sisu/sisurc.yml#{@cX.off} + in the "/etc" directory: #{@cX.blue}#{@env.path.etc}/sisurc.yml#{@cX.off} + + (d) #{@cX.green}processing directories#{@cX.off} sisu creates a number of processing directories, + where these should be located can be modified in #{@cX.green}~/.sisu/sisurc.yml#{@cX.off} + work directories include the following: + root working directory #{@cX.blue}#{@env.path.processing}#{@cX.off} + metaverse intermediate markup #{@cX.blue}#{@env.path.dal}#{@cX.off} + tune html (for special html/navigation pages) #{@cX.blue}#{@env.path.tune}#{@cX.off} + tex for latex and pdf #{@cX.blue}#{@env.path.tex}#{@cX.off} + texinfo for texinfo and info files #{@cX.blue}#{@env.path.texi}#{@cX.off} + + These files are usually used only for processing and removed. There is a maintenance flag to keep them. + + (e) #{@cX.green}images#{@cX.off} + there are a number of categories of images, + NB the document markup directory is initialised by issuing the command + sisu -C --init=site + this creates the output sub-directory, and makes necessary image links, and + copies images specific to the markup directory if there are any. + + general images for the sisu program that come with the package, + that are the defaults used by sisu, these are installed with the program + + images that the author wishes to include within documents, + these should be placed in a sub-directory + within the current document markup directory called #{@cX.green}_sisu/sisu/image_local#{@cX.off} + + if an instruction is given to process a remote document which contains + downloadable images, they are included in a sub-directory of the current + markup directory #{@cX.green}_sisu/sisu/image_external#{@cX.off} that is created + if necessary for the purpose. + + finally skins may specify/indicate other image directories. see sisu --help skin + any site images required by the skin instruction must be copied in to the + site image directory (it may be necessary to do manual configuration depending + on what you are trying to achieve). + + (f) #{@cX.green}program directories#{@cX.off} + sisu --help install + sisu ~ install + + See also + sisu --help path +WOK + help_env + end + def program_found?(program) + rc=if SiSU_Env::Info_settings.new.program?(program) + "rc: #{SiSU_Env::Info_settings.new.program?(program)} " + else '' + end + bin=if SiSU_Env::System_call.new.program_found?(program) + "bin: #{SiSU_Env::System_call.new.program_found?(program)}" + else '' + end + "#{@cX.brown}#{rc}#{bin}#{@cX.off}" + end + def environment + cf_defaults=SiSU_Env::Info_processing_flag.new + x =<<WOK + #{@cX.green}current and output directories#{@cX.off} + user: #{@cX.blue}#{@env.user}#{@cX.off} + home: #{@cX.blue}#{@env.path.home}#{@cX.off} + remote set [remote user]@[remote host]: #{@cX.blue}#{SiSU_Env::Info_remote_host.new.remote_host[:name]}#{@cX.off} + (remote settings user and host set in sisurc.yml under remote:) + locale (encoding, UTF-8 desired): #{@cX.blue}#{@env.locale}#{@cX.off} + current directory: #{@cX.blue}#{@env.path.pwd}#{@cX.off} + document output root directory set to: #{@cX.blue}#{@env.path.webserv}#{@cX.off} + documents from current directory placed in: #{@cX.blue}#{@env.path.output}#{@cX.off} + sisurc.yml used: #{@cX.blue}#{@env.path.yamlrc}#{@cX.off} + webrick url: #{@cX.blue}#{@env.url.webserv_base_cgi}#{@cX.off} + (to start webrick server 'sisu -W') + sqlite db for present directory: #{@cX.blue}sqlite #{@env.path.output}/sisu_sqlite.db#{@cX.off} + postgresql port set to: #{@cX.blue}#{@db.port_psql}#{@cX.off} + postgresql db for present directory: #{@cX.blue}#{@db.db_psql}#{@cX.off} + [first create manually if necessary: 'createdb #{@db.db_psql}'] + + [generated sqlite cgi search form]: #{@cX.blue}#{@env.url.webserv_base_cgi}/cgi-bin/sisu_sqlite.cgi#{@cX.off} + [generated postgresql cgi search form]: #{@cX.blue}#{@env.url.webserv_base_cgi}/cgi-bin/sisu_pgsql.cgi#{@cX.off} + (to generate 'sisu -F' or 'sisu -F webrick') + #{@cX.green}configuration files#{@cX.off} + sisurc.yml used: #{@cX.blue}#{@env.path.yamlrc}#{@cX.off} + configuration information search path: #{@cX.blue}#{@env.path.rc.join(', ')}#{@cX.off} + (directory also relevant for skins and images) + digest (md5 or sha256): #{@cX.blue}#{@env.digest.type}#{@cX.off} + papersize set (LaTeX/pdf): #{@cX.blue}#{@env.papersize}#{@cX.off} + (digest and papersize can be changed in sisurc.yml under default:) + #{@cX.green}intermediate processing#{@cX.off} + processing directory: #{@cX.blue}#{@env.path.processing}#{@cX.off} + (to keep processing output, use -M flag) + #{@cX.green}programs selected for viewing output#{@cX.off} + text editor: #{@cX.blue}#{@env.program.text_editor}#{@cX.off} + web browser: #{@cX.blue}#{@env.program.web_browser}#{@cX.off} + console web browser: #{@cX.blue}#{@env.program.console_web_browser}#{@cX.off} + pdf viewer: #{@cX.blue}#{@env.program.pdf_viewer}#{@cX.off} + xml viewer: #{@cX.blue}#{@env.program.xml_editor}#{@cX.off} + odf viewer: #{@cX.blue}#{@env.program.odf_viewer}#{@cX.off} + (default selections can be changed in sisurc.yml under program_select:) + #{@cX.green}programs used if available#{@cX.off} + word count: #{@cX.blue}#{@env.program.wc}#{@cX.off} #{program_found?(@env.program.wc)} + imagemagick/rmagick: #{program_found?('rmagick')} + tidy: #{@cX.blue}#{@env.program.tidy}#{@cX.off} #{program_found?(@env.program.tidy)} + rexml: #{@cX.blue}#{@env.program.rexml}#{@cX.off} #{program_found?(@env.program.rexml)} + latex to pdf: #{@cX.blue}#{@env.program.pdflatex}#{@cX.off} #{program_found?(@env.program.pdflatex)} + postgresql: #{@cX.blue}#{@env.program.postgresql}#{@cX.off} #{program_found?(@env.program.postgresql)} + sqlite: #{@cX.blue}#{@env.program.sqlite}#{@cX.off} #{program_found?(@env.program.sqlite)} + (these can be turned off if unavailable in sisurc.yaml under program_set:) + #{@cX.green}processing shortcut defaults set to:#{@cX.off} + color defaut set (on==true) #{@cX.blue}#{cf_defaults.color}#{@cX.off} + sisu -0 #{@cX.blue}#{cf_defaults.cf_0}#{@cX.off} [default] + sisu -1 #{@cX.blue}#{cf_defaults.cf_1}#{@cX.off} + sisu -2 #{@cX.blue}#{cf_defaults.cf_2}#{@cX.off} + sisu -3 #{@cX.blue}#{cf_defaults.cf_3}#{@cX.off} + sisu -4 #{@cX.blue}#{cf_defaults.cf_4}#{@cX.off} + sisu -5 #{@cX.blue}#{cf_defaults.cf_5}#{@cX.off} + (defaults may be changed in active sisurc.yml file under flag:) + #{@cX.green}special powers, risky operations set:#{@cX.off} + zap (delete output directories) #{@cX.blue}#{SiSU_Env::Info_settings.new.permission?('zap')}#{@cX.off} + css copy (copy over css files) #{@cX.blue}#{SiSU_Env::Info_settings.new.permission?('css_modify')}#{@cX.off} + (true/false defaults may be changed in active sisurc.yml file under permissions_set:) +WOK +print x + end + def dublin_core + print <<WOK +@title: + +@subtitle: [is added to title for purposes of Dublin Core description] + +@creator: + +@type: + +@subject: + +@date: [ccyy-mm-dd] + +@date.created: + +@date.issued: + +@date.available: + +@date.valid: + +@date.modified: + +@source: + +@language: en + +@papersize: A4 + +@relation: + +@coverage: + +@rights: + +WOK + end + def headings + print <<WOK +These are not required, a header is quicker to prepare if a documents structure can be defined by matching words or a regular expression, see headers). + +@structure: PART; CHAPTER; SECTION; ARTICLE; none; none; + +structure can be defined by a match words or regular expression (the regular expression is assumed to start at the beginning of a line of text i.e. ^) + +The following heading or level (structuring) defaults are available (for use instead of or together with @structure: header): + + 1~ 2~ 3~ 4~ 5~ 6~ + +or, [0.38] + + :A~ :B~ :C~ 1~ 2~ 3~ + +Heading tags take either of the forms above, ranging from 1-6 + +They appear at the beginning of the line on which a heading appears, +the number indicates the level of the heading with level 1 being a title, + +segments (in html output) are by default created on level 4 +(segmented text is split/segmented on level 4, and +assigned a file name automatically according to the title number, +unless you explicitly specify otherwise) + +eg. + +% SiSU 0.16 - 0.37 + +1~ Document Title + +2~ Document Subtitle whatever it is + +3~ Part + +4~ Chapter + +5~ Heading + +6~ sub-heading + +in the 0.38 notation this maps to: + +% SiSU 0.38 + +:A~ Document Title + +:B~ Document Subtitle whatever it is + +:C~ Part + +1~ Chapter + +2~ Heading + +3~ sub-heading + +(a conversion script provided in sisu-examples, modify.rb makes conversion between 0.37 and 0.38 markup simple) + +Normal text would follow each heading level as appropriate, though it is most usual to start with ordinary writing beneath level 4 as it is at this level that segments are created. + +Automatic numbering of paragraphs is usually set to start at level 4 trough level 6 and takes the form 1. then 1.1 then 1.1.1 this being given as a Header tag 0~ There may be up to 6 levels in a document, + +If auto-numbering is on, then for html output the segments created (on level 4 headings) are automatically assigned the name of the title number. +However, you may indicate an alternative set of key/title words, with one of the following instructions: +4~filename This is a Section or Subject Heading + +If there is a strictly discernable word appearing at the beginning of the line in a document that identifies the level, +the words can be used to identify the levels in a header tag: +0~toc Part; Chapter; Section; Article; none; none +instead of providing individual heading tags + +sisu structure, (0.38) alternative notation, A,B,C,1,2,3 mapping to 1,2,3,4,5,6 + + SiSU has in effect two sets of levels to be considered + + 1-3 headings/levels, (A-C [0.38]) pre-ordinary paragraphs /pre-substantive text, and + + 4-6 headings/levels, (1-3 [0.38]) levels which are followed by ordinary text. + + This may be conceptualised as levels A,B,C, 1,2,3, and using such letter number notation, in effect: + + A must exist, optional B and C follow in the sequence + + 1 must exist, optional 2 and 3 follow in the sequence + + i.e. there are two independent heading level sequences A,B,C and 1,2,3 or using the standard notation 1,2,3 and 4,5,6 + +on the positive side: (a) the A,B,C,1,2,3 alternative makes explicit an aspect of structuring documents in SiSU that is not otherwise obvious to the newcomer (though it appears more complicated, is more in your face and likely to be understood fairly quickly); (b) the substantive text follows levels 1,2,3 and it is 'nice' to do most work in those levels + + +WOK + end + def languages + puts <<WOK + + Multi-language Document File Naming and Directory Mapping + + If the same document exists in different language versions, and it is desired that the published language versions should reside in the same output directory, the following filenaming convention should be observed, using Spannish as the sample language code (es) [it is very likley the use of country codes as language codes will be changed or extended in future] [filename]~[language code].sst + + filename~es.sst + + within sisurc.yml under the heading + default: + language file: [at 1, 2 or 3] + + determines the output filenaming convention used, as follows: + + (1) [output directory path]/filename/es.index.html + + (2) [output directory path]/filename/index.es.html + + (3) [output directory path]/filename/index.html.es (which Apache for example can be configured to use to automatically serve each users preference) + + filename~fr.sst + filename~de.sst + + etc. would be placed in the same directory using the same convention as indeed would: + filename.sst + using the default convention mapping convention. + + Selecting this form of filename will overide other language settings including the language header within a document. + +WOK + end + def endnotes + print <<WOK + +(1) Footnote/endnotes tags take a number of possible forms, the simplest being to embed an endnote within your text~{ this would appear as an endnote, and would have an automatically assigned number }~ Embedded endnotes~{this is an endnote}~ and at the end of the paragraph~{* an asterisk marked note }~ writing the endnote:~{another endnote}~ + + ------------------------------------------ +#{@cX.ruby}All you need to know about endnotes appears above this line...#{@cX.off} apart from the fact that you cannot mix endnote markup styles + +(2) The other ways of inserting an endnote involve placing a tag within the text as to where the endnote reference number should appear like so~^ and at the end of the paragraph writing the endnote:~^ + +^~ like so, this is an endnote + +^~ another endnote + +WOK + end + def tables + print <<WOK + +#{@cX.green}table{ [number of columns] [column width %];[column width %]#{@cX.off} + +[table content, line breaks are important see example below] + +#{@cX.green}}table#{@cX.off} +#{@cX.grey}----#{@cX.off} +This is a sample table: +----------------------- + +#{@cX.green}table{ c3; 40; 30; 30;#{@cX.off} + +This is a table +this would become column two of row one +column three of row one is here + +And here begins another row +column two of row two +column three of row two, and so on + +#{@cX.green}}table#{@cX.off} + +there is an alternative way to markup tables, a sample document is provided in the file +#{@cX.green}sisu_output_overview.sst#{@cX.off} located in +#{@cX.green}/usr/share/doc/sisu#{@cX.off} or equivalent directory + +preformatted text +----------------- + +#{@cX.green}poem{#{@cX.off} + + [Text here] + +#{@cX.green}}poem#{@cX.off} +#{@cX.grey}----#{@cX.off} + +#{@cX.green}group{#{@cX.off} + + [Text here] + +#{@cX.green}}group#{@cX.off} +#{@cX.grey}----#{@cX.off} + +#{@cX.green}code{#{@cX.off} + + [Text here] + +#{@cX.green}}code#{@cX.off} + +WOK + end + def modules + print <<WOK + + #{@cX.ruby}IGNORE#{@cX.off} + +WOK + end + def modules_old + print <<WOK + + #{@cX.ruby}DATED NOT CURRENT - IGNORE#{@cX.off} + + This file is to contain some information the different programs that form sisu: + + their inter-relationship (for which see sisu-chart.pdf) + + and + + what they do + + sisu\ttui/command line program that when run with flags against files produces requested output + + ~/.sisu\tconfiguration directory, contains sisu configuration, and skins for alternative appearances + param\tgathers parameters from the sourcefile, when called by metaverse parameters are saved to pstore file + sysenv\tgets system information, and builds directory structure + + init\tintialised defaults for appearance + skin\tsite wide skin + format\tformatting instructions assosciated with and used by calling module + + metaverse\tinitial processing stage, preliminary file on which subsequent processing is done is created [-m] + + plaintext\tplaintext creating module [-a] + html\thtml creating modules [-h] + texpdf\tlatex and pdf creating modules [-p] + xml & xml_dom\txml creating modules [-x -X] + concordance\tword map creating module [-w] + + termsheet\tcreation of documents from termsheet and standard forms [-t] + + dbi\tdbi database build and populating module, default postgresql [-D] + dbi_sqlite\tdbi database build and populating module, for sqlite [-d] + + #{@cX.ruby}DATED NOT CURRENT - IGNORE#{@cX.off} + +WOK + end + def install + #% system configuration + print <<WOK + #{@cX.green}Install SiSU#{@cX.off} + + SiSU does require setup, the file sisu is placed in the equivalent of #{@cX.blue}/usr/bin#{@cX.off} or #{@cX.blue}/usr/local/bin#{@cX.off} and the REWRITE files where ruby libraries are kept, on my debian system #{@cX.blue}/usr/local/lib/site_ruby/1.8#{@cX.off} + + For information on download and installation, see #{@cX.blue}http://www.jus.uio.no/sisu/sisu_download/download#{@cX.off} or #{@cX.blue}http://www.jus.uio.no/sisu/SiSU/download#{@cX.off} + + For post installation help it is best you refer to '#{@cX.blue}man 8 sisu#{@cX.off}' + + Host + host: #{@cX.blue}#{@env.hostname}#{@cX.off} + arch: #{@cX.blue}#{@env.arch}#{@cX.off} + + Directories for installation + bin: #{@cX.blue}[FIX]#{@cX.off} + lib (site-ruby): #{@cX.blue}#{Config::CONFIG['sitelibdir']}/#{SiSU_lib}#{@cX.off} + conf [etc]: #{@cX.blue}#{@env.path.etc}/sisu{@cX.off} + data (document samples, images, README): #{@cX.blue}#{@env.path.sample_data}/sisu#{@cX.off} and #{@cX.blue}#{@env.path.sample_data}/doc/sisu#{@cX.off} + man (manual pages): #{@cX.blue}#{@env.path.man}#{@cX.off} + processing: #{@cX.blue}#{@env.path.processing}#{@cX.off} + output www: #{@cX.blue}#{@env.path.output}#{@cX.off} + + Output files, are currently set to be produced in: + processed document output: #{@cX.blue}#{@env.path.output}#{@cX.off} + a document in the current directory #{@cX.blue}#{Dir.pwd}#{@cX.off} + will have its output placed in: #{@cX.blue}#{@env.path.output}/#@output_stub#{@cX.off} + + Install any additional programs of interest (that SiSU makes use of, that are not already on your system) + + Programs SiSU makes use of include: + LaTeX + texinfo + pdfetex aka. pdflatex + sqlite + postgresql + + Again, refer to '#{@cX.blue}man 8 sisu#{@cX.off}' + + For additional help on using SiSU once installed type: + + sisu --help + +WOK + end + def setup + print <<WOK + + [provide some setup information] + + also see http://www.jus.uio.no/sisu/SiSU + +WOK + end + def termsheet + print <<WOK + + #{@cX.green}sisu -t [termsheetname].termsheet.rb#{@cX.off} + will produce the collection of documents associated with [termsheetname.termsheet.rb] + + #{@cX.green}termsheet.rb#{@cX.off} files: + (i) are named after the facility + (ii) contain instructions as to which standard forms to use for the agreement (standard_form.rb) + there may be several, eg. the termsheet, and the resulting: + main agreement; collection account charge; and deed of assignment + (iii) contain the variable terms of the agreement, borrower, interest etc. + + for a new loan agreement fill out a new termsheet specifying + what standard forms are to be used, + and the terms of the agreement. + + #{@cX.green}standard_form.rb#{@cX.off} files: + contain the standard terms of the agreement + there is a standard form for each variation of agreement + (so eg. there are as many facility agreements as there are variations in standard facility) + these may be prepared for any agreement that is to be reused. + (preparation takes the form of formating and + placing variable holders for the variables that are to be provided by the termsheet.rb file) + + it is necessary to purge the directory ~facilityData when old files are removed + +WOK + end + def help_commands + print <<WOK + + also see: + sisu --help commands + man sisu +WOK + end + def help_env + print <<WOK + + for sisu environment information see: + sisu --help env +WOK + end + def help_general + help_env + help_commands + end + def help_markup + print <<WOK + + for help with sisu markup see: + sisu --help markup + sisu --help header + sisu --help structure [sisu --help heading] + + for older standard markup: + sisu --help example37 + + for markup: + sisu --help example38 + + sisu-0.38 is provided with 0.38 markup samples + + sample marked up documents are provided in directory: + #{@cX.green}sisu-exampless/sample/document_samples_sisu_markup/#{@cX.off} + and online + #{@cX.green}www.jus.uio.no/sisu#{@cX.off} +WOK + end + def convert + print <<WOK + + for information on the markup version used within a sisu markup file: + sisu --inspect [filename] + + to convert between sst markup versions 0.37 and 0.38: + sisu --to-current + sisu --to-38 [filename/wildcard] + sisu --to-37 [filename/wildcard] + + convert an sst file with footnotes following text to (preferred) inline footnotes + sisu --convert-footnotes [filename/wildcard] + + to convert from sst to simple xml representations (sax, dom and node): + sisu --to-sax [filename/wildcard] + sisu --to-sxs [filename/wildcard] + + sisu --to-dom [filename/wildcard] + sisu --to-sxd [filename/wildcard] + + sisu --to-node [filename/wildcard] + sisu --to-sxn [filename/wildcard] + + to convert to sst from simple xml representations (sax, dom and node): + sisu --from-xml2sst [filename/wildcard [.sxs.xml,.sxd.xml,sxn.xml]] + sisu --from-sxml [filename/wildcard [.sxs.xml,.sxd.xml,sxn.xml]] + + to attempt to convert a kdissert (.kdi) file to sisu markup: + sisu --to-kdi [kdissert filename] + (very basic and experimental) +WOK + end + def dal + print <<WOK + + sisu -m [filename/wildcard] creates the metaverse, used by all other modules for downstream processing +WOK + help_commands + end + def utf8 + print <<WOK + + documents prepared for sisu processing should be stored in utf8 +WOK + end + def plaintext + print <<WOK + + sisu -A [filename/wildcard] plaintext with dos linefeeds (footnotes follow paragraphs) + sisu -a [filename/wildcard] plaintext with Unix linefeeds (footnotes follow paragraphs) + + sisu -E [filename/wildcard] plaintext with dos linefeeds (endnotes follow document) + sisu -e [filename/wildcard] plaintext with Unix linefeeds (endnotes follow document) + + sisu -ho [filename/wildcard] exclude ocn, object numbers +WOK + help_commands + end + def html + print <<WOK + + sisu -h [filename/wildcard] html document type suffixes included + sisu -H [filename/wildcard] html without document type suffixes + + sisu -ho [filename/wildcard] exclude ocn, object numbers +WOK + help_commands + end + def xhtml + print <<WOK + + sisu -b [filename/wildcard] xhtml document +WOK + help_commands + end + def xml + print <<WOK + + sisu -x [filename/wildcard] xml document (sax type parsing) + sisu -X [filename/wildcard] xml document (dom type parsing) + + sisu -o [filename/wildcard] odt document, (odf open document format) +WOK + help_commands + end + def odf + print <<WOK + + sisu -o [filename/wildcard] odt document, (odf open document format) +WOK + help_commands + end + def php + print <<WOK + + not supported + [php output has been removed] +WOK + help_commands + end + def pdf + print <<WOK + + sisu -p [filename/wildcard] produces pdf files from LaTeX output +WOK + help_commands + end + def latex + print <<WOK + + sisu -p [filename/wildcard] produces pdf files from LaTeX output +WOK + help_commands + end + def texinfo + print <<WOK + + sisu -i [filename] produces texinfo and info files + + info and texinfo files are currently left in a separate work/output directory... have not decided what to do with them + + on my system info works fine point at file with info command + + pinfo, requires you to be within the work/output directory + cd [work/output directory] + + and then to point at the file using + pinfo ./[filename] +WOK + help_commands + end + def lout + print <<WOK + + sisu -l [filename/wildcard] + + not currently supported, revisit someday? +WOK + help_commands + end + def concordance + print <<WOK + + sisu -W starts the sisu webrick server, default port 8081 +WOK + help_commands + end + def help_search + print <<WOK + + SiSU searches, + depending on how you wish to implement search, + the following may bre of interest: + sisu --help sql + sisu --help searchform (or 'sisu --help cgi') + sisu --help hyperestraier (or 'sisu --help est') + sisu --help webrick +WOK + end + def cgi + print <<WOK + + sisu -F generates a sample search form + + sisu -F --webserv=webrick generates a sample search form for use with the webrick server + sisu -Fv as above, and provides some information on setting up hyperestraier + sisu -W starts the webrick server + + the generated search form must be copied to the webserver directory as instructed +WOK + help_search + help_general + end + def sql + print <<WOK + + Mappings to two databases are provided by default, + postgresql and sqlite, + the same commands are used within sisu to construct and populate databases + however -d (lowercase) denotes sqlite and -D (uppercase) denotes postgresql + the examples here will used -d (lowercase) + alternatively --sqlite or --pgsql may be used + + sisu -d --createdb creates database where no database existed before + sisu -d --create creates database tables where no database tables existed before + sisu -d --dropall destroys database (including all its content)!! + sisu -d --recreate destroys existing database and builds a new empty database structure + + sisu -d --import [filename/wildcard] populates database with the contents of the file + sisu -d --update [filename/wildcard] updates file contents in database + + sisu -F --webserv=webrick builds a cgi web search frontend for the database created + + Postgresql + user: #{@cX.blue}#{@db.user}#{@cX.off} + current db set: #{@cX.blue}#{@db.db_psql}#{@cX.off} + port: #{@cX.blue}#{@db.port_psql}#{@cX.off} + dbi connect: #{@cX.blue}#{@db.dbi_psql}#{@cX.off} + + sqlite + current db set: #{@cX.blue}#{@db.db_sqlite}#{@cX.off} + dbi connect #{@cX.blue}#{@db.dbi_sqlite} #{@cX.off} + + Note on databases built + By default, [unless otherwise specified] databases are built on a directory basis, from collections of documents within that directory. + The name of the directory you choose to work from is used as the database name, + i.e. if you are working in a directory called #{@cX.blue}#{@env.path.home}/ebook#{@cX.off} the database #{@cX.blue}ebook#{@cX.off} is used. [otherwise a manual mapping for the collection is necessary] +WOK + help_search + help_general + end + def webrick + print <<WOK + + sisu -W starts the sisu webrick server, default port 8081 +WOK + help_commands + end + def hyperestraier + out_dir='(' + `ls #{@env.path.webserv}`.split("\n").join('|') + ')' + print <<WOK + See the documentation for hyperestraier + #{@cX.blue} + http://hyperestraier.sourceforge.net/ + http://hyperestraier.sourceforge.net/intro-en.html + http://hyperestraier.sourceforge.net/uguide-en.html + http://hyperestraier.sourceforge.net/pguide-en.html + + file:///usr/share/doc/hyperestraier/index.html + #{@cX.off} #{@cX.orange} + man estcmd + #{@cX.off} + (A) to generate the index + within the webserver directory to be indexed: + #{@cX.orange}estcmd gather -sd [index name] [directory path to index]#{@cX.off} + the following are examples that will need to be tailored according to your needs: + #{@cX.green} + cd #{@env.path.webserv} + estcmd gather -sd casket #{@env.path.webserv} + #{@cX.off} + you may use the 'find' command together with 'egrep' to limit + indexing to particular document collection directories within + the web server directory:#{@cX.green} + + find /home/ralph/sisu_www -type f | egrep '#{@env.path.output}/.+?\.html$' |estcmd gather -sd casket - #{@cX.off} + + check which directories in the webserver/output directory #{@cX.green}#{@env.path.webserv}#{@cX.off} + you wish to include in the search index, these appear to be: + + #{@env.path.webserv}/#{@cX.green}#{out_dir}#{@cX.off} + + as sisu duplicates output in multiple file formats, + it it is probably preferable to limit the estraier index + to html output, and as it may also be desireable to + exclude files 'doc.html' and 'concordance.html', as these + duplicate information held in other html output e.g. #{@cX.green} + + find /home/ralph/sisu_www -type f | egrep '/sisu_www/(sisu|bookmarks)/.+?\.html$' | egrep -v '(doc|concordance)\.html$' |estcmd gather -sd casket - #{@cX.off} + + from your current document preperation/markup directory, you would construct a rune along the following lines: #{@cX.green} + + find /home/ralph/sisu_www -type f | egrep '#{@env.path.webserv}/([specify first directory for inclusion]|[specify second directory for inclusion]|[another directory for inclusion? ...])/.+?\.html$' | egrep -v '(doc|concordance)\.html$' |estcmd gather -sd #{@env.path.webserv}/casket - #{@cX.off} + + (B) to set up the search form + (i) copy #{@cX.green}estseek.cgi#{@cX.off} to your cgi directory and set file permissions to 755: #{@cX.green} + + sudo cp -vi /usr/lib/estraier/estseek.cgi /usr/lib/cgi-bin + sudo chmod -v 755 /usr/lib/cgi-bin/estseek.cgi + sudo cp -v /usr/share/hyperestraier/estseek.* /usr/lib/cgi-bin #{@cX.off} + [see estraier documentation for paths] + + (ii) edit #{@cX.green}estseek.conf#{@cX.off}, with attention to the lines starting 'indexname:' and 'replace:': #{@cX.green} + + indexname: #{@env.path.webserv}/casket + replace: ^file://#{@env.path.webserv}{{!}}#{@env.url.webrick_base} + replace: /index\.html?${{!}}/ #{@cX.off} + + (C) to test using webrick, start webrick: #{@cX.green} + sisu -W #{@cX.off} + + and try open the url: #{@cX.blue} + #{@env.url.webrick_base}/cgi-bin/estseek.cgi #{@cX.off} + +WOK + end + def yaml + print <<WOK + Yaml sisurc files may be used to configure sisu, these are searched for in the following locations: + + under the current SiSU markup data directory: #{@cX.blue}#{Dir.pwd}/_sisu/sisurc.yml#{@cX.off} + under the home directory ~/.sisu: #{@cX.blue}#{@env.path.home}/.sisu/sisurc.yml#{@cX.off} + in the "/etc" directory: #{@cX.blue}#{@env.path.etc}/sisurc.yml#{@cX.off} + + The Yaml files #{@cX.blue}promo.yml#{@cX.off} and #{@cX.blue}list.yml#{@cX.off} may be used to build a minor right pane in html, they may be placed in the following locations: + + under the current SiSU markup data directory: #{@cX.blue}#{Dir.pwd}/_sisu/skin/yml/#{@cX.off} + under the home directory ~/.sisu: #{@cX.blue}#{@env.path.home}/.sisu/skin/yml/#{@cX.off} + in the "/etc" directory: #{@cX.blue}#{@env.path.etc}/skin/yml/#{@cX.off} + + these may be called by the sisurc.yml, skins for document, directory or site, or from individual document headers in the header @@promo: [a commented out example header may be found in document sample: free_as_in_freedom.richard_stallman_cru‐ sade_for_free_software.sam_williams.sst, it calls for the specified lists in list.yml, which in turn calls the widgets named in promo.yml which are used to build content in the right pane of html output] + +WOK + end + def sitemap + print <<WOK + + SiSU sitemaps, + an experimental feature (following g,y,m announcement to use them this week) + sisu -Y [filename/wildcard] + it may be necessary run -m first (generate the the metaverse) + sisu -mY [filename/wildcard] + + to generate/update the index of sitemaps + sisu --sitemaps +WOK + end + def license + + print <<WOK + +* License: GPL 2 or later + + #{@cX.ruby}GPL2 summary#{@cX.off}: + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License + #{@cX.blue}http://www.gnu.org/copyleft/gpl.html#{@cX.off} + as published by the Free Software Foundation; + #{@cX.blue}http://www.gnu.org/fsf/fsf.html#{@cX.off} + 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: + #{@cX.blue}http://www.fsf.org/licenses/gpl.html#{@cX.off} + #{@cX.blue}http://www.gnu.org/copyleft/gpl.html#{@cX.off} + #{@cX.blue}http://www.jus.uio.no/sisu/gpl2.fsf#{@cX.off} + +* see also the "SiSU Standard" section + +* Ralph Amissah ralph@amissah.com + Ralph Amissah ralph.amissah@gmail.com + +WOK + end + def standards + print <<WOK + +SiSU uses: + +* Standard SiSU markup syntax, +* Standard SiSU meta-markup syntax, and the +* Standard SiSU object citation numbering and system + +© Ralph Amissah 1997, current 2005. +All Rights Reserved. + +Information on these may be obtained from: + http://www.jus.uio.no/sisu + +More information to be provided later. + +* however note also the License section + +* Ralph Amissah ralph@amissah.com + Ralph Amissah ralph.amissah@gmail.com + +WOK + end + def conversion + print <<WOK +sisu_convert does the initial conversion from a couple of file formats to SiSU file format, currently only html and word97 + #{@cX.cyan}sisu_convert#{@cX.off} [keyword] + sisu [keyword] + #{@cX.green}--html#{@cX.off} convert from html + #{@cX.green}--pace#{@cX.off} convert from html does some initial headers... + ------------------------------------------ + Preparing Documents for SiSU + #{@cX.green}--word97#{@cX.off} sisu --help markup (an incomplete overview) +WOK + end + def external_programs + puts <<WOK + + external ruby programs + + external programs + #{@cX.cyan}pdf output - tex/latex#{@cX.off} + #{@cX.orange}required#{@cX.off} + tex-base/latex + pdfetex aka. pdflatex + #{@cX.brown}suggested/recommended#{@cX.off} + #{@cX.cyan}db/sql output#{@cX.off} + #{@cX.orange}required#{@cX.off} + postgresql + #{@cX.brown}suggested/recommended#{@cX.off} + sqlite + #{@cX.cyan}xml/xhtml/html output#{@cX.off} + #{@cX.orange}required#{@cX.off} + #{@cX.brown}suggested/recommended#{@cX.off} + tidy (xml, xhtml well formed check) + trang (relaxng, rnc to dtd conversion) +WOK + end + def scratch + print <<WOK +Types of tag, + +then there are various tags which occur within the document. +Structural tags, which consist of: + heading tags that identify headings within text, and; + footnote/endnote tags ... + +Markup instructions: giving information as to what is to be done to the presentation of the text + +Markup tags + +These have been kept to a minimum. A number of text html markup tags can be used <b>to bold</b> <i>to indent</i> <sup>for superscript</sup> <sub>for subscript text</sub> + +_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*+]+ <a name="_[\d*+]+"/ + endnote_array=[] + if pg=~/~\{[\d*+].+?\}\~/m + endnote_array << pg.scan(/~\{[\d*+]+(.+?)\}\~/m) + end + if pg=~/~\[[\d*]+\s.+?\]\~/m + endnote_array << pg.scan(/~\[[\d*]+(.+?)\]\~/m) + end + if pg=~/~\[[\d+]+\s.+?\]\~/m + endnote_array << pg.scan(/~\[[\d+]+(.+?)\]\~/m) + end + endnote_array.flatten.each do |note| + format_scroll=SiSU_HTML_Format_type::Format_scroll.new(@md,note) + @scr_endnotes << format_scroll.endnote_body + end + end + end + @scr_endnotes + end + end + class Toc <Links_guide + @@toc={ :seg=>[],: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 name="h?\d.*?">(.+?)<\/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!(/ <a name="-[\d*+]+" href="#_[\d*+]+"> <sup>[\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] <<<<WOK +<center> +<table><tr><td> +<p><font color="#222222" #{@font.face} size="2"> +(relatively static) RSS feeds for DOCUMENTS:<br /> +<a href="../rssfeed/documents.xml"><img border="0" height="14" width="36" src="../_sisu/image/rss.png" alt="RSS feed"></a> http://www.jus.uio.no/lm/rssfeed/documents.xml<br /> +<a href="../rssfeed/tradelaw.xml"><img border="0" height="14" width="36" src="../_sisu/image/rss.png" alt="RSS feed"></a> http://www.jus.uio.no/lm/rssfeed/tradelaw.xml<br /> +<a href="../rssfeed/environmental.xml"><img border="0" height="14" width="36" src="../_sisu/image/rss.png" alt="RSS feed"></a> http://www.jus.uio.no/lm/rssfeed/environmental.xml<br /> +<center><a href="mailto:info@address.com" target="_top">info@address.com</a></center> +</font></p> +</td></tr></table> +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' + %{<b><a href="#{@md.fnl[:pre]}#{link}#{@md.fnl[:mid]}#{@md.sfx}#{@md.fnl[:post]}">#{linkname}</a></b>} + 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] << '<br />' + link='docinfo' + %{<b><a href="##{link}">#{linkname}</a></b>} + 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}</a>} + 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 name="(\d+)"><\/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}</a>} + 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+(.+?)$/, + %{ <a href="#{@md.fnl[:pre]}\\1#{@md.fnl[:mid]}#{@md.sfx}#{@md.fnl[:post]}" target="_top"> + \\2 + </a> }) + @@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+)(.*)/, + %{<a href="#{@md.fnl[:pre]}\\2#{@md.fnl[:mid]}#{@md.sfx}#{@md.fnl[:post]}" } + + %{target="_top">\\1 \\2 \\3</a> }) + 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}</a>} 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=%{ <a href="#{@md.fnl[:pre]}#{@@seg_url}#{@md.fnl[:mid]}#{@md.sfx}#{@md.fnl[:post]}##{link}"> + #{linkname} + </a>} + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,lnk_n_txt) + toc[:seg]=format_toc.lev5 + title=%{#{p_num.goto}#{linkname}</a>} + 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=%{ <a href="#{@md.fnl[:pre]}#{@@seg_url}#{@md.fnl[:mid]}#{@md.sfx}#{@md.fnl[:post]}##{link}"> + #{linkname} + </a>} + format_toc=SiSU_HTML_Format_type::Format_toc.new(@md,lnk_n_txt) + toc[:seg]=format_toc.lev6 + title=%{#{p_num.goto}#{linkname}</a>} + 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+(.+)/, + %{<table><tr><td width =\"80\"></td> + <td><a href="http://\\1" target="_top"> + #{@png.crosslink_ext} + \\2 + <\/a> + </td></tr></table> +}) + else + para.gsub!(/^4~!\s+(\S+)\s+(.+)/, + %{<table><tr><td width ="80"> + </td><td> + <a href="\\1" target="_top"> + #{@png.crosslink} + \\2 + <\/a> + </td></tr></table> +}) + 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(/(\*+)/,'<sup><a href="#endnotes">\1</a></sup>') + 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(/(\*+)/,%{ <sup><a href="#notes">\\1</a></sup>}) + creator_endnote=%{<sup>©</sup> #{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 ||= %{<p />#{@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 << "</p>\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+|)$/, + %{ <p class="#{ocn_class}"> + \\1 + </p>}) + end + def name + %{<a name="#@paranum" />} + end + def id #w3c? "tidy" complains about numbers as identifiers ! annoying + %{id="o#@paranum"} + end + def goto + %{<a href="##@paranum">} + 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 #{@p_num.id} align="justify">#{@p_num.name} + <font #{@vz.font_size_txt} #{@vz.font_color} #{@vz.font_face}>} + end + def txt_00 + %{ <p #{@p_num.id} align="justify">#{@p_num.name} + <font #{@vz.font_size_txt_00} #{@vz.font_color} #{@vz.font_face}>} + end + def font_citation + %{<font #{@vz.font_size_txt} #{@vz.font_face}>} + end + def endnote + %{ <p #{@p_num.id} align="justify">#{@p_num.name} + <font #{@vz.font_size_endnote} #{@vz.font_color} #{@vz.font_face}>} + end + def table + %{ <p #{@p_num.id} align="left">#{@p_num.name} + <font #{@vz.font_small} #{@vz.font_color} #{@vz.font_face}>} + end + def tiny + %{ <p #{@p_num.id} align="justify">#{@p_num.name} + <font #{@vz.font_tiny} #{@vz.font_color} #{@vz.font_face}>} + end + def small + %{ <p #{@p_num.id} align="justify">#{@p_num.name} + <font #{@vz.font_small} #{@vz.font_color} #{@vz.font_face}>} # keep but not used? + end + def font_tiny + %{<font #{@vz.font_tiny} #{@vz.font_face}>} + end + def font_small + %{<font #{@vz.font_small} #{@vz.font_face}>} + end + def header_ + %{ <p #{@p_num.id} align="center">#{@p_num.name} + <font #@vz.font color="#@color" #{@vz.font_face}>} + 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 + %{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml">\n} + end + def toc_head_escript #embedded script in this case PHP + # %{<p>PHP or other embedded script for object persistence may go HERE</p>} + end + def seg_head_escript #embedded script in this case PHP + # %{<p>PHP or other embedded script for object persistence may go HERE</p>} + end + def table_close + %{ </font> +#{@vz.table_close}} + end + def buttons_home + %{<!- home and index buttons -!> + #{@vz.banner_home_and_index_buttons} +<!- home and index buttons -!>} + end + def copyat + %{#{@vz.paragraph_heading_1_center}copy @ + <a href="#{@vz.url_home}" #{@vz.js_home}> + #{@vz.txt_home} + </a></h1>} + end + end + class Widget < Head_information + def initialize(md) + super(md) + @md=md + @cf_defaults=SiSU_Env::Info_processing_flag.new + end + def home + %{<td align="center" bgcolor=#{@vz.color_band2}> + <a href="../index.html" target="_top"> + #{@vz.png_homepage}</a> +</td> +} + end + def scroll(text) + if @md.fns =~ /\.[_-]?sst$/ + scroll=%{<td align="center" bgcolor=#{@vz.color_band2}> + <a href="#{@md.fn[:doc]}" target="_top" #{@vz.js_doc}> + #{text} + </a> +</td> +} + end + end + def seg(text) + %{<td align="center" bgcolor="#99CC66"> + <a href="#{@md.fn[:toc]}" target="_top" #{@vz.js_doc}> + #{text} + </a> +</td> +} + end + def search + env=SiSU_Env::Info_env.new(@md.fns,@md) + env.widget.search_form + end + def manifest + %{<td align="center" bgcolor=#{@vz.color_band2}> + <a href="#{@md.fn[:manifest]}" target="_top" #{@vz.js_manifest}> + #{@vz.nav_txt_manifest} + </a> +</td>} + end + def pdf + pdf=if @md.programs[:pdf] and @cf_defaults.cf_0 =~/p/ + %{ +<td align="center" bgcolor=#{@vz.color_band2} border="0"> + <a href="#{@md.fn[:pdf_p]}" target="_top" #{@vz.js_portrait}> + #{@vz.nav_txt_pdf_portrait} + </a> +</td> +<td align="center" bgcolor=#{@vz.color_band2} border="0"> + <a href="#{@md.fn[:pdf_l]}" target="_top" #{@vz.js_landscape}> + #{@vz.nav_txt_pdf_landscape} + </a> +</td> +} + else '' + end + end + def odf + odf=if @cf_defaults.cf_0 =~/o/ + %{ +<td align="center" bgcolor=#{@vz.color_band2}> + <a href="#{@md.fn[:odf]}" target="_top" #{@vz.js_odf}> + #{@vz.nav_txt_odf} + </a> +</td>} + else '' + end + end + def concordance(text) + if @md.concord_make or @cf_defaults.cf_0 =~/w/ + %{<td align="center" bgcolor=#{@vz.color_band2} border="0"> + <a href="#{@md.fn[:concordance]}" target="_top" #{@vz.js_concordance}> + #{text} + </a> + </td>} + 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] + <<WOK +<td align="center" width="60%"> + #{make_seg_scroll_pdf} +</td> +WOK + else '' + end + %{<table summary="table of contents scroll navigation band" id="toc" width="100%" bgcolor=#{@vz.color_band1}> +<tr><td width="20%"> + #{@vz.banner_band} +</td>#{pdf} +<td width="20%"> + +#{@vz.table_close} +<p />} + end + def seg_head_navigation_band(type='') + if type=~/pdf/ + @tocband_segtoc=make_scroll_seg_pdf + end + firstseg=%{<a href="#{@md.fnl[:pre]}#{@md.firstseg}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" alt="->"> + #{@vz.png_nav_nxt} + </a>} if @md.firstseg =~/\S+/ + %{<table summary="table of contents segment navigation band" id="toc" width="100%" bgcolor=#{@vz.color_band1}> +<tr><td width="20%"> + #{@vz.banner_band} +</td> +<td width="60%" align="center"> + #@tocband_segtoc +</td> +<td width="20%" align="right"> + #{firstseg} +#{@vz.table_close} +<p />} + end + def manifest_link(text) + %{<font size=2> + <a href="#{@md.fn[:manifest]}" target="_top" #{@vz.js_manifest}>#{text}</a> + </font>} + end + def concordance_link(text) + if @md.concord_make + %{<font size=2> + <a href="#{@md.fn[:concordance]}" target="_top" #{@vz.js_concordance}> + #{text} + </a> + </font>} + else '' + end + end + def make_seg_scroll_pdf + wgt=Widget.new(@md) + scroll=%{<td align="center" bgcolor=#{@vz.color_band2} border="0"> + #{@vz.nav_txt_doc_link} +</td> +} + %{<table summary="toc segment and scroll with pdf" border="0" cellpadding="3" cellspacing="0"> +<tr> + #{scroll} + #{wgt.seg(@vz.nav_txt_toc_link)}#{wgt.pdf}#{wgt.odf} + #{wgt.concordance(@vz.nav_txt_concordance)} + #{wgt.manifest} + #{wgt.search} + #{wgt.home} +</tr></table>} + end + def make_scroll_seg_pdf + manifest=scroll=seg='' + wgt=Widget.new(@md) + seg=%{<td align="center" bgcolor=#{@vz.color_band2}> + #{@vz.nav_txt_toc_link} +</td> +} + %{<table summary="toc scroll and segment with pdf" border="0" cellpadding="3" cellspacing="0"> +<tr> + #{seg} + #{wgt.scroll(@vz.nav_txt_doc_link)}#{wgt.pdf}#{wgt.odf} +<td align="center" bgcolor=#{@vz.color_band2}> + #{wgt.concordance(@vz.nav_txt_concordance)} + #{wgt.manifest} + #{wgt.search} + #{wgt.home} +</tr></table>} + end + def head + %{#{doc_type} +<head> + <title> + #{@md.html_title} + </title> + <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> + #{@rdf.rdftoc} + #{@rdf.metatag_html} + #{@vz.font_css_table_file} +</head> +#{@vz.color_body} + <a name="top" id="top"></a> + <a name="up" id="up"></a> + <a name="start" id="start"></a> + #{@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 + %{<div id="vertical_links"> + <ul id="vertical"> + <li class="refbold"> + <a href="#{url}" #{@vz.js_home}> + #{@vz.txt_hp} + </a> + </li> + <li class="ref"> + Quick Ref.: + </li> + <li class="ref"> + <a href="#{@md.fn[:manifest]}" alt="Document Manifest" target="_top"> + Manifest + </a> + </li> +<!- quick ref -!>} + end + def links_guide_horizontal_open #??? + url=(defined? @vz.url_hp) && @vz.url_hp =~/^http:\/\/\S+$/ ? @vz.url_hp : @vz.url_home + %{<div id="horizontal_links"> + <ul id="horizontal"> + <li class="refbold"> + <a href="#{url}" #{@vz.js_home}> + #{@vz.txt_hp} + </a> + </li> + <li class="ref"> + Quick Ref.: + </li> + <li class="ref"> + <a href="#{@md.fn[:manifest]}" alt="Document Manifest" target="_top"> + Manifest + </a> + </li> +<!- quick ref -!>} + end + def links_guide_open(type='horizontal') + if type=='vertical'; links_guide_vertical_open + else links_guide_horizontal_open + end + end + def links_guide_close #(type='horizontal') + insert='' + insert=@vz.banner_home_guide if @md.sfx_src =~/lm?/ + #insert=@vz.banner_home_guide if @md.sfx_src =~/s?/ + insert=if @md.sfx_src =~/s?/ + link='http://www.jus.uio.no/sisu' #get from defaults + url='www.jus.uio.no/sisu' + name='SiSU electronic documents' #get from defaults + #name='SiSU electronic documents/books' #get from defaults + insert= %{ <li class="refbold"> + <a href="#{link}" alt="#{name}" target="_top"> + #{name} + </a> + </li> + <li class="ref"> + <a href="#{link}" alt="#{name}" target="_top"> + #{url} + </a> + </li> + </ul> +</div>} + end + %{ #{insert} +<!- quick ref -!>} + end + def prefix_a + end + def rights + rights=@md.dc_rights.gsub(/^\s*Copyright\s+/,'<sup>©</sup> ') + %{<p class="left">#{rights}</p> +<p />} + end + def prefix_b + %{<table summary="prefix"> +<tr> +<td width=10%> </td> +<td width=80%> + #{@md.prefix_b} +#{@vz.table_close} +<p />} + end + def scroll_head_title_banner_open + %{<center> +#{@md.icon} +</center> +#{@vz.banner_instrument_cover_band_scr}} + end + def seg_head_title_banner_open + %{<center> + #{@md.icon} +</center> +#{@vz.banner_instrument_cover_band_seg}} + end + def make_scroll + concord=concordance_link(@vz.nav_txt_concordance) + %{<table summary="toc scroll" border="0" cellpadding="3" cellspacing="0"> +<tr><td align="center" bgcolor="white" border="0"> + #{@vz.nav_txt_doc_link} +</td> +<td align="center" bgcolor="white"> + #{concord} +#{@vz.table_close}} + end + def make_seg + concord=concordance_link(@vz.nav_txt_concordance) + %{<table summary="toc segment" border="0" cellpadding="3" cellspacing="0"> +<tr><td align="center" bgcolor="white"> + #{@vz.nav_txt_toc_link} +</td> +<td align="center" bgcolor="white"> + <font size=2> + #{concord} +#{@vz.table_close}} + end + def manifest #check structure + manifest=manifest_link(@vz.nav_txt_manifest) + %{#{@vz.margin_txt_3} + #{@vz.paragraph_font_small} + #{manifest} + </font> +#{@vz.table_close}} + end + def concordance #check structure + concord=concordance_link(@vz.nav_txt_concordance) + %{#{@vz.margin_txt_3} + #{@vz.paragraph_font_small} + #{concord} + </font> +#{@vz.table_close}} + end + def metadata + %{#{@vz.margin_txt_3} +#{@vz.paragraph_font_small} + <a href="#@metalink" #{@vz.js_metalink}> + <i>MetaData</i> + <font size="1" color="#777777"> + + </font> + </a> + </font> +#{@vz.table_close}} + end + def seg_metadata + @metalink=%{./#{@md.fn[:metadata]}} + metadata + end + def seg_tail + %{<p> <p> +<table summary="toc segment tail" bgcolor=#{@vz.color_band1}> +<tr><td width="20%"> + #{@vz.banner_band} +</td> +<td width="60%"> + <center> + #{@tocband_segtoc} + </center> +</td></tr> +</table> +<p> </p> +#{@vz.credits_splash} +<a name="bottom" id="bottom"></a> +<a name="down" id="down"></a> +<a name="end" id="end"></a> +<a name="finish" id="finish"></a> +<a name="stop" id="stop"></a> +<a name="credits"></a>} + end + def scroll_tail + nav=scroll_head_navigation_band + %{#{nav} +#{@vz.credits_splash} +<a name="bottom" id="bottom"></a> +<a name="down" id="down"></a> +<a name="end" id="end"></a> +<a name="finish" id="finish"></a> +<a name="stop" id="stop"></a> +<a name="credits"></a>} + end + def seg_navigation_tail #this is a bug area, look up and "tidy" + #nav=scroll_head_navigation_band + %{<p> </p> +#{@vz.credits_splash} +<a name="bottom" id="bottom"></a> +<a name="down" id="down"></a> +<a name="end" id="end"></a> +<a name="finish" id="finish"></a> +<a name="stop" id="stop"></a> +<a name="credits"></a>} + end + end + def html_close + %{</body> +</html>} + end + class Head_scroll < Head_toc + def initialize(md) + super(md) + end + def toc_owner_details + %{#{@vz.margin_txt_3} +#{@vz.paragraph_font_small} + <a href="#owner.details"> + Owner Details + <font size="1" color="#777777"> + + </font> + </a> + </font> +#{@vz.table_close}} + end + def table + %{<table summary="scroll table" width=#{@vz.table_width_1} border="0" bgcolor="white" cellpadding="0"> +<tr><th width=#{@@indent['level_1']} align="right"> +</th> +<td valign="top"> +#{@vz.paragraph_txt}} + end + def table1 + %{<table summary="scroll table1" width=#{@vz.table_width_1} border="0" cellpadding=#{@vz.table_cellpad_box} #{@vz.color_color_table1} align="justify"> +<tr><td valign="top"> +#{@vz.paragraph_txt}} + end + def table2 + %{<table summary="scroll table2" width=#{@vz.table_width_1} border="0" cellpadding=#{@vz.table_cellpad_box} #{@vz.color_color_table2} align="justify"> +<tr><td valign="top"> +#{@vz.paragraph_txt}} + end + def toc_endnote + %{#{@vz.margin_txt_3} +#{@vz.paragraph_font_small} + <a href="#endnotes"> + Endnotes + </a> +#{@vz.table_close}} + end + def title_endnote + %{#{@vz.margin_txt_0} + #{@vz.paragraph_txt} + <br /> + <a name="endnotes" id="endnotes"></a> + <b>Endnotes</b> +#{@vz.margin_num} + +#{@vz.table_close}} + end + def tail + %{<br /> +#{@vz.margin_txt_0} +<table summary="scroll tail" bgcolor="#777777"> +<tr><td width="20%"> +#{@vz.banner_band} +</td> +<td width="60%"> +<center>#@tocband_scroll</center> +</td></tr> +</table> +<br /> +#{@vz.paragraph_txt} + <center> + #{@vz.credits_splash} + </center> +#{@vz.margin_num} +#{@vz.table_close} +<a name="bottom id="finish"></a> +<a name="down" id="down"></a> +<a name="end" id="end"></a> +<a name="finish" id="finish"></a> +<a name="stop" id="stop"></a> +<a name="credits" id="credits"></a> +<font color="white" size="0"> + #{@md.title*10} +</font> +</body> +</html>} + end + end + class Head_seg < Head_information + def initialize(md) + super(md) + end + def head + %{#{doc_type} +<head> + <title> + #{@seg_name_html[@seg_name_html_tracker]} - + #{@md.html_title} + </title> +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +#{@rdf.rdfseg} +#{@rdf.metatag_html} +#{@vz.font_css_table_file} +</head> +#{@vz.color_body} +<a name="top" id="top"></a> +<a name="up" id="up"></a> +<a name="start" id="start"></a> +#{@vz.js_top}} + end + def title_banner(title,subtitle,creator) + end + def dot_control_pre_next + %{<table summary="segment hidden control pre and next" width="100%" border="0" cellpadding="0" bgcolor=#{@vz.color_grey_pale} align="center"> +<tr><td align="left"> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker-1]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_prev}> + #{@vz.png_nav_dot_pre} + </a> +</td> +<td align="center"> + <a href="#{@md.fnl[:pre]}#@index#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_toc}> + #{@vz.png_nav_dot_toc} + </a> +</td> +<td align="right"> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker+1]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_next}> + #{@vz.png_nav_dot_nxt} + </a> +#{@vz.table_close}} + end + def dot_control_pre + %{<table summary="segment hidden control pre" width="100%" border="0" cellpadding="0" bgcolor=#{@vz.color_grey_pale} align="center"> +<tr><td align="left"> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker-2]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_prev}> + #{@vz.png_nav_dot_pre} + </a> +</td> +<td align="center"> + <a href="#{@md.fnl[:pre]}#@index#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_toc}> + #{@vz.png_nav_dot_toc} + </a> +</td> +<td align="right"> + <a href="#{@md.fn[:toc]}" target="_top" #{@vz.js_next}> + #{@vz.png_nav_dot_nxt} + </a> +#{@vz.table_close}} + end + def toc_nav(f_pre=false,f_nxt=false,use=1) + pre=nxt='' + toc=%{<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#@index#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_toc}> + #{@vz.png_nav_toc} + </a> +</td>} + pre=%{<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker-use]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_prev}> + #{@vz.png_nav_pre} + </a> +</td>} if f_pre==true + nxt=%{<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker+1]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_next}> + #{@vz.png_nav_nxt} + </a> +</td>} if f_nxt==true + %{<table summary="segment navigation pre/next" border="0" cellpadding="3" cellspacing="0"> +<tr> +#{pre} +#{toc} +#{nxt} +<td> +#{@vz.table_close}} + end + def toc_next2 + pre,nxt=false,true + toc_nav(false,true).dup + end + def toc_pre_next2 + toc_nav(true,true).dup + end + def toc_pre2 + toc_nav(true,false,2).dup + end + def manifest_link(text) + %{<font size=2> + <a href="#{@md.fn[:manifest]}" target="_top" #{@vz.js_manifest}> + #{text} + </a> + </font>} + end + def concordance_link(text) + if @md.concord_make + %{<font size=2> + <a href="#{@md.fn[:concordance]}" target="_top" #{@vz.js_concordance}> + #{text} + </a> + </font>} + else '' + end + end + def doc_types #used in seg_nav_band ### + scroll=seg='' + wgt=Widget.new(@md) + #dir=SiSU_Env::Info_env.new(@md.fns) + %{ +<table summary="segment navigation available documents types: toc,doc,pdf,concordance" border="0" cellpadding="3" cellspacing="0"> +<tr> + #{wgt.seg(@vz.nav_txt_toc_link)} + #{wgt.scroll(@vz.nav_txt_doc_link)} + #{wgt.pdf}#{wgt.odf} +<td align="center" bgcolor=#{@vz.color_band2}> + #{wgt.concordance(@vz.nav_txt_concordance)} + #{wgt.manifest} + #{wgt.search} + #{wgt.home} +</tr></table>} + end + def toc_pre_next3 #used with seg_doc_types in seg_nav_band #with pdf & other doc types #knxjs + %{<table summary="segment navigation pre/next" border="0" cellpadding="3" cellspacing="0"> +<tr><td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker-1]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_prev}> + #{@vz.png_nav_previous} + </a> +</td> +<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#@index#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_toc}> + #{@vz.png_nav_toc} + </a> +</td> +<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker+1]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_next}> + #{@vz.png_nav_next} + </a> +#{@vz.table_close}} + end + def toc_next3 #used with seg_doc_types in seg_nav_band #with pdf & other doc types #knxjs + %{<table summary="segment navigation next" border="0" cellpadding="3" cellspacing="0"> +<tr> +<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#@index#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_toc}> + #{@vz.png_nav_toc} + </a> +</td> +<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker+1]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_next}> + #{@vz.png_nav_next} + </a> +#{@vz.table_close}} + end + def toc_pre3 #used with seg_doc_types in seg_nav_band #with pdf and other doc types #knxjs + # note endnotes is now two back, with insertion between end of text and metadata, but what happens where no endnote? + %{<table summary="segment navigation pre" border="0" cellpadding="3" cellspacing="0"> +<tr><td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#{@seg_name_html[@seg_name_html_tracker-2]}#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_prev}> + #{@vz.png_nav_previous} + </a></td> +<td align="center" bgcolor=#{@vz.color_band1}> + <a href="#{@md.fnl[:pre]}#@index#{@md.fnl[:mid]}#@sfx#{@md.fnl[:post]}" target="_top" #{@vz.js_toc}> + #{@vz.png_nav_toc} + </a> +#{@vz.table_close}} + end + def toc_endnote + end + def title_endnote(title,subtitle,creator,table_top_control) + %{#{@vz.banner_instrument_cover_band_seg} + <h1 class="banner"> + #{title} + </h1> + <h1 class="subbanner"> + #{subtitle} + </h1> + <h1 class="subbanner"> + #{creator} + </h1> + <h4 class="banner"> + Endnotes + </h4> +#{@vz.table_close} +#{table_top_control} +<h1>Endnotes</h1>} + end + def navigation_table + %{<table summary="navigation segment table" width=#{@vz.table_width_1} border="0" bgcolor="white" cellpadding="0"> +<tr><th width="#{@@indent['leve_1']}" align="right"> +</td> +<td valign="top"> + <font size=2>} + end + def navigation_table1 + %{<table summary="navigation segment table1" width=#{@vz.table_width_1} border="0" cellpadding=#{@vz.table_cellpad_box} bgcolor=#{@vz.color_table1} align="left"> +<tr><td valign="top"> + <font size="2">} + end + def navigation_table2 + %{<table summary="navigation segment table2" width=#{@vz.table_width_2} border="0" cellpadding=#{@vz.table_cellpad_box} bgcolor=#{@vz.color_table2} align="left"> +<tr><td valign="top"> + <font size="2">} + end + def header_advert_local_1 + dir=SiSU_Env::Info_env.new(@fns) + %{ <center> +<table summary="image" border="0" cellpadding="3" cellspacing="0" align="center"> +<tr><td align="center" bgcolor="white"> + <a href="http://#{@md.ad_url}#@sfx" target="_top"> + <img border="0" src="#{dir.url.images_local}/#{@md.ad_png}" alt="#{@md.ad_alt}"> + </a> + <p /> +#{@vz.table_close} +</center>} + end + def header_advert_local_2 + dir=SiSU_Env::Info_env.new(@fns) + %{ <center> +<table summary="image" border="0" cellpadding="3" cellspacing="0" align="center"> +<tr><td align="center" bgcolor="white"> + <a href="#{@md.ad_url}#@sfx" target="_top"> + <img border="0" src="#{dir.url.images_local}/#{@md.ad_png}" alt="#{@md.ad_alt}"> + </a> + <p /> +#{@vz.table_close} +</center>} + end + def header_advert_external + dir=SiSU_Env::Info_env.new(@fns) + %{ <center> +<table summary="image" border="0" cellpadding="3" cellspacing="0" align="center"> +<tr><td align="center" bgcolor="white"> + <a href="#{@md.ad_url}#@sfx" target="external"> + <img border="0" src="#{dir.url.images_local}/#{@md.ad_png}" alt="#{@md.ad_alt}"> + </a> + <p /> +#{@vz.table_close} +</center>} + end + def credit + %{<br/> +#{@vz.credits_splash} +<a name="bottom" id="bottom"></a> +<a name="down" id="down"></a> +<a name="end" id="end"></a> +<a name="finish" id="finish"></a> +<a name="stop" id="stop"></a> +<a name="credits" id="credits"></a>} + end + def navigation_band(segtocband,seg_table_top_control) + %{<table summary="segment navigation band" bgcolor=#{@vz.color_band1} width="100%"><tr> +<td width="20%" align="left"> +#{@vz.banner_band} +</td> +<td width="60%" align="center"> + #{doc_types} +</td> +<td width="20%" align="right"> + #{segtocband} +</td></tr> +</table> +#{seg_table_top_control}} + end + def endnote_mark +%{<p class="center" id="endnotes"> +<a href="#top">^</a></p>} + end + end + class Format_text_object + @vz=SiSU_Env::Get_init.instance.skin + @@dp=nil + attr_accessor :md,:one,:two,:three,:parablock,:table,:link,:linkname,:format,:paranum,:p_num,:para_id,:headname,:margin,:paragraph,:table,:banner,:url,:icon,:font,:one_stripped + def initialize(md='',*txt) + #txt[0].gsub!(/\.(html|pdf|php)/,'') if txt[0] =~/\.\.\/\S+/ + @md,@one,@two,@three=md,txt[0],txt[1],txt[2] + rgx=/^[1-6-]~/ + @one_stripped=@one.gsub(rgx,'') if @one =~rgx + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + rgx=/~[{\[][\d*+]+\s+(.+?)<#@dp>[}\]]~/ #problem introduced + @one_stripped=@one.gsub(rgx,'\1') if @one =~rgx #problem introduced + @link,@linkname=txt[0],txt[1] + @format,parablock=txt[0],txt[1] + @parablock=parablock + ##speed hit does not justify action: + #@parablock=if parablock=~/\S+/ and parablock !~/<!Th?¡ /m + # wrap=SiSU_text_utils::Wrap.new(parablock,70,4) + # wrap.line_wrap + #else parablock + #end + if txt[2]=~/\d+/ + @paranum=txt[2][/(\d+)/m,1] # unless paranum =~/#/ + @p_num=SiSU_HTML_Format::Paragraph_number.new(@md,@paranum) + @para_id=Paragraph_id_ocn.new(@md,@paranum) #used by table version + end + @headname='' + if @format =~ /\d~(\S+)/ + headname=$1 #format[/\d~(\S+)/m,1] + @headname=if headname =~/^[a-zA-Z]/; %{<a name="#{headname}" id="#{headname}"></a>} #consider: h_#{headname} + else %{<a name="h#{headname}" id="h#{headname}"></a>} + end + end + @vz=SiSU_Env::Get_init.instance.skin + end + def para_form # regular paragraphs shaped here + ul=ulc='' + ul,ulc="<ul>\n ","\n </ul>" if @tag =~/li/ + %{#{@vz.margin_css} + #{ul}<#@tag class="#@class" #{@p_num.id}>#{@p_num.name} + #@parablock + </#@tag>#{ulc} +#{@vz.margin_num_css} + #{@p_num.ocn_display} +#{@vz.table_close} +} + end + def para + @tag,@class='p','norm' + para_form + end + def code + @tag,@class='p','code' + para_form + end + def center + @tag,@class='p','center' + para_form + end + def bold + @tag,@class='p','bold' + para_form + end + def bullet + @tag,@class='li','bullet' + para_form + end + def bullet_indent1 + @tag,@class='li','i1' + para_form + end + def bullet_indent2 + @tag,@class='li','i2' + para_form + end + def indent1 + @tag,@class='p','i1' + para_form + end + def indent2 + @tag,@class='p','i2' + para_form + end + def dl + "<dl><b>#@one</b> #@two</dl>" + end + def table_end #<!TZ!> + %{</table> + #{@vz.margin_num_css.strip} + #{@p_num.ocn_display} + #{@vz.table_close}} + end + def no_paranum + %{#{@vz.margin_css} +#{@vz.paragraph_txt} + #@one #@two +#{@vz.margin_num} +#{@vz.table_close}} + end + def gsub_body + case @one + when /^(?:<:i[12]>\s*)?\((i+|iv|v|vi+|ix|x|xi+)\)/ + @one.gsub!(/^\((i+|iv|v|vi+|ix|x|xi+)\)/,'<b>(\1)</b>') + @one.gsub!(/^(<:i[12]>)\s*\((i+|iv|v|vi+|ix|x|xi+)\)/,'\1<b>(\2)</b>') + when /^(?:<:i[12]>\s*)?\(?(\d|[a-z])+\)/ + @one.gsub!(/^\((\d+|[a-z])+\)/,'<b>(\1)</b>') + @one.gsub!(/^(<:i[12]>)\s*\((\d+|[a-z])+\)/,'\1<b>(\2)</b>') + when /^\s*\d{1,3}\.\s/ + @one.gsub!(/^\s*(\d+\.)/,'<b>\1</b>') + when /^\s*[A-Z]\.\s/ + @one.gsub!(/^\s*([A-Z]\.)/,'<b>\1</b>') + end + end + def bold_para + %{#{@vz.margin_txt_0} + <p class="bold"> + #@one + </p> +#{@vz.margin_num_css} + +#{@vz.table_close}} + end + def toc_head_copy_at + %{<p class="center">#@one</p>\n} + end + def center + %{<p class="center">#@one</p>\n} + end + def bold + %{<p class="bold">#@one</p>\n} + end + def center_bold + %{<p class="centerbold">#@one</p>\n} + end + end + class XML + end +end +__END__ diff --git a/lib/sisu/0.52/html_format_css.rb b/lib/sisu/0.52/html_format_css.rb new file mode 100644 index 00000000..4e519a41 --- /dev/null +++ b/lib/sisu/0.52/html_format_css.rb @@ -0,0 +1,473 @@ +=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 formating, css template + + * 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_type + require SiSU_lib + '/html_format' + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + include SiSU_HTML_Format + class Head_toc < SiSU_HTML_Format::Head_toc + def initialize(md='') + super(md) + end + def head + %{#{doc_type} +<head> + <title> + #{@md.html_title} + </title> +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +#{@rdf.rdftoc} +#{@rdf.metatag_html} +#{@css.html} +</head> +#{@vz.color_body} +<a name="top" id="top"></a> +<a name="up" id="up"></a> +<a name="start" id="start"></a> +#{@vz.js_top}} + end + def concordance + if @md.concord_make + %{#{@vz.margin_css} + <h4 class="toc"> + <a href="./#{@md.fn[:concordance]}" #{@vz.js_concordance}> + <i>Concordance</i> + </a> + </h4> +#{@vz.table_close}} + else + %{#{@vz.margin_css} +#{@vz.table_close}} + end + end + def metadata + %{#{@vz.margin_css} + <h4 class="toc"> + <a href="#@metalink" #{@vz.js_metalink}> + <i>MetaData</i> + </a> + </h4> +#{@vz.table_close}} + end + end + class Head_seg < SiSU_HTML_Format::Head_seg + def initialize(md='') + super(md) + end + def head + %{#{doc_type} +<head> + <title> + #{@seg_name_html[@seg_name_html_tracker]} - + #{@md.html_title} + </title> +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +#{@rdf.rdfseg} +#{@rdf.metatag_html} +#{@css.html} +</head> +#{@vz.color_body} +<a name="top" id="top"></a> +<a name="up" id="up"></a> +<a name="start" id="start"></a> +#{@vz.js_top}} + end + def toc_metadata + @metalink=%{./#{@md.fn[:meatadata]}} + toc_metadata + end + def title_banner(title,subtitle,creator) + %{<p class="tiny"> + #{title} + </p> + <p class="tiny"> + #{subtitle} + </p> + <p class="tiny"> + #{creator} + </p> + <p class="tiny"> + copy @ + <a href="#{@vz.url_home}"> + #{@vz.txt_home} + </a> + </p>} + end + end + class Head_scroll < SiSU_HTML_Format::Head_scroll + def initialize(md='') + super(md) + end + def toc_endnote + %{#{@vz.margin_css} + <h4 class="toc"> + <a href="#endnotes"> + Endnotes + </a> + </h4> +#{@vz.table_close}} + end + end + class Format_scroll < SiSU_HTML_Format::Format_text_object + def initialize(md='',*txt) + super(md,*txt) + @vz=SiSU_Env::Get_init.instance.skin + end + def indent_one_no_paranum + %{#{@vz.margin_txt_1} +#{@paragraph.txt} + #@one +#{@vz.margin_num} +#{@vz.table_close}} + end + def indent_two_no_paranum + %{#{@vz.margin_txt_1} +#{@paragraph.txt} + #@one +#{@vz.margin_num} +#{@vz.table_close}} + end + def endnote_body + %{#{@vz.margin_css} + <p class="endnote"> + #@one + </p> +#{@vz.margin_num_css} + +#{@vz.table_close}} + end + def header_normal + %{#{@vz.margin_css} + <#@tag class="#@class" #{@p_num.id}>#{@p_num.name} + #@headname + #@parablock + </#@tag> +#{@vz.margin_num_css} + #{@p_num.ocn_display} +#{@vz.table_close}} + end + def heading_body + @tag,@class='p','norm' + header_normal + end + def heading_body1 + @tag,@class='h1','norm' + header_normal + end + def heading_body2 + @tag,@class='h2','norm' + header_normal + end + def heading_body3 + @tag,@class='h3','norm' + header_normal + end + def heading_body4 + @tag,@class='h4','norm' + header_normal + end + def heading_body5 + @tag,@class='h5','norm' + header_normal + end + def heading_body6 + @tag,@class='h6','norm' + header_normal + end + end + class Format_seg < SiSU_HTML_Format::Format_text_object + def initialize(md='',*txt) + super(md,*txt) + end + def navigation_para + %{#{@vz.margin_css} +#{@paragraph.txt} + #@one +</p> +#{@vz.table_close}} + end + def navigation_toc_lev1_advert + %{#{@banner.home_button}\n +<center> +#@one +#@two +</a></center><p />} + end + def navigation_toc_lev1 + %{#{@banner.nav_toc}} + end + def navigation_toc_lev2 #change bold use css + %{<p /> +<table summary="navigation segment level 2"> +<tr><td width ="20"> +</td> +<td> + <font size="3" #{@vz.font_face}> + <b>#@one</b> + </font> + </p> +#{@vz.table_close}} + end + def navigation_toc_lev3 #change bold use css + %{<p /> +<table summary="navigation segment level 3"> +<tr><td width ="20"> +</td> +<td> + <font size="3" #{@vz.font_face}> + <b>#@one</b> + </font> + </p> +#{@vz.table_close}} + end + def navigation_toc_lev4 + %{<table summary="navigation segment level 4"> +<tr><td width ="80"> +</td> +<td> +<p> + #@one +</p> +#{@vz.table_close}} + end + def navigation_toc_lev5 + end + def navigation_toc_lev6 + end + def endnote_body_seg_tail + %{#{@vz.margin_css} + <p class="endnote"> + #@one + </p> +#{@vz.margin_num_css} +#{@vz.table_close}} + end + def endnote_body_seg_tail_indent + %{#{@vz.margin_css} + <p class="endnote_indent"> + #@one + </p> +#{@vz.margin_num_css} +#{@vz.table_close}} + end + def endnote_seg_body(fn='') #url construction keep within single line... BUG WATCH 200408 + fn='doc' if fn.empty? #you may wish to reconsider, sends to 'doc' where no segment info + %{#{@vz.margin_css} + <p class="endnote"> + #@one#{@md.fnl[:pre]}#{fn}#{@md.fnl[:mid]}#{@md.sfx}#{@md.fnl[:post]}#@two#@three + </p> +#{@vz.margin_num_css} +#{@vz.table_close}} + end + def title_header + %{#{@vz.margin_css} + <#@tag class="#@class"> + #@one + </#@tag> +#{@vz.margin_num_css} +#@two +#{@vz.table_close}} + end + def title_header1 + @tag,@class='h1','banner' + title_header + end + def title_header2 + @tag,@class='h2','banner' + title_header + end + def title_header3 + @tag,@class='h3','banner' + title_header + end + def title_header4 + %{#{@vz.margin_css} + <h4 class="banner"> + #@one + </h4> +#{@vz.margin_num_css} +#{@vz.table_close}} + end + def subtoc_lev + one=if @one and @one =~/<\/?i>|<a\s+name="\S+?">/mi + @one.gsub(/<\/?i>|<a\s+name="\S+?">/mi,'') #removes name markers from subtoc, go directly to substantive text + else @one + end + note='' + if one =~/(~[{\[].+?[}\]]~\s*)/m #this is a clumsy fix, revisit and address upstream + note=$1 + note.gsub!(/[\n\s]+/m,' ') + one.gsub!(/~[{\[].+?[}\]]~\s*/m,' ') + one.gsub!(/<a[\n\s]+name="-\d+"[\n\s]+href="#_\d+"> <sup>\d+<\/sup> /m,'') + end + %{<#@tag class="#@class"> + <a href="##@two"> + <i>#{one}</i> + </a> #{note} + </#@tag>} + end + def subtoc_lev5 + @tag,@class='h5','subtoc' + subtoc_lev if @one + end + def subtoc_lev6 + @tag,@class='h6','subtoc' + subtoc_lev if @one + end + #% para sisu + def header4 + %{#@format +#{@vz.margin_css} + <h1 class="norm" #{@p_num.id}>#{@p_num.name} + #@format + #@parablock + </h1> +#{@vz.margin_num_css} +#{@p_num.ocn_display} +#{@vz.table_close}} + end + def header_sub + @parablock.gsub!(/~[{\[].+?[}\]]~\s*/m,' ') + %{#{@vz.margin_css} +#{@headname} + <#@tag class="#@class" #{@p_num.id}>#{@p_num.name} + #{@parablock} + </#@tag> +#{@vz.margin_num_css} +#{@p_num.ocn_display} +#{@vz.table_close}} + end + def header5 + @tag,@class='p','bold' + header_sub + end + def header6 + @tag,@class='p','bold' + header_sub + end + def navigation_header4 + %{<table summary="navigation segment header 4" width=100% bgcolor="#08163f" border="0"> +<tr><td align="center"> +<p class="bold"> + #@parablock +</p> +#{@vz.table_close}} + end + def navigation_header5 + %{<p class="bold"> + #@parablock +</p>} + end + def navigation_header6 + %{<p class="bold"> + #@parablock +</p>} + end + def navigation_indent1 + %{#{@vz.margin_txt_00_1} +#{@paragraph.txt_00} + #@parablock + </font> + </p> +#{@vz.margin_num_css} +#{@vz.table_close}} + end + def navigation_indent2 + end + def navigation_center + "<center>#@parablock</center>" + end + end + class Format_toc < SiSU_HTML_Format::Format_text_object + def initialize(md='',*txt) + super(md,*txt) + end + def links_guide + #@three distinguishes between _top and external, can be used e.g. for different colour scheme + %{ <li class="doc"> + <a href="#@link" target="_top"> + #@linkname + </a> + </li> +} + end + def lev + %{<#@tag class="#@class"> + #@one + </#@tag> +} + end + def lev1 + @tag,@class='h1','toc' + lev + end + def lev2 + @tag,@class='h2','toc' + lev + end + def lev3 + @tag,@class='h3','toc' + lev + end + def lev4 + @tag,@class='h4','toc' + lev + end + def lev5 + @tag,@class='h5','toc' + lev + end + def lev6 + @tag,@class='h6','toc' + lev + end + end +end +__END__ diff --git a/lib/sisu/0.52/html_promo.rb b/lib/sisu/0.52/html_promo.rb new file mode 100644 index 00000000..b41b1ffa --- /dev/null +++ b/lib/sisu/0.52/html_promo.rb @@ -0,0 +1,382 @@ +=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 advertising component, build here, mockup + + * 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_promo + require SiSU_lib + '/sysenv' + include SiSU_Env + class Ad + def initialize(md) + @md=md + @env=SiSU_Env::Info_env.new(@md.fns,@md) + @rc=SiSU_Env::Get_init.instance.yamlrc + @ad=SiSU_Env::Get_init.instance.ads + @vz=SiSU_Env::Get_init.instance.skin + @flag=@env.widget.promo? + end + def div + def major + @flag[:ad] ? '<div id="pane_major">' : '' + end + def minor + @flag[:ad] ? '<div id="pane_minor">' : '' + end + def close + @flag[:ad] ? '</div>' : '' + end + self + end + def display #(type=nil,id=nil) + ads_array,promo_array=[],[] + if @flag[:ad] + ads=if @md.promo && @md.promo.length > 0 #promo set in document + promo_array=@md.promo + elsif @flag[:sk] #promo set in associated skin + promo_array=@vz.widget_promo + elsif @flag[:rc] #promo set in rc file + promo_array=if @rc['promo'].class == String + @rc['promo'].split(/[,;]\s*/) + else @rc['promo'] + end + else advert_extract_all + end + ads=if promo_array.length > 0 + promo_array.each do |x| + ads_array << advert_extract_subject(x) + end + ads_array + end + adverts(ads) + #else no_adverts + end + end + def cell(prod,id) + @prod,@id=prod,id + def title + @prod['title'] ? %{<b>#{@prod['title']}</b>} : '' + end + def subtitle + @prod['subtitle'] ? %{ - #{@prod['subtitle']}} : '' + end + def author + @prod['author'] ? %{<p class="pane">#{@prod['author']}</p>} : '' + end + def editor + @prod['editor'] ? %{<p class="pane">#{@prod['editor']}</p>} : '' + end + def year + @prod['year'] ? %{<p class="pane">#{@prod['year']}</p>} : '' + end + def date + @prod['date'] ? %{<p class="pane">On: #{@prod['date']}</p>} : '' + end + def location + @prod['at'] ? %{<p class="pane">At: #{@prod['at']}</p>} : '' + end + def pages + @prod['pages'] ? %{<p class="pane">Pages: #{@prod['pages']} pages</p>} : '' + end + def form + @prod['form'] ? %{<p class="pane">#{@prod['form']}</p>} : '' + end + def nick + @prod['nick'] ? %{(#{@prod['nick']})<br />} : '' + end + def update + @prod['update'] ? %{<p class="pane">Updated: #{@prod['update']}</p>} : '' + end + def issn + @prod['issn'] ? %{<p class="pane">issn: #{@prod['issn']}</p>} : '' + end + def blurb + @prod['blurb'] ? %{<p class="pane_blurb">#{@prod['blurb']}</p>} : '' + end + def search_form + db=if @prod['db']=~/\S+/ + @prod['db']=~/^SiSU_\S+/ ? @prod['db'] : "SiSU_#{@prod['db']}" + elsif defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + @rc['search']['db']=~/^SiSU_\S+/ ? @prod['search']['db'] : "SiSU_#{@prod['db']}" + else nil + end + #target=@prod['target']=~/^\S+/ ? @prod['target'] : '_top' + action=if @prod['action']=~/^http:\/\// + @prod['action'] + elsif defined? @rc['search']['action'] and @rc['search']['action'] =~/^http:\/\// + @rc['search']['action'] + else nil + end + form=if action and db + '<br />' + @env.widget.search_form(action,db) + else '' + end + end + def links + if @prod['links'] #and @prod['links'] == Array + links_a=[] + @prod['links'].each do |x| + if x and x['url'] and x['title'] + subtitle=x['subtitle'] ? %{ - #{x['subtitle']}} : '' + url_=x['url'] =~/http:/ ? x['url'] : "../#{x['url']}" + #url_=x['url'] =~/http:/ ? x['url'] : "#{@env.url.root}/#{x['url']}" + links_a << %{<p class="pane_link"><a href="#{url_}">#{x['title']}#{subtitle}</a></p>\n} + end + end + links_a.to_s + else '' + end + end + def image + @prod['image'] ? %{<img border="0" src="../_sisu/image_local/#{@prod['image']}" /><br />} : '' + end + def url_link + @url_=if @prod['url'] =~/http:/ + "#{@prod['url']}" + else "../#{@prod['url']}" # "#{@env.url.root}/#{@prod['url']}" + end + def show + @prod['url'] ? %{<p class="pane_link"><a href="#@url_">#@url_</a></p>} : '' + end + def url + @prod['url'] ? %{<a href="#@url_">} : '' + end + def url_relative + @prod['url'] ? %{<a href="../#{@prod['url']}/toc.html">} : '' + end + self + end + def flyer + if @prod['flyer'] + %{<p class="pane"><a href="../man/pdf/#@id.pdf"><img border="0" height="18" width="15" src="../_sisu/image/b_pdf.png"> PDF flyer</a></p>} + else '' + end + end + def price + def gbp + if defined? @prod['price']['gbp'] and @prod['price']['gbp'] + " £ #{@prod['price']['gbp']} (GBP) " + else '' + end + end + def euro + if defined? @prod['price']['euro'] and @prod['price']['euro'] + " € #{@prod['price']['euro']} (Euro) " + else '' + end + end + def usd + if defined? @prod['price']['usd'] and @prod['price']['usd'] + " $ #{@prod['price']['usd']} (USD) " + else '' + end + end + %{<p class="pane">Price:#{gbp}#{euro}#{usd}</p>} + end + def site_link #Work area + if url_link.url + <<WOK +<p class="pane"> +#{url_link.url} +#{image} +#{title} +#{subtitle} +</a>#{nick}</p> +WOK + else + <<WOK +<p class="pane"> +#{image} +#{title} +#{subtitle} +</p> +WOK + end + end + self + end + def output_form_sponsor(type,id) + cell=cell(@ad[:promo][type][id],prod_id) + prod_type=id=~/id_(?:[0-9x]){10,13}/i ? 'isbn' : 'id' + id_detail = %{<p class="pane">#{prod_type}: #{prod_id}</p>} + <<WOK +<br /> +#{cell.site_link} +#{cell.blurb} +#{cell.links} +WOK + end + def output_form_link(type,id) + prod_id=id.gsub(/id_/,'') + cell=cell(@ad[:promo][type][id],prod_id) + <<WOK +<br /> +#{cell.site_link} +#{cell.author} +#{cell.year} +#{cell.blurb} +#{cell.links} +WOK + end + def output_form_search(type,id) + prod_id=id.gsub(/id_/,'') + cell=cell(@ad[:promo][type][id],prod_id) + cell.search_form + end + def output_form_book(type,id) + prod_id=id.gsub(/id_/,'') + cell=cell(@ad[:promo][type][id],prod_id) + prod_type=id=~/id_(?:[0-9x]){10,13}/i ? 'isbn' : 'id' + id_detail = %{<p class="pane">#{prod_type}: #{prod_id}</p>} + <<WOK +<br /> +#{cell.site_link} +#{cell.author} +#{cell.year} +#{id_detail} +#{cell.pages}#{cell.form} +#{cell.price} +#{cell.flyer} +#{cell.blurb} +#{cell.links} +WOK + end + def output_form_journal(type,id) + prod_id=id.gsub(/id_/,'') + cell=cell(@ad[:promo][type][id],prod_id) + <<WOK +<br /> +#{cell.site_link} +#{cell.editor} +#{cell.issn} +#{cell.update} +#{cell.form} +#{cell.price.gsub(/Price:/,'Subscription:')} +#{cell.flyer} +#{cell.blurb} +#{cell.links} +WOK + end + def output_form_conference(type,id) + prod_id=id.gsub(/id_/,'') + cell=cell(@ad[:promo][type][id],prod_id) +#translate date (dd month yyyy) from 2007-03-04 and ruby conversion + <<WOK +<br /> +#{cell.site_link} +#{cell.date} +#{cell.location} +#{cell.price} +#{cell.flyer} +#{cell.blurb} +#{cell.links} +WOK + end + def output_form_select(type,id) + case type + when /site/ + output_form_link(type,id) + when /sponsor/ + output_form_sponsor(type,id) + when /search/ + output_form_search(type,id) + when /book/ + output_form_book(type,id) + when /journal/ + output_form_journal(type,id) + when /conference/ + output_form_conference(type,id) + end + end + def advert_extract_single(type,id) #extracts single item of type with id + #type === book,journal,conference,sponsor + id=id.to_s.gsub(/^(\d)/,'id_\1') + if defined? @ad[:promo][type][id] and @ad[:promo][type][id] + output_form_select(type,id) + end + end + def advert_extract_subject(category) #extracts products from category/subject list + adverts=[] + if defined? @ad[:promo_list][category] and @ad[:promo_list][category] + @ad[:promo_list][category].keys.each do |type| + @ad[:promo_list][category][type].each do |i| + if i + id=i.to_s =~/^\d/ ? "id_#{i.to_s.strip}" : i.to_s.strip + gbp=usd=euro=nil + if defined? @ad[:promo][type][id] and not @ad[:promo][type][id].nil? + adverts << output_form_select(type,id) + end + end + end + end + else + tell=SiSU_Screen::Ansi.new(@md.cmd,"category not found: #{category}") + tell.warn unless @md.cmd =~/q/ + end + adverts.to_s + end + def advert_extract_all #extracts all products from list (which is broken down into categories) + adverts=[] + @ad[:promo_list].keys.each do |category| + adverts << advert_extract_subject(category) + end + adverts.flatten + end + def adverts(ads) + <<WOK +#{div.minor} +#{ads} +#{div.close} +WOK + end + def no_adverts + <<WOK +#{div.minor} +#{div.close} +WOK + end + end +end +__END__ diff --git a/lib/sisu/0.52/html_scroll.rb b/lib/sisu/0.52/html_scroll.rb new file mode 100644 index 00000000..51a7a6c8 --- /dev/null +++ b/lib/sisu/0.52/html_scroll.rb @@ -0,0 +1,231 @@ +=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 scroll 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_scroll + require SiSU_lib + '/shared_html' + require SiSU_lib + '/html' + require SiSU_lib + '/html_promo' + class Scroll + @@dp=nil + def initialize(data='',md='') + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def songsheet + begin + scr=Scroll.new(@data,@md).markup + scr[:tails]=Scroll.new('',@md).tails + scr + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + end + end + protected + def markup + data=@data + @rcdc=false + @scr={ :body=>[],:metadata=>[],:owner_details=>[] } + data.each do |para| + if para =~/Document Information/ + para.gsub!(/(Document Information)/,'\1<a name="docinfo"></a>') + end + if para =~/MetaData/ + para.gsub!(/(MetaData)/,'\1<a name="metadata"></a>') + end + @rcdc=true if @rcdc==false and (para =~/^\d~metadata/ or para =~/^1~\s+Document Information/) + if para !~/(^0~|<ENDNOTES>|<EOF>)/ + para.gsub!(/~[{\[].+?[}\]]~\s+/m,' ') + if para =~/.+?<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + paranum=para[/.+?<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/,1] + @p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,paranum) + end + @sto=SiSU_HTML::Source::Split_text_object.new(@md,para).lev_segname_para_ocn + unless @rcdc + m=/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if para =~m + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,@sto.text) if @sto.format =~/[12]|_1?\*|<!i[12]!>\s*_\*|null/ + case @sto.format + when /^1~\S*/; para=@sto.scroll_lev_para_ocn.heading_body1 + when /^2~\S*/; para=@sto.scroll_lev_para_ocn.heading_body2 + when /^3~\S*/; para=@sto.scroll_lev_para_ocn.heading_body3 + when /^4~\S+/; para=@sto.scroll_lev_para_ocn.heading_body4 # work on see Split_text_object4 + when /^5~\S*/; para=@sto.scroll_lev_para_ocn.heading_body5 + when /^6~\S*/; para=@sto.scroll_lev_para_ocn.heading_body6 + when /^_\*$/; para=@sto.scroll_lev_para_ocn.bullet + when /^_1\*$/ + format_txt_obj.gsub_body + para=@sto.scroll_lev_para_ocn.bullet_indent1 + when /^_2\*$/ + format_txt_obj.gsub_body + para=@sto.scroll_lev_para_ocn.bullet_indent2 + when /^i1$/ + format_txt_obj.gsub_body + para=@sto.scroll_lev_para_ocn.indent1 + when /^i2$/ + format_txt_obj.gsub_body + para=@sto.scroll_lev_para_ocn.indent2 + when /^center$/; para=@sto.scroll_lev_para_ocn.center + when /^(?:b|bold)$/; para=@sto.scroll_lev_para_ocn.bold + when /^(?:verse|group|alt)$/; para=@sto.scroll_lev_para_ocn.para + when /^code$/; para=@sto.scroll_lev_para_ocn.code + when /null/ # see whether u can improve + if para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + format_txt_obj.gsub_body + para=@sto.scroll_lev_para_ocn.para + if para =~/<!Th?.+/ # tables come as single block + table=SiSU_HTML_shared::Table.new(para) + para=table.table_split + end + end + end + elsif para =~/Endnotes?/ and para !~/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,'<br /><a name="notes">Note</a>') + para=format_txt_obj.bold_para + elsif para =~/Owner Details/ and para !~/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,'<br /><a name="owner.details">Owner Details</a>') + @scr[:owner_details]=format_txt_obj.bold_para + para='' + elsif para =~/(.*)<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>(.*)/ #watch + one,two=$1,$2 + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,one,two) + para=format_seg.no_paranum + end + #para=para.gsub(/ [2-6]~\S+ /,'') #and @md.cmd =~/[VM]/ #arbitrary, watch problematic as too general + para='' if (para =~/<a name="n\d+">/ and para =~/^(?:\^~\d+\s|<!e[:_]\d+!>)/) # hmmm re-adjusted 200507, for alt endnote which should again be matched ^~ ... not in response to problem though + if para =~/<:center>/ #rules changed now a <p class="center" problems may arise 2005w11 ! + one,two=/(.*)<:center>(.*)/.match(para).captures + format_scroll=SiSU_HTML_Format_type::Format_scroll.new(@md,one,two) + end + else # this is crazy rethink and redo later with some form of inject + m=/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if para =~m + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,@sto.text) if @sto.format =~/[12]|null/ + meta=case @sto.format + when /^1~/; @sto.scroll_lev_para_ocn.heading_body1 + when /^2~/; @sto.scroll_lev_para_ocn.heading_body2 + when /^3~/; @sto.scroll_lev_para_ocn.heading_body3 + when /^4~\S+/; @sto.scroll_lev_para_ocn.heading_body4 # work on see Split_text_object + when /^5~/; @sto.scroll_lev_para_ocn.heading_body5 + when /^6~/; @sto.scroll_lev_para_ocn.heading_body6 + when /^i1$/ + format_txt_obj.gsub_body + @sto.scroll_lev_para_ocn.indent1 + when /^i2$/ + format_txt_obj.gsub_body + @sto.scroll_lev_para_ocn.indent2 + when /^center$/; @sto.scroll_lev_para_ocn.center + when /^(b|bold)$/; @sto.scroll_lev_para_ocn.bold + when /null/ # see whether u can improve + if para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + format_txt_obj.gsub_body + @sto.scroll_lev_para_ocn.para + if para =~/<!Th?.+/ # tables come as single block + table=Table.new(para) + para=table.table_split + end + end + end + elsif para =~/(Endnotes?)/ and para !~/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,'<br /><a name="notes">Note</a>') + meta=format_txt_obj.bold_para + elsif para =~/MetaData/ and para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ #debug 2003w46 add rc info + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,'<br /><a name="metadata">MetaData</a>') + meta=format_txt_obj.bold_para + elsif para =~/Owner Details/ and para !~/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,'<br /><a name="owner.details">Owner Details</a>') + @scr[:owner_details]=format_txt_obj.bold_para + meta='' + elsif para =~/(¡|<!Th?)/ + table=Table.new(para) + para=table.table + elsif para =~/(.*)<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>(.*)/ #ok - bug in equiv for seg 2004w46 + one,two=$1,$2 + format_scroll=SiSU_HTML_Format_type::Format_scroll.new(@md,one,two) #watch #fix + meta=format_scroll.no_paranum + end + meta='' if para =~/<a name="n\d+">/ and para =~/^(\^~\d+ |<!e[:_]\d+!>)/ # -endnote + if para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + case para + when /<:i1>/ + gsub(/<:i1>/,'') + format_scroll=SiSU_HTML_Format_type::Format_scroll.new(@md,para) + meta=format_scroll.indent_one_no_paranum + when /<:i2>/ + gsub(/<:i2>/,'') + format_scroll=SiSU_HTML_Format_type::Format_scroll.new(@md,para) + meta=format_scroll.indent_one_no_paranum + end + end + if para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + end + if para =~/<:center>/ + one,two=/(.*)<:center>(.*)/.match(para).captures + format_scroll=SiSU_HTML_Format_type::Format_scroll.new(@md,one,two) + end + end + para.gsub!(/<!.+!>/,' ') + para.gsub!(/^<:\S?>/,'') + para.gsub!(/<:\S?>/,' ') + unless meta; @scr[:body] << para + else @scr[:metadata] << meta + end + end + end + @scr + end + def tails + scr_tail=[] + format_head_scroll=SiSU_HTML_Format_type::Head_toc.new(@md) + ads = SiSU_HTML_promo::Ad.new(@md) + scr_tail << format_head_scroll.scroll_tail << ads.div.close << ads.display << format_head_scroll.html_close + scr_tail + end + end +end +__END__ diff --git a/lib/sisu/0.52/html_segments.rb b/lib/sisu/0.52/html_segments.rb new file mode 100644 index 00000000..765c012e --- /dev/null +++ b/lib/sisu/0.52/html_segments.rb @@ -0,0 +1,471 @@ +=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 segment 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_seg + require SiSU_lib + '/shared_html' + require SiSU_lib + '/html' + require SiSU_lib + '/html_promo' + class Seg + @@seg,@@seg_subtoc,@@seg_endnotes,@@seg_ad={},{},{},{} + @@seg_name,@@seg_name_html,@@seg_name_php,@@segtocband=[],[],[],[] + @@filename_seg=@@filename_segphp=@@seg_url=@@fn=@@to_lev4=@@get_hash_to=@@get_hash_fn='' + @@loop_count=@@seg_total=@@tracker=0 + @@is4=@@is3=@@is2=@@is1=0 + @@header1=@@header2=@@header3=@@header4=0 + @@seg[:dot_nav],@@seg[:tocband],@@seg[:title],@@seg[:headers],@@seg[:main],@@seg[:tail],@@seg[:credits],@@seg_subtoc_array,@@seg_endnotes_array,@@heading_endnotes_array,@@seg[:endnote_all]=Array.new(11){[]} + @@seg[:header_endnotes]='' + @@tablehead,@@number_of_cols=0,0 + @@flag_group=false + @@dp=nil + attr_reader :seg_name_html,:seg_name_html_tracker + def initialize(data='',md='') + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @seg_name_html=@@seg_name_html || nil + @seg_name_html_tracker=@@tracker || nil + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def songsheet + begin + Seg.new(@data,@md).get_subtoc_endnotes + Seg.new(@data,@md).articles + Seg.new.cleanup # (((( added )))) + #### (((( END )))) #### + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + @@seg_name=[] + end + end + protected + def articles + data=@data + track,tracking,newfile=0,0,0 + @@is4=@@is3=@@is2=@@is1=0 + printed_endnote_seg='n' + @h_sfx='.php' if @md.file_type =~/php/ + @h_sfx=@md.sfx if @md.file_type =~/html/ + @h_sfx='.html' if @md.file_type =~/html/ #used in creating file, not to be omitted. + data.each do |para| + if para =~/^4~/ + @@seg_name << para[/^4~(\S+)/,1] + seg_name=para[/^4~(\S+)/,1] + @@seg_ad[seg_name]=para[/.+?<:\d\s+(.+)\s*?>/,1] #watch + end + end + @@seg_name_html=@@seg_name + @@seg_total=@@seg_name.length + testforartnum=@@seg_name_html + tell=SiSU_Screen::Ansi.new(@md.cmd,@@seg_name.length) + tell.segmented unless @md.cmd =~/q/ + flagend='y' + data.each do |para| + if para =~/^4~.+/ #watch + if para =~/<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + @@header4=para.to_s[/^4~(?:\S+\s+)?(.+?)<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/,1] + else @@header4=para.to_s[/^4~(?:\S+\s+)?(.+)/,1] + end + @@is4=newfile=1 + end + if para =~/^3~.+/ + @@header3=para.to_s[/^3~(?:~\S+\s+)?(.+)/,1] + @@is4,@@is3=0,1 + end + if para =~/^2~.+/ + @@header2=para.to_s[/^2~(?:~\S+\s+)?(.+)/,1] + @@is4,@@is3,@@is2=0,0,1 + end + if para =~/^1~.+/ + @@header1=para.to_s[/^1~(?:~\S+\s+)?(.+)/,1] + @@is4,@@is3,@@is2,@@is1=0,0,0,1 + end + if (@@is1 && !@@is2 && !@@is3 && !@@is4) + unless para =~/^1~/; head1=$_ #; + end + end + if @@is4 == 1 or para =~/^<ENDNOTES>|^<EOF>/ + if newfile == 1 or para =~/^<ENDNOTES>|^<EOF>/ + newfile=0 + if para =~/^4~\S+/ or para =~/^<ENDNOTES>|^<EOF>/ # @@level4 + if tracking != 0 + File.mkpath(@md.dir_out) unless FileTest.directory?(@md.dir_out) #bug - added specifically for nav! not needed by regular seg, check !!! + Seg.new('',@md).tail + segfilename="#{@md.dir_out}/#{@md.fnl[:pre]}#{@@seg_name_html[tracking-1]}#{@md.fnl[:mid]}#@h_sfx#{@md.fnl[:post]}" + @@filename_seg=File.new(segfilename,'w') if @@seg_name_html[tracking-1] + unless (@@seg_name_html[tracking-1] =~/endnotes/) + Seg.new.output + else Seg.new.output('endnotes') + end + Seg.new.reinitialise + Seg.new(para,@md).header_art + Seg.new(para,@md).head + if @@seg_name_html[tracking] =~/metadata/ # this is for metadata + segfilename="#{@md.dir_out}/#{@md.fnl[:pre]}#{@@seg_name_html[tracking]}#{@md.fnl[:mid]}#@h_sfx#{@md.fnl[:post]}" + @@filename_seg=File.new(segfilename,'w') + Seg.new.reinitialise + flagend="x" + @@filename_seg.close #%(((( EOF )))) --> + end + end + if tracking == 0 + Seg.new(para,@md).header_art + Seg.new(para,@md).head + end + end + tracking=tracking + 1 + end + m=para[/.+?<a name="(\d+)">.*/]; @@get_hash_to=$1 if m # changed 2002w42, again w44 ! & again 2003w16 + m=para[/^4~(\S+)/]; @@get_hash_fn=$1 if m + if testforartnum[tracking-1] !~/endnote/ + Seg.new(para,@md).markup + Seg.new(para,@md).txt + else + Seg.new(para,@md).markup + Seg.new(para,@md).txt + if printed_endnote_seg == 'n' + Seg.new(para,@md).endnote + printed_endnote_seg='y' + end + end + end + end + end + def header_art + @data.each do |para| + format_head_seg=SiSU_HTML_Format_type::Head_seg.new(@md) + if para =~/^[0-6]~/ #2004w27/5 + if @@tracker < @@seg_total-1; @@seg[:dot_nav] << format_head_seg.dot_control_pre_next + else @@seg[:dot_nav] << format_head_seg.dot_control_pre + end + end + ads=SiSU_HTML_promo::Ad.new(@md) + @@seg[:title]=format_head_seg.head << ads.div.major + end + end + def head + data=@data + clean=/<!.*?!>|<:.*?>|<~\d+;(?:[ohum]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + format_head_seg=SiSU_HTML_Format_type::Head_seg.new(@md) + unless @md.flag_pdf + if @@tracker < @@seg_total-1 + if @@tracker == 0; @@segtocband << format_head_seg.toc_next3 + else @@segtocband << format_head_seg.toc_pre_next3 + end + elsif @@tracker == @@seg_total + @@segtocband << format_head_seg.toc_pre3 + end + else # identical code without .pdf + if @@tracker < @@seg_total-1 + if @@tracker == 0; @@segtocband << format_head_seg.toc_next2 + else @@segtocband << format_head_seg.toc_pre_next2 + end + else @@segtocband << format_head_seg.toc_pre2 + end + end + @p_num ||= '' + if @@is1 == 1 + @dc_creator=%{<b><sup>©</sup> #{@md.dc_creator}</b>\n} if @md.dc_creator.to_s =~/\S/ + @@seg[:tocband] << format_head_seg.navigation_band(@@segtocband,@@seg[:dot_nav]) + @@seg[:headers] << format_head_seg.seg_head_escript if SiSU_HTML_Format_type::Head_seg.method_defined? :seg_head_escript #debug PHP move up in text #bug + @@seg[:headers] << format_head_seg.title_banner(@md.title,@md.subtitle,@dc_creator).gsub(clean,'') + paranum=if @@header1[/.+?<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/]; $1 + else '' + end + @p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,paranum) + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,@@header1,@p_num.ocn_display) + @@seg[:headers] << format_seg.title_header1.gsub(clean,'') + @@header1.gsub!(/ <a name="-[\d*+]+" href="#_[\d*+]+"> <sup>[\d*+]+<\/sup> <\/a>/,'') + end + if @@is2 == 1 + header2=@@header2 + paranum=if header2[/.+?<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/]; $1 + else '' + end + @p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,paranum) + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,header2,@p_num.ocn_display) + @@seg[:headers] << format_seg.title_header2.gsub(clean,'') + @@header2.gsub!(/ <a name="-[\d*+]+" href="#_[\d*+]+"> <sup>[\d*+]+<\/sup> <\/a>/,'') + end + if @@is3 == 1 + header3=@@header3 + paranum=if header3[/.+?<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/]; $1 + else '' + end + @p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,paranum) + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,header3,@p_num.ocn_display) + @@seg[:headers] << format_seg.title_header3.gsub(clean,'') + @@header3.gsub!(/ <a name="-[\d*+]+" href="#_[\d*+]+"> <sup>[\d*+]+<\/sup> <\/a>/,'') + end + if @@is4 == 1 + header4=@@header4 + paranum=if header4[/.+?<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/]; $1 + else '' + end + @p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,paranum) + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,header4,@p_num.ocn_display) + @@seg[:headers] << format_seg.title_header4.gsub(clean,'') + end + @@seg[:header_endnotes]=format_head_seg.title_endnote(@md.title,@md.subtitle,@dc_creator,@@seg[:dot_nav]) + @@tracker=@@tracker+1 + end + def markup + @debug=[] + data=@data.dup #bugwatch tied + @group_collect=[] + data.each do |para| + format_head_seg=SiSU_HTML_Format_type::Head_seg.new(@md) + if para !~/^0~/ + m=para[/.+?<~(\d+);(?:[ohm]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/] + if m + paranum=m[1].to_s + @p_num=SiSU_HTML_Format_type::Paragraph_number.new(@md,paranum) + end + if para =~/<:(?:code|alt|verse|group)>/ or @@flag_group==true + if para =~/<:(?:code|alt|verse|group)>/ + @group_collect << @vz.margin_txt_0 + para + @@flag_group=true + elsif @@flag_group==true + unless para =~/<:(?:code|alt|verse|group)-end>/ # neither ideal nor necessary sort later + @group_collect << para + else @group_collect << para.gsub(/<:(?:code|alt|verse|group)-end>/,'') + end + end + if para =~/<:(?:code|alt|verse|group)-end>/ + para = @group_collect.join + @@flag_group=false + @group_collect=[] + end + end + if para !~/^[0-9]~/ + if para =~/(.*)<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>(.*)/ + one,two=$1,$2 + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,one,two) + para=format_seg.no_paranum + end + end + if para[/<~(\d+;(?:[ohmu]|[0-6]:)\d+;\w\d+><#@dp:#@dp)>$/] + @sto=SiSU_HTML::Source::Split_text_object.new(@md,para).lev_segname_para_ocn + format_txt_obj=SiSU_HTML_Format_type::Format_text_object.new(@md,@sto.text) if @sto.format =~/i[12]|_1?\*|<:i[12]>\s*_\*|null/ + para=case @sto.format # work area 2003w29 ||@|def lev_segname_para_ocn| + when /^4~\S+/; @sto.seg_lev_para_ocn.header4 # work on see Split_text_object + when /^5~(?:~\S+)?/; @sto.seg_lev_para_ocn.header5 + when /^6~(?:~\S+)?/; @sto.seg_lev_para_ocn.header6 + when /^_\*$/; @sto.seg_lev_para_ocn.bullet + when /^_1\*$/ + format_txt_obj.gsub_body + @sto.seg_lev_para_ocn.bullet_indent1 + when /^i1$/ + format_txt_obj.gsub_body + @sto.seg_lev_para_ocn.indent1 + when /^i2$/ + format_txt_obj.gsub_body + @sto.seg_lev_para_ocn.indent2 + when /^(?:verse|group|alt)$/ + @sto.seg_lev_para_ocn.para + when /^code$/ + @sto.seg_lev_para_ocn.code + when /null/ + if para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ and para !~/^<!TZ!>/ + format_txt_obj.gsub_body + @sto.seg_lev_para_ocn.para + elsif para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ and para =~/^<!TZ!>/ + format_txt_obj.gsub_body + @sto.seg_lev_para_ocn.table_end + else para + end + else para + end + elsif para =~/¡|<!T[hZ]?/ + table=SiSU_HTML_shared::Table.new(para) + para=table.table + end + if @md.flag_separate_endnotes + para.gsub!(/"\s+href="#_(\d+)">/,%{" href=\"endnotes#{@md.sfx}#_\\1">}) #endnote- twice #removed file type + end + if para !~/#{@vz.margin_txt_w1}|#{@vz.margin_txt_w2}/ + if para[/(.*)<~0;(?:u|[0-6]:)\d+;\w\d+><#@dp:#@dp>(.*)/] #% watch u & m? + one,two=$1,$2 + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,one,two) + para=format_seg.seg_no_paranum #% undefined + end + para.gsub!(/\s*(-\{{2}~\d+|<:e[:_]\d+>).*/,'') #potentially dagerous - removes all paragraphs with <!e_!> #?? workpoint + if para =~/<a name="_\d+" href="#-\d+"> <sup>/ #endnote- note- + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,para) + para=format_seg.no_paranum + end + end + if para =~/^4~\S+|4~!/ + para.gsub!(/4~\S+|<:[-_\w\d]?(-.+?-)?>|4~!.+/,'') #sort seg headers + @@seg[:main] << para + @@seg[:main] << @@seg_subtoc[@@get_hash_fn] #% insertion of sub-toc + else + para.gsub!(/<:[-_\w\d]?(-.+?-)?>|4~!.+/,'') + @@seg[:main] << para unless @@flag_group==true + end + end + end + end + def txt + end + def endnote + end + def tail + format_head_seg=SiSU_HTML_Format_type::Head_seg.new(@md) + if @md.flag_auto_endnotes + @@seg[:tail] << format_head_seg.endnote_mark + @@seg[:tail] << @@seg_endnotes[@@get_hash_fn] #endnotes deposited at end of individual segments||@|EXTRACTION OF ENDNOTES| + end + @@seg[:tail] << '<table summary="whitespace"><tr><td> </td></tr></table>' + ads = SiSU_HTML_promo::Ad.new(@md) + @@seg[:credits] << format_head_seg.credit << ads.div.close << ads.display << format_head_seg.html_close + end + def output(type='') + if @@seg[:title] =~/\S/ #kludge (for exception file better.ways, how ironic) get a real ruby test, e.g. test that not array or... + @@filename_seg << @@seg[:title] + #@@filename_seg << @@seg[:dot_nav] #places dot control at very top of segment + @@filename_seg << @@seg[:tocband] + if type !~/endnote/ + @@filename_seg << @@seg[:headers] + @@filename_seg << @@seg[:main] + else + @@filename_seg << @@seg[:header_endnotes] + @@filename_seg << @@seg[:endnote_all] + end + @@filename_seg << @@seg[:tail] + @@filename_seg << @@seg[:tocband] + @@filename_seg << @@seg[:credits] + @@filename_seg.close + end + end + def reinitialise + @@seg[:title],@@seg[:dot_nav],@@segtocband,@@seg[:tocband],@@seg[:headers],@@seg[:main],@@seg[:tail],@@seg[:credits]=Array.new(8){[]} + end + def cleanup + reinitialise + @@seg_total,@@tracker=0,0 + @@seg_endnotes,@@seg_subtoc={},{} + @@seg_endnotes_array,@@seg_subtoc_array,@@heading_endnotes_array=[],[],[] + @@seg[:endnote_all]=[] + end + def get_subtoc_endnotes #get endnotes & sub-table of contents subtoc + @data.each do |para| + para.gsub!(/<a name=\"h\d.*?\">(.+?)<\/a>/mi,'\1') + if @md.flag_auto_endnotes + if para =~/^[1234]~/ and not @@fn.empty? + @@seg_endnotes[@@fn] = [] + @@seg_endnotes[@@fn] << @@seg_endnotes_array + @@seg_endnotes_array=[] if para=~/^4~/ + end + end + if para =~/^4~/ #% EXTRACTION OF SUB-TOCs + @@seg_subtoc[@@fn]=@@seg_subtoc_array + @@seg_subtoc_array=[] + end + if para =~/^4~/ #% SEGMENT NAME, after EXTRACTION OF ENDNOTES & SUB-TOCs + m=para[/^4~(\S+).+?<~(\d+);(?:[oh]|4:)\d+;\w\d+><#@dp:#@dp>$/] + if m; @@fn,@@to_lev4=$1,$2 if m # changed 2004w07 #endnotes and sub-tocs + else + m=para[/^4~(\S+)/] + @@fn,@@to_lev4=$1,'nonum' if m # changed 2005w13 + end + end + if para =~/^[56]~\S*\s+(.+)?<~(\d+);(?:h|[56]:)\d+;\w\d+><#@dp:#@dp>$/ + para.gsub!(/ <\/a>/,' ') + case para # series changed 2002w42 + when /^5~\S*\s+(.+)?<~(\d+);(?:h|[56]:)\d+;\w\d+><#@dp:#@dp>$/ #remove [u]? req by pg texts, revist + one,two=$1,$2 + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,one,two) + para=format_seg.subtoc_lev5 + when /^6~\S*\s+(.+)?<~(\d+);(?:h|[56]:)\d+;\w\d+><#@dp:#@dp>$/ + one,two=$1,$2 + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,one,two) + para=format_seg.subtoc_lev6 + end + @@seg_subtoc_array << para + end + if @md.flag_auto_endnotes + if para =~/~[{\[][\d*+]+ <a name="_[\d*+]+"/ # endnote- + endnote_array=[] + if para=~/~\{.+?\}\~/m + endnote_array << para.scan(/~\{.+?\}\~/m) + end + if para=~/~\[[*]\d+\s.+?\]\~/m + endnote_array << para.scan(/~\[[*]\d+\s.+?\]\~/m) + end + if para=~/~\[[+]\d+\s.+?\]\~/m + endnote_array << para.scan(/~\[[+]\d+\s.+?\]\~/m) + end + endnote_array.flatten.each do |note| + note_match=note.dup + note_match_seg=note.dup + e_n=note_match_seg[/(?:~\{[\d*+]+|~\[[*+]\d+)\s+(.+?)[}\]]~/m,1] + try=e_n.split(/<br \/>/) + try.each do |e| + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,e) + note_match=if e =~/<:i[12]>/ + format_seg.endnote_body_seg_tail_indent + else format_seg.endnote_body_seg_tail + end + @@seg_endnotes_array << note_match + end + try.join('<br \/>') + #% creation of separate end segment/page of all endnotes referenced back to reference segment + m=/(?:~\{[\d*+]+|~\[[*+]\d+)\s+(.+?href=")(#-[\d*+]+".+)[}\]]~/mi + one=note_match_seg[m,1] #note~ [a name] + two=note_match_seg[m,2] #note- + format_seg=SiSU_HTML_Format_type::Format_seg.new(@md,one,two) + note_match_all_seg=format_seg.endnote_seg_body(@@fn) #BUG WATCH 200408 + @@seg[:endnote_all] << note_match_all_seg + end + para.gsub!(/~[{\[].+?[}\]]~\s*/m,' ') + end + end + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/html_table.rb b/lib/sisu/0.52/html_table.rb new file mode 100644 index 00000000..ade762eb --- /dev/null +++ b/lib/sisu/0.52/html_table.rb @@ -0,0 +1,141 @@ +=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: shared html parts + + * 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_table + require SiSU_lib + '/defaults' + class Table + @@tablehead=0 + @@tablefoot=[] #watch + def initialize(one) + @one,@parablock,@vz=one,one,SiSU_Env::Get_init.instance.skin + end + def table_head(inf) + %{<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> + <tr> + <td valign="top" align="justify"> + <p class="norm" id="o#{inf}"><a name="#{inf}"></a></p> + </td> + <td> +<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center">} + end + def table_end(tablefoot='') + %{</table>#{@vz.margin_num}#{@vz.margin_num} #{@vz.table_close} +#{tablefoot}} + end + def table_row(inf,h=false) + bold=if h; '<b>' + else '' + end + %{ +<tr> + <td width="#{inf}%" valign="top">#{@vz.paragraph_table}#{bold}} + end + def table_cell(inf,h=false) + if h; %{</b></font></td><td width="#{inf}%" valign="top">#{@vz.paragraph_table}<b>} + else %{</font></td><td width="#{inf}%" valign="top">#{@vz.paragraph_table}} + end + end + def table_row_close(h=false) + bold_close=if h; '</b>' + else '' + end + "#{bold_close}</font></td></tr>" + end + def table + m=@parablock[/<!f(.+?)!>/,1] + @@tablefoot << m if m + @parablock.gsub!(/<!f.+?!>/,'') + @@tablehead=1 if @parablock =~/<!Th¡/ + if @parablock =~/<!Th?¡.+?!~(\d+);\w\d+;\w\d+>/; @parablock=table_head($1) + end + if @parablock =~/<!TZ!>/ + tablefoot=[] + @@tablefoot.each {|x| tablefoot << ''} + @@tablefoot=[] + if @parablock =~/<!TZ!>/; @parablock=table_end + end + end + if @@tablehead == 1 + if @parablock =~/¡¡/ + if @parablock =~/<!¡¡(\d+?)¡/ + @parablock.gsub!(/<!¡¡(\d+?)¡/,table_row($1,true)) + end + if @parablock =~/¡¡(\d+?)¡/ + @parablock.gsub!(/¡¡(\d+?)¡/,table_cell($1,true)) + end + if @parablock =~/!>/ + @parablock.gsub!(/!>/,table_row_close(true)) + end + @@tablehead=0 + end + @parablock + else + if @parablock =~/<!¡¡(\d+?)¡/ + @parablock.gsub!(/<!¡¡(\d+?)¡/,table_row($1)) + end + if @parablock =~/¡¡(\d+?)¡/ + @parablock.gsub!(/¡¡(\d+?)¡/,table_cell($1)) + end + if @parablock =~/!>/ + @parablock.gsub!(/!>/,table_row_close) + end + @parablock + end + @parablock + end + def table_split + @new_content=[] + @one.split(/\n/).each do |parablock| + table=Table.new("#{parablock}\n") + @new_content << table.table + end + @new_content.join + end + end +end +__END__ diff --git a/lib/sisu/0.52/html_tune.rb b/lib/sisu/0.52/html_tune.rb new file mode 100644 index 00000000..1043f310 --- /dev/null +++ b/lib/sisu/0.52/html_tune.rb @@ -0,0 +1,376 @@ +=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, html pre-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 +require SiSU_lib + '/param' +module SiSU_Tune + #require SiSU_lib + '/defaults' + require SiSU_lib + '/sysenv' + require SiSU_lib + '/param' + require SiSU_lib + '/html_format' #watch + include SiSU_Env + include SiSU_Screen + @@line_mode='' + @@endnote_array=[] + @@endnote_call_counter=1 + @@table_align='<table summary='' width="96%" border="0" bgcolor="white" cellpadding="0" col="3"> +<tr ...><td width="2%" align="right"> + \;</td> +<td width="94%" valign="top" align="justify">' + @@table_align_close='</td> +<td width="4%" align="right" valign="top"> +<font size="1" color="#777777"> + </font> </td></tr></table>' + @@counter,@@column,@columns=0,0,0 + class Output + def initialize(data,md) + @data,@md=data,md + @cX=SiSU_Screen::Ansi.new(@md.cmd).cX + end + def hard_output + my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns) + @filename_tune=my_make.file_tune + data=[] + @data.each{|x| x.strip; data << x if not x.empty?} #1.9 array? + data.each do |para| + @filename_tune.puts para, "\n" #if para !~/¡/ + end + end + def marshal + my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns) + @marshal_tune=my_make.marshal_tune + File.open(@marshal_tune,'w') {|f| Marshal.dump(@data.to_a,f)} + end + end + class Clean_html + def initialize(html='') + @html=html + end + def clean + @html.gsub!(/¢/,'¢') # ¢ + @html.gsub!(/£/,'£') # £ + @html.gsub!(/¥/,'¥') # ¥ + @html.gsub!(/§/,'§') # § + @html.gsub!(/©/,'©') # © + @html.gsub!(/ª/,'ª') # ª + @html.gsub!(/«/,'«') # « + @html.gsub!(/®/,'®') # ® + @html.gsub!(/°/,'°') # ° + @html.gsub!(/±/,'±') # ± + @html.gsub!(/²/,'²') # ² + @html.gsub!(/³/,'³') # ³ + @html.gsub!(/µ/,'µ') # µ + @html.gsub!(/¶/,'¶') # ¶ + @html.gsub!(/¹/,'¹') # ¹ + @html.gsub!(/º/,'º') # º + @html.gsub!(/»/,'»') # » + @html.gsub!(/¼/,'¼') # ¼ + @html.gsub!(/½/,'½') # ½ + @html.gsub!(/¾/,'¾') # ¾ + @html.gsub!(/×/,'×') # × + @html.gsub!(/÷/,'÷') # ÷ + @html.gsub!(/¿/,'¿') # ¿ + @html.gsub!(/À/,'À') # À + @html.gsub!(/Á/,'Á') # Á + @html.gsub!(/Â/,'Â') #  + @html.gsub!(/Ã/,'Ã') # à + @html.gsub!(/Ä/,'Ä') # Ä + @html.gsub!(/Å/,'Å') # Å + @html.gsub!(/Æ/,'Æ') # Æ + @html.gsub!(/Ç/,'Ç') # Ç + @html.gsub!(/È/,'È') # È + @html.gsub!(/É/,'É') # É + @html.gsub!(/Ê/,'Ê') # Ê + @html.gsub!(/Ë/,'Ë') # Ë + @html.gsub!(/Ì/,'Ì') # Ì + @html.gsub!(/Í/,'Í') # Í + @html.gsub!(/Î/,'Î') # Î + @html.gsub!(/Ï/,'Ï') # Ï + @html.gsub!(/Ð/,'Ð') # Ð + @html.gsub!(/Ñ/,'Ñ') # Ñ + @html.gsub!(/Ò/,'Ò') # Ò + @html.gsub!(/Ó/,'Ó') # Ó + @html.gsub!(/Ô/,'Ô') # Ô + @html.gsub!(/Õ/,'Õ') # Õ + @html.gsub!(/Ö/,'Ö') # Ö + @html.gsub!(/Ø/,'Ø') # Ø + @html.gsub!(/Ù/,'Ù') # Ù + @html.gsub!(/Ú/,'Ú') # Ú + @html.gsub!(/Û/,'Û') # Û + @html.gsub!(/Ü/,'Ü') # Ü + @html.gsub!(/Ý/,'Ý') # Ý + @html.gsub!(/Þ/,'Þ') # Þ + @html.gsub!(/ß/,'ß') # ß + @html.gsub!(/à/,'à') # à + @html.gsub!(/á/,'á') # á + @html.gsub!(/â/,'â') # â + @html.gsub!(/ã/,'ã') # ã + @html.gsub!(/ä/,'ä') # ä + @html.gsub!(/å/,'å') # å + @html.gsub!(/æ/,'æ') # æ + @html.gsub!(/ç/,'ç') # ç + @html.gsub!(/è/,'è') # è + @html.gsub!(/é/,'é') # é + @html.gsub!(/ê/,'ê') # ê + @html.gsub!(/ë/,'ë') # ë + @html.gsub!(/ì/,'ì') # ì + @html.gsub!(/í/,'í') # í + @html.gsub!(/î/,'î') # î + @html.gsub!(/ï/,'ï') # ï + @html.gsub!(/ð/,'ð') # ð + @html.gsub!(/ñ/,'ñ') # ñ + @html.gsub!(/ò/,'ò') # ò + @html.gsub!(/ó/,'ó') # ó + @html.gsub!(/ô/,'ô') # ô + @html.gsub!(/õ/,'õ') # õ + @html.gsub!(/ö/,'ö') # ö + @html.gsub!(/ø/,'ø') # ø + @html.gsub!(/ù/,'ù') # ú + @html.gsub!(/ú/,'ú') # û + @html.gsub!(/û/,'û') # ü + @html.gsub!(/ü/,'ü') # ý + @html.gsub!(/þ/,'þ') # þ + @html.gsub!(/ÿ/,'ÿ') # ÿ + @html.gsub!(/ý/,'ý') + @html + end + end + class Tune + @@dp=nil + def initialize(data,md) + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @env=SiSU_Env::Info_env.new(@md.fns) + @sys=SiSU_Env::System_call.new + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + #@utf8=SiSU_character_encode::UTF8 #.new + end + def songsheet + begin + @cX=SiSU_Screen::Ansi.new(@md.cmd).cX + tell=SiSU_Screen::Ansi.new(@md.cmd,'Tune') + tell.txt_grey unless @md.cmd =~/q/ + data=Tune.new(@data,@md).endnotes_html + data=Tune.new(data,@md).url_markup + if @sys.locale =~/utf-?8/i + data=Tune.new(data,@md).utf8_markup + end + if @md.cmd =~/M/ #Hard Output Tune Optional on/off here + data=Output.new(data,@md).hard_output + Output.new(data,@md).marshal + end + tuned=Tune.new(@data,@md).output + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + end + end + def para_numbers + data=@data + @tuned_file=[] + data.each do |para| + para.gsub!(/(\d~(\S+))/,'\1<a name="H#\2">#\2.</a> ') + @tuned_file << para + end + end + def utf8_markup + @tuned_file=[] + @data.each do |para| + #@utf8.new(para).html + #@utf8.html(@para) + if @sys.locale =~/utf-?8/i # instead ucs for utf8 #require 'iconv' ? Iñtërnâtiônàlizætiøn + #¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûü + #¢£¥§©ª«®°±²³µ¶¹º»¼½¾×÷ + ##para.gsub!(//, '&#;') + ##para.gsub!(//, '&;') + para=SiSU_Tune::Clean_html.new(para).clean + end + @tuned_file << para + end + end + def url_markup + data=@data + @tuned_file=[] + data.each do |para| + para.gsub!(/<:name\#(\S+?)>/,'<a name="\1"></a>') + para.gsub!(/<-#>/,'') + para.gsub!(/<:p[bn]>/,'') + para.gsub!(/<(p|br)>/,'<\1 />') + para.gsub!(/<:br>/,'<br />') + if para =~/<::\s+/ #watch + para.gsub!(/<::\s+(\S+?)\s+!>/, + %{<img src="#{@env.url.images}/c_\\1.png" alt="\\1" width="14" height="14" align="bottom" border="0">}) + end + if para =~/<:image\s+/ + para.gsub!(/<:image\s+(http\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+>/, + %{<a href="\\1"><img src="#{@env.url.images_local}/\\2" \\3 \\4 naturalsizeflag="0" align="bottom" border="0"></a>}) + para.gsub!(/<:image\s+(http\S+)\s+(\S+)\s+>/, + %{<a href="\\1"><img src="#{@env.url.images_local}/\\2" naturalsizeflag="0" align="bottom" border="0"></a>}) + para.gsub!(/<:image\s+(\S+)\s+(\S+)\s+(\S+)\s+>/, + %{<img src="#{@env.url.images_local}/\\1" \\2 \\3 naturalsizeflag="0" align="bottom" border="0">}) + para.gsub!(/<:image\s+(\S+)\s+>/, + %{<img src="#{@env.url.images_local}/\\1" naturalsizeflag="0" align="bottom" border="0">}) + end + if para =~/\{.+?\}((?:http|ftp)\S+|image)/ + @word_mode=para.scan(/\{.+?\}(?:(?:https?|ftp)\S+|image)|\S+/) + word_mode=SiSU_Tune::Tune_urls.new(@word_mode,@md).urls + words=word_mode.join(' ') + para.gsub!(/.+/,words) + end + if (para !~/^0~/) + para.gsub!(/\\copyright/i,%{<sup>©</sup>}) + if (para !~/\<:ad\s+\.\.\//) + para.gsub!(/\<:ad\s+(\S+)?\s+(\S+\.png)\s+(.+)?\;\s+(.+)?\;\s*!\>/, + %{\n<center><a href="http:\/\/\\1" target="external"><img src="#{@env.url.images_local}/\\2" alt="\\3"></a></center>\n}) + else + para.gsub!(/\<:ad\s+(\S+)?\s+(\S+\.png)\s+(.+)?\;\s+(.+)?\;\s*\>/, + %{\n<center><a href="\\1" target="_top"><img src="#{@env.url.images_local}/\\2" alt="\\3"></a></center>\n}) + end + para.gsub!(/!pick/, %{<img border="0" height="15" width="15" src="#{@env.url.images}/#{@vz.icon_choice}" alt="stellar">}) + para.gsub!(/!new/, %{ <img border="0" height="15" width="15" src="#{@env.url.images}/#{@vz.icon_new}" alt="new">}) + para.gsub!(/<:h(.{1,7}?)>/,'<a href="#h\1">\1</a>') + para.gsub!(/<:to(\d{1,7}?)>/,'<a href="#to\1">to { \1 }</a> ') + if (para =~/\b\S+\@\S+?\.\S+/ and para !~/(\"\S+\@\S+?\.\S+\"|>\S+\@\S+?\.\S+?<)/) + para.gsub!(/\b(\S+\@\S+?\.\S+)(\s)/,'<a href="mailto:\1">\1</a>\\2') + end + if (para !~/(\"\w+:\/\/\S+?\"|>\s*\w+:\/\/\w+?\S*<)/) #url markup http etc. + if para=~/\w+:\/\/\S+?\.\S+?[.,] / + para.gsub!(/(\w+:\/\/\S+?\.\S+?)([.,] )/,'<a href="\1" target="_top">\1</a>\2') #full stops ! have been a bother + else + para.gsub!(/(\w+:\/\/\S+?\.\S+)/, '<a href="\1" target="_top">\1</a>') + end + end + if (para =~/[ ^](?:https?|ftp):\/\/\S+/) #url markup http leftovers watch carefully may accept too much 2004w46 + if para=~/([ ^])((?:https?|ftp):\/\/\S+?)([\.,] )/ + para.gsub!(/([ ^])((?:https?|ftp):\/\/\S+?)([\.,] )/,'\1<a href="\2" target="_top">\2</a>\3') #full stops ! have been a bother + else + para.gsub!(/([ ^])((?:https?|ftp):\/\/\S+)/,'\1<a href="\2" target="_top">\2</a>') + end + end + if (para =~/..\/\S+/ and para !~/(\"..\/\S+?\"|>\s*..\/\S+<)/) + para.gsub!(/(\.\.\/\S+)/,'<a href="\1">\1</a>') + end + para.gsub!(/<a href="\.\.\//,%{<a href="#{@vz.url_site}/}) + end + @tuned_file << para + end + end + def endnotes_html + data=@data + @tuned_file=[] + data.each do |para| + para.gsub!(/(~[{])(\d+) (.+?) <#@dp>([}]~)/, + ' <a name="-\2" href="#_\2"> <sup>\2</sup> </a> ' + #note- endnote- + '\1\2 <a name="_\2" href="#-\2"> <sup>\2.</sup></a> \3 \4') #endnote- note- (careful may have switched) + para.gsub!(/(~\[)([*+]\d+) (.+?) <#@dp>(\]~)/, + ' <a name="-\2" href="#_\2"> <sup>\2</sup> </a> ' + #note- endnote- + '\1\2 <a name="_\2" href="#-\2"> <sup>\2.</sup></a> \3 \4') #endnote- note- (careful may have switched) + para.gsub!(/(~\{)([*+]+) (.+?) <#@dp>(\}~)/, + ' <a name="-\2" href="#_\2"> <sup>\2</sup> </a> ' + #note- endnote- + '\1\2 <a name="_\2" href="#-\2"> <sup>\2</sup></a> \3 \4') #endnote- note- (careful may have switched) + @tuned_file << para + end + end + def output + data=@data + @tuned_file=[] + data.each do |para| + para.strip! + para.chomp! + @tuned_file << para + end + @tuned_file << "\n<EOF>" if (@md.fns =~/\.sst0/) #remove + @tuned_file + end + end + class Tune_urls + def initialize(data,md) + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @env=SiSU_Env::Info_env.new(@md.fns) + end + def urls + @words=[] + @data.each do |word| + @words << if word=~/\{(.+?)\}((?:https?|ftp)\S+|image)/ + if word =~/\{(.+?)\}((?:https?|ftp)\S+|image)([.,](?:\s|$))/ + m,u,d=/\{(.+?)\}((?:https?|ftp)\S+|image)([.,](?:\s|$))/.match(word).captures + else m,u=/\{(.+?)\}((?:https?|ftp)\S+|image)/.match(word).captures + d='' + end + case m + when /\.png|\.jpg|\.gif|c=|\d+x\d+/ + w,h=/(\d+)x(\d+)/.match(m).captures if m =~/\d+x\d+/ + w=%{width="#{w}"} if w + h=%{height="#{h}"} if h + c=m[/"(.+?)"/m,1] + caption=%{<br /><p class="caption">#{c}</p>} if c + png=m.scan(/\S+/)[0] + image_path=if @md.fns =~/\.-ss[tm]$/; @env.url.images_external + else @env.url.images_local + end + ins=if u and u.strip !~/^image$/ + %{<a href="#{u}"><img src="#{image_path}/#{png}" #{w} #{h} naturalsizeflag="0" align="bottom" border="0"></a>#{caption}} + else %{<img src="#{image_path}/#{png}" #{w} #{h} naturalsizeflag="0" align="bottom" border="0">#{caption}} + end + word.gsub!(/\{.+?\}((?:https?|ftp)\S+|image)/,ins) + else + link=m[/(.+)/m] + png=m.scan(/\S+/)[0].strip + link=link.strip + ins=%{<a href="#{u}">#{link}</a>#{d}} + word.gsub!(/\{.+?\}(?:https?|ftp)\S+/,ins) + end + word + else word + end + word + end + @words + end + end +end +__END__ diff --git a/lib/sisu/0.52/hub.rb b/lib/sisu/0.52/hub.rb new file mode 100644 index 00000000..939b70a5 --- /dev/null +++ b/lib/sisu/0.52/hub.rb @@ -0,0 +1,573 @@ +=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: SiSU information Structuring Universe, 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 + require SiSU_lib + '/sysenv' + include SiSU_Screen + @@pwd=Dir.pwd + class Remote_download + def initialize(requested_file) + @requested_file=requested_file + end + def pod + re_p_div=/http:\/\/([^\/]+)(\/\S+?)\/(sisupod(?:\.zip)?|[^\/]+?\.ssp)$/ + re_p=/(sisupod(?:\.zip)?|[^\/]+?\.ssp)$/ + if @requested_file =~ re_p_div + @site,@pth,@pod= re_p_div.match(@requested_file).captures + elsif @requested_file =~ re_p + @pod= re_p.match(@requested_file).captures + end + def site + @site + end + def path + @pth + end + def dir_stub + re_p_stub=/.+?([^\/]+)$/ + pod_stub= re_p_stub.match(path).captures.join if path + end + def name_source + @pod + end + def name + pod_download_as=if name_source=~/(?:sisupod\.(?:zip|ssp))/; dir_stub + '.ssp' + else name_source + end + end + self + end + end + class Op + @@env=SiSU_Env::Info_env.new + def initialize(opt,req,message) + @opt,@req,@message=opt,req,message + @n_do=0 + end + def pod_output(fns_pod) + dir_pwd=@@env.path.pwd + dir_pod=@@env.sisupod_gen(fns_pod) + Dir.chdir(dir_pod) + content=Dir.glob("*.ss[mt]").join(' ') + if content =~/\.ss[mt]/ + Dir.chdir(dir_pwd) + @opt.fns=content #check + system("cd #{dir_pod} + sisu -CC #{@opt.cmd} #{@opt.mod.join(' ')} #{content} + cd - + ") + end + @pwd=`pwd`.strip + Dir.chdir(@pwd) + end + def select + require SiSU_lib + "/#@req" + if @req =~/^conf$/; SiSU_Initialize::Source.new(@opt).read # -C + end + if not @opt.files.empty? + @opt.files.each do |fns| + if fns =~ /(?:sisupod(?:\.zip)?|\.ssp)$/ + pod_name=Remote_download.new(fns).pod.name + tell=SiSU_Screen::Ansi.new(@opt.cmd,pod_name) + tell.puts_blue unless @opt.cmd =~/q/ + @opt.files.shift + pod_output(pod_name) + break + else + put=fns.gsub(/(.+)?\._sst$/,'\1.ssm') + @opt.fns=fns + if @req !~/(?:urls|remote_put)$/ + if FileTest.file?(@opt.fns) + case @opt.fns + when /\.(?:[_-]?sst|ssm)$/ + case @req + when /^dal$/ + if fns =~ /\.ssm$/; require SiSU_lib + '/composite' #pre-processing + SiSU_Assemble::Composite.new(@opt).read + @opt.fns=fns.gsub(/\.ssm$/,'._sst') + end + SiSU_DAL::Source.new(@opt).read # -m + when /^concordance$/; SiSU_Concordance::Source.new(@opt).read # -w + when /^share_src$/; SiSU_Markup::Source.new(@opt).read # -s + when /^sisupod_make$/; SiSU_Doc::Source.new(@opt).read # -S + when /^source_kdissert$/; SiSU_Kdi_source::Source.new(@opt).read ## -S + when /^digests$/; SiSU_Digest_view::Source.new(@opt).read # -N + when /^plaintext$/; SiSU_Plaintext::Source.new(@opt).read # -a -A -e -E -f + when /^wikispeak$/; SiSU_Wikispeak::Source.new(@opt).read # -g + when /^odf$/; SiSU_ODF::Source.new(@opt).read # -o + when /^texpdf$/; SiSU_TeX::Source.new(@opt).read # -p + when /^texinfo$/; SiSU_TexInfo::Source.new(@opt).read # -I + when /^docbook$/; SiSU_Docbook::Source.new(@opt).read # -B + when /^html$/; SiSU_HTML::Source.new(@opt).read # -h -H + when /^xml$/; SiSU_XML_SAX::Source.new(@opt).read # -x + when /^xml_dom$/; SiSU_XML_DOM::Source.new(@opt).read # -X + when /^xhtml$/; SiSU_XHTML::Source.new(@opt).read # -b + when /^manifest$/; SiSU_Manifest::Source.new(@opt).read # -y + when /^sitemaps$/; SiSU_Sitemaps::Source.new(@opt).read # -Y + when /^zap$/; SiSU_Zap::Source.new(@opt).read # -Z + when /^dbi$/; SiSU_DBI::SiSU_SQL.new(@opt).connect # -D -d + end + @n_do=@n_do+1 + tell=SiSU_Screen::Ansi.new(@opt.cmd,@n_do,"#{@req.upcase} processed") + tell.files_processed unless @opt.cmd =~/q/ + ObjectSpace.garbage_collect + else #print "not processed --> ", fns, "\n" + end + else Operations.new(@opt).not_found + end + elsif FileTest.file?(put) + case @req + when /^urls$/; SiSU_urls::Source.new(@opt).read # -u -v -V -M + when /^remote_put$/ + case @message + when /scp/; SiSU_Remote::Put.new(@opt).scp # -r + when /rsync/; SiSU_Remote::Put.new(@opt).rsync # -R + else #SiSU_Remote::Put.new(put,@opt.cmd).scp + end + end + else Operations.new(@opt).not_found + end + end + end + elsif @req =~/^dbi$/; SiSU_DBI::SiSU_SQL.new(@opt).connect # -D -d + elsif @req=~/^sisupod_make$/; SiSU_Doc::Source.new(@opt).read # -S + end + Operations.new.counter + end + end + class Operations + @@n_do=0 + def initialize(opt='') + @opt=opt + @cX=SiSU_Screen::Ansi.new(@opt).cX + end + def counter + @@n_do=0 + end + def remote_put_base_site_rsync # -CR +p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ + require SiSU_lib + '/remote_put' + SiSU_Remote::Put.new(@opt).rsync_base + end + def remote_put_base_site_rsync_match # -CCRZ +p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ + require SiSU_lib + '/remote_put' + SiSU_Remote::Put.new(@opt).rsync_base_sync + end + def remote_put_base_site # -Cr +p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ + require SiSU_lib + '/remote_put' + SiSU_Remote::Put.new(@opt).scp_base + end + def remote_put_base_site_all # -CCr +p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ + require SiSU_lib + '/remote_put' + SiSU_Remote::Put.new(@opt).scp_base_all + end + def cgi # -F + require SiSU_lib + '/cgi' + SiSU_CGI::SiSU_search.new(@opt).read + end + def encoding # -K build character encoding db (uses KirbyBase) + require SiSU_lib + '/character_encoding' + SiSU_character_encode::Create.new.db + end + def termsheet # -t + system("sisu_termsheet #{@opt.cmd} #{@opt.fns}\n") + @@n_do=@@n_do+1 + tell=SiSU_Screen::Ansi.new(@opt.cmd,@@n_do,'Termsheet(s) processed') + tell.term_sheet_title unless @opt.cmd =~/q/ + end + def webrick # -W + port=prt=@fns + prt=if prt !~/\d+/; 'webrick default (sysenv)' + else "webrick port set to #{prt}" + end + puts %{#{@cX.blue}<<#{@cX.off}#{@cX.green}Start Webrick web server on port: #{prt}#{@cX.off}#{@cX.blue}>> #{@cX.off*2} } + system("sisu_webrick #{port}&\n") + end + def semantics + end + def not_found + puts "\n#{@cX.fuschia}FILE NOT FOUND:#{@cX.off} << #{@opt.fns} >> - requested #{@opt.cmd} processing skipped\n" + end + def convert_name_message(fns,type,i,o,rune) + %{\nIn filename: "#{@cX.fuschia}#{fns}#{@cX.off}" << #{type} >> #{@cX.fuschia}is apre 0.36 markup filename.#{@cX.off} #{@cX.brown}Please rename your file.#{@cX.off}\n\tAs of sisu-0.37, SiSU markup files with #{@cX.brown}the extensions #{i} should be re-named #{o}#{@cX.off}\n\tif you have the program called 'rename' installed, the following rune should do the trick:\n\t\t#{rune}\n\talternatively try:\n\t\tsisu --convert --36to37 #{fns}\n\trequested #{@opt.cmd} processing skipped\n} + end + def not_recognised + case @opt.fns + when /(\.s[123])$/ + type=@opt.fns.gsub(/\S+?(#{$1})/,'\1') + rune=%q{rename 's/\.s[123]$/\.sst/' *.s{1,2,3}} + puts convert_name_message(@opt.fns,type,'.s1 .s2 and .s3','.sst',rune) + when /(\.r[123])$/ + type=@opt.fns.gsub(/\S+?(#{$1})/,'\1') + rune=%q{rename 's/\.r[123]$/\.ssm/' *.r{1,2,3}} + puts convert_name_message(@opt.fns,type,'.r1 .r2 and .r3','.sst',rune) + puts %{\n\tNote also that you will need to change the names of the files called/required\n\twithin the document text to build the composite document\n\t\t.s1 .s2 .s3 should be .sst \n\t\t.si should be .ssi\n\trequested #{@opt.cmd} processing skipped\n} + when /(\.ssi)$/ + puts "\n#{@cX.fuschia}component filetype:#{@cX.off} << #{@opt.fns} >> - is not a processed filetype, (it may be used as a component of a .ssm markup file)\n\trequested #{@opt.cmd} processing skipped\n" + else + puts "\n#{@cX.fuschia}FILETYPE NOT RECOGNISED:#{@cX.off} << #{@opt.fns} >> - is not a recognized filetype,\n\trequested #{@opt.cmd} processing skipped\n" + end + end + end + class Processing + require 'fileutils' + include FileUtils + @@env=SiSU_Env::Info_env.new + attr_accessor :op + def initialize(opt) + @opt=opt + @msg,@msgs='',nil + @tell=lambda { SiSU_Screen::Ansi.new(@opt.cmd,@msg,"#{@msgs.inspect if @msgs}") } + end + def op(req,msg) + Op.new(@opt,req,msg).select if req and msg + end + def actions + if @opt.mod.inspect =~/--convert|--to|--from/; require SiSU_lib + '/sst_convert_markup' + end + if @opt.cmd =~/([AabCcDdEeFfgGHhIiLMmNnoprRSsTtQqUuVvwWXxYyZ_0-9])/ and + @opt.cmd =~/^-/ and + @opt.mod.inspect !~/--(?:sitemaps|query|identify)/ or + @opt.mod.inspect =~/--(?:(?:sq)?lite|pg(?:sql)?)/ #and + @@tell=SiSU_Screen::Ansi.new(@opt.cmd) + @cX=SiSU_Screen::Ansi.new(@opt.cmd).cX + flag=SiSU_Env::Info_processing_flag.new + extra='' + if @opt.cmd !~/[mn]/ + extra+=if @opt.cmd =~/[abBeghHhINoptwXxz]/ and @opt.cmd !~/[mn]/; 'm' #% add dal + elsif ((@opt.cmd =~/[Dd]/ or (@opt.mod.inspect =~/--(?:(?:sq)?lite|pg(?:sql)?)/)) \ + and @opt.mod.inspect !~/(?:remove|(?:(?:re)?create(?:all)?|dropall|drop)$)/) \ + and @opt.cmd !~/[mn]/ + 'm' #% add dal + else '' + end + end + if @opt.cmd !~/y/ + extra+=if @opt.cmd =~/[abehHhINopsSstwXxz]/ and @opt.cmd !~/y/; 'y' #% add manifest + elsif (@opt.cmd =~/[Dd]/ or @opt.mod.inspect =~/--(?:(?:sq)?lite|pg(?:sql)?)/) and @opt.files[0] !~/^remove$/ and @opt.cmd !~/y/; 'y' #% add manifest + else '' + end + end + @opt.cmd=@opt.cmd + extra + if @opt.cmd =~/[vVM]/ #% version information + version=SiSU_Env::Info_version.new.get_version + rb_ver=SiSU_Env::Info_version.new.rbversion + if version[:version] + tell=SiSU_Screen::Ansi.new(@opt.cmd,version[:project],version[:version],version[:date_stamp],version[:date],rb_ver) + tell.version + SiSU_Help::Help.new('env',@opt).environment if @opt.cmd =~/V/ and @opt.files.empty? #% environment + else puts 'SiSU version information not available' + end + end + if @opt.cmd =~/^-L$/; SiSU_Help::Help.new('license',@opt).help_request #% version information + end + if @opt.cmd =~/m/i #% -m for -C + path={} + path[:css]=@@env.path.output + '/_sisu/css' + path[:xml]=@@env.path.output + '/_sisu/xml' + path[:xsd]=path[:xml] + '/xsd' + path[:xsd]=path[:xml] + '/rnc' + path[:xsd]=path[:xml] + '/rng' + #path_dtd="#{@@env.path.output}/_sisu/xml/dtd" + re_p=/(sisupod(?:\.zip)?|[^\/]+?\.ssp)$/ + unless @opt.files.join(',') =~ re_p #do not mix pods with source markup files in command line + unless ( FileTest.directory?(path[:css]) and FileTest.directory?(path[:xsd]) ) + @opt.cmd=@opt.cmd +='C' unless @opt.cmd =~/C/ #FIX + end + if @opt.cmd =~/M/; $VERBOSE=false #debug $VERBOSE=true + # -M test other expected directories including images + end + end + end + if @opt.cmd =~/C/ #% -C initialize/configure + op('conf','configure site') + if @opt.cmd =~/R/ + if @opt.mod.inspect =~/--init(?:ialize)?=site/ and + @opt.cmd =~/RZ/ + Operations.new(@opt).remote_put_base_site_rsync_match + else Operations.new(@opt).remote_put_base_site_rsync + end + elsif @opt.cmd =~/r/ + if @opt.mod.inspect =~/--init(?:ialize)?=site/ and + @opt.cmd =~/CCr/ + Operations.new(@opt).remote_put_base_site_all + else Operations.new(@opt).remote_put_base_site + end + end + end + if @opt.cmd =~/F/ #% -F cgi sample search form + Operations.new(@opt).cgi + end + if @opt.cmd =~/W/; Operations.new(@opt).webrick #% -W webrick #@argv==port + end + if @opt.cmd =~/k/ #% -k dummy, build character encoding table + #Operations.new(@opt.cmd).encoding + end + if @opt.cmd =~/Z/; op('zap','Zap, deletions') #% -Z wipe previous output clean + end + if @opt.cmd =~/s/; op('share_src','SiSU markup source') #% -s sisu source + end + if @opt.cmd =~/m/ #% -m is remote url requested? (download if) + @retry_count= -1 + begin + path_image='./_sisu/processing/external_document/image' + path_skin='./_sisu/processing/external_document/skin/doc' + @get_s,@get_p=[],[] + re_s=/(http:\/\/\S+?\.sst)/ + re_p=/(http:\/\/\S+?(?:\/sisupod(?:\.zip)?|\.ssp))/ + @opt.files.each do |fns| + if fns =~re_s + @get_s << re_s.match(fns)[1] if re_s + end + if fns =~re_p + @get_p << re_p.match(fns)[1] if re_p + end + end + if @get_s.length > 0 #% remote markup file .sst + require 'open-uri' + require 'pp' + require SiSU_lib + '/composite' + @rgx_image=/\{\s*(\S+?\.(?:png|jpg|gif))/ + @rgx_skin=/^0~skin\s+(\S+)/ + threads = [] + for requested_page in @get_s + threads << Thread.new(requested_page) do |url| + open(url) do |f| + raise "#{url} not found" unless f + re_fnb=/(http:\/\/[^\/ ]+?\/[^\/ ]+?)\/\S+?\/([^\/]+?)\.ss(t)/ #revisit and remove DO + base_uri,fnb,instr=re_fnb.match(url)[1..3] if re_fnb + imagedir = base_uri + '/_sisu/image_local' #check on + doc_skin_dir = /(http:\/\/\S+?)\/[^\/]+?\.sst$/.match(url).captures.join + '/_sisu/skin/doc' + #"Got file, and ready to process: #{fnb}.t#{instr}" + downloaded_file=File.new("#{fnb}.-sst",'w+') + images=SiSU_Assemble::Remote_image.new.image(imagedir) + skin=SiSU_Assemble::Remote_image.new.image(doc_skin_dir) + f.collect.each do |r| # work area + skin << r.scan(@rgx_skin).uniq if r =~@rgx_skin + images << r.scan(@rgx_image).uniq if r =~@rgx_image + downloaded_file << r + end + if skin and skin.length > 0 + SiSU_Assemble::Remote_image.new.download_doc_skin(skin) + end + if images and images.length > 1 + images.flatten!.uniq! + @msg,@msgs='downloading images:', [ images.join(',') ] + @tell.call.warn unless @opt.cmd =~/q/ + SiSU_Assemble::Remote_image.new.download_images(images) + @msg,@msgs='downloading done',nil + @tell.call.warn unless @opt.cmd =~/q/ + end + downloaded_file.close + end + end + end + Operations.new.counter + end + threads.each {|thr| thr.join} if threads #and threads.length > 0 + if @get_p.length > 0 #% remote sisupod + require 'net/http' + for requested_pod in @get_p + pod_info=Remote_download.new(requested_pod) + @opt.fns=pod_info.pod.name + Net::HTTP.start(pod_info.pod.site) do |http| + resp = http.get("#{pod_info.pod.path}/#{pod_info.pod.name_source}") + open(pod_info.pod.name,'wb') do |file| + file.write(resp.body) + end + end + end + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt,@fns).error #ok + @retry_count +=1 + retry unless @retry_count > 1 + ensure + end + @opt.files=@opt.files.collect {|x| x=x.gsub(/http:\/\/\S+\/(\S+)\.sst/,'\1.-sst') } + end + if @opt.cmd=~/m/; op('dal','dal') #% -m dal + end + @opt.files=@opt.files.collect {|x| x=x.gsub(/\.ssm$/,'._sst') } + if @opt.cmd =~/S/ + op('sisupod_make','sisupod (zip)') #% -S make sisupod + if @opt.fns=~/\.kdi._sst/ + op('share_src_kdissert','kdissert (kdi)') #% -S share kdissert source + end + end + if @opt.cmd =~/N/; op('digests','digests') #% -N digest tree + end + if @opt.cmd =~/[hHz]/; op('html','html') #% -h -H -z html css + end + if @opt.cmd =~/[aAfeE]/; op('plaintext','plaintext') #% -a -A -f -e -E plaintext -a creates ms-dos type; -A creates unix type, plaintext file + end + if @opt.cmd =~/g/; op('wikispeak','wikispeak') #% -g wiki + end + if @opt.cmd =~/o/; op('odf','OpenDocument') #% -o opendocument + end + if @opt.cmd =~/x/; op('xml','xml sax') #% -x xml sax type + end + if @opt.cmd =~/X/; op('xml_dom','xml dom') #% -X xml dom type + end + if @opt.cmd =~/b/; op('xhtml','xhtml sax') #% -b xhtml sax type + end + if @opt.cmd =~/B/; op('docbook','docbook xml') #% -B docbook xml + end + if @opt.cmd =~/w/; op('concordance','Concordance') #% -w concordance + end + if @opt.cmd =~/t/ #% -t termsheet/standard form + SiSU_Help::Help.new('termsheet').help_request + @opt.files.each do |fns| + if FileTest.file?(fns) + @opt.fns=fns + case @opt.fns + when /\.(termsheet.rb)$/; Operations.new(@opt).termsheet + else #print "not processed --> ", fns, "\n" + end + else Operations.new(@opt).not_found + end + end + Operations.new.counter + end + if @opt.cmd =~/p/; op('texpdf','LaTeX pdf') #% -p latex/ texpdf + end + if @opt.cmd =~/I/; op('texinfo','TeX Info') #% -I texinfo (i taken by db import) + end + if @opt.cmd =~/D/ or @opt.mod.inspect =~/--pgsql/; op('dbi','postgresql') #% -D DB postgresql + end + if @opt.cmd =~/d/ or @opt.mod.inspect =~/--sqlite/; op('dbi','sqlite') #% -d DB sqlite + end + if @opt.cmd =~/G/; Operations.new(@opt).cgi #% -G cgi - used to make dbi intecface + end + if @opt.cmd =~/y/; op('manifest','Manifest') #% -y manifest + end + if @opt.cmd =~/Y/; op('sitemaps','Sitemap') #% -Y sitemap + end + if @opt.cmd =~/r/; op('remote_put','scp') #% -r copy to remote server + end + if @opt.cmd =~/R/; op('remote_put','rsync') #% -R copy to remote server + end + if @opt.cmd =~/[QuUvVM]/; op('urls','urls') #% -Q -u -v -V -M urls + end + @msg,@msgs="\tsisu -W [to start ruby web-server on output directory]\n",nil + @tell.call.print_brown if @opt.cmd =~/[uUvVM]/ unless @opt.files.join.empty? + if defined? @@env.path.processing and FileTest.directory?(@@env.path.processing) and @@env.path.processing =~/#{@@env.user}$/ #clean temporary processing directory of content as is located in public area + cd(@@env.path.processing_base_tmp) do + rm_rf(@@env.user) unless @opt.cmd =~/M/ + end + end + elsif @opt.mod.inspect =~/--query/ + require SiSU_lib + '/sst_identify_markup' + puts SiSU_Markup::Markup_history.new(@opt).query + elsif @opt.mod.inspect =~/--identify/ + require SiSU_lib + '/sst_identify_markup' + markup_version=SiSU_Markup::Markup_identify.new(@opt).markup_version? + elsif @opt.mod.inspect =~/--about/ #% help instructions + if @opt.mod.inspect =~/--about/ and not @opt.what.empty?; SiSU_Help::Help.new(@opt.what,'color_off').help_request + else SiSU_Help::Help.new('list','color_off').help_request + end + elsif @opt.mod.inspect =~/--sitemaps/ #% sitemaps + require SiSU_lib + '/sitemaps' + SiSU_Sitemaps::Source.new(@opt).read + if @opt.cmd =~/R/ + require SiSU_lib + '/remote_put' + SiSU_Remote::Put.new(@opt).rsync_sitemaps + end + else #% help instructions + unless @opt.mod.inspect =~/--convert|--to|--from/ + if @opt.mod.inspect =~/--help/ and not @opt.what.empty?; SiSU_Help::Help.new(@opt.what).help_request + else SiSU_Help::Help.new('list').help_request + end + end + end + @opt.files.each do |fns| + if FileTest.file?(fns) + @opt.fns=fns + unless @opt.fns =~ /(?:\.(?:[_-]?sst|ssp|sx[sdn]\.xml|termsheet.rb)|sisupod(?:\.zip)?)$/ + if @opt.fns=~/\.kdi$/ and @opt.mod.inspect =~/--(?:convert(?:-from)?|from)[=-]kdi/ + elsif @opt.fns=~/\.sx[sdn]\.xml$/ and @opt.mod.inspect =~/--(?:(?:convert(?:-from)?|from)[=-])?(?:xml2sst|sxml)/ + elsif @opt.fns=~/\.ssi$/ and @opt.mod.inspect =~/--identify/ + else Operations.new(@opt).not_recognised + end + end + if @opt.fns =~/\._sst$/ and @opt.cmd !~/[S_M]/ # rework necessry, revist, the _ flag is a hack, to keep ._sst files + @msg,@msgs='temporary file removed',nil + @tell.call.warn unless @opt.cmd =~/V/ + File.unlink(@opt.fns) if File.exists?(@opt.fns) #CONSIDER + end + else #Operations.new(fns,'html').not_found + end + end + end + end + begin #% select what to do + require 'jcode' + $KCODE='UTF8' + require SiSU_lib + '/options' + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Screen + require SiSU_lib + '/param' + include SiSU_Param + require SiSU_lib + '/defaults' + include SiSU_Viz + require SiSU_lib + '/help' + include SiSU_Help + require 'uri' + home=ENV['HOME'] + argv=$* + @opt=SiSU_commandline::Options.new(argv) + Processing.new(@opt).actions + rescue; STDERR.puts SiSU_Screen::Ansi.new(@opt,$!,$@,nil).rescue #fix + ensure + Dir.chdir(@@pwd) + end +end +__END__ diff --git a/lib/sisu/0.52/i18n.rb b/lib/sisu/0.52/i18n.rb new file mode 100644 index 00000000..311b90ee --- /dev/null +++ b/lib/sisu/0.52/i18n.rb @@ -0,0 +1,1528 @@ +=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 summary processing, available outputs and metadata + + * 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_Translate + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Param + class Source + def initialize(md,doc_lang,trans_str='') + @md,@doc_lang,@trans_str=md,doc_lang,trans_str + @lang_class=case @doc_lang + when /American/i; English.new(md,doc_lang,trans_str) # tag depreciated, see iso 639-2 + when /English/i; English.new(md,doc_lang,trans_str) + when /French/i; French.new(md,doc_lang,trans_str) + when /German/i; German.new(md,doc_lang,trans_str) + when /Italian/i; Italian.new(md,doc_lang,trans_str) + when /Spanish/i; Spanish.new(md,doc_lang,trans_str) + when /Brazilian(?: Portuguese)?/i; Portuguese.new(md,doc_lang,trans_str) # tag depreciated, see iso 639-2 + when /Portuguese/i; Portuguese.new(md,doc_lang,trans_str) + when /Swedish/i; Swedish.new(md,doc_lang,trans_str) + when /Danish/i; Danish.new(md,doc_lang,trans_str) + when /Finnish/i; Finnish.new(md,doc_lang,trans_str) + when /Norwegian/i; Norwegian.new(md,doc_lang,trans_str) + when /Icelandic/i; Icelandic.new(md,doc_lang,trans_str) + when /Dutch/i; Dutch.new(md,doc_lang,trans_str) + when /Estonian/i; Estonian.new(md,doc_lang,trans_str) + when /Hungarian/i; Hungarian.new(md,doc_lang,trans_str) + when /Polish/i; Polish.new(md,doc_lang,trans_str) + when /Romanian/i; Romanian.new(md,doc_lang,trans_str) + when /Russian/i; Russian.new(md,doc_lang,trans_str) + when /Greek/i; Greek.new(md,doc_lang,trans_str) + when /Ukranian/i; Ukranian.new(md,doc_lang,trans_str) + when /Turkish/i; Turkish.new(md,doc_lang,trans_str) + when /Slovenian/i; Slovenian.new(md,doc_lang,trans_str) + when /Croatian/i; Croatian.new(md,doc_lang,trans_str) + when /Slovak(?:ian)?/i; Slovak.new(md,doc_lang,trans_str) + when /Czech/i; Czech.new(md,doc_lang,trans_str) + when /Bulgarian/i; Bulgarian.new(md,doc_lang,trans_str) + else English.new(md,doc_lang,trans_str) + end + end + def filename + @lang_class.filename + end + def description + @lang_class.description + end + def metadata + @lang_class.metadata + end + def file_size + @lang_class.file_size + end + def sourcefile + @lang_class.sourcefile + end + def sourcefile_digest + @lang_class.sourcefile_digest + end + def dc_title + @lang_class.dc_title + end + def title + @lang_class.title + end + def subtitle + @lang_class.subtitle + end + def creator + @lang_class.creator + end + def contributor + @lang_class.contributor + end + def translator + @lang_class.translator + end + def illustrator + @lang_class.illustrator + end + def publisher + @lang_class.publisher + end + def prepared_by + @lang_class.prepared_by + end + def digitized_by + @lang_class.digitized_by + end + def subject + @lang_class.subject + end + def dc_description + @lang_class.dc_description + end + def abstract + @lang_class.abstract + end + def type + @lang_class.type + end + def rights + @lang_class.rights + end + def digitized_by + @lang_class.digitized_by + end + def date + @lang_class.date + end + def date_created + @lang_class.date_created + end + def date_available + @lang_class.date_available + end + def date_valid + @lang_class.date_valid + end + def date_modified + @lang_class.date_modified + end + def date_issued + @lang_class.date_issued + end + def language + @lang_class.language + end + def language_original + @lang_class.language_original + end + def format + @lang_class.format + end + def identifier + @lang_class.identifier + end + def source + @lang_class.source + end + def relation + @lang_class.relation + end + def coverage + @lang_class.coverage + end + def keywords + @lang_class.keywords + end + def comments + @lang_class.comments + end + def cls_loc + @lang_class.cls_loc + end + def cls_dewey + @lang_class.cls_dewey + end + def cls_gutenberg + @lang_class.cls_gutenberg + end + def cls_isbn + @lang_class.cls_isbn + end + def prefix_a + @lang_class.prefix_a + end + def prefix_b + @lang_class.prefix_b + end + def fns + @lang_class.fns + end + def word_count + @lang_class.word_count + end + def dgst + @lang_class.dgst + end + def sc_number + @lang_class.sc_number + end + def sc_date + @lang_class.sc_date + end + def last_generated + @lang_class.last_generated + end + def sisu_version + @lang_class.sisu_version + end + def ruby_version + @lang_class.ruby_version + end + def suggested_links + @lang_class.suggested_links + end + def language_version_list + @lang_class.language_version_list + end + def language + @lang_class.language + end + def manifest_description_output + @lang_class.manifest_description_output + end + def manifest_description_metadata + @lang_class.manifest_description_metadata + end + def language_list_translated + @lang_class.language_list + end + def language_list + lang=case @trans_str + when /American/i; 'American English' # tag depreciated, see iso 639-2 + when /English/i; 'English' + when /French/i; 'français' + when /German/i; 'Deutsch' + when /Italian/i; 'Italiano' + when /Spanish/i; 'español' + when /Brazilian(?: Portuguese)?/i; 'Brazilian Português' # tag depreciated, see iso 639-2 + when /Portuguese/i; 'Português' + when /Swedish/i; 'svenska' + when /Danish/i; 'dansk' + when /Finnish/i; 'suomi' + when /Norwegian/i; 'norsk' + when /Icelandic/i; 'Icelandic' + when /Dutch/i; 'Nederlands' + when /Estonian/i; 'Estonian' + when /Hungarian/i; 'Hungarian' + when /Polish/i; 'polski' + when /Romanian/i; 'română' + when /Russian/i; 'Русский (Russkij)' + when /Greek/i; 'Ελληνικά (Ellinika)' + when /Ukranian/i; 'українська (ukrajins\'ka)' + when /Turkish/i; 'Türkçe' + when /Slovenian/i; 'Slovenian' + when /Croatian/i; 'Croatian' + when /Slovak(?:ian)?/i; 'slovensky' #slovensky ? + when /Czech/i; 'česky' + when /Bulgarian/i; 'Български (Bəlgarski)' + when /Japanese/i; '日本語 (Nihongo)' + when /Korean/i; '한국어 (Hangul)' + #when /Catalan/i; 'català' + else 'English' + end + #check on 中文 and عربي + end + end + class English + def initialize(md,doc_lang,trans_str) + @md,@doc_lang,@trans_str=md,doc_lang,trans_str + end + def filename + 'filename' + end + def description + 'description' + end + def metadata + 'metadata' + end + def file_size + 'file size' + end + def dc_title + 'DC Title' + end + def title + 'Title' + end + def subtitle + 'Subtitle' + end + def creator + 'DC Creator' + end + def contributor + 'DC Contributor' + end + def translator + 'Translator' + end + def illustrator + 'Illustrator' + end + def publisher + 'DC Publisher' + end + def prepared_by + 'Prepared by' + end + def digitized_by + 'Digitized by' + end + def subject + 'DC Subject' + end + def dc_description + 'DC Description' + end + def abstract + 'DC Abstract' + end + def type + 'DC Type' + end + def rights + 'DC Rights' + end + def date + 'DC Date' + end + def date_created + 'DC Date created' + end + def date_issued + 'DC Date issued' + end + def date_available + 'DC Date available' + end + def date_modified + 'DC Date modified' + end + def date_valid + 'DC Date valid' + end + def language + 'DC Language' + end + def language_original + 'Original Language' + end + def format + 'DC Format' + end + def identifier + 'DC Identifier' + end + def source + 'DC Source' + end + def relation + 'DC Relation' + end + def coverage + 'DC Coverage' + end + def keywords + 'Keywords' + end + def comments + 'Comments' + end + def cls_loc + 'Classify Library of Congress' + end + def cls_dewey + 'Classify Dewey' + end + def cls_gutenberg + 'Classify Project Gutenberg' + end + def cls_isbn + 'Classify ISBN' + end + def prefix_a + 'Prefix (a)' + end + def prefix_b + 'Prefix (b)' + end + def sourcefile + 'Sourcefile' + end + def word_count + 'Word Count approximate' + end + def sourcefile_digest + 'Sourcefile Digest' + end + def digest_md5 + 'Sourcefile Digest (md5)' + end + def digest_sha256 + 'Sourcefile Digest (sha256)' + end + def sc_number + 'Document (RCS/CVS) number' + end + def sc_date + 'Document (RCS/CVS) number' + end + def last_generated + 'Document (metaverse) last generated' + end + def sisu_version + 'Generated by' + end + def ruby_version + 'Ruby version' + end + def suggested_links + 'metadata suggested links' + end + def language_version_list + 'Document Language Versions, manifests' + end + def manifest_description_output + 'SiSU manifest of generated output' + end + def manifest_description_metadata + 'SiSU manifest of document metadata' + end + def language_list_translated + lang=case @trans_str + when /American/i; 'American English' # tag depreciated, see iso 639-2 + when /English/i; 'English' + when /French/i; 'French' + when /German/i; 'German' + when /Italian/i; 'Italian' + when /Spanish/i; 'Spanish' + when /Brazilian(?: Portuguese)?/i; 'Brazilian Portuguese' # tag depreciated, see iso 639-2 + when /Portuguese/i; 'Portuguese' + when /Swedish/i; 'Swedish' + when /Danish/i; 'Danish' + when /Finnish/i; 'Finnish' + when /Norwegian/i; 'Norwegian' + when /Icelandic/i; 'Icelandic' + when /Dutch/i; 'Dutch' + when /Estonian/i; 'Estonian' + when /Hungarian/i; 'Hungarian' + when /Polish/i; 'Polish' + when /Romanian/i; 'Romanian' + when /Russian/i; 'Russian' + when /Greek/i; 'Greek' + when /Ukranian/i; 'Ukranian' + when /Turkish/i; 'Turkish' + when /Slovenian/i; 'Slovenian' + when /Croatian/i; 'Croatian' + when /Slovak(?:ian)?/i; 'Slovakian' + when /Czech/i; 'Czech' + when /Bulgarian/i; 'Bulgarian' + else @trans_str + end + end + end + class French + def initialize(md,doc_lang,trans_str) + @md,@doc_lang,@trans_str=md,doc_lang,trans_str + end + def filename + 'nom de fichier' + end + def description + 'description' + end + def metadata + 'metadonnées' + end + def file_size + 'taille' + end + def dc_title + 'Titre (DC)' + end + def title + 'Titre' + end + def subtitle + 'Sous titre' + end + def creator + 'Auteur (DC)' + end + def contributor + 'Contributeur (DC)' + end + def translator + 'Traducteur' + end + def illustrator + 'Illustrateur' + end + def publisher + 'Éditeur (DC)' + end + def prepared_by + 'Préparé par' + end + def digitized_by + 'Numérisé par' + end + def subject + 'Sujet (DC)' + end + def dc_description + 'Description (DC)' + end + def abstract + 'Résumé (DC)' + end + def type + 'Type (DC)' + end + def rights + 'Droits relatifs à la ressource (DC)' + end + def date + 'Date (DC)' + end + def date_created + 'Date de création (DC)' + end + def date_issued + 'Date de publication (DC)' + end + def date_available + 'Date de mise à disposition (DC)' + end + def date_modified + 'Date de modification (DC)' + end + def date_valid + 'Date de validité (DC)' + end + def language + 'Langue (DC)' + end + def language_original + 'Langue originale' + end + def format + 'Format (DC)' + end + def identifier + 'Identifiant (DC)' + end + def source + 'Source (DC)' + end + def relation + 'Lien (DC)' + end + def coverage + 'Portée du document (DC)' + end + def keywords + 'Mots clef' + end + def comments + 'Commentaires' + end + def cls_loc + 'Classification de la bibliothèque du congres' + end + def cls_dewey + 'Classification Dewey' + end + def cls_gutenberg + 'Classification du project Gutenberg' + end + def cls_isbn + 'Classification ISBN' + end + def prefix_a + 'Préfixe (a)' + end + def prefix_b + 'Préfixe (b)' + end + def sourcefile + 'Fichier source' + end + def word_count + 'Nombre approximatif de mots' + end + def sourcefile_digest + 'Condensé du fichier source' + end + def digest_md5 + 'Condensé du fichier source (md5)' + end + def digest_sha256 + 'Condensé du fichier source (sha256)' + end + def sc_number + 'Numéro (RCS/CVS) du document' + end + def sc_date + 'Numéro (RCS/CVS) du document' + end + def last_generated + 'Dernière production du document (metaverse)' + end + def sisu_version + 'Généré par' + end + def ruby_version + 'Version de Ruby' + end + def suggested_links + 'Liens suggérés' + end + def language_version_list + 'Versions des langues du document, manifestes' + end + def manifest_description_output + 'Manifeste SiSU du document généré' + end + def manifest_description_metadata + 'Manifeste SiSU des métadonnées du document' + end + def language_list_translated + lang=case @trans_str + when /American/i; 'Anglais americain' # tag depreciated, see iso 639-2 + when /English/i; 'Anglais' + when /French/i; 'Français' + when /German/i; 'Allemand' + when /Italian/i; 'Italien' + when /Spanish/i; 'Espagnol' + when /Brazilian(?: Portuguese)?/i; 'Portugais brésilien' # tag depreciated, see iso 639-2 + when /Portuguese/i; 'Portugais' + when /Swedish/i; 'Suédois' + when /Danish/i; 'Danois' + when /Finnish/i; 'Finnois' + when /Norwegian/i; 'Norvégien' + when /Icelandic/i; 'Islandais' + when /Dutch/i; 'Néerlandais' + when /Estonian/i; 'Estonien' + when /Hungarian/i; 'Hongrois' + when /Polish/i; 'Polonais' + when /Romanian/i; 'Roumain' + when /Russian/i; 'Russe' + when /Greek/i; 'Grec' + when /Ukranian/i; 'Ukrainien' + when /Turkish/i; 'Turc' + when /Slovenian/i; 'Slovène' + when /Croatian/i; 'Croate' + when /Slovak(?:ian)?/i; 'Slovaque' + when /Czech/i; 'Tcheque' + when /Bulgarian/i; 'Bulgare' + else @trans_str + end + end + end + class German + def initialize(md,doc_lang,trans_str) + @md,@doc_lang,@trans_str=md,doc_lang,trans_str + end + def filename + 'Dateiname' + end + def description + 'Beschreibung' + end + def metadata + 'Metadata' + end + def file_size + 'Dateigrösse' + end + def dc_title + 'DC Titel' + end + def title + 'Titel' + end + def subtitle + 'Untertitel' + end + def creator + 'Autor' + end + def contributor + 'DC Mitautor' + end + def translator + 'Übersetzung' + end + def illustrator + 'Illustrator' + end + def publisher + 'Herausgeber' + end + def prepared_by + 'gesetzt von' + end + def digitized_by + 'digitalisiert von' + end + def subject + 'Titel' + end + def dc_description + 'Beschreibung' + end + def abstract + 'DC Abstract' + end + def type + 'Typ' + end + def rights + 'Rechte' + end + def date + 'Datum' + end + def date_created + 'Erstellung' + end + def date_issued + 'Herausgabe' + end + def date_available + 'Veröffentlichung' + end + def date_modified + 'Modifikation' + end + def date_valid + 'Gültigkeit' + end + def language + 'Sprache' + end + def language_original + 'Ursprungssprache' + end + def format + 'DC Format' + end + def identifier + 'DC Bezeichnung' + end + def source + 'DC Quelle' + end + def relation + 'DC Beziehung' + end + def coverage + 'DC Eingrenzung' + end + def keywords + 'Schlüsselwörter' + end + def comments + 'Kommentare' + end + def cls_loc + 'Klassifikation nach Library of Congress' + end + def cls_dewey + 'Klassifikation nach Dewey' + end + def cls_gutenberg + 'Klassifikation nach Projekt Gutenberg' + end + def cls_isbn + 'Klassifikation nach ISBN' + end + def prefix_a + 'Präfix (a)' + end + def prefix_b + 'Präfix (b)' + end + def sourcefile + 'Quelldatei' + end + def word_count + 'Anzahl Wörter' + end + def sourcefile_digest + 'Quelldatei Digest' + end + def digest_md5 + 'Prüfsumme der Quelldatei (MD5)' + end + def digest_sha256 + 'Prüfsumme der Quelldatei (SHA256)' + end + def sc_number + 'Dokumentversion (RCS/CVS)' + end + def sc_date + 'Dokumentdatum (RCS/CVS)' + end + def last_generated + 'Letzte Erstellung (metaverse)' + end + def sisu_version + 'erstellt bei' + end + def ruby_version + 'Ruby Version' + end + def suggested_links + 'empfohlene Links' + end + def language_version_list + 'verfügbare Sprachen' + end + def manifest_description_output + 'SiSU Zusammenfassung des Dokumentes' + end + def manifest_description_metadata + 'SiSU Zusammenfassung der Metadaten' + end + def language_list_translated + lang=case @trans_str + when /American/i; 'Amerikanisch-Englisch' # tag depreciated, see iso 639-2 + when /English/i; 'Englisch' + when /French/i; 'Französisch' + when /German/i; 'Deutsch' + when /Italian/i; 'Italienisch' + when /Spanish/i; 'Spanisch' + when /Brazilian(?: Portuguese)?/i; 'Brasilianisch-Portugiesisch' # tag depreciated, see iso 639-2 + when /Portuguese/i; 'Portugiesisch' + when /Swedish/i; 'Schwedisch' + when /Danish/i; 'Dänisch' + when /Finnish/i; 'Finnisch' + when /Norwegian/i; 'Norwegisch' + when /Icelandic/i; 'Isländisch' + when /Dutch/i; 'Niederländisch' + when /Estonian/i; 'Estnisch' + when /Hungarian/i; 'Ungarisch' + when /Polish/i; 'Polnisch' + when /Romanian/i; 'Rumänisch' + when /Russian/i; 'Russisch' + when /Greek/i; 'Griechisch' + when /Ukranian/i; 'Ukrainisch' + when /Turkish/i; 'Türkisch' + when /Slovenian/i; 'Slovenisch' + when /Croatian/i; 'Kroatisch' + when /Slovak(?:ian)?/i; 'Slovakisch' + when /Czech/i; 'Tschechisch' + when /Bulgarian/i; 'Bulgarisch' + else @trans_str + end + end + end + class Spanish + def initialize(md,doc_lang,trans_str) + @md,@doc_lang,@trans_str=md,doc_lang,trans_str + end + def filename + 'nombre del fichero' + end + def description + 'descripción' + end + def metadata + 'metadatos' + end + def file_size + 'tamaño del fichero' + end + def dc_title + 'Título DC' + end + def title + 'Título' + end + def subtitle + 'Subtítulo' + end + def creator + 'Creador DC' + end + def contributor + 'Contribuidor DC' + end + def translator + 'Traductor' + end + def illustrator + 'Ilustrador' + end + def publisher + 'Editor DC' + end + def prepared_by + 'Preparado por' + end + def digitized_by + 'Digitalizado por' + end + def subject + 'Asunto DC' + end + def dc_description + 'Descripción DC' + end + def abstract + 'Resumen DC' + end + def type + 'Tipo DC' + end + def rights + 'Derechos DC' + end + def date + 'Fecha DC' + end + def date_created + 'Fecha de creación DC' + end + def date_issued + 'Fecha de publicación DC' + end + def date_available + 'Fecha de disponibilidad DC' + end + def date_modified + 'Fecha de modificación DC' + end + def date_valid + 'Fecha de valided DC' + end + def language + 'Idioma DC' + end + def language_original + 'Lenguaje original' + end + def format + 'Formato DC' + end + def identifier + 'Identificador DC' + end + def source + 'Fuente DC' + end + def relation + 'Relación DC' + end + def coverage + 'Cobertura DC' + end + def keywords + 'Palabras claves' + end + def comments + 'Comentarios' + end + def cls_loc + 'Clasificación Biblioteca del Congreso' + end + def cls_dewey + 'Clasificación Dewey' + end + def cls_gutenberg + 'Clasificación Proyecto Gutenberg' + end + def cls_isbn + 'Clasificación ISBN' + end + def prefix_a + 'Prefijo (a)' + end + def prefix_b + 'Prefijo (b)' + end + def sourcefile + 'Fichero fuente' + end + def word_count + 'Número de palabras apróximado' + end + def sourcefile_digest + 'Resumen del fichero fuente' + end + def digest_md5 + 'Resumen del fichero fuente (md5)' + end + def digest_sha256 + 'Resumen del fichero fuente (sha256)' + end + def sc_number + 'Versión (RCS/CVS) del documento' + end + def sc_date + 'Versión (RCS/CVS) del documento' + end + def last_generated + 'Última generación (metaverse) del documento' + end + def sisu_version + 'Generado por' + end + def ruby_version + 'Versión de Ruby' + end + def suggested_links + 'enlaces sugeridos de metadatos' + end + def language_version_list + 'Document Language Versions, manifests' + end + def manifest_description_output + 'Manifiesto SiSU de salida generada' + end + def manifest_description_metadata + 'Manifiesto SiSU de metadatos de documento' + end + def language_list_translated + lang=case @trans_str + when /American/i; 'Inglés Americano' # tag depreciated, see iso 639-2 + when /English/i; 'Inglés' + when /French/i; 'Francés' + when /German/i; 'Alemán' + when /Italian/i; 'Italiano' + when /Spanish/i; 'Español' + when /Brazilian(?: Portuguese)?/i; 'Portugués de Brasil' # tag depreciated, see iso 639-2 + when /Portuguese/i; 'Portugués' + when /Swedish/i; 'Sueco' + when /Danish/i; 'Danés' + when /Finnish/i; 'Finés' + when /Norwegian/i; 'Noruego' + when /Icelandic/i; 'Islandés' + when /Dutch/i; 'Holandés' + when /Estonian/i; 'Estonio' + when /Hungarian/i; 'Húngaro' + when /Polish/i; 'Polaco' + when /Romanian/i; 'Rumano' + when /Russian/i; 'Ruso' + when /Greek/i; 'Griego' + when /Ukranian/i; 'Ucraniano' + when /Turkish/i; 'Turco' + when /Slovenian/i; 'Eslovaco' + when /Croatian/i; 'Croata' + when /Slovak(?:ian)?/i; 'Eslovaco' + when /Czech/i; 'Checo' + when /Bulgarian/i; 'Búlgaro' + else @trans_str + end + end + end + class Italian + def initialize(md,doc_lang,trans_str) + @md,@doc_lang,@trans_str=md,doc_lang,trans_str + end + def filename + 'nome del file' + end + def description + 'descrizione' + end + def metadata + 'metadati' + end + def file_size + 'dimensione' + end + def dc_title + 'Titolo (DC)' + end + def title + 'Titolo' + end + def subtitle + 'Sottotitolo' + end + def creator + 'Autore (DC)' + end + def contributor + 'Contributore (DC)' + end + def translator + 'Traduttore' + end + def illustrator + 'Illustratore' + end + def publisher + 'Casa editrice (DC)' + end + def prepared_by + 'Preparato da' + end + def digitized_by + 'Convertito in digitale da' + end + def subject + 'Oggetto (DC)' + end + def dc_description + 'Descrizione (DC)' + end + def abstract + 'Abstract (DC)' + end + def type + 'Tipo (DC)' + end + def rights + 'Diritti del lettore (DC)' + end + def date + 'Data (DC)' + end + def date_created + 'Data di creazione (DC)' + end + def date_issued + 'Data di pubblicazione (DC)' + end + def date_available + 'Data di effettiva disponibilità (DC)' + end + def date_modified + 'Data di ultima modifica (DC)' + end + def date_valid + 'Data di inizo validità (DC)' + end + def language + 'Lingua (DC)' + end + def language_original + 'Lingua originale' + end + def format + 'Formato (DC)' + end + def identifier + 'Indentificatore (DC)' + end + def source + 'Fonte (DC)' + end + def relation + 'Collegamento (DC)' + end + def coverage + 'Ambito (DC)' + end + def keywords + 'Parole chiave' + end + def comments + 'Commenti' + end + def cls_loc + 'Classificazione della Library of Congress' + end + def cls_dewey + 'Classificazione Dewey' + end + def cls_gutenberg + 'Classificazione del Progetto Gutenberg' + end + def cls_isbn + 'Numero ISBN' + end + def prefix_a + 'Premessa (a)' + end + def prefix_b + 'Premessa (b)' + end + def sourcefile + 'Sorgente' + end + def word_count + 'Numero approssimativo di parole' + end + def sourcefile_digest + 'Checksum file sorgente' + end + def digest_md5 + 'Checksum file sorgente (md5)' + end + def digest_sha256 + 'Checksum file sorgente (sha256)' + end + def sc_number + 'Numero di revisione (RCS/CVS)' + end + def sc_date + 'Numero di revisione (RCS/CVS)' + end + def last_generated + 'Data di ultima generazione (dal metaverse)' + end + def sisu_version + 'Generato da' + end + def ruby_version + 'Ruby versione' + end + def suggested_links + 'Link suggeriti' + end + def language_version_list + 'Traduzioni disponibili' + end + def manifest_description_output + 'Inventario SiSU dell\'output generato' + end + def manifest_description_metadata + 'Inventario SiSU dei metadati' + end + def language_list_translated + lang=case @trans_str + when /American/i; 'Inglese USA' # tag depreciated, see iso 639-2 + when /English/i; 'Inglese' + when /French/i; 'Francese' + when /German/i; 'Tedesco' + when /Italian/i; 'Italiano' + when /Spanish/i; 'Spagnolo' + when /Brazilian(?: Portuguese)?/i; 'Portoguese (Brasile)' # tag depreciated, see iso 639-2 + when /Portuguese/i; 'Portoguese' + when /Swedish/i; 'Svedese' + when /Danish/i; 'Danese' + when /Finnish/i; 'Finlandese' + when /Norwegian/i; 'Norvegese' + when /Icelandic/i; 'Islandese' + when /Dutch/i; 'Olandese' + when /Estonian/i; 'Estone' + when /Hungarian/i; 'Ungherese' + when /Polish/i; 'Polacco' + when /Romanian/i; 'Romeno' + when /Russian/i; 'Russo' + when /Greek/i; 'Greco' + when /Ukranian/i; 'Ucraino' + when /Turkish/i; 'Turco' + when /Slovenian/i; 'Sloveno' + when /Croatian/i; 'Croato' + when /Slovak(?:ian)?/i; 'Slovacco' + when /Czech/i; 'Ceco' + when /Bulgarian/i; 'Bulgaro' + else @trans_str + end + end + end + class Finnish + def initialize(md,doc_lang,trans_str) + @md,@doc_lang,@trans_str=md,doc_lang,trans_str + end + def filename + 'tiedostonimi' + end + def description + 'kuvaus' + end + def metadata + 'metadata' + end + def file_size + 'tiedoston koko' + end + def dc_title + 'DC-otsikko' + end + def title + 'Otsikko' + end + def subtitle + 'Alaotsikko' + end + def creator + 'DC-tekijä' + end + def contributor + 'DC-osallistuja' + end + def translator + 'Kääntäjä' + end + def illustrator + 'Kuvittaja' + end + def publisher + 'DC-julkaisija' + end + def prepared_by + 'Valmistaja' + end + def digitized_by + 'Digitalisoinut' + end + def subject + 'DC-aihe' + end + def dc_description + 'DC-kuvaus' + end + def abstract + 'DC-tiivistelmä' + end + def type + 'DC-tyyppi' + end + def rights + 'DC-oikeudet' + end + def date + 'DC-päiväys' + end + def date_created + 'DC-luontipäivä' + end + def date_issued + 'DC-julkaisupäivä' + end + def date_available + 'DC-saantipäivä' + end + def date_modified + 'DC-muokkauspäivä' + end + def date_valid + 'DC-kelpoisuuspäivä' + end + def language + 'DC-kieli' + end + def language_original + 'Alkuperäiskieli' + end + def format + 'DC-muoto' + end + def identifier + 'DC-tunnus' + end + def source + 'DC-lähde' + end + def relation + 'DC-suhde' + end + def coverage + 'DC-kattavuus' + end + def keywords + 'Avainsanat' + end + def comments + 'Kommentit' + end + def cls_loc + 'Classify Library of Congress' + end + def cls_dewey + 'Classify Dewey' + end + def cls_gutenberg + 'Classify Project Gutenberg' + end + def cls_isbn + 'Classify ISBN' + end + def prefix_a + 'Prefix (a)' + end + def prefix_b + 'Prefix (b)' + end + def sourcefile + 'Lähdetiedosto' + end + def word_count + 'Arvioitu sanamäärä' + end + def sourcefile_digest + 'Lähdetiedoston tiiviste' + end + def digest_md5 + 'Lähdetiedoston tiiviste (md5)' + end + def digest_sha256 + 'Lähdetiedoston tiiviste (sha256)' + end + def sc_number + 'Dokumentin RCS/CVS-numero' + end + def sc_date + 'Dokumentin RCS/CVS-päiväys' + end + def last_generated + 'Viimeksi tuotettu dokumentti (metaverse)' + end + def sisu_version + 'Generoinut' + end + def ruby_version + 'Ruby-versio' + end + def suggested_links + 'metadatan ehdottamat linkit' + end + def language_version_list + 'Dokumentin kieliversiot, manifestit' + end + def manifest_description_output + 'Tuotetun tuloksen SISU-manifesti' + end + def manifest_description_metadata + 'Dokumenttimetadatan SISU-manifesti' + end + def language_list_translated + lang=case @trans_str + when /American/i; 'Amerikanenglanti' # tag depreciated, see iso 639-2 + when /English/i; 'Englanti' + when /French/i; 'Ranska' + when /German/i; 'Saksa' + when /Italian/i; 'Italia' + when /Spanish/i; 'Espanja' + when /Brazilian(?: Portuguese)?/i; 'Brasilian portugali' # tag depreciated, see iso 639-2 + when /Portuguese/i; 'Portugali' + when /Swedish/i; 'Ruotsi' + when /Danish/i; 'Tanska' + when /Finnish/i; 'Suomi' + when /Norwegian/i; 'Norja' + when /Icelandic/i; 'Islanti' + when /Dutch/i; 'Hollanti' + when /Estonian/i; 'Viro' + when /Hungarian/i; 'Unkari' + when /Polish/i; 'Puola' + when /Romanian/i; 'Romania' + when /Russian/i; 'Venäjä' + when /Greek/i; 'Kreikka' + when /Ukranian/i; 'Ukraina' + when /Turkish/i; 'Turkki' + when /Slovenian/i; 'Slovenia' + when /Croatian/i; 'Kroatia' + when /Slovak(?:ian)?/i; 'Slovakki' + when /Czech/i; 'Tsekki' + when /Bulgarian/i; 'Bulgaria' + else @trans_str + end + end + end + class Porguguese < English + end + class Swedish < English + end + class Danish < English + end + class Norwegian < English + end + class Icelandic < English + end + class Dutch < English + end + class Estonian < English + end + class Hungarian < English + end + class Polish < English + end + class Romanian < English + end + class Russian < English + end + class Greek < English + end + class Ukranian < English + end + class Turkish < English + end + class Croatian < English + end + class Slovakian < English + end + class Czech < English + end + class Bulgarian < English + end +end +__END__ diff --git a/lib/sisu/0.52/manifest.rb b/lib/sisu/0.52/manifest.rb new file mode 100644 index 00000000..3bc04235 --- /dev/null +++ b/lib/sisu/0.52/manifest.rb @@ -0,0 +1,528 @@ +=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 summary processing, available outputs and metadata + + * 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_Manifest + require SiSU_lib + '/sysenv' + require SiSU_lib + '/i18n' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + class Source + def initialize(opt) + @opt=opt + l=SiSU_Env::Standardise_language.new.file_to_language(@opt.fns) + @doc_language=l[:l] + end + def read + begin + @env=SiSU_Env::Info_env.new(@opt.fns) + @md=SiSU_Param::Parameters.new(@opt).get + SiSU_Env::Info_skin.new(@md).select + xbrowser=@env.program.web_browser + browser=@env.program.console_web_browser + webserv_url=@env.path.url.output_tell + url_html="#{webserv_url}/#{@md.fnb}/#{@md.fn[:manifest]}" + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Manifest',"#{xbrowser} #{url_html}") + tell.green_hi_blue unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"#{browser} #{url_html}") + tell.grey_tab if @opt.cmd =~/v/i + Output_Info.new(@md).check_output + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + private + class Output_Info <Source + def initialize(md) + @manifest={ :txt=>[],:html=>[] } + @md,@fns=md + @env=SiSU_Env::Info_env.new(@md.fns) + @fnb=@md.fnb + out=@env.path.output + @base_url="#{@env.url.root}/#@fnb" + @base_path="#{out}/#@fnb" + @@dg ||=SiSU_Env::Info_env.new.digest.type + @dg=@@dg + l=SiSU_Env::Standardise_language.new.file_to_language(@md.fns) + @language=l[:l] + @translate=SiSU_Translate::Source.new(@md,@language) + end + def output + SiSU_Env::SiSU_file.new(@md).mkdir + manifest=SiSU_Env::SiSU_file.new(@md,@md.fn[:manifest]).mkfile + @manifest[:html].each do |x| + manifest << x + end + end + def summarize(id,file) + size=(File.size("#{@base_path}/#{file}")/1024.00).to_s + kb=/([0-9]+\.[0-9]{0,1})/m.match(size)[1] + @manifest[:txt] << "#{file} #{id} #{kb}\n" + @manifest[:html] << %{<tr><th class="left"><p class="bold"><a href="#{file}">#{file}</a></p></th><td><p class="norm">#{id}</p><p class="tiny"><a href="#@base_url/#{file}">#@base_url/#{file}</a></p></td><td class="right"><p class="right">#{kb}</p></td></tr>\n} + end + def summarize_source(id,file) + sys=SiSU_Env::System_call.new + dgst =if @dg =~/^sha(?:2|256)$/; sys.sha256("#{@base_path}/#{file}") + else sys.md5("#{@base_path}/#{file}") + end + tell=SiSU_Screen::Ansi.new(@md.cmd,"#{dgst[1]} #{file}") + tell.warn if @md.cmd =~/[vVM]/ + size=(File.size("#{@base_path}/#{file}")/1024.00).to_s + kb=/([0-9]+\.[0-9]{0,1})/m.match(size)[1] + @manifest[:txt] << "#{file} #{id} #{kb}\n" + @manifest[:html] << %{<tr><th class="left"><p class="tiny">#{id}:</p> <p class="norm"><a href="#{file}">#{file}</a></p><p class="tiny"><a href="#@base_url/#{file}">#@base_url/#{file}</a></p></th><td class="right"><p class="tiny">#{dgst[1]}</p></td><td class="right"><p class="right">#{kb}</p></td></tr>\n} + end + def languages(id,file) + flv=@env.published_manifests?(@base_path) + @manifest[:html] << %{<tr><th class="left"><div id="horizontal_links"><ul id="horizontal">\n} + flv.each do |l| + lang=SiSU_Translate::Source.new(@md,@language,l[:l]).language_list + @manifest[:txt] << "#{l[:m]} #{lang}\n" + @manifest[:html] << %{<li class="norm"><a href="#{l[:m]}">#{lang}</a> </li>} + end + @manifest[:html] << %{</ul></div></th></tr>\n} + end + def published_languages(id,file) + flv=@env.published_manifests?(@base_path) + flv.each do |l| + lang=SiSU_Translate::Source.new(@md,@language,l[:l]).language_list + @manifest[:txt] << "#{l[:m]} #{lang}\n" + @manifest[:html] << %{<tr><th class="left"><p class="bold"><a href="#{l[:m]}">#{lang}</a></p></th><td><p class="norm">#{lang}</p><p class="tiny"><a href="#@base_url/#{l[:m]}">#@base_url/#{l[:m]}</a></p></td><td class="right"><p class="right"> </p></td></tr>\n} + end + end + def metadata(id,info) + @manifest[:html] << %{<tr><th class="left"><p class="bold">#{id}:</p></th><td><p class="left">#{info}</p></td></tr>\n} + end + def links(url,lnk,target) + static=if url =~/^\.\//; url.gsub(/^\.(\.)?/,@base_url) + elsif url =~/^\.\.\//; url.gsub(/^\.(\.)?/,@env.url.root) + else url + end + @manifest[:html] << %{<tr><th class="left"><p class="norm"><a href="#{url}">#{lnk}</a></p><p class="tiny"><a href="#{static}">#{static}</a></p></th></tr>\n} + end + def output_tests + if FileTest.file?("#@base_path/#{@md.fn[:toc]}")==true + id,file='HTML table of contents (linked to segmented text)',@md.fn[:toc] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:doc]}")==true + id,file='HTML document (scroll)',@md.fn[:doc] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:xhtml]}")==true + id,file='XHTML',@md.fn[:xhtml] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:sax]}")==true + id,file='XML (SAX)',@md.fn[:sax] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:dom]}")==true + id,file='XML (DOM)',@md.fn[:dom] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:odf]}")==true + id,file='ODF:ODT (Open Document Format)',@md.fn[:odf] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:pdf_p]}")==true + id,file='PDF (portrait) - print bias',@md.fn[:pdf_p] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:pdf_l]}")==true + id,file='PDF (landscape) - screen view bias (colored links)',@md.fn[:pdf_l] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:plain]}")==true + if @md.cmd =~/a/; id,file='plaintext Unix (UTF-8) (footnotes)',@md.fn[:plain] + elsif @md.cmd =~/e/; id,file='plaintext Unix (UTF-8) (endnotes)',@md.fn[:plain] + elsif @md.cmd =~/A/; id,file='plaintext dos (UTF-8) (footnotes)',@md.fn[:plain] + elsif @md.cmd =~/E/; id,file='plaintext dos (UTF-8) (endnotes)',@md.fn[:plain] + else id,file='plaintext (UTF-8)',@md.fn[:plain] + end + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:concordance]}")==true + id,file='Concordance (wordmap)',@md.fn[:concordance] + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fns}.tex")==true + id,file='LaTeX (portrait)',"#{@md.fns}.tex" + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fns}.tex")==true + id,file='LaTeX (landscape)',"#{@md.fns}.landscape.tex" + summarize(id,file) + end + if FileTest.file?("#@base_path/#{@md.fn[:digest]}")==true + id,file="Digest/DCC - Document Content Certificate (#@dg)",@md.fn[:digest] + summarize(id,file) + end + end + def published_versions + if FileTest.file?("#@base_path/sisu_manifest.html")==true + id,file='Markup (SiSU source)',@md.fns + languages(id,file) + end + end + def language_versions + if FileTest.file?("#@base_path/sisu_manifest.html")==true + id,file='Markup (SiSU source)',@md.fns + published_languages(id,file) + end + end + def source_tests + if @md.fns =~/\._sst$/ #% decide whether to extract and include requested/required documents + req=@md.fns.gsub(/(.+)?\._sst$/,'\1.composite.sst') #watch strange + if FileTest.file?("#@base_path/#{req}")==true + id,file='Markup Composite File (SiSU source)',req + summarize_source(id,file) + end + end + if FileTest.file?("#@base_path/#{@md.fns}")==true + id,file='Markup (SiSU source)',@md.fns + summarize_source(id,file) + end + if FileTest.file?("#@base_path/sisupod.zip")==true + id,file='SiSU doc (zip)','sisupod.zip' + summarize_source(id,file) + end + if FileTest.file?("#@base_path/#{@md.fnb}")==true and @md.fnb =~/\.kdi$/ + id,file='Kdissert (.kdi source)',@md.fnb + summarize_source(id,file) + end + end + def metadata_tests + if @md.dc_title + id,info=@translate.dc_title,@md.dc_title + metadata(id,info) + end + if @md.title + id,info=@translate.title,@md.title + metadata(id,info) + end + if @md.subtitle + id,info=@translate.subtitle,@md.subtitle + metadata(id,info) + end + if @md.dc_creator + id,info=@translate.creator,@md.dc_creator + metadata(id,info) + end + if @md.dc_contributor + id,info=@translate.contributor,@md.dc_contributor + metadata(id,info) + end + if @md.translator + id,info=@translate.translator,@md.translator + metadata(id,info) + end + if @md.illustrator + id,info=@translate.illustrator,@md.illustrator + metadata(id,info) + end + if @md.dc_publisher + id,info=@translate.publisher,@md.dc_publisher + metadata(id,info) + end + if @md.prepared_by + id,info=@translate.prepared_by,@md.prepared_by + metadata(id,info) + end + if @md.digitized_by + id,info=@translate.digitized_by,@md.digitized_by + metadata(id,info) + end + if @md.dc_subject + id,info=@translate.subject,@md.dc_subject + metadata(id,info) + end + if @md.dc_description + id,info=@translate.dc_description,@md.dc_description + metadata(id,info) + end + if @md.abstract + id,info=@translate.abstract,@md.abstract + metadata(id,info) + end + if @md.dc_type + id,info=@translate.type,@md.dc_type + metadata(id,info) + end + if @md.dc_rights + id,info=@translate.rights,@md.dc_rights + metadata(id,info) + end + if @md.dc_date + id,info=@translate.date,@md.dc_date + metadata(id,info) + end + if @md.dc_date_created + id,info=@translate.date_created,@md.dc_date_created + metadata(id,info) + end + if @md.dc_date_issued + id,info=@translate.date_issued,@md.dc_date_issued + metadata(id,info) + end + if @md.dc_date_available + id,info=@translate.date_available,@md.dc_date_available + metadata(id,info) + end + if @md.dc_date_modified + id,info=@translate.date_modified,@md.dc_date_modified + metadata(id,info) + end + if @md.dc_date_valid + id,info=@translate.date_valid,@md.dc_date_valid + metadata(id,info) + end + if @md.dc_language and @md.dc_language[:name] + id,info=@translate.language,@md.dc_language[:name] + metadata(id,info) + end + if @md.language_original and @md.language_original[:name] + id,info=@translate.language_original,@md.language_original[:name] + metadata(id,info) + end + if @md.dc_format + id,info=@transate.format,@md.dc_format + metadata(id,info) + end + if @md.dc_identifier + id,info=@translate.identifier,@md.dc_identifier + metadata(id,info) + end + if @md.dc_source + id,info=@translate.source,@md.dc_source + metadata(id,info) + end + if @md.dc_relation + id,info=@translate.relation,@md.dc_relation + metadata(id,info) + end + if @md.dc_coverage + id,info=@translate.coverage,@md.dc_coverage + metadata(id,info) + end + if @md.keywords + id,info=@translate.keywords,@md.keywords + metadata(id,info) + end + if @md.comments + id,info=@translate.comments,@md.comments + metadata(id,info) + end + if @md.cls_loc + id,info=@translate.cls_loc,@md.cls_loc + metadata(id,info) + end + if @md.cls_dewey + id,info=@translate.cls_dewey,@md.cls_dewey + metadata(id,info) + end + if @md.cls_pg + id,info=@translate.cls_gutenberg,@md.cls_pg + metadata(id,info) + end + if @md.cls_isbn + id,info=@translate.cls_isbn,@md.cls_isbn + metadata(id,info) + end + if @md.prefix_a + id,info=@translate.prefix_a,@md.prefix_a + metadata(id,info) + end + if @md.prefix_b + id,info=@translate.prefix_b,@md.prefix_b + metadata(id,info) + end + if @md.fns + id,info=@translate.sourcefile,@md.fns + metadata(id,info) + 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]})" + metadata(id,info) + end + if @md.wc_words + id,info=@translate.word_count,@md.wc_words + metadata(id,info) + end + if @md.dgst + id,info="#{@translate.sourcefile_digest} (#@dg)",@md.dgst[1] + metadata(id,info) + end + if @md.sc_number + id,info=@translate.sc_number,@md.sc_number + metadata(id,info) + end + if @md.sc_date + id,info=@translate.sc_date,"#{@md.sc_date} at #{@md.sc_time}" + metadata(id,info) + end + if @md.generated + id,info=@translate.last_generated,@md.generated + metadata(id,info) + end + if @md.sisu_version + id,info=@translate.sisu_version,"#{@md.sisu_version[:project]} #{@md.sisu_version[:version]} #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" + metadata(id,info) + end + if @md.ruby_version + id,info=@translate.ruby_version,@md.ruby_version + metadata(id,info) + end + end + def links_tests + if defined? @md.lnk and @md.lnk + @md.lnk.each do |l| + if defined? l[:say] + target=if l[:url] !~/^\.(\.)?\//; 'external' + else '_top' + end + url,lnk=l[:url],l[:say] + unless url.nil? or url.empty?; links(url,lnk,target) + end + end + end + end + end + def check_output + begin + id,file='','' + vz=SiSU_Env::Get_init.instance.skin + #vz=SiSU_Viz::Skin.new + banner_table=if vz.banner_home_button_only !~ /http:\/\/www\.jus\.uio\.no\/sisu/ and vz.banner_home_button_only !~ /sisu\.home\.png/ +<<WOK +<table summary="band" width="100%" border="0" cellpadding="3" cellspacing="0"> +<tr><td align="left" bgcolor="#ffffff">#{vz.banner_home_button}</td><td width="60%"><p class="tiny"><a href="#@base_url/#{file}"><img border="0" height="12" width="12" src="#{vz.url_path_image}/bullet_red.png" alt="TOC linked" /> #@base_url/#{file}</a></p></td><td width="20%">#{@env.widget_static.search_form}</td><td><a href="http://www.jus.uio.no/sisu/" target="_top"><img border="0" src="#{vz.url_path_image}/sisu.png" alt="SiSU -->" /></a></td></tr> +</table> +WOK + else +<<WOK +<table summary="band" border="0" cellpadding="3" cellspacing="0"> +<tr><td align="left" bgcolor="#ffffff"><a href="http://www.jus.uio.no/sisu/" target="_top"><img border="0" src="#{vz.url_path_image}/sisu.png" alt="SiSU -->" /></a></td><td><p class="tiny"><a href="#@base_url/#{file}"><img border="0" height="12" width="12" src="#{vz.url_path_image}/bullet_red.png" alt="TOC linked" /> #@base_url/#{file}</a></p></td><td>#{@env.widget_static.search_form}</td></tr> +</table> +WOK + end + @manifest[:html] <<<<WOK +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title> +SiSU manifest: #{@md.title} +</title> +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +<meta name="sourcefile" content="#{@md.fns}" /> +<link rel="generator" href="http://www.jus.uio.no/sisu" /> +<link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> +<link rel="stylesheet" href="../#{@env.path.style}/html.css" type="text/css" /> +</head> +<body bgcolor="#ffffff" text="#000000" link="#003090" lang="en" xml:lang="en"> +#{banner_table} +<h1 class="small">#{@md.dc_title}</h1> +<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> +WOK + published_versions + @manifest[:html] << '</table>' + @manifest[:html] <<<<WOK +<h2 class="small"><a name="output">#{@translate.manifest_description_output}</a></h2> +<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> +<tr> <th class="left"><p class="bold">#{@translate.filename}</p></th><th class="left"><p class="bold">#{@translate.description}</p></th><th class="right"><p class="right"><b>#{@translate.file_size}</b></p><p class="tiny_right">(kB)</p></th></tr> + +WOK + output_tests + @manifest[:html] << '</table>' + @manifest[:html] <<<<WOK +<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> +WOK + source_tests + @manifest[:html] << '</table>' + @manifest[:html] <<<<WOK +<h2 class="small"><a name="metadata">#{@translate.manifest_description_metadata}</a></h2> +<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> +<tr> <th class="left"><p class="bold">#{@translate.metadata}</p></th><th class="left"><p class="bold">#{@translate.description}</p></th></tr> +WOK + metadata_tests + @manifest[:html] <<<<WOK +</table> +WOK + @manifest[:html] <<<<WOK +<table summary="normal text css" width="90%" border="0" bgcolor="white" cellpadding="2" align="center"> +<tr><th class="left"><p class="bold"><a name="links">#{@translate.suggested_links}:</a></p></th></tr> +WOK + links_tests + @manifest[:html] <<<<WOK +</table> +WOK + @manifest[:html] <<<<WOK +<h2 class="small"><a name="languages">#{@translate.language_version_list}</a></h2> +<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> +<tr> <th class="left"><p class="bold">#{@translate.filename}</p></th><th class="left"><p class="bold">#{@translate.description}</p></th><th class="right"><p class="right"> </p></th></tr> + +WOK + language_versions + @manifest[:html] <<<<WOK +</table> +#{vz.credits_splash} +</body> +</html> +WOK + output + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + end + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/odf.rb b/lib/sisu/0.52/odf.rb new file mode 100644 index 00000000..bfa6d716 --- /dev/null +++ b/lib/sisu/0.52/odf.rb @@ -0,0 +1,725 @@ +=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: opendocument text 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. + + * Notes: tidy -ascii index.xml >> index.tidy + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_ODF + require SiSU_lib + '/dal' + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/odf_format' + include OD_format + require SiSU_lib + '/shared_txt' + @@alt_id_count,@@alt_id_count,@@tablehead,@@number_of_cols=0,0,0,0 + class Source + require 'zlib' + require 'find' + require 'fileutils' + include FileUtils + def initialize(opt) + @opt=opt + @@endnotes_para=[] + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get + @env=SiSU_Env::Info_env.new(@opt.fns) + @env.odf_structure + opendoc=@md.fn[:odf] + path=@env.path.output_tell + tool=if @opt.cmd =~/[MVv]/; "#{@env.program.odf_viewer} #{path}/#{@md.fnb}/#{opendoc}" + else '' + end + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Opendocument (ODF:ODT)',tool) + tell.green_hi_blue unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#{@md.fnb}/#{opendoc}") + 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_ODF::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 Split_text_object <Source + require SiSU_lib + '/odf_format' + include SiSU_Viz + include OD_format + @@dp=nil + @@alt_id_count=0 + attr_reader :format,:lev,:text,:ocn,:lev_para_ocn + def initialize(para) + @para=para + @format,@ocn='null','null' + #@format,@ocn=nil,nil + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def lev_segname_para_ocn + @text=nil + if @para =~/^(\d~|<:.+?>).+?<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if /^(([1-6])~(\S+))\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,$5 + elsif /^(([1-6])~)\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@lev,@text,@ocn=$1,$2,$3,$4 + elsif /<:(.+?)>\s*(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@text,@ocn=$1,$2,$3,$4 + elsif /^(([1-6])~(\S+))\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;[um]\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,"x#{@@alt_id_count}" + elsif /^(([1-6])~)\s+(\S.+?)<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,@lev,@text,@ocn=$1,$2,$3,"x#{@@alt_id_count}" + end + else + if /(.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @text,@ocn=$1,$2 + end + if @para !~/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$|^$/ + @text=/(.+?)/im.match(@para)[1] + end + if /^((\d)~(?:~\S+)?)\s+(.+)/m.match(@para) + @format,@lev,@text=$1,$2,$3 + end + end + format=@format.dup + @lev_para_ocn=if @para =~/.+<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + OD_format::Format_text_object.new(format,@text,@ocn) + else + OD_format::Format_text_object.new(format,@text,"<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>") + end + self + end + end + class Scroll <Source + require SiSU_lib + '/shared_txt' + @@img_count=0 + @@odf={ :body=>[],:open=>[],:close=>[],:head=>[],:metadata=>[],:tail=>[],:endnotes=>[] } + @@docstart=true + @@fns,@@dp=nil,nil + def initialize(data='',md='') + @data,@md=data,md + @env=SiSU_Env::Info_env.new(@md.fns) + @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>$/ + @serial=/\s*<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>\s*/ + @tab="\t" + @br=if @md.cmd =~/M/; "\n" + else '' + end + end + def songsheet + pre + @data=markup + post + publish + end + # Used for extraction of endnotes from paragraphs + def extract_endnotes(para='') + notes=para.scan(/~\{(\d+\s+.+?)\s*<#@dp>\}~/) + @n=[] + notes.each do |n| #high cost to deal with <br> appropriately within odf, consider + n=n.dup.to_s + if n =~/<br(?: \/)?>/ + fix=n.split(/<br(?: \/)?>/) #watch #added + fix.each do |x| + if x =~/\S+/; @n << x + end + end + else @n << n + end + end + end + def odf_metadata(meta) + #meta.el,meta.txt,meta.type,meta.attrib + end + def odf_tail + generator="Generated by: #{@md.sisu_version[:project]} #{@md.sisu_version[:version]} of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" if @md.sisu_version[:version] + lastdone="Last Generated on: #{Time.now}" + rubyv="Ruby version: #{@md.ruby_version}" + sc=if @md.sc_info + "Source file: #{@md.sc_filename}\nVersion number: #{@md.sc_number}\nVersion date: #{@md.sc_date}\n" + else '' + end + @@odf[:tail] << "\n</office:text></office:body></office:document-content>" + end + def heading(para,no) + para.gsub!(@serial,'') + para.gsub!(/<:name#\S+?>/,'') + para.gsub!(/^([1-6])~\S*\s/,'') + m=/#{$1}/ + breakpage='' + if @md.fns and @md.fns != '' and @md.fns !=@@fns + @@docstart=true + @@fns=@md.fns + end + unless @@docstart + breakpage=if (@md.pagenew or @md.pagebreak) and (@md.pagenew =~ m or @md.pagebreak =~m); '<text:p text:style-name="P9"> </text:p>' + else '' + end + end + @@docstart=false + %{#{breakpage}<text:h text:style-name="Heading_20_#{no}" text:outline-level="#{no}">#{para}</text:h>} + end + def image_src(i) + image_source=if @md.fns =~/\._?ss[tm]$/ and FileTest.file?("#{@env.path.image_source_local_tex}/#{i}") + @env.path.image_source_local_tex + elsif @md.fns =~/\.-ss[tm]$/ and 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 + end + def image_odf(img) + # copy image to od image directory (unless exists) + # divide pixel dimension by 37.79485 and retain 3 decimal places + # x=str.scan(/(aa[^a]+)/) + m,u=img[1],img[2] + i=/^(\S+?\.(?:png|jpg|gif))/.match(m).captures if m =~/^(\S+?\.(?:png|jpg|gif))/ + c=/^\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"/.match(m).captures if m =~/^\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"/ + w,h=/(\d+)x(\d+)/.match(m).captures if m =~/\d+x\d+/ + w=(w.to_i/37.79485).to_s + h=(h.to_i/37.79485).to_s + h=/([0-9]+\.\d{0,3})/.match(h).captures + w=/([0-9]+\.\d{0,3})/.match(w).captures + image_source=image_src(i) + pwd=Dir.pwd + cp("#{image_source}/#{i}","#{@env.path.odf}/Pictures/#{i}") if image_source + img=if i.to_s =~/jpg|png|gif/ and h.to_s =~/\d/ and w.to_s =~/\d/ + @@img_count +=1 + %{<draw:frame draw:style-name="fr1" draw:name="graphics#{@@img_count}" text:anchor-type="as-char" svg:width="#{w}cm" svg:height="#{h}cm" draw:z-index="2"><draw:image xlink:href="Pictures/#{i}" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/></draw:frame>#{c}} #anchor-type: as-char or paragraph or char or ... + else %{<text:p text:style-name="P1">[image omitted]</text:p>} + end + end + def image(para) + para.gsub!(@serial,'') + m=para.scan(/(\{\s*(.+?)\}((?:https?|ftp)\S+|image))/) + if m; m.each do |i| + cont,url=i[1],i[2] + cont.gsub!(/([)(\]\[])/,"\\\\\\1") + cont.gsub!(/([+?])/,"\\\\\\1") # incorrect handling of + + url.gsub!(/([+?])/,"\\\\\\1") + para.sub!(/\{\s*#{cont}\}#{url}/m,image_odf(i)) #watch + para.gsub!(/\\([)(\]\[?])/,'\1') #clumsy fix + end + m=nil + end + para + end + def text_link_odf(txt,url) + txt.gsub!(/(\\\+)/,'+') #this is convoluted, and risky :-( + url.gsub!(/(\\\+)/,'+') #this is convoluted, and risky :-( + %{<text:a xlink:type="simple" xlink:href="#{url}">#{txt}</text:a>} + end + def text_link(para) + para.gsub!(@serial,'') + m=para.scan(/(\{([^}]+?)\}((?:https?|ftp)\S+))/) #sort + if m + m.each do |i| + txt,url=i[1],i[2] + txt.gsub!(/([)(\]\[])/,"\\\\\\1") + txt.gsub!(/([+?])/,"\\\\\\1") # problems with + + url.gsub!(/([+?])/,"\\\\\\1") # problems with + + para.gsub!(/\{\s*#{txt}\}#{url}/m,text_link_odf(txt,url)) + para.gsub!(/\\([)(\]\[?])/,'\1') #clumsy fix + end + m=nil + end + para + end + def normal(para) #P1 - P3 + para.gsub!(@serial,'') + para.gsub!(/(^|\s)(https?:\/\/[^'">< ]+)/,'\1<text:a xlink:type="simple" xlink:href="\2">\2</text:a>') + para.gsub!(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+)/,'<text:a xlink:type="simple" xlink:href="mailto:\1">\1</text:a>') + par=case para + when /^<:i1>\s/m; para.gsub!(/^<:i1>\s/m,'') + %{<text:p text:style-name="P2">#{para}</text:p>} + when /^<:i2>\s/m; para.gsub!(/^<:i2>\s/m,'') + %{<text:p text:style-name="P3">#{para}</text:p>} + else %{<text:p text:style-name="P1">#{para}</text:p>} #%{<text:p text:style-name="Standard">#{para}</text:p>} + end + para=par #+ %{<text:p text:style-name="Standard"/>} + end + def fontface(para) + #para=para.gsub(/<b>(.+?)<\/b>/,%{<text:span text:style-name="T1">\\1</text:span>}) + #para=para.gsub(/<i>(.+?)<\/i>/,%{<text:span text:style-name="T2">\\1</text:span>}) + end + def footnote(para) + @astx||=10000 + para.gsub!(/<#@dp>([}\]]~)/,'\1') + para.gsub!(/<br \/><:i1>/,'<br />') + if para =~/~\{\d+\s+/ + para=para.gsub(/~\{(\d+)\s+(.+?)\}~/,'<text:note text:id="ftn\1" text:note-class="footnote"><text:note-citation>\1</text:note-citation><text:note-body><text:p text:style-name="Footnote"> \2</text:p><text:p text:style-name="Footnote"/></text:note-body></text:note>') + end + if para=~/~\[[*+]\d+\s/ #editor notes, squre bracket series + asterisk=para.scan(/~\[([*+]\d+)\s+(.+?)\]~/) + asterisk.each do |x| + a=x[0].gsub(/([*+])/,"\\\\\\1") + para=para.gsub(/~\[(#{a})\s+(.+?)\]~/,%{<text:note text:id="ftn#{@astx.to_s}" text:note-class="footnote"><text:note-citation text:label="\\1">\\1</text:note-citation><text:note-body><text:p text:style-name="Footnote"> \\2</text:p><text:p text:style-name="Footnote"/></text:note-body></text:note>}) + @astx+=1 + end + end + if para=~/~\{[*+]+\s/ + asterisk=para.scan(/~\{([*+]+)\s+(.+?)\}~/) + asterisk.each do |x| + a=x[0].gsub(/([*+])/,"\\\\\\1") + para=para.gsub(/~\{(#{a})\s+(.+?)\}~/,%{<text:note text:id="ftn#{@astx.to_s}" text:note-class="footnote"><text:note-citation text:label="\\1">\\1</text:note-citation><text:note-body><text:p text:style-name="Footnote"> \\2</text:p><text:p text:style-name="Footnote"/></text:note-body></text:note>}) + @astx+=1 + end + end + para + end + def group_clean(para) + para.gsub!(/&nbsp;| /,' ') + para.gsub!(/</,'<') + para.gsub!(/>/,'>') + #para.gsub!(/<br(?:\s+\/)?>/,'<br />') + para.gsub!(/<br(?:\s+\/)?>/,'<br />') + #para.gsub!(/\s\s/,'  ') + para + end + def poem(para) #P4 #same as group + para.gsub!(@serial,'') + para.gsub!(/<:verse(?:-end)?>\s*/m,'') + para=group_clean(para) + parray=[] + para.split(/<br(?: \/)?>/).each do |parablock| + parray << %{<text:p text:style-name="P4">#{parablock}</text:p>} if parablock =~/\S+/ + end + para=parray.join + '<text:p text:style-name="Standard"/>' + end + def group(para) #P4 #same as verse + para.gsub!(@serial,'') + para.gsub!(/<:group(?:-end)?>\s*/m,'') + para=group_clean(para) + parray=[] + para.split(/<br(?: \/)?>/).each do |parablock| + parray << %{<text:p text:style-name="P4">#{parablock}</text:p>} if parablock =~/\S+/ + end + para=parray.join + '<text:p text:style-name="Standard"/>' + end + def code(para) #P5 + para.gsub!(@serial,'') + para.gsub!(/<:code(?:-end)?>\s*/m,'') + para=group_clean(para) + para.gsub!(/\s\s/,'  ') + parray=[] + para.split(/<:br>/).each do |parablock| + parray << %{<text:p text:style-name="P5">#{parablock}</text:p>} if parablock =~/\S+/ + end + para=parray.join + '<text:p text:style-name="Standard"/>' + end + def table(para) # + if para =~/<!Th?.+/ # tables come as single block + table=OD_format::Table.new(@md,para) + para=table.table_split + end + end + def odf_structure(para='',lv='',ocn='',hname='') #% Used to extract the structure of a document + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + #extract_endnotes(para) + #para=fontface(para) + para=if para =~/\{\s*\S+?\.(?:png|jpg|gif)\s.+?\}(?:(?:https?|ftp):\S+|image)/; image(para) + elsif para =~/\{.+?\}(?:(?:https?|ftp):\S+|image)/; text_link(para) + else para + end + para=footnote(para) + if lv + @@odf[:body] << case lv + when 1; heading(para,'1') << @br*2 + when 2; heading(para,'2') << @br*2 + when 3; heading(para,'3') << @br*2 + when 4; heading(para,'4') << @br*2 + when 5; heading(para,'5') << @br*2 + when 6; heading(para,'6') << @br*2 + end + elsif para =~ /<:verse(?:-end)?>/ + @@odf[:body] << poem(para) + @@odf[:body] << @br*2 + elsif para =~ /<:group(?:-end)?>/ + @@odf[:body] << group(para) + @@odf[:body] << @br*2 + elsif para =~ /<:code(?:-end)?>/ + @@odf[:body] << code(para) + @@odf[:body] << @br*2 + elsif para =~ /<!Th?/ #elsif para =~ /<!Th?¡/ + @@odf[:body] << table(para) + @@odf[:body] << @br*2 + else + @@odf[:body] << normal(para) # main text, contents, body KEEP + @@odf[:body] << @br*2 + end + @@endnotes_para=[] + end + # Used to clean words + def tidywords(wordlist) + #wordlist.each do |x| + # #x.gsub!(/&/,'&') unless x =~/&\S+;/ + #end + wordlist + end + def markup # Used for major markup instructions + data=@data + safe_characters=/[^a-zA-Z0-9}{\/?,."';:)(><\-_&!@%~#\]\[*=$| \n+`¡]/ + dir=SiSU_Env::Info_env.new(@md.fns) + @data_mod,@endnotes,@level,@cont,@copen,@odf_contents_close=Array.new(6){[]} + @rcdc=false + (0..6).each { |x| @cont[x]=@level[x]=false } + (4..6).each { |x| @odf_contents_close[x]='' } + odf_tail #($1,$2) + fix=[] + bullet=image_src('bullet_red.png') + cp("#{bullet}/bullet_red.png","#{@env.path.odf}/Pictures/.") #if image_src('bullet_red.png') + data.each do |para| + #p para if para =~safe_characters and @md.cmd =~/V/ #KEEP + #para.gsub!(/<(~\d+;(?:\w|[0-6]:)\d+;\w\d+)><(#@dp:#@dp)>/,'<\1><\2>') + para_array=[] + word=para.scan(/\S+|\n/) + if word + word.each do |w| # _ - / # | : ! ^ ~ + unless para =~/^(?:0~|%+ )/m + w.gsub!(/&#(?:126|152);/,'~') #126 usual + if w !~/&\S{1,7};/ or w =~/ /; w.gsub!(/&/,'&') #watch + end + end + para_array << w + end + para=para_array.join(' ') + para=para.strip + end + para.gsub!(/^(<:i[12]>\s+)?_\*\s+/,'\\1<draw:frame draw:style-name="gr1" text:anchor-type="as-char" svg:width="0.25cm" svg:height="0.25cm" draw:z-index="2"><draw:image xlink:href="Pictures/bullet_red.png" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/></draw:frame> ') # bullet_red.png + #para.gsub!(/^_\*\s+/,'<text:span text:style-name="T6">·</text:span> ') #bullet + para.gsub!(/^(<:i[12]>)\s+_\*\s+/,'\1 <text:span text:style-name="T6">·</text:span> ') #bullet + para.gsub!(/<br>/,'<br />') + para.gsub!(/<:p[bn]>/,'<text:p text:style-name="P8"> </text:p>') + para.gsub!(/©/,'©') #too arbitrary + para.gsub!(/.+?<-#>/,'') # remove dummy headings (used by html) #check + #para.gsub!(/_\*\s+/,'* ') # bullet markup, marked down + para.gsub!(/<b>(.+?)<\/b>/,'<text:span text:style-name="T1">\1</text:span>') + para.gsub!(/<i>(.+?)<\/i>/,'<text:span text:style-name="T2">\1</text:span>') + para.gsub!(/<u>(.+?)<\/u>/,'<text:span text:style-name="T3">\1</text:span>') + para.gsub!(/<sup>(.+?)<\/sup>/,'<text:span text:style-name="T4">\1</text:span>') + para.gsub!(/<sub>(.+?)<\/sub>/,'<text:span text:style-name="T5">\1</text:span>') + para.gsub!(/`/,"'") + para.gsub!(//,'-') + para.gsub!(/·/,'*') + para.gsub!(/[“”]/,'""') + para.gsub!(/[–—]/,'-') #— – chk + para.gsub!(/ < /i,'<') + para.gsub!(/\\copy(?:right)?\b/,'©') + para.gsub!(/\\trademark\b|\\tm\b/,'®') + #para.gsub!(/\43/,'#') ## watch + #para.gsub!(/$/,'$') #$ watch + para.gsub!(/\44/,'$') #$ watch + #para.gsub!(/^·/,'_*') #$ watch + #para.gsub!(/·/,'*') #$ watch + para.gsub!(/<:p[bn]>/,'') # remove page breaks + para.gsub!(/^\s*<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>/,'') # remove empty lines + para.gsub!(/<a href=".+?">(.+?)<\/a>/,'\1') + para.gsub!(/<:name#\S+?>/,'') # remove name links +# para.gsub!(/<a href=".+?">(.+?)<\/a>/im,'\1') + #para.gsub!(/ /,' ') # decide on + #para.gsub!(/\{(\S+?\.(?:png|jpg)) .+?\}(?:http:\/\/\S+|image)/," [ \\1 ]") #"[ #{@env.url.images_local}\/\\1 ]") + #para.gsub!(/<!TZ.+/,'') + #para.gsub!(/^<!T.+/,"#@br[table: ] <~#>"); + #p para if para =~safe_characters and @md.cmd =~/M/ #KEEP + #para.gsub!(/^(\{\S+?\.(?:png|jpg)\s+.+?"(.*?)"\s*\}\S+)/,"\\1 \n [image: \"\\2\"]") + wordlist=para.scan(/\S+/) + para=tidywords(wordlist).join(' ').strip + if para =~/^0~(\S+)\s+(.+?)\Z/m # for headers + d_meta=SiSU_text_utils::Header_scan.new(@md,para).meta + if d_meta; odf_metadata(d_meta) + end + end + @rcdc=true if @rcdc==false and (para =~/~metadata/ or para =~/1~\s+Document Information/) + if para !~/(^0~|<ENDNOTES>|<EOF>)/ + if para =~@regx #/.+?<~\d+;\w\d+;\w\d+>.*/ #watch change + paranum=para[@regx,3] + @p_num=OD_format::Paragraph_number.new(paranum) + end + @sto=Split_text_object.new(para).lev_segname_para_ocn + #<office:annotation><dc:date>yyyy-mm-ddT00:00:00</dc:date><text:p>#{ocn}</text:p></office:annotation> #followed immediately by paragraph closure + ### 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 and para=~/\S+/ + para=case @sto.format + when /^(1)~(?:(\S+))?/; odf_structure(para,$1,@sto.ocn,$2) + para + when /^(2)~(?:(\S+))?/; odf_structure(para,$1,@sto.ocn,$2) + para + when /^(3)~(?:(\S+))?/; odf_structure(para,$1,@sto.ocn,$2) + para + when /^(4)~(\S+)/; odf_structure(para,$1,@sto.ocn,$2) + # work on see SiSU_text_parts::Split_text_object + para + when /^(5)~(?:(\S+))?/; odf_structure(para,$1,@sto.ocn,$2) + para + when /^(6)~(?:(\S+))?/; odf_structure(para,$1,@sto.ocn,$2) + para + #@sto.lev_para_ocn.heading_body6 + #when /^(i1)$/ + # #formatMono.gsubBody + # #para=@sto[:lev_para_ocn].scrIndent1 + #when /^(i2)$/ + # formatMono.gsubBody + # para=@sto[:lev_para_ocn].scrIndent2 + #when /^(center)$/ + # para.gsub!(/(.+)/, + # %{<center>(\\1)</center>}) + # para=@sto[:lev_para_ocn].scrPara + #when /^(b|bold)$/ + # para.gsub!(/(.+)/, + # %{<b>(\\1)</b>}) + # para=@sto[:lev_para_ocn].scrPara + #when /null/ # see whether u can improve + # if (para !~/#{@margin.txt_0}|#{@margin.txt_1}|#{@margin.txt_2}/) + # #formatMono.gsubBody + # #para=@sto[:lev_para_ocn].scrPara + # end + else odf_structure(para,nil,nil,nil) #watch may be problematic + para + end + elsif para =~/(.*)<!#!>(.*)/ + one,two=$1,$2 + format_text=OD_format::Format_text_object.new(one,two) + para=format_text.seg_no_paranum + end + para='' if para =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\d+!>)/ # -endnote + case para #remove + when /<:i1>/ + if para =~/.*<:#>.*$/ + format_text=OD_format::Format_text_object.new(para,'') + para=format_text.scr_indent_one_no_paranum + end + when /<:i2>/ + if para =~/.*<:#>.*$/ + format_text=OD_format::Format_text_object.new(para,'') + para=format_text.scr_indent_one_no_paranum + end + end + if (para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/) + # i don't get the condition for no paranum + end + if para =~/<:center>/ + one,two=/(.*)<:center>(.*)/.match(para)[1,2] + format_text=OD_format::Format_text_object.new(one,two) + para=format_text.center + end + else + if para =~ /^(4)~(\S+)/ + odf_structure(para,$1,@sto.ocn,$2) + para + elsif para =~/<~(\d+);m\d+;[mdv]\d+><#@dp:#@dp>$/ + odf_structure(para,nil,nil,nil) #watch may be problematic + para + end + end + para.gsub!(/<!.+!>/,' ') if para ## Clean Prepared Text + para.gsub!(/<:\S+>/,' ') if para ## Clean Prepared Text + end + end + end + def pre + table=if @md.flag_tables + %{<style:style style:name="Table1" style:family="table"><style:table-properties style:width="16.999cm" table:align="margins"/></style:style>#@br} + + %{<style:style style:name="Table1.A" style:family="table-column"><style:table-column-properties style:column-width="16.999cm" style:rel-column-width="65535*"/></style:style>#@br} + + %{<style:style style:name="Table1.B" style:family="table-column"><style:table-column-properties style:column-width="8.499cm" style:rel-column-width="32767*"/></style:style>#@br} + + %{<style:style style:name="Table1.C" style:family="table-column"><style:table-column-properties style:column-width="5.666cm" style:rel-column-width="21845*"/></style:style>#@br} + + %{<style:style style:name="Table1.D" style:family="table-column"><style:table-column-properties style:column-width="4.349cm" style:rel-column-width="16383*"/></style:style>#@br} + + %{<style:style style:name="Table1.E" style:family="table-column"><style:table-column-properties style:column-width="3.399cm" style:rel-column-width="13107*"/></style:style>#@br} + + %{<style:style style:name="Table1.F" style:family="table-column"><style:table-column-properties style:column-width="2.833cm" style:rel-column-width="10922*"/></style:style>#@br} + + %{<style:style style:name="Table1.G" style:family="table-column"><style:table-column-properties style:column-width="2.428cm" style:rel-column-width="9362*"/></style:style>#@br} + + %{<style:style style:name="Table1.H" style:family="table-column"><style:table-column-properties style:column-width="2.124cm" style:rel-column-width="8191*"/></style:style>#@br} + + %{<style:style style:name="Table2" style:family="table"><style:table-properties style:width="16.999cm" table:align="margins"/></style:style>#@br} + + %{<style:style style:name="Table2.A" style:family="table-column"><style:table-column-properties style:column-width="16.999cm" style:rel-column-width="65535*"/></style:style>#@br} + + %{<style:style style:name="Table2.B" style:family="table-column"><style:table-column-properties style:column-width="8.499cm" style:rel-column-width="32767*"/></style:style>#@br} + + %{<style:style style:name="Table2.C" style:family="table-column"><style:table-column-properties style:column-width="5.666cm" style:rel-column-width="21845*"/></style:style>#@br} + + %{<style:style style:name="Table2.D" style:family="table-column"><style:table-column-properties style:column-width="4.349cm" style:rel-column-width="16383*"/></style:style>#@br} + + %{<style:style style:name="Table2.E" style:family="table-column"><style:table-column-properties style:column-width="3.999cm" style:rel-column-width="13107*"/></style:style>#@br} + + %{<style:style style:name="Table2.F" style:family="table-column"><style:table-column-properties style:column-width="2.833cm" style:rel-column-width="10922*"/></style:style>#@br} + + %{<style:style style:name="Table2.G" style:family="table-column"><style:table-column-properties style:column-width="2.428cm" style:rel-column-width="9362*"/></style:style>#@br} + + %{<style:style style:name="Table2.H" style:family="table-column"><style:table-column-properties style:column-width="2.124cm" style:rel-column-width="8191*"/></style:style>#@br} + + %{<style:style style:name="Table2.I" style:family="table-column"><style:table-column-properties style:column-width="1.8887cm" style:rel-column-width="7281*"/></style:style>#@br} + + %{<style:style style:name="Table2.J" style:family="table-column"><style:table-column-properties style:column-width="1.6999cm" style:rel-column-width="6553*"/></style:style>#@br} + + %{<style:style style:name="Table2.K" style:family="table-column"><style:table-column-properties style:column-width="1.5453cm" style:rel-column-width="5957*"/></style:style>#@br} + + %{<style:style style:name="Table2.L" style:family="table-column"><style:table-column-properties style:column-width="1.416cm" style:rel-column-width="5461*"/></style:style>#@br} + + %{<style:style style:name="Table2.M" style:family="table-column"><style:table-column-properties style:column-width="1.307" style:rel-column-width="5041*"/></style:style>#@br} + + %{<style:style style:name="Table2.N" style:family="table-column"><style:table-column-properties style:column-width="1.214cm" style:rel-column-width="4681*"/></style:style>#@br} + else '' + end + breakpage=if @md.pagenew or @md.pagebreak; ' fo:break-before="page"' + else '' + end + @@odf[:head]<<%{<?xml version="1.0" encoding="UTF-8"?>#@br} + + %{<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.0"><office:scripts/>#@br} + + %{<office:font-face-decls><style:font-face style:name="HG Mincho Light J" svg:font-family="'HG Mincho Light J', 'MS Mincho', 'HG Mincho J', 'HG Mincho L', 'HG Mincho', Mincho, 'MS PMincho', 'HG Mincho Light J', 'MS Gothic', 'HG Gothic J', 'HG Gothic B', 'HG Gothic', Gothic, 'MS PGothic', 'Andale Sans UI', 'Arial Unicode MS', 'Lucida Sans Unicode', Tahoma" style:font-pitch="variable"/><style:font-face style:name="Nimbus Sans L" svg:font-family="'Nimbus Sans L'" style:font-pitch="variable"/><style:font-face style:name="Tahoma" svg:font-family="Tahoma, Lucidasans, 'Lucida Sans', 'Arial Unicode MS'" style:font-pitch="variable"/><style:font-face style:name="Nimbus Roman No9 L" svg:font-family="'Nimbus Roman No9 L'" style:font-family-generic="roman" style:font-pitch="variable"/><style:font-face style:name="Bitstream Vera Sans" svg:font-family="'Bitstream Vera Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/></office:font-face-decls>#@br} + + %{<office:automatic-styles>#@br} + + %{#{table}#@br} + + %{<style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:margin-top="0.199cm" fo:margin-bottom="0.199cm" fo:line-height="150%" fo:text-align="justify" style:justify-single-word="false"/></style:style>#@br} + + %{<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:margin-top="0.199cm" fo:margin-bottom="0.199cm" fo:line-height="150%" fo:margin-left="1cm" fo:margin-right="0cm" fo:text-align="justify" style:justify-single-word="false" fo:text-indent="0cm" style:auto-text-indent="false"/></style:style>#@br} + + %{<style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:margin-top="0.199cm" fo:margin-bottom="0.199cm" fo:line-height="150%" fo:margin-left="2cm" fo:margin-right="0cm" fo:text-align="justify" style:justify-single-word="false" fo:text-indent="0cm" style:auto-text-indent="false"/></style:style>#@br} + + %{<style:style style:name="P4" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-align="justify" style:justify-single-word="false"/></style:style>#@br} + + %{<style:style style:name="P5" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-align="start" style:justify-single-word="false"/></style:style>#@br} + + %{<style:style style:name="P6" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:break-before="page"/></style:style>#@br} + + %{<style:style style:name="P7" style:family="paragraph" style:parent-style-name="Table_20_Contents"><style:paragraph-properties fo:text-align="justify" style:justify-single-word="false"/></style:style>#@br} + + %{<style:style style:name="P8" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:break-before="page"/></style:style>#@br} + + %{<style:style style:name="P9" style:family="paragraph" style:parent-style-name="Standard"><style:paragraph-properties fo:break-after="page"/></style:style>#@br} + + %{<style:style style:name="T1" style:family="text"><style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/></style:style>#@br} + + %{<style:style style:name="T2" style:family="text"><style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/></style:style>#@br} + + %{<style:style style:name="T3" style:family="text"><style:text-properties style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color"/></style:style>#@br} + + %{<style:style style:name="T4" style:family="text"><style:text-properties style:text-position="super 58%"/></style:style>#@br} + + %{<style:style style:name="T5" style:family="text"><style:text-properties style:text-position="sub 58%"/></style:style>#@br} + + %{<style:style style:name="T6" style:family="text"><style:text-properties style:font-name="Courier 10 Pitch" fo:font-size="12pt"/></style:style>#@br} + + %{<style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics"><style:graphic-properties style:wrap="none" style:horizontal-pos="left" style:horizontal-rel="paragraph" style:mirror="none" fo:clip="rect(0cm 0cm 0cm 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/></style:style>#@br} + + %{<style:style style:name="gr1" style:family="graphic"><style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-horizontal-align="center" draw:textarea-vertical-align="middle" draw:color-mode="standard" draw:luminance="0%" draw:contrast="0%" draw:gamma="100%" draw:red="0%" draw:green="0%" draw:blue="0%" fo:clip="rect(0cm 0cm 0cm 0cm)" draw:image-opacity="100%" style:mirror="none" style:run-through="background" style:wrap="none" style:vertical-pos="top" style:vertical-rel="baseline" style:horizontal-pos="left" style:horizontal-rel="paragraph" draw:wrap-influence-on-position="once-concurrent" style:flow-with-text="false"/></style:style>#@br} + + %{<style:style style:name="gr2" style:family="graphic"><style:graphic-properties draw:stroke="none" draw:fill="none" draw:textarea-horizontal-align="center" draw:textarea-vertical-align="middle" draw:color-mode="standard" draw:luminance="0%" draw:contrast="0%" draw:gamma="100%" draw:red="0%" draw:green="0%" draw:blue="0%" fo:clip="rect(0cm 0cm 0cm 0cm)" draw:image-opacity="100%" style:mirror="none" style:run-through="background" style:wrap="none" style:vertical-pos="middle" style:vertical-rel="baseline" style:horizontal-pos="left" style:horizontal-rel="paragraph" draw:wrap-influence-on-position="once-concurrent" style:flow-with-text="false"/></style:style>#@br} + + %{</office:automatic-styles>#@br} + + %{<office:body>#@br} + + %{<office:text><office:forms form:automatic-focus="false" form:apply-design-mode="false"/>#@br} + + %{<text:sequence-decls><text:sequence-decl text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0" text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls>} + end + def post + end + def publish + divider='=' + content=[] + data=@data + content << @@odf[:open] + content << @@odf[:head] + content << @@odf[:body] + content << @@odf[:metadata] + content << @@odf[:owner_details] if @md.stmp =~/\w+/ #not used? + content << @@odf[:tail] + Output.new(content.to_s,@md).odf + @@odf[:head],@@odf[:body],@@odf[:tail],@@odf[:metadata]=[],[],[],[] + end + end + class Output <Source + include SiSU_Param + include SiSU_Env + def initialize(content,md) + @content,@md=content,md + @env=SiSU_Env::Info_env.new(@md.fns) + end + def odf #%odf output + SiSU_Env::SiSU_file.new(@md).mkdir + #filename_odf=SiSU_Env::SiSU_file.new(@md,'content.xml').mkfile + filename="#{@env.path.odf}/content.xml" + od=File.new(filename,'w+') + @sisu=[] + @content.each do |para| # this is a hack + if para =~/^\S/ + if para !~/^([*=-]|\.){5}/; od.puts para #unix odf + else od.puts para #unix odf + end + else od.puts para # if para =~/^\s/ + end + end + od.close + opendoc=@md.fn[:odf] + system(" + cd #{@env.path.odf} + zip -qr #{opendoc} * + mv #{opendoc} #{@env.path.output}/#{@md.fnb}/. + cd #{Dir.pwd} + ") + end + end + end +end +__END__ +todo: +* table of contents +* page header/footer? + +done: +headings * +footnotes * +bold underscore italics strikethrough * +superscript subscript * +extended ascii set * +indents * + [autonomy_markup0.sst] * +groups + poem * + code * + tables +images +bullet +line break +page break + +notes?? [you could add a note number for every object/paragraph!] + + cd(@env.path.odf) + structure=[] + Find.find(@env.path.odf) do |f| + structure << puts f + end + open(opendoc,'wb') do |f| + zip=Zlib::ZipWriter.new(f) + structure.each |z| do + zip << z + end + zip.close + end + #zip -qr #{opendoc} * + mv(opendoc,"#{@env.path.output}/#{@md.fnb}/.") + cd(Dir.pwd) diff --git a/lib/sisu/0.52/odf_format.rb b/lib/sisu/0.52/odf_format.rb new file mode 100644 index 00000000..edb202d8 --- /dev/null +++ b/lib/sisu/0.52/odf_format.rb @@ -0,0 +1,225 @@ +=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: opendocument formatting, default opendocument template + + * 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 OD_format + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + class Paragraph_number + def initialize(paranum) + @paranum=/(\d+)/m.match(paranum)[1] + end + def display + @paranum.gsub(/(\d+)/,'<font size="1" color="#777777"> \1</font>') + end + def name + @paranum.gsub(/(\d+)/,'<a name="\1"></a>') + end + def goto + @paranum.gsub(/(\d+)/,'<a href="#\1">') + end + end + class Format_text_object + @@dp=nil + def initialize(one,two,three) + one.gsub!(/\.(html|pdf|php)/,'') if one =~/\.\.\/\S+/ + @one,@two,@three=one,two,three + rgx=/^[1-6-]~/ + @one.gsub!(rgx,'') if @one =~rgx + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + rgx=/~\{\d+\s+(.+?)<#@dp>\}~/ + @one.gsub!(rgx,'\1') if @one =~rgx + @link,@linkname=one,two + @vz=SiSU_Env::Get_init.instance.skin + end + def scr_endnote_body + "<endnote>#@one</endnote> " + end + def heading_body1 + #%{<text:h text:style-name="Heading_20_1" text:outline-level="1">#@two</text:h>} + end + def heading_body2 + #%{<text:h text:style-name="Heading_20_2" text:outline-level="2">#@two</text:h>} + end + def heading_body3 + #%{<text:h text:style-name="Heading_20_3" text:outline-level="3">#@two</text:h>} + end + def heading_body4 + #%{<text:h text:style-name="Heading_20_4" text:outline-level="4">#@two</text:h>} + end + def heading_body5 + #%{<text:h text:style-name="Heading_20_5" text:outline-level="5">#@two</text:h>} + end + def heading_body6 + #%{<text:h text:style-name="Heading_20_6" text:outline-level="6">#@two</text:h>} + end + end + class Table + @@tablehead,@@table_counter=0,0 #reinitialise on new file + @@tablefoot=[] #watch + @@fns='' + @@dp=nil + def initialize(md,one) + @md,@one,@parablock,@vz=md,one,one,SiSU_Env::Get_init.instance.skin + if @md.fns != @@fns + @@table_counter=0 + @@fns=@md.fns + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + end + def table_head(count,col,h=false) + type=if h; 1 + else 2 + end + alpha=case col.to_i + when 1; 'A' + when 2; 'B' + when 3; 'C' + when 4; 'D' + when 5; 'E' + when 6; 'F' + when 7; 'G' + when 8; 'H' + when 9; 'I' + when 10; 'J' + when 11; 'K' + when 12; 'L' + when 13; 'M' + when 14; 'N' + else 'D' + end + %{<table:table table:name="Table#{count}" table:style-name="Table#{type}">#@br} + + %{<table:table-column table:style-name="Table#{type}.#{alpha}" table:number-columns-repeated="#{col}"/>#@br} + end + def table_end(tablefoot='') + '</table:table>' + end + def table_row(inf,h=false) + if h; %{<table:table-row>#@br} + + %{<table:table-cell office:value-type="string">#@br} + + %{<text:p text:style-name="Table_20_Heading">#@br} + else %{<table:table-row>#@br} + + %{<table:table-cell office:value-type="string">#@br} + + %{<text:p text:style-name="P7">#@br} + end + end + def table_cell(inf,h=false) + if h; %{</text:p>#@br} + + %{</table:table-cell>#@br} + + %{<table:table-cell office:value-type="string">#@br} + + %{<text:p text:style-name="Table_20_Heading">#@br} + else %{</text:p>#@br} + + %{</table:table-cell>#@br} + + %{<table:table-cell office:value-type="string">#@br} + + %{<text:p text:style-name="P7">#@br} + end + end + def table_row_close(h=false) + %{</text:p>#@br} + + %{</table:table-cell>#@br} + + %{</table:table-row>#@br} + end + def table + @parablock='' if @parablock =~/^<!$/ + @parablock.gsub!(/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>/,'') + m=@parablock[/<!f(.+?)!>/,1] + @@tablefoot << m if m + @parablock.gsub!(/<!f.+?!>/,'') + @@tablehead=1 if @parablock =~/<!Th¡/ + @@table_counter+=1 if @parablock =~/<!Th?¡/ + if @parablock =~/<!Th¡\s+c(\d+).+?!~\d+;\w\d+;\w\d+>/; @parablock=table_head(@@table_counter,$1,true) + elsif @parablock =~/<!T¡\s+c(\d+).+?!~\d+;\w\d+;\w\d+>/; @parablock=table_head(@@table_counter,$1) + end + if @parablock =~/<!TZ!>/ + tablefoot=[] + @@tablefoot.each {|x| tablefoot << ''} + @@tablefoot=[] + if @parablock =~/<!TZ!>/; @parablock=table_end + end + end + if @@tablehead == 1 + if @parablock =~/¡¡/ + if @parablock =~/<!¡¡(\d+?)¡/ + @parablock.gsub!(/<!¡¡(\d+?)¡/,table_row($1,true)) + end + if @parablock =~/¡¡(\d+?)¡/ + @parablock.gsub!(/¡¡(\d+?)¡/,table_cell($1,true)) + end + if @parablock =~/!>/ + @parablock.gsub!(/!>/,table_row_close(true)) + end + @@tablehead=0 + end + @parablock + else + if @parablock =~/<!¡¡(\d+?)¡/ + @parablock.gsub!(/<!¡¡(\d+?)¡/,table_row($1)) + end + if @parablock =~/¡¡(\d+?)¡/ + @parablock.gsub!(/¡¡(\d+?)¡/,table_cell($1)) + end + if @parablock =~/!>/ + @parablock.gsub!(/!>/,table_row_close) + end + @parablock + end + @parablock + end + def table_split + @new_content=[] + @one.split(/\s*<!/).each do |parablock| + table=Table.new(@md,"<!#{parablock}") + @new_content << table.table + end + @new_content.join + end + end + class XML + end +end +__END__ diff --git a/lib/sisu/0.52/options.rb b/lib/sisu/0.52/options.rb new file mode 100644 index 00000000..b253aab1 --- /dev/null +++ b/lib/sisu/0.52/options.rb @@ -0,0 +1,168 @@ +=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: SiSU information Structuring Universe, command line options parsing + + * 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_commandline + require SiSU_lib + '/sysenv' + class Options + attr_accessor :cmd,:mod,:files,:fns,:fnb,:what + def initialize(a) + @cmd,@files,@fns,@fnb,@what,c,w,s='','','','','','','','','' + @files,@mod,m,f,z,ca=[],[],[],[],[],[] + @env=SiSU_Env::Info_env.new + shortcut=SiSU_Env::Info_processing_flag.new + a.each do |x| + y=case x + when /0/ + if x=~/^-1\S+/; x.gsub(/^-0(\S+)/,shortcut.cf_0 + ' -\1') + else x.gsub(/^-0/,shortcut.cf_0 + ' ') + end + when /1/ + if x=~/^-1\S+/; x.gsub(/^-1(\S+)/,shortcut.cf_1 + ' -\1') + else x.gsub(/^-1/,shortcut.cf_1 + ' ') + end + when /2/ + if x=~/^-2\S+/; x.gsub(/^-2(\S+)/,shortcut.cf_2 + ' -\1') + else x.gsub(/^-2/,shortcut.cf_2 + ' ') + end + when /3/ + if x=~/^-3\S+/; x.gsub(/^-3(\S+)/,shortcut.cf_3 + ' -\1') + else x.gsub(/^-3/,shortcut.cf_3 + ' ') + end + when /4/ + if x=~/^-4\S+/; x.gsub(/^-4(\S+)/,shortcut.cf_4 + ' -\1') + else x.gsub(/^-4/,shortcut.cf_4 + ' ') + end + when /5/ + if x=~/^-5\S+/; x.gsub(/^-5(\S+)/,shortcut.cf_5 + ' -\1') + else x.gsub(/^-5/,shortcut.cf_5 + ' ') + end + else x + end + s << " #{y}" unless y.empty? + end + s.strip! + a=s.split(/\s+/) + a.each do |x| + if x =~/^-[a-z0-5]+/i or x =~/^--\S+/ + if x =~/^-([a-z0-5]+)/i; c << $1 + end + if x =~/^--\S+/; m << x + end + elsif x =~ /(?:\.(?:[_-]?sst(?:\.xml)?|ssm|ssi|sx[sdn]\.xml|s[1-3]|kdi|ssp)|sisupod(?:\.zip)?)$/ + if x =~/^http:\/\/\S+/; f << x + elsif FileTest.file?(x); f << x + else puts "file not found: #{x}" + end + elsif x =~ /\.termsheet\.rb$/ + if FileTest.file?(x); f << x + else puts "file not found: #{x}" + end + else w=x + puts "#{x} in #{a.join(' ')}?" + end + end + unless m.empty? + m.each do |m| + case m + when /--maintenance/ + c=c+'M' + when /--verbose[=-]3/ + c=c+'VM' + when /--verbose[=-]2|--Verbose|--VERBOSE/ + c=c+'V' + when /--verbose(?:[=-]1)?/ + c=c+'v' + when /--verbose[=-]0|--quiet|--silent/ + c=c+'q' + else @mod << m + end + end + end + unless c.empty? + c.gsub!(/-/,'') + c.scan(/./) {|x| ca << x} + @cmd= '-' + ca.uniq.join + end + unless w.empty? ; @what=w + end + @files << f + @files.flatten! + if @files.length > 0 and @cmd.empty? and @mod.length == 0 #% if no other action called on filename given, default is sisu -0 [filename(s)] configured as flag default + @cmd=shortcut.cf_0 + end + tell=SiSU_Screen::Ansi.new(@cmd,"\tsisu " + @cmd + ' ' + @mod.join(' ') + ' ' + @files.join(' ') + "\n") + tell.print_brown if @cmd =~/[vVM]/ + @files.uniq! + end + def cmd + @cmd + end + def mod + @mod + end + def fns + @fns + end + def what + @what + end + def fnb + unless fns.empty? + fns[/(.+?)\.(?:[_-]?sst|ssm)$/,1] + end + end + end +end +__END__ +note usually named @opt +is carried in Param usually as @md +@opt is a subset of @md +where @md is passed, contents of @opt are available +passing @opt as well is duplication +check for fns & fnb diff --git a/lib/sisu/0.52/param.rb b/lib/sisu/0.52/param.rb new file mode 100644 index 00000000..eb99d15b --- /dev/null +++ b/lib/sisu/0.52/param.rb @@ -0,0 +1,791 @@ +=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: parameters extracted from input file(s) for program use + + * 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_Param + require 'uri' + require 'pstore' + require 'ftools' + require SiSU_lib + '/sysenv' + include SiSU_Env + require SiSU_lib + '/param_identify_markup' + require SiSU_lib + '/help' + include SiSU_Help + @@date=SiSU_Env::Info_date.new + @@symlnk=Create_system_link.new + @@proc=@@filename_txt=@@filename_texinfo=@@filename_lout_portrait=@@filename_lout_landscape=@@filename_html_scroll=@@filename_html_index=@@filename_html_segtoc=@@filename_semantic=@@filename_rss=@@newfile=@@drr=nil + @doc={ :initialise=>nil,:markup=>'',:lnks=>'',:stmp=>'',:req=>{} } + @@yaml=@@yamladdr=nil + @@trigger=nil + @@lv,@@flag={},{} + @@tex_backslash="\\\\" + class Parameters + @@publisher='SiSU scribe' + @@md=@@fns=nil + def initialize(opt) + @cX||=SiSU_Screen::Ansi.new(opt.cmd) + @cmd,@mod=opt.cmd,opt.mod + @fns=opt.fns.gsub(/\.ssm$/,'._sst') #revisit + Instantiate.new.param_instantiate + @env=SiSU_Env::Info_env.new(@fns) + @pstorefile="#{@env.path.dal}/#@fns.pstore" + end + def get + unless @@fns==@fns + @@fns=@fns + @@md=nil + end + if @@md.nil? or @cmd =~/M/ #not particularly helpful, as current cycle is through output types, with files changing, only helpful if deal with a file all output types before going to next file + if File.exist?(@pstorefile) + param_msg='Parameters from pstore' + store=PStore.new(@pstorefile) + store.transaction do |s| + @md=s['md'] + s.commit + end + else #if @fns =~/\.s[123]/ + param_msg='Parameters extracted' + fns_array=IO.readlines(@fns,'') + @md=SiSU_Param::Instructions.new(fns_array,@fns,@cmd) + end + @@md=@md + else + @@md + end + tell=SiSU_Screen::Ansi.new(@cmd,param_msg,@@md.title) + tell.txt_grey if @cmd =~/[MV]/ + @@md.cmd=@cmd + @@md + end + class Instructions + @doc={ :lv=>[] } + @doc[:fns],@doc[:fnb],@doc[:scr_suffix]='','','' + @@publisher='SiSU scribe' + attr_accessor :cmd,:mod,:env,:fn,:fns,:fnb,:fnn,:fnt,:fnl,:flv,:fnstex,:ocn,:sfx_src,:sfx,:pdf,:file_type,:dir_out,:dir_tex,:dir_lout,:txt_path,:site_skin,:sisu,:sisu_version,:ruby_version,:title,:dc_title,:html_title,:subtitle,:subtitle_tex,:creator_home,:dc_creator,:translator,:illustrator,:prepared_by,:digitized_by,:dc_subject,:dc_description,:dc_publisher,:dc_contributor,:dc_date,:dc_date_created,:dc_date_issued,:dc_date_available,:dc_date_valid,:dc_date_modified,:date_scheme,:date_created_scheme,:date_issued_scheme,:date_available_scheme,:date_valid_scheme,:date_modified_scheme,:dc_type,:dc_format,:dc_identifier,:dc_source,:dc_language,:language_original,:dc_relation,:dc_coverage,:dc_rights,:keywords,:comments,:abstract,:cls_loc,:cls_dewey,:cls_pg,:cls_isbn,:papersize,:toc,:lv1,:lv2,:lv3,:lv4,:lv5,:lv6,:pagenew,:pagebreak,:num_top,:toc_lev_limit,:flag_endnotes,:flag_auto_endnotes,:flag_separate_endnotes,:flag_separate_endnotes_make,:flag_auto_heading_num,:markup,:markup_instruction,:markup_version,:markup_declared,:make_bold,:make_italic,:flag_pdf,:flag_tables,:vocabulary,:doc_skin,:doc_css,:yaml,:lnk,:prefix_a,:prefix_b,:suffix,:information,:contact,:icon,:image,:ad_url,:ad_png,:ad_alt,:ad_began,:flag_promo,:promo,:ad_home,:stmp,:stmpd,:sc_filename,:sc_number,:sc_date,:sc_time,:sc_info,:yamladdr,:locale,:wc_lines,:wc_words,:wc_bytes,:file_encoding,:file_size,:user,:home,:hostname,:pwd,:firstseg,:programs,:creator_copymark,:lang,:en,:dgst,:dgst_skin,:generated,:tags,:tag_array,:concord_make,:seg_names,:seg_autoname_safe,:set_header_title,:set_heading_top,:set_heading_seg,:heading_seg_first,:heading_seg_first_flag,:base_program + def initialize(fns_array,opt) + @env=@fn=@fns=@fnb=@fnn=@fnt=@fnl=@flv=@fnstex=@ocn=@sfx_src=@sfx=@pdf=@file_type=@dir_out=@dir_tex=@dir_lout=@txt_path=@flag_endnotes=@flag_auto_endnotes=@flag_separate_endnotes=@flag_separate_endnotes_make=@site_skin=@sisu=@sisu_version=@ruby_version=@title=@dc_title=@html_title=@subtitle=@subtitle_tex=@creator_home=@dc_creator=@translator=@illustrator=@prepared_by=@digitized_by=@dc_subject=@dc_description=@dc_publisher=@dc_contributor=@dc_date=@dc_date_created=@dc_date_issued=@dc_date_available=@dc_date_valid=@dc_date_modified=@date_scheme=@date_created_scheme=@date_issued_scheme=@date_available_scheme=@date_valid_scheme=@date_modified_scheme=@dc_type=@dc_format=@dc_identifier=@dc_source=@dc_language=@language_original=@dc_relation=@dc_coverage=@dc_rights=@keywords=@comments=@abstract=@cls_loc=@cls_dewey=@cls_pg=@cls_isbn=@papersize=@toc=@lv1=@lv2=@lv3=@lv4=@lv5=@lv6=@pagenew=@pagebreak=@num_top=@toc_lev_limit=@flag_auto_heading_num=@make_bold=@make_italic=@flag_pdf=@flag_tables=@vocabulary=@doc_skin=@doc_css=@yaml=@lnk=@prefix_a=@prefix_b=@suffix=@information=@contact=@icon=@ad_url=@ad_png=@ad_alt=@ad_began=@promo=@ad_home=@stmp=@stmpd=@sc_filename=@sc_number=@sc_date=@sc_time=@sc_info=@yamladdr=@locale=@wc_lines=@wc_words=@wc_bytes=@file_encoding=@file_size=@firstseg=@programs=@creator_copymark=@lang=@en=@dgst=@dgst_skin=@generated=@heading_seg_first=@base_program=nil + @data,@fns,@cmd,@mod,@opt=fns_array,opt.fns,opt.cmd,opt.mod,opt #@data used as data + @flag_tables,@set_header_title,@set_heading_top,@set_heading_seg,@heading_seg_first_flag,@flag_promo=false,false,false,false,false,false + @seg_autoname_safe=true + @markup_instruction,@markup_declared,@image='','','' #check which other values should be set to empty rather than nil + @markup=@markup_instruction #use @markup_instruction + @flv,@lang,@seg_names,@tags,@tag_array,@tag_a=Array.new(6){[]} + @doc,@fn,@make_italic,@make_bold,@tag_hash={},{},{},{},{},{} + begin + rescue; SiSU_Errors::Info_error.new($!,$@,@cmd,@fns).error + ensure + end + end + protected + def determine_papersize(l) + l=case l + when /eu|europe|uk/i; 'A4' #European default, SiSU default + when /(?:us-)?legal|legal/i; 'US_legal' #U.S. alternative + when /(?:us-)?letter|u.s.|us/i; 'US_letter' #U.S. default + when /book_a5|a5/i; 'book_a5' + when /book_b5|b5|book/i; 'book_b5' #book default - larger + else 'A4' + end + end + def extract + @user,@home,@hostname,@pwd=ENV['USER'],ENV['HOME'],ENV['HOSTNAME'],ENV['PWD'] + @programs,@wc,@dc_language,@language_original={},{},{},{} + @en={ :sum=>0,:mark=>0,:note=>0,:mismatch=>0 } + @prog=SiSU_Env::Info_settings.new + @sys=SiSU_Env::System_call.new + @env=SiSU_Env::Info_env.new(@fns) #watch + if @prog.wc and @sys.wc + wc=%x{wc #{fns}} + wca=wc.scan(/\d+/) + @wc_lines,@wc_words,@wc_bytes=wca[0].to_i,wca[1].to_i,wca[2].to_i + else + fns_a=@data.dup + tmp=fns_a.join + fns_a=tmp.scan(/\S+/) + @wc_words=fns_a.length + fns_a=tmp=nil + end + @concord_make=if @wc_words > @env.concord_max; false + else true + end + @locale=@sys.locale + @file_encoding=@sys.file_encoding(fns,@cmd) + # programs set here for things that affect output appearance only + @programs[:pdf]=SiSU_Env::System_call.new.program_found?('pdflatex') + if @env.i18n.multilingual + m=/((.+?)(?:\~\w{2,3})?)\.([_-]?sst)$/ #watch added match for sss + @fnn,@fnb,@fnt=@fns[m,1],@fns[m,2],@fns[m,3] + @flv=@env.document_language_versions_found[:f] + else m=/(.+?)\.([_-]?sst)$/ + @fnb=@fnn=@fns[m,1] + @fnt=@fns[m,2] + @flv<<@fns + end + @papersize=@env.papersize #'A4' #default size #get first from SiSU_Env:: # @env is probably no longer most appropriate name! as default info is more general + @sfx_src=@fns[m,2] + @sfx=nil + @flag_pdf=true #watch + @flag_auto_heading_num=false +#watch + if @fns =~ /[_-]?sst$/ #watch + @env_out_root=@env.path.output + @dir_out="#{@env.path.output}/#@fnb" + @dir_tex=@env.path.tex + @dir_lout=@env.path.lout + @@publisher='SiSU http://www.jus.uio.no/sisu' + end + @txt_path=@txt_path ||= @env.path.output + @stmp=%{#@fns}[/^(.+?)\..*/m,1] + @fnstex=@fns.gsub(/_/,'\_') + @flag_separate_endnotes=false + @flag_separate_endnotes_make=true + regx_date=/^\d{4}(?:-(?:[0][0-9]|1[0-2])(-(?:[0-2][0-9]|3[01]))?)?$/ + ver=SiSU_Env::Info_version.new + @sisu_version=ver.get_version + @ruby_version=ver.rbversion + @generated=Time.now + fns_array=@data.dup + skip unless fns_array # consider + @markup_version=SiSU_Markup::Markup_identify.new(fns_array,@opt).markup_version? #% determine markup version + if fns_array[0] =~ /^(?:% )?(?:SiSU\s+[\d.]*|sisu-[\d.]+)$/ #check markup and markup version + if fns_array[0] =~ /^(?:% )?(?:SiSU\s+|sisu-)[\d.]+$/ #check markup and markup version + @markup_version_declared=fns_array[0].match(/^(?:% )?(?:SiSU\s+|sisu-)([\d.]+)$/)[1] + sm_a,sm_b,sm_c=fns_array[0].match(/^(?:% )?(?:SiSU\s+|sisu-)([0-9]+)?(?:\.([0-9]+))?(?:\.([0-9]+))?$/)[1..3] + sm_c ||=0 + sv=if @cmd =~/[VMv]/; "SiSU version (#{@sisu_version[:version]})" + else '' + end + s_a,s_b,s_c=@sisu_version[:version].match(/^([0-9]+)?(?:\.([0-9]+))?(?:\.([0-9]+))?$/)[1..3] + tell=if @markup_version_declared.to_f == @markup_version.to_f + SiSU_Screen::Ansi.new(@cmd,"Markup version (#@markup_version)",sv) + else + SiSU_Screen::Ansi.new(@cmd,"Markup version declared (#@markup_version_declared), determined (#@markup_version)",sv) + end + ok=if s_a.to_i > sm_a.to_i + true + elsif s_a.to_i == sm_a.to_i and s_b.to_i >= sm_b.to_i + true + elsif s_a.to_i == sm_a.to_i and s_b.to_i == sm_b.to_i and s_c.to_i >= sm_c.to_i + true + else false + end + if ok + tell.txt_green if @cmd =~/[vVM]/ + else + tell=SiSU_Screen::Ansi.new(@cmd,"Warning: markup version determined (#@markup_version) or markup version declared (#@markup_version_declared) is newer than SiSU version (#{@sisu_version[:version]})") + tell.warn unless @cmd =~/q/ + end + else + tell=SiSU_Screen::Ansi.new(@cmd,'No SiSU markup version provided') + tell.warn if @cmd =~/[VM]/ + end + else + tell=SiSU_Screen::Ansi.new(@cmd,'SiSU filetype indicator not provided') + tell.warn unless @cmd =~/q/ + end + fns_array.each do |par| #% Scan document + para=par.gsub(/\n/,' ') + if para !~/^\%+\s/ and para =~/<![abcdeghijklmnopqrstuvwxyz]/i # <!f not included + raise "Old markup style in file #@fns, current version #{@sisu_version[:project]} #{@sisu_version[:version]} #{@sisu_version[:date_stamp]} #{@sisu_version[:date]}:\n\t\t#{para}\n\n" + end + regx_header=/^(?:0~|@\S+?:[+-]?\s)/ + if para =~regx_header #or para=~/^(?:1|:?A)~/ + case para + when /^(?:0~ocn|@ocn:)\s+(.+?)$/m; @ocn=$1 #% processing + when /^(?:0~title|@title:)\s+(.+?)$/m #% metainfo DC + @title=$1.strip + @dc_title=@title.dup + @html_title=@title.gsub(/(<p>|<p \/>|<br>|<br \/>)/,'') + @set_header_title=true + @title.chomp!(' ') + @html_title.chomp!(' ') + tell=SiSU_Screen::Ansi.new(@cmd,'Parameters',@html_title) + tell.txt_grey unless @cmd =~/q/ + when /^(?:0~subtitle|@subtitle:)\s+(.+?)$/m #% metainfo + @subtitle=$1.strip + @dc_title="#{@title} - #{@subtitle}" + @subtitle_tex=@subtitle + when /^(?:0~(creator|author)-?|@(creator|author)-?:)\s+/ #% metainfo DC + if para[/(?:0~|@)(?:creator|author):?\s+((?:https?|ftp)\S+)\s+(.+?)$/m] + @creator_home, @dc_creator=$1,$2 + else @dc_creator=/(?:0~|@)(?:creator|author)-?:?\s+(.+?)$/m.match(para)[1] + end + @creator_copymark=if para=~/(?:0~|@)(?:creator|author)-:?/; false + else true + end + @dc_creator.strip! + when /^(?:0~(?:translator|translated_by)|@(?:translator|translated_by):)\s+(.+?)$/m #% metainfo + @translator=$1 + when /^(?:0~(?:illustrator|illustrated_by)|@(?:illustrator|illustrated_by):)\s+(.+?)$/m #% metainfo + @illustrator=$1 + when /^(?:0~prepared_by|@prepared_by:)\s+(.+?)$/m #% metainfo + @prepared_by=$1 + when /^(?:0~digitized_by|@digitized_by:)\s+(.+?)$/m #% metainfo DC + @digitized_by=$1 + when /^(?:0~subject|@subject:)\s+(.+?)$/m #% metainfo DC + @dc_subject=$1 + when /^(?:0~description|@description:)\s+(.+?)$/m #% metainfo DC & rss feed + @dc_description=$1 + when /^(?:0~contributor|@contributor:)\s+(.+?)$/m #% metainfo DC + @dc_contributor=$1 + when /^(?:0~publisher|@publisher:)\s+(.+?)$/m #% metainfo DC + @dc_publisher=$1 + when /^(?:0~|@)date.+?$/m #% metainfo DC + if para =~/(?:0~date|@date:)\s+(.+?)$/m + @dc_date=$1.strip + if @dc_date !~regx_date and not @dc_date.empty? + tell=SiSU_Screen::Ansi.new(@cmd,'Date Format should be','YYYY-MM-DD','please correct document','Date','field, current value:',@dc_date) + tell.instruct if @cmd =~/v/ + end + @date_scheme='scheme="ISO-8601"' if @dc_date =~/\d{4}-\d{2}-\d{2}/ + end + if para =~/(?:0~date\.created|@date\.created:)\s*(.+?)$/m + date=$1.strip + if date !~regx_date and not date.empty? + tell=SiSU_Screen::Ansi.new(@cmd,'Date Format should be','YYYY-MM-DD','please correct document','Date','field, current value:',date) + tell.instruct if @cmd =~/v/ + end + @dc_date_created=date + @date_created_scheme='scheme="ISO-8601"' if date =~/\d{4}-\d{2}-\d{2}/ + end + if para =~/(?:0~date\.issued|@date\.issued:)\s*(.+?)$/m + date=$1.strip + if date !~regx_date and not date.empty? + tell=SiSU_Screen::Ansi.new(@cmd,'Date Format should be','YYYY-MM-DD','please correct document','Date','field, current value:',date) + tell.instruct if @cmd =~/v/ + end + @dc_date_issued=date + @date_issued_scheme='scheme="ISO-8601"' if date =~/\d{4}-\d{2}-\d{2}/ + end + if para =~/(?:0~date\.available|@date\.available:)\s*(.+?)$/m + date=$1.strip + if date !~regx_date and not date.empty? + tell=SiSU_Screen::Ansi.new(@cmd,'Date Format should be','YYYY-MM-DD','please correct document','Date','field, current value:',date) + tell.instruct if @cmd =~/v/ + end + @dc_date_available=date + @date_available_scheme='scheme="ISO-8601"' if date =~/\d{4}-\d{2}-\d{2}/ + end + if para =~/^(?:0~date\.valid|@date\.valid:)\s*(.+?)$/m + date=$1.strip + if date !~regx_date and not date.empty? + tell=SiSU_Screen::Ansi.new(@cmd,'Date Format should be','YYYY-MM-DD','please correct document','Date','field, current value:',date) + tell.instruct if @cmd =~/v/ + end + @dc_date_valid=date + @date_valid_scheme='scheme="ISO-8601"' if date =~/\d{4}-\d{2}-\d{2}/ + end + if para =~/^(?:0~date\.modified|@date\.modified:)\s*(.+?)$/m #% of interest rss feed & sitemap + date=$1.strip + if date !~regx_date and not date.empty? + tell=SiSU_Screen::Ansi.new(@cmd,'Date Format should be','YYYY-MM-DD','please correct document','Date','field, current value:',date) + tell.instruct if @cmd =~/v/ + end + @dc_date_modified=date + @date_modified_scheme='scheme="ISO-8601"' if date =~/\d{4}-\d{2}-\d{2}/ + end + when /^(?:0~type|@type:)\s+(.+?)$/m; @dc_type=$1 #% metainfo DC + when /^(?:0~format|@format:)\s+(.+?)$/m; @dc_format=$1 #% metainfo DC + when /^(?:0~identifier|@identifier:)\s+(.+?)$/m; @dc_identifier=$1 #% metainfo DC + when /^(?:0~source|@source:)\s+(.+?)$/m; @dc_source=$1 #% metainfo DC + when /^(?:0~language(?:\.document)?|@language(?:\.document)?:)\s+(.+?)$/m #% metainfo DC + x=$1.strip + lang=SiSU_Env::Standardise_language.new(x.dup) + @dc_language[:code]=lang.code + @dc_language[:name]=lang.title + when /^(?:0~language\.original|@language\.original:)\s+(.+?)$/m #% metainfo DC + x=$1.strip + lang=SiSU_Env::Standardise_language.new(x.dup) + @language_original[:name]=lang.title + when /^(?:0~relation|@relation:)\s+(.+?)$/m; @dc_relation=$1 #% metainfo DC + when /^(?:0~coverage|@coverage:)\s+(.+?)$/m; @dc_coverage=$1 #% metainfo DC + when /^(?:0~rights|@rights:)\s+(.+?)$/m; @dc_rights=$1 #% metainfo DC copyright, public domain, copyleft, creative commons, etc. + when /^(?:0~papersize|@papersize:)\s+(.+?)$/m #% metainfo DC + l=$1 + if @mod.inspect !~/--papersize[=-]\S+/ + l=determine_papersize(l.dup) + @papersize=l + end + when /^(?:0~keywords?|@keywords?:?)\s+(.+?)$/m; @keywords=$1 #% metainfo DC + when /^(?:0~comments?|@comments?:?)\s+(.+?)$/m; @comments=$1 #% metainfo DC + when /^(?:0~abstract|@abstract)\s+(.+?)$/m; @abstract=$1 #% metainfo DC + when /^(?:0~tags?|@tags?:)\s+\S/m #% metainfo + tags=par.match(/^(?:0~tags?|@tags?:)\s+(.+)$/m)[1] + tags.split(/,|$/).each do |tag| + tag.strip! + @tags << tag + @tag_array << tag.split(/:/) + tag_a = tag.downcase.gsub(/\s+/,'_').gsub(/(.+)/,'[\1]') + tag_a=tag_a.split(/:/).join('][') + @tag_a << tag_a + end + when /^(?:0~catalogue|@catalogue:)\s+(.+)?$/m #% metainfo + m=$1 + m.split(/;?\s+/) #spaces within a catalogue category not permitted, e.g. isbn + #tags=par.match(/^(?:0~tags?|@tags?:)\s+(.+)$/im)[1] + m.each do |c| + case c + when /pg=/; @cls_pg=c.match(/pg=(\S+)/)[1] + when /isbn=/; @cls_isbn=c.match(/isbn=(\S+)/)[1] + when /dewey=/; @cls_dewey=c.match(/dewey=(\S+)/)[1] + when /loc=/; @cls_loc=c.match(/loc=(\S+)/)[1] + end + end + when /^(?:0~class(?:ify)?_loc|@class(?:ify)?_loc:)\s+(.+?)$/m; @cls_loc=$1 #% metainfo + when /^(?:0~class(?:ify)?_dewey|@class(?:ify)?_dewey:)\s+(.+?)$/m; @cls_dewey=$1 #% metainfo + when /^(?:0~class(?:ify)?_pg|@class(?:ify)?_pg)\s+(.+?)$/m; @cls_pg=$1 #% metainfo + when /^(?:0~(?:class(?:ify)?_)?isbn|@(?:class(?:ify)?_)?isbn)\s+(\S+?)$/m; @cls_isbn=$1 #% metainfo + when /^(?:0~images?|@images?:)\s+(.+?)$/m; @image=$1 #% processing + when /^(?:0~(?:toc|structure)|@(?:toc|structure):)\s+(.+?)$/m #% processing + doc_toc_str=$1 + @toc=doc_toc_str.split(/;\s*/) + #@toc.each {|x| x.gsub!(/\{/,'\{') } #FIX~ + lv1=@toc[0] ||='1~ ' #some arbitrary changes made + @lv1=/^#{lv1}\b/ + lv2=@toc[1] ||='2~ ' + @lv2=/^#{lv2}\b/ + lv3=@toc[2] ||='3~ ' + @lv3=/^#{lv3}\b/ + lv4=@toc[3] ||='4~ ' + @lv4=/^#{lv4}\b/ + lv5=@toc[4] ||='5~ ' + @lv5=/^#{lv5}\b/ + lv6=@toc[5] ||='6~ ' + @lv6=/^#{lv6}\b/ + when /^(?:0~(?:level|page|markup)|@(?:level|page|markup):)\s+(.+?)$/m #% processing revisit..., use syntax 0~level new=1,2,3; break=4 + if para =~/(?:0~|@)(?:markup|level|page):?\s+(.+?)$/m + page_break_str=$1 + pagebreaks=page_break_str.split(/;\s*/) + page_new,page_break,num_top=toc_lev_limit=nil + pagebreaks.each do |x| + page_new = x[/(:?[\dA-C],?)+/] if x=~/new|clear/ + page_break = x[/(:?[\dA-C],?)+/] if x =~/break/ + num_top = x[/:?[\dA-C]/].to_i if x =~/num_top/ + toc_lev_limit = x[/:?[\dA-C]/].to_i if x =~/toc_limit/ + end + @pagenew=page_new if page_new + @pagebreak=page_break if page_break + @num_top=num_top if num_top + @toc_lev_limit=toc_lev_limit if toc_lev_limit + @flag_auto_heading_num=true if para =~/num_top/ + end + if para =~/^(?:0~markup|@markup:)\s+(.+?)$/m #%use of markup depreciated for num_top + @markup=$1 + @flag_auto_heading_num=true if para =~/num_top/ + @flag_pdf=false if para =~/pdf_no/ or para =~/url_png/ + end + when /^(?:0~bold|@bold:)\s+(.+?)$/m #% processing + m=$1.strip + x=case m + when /\/i$/; 'i' + else '' + end + m.gsub!(/^\/(.+?)\/i?/,'\1') + m.gsub!(/\(/,'(?:') # avoid need to escape use of brackets within regex provided + rgx='\b(' + m + ')\b' + @make_bold[:str]='\b(?:' + m + ')\b' + @make_bold[:regx]=if x =~/i/; /#{rgx}/i + else /#{rgx}/ + end + @make_bold + when /^(?:0~(?:italics?|itali[sz]e)|@(?:italics?|itali[sz]e):)\s+(.+?)$/m #% processing Dublin Core - dublin core within + m=$1.strip + x=case m + when /\/i$/; 'i' + else '' + end + m.gsub!(/^\/(.+?)\/i?/,'\1') + m.gsub!(/\(/,'(?:') # avoid need to escape use of brackets within regex provided + rgx='\b(' + m + ')\b' + @make_italic[:str]='\b(?:' + m + ')\b' + @make_italic[:regx]=if x =~/i/; /#{rgx}/i + else /#{rgx}/ + end + @make_italic + when /^(?:0~(?:vocabulary|wordlist)|@(?:vocabulary|wordlist):)\s+(.+?)$/m #% processing + @vocabulary=$1 #not actually used by concordance + when /^(?:0~skin|@skin:)\s+(.+?)$/; @doc_skin=$1.strip #% processing + when /^(?:0~(?:css|stylesheet)|@(?:css|stylesheet):)\s+(.+?)$/; @doc_css=$1.strip #% processing + when /^(?:0~links|@links:)\s+(.+?)$/m #% processing + doc_links_str=$1 + @lnk=[] + if doc_links_str=~/\{.+?\}(?:(?:https?|ftp):\/|\.\.)\/\S+(?:\s|$)/ + doc_links=doc_links_str.scan(/\{.+?\}(?:(?:https?|ftp):\/|\.\.)\/\S+/) + count=1 + doc_links.each do |x| + @lnk[count]={} + @lnk[count][:say],@lnk[count][:url]=/\{\s*(.+?)\s*\}((?:(?:https?|ftp):\/|\.\.)\/\S+)/im.match(x)[1,2] + count +=1 + end + else + lnks=doc_links_str.split(/;\s+/) + count=1 + lnks.each do |x| + @lnk[count]={} + if x =~/^\s*(?:(?:https?|ftp):\/\/|\.\.\/)/; @lnk[count][:url]=x + else + @lnk[count][:say]=x + count +=1 + end + end + end + when /^(?:0~prefix(?:_[ab])?|@prefix(?:_[ab])?:)\s/ #% metainfo + if para =~/prefix_a:?\s+/ + @prefix_a=para[/(?:0~prefix_a|@prefix_a:)\s+(.+?)$/im,1] + end + if para =~/prefix(?:_b)?:?\s+/ + @prefix_b=para[/(?:0~prefix(?:_b)?|@prefix(?:_b)?:)\s+(.+?)$/im,1] + end + when /^(?:0~suffix|@suffix:)\s+(.+?)$/m; @suffix=$1 #% metainfo + when /^(?:0~information|@information:)\s+(.+?)$/m; @information=$1 #% metainfo + when /^(?:0~contact|@contact:)\s+(.+?)$/m; @contact=$1 #% metainfo + when /^(?:0~icon|@icon:)\s+(.+?)$/m; @icon=$1 #% processing + when /^(?:0~promo|@promo:)\s+(.+?)$/m + @flag_promo=true + @promo=$1.split(/[,;]\s*/) + when /^(?:0~ad|@ad:)\s+(\S+)?\s+(\S+\.png)?\s+(.+?!)\s+(\d+)\s*$/m #% processing + @ad_url,@ad_png,@ad_alt,@ad_began=$1,$2,$3,$4 + when /0~ad\.home\s+(.+)?\s*$/m #% processing + ad_home_str=$1 + @ad_home=ad_home_str.split(/\s+!/) + when /^(?:0~sta?mp(?:ed)?|@sta?mp(?:ed)?:)\s+(.+?)$/m; @stmp= $1.downcase! #% processing + when /^(?:0~(?:rcs|cvs)|@(?:rcs|cvs):)\+?\s+/ #% processing + m=/(?:0~(?:rcs|cvs)|@(?:rcs|cvs):)\+?\s+/ #note the + sign to turn on use of rcs or cvs id + ver=para[/#{m}(.+)/,1] #RCS or CVS ID tag # eg. # $Id$ + contains=/[\$]Id:\s+(\S+),v\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+Exp\s+(?:\S+\s+)?[\$]/ # reason for [$] which is apparently unnecessary is that rcs or cvs will otherwise expand id! + if contains.match(ver) + filename,vnumber,date,time,operator=contains.match(ver).captures + @sc_filename,@sc_number,@sc_date,@sc_time=filename,vnumber,date,time + end + @sc_info=true if para[/(?:0~(?:rcs|cvs)|@(?:rcs|cvs):)\+/] + when /^@base_program:\s+(.+?)$/; @base_program=$1 #% processing + #% break - break, not necessary to process headers further :-) but necessary to extract endnotes etc. ;-( + end + @lv1 ||=/^1~/ + @lv2 ||=/^2~/ + @lv3 ||=/^3~/ + @lv4 ||=/^4~/ + @lv5 ||=/^5~/ + @lv6 ||=/^6~/ + if @dc_creator + @dc_rights ||=if @dc_date =~/([12][890]\d{2})/ #matches years 1800 through 20\d\d 2004w19 + ('Copyright ' + @dc_creator) + ' ' + $1 + else 'Copyright ' + @dc_creator + end + end + else #% + if para =~ /^(?:1|:?A)~/ #% processing + if para=~/^:?A~/ + if @markup.nil? or @markup.empty?; @markup=@markup_version.to_s + elsif @markup !~/0\.38/; @markup=@markup.strip + "; #@markup_version" + end + end + if (para=~/^:?A~/ and @markup_version >= 0.38) or (para=~/^1~/ and @markup_version < 0.38) + if @title.nil? + @title=para[/^:?[A1]~\S*(.+)$/m,1] + @html_title=@title.gsub(/(<p>|<p \/>|<br>|<br \/>)/,'') + @title.chomp!("\n") + @html_title.chomp!("\n") + tell=SiSU_Screen::Ansi.new(@cmd,'Parameters',@html_title) + tell.txt_grey if @cmd =~/v/ + end + end + end + case para + when /~\{\s+.+?\}~/ #% processing + en=para.scan(/~\{.+?\}~/) + en.each { |e| @en[:sum] +=1 } + when /~\^(?:\s|$)/ #% processing + mk=para.scan(/~\^(?:\s|$)/) + mk.each { |e| @en[:mark] +=1 } + when /^\^~\s+\S/; @en[:note] +=1 #% processing + end + if para =~/~\{|\^~ |~\^|<:ee>/; @flag_auto_endnotes,@flag_endnotes=true,true + end + unless @flag_auto_endnotes + if para =~/^(4~endnotes\b|<:ee>)/ + @flag_separate_endnotes=true + @flag_endnotes=true + end + end + if para =~/^(?:4~endnotes|<:ee>)/; @flag_separate_endnotes_make=false + end + if para =~/<!!e[#0-9]+?!>\s*.+/; @flag_endnotes=true + end + if para =~/table\{|<!tableh?\s+c\d+;.+?!>/i; @flag_tables=true + end + end + if (@markup_version >= 0.38 and para =~/^:?A~/) or (@markup_version < 0.38 and para =~/^1~/) + @set_heading_top=true + end + if (@markup_version >= 0.38 and para =~/^1~/) or (@markup_version < 0.38 and para =~/^4~/) + m=nil + if @markup_version >= 0.38 and para =~/^1~(\S+)\s+(.+)$/; m,t=$1,$2 + elsif @markup_version < 0.38 and para =~/^4~(\S+)\s+(.+)$/; m,t=$1,$2 + elsif @markup_version >= 0.38 and para =~/^1~\s+(.+)$/; t=$1 + elsif @markup_version < 0.38 and para =~/^4~\s+(.+)$/; t=$1 + end + unless @heading_seg_first_flag # extract first segment name + @heading_seg_first=t + @heading_seg_first_flag=true + end + if m # list all segment names + @seg_names << m + @set_heading_seg=true + @seg_autoname_safe=false if m=~/^\d{1,3}/ and m !~/^0/ + end + end + end #% here endeth the document loop + if @markup_version.to_f >= 0.38 #convert values in headers to internal representation + translated=[] + translate_list=[@pagenew,@pagebreak,@num_top,@toc_lev_limit] + translate_list.each do |t| + translate = t.to_s if t + translated << if translate + #translate.gsub!(/6/,'9') + #translate.gsub!(/5/,'8') + #translate.gsub!(/4/,'7') + translate.gsub!(/3/,'6') + translate.gsub!(/2/,'5') + translate.gsub!(/1/,'4') + translate.gsub!(/:?C/,'3') + translate.gsub!(/:?B/,'2') + translate.gsub!(/:?A/,'1') + translate=if translate =~/^\d+$/; translate.to_i + else translate + end + else nil + end + end + @pagenew,@pagebreak,@num_top,@toc_lev_limit=translated + @markup.gsub!(/page_new\s*=\s*([\dA-C])/,"page_new=#@pagenew") + @markup.gsub!(/page_break\s*=\s*([\dA-C])/,"page_break=#@pagebreak") + @markup.gsub!(/num_top\s*=\s*([\dA-C])/,"num_top=#@num_top") + @markup.gsub!(/toc_lev_limit\s*=\s*([\dA-C])/,"toc_lev_limit=#@toc_lev_limit") + end + if @mod.inspect =~/--papersize[=-]\S+|--pdf[=-]\S+/ or @mod.inspect =~/--(?:a4|letter|legal|book|a5|b5)\b/i #command line config/header override + @papersize=determine_papersize(@mod.inspect) + end + if @sys.openssl !=false + skin=if @doc_skin; SiSU_Env::Info_skin.new(@opt,@doc_skin).select + else SiSU_Env::Info_skin.new(@opt).select + end + @dgst,@dgst_skin=[],[] + if @env.digest.type =~/sha256/ + @dgst=@sys.sha256(@fns) + @dgst_skin=if skin; @sys.sha256(skin) + else nil + end + else + @dgst=@sys.md5(@fns) + @dgst_skin=if skin; @sys.md5(skin) + else nil + end + end + end + @dc_publisher ||= "#@@publisher (this copy)" + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(@fns) + unless @dc_language[:code] and @dc_language[:name] + lang=@env.i18n.language #default language settings for directory by name, or in sysrc.yml + @dc_language[:code] ||= lang.code + @dc_language[:name] ||= lang.title + end + unless fn_set_lang[:d]==true #decide, naming convention overrides other settings, within document, etc. + @dc_language[:code]=fn_set_lang[:c] + @dc_language[:name]=fn_set_lang[:l] + end + @fnl=@env.i18n.lang_filename(fn_set_lang[:c]) + @flv.each do |l| + lang=SiSU_Env::Standardise_language.new.file_to_language(l) + c={ :a=>'',:b=>'',:c=>'' } + if @fnl[:pre] =~/\S/; c[:a]="#{lang[:c]}." + elsif @fnl[:mid] =~/\S/; c[:b]=".#{lang[:c]}" + elsif @fnl[:post] =~/\S/; c[:c]=".#{lang[:c]}" + end + @lang << [lang[:l],"#{c[:a]}sisu_manifest#{c[:b]}.html#{c[:c]}"] + end if @flv + @lang.uniq! + @fn=SiSU_Env::Env_call.new(@fns).lang(fn_set_lang[:c]) + if @en[:note] > 0 and @en[:sum] > 0 + if @en[:sum] > 0 + else tell=SiSU_Screen::Ansi.new(@cmd,'both endnote styles used',"~{ #{@en[:sum]} }~ and ^~ #{@en[:mark]}") + tell.warn if @cmd !~/q/ + end + end + if @en[:mark] != @en[:note] and @en[:note] > 0 + @en[:mismatch]=@en[:note] - @en[:mark] + SiSU_Screen::Ansi.new(@cmd,'endnote number mismatch',"endnotes: #{@en[:note]} != endnote reference marks: #{@en[:mark]} (difference = #{@en[:mismatch]})").warn if @cmd !~/q/ + footnote_conversion_errors=File.new("#{Dir.pwd}/footnote_conversion_errors.txt",'a') + footnote_conversion_errors << "#@fns:\n\tendnotes: #{@en[:note]} != endnote reference marks: #{@en[:mark]} (difference = #{@en[:mismatch]})\n" + end + if @title !~/[\S]/ + tell=SiSU_Screen::Ansi.new(@cmd,'Document Title Missing','please provide it') + tell.warn if @cmd =~/v/ + end + if @dc_creator !~/[\S]/ + tell=SiSU_Screen::Ansi.new(@cmd,'Document Creator/Author Missing','please provide it') + tell.warn if @cmd =~/v/ + end + # Elementary Document Structure Analysis - adds complexity may remove - need to develop - appears to work, proof of concept + if @title.nil? + title_trigger=nil + fns_array.each do |para| + if para !~/0~|@\S+:[+-]?\s/ and para =~/\S/ and title_trigger.nil? + @title=para[/(\S.+)/m,1] + @html_title=@title.gsub(/(<p>|<p \/>|<br>|<br \/>)/,'') + @title.chomp!("\n") + @html_title.chomp!("\n") + title_trigger=1 + tell=SiSU_Screen::Ansi.new(@cmd,@html_title) + tell.txt_cyan unless @cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@cmd,'Parameters') + tell.txt_grey unless @cmd =~/q/ + end + end + end + @struct={} + doc_struct=Hash.new(0) + if @lv1.nil? + fns_array.each do |para| + if para =~/^(Part|Chapter|Section|Article)\b/i + case para + when /^(Part|PART)\b/ + @struct[:part]=doc_struct[:part] + doc_struct[:part]=doc_struct[:part] + 1 + when /^(Chapter|CHAPTER)\b/ + @struct[:chapter]=doc_struct[:chapter] + doc_struct[:chapter]=doc_struct[:chapter] + 1 + when /^(Section|SECTION)\b/ + @struct[:section]=doc_struct[:section] + doc_struct[:section]=doc_struct[:section] + 1 + when /^(Article|ARTICLE)\b/ + @struct[:article]=doc_struct[:article] + doc_struct[:article]=doc_struct[:article] + 1 + when /^(Clause|CLAUSE)\b/ + @struct[:clause]=doc_struct[:clause] + doc_struct[:clause]=doc_struct[:clause] + 1 + when /^\d\..*[^\.]$/ + @struct[:number]=doc_struct[:number] + doc_struct[:number]=doc_struct[:number] + 1 + end + end + end + if doc_struct[:article] > 2 #%~level 4 + @lv4=/^(?:Article|ARTICLE)\b/ + elsif doc_struct[:chapter] > 2 and doc_struct[:article] and doc_struct[:article] < 3 + @lv4=/^(?:Chapter|CHAPTER)\b/ + elsif doc_struct[:clause] > 2 + @lv4=/^(?:Clause|CLAUSE)\b/ + elsif doc_struct[:number] > 2 + @lv4="^\d\..*[^\.]$" + end + if doc_struct[:section] > 2 #%~level 3 + @lv3=/^(?:Section|SECTION)\b/ + end + if doc_struct[:chapter] > 2 and doc_struct[:article] and doc_struct[:article] > 2 + @lv2=/^(?:Chapter|CHAPTER)\b/ + end + if doc_struct[:part] > 2 and @lv[2].nil? + @lv2=/^(?:Part|PART)\b/ + end + if doc_struct[:part] > 2 and @lv[2].to_s !~/Part/ and @lv[1].nil? + @lv1=/^(Part|PART)\b/ + end + end + @lnk=@lnk.compact if @lnk + @lv1 ||=/^1~/ + @lv2 ||=/^2~/ + @lv3 ||=/^3~/ + @lv4 ||=/^4~/ + @lv5 ||=/^5~/ + @lv6 ||=/^6~/ + if @doc_skin + tell=SiSU_Screen::Ansi.new(@cmd,"doc_skin <- #@doc_skin") + tell.txt_grey if @cmd =~/v/ + end + @data=nil #else whole file's contents are stored in md pstore & is not required to be... big waste actually + Store.new(self,@env).store #% pstore + self + end + private + class Store + def initialize(md,dir) + @md=md + @pstorefile="#{dir.path.dal}/#{md.fns}.pstore" + end + def store + File.unlink(@pstorefile) if FileTest.file?(@pstorefile) + tell=SiSU_Screen::Ansi.new(@md.cmd,"PStore -> #@pstorefile") + tell.txt_grey if @md.cmd =~/v/ + store=PStore.new(@pstorefile) + store.transaction do |s| + s['md']=@md + #doc.each{|x,y| puts "#{x}, #{y}; "} + s.commit + end + @@md=@md=nil + end + end + end + end + class Instantiate + def param_instantiate + @@date=SiSU_Env::Info_date.new + @@symlnk=SiSU_Env::Create_system_link.new + @@proc=@@filename_txt=@@filename_texinfo=@@filename_lout_portrait=@@filename_lout_landscape=@@filename_html_scroll=@@filename_html_index=@@filename_html_segtoc=@@filename_semantic=@@filename_rss=@@newfile=@@drr=nil + @doc={ + :initialise=>nil, + :markup=>'',:lnks=>'',:stmp=>'',:prefix_a=>'',:prefix_b=>'', + :req=>{} + } + @@yaml=@@yamladdr=nil + @@flag={} + @@publisher='SiSU scribe' + end + end +end +__END__ diff --git a/lib/sisu/0.52/param_identify_markup.rb b/lib/sisu/0.52/param_identify_markup.rb new file mode 100644 index 00000000..cba6d39d --- /dev/null +++ b/lib/sisu/0.52/param_identify_markup.rb @@ -0,0 +1,87 @@ +=begin + * Name: modify.rb + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: A conversion script for canned substitutions, + a fairly generic simple tool that can be used to store other canned conversions, + used here for altering SiSU markup + + * Copyright (C) 2004, 2006 Ralph Amissah + + * Packaged with: SiSU information Structuring Universe - Structured information, Serialized Units + * SiSU 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 + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Markup + class Markup_identify + @@fns,@@version_determined,@@version_declared,@@declared_doc_type='','','','[text?]' + attr_accessor :version_determined,:version_declared,:declared_doc_type + def initialize(content,opt) + @cont,@opt=content,opt + end + def identify + @version_determined,@version_declared,@declared_doc_type=@@version_determined,@@version_declared,@@declared_doc_type + if @opt.fns != @@fns + if @cont[0] =~ /^(?:%\s+)?SiSU\s+(text|master|insert)\s+([0-9](?:\.[0-9]+){1,2})/ or @cont[0] =~ /^(?:%\s+)?sisu-([0-9](?:\.[0-9]+){1,2})/ + @declared_doc_type,@version_declared=$1,$2 + elsif @cont[0] =~ /^(?:%\s+)?SiSU\s+([0-9](?:\.[0-9]+){1,2})/ or @cont[0] =~ /^(?:%\s+)?sisu-([0-9](?:\.[0-9]+){1,2})/ + @version_declared=$1 + end + @flag_38=false + @cont.each_with_index do |y,i| + if @flag_38 or y =~/^:?A~/ + @version_determined=0.38 + @flag_38=true + break if i >= 200 + if y =~ /(?:~{\*+|~\[\*|~\[\+)\s/ + @version_determined=0.42 #0.38 can safely be treated as 0.42 + break + end + end + if y =~/^0~/ and not @flag_38 + @version_determined=0.16 + break + end + end + @@fns=@opt.fns + @@version_determined,@@version_declared,@@declared_doc_type=@version_determined,@version_declared,@declared_doc_type + end + self + end + def markup_version? + identify.version_determined.to_f + end + end +end +__END__ diff --git a/lib/sisu/0.52/plaintext.rb b/lib/sisu/0.52/plaintext.rb new file mode 100644 index 00000000..eb43dfa8 --- /dev/null +++ b/lib/sisu/0.52/plaintext.rb @@ -0,0 +1,473 @@ +=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: plaintext text generation, stripped plaintext output (unix, linefeed) + + * 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_Plaintext + require SiSU_lib + '/dal' + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/plaintext_format' + include Format + require SiSU_lib + '/shared_txt' + pwd=Dir.pwd + @@alt_id_count,@@alt_id_count,@@tablehead,@@number_of_cols=0,0,0,0 + @@tablefoot='' + class Source + def initialize(opt) + @opt=opt + if @opt.fns =~/(.+?)\.[_-]?sst$/ + case @opt.cmd + when /[af]/; @@dostype='unix footnotes' + when /e/; @@dostype='unix endnotes' + when /[AF]/; @@dostype='msdos footnotes' + when /E/; @@dostype='msdos endnotes' + end + else puts "#{sf} not a processed file type" + end + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get + @env=SiSU_Env::Info_env.new(@opt.fns) + path=@env.path.output_tell + tool=if @opt.cmd =~/[MVv]/; "#{@env.program.text_editor} #{path}/#{@md.fnb}/#{@md.fn[:plain]}" + else '' + end + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Plaintext',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[:plain]}") + 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_Plaintext::Source::Scroll.new(@dal_array,@md).songsheet + SiSU_Env::Info_skin.new(@md).select #watch + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + private + class Split_text_object <Source + require SiSU_lib + '/plaintext_format' + include SiSU_Viz + include Format + @@alt_id_count=0 + @@dp=nil + attr_reader :format,:lev,:text,:ocn,:lev_para_ocn + def initialize(para) + @para=para + @format,@ocn='null','null' + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def lev_segname_para_ocn + @text=nil + if @para =~/^(\d~|<:.+?>).+?<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if /^(([1-6])~(\S+))\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,$5 + elsif /^(([1-6])~)\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@lev,@text,@ocn=$1,$2,$3,$4 + elsif /<:(.+?)>\s*(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@text,@ocn=$1,$2,$3,$4 + elsif /^(([1-6])~(\S+))\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;[um]\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,"x#{@@alt_id_count}" + elsif /^(([1-6])~)\s+(\S.+?)<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,@lev,@text,@ocn=$1,$2,$3,"x#{@@alt_id_count}" + end + else + if /(.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @text,@ocn=$1,$2 + end + if @para !~/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$|^$/ #added 2002w06 + @text=/(.+?)/m.match(@para)[1] + end + if /^((\d)~(?:~\S+)?)\s+(.+)/m.match(@para) + @format,@lev,@text=$1,$2,$3 + end + end + format=@format.dup + @lev_para_ocn=if @para =~/.+<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + Format::Format_text_object.new(format,@text,@ocn) + else + Format::Format_text_object.new(format,@text,"<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>") + end + self + end + end + class Scroll <Source + require SiSU_lib + '/shared_txt' + include SiSU_text_utils + @@endnotes_para=[] + @@plaintext={ :body=>[],:open=>[],:close=>[],:head=>[],:metadata=>[],:tail=>[],:endnotes=>[] } + @@dp=nil + 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>$/ #m # 2004w18 pb pn removal added + @tab="\t" + @br=case md.cmd + when /[af]/ + @@dostype='unix footnotes' + "\n" + when /e/ + @@dostype='unix endnotes' + "\n" + when /[AF]/ + @@dostype='msdos footnotes' + "\r\n" + when /E/ + @@dostype='msdos endnotes' + "\r\n" + else "\n" + end + end + def songsheet + markup + publish + #@data.each { |x| puts x.inspect if x =~/\[table/ } + end + # Used for extraction of endnotes from paragraphs + def extract_endnotes(para='') + notes=para.scan(/~[{\[]([\d*+]+\s+.+?)\s*<#@dp>[}\]]~/) + @n=[] + notes.each do |n| #high cost to deal with <br> appropriately within plaintext, consider + n=n.dup.to_s + if n =~/<br(?: \/)?>/ + fix = n.split(/<br(?: \/)?>/) #watch #added + fix.each do |x| + unless x.empty?; @n << x + end + end + else @n << n + end + end + notes=@n.flatten + notes.each do |e| + util=if e.to_s =~/^\[[\d*+]+\]:/; SiSU_text_utils::Wrap.new(e.to_s,70,4,1) + else SiSU_text_utils::Wrap.new(e.to_s,70,1,1) + end + wrap=util.line_wrap + if wrap =~ /^\s*[\d*+]+\s+.+?\s*\Z/m + wrap.gsub!(/^(\s*)([\d*+]+)\s+(.+?)\s*\Z/m, <<GSUB + +\\1[\\2]: \\3 +GSUB + ) + else + wrap.gsub!(/^(.+)\Z/m, <<GSUB +\\1 +GSUB + ) + end + @@plaintext[:endnotes] << wrap + @@endnotes_para << wrap + end + end + def plaintext_metadata(meta) + util=SiSU_text_utils::Wrap.new(meta.text,70,15,1) + txt=util.line_wrap + @@plaintext[:metadata] <<= if meta.type == 'meta' + <<WOK + +#{@tab}#{meta.el}: #{txt} +WOK + else '' + end + end + def plaintext_tail + SiSU_Env::Info_skin.new(@md).select + vz=SiSU_Env::Get_init.instance.skin + generator="Generated by: #{@md.sisu_version[:project]} #{@md.sisu_version[:version]} of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" if @md.sisu_version[:version] + lastdone="Last Generated on: #{Time.now}" + rubyv="Ruby version: #{@md.ruby_version}" + sc=if @md.sc_info + "Source file: #{@md.sc_filename}#{@br}Version number: #{@md.sc_number}#{@br}Version date: #{@md.sc_date}#{@br}" + else '' + end + @@plaintext[:tail] <<<<WOK +#@br +Other versions of this document: #@br +manifest: + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:manifest]}#@br +html: + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:toc]}#@br +pdf: + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:pdf_p]} + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:pdf_l]}#@br +plaintext (plain text): + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:plain]}#@br +at: + #{vz.url_site}#@br + +#{sc} +* #{generator} +* #{rubyv} +* #{lastdone} +* SiSU #{vz.url_sisu} +WOK + end + def plaintext_structure(para='',lv='',ocn='',hname='') #% Used to extract the structure of a document + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + extract_endnotes(para) + para.gsub!(/~[{\[]([\d*+]+)\s+(?:.+?)[}\]]~/,'[^\1]') # endnote marker marked up + wrapped=if para[@regx] + paragraph=para[@regx,2] + if paragraph.include? '<:i1>' + paragraph.gsub!(/<:i1>/,'') + util=SiSU_text_utils::Wrap.new(paragraph,70,2) + else util=SiSU_text_utils::Wrap.new(paragraph,70,0) + end + util.line_wrap + end + if lv + times=wrapped.length + times=70 if times > 70 + @@plaintext[:body] << case lv + when 1; wrapped.upcase << @br << '*'*times << @br + when 2..3; wrapped.upcase << @br << '='*times << @br + when 4; wrapped.upcase << @br << '-'*times << @br + when 5..6; wrapped.upcase << @br << '.'*times << @br + end + else + @@plaintext[:body] << wrapped << @br # main text, contents, body KEEP + end + if @@endnotes_para and @@dostype =~/footnote/ #edit out to switch off endnotes following paragraph to which they belong + @@plaintext[:body] << @br + @@endnotes_para.each {|e| @@plaintext[:body] << e << @br} + elsif @@endnotes_para and @@dostype =~/endnote/ + @@plaintext[:body] << @br*2 + end + @@endnotes_para=[] + end + def markup # Used for major markup instructions + data=@data + dir=SiSU_Env::Info_env.new(@md.fns) + @data_mod,@endnotes,@level,@cont,@copen,@plaintext_contents_close=Array.new(6){[]} + (0..6).each { |x| @cont[x]=@level[x]=false } + (4..6).each { |x| @plaintext_contents_close[x]='' } + plaintext_tail #($1,$2) + table_message='[table omitted, see other document formats]' + fix=[] + #data.each do |para| #high cost to deal with <br> appropriately within plaintext, consider + # para=para.dup + # if para =~/<br(?: \/)?>/ + # puts para + # fix = para.split(/<br(?: \/)?>/) #watch #added + # fix.each do |x| + # if x =~/\S+/; @data_mod << x + # end + # end + # else @data_mod << para + # end + #end + #data=@data_mod.flatten + data.each do |para| + para.gsub!(/<!Th?¡.+/m,"#@br#{table_message}") + para.gsub!(/.+?<-#>/,'') # remove dummy headings (used by html) #check + para.gsub!(/_\*\s+/,'* ') # bullet markup, marked down + para.gsub!(/©/,'©') # bullet markup, marked down + para.gsub!(/&/,'&') # bullet markup, marked down + para.gsub!(/<sup>(.+?)<\/sup>/,'^\1^') + para.gsub!(/<sub>(.+?)<\/sub>/,'[\1]') + para.gsub!(/<i>(.+?)<\/i>/,'/\1/') + para.gsub!(/<b>(.+?)<\/b>/,'*\1*') + para.gsub!(/<u>(.+?)<\/u>/,'_\1_') + para.gsub!(/<:(?:group|verse|alt|code)(?:-end)?>(?:\s+<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>)?/,'') + para.gsub!(/<:p[bn]>/,'') # remove page breaks + para.gsub!(/^\s*<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/,'') # remove empty lines - check + para.gsub!(/<a href=".+?">(.+?)<\/a>/m,'\1') + para.gsub!(/<:name#\S+?>/,'') # remove name links + para.gsub!(/ /,' ') # decide on + para.gsub!(/\{(\S+?\.(?:png|jpg|gif)) .+?\}(?:(?:https?|ftp):\/\/\S+|image)/,' [ \1 ]') #"[ #{dir.url.images_local}\/\\1 ]") + para.gsub!(/^\{\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"\s*\}\S+/,'[image: "\1"]') + wordlist=para.scan(/\S+/) + if para =~/^0~(\S+)\s+(.+?)\Z/m # for headers + d_meta=SiSU_text_utils::Header_scan.new(@md,para).meta + if d_meta; plaintext_metadata(d_meta) + end + end + if para !~/(^0~|<ENDNOTES>|<EOF>)/ + if para =~@regx #/.+?<~\d+;\w\d+;\w\d+>.*/ #watch change + paranum=para[@regx,3] + @p_num=Format::Paragraph_number.new(paranum) + end + @sto=Split_text_object.new(para).lev_segname_para_ocn + ### problem in scroll, it appears tables are getting paragraph numbers + m=/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if para =~m and para=~/\S+/ + para=case @sto.format + when /^(1)~(?:(\S+))?/ + plaintext_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body1 + when /^(2)~(?:(\S+))?/ + plaintext_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body2 + when /^(3)~(?:(\S+))?/ + plaintext_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)/ # work on see SiSU_text_parts::Split_text_object + plaintext_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body4 + when /^(5)~(?:(\S+))?/ + plaintext_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body5 + when /^(6)~(?:(\S+))?/ + plaintext_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body6 + #when /^(i1)$/ + # #formatMono.gsubBody + # #para=@sto[:lev_para_ocn].scrIndent1 + #when /^(i2)$/ + # formatMono.gsubBody + # para=@sto[:lev_para_ocn].scrIndent2 + #when /^(center)$/ + # para.gsub!(/(.+)/, + # %{<center>(\\1)</center>}) + # para=@sto[:lev_para_ocn].scrPara + #when /^(b|bold)$/ + # para.gsub!(/(.+)/, + # %{<b>(\\1)</b>}) + # para=@sto[:lev_para_ocn].scrPara + #when /null/ # see whether u can improve + # if (para !~/#{@margin.txt_0}|#{@margin.txt_1}|#{@margin.txt_2}/) + # #formatMono.gsubBody + # #para=@sto[:lev_para_ocn].scrPara + # end + else + plaintext_structure(para,nil,nil,nil) #watch may be problematic + para + end + elsif para =~/#{table_message}/ + @@plaintext[:body] << para << @br + elsif para =~/(Note|Endnotes?)/ and para !~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + elsif para =~/(MetaData)/ and para =~/<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>$/ #debug 2003w46 add rc info ####suspect visit + #formatMono=MonoSiSU.new('<br /><a name="metadata">MetaData</a>') + #para=formatMono.bold_para + elsif para.include? 'Owner Details' and para !~/<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + #formatMono=MonoSiSU.new('<br /><a name="owner.details">Owner Details</a>') + #@@plaintext[:owner_details]=formatMono.bold_para + #para='' + elsif para =~/(¡|<!Th?)/ #tables ! + elsif para =~/(.*)<!#!>(.*)/ + one,two=$1,$2 + format_text=Format_text_object.new(one,two) + para=format_text.seg_no_paranum + end + para='' if (para =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\d+!>)/) # -endnote + case para + when /<:i1>/ + if para =~/.*<:#>.*$/ + format_text=Format_text_object.new(para,'') + para=format_text.scr_indent_one_no_paranum + end + when /<:i2>/ + if para =~/.*<:#>.*$/ + format_text=Format_text_object.new(para,'') + para=format_text.scr_indent_one_no_paranum + end + end + if para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + # i don't get the condition for no paranum + end + if para =~/<:center>/ + one,two=/(.*)<:center>(.*)/.match(para)[1,2] + format_text=Format_text_object.new(one,two) + para=format_text.center + end + para.gsub!(/<!.+!>/,' ') if para ## Clean Prepared Text + para.gsub!(/<:\S+>/,' ') if para ## Clean Prepared Text + end + end + end + def publish + divider="=" + content=[] + data=@data + content << @@plaintext[:open] + content << @@plaintext[:head] + content << @@plaintext[:body] + content << @@plaintext[:endnotes] if @@dostype =~/endnotes/ + content << "#@br#{divider*70}#@br" + content << @@plaintext[:metadata] + content << "#@br#{divider*70}#@br" if @md.stmp =~/\w+/ #not used? + content << @@plaintext[:owner_details] if @md.stmp =~/\w+/ #not used? + content << @@plaintext[:tail] + Output.new(content.to_s,@md).plaintext + @@plaintext[:head],@@plaintext[:body],@@plaintext[:tail],@@plaintext[:metadata]=[],[],[],[] + end + end + class Output <Source + include SiSU_Param + include SiSU_Env + def initialize(content,md) + @content,@md=content,md + end + def plaintext #%plaintext output + SiSU_Env::SiSU_file.new(@md).mkdir + filename_plaintext=SiSU_Env::SiSU_file.new(@md,@md.fn[:plain]).mkfile + @sisu=[] + @content.each do |para| # this is a hack + if para =~/^\S/ + if para !~/^([*=-]|\.){5}/; filename_plaintext.puts para #unix plaintext + else filename_plaintext.puts para #unix plaintext + end + else filename_plaintext.puts para # if para =~/^\s/ + end + end + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/plaintext_format.rb b/lib/sisu/0.52/plaintext_format.rb new file mode 100644 index 00000000..9ceb3867 --- /dev/null +++ b/lib/sisu/0.52/plaintext_format.rb @@ -0,0 +1,100 @@ +=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: plaintext formatting template + + * 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 Format + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + class Paragraph_number + def initialize(paranum) + @paranum=/(\d+)/m.match(paranum)[1] + end + def display + @paranum.gsub(/(\d+)/,'<font size="1" color="#777777"> \1</font>') + end + def name + @paranum.gsub(/(\d+)/,'<a name="\1"></a>') + end + def goto + @paranum.gsub(/(\d+)/,'<a href="#\1">') + end + end + class Format_text_object + @@dp=nil + def initialize(one,two,three) + one.gsub!(/\.(html|pdf|php)/,'') if one =~/\.\.\/\S+/ + @one,@two,@three=one,two,three + rgx=/^[1-6-]~/ + @one.gsub!(rgx,'') if @one =~rgx + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + rgx=/~\{[\d*+]+\s+(.+?)<#@dp>\}~/ + @one.gsub!(rgx,'\1') if @one =~rgx + @link,@linkname=one,two + @vz=SiSU_Env::Get_init.instance.skin + end + def scr_endnote_body + "<endnote>#@one</endnote> " + end + def heading_body1 + end + def heading_body2 + end + def heading_body3 + end + def heading_body4 + end + def heading_body5 + end + def heading_body6 + end + end + class XML + end +end +__END__ + diff --git a/lib/sisu/0.52/relaxng.rb b/lib/sisu/0.52/relaxng.rb new file mode 100644 index 00000000..b68747a5 --- /dev/null +++ b/lib/sisu/0.52/relaxng.rb @@ -0,0 +1,1155 @@ +=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: relaxng flow/logic + + * 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_relaxng + require SiSU_lib + '/sysenv' + class RelaxNG + def gpl2_or_later + @gpl2_or_later =<<RELAXNG + # 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: sisu object models in relaxNG + + # 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 +RELAXNG + end + def rnc_name + def output_sax + 'sisu_sax.rnc' + end + def output_dom + 'sisu_dom.rnc' + end + def output_xhtml + 'sisu_xhtml.rnc' + end + def input_sax + 'sisu_sax.rnc' + end + def input_dom + 'sisu_dom.rnc' + end + def input_node + 'sisu_node.rnc' + end + self + end + def rng_name + def output_sax + 'sisu_sax.rng' + end + def output_dom + 'sisu_dom.rng' + end + def output_xhtml + 'sisu_xhtml.rng' + end + def input_sax + 'sisu_sax.rng' + end + def input_dom + 'sisu_dom.rng' + end + def input_node + 'sisu_node.rng' + end + self + end + def xsd_name + def output_sax + 'sisu_sax.xsd' + end + def output_dom + 'sisu_dom.xsd' + end + def output_xhtml + 'sisu_xhtml.xsd' + end + def input_sax + 'sisu_sax.xsd' + end + def input_dom + 'sisu_dom.xsd' + end + def input_node + 'sisu_node.xsd' + end + self + end + #def fn_dtd_sax + # 'sisu_sax.dtd' + #end + #def fn_dtd_dom + # 'sisu_dom.dtd' + #end + #def fn_dtd_node + # 'sisu_node.dtd' + #end + #def fn_dtd_xhtml + # 'sisu_xhtml.dtd' + #end + def rnc_sisu_object_input + @relaxng =<<RELAXNG +#%% sisu object model: input +#{gpl2_or_later} +#%% definitions +# dublin core: +element-semantic = + element semantic { + # dublin core: + element title { text } + & element creator { text }? + & element subject { text }? + & element description { text }? + & element publisher { text }? + & element contributor { text }? + & element date { text }? + & element date.created { text }? + & element date.issued { text }? + & element date.available { text }? + & element date.valid { text }? + & element date.modified { text }? + & element type { text }? + & element format { text }? + & element identifier { text }? + & element source { text }? + & element relation { text }? + & element coverage { text }? + & element rights { text }? + & element keywords { text }? + # extended semantic metadata: + & attribute subtitle { text }? + & attribute illustrator { text }? + & attribute translator { text }? + & attribute prepared_by { text }? + & attribute digitized_by { text }? + & attribute language { text }? + & attribute language.original { text }? + & attribute classify.pg { text }? + & attribute classify.isbn { text }? + & attribute classify.dewey { text }? + & attribute classify.loc { text }? + & attribute prefix.a { text }? + & attribute prefix.b { text }? + & attribute suffix { text }? + & attribute comments { text }? + & attribute abstract { text }? + # & attribute information { text }? + & attribute contact { text }? + & attribute links { text }? + } +element-processing = + element processing { + attribute structure { text }? + & attribute level { text }? + & attribute markup { text }? + & attribute bold { text }? + & attribute italics { text }? + & attribute papersize { text }? + & attribute vocabulary { text }? + & element date_scheme { text }? + & element date.issued.scheme { text }? + & element date.available.scheme { text }? + & element date.valid.scheme { text }? + & element date.modified.scheme { text }? + }? +element-head = + element head { + # processing instructions, and semantic data, distinguish?: + element metadata { + element title { text }, + element file { text }, + element generator { text }, + element-semantic, + element-processing + }+ + } +# body text/contents +# includes <b> <i> <u> <del> <ins> <indent1> <bullet> etc. +element-txt = + element txt { + text* + & element b { text }* + & element i { text }* + & element u { text }* + & element ins { text }* + & element del { text }* + } +element-endnote = + element endnote { + element number { text }, + element note { element-txt }+ + }+ +element-para = + element para { + # attribute paragraph_format { text }, + element-txt+ + & element-endnote? + } +element-external_space = + element external_space { + # ignored by sisu, provide program needs + element program { + # e.g. kdissert + element name { text }, + element xpos { text }, + element ypos { text }, + element font { text }, + element outline_color { text }, + element text_color { text }, + element comment { text } + }* + }*, +#%% structure + element document { + # document head: + element-head, + # document body: + element body { + # object, a unit of text, usually a paragraph with any associated endnotes + element node { + element structure { + # structure document using either node:heading levels or node:heading relationships: + # (i) sisu default uses node:heading levels (1-6 or A-C,1-3) to build document structure + element level { text }?, + # (ii) sisu alternatively could use node:heading relationship information to build document structure + element node.id { text }, + element node.parent { text }, + element node.child { text }* + }, + element node.objects { + element object.heading { + # nametag used only in headings, especially important for segmented html + element nametag { text }, + element-para + }, + element object.para { + element-para + }* + }+, + element-external_space + }+ + } + } +RELAXNG + end + def rnc_sisu_object_dal + @relaxng =<<RELAXNG +#%% sisu object model: dal +#{gpl2_or_later} +#%% definitions +# dublin core: +element-semantic = + element semantic { + # dublin core: + element title { text } + & element creator { text }? + & element subject { text }? + & element description { text }? + & element publisher { text }? + & element contributor { text }? + & element date { text }? + & element date.created { text }? + & element date.issued { text }? + & element date.available { text }? + & element date.valid { text }? + & element date.modified { text }? + & element type { text }? + & element format { text }? + & element identifier { text }? + & element source { text }? + & element relation { text }? + & element coverage { text }? + & element rights { text }? + & element keywords { text }? + # extended semantic metadata: + & attribute subtitle { text }? + & attribute illustrator { text }? + & attribute translator { text }? + & attribute prepared_by { text }? + & attribute digitized_by { text }? + & attribute language { text }? + & attribute language.original { text }? + & attribute classify.pg { text }? + & attribute classify.isbn { text }? + & attribute classify.dewey { text }? + & attribute classify.loc { text }? + & attribute prefix.a { text }? + & attribute prefix.b { text }? + & attribute suffix { text }? + & attribute comments { text }? + & attribute abstract { text }? + # & attribute information { text }? + & attribute contact { text }? + & attribute links { text }? + } +element-processing = + element processing { + attribute structure { text }? + & attribute level { text }? + & attribute markup { text }? + & attribute bold { text }? + & attribute italics { text }? + & attribute papersize { text }? + & attribute vocabulary { text }? + & element date_scheme { text }? + & element date.issued.scheme { text }? + & element date.available.scheme { text }? + & element date.valid.scheme { text }? + & element date.modified.scheme { text }? + }? +element-head = + element head { + # processing instructions, and semantic data, distinguish?: + element metadata { + element title { text }, + element file { text }, + element generator { text }, + element-semantic, + element-processing + }+ + } +# body text/contents +# includes <b> <i> <u> <del> <ins> <indent1> <bullet> etc. +element-txt = + element txt { + text* + & element b { text }* + & element i { text }* + & element u { text }* + & element ins { text }* + & element del { text }* + } +element-checksum.endnote = element checksum.clean { text } +element-endnote = + element endnote { + element number { text }, + element note { element-txt }+, + element-checksum.endnote + }+ +element-checksum.para = + element checksum.para { + element checksum.clean { text }, + element checksum.marked { text } + } +element-para = + element para { + # attribute paragraph_format { text }, + element-txt+ + & element-endnote? + } +element-object = + element object { + element-para, + element-checksum.para + } +# object citation number, unique sequential number for objects: +element-ocn = element ocn { text } +element-object_structure_summary = + element-ocn, + # type: heading level value 1 -6, or normal text + element type { text }, + # type number: sequential number for designated type + element type_number { text }, + # type category: sequential number for designated category, e.g. sequentially counting all headers + element category_number { text } +element-external_space = + element external_space { + # ignored by sisu, provide program needs + element program { + # e.g. kdissert + element name { text }, + element xpos { text }, + element ypos { text }, + element font { text }, + element outline_color { text }, + element text_color { text }, + element comment { text } + }* + }*, +#%% structure + element document { + # document head: + element-head, + # document body: + element body { + # object, a unit of text, usually a paragraph with any associated endnotes + element node { + element structure { + # structure document using either node:heading levels or node:heading relationships: + # (i) sisu default uses node:heading levels (1-6 or A-C,1-3) to build document structure + element level { text }?, + # (ii) sisu alternatively could use node:heading relationship information to build document structure + element node.id { text }, + element node.parent { text }, + element node.child { text }* + }, + element node.objects { + element object.heading { + element-object_structure_summary, + # nametag used only in headings, especially important for segmented html + element nametag { text }, + element-object + }, + element object.para { + element-object_structure_summary, + element-object + }* + }+, + element-external_space + }+ + } + } +RELAXNG + end + def rnc_model_output_sax + @relaxng =<<RELAXNG +#% sax output model, part of SiSU and distributed under the same license +default namespace = "" +namespace xlink = "http://www.w3.org/1999/xlink" +start = + element document { + element head { + (br + | meta + | element creator { + attribute class { xsd:NCName }, + (text + | element link { + attribute xlink:href { xsd:anyURI }, + attribute xlink:type { xsd:NCName }, + xsd:anyURI + })+ + } + | element date { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_available { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_created { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_issued { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_modified { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_valid { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element keywords { + attribute class { xsd:NCName }, + text + } + | element language { + attribute class { xsd:NCName }, + xsd:NCName + } + | element meta { xsd:NMTOKEN } + | element rights { + attribute class { xsd:NCName }, + (text | link)+ + } + | element source { + attribute class { xsd:NCName }, + text + } + | element structure { + attribute class { xsd:NCName }, + text + } + | element subject { + attribute class { xsd:NCName }, + text + } + | element title { + attribute class { xsd:NCName }, + text + } + | element type { + attribute class { xsd:NCName }, + text + } + | element source_control { + (br + | meta + | element sc { + attribute class { xsd:NCName }, + text + })+ + })+ + }, + element body { + element object { + attribute id { text }, + element ocn { + text + }, + element text { + attribute class { xsd:NCName }, + (text + | b + | br + | del + | en + | i + | link + | sub + | sup + | u + | element image { + attribute alt { text }?, + attribute height { xsd:integer }?, + attribute width { xsd:integer }?, + attribute xlink:actuate { xsd:NCName }, + attribute xlink:href { text }, + attribute xlink:show { xsd:NCName }, + attribute xlink:type { xsd:NCName } + })+ + }?, + element table { + attribute align { xsd:NCName }, + attribute bgcolor { xsd:NCName }, + attribute border { xsd:integer }, + attribute cellpadding { xsd:integer }, + attribute summary { text }, + attribute width { text }, + element tr { + element td { + attribute valign { xsd:NCName }, + attribute width { text }, + (text | b | i)+ + }+ + }+ + }?, + element endnote { + attribute notenumber { xsd:integer }?, + attribute symbol { text }?, + (element number { xsd:integer } + | element symbol { text }), + element note { + (text + | b + | br + | del + | i + | link + | sup + | u + | element em { xsd:NCName } + | element sub { xsd:NCName })+ + } + }* + }+ + } + } +meta = element meta { text } +br = element br { empty } +b = element b { (text | en | i | link | sup)+ } +i = element i { (text | b | br | sup)+ } +en = element en { text } +sub = element sub { xsd:NCName } +sup = element sup { xsd:NCName } +link = + element link { + attribute xlink:href { xsd:anyURI }, + attribute xlink:type { xsd:NCName }, + (xsd:anyURI | text | b | i | sup)+ + } +u = element u { (text | b | i)+ } +del = element del { (text | b | i | link)+ } +RELAXNG + end + def rnc_model_output_dom + @relaxng =<<RELAXNG +#% dom output model, part of SiSU and distributed under the same license +default namespace = "" +namespace xlink = "http://www.w3.org/1999/xlink" +start = + element document { + element head { + element header { + meta, + (element creator { text } + | element date { xsd:NMTOKEN } + | element date_available { xsd:NMTOKEN } + | element date_created { xsd:NMTOKEN } + | element date_issued { xsd:NMTOKEN } + | element date_modified { xsd:NMTOKEN } + | element date_valid { xsd:NMTOKEN } + | element keywords { text } + | element language { xsd:NCName } + | element rights { (text | link)+ } + | element source { text } + | element structure { text } + | element subject { text } + | element title { text } + | element type { text } + | element source_control { + (br + | meta + | element sc { + attribute class { xsd:NCName }, + text + })+ + }) + }+ + }, + element body { + element heading1 { + heading, + contents1*, + element heading2 { + heading, + contents1*, + element heading3 { + heading, + element contents1 { + heading, + content, + element contents2 { + heading, + content, + element contents3 { heading, content }* + }* + }+ + }* + }* + }+ + } + } +meta = element meta { text } +br = element br { empty } +heading = element heading { object } +contents1 = + element contents1 { + heading, + content, + element contents2 { + heading, + content, + element contents3 { heading, content }* + }* + } +content = element content { object* } +object = + element object { + attribute id { xsd:integer }, + element ocn { text }, + element nametag { text }?, + (element table { + attribute align { xsd:NCName }, + attribute bgcolor { xsd:NCName }, + attribute border { xsd:integer }, + attribute cellpadding { xsd:integer }, + attribute summary { text }, + attribute width { text }, + element tr { + element td { + attribute valign { xsd:NCName }, + attribute width { text }, + (text | b | i)+ + }+ + }+ + } + | element text { + attribute class { xsd:NCName }?, + (text + | b + | del + | endnote + | i + | link + | element br { empty } + | element endnote { + element number { xsd:integer }, + element note { (text | i | link)+ } + } + | element image { + attribute height { xsd:integer }, + attribute width { xsd:integer }, + attribute xlink:actuate { xsd:NCName }, + attribute xlink:href { text }, + attribute xlink:show { xsd:NCName }, + attribute xlink:type { xsd:NCName } + } + | element sub { text })+ + }) + } +i = element i { text } +b = element i { text } +u = element u { (text | b | i)+ } +sub = element sub { xsd:NCName } +sup = element sup { xsd:NCName } +del = element del { (text | b | i | link)+ } +link = + element link { + attribute xlink:href { xsd:anyURI }, + attribute xlink:type { xsd:NCName }, + xsd:anyURI + } +endnote = + element endnote { + (element number { xsd:integer } + | element symbol { text }), + element note { + (text + | b + | br + | del + | i + | link + | sub + | sup + | u + | element em { xsd:NCName } + | element sub { xsd:NCName })+ + } + } +RELAXNG + end + def rnc_model_output_xhtml #not done + @relaxng =<<RELAXNG +#% xhtml output model, part of SiSU and distributed under the same license +default namespace = "" +namespace xlink = "http://www.w3.org/1999/xlink" +start = + element document { + element head { + (br + | element creator { + attribute class { xsd:NCName }, + (text + | element link { + attribute xlink:href { xsd:anyURI }, + attribute xlink:type { xsd:NCName }, + xsd:anyURI + })+ + } + | element date { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_available { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_created { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_issued { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_modified { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element date_valid { + attribute class { xsd:NCName }, + xsd:NMTOKEN + } + | element language { + attribute class { xsd:NCName }, + xsd:NCName + } + | element keywords { + attribute class { xsd:NCName }, + text + } + | element meta { + attribute content { text }?, + attribute http-equiv { xsd:NCName }?, + text + } + | element rights { + attribute class { xsd:NCName }, + (text | link)+ + } + | element source { + attribute class { xsd:NCName }, + text + } + | element structure { + attribute class { xsd:NCName }, + text + } + | element subject { + attribute class { xsd:NCName }, + text + } + | element title { + attribute class { xsd:NCName }, + text + } + | element type { + attribute class { xsd:NCName }, + xsd:NCName + })+ + }, + element body { + element object { + attribute id { xsd:integer }, + (element endnote { + attribute notenumber { xsd:integer }?, + attribute symbol { text }?, + (text + | b + | br + | del + | i + | link + | sup + | u + | element em { xsd:NCName } + | element sub { xsd:NCName })+ + } + | element ocn { text } + | element text { + attribute class { xsd:NCName }, + (text + | b + | br + | del + | en + | i + | link + | sup + | u + | element image { + attribute alt { text }?, + attribute height { xsd:integer }?, + attribute width { xsd:integer }?, + attribute xlink:actuate { xsd:NCName }, + attribute xlink:href { text }, + attribute xlink:show { xsd:NCName }, + attribute xlink:type { xsd:NCName } + } + | element sub { text })+ + })+, + element table { + attribute align { xsd:NCName }, + attribute bgcolor { xsd:NCName }, + attribute border { xsd:integer }, + attribute cellpadding { xsd:integer }, + attribute summary { text }, + attribute width { text }, + element tr { + element td { + attribute valign { xsd:NCName }, + attribute width { text }, + (text | b | i)+ + }+ + }+ + }? + }+ + } + } +br = element br { empty } +en = element en { text } +sup = element sup { xsd:NCName } +i = element i { (text | b | br | sup)+ } +link = + element link { + attribute xlink:href { xsd:anyURI }, + attribute xlink:type { xsd:NCName }, + (text | b | i | sup)+ + } +b = element b { (text | en | i | link | sup)+ } +u = element u { (text | b | i)+ } +del = element del { (text | b | i | link)+ } +RELAXNG + end + def rnc_model_input_sax + @relaxng =<<RELAXNG +#% sax input model, part of SiSU and distributed under the same license +default namespace = "" +start = + element document { + element head { + element header { + attribute class { xsd:NCName }, + (element creator { text } + | element date { xsd:NMTOKEN } + | element date.available { xsd:NMTOKEN } + | element date.created { xsd:NMTOKEN } + | element date.issued { xsd:NMTOKEN } + | element date.modified { xsd:NMTOKEN } + | element date.valid { xsd:NMTOKEN } + | element italicize { text } + | element language { xsd:NCName } + | element links { text } + | element markup { text } + | element rights { text } + | element skin { xsd:NCName } + | element subject { text } + | element title { text } + | element type { xsd:NCName } + | element vocabulary { xsd:NCName }) + }+ + }, + element body { + element object { + element text { + attribute class { xsd:NCName }, + (text + | b + | i + | element endnote { + attribute symbol { xsd:NCName }, + (text + | i + | element br { empty })+ + } + | element u { i } + | element image.path { text })+ + }? + }+ + } + } +i = element i { text } +b = element b { text } +RELAXNG + end + def rnc_model_input_dom + @relaxng =<<RELAXNG +#% dom input model, part of SiSU and distributed under the same license +default namespace = "" +start = + element document { + element head { + element header { + attribute class { xsd:NCName }, + (element creator { text } + | element date { xsd:NMTOKEN } + | element date.available { xsd:NMTOKEN } + | element date.created { xsd:NMTOKEN } + | element date.issued { xsd:NMTOKEN } + | element date.modified { xsd:NMTOKEN } + | element date.valid { xsd:NMTOKEN } + | element italicize { text } + | element language { xsd:NCName } + | element links { text } + | element markup { text } + | element rights { text } + | element skin { xsd:NCName } + | element subject { text } + | element title { text } + | element type { xsd:NCName } + | element vocabulary { xsd:NCName }) + }+ + }, + element body { + element heading1 { + heading, + element heading2 { + heading, + contents1+, + element heading3 { heading, contents1+ }+ + } + } + } + } +heading = element heading { object } +contents1 = + element contents1 { + heading, + content, + element contents2 { + heading, + content, + element contents3 { heading, content }* + }* + } +object = + element object { + element text { + (text + | italic + | element bold { xsd:NMTOKEN } + | element endnote { + element symbol { text }?, + element note { + (text + | italic + | element br { empty })+ + } + } + | element underscore { italic } + | element image.path { text } + | element italic { text })+ + } + } +italic = element italic { text } +content = element content { object+ } +RELAXNG + end + def rnc_model_input_node + @relaxng =<<RELAXNG +#% node input model, part of SiSU and distributed under the same license +default namespace = "" +start = + element document { + element head { + element header { + attribute class { xsd:NCName }, + (element creator { text } + | element date { xsd:NMTOKEN } + | element date.available { xsd:NMTOKEN } + | element date.created { xsd:NMTOKEN } + | element date.issued { xsd:NMTOKEN } + | element date.modified { xsd:NMTOKEN } + | element date.valid { xsd:NMTOKEN } + | element italicize { (text | i)+ } + | element language { xsd:NCName } + | element links { text } + | element markup { text } + | element rights { text } + | element skin { xsd:NCName } + | element subject { text } + | element title { text } + | element type { xsd:NCName } + | element vocabulary { xsd:NCName }) + }+ + }, + element body { + element object { + (element text { + attribute class { xsd:NCName }, + (text + | b + | i + | element br { empty } + | element endnote { + attribute symbol { xsd:NCName }, + (text | i)+ + } + | element image.path { text } + | element sub { text })+ + } + | (element ocn { empty }, + element table { + attribute align { xsd:NCName }, + attribute bgcolor { xsd:NCName }, + attribute border { xsd:integer }, + attribute cellpadding { xsd:integer }, + attribute summary { text }, + attribute width { text }, + element tr { + element td { + attribute valign { xsd:NCName }, + attribute width { text }, + (text | b)+ + }+ + }+ + })), + element node { + element id { xsd:integer }, + element parent { xsd:integer }, + element offspring { text }? + } + }+ + } + } +b = element b { text } +i = element i { text } +RELAXNG + end + end +end +__END__ diff --git a/lib/sisu/0.52/remote_put.rb b/lib/sisu/0.52/remote_put.rb new file mode 100644 index 00000000..19bfbe80 --- /dev/null +++ b/lib/sisu/0.52/remote_put.rb @@ -0,0 +1,103 @@ +=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: remote put, copy output to remote server + + * 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: this operation should probably be threaded & run at its own pace, + independent of rest of program + primary problem will be with notification of progress, + implement naively to start with + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Remote + require SiSU_lib + '/sysenv' + include SiSU_Env + pwd=Dir.pwd + class Put + def initialize(opt) + @opt=opt + @dir=SiSU_Env::Info_env.new(@opt.fns) + @put=unless @opt.fns =~/\._sst$/; @opt.fns + else @opt.fns.gsub(/(.+)?\._sst$/,'\1.ssm') + end + @remote=SiSU_Env::Info_remote.new(@opt) + end + def scp + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->',@put) + tell.dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.scp + end + def rsync + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->',@put) + tell.dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync + end + def scp_base + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement of base site ->','excluding images') + tell.dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.scp_base + end + def scp_base_all + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','complete') + tell.dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.scp_base_all + end + def rsync_base + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','rsync') + tell.dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync_base + end + def rsync_base_sync + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','rsync and sync') + tell.dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync_base_sync + end + def rsync_sitemaps + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement sitemaps ->','rsync') + tell.dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync_sitemaps + end + end +end +__END__ diff --git a/lib/sisu/0.52/response.rb b/lib/sisu/0.52/response.rb new file mode 100644 index 00000000..7748343f --- /dev/null +++ b/lib/sisu/0.52/response.rb @@ -0,0 +1,61 @@ +=begin + * Name: modify.rb + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: Request response + + * Copyright (C) 2004, 2006 Ralph Amissah + + * Packaged with: SiSU information Structuring Universe - Structured information, Serialized Units + * SiSU 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 + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Response + class Response + def response?(ask) #move to more appropriate directory later + response='redo' + print ask + " ['yes', 'no' or 'quit']: " + response=File.new('/dev/tty').gets.strip + #response=gets.strip + ans=if response == 'yes'; true + elsif response == 'no'; false + elsif response =~/^quit|exit$/; exit + else puts "[please type: 'yes', 'no' or 'quit']" + answer?(ask) + end + ans + end + end +end +__END__ diff --git a/lib/sisu/0.52/rexml.rb b/lib/sisu/0.52/rexml.rb new file mode 100644 index 00000000..cfedaed9 --- /dev/null +++ b/lib/sisu/0.52/rexml.rb @@ -0,0 +1,118 @@ +=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: rexml testing of xml + + * 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_Rexml + # load XML file for REXML parsing + require 'rexml/document' if FileTest.directory?("#{Config::CONFIG['rubylibdir']}/rexml") #Config::CONFIG['sitedir'] + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/sysenv' + include SiSU_Env + class Rexml + require 'rexml/document' if FileTest.directory?("#{Config::CONFIG['rubylibdir']}/rexml") #Config::CONFIG['sitedir'] + def initialize(md,fno) + @md,@fno=md,fno + @env=SiSU_Env::Info_env.new(@md.fns) + @prog=SiSU_Env::Info_program.new #(md.fns) #if md + if File.file?"#{@env.path.output}/#{@md.fnb}/#@fno" + @fnap="#{@env.path.output}/#{@md.fnb}/#@fno" #index.xml causes problems with index.html in server config + elsif File.file?"#{Dir.pwd}/#@fno" + @fnap="#{Dir.pwd}/#@fno" + end + @e_head='/document/head' + @e_title='/document/head/title' + @e_object='/document/body/object' + @e_ocn='/document/body/object/ocn' + @e_text='/document/body/object/text' + @e_endnote='/document/body/object/endnote' + end + def xml + begin + if FileTest.file?(@fnap) + if @prog.rexml !=false and FileTest.directory?('/usr/lib/ruby/1.8/rexml/') #note values can be other than true + xmlfile=IO.readlines(@fnap,'').join + begin + @xmldoc=REXML::Document.new xmlfile + tell=SiSU_Screen::Ansi.new(@md.cmd,'invert','REXML',"XML document #@fnap loaded") #% tell + tell.colorize unless @md.cmd =~/q/ + if @md.cmd =~ /v/i #% substantive text + @xmldoc.elements.each(@e_head) do |e| + tell=SiSU_Screen::Ansi.new(@md.cmd,'brown',e) + tell.colorize unless @md.cmd =~/q/ + end + end + rescue REXML::ParseException + puts 'broken XML' + end + end + else + tell=SiSU_Screen::Ansi.new(@md.cmd,'fuschia',"File Not Found #{xmlfile}",'requested XML processing skipped') + tell.colorize unless @md.cmd =~/q/ + exit + end + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + end + end + end +end +__END__ + misc +e.each do |element| + element.each do |child| + if child.is_a?(REXML::Text) + puts "Text: #{child.to_s.inspect}" + else + puts "SubElement: #{child.name}" + end + end +end + diff --git a/lib/sisu/0.52/screen_text_color.rb b/lib/sisu/0.52/screen_text_color.rb new file mode 100644 index 00000000..7fe6b39d --- /dev/null +++ b/lib/sisu/0.52/screen_text_color.rb @@ -0,0 +1,404 @@ +=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, screen colors 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_Screen + class Color + attr_accessor :off,:marker,:bold,:underline,:invert,:darkgrey_hi,:grey_hi,:pink_hi,:fuschia_hi,:red_hi,:orange_hi,:yellow_hi,:brown_hi,:lightgreen_hi,:green_hi,:cyan_hi,:blue_hi,:navy_hi,:white,:grey,:pink,:fuschia,:ruby,:red,:orange,:yellow,:brown,:green,:darkgreen,:cyan,:blue,:navy,:black + def initialize(&block) + instance_eval &block + end + end + class Ansi < Color + attr_reader :cX + def initialize(cmd,*txt) + @cmd,@txt=cmd,txt + @color_instruct=txt[0] + flag=SiSU_Env::Info_processing_flag.new + if @cmd + if flag.color #set default colors on or off -c acts as toggle against this default, if default is off -c turns on, if default is on -c turns off + if @cmd =~/c/; @use_color=false + else @use_color=true + end + else + if @cmd =~/c/; @use_color=true + else @use_color=false + end + end + if @cmd =~/k/; @use_color=false + end + else @use_color=false + end + @cX=@@cX= unless @use_color + Color.new do + self.off=self.white=self.marker=self.bold=self.underline=self.invert=self.darkgrey_hi=self.grey_hi=self.pink_hi=self.fuschia_hi=self.red_hi=self.orange_hi=self.yellow_hi=self.brown_hi=self.lightgreen_hi=self.green_hi=self.cyan_hi=self.blue_hi=self.navy_hi=self.grey=self.pink=self.fuschia=self.ruby=self.red=self.orange=self.yellow=self.brown=self.green=self.darkgreen=self.cyan=self.blue=self.navy=self.black='' + end + else #default set to colors on + Color.new do + self.off = "\033[0m" + self.white = "\033[0m" + self.marker = "\033[42m" + self.bold = "\033[1m" + self.underline = "\033[4m" + self.invert = "\033[7m" + self.darkgrey_hi = "\033[100m" + self.grey_hi = "\033[47m" + self.pink_hi = "\033[105m" + self.fuschia_hi = "\033[45m" + self.red_hi = "\033[41m" + self.orange_hi = "\033[101m" + self.yellow_hi = "\033[103m" + self.brown_hi = "\033[43m" + self.lightgreen_hi = "\033[102m" + self.green_hi = "\033[42m" + self.cyan_hi = "\033[106m" + self.blue_hi = "\033[104m" + self.navy_hi = "\033[44m" + self.grey = "\033[90m" + self.pink = "\033[95m" + self.fuschia = "\033[35m" + self.ruby = "\033[31m" + self.red = "\033[91m" #check + self.orange = "\033[91m" + self.yellow = "\033[93m" + self.brown = "\033[33m" + self.green = "\033[92m" + self.darkgreen = "\033[32m" + self.cyan = "\033[36m" + self.blue = "\033[94m" + self.navy = "\033[34m" + self.black = "\033[30m" + end + end + end + def colors + 0.upto(109) {|i| print "\033[#{i}m 33[#{i}m \033[m"} + puts '' + end + def color + case @color_instruct + when /invert/; @cX.invert + when /darkgrey_hi/; @cX.darkgrey_hi + when /grey_hi/; @cX.grey_hi + when /pink_hi/; @cX.pink_hi + when /fuschia_hi/; @cX.fuschia_hi + when /red_hi/; @cX.red_hi + when /orange_hi/; @cX.orange_hi + when /yellow_hi/; @cX.yellow_hi + when /brown_hi/; @cX.brown_hi + when /lightgreen_hi/; @cX.lightgreen_hi + when /green_hi/; @cX.green_hi + when /cyan_hi/; @cX.cyan_hi + when /blue_hi/; @cX.blue_hi + when /navy_hi/; @cX.navy_hi + when /white/; @cX.white + when /grey/; @cX.grey + when /pink/; @cX.pink + when /fuschia/; @cX.fuschia + when /ruby/; @cX.ruby + when /red/; @cX.red + when /orange/; @cX.orange + when /yellow/; @cX.yellow + when /brown/; @cX.brown + when /green/; @cX.green + when /darkgreen/; @cX.darkgreen + when /cyan/; @cX.cyan + when /blue/; @cX.blue + when /navy/; @cX.navy + when /close/; @cX.off + when /off/; @cX.off + end + end + def colorize + case @color_instruct + when /invert/; puts "#{@cX.invert}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /darkgrey_hi/; puts "#{@cX.darkgrey_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /grey_hi/; puts "#{@cX.grey_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /pink_hi/; puts "#{@cX.pink_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /fuschia_hi/; puts "#{@cX.fuschia_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /red_hi/; puts "#{@cX.red_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /orange_hi/; puts "#{@cX.orange_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /yellow_hi/; puts "#{@cX.yellow_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /brown_hi/; puts "#{@cX.brown_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /lightgreen_hi/; puts "#{@cX.lightgreen_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /green_hi/; puts "#{@cX.green_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /cyan_hi/; puts "#{@cX.cyan_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /blue_hi/; puts "#{@cX.blue_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /navy_hi/; puts "#{@cX.navy_hi}#{@txt[1]}#{@cX.off} #{@cX.blue}#{@txt[2]}#{@cX.off} #{@cX.grey}#{@txt[3]}#{@cX.off}" + when /bold/; puts "#{@cX.bold}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /white/; puts "#{@cX.off}#{@txt[1]} #{@txt[2]}" + when /grey/; puts "#{@cX.grey}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /pink/; puts "#{@cX.pink}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /fuschia/; puts "#{@cX.fuschia}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /ruby/; puts "#{@cX.ruby}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /red/; puts "#{@cX.red}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /orange/; puts "#{@cX.orange}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /yellow/; puts "#{@cX.yellow}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /brown/; puts "#{@cX.brown}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /green/; puts "#{@cX.green}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /darkgreen/; puts "#{@cX.darkgreen}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /cyan/; puts "#{@cX.cyan}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /blue/; puts "#{@cX.blue}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + when /navy/; puts "#{@cX.navy}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + end + end + def sourcename(sourcefilename) + @sourcefilename=sourcefilename + end + def basename(sourcefilename) + @basename=sourcefilename.sub(/\.(?:[_-]?sst|ssm)$/,'') + end + def sisu + end + def rescue + %{\t #{@cX.orange}Rescued#{@cX.off} #{@cX.grey}An#{@cX.off} #{@cX.fuschia}ERROR#{@cX.off} #{@cX.grey}occurred, message:"#{@cX.off} #{@cX.fuschia}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off} #{@cX.brown}#{@txt[2]}#{@cX.off}} + end + def warn + puts "\t #{@cX.brown}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off}" + end + def error + puts "\t #{@cX.fuschia}#{@txt[0]}#{@cX.off} #{@cX.brown}#{@txt[1]}#{@cX.off}" + end + def error2 + puts "\t #{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.fuschia}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + end + def version + puts "#{@cX.blue_hi}#{@txt[0]} #{@txt[1]}#{@cX.off} #{@cX.grey} (#{@txt[3]} [#{@txt[2]}]) &#{@cX.off} #{@cX.ruby}Ruby#{@cX.off} #{@cX.grey}(#{@txt[4]})#{@cX.off}\n" + end + def html3numbers + puts %{\t#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.cyan}files processed#{@cX.off}. } + + %{#{@cX.grey}} + + %{scroll only: #{@txt[1]}, seg only: #{@txt[2]},} + + %{#{@cX.off} } + + %{#{@cX.cyan}joint scroll & seg: #{@txt[3]},#{@cX.off}} + + %{#{@cX.grey} } + + %{nav only: #{@txt[4]}} + + %{#{@cX.off}} + end + def html2numbers + puts %{\t#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.cyan}files processed#{@cX.off}. } + + %{#{@cX.grey}} + + %{scroll only: #{@txt[1]},} + + %{#{@cX.off} } + + %{#{@cX.cyan}seg only: #{@txt[2]},#{@cX.off}} + + %{#{@cX.grey} } + + %{joint scroll & seg: #{@txt[3]}, nav only: #@n_files_nav} + + %{#{@cX.off}} + end + def html1numbers + puts %{\t#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.cyan}files processed#{@cX.off}. } + + %{#{@cX.cyan}scroll only: #{@txt[1]},#{@cX.off}} + + %{#{@cX.grey} } + + %{seg only: #{@txt[2]}, } + + %{joint scroll & seg: #{@txt[3]}, nav only: #@n_files_nav} + + %{#{@cX.off}} + end + def html0_numbers + puts %{\t#{@cX.ruby}#{@txt[0]} files processed#{@cX.off}. } + + %{#{@cX.grey}} + + %{scroll only: #{@txt[1]}, seg only: #{@txt[2]}, joint scroll & seg: #{@txt[3]},} + + %{#{@cX.off} } + + %{#{@cX.cyan}nav only: #{@txt[4]}#{@cX.off}.} + end + def php_numbers + puts %{ #{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.cyan}files processed#{@cX.off}. } + + %{php_scr only: #{@txt[1]}, } + + %{#{@cX.cyan}php_seg only: #{@txt[2]}#{@cX.off}, } + + %{joint php scroll & seg: #{@txt[3]}, } + + %{php_nav only: #{@txt[4]}} + end + def txt_white + puts "\t#{@cX.white}#{@txt[0]}#{@cX.off} #{@cX.white}#{@txt[1]}#{@cX.off}" + end + def txt_grey + puts "\t#{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.cyan}#{@txt[1]}#{@cX.off}" + end + def txt_cyan + puts "\t#{@cX.cyan}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off}" + end + def txt_blue + puts "\t#{@cX.blue}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off}" + end + def txt_red + puts "\t#{@cX.red}#{@txt[0]}#{@cX.off} #{@cX.cyan}#{@txt[1]}#{@cX.off}" + end + def txt_green + puts "\t#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off}" + end + def url #clean + blue + end + def result + puts "\t#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.blue}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + end + def maintenance + puts "\t#{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.brown}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off}" + end + def instruct + puts %{\t #{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.cyan}#{@txt[1]}#{@cX.off} #{@cX.grey}#{@txt[2]}#{@cX.off} #{@cX.cyan}#{@txt[3]}#{@cX.off} #{@cX.grey}#{@txt[4]}#{@cX.off} "#{@cX.brown}#@f#{@cX.off}"} + end + def grey_open + print @cX.grey + end + def p_off + print @cX.off + end + def p_close + print @cX.off + end + def flow + puts %{\t#{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.ruby}->#{@cX.off}\n\t #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def output + puts %{\t#{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.ruby}->#{@cX.off}\n\t #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def generic + puts %{\t#{@cX.navy}#{@txt[0]} #{@txt[1]}#{@cX.off}. } + end + def files_processed + puts %{\t#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off}} + end + def print_blue + print "#{@cX.blue}#{@txt[0]} #{@txt[1]}#{@cX.off}" + end + def puts_blue + puts "#{@cX.blue}#{@txt[0]} #{@txt[1]}#{@cX.off}" + end + def print_brown + print "#{@cX.brown}#{@txt[0]}#{@cX.off}" + end + def blue_tab + print "\t#{@cX.blue}#{@txt[0]}#{@cX.off}\n" + end + def print_grey + print "#{@cX.grey}#{@txt[0]} #{@txt[1]}#{@cX.off}" + end + def puts_grey + puts "#{@cX.grey}#{@txt[0]} #{@txt[1]}#{@cX.off}" + end + def puts_brown + puts "#{@cX.brown}#{@txt[0]} #{@txt[1]}#{@cX.off}" + end + def grey_tab + print "\t#{@cX.grey}#{@txt[0]}#{@cX.off}\n" + end + def green_title + puts %{#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off}} + end + def green_title_hi + puts %{#{@cX.green_hi}#{@cX.black}#{@txt[0]}#{@cX.off*2} #{@cX.grey}#{@txt[1]}#{@cX.off}} + end + def green_hi_blue + puts %{#{@cX.green_hi}#{@cX.black}#{@txt[0]}#{@cX.off*2} #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def grey_title_hi + puts %{#{@cX.grey_hi}#{@cX.black}#{@txt[0]}#{@cX.off*2} #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def dark_grey_title_hi + puts %{#{@cX.darkgrey_hi}#{@cX.black}#{@txt[0]}#{@cX.off*2} #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def cyan_title_hi + puts %{#{@cX.cyan_hi}#{@cX.black}#{@txt[0]}#{@cX.off*2} #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def dbi_title + puts %{#{@cX.blue_hi}#{@cX.black}#{@txt[0]}#{@cX.off*2} #{@cX.cyan}#{@cX.grey}#{@txt[1]}#{@cX.off*2} #{@cX.green}#{@txt[2]}#{@cX.off}} + end + def yellow_title_hi + puts %{#{@cX.yellow_hi}#{@cX.black}#{@txt[0]}#{@cX.off*2} #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def term_sheet_title + puts %{\t#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.red_hi}#{@cX.black}#{@txt[1]}.#{@cX.off*2} } + end + def generic_number + puts "#{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.grey}#{@txt[1]}#{@cX.off}" + end + def tex_numbers + puts %{ #{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.cyan}tex/pdf files processed#{@cX.off}.} + end + def tex_info_numbers + puts %{ #{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.cyan}texinfo files processed#{@cX.off}.} + end + def lout_numbers + puts %{ #{@cX.green}#@n_lout#{@cX.off} #{@cX.cyan}lout/pdf files processed#{@cX.off}.} + end + def parameters + end + def reserved + puts %{ #{@cX.grey_hi}#{@cX.black}reserved#{@cX.off*2}} + end + def meta_verse_title + puts %{#{@cX.green_hi}#{@cX.black}MetaVerse#{@cX.off*2} } + end + def meta_verse_title_v + b=sourcename(@txt[0]) + puts %{#{@cX.green_hi}#{@cX.black}MetaVerse#{@cX.off*2} } + + %{#{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.ruby}->#{@cX.off}\n\t #{@cX.blue}~meta/#{b}.meta#{@cX.off}} + end + def meta_verse + puts "\t#{@cX.grey}MetaVerse#{@cX.off}" + end + def meta_verse_skipped + puts %{\t#{@cX.grey}MetaVerse: MarshalLoad (creation of metaVerse skipped)#{@cX.off}} + end + def meta_verse_load + puts %{\t<<MetaVerse: MarshalLoad>>} + end + def html_title + puts %{#{@cX.green_hi}#{@cX.black}HTML#{@cX.off*2}} + end + def html_output + puts %{\t#{@cX.grey}#{@txt[0]}#{@cX.off} #{@cX.ruby}->#{@cX.off}\n\t #{@cX.blue}#{@txt[1]}#{@cX.off}} + end + def php_title + puts %{\n#{@cX.green_hi}#{@cX.black}PHP#{@cX.off*2}} + end + def segmented + puts "\t#{@cX.grey}Seg#{@cX.off} #{@cX.green}#{@txt[0]}#{@cX.off} #{@cX.grey}segments#{@cX.off}" + end + end +end + diff --git a/lib/sisu/0.52/semantics.rb b/lib/sisu/0.52/semantics.rb new file mode 100644 index 00000000..2d827f52 --- /dev/null +++ b/lib/sisu/0.52/semantics.rb @@ -0,0 +1,388 @@ +=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: semantics + + * 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 Semantic + require SiSU_lib + '/param' + class YamlInfoCreate + def initialize(file='') + @file=file + @sisu=[] + @@doc[:title],@@doc[:subtitle],@@doc[:creator],@@doc[:subject],@@doc[:keywords],@@doc[:description],@@doc[:publisher],@@doc[:contributor],@@doc[:date],@@doc[:date_created],@@doc[:date_issued],@@doc[:date_available],@@doc[:date_valid],@@doc[:date_modified],@@doc[:type],@@doc[:format],@@doc[:identifier],@@doc[:source],@@doc[:language],@@doc[:coverage],@@doc[:relation],@@doc[:rights]=nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil + end + def songsheet + param + yamlinfo + end + def param + file_array=IO.readlines(@file,'') + SiSU_Param(file_array,@file,'a') #problem not updated watch + end + def printscreen + puts "#{@@cX.fuschia}filename:#{@@cX.off} " + @file + puts "#{@@cX.fuschia}title:#{@@cX.off} " + @@doc[:title] + puts "#{@@cX.fuschia}subtitle:#{@@cX.off} " + @@doc[:subtitle] if @@doc[:subtitle] + puts "#{@@cX.fuschia}creator:#{@@cX.off} " + @@doc[:creator] if @@doc[:creator] + puts "#{@@cX.fuschia}subject:#{@@cX.off} " + @@doc[:subject] if @@doc[:subject] + puts "#{@@cX.fuschia}description:#{@@cX.off} " + @@doc[:description] if @@doc[:description] + puts "#{@@cX.fuschia}publisher:#{@@cX.off} " + @@doc[:publisher] if @@doc[:publisher] + puts "#{@@cX.fuschia}contributor:#{@@cX.off} " + @@doc[:contributor] if @@doc[:contributor] + puts "#{@@cX.fuschia}date:#{@@cX.off} " + @@doc[:date] if @@doc[:date] + puts "#{@@cX.fuschia}date created:#{@@cX.off} " + @@doc[:date_created] if @@doc[:date_created] + puts "#{@@cX.fuschia}date issued:#{@@cX.off} " + @@doc[:date_issued] if @@doc[:date_issued] + puts "#{@@cX.fuschia}date available:#{@@cX.off} " + @@doc[:date_available] if @@doc[:date_available] + puts "#{@@cX.fuschia}date valid:#{@@cX.off} " + @@doc[:date_valid] if @@doc[:date_valid] + puts "#{@@cX.fuschia}date modified:#{@@cX.off} " + @@doc[:date_modified] if @@doc[:date_modified] + puts "#{@@cX.fuschia}type:#{@@cX.off} " + @@doc[:type] if @@doc[:type] + puts "#{@@cX.fuschia}format:#{@@cX.off} " + @@doc[:format] if @@doc[:format] + puts "#{@@cX.fuschia}identifier:#{@@cX.off} " + @@doc[:identifier] if @@doc[:identifier] + puts "#{@@cX.fuschia}source:#{@@cX.off} " + @@doc[:source] if @@doc[:source] + puts "#{@@cX.fuschia}language:#{@@cX.off} " + @@doc[:language] if @@doc[:language] + puts "#{@@cX.fuschia}coverage:#{@@cX.off} " + @@doc[:coverage] if @@doc[:coverage] + puts "#{@@cX.fuschia}relation:#{@@cX.off} " + @@doc[:relation] if @@doc[:relation] + puts "#{@@cX.fuschia}rights:#{@@cX.off} " + @@doc[:rights] if @@doc[:rights] + puts "#{@@cX.fuschia}keywords:#{@@cX.off} " + @@doc[:keywords] if @@doc[:keywords] + puts '-----------------------' + end + def yamlinfo + uri=case @file + when /.+?\.[_-]?sst$/; @file.gsub(/(.+?)\.[_-]?sst$/,'http://localhost/reserved/\1/') + end + puts uri + @sisu << '-' + @sisu << ' filename: ' + uri + @sisu << ' title: ' + @@doc[:title].gsub(/:/, ' - ') if @@doc[:title] + @sisu << ' subtitle: ' + @@doc[:subtitle] if @@doc[:subtitle] + @sisu << ' creator: ' + @@doc[:creator] if @@doc[:creator] + @sisu << ' subject: ' + @@doc[:subject] if @@doc[:subject] + @sisu << ' keywords: ' + @@doc[:keywords] if @@doc[:keywords] + @sisu << ' description: ' + @@doc[:description] if @@doc[:description] + @sisu << ' publisher: ' + @@doc[:publisher] if @@doc[:publisher] + @sisu << ' contributor: ' + @@doc[:contributor] if @@doc[:contributor] + @sisu << ' date: ' + @@doc[:date] if @@doc[:date] + @sisu << ' date_created: ' + @@doc[:date_created] if @@doc[:date_created] + @sisu << ' date_issued: ' + @@doc[:date_issued] if @@doc[:date_issued] + @sisu << ' date_available: ' + @@doc[:dateavailable] if @@doc[:date_available] + @sisu << ' date_valid: ' + @@doc[:date_valid] if @@doc[:date_valid] + @sisu << ' date_modified: ' + @@doc[:date_modified] if @@doc[:date_modified] + @sisu << ' type: ' + @@doc[:type] if @@doc[:type] + @sisu << ' format: ' + @@doc[:format] if @@doc[:format] + @sisu << ' identifier: ' + @@doc[:identifier] if @@doc[:identifier] + @sisu << ' source: ' + @@doc[:source] if @@doc[:source] + @sisu << ' language: ' + @@doc[:language] if @@doc[:language] + @sisu << ' coverage: ' + @@doc[:coverage] if @@doc[:coverage] + @sisu << ' relation: ' + @@doc[:relation] if @@doc[:relation] + @sisu << ' rights: ' + @@doc[:rights] if @@doc[:rights] + #@sisu << ' copyright: ' + @@doc[:copyright] if @@doc[:copyright] + @sisu.each {|para| @@filename_semantic.puts para} + end + end + class Yaml_info_read + def initialize #(file='') + @pwd=Dir.pwd + @sisu=[] + end + def loadfile + if FileTest.file?("#@pwd/semantic.yml") + @yaml||=YAML::load(File::open("#@pwd/semantic.yml")) + end + end + def printscreen + @yaml.each do |y| + puts y['title'] if y['title'] + puts y['subtitle'] if y['subtitle'] + puts y['creator'] if y['creator'] + puts y['subject'] if y['subject'] + puts y['description'] if y['description'] + puts y['publisher'] if y['publisher'] + puts y['contributor'] if y['contributor'] + puts y['date'] if y['date'] + puts y['date_created'] if y['date_created'] + puts y['date_issued'] if y['date_issued'] + puts y['date_available'] if y['date_available'] + puts y['date_valid'] if y['date_valid'] + puts y['date_modified'] if y['date_modified'] + puts y['type'] if y['type'] + puts y['format'] if y['format'] + puts y['identifier'] if y['identifier'] + puts y['source'] if y['source'] + puts y['language'] if y['language'] + puts y['coverage'] if y['coverage'] + puts y['relation'] if y['relation'] + puts y['rights'] if y['rights'] + puts y['copyright'] if y['copyright'] + puts y['keywords'] if y['keywords'] + puts '-----' + end + end + end + class RSS < Yaml_info_read + def songsheet + loadfile + rss_nav + debris + end + def rss(match=//,feedtitle='') + @sisu=[] + @sisu << %{<rss version="2.0">\n-\n <channel><title>#{feedtitle}</title> +<link>http://www.jus.uio.no/lm/</link> +<description>Semantic Information Structuring Unit</description> +<language>en-us</language> +- +} + @yaml.each do |y| + if y['title'] and ((y['subject'] and "#{y['subject']}"[match]) or (y['keywords'] and "#{y['keywords']}"[match])) + puts y['subject'] + @sisu << %{- + <item> + <title>#{y['title']}</title> + - + <guid> + #{y['filename']} + </guid> + - + } + @sisu << %{<description>} + @sisu << %{<h1 id="#{y['title'].gsub(/\s+/, '-')}">#{y['title']}</h1>} + @sisu << %{#{y['title']} } if y['title'] + @sisu << %{#{y['subtitle']} } if y['subtitle'] + @sisu << %{#{y['creator'] }} if y['creator'] + #@sisu << %{#{y['subject']}} if y['subject'] + @sisu << %{#{y['description'] }} if y['description'] + #@sisu << %{#{y['publisher']}} if y['publisher'] + #@sisu << %{#{y['contributor']}} if y['contributor'] + @sisu << %{#{y['date']} } if y['date'] + #@sisu << %{#{y['date_created']}} if y['date_created'] + #@sisu << %{#{y['date_issued']}} if y['date_issued'] + #@sisu << %{#{y['date_available']}} if y['date_available'] + #@sisu << %{#{y['date_valid']}} if y['date_valid'] + #@sisu << %{#{y['date_modified']}} if y['date_modified'] + #@sisu << %{#{y['type']}} if y['type'] + #@sisu << %{#{y['format']}} if y['format'] + #@sisu << %{#{y['identifier']}} if y['identifier'] + #@sisu << %{#{y['source']}} if y['source'] + #@sisu << %{#{y['language']}} if y['language'] + #@sisu << %{#{y['coverage']}} if y['coverage'] + #@sisu << %{#{y['relation']}} if y['relation'] + #@sisu << %{#{y['rights']}} if y['rights'] + #@sisu << %{#{y['copyright']}} if y['copyright'] + #@sisu << %{#{y['keyword']}} if y['keyword'] + @sisu << %{</description>} + @sisu << %{</item>} + end + end + @sisu << %{</channel>\n</rss>} + #@sisu.each {|para| @@rss.puts para} #KEEP does all + if "united nations"[match] + @sisu.each {|para| @@rss_un.puts para} + @sisu=[] + end + if "unidroit"[match] + @sisu.each {|para| @@rss_unidroit.puts para} + @sisu=[] + end + if "hcpil"[match] + @sisu.each {|para| @@rss_hcpil.puts para} + @sisu=[] + end + if "contract"[match] + @sisu.each {|para| @@rss_contracts.puts para} + @sisu=[] + end + if "navigate"[match] + @sisu.each {|para| @@rss_nav.puts para} + @sisu=[] + end + end + def rss_un + match=/united\s+nations|uncitral/i + rss(match, 'Lex Mercatoria Pages on the United Nations') + end + def rss_unidroit + match=/unidroit/i + rss(match, 'Lex Mercatoria pages on UNIDROIT') + end + def rss_hcpil + match=/hague\s+conference|hcpil/i + rss(match, 'Lex Mercatoria pages on the Hague Conference on Private International Law') + end + def rss_contracts + match=/contracts?/i + rss(match, 'Lex Mercatoria Contract Law pages') + end + def rss_nav + match=/navigate(\s|$)/i + rss(match, 'Lex Mercatoria Navigation pages') + end + def dummy + @sisu << %{<doc>} + @yaml.each do |y| + @sisu << %{<content>} + @sisu << %{#{y['title']}} if y['title'] + @sisu << %{#{y['subtitle']}} if y['subtitle'] + @sisu << %{#{y['creator']}} if y['creator'] + @sisu << %{#{y['subject']}} if y['subject'] + @sisu << %{#{y['description']}} if y['description'] + @sisu << %{#{y['publisher']}} if y['publisher'] + @sisu << %{#{y['contributor']}} if y['contributor'] + @sisu << %{#{y['date']}} if y['date'] + @sisu << %{#{y['date_created']}} if y['date_created'] + @sisu << %{#{y['date_issued']}} if y['date_issued'] + @sisu << %{#{y['date_available']}} if y['date_available'] + @sisu << %{#{y['date_valid']}} if y['date_valid'] + @sisu << %{#{y['date_modified']}} if y['date_modified'] + @sisu << %{#{y['type']}} if y['type'] + @sisu << %{#{y['format']}} if y['format'] + @sisu << %{#{y['identifier']}} if y['identifier'] + @sisu << %{#{y['source']}} if y['source'] + @sisu << %{#{y['language']}} if y['language'] + @sisu << %{#{y['coverage']}} if y['coverage'] + @sisu << %{#{y['relation']}} if y['relation'] + @sisu << %{#{y['rights']}} if y['rights'] + @sisu << %{#{y['copyright']}} if y['copyright'] + @sisu << %{#{y['keyword']}} if y['keyword'] + @sisu << %{</content>} + end + @sisu << %{</doc>} + @sisu.each {|para| @@rss.puts para} + end + def debris + outputdir=SiSU_Env::Info_env.new.path.feed + x=Dir.new(outputdir).entries + x.each do |y| + #unless FileTest.file?("#{outputdir}/#{y}") and File.size?("#{outputdir}/#{y}") == 0 + if File.size("#{outputdir}/#{y}") == 0 + #File.unlink("#{outputdir}/#{y}") + puts "#{outputdir}/#{y}" + puts File.size("#{outputdir}/#{y}") + end + end + end + end + class RDF < Yaml_info_read + def songsheet + loadfile + rdf + rdf_un + rdf_unidroit + rdf_hcpil + rdf_contracts + rdf_nav + debris + end + def rdf + end + def rdf_un + end + def rdf_unidroit + end + def rdf_hcpil + end + def rdf_contracts + end + def rdf_nav + end + def debris + end + end +end + #% start +require SiSU_lib + '/param' +require SiSU_lib + '/defaults' +require SiSU_lib + '/sysenv' +include SiSU_Param +include SiSU_Env +include SiSU_Viz +outputdir=SiSU_Env::Info_env.new.path.feed +pwd=Dir.pwd +@argv=[] +argv=$* +p argv +my_make=SiSU_Env::Create_file.new('','') +if argv.to_s =~/yaml/ + my_make.file_semantic + files=Dir["*.sst,*._sst,*-sst"] + end + files.each {|f| @argv << f[/(.+?)\.[_-]?sst$/,1] if f =~/.+?\.[_-]?sst$/} + ######### + files.each do |filename| + Semantic::YamlInfoCreate.new(filename).songsheet + end +elsif argv.to_s =~/rss/ + #rss=%{#{outputdir}/semantic.xml} + #@@rss=File.new(rss, "w+") + rss_nav=%{#{outputdir}/navigate.xml} + @@rss_nav=File.new(rss_nav, "w+") + # + #rss_un=%{#{outputdir}/un.xml} + #@@rss_un=File.new(rss_un, "w+") + #rss_unidroit=%{#{outputdir}/unidroit.xml} + #@@rss_unidroit=File.new(rss_unidroit, "w+") + #rss_hcpil=%{#{outputdir}/hcpil.xml} + #@@rss_hcpil=File.new(rss_hcpil, "w+") + #rss_contracts=%{#{outputdir}/contracts.xml} + #@@rss_contracts=File.new(rss_contracts, "w+") + ##my_make.file_rss + Semantic::RSS.new.songsheet +elsif argv.to_s =~/rdf/ + #rdf=%{#{outputdir}/semantic.rdf} + #@@rdf=File.new(rdf, "w+") + #rdf_un=%{#{outputdir}/un.rdf} + #@@rdf_un=File.new(rdf_un, "w+") + #rdf_unidroit=%{#{outputdir}/unidroit.rdf} + #@@rdf_unidroit=File.new(rdf_unidroit, "w+") + #rdf_hcpil=%{#{outputdir}/hcpil.rdf} + #@@rdf_hcpil=File.new(rdf_hcpil, "w+") + #rdf_contracts=%{#{outputdir}/contracts.rdf} + #@@rdf_contracts=File.new(rdf_contracts, "w+") + #rdf_nav=%{#{outputdir}/navigate.rdf} + #@@rdf_nav=File.new(rdf_nav, "w+") + ##my_make.file_rdf + #Semantic::RDF.new.songsheet +end +__END__ + diff --git a/lib/sisu/0.52/share_src.rb b/lib/sisu/0.52/share_src.rb new file mode 100644 index 00000000..9574de18 --- /dev/null +++ b/lib/sisu/0.52/share_src.rb @@ -0,0 +1,88 @@ +=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: share sisu source markup file, copy it to output directory! + + * 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_Markup + require SiSU_lib + '/sysenv' + include SiSU_Env + pwd=Dir.pwd + class Source + require 'fileutils' + include FileUtils + def initialize(opt) + @opt=opt + @env=SiSU_Env::Info_env.new(@opt.fns) + stub=@opt.fnb.gsub(/~[a-z]+$/,'') + @output_path="#{@env.path.output}/#{stub}" + end + def read + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Share Document Source!',@opt.fns) + tell.green_hi_blue unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"Copy sisu markup file to output directory","#{@opt.fns} -> #@output_path") + tell.warn unless @opt.cmd =~/q/ + File.mkpath(@env.path.output) unless FileTest.directory?(@env.path.output) + File.mkpath(@output_path) unless FileTest.directory?(@output_path) + if FileTest.directory?(@output_path) + unless @opt.fns =~/\.ssm$/; cp(@opt.fns,@output_path) + else + req=@opt.fns.gsub(/(.+)?\.ssm$/,'\1.composite.sst') + file=@opt.fns.gsub(/(.+)?\.ssm$/,'\1._sst') + if FileTest.file?(file); cp(file,"#@output_path/#{req}") + else print "did not find #{file} to copy" + end + end + else + tell=SiSU_Screen::Ansi.new(@opt.cmd,"Output directory does not exist","#{@opt.fns} -> #@output_path") + tell.warn unless @opt.cmd =~/q/ + exit + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/share_src_kdissert.rb b/lib/sisu/0.52/share_src_kdissert.rb new file mode 100644 index 00000000..a6a2e968 --- /dev/null +++ b/lib/sisu/0.52/share_src_kdissert.rb @@ -0,0 +1,82 @@ +=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: share sisu source markup file, copy it to output directory! + + * 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_Kdi_source + require SiSU_lib + '/sysenv' + include SiSU_Env + pwd=Dir.pwd + class Source + require 'fileutils' + include FileUtils + def initialize(opt) + @opt=opt + @env=SiSU_Env::Info_env.new(@opt.fns) + @output_path="#{@env.path.output}/#{@opt.fnb}" + end + def read + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Share Kdissert Source Document!',@opt.fnb) + tell.green_hi_blue unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"Copy kdissert file to output directory","#{@opt.fnb} -> #@output_path") + tell.warn unless @opt.cmd =~/q/ + File.mkpath(@env.path.output) unless FileTest.directory?(@env.path.output) + File.mkpath(@output_path) unless FileTest.directory?(@output_path) + if FileTest.directory?(@output_path) + if @opt.fns =~/\.kdi\._sst$/ and FileTest.file?(@opt.fnb) + cp(@opt.fnb,@output_path) + end + else + tell=SiSU_Screen::Ansi.new(@opt.cmd,"Output directory does not exist","#{@opt.fnb} -> #@output_path") + tell.warn unless @opt.cmd =~/q/ + exit + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/shared_db.rb b/lib/sisu/0.52/shared_db.rb new file mode 100644 index 00000000..ba98e195 --- /dev/null +++ b/lib/sisu/0.52/shared_db.rb @@ -0,0 +1,78 @@ +=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 + require SiSU_lib + '/db_columns' + require SiSU_lib + '/db_tests' + require SiSU_lib + '/db_create' + require SiSU_lib + '/db_select' + require SiSU_lib + '/db_indexes' + require SiSU_lib + '/db_drop' + require SiSU_lib + '/db_remove' + require SiSU_lib + '/db_load_tuple' + require SiSU_lib + '/db_import' + class Column_size < SiSU_DB_columns::Column_size + end + class Test < SiSU_DB_tests::Test + end + class Create <SiSU_DB_create::Create #<SiSU_DB::Column_size + end + class Case <SiSU_DB_select::Case + end + class Index <SiSU_DB_index::Index # create documents Indexes def initialize(opt,conn='',sql_type='') + end + class Drop <SiSU_DB_drop::Drop + end + class Remove <SiSU_DB_remove::Remove + end + class Load_tuple <SiSU_DB_tuple::Load_tuple #% main database populate + end + class Import <SiSU_DB_import::Import #<SiSU_DB::Column_size #% main + end +end +__END__ diff --git a/lib/sisu/0.52/shared_html.rb b/lib/sisu/0.52/shared_html.rb new file mode 100644 index 00000000..a236783f --- /dev/null +++ b/lib/sisu/0.52/shared_html.rb @@ -0,0 +1,55 @@ +=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: shared html parts + + * 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_shared + require SiSU_lib + '/defaults' + require SiSU_lib + '/html_table' + class Table < SiSU_HTML_table::Table + end +end +__END__ diff --git a/lib/sisu/0.52/shared_html_lite.rb b/lib/sisu/0.52/shared_html_lite.rb new file mode 100644 index 00000000..4d4e03b1 --- /dev/null +++ b/lib/sisu/0.52/shared_html_lite.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: modules shared by db and flatfile output generators, mostly xml/xhtml/html formatting + + * 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_Format_Shared + require SiSU_lib + '/defaults' + include SiSU_Viz + class CSS_Format + def initialize(content=nil,id=nil,ocnd='',ocns='',lv='',hname=nil) + content.gsub!(/<:i[12]>/,'') + @content=content + @id=@ocn=id + @ocnd,@ocns=ocnd,ocns + @lv=@notenumber=lv.to_s + @hname=hname.to_s + @tab="\t" + # lots introduced to do html tables in db + @@tablehead,@@tablefoot=[],[] + @vz=SiSU_Env::Get_init.instance.skin + end + def paragraph + %{#{@tab*1}<p class="h#@lv" id="#@ocn" type="substantive" header="#@hname">\n#{@tab*2}#@content\n#{@tab*1}</p>\n} << "\n" + end + def endnote + <<GSUB +#{@tab*1}<p class="endnote" name="note_#@notenumber" from="#@ocn"> +#{@tab*2}<a name="_#@notenumber" href="#-#@notenumber">#@notenumber.</a> <note>#@content</note> +#{@tab*1}</p> +GSUB + end + def lev_toc_hname + %{#{@tab*1}<p class="toc#@lv" header="#@hname"><a href="##@ocn">\n#{@tab*2}#@content\n#{@tab*1}</a></p>\n} << "\n" + end + def lev_toc + %{#{@tab*1}<p class="toc#@lv"><a href="##@ocn">\n#{@tab*2}#@content\n#{@tab*1}</a></p>\n} << "\n" + end + def lev4_plus + %{#{@tab*1}<p class="h#@lv" id="#@ocn" type="substantive" header="#@hname">\n#{@tab*2}#@content\n#{@tab*1}</p>\n} << "\n" + end + def lev4_minus + %{#{@tab*1}<p class="h#@lv" id="#@ocn" type="substantive">\n#{@tab*2}#@content\n#{@tab*1}</p>\n} << "\n" + end + def norm_comment + %{#{@tab*1}<p class="norm" id="none" type="comment">\n#{@tab*2}#@content\n#{@tab*1}</p>\n} + end + def norm + %{#{@tab*1}<p class="norm" id="#@ocn" type="substantive">\n#{@tab*2}#@content\n#{@tab*1}</p>\n} + end + def indent1 + %{#{@tab*1}<p class="indent1" id="#@ocn" type="substantive">\n#{@tab*2}#@content\n#{@tab*1}</p>\n} + end + def indent2 + %{#{@tab*1}<p class="indent2" id="#@ocn" type="substantive">\n#{@tab*2}#@content\n#{@tab*1}</p>\n} + end + def para_table + %{<p class="norm" align="left"><font #{@vz.font_small} #{@vz.font_color} #{@vz.font_face}>} + end + def ocn + %{#{@tab*1}<p class="ocn">#@ocn</p>} << "\n" + end + def html_table # get rid of use html_table + @new_content=[] + @content.split(/\n/).each do |parablock| + m=parablock[/<!f(.+?)!>/,1] + @@tablefoot<<m if m + parablock.gsub!(/<!f.+?!>/,'') + @@tablehead=1 if parablock =~/<!Th¡/ + parablock.gsub!(/<!Th?¡.+?!~(\d+)>/, + #%{<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"><tr><td valign="top" align="justify"><p class="norm" id="\\1"> </p> </td><td>\n} + + %{<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center">}) + if parablock =~/<!TZ!>/ + tablefoot=[] + @@tablefoot.each {|x| tablefoot << %{<p align="center"><font size=2><i>#{x}</i></font></p>\n}} + @@tablefoot=[] + parablock.gsub!(/<!TZ!>/, + %{#{@vz.table_close}\n}) # + + #%{#{tablefoot}}) + end + if @@tablehead == 1 + if parablock =~/¡¡/ + parablock.gsub!(/<!¡¡(\d+?)¡/, + %{\n<tr>} + + %{\n<td width="\\1%" valign="top">} + + %{#{para_table}<b>}) + parablock.gsub!(/¡¡(\d+?)¡/, + %{</b></td><td width="\\1%" valign="top">} + + %{#{para_table}<b>}) + parablock.gsub!(/!>/, '</b></td></tr>') + @@tablehead=0 #if parablock =~/!>/ + end + parablock + else + parablock.gsub!(/<!¡¡(\d+?)¡/, + %{\n<tr>} + + %{\n<td width="\\1%" valign="top">} + + %{#{para_table}}) + parablock.gsub!(/¡¡(\d+?)¡/, + %{</td><td width="\\1%" valign="top">} + + %{#{para_table}}) + parablock.gsub!(/!>/, '</td></tr>') + parablock + end + @new_content << parablock + end + @new_content.join + end + end + class CSS_Format_generic #does CSS_Format in one definition, needs to be told about class, despite brevity of generic, easier to see structure with CSS_Format + def initialize(css_class='',content='',id=nil,ocnd=nil,ocns=nil,lv='',hname=nil) + @tab="\t" + @class=css_class + @content=content + @lv=@notenumber=lv.to_s + #@ocn=ocn.to_s + @hname=hname.to_s + @id=@ocn=id + end + def paragraph + css_class=%{class="#@class" } + if @ocn + id=%{id="#@ocn" } + type=%{type="substantive" } + else + id=%{id="none" } + type=%{type="comment" } + end + header=%{header="#@hname" } if @hname + %{#{@tab*1}<p #{css_class}#{id}#{type}#{header}>\n#{@tab*2}#@content\n#{@tab*1}</p>\n} << "\n" + end + def para + paragraph + end + end +end +__END__ + diff --git a/lib/sisu/0.52/shared_txt.rb b/lib/sisu/0.52/shared_txt.rb new file mode 100644 index 00000000..bd0b41cc --- /dev/null +++ b/lib/sisu/0.52/shared_txt.rb @@ -0,0 +1,299 @@ +=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 flatfile output generators + + * 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_text_utils + class Wrap + def initialize(para='',n_char_max=76,n_indent=0,n_hang=nil) + @para,@n_char_max,@n_indent=para,n_char_max,n_indent + @br="\n" + @n_hang=unless n_hang; @n_hang=@n_indent + else n_hang + end + end + def line_wrap + space=' ' + spaces_indent,spaces_hang="#@br#{space*@n_indent}",space*@n_hang + line=0 + out=[] + out[line]='' + #line=0,out,out[line]=0,[],'' + #@para.gsub!(/<br(?: \/)?>/,"\n") #watch #added + words=@para.scan(/\S+/) + while words != '' + word=words.shift + if not word + out[line].strip!.squeeze!(' ') unless out[line].empty? #check + break + elsif (out[line].length + word.length) > (@n_char_max - @n_indent) and out[line] =~/\S+/ + out[line].strip!.squeeze!(' ') + line += 1 + end + out[line]="#{out[line]} #{word}" if word + end + out.join(spaces_indent).gsub(/\A\n+/m,'').insert(0,spaces_hang) + end + def line_wrap_indent1 + @n_indent,@n_hang=2,2 + line_wrap + end + def line_wrap_endnote + @n_indent,@n_hang=4,2 + line_wrap + end + end +#end +#module SiSU_scan + class Header_scan + def initialize(md,para) + @regxcl=/<~\d+;\w\d+;\w\d+><(?:[0-9a-f]{32}|[0-9a-f]{64}):(?:[0-9a-f]{32}|[0-9a-f]{64})>/ + para=para.gsub(@regxcl,'').dup + @md,@p=md,para + end + def extract(tag,tag_content,type,attrib) + dc=if dc_tag and dc_content + [dc_tag,dc_content,{dc_tag=>dc_content}] + else nil + end + end + def header(tag,tag_content,type='',attrib='') #this will break stuff and must be tested thoroughly 20060825 + @tag,@tag_content,@type,@attrib=tag,tag_content,type,attrib + def label #element + @tag + end + def type + @type + end + def text + @tag_content + end + def info #element text + @tag_content + end + def attribute + @attrib + end + def element + @tag + end + def attrib + @attrib + end + def el + @tag + end + self + end + def start_is_zero + meta=case @p + when /^0~(title)\s+(.+?)$/; header($1,@md.dc_title,'meta','dc') #dc 1 + #when /^0~(subtitle)\s+(.+?)$/; header($1,$2) + when /^0~(creator|author)\s+(.+?)$/; header('creator',$2,'meta','dc') #dc 2 + when /^0~(subject)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 3 + when /^0~(description)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 4 + when /^0~(publisher)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 5 + when /^0~(contributor)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 6 + when /^0~(date)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 7 + when /^0~(date\.created)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(date\.issued)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(date\.available)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(date\.valid)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(date\.modified)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(type)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 8 + when /^0~(format)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 9 + when /^0~(identifier)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 10 + when /^0~(source)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 11 + when /^0~(language)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 12 + when /^0~(relation)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 13 + when /^0~(coverage)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 14 + when /^0~(rights)\s+(.+?)$/; header($1,$2,'meta','dc') #dc 15 + when /^0~(keywords)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(copyright)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(translator|translated_by)\s+(.+?)$/; header('translator',$2,'meta','extra') + when /^0~(illustrator|illustrated_by)\s+(.+?)$/; header('illustrator',$2,'meta','extra') + when /^0~(prepared_by)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(digitized_by)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(comments?)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(abstract)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(tags?)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(catalogue)\s+(.+?)$/; header($1,$2,'meta','extra') + when /^0~(class(?:ify)?_loc)\s+(.+?)$/; header('classify_loc',$2,'meta','extra') + when /^0~(class(?:ify)?_dewey)\s+(.+?)$/; header('classify_dewey',$2,'meta','extra') + when /^0~(class(?:ify)?_pg)\s+(.+?)$/; header('classify_pg',$2,'meta','extra') + when /^0~(class(?:ify)?_isbn)\s+(.+?)$/; header('classify_isbn',$2,'meta','extra') + when /^0~(toc|structure)\s+(.+?)$/; header('structure',$2,'meta','extra') + when /^0~(toc|structure)\s+(.+?)$/; header('structure',$2,'proc','instruct') + when /^0~(level|page|markup)\s+(.+?)$/; header('markup',$2,'process','instruct') + when /^0~(bold)\s+(.+?)$/; header($1,$2,'process','instruct') + when /^0~(italics|itali[sz]e)\s+(.+?)$/; header('italicize',$2,'process','instruct') + when /^0~(vocabulary|wordlist)\s+(.+?)$/; header('vocabulary',$2,'process','instruct') + when /^0~(skin)\s+(.+?)$/; header($1,$2,'process','instruct') + when /^0~(css|stylesheet)\s+(.+?)$/; header('css',$2,'process','instruct') + when /^0~(links)\s+(.+?)$/; header($1,$2,'process','instruct') + when /^0~(prefix)\s+(.+?)$/; header($1,$2,'process','instruct') + when /^0~(suffix)\s+(.+?)$/; header($1,$2,'process','instruct') + when /^0~(information)\s+(.+?)$/; header($1,$2,'process','instruct') + when /^0~(contact)\s+(.+?)$/; header($1,$2,'process','instruct') + when /^0~(rcs|cvs)\s+(.+?)$/; header('version',$2,'process','instruct') + else nil + end + end + def start_is_at + meta=case @p + when /^@(title):\s+(.+?)$/; header($1,@md.dc_title,'meta','dc') #dc 1 + #when /^@(subtitle):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(creator|author):\s+(.+?)$/; header('creator',$2,'meta','dc') #dc 2 + when /^@(subject):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 3 + when /^@(description):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 4 + when /^@(publisher):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 5 + when /^@(contributor):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 6 + when /^@(date):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 7 + when /^@(date\.created):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(date\.issued):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(date\.available):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(date\.valid):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(date\.modified):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(type):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 8 + when /^@(format):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 9 + when /^@(identifier):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 10 + when /^@(source):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 11 + when /^@(language):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 12 + when /^@(relation):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 13 + when /^@(coverage):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 14 + when /^@(rights):\s+(.+?)$/; header($1,$2,'meta','dc') #dc 15 + when /^@(keywords):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(copyright):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(translator|translated_by):\s+(.+?)$/; header('translator',$2) + when /^@(illustrator|illustrated_by):\s+(.+?)$/; header('illustrator',$2) + when /^@(prepared_by):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(digitized_by):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(comments?):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(abstract):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(tags?):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(catalogue):\s+(.+?)$/; header($1,$2,'meta','extra') + when /^@(class(?:ify)?_loc):\s+(.+?)$/; header('classify_loc',$2,'meta','extra') + when /^@(class(?:ify)?_dewey):\s+(.+?)$/; header('classify_dewey',$2,'meta','extra') + when /^@(class(?:ify)?_pg):\s+(.+?)$/; header('classify_pg',$2,'meta','extra') + when /^@(class(?:ify)?_isbn):\s+(.+?)$/; header('classify_isbn',$2,'meta','extra') + when /^@(toc|structure):\s+(.+?)$/; header('structure',$2,'process','instruct') + when /^@(level|page|markup):\s+(.+?)$/; header('markup',$2,'process','instruct') + when /^@(bold):\s+(.+?)$/; header($1,$2,'process','instruct') + when /^@(italics|itali[sz]e):\s+(.+?)$/; header('italicize',$2,'process','instruct') + when /^@(vocabulary|wordlist):\s+(.+?)$/; header('vocabulary',$2,'process','instruct') + when /^@(skin):\s+(.+?)$/; header($1,$2,'process','instruct') + when /^@(css|stylesheet):\s+(.+?)$/; header('css',$2,'process','instruct') + when /^@(links):\s+(.+?)$/; header($1,$2,'process','instruct') + when /^@(prefix):\s+(.+?)$/; header($1,$2,'process','instruct') #add a & b + when /^@(suffix):\s+(.+?)$/; header($1,$2,'process','instruct') + when /^@(information):\s+(.+?)$/; header($1,$2,'process','instruct') + when /^@(contact):\s+(.+?)$/; header($1,$2,'process','instruct') + when /^@(rcs|cvs):\s+(.+?)$/; header('version',$2,'process','instruct') + else nil + end + end + def dublin + out=if @p =~/^0~\S+\s/; start_is_zero + elsif @p =~/^@\S+:[+-]?\s/; start_is_at + else nil + end + end + def meta + out=if @p =~/^0~\S+\s/; start_is_zero + elsif @p =~/^@\S+:[+-]?\s/; start_is_at + else nil + end + end + end +end +module SiSU_text_parts_flatfile + class Split_text_object + @@dl=nil + attr_reader :format,:text,:ocn,:lev_para_ocn + def initialize(md,para) + @md,@para=md,para + @format,@ocn='null','null' + #@format,@ocn=nil,nil + @@dl ||=SiSU_Env::Info_env.new.digest.length + end + def lev_segname_para_ocn + if @para =~/^(\d~|<:.+?>).+?<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>.*/ + if /^([1-6])~(\S+)\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>/m.match(@para) + @format,segname,@text,@ocn=$1,$2,$3,$4 + @format="#@format~#{segname}" # + elsif /^([1-6]~)\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>/m.match(@para) + @format,@text,@ocn=$1,$2,$3 #,$4 + elsif /<:(.+?)>\s*(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>/m.match(@para) + @format,@text,@ocn=$1,$2,$3 + elsif /^([1-6])~(\S+)\s+(\S.+?)<~(0);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>/m.match(@para) + @@alt_id_count+=1 + @format,segname,@text,@ocn=$1,$2,$3,"x#{@@alt_id_count}" + @format="#@format~#{segname}" # + elsif /^([1-6]~)\s+(\S.+?)<~(0);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>/m.match(@para) + @@alt_id_count+=1 + @format,@text,@ocn=$1,$2,"x#{@@alt_id_count}" + end + else + if /(.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>/m.match(@para) + @text,@ocn=$1,$2 + end + if @para !~/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><[0-9a-f]{#{@@dl}}:[0-9a-f]{#{@@dl}}>|^$/ #added 2002w06 + @text=/(.+?)/m.match(@para)[1] + end + if /^(\d)~\S*\s+(.+)/m.match(@para) + @format,@text=$1,$2 + end + end + @lev_para_ocn=if @para =~/.+<~\d+>/ #hmmm, watch + Format::ParaSiSU.new(@md,@format,@text,@ocn) + else Format::ParaSiSU.new(@md,@format,@text,'<~0>') + end + self + end + end +end +__END__ + diff --git a/lib/sisu/0.52/shared_xml.rb b/lib/sisu/0.52/shared_xml.rb new file mode 100644 index 00000000..a3b4b07f --- /dev/null +++ b/lib/sisu/0.52/shared_xml.rb @@ -0,0 +1,580 @@ +=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: common file for xml 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_text_parts + class Split_text_object + require SiSU_lib + '/param' + require SiSU_lib + '/xml_format' + include SiSU_Viz + include SiSU_XML_format + @@alt_id_count=0 + @@dp=nil + attr_reader :format,:text,:ocn,: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 #using shared_txt instead, watch #% watch closely + if @para =~/^(\d~|<:.+?>).+?<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if /^([1-6])~(\S+)\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,segname,@text,@ocn=$1,$2,$3,$4 + @format="#@format~#{segname}" # + elsif /^([1-6]~)\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@text,@ocn=$1,$2,$3 #,$4 + elsif /<:(.+?)>\s*(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@text,@ocn=$1,$2,$3 + elsif /^([1-6])~(\S+)\s+(\S.+?)<~(0);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,segname,@text,@ocn=$1,$2,$3,"x#{@@alt_id_count}" + @format="#@format~#{segname}" # + elsif /^([1-6]~)\s+(\S.+?)<~(0);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,@text,@ocn=$1,$2,"x#{@@alt_id_count}" + end + else + if /(.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @text,@ocn=$1,$2 + end + if @para !~/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$|^$/ #added 2002w06 + @text=/(.+?)/m.match(@para)[1] + end + if /^(\d)~\S*\s+(.+)/m.match(@para) + @format,@text=$1,$2 + end + end + @lev_para_ocn=if @para =~/.+<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + SiSU_XML_format::Format_scroll.new(@md,@format,@text,@ocn) + else + SiSU_XML_format::Format_scroll.new(@md,@format,@text,"<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>") + end + self + end + def lev_segname_para + if @para =~/^(\d~|<:.+?>).+/ + if /^([1-6])~(\S+)\s+(\S.+)/m.match(@para) + @format,segname,@text=$1,$2,$3 + @format="#@format~#{segname}" # + elsif /^([1-6]~)\s+(\S.+)/m.match(@para) + @format,@text=$1,$2 + elsif /<:(.+?)>\s*(\S.+?)/m.match(@para) + @format,@text=$1,$2 + elsif /^([1-6])~(\S+)\s+(\S.+?)/m.match(@para) + @@alt_id_count+=1 + @format,segname,@text=$1,$2,$3 + @format="#@format~#{segname}" # + elsif /^([1-6]~)\s+(\S.+?)/m.match(@para) + @@alt_id_count+=1 + @format,@text=$1,$2 + end + else + if /(.+?)/m.match(@para) + @text=$1 + end + if @para !~/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$|^$/ #added 2002w06 + @text=/(.+?)/m.match(@para)[1] + end + if /^(\d)~\S*\s+(.+)/m.match(@para) + @format,@text=$1,$2 + end + end + @lev_para_ocn=if @para =~/.+<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + SiSU_XML_format::Format_scroll.new(@md,@format,@text,@ocn) + else + SiSU_XML_format::Format_scroll.new(@md,@format,@text,"<~0;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>") + end + self + end + end +end +module SiSU_XML_munge + class Trans + def initialize(md) + @sys=SiSU_Env::System_call.new + @dir=SiSU_Env::Info_env.new(md.fns) + @dp=SiSU_Env::Info_env.new.digest.pattern + end + def char_enc #character encode + def utf8(para='') + if @sys.locale =~/utf-?8/i # instead ucs for utf8 #require 'iconv' ? Iñtërnâtiônàlizætiøn + #¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûü + #¢£¥§©ª«®°±²³µ¶¹º»¼½¾×÷ + ##para.gsub!(//, '&#;') + ##para.gsub!(//, '&;') + para.gsub!(/¢/, '¢') # '¢' # ¢ + para.gsub!(/£/, '£') # '£' # £ + para.gsub!(/¥/, '¥') # '¥' # ¥ + para.gsub!(/§/, '§') # '§' # § + para.gsub!(/©/, '©') # '©' # © + para.gsub!(/ª/, 'ª') # 'ª' # ª + para.gsub!(/«/, '«') # '«' # « + para.gsub!(/®/, '®') # '®' # ® + para.gsub!(/°/, '°') # '°' # ° + para.gsub!(/±/, '±') # '±' # ± + para.gsub!(/²/, '²') # '²' # ² + para.gsub!(/³/, '³') # '³' # ³ + para.gsub!(/µ/, 'µ') # 'µ' # µ + para.gsub!(/¶/, '¶') # '¶' # ¶ + para.gsub!(/¹/, '¹') # '¹' # ¹ + para.gsub!(/º/, 'º') # 'º' # º + para.gsub!(/»/, '»') # '»' # » + para.gsub!(/¼/, '¼') # '¼' # ¼ + para.gsub!(/½/, '½') # '½' # ½ + para.gsub!(/¾/, '¾') # '¾' # ¾ + para.gsub!(/×/, '×') # '×' # × + para.gsub!(/÷/, '÷') # '÷' # ÷ + para.gsub!(/¿/, '¿') # '¿' # ¿ + para.gsub!(/À/, 'À') # 'À' # À + para.gsub!(/Á/, 'Á') # 'Á' # Á + para.gsub!(/Â/, 'Â') # 'Â' #  + para.gsub!(/Ã/, 'Ã') # 'Ã' # à + para.gsub!(/Ä/, 'Ä') # 'Ä' # Ä + para.gsub!(/Å/, 'Å') # 'Å' # Å + para.gsub!(/Æ/, 'Æ') # 'Æ' # Æ + para.gsub!(/Ç/, 'Ç') # 'Ç' # Ç + para.gsub!(/È/, 'È') # 'È' # È + para.gsub!(/É/, 'É') # 'É' # É + para.gsub!(/Ê/, 'Ê') # 'Ê' # Ê + para.gsub!(/Ë/, 'Ë') # 'Ë' # Ë + para.gsub!(/Ì/, 'Ì') # 'Ì' # Ì + para.gsub!(/Í/, 'Í') # 'Í' # Í + para.gsub!(/Î/, 'Î') # 'Î' # Î + para.gsub!(/Ï/, 'Ï') # 'Ï' # Ï + para.gsub!(/Ð/, 'Ð') # 'Ð' # Ð + para.gsub!(/Ñ/, 'Ñ') # 'Ñ' # Ñ + para.gsub!(/Ò/, 'Ò') # 'Ò' # Ò + para.gsub!(/Ó/, 'Ó') # 'Ó' # Ó + para.gsub!(/Ô/, 'Ô') # 'Ô' # Ô + para.gsub!(/Õ/, 'Õ') # 'Õ' # Õ + para.gsub!(/Ö/, 'Ö') # 'Ö' # Ö + para.gsub!(/Ø/, 'Ø') # 'Ø' # Ø + para.gsub!(/Ù/, 'Ù') # 'Ù' # Ù + para.gsub!(/Ú/, 'Ú') # 'Ú' # Ú + para.gsub!(/Û/, 'Û') # 'Û' # Û + para.gsub!(/Ü/, 'Ü') # 'Ü' # Ü + para.gsub!(/Ý/, 'Ý') # 'Ý' # Ý + para.gsub!(/Þ/, 'Þ') # 'Þ' # Þ + para.gsub!(/ß/, 'ß') # 'ß' # ß + para.gsub!(/à/, 'à') # 'à' # à + para.gsub!(/á/, 'á') # 'á' # á + para.gsub!(/â/, 'â') # 'â' # â + para.gsub!(/ã/, 'ã') # 'ã' # ã + para.gsub!(/ä/, 'ä') # 'ä' # ä + para.gsub!(/å/, 'å') # 'å' # å + para.gsub!(/æ/, 'æ') # 'æ' # æ + para.gsub!(/ç/, 'ç') # 'ç' # ç + para.gsub!(/è/, 'è') # 'è' # è + para.gsub!(/é/, 'é') # '´' # é + para.gsub!(/ê/, 'ê') # 'ˆ' # ê + para.gsub!(/ë/, 'ë') # 'ë' # ë + para.gsub!(/ì/, 'ì') # 'ì' # ì + para.gsub!(/í/, 'í') # '´' # í + para.gsub!(/î/, 'î') # 'î' # î + para.gsub!(/ï/, 'ï') # 'ï' # ï + para.gsub!(/ð/, 'ð') # 'ð' # ð + para.gsub!(/ñ/, 'ñ') # 'ñ' # ñ + para.gsub!(/ò/, 'ò') # 'ò' # ò + para.gsub!(/ó/, 'ó') # 'ó' # ó + para.gsub!(/ô/, 'ô') # 'ô' # ô + para.gsub!(/õ/, 'õ') # 'õ' # õ + para.gsub!(/ö/, 'ö') # 'ö' # ö + para.gsub!(/ø/, 'ø') # 'ø' # ø + para.gsub!(/ù/, 'ú') # 'ù' # ú + para.gsub!(/ú/, 'û') # 'ú' # û + para.gsub!(/û/, 'ü') # 'û' # ü + para.gsub!(/ü/, 'ý') # 'ü' # ý + para.gsub!(/þ/, 'þ') # 'þ' # þ + para.gsub!(/ÿ/, 'ÿ') # 'ÿ' # ÿ + end + end + def html(para='') + if @sys.locale =~/utf-?8/i # instead ucs for utf8 #require 'iconv' ? Iñtërnâtiônàlizætiøn + para.gsub!(/¢/, '¢') # ¢ + para.gsub!(/£/, '£') # £ + para.gsub!(/¥/, '¥') # ¥ + para.gsub!(/§/, '§') # § + para.gsub!(/©/, '©') # © + para.gsub!(/ª/, 'ª') # ª + para.gsub!(/«/, '«') # « + para.gsub!(/®/, '®') # ® + para.gsub!(/°/, '°') # ° + para.gsub!(/±/, '±') # ± + para.gsub!(/²/, '²') # ² + para.gsub!(/³/, '³') # ³ + para.gsub!(/µ/, 'µ') # µ + para.gsub!(/¶/, '¶') # ¶ + para.gsub!(/¹/, '¹') # ¹ + para.gsub!(/º/, 'º') # º + para.gsub!(/»/, '»') # » + para.gsub!(/¼/, '¼') # ¼ + para.gsub!(/½/, '½') # ½ + para.gsub!(/¾/, '¾') # ¾ + para.gsub!(/×/, '×') # × + para.gsub!(/÷/, '÷') # ÷ + para.gsub!(/¿/, '¿') # ¿ + para.gsub!(/À/, 'À') # À + para.gsub!(/Á/, 'Á') # Á + para.gsub!(/Â/, 'Â') #  + para.gsub!(/Ã/, 'Ã') # à + para.gsub!(/Ä/, 'Ä') # Ä + para.gsub!(/Å/, 'Å') # Å + para.gsub!(/Æ/, 'Æ') # Æ + para.gsub!(/Ç/, 'Ç') # Ç + para.gsub!(/È/, 'È') # È + para.gsub!(/É/, 'É') # É + para.gsub!(/Ê/, 'Ê') # Ê + para.gsub!(/Ë/, 'Ë') # Ë + para.gsub!(/Ì/, 'Ì') # Ì + para.gsub!(/Í/, 'Í') # Í + para.gsub!(/Î/, 'Î') # Î + para.gsub!(/Ï/, 'Ï') # Ï + para.gsub!(/Ð/, 'Ð') # Ð + para.gsub!(/Ñ/, 'Ñ') # Ñ + para.gsub!(/Ò/, 'Ò') # Ò + para.gsub!(/Ó/, 'Ó') # Ó + para.gsub!(/Ô/, 'Ô') # Ô + para.gsub!(/Õ/, 'Õ') # Õ + para.gsub!(/Ö/, 'Ö') # Ö + para.gsub!(/Ø/, 'Ø') # Ø + para.gsub!(/Ù/, 'Ù') # Ù + para.gsub!(/Ú/, 'Ú') # Ú + para.gsub!(/Û/, 'Û') # Û + para.gsub!(/Ü/, 'Ü') # Ü + para.gsub!(/Ý/, 'Ý') # Ý + para.gsub!(/Þ/, 'Þ') # Þ + para.gsub!(/ß/, 'ß') # ß + para.gsub!(/à/, 'à') # à + para.gsub!(/á/, 'á') # á + para.gsub!(/â/, 'â') # â + para.gsub!(/ã/, 'ã') # ã + para.gsub!(/ä/, 'ä') # ä + para.gsub!(/å/, 'å') # å + para.gsub!(/æ/, 'æ') # æ + para.gsub!(/ç/, 'ç') # ç + para.gsub!(/è/, 'è') # è + para.gsub!(/é/, '´') # é + para.gsub!(/ê/, 'ˆ') # ê + para.gsub!(/ë/, 'ë') # ë + para.gsub!(/ì/, 'ì') # ì + para.gsub!(/í/, '´') # í + para.gsub!(/î/, 'î') # î + para.gsub!(/ï/, 'ï') # ï + para.gsub!(/ð/, 'ð') # ð + para.gsub!(/ñ/, 'ñ') # ñ + para.gsub!(/ò/, 'ò') # ò + para.gsub!(/ó/, 'ó') # ó + para.gsub!(/ô/, 'ô') # ô + para.gsub!(/õ/, 'õ') # õ + para.gsub!(/ö/, 'ö') # ö + para.gsub!(/ø/, 'ø') # ø + para.gsub!(/ù/, 'ù') # ú + para.gsub!(/ú/, 'ú') # û + para.gsub!(/û/, 'û') # ü + para.gsub!(/ü/, 'ü') # ý + para.gsub!(/þ/, 'þ') # þ + para.gsub!(/ÿ/, 'ÿ') # ÿ + end + end + self + end + def tidywords(wordlist) + wordlist.each do |x| + x.gsub!(/&/,'&') unless x =~/&\S+;/ + end + end + def markup(para='') + wordlist=para.scan(/\S+|\n/) #\n needed for tables, check though added 2005w17 + para=tidywords(wordlist).join(' ').strip + para.gsub!(/(^|\s+)<\s+/,'\1< ') + para.gsub!(/\s+>(\s+|$)/,' >\1') + para.gsub!(/<:pb>\s*/,'') + para.gsub!(/<+[-~]#>+/,'') + para.gsub!(/<0;\w\d+;[um]\d+><#@dp:#@dp>/,'') + para.gsub!(/^(<:i[12]>\s*)_\*\s+/,'\1 <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" xlink:href="/usr/share/sisu/image/bullet_red.png" width="12" height="12" alt="*" /> ') + para.gsub!(/^_\*\s+/,'<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" xlink:href="/usr/share/sisu/image/bullet_red.png" width="12" height="12" alt="*" /> ') + para.gsub!(/(^|\s)\{\s*(\S+?\.(?:jpg|png|gif))\s+(\d+)x(\d+)(\s+[^}]+)?\}(https?:\/\/\S+)/,%{\\1<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" xlink:href="#{@dir.url.images_local}/\\2" width="\\3" height="\\4" />[\\2] \\5}) + para.gsub!(/(^|\s)\{\s*(\S+?\.(?:jpg|png|gif))(\s+[^}]+)?\}(https?:\/\/\S+)/,%{\\1<image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" xlink:href="#{@dir.url.images_local}/\\2"/>\\2}) + para.gsub!(/(^|\s)\{([^}]+)\}(https?:\/\/[^"><]+?)([,.:;"><]?(?:\s|$))/,'\1<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="\3">\2</link>\4') + para.gsub!(/(^|\s)(https?:\/\/[^"><]+?)([,.:;"><]?(?:\s|$))/,'\1<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="\2">\2</link>\3') + para.gsub!(/ /,' ') #clean + para + end + def markup_light(para='') + para.gsub!(/\/\{(.+?)\}\//,'<i>\1</i>') + para.gsub!(/[*!]\{(.+?)\}[*!]/,'<b>\1</b>') + para.gsub!(/_\{(.+?)\}_/,'<u>\1</u>') + para.gsub!(/-\{(.+?)\}-/,'<del>\1</del>') + para.gsub!(/<br(\s*\/)?>/,'<br />') + para.gsub!(/<:pb>\s*/,'') + para.gsub!(/<[-~]#>/,'') + para.gsub!(/(^|\s)&\s+/,'\1& ') #sort + para.gsub!(/&([^;]{1,5})/,'&\1') #sort, rough estimate, revisit #WATCH found in node not sax + para.gsub!(/\{(\S+?\.(?:png|jpg|gif)) .+?\}(?:(?:https?|ftp):\/\/\S+|image)/, + "<image.path>#{@dir.url.images_local}\/\\1</image.path>") + para.gsub!(/ /,' ') + wordlist=para.scan(/\S+|\n/) #\n needed for tables, check though added 2005w17 + para=tidywords(wordlist).join(' ').strip + para + end + def markup_group(para='') + para.gsub!(/</,'<') + para.gsub!(/>/,'>') + para.gsub!(/<br(?:\s+\/)?>/,'<br />') + para + end + end +end +module SiSU_XML_tags #Format + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + class RDF + def initialize(md='',seg_name=[],tracker=0) + @dc_title=@dc_subtitle=@dc_creator=@dc_subject=@dc_description=@dc_publisher=@dc_contributor=@dc_date=@dc_date_created=@dc_date_issued=@dc_date_available=@dc_date_valid=@dc_date_modified=@dc_type=@dc_format=@dc_identifier=@dc_source=@dc_language=@dc_relation=@dc_coverage=@dc_rights=@copyright=@owner=@keywords='' + #seg_name=%{#{@@seg_name[@@tracker]} - } if @@seg_name[@@tracker] + @md=md + @sfx,@pdf=@md.sfx,@md.pdf + @rdfurl=%{ rdf:about="http://www.jus.uio.no/lm/toc"\n} + if @md.dc_title # DublinCore 1 - title + @rdf_title=%{ dc.title="#{seg_name}#{@md.dc_title}"\n} + @dc_title=%{ <meta name="dc.title" content="#{seg_name}#{@md.dc_title}" />\n} + #if @md.subtitle + # @rdf_title=%{ dc.title="#{seg_name}#{@md.title} - #{@md.subtitle}"\n} + # @title=%{<meta name="dc.title" } + + # %{content="#{seg_name}#{@md.title} - #{@md.subtitle}" />\n} + #else + # @rdf_title=%{ dc.title="#{seg_name}#{@md.title}"\n} + # @title=%{<meta name="dc.title" } + + # %{content="#{seg_name}#{@md.title}" />\n} + #end + end + if @md.dc_creator # DublinCore 2 - creator/author (author) + @rdf_creator=%{ dc.creator="#{@md.dc_creator}"\n} + content=meta_content_clean(@md.dc_creator) + @dc_creator=%{ <meta name="dc.creator" content="#{content}" />\n} + end + if @md.dc_subject # DublinCore 3 - subject (us library of congress, eric or udc, or schema???) + @rdf_subject=%{ dc.subject="#{@md.dc_subject}"\n} + content=meta_content_clean(@md.dc_subject) + @dc_subject=%{ <meta name="dc.subject" content="#{content}" />\n} + end + if @md.dc_description # DublinCore 4 - description + @rdf_description=%{ dc.description="#{@md.dc_description}"\n} + content=meta_content_clean(@md.dc_description) + @dc_description=%{ <meta name="dc.description" content="#{content}" />\n} + end + if @md.dc_publisher # DublinCore 5 - publisher (current copy published by) + @rdf_publisher=%{ dc.publisher="#{@md.dc_publisher}"\n} + content=meta_content_clean(@md.dc_publisher) + @dc_publisher=%{ <meta name="dc.publisher" content="#{content}" />\n} + end + if @md.dc_contributor # DublinCore 6 - contributor + @rdf_contributor=%{ dc.contributor="#{@md.dc_contributor}"\n} + content=meta_content_clean(@md.dc_contributor) + @dc_contributor=%{ <meta name="dc.contributor" content="#{content}" />\n} + end + if @md.dc_date # DublinCore 7 - date year-mm-dd + @rdf_date=%{ dc.date="#{@md.dc_date}"\n} + @dc_date=%{ <meta name="dc.date" content="#{@md.dc_date}" #{@md.date_scheme} />\n} + end + if @md.dc_date_created # DublinCore 7 - date.created year-mm-dd + @rdf_date_created=%{ dc.date.created="#{@md.dc_date_created}"\n} + @dc_date_created=%{ <meta name="dc.date.created" content="#{@md.dc_date_created}" #{@md.date_created_scheme} />\n} + end + if @md.dc_date_issued # DublinCore 7 - date.issued year-mm-dd + @rdf_date_issued=%{ dc.date.issued="#{@md.dc_date_issued}"\n} + @dc_date_issued=%{ <meta name="dc.date.issued" content="#{@md.dc_date_issued}" #{@md.date_issued_scheme} />\n} + end + if @md.dc_date_available # DublinCore 7 - date.available year-mm-dd + @rdf_date_available=%{ dc.date.available="#{@md.dc_date_available}"\n} + @dc_date_available=%{ <meta name="dc.date.available" content="#{@md.dc_date_available}" #{@md.date_available_scheme} />\n} + end + if @md.dc_date_valid # DublinCore 7 - date.valid year-mm-dd + @rdf_date_valid=%{ dc.date.valid="#{@md.dc_date_valid}"\n} + @dc_date_valid=%{ <meta name="dc.date.valid" content="#{@md.dc_date_valid}" #{@md.date_valid_scheme} />\n} + end + if @md.dc_date_modified # DublinCore 7 - date.modified year-mm-dd + @rdf_date_modified=%{ dc.date.modified="#{@md.dc_date_modified}"\n} + @dc_date_modified=%{ <meta name="dc.date.modified" content="#{@md.dc_date_modified}" #{@md.date_modified_scheme} />\n} + end + if @md.dc_type # DublinCore 8 - type (genre eg. report, convention etc) + @rdf_type=%{ dc.type="#{@md.dc_type}"\n} + content=meta_content_clean(@md.dc_type) + @dc_type=%{ <meta name="dc.type" content="#{content}" />\n} + end + if @md.dc_format # DublinCore 9 - format (use your mime type) + @rdf_format=%{ dc.format="#{@md.dc_format}"\n} + content=meta_content_clean(@md.dc_format) + @dc_format=%{ <meta name="dc.format" content="#{content}" />\n} + end + if @md.dc_identifier # DublinCore 10 - identifier (your identifier, could use urn which is free) + @rdf_identifier=%{ dc.identifier="#{@md.dc_identifier}"\n} + content=meta_content_clean(@md.dc_identifier) + @dc_identifier=%{ <meta name="dc.identifier" content="#{content}" />\n} + end + if @md.dc_source # DublinCore 11 - source (document source) + @rdf_source=%{ dc.source="#{@md.dc_source}"\n} + content=meta_content_clean(@md.dc_source) + @dc_source=%{ <meta name="dc.source" content="#{content}" />\n} + end + if @md.dc_language[:name] # DublinCore 12 - language (English) + @rdf_language=%{ dc.language="#{@md.dc_language[:name]}"\n} + @dc_language=%{ <meta name="dc.language" content="#{@md.dc_language[:name]}" />\n} + end + if @md.language_original[:name] + @rdf_language_original=%{ dc.language="#{@md.language_original[:name]}"\n} + @language_original=%{ <meta name="dc.language" content="#{@md.language_original[:name]}" />\n} + end + if @md.dc_relation # DublinCore 13 - relation + @rdf_relation=%{ dc.relation="#{@md.dc_relation}"\n} + content=meta_content_clean(@md.dc_relation) + @dc_relation=%{ <meta name="dc.relation" content="#{content}" />\n} + end + if @md.dc_coverage # DublinCore 14 - coverage + @rdf_coverage=%{ dc.coverage="#{@md.dc_coverage}"\n} + content=meta_content_clean(@md.dc_coverage) + @dc_coverage=%{ <meta name="dc.coverage" content="#{content}" />\n} + end + if @md.dc_rights # DublinCore 15 - rights + @rdf_rights=%{ dc.rights="#{@md.dc_rights}"\n} + content=meta_content_clean(@md.dc_rights) + @dc_rights=%{ <meta name="dc.rights" content="#{content}" />\n} + end + content=meta_content_clean(@md.keywords) + @keywords=%{ <meta name="keywords" content="#{content}" />\n} if @md.keywords + @vz=SiSU_Env::Get_init.instance.skin + end + def meta_content_clean(content='') + unless content.nil? + content.tr!('"',"'") + end + content + end + def rdftoc #tocHead #values strung together, because some empty, and resulting output (line breaks) is much better + #<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + # xmlns:dc="http://purl.org/dc/elements/1.1/"> + # <rdf:Description rdf:about="http://www.jus.uio.no/lm/doc" + # dc:creator="Author" + # dc:title="Title" + # dc:description="Description if any" + # dc:date="Publication Date" + # /> + #</rdf:RDF> + #Dublin Core +#### XML only :-( KEEP +#<<WOK +#<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +# xmlns:dc="http://purl.org/dc/elements/1.1/"> +# <rdf:Description +# #@rdfurl#@rdf_title#@rdf_subtitle#@rdf_creator#@rdf_subject#@rdf_description#@rdf_publisher#@rdf_contributor#@rdf_date#@rdf_dateCreated#@rdf_dateIssued#@rdf_dateAvailable#@rdf_dateValid#@rdf_dateModified#@rdf_type#@rdf_format#@rdf_identifier#@rdf_source#@rdf_language#@rdf_relation #@rdf_coverage#@rdf_rights +# />\n +#</rdf:RDF>\n +#WOK + end + def rdfseg #segHead + rdftoc + end + def comment_xml(extra='') + generator="Generated by: #{@md.sisu_version[:project]} #{@md.sisu_version[:version]} of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" if @md.sisu_version[:version] + lastdone="Last Generated on: #{Time.now}" + rubyv="Ruby version: #{@md.ruby_version}" + sc=if @md.sc_info + "Source file: #{@md.sc_filename} version: #{@md.sc_number} of: #{@md.sc_date}" + else '' + end + if extra.empty? +<<WOK +<!-- Document processing information: + * #{generator} + * #{rubyv} + * #{sc} + * #{lastdone} + * SiSU http://www.jus.uio.no/sisu +--> +WOK + else +<<WOK +<!-- Document processing information: + * #{extra} + * #{generator} + * #{rubyv} + * #{sc} + * #{lastdone} + * SiSU http://www.jus.uio.no/sisu +--> +WOK + end + end + def comment_xml_sax + desc='SiSU XML, SAX type representation' + comment_xml(desc) + end + def comment_xml_node + desc='SiSU XML, Node type representation' + comment_xml(desc) + end + def comment_xml_dom + desc='SiSU XML, DOM type representation' + comment_xml(desc) + end + def metatag_html #values strung together, because some empty, and resulting output (line breaks) is much better +#{@vz.js_head} +<<WOK +#@dc_title#@dc_subtitle#@dc_creator#@dc_subject#@dc_description#@dc_publisher#@dc_contributor#@dc_date#@dc_date_created#@dc_date_issued#@dc_date_available#@dc_date_valid#@dc_date_modified#@dc_type#@dc_format#@dc_identifier#@dc_source#@dc_language#@dc_relation#@dc_coverage#@dc_rights#@copyright#@owner +#{@vz.txt_generator} +#{@vz.png_ico} +WOK + end + end +end +module SiSU_Tables + require SiSU_lib + '/xml_tables' +end +__END__ + diff --git a/lib/sisu/0.52/sisupod_make.rb b/lib/sisu/0.52/sisupod_make.rb new file mode 100644 index 00000000..21e35e64 --- /dev/null +++ b/lib/sisu/0.52/sisupod_make.rb @@ -0,0 +1,316 @@ +=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: create sisupod filetype and copy it to output directory! + + * 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_Doc + require 'fileutils' + include SiSU_Env + class Source + include FileUtils #::Verbose + require SiSU_lib + '/sysenv' + require SiSU_lib + '/response' + def initialize(opt) + @opt=opt + m=/.+\/(\S+)/m + @date=SiSU_Env::Info_date.new.dt + @env=SiSU_Env::Info_env.new(@opt.fns) + @ver=SiSU_Env::Info_version.new.get_version + @ans=SiSU_Response::Response.new + pod_path="#{@env.path.processing}/sisupod" + @v=if @opt.cmd =~/[VM]/; 'v' + else '' + end + File.mkpath(pod_path) unless FileTest.directory?(pod_path) + rm_rf("#{@env.path.processing}sisupod/*") if FileTest.directory?("#{@env.path.processing}sisupod") + end + def read + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Share SiSU Document (zip)',@opt.fns) + tell.green_hi_blue unless @opt.cmd =~/q/ + unless @opt.fns.empty? + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Make sisu document (zip) and place in output directory',"#{@opt.fns}.zip -> #{@env.path.output}/#{@opt.fnb}/sisupod.zip") + tell.warn unless @opt.cmd =~/q/ + directories + sisupod_build + sisupod_zip + #sisupod_7zip + else + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Make (zip) of sisu work directory',"#{@env.stub_pwd}\_#@date.zip") + tell.warn unless @opt.cmd =~/q/ + tell.blue_tab unless @opt.cmd =~/q/ + ans=@ans.response?('make sisupod of entire directory?') + if ans; sisupod_zip_directory + end + end + end + def sisupod_zip_directory + sisupod_directory="sisupod-#{@env.stub_pwd}-#@date.ssp" # "sisupod-#{@env.stub_pwd}-#@date.zip" + unless File.symlink?('sisupod'); File.symlink(Dir.pwd,'sisupod') + end + re_base_dir='^sisupod/([^.][^/]*\.(ssm|ssi|sst)$|_sisu/)' + re_files='/[a-zA-Z0-9.~_-]+\.(ssm|ssi|sst|rb|css|png|jpg|gif|yaml)$' + re_ignore='/[.~_-][^/]+$' + if File.symlink?('sisupod') + info="SiSU sisupod #{@ver[:version]} directory contents #{sisupod_directory}" + system(%{ + echo "#{info}" + echo "#{info}" > sisu_zip.txt + zip -qz #{sisupod_directory} sisu_zip.txt < sisu_zip.txt + for I in `find -H sisupod -print | \ + egrep "#{re_base_dir}" | \ + egrep "#{re_files}" | \ + egrep -v "#{re_ignore}" ` + do zip #{sisupod_directory} $I + done + }) + else puts "the required systemlink 'sisupod' could not be created on the current directory: remove the file or directory named 'sisupod' within #{Dir.pwd}" + end + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Share SiSU Document (tar gzip)',@opt.fns) + tell.green_hi_blue unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Zipped directory',sisupod_directory) + tell.warn unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new('',sisupod_directory) + tell.blue_tab unless @opt.cmd =~/q/ + end + def directories + SiSU_Env::Info_env.new.sisupod + end + def select(skin='') # skin loading logic here + load SiSU_lib + '/defaults.rb' + @skin={} + skin_path = [ + "#{@env.path.pwd}/_sisu/skin", + "#{@env.path.home}/.sisu/skin", + '/etc/sisu/skin', + "#{@env.path.processing}/external_document/skin" + ] + sk_doc,sk_dir="doc/#{skin}.rb","dir/skin_#{@env.stub_pwd}.rb" + skin_path.each do |v| #document skin priority 1 + if FileTest.file?("#{v}/#{sk_doc}") + @skin[:name],@skin[:type]="#{v}/#{sk_doc}",'doc' + break + end + end + unless @skin.length > 0 + skin_path.each do |v| #directory skin priority 2 + if FileTest.file?("#{v}/#{sk_dir}") + @skin[:name],@skin[:type]="#{v}/#{sk_dir}",'dir' + break + end + end + end + @skin + end + def sisupod_build #see also sisupod in sysenv + @rgx_rb_image=/["'](\S+?\.(?:png|jpg|gif))["']/ + @rgx_image=/\{\s*(\S+?\.(?:png|jpg|gif))/ + @rgx_skin=/^(?:@skin:|0~skin)\s+(\S+)/ + @rgx_doc_import=/^%\s\s*\|(\S+?\.ss[ti])\|@\|\^\|>>ok/ + file_array=IO.readlines(@opt.fns,'') + skin,images,doc_import=[],[],[] + #skin_dir=SiSU_Env::Info_skin.new.select + #skin << [skin_dir.gsub(/.+?\/(skin_\S+?)\.rb/,'\1')] + file_array.each do |f| #% work area + if f !~/^%\s/ + skin << f.scan(@rgx_skin).uniq.flatten if f =~@rgx_skin + images << f.scan(@rgx_image).uniq if f =~@rgx_image + elsif f =~/^%\s/ and @opt.fns =~/\._sst$/ + doc_import << f.scan(@rgx_doc_import).uniq if f =~@rgx_doc_import + end + end + docskin=nil + if skin and skin.length > 0 + docskin=skin.pop.flatten.join + skin_source=select(docskin) + else + skin_source=select + end + docskin_place="#{@env.path.processing}/sisupod/_sisu/skin/#{skin_source[:type]}" + if skin_source[:type] =~/dir/ + docskin_with_path="#{docskin_place}/skin_#{@env.stub_pwd}.rb" + docskin=[docskin_with_path.gsub(/.+?\/(skin_\S+?)\.rb/,'\1')] + docskin='skin_sisupod' + end + if skin_source and docskin + cp_r(skin_source[:name],"#{docskin_place}/#{docskin}.rb") + #if skin_source[:type] =~/dir/ + # File.symlink("#{docskin_place}/#{docskin}.rb","#{docskin_place}/skin_#{@env.stub_pwd}.rb") + #end + skinfile_array=IO.readlines(skin_source[:name],'') + para_images=[] + skinfile_array.each do |f| #% work area + unless f =~/^%+ / #hmmm + images << f.scan(@rgx_rb_image).uniq if f =~@rgx_rb_image #and FileTest.file?(f.scan(@rgx_rb_image).uniq) + #does not really discriminate, may duplicate images in sisu file, and may take images from default image pool + end + end + end + #1. mapping in doc dir? + #2. need images used by skin, scan skin?? + if images and images.length > 1 + images.flatten!.uniq! + image_path_pwd='_sisu/image' + path_pod_conf="#{@env.path.processing}/sisupod/_sisu" + images_path_pod="#{path_pod_conf}/image" + #unattractive hard coding ... ! + images_pwd="#{@env.path.pwd}/#{image_path_pwd}" + ##sequence copies base images, defaults used in all html outputs + #image_source_base='/usr/share/sisu/image' + #dir_pwd=Dir.pwd + #Dir.chdir(image_source_base) + #base_images=Dir.glob('*') + #base_images.each do |i| + # cp_r(i,"#{images_path_pod}/#{i}") + #end + #Dir.chdir(dir_pwd) + if FileTest.directory?(image_path_pwd) + images=images.uniq + images.each do |i| + cp_r("#{images_pwd}/#{i}","#{images_path_pod}/#{i}") if FileTest.file?("#{images_pwd}/#{i}") + end + #chmod(0755, dir_images_www) + else puts "\tWARN, did not find - #{image_path_pod}" + end + end + x=@env.document_language_versions_found #check multiple document language versions (param not used) + if doc_import.flatten.length > 0 and @opt.fns =~/\._sst$/ + doc_import.flatten.each do |f| + cp_r("#{@env.path.pwd}/#{f}","#{@env.path.processing}/sisupod/#{f}") + end + end + if x[:f] and x[:f].length > 1 #store multiple document language versions, sisupod + x[:f].each do |f| + cp_r("#{@env.path.pwd}/#{f}","#{@env.path.processing}/sisupod/#{f}") + end + elsif @opt.fns =~/\._sst/ + ssm=@opt.fns.gsub(/\._sst/,'.ssm') + cp_r("#{@env.path.pwd}/#{ssm}","#{@env.path.processing}/sisupod/#{ssm}") + else cp_r("#{@env.path.pwd}/#{@opt.fns}","#{@env.path.processing}/sisupod/#{@opt.fns}") + end #NB not all possibilies met, revisit, also in case of composite file may wish to add README + end + def sisupod_7zip #look at later + dir=SiSU_Env::Info_env.new(@opt.fns) + local_path="#{dir.path.output}/#{dir.fnb}" + File.mkpath(local_path) unless FileTest.directory?(local_path) + system(%{ + cd #{@env.path.processing} + echo "SiSU sisupod #{@ver[:version]}" > sisu_zip.txt + #7zip -qz #{@opt.fns}.7z sisu_zip.txt < sisu_zip.txt + 7zr a -t7z -m0=lzma -mx=9 -ms=on #{@opt.fns}.7z sisu_zip.txt + 7zr a -t7z -m0=lzma -mx=9 -ms=on #{@opt.fns}.7z sisupod + #7zip -qr #{@opt.fns}.7z sisupod + mv #{@opt.fns}.7z #{local_path}/sisupod.7z & + rm -r sisupod/* && cd #{@env.path.pwd} + }) + tell=SiSU_Screen::Ansi.new('',"#{@opt.fns}.7z") + tell.blue_tab unless @opt.cmd =~/q/ + end + def sisupod_zip + dir=SiSU_Env::Info_env.new(@opt.fns) + local_path="#{dir.path.output}/#{dir.fnb}" + File.mkpath(local_path) unless FileTest.directory?(local_path) + system(%{ + cd #{@env.path.processing} + echo "SiSU sisupod #{@ver[:version]}" > sisu_zip.txt + zip -qz #{@opt.fns}.zip sisu_zip.txt < sisu_zip.txt + zip -qr #{@opt.fns}.zip sisupod + mv #{@opt.fns}.zip #{local_path}/sisupod.zip & + rm -r sisupod/* && cd #{@env.path.pwd} + }) + tell=SiSU_Screen::Ansi.new('',"#{@opt.fns}.zip") + tell.blue_tab unless @opt.cmd =~/q/ + end + end +end +__END__ +question?: should you permit the packing of multiple files in single .gz ? + + open @opt.fns, parse file + extract from file content: + images and copy each image from whatever image source to _sisu/sisupod/sisu/_sisu/image + skin and copy active skin from whatever source to _sisu/sisupod/sisu/_sisu/skin/doc + extract from skin images required by skin + + remove previously existing contents of _/sisu/sisupod & + make directory structure: + + _sisu + sisupod + sisu + content.sst [file content] + filename.sst [link to content.sst] + _sisu + conf + skin/ + doc [relevant skin if any other than default] + image [all images for specific document gathered here] + +sisu + _sisu + sisurc.yml + skin/ + dir/ + doc/ + misc/ + site/ + yaml/ + convert/ + standard_terms/ + image + processing + dal/ + tex/ + texinfo/ + tune/ + sisupod + +special case + +composite file (master), e.g. +SiSU.ssm + diff --git a/lib/sisu/0.52/sitemaps.rb b/lib/sisu/0.52/sitemaps.rb new file mode 100644 index 00000000..71956b03 --- /dev/null +++ b/lib/sisu/0.52/sitemaps.rb @@ -0,0 +1,213 @@ +=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: sitemap created from parameters extracted from input file(s) + + * 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_Sitemaps + require SiSU_lib + '/param' + require SiSU_lib + '/sysenv' + require SiSU_lib + '/shared_xml' + include SiSU_Env + include SiSU_Param + include SiSU_XML_munge + class Source + require 'fileutils' + include FileUtils + def initialize(opt) + @opt=opt + end + def read + songsheet + end + def songsheet + begin + @sys=SiSU_Env::System_call.new + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(@opt.fns) + @fn=SiSU_Env::Env_call.new(@opt.fns).lang(fn_set_lang[:c]) + if @opt.cmd =~/Y/ + @md=SiSU_Param::Parameters.new(@opt).get + @trans=SiSU_XML_munge::Trans.new(@md) #check @md is required + @env=SiSU_Env::Info_env.new(@md.fns) + @rdf=SiSU_XML_tags::RDF.new(@md) + @fnb_utf8_xml=@md.fnb.dup + @trans.char_enc.utf8(@fnb_utf8_xml) if @sys.locale =~/utf-?8/i #% utf8 + output_map(sitemap) + elsif @opt.mod.inspect =~/--sitemaps/ + @sitemap_idx_fn='sitemapindex.xml' + @env=SiSU_Env::Info_env.new + output_idx(sitemap_index) + tell=SiSU_Screen::Ansi.new(@opt.cmd,"sitemap index:","#{@env.path.output}/#@sitemap_idx_fn") + tell.result unless @opt.cmd =~/q/ + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + def make_file(path,filename) + if File.writable?("#{path}/."); File.new("#{path}/#{filename}",'w+') + else + SiSU_Screen::Ansi.new('',"is the file or directory writable?, could not create #{filename}").warn + end + end + def make_path(path) + File.mkpath(path) unless FileTest.directory?(path) + end + def output_map(sitemap) + path="#{@env.path.output}/#{@md.fnb}" + filename=@fn[:sitemap] + touch_path=@env.path.sitemaps + touch_filename=@fn[:sitemap_touch] + SiSU_Env::SiSU_file.new(@md).make_path(path) + file=SiSU_Env::SiSU_file.new(@md).make_file(path,filename) + file << sitemap + if FileTest.file?("#{touch_path}/#{touch_filename}") + rm("#{touch_path}/#{touch_filename}") + end + SiSU_Env::SiSU_file.new(@md).touch_file(touch_path,touch_filename) + end + def output_idx(sitemap) + path=@env.path.output + filename=@sitemap_idx_fn + make_path(path) + file=make_file(path,filename) + file << sitemap + #cp("#{path}/#{filename}","#{@env.path.output}/#{filename}") + end + def sitemap_index + sitemap_files=Dir.glob("#{@env.path.sitemaps}/sitemap_*.xml") + sitemap_idx=[] + sitemap_idx <<<<WOK +<?xml version="1.0" encoding="UTF-8"?> +<sitemapindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemaps/0.9 + http://www.sitemaps.org/schemas/sitemaps/sitemap.xsd" + xmlns="http://www.sitemaps.org/schemas/sitemapindex/0.9"> +WOK + sitemap_files.each do |s| + f=s.gsub(/.+?\/sitemap_([^\/]+?)\.xml$/,'\1') + @trans.char_enc.utf8(f) if @sys.locale =~/utf-?8/i #% utf8 +sitemap_idx <<<<WOK + <sitemap> + <loc>#{@env.path.url.remote}/#{f}/sitemap.xml</loc> + </sitemap> +WOK +#<lastmod>1993-10-03T16:00:16+00:00</lastmod> + end + sitemap_idx <<<<WOK +</sitemapindex> +WOK + idx=sitemap_idx.join + end + def sitemap + map=if @md.dc_date_modified and @md.dc_date_modified=~/\d{4}-\d{2}-\d{2}/ + sitemap_date_modified + else sitemap_no_date + end + end + def sitemap_date_modified +<<WOK +<?xml version='1.0' encoding='UTF-8'?> +<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemaps/0.9 + http://www.sitemaps.org/schemas/sitemaps/sitemap.xsd" + xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> +#{@rdf.comment_xml} + <url> + <loc>#{@env.path.url.remote}/#@fnb_utf8_xml/#{@fn[:toc]}</loc> + <lastmod>#{@md.dc_date_modified}</lastmod> + <changefreq>monthly</changefreq> + <priority>0.7</priority> + </url> + <url> + <loc>#{@env.path.url.remote}/#@fnb_utf8_xml/#{@fn[:doc]}</loc> + <lastmod>#{@md.dc_date_modified}</lastmod> + <priority>0.5</priority> + </url> + <url> + <loc>#{@env.path.url.remote}/#@fnb_utf8_xml/#{@fn[:manifest]}</loc> + <lastmod>#{@md.dc_date_modified}</lastmod> + <priority>0.5</priority> + </url> +</urlset> +WOK + end + def sitemap_no_date +<<WOK +<?xml version="1.0" encoding="UTF-8"?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> +#{@rdf.comment_xml} + <url> + <loc>#{@env.path.url.remote}/#@fnb_utf8_xml/#{@fn[:toc]}</loc> + <changefreq>monthly</changefreq> + <priority>0.7</priority> + </url> + <url> + <loc>#{@env.path.url.remote}/#@fnb_utf8_xml/#{@fn[:doc]}</loc> + <priority>0.5</priority> + </url> + <url> + <loc>#{@env.path.url.remote}/#@fnb_utf8_xml/#{@fn[:manifest]}</loc> + <priority>0.5</priority> + </url> +</urlset> +WOK + end + end +end +__END__ +* sanitize xml, pass through filter to ensure is valid - done but needs testing +* remote placement of sitemaps --sitemaps -R (probably makes more sense than doing against -Y [filename/wildcard]) - done but needs testing +* gzip sitemaps - not before testing / after testing +* issue with master documnts, naming and mapping, check multilingual + +<!-- Document processing information: + * Generated by: SiSU 0.48.6 of 2006w45/6 (20061111) + * Ruby version: ruby 1.8.5 (2006-08-25) [i486-linux] + * + * Last Generated on: Sat Nov 18 15:28:08 +0000 2006 + * SiSU http://www.jus.uio.no/sisu +--> + diff --git a/lib/sisu/0.52/spell.rb b/lib/sisu/0.52/spell.rb new file mode 100644 index 00000000..f3e264de --- /dev/null +++ b/lib/sisu/0.52/spell.rb @@ -0,0 +1,91 @@ +=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: spellchecking + + * 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 Utility + class Spell + def initialize(input,filesrc,flg) + @flg=flg + @filename, @filetype = /(.+?)(\.\w\w\w0$)/.match(filesrc)[1,2] #.gsub(/\.\w\w\w0$/, "") + @input=input + @allwords=[] + puts @filename + @speller='aspell' # 'ispell' + @dictionary = 'british' + @lang = 'en_GB' + end + def check + @input.each do |data| + data.gsub!(/(http|www|ftp|gopher|png|jpg|gif|html|htm| )\S+/i,' ') + data.gsub!(/<\/?(table|tr|td|b|p|href).*?>/i,' ') + data.gsub!(/(<==.+|<:\S+>|<!.+?!>|^0~.+|\{\{\{|~)/,' ') + data.gsub!(/(["|<>)(\n'`'.;&_-]|\=)/,' ') + data.gsub!(/\b(altExternal| + target|externalimg| + srcimagebext| + img|src|toc|pdf| + cd|org| + helvetica|roman + )\b/i,' ') + data.gsub!(/EOF/,'') + @words=data.scan(/\S+/) + @words.each { |y| @allwords << y } + end + @allwords.uniq! + if @flg =~ /S/ + File.open('/home/ralph/spell_error','a+') do |file| #fix + file.puts %{\n\n<<#@filename>>} + end + @allwords.each { |y| puts y.inspect; system(%{cat #{y} | /usr/bin/#@speller -l -d #@dictionary >> ~/spell_error })} + else + @allwords.each { |y| sp = %x{echo #{y}|#@speller -l }; puts sp unless sp.empty?} + end + end + end +end +__END__ + diff --git a/lib/sisu/0.52/sst_convert_markup.rb b/lib/sisu/0.52/sst_convert_markup.rb new file mode 100644 index 00000000..d1c337cf --- /dev/null +++ b/lib/sisu/0.52/sst_convert_markup.rb @@ -0,0 +1,298 @@ +=begin + * Name: modify.rb + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: A conversion script for canned substitutions, + a fairly generic simple tool that can be used to store other canned conversions, + used here for altering SiSU markup + + * Copyright (C) 2004, 2006 Ralph Amissah + + * Packaged with: SiSU information Structuring Universe - Structured information, Serialized Units + * SiSU 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 + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Modify + require SiSU_lib + '/sst_identify_markup' + require SiSU_lib + '/sst_from_kdissert' + require SiSU_lib + '/sst_to_s_xml_sax' + require SiSU_lib + '/sst_to_s_xml_dom' + require SiSU_lib + '/sst_to_s_xml_node' + require SiSU_lib + '/sst_from_xml' + require SiSU_lib + '/response' + class Convert_markup + require 'fileutils' + include FileUtils #::Verbose + def initialize(opt) + @opt=opt + @description='This is a script that contains canned text conversions for reuse' + @response=SiSU_Response::Response.new + @ask=SiSU_Response::Response.new + @warn='WARNING, PROCEED AT YOUR OWN RISK, will make file changes.' + end + def current_match_and_replace + convert_37_to_38 + end + def message(text) + response='' + unless @opt.cmd=~/QQ/ or @opt.cmd=~/q/ + response=@ask.response?(%{#{ text}\nProceed? }) + end + end + def help + print <<WOK + +#@description + +sisu --convert --to38 [filename/wildcard] + converts pre 0.37 sisu markup to 0.38 experimental + [--37to38] + +sisu --convert --to37 [filename/wildcard] + converts pre 0.37 sisu markup to 0.38 experimental + [--38to37] + +sisu --convert --36to37 [filename/wildcard] + converts pre 0.36 file-name, to 0.37 file-name + [--36to37] + +sisu --identify [filename] + attempts to identify markup version used in file + +sisu --query [version number] + gives short summary of distinguishing characteristic + of that version of markup + +WOK + exit + end + #%% substitutions to be made + def convert_37_to_38 + message("#@warn\nConvert sisu markup from 0.37 to 0.38") + [ + [/^0~(\S+?)([+-])\s+/, '@\1:\2 ', //], + [/^0~(\S+)\s+/, '@\1: ', //], + [/^@toc:\s+/, '@structure: ', //], + [/^1~/, ':A~', //], + [/^2~/, ':B~', //], + [/^3~/, ':C~', //], + [/^4~/, '1~', //], + [/^5~/, '2~', //], + [/^6~/, '3~', //], + [/^7~/, '4~', //], + [/^8~/, '5~', //], + [/^9~/, '6~', //], + [/1/, ':A', /^@(?:level|markup):\s/], + [/2/, ':B', /^@(?:level|markup):\s/], + [/3/, ':C', /^@(?:level|markup):\s/], + [/4/, '1', /^@(?:level|markup):\s/], + [/5/, '2', /^@(?:level|markup):\s/], + [/6/, '3', /^@(?:level|markup):\s/] + ] + end + def convert_38_to_37 + message("#@warn\nConvert sisu markup from 0.38 to 0.37") + [ + [/^@(\S+?):([+-])\s+/, '0~\1\2 ', //], + [/^@(\S+?):\s+/, '0~\1 ', //], + [/^0~structure\s+/, '0~toc ', //], + [/^1~/, '4~', //], + [/^2~/, '5~', //], + [/^3~/, '6~', //], + [/^4~/, '7~', //], + [/^5~/, '8~', //], + [/^6~/, '9~', //], + [/^:?A~/, '1~', //], + [/^:?B~/, '2~', //], + [/^:?C~/, '3~', //], + [/1/, '4', /^0~(?:level|markup)\s/], + [/2/, '5', /^0~(?:level|markup)\s/], + [/3/, '6', /^0~(?:level|markup)\s/], + [/:?A/, '1', /^0~(?:level|markup)\s/], + [/:?B/, '2', /^0~(?:level|markup)\s/], + [/:?C/, '3', /^0~(?:level|markup)\s/] + ] + end + def convert_filename_36_to_37 + @opt.files.each do |f| + s=case f + when /(\.s[1-3])$/; f.sub($1,'.sst') + when /(\.r[1-3])$/; f.sub($1,'.ssm') + when /(\.ri)$/; f.sub($1,'.ssi') + else f + end + pwd=Dir.pwd + unless f == s + unless File.exist?("#{pwd}/#{s}") + puts "./#{f} -> ./#{s}" + cp("#{pwd}/#{f}","#{pwd}/#{s}") + else "File already exists, < #{s} > will not overwrite" + end + end + end + end + def convert_to_simple_xml_model_sax + SiSU_simple_xml_model_sax::Convert.new(@opt).read + end + def convert_to_simple_xml_model_dom + SiSU_simple_xml_model_dom::Convert.new(@opt).read + end + def convert_to_simple_xml_model_node + SiSU_simple_xml_model_node::Convert.new(@opt).read + end + def convert_kdi_to_sst + SiSU_Kdissert::Convert.new(@opt).read + end + def convert_s_xml_to_sst + SiSU_sst_from_xml::Convert.new(@opt).read + end + def convert_footnotes + require SiSU_lib + '/sst_do_inline_footnotes' + SiSU_Convert_footnotes::Source.new(@opt).read + end + def conversion + #%% do it --------------------------> + if @opt.files and @opt.files.length > 0 + mr=nil + #%% changes to make m match, r replace --------------------------> + if @opt.mod.inspect =~/--help/; help + elsif @opt.mod.inspect =~/(?:convert|to)[=-](?:xml |sxs|sax|sxd|dom|sxn|node)/ + ext=case @opt.mod.inspect + when /(?:convert|to)[=-](?:xml|sxs|sax)/; '.sxs.xml' + when /(?:convert|to)[=-](?:sxd|dom)/; '.sxd.xml' + when /(?:convert|to)[=-](?:sxn|node)/; '.sxn.xml' + end + message("#{@opt.files.inspect}\n\nWARNING, PROCEED AT YOUR OWN RISK,\noverwriting any equivalent file with the extension #{ext}") + mr=case @opt.mod.inspect + when /(?:convert|to)[=-](?:sxs|sax|xml )/; convert_to_simple_xml_model_sax + when /(?:convert|to)[=-](?:sxd|dom)/; convert_to_simple_xml_model_dom + when /(?:convert|to)[=-](?:sxn|node)/; convert_to_simple_xml_model_node + else help + end + else + mr=case @opt.mod.inspect + when /(?:(?:37)?to-?38|--(?:convert|to)[=-](?:current|0.38))/; convert_37_to_38 + when /(?:(?:38)?to-?37|--(?:convert|to)[=-](?:0.37))/; convert_38_to_37 + when /(?:36to37)/; convert_filename_36_to_37 + when /(?:convert|from)[=-]kdi/; convert_kdi_to_sst + when /(?:(?:convert|from)[=-])?(?:xml_to_sst|xml2sst|sxml|sxs|sxd|sxd)/; convert_s_xml_to_sst + when /(?:convert|to)[=-]footnotes/; convert_footnotes + when /convert|default/; current_match_and_replace + else help + end + end + unless @opt.mod.inspect =~/kdi/ + match_and_replace=mr + #start_processing =/not used in this example/i + end_processing =/END\s+OF\s+FILE/ + i=@opt.fns + if i =~/(?:\.sst|\.ssm|\.ssi)$/ + @new,@matched,@flag_start,@flag_end,@empty1,@empty2=true,false,false,false,false,false + o="#{i}.bk" #o is for old + markup_version=SiSU_Markup::Markup_identify.new(@opt).markup_version? + if (@opt.mod.inspect=~/37/ and markup_version=~/0.38/) or + (@opt.mod.inspect=~/current|38/ and markup_version=~/0.37/) + puts "#{i} #{markup_version}" + file=File.open(i,'r') + cont=file.readlines + file.close + cont.each do |y| + match_and_replace.each do |m,r,w| + if y =~m and y =~w + if @new + @new=false + File.unlink(o) if File.exists?(o) + File.rename(i,o) + File.unlink(i) if File.exists?(i) + @file=File.new(i,'w') + @matched=true + break + end + end + end + end + if @matched + puts "conversion match in #{i}" unless @opt.cmd=~/q/ + @flag_start=true + cont.each do |y| + if y =~end_processing + @flag_end=true + end + if @flag_start and not @flag_end + match_and_replace.each do |m,r,w| + if y =~m and y =~w + puts m.inspect + ' -> ' + r unless @opt.cmd=~/q/ + puts "in: #{y}" if @opt.cmd=~/[vVM]/ + y.gsub!(m,r) if m and r + puts "out: #{y}" if @opt.cmd=~/[vVM]/ + end + end + end + if y=~/^\s*$/; @empty1=true + else @empty1=false + end + @file.puts y unless (@empty1==true and @empty2==true) + if y=~/^\s*$/; @empty2=true + else @empty2=false + end + end + @file.close + else puts "NO conversion match in #{i}" unless @opt.cmd=~/q/ + end + else puts "Requested conversion #{@opt.mod.inspect} markup #{markup_version} identified in #{i}" if @opt.cmd=~/[vVM]/ + end + end + end + else puts 'this routine makes permanent changes to the contents of the files matched, as instructed within [no matches]' + end + end + end +end +#%% files to match for this conversion set -------------------------> +require SiSU_lib + '/options' +argv=$* +@opt=SiSU_commandline::Options.new(argv) +case @opt.mod.inspect +when /=kdi/ + SiSU_Modify::Convert_markup.new(@opt).conversion +when /(?:36|37|38)?to-?(?:37|38)|--convert|--to|--from|default/ +@opt.files.each do |fns| + @opt.fns=fns + SiSU_Modify::Convert_markup.new(@opt).conversion +end +else + @opt.mod='--help' + SiSU_Modify::Convert_markup.new(@opt).help +end +__END__ diff --git a/lib/sisu/0.52/sst_do_inline_footnotes.rb b/lib/sisu/0.52/sst_do_inline_footnotes.rb new file mode 100644 index 00000000..90102d7c --- /dev/null +++ b/lib/sisu/0.52/sst_do_inline_footnotes.rb @@ -0,0 +1,461 @@ +=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 + + * Description: preprocessing, (dal), data abstraction used in subsequent 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_Convert_footnotes + require SiSU_lib + '/defaults' + require SiSU_lib + '/sysenv' + require SiSU_lib + '/param' + require SiSU_lib + '/dal_syntax' + require SiSU_lib + '/i18n' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + include Syntax + class Instantiate < SiSU_Param::Parameters::Instructions + @@flag={} #Beware!! + def initialize + @@flag['table_to']=false + @@counter=@@column=@@columns=@@flag_vocab=0 + @@endnote={} + @@endnote_array=@@word_mode=[] + @@endnote_call_counter=1 + @@line_mode='' + end + end + class Source <Instantiate + @@dal_array=[] + @@fns=nil + def initialize(opt) + @opt=opt + @@fns||@opt.fns + @my_make_fns=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns) + @fnm=@my_make_fns.marshal_meta + SiSU_Env::Create_system_link.new.images + end + def read #creates dal + begin + dal=[] + @@dal_array=[] + @@fns=@opt.fns + create_dal + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + Instantiate.new + end + end + def get #reads dal, unless does not exist then creates first + begin + dal=[] + unless @@fns==@opt.fns + @@fns=@opt.fns + @@dal_array=[] + end + dal=if @@dal_array.empty?; read_fnm + else @@dal_array.dup #check + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + Instantiate.new + end + end + protected + def create_dal + dal_array=[] + tell=SiSU_Screen::Ansi.new(@opt.cmd,'convert footnotes') + tell.green_title_hi unless @opt.cmd =~/q/ + file_array=IO.readlines(@opt.fns,'') + file_array.each do |l| + if l =~/\r\n/; l.gsub!(/\r\n/,"\n") + end + end + meta=file_array.dup + meta=meta.join.split("\n\n") #check whether can be eliminated, some of these are large objects to have twice + @md=SiSU_Param::Parameters::Instructions.new(meta,@opt).extract + if @md.en[:mismatch] == 0 or @md.mod.inspect =~/=footnotes-force/ + meta=nil + dal=SiSU_Convert_footnotes::Make.new(@md,file_array).song + SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@md.fns}.fn").output if @md.cmd =~/v/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"#{@md.fns}.fn -> #{@md.fns}.fn") unless @md.cmd =~/q/ + tell.txt_red unless @md.cmd =~/q/ + dal.each{|s| dal_array << "#{s.strip}\n\n" unless s.strip.empty?} + dal_array + else + tell=SiSU_Screen::Ansi.new(@md.cmd,'no footnote conversion done, problem with source file','to override use --convert=footnote-force (this is not advised)') + tell.warn if @cmd !~/q/ + '' + end + end + def read_fnm + dal=[] + dal=if FileTest.file?(@fnm); File.open(@fnm){ |f| dal=Marshal.load(f)} + else SiSU_Convert_footnotes::Source.new(@opt).create_dal #watch + end + end + end + class Output + def initialize(md,data) + @md,@data=md,data + #@data=data.compact + @my_make=SiSU_Env::Create_file.new(@md.cmd,@md.fns) + dir=SiSU_Env::Info_env.new(@md.fns) + @hard="#{Dir.pwd}/#{@md.fns}.fn" + end + def hard_output + filename_note=@my_make.file_note + @data.each {|s| filename_note.puts s.strip + "\n\n" unless s.strip.empty?} + end + end + class Make + @@endnote={} + @@endnote_array=@@word_mode=[] + @@endnote_call_counter=1 + @@comment='%' + @@flag={ ['table_to']=>false } + @@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] + @translate=SiSU_Translate::Source.new(@md,@language) + end + def reset + @@counter=@@column=@@columns=@@flag_vocab=0 + @@endnote={} + @@endnote_array=@@word_mode=[] + @@endnote_call_counter=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_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_Convert_footnotes::Make.new(@md,data).substitutions_and_insertions? + data=SiSU_Convert_footnotes::Make.new(@md,data).character_check + data=SiSU_Convert_footnotes::Make.new(@md,data).endnotes + SiSU_Convert_footnotes::Output.new(@md,data).hard_output + reset + data + end + protected + def vocabulary + data=@data + tuned_file,vocab_insert=[],[] + data.each do |para| + if para =~/^1~/ and @@flag_vocab == 0 + vocab_insert << '@vocabulary: lex' << "\n\n" << para + 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!(/-#\s*/,'<-#><~#>') + para.gsub!(/(~\{ )\s+/,'\1') + para.gsub!(/ \/\//,'<br />') #added 2004w29 + para.gsub!(/<br>/,'<br />') #needed by xml, xhtml etc. + 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/,'®') + para.gsub!(/\44/,'$') #$ watch + 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*/,'~{ \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 substitutions_and_insertions? + data=@data + tuned_file=[] + data.each do |para| + if @md.markup =~/0\.16|0\.37/ #parameters not extracted/available + para.gsub!(/^0~\S+\s+/,'@\1: ') + para.gsub!(/^1~/,':A~') + para.gsub!(/^2~/,':B~') + para.gsub!(/^3~/,':C~') + para.gsub!(/^4~/,'1~') + para.gsub!(/^5~/,'2~') + para.gsub!(/^6~/,'3~') + para.gsub!(/^7~/,'4~') + para.gsub!(/^8~/,'5~') + para.gsub!(/^9~/,'6~') + end + if para =~/<:insert\d+!?>/ and para !~/^%\s+/ + @skin.select + #require "#{@md.doc_skin}" #FIX now + 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.compact! + end + tuned_file + end + def name_endnote_seg + data=@data + @tuned_file=[] + data.each do |para| + para.gsub!(/<:3>\s*<:ee>/, + "#{@@endnote['special_align']} <p /><br />\r " + + "#{@@endnote['seg_name_3']} <p /> " + + "#{@@endnote['special_align_close']}") + para.gsub!(/<:2>\s*<:ee>/, + "#{@@endnote['special_align']} <p /><br />\r " + + "#{@@endnote['seg_name_2']} <p />" + + "#{@@endnote['special_align_close']}") + para.gsub!(/<:1>\s*<:ee>/, + "#{@@endnote['special_align']} <p /><br />\r " + + "#{@@endnote['seg_name_1']} <p /> " + + "#{@@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 << "\n1~endnotes Endnotes <~0;0:0;u0>" #prob numbering, revisit + end + @tuned_file << "\n<ENDNOTES>" + @tuned_file + end + def owner_details_seg + data << '1~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!(/^[2-6]~(?:~\S+)?\s*/,'!_ ') + end + para + 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 ; ":A~ #{@md.title}" + else ':A~ [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+|:[ABC]~)/m and para !~/\A\s*\Z/m and para !~/<:p[bn]>/ + @md.set_heading_seg=true + head=if @md.title ; "1~seg [#{@md.title}]" + else '1~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 #% endnote work zone + data=@data + @tuned_file=[] + endnote_no,endnote_ref=1,1 + + data.each do |para| + case para # manually numbered endnotes <!e(\d)!> <!e_(\d)!> --> + when /~\{\s+.+?\}~/ # auto-numbered endnotes <!e!> <!e_!> --> + para.gsub!(/\s*\}~/,' }~') # required 2003w31 + @word_mode=para.scan(/\S+/) + word_mode=SiSU_Convert_footnotes::Make.new(@md,@word_mode).endnote_call_number + para=word_mode.join(' ') + endnote_ref+=1 + when /~\^(?:\s|$)|<:e>/ #%Note inserts endnotes previously gathered from /^(<!e[:_]!>|[-~]\{{3})/ (in earlier loop) + word_mode=para.scan(/\S+/) + word_mode=SiSU_Convert_footnotes::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_call_counter} ") #hard places/writes footnote number + @@endnote_call_counter+=1 + end + when /~\^|<:e>/ + word.gsub!(/~\^|<:e>/,"#{@@endnote_array[@@endnote_call_counter-1]}") + @@endnote_call_counter+=1 + end + end + 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 + s=s.dup + s=s.gsub(/(?:<\/?[ib]>|<~\d+;(?:\w|[0-6]:)\d+;\w\d+>|<#@dp:#@dp>|^:[A-C]~\S+|^[1-6]~\S+|~\{\d+\s.+?\}~)/,'') # markup and endnotes removed + #% same as db clean --> + s=s.gsub(/<del>(.+?)<\/del>/,'DELETED(\1)') # deletions + s=s.gsub(/<sup>(\d+)<\/sup>/,'[\1]') + 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__ diff --git a/lib/sisu/0.52/sst_from_kdissert.rb b/lib/sisu/0.52/sst_from_kdissert.rb new file mode 100644 index 00000000..9dc80bb5 --- /dev/null +++ b/lib/sisu/0.52/sst_from_kdissert.rb @@ -0,0 +1,176 @@ +=begin + * Name: modify.rb + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: Conversion script from kdissert .kdi to sisu markup .ssm (master document) + * Copyright (C) 2004, 2006 Ralph Amissah + * Packaged with: SiSU information Structuring Universe - Structured information, Serialized Units + * SiSU 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 + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Kdissert + require SiSU_lib + '/sysenv' + class Convert + require 'rexml/document' + include REXML + def initialize(opt) + @opt=opt + @sisu,@sisu_base=[],[] + @ver=SiSU_Env::Info_version.new.get_version + end + def read + kdissert_to_sisu + end + def sisu_head + sisu_head=<<WOK +% SiSU #{@ver[:version]} auto-conversion from Kdissert file [check necessary] + +@title: #@title + +@prefix: Kdissert document map, converted to SiSU markup + +@links: {Kdissert}http://freehackers.org/~tnagy/kdissert/ + +@base_program: kdissert + +@skin: skin_kdissert + +% @date: + +@rcs:+ $Id$ + +@level: num_top=1 + +WOK + end + def kdissert_to_sisu + unless @opt.files.empty? + @opt.files.each do |kdi| + @sisu_base=[] + if kdi =~/\.kdi$/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Kdissert to SiSU',"#{kdi} --> #{kdi}.ssm") + tell.green_hi_blue unless @opt.cmd =~/q/ + system("cp #{kdi} /tmp/. && cd /tmp && tar xzvf /tmp/#{kdi} && cd -") + file=File.new("/tmp/maindoc.xml") + @output=File.new("#{kdi}.ssm",'w') + doc=Document.new(file) + root=doc.root + @el=[] + root.each do |x| + end + root.each_with_index do |content,idx| + if root.elements["item[#{idx}]/summary"] + id,ma,ch=nil,nil,[] + if root.elements["item[#{idx}]/id"] + id=root.elements["item[#{idx}]/id"].text.to_i + end + if root.elements["item[#{idx}]/parent"] + ma=root.elements["item[#{idx}]/parent"].text.to_s + end + if root.elements["item[#{idx}]/child"] #problem only get one child, even where several + root.get_elements("item[#{idx}]/child").each do |x| + ch << x.text + end + end + if root.elements["item[#{idx}]/summary"] + sum=root.elements["item[#{idx}]/summary"].text.to_s.strip + end + if root.elements["item[#{idx}]/text"] + txt=root.elements["item[#{idx}]/text"].text.to_s.strip + end + @el[id]={ :id=>id,:ma=>ma,:ch=>ch,:sum=>sum,:txt=>txt } + if ma == '-1' + @el[id][:lev]=':A' + @top=id + end + end + end + @doc=[] + @title=@el[@top][:sum] + puts @el[@top][:sum].inspect + @doc << @el[@top][:txt] #% careful: hack to make it possible to modify sisu headers + @doc << ':A~ ' + @el[@top][:sum] + @el[@top][:ch].each do |x| + @el[x.to_i][:lev]='1' + @doc << '1~ ' + @el[x.to_i][:sum] + @doc << @el[x.to_i][:txt] + @el[x.to_i][:ch].each do |y| + @el[y.to_i][:lev]='2' + @doc << '2~ ' + @el[y.to_i][:sum] + @doc << @el[y.to_i][:txt] + @el[y.to_i][:ch].each do |z| + @el[z.to_i][:lev]='3' + @doc << '3~ ' + @el[z.to_i][:sum] + @doc << @el[z.to_i][:txt] + @el[z.to_i][:ch].each do |za| #unsupported... consder + @el[za.to_i][:lev]='4' + @doc << '!_ ' + @el[za.to_i][:sum] + @doc << @el[za.to_i][:txt] + end + end + end + end + # regexs strip most kdissert markup, and provide minimal info for sisu markup --> + @doc.each do |c,idx| + c.gsub!(/<\/summary>/,'') + c.gsub!(/<html>.+?\n|<\/body>|<\/html>|<p>/m,'') + c.gsub!(/<\/p>/,"\n") + c.gsub!(/<span style="font-weight:600">(.+?)<\/span>/,' *{ \1 }* ') + c.gsub!(/<span style="text-decoration:underline">(.+?)<\/span>/,' _{ \1 }_ ') + c.gsub!(/<span style="font-style:italic">(.+?)<\/span>/,' /{ \1 }/ ') + c.gsub!(/<ul type="disc">/,'_* ') + c.gsub!(/<\S+?>/,'') + c.gsub!(/<br>/,'<br>') + c.gsub!(/<(:p[bn])>/,'<\1>') + c.gsub!(/<<([|]\S+[|]@[|].?[|])/,'<<\1') + c.gsub!(/</,'\<') + c.gsub!(/>/,'\>') + c.gsub!(/"/,'"') + c.gsub!(/ \s+/,' ') + @sisu_base << c.strip + "\n\n" + end + else puts ".kdi extension expected, filename not recognised: << #{kdi} >>" + end + @output << sisu_head << @sisu_base + end + else puts '.kdi file for conversion to sisu expected' + end + @opt.files.each do |f| + f.gsub!(/.kdi$/,'.kdi.ssm') + end + puts @opt.files.inspect + end + end +end +__END__ diff --git a/lib/sisu/0.52/sst_from_xml.rb b/lib/sisu/0.52/sst_from_xml.rb new file mode 100644 index 00000000..1b2651e3 --- /dev/null +++ b/lib/sisu/0.52/sst_from_xml.rb @@ -0,0 +1,148 @@ +=begin + * Name: modify.rb + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: Conversion script from kdissert .kdi to sisu markup .ssm (master document) + * Copyright (C) 2004, 2006 Ralph Amissah + * Packaged with: SiSU information Structuring Universe - Structured information, Serialized Units + * SiSU 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 + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_sst_from_xml + require SiSU_lib + '/sysenv' + class Convert + require 'rexml/document' + include REXML + def initialize(opt) + @opt=opt + @sisu,@sisu_base=[],[] + @ver=SiSU_Env::Info_version.new.get_version + end + def tell(filename,type) + SiSU_Screen::Ansi.new(@opt.cmd,"XML #{type} to SiSU sst","#{filename} --> #{filename}.sst").green_hi_blue + end + def read + xml_to_sisu + end + def markup_head(text) + text.strip! + text.gsub!(/(?:\s*\n|\s\s+)/,' ') + text.gsub!(/<header class=['"]\S+?['"]>(.+?)<\/header>/,'\1') + text.gsub!(/<(\w+)>(.+?)<\/\w+>/,'@\1: \2') + text.gsub!(/<header class=['"]\S+?['"]><(\w+)>(.+?)<\/\w+><\/header>/,'@\1: \2') + text.gsub!(/\s +/,' ') + text.strip! + text + "\n\n" + end + def markup(text) + text.strip! + text.gsub!(/(?:\s*\n|\s\s+)/,' ') + text.gsub!(/<text class='h1'>(.+?)<\/text>/,':A~ \1') + text.gsub!(/<text class='h2'>(.+?)<\/text>/,':B~ \1') + text.gsub!(/<text class='h3'>(.+?)<\/text>/,':C~ \1') + text.gsub!(/<text class='h4'>(.+?)<\/text>/,'1~ \1') + text.gsub!(/<text class='h5'>(.+?)<\/text>/,'2~ \1') + text.gsub!(/<text class='h6'>(.+?)<\/text>/,'3~ \1') + text.gsub!(/<text class='norm'>(.+?)<\/text>/,'\1') + text.gsub!(/<endnote symbol='norm'>(.+?)<\/endnote>/,'~{ \1 }~') + text.gsub!(/<br ?\/>/,'<br>') + text.gsub!(/<i>(.+?)<\/i>/,'/{\1}/') + text.gsub!(/<b>(.+?)<\/b>/,'*{\1}*') + text.gsub!(/<u>(.+?)<\/u>/,'_{\1}_') + text.gsub!(/\s +/,' ') + text.strip! + #text.gsub!(/<header>(.+?)<\/header/,"@#{x.name}: \\1\n\n") + text + "\n\n" + end + def sax + out_file=File.new(@output_file_name,'w') + head=@doc.root.get_elements('//head/header') + body=@doc.root.get_elements('//object/text') + out_file.puts "% SiSU text #{@ver[:version]} (generated from a SiSU XML markup representation)\n\n" + head.each do |x| + if x.name == 'header' + head=markup_head(x.to_s) + out_file.puts head + end + end + body.each do |x| + if x.name == 'text' + body=markup(x.to_s) + out_file.puts body + end + end + end + def node + sax + end + def dom + raise "#{__FILE}::#{__LINE__} xml dom representation to sst not yet implemented (experimental simple xml representations sax and node to sst are in place)." + end + def xml_to_sisu + unless @opt.files.empty? + @opt.files.each do |xml| + @sisu_base=[] + if xml =~/\.sx[sdn]\.xml$/ + begin + @doc_str=IO.readlines(xml,'').join("\n") + @output=File.new("#{xml}.sst",'w') + @doc=REXML::Document.new(@doc_str) + @output_file_name="#{Dir.pwd}/#{xml}.sst" + @el=[] + rescue REXML::ParseException + end + end + if xml =~/\.sxs\.xml$/ + unless @opt.cmd =~/q/; tell(xml,'sax') + end + sax + elsif xml =~/\.sxd\.xml$/ + unless @opt.cmd =~/q/; tell(xml,'dom') + end + dom + elsif xml =~/\.sxn\.xml$/ + unless @opt.cmd =~/q/; tell(xml,'node') + end + node + else puts "filename not recognised: << #{xml} >>" + end + @output << @sisu_base + end + else puts '.xml file for conversion to sisu expected' + end + puts @opt.files.inspect + end + end +end +__END__ diff --git a/lib/sisu/0.52/sst_identify_markup.rb b/lib/sisu/0.52/sst_identify_markup.rb new file mode 100644 index 00000000..8dbca059 --- /dev/null +++ b/lib/sisu/0.52/sst_identify_markup.rb @@ -0,0 +1,322 @@ +=begin + * Name: modify.rb + * Author: Ralph Amissah + * http://www.jus.uio.no/sisu + * http://www.jus.uio.no/sisu/SiSU/download.html + + * Description: A conversion script for canned substitutions, + a fairly generic simple tool that can be used to store other canned conversions, + used here for altering SiSU markup + + * Copyright (C) 2004, 2006 Ralph Amissah + + * Packaged with: SiSU information Structuring Universe - Structured information, Serialized Units + * SiSU 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 + + © Ralph Amissah 1997, current 2007. + All Rights Reserved. + + * Ralph Amissah: ralph@amissah.com + ralph.amissah@gmail.com +=end +module SiSU_Markup + class Markup_inform + attr_accessor :version + def initialize(version,message,declared_markup='',declared_type='') + @version,@message,@declared_markup,@declared_type=version,message,declared_markup,declared_type + end + def version + @version + end + def message + @message + end + def declared_version + @declared_markup + end + def declared_type + @declared_type + end + def history + Markup_history.new(@version).query + end + end + class Markup_identify + def initialize(opt) + @opt=opt + @description='This is a script attempts to identify the version of markup used in SiSU (and provides information on changes in markup)' + end + def help + print <<WOK + +#@description + +WOK + exit + end + def identify + f=@opt.fns + if f =~/(?:\.sst|\.ssm|\.ssi|\.s[123])$/ and File.exist?(f) + file=File.open(f,'r') + cont=file.readlines + file.close + links,oldlinks='','' + markup=nil + @declared_type,@declared_markup='[text?]','' + if cont[0] =~ /^(?:%\s+)?SiSU\s+(text|master|insert)\s+([0-9](?:\.[0-9]+){1,2})/ or cont[0] =~ /^(?:%\s+)?sisu-([0-9](?:\.[0-9]+){1,2})/ + @declared_type,@declared_markup=$1,$2 + #puts "SiSU #@declared_markup (declared markup version)" + #else puts 'markup version not declared' + elsif cont[0] =~ /^(?:%\s+)?SiSU\s+([0-9](?:\.[0-9]+){1,2})/ or cont[0] =~ /^(?:%\s+)?sisu-([0-9](?:\.[0-9]+){1,2})/ + @declared_markup=$1 + end + @flag_38=false + cont.each_with_index do |y,i| + if y =~/^(?:0\{?~links?|@links?:)\s/ and f =~/(?:\.sst|\.ssm|\.ssi|\.s[123])/ + links=unless y =~/\{.+?\}\S+/; oldlinks=' (pre 0.20.4 header links)' + else ' (post 0.20.4 header links)' + end + end + if @flag_38 or (y =~/^:?A~/ and f =~/(?:\.sst|\.ssm|\.ssi)/) + version='0.38' + markup=Markup_inform.new(version,'0.38' + oldlinks,@declared_markup,@declared_type) + @flag_38=true + break if i >= 200 + if y =~ /(?:~{\*+|~\[\*|~\[\+)\s/ + version='0.42' + markup=Markup_inform.new(version,'0.42' + oldlinks,@declared_markup,@declared_type) + break + end + end + if (y =~/^1~/ and f =~/(?:\.sst|\.ssm|\.ssi)/) and not @flag_38 + version='0.37' + markup=Markup_inform.new(version,'0.37 is substantially 0.16 - 0.36 markup with new file-extension' + oldlinks,@declared_markup,@declared_type) + break + end + if y =~/^1~/ and f =~/\.([rs])([123])/ and not @flag_38 + t,n=$1,$2 + version='0.16' + instruct=if t =~/r/ + " (change file extension from .#{t}#{n} to .ssm)" + else " (change file extension from .#{t}#{n} to .sst)" + end + markup=Markup_inform.new(version,'0.16 - 0.36' + instruct + links,@declared_markup,@declared_type) + break + end + if y =~/^0\{~/ and not @flag_38 + version='0.1' + markup=Markup_inform.new(version,'0.1 - 0.15',@declared_markup,@declared_type) + break + end + if y =~/^0\{{3}/ and not @flag_38 + markup=Markup_inform.new('circa. 1997','old, check date',@declared_markup,@declared_type) + break + end + markup='Not a recognised file type ' + end + markup + else Markup_history.new(@opt).help_query + end + end + def determine_markup_version + if @opt.fns.nil? or @opt.fns.empty?; Markup_history.new(@opt).help_identify + end + if File.exist?(@opt.fns) + if @opt.fns =~/\.(?:sst|ssm|ssi|s[123i]|r[123])/ + markup=identify #(@opt.fns) + if defined? markup.version + #if defined? markup and defined? markup.version + unless @opt.cmd =~/q/ + message=unless markup.declared_version.empty? + "#{@opt.fns}\n markup Type Declared as SiSU #{markup.declared_version} #{markup.declared_type}\n appears to be SiSU #{markup.version}" + else + "Markup Type Appears to be SiSU #{markup.version}\n in file #{@opt.fns}" + end + puts message + #puts markup.message + puts %{"sisu --query-#{markup.version}" for a brief description of markup type} + end + end + else puts 'file-type not recognised: ' + @opt.fns + end + else puts 'file not found: ' + @opt.fns + end + if defined? markup.version; markup.version + else 'markup type/version not determined' + end + end + def markup_version? + if @opt.fns.empty? + @opt.files.each do |fns| + @opt.fns=fns + determine_markup_version + end + else determine_markup_version + end + end + end + class Markup_history + def initialize(opt) + @opt=opt + end + def sisu_0_42 + <<WOK + SiSU 0.42 is the same as 0.38 with the introduction of some additional endnote types, + + Introduces some varations on endnotes, in particular the use of the asterisk + ~{* for example for describing an author }~ and ~{** for describing a second author }~ + + * for example for describing an author + + ** for describing a second author + + and ~[* my note ]~ or ~[+ another note ]~ which numerically increments an + asterisk and plus respectively + + *1 my note + +1 another note + +WOK + end + def sisu_0_38 + <<WOK + + SiSU 0.38 introduced alternative experimental header and heading/structure markers, + + @headername: and headers :A~ :B~ :C~ 1~ 2~ 3~ + + as the equivalent of + + 0~headername and headers 1~ 2~ 3~ 4~ 5~ 6~ + + The internal document markup of SiSU 0.16 remains valid and standard + Though note that SiSU 0.37 introduced a new file naming convention + + SiSU has in effect two sets of levels to be considered, using 0.38 notation + A-C headings/levels, pre-ordinary paragraphs /pre-substantive text, and + 1-3 headings/levels, levels which are followed by ordinary text. + This may be conceptualised as levels A,B,C, 1,2,3, and using such letter + number notation, in effect: + A must exist, optional B and C may follow in sequence (not strict) + 1 must exist, optional 2 and 3 may follow in sequence + i.e. there are two independent heading level sequences A,B,C and 1,2,3 + (using the 0.16 standard notation 1,2,3 and 4,5,6) + on the positive side: + * the 0.38 A,B,C,1,2,3 alternative makes explicit an aspect of structuring + documents in SiSU that is not otherwise obvious to the newcomer (though + it appears more complicated, is more in your face and likely to be + understood fairly quickly) + * the substantive text follows levels 1,2,3 and it is 'nice' to do + most work in those levels +WOK + end + def sisu_0_37 + <<WOK + + SiSU 0.37 introduced new file naming convention, + using the file extensions .sst .ssm and .ssi + to replace .s1 .s2 .s3 .r1 .r2 .r3 and .si + + this is captured by the following file 'rename' instruction: + + rename 's/\.s[123]$/\.sst/' *.s{1,2,3} + rename 's/\.r[123]$/\.ssm/' *.r{1,2,3} + rename 's/\.si$/\.ssi/' *.si + + The internal document markup remains unchanged, from SiSU 0.16 +WOK + end + def sisu_0_16 + <<WOK + + SiSU 0.16 (0.15 development branch) introduced the use of + + the header 0~ and headings/structure 1~ 2~ 3~ 4~ 5~ 6~ + + in place of the 0.1 header, heading/structure notation +WOK + end + def sisu_0_1 + <<WOK + + SiSU 0.1 headers and headings structure represented by + header 0{~ and headings/structure 1{ 2{ 3{ 4{~ 5{ 6{ +WOK + end + def help_query + <<WOK + + sisu --query=[sisu version [0.38] or 'history] + provides a short history of changes to SiSU markup + +WOK + end + def help_identify + <<WOK + + sisu --identify [filename] + attempts to identify the SiSU markup used in a file + +WOK + end + def query + tell=if @opt.mod.inspect =~/--query/ + tell=case @opt.mod.inspect + when /history/ + "#{sisu_0_38}\n#{sisu_0_37}\n#{sisu_0_16}\n#{sisu_0_1}" + when /0.42/ + "#{sisu_0_42}#{sisu_0_38}#{sisu_0_16}" + when /0.38/ + "#{sisu_0_38}#{sisu_0_16}" + when /0.37/ + "#{sisu_0_37}\n#{sisu_0_16}" + when /0.1[6-9]|0.2[0-9]|0.3[0-6]/ + "#{sisu_0_16}\n#{sisu_0_1}" + when /0.[1-9]|0.1[1-4]/ + sisu_0_1 + else puts "NOT RECOGNISED: #{@opt.mod.inspect}" + help_query + end + tell + else help_query + end + end + end +end +__END__ +#%% to use as independent program -------------------------> +f=$* +cf=f[0].to_s +f.shift +match_and_replace=[] +unless f.length > 0; f=Dir.glob("[a-z]*.ss?") #restricted to sisu type files, it need not be +end +puts "SiSU files:" +puts f +f.each do |x| + SiSU_Markup::Markup_identify.new(x).markup_version? +end diff --git a/lib/sisu/0.52/sst_to_s_xml_dom.rb b/lib/sisu/0.52/sst_to_s_xml_dom.rb new file mode 100644 index 00000000..9665250b --- /dev/null +++ b/lib/sisu/0.52/sst_to_s_xml_dom.rb @@ -0,0 +1,563 @@ +=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: simple xml representation (dom style) + + * 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_simple_xml_model_dom + 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_doc_str' + 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 Convert + @@fns=nil + def initialize(opt) + @opt=opt + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get #bug, relies on info persistence, assumes -m has previously been run + @env=SiSU_Env::Info_env.new(@opt.fns) + path=@env.path.output_tell + loc=@env.url.output_tell + tool=if @opt.cmd =~/[MV]/; "#{Dir.pwd}/#{@md.fn[:sxd]}\n\t#{@env.program.xml_viewer} #{path}/#{@md.fnb}/#{@md.fn[:sxd]}" + elsif @opt.cmd =~/v/; "#{@env.program.web_browser} #{Dir.pwd}/#{@md.fn[:sxd]}" + else '' + end + SiSU_Screen::Ansi.new(@opt.cmd,'invert','XML DOM',"#{@md.fns} -> #{@md.fn[:sxd]}").colorize unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{Dir.pwd}/#{@md.fn[:sxd]}") + tell.flow if @opt.cmd =~/[MV]/ + unless @@fns==@opt.fns + @@fns=@opt.fns + @@dal_array=[] + end + @dal_array=if @@dal_array.empty?; read_fnm + else @@dal_array.dup # check + end + SiSU_simple_xml_model_dom::Convert::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 + def read_fnm + dal=[] + if FileTest.file?("#{Dir.pwd}/#{@opt.fns}") + dal=IO.readlines("#{Dir.pwd}/#{@opt.fns}","\n\n") + else puts 'Error' + end + end + private + class Songsheet + def initialize(data,md,dir) + @data,@md,@env=data,md,dir + end + def songsheet + begin + SiSU_simple_xml_model_dom::Convert::Scroll.new(@data,@md).songsheet + SiSU_simple_xml_model_dom::Convert::Tidy.new(@md,@env).xml if @md.cmd =~/[vVM]/ # test wellformedness, comment out when not in use + SiSU_Rexml::Rexml.new(@md,@md.fn[:sxd]).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 + require SiSU_lib + '/shared_txt' + require SiSU_lib + '/css' + include SiSU_text_utils + @@xml={ :body=>[],:open=>[],:close=>[],:head=>[] } + def initialize(data='',md=nil) + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @regx=/^(?:(?:<:p[bn]>\s*)?(?::?[A-C]|\d~)(?:(\S+))?\s+)?(.+)/ + @tab="\t" + if @md + @env=SiSU_Env::Info_env.new(@md.fns) + @trans=SiSU_XML_munge::Trans.new(@md) + end + @sys=SiSU_Env::System_call.new + end + def songsheet + pre + markup + post + publish + end + protected + def embedded_endnotes(para='') + para.gsub!(/~\{(.+?)\}~/, + '<endnote><note>\1</note></endnote> ') + para.gsub!(/~\[([*+])\s+(.+?)\]~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + end + def xml_markup(para='') + para.gsub!(/~\[([*+])\s+(.+?)\]~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + para.gsub!(/~\{([*+]+)\s+(.+?)\}~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + para.gsub!(/~\{(.+?)\}~/, + '<endnote><note>\2</note></endnote> ') + end + def xml_head(meta) + txt=meta.text + txt.gsub!(/\/{(.+?)}\//,'<i>\1</i>') + txt.gsub!(/[*!]{(.+?)}[*!]/,'<b>\1</b>') + txt.gsub!(/_{(.+?)}_/,'<u>\1</u>') + txt.gsub!(/-{(.+?)}-/,'<del>\1</del>') + txt.gsub!(/<br(?: \/)?>/,'<br />') + txt.gsub!(/ & /,' and ') + @@xml[:head] <<<<WOK +#{@tab}<header class="#{meta.attrib}"> +#{@tab*2}<#{meta.el}> +#{@tab*3}#{txt} +#{@tab*2}</#{meta.el}> +#{@tab}</header> +WOK + end + def xml_sc(md='') + sc=if @md.sc_info + <<WOK + <source_control> + <sc class="sourcefile"> + #{@md.sc_filename} + </sc> + <sc class="number"> + #{@md.sc_number} + </sc> + <sc class="date"> + #{@md.sc_date} + </sc> + </source_control> +WOK + else '' + end + @@xml[:sc]=sc + end + def xml_element(lv='',para='',hname='',tag='',xml_element='',xml_content='') + lv=lv.to_i + n=lv - 1 + n1=lv + n2=lv + 1 + n3=lv + 2 + v=lv - 3 + tag='' + tag="\n#{@tab*n3}<nametag>#{hname}</nametag>\n" if hname + @@xml[:body] <<<<WOK +#{@tab*n}#{xml_element} +#{@tab*n1}<heading> +#{@tab*n2}<object> +#{@tab*n3}<text>#{para[@regx,2]}</text> +#{@tab*n2}</object> +#{@tab*n1}</heading>#{xml_content} +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='',para='',hname='' ) + puts lv if @md.cmd =~/[VM]/ + lv=lv.to_i + n=lv - 1 + n1=lv + n2=lv + 1 + n3=lv + 2 + v=lv - 3 + tag='' + tag="\n#{@tab*n3}<nametag>#{hname}</nametag>\n" if hname !=nil + case lv + when 1..3 + xml_element="<heading#{lv}>" + 3.downto(lv) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[1] or @cont[2] or @cont[3] + @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 { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[2] # 5{ + [2,1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[1] # 4{ + [1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + @copen[1]=@copen[2]=@copen[3]=false + end + @@xml[:body] << "#{@tab*y}</heading#{x}>\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 + xml_element="<contents#{cv}>" + xml_content="\n#{@tab*5}<content>" + case lv + when 4 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[1] + if @copen[3] == true # 6{ + [3,2,1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + elsif @copen[2] == true # 5{ + [2,1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + elsif @copen[1] == true # 4{ + [1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + end + @cont[1]=true + when 5 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[2] or @cont[1] + if @copen[3] == true #6{ + [3,2].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + elsif @copen[2] == true #5{ + [2].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + end + @cont[2]=true + when 6 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[3] or @cont[2] or @cont[1] + [3].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } if @copen[3] + @cont[3]=true + end + end + xml_element(lv,para,hname,tag,xml_element,xml_content) + @level[lv]=true + ((lv+1)..6).each { |x| @level[x]=false } + end + def group_structure(para='') + para.gsub!(/<:group(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*6}<object>} << "\n" + @@xml[:body] << %{#{@tab*7}<text class="group">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</text>\n} + @@xml[:body] << "#{@tab*6}</object>" << "\n" + end + def poem_structure(para='') + para.gsub!(/<:verse(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*6}<object>} << "\n" + @@xml[:body] << %{#{@tab*7}<text class="verse">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</text>\n} + @@xml[:body] << "#{@tab*6}</object>" << "\n" + end + def code_structure(para='') + para.gsub!(/<:code(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*6}<object>} << "\n" + @@xml[:body] << %{#{@tab*7}<text class="code">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</text>\n} + @@xml[:body] << "#{@tab*6}</object>" << "\n" + end + def table_structure(table='') + @@xml[:body] << %{#{@tab*0}<object>} << "\n" + @@xml[:body] << %{#{@tab*1}#{table}\n#{@tab*1}\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + @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!(/<br\/?>/,'<br />') + para.gsub!(/<:pb>\s*/,'') + para.gsub!(/\{(\S+?\.(?:png|jpg|gif)) .+?\}(?:(?:https?|ftp):\/\/\S+|image)/, + "<image.path>#{dir.url.images_local}/\\1</image.path>") + para.gsub!(/ /,' ') + para=SiSU_document_structure::Structure.new(@md,para).structure + @trans.char_enc.utf8(para) if @sys.locale =~/utf-?8/i #% utf8 + if para =~/\A(?:@|0~)(\S+?):?\s+(.+?)\Z/m + 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 =~/~metadata/ or para =~/^1~\s+Document Information/) + if para !~/(^0~|^@\S+?:|<ENDNOTES>|<EOF>)/ + @sto=SiSU_text_parts::Split_text_object.new(@md,para).lev_segname_para + unless @rcdc + if para !~/^(?:%\s|0~|@\S+?:)/ + 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,para,$2) + para=@sto.lev_para_ocn.heading_body1 + when /^(2)~(\S+)?/ + xml_markup(para) + xml_structure($1,para,$2) + para=@sto.lev_para_ocn.heading_body2 + when /^(3)~(\S+)?/ + xml_markup(para) + xml_structure($1,para,$2) + para=@sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)?/ + xml_markup(para) + xml_structure($1,para,$2) + para=@sto.lev_para_ocn.heading_body4 + when /^(5)~(\S+)?/ + xml_markup(para) + xml_structure($1,para,$2) + para=@sto.lev_para_ocn.heading_body5 + when /^(6)~(\S+)?/ + xml_markup(para) + xml_structure($1,para,$2) + para=@sto.lev_para_ocn.heading_body6 + #when /^(i1)$/i + # #format_scroll.gsubBody + # #para=@sto.lev_para_ocn.scrIndent1 + #when /^(i2)$/i + # format_scroll.gsubBody + # para=@sto.lev_para_ocn.scrIndent2 + #when /^(center)$/i + # para.gsub!(/(.+)/, + # %{<center>(\\1)</center>}) + # para=@sto.lev_para_ocn.scrPara + #when /^(b|bold)$/i + # para.gsub!(/(.+)/, + # %{<b>(\\1)</b>}) + # 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 + if para =~ /<:verse>/ + poem_structure(para) + elsif para =~ /<:group>/ + group_structure(para) + elsif para =~ /<:code>/ + para.gsub!(/</,'<') + para.gsub!(/>/,'>') + code_structure(para) + elsif para =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para) + para=table.table_split + @@xml[:body] << table_structure(para) + else #xml_structure + xml_markup(para) + @@xml[:body] << %{#{@tab*6}<object>} << "\n" if para[@regx] and para[@regx,2] + @@xml[:body] << "#{@tab*7}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # main text, contents, body KEEP + @@xml[:body] << "#{@tab*6}</object>" << "\n" if para[@regx] + end + end + elsif para =~/(Note|Endnotes?)/ + elsif para =~/(MetaData)/ and para =~/<~\d+;[m]\d+;\w\d+><#{@@dp}:#{@@dp}>$/ #debug 2003w46 add rc info + format_scroll=Format_scroll.new(@md,'<br /><a name="metadata">MetaData</a>') + 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,'<br /><a name="owner.details">Owner Details</a>') + @@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 =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\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 !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ # where condition for no paranum + 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 + if @content_flag==true + @@xml[:body] << "#{@tab*5}</content>\n#{@tab*y}</contents#{v}>\n" + @content_flag=false + else + @@xml[:body] << "\n#{@tab*y}</contents#{v}>\n" + end + end + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}</heading#{x}>\n" if @level[x] == true + end + #6.downto(1) { |x| y=x - 1; @@xml[:body] << "#{@tab*y}</level #{x}>\n" if @level[x] == true } + end + def pre + rdf=SiSU_XML_tags::RDF.new(@md) + dir=SiSU_Env::Info_env.new + @@xml[:head],@@xml[:body]=[],[] + css=SiSU_Env::CSS_select.new(@md).xml_sax + encoding=if @sys.locale =~/utf-?8/i; '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + else '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>' + end + @@xml[:open] =<<WOK +#{encoding} +<?xml-stylesheet type="text/css" href="../#{dir.path.style}/#{css}"?> +#{rdf.comment_xml_dom} +<document> +WOK + @@xml[:head] << "<head>\n" + @@xml[:body] << "<body>\n" + end + def post + @@xml[:head] << @@xml[:sc] + @@xml[:head] << "</head>\n" + @@xml[:body] << "</body>\n" + @@xml[:close] = "</document>\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={} + end + end + class Output + include SiSU_Param + include SiSU_Env + def initialize(data,md) + @data,@md=data,md + end + def xml + @sisu=[] + @data.each do |para| + para.gsub!(/\/\{(.+?)\}\//,'<italic>\1</italic>') + para.gsub!(/\*\{(.+?)\}\*/,'<bold>\1</bold>') + para.gsub!(/!\{(.+?)\}!/,'<bold>\1</bold>') + para.gsub!(/_\{(.+?)\}_/,'<underscore>\1</underscore>') + para.gsub!(/-\{(.+?)\}-/,'<strike>\1</strike>') + # do { links }http://url + 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_sxm=SiSU_Env::SiSU_file.new(@md,@md.fn[:sxd]).mkfile_pwd + if filename_sxm.class == File + @sisu.each {|para| filename_sxm.puts para} + filename_sxm.close + else puts 'file not created, is directory writable?' + end + 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 #note values can be other than true + 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("#{Dir.pwd}/#{@md.fn[:sxd]}",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/sst_to_s_xml_node.rb b/lib/sisu/0.52/sst_to_s_xml_node.rb new file mode 100644 index 00000000..3ff58c2b --- /dev/null +++ b/lib/sisu/0.52/sst_to_s_xml_node.rb @@ -0,0 +1,636 @@ +=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: simple xml representation (node style) + + * 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_simple_xml_model_node + 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_syntax' + require SiSU_lib + '/dal_doc_str' + 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 Convert + @@fns=nil + def initialize(opt) + @opt=opt + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get #bug, relies on info persistence, assumes -m has previously been run + @env=SiSU_Env::Info_env.new(@opt.fns) + path=@env.path.output_tell + loc=@env.url.output_tell + tool=if @opt.cmd =~/[MV]/; "#{Dir.pwd}/#{@md.fn[:sxn]}\n\t#{@env.program.xml_viewer} #{path}/#{@md.fnb}/#{@md.fn[:sxn]}" + elsif @opt.cmd =~/v/; "#{@env.program.web_browser} #{Dir.pwd}/#{@md.fn[:sxn]}" + else '' + end + SiSU_Screen::Ansi.new(@opt.cmd,'invert','XML Node',"#{@md.fns} -> #{@md.fn[:sxn]}").colorize unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{Dir.pwd}/#{@md.fn[:sxn]}") + tell.flow if @opt.cmd =~/[MV]/ + unless @@fns==@opt.fns + @@fns=@opt.fns + @@dal_array=[] + end + @dal_array=if @@dal_array.empty?; read_fnm + else @@dal_array.dup #.dup #jokes on you + end + SiSU_simple_xml_model_node::Convert::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 + def read_fnm + dal=[] + if FileTest.file?("#{Dir.pwd}/#{@opt.fns}") + dal=IO.readlines("#{Dir.pwd}/#{@opt.fns}","\n\n") + else puts 'Error' + end + end + private + class Songsheet + def initialize(data,md,dir) + @data,@md,@env=data,md,dir + end + def songsheet + begin + SiSU_simple_xml_model_node::Convert::Scroll.new(@data,@md).songsheet + SiSU_simple_xml_model_node::Convert::Tidy.new(@md,@env).xml if @md.cmd =~/[vVM]/ # test wellformedness, comment out when not in use + SiSU_Rexml::Rexml.new(@md,@md.fn[:sxn]).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 + require SiSU_lib + '/shared_txt' + require SiSU_lib + '/css' + include SiSU_text_utils + @@xml={ :body=>[],:open=>[],:close=>[],:head=>[] } + @@parent={ :ocn=>[],:node=>[] } + @@offspring={ :ocn=>[],:node=>[] } + @@current=nil + def initialize(data='',md=nil) + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @regx=/^(?:(?:<:p[bn]>\s*)?(?::?[A-C]~|\d~)(?:(\S+))?\s+)?(.+)/ + @tab="\t" + if @md + @env=SiSU_Env::Info_env.new(@md.fns) + @trans=SiSU_XML_munge::Trans.new(@md) + end + @sys=SiSU_Env::System_call.new + @ocn=[] + @node={ :ocn=>[],:no=>[] } + end + def songsheet + pre + markup + post + publish + end + protected + def embedded_endnotes(para='') + para.gsub!(/~\{(.+?)\}~/,'<endnote symbol="norm">\1</endnote> ') + para.gsub!(/~\[([*+])\s+(.+?)\]~/,'<endnote symbol="\1">\2</endnote> ') + end + def xml_head(meta) + txt=meta.text + txt.gsub!(/\/{(.+?)}\//,'<i>\1</i>') + txt.gsub!(/[*!]{(.+?)}[*!]/,'<b>\1</b>') + txt.gsub!(/_{(.+?)}_/,'<u>\1</u>') + txt.gsub!(/-{(.+?)}-/,'<del>\1</del>') + txt.gsub!(/<br(?: \/)?>/,'<br />') + txt.gsub!(/ & /,' and ') + @@xml[:head] <<<<WOK +#{@tab}<header class="#{meta.attrib}"> +#{@tab*2}<#{meta.el}> +#{@tab*3}#{txt} +#{@tab*2}</#{meta.el}> +#{@tab}</header> +WOK + end + def xml_sc(md='') + sc=if @md.sc_info + <<WOK + <source_control> + <sc class="sourcefile"> + #{@md.sc_filename} + </sc> + <sc class="number"> + #{@md.sc_number} + </sc> + <sc class="date"> + #{@md.sc_date} + </sc> + </source_control> +WOK + else '' + end + @@xml[:sc]=sc + end + def parent + def node + @@parent[:node] + end + def ocn + @@parent[:ocn] + end + def prt_node + parent.node.each_with_index { |a,n| puts "n.#{n} a.#{a}" unless n == 0 } #x == node + end + def prt_ocn + parent.ocn.each_with_index { |a,n| puts "n.#{n} a.#{a}" unless n == 0 } #x == node + end + self + end + def offspring + def node + @@offspring=if parent.node + @offspring=[] + parent.node.each_with_index do |n,o| + if n + @offspring[n] ||=[] + @offspring[n] << o + end + end + @offspring + else @@offspring + end + end + self + end + def build_relationships(o='',lv='') + if lv.to_s =~/[0-6]/ + @node[:ocn][lv]=o.ocn + @node[:no][lv]=o.node + end + if lv.to_s =~/^[1-6]/; @@current=lv + end + if o.node == 1 or lv == 1 + @@parent[:node][o.node]=0 + elsif @@current == lv and @@current !=nil + if @node[:no][lv-1] != nil + @@parent[:node][o.node]=@node[:no][lv-1] + elsif @node[:no][lv-2] != nil + @@parent[:node][o.node]=@node[:no][lv-2] + elsif @node[:no][lv-3] != nil: + @@parent[:node][o.node]=@node[:no][lv-3] + else puts 'error' + end + elsif lv == nil + if o.ocn.class == Fixnum and @@current + @@parent[:node][o.node]=@node[:no][@@current] + end + else puts 'error' + end + if @@current == lv and @@current !=nil + if @node[:ocn][lv-1] != nil + @@parent[:ocn][o.ocn]=@node[:ocn][lv-1] + elsif @node[:ocn][lv-2] != nil + @@parent[:ocn][o.ocn]=@node[:ocn][lv-2] + elsif @node[:ocn][lv-3] != nil: + @@parent[:ocn][o.ocn]=@node[:ocn][lv-3] + else puts 'error' + end + elsif lv == nil + if o.ocn.class == Fixnum and @@current + @@parent[:ocn][o.ocn]=@node[:ocn][@@current] + end + else puts 'error' + end + end + def node_structure(o='',para='',lv='',hname='') #extracted endnotes + if o.ocn + lv=lv.to_i + lv=nil if lv == 0 + build_relationships(o,lv) + end + end + def xml_structure(o='',para='',lv='',hname='') #extracted endnotes + if o.ocn + puts para if lv and @md.cmd =~/M/ + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + embedded_endnotes(para) + if para[@regx] + paragraph="#{para[@regx,2]}" + util=SiSU_text_utils::Wrap.new(paragraph,70) + wrapped=util.line_wrap + end + if @md.cmd =~/[VM]/ + if offspring.node[o.node] + puts "#{o.node}::#{parent.node[o.node]}::[#{offspring.node[o.node].join(',')}]" + else + puts "#{o.node}::#{parent.node[o.node]}" + end + end + @@xml[:body] << "#{@tab*0}<object>" if para[@regx] + #@@xml[:body] << "#{@tab*1}<heading>#{lv}</heading>" << "\n" if lv + @@xml[:body] << "#{@tab*1}" << "\n" if para[@regx] + if @md.mod.inspect =~/odf/ #condition not currently present, but consider + @@xml[:body] << %{#{@tab*1}<ocn>#{o.ocn}</ocn>\n} + end + @@xml[:body] << if lv; %{#{@tab*1}<text class="h#{lv}">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} << "\n" + elsif wrapped =~/\A%%?\s+/; %{<!--\n#{@tab*1}<text class="comment">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n-->\n} # comments [not included, review] + else %{#{@tab*1}<text class="norm">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} # main text, contents, body KEEP + end + #@@xml[:body] << "#{@tab*1}<text>\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n" # main text, contents, body KEEP + @@xml[:body] << "#{@endnotes}" if @endnotes # main text, endnotes KEEP + ##@@xml[:body] << "#{@tab*1}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # old unwrapped main text, contents, body KEEP + @@xml[:body] << %{#{@tab*1}<node>\n} + @@xml[:body] << %{#{@tab*2}<id>#{o.node}</id>\n} + @@xml[:body] << %{#{@tab*2}<parent>#{parent.node[o.node]}</parent>\n} + if offspring.node[o.node] + @@xml[:body] << %{#{@tab*2}<offspring>#{offspring.node[o.node].join(',')}</offspring>\n} + end + @@xml[:body] << %{#{@tab*1}</node>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" if para[@regx] + @endnotes=[] + end + end + def group_structure(o='',para='') + para.gsub!(/<:group(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*0}<object>} + if @md.mod.inspect =~/odf/ + @@xml[:body] << %{#{@tab*1}<ocn>#{o.ocn}</ocn>\n} + end + @@xml[:body] << %{#{@tab*1}<text class="group">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << %{#{@tab*1}<node>\n} + @@xml[:body] << %{#{@tab*2}<id>#{o.node}</id>\n} + @@xml[:body] << %{#{@tab*2}<parent>#{parent.node[o.node]}</parent>\n} + if offspring.node[o.node] + @@xml[:body] << %{#{@tab*2}<offspring>#{offspring.node[o.node].join(',')}</offspring>\n} + end + @@xml[:body] << %{#{@tab*1}</node>\n} + @@xml[:body] << "#{@tab*0}</object>" + end + def poem_structure(o='',para='') + para.gsub!(/<:verse(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*0}<object>} + if @md.mod.inspect =~/odf/ + @@xml[:body] << %{#{@tab*1}<ocn>#{o.ocn}</ocn>\n} + end + @@xml[:body] << %{#{@tab*1}<text class="verse">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << %{#{@tab*1}<node>\n} + @@xml[:body] << %{#{@tab*2}<id>#{o.node}</id>\n} + @@xml[:body] << %{#{@tab*2}<parent>#{parent.node[o.node]}</parent>\n} + if offspring.node[o.node] + @@xml[:body] << %{#{@tab*2}<offspring>#{offspring.node[o.node].join(',')}</offspring>\n} + end + @@xml[:body] << %{#{@tab*1}</node>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def code_structure(o='',para='') + para.gsub!(/<:code(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*0}<object>} + if @md.mod.inspect =~/odf/ + @@xml[:body] << %{#{@tab*1}<ocn>#{o.ocn}</ocn>\n} + end + @@xml[:body] << %{#{@tab*1}<text class="code">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << %{#{@tab*1}<node>\n} + @@xml[:body] << %{#{@tab*2}<id>#{o.node}</id>\n} + @@xml[:body] << %{#{@tab*2}<parent>#{parent.node[o.node]}</parent>\n} + if offspring.node[o.node] + @@xml[:body] << %{#{@tab*2}<offspring>#{offspring.node[o.node].join(',')}</offspring>\n} + end + @@xml[:body] << %{#{@tab*1}</node>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def table_structure(o='',table='') #tables + @@xml[:body] << %{#{@tab*0}<object>} + if @md.mod.inspect =~/odf/ + @@xml[:body] << %{#{@tab*1}<ocn>#{o.ocn}</ocn>\n} + end + @@xml[:body] << %{#{@tab*1}#{table}\n#{@tab*1}\n} # unless lv # main text, contents, body KEEP + @@xml[:body] << %{#{@tab*1}<node>\n} + @@xml[:body] << %{#{@tab*2}<id>#{o.node}</id>\n} + @@xml[:body] << %{#{@tab*2}<parent>#{parent.node[o.node]}</parent>\n} + if offspring.node[o.node] + @@xml[:body] << %{#{@tab*2}<offspring>#{offspring.node[o.node].join(',')}</offspring>\n} + end + @@xml[:body] << %{#{@tab*1}</node>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" #if para[@regx] + @endnotes=[] + end + def markup + data=[] + @data=@data.join.split("\n\n") + @data=SiSU_document_structure::Code.new(@md,@data).code + @data.each do |para| + data << SiSU_document_structure::Structure.new(@md,para).structure + end + data=Syntax::Markup.new(@md,data).songsheet + data=SiSU_document_structure::Tables.new(@md,data).tables + obj=SiSU_document_structure::OCN.new(@md,data).ocn + obj.compact! + data=nil + dir=SiSU_Env::Info_env.new(@md.fns) + xml_sc(@md) + @endnotes,@level,@cont,@copen,@xml_contents_close=[],[],[],[],[] + @rcdc=false + (0..6).each { |x| @cont[x]=@level[x]=false } + (4..6).each { |x| @xml_contents_close[x]='' } + obj.each do |o| + para=o.txt unless o.txt =~/^%% / #comments are lost, consider + if para + para=@trans.markup_light(para) + @trans.char_enc.utf8(para) if @sys.locale =~/utf-?8/i #% utf8 + if para =~/\A(?:@|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 + end + end + obj.each do |o| + para=o.txt unless o.txt =~/^%% / #comments are lost, consider + if para + @rcdc=true if @rcdc==false and (para =~/~metadata/ or para =~/^1~\s+Document Information/) + if para !~/(^0~|^@\S+?:|^\s*$|<ENDNOTES>|<EOF>)/ + @sto=SiSU_text_parts::Split_text_object.new(@md,para).lev_segname_para + unless @rcdc + format_scroll=SiSU_XML_format::Format_scroll.new(@md,@sto.text) if @sto.format =~/i[12]|null/ + case @sto.format + when /^(1)~(\S+)?/ + node_structure(o,para,$1,$2) + when /^(2)~(\S+)?/ + node_structure(o,para,$1,$2) + when /^(3)~(\S+)?/ + node_structure(o,para,$1,$2) + when /^(4)~(\S+)?/ # work on see Split_text_object + node_structure(o,para,$1,$2) + when /^(5)~(\S+)?/ + node_structure(o,para,$1,$2) + when /^(6)~(\S+)?/ + node_structure(o,para,$1,$2) + else + if para =~ /<:verse>/ + node_structure(o,para) + elsif para =~ /<:group>/ + node_structure(o,para) + elsif para =~ /<:code>/ + node_structure(o,para) + elsif para =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para) + para=table.table_split + node_structure(o,para) + else node_structure(o,para,nil,nil) + end + end + end + end + end + end + obj.each do |o| + para=o.txt unless o.txt =~/^%% / #comments are lost, consider + if para + @rcdc=true if @rcdc==false and (para =~/~metadata/ or para =~/^1~\s+Document Information/) + if para !~/(^0~|^@\S+?:|^\s*$|<ENDNOTES>|<EOF>)/ + @sto=SiSU_text_parts::Split_text_object.new(@md,para).lev_segname_para + unless @rcdc + format_scroll=SiSU_XML_format::Format_scroll.new(@md,@sto.text) if @sto.format =~/i[12]|null/ + case @sto.format + when /^(1)~(\S+)?/ + xml_structure(o,para,$1,$2) + para=@sto.lev_para_ocn.heading_body1 + when /^(2)~(\S+)?/ + xml_structure(o,para,$1,$2) + para=@sto.lev_para_ocn.heading_body2 + when /^(3)~(\S+)?/ + xml_structure(o,para,$1,$2) + para=@sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)?/ # work on see Split_text_object + xml_structure(o,para,$1,$2) + para=@sto.lev_para_ocn.heading_body4 + when /^(5)~(\S+)?/ + xml_structure(o,para,$1,$2) + para=@sto.lev_para_ocn.heading_body5 + when /^(6)~(\S+)?/ + xml_structure(o,para,$1,$2) + para=@sto.lev_para_ocn.heading_body6 + else + if para =~ /<:verse>/ + poem_structure(o,para) + elsif para =~ /<:group>/ + group_structure(o,para) + elsif para =~ /<:code>/ + para.gsub!(/</,'<') + para.gsub!(/>/,'>') + code_structure(o,para) + elsif para =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para) + para=table.table_split + table_structure(o,para) + else xml_structure(o,para,nil,nil) + end + end + para='' if para =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\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 !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + # i don't get the condition for no paranum + end + if para =~/<:center>/ + one,two=/(.*)<:center>(.*)/.match(para)[1,2] + format_text=Format_text_object.new(one,two) + para=format_text.center + end + end + para.gsub!(/<:\S+?>/,'') + para.gsub!(/<!.+!>/,'') ## Clean Prepared Text #bugwatch reinstate + end + end + end + 6.downto(4) do |x| + y=x - 1; v=x - 3 + @@xml[:body] << "#{@tab*5}</content>\n#{@tab*y}</contents#{v}>\n" if @level[x] == true + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}</heading#{x}>\n" if @level[x] == true + end + #6.downto(1) { |x| y=x - 1; @@xml[:body] << "#{@tab*y}</level #{x}>\n" if @level[x] == true } + end + def pre + rdf=SiSU_XML_tags::RDF.new(@md) + dir=SiSU_Env::Info_env.new + @@xml[:head],@@xml[:body]=[],[] + css=SiSU_Env::CSS_select.new(@md).xml_sax + encoding=if @sys.locale =~/utf-?8/i; '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + else '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>' + end + @@xml[:open] =<<WOK +#{encoding} +<?xml-stylesheet type="text/css" href="../#{dir.path.style}/#{css}"?> +#{rdf.comment_xml_node} +<document> +WOK + @@xml[:head] << "<head>\n" + @@xml[:body] << "<body>\n" + end + def post + @@xml[:head] << @@xml[:sc] + @@xml[:head] << "</head>\n" + @@xml[:body] << "</body>\n" + @@xml[:close] = "</document>\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={} + end + end + class Output + include SiSU_Param + include SiSU_Env + 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_sxm=SiSU_Env::SiSU_file.new(@md,@md.fn[:sxn]).mkfile_pwd + if filename_sxm.class == File + @sisu.each {|para| filename_sxm.puts para} + filename_sxm.close + else puts 'file not created, is directory writable?' + end + 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 #note values can be other than true + 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("#{Dir.pwd}/#{@md.fn[:sxn]}",tidyfile) + tidy.well_formed? + tell.p_off unless @md.cmd =~/q/ + end + end + end + end + end +end +__END__ +Notes: + +ocn +ocn are given to substantive text objects + +nodes +nodes != ocn +nodes are given to every text object (regardless of whether or not it is "substantive" and/or introduced by the editor just for structuring purposes) + +nodes are required for a node/tree based representation of content, e.g. a document mapping tool such as kdissert +nodes are given to all structural divisions/headings whether or not they are given an ocn + +why arn't all structural divisions given an ocn? +sometimes to structure documents correctly, it is necessary to introduce a dummy level, e.g. using a marker like +4~ [Preamble]-# +these are heading items that are not in the original text, and do not warrant an ocn +they do however require a node value + +[at other times the editor introduces a comment that is not to be recognised as a part of the original text] + +it is unofortunate that the nature of documents is such that ocn != nodes +[that ocn should be the equivalent of nodes has been rejected] + +map +parent <parent>x</parent> +parent of 1 is either 0 or as in kdissert -1 (i prefer 0) +offspring <offspring>x..y</offspring> +siblings - gratuitous, <siblings>x..y</siblings> and therefore optional but might as well diff --git a/lib/sisu/0.52/sst_to_s_xml_sax.rb b/lib/sisu/0.52/sst_to_s_xml_sax.rb new file mode 100644 index 00000000..f94fbc9f --- /dev/null +++ b/lib/sisu/0.52/sst_to_s_xml_sax.rb @@ -0,0 +1,434 @@ +=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: simple xml representation (sax style) + + * 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_simple_xml_model_sax + 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_doc_str' + 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 Convert + @@fns=nil + def initialize(opt) + @opt=opt + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get #bug, relies on info persistence, assumes -m has previously been run + @env=SiSU_Env::Info_env.new(@opt.fns) + path=@env.path.output_tell + loc=@env.url.output_tell + tool=if @opt.cmd =~/[MV]/; "#{Dir.pwd}/#{@md.fn[:sxs]}\n\t#{@env.program.xml_viewer} #{path}/#{@md.fnb}/#{@md.fn[:sxs]}" + elsif @opt.cmd =~/v/; "#{@env.program.web_browser} #{Dir.pwd}/#{@md.fn[:sxs]}" + else '' + end + SiSU_Screen::Ansi.new(@opt.cmd,'invert','XML SAX',"#{@md.fns} -> #{@md.fn[:sxs]}").colorize unless @opt.cmd =~/q/ + SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{Dir.pwd}/#{@md.fn[:sxs]}").flow if @opt.cmd =~/[MV]/ + unless @@fns==@opt.fns + @@fns=@opt.fns + @@dal_array=[] + end + @dal_array=if @@dal_array.empty?; read_fnm + else @@dal_array.dup #check + end + SiSU_simple_xml_model_sax::Convert::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 + def read_fnm + dal=[] + if FileTest.file?("#{Dir.pwd}/#{@opt.fns}") + dal=IO.readlines("#{Dir.pwd}/#{@opt.fns}","\n\n") + else puts 'Error' + end + end + private + class Songsheet + def initialize(data,md,dir) + @data,@md,@env=data,md,dir + end + def songsheet + begin + SiSU_simple_xml_model_sax::Convert::Scroll.new(@data,@md).songsheet + SiSU_simple_xml_model_sax::Convert::Tidy.new(@md,@env).xml if @md.cmd =~/[vVM]/ # test wellformedness, comment out when not in use + SiSU_Rexml::Rexml.new(@md,@md.fn[:sxs]).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 + require SiSU_lib + '/shared_txt' + require SiSU_lib + '/css' + include SiSU_text_utils + @@xml={ :body=>[],:open=>[],:close=>[],:head=>[] } + def initialize(data='',md=nil) + @data,@md=data,md + @vz=SiSU_Env::Get_init.instance.skin + @regx=/^(?:(?:<:p[bn]>\s*)?(?::?[A-C]~|\d~)(?:(\S+))?\s+)?(.+)/ + @tab="\t" + if @md + @env=SiSU_Env::Info_env.new(@md.fns) + @trans=SiSU_XML_munge::Trans.new(@md) + end + @sys=SiSU_Env::System_call.new + end + def songsheet + pre + markup + post + publish + end + protected + def embedded_endnotes(para='') + para.gsub!(/~\{(.+?)\}~/,'<endnote symbol="norm">\1</endnote> ') + para.gsub!(/~\[([*+])\s+(.+?)\]~/,'<endnote symbol="\1">\2</endnote> ') + end + def xml_head(meta) + txt=meta.text + txt.gsub!(/\/{(.+?)}\//,'<i>\1</i>') + txt.gsub!(/[*!]{(.+?)}[*!]/,'<b>\1</b>') + txt.gsub!(/_{(.+?)}_/,'<u>\1</u>') + txt.gsub!(/-{(.+?)}-/,'<del>\1</del>') + txt.gsub!(/<br(?: \/)?>/,'<br />') + txt.gsub!(/ & /,' and ') + @@xml[:head] <<<<WOK +#{@tab}<header class="#{meta.attrib}"> +#{@tab*2}<#{meta.el}> +#{@tab*3}#{txt} +#{@tab*2}</#{meta.el}> +#{@tab}</header> +WOK + end + def xml_sc(md='') + sc=if @md.sc_info + <<WOK + <source_control> + <sc class="sourcefile"> + #{@md.sc_filename} + </sc> + <sc class="number"> + #{@md.sc_number} + </sc> + <sc class="date"> + #{@md.sc_date} + </sc> + </source_control> +WOK + else '' + end + @@xml[:sc]=sc + end + def xml_structure(para='',lv='',hname='') #extracted endnotes + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + embedded_endnotes(para) + if para[@regx] + paragraph="#{para[@regx,2]}" + util=SiSU_text_utils::Wrap.new(paragraph,70) + wrapped=util.line_wrap + end + @@xml[:body] << "#{@tab*0}<object>" if para[@regx] + #@@xml[:body] << "#{@tab*1}<heading>#{lv}</heading>" << "\n" if lv + @@xml[:body] << "#{@tab*1}" << "\n" if para[@regx] + @@xml[:body] << if lv; %{#{@tab*1}<text class="h#{lv}">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} << "\n" + elsif wrapped =~/\A%%?\s+/; %{<!--\n#{@tab*1}<text class="comment">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n-->\n} # comments + else %{#{@tab*1}<text class="norm">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} # main text, contents, body KEEP + end + #@@xml[:body] << "#{@tab*1}<text>\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n" # main text, contents, body KEEP + @@xml[:body] << "#{@endnotes}" if @endnotes # main text, endnotes KEEP + ##@@xml[:body] << "#{@tab*1}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # old unwrapped main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" if para[@regx] + @endnotes=[] + end + def group_structure(para='') + para.gsub!(/<:group(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*0}<object>} + @@xml[:body] << %{#{@tab*1}<text class="group">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" + end + def poem_structure(para='') + para.gsub!(/<:verse(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*0}<object>} + @@xml[:body] << %{#{@tab*1}<text class="verse">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def code_structure(para='') + para.gsub!(/<:code(?:-end)?>/,'') + para.strip! + @@xml[:body] << %{#{@tab*0}<object>} + @@xml[:body] << %{#{@tab*1}<text class="code">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def table_structure(table='') #tables + @@xml[:body] << %{#{@tab*0}<object>} + @@xml[:body] << %{#{@tab*1}#{table}\n#{@tab*1}\n} # unless lv # main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" #if para[@regx] + @endnotes=[] + end + def tidywords(wordlist) + wordlist.each do |x| + x.gsub!(/&/,'&') unless x =~/&\S+;/ + end + end + def markup + data=[] + #@data=@data.join.split("\n\n") + dir=SiSU_Env::Info_env.new(@md.fns) + xml_sc(@md) + @endnotes,@level,@cont,@copen,@xml_contents_close=[],[],[],[],[] + @rcdc=false + (0..6).each { |x| @cont[x]=@level[x]=false } + (4..6).each { |x| @xml_contents_close[x]='' } + @data.each do |para| + data << SiSU_document_structure::Structure.new(@md,para).structure + end + data.each do |para| + para=@trans.markup_light(para) + @trans.char_enc.utf8(para) if @sys.locale =~/utf-?8/i #% utf8 + if para =~/\A(?:@|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 =~/~metadata/ or para =~/^1~\s+Document Information/) + if para !~/(^0~|^@\S+?:|^\s*$|<ENDNOTES>|<EOF>)/ + @sto=SiSU_text_parts::Split_text_object.new(@md,para).lev_segname_para + unless @rcdc + format_scroll=SiSU_XML_format::Format_scroll.new(@md,@sto.text) if @sto.format =~/i[12]|null/ + case @sto.format + when /^(1)~(\S+)?/ + xml_structure(para,$1,$2) + para=@sto.lev_para_ocn.heading_body1 + when /^(2)~(\S+)?/ + xml_structure(para,$1,$2) + para=@sto.lev_para_ocn.heading_body2 + when /^(3)~(\S+)?/ + xml_structure(para,$1,$2) + para=@sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)?/ # work on see Split_text_object + xml_structure(para,$1,$2) + para=@sto.lev_para_ocn.heading_body4 + when /^(5)~(\S+)?/ + xml_structure(para,$1,$2) + para=@sto.lev_para_ocn.heading_body5 + when /^(6)~(\S+)?/ + xml_structure(para,$1,$2) + para=@sto.lev_para_ocn.heading_body6 + #when /^(i1)$/i + # #format_scroll.gsubBody + # #para=@sto[:lev_para_ocn].scrIndent1 + #when /^(i2)$/i + # format_scroll.gsubBody + # para=@sto[:lev_para_ocn].scrIndent2 + #when /^(center)$/i + # para.gsub!(/(.+)/, + # %{<center>(\\1)</center>}) + # para=@sto[:lev_para_ocn].scrPara + #when /^(b|bold)$/i + # para.gsub!(/(.+)/, + # %{<b>(\\1)</b>}) + # para=@sto[:lev_para_ocn].scrPara + #when /null/ # see whether u can improve + # if (para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/) + # #format_scroll.gsubBody + # #para=@sto[:lev_para_ocn].scrPara + # end + else + if para =~ /<:verse>/ + poem_structure(para) + elsif para =~ /<:group>/ + group_structure(para) + elsif para =~ /<:code>/ + para.gsub!(/</,'<') + para.gsub!(/>/,'>') + code_structure(para) + elsif para =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para) + para=table.table_split + table_structure(para) + else xml_structure(para,nil,nil) + end + end + para='' if para =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\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 !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + # i don't get the condition for no paranum + end + if para =~/<:center>/ + one,two=/(.*)<:center>(.*)/.match(para)[1,2] + format_text=Format_text_object.new(one,two) + para=format_text.center + end + end + para.gsub!(/<:\S+?>/,'') + para.gsub!(/<!.+!>/,'') ## Clean Prepared Text #bugwatch reinstate + end + end + 6.downto(4) do |x| + y=x - 1; v=x - 3 + @@xml[:body] << "#{@tab*5}</content>\n#{@tab*y}</contents#{v}>\n" if @level[x] == true + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}</heading#{x}>\n" if @level[x] == true + end + #6.downto(1) { |x| y=x - 1; @@xml[:body] << "#{@tab*y}</level #{x}>\n" if @level[x] == true } + end + def pre + rdf=SiSU_XML_tags::RDF.new(@md) + dir=SiSU_Env::Info_env.new + @@xml[:head],@@xml[:body]=[],[] + css=SiSU_Env::CSS_select.new(@md).xml_sax + encoding=if @sys.locale =~/utf-?8/i; '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + else '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>' + end + @@xml[:open] =<<WOK +#{encoding} +<?xml-stylesheet type="text/css" href="../#{dir.path.style}/#{css}"?> +#{rdf.comment_xml_sax} +<document> +WOK + @@xml[:head] << "<head>\n" + @@xml[:body] << "<body>\n" + end + def post + @@xml[:head] << @@xml[:sc] + @@xml[:head] << "</head>\n" + @@xml[:body] << "</body>\n" + @@xml[:close] = "</document>\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={} + end + end + class Output + include SiSU_Param + include SiSU_Env + 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_sxm=SiSU_Env::SiSU_file.new(@md,@md.fn[:sxs]).mkfile_pwd + if filename_sxm.class == File + @sisu.each {|para| filename_sxm.puts para} + filename_sxm.close + else puts 'file not created, is directory writable?' + end + 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 #note values can be other than true + 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("#{Dir.pwd}/#{@md.fn[:sxs]}",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/sysenv.rb b/lib/sisu/0.52/sysenv.rb new file mode 100644 index 00000000..9bd2e977 --- /dev/null +++ b/lib/sisu/0.52/sysenv.rb @@ -0,0 +1,2517 @@ +=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, resource control and configuration details + + * 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 +@@cX=nil +@@current_document=Dir.pwd #nil #'' +module SiSU_Env + require 'fileutils' + require 'singleton' + include FileUtils::Verbose + @@noyaml=false + class Info_date + require 'date' + attr_accessor :dt,:t + def initialize + @dt,@t=Date.today.to_s,Time.now + end + def week + w=@t.strftime("%W") + "#{@t.year}w#{w}" + end + def month + "#{@t.year}#{@t.month}" + end + def year + @t.year + end + def weekonly + #@t.cweek + @t.strftime("%W") + end + def monthonly + @t.month + end + end + class Info_system + require 'rbconfig' + include Singleton + @@user,@@home,@@hostname,@@pwd,@@sisu_etc,@@host,@@arch,@@rbver,@@dir_arch,@@dir_sitearch,@@dir_bin,@@locale,@@rc,@@ad=ENV['USER'],ENV['HOME'],ENV['HOSTNAME'],ENV['PWD'],Config::CONFIG['sysconfdir'] + '/sisu',Config::CONFIG['host'],Config::CONFIG['arch'],%x{ruby -v}.strip,Config::CONFIG['archdir'],Config::CONFIG['sitearchdir'],Config::CONFIG['bindir'],%x{locale charmap}.strip,nil,{} # %x{ruby -v}.strip # Config::CONFIG['rb_ver'] + out=Config::CONFIG['localstatedir'] + etc=Config::CONFIG['sysconfdir'] + '/sisu' + share=Config::CONFIG['datadir'] + '/sisu' + data=Config::CONFIG['datadir'] + '/sisu-examples/sample' + m=/.+\/(\S+)/m + @stub_pwd ||=@@pwd[m,1] + prcss_dir='_sisu_processing' + prcss_dir_stub="#{prcss_dir}/#{@stub_pwd}" + @processing_dir=if @@home and File.writable?("#{@@home}/."); "#{@@home}/#{prcss_dir_stub}" + #elsif File.writable?("#{@@pwd}/."); "#{@@pwd}/#{prcss_dir}" + else prcss_dir_stub + end + tmp_processing=if @@user; "/tmp/#{prcss_dir}/#{@@user}/#{@stub_pwd}" + else "/tmp/#{prcss_dir_stub}" + end + user=ENV['USER'] + port_pgsql=if defined? ENV['PGPORT'] and not (ENV['PGPORT'].nil? or ENV['PGPORT'].empty?) and ENV['PGPORT']=~/^\d+$/; ENV['PGPORT'] + else '5432' + end + IMAGES=:images + SISU_ETC=:sisu_etc + SISU_SHARE=:sisu_share + SAMPLE_DATA_PATH=:sample_data_path + IMAGE_STUB=:image_stub + STYLESHEET_STUB=:stylesheet_stub + IMAGE_LOCAL=:image_local + WEBSERV_PATH=:webserv_path + WEBSERV_MAN=:webserv_man + WEBSERV_PHP=:webserv_php + WEBSERV_CGI=:webserv_cgi + WEBSERV_RSS=:webserv_rss + WEBSERV_SQLITE=:webserv_sqlite + OUTPUT_LOCAL=:output_local + PROCESSING_PATH=:processing_path + PROCESSING_PATH_TMP=:processing_path_tmp + PROCESSING_PATH_TMP_BASE=:processing_path_tmp_base + PROCESSING_DAL=:processing_dal + PROCESSING_TUNE=:processing_tune + PROCESSING_LATEX=:processing_latex + PROCESSING_TEXINFO=:processing_texinfo + PROCESSING_LOUT=:processing_lout + PROCESSING_ENCODING=:processing_encoding + PAPERSIZE=:papersize + LANGUAGE=:language + LANGUAGE_CODE=:language_code + MULTILINGUAL=:multilingual + CONCORD_MAX=:concord_max + DIGEST=:digest + WEBSERV_HOST_CGI=:webserv_host_cgi + WEBSERV_PORT_CGI=:webserv_port_cgi + POSTGRESQL_USER=:postgresql_user + POSTGRESQL_PORT=:postgresql_port + SQLITE_USER=:sqlite_user + SQLITE_PATH=:sqlite_path + SQLITE_PORT=:sqlite_port + DEFAULT_DIR={ + IMAGES => '_sisu/image', + SISU_ETC => etc, + SISU_SHARE => share, + SAMPLE_DATA_PATH => data, + IMAGE_STUB => '_sisu/image', + STYLESHEET_STUB => '_sisu/css', + IMAGE_LOCAL => @@pwd + '/_sisu/image', + WEBSERV_PATH => out + '/www', + #WEBSERV_DIR => www, # uncomment for urls... + #WEBSERV_IMAGE => out + '/www/_sisu/image', + WEBSERV_MAN => out + '/www/man', #alter + WEBSERV_PHP => out + '/www/php', + WEBSERV_CGI => '/usr/lib/cgi-bin', + WEBSERV_RSS => out + '/www/feed', + WEBSERV_SQLITE => out + '/www/sqlite', + OUTPUT_LOCAL => @@home + '/sisu_www', + PROCESSING_PATH => @processing_dir, + PROCESSING_PATH_TMP_BASE => tmp_processing, + PROCESSING_PATH_TMP => tmp_processing, + PROCESSING_DAL => 'dal', + PROCESSING_TUNE => 'tune', + PROCESSING_LATEX => 'tex', + PROCESSING_TEXINFO => 'texinfo', + PROCESSING_LOUT => 'lout', + PROCESSING_ENCODING => 'encoding', + #TEXINFO_STUB => 'texinfo', + PAPERSIZE => 'A4', #A4, US_letter, book_b5, book_a5, US_legal + LANGUAGE => 'English', + LANGUAGE_CODE => 'en', #change, unecessary duplication though currently used + MULTILINGUAL => true, + CONCORD_MAX => 200000, + DIGEST => 'md5', + WEBSERV_HOST_CGI => 'http://localhost', + WEBSERV_PORT_CGI => 8081, #8111,8123,8081 + POSTGRESQL_USER => @@user, #'ralph', # change user !!! + POSTGRESQL_PORT => port_pgsql, + #POSGRESQL_LINKS_PATH => '', + SQLITE_USER => @@user, + SQLITE_PATH => @@user, #?? + SQLITE_PORT => '**', + } + @@default_dir=DEFAULT_DIR + m=/.+\/(\S+)/m + stub_pwd=@@pwd[m,1] + @@rc_path=["#@@pwd/_sisu","#@@home/.sisu",@@sisu_etc] + @@yamlrc_path=unless stub_pwd =~/^sisupod$/ + ["#@@pwd/_sisu","#@@home/.sisu",@@sisu_etc] + else #security policy: prevent reading of sisurc.yml in sisupod + ["#@@home/.sisu",@@sisu_etc] + end + @@ad_path=unless stub_pwd =~/^sisupod$/ + ["#@@pwd/_sisu/skin/yml","#@@home/.sisu/skin/yml","#{@@sisu_etc}/skin/yml"] + else #security policy: prevent reading of sisurc.yml in sisupod + ["#@@home/.sisu",@@sisu_etc] + end + attr_accessor :user,:home,:hostname,:pwd,:host,:arch,:rbver,:dir_arch,:dir_sitearch,:dir_bin,:locale,:webserv_path,:webserv_host_cgi,:webserv_port_cgi,:default_dir,:rc_path,:yamlrc_path,:ad_path + def initialize + @user,@home,@hostname,@pwd,@sisu_etc,@host,@arch,@rbver,@dir_arch,@dir_sitearch,@dir_bin,@locale,@default_dir,@rc_path,@yamlrc_path,@ad_path=@@user,@@home,@@hostname,@@pwd,@@sisu_etc,@@host,@@arch,@@rbver,@@dir_arch,@@dir_sitearch,@@dir_bin,@@locale,@@default_dir,@@rc_path,@@yamlrc_path,@@ad_path + #note rbver is duplicated in Info_version + end + end + class Load + def initialize(prog,mandatory=false) + @prog,@mandatory=prog,mandatory + end + def prog + load_prog=false + $:.each do |reqpath| + if FileTest.exists?("#{reqpath}/#@prog.rb") + load_prog=true + break + end + end + if load_prog and @prog=~/dbi/; require 'dbi' #revisit + end + if load_prog; require @prog + else + tell=if @mandatory; SiSU_Screen::Ansi.new(@cmd,"module required: #@prog") + else SiSU_Screen::Ansi.new(@cmd,"#@prog load requested") + end + tell.warn + end + load_prog + end + def prog? + load_prog=false + $:.each do |reqpath| + if FileTest.exists?("#{reqpath}/#@prog.rb"); load_prog=true + break + end + end + load_prog + end + end + class Get_init < Info_system + include Singleton + @@noyaml=false + @@rc,@@vz,@@tx=nil,nil,nil + @@ad={ :promo=>nil,:promo_list=>nil,:flag_promo=>false } + attr_accessor :yaml + def initialize + super() + end + def skin + @@vz ||=SiSU_Viz::Skin.new + end + def tex + @@tx ||=SiSU_Viz::TeX.new + end + def yamlrc + unless @@rc + @yamlrc_path.each do |v| + if @@noyaml or FileTest.exists?("#{v}/noyaml") + puts "WARNING - YAML loading switched off, to enable delete the file:\n\t#{v}/noyaml\n\n" unless @@noyaml + @@noyaml=true + break + else + if FileTest.exists?("#{v}/sisurc.yml") + unless @@rc + require 'yaml' + @@rc ||= YAML::load(File::open("#{v}/sisurc.yml")) + end + break + end + unless @@rc + if FileTest.exists?("#{v}/sisurc.yaml") + unless @@rc + require 'yaml' + @@rc ||= YAML::load(File::open("#{v}/sisurc.yaml")) + end + break + end + end + end + end + end + @@rc + end + def ads #WORK AREA + tell_no_yaml='WARNING - YAML loading switched off, to enable delete the file:' + @ad_path.each do |v| + if @@noyaml or FileTest.exists?("#{v}/noyaml") + puts tell_no_yaml + "\n\t#{v}/noyaml\n" unless @@noyaml + @@noyaml=true + break + else + #tell=SiSU_Screen::Ansi.new('','promo off (file not found): list.yml') + if FileTest.exists?("#{v}/list.yml") + unless @@ad[:promo_list] + require 'yaml' + @@ad[:promo_list] ||= YAML::load(File::open("#{v}/list.yml")) + end + @@ad[:flag_promo]=true + break + end + #tell.warn if @cmd=~/MV/ + @@ad[:flag_promo]=false + end + end + @ad_path.each do |v| + if @@noyaml or FileTest.exists?("#{v}/noyaml") + puts tell_no_yaml + "\n\t#{v}/noyaml\n" unless @@noyaml + @@noyaml=true + break + else + #tell=SiSU_Screen::Ansi.new('','promo off (file not found): promo.yml') + if FileTest.exists?("#{v}/promo.yml") + unless @@ad[:promo] + require 'yaml' + @@ad[:promo] ||= YAML::load(File::open("#{v}/promo.yml")) + end + @@ad[:flag_promo]=true + break + end + #tell.warn if @cmd=~/MV/ + @@ad[:flag_promo]=false + end + end + @@ad + end + end + class Env_call + @@rc,@@fns,@@fnn,@@fnb,@@fnt,@@flv=nil,nil,nil,nil,nil,nil + @@ad={} + attr_accessor :rc,:fnn,:fnb,:fnt,:fnv,:ad + def initialize(fns='') + super() + @fns=fns + @sys=Info_system.instance + @rc=Get_init.instance.yamlrc + @ad=Get_init.instance.ads + if @fns and @fns != '' and @fns !=@@fns + @@fns,@@fnn,@@fnb,@@fnt,@@flv=@fns,nil,nil,nil,nil + end + if @fns and @fns != '' #watch + if multilingual + m=/((.+?)(?:\~\w{2,3})?)\.([_-]?sst|ssm)$/ + @@fnn ||=@fns[m,1] + @@fnb ||=@fns[m,2] + @@fnt ||=@fns[m,3] + @@flv ||=document_language_versions_found[:f] + else m=/(.+?)\.([_-]?sst|ssm)$/ + @@fnb ||=@fns[m,1] + @@fnm ||=@fns[m,1] + @@fnt ||=@fns[m,2] + end + end + @fnn,@fnb,@fnt,@flv=@@fnn,@@fnb,@@fnt,@@flv + end + def multilingual + if defined? @rc['default']['multilingual'] and @rc['default']['multilingual'] != nil; @rc['default']['multilingual'] + else true + end + end + def document_language_versions_found + @fn={} + unless (@fns.nil? or @fns.empty?) + if multilingual + m=/((.+?)(?:\~\w{2,3})?)\.([_-]?sst$)/ + @fn[:b],@fn[:m],@fn[:t]=@fns[m,1],@fns[m,2],@fns[m,3] + else m=/(.+?)\.([_-]?sst$)/ + @fn[:b]=@fn[:m]=@fns[m,1] + @fn[:t]=@fns[m,2] + end + end + lang=SiSU_Env::Standardise_language.new + langs=lang.codes + x=[] + if FileTest.file?("#{@fn[:m]}.#{@fn[:t]}"); x << "#{@fn[:m]}.#{@fn[:t]}" + end + x << @fns + langs.each do |l| + lng=SiSU_Env::Standardise_language.new(l) + if FileTest.file?("#{@fn[:m]}~#{lng.code}.#{@fn[:t]}") + x << "#{@fn[:m]}~#{lng.code}.#{@fn[:t]}" + elsif FileTest.file?("#{@fn[:m]}~#{lng.name}.#{@fn[:t]}") + x << "#{@fn[:m]}~#{lng.name}.#{@fn[:t]}" + end + end + @fn[:f]=x.uniq! + @fn + end + def published_manifests?(output_base) + ob=output_base + @fn={} + @m=[] + unless (@fns.nil? or @fns.empty?) + if multilingual + m=/((.+?)(?:\~\w{2,3})?)\.([_-]?sst$)/ + @fn[:b],@fn[:m],@fn[:t]=@fns[m,1],@fns[m,2],@fns[m,3] + #@fl[:v]=@env.document_language_versions_found + else m=/(.+?)\.([_-]?sst$)/ + @fn[:b]=@fn[:m]=@fns[m,1] + @fn[:t]=@fns[m,2] + end + end + lang=SiSU_Env::Standardise_language.new + langs=lang.codes + x=[] + if FileTest.file?("#{@fn[:m]}.#{@fn[:t]}"); x << "#{@fn[:m]}.#{@fn[:t]}" + end + dir=SiSU_Env::Info_env.new(@fns) + @m << {:m => 'sisu_manifest.html', :l => 'English' } #fix later, default language + langs.each do |l| + lng=SiSU_Env::Standardise_language.new(l) + fns_c="#{@fn[:m]}~#{lng.code}.#{@fn[:t]}" + fns_l="#{@fn[:m]}~#{lng.name}.#{@fn[:t]}" + if FileTest.file?(fns_c) + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(fns_c) + lng=fn_set_lang[:l] + fn=SiSU_Env::Env_call.new(fns_c).lang(fn_set_lang[:c]) + @m << {:m => fn[:manifest], :l => lng } + elsif FileTest.file?(fns_l) + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(fns_l) + @fnl=dir.i18n.lang_filename(fn_set_lang[:c]) + fn=SiSU_Env::Env_call.new(fns_l).lang(fn_set_lang[:c]) + @m << {:m => fn[:manifest], :l => lng } + end + end + @m.uniq! + @m + end + def filename(code,name,suffix) + d=SiSU_Env::Info_env.new(@fns) + fnl=d.i18n.lang_filename(code) + "#{fnl[:pre]}#{name}#{fnl[:mid]}#{suffix}#{fnl[:post]}" + end + def lang(code) + @fn={ + :html => filename(code,'','.html'), + :concordance => filename(code,'concordance','.html'), + :sax => filename(code,'sax','.xml'), + :dom => filename(code,'dom','.xml'), + :docbook => filename(code,'docbook','.xml'), + :xhtml => filename(code,'scroll','.xhtml'), + :pdf_l => filename(code,'landscape','.pdf'), + :pdf_p => filename(code,'portrait','.pdf'), + :toc => filename(code,'toc','.html'), + :doc => filename(code,'doc','.html'), + :index => filename(code,'index','.html'), + :odf => filename(code,'opendocument','.odt'), + :plain => filename(code,'plain','.txt'), + :wiki => filename(code,'wiki','.txt'), + :digest => filename(code,'digest','.txt'), + :metadata => filename(code,'metadata','.html'), #chk + :manifest => filename(code,'sisu_manifest','.html'), + :sitemap => filename(code,'sitemap','.xml'), + :sitemap_touch => filename(code,"sitemap_#@fnb",'.xml'), + :sxs => filename(code,@fnb,'.sxs.xml'), + :sxd => filename(code,@fnb,'.sxd.xml'), + :sxn => filename(code,@fnb,'.sxn.xml') + } + @fn + end + end + class System_call + @@locale_flag=false + def initialize(input='',output='',cmd='') + @input,@output,@cmd=input,output,cmd + @prog=SiSU_Env::Info_program.new + @sys=Info_system.instance + end + def program_found?(program) + found=`whereis #{program}` + state=if found =~/bin\/#{program}\b/; true + else false + end + end + def locale #locales utf8 or other + unless @@locale_flag + @@locale_flag=true + puts @sys.locale #unless @cmd =~/q/ # locale info UTF8 etc. KEEP + end + @sys.locale + end + def file_encoding(filename,cmd='') #file encoding + program='file' + if program_found?(program) + encoding=%x{file #{filename}}.strip + encoding.gsub!(/#{filename}:(\s+|$)/,'') + encoding=if encoding and not encoding.empty?; encoding + else 'UTF-8 assumed, encoding undetermined' + end + puts encoding if cmd =~/[VM]/ + encoding + else encoding='UTF-8 assumed, file encoding check program unavailable' + end + end + def wc #word count + program='wc' + if program_found?(program) and locale !~/utf-?8/i; true + else + program_ref="(not available)" unless program_found?(program) + program_ref="(UTF-8)" if locale =~/utf-?8/i + #puts "\tWARN: #{program}\n\t\t using alternative to word count program #{program_ref}" + false + end + end + def rcs #rcs for document markup data + program='rcs' + program_ref="\n\t\tdocument version information requested" + if program_found?(rcs); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def cvs #cvs for document markup data + program='cvs' + program_ref="\n\t\tdocument version information requested" + if program_found?(cvs); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def openssl #openssl for digests + program='openssl' + program_ref="\n\t\tused to generate requested source document identification digest" + if program_found?(program); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def md5(filename) #md5 dgst + program='openssl' + program_ref="\n\t\tmd5 digest requested" + if program_found?(program) + dgst=%x{openssl dgst -md5 #{filename}}.strip + dgst.scan(/\S+/) + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def sha256(filename) #sha dgst + program='openssl' + program_ref="\n\t\tsha digest requested" + if program_found?(program) + dgst=%x{openssl dgst -sha256 #{filename}}.strip + dgst.scan(/\S+/) + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def psql #psql + program='psql' + program_ref="\n\t\tpsql requested" + if program_found?(program); true + else puts "\tWARN: #{program} is not installed #{program_ref}" #if @cmd =~/v/ + false + end + end + def create_pg_db(dbname_stub=nil) #createdb + unless dbname_stub + @pwd ||=Dir.pwd + m=/.+\/(\S+)/im + dbname_stub=@pwd[m,1] + end + program='createdb' + program_ref="\n\t\tcreatedb dbname SiSU_#{dbname_stub} #for postgresql database creation" + if program_found?(program); system("createdb SiSU_#{dbname_stub}") + else puts "\tWARN: #{program} is not available #{program_ref}" #if @cmd =~/v/ + end + end + def relaxng(cmd='') #trang - convert between different schema languages for XML + program='trang' + program_ref="\n\t\tsee http://www.thaiopensource.com/relaxng/trang.html" + if program_found?(program); system("trang #@input #@output") + else puts "\tWARN: #{program} is not installed #{program_ref}" if cmd =~/V/ + end + end + def well_formed? #tidy - check for well formed xml xhtml etc. + program=@prog.tidy + program_ref="\n\t\tsee http://tidy.sourceforge.net/" + if program_found?(program); system("#{@prog.tidy} -xml #@input > #@output") + else puts "\tWARN: #{program} is not installed #{program_ref}" + end + end + def latex2pdf #convert from latex to pdf + prog=[] + prog=['pdflatex','pdfetex','pdftex'] + program_ref="\n\t\tSee http://www.tug.org/applications/pdftex/\n\t\tOn Debian this is is included in tetex-extra" + @pdfetex_flag=false + @cmd ||='' + tell=if @cmd =~/[MVv]/; '' + else '> /dev/null' + end + mode='batchmode' + #mode='nonstopmode' + prog.each do |program| + if program_found?(program) + case program + when /pdflatex/; system("#{program} -interaction=#{mode} #@input #{tell}\n") + when /pdfetex/; system("#{program} -interaction=#{mode} -fmt=pdflatex #@input #{tell}\n") # debian specific paramters ? + #system("#{program} -interaction=batchmode -progname=pdflatex #@input\n") + when /pdftex/; system("#{program} -interaction=#{mode} -fmt=pdflatex #@input #{tell}\n") + end + @pdfetex_flag=true + break + end + unless @pdfetex_flag; puts "\tWARN: none of the following programs are installed: #{program[0]}, #{program[1]}, #{program[2]} is installed. #{program_ref}" + end + end + end + def makeinfo #texinfo + program='makeinfo' + program_ref="\n\t\tsee http://www.gnu.org/software/texinfo/" + if program_found?(program); system("makeinfo #@input\n") + else puts "\tWARN: #{program} is not installed #{program_ref}" + end + end + def scp + program='scp' + if program_found?(program); system("scp -Cr #@input #@output") + else puts "\tWARN: #{program} not found" + end + end + def rsync(action='') + program='rsync' + if program_found?(program) + vb=if @cmd =~/q/; 'q' + elsif @cmd =~/v/; 'v' + else '' + end + msg='' + msg=" && echo 'OK: #@input -> #@output'" unless @cmd =~/q/ + system("rsync -az#{vb} #{action} #@input #@output #{msg}") + else puts "\tWARN: #{program} not found" + end + end + def rm + if @cmd =~/^-Z[mMvVq]*$/; rm_rf(@input) + elsif @cmd =~/V/; rm(@input) + elsif @cmd !~/q/; rm(@input) + elsif @cmd =~/q/; rm(@input) + #elsif @cmd =~/q/; system("rm #{action} #@input") + else puts "\tWARN: operation ignored" + end + end + end + class Standardise_language + def initialize(l='') + @language=l + if @language.empty? + @language=Info_env.new.defaults[:language] + end + end + def language #use ISO_639-2 + lang={} + case @language + when /American|^us$/i; d,c,l=false,'en','American English' #depreciated, see iso 639-2 + when /English|^en$/i; d,c,l=false,'en','English' + when /French|Francais|^fr$/i; d,c,l=false,'fr','French' + when /German|^de$/i; d,c,l=false,'de','German' + when /Italian|^it$/i; d,c,l=false,'it','Italian' + when /Spanish|Espanol|^es$/i; d,c,l=false,'es','Spanish' + when /Brazilian(?: Portuguese)?|^br$/i; d,c,l=false,'pt','Brazilian Portuguese' #depreciated, see iso 639-2 + when /Portuguese|^pt$/i; d,c,l=false,'pt','Portuguese' + when /Swedish|Svensk|^sv$/i; d,c,l=false,'sv','Swedish' + when /Danish|Dansk|^da$/i; d,c,l=false,'da','Danish' + when /Finnish|Finsk|Suomi|^fi$/i; d,c,l=false,'fi','Finnish' + when /Norwegian|Norsk|^no$/i; d,c,l=false,'no','Norwegian' + when /Icelandic|^is$/i; d,c,l=false,'is','Icelandic' + when /Dutch|^nl$/i; d,c,l=false,'nl','Dutch' + when /Estonian|^et$/i; d,c,l=false,'et','Estonian' + when /Hungarian|^hu$/i; d,c,l=false,'hu','Hungarian' + when /Polish|^pl$/i; d,c,l=false,'pl','Polish' + when /Romanian|^ro$/i; d,c,l=false,'ro','Romanian' + when /Russian|^ru$/i; d,c,l=false,'ru','Russian' + when /Greek|^el$/i; d,c,l=false,'el','Greek' + when /Ukranian|^uk$/i; d,c,l=false,'uk','Ukranian' + when /Turkish|^tr$/i; d,c,l=false,'tr','Turkish' + #when /Serbian/i; d,c,l=false,'', 'Serbian' + #when /Welsh/i; d,c,l=false,'', 'Welsh' + #when /Basque/i; d,c,l=false,'', 'Basque' + #when /Breton/i; d,c,l=false,'', 'Breton' + #when /Catalan/i; d,c,l=false,'', 'Catalan' + #when /Galician/i; d,c,l=false,'', 'Galician' + #when /Saa?mi/i; d,c,l=false,'', 'Saami' + #when /Hebrew/i; d,c,l=false,'', 'Hebrew' + #when /Latin/i; d,c,l=false,'', 'Latin' + #when /Esperanto/i; d,c,l=false,'', 'Esperanto' + when /Slovenian|^sl$/i; d,c,l=false,'sl','Slovenian' + when /Croatian|^hr$/i; d,c,l=false,'hr','Croatian' + when /Slovak(?:ian)?|^sk$/i; d,c,l=false,'sk','Slovakian' + when /Czech|^cs$/i; d,c,l=false,'cs','Czech' + when /Bulgarian|^bg$/i; d,c,l=false,'bg','Bulgarian' + else d,c,l=true,'en','English (default)' + #else d,c,l=true,'xx','Default' + end + lang[:d],lang[:c],lang[:l]=d,c,l + lang + end + def name + language[:l].downcase + end + def title + language[:l] + end + def code + language[:c] + end + def file_to_language(file) + m=/.+?\~(\w{2,3})\.[_-]?sst$/ + @language=if file =~m ; file[m,1] + else '' + end + language + end + def codes + codes=['us','en','fr','de','it','es','br','pt','sv','da','fi','no','is','nl','et','hu','pl','ro','ru','el','uk','tr','sk','hr','sl','cs','bg'] # remove us and br see iso-639-2 + end + end + class Info_env < Env_call + require 'fileutils' + include FileUtils + attr_accessor :filename,:sys,:home,:hostname,:user,:env,:rc,:www,:fnb,:fnn,:fnt,:flv,:webserv_path,:stub_pwd,:webserv_host_cgi,:webserv_port_cgi,:processing,:etc,:yamlrc_dir + @@image_flag,@@local_image=true,true #warning on @@image_flag + @@fb=nil + def initialize(fns='',md=nil) + super() #you may not want to re-execute this tatic info so frequently! + @fns,@md=fns,md + @env=Env_call.new(fns) if fns + fnb=if @md and defined? @md.fnb; @md.fnb + elsif defined? @env.fnb and @env.fnb; @env.fnb + elsif not @fns.nil? and not @fns.empty? + m=/(.+)?\.(?:[_-]?sst|ssm)$/m + @fns[m,1] if not @fns.empty? + end + if fnb; @@fb ||=fnb + end + @sys=Info_system.instance + @fnb ||=@@fb #clean up this... used primarily for zap which is not passed normal parameters + @fixed_websev_root='' # @home + @pwd=@@pwd||=Dir.pwd + m=/.+\/(\S+)/m + @stub_pwd=@@pwd[m,1] + end + def user + @sys.user + end + def hostname + @sys.hostname + end + def host + @sys.host + end + def arch + @sys.arch + end + def rbver + @sys.rbver + end + def locale + @sys.locale + end + def concord_max + concord_max=if defined? @rc['processing']['concord_max'] and @rc['processing']['concord_max']: + @rc['processing']['concord_max'] + else defaults[:concord_max] + end + end + def current_document + @@current_document||=Dir.pwd + @@current_document + end + def stub_pwd #200412 + @stub_pwd + end + def sisupod + #path.processing + # sisupod + # sisu + # content.sst [file content] + # filename.sst [link to content.sst] + # _sisu + # conf + # skin/ + # doc [relevant skin if any other than default] + # image [all images for specific document gathered here] + sisupod_processing_path="#{path.processing}/sisupod" + rm_rf(sisupod_processing_path) if FileTest.directory?(sisupod_processing_path) or FileTest.file?(sisupod_processing_path) + paths=[] + paths=["#{path.processing}/sisupod/_sisu/skin/doc","#{path.processing}/sisupod/_sisu/skin/dir","#{path.processing}/sisupod/_sisu/skin/site","#{path.processing}/sisupod/_sisu/image"] + paths.each {|x| File.mkpath(x) unless FileTest.directory?(x) } + end + def defaults #multiple default directories + @default_dir ||=@sys.default_dir #DEFAULT_DIR + end + #def skin + # @@vz ||=SiSU_Viz::Skin.new + #end + def widget #needs (md) #move + @rc=SiSU_Env::Get_init.instance.yamlrc + @ad=SiSU_Env::Get_init.instance.ads + @vz=SiSU_Env::Get_init.instance.skin + @flag={ :ad=>false,:md=>false,:sk=>false,:rc=>false } + def promo? + @flag[:ad]=if @md.flag_promo && @ad[:flag_promo] + @flag[:md]=true + true + elsif defined? @vz.widget_promo and not @vz.widget_promo.nil? and @vz.widget_promo.class == Array and @vz.widget_promo.length > 0 + @flag[:sk]=true + true + elsif defined? @rc['promo'] and not @rc['promo'].nil? and @rc['promo'].length > 0 + @flag[:rc]=true + true + else + false + end + @flag + end + def search? + flag=if defined? @rc['search'] and + defined? @rc['search']['action'] and @rc['search']['action'] =~/http:\/\// and + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + flag=if promo?[:ad] + false + elsif defined? @vz.widget_search and @vz.widget_search == true + true + elsif defined? @rc['search']['flag'] and @rc['search']['flag'] == true + true + else + false + end + else + false + end + end + def search_fixed? + flag=if defined? @rc['search'] and + defined? @rc['search']['action'] and @rc['search']['action'] =~/http:\/\// and + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + flag=if promo?[:ad] + false + elsif defined? @vz.widget_search and @vz.widget_search == true + true + elsif defined? @rc['search']['flag'] and @rc['search']['flag'] == true + true + else + false + end + else + false + end + end + def search_form(action=nil,db=nil) + rc=SiSU_Env::Get_init.instance.yamlrc + create_form=if action and db and action =~/http:\/\// and db =~/\S+/ + true + elsif widget.search? + db=if rc['search']['db']=~/\S+/ + rc['search']['db']=~/^SiSU_\S+/ ? rc['search']['db'] : "SiSU_#{rc['search']['db']}" + else nil + end + action=rc['search']['action'] + true + else false + end + if create_form + %{<td align="center" bgcolor="#ffffff"> +<!-- Search SiSU --> +<a name="search"></a> +<font size="2"> +<form method="get" action="#{rc['search']['action']}" target="_top"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="hidden" name="a" value="1" /> +<input type="hidden" name="ltd" value="1000" /> +<input type="hidden" name="off" value="0" /> +<input type="radio" name="view" value="index" checked="checked" /> idx +<input type="radio" name="view" value="text" /> txt +<input type="submit" name="ignore" value="search" /> +<input type="checkbox" name="fns" value="#{@md.fnb}" /> +</form> +</font> +<!-- Search SiSU --> +</td> } + else '' + end + end + def search_form_static(action=nil,db=nil) + rc=SiSU_Env::Get_init.instance.yamlrc + create_form=if action and db and action =~/http:\/\// and db =~/\S+/ + true + elsif widget.search_fixed? + db=if rc['search']['db']=~/\S+/ + rc['search']['db']=~/^SiSU_\S+/ ? rc['search']['db'] : "SiSU_#{rc['search']['db']}" + else nil + end + action=rc['search']['action'] + true + else false + end + if create_form + %{<td align="center" bgcolor="#ffffff"> +<!-- Search SiSU --> +<a name="search"></a> +<font size="2"> +<form method="get" action="#{rc['search']['action']}" target="_top"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="hidden" name="a" value="1" /> +<input type="hidden" name="ltd" value="1000" /> +<input type="hidden" name="off" value="0" /> +<input type="radio" name="view" value="index" checked="checked" /> idx +<input type="radio" name="view" value="text" /> txt +<input type="submit" name="ignore" value="search" /> +<input type="checkbox" name="fns" value="#{@md.fnb}" /> +</form> +</font> +<!-- Search SiSU --> +</td> } + else '' + end + end + def search_action + action=if search? + else '' + end + end + self + end + def widget_static + @rc=SiSU_Env::Get_init.instance.yamlrc + @vz=SiSU_Env::Get_init.instance.skin + @flag={ :ad=>false,:md=>false,:sk=>false,:rc=>false } + def search? + flag=if defined? @rc['search'] and + defined? @rc['search']['action'] and @rc['search']['action'] =~/http:\/\// and + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + flag=if defined? @vz.widget_search and @vz.widget_search == true + true + elsif defined? @rc['search']['flag'] and @rc['search']['flag'] == true + true + else + false + end + else + false + end + end + def search_fixed? + flag=if defined? @rc['search'] and + defined? @rc['search']['action'] and @rc['search']['action'] =~/http:\/\// and + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + defined? @rc['search']['db'] and @rc['search']['db'] =~/\S+/ + flag=if defined? @vz.widget_search and @vz.widget_search == true + true + elsif defined? @rc['search']['flag'] and @rc['search']['flag'] == true + true + else + false + end + else + false + end + end + def search_form(action=nil,db=nil) + rc=SiSU_Env::Get_init.instance.yamlrc + create_form=if action and db and action =~/http:\/\// and db =~/\S+/ + true + elsif widget_static.search? + db=if rc['search']['db']=~/\S+/ + rc['search']['db']=~/^SiSU_\S+/ ? rc['search']['db'] : "SiSU_#{rc['search']['db']}" + else nil + end + action=rc['search']['action'] + true + else false + end + if create_form and @fnb and @fnb=~/\S+/ + %{<!-- Search SiSU --> +<a name="search"></a> +<font size="2"> +<form method="get" action="#{rc['search']['action']}" target="_top"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="hidden" name="a" value="1" /> +<input type="hidden" name="fns" value="#@fnb" /> +<input type="radio" name="view" value="index" /> idx +<input type="radio" name="view" value="text" checked="checked" /> txt +<input type="submit" name="ignore" value="search" /> +</form> +</font> +<!-- Search SiSU --> } + elsif create_form + %{<!-- Search SiSU --> +<a name="search"></a> +<font size="2"> +<form method="get" action="#{rc['search']['action']}" target="_top"> +<input type="text" name="s1" size="24" maxlength="255" /> +<br /> +<input type="hidden" name="db" value="#{db}" /> +<input type="hidden" name="a" value="1" /> +<input type="radio" name="view" value="index" checked="checked" /> idx +<input type="radio" name="view" value="text" /> txt +<input type="submit" /> +</form> +</font> +<!-- Search SiSU --> } + else '' + end + end + def search_action + action=if search? + else '' + end + end + self + end + def path #dir + def home + @sys.home + #@home + end + def pwd + @sys.pwd + end + def stub_pwd + @stub_pwd + end + def etc + defaults[:sisu_etc] #live/dynamic + # @sys.sisu_etc #broken: live/dynamic + # defaults[:sisu_etc] #live/dynamic + end + def arch + @sys.dir_arch + end + def sitearch + @sys.dir_sitearch + end + def bin + @sys.dir_bin + end + def share #shared data repository source directory + defaults[:sisu_share] + end + def style + defaults[:stylesheet_stub] + end + def sample_data #sample data repository source directory + defaults[:sample_data_path] + end + def rc + @sys.rc_path + end + def yamlrc + rc.each do |v| + if FileTest.exists?("#{v}/sisurc.yml") + @yamlrc_dir="#{v}/sisurc.yml" + break + end + end + unless @yamlrc_dir + rc.each do |v| + if FileTest.exists?("#{v}/sisurc.yaml") + @yamlrc_dir="#{v}/sisurc.yaml" + break + end + end + end + @yamlrc_dir + end + def man + if defined? @rc['webserv']['man']; "#{webserv}/#{@rc['webserv']['man']}" + else defaults[:webserv_man] + end + end + def webserv_path #testing, check need, remove + @webserv_path + end + def webserv #separation required for webrick which cannot use path.output (different requirements as no file is passed) + man_path=if defined? @rc['webserv']['path'] and @rc['webserv']['path'] =~/\S\S+/ + man_path=case @rc['webserv']['path'] + when /^\/\S+/; @rc['webserv']['path'] + when /^\.\/(\S+)/; "#{pwd}/#{$1}" + when /^~\/(\S+)/; "#{home}/#{$1}" + else "#{home}/#{@rc['webserv']['path']}" + end + else nil + end + @webserv_path=if defined? man_path and File.writable?("#{man_path}/."); man_path #web server path as configured in rc file + elsif FileTest.directory?(defaults[:webserv_path]) and File.writable?("#{defaults[:webserv_path]}/.") #web server path default + defaults[:webserv_path] + else #create default directory under home and place output there + File.mkpath(defaults[:output_local]) unless FileTest.directory?(defaults[:output_local]) + defaults[:output_local] + end + end + def webserv_stub_ensure + File.mkpath(path.webserv) unless FileTest.directory?(path.webserv) + File.mkpath("#{path.webserv}/#@stub_pwd") unless FileTest.directory?("#{path.webserv}/#@stub_pwd") + end + def webserv_map_pwd #dir + "#{path.webserv}/#{stub_pwd}" + end + def webserv_dir #fixed/hard path to /www web/presentation directory, on Debian /var/www subdirectories are created within it, depending on markup directory stub-name (last segment of markup directory name) + defaults[:webserv_dir] + end + def webserv_image #web/presentation directory, subdirectories are created within it, depending on markup directory stub-name (last segment of markup directory name) + images=if defined? @rc['webserv']['images'] + @rc['webserv']['images'] + else defaults[:images] + end + "#{path.webserv}/#{images}" + end + def output #web/webserv output directory... subdirectory into which further subdirectories are made based on file names + "#{path.webserv}/#@stub_pwd" + end + def sitemaps + "#{path.output}/sitemaps" + end + def encoding + pth="#{processing}/#{defaults[:processing_encoding]}" + File.mkpath(pth) unless FileTest.directory?(pth) + pth + end + def processing_base_tmp + defaults[:processing_path_tmp_base] + end + def processing #processing directory, used/needed for sisu work files, has sub-directories (dal,tex etc) + File.mkpath(defaults[:processing_path]) unless FileTest.directory?(defaults[:processing_path]) + File.mkpath(defaults[:processing_path_tmp]) unless FileTest.directory?(defaults[:processing_path_tmp]) + path_processing=if defined? @rc['processing']['path'] and @rc['processing']['path'] + File.mkpath("#{path.home}/#{@rc['processing']['path']}") unless FileTest.directory?("#{path.home}/#{@rc['processing']['path']}") + ["#{path.home}/#{@rc['processing']['path']}",defaults[:processing_path],defaults[:processing_path_tmp]] + else [defaults[:processing_path],defaults[:processing_path_tmp]] + end + @processing=nil + path_processing.each do |v| # + #if File.writable?("#{v}/.") #check now is earlier + @processing=v + unless FileTest.directory?(@processing) + puts "a processing directory (#@processing) is being created for use by sisu" + File.mkpath(@processing) + end + break + #end + end + @processing + end + def dal + pth=if defined? @rc['processing']['dal']; "#{processing}/#{@rc['processing']['dal']}" + else "#{processing}/#{defaults[:processing_dal]}" + end + File.mkpath(pth) unless FileTest.directory?(pth) + pth + end + def tune + pth=if defined? @rc['processing']['tune']; "#{processing}/#{@rc['processing']['tune']}" + else "#{processing}/#{defaults[:processing_tune]}" + end + File.mkpath(pth) unless FileTest.directory?(pth) + pth + end + def odf + "#{processing}/odf" + end + def tex + pth=if defined? @rc['processing']['latex']; "#{processing}/#{@rc['processing']['latex']}" + else "#{processing}/#{defaults[:processing_latex]}" + end + File.mkpath(pth) unless FileTest.directory?(pth) + pth + end + def texi + pth=if defined? @rc['processing']['texinfo']; "#{processing}/#{@rc['processing']['texinfo']}" + else "#{processing}/#{defaults[:processing_texinfo]}" + end + File.mkpath(pth) unless FileTest.directory?(pth) + pth + end + def texinfo #texinfo webserv, check + "#{processing}/#{defaults[:processing_texinfo]}" + end + def lout + pth=if defined? @rc['processing']['lout']; "#{processing}/#{@rc['processing']['lout']}" + else "#{processing}/#{defaults[:processing_lout]}" + end + File.mkpath(pth) unless FileTest.directory?(pth) + pth + end + def feed + if defined? @rc['webserv']['feed']; "#{public_output}/#{@rc['webserv']['feed']}" + else defaults[:webserv_feed] + end + end + def feed_home + "#{public_output}/#{@rc['webserv']['feed_home']}" + end + def scripts #used previously only to include tla version info + if defined? @rc['project']['path']; "#{home}/#{@rc['project']['path']}" + end + end + def sqlite + "#{home}/sqlite" + end + def cgi + if defined? @rc['webserv']['cgi']; "#{@rc['webserv']['cgi']}" + else defaults[:webserv_cgi] + end + end + def php + if defined? @rc['webserv']['php']; "#{public_output}/#{@rc['webserv']['php']}" + else defaults[:webserv_php] + end + end + # programs + def output_tell + url.webserv_map_pwd + end + def image_source #image repository source directory + image_path=if defined? @rc['image']['path'] and defined? @rc['image']['public'] + pth="#{@rc['image']['path']}" + "#{pth}/#{@rc['image']['public']}" + else + "#{share}/image" + end + end + def image_source_tex #image repository source directory + image_path=if defined? @rc['image']['path'] and defined? @rc['image']['public'] + pth="#{@rc['image']['path']}" + "#{pth}/#{@rc['image']['public']}" + else + image=defaults[:image_stub] + "#{share}/image" + end + end + def image_external + "#{processing}/external_document/image" + end + def image_source_local_tex + if FileTest.directory?(defaults[:image_local]); defaults[:image_local] + end + end + def image_source_remote_tex + if FileTest.directory?(image_external); image_external + end + end + self + end + def url + def hostname + "http://#{@sys.hostname}" + end + def dir_url + "file://#{path.webserv}/#{stub_pwd}" + end + def localhost + "http://localhost/#{stub_pwd}" + end + def local + "http://#{hostname}/#@stub_pwd" + end + def root + if defined? @rc['webserv']['url_root'] and @rc['webserv']['url_root'] =~/http:\/\//; "#{@rc['webserv']['url_root']}/#@stub_pwd" + else "http://localhost/#@stub_pwd" + end + end + def remote + root + end + def webserv_host_base + if defined? @rc['webserv']['host'] + case @rc['webserv']['host'] + when /http:\/\//; @rc['webserv']['host'] + when /\S+/; "http://#{@rc['webserv']['host']}" + else defaults[:webserv_host_cgi] + end + else defaults[:webserv_host_cgi] + end + end + def webrick_port + if @md and @md.cmd.inspect=~/-F/ and @md.mod.inspect=~/port=(\d+)/ + $1 + else + if defined? @rc['webserv_cgi']['port'] + if @rc['webserv_cgi']['port'].nil? and (defined? @md.mod and not @md.mod.nil? and @md.mod.inspect=~/webrick/) + defaults[:webserv_port_cgi] + elsif not @rc['webserv_cgi']['port'].nil? + @rc['webserv_cgi']['port'] + else defaults[:webserv_port_cgi] + end + else defaults[:webserv_port_cgi] + end + end + end + def webserv_port_cgi + if @md and @md.cmd.inspect=~/-F/ and @md.mod.inspect=~/port=(\d+)/ + $1 + else + if defined? @rc['webserv_cgi']['port'] + if @rc['webserv_cgi']['port'].nil? and (defined? @md.mod and not @md.mod.nil? and @md.mod.inspect=~/webrick/) + defaults[:webserv_port_cgi] + elsif not @rc['webserv_cgi']['port'].nil? + @rc['webserv_cgi']['port'] + else nil + end + else nil + end + end + end + def webserv_cgi #web url for local webserv (localhost, or hostname) + if defined? @rc['webserv_cgi']['host'] and not @rc['webserv_cgi']['host'].nil? + http=@rc['webserv_cgi']['host'] =~ /http:\/\// ? '' : 'http://' + if webserv_port_cgi + "#{http}#{@rc['webserv_cgi']['host']}:#{webserv_port_cgi}/#@stub_pwd" + else "#{http}#{@rc['webserv_cgi']['host']}/#@stub_pwd" + end + else + http=webserv_host_base=~/http:\/\// ? '' : 'http://' + if webserv_port_cgi + "#{http}#{webserv_host_base}:#{webserv_port_cgi}/#@stub_pwd" + else "#{http}#{webserv_host_base}/#@stub_pwd" + end + end + end + def webserv_base_cgi #web url for local webserv (localhost, or hostname) + if defined? @rc['webserv_cgi']['host'] and not @rc['webserv_cgi']['host'].nil? + http=@rc['webserv_cgi']['host'] =~ /http:\/\// ? '' : 'http://' + if webserv_port_cgi + "#{http}#{@rc['webserv_cgi']['host']}:#{webserv_port_cgi}" + else "#{http}#{@rc['webserv_cgi']['host']}" + end + else + http=webserv_host_base=~/http:\/\// ? '' : 'http://' + if webserv_port_cgi + "#{http}#{webserv_host_base}:#{webserv_port_cgi}" + else "#{http}#{webserv_host_base}" + end + end + end + def webrick #must have a port #REMOVE + #port=":#{webserv_port_cgi}" + if defined? @rc['webserv_cgi']['host'] and not @rc['webserv_cgi']['host'].nil? + http=if @rc['webserv_cgi']['host'] =~/http:\/\// + 'http://' + else defaults + end + "#{http}#{@rc['webserv_cgi']['host']}" + elsif webserv_host_base and not webserv_host_base.nil? + "#{http}#{webserv_host_base}" + else "#{http}localhost" + end + end + def webserv #web url for local webserv (localhost, or hostname) + if path.webserv_dir and path.webserv =~ /#{path.webserv_dir}/ #revisit + "#{path.webserv}/#@stub_pwd".gsub(/#{path.webserv_dir}/,"#{url.hostname}/#@stub_pwd") + elsif defined? @rc['webserv']['webrick_url'] and @rc['webserv']['webrick_url'] == false + "file://#{path.webserv}/#@stub_pwd" + else "#{url.hostname}:#{webserv_port_cgi}/#@stub_pwd" + end + end + def webserv_base #web url for local webserv (localhost, or hostname) + if path.webserv_dir and path.webserv =~ /#{path.webserv_dir}/ #revisit + "#{path.webserv}/#@stub_pwd".gsub(/#{path.webserv_dir}/,"#{url.hostname}") + elsif defined? @rc['webserv']['webrick_url'] and @rc['webserv']['webrick_url'] == false + "file://#{path.webserv}" + else "#{url.webrick_base}" + end + end + def webserv_files_from_db #sort this out, messy + if defined? @rc['webserv_cgi']['file_links'] + case @rc['webserv_cgi']['file_links'] + when /webserv_cgi/; url.webserv_base_cgi + when /webserv/; @rc['webserv']['url_root'] + when /http:\/\//; @rc['webserv_cgi']['file_links'] + when /\S+/; "http://#{@rc['webserv_cgi']['file_links']}" + else webserv_base_cgi + end + else webserv_base_cgi + end + end + def sample_search_form_title + if defined? @rc['search']['title'] and @rc['search']['title'] =~/\S+/ + @rc['search']['title'] + else %{SiSU search form (sample):} + end + end + def output_tell + output_type=if defined? @rc['show_output_on'] and @rc['show_output_on'] =~/^(?:filesystem|webserv|(?:local|remote)(?:_webserv)?|webrick)/ + @rc['show_output_on'] + else 'filesystem' + end + output=case output_type + when /^filesystem(?:_url)?/; url.dir_url + when /^remote(?:_webserv)?/; url.remote + when /^(?:webserv|local_webserv)/; url.local + when /^local(:\d+)/; url.hostname + $1 + '/' + stub_pwd + when /^localhost(:\d+)/; url.localhost + $1 + '/' + stub_pwd + when /^localhost/; url.localhost + when /^webrick/; url.webrick + when /^path/; url.webserv_map_pwd + else url.webserv_map_pwd + end + end + def images + '../_sisu/image' + end + def images_local + if FileTest.directory?(defaults[:image_local]) + if @@image_flag + require 'ftools' + images=Dir.glob("#{defaults[:image_local]}/*.{png,jpg,gif}") + pth="#{path.webserv}/#@stub_pwd" + File.mkpath("#{pth}/_sisu/image_local") unless FileTest.directory?("#{pth}/_sisu/image_local") + images.each { |i| File.install(i,"#{pth}/#{i}") } unless images.length > 0 + @@image_flag=false + end + '../_sisu/image_local' + else + if @@local_image==true + cmd=if @cmd; @cmd + else '' + end + tell=SiSU_Screen::Ansi.new(cmd,"WARNING - no local image directory or images:", defaults[:image_local] ) + tell.warn unless cmd =~/q/ + @@local_image=false + end + url.images + end + end + #def images_external #url_images_external #ex defaults url.path_png + # '../_sisu/image_external' + #end + def images_external + if FileTest.directory?(image_external) + if @@image_flag + require 'ftools' + images=Dir.glob("#{image_external}/*.{png,jpg,gif}") + pth="#{path.webserv}/#@stub_pwd" + File.mkpath("#{pth}/_sisu/image_external") unless FileTest.directory?("#{pth}/_sisu/image_external") + images.each { |i| File.install(i,"#{pth}/#{i}") } unless images.length > 0 + @@image_flag=false + end + '../_sisu/image_external' + else + if @@local_image==true + tell=SiSU_Screen::Ansi.new(@cmd,"WARNING - image directory for external images or no such images:", :image_external ) + tell.warn unless @cmd =~/q/ + @@local_image=false + end + url.images_external + end + end + self + end + def digest + def type + if defined? @rc['default']['digest'] and @rc['default']['digest'] != nil + case @rc['default']['digest'] + when /^sha(?:2|256)?$/; 'sha256' + when /^md5$/; 'md5' + else 'md5' + end + else 'md5' + end + end + def length + case digest.type + when /sha256/; 64 + when /md5/; 32 + else 32 + end + end + def pattern + "[0-9a-f]{#{digest.length}}" + end + self + end + def program + def text_editor + if defined? @rc['program_select']['editor'] and @rc['program_select']['editor'] =~/\S\S+/ + @rc['program_select']['editor'] + elsif defined? @rc['program_select']['text_editor'] and @rc['program_select']['text_editor'] =~/\S\S+/ + @rc['program_select']['text_editor'] + else 'editor' #'gvim -c :R -c :S' + end + end + def pdf_viewer + if defined? @rc['program_select']['pdf_viewer'] and @rc['program_select']['pdf_viewer'] =~/\S\S+/ + @rc['program_select']['pdf_viewer'] + else 'pdf-viewer' #'evince' + end + end + def web_browser + if defined? @rc['program_select']['www_browser'] and @rc['program_select']['www_browser'] =~/\S\S+/ + @rc['program_select']['www_browser'] + elsif defined? @rc['program_select']['web_browser'] and @rc['program_select']['web_browser'] =~/\S\S+/ + @rc['program_select']['web_browser'] + else 'x-www-browser' #'kazehakase' 'galeon' + end + end + def www_browser + web_browser + end + def console_web_browser + if defined? @rc['program_select']['console_www_browser'] and @rc['program_select']['console_www_browser'] =~/\S\S+/ + @rc['program_select']['console_www_browser'] + elsif defined? @rc['program_select']['console_web_browser'] and @rc['program_select']['console_web_browser'] =~/\S\S+/ + @rc['program_select']['console_web_browser'] + else 'console-www-browser' #'links2' 'elinks' 'epiphany' + end + end + def console_www_browser + web_browser + end + def xml_viewer + if defined? @rc['program_select']['xml_viewer'] and @rc['program_select']['xml_viewer'] =~/\S\S+/ + @rc['program_select']['xml_viewer'] + else text_editor + end + end + def xml_editor + xml_viewer + end + def odf_viewer + if defined? @rc['program_select']['odf_viewer'] and @rc['program_select']['odf_viewer'] =~/\S\S+/ + @rc['program_select']['odf_viewer'] + else 'oowriter' #'odf-viewer','oowriter' + end + end + def file_encoding #file encoding + is='' + if defined? @rc['program_set']['file_encoding']; is=@rc['program_set']['encoding'] + end + if is.nil? or is==true; is='encoding' + end + is + end + def wc #wordcount + is='' + if defined? @rc['program_set']['wc']; is=@rc['program_set']['wc'] + end + if is.nil? or is==true; is='wc' + end + is + end + def tidy + if defined? @rc['program_set']['tidy']; is=@rc['program_set']['tidy'] + end + if is.nil? or is==true; is='tidy' + end + is + end + def rexml #should be part of ruby 1.8 but apparently not always + is=if FileTest.directory?("#{Config::CONFIG['rubylibdir']}/rexml") #Config::CONFIG['sitedir'] + true + else false + end + is=if defined? @rc['program_set']['rexml']; @rc['program_set']['rexml'] + else '' + end + if is.nil? or is==true; is='rexml' + end + is + end + def pdflatex + is=if defined? @rc['program_set']['pdflatex']; @rc['program_set']['pdflatex'] + else '' + end + if is.nil? or is==true; is='pdflatex' + end + is + end + def postgresql + is=if defined? @rc['program_set']['postgresql']; @rc['program_set']['postgresql'] + else '' + end + if is.nil? or is==true; is='postgresql' + end + is + end + def sqlite + is=if defined? @rc['program_set']['sqlite']; @rc['program_set']['sqlite'] + else '' + end + if is.nil? or is==true; is='sqlite' + end + is + end + self + end + def i18n + def language # language settings +## + m=/.+\/\S+?\~(\S+)/ + pwd=Dir.pwd + conf=if defined? @rc['default']['language']; @rc['default']['language'] + else nil + end + l=if pwd=~m ; pwd[m1,1] #2 directory: by visible directory name + elsif conf; @rc['default']['language'] #3 config: from sisurc.yaml + else defaults[:language] #4 sisu: program default + end #1 document: param gets + SiSU_Env::Standardise_language.new(l) + end + def multilingual + if defined? @rc['default']['multilingual'] and @rc['default']['multilingual'] != nil; @rc['default']['multilingual'] + else defaults[:multilingual] + end + end + def lang_filename(l) + @lang={} + x=if multilingual + x=if defined? @rc['default']['language_file'] and @rc['default']['language_file'] != nil; @rc['default']['language_file'] + else 1 + end + else 0 + end + if (l != defaults[:language_code]) or (language.code != defaults[:language_code]) #watch + if x==1; @lang[:pre],@lang[:mid],@lang[:post]="#{l}.",'','' + elsif x==2; @lang[:pre],@lang[:mid],@lang[:post]='',".#{l}",'' + elsif x==3; @lang[:pre],@lang[:mid],@lang[:post]='','',".#{l}" + else @lang[:pre],@lang[:mid],@lang[:post]='','','' + end + else @lang[:pre],@lang[:mid],@lang[:post]='','','' + end + @lang + end + self + end + def file_encoding + is='' + if defined? @rc['program_set']['file_encoding']; is=@rc['program_set']['encoding'] + end + if is.nil? or is==true; is='encoding' + end + is + end + def papersize # paper settings, default overidden in param if set within document + if defined? @rc['default']['papersize']; @rc['default']['papersize'].downcase + else defaults[:papersize].downcase + end + end + def odf_structure + rm_rf("#{path.processing}/odf") + system("unzip -q #{path.share}/odf/odt.zip -d #{path.processing}") + end + def sisupod_gen(fns_pod) + pwd=Dir.pwd + sisupod_processing_path="#{path.processing}/sisupod" + rm_rf(sisupod_processing_path) if FileTest.directory?(sisupod_processing_path) or FileTest.file?(sisupod_processing_path) + File.mkpath(sisupod_processing_path) unless FileTest.directory?(sisupod_processing_path) + if FileTest.file?("#{Dir.pwd}/#{fns_pod}") + system("unzip -q #{Dir.pwd}/#{fns_pod} -d #{path.processing}") + else + tell=SiSU_Screen::Ansi.new('',"file not found: #{fns_pod}") + tell.warn unless @cmd=~/q/ + end + sisupod_processing_path + end + end + class Info_processing_flag + attr_accessor :color,:cf_0,:cf_1,:cf_2,:cf_3,:cf_4,:cf_5 + def initialize + @rc=Get_init.instance.yamlrc + end + def color #processing flag shortcuts + if defined? @rc['flag']['color']; @rc['flag']['color'] + else false + end + end + def cf_0 #processing flag shortcuts + if defined? @rc['flag']['default'] and + not (@rc['flag']['default'].nil? or @rc['flag']['default'].empty?) + @rc['flag']['default'] + else '-NhwpAobxXyYv' + end + end + def cf_1 #processing flag shortcuts + if defined? @rc['flag']['i'] and + not (@rc['flag']['i'].nil? or @rc['flag']['i'].empty?) + @rc['flag']['i'] + else '-NhwpAoy' #'-Nhwpy' + end + end + def cf_2 #processing flag shortcuts + if defined? @rc['flag']['ii'] and + not (@rc['flag']['ii'].nil? or @rc['flag']['ii'].empty?) + @rc['flag']['ii'] + else '-NhwpAobxXy' # '-NhwpAoy' + end + end + def cf_3 #processing flag shortcuts + if defined? @rc['flag']['iii'] and + not (@rc['flag']['iii'].nil? or @rc['flag']['iii'].empty?) + @rc['flag']['iii'] + else '-NhwpAobxXyY' + end + end + def cf_4 #processing flag shortcuts + if defined? @rc['flag']['iv'] and + not (@rc['flag']['iv'].nil? or @rc['flag']['iv'].empty?) + @rc['flag']['iv'] + else '-NhwpAobxXDyY --import' + end + end + def cf_5 #processing flag shortcuts + if defined? @rc['flag']['v'] and + not (@rc['flag']['v'].nil? or @rc['flag']['v'].empty?) + @rc['flag']['v'] + else '-NhwpAobxXDyY --update' + end + end + end + class Info_settings < Info_env + def permission?(prog) #program defaults + if defined? @rc['permission_set'][prog]; @rc['permission_set'][prog] + else false + end + end + def program?(prog) #program defaults + if defined? @rc['program_set'][prog]; @rc['program_set'][prog] + else false + end + end + end + class File_map < Info_env + attr_accessor :local_sisu_source + def initialize(opt='') #watch + super() + @opt=opt #,opt.fns,opt.cmd + #@file=@opt.fns #not always fns + @env=if @opt.fns and not @opt.fns.empty? + SiSU_Env::Info_env.new(@opt.fns) + else + SiSU_Env::Info_env.new('dummy.sst') + end + if @opt.cmd =~/m/; @md=SiSU_Param::Parameters.new(@opt).get + end + ft=[] + if @md and defined? @md.fn and @md.fn # used for multilingual + if @md.cmd =~ /[hH]/; ft << @md.fn[:html] + end + if @md.cmd =~ /w/ and @md.cmd !~ /[hH]/; ft << @md.fn[:concordance] + end + if @md.cmd =~ /y/ and @md.cmd !~ /[hH]/; ft << @md.fn[:manifest] + end + if @md.cmd =~ /p/; ft << @md.fn[:pdf_l] << @md.fn[:pdf_p] + end + if @md.cmd =~ /x/; ft << @md.fn[:sax] + end + if @md.cmd =~ /X/; ft << @md.fn[:dom] + end + if @md.cmd =~ /b/; ft << @md.fn[:xhtml] + end + if @md.cmd =~ /[aAeE]/; ft << @md.fn[:plain] + end + if @md.cmd =~ /[g]/; ft << @md.fn[:wiki] + end + if @md.cmd =~ /N/; ft << @md.fn[:digest] + end + if @md.cmd =~ /o/; ft << @md.fn[:odf] + end + if @md.cmd =~ /s/; ft << @md.fns + end + if @md.cmd =~ /S/; ft << 'sisupod.zip' << '.kdi' + end + @fnb=@md.fnb + else # still needed where/when param is not parsed + if @opt.cmd =~ /[hH]/; ft << '.html' << '.html.??' + end + if @opt.cmd =~ /w/ and @opt.cmd !~ /[hH]/; ft << 'concordance.html' << '??.concordance.html' << 'concordance.??.html' + end + if @opt.cmd =~ /y/ and @opt.cmd !~ /[hH]/; ft << 'sisu_manifest.html' << '??.sisu_manifest.html' << 'sisu_manifest.??.html' + end + if @opt.cmd =~ /p/; ft << 'landscape.pdf' << 'portrait.pdf' << '.pdf' + end + if @opt.cmd =~ /x/; ft << 'sax.xml' << '??.sax.xml' << 'sax.??.xml' + end + if @opt.cmd =~ /X/; ft << 'dom.xml' << '??.dom.xml' << 'dom.??.xml' + end + if @opt.cmd =~ /b/; ft << 'scroll.xhtml' << '??.scroll.xhtml' << 'scroll.??.xhtml' + end + if @opt.cmd =~ /[aAeE]/; ft << 'plain.txt' << '??.plain.txt' << 'plain.??.txt' + end + if @opt.cmd =~ /[g]/; ft << 'wiki.txt' << '??.wiki.txt' << 'wiki.??.txt' + end + if @opt.cmd =~ /N/; ft << 'digest.txt' << '??.digest.txt' << 'digest.??.txt' + end + if @opt.cmd =~ /o/; ft << 'opendocument.odt' << '??.opendocument.odt' << 'opendocument.??.odt' + end + if @opt.cmd =~ /s/; ft << '.sst' << '.ssi' << '.ssm' + end + if @opt.cmd =~ /S/; ft << 'sisupod.zip' << '.kdi' + end + if @opt.mod.inspect =~ /sxm|sxs|xml/; ft << @fnb << '.sxs.xml' + end + if @opt.mod.inspect =~ /sxd/; ft << @fnb << '.sxd.xml' + end + if @opt.mod.inspect =~ /sxn/; ft << @fnb << '.sxn.xml' + end + end + ft=ft.uniq + filetypes=ft.join(',') + @filetypes=if filetypes !~/..+/; '' # -r called alone, copy all + elsif @opt.cmd =~/u/; '' # -u added, copy all, (used to create remote directory tree see output path), not the usual function of -u + elsif filetypes =~/\S+?,\S+/; '*{' + filetypes + '}' # more than one relevant file type + else '*' + filetypes # one relevant file type + end + @source_path=if @fnb and not @fnb.empty?; "#{@env.path.output}/#@fnb" + else @env.path.output + end + @local_sisu_source=if @filetypes =~/\S/; "#@source_path/#@filetypes" + else @source_path + end + end + end + class Clean_output + require 'fileutils' + include FileUtils::Verbose + def initialize(opt) + @opt=opt + z=File_map.new(@opt) + @zap=z.local_sisu_source + if @opt.cmd =~ /[hH]/ + @zap=Dir.glob(@zap).join(' ') + if @opt.cmd !~ /w/; @zap.gsub!(/#@source_path\/concordance.html/,'') + end + end + @env=SiSU_Env::Info_env.new + end + def zap + if @zap !~/\/\//; rm_rf(@zap) if FileTest.directory?(@zap) + else puts 'suspect zap request, ignored' + end + #Dir.unlink(@zap) if FileTest.directory?(@zap) + #System_call.new(@zap,'',@cmd).rm + end + def zap_map + if @opt.fnb and not @opt.fnb.empty? + sm="#{@env.path.output}/sitemaps/sitemap_#{@opt.fnb}.xml" + rm(sm) if FileTest.file?(sm) + end + end + end + class Info_remote_host + def initialize + @rc=Get_init.instance.yamlrc + end + def remote_host #see Info_remote remote_host_base_general + r={} + r=if (defined? @rc['remote']['user'] and defined? @rc['remote']['host']) + r[:user]=@rc['remote']['user'] + r[:host]=@rc['remote']['host'] + r[:path]=if defined? @rc['remote']['path'] + @rc['remote']['path'] + else '' + end + r[:name]="#{r[:user]}@#{r[:host]}:#{r[:path]}" + r + else + r[:name]='.' + r[:user]='' + r[:host]='' + r[:path]='' + r + #puts "no remote host or user" + end + end + end + class Info_remote < File_map + @@flag_remote=false + require 'socket' + def initialize(opt) + super(opt) # + @opt=opt + @rc=Get_init.instance.yamlrc + end + def remote_host_base_general + SiSU_Env::Info_remote_host.new.remote_host + end + def remote_host_base + remote=remote_host_base_general + #host_ip=IPSocket.getaddress(remote[:host]) unless remote[:host].empty? + @@flag_remote=true if remote[:name] =~/\S+@\S+/ #and host_ip =~/\d+\.\d+\.\d+\.\d+/ #very naive check should be enough /[0-255]+\.[0-255]+\.[0-255]+\.[0-255]+/ + #remote[:name] + remote_host_base_general[:name] + end + def scp #sort out later using ruby libraries #not ideal, first time each file is sent, -r must be called separately for subdir to be built + input=@local_sisu_source + output=case @opt.cmd + when /u/; "#{self.remote_host_base}/#{@env.path.stub_pwd}/." #creates remote directory tree, this is not the usual function of u + when /[aAbeEhHNopwxXy]/; "#{self.remote_host_base}/#{@env.path.stub_pwd}/#{@fnb}/." + else "#{self.remote_host_base}/#{@env.path.stub_pwd}/." + end + if (input =~/\S/ and input !~/\/\//) and (output =~/\S/ and output !~/\/\//) and @@flag_remote==true and @opt.cmd !~/U/ + System_call.new(input,output).scp + elsif @opt.cmd =~/U/; puts "#{input} -> #{output}" + else puts 'suspect scp request, ignored' + end + end + def rsync + input=@source_path + output="#{self.remote_host_base}/#{@env.path.stub_pwd}/." + if (input =~/\S/ and input !~/\/\//) and (output =~/\S/ and output !~/\/\//) and @@flag_remote==true and @opt.cmd !~/U/ + System_call.new(input,output,@opt.cmd).rsync('--delete-after') + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "#{input} -> #{output}" + else + puts 'suspect rsync request, ignored' + puts "#{input} -> #{output} remote flag: #@@flag_remote" + puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + def scp_base #base site + input=@source_path + output="#{remote_host_base}/#{@env.path.stub_pwd}/." + if defined? @rc['permission_set']['remote_base_site'] and @rc['permission_set']['remote_base_site'] and @@flag_remote==true and @opt.cmd !~/U/ + puts "begin scp_base: #{input} -> #{output}" + System_call.new("#{input}/#{@env.path.style}/",output).scp + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "begin scp_base: #{input} -> #{output}" + puts "#{input}/#{@env.path.style}/ -> #{output}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + def scp_base_all #base site + input=@source_path + output="#{remote_host_base}/#{@env.path.stub_pwd}/." + if defined? @rc['permission_set']['remote_base_site'] and @rc['permission_set']['remote_base_site'] and @@flag_remote==true and @opt.cmd !~/U/ + puts "begin scp_base_all: #{input} -> #{output}" + System_call.new("#{input}/_sisu/image/",output).scp + System_call.new("#{input}/_sisu/image_local/",output).scp + System_call.new("#{input}/#{@env.path.style}/",output).scp + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "scp_base_all: #{input} -> #{output}" + puts "#{input}/_sisu/image/ -> #{output}" + puts "#{input}/_sisu/image_local/ -> #{output}" + puts "#{input}/#{@env.path.style}/ -> #{output}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + def rsync_base #base site + input=@source_path + output="#{remote_host_base}/#{@env.path.stub_pwd}/." + if defined? @rc['permission_set']['remote_base_site'] and @rc['permission_set']['remote_base_site'] and @@flag_remote==true and @opt.cmd !~/U/ + #puts "begin rsync_base: #{input} -> #{output}" + #System_call.new("#{input}/_sisu/image/",output).rsync + #System_call.new("#{input}/_sisu/image_local/",output).rsync + #System_call.new("#{input}/#{@env.path.style}/",output).rsync + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "rsync_base: #{input} -> #{output}" + puts "#{input}/_sisu/image/ -> #{output}" + puts "#{input}/_sisu/image_local/ -> #{output}" + puts "#{input}/#{@env.path.style}/ -> #{output}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + def rsync_base_sync #base site + input=@source_path + output="#{remote_host_base}/#{@env.path.stub_pwd}/." + if defined? @rc['permission_set']['remote_base_site'] and @rc['permission_set']['remote_base_site'] and @@flag_remote==true and @opt.cmd !~/U/ + puts "begin rsync_base_sync: #{input} -> #{output}" + System_call.new("#{input}/_sisu/image/",output).rsync('--delete-after') + System_call.new("#{input}/_sisu/image_local/",output).rsync('--delete-after') + System_call.new("#{input}/#{@env.path.style}/",output).rsync('--delete-after') + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "rsync_base_sync: #{input} -> #{output}" + puts "#{input}/_sisu/image/ -> #{output}" + puts "#{input}/_sisu/image_local/ -> #{output}" + puts "#{input}/#{@env.path.style}/ -> #{output}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + def rsync_sitemaps #sitemap directory + input="#@source_path/sitemapindex.xml" + output="#{remote_host_base}/#{@env.path.stub_pwd}/." + if @@flag_remote + #if defined? @rc['permission_set']['remote_base_site'] and @rc['permission_set']['remote_base_site'] #and @@flag_remote==true and @opt.cmd !~/U/ + System_call.new(input,output).rsync('--delete-after') + elsif @opt.cmd =~/U/ + puts "#{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + puts "rsync_sitemaps: #{input} -> #{output}" + else puts "permission not granted #{__FILE__} #{__LINE__}" if @opt.cmd =~/M/ + end + end + end + class Info_version <Info_env + require 'rbconfig' + def get_version + require 'ftools' + @version={} + @pwd=ENV['PWD'] + yst_etc="#{defaults[:sisu_etc]}/version.yml" + lib_path=`echo $RUBYLIB`.split(':') + if File.exist?(yst_etc); @version=YAML::load(File::open(yst_etc)) #unless @@noyaml + end + @version + end + def rbversion + #Config::CONFIG['ruby_version'] + %x{ruby -v}.strip + end + end + class Create_system_link #< Info_env #revisit problems created 2004w41 + def initialize + @env=SiSU_Env::Info_env.new + end + def images + File.mkpath("#{@env.path.output}/_sisu") unless FileTest.directory?("#{@env.path.output}/_sisu") + File.symlink("../../_sisu/image", "#{@env.path.output}/_sisu/image") unless File.symlink?("#{@env.path.output}/_sisu/image") + end + def man_forms + #File.symlink("../../man/form", "#{@env.path.output}/man/form") unless File.symlink?("#{@env.path.output}/man/form") == true + end + def man_pdf + #File.symlink("../../man/form", "#{@env.path.output}/man/pdf") unless File.symlink?("#{@env.path.output}/man/pdf") == true + end + end + class Info_file < Info_env + def initialize(fns='') + @env=SiSU_Env::Info_env.new + @fns=fns + end + def basefilename + m=/(.+?)\.(?:[_-]?sst|ssm)$/m + fnb=@fns[m,1] + end + def project + "#{@env.development}/sisu.lnk" + end + def project_info + "#{@env.datapriv_i}/sisu.er3" + end + def project_todo + "#{@env.development}/todo.txt" + end + def admin_self + "#{@env.path.home}/.corundum/dots.lnk" + end + def admin_root + '/root/.corundum/admin.txt' + end + end + class Info_db < Info_env + @@rc=nil + def initialize + @@pwd ||=Dir.pwd + @pwd=Dir.pwd + @env=SiSU_Env::Info_env.new + m=/.+\/(\S+)/m + @pwd_stub=@pwd[m,1] + @rc=@@rc ||=Get_init.instance.yamlrc + @defaults=Info_env.new.defaults + end + def user + @env.user + end + def db_psql + "SiSU_#@pwd_stub" + end + def db_mysql + 'lm' + end + def db_sqlite + "#{@env.path.webserv}/#@pwd_stub/sisu_sqlite.db" + end + def port_psql #PGPORT + if defined? @rc['db']['postgresql']['port'] and @rc['db']['postgresql']['port'] =~/\d+/ + @rc['db']['postgresql']['port'] + else @defaults[:postgresql_port] + end + end + def port_mysql + '**' + end + def dbi_psql + "DBI:Pg:database=#{db_psql};port=#{port_psql}" + end + def dbi_mysql + "dbi:Mysql:database=#{db_mysql};port=#{port_mysql}" + end + def dbi_sqlite + "DBI:SQLite:#{db_sqlite}" #sqlite3 ? + end + end + class Info_port < Info_env + def initialize + @env=SiSU_Env::Info_env.new + end + def webrick + @env.url.webrick_port + end + end + class Info_program < Info_env #revisit + attr_accessor :editor,:wc,:tidy,:rexml,:pdflatex,:postgresql,:sqlite + def initialize + prog=SiSU_Env::Info_env.new.program + @editor,@wc,@tidy,@rexml,@pdflatex,@postgresql,@sqlite=prog.text_editor,prog.wc,prog.tidy,prog.rexml,prog.pdflatex,prog.postgresql,prog.sqlite + end + end + class Info_skin + def initialize(md=nil,skin=nil) + @md=md + @d_sk=if skin.class==String ; skin + elsif defined? md.doc_skin and md.doc_skin; md.doc_skin + else nil + end + @home,@pwd=ENV['HOME'],ENV['PWD'] + m=/.+\/(\S+)/m + @pwd_stub=@pwd[m,1] + @env=SiSU_Env::Info_env.new + end + def select # skin loading logic here + load SiSU_lib + '/defaults.rb' + skin_path=[] + @env.sys.rc_path.each{|x| skin_path << "#{x}/skin"} + skin_path << "#{@env.path.processing}/external_document/skin" + #skin_path << "#{@env.path.processing}/external_document/_sisu/skin" #revisit + skin=true + if @pwd_stub =~/^sisupod$/ and @md.mod.inspect !~/--trust/; skin=false #security only run skins on sisupod if --trust flag is provided + end + doc_skin,dir_skin=nil,nil + if skin + unless @d_sk.nil? + sk_doc="doc/#@d_sk.rb" + skin_path.each do |v| #document skin priority 1 + if FileTest.file?("#{v}/#{sk_doc}") + doc_skin="#{v}/#{sk_doc}" + load doc_skin + break + end + end + end + unless doc_skin + sk_dir="dir/skin_#@pwd_stub.rb" + skin_path.each do |v| #directory skin priority 2 + if FileTest.file?("#{v}/#{sk_dir}") + dir_skin="#{v}/#{sk_dir}" + load dir_skin + break + end + end + end + end + sk=if doc_skin; doc_skin + elsif dir_skin; dir_skin + else nil + end + end + end + class CSS_default + def html + 'html.css' + end + def html_tables + 'html_tables.css' + end + def xhtml + 'xhtml.css' + end + def xml_sax + 'sax.css' + end + def xml_dom + 'dom.css' + end + def docbook_xml + 'docbook.css' + end + def homepage + 'index.css' + end + end + class CSS_select < Info_env + def initialize(md) + @md=md + @env=SiSU_Env::Info_env.new + end + def html + css=if @md.doc_css and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_html.css") + "#{@md.doc_css}_html.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_html.css") + "#{@env.path.stub_pwd}_html.css" + else CSS_default.new.html + end + end + def html_tables + css=if @md.doc_css and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_html_tables.css") + "#{@md.doc_css}_html_tables.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_html_tables.css") + "#{@env.path.stub_pwd}_html_tables.css" + else CSS_default.new.html_tables + end + end + def xhtml + css=if @md.doc_css and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_xhtml.css") + "#{@md.doc_css}_xhtml.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_xhtml.css") + "#{@env.path.stub_pwd}_xhtml.css" + else CSS_default.new.xhtml + end + end + def xml_sax + css=if @md.doc_css and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_xml_sax.css") + "#{@md.doc_css}_xml_sax.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_xml_sax.css") + "#{@env.path.stub_pwd}_xml_sax.css" + else CSS_default.new.xml_sax + end + end + def xml_dom + css=if @md.doc_css and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_xml_dom.css") + "#{@md.doc_css}_xml_dom.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_xml_dom.css") + "#{@env.path.stub_pwd}_xml_dom.css" + else CSS_default.new.xml_dom + end + end + def docbook_xml + css=if @md.doc_css and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_docbook.css") + "#{@md.doc_css}_xml_dom.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_docbook.css") + "#{@env.path.stub_pwd}_docbook.css" + else CSS_default.new.docbook_xml + end + end + def homepage + css=if @md.doc_css and FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@md.doc_css}_homepage.css") + "#{@md.doc_css}_homepage.css" + elsif FileTest.file?("#{@env.path.output}/#{@env.path.style}/#{@env.path.stub_pwd}_homepage.css") + "#{@env.path.stub_pwd}_homepage.css" + else CSS_default.new.homepage + end + end + end + class CSS_stylesheet + def initialize(md) + @md=md + @css=CSS_select.new(@md) + @env=SiSU_Env::Info_env.new + end + def html + %{ <link rel="stylesheet" href="../#{@env.path.style}/#{@css.html}" type="text/css" />} + end + def html_tables + %{ <link rel="stylesheet" href="../#{@env.path.style}/#{@css.html_tables}" type="text/css" />} + end + end + class SiSU_file <Info_env #todo unify with Create_file + def initialize(md,fno='') + begin + @fno,@fns,@fnb=fno,md.fns,md.fnb + @env=SiSU_Env::Info_env.new(@fns) + @env_out="#{@env.path.output}/#@fnb" + rescue; STDERR.puts SiSU_Screen::Ansi.new(@cmd,$!,$@).rescue + ensure + end + end + def make_file(path,filename) + if File.writable?("#{path}/."); File.new("#{path}/#{filename}",'w+') + else + SiSU_Screen::Ansi.new('',"is the file or directory writable?, could not create #{filename}").warn + end + end + def touch_file(path,filename) + if File.writable?("#{path}/."); + system("touch #{path}/#{filename}") + #File.new("#{path}/#{filename}",'w+') + else + SiSU_Screen::Ansi.new('',"is the file or directory writable?, could not create #{filename}").warn + end + end + def make_path(path) + File.mkpath(path) unless FileTest.directory?(path) + end + def mkdir_initialize # not used but consider using + File.mkpath(@env.path.output) unless FileTest.directory?(@env.path.output) + File.mkpath("#{@env.path.output}/#@fnb") unless FileTest.directory?("#{@env.path.output}/#@fnb") + File.mkpath("#{@env.path.output}/#{@env.path.style}") unless FileTest.directory?("#{@env.path.output}/#{@env.path.style}") + File.mkpath(@env.path.dal) unless FileTest.directory?(@env.path.dal) + File.mkpath(@env.path.tune) unless FileTest.directory?(@env.path.tune) + end + def mkdir + dir=@env.path.output + txt_path="#{dir}/#@fnb" + File.mkpath(dir) unless FileTest.directory?(dir) + File.mkpath(txt_path) unless FileTest.directory?(txt_path) + File.mkpath("#{dir}/#{@env.path.style}") unless FileTest.directory?("#{dir}/#{@env.path.style}") + File.mkpath(@env.path.dal) unless FileTest.directory?(@env.path.dal) + File.mkpath(@env.path.tune) unless FileTest.directory?(@env.path.tune) + end + def mkfile #consider using more + path="#{@env.path.output}/#@fnb" + filename=@fno + file=make_file(path,filename) + end + def mkfile_pwd + path=Dir.pwd + filename=@fno + file=make_file(path,filename) + end + end + class Create_file <Info_env #todo unify with SiSU_file + def initialize(cmd,fns,operation='') + @cmd=cmd + begin + super(fns) + @env=SiSU_Env::Info_env.new(fns) + ver=Info_version.new + case operation #watch + when /pdf/; @env_out='' + when /sql/ + when /xml|plaintext|ascii/; @env_out="#{@env.path.output}/#@fnb" #check change of name to plaintext from ascii + else + if defined? @md.sfx_src and @md.sfx_src =~/ss[ftsumc]/ + @env_suf='lm' + @env_out_root=@env.path.output + @env_out="#{@env.path.output}/#@fnb" + @env_tex=@env.path.tex + @env_lout=@env.path.lout + @@publisher='SiSU http://www.jus.uio.no/sisu' + @env_pdf="#@env_out_root/pdf" + end + end + rescue; STDERR.puts SiSU_Screen::Ansi.new(@cmd,$!,$@).rescue + ensure + end + end + def param_instantiate + @cX||=SiSU_Screen::Ansi.new(@cmd) + @@date=Info_date.new + @@proc=@@filename_txt=@@filename_texinfo=@@filename_lout_portrait=@@filename_lout_landscape=@@filename_html_scroll=@@filename_html_index=@@filename_html_segtoc=@@filename_semantic=@@filename_rss=@@newfile=@@drr=@@yaml=@@yamladdr=nil + @@publisher='SiSU scribe' + end + def html_root + #@env.path.output + end + def mkdir_pdf + Dir.mkdir(@env.path.tex) unless FileTest.directory?(@env.path.tex) + end + def file_generic(output_file='') + filename="#{@env.path.output}/#@fnb/#{output_file}" + File.new(filename,'w+') + end + def file_error + File.new('/tmp/errorlog.sisu','w+') + end + def file_meta + File.new("#{@env.path.dal}/#@fns.meta",'w+') + end + def file_note + File.new("#{Dir.pwd}/#@fns.fn",'w+') + end + def marshal_meta + "#{@env.path.dal}/#@fns.meta.rbm" + end + def meta + "#{@env.path.dal}/#@fns.meta" + end + def file_tune + File.new("#{@env.path.tune}/#@fns.tune",'w+') + end + def marshal_tune + "#{@env.path.tune}/#@fns.marshal_tune" + end + def file_semantic + filename_semantic="./semantic.yaml" + @@filename_semantic=File.new(filename_semantic,'w+') + end + def file_rss + filename_rss="./semantic.xml" + @@filename_rss=File.new(filename_rss,'w+') + end + def file_html_scroll(md) + filename_scroll="#{@env.path.output}/#{md.fnb}/#{md.fnl[:pre]}doc#{md.fnl[:mid]}.html#{md.fnl[:post]}" + @@filename_html_scroll=File.new(filename_scroll,'w+') + end + def file_html_index(md) + filename_index="#{@env.path.output}/#{md.fnb}/#{md.fnl[:pre]}index#{md.fnl[:mid]}.html#{md.fnl[:post]}" + @@filename_html_index=File.new(filename_index,'w+') + end + def file_html_segtoc(md) + filename_segtoc="#{@env.path.output}/#{md.fnb}/#{md.fnl[:pre]}toc#{md.fnl[:mid]}.html#{md.fnl[:post]}" + File.new(filename_segtoc,'w+') + end + def file_texinfo + File.new("#{@env.path.texinfo}/#@fnb.texinfo",'w+') + end + end + class Create_site < Info_env + require SiSU_lib + '/css' + include SiSU_Style + def initialize(cmd) + @cmd=cmd + @env=SiSU_Env::Info_env.new + @home,@pwd=ENV['HOME'],ENV['PWD'] #@pwd=Dir.pwd + @rc=Get_init.instance.yamlrc + @vz=SiSU_Env::Get_init.instance.skin + @vz_home=SiSU_Viz::Home.new + end + def homepage + homepage_path=nil + @env.sys.rc_path.each do |v| + if FileTest.file?("#{v}/home/index.html") + homepage_path="#{v}/home/index.html" + break + end + end + File.mkpath("#{@env.path.webserv}/#{@env.path.stub_pwd}") unless FileTest.directory?("#{@env.path.webserv}/#{@env.path.stub_pwd}") + if homepage_path and FileTest.file?(homepage_path) + cp(homepage_path,"#{@env.path.webserv}/#{@env.path.stub_pwd}/index.html") + cp(homepage_path,"#{@env.path.webserv}/#{@env.path.stub_pwd}/toc.html") + else + doc_skin=nil + sk_doc='doc/skin_sisu.rb' + @env.sys.rc_path.each do |v| #document skin priority 1 + if FileTest.file?("#{v}/skin/#{sk_doc}") + doc_skin="#{v}/skin/#{sk_doc}" + load doc_skin + break + end + end + filename_homepage=File.new("#{@env.path.webserv}/#{@env.path.stub_pwd}/index.html",'w') + filename_homepage_toc=File.new("#{@env.path.webserv}/#{@env.path.stub_pwd}/toc.html",'w') + filename_homepage << @vz_home.index + filename_homepage_toc << @vz_home.index + end + end + def cp_images(src_path,dest_path) + if FileTest.directory?(src_path) + cd(src_path) + source=Dir.glob("*.{png,jpg,gif,ico}") + File.mkpath(dest_path) unless FileTest.directory?(dest_path) + chmod(0755,dest_path) + source.each do |i| + cp_r(i,"#{dest_path}/#{i}") + chmod(0644,"#{dest_path}/#{i}") + end + cd(@pwd) + else puts "\tWARN, did not find - #{src_path}" + end + end + def cp_local_images + src="#@pwd/_sisu/image" + dest="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image_local" + cp_images(src,dest) + end + def cp_external_images + src="#{@env.path.processing}/external_document/image" + dest="#{@env.path.webserv}/#{@env.path.stub_pwd}/_sisu/image_external" + cp_images(src,dest) + end + def cp_webserver_images + src=@env.path.image_source + dest="#{@env.path.webserv}/_sisu/image" + cp_images(src,dest) + end + def cp_base_images #fix images + src="#{@env.path.share}/image" + dest="#{@env.path.webserv}/_sisu/image" + cp_images(src,dest) + end + def cp_css + File.mkpath("#{@env.path.output}/#{@env.path.style}") unless FileTest.directory?("#{@env.path.output}/#{@env.path.style}") + css_path=['/etc/sisu/css',"#@home/.sisu/css","#@pwd/_sisu/css"] #BROKEN + if defined? @rc['permission_set']['css_modify'] and @rc['permission_set']['css_modify'] + tell=SiSU_Screen::Ansi.new(@cmd,"modify is css set to: #{@rc['permission_set']['css_modify']}") + css_path.each do |x| + if FileTest.directory?(x) + cd(x) + source=Dir.glob("*.{css}") + source.each do |i| + cp(i,"#{@env.path.output}/#{@env.path.style}") + end + cd(@pwd) + end + end + else tell=SiSU_Screen::Ansi.new(@cmd,"modify css is not set or is set to: false") + end + tell.warn if @cmd=~/[MV]/ + fn_css=SiSU_Env::CSS_default.new + css=SiSU_Style::CSS.new + path_style="#{@env.path.output}/#{@env.path.style}" + File.mkpath(path_style) unless FileTest.directory?(path_style) + style=File.new("#{path_style}/#{fn_css.homepage}",'w') + style << css.homepage + style.close + style=File.new("#{path_style}/#{fn_css.html_tables}",'w') + style << css.html_tables + style.close + style=File.new("#{path_style}/#{fn_css.html}",'w') + style << css.html + style.close + style=File.new("#{path_style}/#{fn_css.xml_sax}",'w') + style << css.xml_sax + style.close + style=File.new("#{path_style}/#{fn_css.xml_dom}",'w') + style << css.xml_dom + style=File.new("#{path_style}/#{fn_css.docbook_xml}",'w') + style << css.docbook_xml + style.close + style=File.new("#{path_style}/#{fn_css.xhtml}",'w') + style << css.xhtml + style.close + end + end +end +module SiSU_Screen + require SiSU_lib + '/screen_text_color' +end +module SiSU_Errors + require SiSU_lib + '/errors' +end +__END__ diff --git a/lib/sisu/0.52/termsheet.rb b/lib/sisu/0.52/termsheet.rb new file mode 100644 index 00000000..6e87a0b8 --- /dev/null +++ b/lib/sisu/0.52/termsheet.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: SiSU information Structuring Universe, specialised pre-processing wrapper + + * NOTE wrapper makes little sense without additional components, additional sample files must be provided - (saved till later as may confuse) + + * 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 +require SiSU_lib + '/sysenv' +require SiSU_lib + '/param' +include SiSU_Param +@do,@done,@used,@html_output,@txt_input,@txt_output,@@report=Array.new(7){[]} +@@info=nil +@c=0 +@cX=SiSU_Screen::Ansi.new('yes').cX +@done << "\n#{@cX.blue_hi}#{@cX.black}Summary#{@cX.off*2}" +def talent(termsheet,flag) + no_ocn='0' if flag =~/0/ #flag to request switch off of text object numbering + @@info=nil + @@info=termsheet.gsub(/(.+?)\.termsheet\.rb/,'../facility_data/\1.html') + @env=SiSU_Env::Info_env.new + @dir_fd="#{@env.path.output}/facility_data" + Dir.mkdir(@dir_fd) unless FileTest.directory?(@dir_fd)==true + html_output=[] + case termsheet + when /.+?\.(termsheet)\.rb$/ + @basename=termsheet[/(.+?)\.termsheet\.rb/, 1] + @standard_form={} + require termsheet + include Termsheet + @standard_form=Termsheet::StandardForms.new.standardforms + puts %{\n#{@@cX.yellow_hi}#{@@cX.black}From#{@@cX.off*2}: #{@@cX.grey_hi}#{@@cX.black}#{@basename}.termsheet.rb#{@@cX.off*3}\n\n} + @standard_form.each do |k,v| + @c+=1 + require v + puts %{\n#{@@cX.blue_hi}#{@@cX.black}Producing the following#{@@cX.off*2}: #{@@cX.green}#{@basename}.#{k}#{@@cX.off}\n\n} + @done << %{\n\t#{@@cX.grey}Documents generated#{@@cX.off}: #{@@cX.cyan}#{@basename}.#{k}#{@@cX.off}\n} + @used << %{\n\t#{@@cX.grey}Using#{@@cX.off}: #{@@cX.ruby}#{v}#{@@cX.off}\n} + html_output=<<WOK +<br /><a href="../#{@basename}.#{k}/landscape.pdf"> +<img border="0" width="18" height="15" src="../_sisu/image/b_pdf.png" alt="pdf landscape"></a> +<a href="../#{@basename}.#{k}/portrait.pdf"> +<img border="0" width="15" height="18" src="../_sisu/image/b_pdf.png" alt="pdf portrait"></a> +<a href="../#{@basename}.#{k}/sisu_manifest.html">#{@basename}.#{k}.sisu_manifest.html</a> +WOK + @html_output << html_output + @txt_input << %{\n\tForm #@c: <url:#{Dir.pwd}/#{v}>\n\t |#{Dir.pwd}/#{v}|@|^|\n} + @txt_output << %{\n\t#{k}: |../#{@basename}.#{k}/sisu_manifest.html|@|^|\n} + @report_file_i=File.new("#@dir_fd/#@basename.txt",'w+') + @report_file_o=File.new("#@dir_fd/#@basename.html",'w+') + @filename_new=File.new("#@basename.#{k}.sst",'w+') + file_array=IO.readlines(v,"\n") + @do << %{#{k}} + @filename_new << @document + # "require v" pulls in the composite @document + # "termsheet" having all the variables required to complete the standard form @document + @filename_new.close + end + @do.each do |x| + system %{sisu -Nhwpo #{@basename}.#{x}.sst\n} + end + else print "not processed --> ", termsheet, "\n" + end + @done << %{\n\t#{@@cX.green}Summary:#{@@cX.off} #{@@cX.blue}#{@env.path.output}/facility_data/#{@basename}.html#{@@cX.off}\n} + @done << %{\n\t#{@@cX.grey}From details provided in#{@@cX.off}: #{@@cX.green}#{termsheet}#{@@cX.off}\n} + terms=%{\nTermsheet: <url:#{Dir.pwd}/#{termsheet}>\n |#{Dir.pwd}/#{termsheet}|@|^|\n} + @report_file_i << "<url:all.txt>\n|all.txt|@|^|\n" << terms << "\nForms:\n" << @txt_input << "\nOutput Files\n" << @txt_output + @report_file_o << %{<a href="toc.html">^</a><br />\n} << @html_output + @@report << @done << @used << "\n" + @done,@used=[],[] +end +require SiSU_lib + '/param' +@argv=$* +@proc="#{@argv[0].to_s}" +if @proc =~ /^-?[wft]/ + @argv.shift + @argv.each do |termsheet| + talent(termsheet,@proc) + end +end +@env=SiSU_Env::Info_env.new +@dir_fd="#{@env.path.output}/facility_data" +@url="#{@env.url.webserv}/facility_data" +@@report << %{\n#{@@cX.grey}See#{@@cX.off}: #{@@cX.blue}#@dir_fd/all.txt\t#@dir_fd/toc.html\t#@dir_fd/#{@@cX.off}\n\n#{@@cX.grey}See#{@@cX.off}: #{@@cX.blue}#@url/all.txt\t#@url/toc.html\t#@url/#{@@cX.off}\n\n} +puts @@report +File.unlink("#@dir_fd/all.txt") if FileTest.file?("#@dir_fd/all.txt") +File.unlink("#@dir_fd/toc.html") if FileTest.file?("#@dir_fd/toc.html") +summary_file=File.new("#@dir_fd/all.txt",'w+') +summary_html=File.new("#@dir_fd/toc.html",'w+') +ls_txt=%x{ls #@dir_fd/*.txt} +report_thlnk=[] +ls_txt.scan(/.+/) +ls_txt.each {|x| report_thlnk << x.gsub!(/#@dir_fd\/(.+)/,"<url:\\1>\n|\\1|@|^|")} +report_thlnk.join("\n") +ls_html=%x{ls #@dir_fd/*.html} +#NOTE is necessary to purge @dir_fd ~myout/faciliytData +report_html=[] +ls_html.split(/.+/) +ls_html.each {|x| report_html << x.gsub!(/#@dir_fd\/(.+)/,'<a href="\1">\1</a><br />')} +report_html.join("\n") +summary_file << "#{report_thlnk}" +summary_html << "#{report_html}" +__END__ +sisu -t x_bank.and.* +e.g. sisu -t x_bank.and.*.termsheet.rb +e.g. sisu_termsheet.rb -t x_bank.and.c*.termsheet.rb +program calls upon termsheet file with extension termsheet.rb +termsheet.rb calls upon relevant standard form files (to be used) with extension .sForm.rb +there is also a standard_terms.rb file - with terms/details that are constant +the file produced is named after the termsheet.rb with that extension replaced with .er30 +from there scribbler.rb is called upon its usual metaVerse html and pdf creation +! :-) +to test run +termsheet.rb -f dev.export.import.trade.facility.termsheet.rb +the term sheet calls the standard form or template that is to be run against it. diff --git a/lib/sisu/0.52/texinfo.rb b/lib/sisu/0.52/texinfo.rb new file mode 100644 index 00000000..ca62710b --- /dev/null +++ b/lib/sisu/0.52/texinfo.rb @@ -0,0 +1,408 @@ +=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: texinfo 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_TexInfo + require SiSU_lib + '/html' + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + #include Stamp ... needed removed arbitrarily 2005w05/1 (warnings about undefined flags) + require SiSU_lib + '/texinfo_format' + include TexInfoFormat + @tex_file=[] + @@tex_backslash="\\\\" + @@tabular="{tabular}" + @@table_pagebreak_counter,@@tex_endnote_call_counter,@@tex_table_flag,@@tex_counter,@@tex_column,@@tex_columns,@@counting=0,0,0,0,0,0,0 + @@column_instruct,@@tex_line_mode,@@tex_word_mode,@@start_table,@@line_mode='','','','','' + @@n,@@copyright,@@tableheader=nil,nil,nil + @@tex_col_w=[] + @@tex_pattern_margin_number="\\\\marginpar.+?\s+" + class Source #Songsheet + include SiSU_Param + include SiSU_Viz + include SiSU_TexInfo + def initialize(opt) + @opt=opt + @env=SiSU_Env::Info_env.new(@opt.fns) + @st={ 'tex'=>{} } + @tex=TexInfoFormat::Texinfo.new + @vz=SiSU_Env::Get_init.instance.skin + end + def directories + begin + case @opt.fns + when /\.[_-]?sst$/ + Dir.mkdir(@env.path.output) unless FileTest.directory?("#{@env.path.output}") + Dir.mkdir(@env.path.texi) unless FileTest.directory?(@env.path.tex) + @@filename_texinfo=File.new(%{#{@env.path.texi}/#@opt.fnb.texinfo},'w+') + end + rescue; STDERR.puts SiSU_Screen::Ansi.new(@opt.cmd,$!,$@).rescue + ensure + end + end + def read + songsheet + end + def songsheet + begin + tell=SiSU_Screen::Ansi.new(@opt.cmd,'TexInfo') + tell.green_title_hi unless @opt.cmd =~/q/ + data=IO.readlines(@opt.fns,'') + @md=SiSU_Param::Parameters.new(@opt).get + puts "\t#{@@cX.grey}TexInfo#{@@cX.off}" + #@@copyright="\n #{@@tex_backslash*2}[3]\\ \\linebreak \\copyright \\ #{@md.copyright_tex}" if @md.copyright_tex #appears to be redundant ! remove 2004w19 + if @md.markup.to_s !~ /url_png/ + my_make=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns) + directories + @marshalfile=my_make.marshal_meta + if FileTest.file?(@marshalfile)==true + File.open(@marshalfile) { |f| @@tuned_file=Marshal.load(f)} + tell.meta_verse_skipped unless @opt.cmd =~/q/ + else + tex_array=IO.readlines(@opt.fns,'') + SiSU_Metaverse.songsheet(tex_array) + end + tex_array=@@tuned_file + Texinfo_make.new(tex_array,@md).songsheet + tex_array='' + end + #@@filename_texinfo.close if @@filename_texinfo + @@filename_texinfo=nil + rescue; STDERR.puts SiSU_Screen::Ansi.new(@opt.cmd,$!,$@).rescue + ensure + @@filename_texinfo.close if @@filename_texinfo + end + end + end + class Texinfo_make + include SiSU_Param + include TexInfoFormat + @@tex_1='(?:.+?)+~' #?? debug + @@tabular="{tabular}" + @@tex_pattern_margin_number="\\\\marginpar.+?\s+" + @@dp=nil + def initialize(data,md) + @data,@md=data,md #fns + @env=SiSU_Env::Info_env.new(@md.fns) + @st={ 'tex'=>{} } + #@tex=TexInfoFormat::Texinfo.new + @vz=SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def songsheet + begin + @data=pre + @data=endnote + @data=markup + @data=tail + output + makeinfo + rescue; STDERR.puts SiSU_Screen::Ansi.new(@md.cmd,$!,$@).rescue + ensure + end + end + def pre + @tex_file=[] + data=@data + data.each do |para| + para.gsub!(/&/,'<=and>') + # DEBUG 2003w16 this is a kludge, because i could not get parameters + # from param, Sort out ... revert to more elegant solution + if para =~ /<!Th?¡\s+c/ + @@flag['tables']='y' # KLUDGE get from param + end + para.gsub!(/<:p[bn]>/,'') + do_mono=TexInfoFormat::Texinfo.new(para,@md) + @tex_file << do_mono.spec_char + end + data=@tex_file.delete_if {|x| x =~ /^0(?:\\)+~/m} + data=@tex_file # ... + end + def endnote + data=@data + @tex_file=[] + data.each do |para| + # BUG bug -> have problems with endnotes in headers + if para =~ /\\~\\\{\d+\s+/ #if para =~ /<!e\s+/ # watch + para.gsub!(/\s*\\~\\\{(\d+)\s+(.+?)<#@dp>\\\}\\~/m,' @footnote{ \2} ') + end + @tex_file << para + end + @tex_file + end + def poem + data=@data + @tex_file=[] + @@counting=0 + data.each do |para| + if para =~ /<:code>/ + @@flag['code']=1 + @@counting=1 + end + if para =~ /<:verse>/ + @@flag['poem']=1 + end + if @@flag['code']==1 + if @@flag['code']==1 and para =~ /<:code[-_](?:end|close)>/ #watch change not tested 200501 + @@flag['code']=0 + end + if @@flag['code']==1 and para =~ /\S/ + sub_array=para.dup + @@line_mode=sub_array.scan(/.+/) + Tune.code_lines(@@line_mode) + para=@@line_mode.join + end + elsif @@flag['poem']==1 + if @@flag['poem']==1 and para =~ /<:verse[-_](?:end|close)>/ #watch change not tested 200501 + @@flag['poem']=0 + end + if @@flag['poem']==1 and para =~ /\S/ + sub_array=para.dup + @@line_mode=sub_array.scan(/.+/) + Tune.code_lines(@@line_mode) + para=@@line_mode.join + end + end + @tex_file << para + end + end + def code_lines + data=@data + data.each do |line| + if line =~ /\S/ and line !~ /<:(code|verse).+/ + if @@flag['code']==1 + line.gsub!(/^\s*(.+)/m, "\\noindent \\marginpar\[left-text\]{\\begin{tiny}#{@@counting}\\end{tiny}}\\1\\") + @@counting+=1 if @@flag['code']==1 + else line.gsub!(/(.+)/m,'\noindent\1\') + end + end + end + end + def tables + data=@data + @tex_file=[] + @@tableheader=0 + data.each do |para| + if para =~ /¡|<!T/i + do_mono=TexInfoFormat::Texinfo.new(para,@md) + para=do_mono.longtable # using longtable latex package + end + @tex_file << para + end + end + def markup + data=@data + @tex_file=[] + md={} + @tex_file << TexInfoFormat::Texinfo.new('',@md).head + mono=TexInfoFormat::Texinfo.new(@md.title,@md) + @tex_file << mono.topnode + texinfo_menu=[] + n_menu,n_submenu=0,0 + @submenu,@subsubmenu={},{} + data.each do |para| + if para =~ /^[1-3]\\+~\S*(.+?)\s*$/ + toc=TexInfoFormat::Texinfo.new($1,@md) + texinfo_menu << toc.menu + end + if para =~ /^[4-6]\\+~\S+\s*(.+?)\s*$/ + toc=TexInfoFormat::Texinfo.new($1,@md) + texinfo_menu << toc.menu + case para + when /^[4]\\+~\S+\s+(.+?)\s*$/ + n_menu+=1 + @submenu[n_menu]=[] + when /^[5]\\+~\S+\s+(.+?)\s*$/ + n_submenu+=1 + @subsubmenu[n_menu]=[] + @submenu[n_menu] << toc.menu + when /^[6]\\+~\S+\s+(.+?)\s*$/ + @subsubmenu[n_submenu] << toc.menu + end + end + end + texinfo_menu.compact! + texinfo_menu << "* Dublin Core::" + @tex_file << texinfo_menu + @tex_file << "* Index::\n" + + "@end menu\n\n" + + "@c {{{ 5\n\n" + n_menu,n_submenu=0,0 + @@do_submenu,@@do_subsubmenu=1,1 + data.each do |para| + mono=TexInfoFormat::Texinfo.new(para,@md) + case para + when /^1\\+/; mono.level1 + when /^2\\+/; mono.level2 + when /^3\\+/; mono.level3 + when /^4\\+~/ + mono.level4 + n_menu+=1 + @@do_submenu,@@do_subsubmenu=1,1 + when /^5\\+/ + n_submenu+=1 + @@do_subsubmenu=1 + if @@do_submenu==1 + menu=TexInfoFormat::Texinfo.new(@submenu[n_menu],@md) + para="#{menu.submenu}#{mono.level5}" + @@do_submenu=0 + else mono.level5 + end + when /^6\\+/ + if @@do_submenu==1 + menu=TexInfoFormat::Texinfo.new(@subsubmenu[n_menu],@md) + para="#{menu.subsubmenu}#{mono.level6}" + @@do_subsubmenu=0 + else + mono.level6 + end + # when /^<!i1!>/ + # mono.indent1 + # when /^<!i2!>/ + # mono.indent2 + # when /<!:\s+/ + # mono.graphics + # when /^\s*<!image\s+/ + # mono.image + # when /\}image/ + # mono.png + # when /\}http/ + # mono.http + else + if para !~/\S/ + para=nil + else + para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>/,'~[\1]') + #para.gsub!(/[1-3]\\\\\{\\\\\{\\\\\{\s+/, '') + #para.gsub!(/[1-3]\\\\\{\s+/, '') + para=para + end + #para.gsub!(/^\s+$/mi, "") + end +#%case with endnotes + para.gsub!(/\s*[0-8]\\+(\S+)?\s+/,' ') if para + @tex_file << para if para + end + data=@tex_file + end + def numbering + data=@data + data=Texinfo_make.new(data,@md).number_titles + #TOGGLE to SWITCH PARAGRAPH NUMBERING (ON & OFF) + data=Texinfo_make.new(data,@md).number_paras \ + if @md.fns !~ /\.e[pdr]00/ and @md.markup !~ /not_to/i + end + def number_titles + data=@data + @tex_file=[] + input=%{#{@md.markup}}[/(num_top\s*=\s*(\d?))?/m,2] # else default usually 4 # this was a bit of a trick required to pass nil to input if nothing matched... #puts input + #input=/(num_top\s*=\s*(\d?))?/m.match(@md[:markup]) [2] # else default usually 4 # this was a bit of a trick required to pass nil to input if nothing matched... #puts input + num_top=input.to_i + t_no1=0; t_no2=0; t_no3=0; t_no4=0; + no1=num_top; no2=(num_top + 1); no3=(num_top + 2); no4=(num_top + 3); + data.each do |para| + if @md.markup =~ /num_top/i and para !~ /0\\+/ + if para =~ /^[1-6]\\+(?:~\S+)?\s*<!h-.+?-!>/ and para !~ /<:\d-endnotes>/ + header=para[/<!h-(.+?)-!>/m, 1].gsub!(/-/m,'.') + para.gsub!(/^(?:[1-6]\\+(?:~\S+)|<:([12356]|4-.+?-)>)\s*<!h-.+?-!>/, + "\\1 #{header} ") + end + elsif para =~ /<!h!>|<!h\d!>|<!h.+?!>|<!!h.+?!>/ + if para =~ /<!h-.+?-!>/ + para.gsub!(/<!h-(.+?)-!>/,'\1 ') + end + end + @tex_file << para + end + data=@tex_file + end + def number_paras + data=@data + @tex_file=[] + paranumber=0 + data.each do |para| + if para =~/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>/ and para !~ /<EOF>/ + parablock,paranum=/(.+?)<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>/im.match(para)[1,2] + do_duo=TexInfoFormat::DuoTex.new(parablock,paranum) ###is BUG + para=do_duo.paraNum if parablock + end + @tex_file << para + end + data=@tex_file + end + def tail + data=@data + tex=TexInfoFormat::Texinfo.new('',@md) + data << tex.dublincore + data << tex.tail + end + def output + data=@data + data.compact! + data.each {|para| (@@filename_texinfo.puts para,"\n") if para} + @@filename_texinfo.close + end + def makeinfo + if @md.fns =~/\.[_-]?sst$/ + m=/(.+?)\.[_-]?sst$/.match(@md.fns) + fnb,sfx=m[1],m[2] + pwd=Dir.pwd + case sfx + when /[_-]?sst$/ + @env=SiSU_Env::Info_env.new(@md.fns,@md.cmd) + Dir.chdir(@env.path.texi) + texinfo=SiSU_Env::System_call.new("#{fnb}.texinfo") + texinfo.makeinfo + end + Dir.chdir(pwd) + end + end + end +end +__END__ + diff --git a/lib/sisu/0.52/texinfo_format.rb b/lib/sisu/0.52/texinfo_format.rb new file mode 100644 index 00000000..dc070647 --- /dev/null +++ b/lib/sisu/0.52/texinfo_format.rb @@ -0,0 +1,507 @@ +=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: texinfo formatting template + + * 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 TexInfoFormat + @@table_pg_break_counter=1 + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + class Texinfo + @@tex_backslash="\\\\" + @@tex_1='\\\\~' #?? debug + @@tabular="{tabular}" + @@tex_pattern_margin_number="\\\\marginpar.+?\s+" + @@dp=nil + def initialize(data=nil,md=nil,three=nil) + @para=@one=data + @md=md + @vz=SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def head + t=Time.now + year = t.year + filename=%{#{@md.fns}}[/(.+?)\.\w\w\d\d$/,1] + title=Texinfo.new(@md.title).spec_char + title=title.gsub(/<(br|p|i)>|<\/\s*(br|p|i)>|<(br|p)\s*\/>/," #{@@tex_backslash*2} ") + title.gsub!(/\$/,"\\$") + title.gsub!(/[,]\s*/,' - ') + if @md.subtitle + subtitle=Texinfo.new(@md.subtitle).spec_char + subtitle=subtitle.gsub(/<(br|p|i)>|<\/\s*(br|p|i)>|<(br|p)\s*\/>/," #{@@tex_backslash*2} ") + subtitle.gsub!(/\$/,"\\$") + subtitle.gsub!(/[,]\s*/,' - ') + subtitle="@subtitle @value{VERSION}, @value{UPDATED}\n" #bugwatch + end + subtitle ||='' + author=@md.dc_creator if @md.dc_creator + author ||='' + author.gsub!(/[\*]/,'') #if author + head =<<WOK +\\input texinfo @c -*-texinfo-*- +@comment $Id$ +@comment %**start of header +@setfilename #{@md.fnb}.info +@settitle #{title} @value{VERSION} +@syncodeindex pg cp +@comment %**end of header +@c {{{ 2 +@copying +SiSU in texinfo version of #{title} +(version @value{VERSION}, @value{UPDATED}) + +Copyright @copyright{} #{year} #{author}. + +@quotation +Copyright #{author}, generated by ``SiSU'' +@end quotation +@end copying + +@dircategory SiSU Texinfo +@direntry +* sisu: SiSU texinfo file. +@end direntry +WOK + if @md.subtitle + titlepage=<<WOK +@c {{{ 3 +@titlepage +@title #{title} #{subtitle} +@author #{author} +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage +@contents +WOK + else + titlepage=<<WOK +@c {{{ 3 +@titlepage +@title #{title} +@value{VERSION}, @value{UPDATED} +@author #{author} +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents +WOK + end + "#{head}#{titlepage}" + end + def topnode + @one=Texinfo.new(@one).spec_char + @one=@one.gsub(/<(br|p|i)>|<\/\s*(br|p|i)>|<(br|p)\s*\/>/," #{@@tex_backslash*2} ") + @one.gsub!(/\$/,"\\$") + @one.gsub!(/[,]\s*/,' - ') + "@c {{{ 4\n" + + "@ifnottex\n" + + "@node Top\n" + + "@top #@one\n\n" + + "@insertcopying\n" + + "@end ifnottex\n\n" + + "@menu\n" + end + def dublincore + title=Texinfo.new(@md.title).spec_char if @md.title + subtitle=Texinfo.new(@md.subtitle).spec_char if @md.subtitle + dc_title="#{title} - #{subtitle}" + dc_creator=Texinfo.new(@md.dc_creator).spec_char if @md.dc_creator + dc_subject=Texinfo.new(@md.dc_subject).spec_char if @md.dc_subject + dc_description=Texinfo.new(@md.dc_description).spec_char if @md.dc_description + dc_publisher=Texinfo.new(@md.dc_publisher).spec_char if @md.dc_publisher + dc_contributor=Texinfo.new(@md.dc_contributor).spec_char if @md.dc_contributor + dc_date=Texinfo.new(@md.dc_date).spec_char if @md.dc_date + dc_date_created=Texinfo.new(@md.dc_date_created).spec_char if @md.dc_date_created + dc_date_issued=Texinfo.new(@md.dc_date_issued).spec_char if @md.dc_date_issued + dc_date_available=Texinfo.new(@md.dc_date_available).spec_char if @md.dc_date_available + dc_date_valid=Texinfo.new(@md.dc_date_valid).spec_char if @md.dc_date_valid + dc_date_modified=Texinfo.new(@md.dc_date_modified).spec_char if @md.dc_date_modified + dc_type=Texinfo.new(@md.dc_type).spec_char if @md.dc_type + dc_format=Texinfo.new(@md.dc_format).spec_char if @md.dc_format + dc_identifier=Texinfo.new(@md.dc_identifier).spec_char if @md.dc_identifier + dc_source=Texinfo.new(@md.dc_source).spec_char if @md.dc_source + dc_language=Texinfo.new(@md.dc_language[:name]).spec_char if @md.dc_language[:name] + #language_original=Texinfo.new(@md.language_original[:name]).spec_char if @md.language_original[:name] + dc_relation=Texinfo.new(@md.dc_relation).spec_char if @md.dc_relation + dc_coverage=Texinfo.new(@md.dc_coverage).spec_char if @md.dc_coverage + dc_rights=Texinfo.new(@md.dc_rights).spec_char if @md.dc_rights + dc_title="Title: #{dc_title}\n\n" if dc_title + dc_creator="Creator: #{dc_creator}\n\n" if dc_creator + dc_subject="Subject: #{dc_subject}\n\n" if dc_subject + dc_description="Description: #{dc_description}\n\n" if dc_description + dc_publisher="Publisher: #{dc_publisher}\n\n" if dc_publisher + dc_contributor="Contributor: #{dc_contributor}\n\n" if dc_contributor + dc_date="Date: #{dc_date}\n\n" if dc_date + dc_date_created="Date Created: #{dc_date_created}\n\n" if dc_date_created + dc_date_issued="Date Issued: #{dc_date_issued}\n\n" if dc_date_issued + dc_date_available="Date Available: #{dc_date_available}\n\n" if dc_date_available + dc_date_valid="Date Valid: #{dc_date_valid}\n\n" if dc_date_valid + dc_date_modified="Date Modified: #{dc_date_modified}\n\n" if dc_date_modified + dc_format="Format: #{dc_format}\n\n" if dc_format + dc_identifier="Identifier: #{dc_identifier}\n\n" if dc_identifier #watch + dc_source="Source: #{dc_source}\n\n" if dc_source + dc_language="Language: #{dc_language}\n\n" if dc_language + dc_relation="Relation: #{dc_relation}\n\n" if dc_relation + dc_coverage="Coverage: #{dc_coverage}\n\n" if dc_coverage + dc_rights="Rights: #{dc_rights}\n\n" if dc_rights + "@node Dublin Core\n" + + "@chapter Dublin Core\n" + + "@cindex chapter, Dublin Core\n\n" + + "#{dc_title}" + + "#{dc_creator}" + + "#{dc_subject}" + + "#{dc_description}" + + "#{dc_publisher}" + + "#{dc_contributor}" + + "#{dc_date}" + + "#{dc_date_created}" + + "#{dc_date_issued}" + + "#{dc_date_available}" + + "#{dc_date_valid}" + + "#{dc_date_modified}" + + "#{dc_format}" + + "#{dc_identifier}" + + "#{dc_source}" + + "#{dc_language}" + + "#{dc_relation}" + + "#{dc_coverage}" + + "#{dc_rights}" + + "\n\n" + end + def tail + "@c {{{ 6\n" + + "@node Index\n" + + "@unnumbered Index\n" + + "@printindex cp\n\n" + + "@bye" + end + def menu + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,:]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + "* #@para::" + end + def level1 + @para.gsub!(/[1]\\+~/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,:]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@node #@para\n@chapter #@para\n@cindex chapter, #@para\n" + @para.gsub!(/.+/,"#{para}") + end + def level2 + @para.gsub!(/[2]\\+~/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,:]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@node #@para\n@chapter #@para\n@cindex chapter, #@para\n" + @para.gsub!(/.+/,"#{para}") + end + def level3 + @para.gsub!(/[3]\\+\~/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,:]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@node #@para\n@chapter #@para\n@cindex chapter, #@para\n" + @para.gsub!(/.+/,"#{para}") + end + def level4 + @para.gsub!(/[4]\\+~\S+/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,:]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@node #@para\n@chapter #@para\n@cindex chapter, #@para\n" + @para.gsub!(/.+/,"#{para}") + end + def level5 + @para.gsub!(/[5]\\+~\S+/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,:]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@node #@para\n@chapter #@para\n@cindex chapter, #@para\n" + @para.gsub!(/.+/,"#{para}") + end + def level6 + @para.gsub!(/[6]\\+~\S+/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,:]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@node #@para\n@chapter #@para\n@cindex chapter, #@para\n" + @para.gsub!(/.+/,"#{para}") + end + def submenu + @para=@para.join("\n") + @para.gsub!(/[5]\\+~\S+/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@menu\n#@para\n@end menu\n\n" + @para.gsub!(/.+/m,"#{para}") + end + def subsubmenu + @para=@para.join("\n") + @para.gsub!(/[6]\\+~\S+/,'') + @para.gsub!(/<\\~(\d+);\w\d+;\w\d+><#@dp:#@dp>$/,'~[\1]') + @para.gsub!(/\s*[,]\s*/,' - ') + @para.gsub!(/<:#>/,'') + @para.strip! + para="@menu\n#@para\n@menu\n\n" + @para.gsub!(/.+/m,"#{para}") + end + def indent1 + @para.gsub!(/<:i1>(.*)/,'\1') + end + def indent2 + @para.gsub!(/<:i2>(.*)/,'\1') + end + def spec_char # special characters + @para.gsub!(/<EOF>/i,'') + @para.gsub!(/@/i,'@@') + @para.gsub!(/&(lt|#060);/,'\< ') + @para.gsub!(/&(gt|#062);/,' \>') + @para.gsub!(/{/,'\{ ') + @para.gsub!(/}/,'\} ') + @para.gsub!(/&#(126|152);/i,'~ ') + @para.gsub!(/<sup><font face=symbol>&atild;<\/font><\/sup>/,' ') + @para.gsub!(/\\/,'\\backslash ') + @para.gsub!(/<:pb>/,'\\newpage') + @para.gsub!(/\\backslash copyright/,'\\copyright ') + @para.gsub!(/\^/,'\\wedge ') + @para.gsub!(/(\$)/,"\\$") + @para.gsub!(/\~/,'\\~') + @para.gsub!(/%/,"\\%") + if @para !~ /^\s*<:image|\}:image\s/ + @para.gsub!(/_/,'\_') + end + @para.gsub!(/\{/,"\\{") + @para.gsub!(/\}/,"\\}") + @para.gsub!(/ /,' ') # ~ character for hardspace + @para.gsub!(/ /,' ') # ~ character for hardspace + @para.gsub!(/&(\S+?);/,'') + @para.gsub!(/(\s+&\s+)/,' and ') + @para.gsub!(/(\&)/,"\\&") + @para.gsub!(/§/i,'\S') + @para.gsub!(/£/i,'\pounds') + @para.gsub!(/å/i,'\aa') + @para.gsub!(/æ/i,'\ae') + @para.gsub!(/ø/i,'\o') + @para.gsub!(/Å/i,'\AA') + @para.gsub!(/Æ/i,'\AE') + @para.gsub!(/Ø/i,'\O') + @para.gsub!(/&(.+?);/i,' ') + @para.gsub!(/<a href=".+?">/i,' ') + @para.gsub!(/<\/a>/i,' ') + @para.gsub!(/<:ee>/i,'') + @para.gsub!(/<!>/i,' ') + @para.gsub!(/<b>(.+?)<\/b>/,'\*\1\*') + @para.gsub!(/<i>(.+?)<\/i>/,'\/\1\/') + @para.gsub!(/<u>(.+?)<\/u>/,'\_\1\_') + @para.gsub!(/"(.+?)"/,"`\\1'") # open & close " + @para.gsub!(/\s+"/," `") # open " + @para.gsub!(/^([1-6-]\\+(?:~\S+)?|<.+?>)?\s*"/,'\1`') # open " + @para.gsub!(/"(\s|\.|,|:|;)/,"'\\1") # close " + @para.gsub!(/"([1-6-]\\+(?:~\S+)?|<.+?>)?\s*$/,"'\\1") # close " + @para.gsub!(/"(\.|,)/,"'") # close " + @para.gsub!(/\s+'/," `") # open ' + @para.gsub!(/^([1-6-]\\+(?:~\S+)?|<.+?>)?\s*'/,'\1`') # open ' + #if @para=~/#{@@tex_1}/ + #end + #@para.gsub!(/^([1-6-](?:#{@@tex_2}|#{@@tex_1})(?:\\~\S+)?|<.+?>)?\s*"/i,"\\1`") # open " + #@para.gsub!(/"([1-6-](?:#{@@tex_2}|#{@@tex_1})(?:\\~\S+)?|<.+?>)?\s*$/i,"'\\1") # close " + #@para.gsub!(/^([1-6-](?:#{@@tex_2}|#{@@tex_1})(?:\\~\S+)?|<.+?>)?\s*'/i,"\\1`") # open ' + @para.gsub!(/(<font.*?>|<\/font>)/,'') + @para.gsub!(/\s*<sup>(\S+?)<\/sup>/,'^\1') + @para.gsub!(/(<sup>|<\/sup>)/,'') + @para + end + def longtable + @end_table="\\end{longtable}" + @row_break='\\\\\\' + if @para[/<!Th?¡\s+c(\d+);(.+?)!>/i] + no_of_cols,cols_width=$1,$2 + @@tableheader=1 if @para =~ /<!Th/i + @w=cols_width.split(/;\s+/) + @@number_of_cols=no_of_cols + @colW=[] + @colW << '{' + @w.each do |x| + col_w=x.gsub(/.+/,'l\|') #unless x.nil? + @colW << "#{col_w}" if col_w + end + @colW << '}' + @colW=@colW.join + @@start_table="\\setlength{\\LTleft}{0pt}\n\\setlength{\\LTright}{\\fill}\n" + + "\\begin{longtable}[hb]#@colW\n" + @para.gsub!(/<!Th?¡\s+c\d+?;.+!>/,"#{@@start_table}") + end + if @para =~/<!TZ!>/ + @para.gsub!(/<!TZ!>/," #@end_table") + end + @para.gsub!(/<!¡/,'') + if @@tableheader==1 + if @para =~/¡\d+?¡(.+?)(?:¡|!)/ + tablefoot=para[/\<!f(.+?)!\>/,1] + @para.gsub!(/\<!f(.+?)!\>/,'') + @para.gsub!(/¡\d+?¡(.+?)(?:¡|!)/, + "{\\begin{tiny} {\\bfseries \\1}\\end{tiny}}&") + @para.gsub!(/&>\s*$/, + " #@row_break \\hline\\endhead #@row_break") + @para="#@para \\multicolumn{#{@@number_of_cols}}{l}{\\tiny #{tablefoot}} \\\\ \\hline\n\\endfoot\n\\hline\n" if tablefoot + @@tableheader=0 + @@number_of_cols=0 + end + else + if @para =~/¡\d+?¡(.+?)(?:¡|!)/ + @para.gsub!(/¡\d+?¡(.+?)(?:¡|!)/,"\\begin{tiny}\\1\\end{tiny}&") + @para.gsub!(/&>\s*$/," #@row_break") + end + end + @para + end + def scopedtable + # some features related to headers have been incorporated in longtable + # that are not included yet here, so until synced is broken on some + # input files, work needs to be done if is to work as before + @end_table="\\end{tabular}" + @row_break='\\\\\\\\' + @break_page="#@row_break\n#@row_break \n" + if @para[/<!Th?¡\s+c(\d+);(.+?)!>/i] + no_of_cols,cols_width=$1,$2 + @w=cols_width.split(/;\s+/) + @colW=[] + @w.each do |x| + col_w=((x.to_i*12)/100.00).to_s #unless x.nil? + @colW << "p{#{col_w}cm}" if col_w + end + @@start_table="\\begin{tabular}{#@colW}\n" + @para.gsub!(/<!Th?¡\s+c\d+?;.+!>/,"#{@@start_table}") + end + if @para =~/<!TZ!>/ + @para.gsub!(/<!TZ!>/,"#@end_table") + @@table_pg_break_counter=1 + end + if @para =~/<!¡/ + if @@table_pg_break_counter==28 # taken from 34 ideal for portrait to 28 which suits landscape + @para = + "\n\n#@end_table \n" + + "#@break_page" + + "#{@@start_table}\n" + @@table_pg_break_counter=1 + else + @para.gsub!(/<!¡/,'') + @@table_pg_break_counter+=1 + tablefoot=@para[/\<!f(.+?)!\>/] + @para.gsub!(/\<!f(.+?)!\>/,'') + end + end + if @para =~/¡\d+?¡(.+?)(?:¡|!)/ + @para.gsub!(/¡\d+?¡(.+?)(?:¡|!)/,"\\begin{tiny}\\1\\end{tiny}&") + @para.gsub!(/&>\s*$/,"#@row_break") + end + @para + end + def graphics + dir=SiSU_Env::Info_env.new(@md.fns) + @para.gsub!(/<::\s+(\S+?)\s+>/i, #watch + "\\includegraphics*[width=11pt]{#{dir.path.image_source_tex}/c_\\1.png}") + end + def image + dir=SiSU_Env::Info_env.new(@md.fns) + width="100" + width=@para[/<:image.+?width=``(\d+)''.+?>/im,1] + width=width.to_i*0.4 + @para.gsub!(/<:image\s+((?:https?|ftp)\S+)\s+(\S+)\s+.+\s+?>/i, + "\\href{\\1}{\\includegraphics*[width=#{width}pt]{#{dir.path.image_source_tex}/\\2}}") + @para.gsub!(/<:image\s+(\S+)\s+.+\s+?>/i, + "\\includegraphics*[width=#{width}pt]{#{dir.path.image_source_tex}/\\1}") + end + def png + # very messy clean up ! - work area, testing + z=@para[/\\\{(.+?)\}(?:image|png)/,1] # match operator for z \\ fragile ! + image,w,x,y=z.scan(/\S+/) + image.gsub!(/\\/,'') + @para.gsub!(/\\\{\S+\.(png|jpg|gif).+?\}(image|png)/,"<image #{image} not available>") # fragile match operator\\ fragile ! + end + def http + # very messy clean up ! - work area, testing + z=@para[/\\\{(.+?)\}(?:https?|ftp):\/\//,1] # match operator for z \\ fragile ! + url=@para[/((?:https?|ftp):\S+)/im,1] + if @para =~/\.(png|jpg|gif)/ + image,w,x,y=z.scan(/\S+/) + image.gsub!(/\\/,'') + width=200 + width=z[/w=(\d+)/im,1] if z =~/w=(\d+)/ + width=width.to_i*0.8 + width=400 if width > 400 + c=z[/``(.+?)''/im,1] + caption="{\\\\\\\ \n\\begin{scriptsize}#{c}\\end{scriptsize}&}" if c + end + if image + dir=SiSU_Env::Info_env.new(@md.fns) + @para.gsub!(/\{\S+\.(png|jpg|gif).+?\}(?:https?|ftp):\/\/\S+/, # fragile match operator\\ fragile ! + "\n\\href{#{url}}{\\includegraphics*[width=#{width}pt]{#{dir.path.image_source_tex}/#{image}}}#{caption}") + else + link=z[/(.+?)\\/im,1] + @para.gsub!(/\{.+?\}(?:https?|ftp):\/\/\S+/,"\n\\noindent\\href{#{url}}{#{link}}") # fragile match operator\\ fragile ! + end + end + end +end +__END__ + diff --git a/lib/sisu/0.52/texpdf.rb b/lib/sisu/0.52/texpdf.rb new file mode 100644 index 00000000..27c4f3bf --- /dev/null +++ b/lib/sisu/0.52/texpdf.rb @@ -0,0 +1,611 @@ +=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: LaTeX 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_TeX + require 'pstore' + require SiSU_lib + '/defaults' + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/texpdf_format' + include SiSU_TeX_Pdf + @tex_file=@@tex_footnote_array=@@tex_col_w=[] + @@tex_backslash ||="\\\\" + @@tilde='\\\\\\~' #?? debug crazy + @@tabular="{tabular}" + @@column_instruct=@@squigle_close=@@tex_line_mode=@@tex_word_mode=@@line_mode='' + @@tex_debug_counter=@@table_pagebreak_counter=@@tex_footnote_call_counter=@@tex_table_flag=@@tex_counter=@@tex_column=@@tex_columns=@@tex_columns=@@counting=0 + @@tex_pattern_margin_number="\\\\begin\\\{tiny\\\}~\\\\end\\\{tiny\\\}\\\{\\\\marginpar.+?\s+" + #@@tex_pattern_margin_number="\\\\marginpar.+?\s+" + @@n=@@tableheader=@@rights=nil + @@date ||=SiSU_Env::Info_date.new + class Source #Songsheet #<SiSU_Param::MyFiles + require 'pstore' + require SiSU_lib + '/sysenv' + require SiSU_lib + '/param' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/dal' + include SiSU_DAL + include SiSU_TeX + def initialize(opt) + @opt=opt + @md=SiSU_Param::Parameters.new(@opt).get + @env=SiSU_Env::Info_env.new(@opt.fns) + end + def directories + begin + @dir_out_root=@env.path.output + case @opt.fns + when /\.[_-]?sst$/ + SiSU_Env::SiSU_file.new(@md).mkdir + Dir.mkdir(@env.path.tex) unless FileTest.directory?(@env.path.tex) + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + def read + songsheet + end + def songsheet + begin + @md=SiSU_Param::Parameters.new(@opt).get + tell=SiSU_Screen::Ansi.new(@opt.cmd,'LaTeX/PDF') + tell.green_title_hi unless @opt.cmd =~/q/ + path=@env.url.output_tell + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.program.pdf_viewer} #{path}/#{@md.fnb}/#{@md.fn[:pdf_l]}") + tell.flow if @opt.cmd =~/[MVv]/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.program.pdf_viewer} #{path}/#{@md.fnb}/#{@md.fn[:pdf_p]}") + tell.flow if @opt.cmd =~/[MVv]/ + data=IO.readlines(@opt.fns,'') #wasteful, revisit + @md=SiSU_Param::Parameters.new(@opt).get + my_make=SiSU_Env::Create_file.new(@opt.cmd,@opt.fns) + if @md.flag_pdf + $flag=@md.cmd #introduced to pass 0 for no object citation numbers... to texpdf_format + @dir_o="#{@env.path.output}/#{@opt.fnb}" + directories + filename_index="#{@md.txt_path}/pdf" + newfilename=filename_index + #% needed needs to be reprogrammed !!! + SiSU_Env::Info_skin.new(@md).select + dal_array=SiSU_DAL::Source.new(@opt).get # dal file drawn here + SiSU_TeX::Source::LaTeX_create.new(dal_array,@md,'landscape').songsheet + SiSU_TeX::Source::LaTeX_create.new(dal_array,@md,'portrait').songsheet + dal_array='' + pwd=Dir.pwd + SiSU_TeX::Source::LaTeX_to_pdf.new(@md).latexrun_selective + Dir.chdir(pwd) + else + tell=SiSU_Screen::Ansi.new(@opt.cmd,'instructed NOT to produce LaTeX/PDF') + tell.warn unless @opt.cmd =~/q/ + end + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + unless @opt.cmd =~/[MV]/ #check maintenance flag + texfiles = Dir["#{@env.path.tex}/#{@opt.fns}*"] + texfiles.each do |f| + if FileTest.file?(f) + File.unlink(f) + end + end + end + @tex_file=@@tex_footnote_array=[] + @@column_instruct='' + @@squigle_close=@@tex_line_mode=@@tex_word_mode=@@line_mode='' + @@tex_debug_counter=@@table_pagebreak_counter=@@tex_footnote_call_counter=@@tex_table_flag=@@tex_counter=@@tex_column=@@tex_columns=@@tex_columns=@@counting=0 + @@tex_col_w=[] + @@n=@@tableheader=@@rights=nil + @@date=SiSU_Env::Info_date.new + @@flag={} + $flag=1 #remove at some stage + SiSU_Env::Create_file.new(@opt.cmd,@opt.fns).param_instantiate + end + end + private + class LaTeX_to_pdf #<Songsheet + require 'fileutils' + include FileUtils #::Verbose + @@n_lpdf||=0 #change + def initialize(md) + @md=md + @env=SiSU_Env::Info_env.new(@md.fns) + end + def latex_do(texfilename) + @texfilename=texfilename + @@n_lpdf=@@n_lpdf+1 + tell=SiSU_Screen::Ansi.new(@md.cmd,'portrait ->') + tell.dark_grey_title_hi if @md.cmd =~/[MVv]/ + tex_fn_base=@texfilename.gsub(/\.tex$/,'') + cmd=SiSU_Env::System_call.new("#{tex_fn_base}.tex",'',@md.cmd) + tell=SiSU_Screen::Ansi.new(@md.cmd) + tell.grey_open unless @md.cmd =~/q/ + 2.times { |i| cmd.latex2pdf unless ("#{tex_fn_base}.tex" !~/\w+/) } + tell.p_off unless @md.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@md.cmd,'landscape ->') + tell.dark_grey_title_hi if @md.cmd =~/[MVv]/ + cmd=SiSU_Env::System_call.new("#{tex_fn_base}.landscape.tex",'',@md.cmd) + tell.grey_open + 2.times { |i| cmd.latex2pdf unless ("#{tex_fn_base}.landscape.tex" !~/\w+/) } + tell.p_off unless @md.cmd =~/q/ + pwd=Dir.pwd + portrait_pdf="#{pwd}/#{tex_fn_base}.pdf" + landscape_pdf="#{pwd}/#{tex_fn_base}.landscape.pdf" + if FileTest.file?(portrait_pdf) + File.install(portrait_pdf,"#@dir_sisu/#{@md.fnb}/#{@md.fn[:pdf_p]}") + File.unlink(portrait_pdf) + end + if FileTest.file?(landscape_pdf) + File.install(landscape_pdf,"#@dir_sisu/#{@md.fnb}/#{@md.fn[:pdf_l]}") + File.unlink(landscape_pdf) + end + tell=SiSU_Screen::Ansi.new(@md.cmd,@@n_lpdf,'processed (SiSU LaTeX to pdf - using pdfetex aka. pdftex or pdflatex)') + tell.generic_number unless @md.cmd =~/q/ + end + def latexrun_selective + begin + ep_dir=Dir.pwd + Dir.chdir(ep_dir) + @tex_f_no=0 + info={} + if FileTest.file?("#{ep_dir}/#{@md.fns}") + if @md.fns =~/\.[_-]?sst$/ + @dirout=SiSU_Env::Info_env.new(@md.fns) + case @md.fns + when /\.[_-]?sst$/ + if FileTest.directory?(@env.path.tex)==true + Dir.chdir(@env.path.tex) + @dir_sisu=@dirout.path.output + texfile=@md.fns.gsub(/$/,'.tex') + texfile=texfile.gsub(/~/,'-') + if File.exists?(texfile) and File.size(texfile) > 0 + @tex_f_no+=1 + latex_do(texfile) + else + puts "\tzero file size #{@env.path.tex}/#{@md.fns}" + end + end + end + end + else + puts "\n#{@cX.fuschia}FILE NOT FOUND:#{@cX.off} << #{file} >> - requested latex system processing skipped\n" + end + lst=Dir["*.{aux,log,out}"] + lst.each {|file| File.unlink(file)} if lst + #touch("#{@dir_pdf}index.html") #correct @dir_pdf appears to contain slash / and should not + rescue; SiSU_Errors::Info_error.new($!,$@,@md.fns,@md.cmd).error + end + end + end + class LaTeX_create + include SiSU_Param + @@tex_backslash ||="\\\\" + @@tilde='\\\\\\~' #?? debug crazy + @@tex_head_portrait,@@tex_head_landscape=[],[] + @@flag_group,@@flag_code=false,false + @@dp,@@prefix_b=nil,nil + def initialize(data,md,orientation) + @data,@md,@orientation=data,md,orientation + @env=SiSU_Env::Info_env.new(@md.fns) + @st={ :tex=>{} } + @tex=SiSU_TeX_Pdf::Use_TeX.new(@md,@orientation) + @vz=SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def songsheet + begin + @@tex_footnote_array=[] #check + data=@data + @@rights=nil + tell=SiSU_Screen::Ansi.new(@md.cmd,"pdfTex #@orientation") + tell.txt_grey unless @md.cmd =~/q/ + if @md.dc_rights + use=@md.dc_rights.dup #dup is necessary, else contents of :rights changed + do_mono=SiSU_TeX_Pdf::Format_text_object.new(@md,use) + copymark=if @md.creator_copymark; '{\\begin{small}\\raisebox{1ex}{\\copyright}\\end{small}} ' + else '' + end + copyright=do_mono.special_characters_safe.gsub(/^\s*Copyright/, copymark) + @@rights||="\n #{@@tex_backslash*2}[3]\\ \\linebreak #{copyright}" + end + if @md.prefix_b + do_mono=SiSU_TeX_Pdf::Format_text_object.new(@md,@md.prefix_b) + prefix_b=do_mono.special_characters_safe + @@prefix_b="\n #{@@tex_backslash*2}[3]\\ \\linebreak \\ #{prefix_b}\n" unless @@prefix_b + end + if @md.markup.to_s !~/url_png/ + @data=pre + @data=footnote + if @md.flag_tables + @data=tables + end + @data=numbering + @data=markup + output + end + rescue; SiSU_Errors::Info_error.new($!,$@,@md.fns,@md.cmd).error + ensure + end + end + protected + def pre + @tex_file=[] + data=@data + data.each do |para| + # DEBUG 2003w16 this is a kludge, because i could not get parameters + # from param, Sort out ... revert to more elegant solution + # even more of a kludge as had to insert newlines where code is used not satisfactory, think about + pg=if para =~/<:br>/; para.split(/<:br>/) + else para + end + pg.each do |pg| + if pg =~/<!Th?¡\s+c/; @md.flag_tables=true # KLUDGE get from param + end + do_mono=SiSU_TeX_Pdf::Format_text_object.new(@md,pg) + @tex_file << do_mono.special_characters + end + end + data=@tex_file.delete_if {|x| x =~/^\s*0#{@@tilde}/} + @tex_file + end + def footnote + data=@data.dup + @tex_file=[] + data.each do |para| + para2=para.dup + # EMBEDDED FOOTNOTES / ENDNOTES should be straightforward but not quite a synch. + footnote=[] + if para =~/~\\\{[\d*+]+\s|\\\~\[([*+]\d+)\s/ # note escape not necessary in front of ~ has implications for many other matches #debug note + para.gsub!(/\\~\\\{(\d+)\s+(.+?)<#@dp>\\\}\\~/m,"\\footnote[\\1]{%\n \\2} ") #removed space before \\footnote 2004w21, watch + para.gsub!(/\\~\[([*+]\d+)\s+(.+?)<#@dp>\]\\~/m,"\\FootnoteA{\\1}{%\n \\2} ") #work on asterisk footnotes + para.gsub!(/\\~\\\{([*+]+)\s+(.+?)<#@dp>\\\}\\~/m,"\\FootnoteA{\\1}{%\n \\2} ") #work on asterisk footnotes + end + @tex_file << para + end + @tex_file + end + def tables + data=@data + @tex_file=[] + @@tableheader=0 + data.each do |para| + if para =~/¡|<!T/ + do_mono=SiSU_TeX_Pdf::Format_text_object.new(@md,para) + para=do_mono.longtable_landscape if @orientation =~/landscape/ # using longtable latex package + para=do_mono.longtable_portrait if @orientation =~/portrait/ # using longtable latex package + end + @tex_file << para + end + end + def enclose(para,type='') + para.strip! + if type =~/code/; para + #para = '\begin{footnotesize} \begin{ttfamily} ' + para + ' \end{ttfamily} \end{footnotesize}' + elsif para !~/(\\begin\{tabular\}.*|\\end\{tabular\}|&|#{@@tex_backslash*2})\s*$/ #check + para.gsub!(/(.+)/m,"\n#{@tex.skip_small} \\1 #{@tex.skip_small}\n") + else para + end + end + def markup + data=@data + @tex_file=[] + md={} + #% document headers watch special characters in title & subtitle: glark "\{\{~(sub)?title.+?[$&%#_\{\}]" *.(lm|er)?? + home=@vz.txt_home.gsub(/<(br|p)>|<\/\s*(br|p)>|<(br|p)\s*\/>|\\\\/,' - ') #no line splitting in heading neither html nor latex + title=@md.title.gsub(/<(br|p)>|<\/\s*(br|p)>|<(br|p)\s*\/>|\\\\/,' - ') #no line splitting in heading neither html nor latex + subtitle=@md.subtitle.gsub(/<(br|p)>|<\/\s*(br|p)>|<(br|p)\s*\/>|\\\\/,' - ') if @md.subtitle #no line splitting in heading neither html nor latex + orient=SiSU_TeX_Pdf::Format_text_object.new(@md,@orientation,"#{home}: - #{title} #{subtitle}") #.new + if @orientation =~/portrait/ + @@tex_head_portrait << orient.document_head_with_orientation + elsif @orientation =~/landscape/ + @@tex_head_landscape << orient.document_head_with_orientation + end + @tex_file <<<<WOK +#{@tex.header}#{@tex.footer} +\\makeatother +\\makeatother +\\begin{document} +WOK + sisu_rc_footnote=if @md.sc_info; @tex.doc_sc_info_footnote_full + else @tex.doc_sc_info_footnote_brief + end + @copymark=if @md.creator_copymark; '^\copyright' + else '' + end + if @orientation =~/landscape/ # using longtable latex package + @tex_file << SiSU_TeX_Pdf::Format_text_object.new(@md,@md.title,@md.subtitle).title_landscape + if @md.dc_creator + do_mono=SiSU_TeX_Pdf::Format_text_object.new(@md,@md.dc_creator) + creator=do_mono.special_characters + @tex_file << if @md.creator_home + <<WOK + +\\author{\\href{#{@md.creator_home}}{#@copymark \\textnormal{#{creator}}}} +WOK + else "\n\\author{#@copymark \\textnormal{#{creator}}}" + end + end + @tex_file << unless @md.fnb =~/^mail\s*$/ + "\n\\date{copy @ #{@tex.site} #{sisu_rc_footnote}}" + else "\\date" + end + else #portrait + @tex_file << SiSU_TeX_Pdf::Format_text_object.new(@md,@md.title,@md.subtitle).title_portrait + if @md.dc_creator + creator=@md.dc_creator + @tex_file << if @md.creator_home + <<WOK + +\\author{\\href{#{@md.creator_home}}{#@copymark \\textnormal{#{creator}}}} +WOK + else "\n\\author{#@copymark \\textnormal{#{creator}}}" + end + end + @tex_file << unless @md.fnb =~/^mail\s*$/; "\n\\date{copy @ #{@tex.site} #{sisu_rc_footnote}}" + else "\\date" + end + end + @tex_file <<<<WOK +\\pagenumbering{roman}\\maketitle +\\pagestyle{fancy} +WOK + #@tex_file << @tex.newpage #newpage clearpage depending on portrait or landscape + @tex_file << "\\newpage\n" + @tex_file << @@rights if @md.dc_rights #if @orientation =~/landscape/ + @tex_file << @@prefix_b if @md.prefix_b + @tex_file << @tex.sisu_rights + @tex_file << if @md.sc_info; @tex.doc_sc_info + else @tex.doc_no_sc_info + end + @tex_file << @tex.manifest_info + @tex_file << @tex.newpage + @tex_file <<<<WOK +\\pagestyle{fancy} +\\tableofcontents +#{@tex.newpage} +\\pagenumbering{arabic} +#{@tex.paraskip_normal} +WOK + @tex_file << @tex.newpage + @group_collect=[] + data.each do |para| #% case follows with levels 1-6 indents & graphics + mono=SiSU_TeX_Pdf::Format_text_object.new(@md,para) + if para =~/<:(code|alt|verse|group)>/ or @@flag_group==true + if para =~/<:(code|alt|verse|group)>/ + @lineone=case para + when /<:(alt|verse|group)>/; para + when /<:code>/; "#{@tex.paraskip_small} \\begin{footnotesize} \\begin{ttfamily} " + para + else 'error' #should never occur + end + end + if para =~/<=curly/ #takes care of escaped curly braces, expand + do_mono=SiSU_TeX_Pdf::Format_text_object.new(@md,para) + para=do_mono.special_characters_curly(para) + end + regx=/<:((?:code|alt|verse|group)(?:-end)?)>/ + x=regx.match(para)[1] if para =~regx + x=$1 + para.gsub!(/\n<:(?:code|alt|verse|group)>\n/m,'') + para=enclose(para,'code') unless para =~/^$/ + if x =~/(?:alt|verse|group)/; @@flag_group=true + elsif x =~/code/; @@flag_group,@@flag_code=true,true + elsif @@flag_group==true; @group_collect << para #<< "\n\n" + end + if x =~/(?:code|alt|verse|group)-end/ + regx=/(\\+marginpar\{\\+begin\{tiny\}\d+\\+end\{tiny\}\})/ + y=if para =~regx + regx.match(para)[1] + else '' + end + para.gsub!(regx,'') + @group_collect.each{ |x| x.gsub!(/(<:\S+>|<!.*?!>|<!>)/,' ') } + @lineone.gsub!(/(<:\S+>|<!.*?!>|<!>)/,' ') + #@group_collect.each{ |x| x.gsub!(/(.#{@@tilde}\S*\s*|<:\S+>|<!.*?!>|<!>)/,' ') } + #@lineone.gsub!(/(.#{@@tilde}\S*\s*|<:\S+>|<!.*?!>|<!>)/,' ') + insert=[] + if para =~/<:code-end>/ + insert << y + @lineone << @group_collect << ' \end{ttfamily} \end{footnotesize}' << " #{@tex.paraskip_normal}" + else insert << y + @lineone << @group_collect + end + @@flag_group,@@flag_code=false,false + @group_collect=[] + para.gsub!(/(<:\S+>|<!.*?!>|<!>)/,' ') + #para.gsub!(/(.#{@@tilde}\S*\s*|<:\S+>|<!.*?!>|<!>)/,' ') + @tex_file << insert.flatten + end + else + if para =~ /\}(?:https?|ftp)/ + para=mono.http(@orientation) + end + case para + when /^1#{@@tilde}/; mono.level1 + when /^2#{@@tilde}/; mono.level2 + when /^3#{@@tilde}/; mono.level3 + when /^4#{@@tilde}/; mono.level4 + when /^5#{@@tilde}/; mono.level5 + when /^6#{@@tilde}/; mono.level6 + when /^<:i1>/; mono.indent1 + when /^<:i2>/; mono.indent2 + when /<:=/; mono.symbol_graphic #watch + when /^\s*<:image\s+/; mono.image + when /\}image/; mono.png + else + para.strip! + para=enclose(para) unless para =~/^$/ + end + para.gsub!(/(\.#{@@tilde}\S*\s*|<:\S+>|<!.*?!>|<!>)/,' ') #% tread with care + #para.gsub!(/(.#{@@tilde}(?:\\~\S+)?\s*|<:\S+>|<!.*?!>|<!>)/,' ') #KEEP reference, problem escaping open curly braces \{ + if para =~/<=curly/ #takes care of escaped curly braces, expand + do_mono=SiSU_TeX_Pdf::Format_text_object.new(@md,para) + para=do_mono.special_characters_curly(para) + end + @tex_file << para + end + end + @tex_file << "\n\\newpage\n" # was \\pagebreak\n + @md.subtitle_tex=@md.subtitle.dup if @md.subtitle + # kludge ... look again later + @tex_file << if @md.doc_skin !~/skin_mail/; @tex.doc_tail + else @tex.mail_tail + end + if defined? @md.lnk and @md.lnk + @md.lnk.each do |l| + if l[:say] + url=%<#{l[:url]}> + url.gsub!(/(?:\\)*([$&~%_#}{^])/,"\\\\\\1") #latex special chars + s_lnk=l[:say] + s_lnk.gsub!(/(<br>|<br \/>|<p>|<p \/>)/,'') + s_lnk.gsub!(/(?:\\)*([$&~%_#}{^])/,"\\\\\\1") #latex special chars + if url !~/^\.(\.)?\// + s_lnk_url=%<\\begin{scriptsize}\\href{#{url}}{#{url}}\\end{scriptsize}> # note this bit of dereferencing magic + else + url.gsub!(/\.\.\//,'') + s_lnk_url="(#{@tex.site}) \\\\\n" + ' ' + + "\\begin{scriptsize}" + + %<\\href\{#{@vz.url_root_http}/#{url}\}\{#{@vz.url_root_http}/#{url}\}> + # note this bit of dereferencing magic + "\\end{scriptsize}" + end + @tex_file << " #{s_lnk} \\\\\n #{s_lnk_url} \n" unless @md.doc_skin =~/skin_mail/ + s_lnk=s_lnk_url=nil + end + end + end + @tex_file << " #{@tex.sitename} home: \\\\ +\\begin{bfseries}#{@tex.site}\\end{bfseries} +" + #Stamp.stamp #removed 200408 but watch + #% code for inclusion of addresses of promulgating authority + @st[:tex][:stmp]||=@md.stmpd + stamp=@st[:tex][:stmp] if @st[:tex][:stmp] + if stamp + use=stamp.gsub(/\n/,"#{@@tex_backslash*2}\n") + @tex_file << "\n\\newpage\n" + @tex_file << "\\section*" + + "{#{@tex.owner_chapter}}\n" + + "\\addcontentsline{toc}" + + "{section}{#{@tex.owner_chapter}}\n" + @tex_file << "#{use}\n" + @tex_file << @@rights if @@rights + end + @tex_file << "\n\\end{document}" + end + def footnote_call_number + data=@data + data.each do |word| + if word =~/<:e>/ + @@tex_footnote_array[@@tex_footnote_call_counter].strip! if @@tex_footnote_array[@@tex_footnote_call_counter] + word.gsub!(/<:e>/, + " \\footnote{%\n #{@@tex_footnote_array[@@tex_footnote_call_counter]}} ") + @@tex_footnote_call_counter+=1 + end + end + end + def numbering + data=@data + LaTeX_create.new(data,@md,@orientation).number_paras if @md.markup !~/not_to/ + end + def number_paras + data=@data + @tex_file=[] + data.each do |para| + if para =~/<\\~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ and para !~/\\end\{longtable\}|<EOF>/ #catch <!TZ!> + m=/(.+?)<\\~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m + parablock=para[m,1] + paranum=para[m,2] + do_duo=SiSU_TeX_Pdf::Format_text_object.new(@md,parablock,paranum) + para=do_duo.para_num if parablock + elsif para =~/^<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ #2005 this is added for tables, rationalise + m=/<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m + paranum=para[m,1] + para.gsub!(/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>/,'') + para="\\marginpar{\\begin{tiny}#{paranum}\\end{tiny}}" + para + #para="\\marginpar{\\begin{tiny}#{paranum}\\end{tiny}}" + #elsif para =~/<!T.+?!~\d+?>/ + elsif para =~/^<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+>/ #extra 2005 this is added for tables, rationalise + m=/<~(\d+);[oh]\d+;\w\d+>/m + paranum=para[m, 1] + para.gsub!(/<~\d+;(?:[oh]|[0-6]:)\d+;\w\d+>/,'') + para="\\marginpar{\\begin{tiny}#{paranum}\\end{tiny}}" + para + elsif para =~/\\end\{longtable\}/ #catch <!TZ!> + para.gsub!(/<\\~\d+>|<\\~(\d+);(?:[ohm]|[0-6]:)\d+;\w\d+><#@dp:#@dp>/,'') + para.gsub!(/<\\~\d+>|<\\~(\d+);(?:[ohm]|[0-6]:)\d+;\w\d+>/,'') #extra + end + @tex_file << para + end + @tex_file + end + def output + data=@data + @tex_file=[] + data.flatten! + data.compact! + data.each do |para| + para.gsub!(/^\s+/,'') + @tex_file << para + end + fns_l=@md.fns.gsub(/~/,'-') #this is a sorry fix, but necessary as it appears latex programs like not ~ + if @orientation =~/landscape/ #@tex_file << "\n<!EOF!>" + filename_tex_landscape=File.new("#{@env.path.tex}/#{fns_l}.landscape.tex",'w+') + filename_tex_landscape << @@tex_head_landscape + @tex_file.each {|para| filename_tex_landscape.puts para,"\n" unless para.empty?} + filename_tex_landscape.close + @@tex_head_landscape=[] + elsif @orientation =~/portrait/ + filename_tex_portrait=File.new("#{@env.path.tex}/#{fns_l}.tex",'w+') + filename_tex_portrait << @@tex_head_portrait + @tex_file.each {|para| filename_tex_portrait.puts para,"\n" unless para.empty?} + filename_tex_portrait.close + @@tex_head_portrait=[] + end + @tex_file=[] + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/texpdf_format.rb b/lib/sisu/0.52/texpdf_format.rb new file mode 100644 index 00000000..db18ce61 --- /dev/null +++ b/lib/sisu/0.52/texpdf_format.rb @@ -0,0 +1,1222 @@ +=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: LaTeX formatting template, unicode utf-8 version, used for pdf + + * 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_TeX_Pdf + @@table_pg_break_counter=1 + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + class Use_TeX + attr_accessor :url,:txt,:date + def initialize(md,orientation='') + @md,@orientation=md,orientation + @vz=SiSU_Env::Get_init.instance.skin + @date=SiSU_Env::Info_date.new + @copymark='{\\begin{footnotesize}\\raisebox{1ex}{\\copyright}\\end{footnotesize}}' + end + def skip + "\n\\vspace*{\\smallskipamount} \n" + end + def paraskip_normal + '\setlength{\parskip}{1ex plus0.5ex minus0.2ex}' + end + def paraskip_small + '\setlength{\parskip}{0.5ex plus0.2ex minus0.1ex}' + end + def skip_small + #"\\smallskip{}" + end + def skip_small_vspace + "\n\\vspace*{\\smallskipamount} \n" + end + def skip_small_footnote + #"\n\\smallskip{}\n" + end + def skip_medium + "\n\\medskip{}\n\n" + end + def skip_dummy + "\n" + end + def header + "\\lhead[ ]{ }\n" + + "\\chead[ \\fancyplain{} \\bfseries \\footnotesize \\leftmark ]{ \\fancyplain{} \\bfseries \\footnotesize \\rightmark }\n" + + "\\rhead[ ]{ }\n" + end + def footer + base_prog_txt=if @md.base_program + case @md.base_program + when /kdissert/i; " \\\\ \\href{http://freehackers.org/~tnagy/kdissert/}{Kdissert}" + else '' + end + else '' + end + "\\lfoot[\\textrm{\\thepage}]{\\tiny \\href{#{@vz.url_sisu}}{#{@vz.txt_signature}}#{base_prog_txt}}\n" + + "\\cfoot[\\href{#{@vz.url_home}}{#{@vz.url_txt}}]{\\href{#{@vz.url_home}}{#{@vz.url_txt}}}\n" + + "\\rfoot[\\tiny \\href{#{@vz.url_sisu}}{#{@vz.txt_signature}}]{\\textrm{\\thepage}}\n" + end + def site + "\\href{#{@vz.url_home}}{#{@vz.url_txt}}" + end + def sitename #owners site, eg freeculture, free.for.all, gutenberg etc. + "\\href{#{@vz.url_home}}{#{@vz.txt_home}}" + end + def owner_chapter + "Contact Details for Original Promulgating Authority" + end + #BOOK standard dimensions - 229x156 + def newpage + case @orientation + when /landscape/ # using longtable latex package +<<WOK +\\clearpage +WOK + when /portrait/ +<<WOK +\\newpage +WOK + end + end + def sisu_rights + v=SiSU_Env::Info_version.new.get_version + base_prog_txt=if @md.base_program + case @md.base_program + when /kdissert/i; "\n\\\\ This document prepared using \\href{http://freehackers.org/~tnagy/kdissert/}{Kdissert \\ http://freehackers.org/~tnagy/kdissert/ } \\\\ Kdissert is Document Mapping software by Thomas Nagy" + else '' + end + else '' + end +<<WOK +\\\\ ~ +{\\begin{footnotesize}#{base_prog_txt} +\\\\ Generated by \\href{http://www.jus.uio.no/sisu}{SiSU \\ www.jus.uio.no/sisu } \\begin{tiny}[ #{v[:project]} #{v[:version]} of #{v[:date_stamp]} ]\\end{tiny} +\\\\ using SiSU: object citation numbering, markup, meta-markup, and system +\\\\ #@copymark Ralph Amissah 1997, current #{@date.year}, All Rights Reserved. +\\\\ SiSU is released under \\href{http://www.fsf.org/licenses/gpl.html}{GPL 2 } or later, \\href{http://www.fsf.org/licenses/gpl.html}{http://www.fsf.org/licenses/gpl.html}. +{\\end{footnotesize} +\\\\ +WOK + end + def doc_sc_info_footnote_full +<<WOK +\\footnote{%\nGenerated by \\href{http://www.jus.uio.no/sisu}{SiSU \\ www.jus.uio.no/sisu }\\ \\newline \\scriptsize{Document version information: \\emph{sourcefile} \\uline{#{@md.fnstex}}; \\emph{version} \\uline{#{@md.sc_number}}; \\emph{date} \\uline{#{@md.sc_date}}; \\emph{time} \\uline{#{@md.sc_time}}}} +WOK + end + def doc_sc_info_footnote_brief + " \\footnote{%\nGenerated by \\href{http://www.jus.uio.no/sisu}{SiSU \\ www.jus.uio.no/sisu }\\\n}" + end + def doc_sc_info + v=SiSU_Env::Info_version.new.get_version +<<WOK +\\\\ +{\\begin{footnotesize} +Document version information: \\\\ +\\emph{sourcefile} \\uline{#{@md.fnstex}}; \\emph{version} \\uline{#{@md.sc_number}}; \\emph{date} \\uline{#{@md.sc_date}}; \\emph{time} \\uline{#{@md.sc_time}} \\\\ +Generated by \\href{http://www.jus.uio.no/sisu}{SiSU www.jus.uio.no/sisu }\\- version information: \\\\ +\\uline{ #{v[:project]} #{v[:version]} of #{v[:date_stamp]}} +\\end{footnotesize}}& +WOK + end + def doc_no_sc_info + v=SiSU_Env::Info_version.new.get_version +<<WOK +\\\\ +{\\begin{small} +Document information: \\\\ +\\emph{sourcefile} \\uline{#{@md.fnstex}} \\\\ +Generated by \\href{http://www.jus.uio.no/sisu}{SiSU www.jus.uio.no/sisu }\\- version information: \\\\ +\\uline{ #{v[:project]} #{v[:version]} of #{v[:date_stamp]}} + +\\end{small}}& +WOK + end + def manifest_info + url=@md.fnb.gsub(/(?:\\)*([$&~%_#}{^])/,'\\\\\1') + fn=@md.fn[:manifest].gsub(/(?:\\)*([$&~%_#}{^])/,'\\\\\1') +<<WOK +{\\begin{footnotesize} +\\\\ For alternative output formats of this document check: +\\\\ \\begin{scriptsize}\\href{#{@vz.url_root_http}/#{url}/#{fn}}{#{@vz.url_root_http}/#{url}/#{fn}}\\end{scriptsize} +\\end{footnotesize}}& +WOK + end + def endnotes #not used should be inserted before MetaData section which preceeds doc_tail, but is "part of document" +<<WOK +\\subsection*{Endnotes} +\\addcontentsline{toc}{section}{Endnotes} +\\ +\\listofendnotes +WOK + end + def doc_tail + dir=SiSU_Env::Info_env.new(@md.fns) + base_html="#{dir.url.root}/#{@md.fnb}" + v=SiSU_Env::Info_version.new.get_version + sisu_ico=if FileTest.file?("#{dir.path.image_source_tex}/sisu.png") + "\\includegraphics*[width=60pt]{#{dir.path.image_source_tex}/sisu.png}" + else + tell=SiSU_Screen::Ansi.new(@md.cmd,'WARNING - image directory or image(s) missing:', %{"#{dir.path.image_source_tex}"} ) + tell.warn unless @md.cmd =~/q/ + " SiSU " + end + url=@md.fnb.gsub(/(?:\\)*([$&~%_#}{^])/,'\\\\\1') +<<WOK +\\subsection*{Information on this document copy and an unofficial List of Some web related information and sources} +\\addcontentsline{toc}{section}{Information on this document copy and an unofficial List of Some web related information and sources} +\\\\ +\"Support Open Standards and Open Sources for the Information Technology Infrastructure\" RA\\subsubsection*{Information on this document copy #{site}} +\\addcontentsline{toc}{subsection}{Information on this document copy} +{\\begin{footnotesize} +\\\\ Generated by \\href{http://www.jus.uio.no/sisu/}{SiSU} found at \\href{http://www.jus.uio.no/sisu/}{www.jus.uio.no/sisu} \\begin{tiny}[ #{v[:project]} #{v[:version]} #{v[:date_stamp]} ]\\end{tiny} (using SiSU: object citation numbering, markup, meta-markup, and system) #@copymark Ralph Amissah 1997, current #{@date.year}, All Rights Reserved. +\\\\ SiSU is released under \\href{http://www.fsf.org/licenses/gpl.html}{GPL 2 } or later (\\href{http://www.fsf.org/licenses/gpl.html}{www.fsf.org/licenses/gpl.html}). {\\end{footnotesize} +{\\begin{small} +\\\\ W3 since October 3 1993 \\href{http://www.jus.uio.no/sisu/}{#{sisu_ico}}SiSU 1997, current #{@date.year}. \\\\ #{sitename} presentations at \\begin{bfseries}#{site}\\end{bfseries} \\\\ \\\\ #{@md.title} \\textbf{pdf} versions can be found at: \\\\ +{\\end{small} +\\begin{scriptsize}\\href{#{@vz.url_root_http}/#{url}/#{@md.fn[:pdf_p]}}{#{@vz.url_root_http}/#{url}/#{@md.fn[:pdf_p]}}\\end{scriptsize} \\\\ +\\begin{scriptsize}\\href{#{@vz.url_root_http}/#{url}/#{@md.fn[:pdf_l]}}{#{@vz.url_root_http}/#{url}/#{@md.fn[:pdf_l]}}\\end{scriptsize} \\\\ +\\\\\n#{@md.title} \\textbf{html} versions may be found at: \\\\ +\\begin{scriptsize}\\href{#{@vz.url_root_http}/#{url}/#{@md.fn[:toc]}}{#{@vz.url_root_http}/#{url}/#{@md.fn[:toc]}}\\end{scriptsize} or \\\\ +\\begin{scriptsize}\\href{#{@vz.url_root_http}/#{url}/#{@md.fn[:doc]}}{#{@vz.url_root_http}/#{url}/#{@md.fn[:doc]}}\\end{scriptsize} +\\\\ +\\\\ +\\href{#{@vz.url_root_http}/#{url}/#{@md.fn[:manifest]}}{SiSU Manifest} of document output and metadata may be found at: \\\\ +\\begin{scriptsize}\\href{#{@vz.url_root_http}/#{url}/#{@md.fn[:manifest]}}{#{@vz.url_root_http}/#{url}/#{@md.fnl[:pre]}sisu\\_manifest#{@md.fnl[:mid]}.html#{@md.fnl[:post]}}\\end{scriptsize} +\\\\ +\\\\ + #{sitename} found at: \\begin{bfseries}#{site}\\end{bfseries}\\subsubsection*{Links that may be of interest at #{@vz.txt_home} and elsewhere:} +\\addcontentsline{toc}{subsection}{Links that may be of interest} +WOK + end + def mail_tail #not retested, the old mail_tail is commented out and appended to this program + dir=SiSU_Env::Info_env.new(@md.fns) +<<WOK +\\subsection*{Mail sender details} +\\addcontentsline{toc}{subsection}{Mail sender details} +\\\\ +Mail from: ralph@amissah.com\\\\ +44 20 8789 3452\\\\ +44 77 9669 4448 +\\\\ + \"Support Open Standards and Open Sources for the Information Technology Infrastructure\" RA +\\subsubsection*{Information on this document copy #{site}\\copyright} +Presentations' look and feel generated by \\href{http://www.jus.uio.no/sisu/}{SiSU Scribe} \\href{http://www.jus.uio.no/sisu/}{http://www.jus.uio.no/sisu/} programmed in Ruby on Debian/Gnu/Linux by \\copyright Ralph Amissah, W3 since October 3 1993 \\href{http://www.jus.uio.no/sisu/}{\\includegraphics*[width=35pt]{#{dir.path.image_source_tex}/sisu.png}}for #{sitename}. SiSU Scribe (sisu information structuring unit) produces Electronic Documents, i.e. it generates structured output for use in a number of file formats, including the pdf file produced here. +WOK + end + end + class Format_text_object + require 'iconv' + attr_accessor :string,:string1,:string,:orientation,:url,:dir,:tex + @@sys=SiSU_Env::System_call.new + @@tex_backslash="\\\\" + @@tilde='\\\\\\~' #?? debug crazy + @@tex_pattern_margin_number="\\\\begin\\\{tiny\\\}~\\\\end\\\{tiny\\\}\\\{\\\\marginpar.+?\s+" + @@tableheader=0 + @@sys=SiSU_Env::System_call.new + @@flag_code=false + @@dp=nil + def initialize(md,string,string1=nil) + @md,@string,@string1=md,string,string1 + if defined? @md.image and @md.image =~/center/ + @center_begin,@center_end='\begin{center}','\end{center}' + else @center_begin,@center_end='','' + end + @start_table='' + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + @tx=SiSU_Env::Get_init.instance.tex + end + def longtable_landscape + @end_table='\end{longtable}' + @row_break='\\\\\\' + if @string[/<!Th?¡\s+c(\d+);(.+?)!\\~(\d+;\w\d+;\w\d+)>/] + no_of_cols,cols_width,ocn=$1,$2,$3 + tw=case @md.papersize + when /a4/i; @tx.a4.landscape.w #European default, SiSU default + when /letter/i; @tx.letter.landscape.w #U.S. default + when /legal/i; @tx.legal.landscape.w #U.S. alternative + when /book|b5/i; @tx.b5.landscape.w #book default - larger + when /a5/i; @tx.a5.landscape.w + else @tx.a4.landscape.w #default currently A4 + end + textwidth=(tw.to_i/2) - 24 + @@tableheader=1 if @string =~/<!Th/ + @w=cols_width.split(/;\s*/) + @@number_of_cols=no_of_cols + @colW=[] + @colW << '{' + @w.each do |x| + x.strip! + x=(x.to_i * textwidth)/100 + col_w=x.to_s # x.gsub(/.+/,'l\|') #unless x.nil? + @colW << "p{#{col_w}mm}" if col_w + end + @colW << '}' + @colW=@colW.join + @start_table="<~#{ocn}>\n\\setlength{\\LTleft}{0pt}\n\\setlength{\\LTright}{\\fill}\n" + + "\\begin{tiny}\n\\begin{longtable}#@colW\n" + @string.gsub!(/<!Th?¡\s+c\d+?;.+!\\~\d+;\w\d+;\w\d+>/,@start_table) + end + if @string =~/<!TZ!>/ + @string.gsub!(/<!TZ!>/," #@end_table\n\\end{tiny}") + end + @string.gsub!(/<!¡/,'') + if @@tableheader == 1 + if @string =~/¡\d+?¡(.+?)(?:¡|!)/ + tablefoot=@string[/\<!f(.+?)!\>/,1] + @string.gsub!(/\<!f(.+?)!\>/,'') + @string.gsub!(/¡\d+?¡(.+?)(?:¡|!)/,'\bfseries \1&') + @string.gsub!(/&>\s*$/," #@row_break \\hline\\endhead #@row_break") + @string="#@string \\multicolumn{#{@@number_of_cols}}{l}{\\tiny #{tablefoot}} \\\\ \\hline\n\\endfoot\n\\hline\n" if tablefoot + @@tableheader,@@number_of_cols=0,0 + end + else + if @string =~/¡\d+?¡(.+?)(?:¡|!)/ + @string.gsub!(/¡\d+?¡(.+?)(?:¡|!)/,'\1&') + @string.gsub!(/&>\s*$/," #@row_break") + end + end + @string="<~#{ocn}>" + @string + end + def longtable_portrait + @end_table='\end{longtable}' + @row_break='\\\\\\' + if @string[/<!Th?¡\s+c(\d+);(.+?)!\\~(\d+;\w\d+;\w\d+)>/] + no_of_cols,cols_width,ocn=$1,$2,$3 + tw=case @md.papersize + when /a4/i; @tx.a4.portrait.w #European default, SiSU default + when /letter/i; @tx.letter.portrait.w #U.S. default + when /legal/i; @tx.legal.portrait.w #U.S. alternative + when /book|b5/i; @tx.b5.portrait.w #book default - larger + when /a5/i; @tx.a5.portrait.w + else @tx.a4.portrait.w #default currently A4 + end + textwidth=tw.to_i - 20 + @@tableheader=1 if @string =~/<!Th/ + @w=cols_width.split(/;\s*/) + @@number_of_cols=no_of_cols + @colW=[] + @colW << '{' + @w.each do |x| + x.strip! + x=(x.to_i * textwidth)/100 + #x=(x.to_i/100.0 * 160) + col_w=x.to_s # x.gsub(/.+/,'l\|') #unless x.nil? + @colW << "p{#{col_w}mm}" if col_w + end + @colW << '}' + @colW=@colW.join + @start_table="<~#{ocn}>\n\\setlength{\\LTleft}{0pt}\n\\setlength{\\LTright}{\\fill}\n" + + "\\begin{tiny}\n\\begin{longtable}#@colW\n" + @string.gsub!(/<!Th?¡\s+c\d+?;.+!\\~\d+;\w\d+;\w\d+>/,"#@start_table") + end + if @string =~/<!TZ!>/ + @string.gsub!(/<!TZ!>/," #@end_table\n\\end{tiny}") + end + @string.gsub!(/<!¡/,'') + if @@tableheader == 1 + if @string =~/¡\d+?¡(.+?)(?:¡|!)/ + tablefoot=@string[/\<!f(.+?)!\>/,1] + @string.gsub!(/\<!f(.+?)!\>/,'') + @string.gsub!(/¡\d+?¡(.+?)(?:¡|!)/,'\bfseries \1&') + @string.gsub!(/&>\s*$/," #@row_break \\hline\\endhead #@row_break") + @string="#@string \\multicolumn{#{@@number_of_cols}}{l}{\\tiny #{tablefoot}} \\\\ \\hline\n\\endfoot\n\\hline\n" if tablefoot + @@tableheader,@@number_of_cols=0,0 + end + else + if @string =~/¡\d+?¡(.+?)(?:¡|!)/ + @string.gsub!(/¡\d+?¡(.+?)(?:¡|!)/,'\1&') + @string.gsub!(/&>\s*$/," #@row_break") + end + end + @string="<~#{ocn}>" + @string + end + def scopedtable + # some features related to headers have been incorporated in longtable that are not included yet here, + # so until synced is broken on some input files, work needs to be done if is to work as before + @end_table="\\end{tabular}" + @row_break='\\\\\\\\' + @break_page="#@row_break\n#@row_break \n" + if @string[/<!Th?¡\s+c(\d+);(.+?)!>/] + no_of_cols, cols_width=$1,$2 + @w=cols_width.split(/;\s*/) + @colW=[] + @w.each do |x| + col_w=((x.to_i*12)/100.00).to_s #unless x.nil? + @colW << "p{#{col_w}cm}" if col_w + end + @start_table="\\begin{tabular}{#@colW}\n" + @string.gsub!(/<!Th?¡\s+c\d+?;.+!>/,"#@start_table}") + end + if @string =~/<!TZ!>/ + @string.gsub!(/<!TZ!>/,"#@end_table") + @@table_pg_break_counter=1 + end + if @string =~/<!¡/ + if @@table_pg_break_counter == 28 # taken from 34 ideal for portrait to 28 which suits landscape + @string = "\n\n#@end_table \n#@break_page#@start_table\n" + @@table_pg_break_counter=1 + else + @string.gsub!(/<!¡/,'') + @@table_pg_break_counter+=1 + tablefoot=@string[/\<!f(.+?)!\>/,1] + @string.gsub!(/\<!f(.+?)!\>/,'') + end + end + if @string =~/¡\d+?¡(.+?)(?:¡|!)/ + @string.gsub!(/¡\d+?¡(.+?)(?:¡|!)/,"\\1&") + @string.gsub!(/&>\s*$/,"#@row_break") + end + @string + end + def special_characters_1(para) + # ~ ^ $ & % _ { } #LaTeX special characters - KEEP list + #p @@utf_8.list + #@string=Iconv.conv('ISO-8859-1', 'UTF-8', @string) + word=@string.scan(/\S+|\n/) #unless line =~/^(?:0~\S|%+\s)/ + para_array=[] + if word + word.each do |w| # _ - / # | : ! ^ ~ + unless para =~/^(?:0~|%+ |<!Th?¡ )/m + w.gsub!(/[\\]?~/,'<=tilde>') unless w=~/^[1-6]~|~\{|\}~|~\[|\]~|^\^~\s|~\^|\*~\S+|~#|\{t~|<~\d+;(?:[ohmu]|[0-6]:)\d+;\w\d+>/ + w.gsub!(/&#(?:126|152);/,'<=tilde>') #126 usual + #w.gsub!(/&#(?:126|152);/,'<=tilde>') unless w=~/https?:\/\/\S+/ #126 usual + w.gsub!(/\\?\|||/,'<=pipe>') #unless w=~/<~\d+;(?:[ohmu]|[0-6]:)\d+;\w\d+>/ # | SiSU not really special sisu character but done, also LaTeX + end + para_array << w + end + para=para_array.join(' ') + @string=para.strip + end + @string.gsub!(/<~\d+;(?:\w|[0-6]:)\d+;[umdv]\d+><#@dp:#@dp>/,'') + @string.gsub!(/.+?<-#>/,'') + @string.gsub!(/<EOF>/,'') + @string.gsub!(/<ENDNOTES?>/,'') + #problem sequence -> + @string.gsub!(/&(?:nbsp);/,'<=hardspace>') # < SiSU special character also LaTeX + @string.gsub!(/&(?:lt|#060);/,'<=lt>') # < SiSU special character also LaTeX + @string.gsub!(/&(?:gt|#062);/,'<=gt>') # > SiSU special character also LaTeX + @string.gsub!(/{/,'<=curlyopen>') # { SiSU special character also LaTeX + @string.gsub!(/}/,'<=curlyclose>') # } SiSU special character also LaTeX + @string.gsub!(/&#(?:126|152);/,'<=tilde>') # ~ SiSU special character also LaTeX + @string.gsub!(/#/,'\#') # # SiSU special character also LaTeX + @string.gsub!(/!/,'!') # ! SiSU not really special sisu character but done, also LaTeX + @string.gsub!(/*/,'*') # * should you wish to escape astrisk e.g. describing \*{bold}* + @string.gsub!(/-/,'-') # - SiSU special character also LaTeX + @string.gsub!(/+/,'+') # + SiSU special character also LaTeX + @string.gsub!(/,/,',') # + SiSU special character also LaTeX + @string.gsub!(/&/,'<=amp>') #unless @string=~/<:code>/ # / SiSU special character also LaTeX + @string.gsub!(///,'<=slash>') # / SiSU special character also LaTeX + @string.gsub!(/\/,'<=backslash>') # \ SiSU special character also LaTeX + @string.gsub!(/_/,'<=underscore>') # _ SiSU special character also LaTeX + @string.gsub!(/|/,'|') # | SiSU not really special sisu character but done, also LaTeX + @string.gsub!(/:/,':') # : SiSU not really special sisu character but done, also LaTeX + @string.gsub!(/^/,'<=caret>') # ^ SiSU not really special sisu character but done, also LaTeX + @string.gsub!(/\#/,'<=hash>') + ##watch placement, problem sequence ^ + @string.gsub!(/<sup><font face=symbol>&atild;<\/font><\/sup>/,' ') + @string.gsub!(/<:pb>/,'\newpage') + @string.gsub!(/<:pn>/,'\clearpage') + @string.gsub!(/\\copy(right|mark)?/,'<=copymark>') # ok problem with superscript + end + def special_characters_2(para) + @string.gsub!(/œ/,'\oe ') + @string.gsub!(/\$/,'\$') + @string.gsub!(/\#/,'\#') + @string.gsub!(/\%/,'\%') + @string.gsub!(/\~/,'\~') #revist, should not be necessary to mark remaining tildes + if @string !~/^\s*<:image|\}:image\s/ + @string.gsub!(/_/,'\_') + end + @string.gsub!(/\{/,'\{') + @string.gsub!(/\}/,'\}') + @string.gsub!(/ /,'~') # ~ character for hardspace + # sequence important must appear after removal of { and } + @string.gsub!(/&\S+?;/,'') #hmmm + # sequence imortant place before removal of & + if @string=~/<:code>/; @@flag_code=true + elsif @string=~/<:code-end>/; @@flag_code=false + end + if @@flag_code; @string.gsub!(/&/,'{\\\&}') + else @string.gsub!(/(\s+&\s+)/,' and ') + end + @string.gsub!(/§/,'\S') #latex: space between next character not preserved? #@string.gsub!(/§ /,'\S ') + @string.gsub!(/£/,'\pounds') + @string.gsub!(/&\S+?;/,' ') + @string.gsub!(/<a href=".+?">/,' ') + @string.gsub!(/<\/a>/,' ') + if @string !~/^\s*<:image|\}image/ #watch carefully could introduce breaks ! removed \}http changed 0.1.1-4 200501 + if @string =~/(?:https?|ftp):\/\/\S+?<\/\S>/ #problems where have font attribute eg </u> (change substitution sequence?) # [^\}>] added for escaped curly brace <=curlyclose> watch + @string.gsub!(/[^\}>]((?:https?|ftp):\/\/\S+?)(<\/\S>)/,' \begin{scriptsize}\href{\1}{ \1 } \end{scriptsize}\2') + else # regular urls !! http:// href + if @string=~/(?:https?|ftp):\/\/\S+?[,.]? / + @string.gsub!(/(?:^|[^\}>])((?:https?|ftp):\/\/\S+?)([,.])? /,' \begin{scriptsize}\href{\1}{ \1}\end{scriptsize}\2 ') + else @string.gsub!(/(?:^|[^\}>])((?:https?|ftp):\/\/\S+)/,' \begin{scriptsize}\href{ \1 }{\1} \end{scriptsize}') #should not be necessary, not checked + end + end + else #@string =~/\\~\\\{.+?\\\}\\~/ # \\~\\{1 + #@string.gsub!(/(?:\n)?(http:\/\/\S+)/," \\begin{scriptsize}\\href{\\1}{\\1} \\end{scriptsize}") #bug... + end + @string.gsub!(/<:ee>/,'') + @string.gsub!(/<!>/,' ') + #proposed change, insert, but may be redundant + @string.gsub!(/ \/><:i[12]>(.+?)(?:\}~|<br)/,' \begin{ParagraphIndent}{0.01\columnwidth}\1\end{ParagraphIndent} ') # footnote indents, problems if match exists in ordinary paragraphs? check! Work Area 200501 a bit tricky as must be able to match multiple times, and to clean remainder + @string.gsub!(/<(br|p)>|<\/\s*(br|p)>|<(br|p)\s*\/>/," #{@@tex_backslash*2} ") # Work Area + @string.gsub!(/<b>(.+?)<\/b>/,'\begin{bfseries}\1 \end{bfseries}') + @string.gsub!(/<em>(.+?)<\/em>/,'\begin{bfseries}\1 \end{bfseries}') + @string.gsub!(/<(bold|strong)>(.+?)<\/(bold|strong)>/,'\begin{bfseries}\1 \end{bfseries}') + @string.gsub!(/<h\d+>(.+?)<\/h\d+>/,'\begin{bfseries}\1 \end{bfseries}') + @string.gsub!(/<i>(.+?)<\/i>/,'\emph{\1}') + @string.gsub!(/<italic>(.+?)<\/italic>/,'\emph{\1}') + @string.gsub!(/<u>(.+?)<\/u>/,'\uline{\1}') # ulem + @string.gsub!(/<ins>(.+?)<\/ins>/,'\uline{\1}') # ulem + @string.gsub!(/<del>(.+?)<\/del>/,'\sout{\1}') # ulem + @string.gsub!(/<sub>(.+?)<\/sub>/,"\$_{\\textrm{\\1}}\$") + @string.gsub!(/<sup>(.+?)<\/sup>/,"\$^{\\textrm{\\1}}\$") + unless @@flag_code + @string.gsub!(/"(.+?)"/,"``\\1''") # quote marks / quotations open & close " need condition exclude for code + @string.gsub!(/\s+"/,' ``') # open " + @string.gsub!(/^([1-6-]#{@@tilde}\S*|<.+?>)?\s*"/,'\1``') # open " + @string.gsub!(/"(\s|\.|,|:|;)/,"''\\1") # close " + @string.gsub!(/"([1-6-]#{@@tilde}\S*|<.+?>)?\s*$/,"''\\1") # close " + @string.gsub!(/"(\.|,)/,"''") # close " + @string.gsub!(/\s+'/,' `') # open ' + @string.gsub!(/^([1-6-]#{@@tilde}\S*|<.+?>)?\s*'/,'\1`') # open ' + end + @string.gsub!(/^(<:i[12]>)?\s*\\_\*\s*/,'\\1 \begin{math} \bullet \end{math}~~') #bullets - added 2004w17 watch \\_ + @string.gsub!(/(<font.*?>|<\/font>)/,'') + @string.gsub!(/\s*<sup>(\S+?)<\/sup>/,'^\1') + @string.gsub!(/(<sup>|<\/sup>)/,'') + @string + end + def special_characters_3(para) + @string.gsub!(/<br(\s*[^\/][^>])/,'\1') # clean up, incredibly messy :-( footnote indents, problems if match exists in ordinary paragraphs? check! Work Area 200501 a bit tricky as must be able to match multiple times, and to clean remainder + @string.gsub!(/([^<][^b][^r]\s+)\/>/,'\1') # clean up, incredibly messy :-( footnote indents, problems if match exists in ordinary paragraphs? check! Work Area 200501 a bit tricky as must be able to match multiple times, and to clean remainder + #problem sequence (another kludge) -> + @string.gsub!(/<=lt>/,'{\UseTextSymbol{OML}{<}}') + @string.gsub!(/<=gt>/,'{\UseTextSymbol{OML}{>}}') + #@string.gsub!(/<=lt>/,'\<') + #@string.gsub!(/<=gt>/,'\>') + @string.gsub!(/<=underscore>/,'\_') + @string.gsub!(/(\href\{http:\/\/\S+?)(?:(?:<=tilde>)(\S+))+\}/,'\1\~\2}') #tildes in urls \href treated differently from text + @string.gsub!(/<=tilde>/,'{\~~}') + @string.gsub!(/<=pipe>/,'{\textbar}') + @string.gsub!(/<=caret>/,'{\^{~}}') + #@string.gsub!(/<=caret>/,'\^{}') + @string.gsub!(/<=exclaim>/,'\Verbatim{!}') + @string.gsub!(/<=hash>/,'{\#}') + #@string.gsub!(/<=hash>/,'{\UseTextSymbol{OT1}{#}}') + #@string.gsub!(/<=slash>/,'{\slash}') + @string.gsub!(/<=hardspace>/,'{~}') #changed ... 2005 + @string.gsub!(/<=amp>/,'{\\\&}') #changed ... 2005 + #@string.gsub!(/<=amp>/,'{\UseTextSymbol{OT1}{&}}') + @string.gsub!(/<=slash>/,'{/}') + @string.gsub!(/<=backslash>/,'{\textbackslash}') + #@string.gsub!(/<=asterisk>/,'*') + #@string.gsub!(/<=exclaim>/,'!') + #@string.gsub!(/<=asterisk>/,'{\ast}') + #@string.gsub!(/<=copymark>/,"^{\\copyright} ") # watch has been problematic + #copymark='{\\begin{small}\\raisebox{1ex}{\\copyright}\\end{small}} ' + @string.gsub!(/<=copymark>\s*(.+)?\s+(<\\~\d+;\w(?:[0-6]:)?\d+;\w\d+><#@dp:#@dp>)/,"^\\copyright \\textnormal{\\1} \\2") # watch likely to be problematic + @string + end + def special_characters_curly(para) + @string.gsub!(/<=curlyopen>/,'\{') + @string.gsub!(/<=curlyclose>/,'\}') + @string + end + def special_characters_unsafe_1(para) #depreciated, make obsolete + # some substitutions are sequence sensitive, rearrange with care. + @string.gsub!(/\\backslash (copyright|clearpage|newpage)/,"\\\\\\1") #kludge bad solution, find out where tail is sent through specChar ! + end + def special_characters_unsafe_2(para) + end + def special_characters_unsafe_3(para) + end + def special_characters #special characters - some substitutions are sequence sensitive, rearrange with care. + special_characters_1(@string) + special_characters_unsafe_1(@string) + special_characters_2(@string) + special_characters_3(@string) + end + def special_characters_safe #special characters - some substitutions are sequence sensitive, rearrange with care. + special_characters_1(@string) + special_characters_2(@string) + #special_characters_3(@string) + end + def heading_major(para,lev) + title=@md.title + para.strip! if para + para.gsub!(/(?:\\begin\{bfseries\}|\\begin\{itshape\})(.+?)(?:\\end\{bfseries\}|\\end\{itshape\})/m,'\1') + cont_ln=para.dup + cont_ln.gsub!(/#{@@tex_pattern_margin_number}/,'') + cont_ln.gsub!(/#{lev}#{@@tilde}\s+/,'') + if para =~/\\[Ff]ootnote/ #and para =~/^[1-6]#{@@tilde}/ # removing footnotes from headings! + cont_ln.gsub!(/\s*\\footnote\[\d+\]\{%\n .+? \}\s*/,' ') + cont_ln.gsub!(/\s*\\Footnote[A]\{[*+]+\d*\}\{%\n .+? \}\s*/,' ') + end + para.gsub!(/(#{@md.lev}.*)\n?$/m,"\\part*{\\1} +\\addcontentsline{toc}{section}{#{cont_ln}} +\\markboth{#{title}}\n") if (para !~/#{lev}#{@@tilde}/) + para.gsub!(/^#{lev}#{@@tilde}\s*(.*)\n?$/m, + "\\part*{\\1} +\\addcontentsline{toc}{section}{#{cont_ln}} +\\markboth{#{title}}\n") + end + def level1 + heading_major(@string,1) + end + def level2 + heading_major(@string,2) + end + def level3 + heading_major(@string,3) + end + def level4 + @string.strip! if @string + @string.gsub!(/(?:\\begin\{bfseries\}|\\begin\{itshape\})(.+?)(?:\\end\{bfseries\}|\\end\{itshape\})/m,'\1') + cont_ln=@string.dup + cont_ln.gsub!(/#{@@tex_pattern_margin_number}/,'') + cont_ln.gsub!(/#{@@tex_backslash*2}/,"#{@@tex_backslash*4}") # added w42 + cont_ln.gsub!(/4#{@@tilde}\S+\s+/,'') + cont_ln.gsub!(/\\footnote\[\d+\]\{%.+?\\end\{scriptsize\}\s*\}/m,'') #arbitrary bugfix, revisit should not be necessary, eg. wta.1994 2004w22 + cont_ln.gsub!(/\\Footnote[A]\{[*+]+\d*\}\{%.+?\\end\{scriptsize\}\s*\}/m,'') #arbitrary bugfix, revisit should not be necessary, eg. wta.1994 2004w22 + title=@md.title + @string.gsub!(/#{@md.lv4}\s+(#{@md.lv4})/m,'\1') + if @string =~/4#{@@tilde}endnotes|<:4-endnotes>/ + # watch exclusion removes endnotes marker from pdf 2003w03 + @string.gsub!(/.+/m,'') + end + if @string =~/\\footnote/ #and para =~/^[1-6]#{@@tilde}/ # removing footnotes from headings! + cont_ln.gsub!(/\s*\\footnote\[\d+\]\{%\n .+? \}\s*/,' ') + cont_ln.gsub!(/\s*\\Footnote[A]\{[*+]+\d*\}\{%\n .+? \}\s*/,' ') + end + if @string !~/4#{@@tilde}/ + @string.gsub!(/(#{@md.lv4}.*)\n?$/m,"\\subsubsection*{\\1} +\\addcontentsline{toc}{subsection}{#{cont_ln}} +\\markright{#{title}}") + else + @string.gsub!(/^\s*4#{@@tilde}\S+\s*(.*)?\n?$/m,"\\subsubsection*{\\1} +\\addcontentsline{toc}{subsection}{#{cont_ln}} +\\markright{#{title}}") + end + @string.gsub!(/#{@md.lv4}\s*(.marginpar)/m,'\1') + end + def level5 + # there is a problem here with creation of headers does not do what you would want it to header starts with a * and is not in bold work on \\@string*, same for next section 2002w46 + @string.strip! if @string + @string.gsub!(/(?:\\begin\{bfseries\}|\\begin\{itshape\})(.+?)(?:\\end\{bfseries\}|\\end\{itshape\})/m,'\1') + cont_ln=@string.dup + cont_ln.gsub!(/#{@@tex_pattern_margin_number}/,'') + cont_ln.gsub!(/5#{@@tilde}\S*\s+/,'') + cont_ln.gsub!(/\\footnote\[\d+\]\{%.+?\\end\{scriptsize\}\s*\}/m,'') #arbitrary bugfix, revisit should not be necessary, eg. wta.1994 2004w22 + cont_ln.gsub!(/\\Footnote[A]\{[*+]+\d*\}\{%.+?\\end\{scriptsize\}\s*\}/m,'') #arbitrary bugfix, revisit should not be necessary, eg. wta.1994 2004w22 + cont_ln.gsub!(/\\\&/,' and ') #revisit: tmp bugfix 200507, substitutes & with 'and' in toc, needed e.g. for AT&T, see ffa + @string.gsub!(/#{@md.lv5}\s+(#{@md.lv5})/m,'\1') + if @string =~/\\footnote/ #and para =~/^[1-6]#{@@tilde}/ # removing footnotes from headings! + cont_ln.gsub!(/\s*\\footnote\[\d+\]\{%\n .+? \}\s*/,' ') + cont_ln.gsub!(/\s*\\Footnote[A]\{[*+]+\d*\}\{%\n .+? \}\s*/,' ') + end + if @string !~/5#{@@tilde}/ + @string.gsub!(/(#{@md.lv5}.*?)\n?$/m,"\\subsubsection*{\\1} +\\addcontentsline{toc}{subsubsection}{#{cont_ln} \\\\ +}") + else + @string.gsub!(/^\s*5#{@@tilde}\S*\s*(.*)?\n?$/m,"\\subsubsection*{\\1} +\\addcontentsline{toc}{subsubsection}{#{cont_ln} \\\\ +}") + end + @string.gsub!(/#{@md.lv5}\s*(.marginpar)/m,'\1') + end + def level6 + # there is a problem here with creation of headers does not do what you would want it to header starts with a * and is not in bold work on \\sub@string*, same for previous section 2002w46 + @string.strip! if @string + @string.gsub!(/(?:\\begin\{bfseries\}|\\begin\{itshape\})(.+?)(?:\\end\{bfseries\}|\\end\{itshape\})/m,'\1') + cont_ln=@string.dup + cont_ln.gsub!(/#{@@tex_pattern_margin_number}/,'') + cont_ln.gsub!(/6#{@@tilde}\S*\s+/,'') + cont_ln.gsub!(/\\footnote\[\d+\]\{%.+?\\end\{scriptsize\}\s*\}/m,'') #arbitrary bugfix, revisit should not be necessary, eg. wta.1994 2004w22 + cont_ln.gsub!(/\\Footnote[A]\{[*+]+\d*\}\{%.+?\\end\{scriptsize\}\s*\}/m,'') #arbitrary bugfix, revisit should not be necessary, eg. wta.1994 2004w22 + @string.gsub!(/#{@md.lv6}\s+(#{@md.lv6})/m,'\1') + if @string =~/\\footnote/ #and para =~/^[1-6]#{@@tilde}/ # removing footnotes from headings! + cont_ln.gsub!(/\s*\\footnote\[\d+\]\{%\n .+? \}\s*/,' ') + cont_ln.gsub!(/\s*\\Footnote[A]\{[*+]+\d*\}\{%\n .+? \}\s*/,' ') + end + @string.gsub!(/(#{@md.lv6}.*)\n?$/m, + "\\subsubsection*{\\1}") if (@string !~/6#{@@tilde}/) + @string.gsub!(/^\s*6#{@@tilde}\S*\s*(.*)?\n?$/m, + '\subsubsection*{\1}') + @string.gsub!(/#{@md.lv6}\s*(.marginpar)/m,'\1') + #end BUGWATCH + end + def indent1 + @string.gsub!(/<:i1>(.*)/m, + '\begin{ParagraphIndent}{0.01\columnwidth} \1 +\end{ParagraphIndent} +') + end + def indent2 + @string.gsub!(/<:i2>(.*)/m, + '\begin{ParagraphIndent}{0.02\columnwidth} \1 +\end{ParagraphIndent} +') + end + def symbol_graphic + dir=SiSU_Env::Info_env.new(@md.fns) + image='c_' + /<:=\s*(\S+?)\s*>/m.match(@string).captures.join + '.png' #watch + if FileTest.file?("#{dir.path.image_source_tex}/#{image}") + @string.gsub!(/<:=\s*(\S+?)\s*>/, + "\\includegraphics*[width=11pt]{#{dir.path.image_source_tex}/c_\\1.png}") + else + tell=SiSU_Screen::Ansi.new(@md.cmd,"ERROR - image:",%{"#{image}" missing},"search path: #{dir.path.image_source_tex}") + tell.error2 unless @md.cmd =~/q/ + @string.gsub!(/\{\S+\.(png|jpg|gif).+?\}(?:https?|ftp):\/\/\S+/,'') # fragile match operator\\ fragile ! + end + end + def image + dir=SiSU_Env::Info_env.new(@md.fns) + image,m=/<:image\s+(\S+)\s+.+?width=``(\d+)''.+?>/m.match(@string).captures + width=m[1] || '100' + width=width.to_i*0.4 + image_source=if @md.fns =~/\._?sst$/ and FileTest.file?("#{dir.path.image_source_local_tex}/#{image}") + dir.path.image_source_local_tex + elsif @md.fns =~/\.-ss[tm]$/ and FileTest.file?("#{dir.path.image_source_remote_tex}/#{image}") + dir.path.image_source_remote_tex + elsif FileTest.file?("#{dir.path.image_source_tex}/#{image}") + dir.path.image_source_tex + else + tell=SiSU_Screen::Ansi.new(@md.cmd,"ERROR - image:",%{"#{image}" missing},"search locations: #{dir.path.image_source_local_tex},#{dir.path.image_source_remote_tex} and #{dir.path.image_source_tex}") + tell.error2 unless @md.cmd =~/q/ + nil + end + if image_source + @string.gsub!(/<:image\s+((?:https?|ftp)\S+)\s+(\S+)\s+.+\s+?>/, + @center_begin + "\\href{\\1}{\\includegraphics*[width=#{width}pt]{#{image_source}/\\2}}" + @center_end ) + @string.gsub!(/<:image\s+(\S+)\s+.+\s+?>/, + @center_begin + "\\includegraphics*[width=#{width}pt]{#{image_source}/\\1}" + @center_end ) + else @string.gsub!(/<:image\s+(\S+)\s+.+\s+?>/,'\1}') + end + end + def png #fc missing image check + dir=SiSU_Env::Info_env.new(@md.fns) + # messy clean up + z=@string[/\\\{(\S.+?)\}(?:image|png)/,1].strip if @string =~ /\\\{\S.+?\}(?:image|png)/ # match operator for z \\ fragile ! + if z #debug 2004w14 + image=z[/(\S+?\.(?:png|jpg|gif)\b)/m] + image.gsub!(/\\/,'') + width=if z =~ /\d+x\d*/ + w=(z[/(\d+)x\d*/,1]).to_i + w*0.8 + else '100' #revisit, is bug for small images/icons + end + width='380' if width.to_i > 380 + c=z[/``(.+?)''/m] + end + hsp="\n{\\color{mywhite} .}&~\n" # ~ character for hardspace + caption="{\\\\\\\ \n\\begin{scriptsize}#{hsp*3}#{c}\\end{scriptsize}&}" if c + #caption="{\\\\\\\ \n\\begin{scriptsize}#{hsp*3}#{c[1]}\\end{scriptsize}&}" if c + image_source=if @md.fns =~/\._?sst$/ and FileTest.file?("#{dir.path.image_source_local_tex}/#{image}") + dir.path.image_source_local_tex + elsif @md.fns =~/\.-ss[tm]$/ and FileTest.file?("#{dir.path.image_source_remote_tex}/#{image}") + dir.path.image_source_remote_tex + elsif FileTest.file?("#{dir.path.image_source_tex}/#{image}") + dir.path.image_source_tex + else + unless image.nil? or image.length < 2 + tell=SiSU_Screen::Ansi.new(@md.cmd,"ERROR - image:",%{"#{image}" missing},"search locations: #{dir.path.image_source_local_tex},#{dir.path.image_source_remote_tex} and #{dir.path.image_source_tex}") + tell.error2 unless @md.cmd =~/q/ + end + nil + end + if image_source + @string.gsub!(/\\\{\S+\.(png|jpg|gif).+?\}(image|png)/, # fragile match operator\\ fragile ! + "#@center_begin\n\\includegraphics*[width=#{width}pt]{#{image_source}/#{image}}#{caption}#@center_end") + else + @string.gsub!(/\\\{\S+\.(png|jpg|gif).+?\}(image|png)/,'') # fragile match operator\\ fragile ! + end + end + def http_word_mode(orientation='') + # clean up ! - work area, testing + dir=SiSU_Env::Info_env.new(@md.fns) + @words=[] + @string.each do |word| + @words << if word=~/\{.+?\}(?:https?|ftp):\S+/ + if word =~/\\\{(.+?)\\\}((?:https?|ftp)\S+?)([.,](?:\s|$))/ + r=%r/\\\{(.+?)\\?\}((?:https?|ftp):\S+?)(?:[.,](?:\s|$)|(?:\s|$))/ + d=/\\\{.+?\\?\}(?:https?|ftp):\S+([.,](?:\s|$))/.match(word).captures.to_s + else + r=%r/\\\{(.+?)\\?\}((?:https?|ftp):\S+)/ + d='' + end + z,url=r.match(word).captures if word =~r + url=url.strip + if word =~/\{\s*\S+\.?(?:png|jpg|gif)/ and word=~/\s+\d+x\d+\s+/ + image,x,y=z.scan(/\S+/) + image.gsub!(/\\/,'') + width=200 + width=z[/(\d+)x\d*/,1] ||='200' #watch + dm=case @md.papersize + when /a4/; @tx.a4 + when /letter/; @tx.letter + when /legal/; @tx.legal + when /b5/; @tx.b5 + when /a5/; @tx.a5 + else @tx.a4 + end + ##dm=SiSU_Env::Get_init.instance.tex(@md.papersize).dimensions #test! + #dm=SiSU_Viz::TeX.new(@md.papersize).dimensions + width=if orientation =~/portrait/ #value is not currently passed + width=if width.to_i > dm.portrait.img_px; dm.portrait.img_px + else width + end + else + width=if width.to_i > dm.landscape.img_px; dm.landscape.img_px + else width + end + end + c=z[/``(.+?)''/m,1] + hsp="\n{\\color{mywhite} .}&~\n" # ~ character for hardspace + caption="{\\\\\ \n\\begin{scriptsize}#{hsp*3}#{c}\\end{scriptsize}&}" if c + elsif word =~/\{\s*(\S+\.?\.(?:png|jpg|gif))/ + tell=SiSU_Screen::Ansi.new(@md.cmd,%{document built without image: "#{$1}" as image dimensions not provided (& librmagick-ruby is not installed)?\n}) + tell.print_grey #unless @opt.cmd =~/q/ + end + ins=if image #most images fc etc. #% clean up ! + out=if @md.fns =~/\._?sst$/ and FileTest.file?("#{dir.path.image_source_local_tex}/#{image}") + @center_begin + + "\\\n\\href{#{url}}" + #not satisfactory: \\ added to ^line to mimic reference file output + "{\\includegraphics*[width=#{width}pt]" + + "{#{dir.path.image_source_local_tex}/#{image}}}" + + "#{caption}" + + @center_end if word =~ /(\{[a-zA-Z0-9_\\]+\.(?:png|jpg|gif).+?\}(?:https?|ftp):\/\/\S+)/ + elsif @md.fns =~/\.-ss[tm]$/ and FileTest.file?("#{dir.path.image_source_remote_tex}/#{image}") + @center_begin + + "\\\n\\href{#{url}}" + #not satisfactory: \\ added to ^line to mimic reference file output + "{\\includegraphics*[width=#{width}pt]" + + "{#{dir.path.image_source_remote_tex}/#{image}}}" + + "#{caption}" + + @center_end if word =~ /(\{[a-zA-Z0-9_\\]+\.(?:png|jpg|gif).+?\}(?:https?|ftp):\/\/\S+)/ + elsif FileTest.file?("#{dir.path.image_source_tex}/#{image}") + @center_begin + + "\\\n\\href{#{url}}\n" + #not satisfactory: \\ added to ^line to mimic reference file output, mirror above ... not tested + "{\\includegraphics*[width=#{width}pt]" + + "{#{dir.path.image_source_tex}/#{image}}}" + + "#{caption}" + + @center_end if word =~/(\{[a-zA-Z0-9_\\]+\.(?:png|jpg|gif).+?\}(?:https?|ftp):\/\/\S+)/ + else + tell=SiSU_Screen::Ansi.new(@md.cmd,"ERROR - image:",%{"#{image}" missing},"search locations: #{dir.path.image_source_local_tex},#{dir.path.image_source_remote_tex} and #{dir.path.image_source_tex}") + tell.error2 unless @md.cmd =~/q/ + '' if word =~ /\{\S+\.(png|jpg|gif).+?\}(?:https?|ftp):\/\/\S+/ + end + else + link=z.strip #[/(.+?)\\/m,1] + word="\\href{#{url}}{#{link}}#{d}" if word =~/\\\{.+?\\\}(?:https?|ftp):\/\/\S+/ + end + else word + end + end + @words.join + end + def http(orientation) + wm=@string.dup.scan(/\\\{.+?\\\}(?:(?:https?|ftp):\S+|image)|\w+\s*|./m) #first match of interest others passed through + @string=SiSU_TeX_Pdf::Format_text_object.new(@md,wm).http_word_mode(orientation) + end + def language + @lang=if @md.dc_language[:code] + case @md.dc_language[:code] + when 'en'; 'english' + when 'us'; 'USenglish' # depreciated, see iso-639-2 + when 'fr'; 'french' + when 'de'; 'ngerman' + when 'it'; 'italian' + when 'es'; 'spanish' + when 'pt'; 'portuges' + #when 'br'; 'brazilian' # depreciated, see iso-639-2 + when 'sv'; 'swedish' + when 'da'; 'danish' + when 'fi'; 'finnish' + when 'no'; 'norske,nynorsk' + when 'is'; 'icelandic' + when 'nl'; 'dutch' + when 'et'; 'estonian' + when 'hu'; 'magyar' + when 'pl'; 'polish' + when 'ro'; 'romanian' + when 'ru'; 'russian' + when 'gl'; 'greek' + when 'uk'; 'ukrainian' + when 'tr'; 'turkish' + when 'sk'; 'slovak' + when 'sl'; 'slovenian' + when 'hr'; 'croatian' + when 'cs'; 'czech' + when 'bg'; 'bulgarian' + else 'english' + end + else 'english' + end + end + def title + @string=Format_text_object.new(@md,@string).special_characters_safe + if @string1 + @string1=Format_text_object.new(@md,@string1).special_characters_safe + @string1.gsub!(/\$/,"\\$") + "\n\\title{#@string#{@@tex_backslash*2} \\textbf{\\normalsize #@string1}\\normalsize}" + else "\n\\title{#@string}" + end + end + def title_landscape + title + end + def title_portrait + title + end + def tex_head_lang #babel 18n + language + #@md.dc_language[:name] + lang=if @lang =~/^(?:en)$/; @lang + else "#@lang,english" + end + end + def tex_head_encode + case @md.file_encoding + when /iso-?8859/i #% iso8859 + <<WOK +\\usepackage[latin1]{inputenc} +WOK + else #% utf-8 assumed + <<WOK +\\usepackage{babel} +\\usepackage{ucs} +\\usepackage[utf8x]{inputenc} +WOK + end + end + def tex_head_info + generator="Generated by: #{@md.sisu_version[:project]} #{@md.sisu_version[:version]} of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" if @md.sisu_version[:version] + lastdone="Last Generated on: #{Time.now}" + rubyv="Ruby version: #{@md.ruby_version}" + <<WOK +%% Sisu Sabaki (Linux & Ruby - \"better ways\") LaTeX output +%% #{generator} +%% #{rubyv} +%% LaTeX output +%% #{lastdone} +%% SiSU http://www.jus.uio.no/sisu +WOK + end + def tex_head_paper_portrait(d) + <<WOK +#{tex_head_info} +\\documentclass[#{d[:fontsize]},#{d[:papertype]},#{tex_head_lang},titlepage]{scrartcl} %with titlepage +\\setlength{\\textheight}{#{d[:textheight]}mm} \\setlength{\\textwidth}{#{d[:textwidth]}mm} +\\setlength{\\oddsidemargin}{#{d[:oddsidemargin]}} \\setlength{\\evensidemargin}{#{d[:evensidemargin]}} +\\setlength{\\topmargin}{#{d[:topmargin]}} \\setlength{\\headheight}{#{d[:headheight]}} +\\setlength{\\headsep}{#{d[:headsep]}} +\\setlength{\\marginparsep}{#{d[:marginparsep]}} +\\setlength{\\marginparwidth}{#{d[:marginparwidth]}} +WOK + end + def tex_head_paper_landscape(d) + <<WOK +#{tex_head_info} +\\documentclass[#{d[:fontsize]},#{d[:papertype]},#{tex_head_lang}, landscape, titlepage, twocolumn]{scrartcl} %with titlepage +\\setlength{\\textheight}{#{d[:textheight]}mm} \\setlength{\\textwidth}{#{d[:textwidth]}mm} +\\setlength{\\oddsidemargin}{#{d[:oddsidemargin]}} \\setlength{\\evensidemargin}{#{d[:evensidemargin]}} +\\setlength{\\topmargin}{#{d[:topmargin]}} \\setlength{\\headheight}{#{d[:headheight]}} +\\setlength{\\headsep}{#{d[:headsep]}} +\\setlength{\\columnsep}{#{d[:columnsep]}} +\\setlength{\\marginparsep}{#{d[:marginparsep]}} +\\setlength{\\marginparwidth}{#{d[:marginparwidth]}} +WOK + end + def tex_head_paper_dimensions + d={} + case @string + when /portrait/ + #textheight,textwidth=@tx.a4.portrait.h,@tx.a4.portrait.w + d[:papertype],d[:fontsize]='a4paper','11pt' + d[:oddsidemargin],d[:evensidemargin],d[:topmargin]='0mm','0mm','-12pt' + d[:headheight],d[:headsep],d[:columnsep]='12pt','35pt','' + d[:marginparsep],d[:marginparwidth]='4mm','8mm' + case @md.papersize + when /a4/i #European default, SiSU default + d[:papertype],d[:fontsize]='a4paper','12pt' + d[:textheight],d[:textwidth]=@tx.a4.portrait.h,@tx.a4.portrait.w + when /letter/i #U.S. default + d[:papertype],d[:fontsize]='letterpaper','12pt' + d[:textheight],d[:textwidth]=@tx.letter.portrait.h,@tx.letter.portrait.w + when /legal/i #U.S. alternative + d[:papertype],d[:fontsize]='legalpaper','12pt' + d[:textheight],d[:textwidth]=@tx.legal.portrait.h,@tx.legal.portrait.w + when /book|b5/i #book default - larger + d[:papertype],d[:fontsize]='b5paper','11pt' + d[:textheight],d[:textwidth]=@tx.b5.portrait.h,@tx.b5.portrait.w + when /a5/i + d[:papertype],d[:fontsize]='a5paper','11pt' + d[:textheight],d[:textwidth]=@tx.a5.portrait.h,@tx.a5.portrait.w + else #default currently A4 + d[:papertype],d[:fontsize]='a4paper','12pt' + d[:textheight],d[:textwidth]=@tx.a4.portrait.h,@tx.a4.portrait.w + end + when /landscape/ + #d[:textheight],d[:textwidth]=@tx.a4.landscape.h,@tx.a4.landscape.w + d[:papertype],d[:fontsize]='a4paper','11pt' + d[:oddsidemargin],d[:evensidemargin],d[:topmargin]='-8mm','-8mm','-18mm' + d[:headheight],d[:headsep],d[:columnsep]='12pt','20pt','40pt' + d[:marginparsep],d[:marginparwidth]='4mm','8mm' + case @md.papersize + when /a4/i #European default, SiSU default + d[:papertype],d[:fontsize]='a4paper','12pt' + d[:textheight],d[:textwidth]=@tx.a4.landscape.h,@tx.a4.landscape.w + when /letter/i #U.S. default + d[:papertype],d[:fontsize]='letterpaper','11pt' + d[:textheight],d[:textwidth]=@tx.letter.landscape.h,@tx.letter.landscape.w + when /legal/i #U.S. alternative + d[:papertype],d[:fontsize],d[:columnsep]='legalpaper','11pt','48pt' + d[:textheight],d[:textwidth]=@tx.legal.landscape.h,@tx.legal.landscape.w + when /book|b5/i #book default - larger + d[:papertype],d[:fontsize],d[:columnsep]='b5paper','11pt','35pt' + d[:textheight],d[:textwidth]=@tx.b5.landscape.h,@tx.b5.landscape.w + when /a5/i + d[:papertype],d[:fontsize],d[:columnsep]='a5paper','10pt','38pt' + d[:textheight],d[:textwidth]='10pt',@tx.a5.landscape.h,@tx.a5.landscape.w + else #default currently A4 + d[:papertype],d[:fontsize]='a4paper','12pt' + d[:textheight],d[:textwidth]=@tx.a4.landscape.h,@tx.a4.landscape.w + end + end + d + end + def tex_head_paper + d={} + case @string + when /portrait/ + tex_head_paper_portrait(tex_head_paper_dimensions) + when /landscape/ + tex_head_paper_landscape(tex_head_paper_dimensions) + end + end + def tex_head_pdftex + color=case @string + when /portrait/ + <<WOK + colorlinks=true, + urlcolor=myblack, + filecolor=myblack, + linkcolor=myblack, +WOK + when /landscape/ + <<WOK + colorlinks=true, + urlcolor=myblue, % \\href{...}{...} external url + filecolor=mygreen, % \\href{...} local file + linkcolor=myred, % \\href{...} and \\pageref{...} +WOK + end + <<WOK +\\usepackage{url} +\\usepackage{alltt} +\\usepackage{thumbpdf} +\\usepackage[pdftex, + #{color.strip} + pdftitle={#@string1}, +% pdftitle={Untitled}, + pdfauthor={LM-sisu-scribe}, + pdfsubject={law}, + pdfkeywords={law}, + pageanchor=true, + plainpages=true, + pdfpagelabels=true, + pagebackref, + bookmarks=true, + bookmarksopen=true, + pdfmenubar=true, + pdfpagemode=UseOutline, + pdffitwindow=true, + pdfwindowui=true, + plainpages=false, +% pdfusetitle=true, +% pdfpagelayout=SinglePage, +% pdfpagelayout=TwoColumnRight, +% pdfpagelayout=TwoColumnLeft, +% pdfstartpage=3, + pdfstartview=FitH +] +{hyperref} +\\usepackage[usenames]{color} +\\definecolor{myblack}{rgb}{0,0,0} +\\definecolor{myred}{rgb}{0.75,0,0} +\\definecolor{mygreen}{rgb}{0,0.5,0} +\\definecolor{myblue}{rgb}{0,0,0.5} +\\definecolor{mywhite}{rgb}{1,1,1} +WOK + end + def tex_head_misc + <<WOK +\\usepackage{textcomp} +\\usepackage[parfill]{parskip} +\\usepackage[normalem]{ulem} +\\usepackage{soul} +\\usepackage{longtable} +\\usepackage{graphicx} +\\makeatletter +\\parindent0pt +\\usepackage{mathptmx} +\\usepackage{amssymb} +% amssymb used for backslash +WOK + end + def document_head_with_orientation + endnotes=("\\usepackage{endnotes}" if @string =~/endnotes?/)||'' #not implemented see also def endnotes + language + <<WOK +#{tex_head_paper} +#{tex_head_encode} +#{tex_head_pdftex} +#{tex_head_misc} +\\setcounter{secnumdepth}{2} +\\setcounter{tocdepth}{4} +\\makeatletter +#{endnotes} +\\usepackage[multiple,marginal]{footmisc} +% \\setlength\\footnotemargin{40pt} +\\usepackage[para]{manyfoot} +\\DeclareNewFootnote{A} +%\\DeclareNewFootnote[para]{A} +\\newenvironment{ParagraphIndent}[1]% +{ +\\begin{list}{}{% +\\setlength\\topsep{0pt}% +\\addtolength{\\leftmargin}{#1} +\\setlength\\parsep{0pt plus 1pt}% +} +\\item[] +} +{\\end{list}} +\\usepackage{fancyhdr}\n\\lhead{} +\\renewcommand{\\part}{\\\@startsection +{part}% +{1}% +{-2mm}% +{-\\baselineskip}% +{0.5\\baselineskip}% +{\\bfseries\\large\\scshape}}% +\\renewcommand{\\section}{\\\@startsection +{section}% +{2}% +{-2mm}% +{-\\baselineskip}% +{0.5\\baselineskip}% +{\\bfseries\\Large\\upshape}}% +\\renewcommand{\\subsection}{\\\@startsection +{subsection}% +{3}% +{-2mm}% +{-\\baselineskip}% +{0.5\\baselineskip}% +{\\bfseries\\large\\upshape}}% +\\renewcommand{\\subsubsection}{\\\@startsection +{subsubsection}% +{4}% +{-2mm}% +{-\\baselineskip}% +{0.5\\baselineskip}% +{\\bfseries\\normalsize\\upshape}}% +\\renewcommand{\\paragraph}{\\\@startsection +{paragraph}% +{5}% +{-2mm}% +{-\\baselineskip}% +{0.5\\baselineskip}% +{\\normalfont\\normalsize\\itshape}}% +\\renewcommand{\\subparagraph}{\\\@startsection +{subparagraph}% +{6}% +{-2mm}% +{-\\baselineskip}% +{0.5\\baselineskip}% +{\\normalfont\\normalsize\\itshape}}%\n +\\selectlanguage{#{language}} +WOK + end + def a4generic + end + def para_num + paranumber_display=if @md.mod.inspect =~/--no-ocn/; '' #!ocn no object citation numbering + else "\\begin{tiny}~\\end{tiny}{\\marginpar{\\begin{tiny}#@string1\\end{tiny}}}" #ocn object citation numbering + end + if @string !~/^([1-6a-z-]#{@@tilde}\S*|<:.+?>|#{@md.lv1}|#{@md.lv2}|#{@md.lv3}|#{@md.lv4}|#{@md.lv5}|#{@md.lv6})/ + @string.gsub!(/^\s*(.+)/m,"#{paranumber_display}\\1\n") #watch - in 1-6 is suspect + else + if (@string =~/^(?:[1-6a-z-]#{@@tilde}\S*|<:.+?>)/) #watch - in 1-6 is suspect + @string.gsub!(/^([1-6a-z-]#{@@tilde}\S*|<:.+?>)\s*(.+)/m,"\\1 #{paranumber_display} \\2\n") #watch - in 1-6 is suspect + else + @string.gsub!(/(#{@md.lv1}.+)$/,"#{@md.lv1} #{paranumber_display}\\1\n") + @string.gsub!(/(#{@md.lv2}.+)$/,"#{@md.lv2} #{paranumber_display}\\1\n") + @string.gsub!(/(#{@md.lv3}.+)$/,"#{@md.lv3} #{paranumber_display}\\1\n") + @string.gsub!(/(#{@md.lv4}.+)$/,"#{@md.lv4} #{paranumber_display}\\1\n") + @string.gsub!(/(#{@md.lv5}.+)$/,"#{@md.lv5} #{paranumber_display}\\1\n") + @string.gsub!(/(#{@md.lv6}.+)$/,"#{@md.lv6} #{paranumber_display}\\1\n") + end + end + @string + end + def lev1 + end + def lev2 + end + def lev3 + end + def lev4 + end + def lev5 + end + def lev6 + end + end +end +__END__ diff --git a/lib/sisu/0.52/update.rb b/lib/sisu/0.52/update.rb new file mode 100644 index 00000000..811e0946 --- /dev/null +++ b/lib/sisu/0.52/update.rb @@ -0,0 +1,123 @@ +=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: update previous output (with similar output file type formats) + + * 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_Update_control_flag + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Param + class Check + def initialize(opt) + @opt=opt + @md=SiSU_Param::Parameters.new(@opt).get + end + def read + begin + @env=SiSU_Env::Info_env.new(@md.fns) + out=@env.path.output + base_path="#{out}/#{@md.fnb}" + tell=SiSU_Screen::Ansi.new(@md.cmd,'Checking previous output',base_path) + tell.green_hi_blue unless @md.cmd =~/q/ + Set_CF.new(@md).set_flags + rescue; SiSU_Errors::Info_error.new($!,$@,@md.cmd,@md.fns).error + ensure + end + end + private + class Set_CF + def initialize(md) + @md=md + @env=SiSU_Env::Info_env.new(@md.fns) + out=@env.path.output + @base_path="#{out}/#{@md.fnb}" + end + def set_flags #-mNhwpoabxXyv + flag='-v' + if FileTest.file?("#@base_path/#{@md.fn[:doc]}")==true + flag=flag + 'a' + end + if FileTest.file?("#@base_path/#{@md.fn[:toc]}")==true \ + or FileTest.file?("#@base_path/#{@md.fn[:doc]}")==true + flag=flag + 'h' + end + if FileTest.file?("#@base_path/#{@md.fn[:xhtml]}")==true + flag=flag + 'b' + end + if FileTest.file?("#@base_path/#{@md.fn[:sax]}")==true + flag=flag + 'x' + end + if FileTest.file?("#@base_path/#{@md.fn[:dom]}")==true + flag=flag + 'X' + end + if FileTest.file?("#@base_path/#{@md.fn[:odf]}")==true + flag=flag + 'o' + end + if FileTest.file?("#@base_path/#{@md.fn[:pdf_p]}")==true \ + or FileTest.file?("#@base_path/#{@md.fn[:pdf_l]}")==true + flag=flag + 'p' + end + if FileTest.file?("#@base_path/#{@md.fn[:concordance]}")==true + flag=flag + 'w' + end + if FileTest.file?("#@base_path/#{@md.fn[:digest]}")==true + flag=flag + 'N' + end + if FileTest.file?("#@base_path/#{@md.fns}")==true + flag=flag + 's' + end + if FileTest.file?("#@base_path/sisupod.tgz")==true + flag=flag + 'S' + end + puts flag + flag + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/urls.rb b/lib/sisu/0.52/urls.rb new file mode 100644 index 00000000..22f929e8 --- /dev/null +++ b/lib/sisu/0.52/urls.rb @@ -0,0 +1,229 @@ +=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: urls for output files + + * 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_urls + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Screen + require SiSU_lib + '/param' + include SiSU_Param + class Source + attr_reader :opt + def initialize(opt) + @opt=opt + end + def read + begin + SiSU_urls::Output_urls.new(@opt).songsheet if @opt.fnb #fnb[/.+?\.(?:[_-]?sst|ssm)$/] + rescue; SiSU_Errors::Info_error.new($!,$@,nil,@opt.cmd).error + ensure + end + end + end + class Output_urls + include SiSU_Param + attr_reader :fns,:fnb,:cmd,:dir,:m_regular,:u + def initialize(opt) + @opt=opt + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(@opt.fns) + @cmd=@opt.cmd + env=SiSU_Env::Env_call.new(@opt.fns) + @fnb=env.fnb + @env=SiSU_Env::Info_env.new(@opt.fns) + fn_set_lang=SiSU_Env::Standardise_language.new.file_to_language(@opt.fns) + @fnl=@env.i18n.lang_filename(fn_set_lang[:c]) + @fn=SiSU_Env::Env_call.new(@opt.fns).lang(fn_set_lang[:c]) + @m_regular=/(.+?)\.(?:[_-]?sst|ssm)$/ + @path=SiSU_Env::Info_env.new(@opt.fns) + @webserv_url=@path.url.output_tell + @tool=@env.program.text_editor + @editor=@env.program.text_editor + @browser=@env.program.web_browser + @console_browser=@env.program.console_web_browser + @pdf_viewer=@env.program.pdf_viewer + @odf_viewer=@env.program.odf_viewer + source=if @opt.fns =~/\.sst$/; @opt.fns + elsif @opt.fns =~/\._sst/; "#@fnb.composite.sst" + else 'not recognised file' + end + @u ||= { + 'a (Plain-text (footnotes))'=>@fn[:plain], + 'A (Plain-text (footnotes) dos)'=>@fn[:plain], + 'b (XHTML)'=>@fn[:xhtml], + 'B (Docbook XML)'=>@fn[:docbook], + 'D[iu] (DBI import/update postgresql)'=>'dbi psql', + 'd[iu] (DBI import/update sqlite)'=>'dbi sqlite', + 'e (Plain-text (endnotes))'=>@fn[:plain], + 'E (Plain-text (endnotes) dos)'=>@fn[:plain], + 'h (HTML segmented)'=>@fn[:toc], + 'H (HTML segmented)'=>@fn[:toc], + 'h (HTML scroll)'=>@fn[:doc], + 'H (HTML scroll)'=>@fn[:doc], + 'I (Info file)'=>'info', + 'm (Document Abstraction)'=>'dal', + 'N (Digests md5/sha256)'=>@fn[:digest], + 'o (ODF:ODT - Open Document)'=>@fn[:odf], + 'p (PDF landscape)'=>@fn[:pdf_l], + 'p (PDF portrait)'=>@fn[:pdf_p], + 'P[iu] (DB postgresql import/update)'=>'psql', + 's (sisu markup)'=>source, + 'S (sisupod)'=>'sisupod.zip', + 'x (XML sax type)'=>@fn[:sax], + 'X (XML dom type)'=>@fn[:dom], + 'y (Manifest, html)'=>@fn[:manifest], + 'Y (Sitemap, xml)'=>@fn[:sitemap], + 'w (Concordance, html)'=>@fn[:concordance], + }.sort {|a,b| a[0].downcase<=>b[0].downcase} + end + def songsheet + begin + urls_all if @opt.cmd=~/U/ + urls_select if @opt.cmd=~/[uvVM]/ + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + def urls_maintenance(opt,x,y) + if x=~/^([aAbBceEhHmNopwxXy])/ and opt.cmd =~/[aAbBceEhHmNopwxXy]/ and x=~/^[#{opt.cmd}]/ + m=$1 + f=y + tool=@editor + if x =~/^m/ and @opt.cmd=~/m/ and x=~/^[#{opt.cmd}]/ and @opt.cmd =~/M/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#@editor #{@env.path.dal}/#{@opt.fns}.meta") + tell.maintenance unless @opt.cmd =~/q/ + end + if x=~/^([hHw])/ and @opt.cmd=~/[hHw]/ and x=~/^[#{@opt.cmd}]/ + f=if x !~/segmented/; "#{y}.html" + else "#{y}.index.html" + end + end + if x=~/^p/ and @opt.cmd=~/p/ and x=~/^[#{@opt.cmd}]/ + tool=@pdf_viewer + if opt.cmd =~/M/ + fns=@opt.fns.gsub(/~/,'-') + tell=if y =~/landscape/ + SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#@editor #{@env.path.tex}/#{fns}.landscape.tex") + else SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#@editor #{@env.path.tex}/#{fns}.tex") + end + tell.maintenance unless @opt.cmd =~/q/ + end + end + if x=~/^o/ and @opt.cmd=~/o/ and x=~/^[#{@opt.cmd}]/ + tool=@odf_viewer + end + if x !~/^m/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#{tool} #{@env.path.output}/#@fnb/#{y}") + tell.maintenance unless @opt.cmd =~/q/ + end + @opt.cmd.gsub!(/#{m}/,'') + end + end + def urls_select + tell=SiSU_Screen::Ansi.new(@opt.cmd,"URLs") + tell.grey_title_hi unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output}/#@fnb") + tell.flow unless @opt.cmd =~/q/ + m=/.+\/(\S+)/m + @pwd_stub="#@webserv_url"[m,1] + @u.each do |x,y| + if @opt.fns =~ @m_regular + if x=~/^([aAbBceEhHNopsSwxXyY])/ and @opt.cmd=~/[aAbBceEhHNopsSwxXyY]/ and x=~/^[#{@opt.cmd}]/ + m=$1 + tell=SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#@browser #@webserv_url/#@fnb/#{y}") + tell.result unless @opt.cmd =~/q/ + @opt.cmd.gsub!(/#{m}/,'') + end + if x=~/^I/ and @opt.cmd =~/I/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","cd #{@path.path.texinfo}; pinfo ./#@fnb.#{y}; cd -") + tell.result unless @opt.cmd =~/q/ + @opt.cmd.gsub!(/I/,'') + end + if x=~/^D/ and @opt.cmd =~/D/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"-#{x} DBI psql","#@pwd_stub::#{@opt.fns}",y) + tell.result unless @opt.cmd =~/q/ + @opt.cmd.gsub!(/D[iu]/,'') + end + if x=~/^d/ and @opt.cmd =~/d/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"-#{x} DBI sqlite","sqlite #{@env.path.output}/sisu_sqlite.db", "#{y}") + tell.result unless @opt.cmd =~/q/ + @opt.cmd.gsub!(/d[iu]/,'') + end + if x=~/^P/ and @opt.cmd =~/P/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,"-#{x} Psql","#@pwd_stub::#{@opt.fns}",y) + tell.result unless @opt.cmd =~/q/ + @opt.cmd.gsub!(/P[iu]/,'') + end + urls_maintenance(@opt,x,y) if @opt.cmd =~/[MV]/ + end + end + end + def urls_all + tell=SiSU_Screen::Ansi.new(@opt.cmd,'URLs') + tell.grey_title_hi unless @opt.cmd =~/q/ + tell=SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output}/#@fnb") + tell.flow unless @opt.cmd =~/q/ + @u.each do |x,y| + tell=case x + when /^m/ + SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#{@env.program.text_editor} ~#{y}/#@fnb.#{y}") + when /^[aAbBcdeEhHNopswxXy]/ + tellx=SiSU_Screen::Ansi.new(@opt.cmd,"-p (LaTeX)","#{@env.program.text_editor} ~work/tex_rz/#@fnb.tex") if y=~/landscape/ + SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#@browser #@webserv_url/#@fnb/#{y}") + when /^Y/ + SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","#@browser #@webserv_url/sitemap/#{y}") + when /^I/ + SiSU_Screen::Ansi.new(@opt.cmd,"-#{x}","cd #{@path.path.texinfo}; pinfo ./#@fnb.#{y}; cd -") + end + tellx.result if tellx + tell.result if tell + tellx=nil + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/vocab.rb b/lib/sisu/0.52/vocab.rb new file mode 100644 index 00000000..f0d7a405 --- /dev/null +++ b/lib/sisu/0.52/vocab.rb @@ -0,0 +1,113 @@ +=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: Vocabulary, wordlist (first usd by concordance) + + * 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 Wordlists + class Lists + def initialize + end + def scanlist + /(?:<i>(?:[\w0-9"]+[\s]*){2,7}<\/i>|<b>(?:[\w0-9"]+[\s]*){2,7}<\/b>|http:\/\/\S+)|code\{.+?\}code|<\S+?>|\w+/mi + end + def lesser + /^(?: + a|about|all|also|although|am|an[dy]?|approach(?:es|ed)?|are|around|a[st]|availab(?:ility|le)| + b|back|be|been|both|but|by| + c|can|close|come|could| + d|damaged?|did|do|does|doing|done|down| + e|each|early|easy|eight|end|even|every(?:thing)?|exist(?:ed|ence|ing|s)?| + f|fair|fall|familiar|feature[ds]?|fees?|few|first(?:ly)?|five|fix(?:ed)?|for|form|forecast(?:ed|s|ing)?|four|frequent(?:ed|ly)?|from|frustration|fully?|fundamental| + g|generally|get|give|go|got|gone| + h|had|half|has|have|height?|held|her|here|him|his|hmm+|hold|how(?:ever)?|html|https?|ftp| + i|if|in|include|inclusion|info|initial|initially|inquire|insofar|instead|interest(?:ed|ing|ingly|s)|in(?:to)?|introduc(?:e|tion)|is|it|like(?:ly|wise)?| + k|kee[np]|kept|key|kn[eo]w| + l|large(?:ly)?|later?|lead|least|le[dt]|less|like(?:ly)?|list(?:ed|s)?|little|long(?:er)?|looks?|lots?|low(?:er)?| + m|made|main|major|mak(?:es?|ing)|many|may|maybe|mean|ment|mid|might|minor|miss|more|most(?:ly)?|move[ds]?|movement|moving|much| + n|needs?|new|next|nine|no[nrtw]?| + o|off?|often|old|on|one|or|once|one|only|open|other(s|wise)?|our|out|outline|output|over|overview|own| + p|particularly|partly|pass|past|pay|pdf|perhaps|please|post|potential|practical(?:ly)?|pre|prefer|presum(?:e|ably|s)|problem(atic|s)?|pull|push|put| + q|quite| + r|ran|range|rather|read|real|reasonable|receive|recent|recogni[sz]e|reduce|refer|reference|relative|regard(?:ing|less|s)?|really|release|relevant|remarks?|remove|repeat|result|return|run| + s|say|search|second(?:ly)?|see(?:[kn]|ing|ingly|ms?)?|sen[dt]|separate|self|set|seven|several|she|similar(?:ly)?|simpl(?:e|y)|since|situations?|situated|six|small|so|some(?:thing)?|start(?:ed)?|stop(?:ped)?|such|sure| + t|take[ns]?|ten|test|thanks?|that|the|their|then|there|these|they|third(?:ly)?|this|those|though|three|to|today|towards?|tried|try|two| + u|under(?:lying|stand|standing)?|unfortunately|up(?:on)|use[dsr]?| + w|want|was|well|ways?|what|when|where|which|while|whilst|who(?:se)?|wide(?:ly)?|will|with(?:in|out)|why|wide|width|when|where|which|why|would| + z)$/i + end + def special + #/<i>(?:[\w0-9"]+[\s]*){2,7}?<\/i>|http:\/\/\S+|(?: + /<i>(?:[\w0-9"]+[\s]*){2,7}<\/i>|<b>(?:[\w0-9"]+[\s]*){2,7}<\/b>|https?:\/\/\S+|ftp:\/\/\S+|(?: + a| + b| + c| + d| + e| + f| + g| + h| + i| + j| + l| + m| + n| + o| + p| + r| + s| + t| + u| + w| + h| + u| + zz|\w+)/i + end + def greater + /^(?:kajfsajflajskdfjz)$/i + end + end +end +__END__ diff --git a/lib/sisu/0.52/vocab_lex.rb b/lib/sisu/0.52/vocab_lex.rb new file mode 100644 index 00000000..41a13034 --- /dev/null +++ b/lib/sisu/0.52/vocab_lex.rb @@ -0,0 +1,144 @@ +=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: Vocabulary, wordlist legal, lex, (first used by concordance) + + * 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 Wordlists + require SiSU_lib + '/vocab' + class Lists + def initialize + end + #/<i>(?:[a-z0-9]+[\b\s]+){2,7}?<\/i>|(?: + #/<i>(?:[a-zA-Z0-9]+[\s]*){2,7}?<\/i>|(?: + #/<i>(?:[\S]+[\s]*){2,7}<\/i>|http:\/\/\S+|(?: #demands much processing ! cannot use :-( + #/<i>(?:[\S]+[\s]*){2,7}?<\/i>|http:\/\/\S+|(?: + #/<i>(?:\S+\s*){1,7}?<\/i>|(?: + #/<i>(?:[\S]+[\s]*){2,7}?<\/i>|http:\/\/\S+|(?: + def scanlist + #/<i>(?:[\w0-9"]+[\s]*){2,7}?<\/i>|http:\/\/\S+|(?: + /(?: + a|advance payments?|actions? for annulment|alternative dispute resolution|anticipatory breach|applicable law|arbitral (?:courts?|institutions?)|arbitral process|arbitral tribunal|arbitration agreement|arbitration awards?|arbitration between states|arbitration clause|arbitration rules?|autonomous contract|autonomy of contract|autonomy of parties| + b|bilateral agreement|bill of exchange|bill of lading|binding agreementss?|breach of contract|buyer's obligations?|buyer's rights?| + c|carriage of goods(?: by sea)|choice of law|commercial dispute|conformity of (?:contract|documents|goods)|contemporaneous performance|contra proferentem|contract of (?:carriage|insurance|sale)|contract rate|contract(?:ual)? price|cost of (?:carriage|credit|goods|insurance|transport(?:ation)?)|cross examination|currency regulations?| + d|date of (?:delivery|payment|shipment)|delivery (?:date|of (?:substitute )?goods)|delocalisation theory|discovery of documents|dispute resolution|dissenting opinions?|distributorship agreements?|due process| + e|employment agreements?|enforceability of award|equality of treatment|equity and good concience|equity clauses?|european convention|european (?:economic )?community|european union|examination (?:in chief|of goods)|excess of authority|exclusion (?:of claims|of convention|period)|ex parte| + f|factoring convention|federal states?|force majeure|formal requirements?|fundamental breach|future disputes?| + g|gap filling|general (?:business conditions|conditions of business|terms)|general principles?(?: of law)?|geneva convention|good faith|grain and feed trade association|governing law| + h|harmoni[sz]ation of laws?| + i|identification of goods|immediate (?:delivery|payment)|institutional rules|intellectual property(?: rights?)?|interim awards?|international bank for reconstruction and development|international bar association|international centre for the settlement of investment disputes|international chamber of commerce|investment securities| + j|judicial proceedings?| + l|lack of conformity|language of hearings?|league of nations|legal (?:remed(?:ies|y)|rights?)|letter of credit|lex fori|lex mercatoria|lex loci contractus|limitation period| + m|majority awards?|matrimonial disputes?|maximum period|mini trials?|minutes of meetings?|minutes of trials?|model law|monetary payments?|moral obligations?|moveable goods| + n|nachfrist notice|national law|new international economic order|notice of non-?conformity|number of| + o|obligation to(?: dispatch|give (?:advice|notice)|preserve(?: goods)?)?| + p|partial (?:delivery|performance)|party autonomy|passing of risk|payment (?:by install?ments|in advance|guarantees?|of price)|peace palace|period (?:for payment|of delivery|of performance|of time)|permanent court of international justice|personal injury|preliminary meetings?|possessory rights?|preliminary steps?|preservation of goods|private international law|procedural (?:law|orders?)|products? liability|professional institutions?|promissory notes?|public international law| + r|reasonable (?:bystander|man|men|person)\b|red book|regional conventions?|registration of awards?|resolution of disputes?|retention of title|revocation of offer|right (?:of|to) (?:delivery?|perform|performance|reject(?:ion)?|refuse|refusal|retain|retention)| + s|sea waybill|seat theory|separate opinions|security for credit|separation of powers|seller'?s obligations?|seller's rights?|set off|settlement of disputes?|shipping instructions|sovereign immunity|specific performance|stabilisation clauses?|statement of reasons?|submission agreements?|substantive issues?|substantive law|suspension of performance| + t|taking delivery|temporary (?:impediment|injunction)|terms of (?:payment|reference|trade)|third[ -]part(?:y|ies)(?: claims?| rights)?|terms of reference|time (?:limits?|of payment)|trade associations?|trade marks?|trade usages?|transfer of (?:obligations?|rights?)| + u|unification of law|uniform (?:interpretation|rules)|use of goods| + w|warehouse (?:certificates?|receipt)| + x| + y| + z| + conventions|new york convention on recognition and enforcement of arbitral awards|united nations conference on international trade law| + cities|new york|los angeles|san fransisco| + countries|hong kong|united kingdom|united states(?: of america)?| + zz|\w+)/i + end + def special #the idea is that words like contract, arbitration, buyer, seller should be left intact in scanlist but captured if in a term here, information should not be duplicated in the two lists ! + #/<i>(?:[\w0-9"]+[\s]*){2,7}?<\/i>|http:\/\/\S+|(?: + /<i>(?:[\w0-9"]+[\s]*){2,7}<\/i>|<b>(?:[\w0-9"]+[\s]*){2,7}<\/b>|https?:\/\/\S+|ftp:\/\/\S+|(?: + a|add hoc(?: arbitration)?|agreement to arbitrate|american arbitration association|avoidance of (?:\S+\s+){0,2}contract| + b| + c|claim (?:\S+\s+){0,4}(?:damages|restitution)|commencement of arbitration|conclusion of (?:the )?contract|court of arbitration| + d|domestic arbitration| + e| + f|formation of (?:\S+\s+){0,2}contract|fundamental breach (?:\S+\s+){1,2}contract| + g| + h| + i|informal arbitrations?|install?ment contracts?|institutional arbitration|international arbitration| + j|joint debtors?| + l|language of (?:the )?arbitration|leasing contract|liquidated damages|(?:buyer|seller) loses? the right| + m|mitigation of (?:damages?|loss)| + n|nuclear damage| + o| + p|panels? of arbitrators|performance of (?:the)?contract|permanent court of arbitration|place of (?:arbitration|business|payment|performance)|preparation of contract|presiding arbitrators?| + r|regulation of international arbitration|removal of arbitrators?|right (?:\S+\s+){0,3}to (?:declare the contract avoided|claim(?: damages)?)|right or claim of (?:a|the) third party|right to rely on| + s|statutory arbitrations?| + t|termination of contract|trade arbitrations?| + u| + w| + x| + y| + institutions|american bar association|international montetary fund|london court of international arbitration|united nations|world bank|world intellectual property organi[sz]ation|world trade organi[sz]ation| + zz|(?:buyer's|seller's) right| + zz|\w+)/i + end + def greater #line break will not be matched + /^(?: + a|arbitrat(e|ors?|ions?)|anticipatory|assurance| + b|breach| + c|care|commercial|consideration|contract|cost|credit| + d|damages|duty|effect|enforce[ds]?|evidence|examples?|exchange|exception|exclude[ds]?|exclusion|exclusive|excuse[ds]?|executed?|exempt(?:s|ed|ing)?|excercise[ds]?|expir[ey]| + f|fair|fees?|finance|(un)?foreseeab(ility|le)|form|free|freight|frustration|full|fundamental| + g|general||global(ly)?|goods|govern(?:ed|ing|s)?|greater|grounds| + h|harm| + i|impact|impede|impediment|impracticab(ility|le)|inform|information|installments?|insur(ance|e[ds]?)|intent(ion|ional|ionally)?|interest|international(ly)?|interpret(ation)?| + l|law(s|yers?)?|limit(ation|ed|ing|s)?| + m|mitigat(e|ed|ing|ion)|model|modern|monetary|money| + n|noti(ce|fy|fication)|neither|new|no|nor| + o|oblig(ations?|ors?)| + p|parol|part(?:ial|ies|y)|perform(ance)?|period|postal|preamble|preserve|principles?|procedur(e|al)|proceeds|provide(ed|s)|provisions?|purpose| + r|rational|reasonable|recind|rectif(ication|y)|recourse|recovery?|reduction|reliance|relief|rely|remed(ies|y|ying)|reports?|requests?|require(s|ments)?|reservation|review|revis(e|ion|ed)|retain(ed|er)|rights?|rule(s|ed)?|ruling| + s|sales?|secretary|section|service|sources?|status|standard|sufficient| + t|terminat(e|ed|ion)|tort|trade(er|ing)?|transnational|treaty| + u|uniform(ity)? + z)$/i + end + end +end +__END__ + diff --git a/lib/sisu/0.52/webrick.rb b/lib/sisu/0.52/webrick.rb new file mode 100644 index 00000000..b6f2bd67 --- /dev/null +++ b/lib/sisu/0.52/webrick.rb @@ -0,0 +1,163 @@ +=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: webrick share - note sisu by default does not link with file suffixes, see man pages for options + + * 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 +def brick(port,get='') + cgidir=if get=~/pwd/; Dir.pwd + else '/usr/lib/cgi-bin' # @env.path.cgi + end + port=SiSU_Env::Info_port.new.webrick + begin + s=HTTPServer.new( + :Port => port, + :DocumentRoot => Dir::pwd + '/htdocs', + :CGIPathEnv => ENV['PATH'] + ) + cgi_dir = File.expand_path(cgidir) + @mount.each { |x,y| # mount subdirectories + s.mount(x, HTTPServlet::FileHandler, y, true) + } + s.mount('/cgi-bin', HTTPServlet::FileHandler, cgi_dir, {:FancyIndexing=>true}) + #### mount subdirectories, true added to permit dir listing + trap("INT"){ s.shutdown } + s.start + rescue; SiSU_Errors::Info_error.new($!,$@,'-W',nil).error #fix + ensure + end +end +begin #% + require 'webrick' + include WEBrick + require 'time' + require 'fileutils' + include FileUtils + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Screen + @cX=SiSU_Screen::Ansi.new('yes').cX + @env=SiSU_Env::Info_env.new + port=SiSU_Env::Info_port.new + @argv=$* + @host=@env.url.webrick + #@host=ENV['HOSTNAME'] + host='localhost' + @port="#{@argv[0].to_i}" + @port="#{port.webrick}" if @port =~ /^0$/ + @serve=[] + Dir.foreach(@env.path.webserv) {|x| @serve << x if x !~/^\./ and FileTest.directory?("#{@env.path.webserv}/#{x}") } + @mount=[] + @serve.each {|x| @mount << ["/#{x}", "#{@env.path.webserv}/#{x}"]} + @pwd=Dir.pwd + @week=Time.now.strftime(%{%Yw%W}) + puts "\n" + @mount.each { |x,y| + puts " #{@cX.cyan}#{x}#{@cX.off}\t#{@cX.grey}see#{@cX.off} #{@cX.blue}#@host:#@port#{x}/wb.cgi#{@cX.off} #{@cX.ruby}@#{@cX.off} #{@cX.blue}#@host:#@port#{x}/#{@cX.off}" + } + puts "#{@cX.grey}" + #% + wb_s2=[] + #% writes file wb.cgi to shared directories ... + #% wb_top + wb_top=%q(#!/usr/bin/env ruby + # * arch-tag: webrick info on environment, mounted directories, and contents of pwd + require 'time' + require 'cgi' + require 'fcgi' + ls=Dir.entries('./') + dir_contents=[] + ls.each { |x| dir_contents << "<a href=\"./#{x}/\">#{x}</a><br>" unless x =~/^(\.)+$/ } + dir_contents=dir_contents.sort.join(' ') + #host=ENV['HOSTNAME'] + #host=%x{echo $HOSTNAME} + ) + #% wb_s1 + wb_s1=<<WOK + + page=CGI.new "html3" + page.out { + page.html { + page.head { page.title {"#@host Webrick Report"} } + + page.body { + page.h1 {"Webrick #@host"} + + page.p {"Webrick is Ruby's built in webserver."} + + page.center {"Host name: " + page.b{"#@host "} + "(#@host) port: " + page.b{"#@port"}} + + page.center {"#{Time.now}"} + + page.center {"#{Time.now.strftime(%{%Yw%W})}"} + + #page.center { "Center " + page.em{"emphasise "} + page.i{"italicise " } + page.b{"bold "} + page.u{"underline "}} + + page.p {''} + + page.p {''} + + page.p {page.b{"Webrick Served Directories: "}} + +WOK + #% wb_s2 (mounts) + @mount.each do |x,y| wb_s2 <<<<WOK + page.p {page.b{'<a href="#@host:#@port#{x}/">#{x}</a> '} + '<a href="#@host:#@port#{x}/">#@host:#@port#{x}</a> (mounts: #{y}/) <a href="#@host:#@port#{x}/wb.cgi">info (wb.cgi)</a>'} + +WOK +end + #% wb_end + wb_end=<<WOK + page.p {page.b{"Contents of PWD (see URL): "}} + + page.p {"#\{dir_contents}"} + } + } + } +WOK + @mount.each { |x,y| #% wb puts + puts y + filename=File.new("#{y}/wb.cgi",'w') + filename << wb_top + filename << wb_s1 + filename << wb_s2 + filename << wb_end + filename.close + chmod(0755,"#{y}/wb.cgi &") if FileTest.file?("#{y}/wb.cgi &") + } + puts " #{@cX.off}" + get=@argv.shift if @argv[0] =~/pwd/ #% argv + brick(@port,get) +rescue; SiSU_Errors::Info_error.new($!,$@,'-W',nil).error #fix +ensure +end diff --git a/lib/sisu/0.52/wikispeak.rb b/lib/sisu/0.52/wikispeak.rb new file mode 100644 index 00000000..a8ae64f1 --- /dev/null +++ b/lib/sisu/0.52/wikispeak.rb @@ -0,0 +1,391 @@ +=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: wiki text generation, stripped wiki output (unix, linefeed) + + * 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_Wikispeak + require SiSU_lib + '/dal' + require SiSU_lib + '/sysenv' + include SiSU_Env + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/plaintext_format' + include Format + require SiSU_lib + '/shared_txt' + pwd=Dir.pwd + @@alt_id_count,@@alt_id_count,@@tablehead,@@number_of_cols=0,0,0,0 + @@tablefoot='' + class Source + def initialize(opt) + @opt=opt + @@dostype='msdos footnotes' + end + def read + begin + @md=SiSU_Param::Parameters.new(@opt).get + @env=SiSU_Env::Info_env.new(@opt.fns) + path=@env.path.output_tell + tool=if @opt.cmd =~/[MVv]/; "#{@env.program.text_editor} #{path}/#{@md.fnb}/#{@md.fn[:wiki]}" + else '' + end + tell=SiSU_Screen::Ansi.new(@opt.cmd,'Wikispeak',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[:wiki]}") + 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_Wikispeak::Source::Scroll.new(@dal_array,@md).songsheet + SiSU_Env::Info_skin.new(@md).select #watch + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + end + end + private + class Split_text_object <Source + require SiSU_lib + '/plaintext_format' + include SiSU_Viz + include Format + @@alt_id_count=0 + @@dp=nil + attr_reader :format,:lev,:text,:ocn,:lev_para_ocn + def initialize(para) + @para=para + @format,@ocn='null','null' + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def lev_segname_para_ocn + @text=nil + if @para =~/^(\d~|<:.+?>).+?<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if /^(([1-6])~(\S+))\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,$5 + elsif /^(([1-6])~)\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@lev,@text,@ocn=$1,$2,$3,$4 + elsif /<:(.+?)>\s*(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @format,@text,@ocn=$1,$2,$3,$4 + elsif /^(([1-6])~(\S+))\s+(\S.+?)<~(\d+);(?:\w|[0-6]:)\d+;[um]\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,@lev,segname,@text,@ocn=$1,$2,$3,$4,"x#{@@alt_id_count}" + elsif /^(([1-6])~)\s+(\S.+?)<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @@alt_id_count+=1 + @format,@lev,@text,@ocn=$1,$2,$3,"x#{@@alt_id_count}" + end + else + if /(.+?)<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/m.match(@para) + @text,@ocn=$1,$2 + end + if @para !~/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$|^$/ #added 2002w06 + @text=/(.+?)/m.match(@para)[1] + end + if /^((\d)~(?:~\S+)?)\s+(.+)/m.match(@para) + @format,@lev,@text=$1,$2,$3 + end + end + format=@format.dup + @lev_para_ocn=if @para =~/.+<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + Format::Format_text_object.new(format,@text,@ocn) + else + Format::Format_text_object.new(format,@text,"<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>") + end + self + end + end + class Scroll <Source + require SiSU_lib + '/shared_txt' + include SiSU_text_utils + @@endnotes_para=[] + @@wiki={ :body=>[],:open=>[],:close=>[],:head=>[],:metadata=>[],:tail=>[],:endnotes=>[] } + @@dp=nil + 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>$/ #m # 2004w18 pb pn removal added + @tab="\t" + @@dostype='unix footnotes' + @br="\n" + #@@dostype='msdos footnotes' + #@br="\r\n" + end + def songsheet + markup + publish + #@data.each { |x| puts x.inspect if x =~/\[table/ } + end + # Used for extraction of endnotes from paragraphs + def extract_endnotes(para='') + notes=para.scan(/~[{\[]([\d*+]+\s+.+?)\s*<#@dp>[}\]]~/) + @n=[] + end + def wiki_metadata(meta) + util=SiSU_text_utils::Wrap.new(meta.text,70,15,1) + txt=util.line_wrap + @@wiki[:metadata] <<= if meta.type == 'meta' + <<WOK + +#{@tab}#{meta.el}: #{txt} +WOK + else '' + end + end + def wiki_tail + SiSU_Env::Info_skin.new(@md).select + vz=SiSU_Env::Get_init.instance.skin + generator="Generated by: #{@md.sisu_version[:project]} #{@md.sisu_version[:version]} of #{@md.sisu_version[:date_stamp]} (#{@md.sisu_version[:date]})" if @md.sisu_version[:version] + lastdone="Last Generated on: #{Time.now}" + rubyv="Ruby version: #{@md.ruby_version}" + sc=if @md.sc_info + "Source file: #{@md.sc_filename}#{@br}Version number: #{@md.sc_number}#{@br}Version date: #{@md.sc_date}#{@br}" + else '' + end + @@wiki[:tail] <<<<WOK +#@br +Other versions of this document: #@br +manifest: + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:manifest]}#@br +html: + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:toc]}#@br +pdf: + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:pdf_p]} + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:pdf_l]}#@br +plaintext (plain text): + #{vz.url_root_http}/#{@md.fnb}/#{@md.fn[:plain]}#@br +at: + #{vz.url_site}#@br + +#{sc} +* #{generator} +* #{rubyv} +* #{lastdone} +* SiSU #{vz.url_sisu} +WOK + end + def wiki_structure(para='',lv='',ocn='',hname='') #% Used to extract the structure of a document + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + extract_endnotes(para) + para.gsub!(/~[{\[](?:[\d*+]+)\s+(.+?)<#@dp>[}\]]~/,'<ref>\1</ref>') # endnote marker marked up + para.gsub!(/^\d~\S*\s+/,'') # endnote marker marked up + para.gsub!(/<\S+?><#@dp:#@dp>/,'') # endnote marker marked up + if lv + @@wiki[:body] << case lv + when 1; '='*2 << para.strip << @br*2 + when 2..3; '='*2 << para.strip << @br*2 + when 4; '='*4 << para.strip << @br*2 + when 5..6; '='*4 << para.strip << @br*2 + end + else @@wiki[:body] << para << @br*2 # main text, contents, body KEEP + end + end + def markup # Used for major markup instructions + data=@data + dir=SiSU_Env::Info_env.new(@md.fns) + @data_mod,@endnotes,@level,@cont,@copen,@wiki_contents_close=Array.new(6){[]} + (0..6).each { |x| @cont[x]=@level[x]=false } + (4..6).each { |x| @wiki_contents_close[x]='' } + wiki_tail + table_message='[table omitted, see other document formats]' + fix=[] + data.each do |para| + para.gsub!(/<!Th?¡.+/m,"#@br#{table_message}") + para.gsub!(/.+?<-#>/,'') # remove dummy headings (used by html) #check + para.gsub!(/_\*\s+/,'* ') # bullet markup, marked down + para.gsub!(/©/,'©') # bullet markup, marked down + para.gsub!(/&/,'&') # bullet markup, marked down + para.gsub!(/<sup>(.+?)<\/sup>/,'^\1^') + para.gsub!(/<sub>(.+?)<\/sub>/,'[\1]') + para.gsub!(/<i>(.+?)<\/i>/,"''\\1''") + para.gsub!(/<b>(.+?)<\/b>/,"'''\\1'''") + para.gsub!(/<u>(.+?)<\/u>/,'_\1_') + para.gsub!(/\{(.+?)\}(http:\/\/\S+)/,'[\2 \1]') + para.gsub!(/(http:\/\/\S+)/,'[\1]') + para.gsub!(/<:(?:group|verse|alt|code)(?:-end)?>(?:\s+<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>)?/,'') + para.gsub!(/<:p[bn]>/,'') # remove page breaks + para.gsub!(/^\s*<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/,'') # remove empty lines - check + para.gsub!(/<a href=".+?">(.+?)<\/a>/m,'\1') + para.gsub!(/<:name#\S+?>/,'') # remove name links + para.gsub!(/ /,' ') # decide on + para.gsub!(/\{(\S+?\.(?:png|jpg|gif)) .+?\}(?:(?:https?|ftp):\/\/\S+|image)/,' [ \1 ]') #"[ #{dir.url.images_local}\/\\1 ]") + para.gsub!(/^\{\S+?\.(?:png|jpg|gif)\s+.+?"(.*?)"\s*\}\S+/,'[image: "\1"]') + wordlist=para.scan(/\S+/) + if para =~/^0~(\S+)\s+(.+?)\Z/m # for headers + d_meta=SiSU_text_utils::Header_scan.new(@md,para).meta + if d_meta; wiki_metadata(d_meta) + end + end + if para !~/(^0~|<ENDNOTES>|<EOF>)/ + if para =~@regx #/.+?<~\d+;\w\d+;\w\d+>.*/ #watch change + paranum=para[@regx,3] + @p_num=Format::Paragraph_number.new(paranum) + end + @sto=Split_text_object.new(para).lev_segname_para_ocn + ### problem in scroll, it appears tables are getting paragraph numbers + m=/<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + if para =~m and para=~/\S+/ + para=case @sto.format + when /^(1)~(?:(\S+))?/ + wiki_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body1 + when /^(2)~(?:(\S+))?/ + wiki_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body2 + when /^(3)~(?:(\S+))?/ + wiki_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)/ # work on see SiSU_text_parts::Split_text_object + wiki_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body4 + when /^(5)~(?:(\S+))?/ + wiki_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body5 + when /^(6)~(?:(\S+))?/ + wiki_structure(para,$1,@sto.ocn,$2) + @sto.lev_para_ocn.heading_body6 + #when /^(i1)$/ + # #formatMono.gsubBody + # #para=@sto[:lev_para_ocn].scrIndent1 + #when /^(i2)$/ + # formatMono.gsubBody + # para=@sto[:lev_para_ocn].scrIndent2 + #when /^(center)$/ + # para.gsub!(/(.+)/, + # %{<center>(\\1)</center>}) + # para=@sto[:lev_para_ocn].scrPara + #when /^(b|bold)$/ + # para.gsub!(/(.+)/, + # %{<b>(\\1)</b>}) + # para=@sto[:lev_para_ocn].scrPara + #when /null/ # see whether u can improve + # if (para !~/#{@margin.txt_0}|#{@margin.txt_1}|#{@margin.txt_2}/) + # #formatMono.gsubBody + # #para=@sto[:lev_para_ocn].scrPara + # end + else + wiki_structure(para,nil,nil,nil) #watch may be problematic + para + end + elsif para =~/#{table_message}/ + @@wiki[:body] << para << @br + elsif para =~/(Note|Endnotes?)/ and para !~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + elsif para =~/(MetaData)/ and para =~/<~(\d+);[um]\d+;\w\d+><#@dp:#@dp>$/ #debug 2003w46 add rc info ####suspect visit + #formatMono=MonoSiSU.new('<br /><a name="metadata">MetaData</a>') + #para=formatMono.bold_para + elsif para.include? 'Owner Details' and para !~/<~(\d+);(?:[oh]|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + #formatMono=MonoSiSU.new('<br /><a name="owner.details">Owner Details</a>') + #@@wiki[:owner_details]=formatMono.bold_para + #para='' + elsif para =~/(¡|<!Th?)/ #tables ! + elsif para =~/(.*)<!#!>(.*)/ + one,two=$1,$2 + format_text=Format_text_object.new(one,two) + para=format_text.seg_no_paranum + end + para='' if (para =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\d+!>)/) # -endnote + case para + when /<:i1>/ + if para =~/.*<:#>.*$/ + format_text=Format_text_object.new(para,'') + para=format_text.scr_indent_one_no_paranum + end + when /<:i2>/ + if para =~/.*<:#>.*$/ + format_text=Format_text_object.new(para,'') + para=format_text.scr_indent_one_no_paranum + end + end + if para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + # i don't get the condition for no paranum + end + if para =~/<:center>/ + one,two=/(.*)<:center>(.*)/.match(para)[1,2] + format_text=Format_text_object.new(one,two) + para=format_text.center + end + para.gsub!(/<!.+!>/,' ') if para ## Clean Prepared Text + para.gsub!(/<:\S+>/,' ') if para ## Clean Prepared Text + end + end + end + def publish + divider="=" + content=[] + data=@data + content << @@wiki[:open] + content << @@wiki[:head] + content << @@wiki[:body] + #content << @@wiki[:metadata] + #content << @@wiki[:owner_details] if @md.stmp =~/\w+/ #not used? + #content << @@wiki[:tail] + Output.new(content.to_s,@md).wiki + @@wiki[:head],@@wiki[:body],@@wiki[:tail],@@wiki[:metadata]=[],[],[],[] + end + end + class Output <Source + include SiSU_Param + include SiSU_Env + def initialize(content,md) + @content,@md=content,md + end + def wiki #%wiki output + SiSU_Env::SiSU_file.new(@md).mkdir + filename_wiki=SiSU_Env::SiSU_file.new(@md,@md.fn[:wiki]).mkfile + @sisu=[] + @content.each do |para| # this is a hack + if para =~/^\S/ + if para !~/^([*=-]|\.){5}/; filename_wiki.puts para #unix wiki + else filename_wiki.puts para #unix wiki + end + else filename_wiki.puts para # if para =~/^\s/ + end + end + end + end + end +end +__END__ diff --git a/lib/sisu/0.52/xhtml.rb b/lib/sisu/0.52/xhtml.rb new file mode 100644 index 00000000..7bf4e451 --- /dev/null +++ b/lib/sisu/0.52/xhtml.rb @@ -0,0 +1,483 @@ +=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: xhtml output logic, flow + + * 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 scroll.xhtml >> index.tidy +=end +module SiSU_XHTML #XML_SAX derivative + require SiSU_lib + '/defaults' + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + require SiSU_lib + '/sysenv' + include SiSU_Env + 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=0 + @@tablehead=0 + @@tablefoot='' + @@number_of_cols=0 + 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[:xhtml]}\n\t#{@env.program.xml_viewer} #{path}/#{@md.fnb}/#{@md.fn[:xhtml]}" + elsif @opt.cmd =~/v/; "#{@env.program.web_browser} #{loc}/#{@md.fnb}/#{@md.fn[:xhtml]}" + else '' + end + SiSU_Screen::Ansi.new(@opt.cmd,'invert','XHTML',tool).colorize unless @opt.cmd =~/q/ + SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#{@md.fnb}/#{@md.fn[:xhtml]}").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_XHTML::Source::Songsheet.new(@md,@dal_array,@env).songsheet + rescue; SiSU_Errors::Info_error.new($!,$@,@opt.cmd,@opt.fns).error + ensure + #file closed in songsheet + end + end + class Songsheet + def initialize(md,data,dir) + @md,@data,@env=md,data,dir + end + def songsheet + begin + SiSU_XHTML::Source::Scroll.new(@md,@data).songsheet + SiSU_XHTML::Source::Tidy.new(@md,@env).xml if @md.cmd =~/[vVM]/ # test wellformedness, comment out when not in use + SiSU_Rexml::Rexml.new(@md,@md.fn[:xhtml]).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 + @@xml={ :body=>[],:sisu=>[],:open=>[],:close=>[],:head=>[] } + require SiSU_lib + '/shared_txt' + require SiSU_lib + '/css' + include SiSU_text_utils + @@dp=nil + def initialize(md=nil,data='') + @md,@data=md,data + @vz=SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + @regx=/^(?:(?:<:p[nb]>\s*)?\d~(?:(\S+))?\s+)?(.+?)\s*<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + @tab="\t" + @env=SiSU_Env::Info_env.new(@md.fns) + @trans=SiSU_XML_munge::Trans.new(@md) + @sys=SiSU_Env::System_call.new + end + def songsheet + pre + markup + post + publish + end + protected + def embedded_endntoes(para='') + para.gsub!(/~\{(\d+)\s+(.+?)\s*<#@dp>\}~/, + '<endnote><number>\1</number><note>\2</note></endnote> ') + para.gsub!(/~\[([*+]\d+)\s+(.+?)\s*<#@dp>\]~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + para.gsub!(/~\{([*+]+)\s+(.+?)\s*<#@dp>\}~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + end + def extract_endnotes(para='') + notes=para.scan(/~[{\[]([\d*+]+\s+.+?)\s*<#@dp>[}\]]~/) + notes.each do |e| + s=e.to_s + util=SiSU_text_utils::Wrap.new(s,70) + wrap=util.line_wrap + wrap.gsub!(/^(\d+)\s+(.+?)\s*\Z/m, <<WOK +#{@tab*1}<endnote notenumber="\\1"> +#{@tab*2}\\1. \\2 +#{@tab*1}</endnote> +WOK +) + wrap.gsub!(/^([*+]\d+)\s+(.+?)\s*\Z/m, <<WOK +#{@tab*1}<endnote symbol="\\1"> +#{@tab*2}\\1 \\2 +#{@tab*1}</endnote> +WOK +) + wrap.gsub!(/^([*+]+)\s+(.+?)\s*\Z/m, <<WOK +#{@tab*1}<endnote symbol="\\1.length"> +#{@tab*2}\\1 \\2 +#{@tab*1}</endnote> +WOK +) +#KEEP alternative presentation of endnotes +# wrap.gsub!(/^(\d+)\s+(.+?)\s*\Z/m, <<WOK +##{@tab*1}<p class="endnote" notenumber="\\1"> +##{@tab*2}\\1. \\2 +##{@tab*1}</p> +#WOK +#) + @endnotes << wrap + end + end + def xml_head(meta) + txt=meta.text + txt.gsub!(/<br(?: \/)?>/,'') + txt.gsub!(/ & /,' and ') + el=meta.el.gsub(/\./,'_') + el_txt=meta.el.gsub(/\./,' ') + @@xml[:head] <<= if meta.type == 'meta' + <<WOK +#{@tab}<meta>#{el_txt.capitalize}:</meta> +#{@tab}<#{el} class="#{meta.attrib}"> +#{@tab*2}#{txt} +#{@tab}</#{el}> +#{@tab}<br /> +WOK + else '' + end + end + def xml_structure_ee(para='',lv='',ocn='',hname='') #embedded endnotes + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + embedded_endnotes(para) + if para[@regx] + paragraph="#{para[@regx,2]}" + util=SiSU_text_utils::Wrap.new(paragraph,70) + wrapped=util.line_wrap + end + @@xml[:body] << "#{@tab*0}<object>" << "\n" if para[@regx] + @@xml[:body] << "#{@tab*1}<ocn>#{para[@regx,3]}</ocn>" << "\n" if para[@regx,3] + @@xml[:body] << if lv; %{#{@tab*1}<text class="h#{lv}">#{wrapped}</text>\n} << "\n" + else %{#{@tab*1}<text class="norm">#{wrapped}</text>\n} # main text, contents, body KEEP + end + ##@@xml[:body] << "#{@tab*1}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # old unwrapped main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" if para[@regx] + end + def xml_structure(para='',lv='',ocn='',hname='',type='norm') #extracted endnotes + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + extract_endnotes(para) + #puts @endnotes + para.gsub!(/~[{\[]([\d*+]+)\s+(?:.+?)\s*<#@dp>[}\]]~/,'<en>\1</en>') #footnote/endnote clean + if para[@regx] + paragraph="#{para[@regx,2]}" + util=SiSU_text_utils::Wrap.new(paragraph,70) + wrapped=util.line_wrap + end + @@xml[:body] << if para[@regx,3]; %{#{@tab*0}<object id="#{para[@regx,3]}">} << "\n" + else "#{@tab*0}<object>" << "\n" if para[@regx] + end + #@@xml[:body] << "#{@tab*0}<object>" << "\n" if para[@regx] + #@@xml[:body] << "#{@tab*1}<heading>#{lv}</heading>" << "\n" if lv + @@xml[:body] << %{#{@tab*1}<text class="#{type}">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} unless lv # main text, contents, body KEEP + @@xml[:body] << %{#{@tab*1}<text class="h#{lv}">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} << "\n" if lv # main text, contents, body KEEP + #@@xml[:body] << %{#{@tab*1}<text heading="#{lv}">\n} << "\n" if lv + @@xml[:body] << "#{@endnotes}" if @endnotes # main text, endnotes KEEP + @@xml[:body] << "#{@tab*1}<ocn>#{para[@regx,3]}</ocn>" << "\n" if para[@regx,3] + ##@@xml[:body] << "#{@tab*1}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # old unwrapped main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" if para[@regx] + @endnotes=[] + end + def group_structure(para='',ocn='') + para.gsub!(/<:group(?:-end)?>/,'') + para=@trans.markup_group(para) + para.strip! + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*1}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*1}<text class="group">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def poem_structure(para='',ocn='') + para.gsub!(/<:verse(?:-end)?>/,'') + para=@trans.markup_group(para) + para.strip! + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*1}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*1}<text class="verse">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def code_structure(para='',ocn='') + para.gsub!(/<:code(?:-end)?>/,'') + para=@trans.markup_group(para) + para.gsub!(/\s\s/,'  ') + para.strip! + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*1}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*1}<text class="code">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def table_structure(table='',ocn='') #tables + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" #if para[@regx] + @@xml[:body] << %{#{@tab*1}#{table}\n#{@tab*1}\n} # unless lv # main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" #if para[@regx] + @endnotes=[] + end + def markup + data=@data + @endnotes=[] + @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| + para=@trans.markup(para) + @trans.char_enc.utf8(para) if @sys.locale =~/utf-?8/i #% utf8 + if para =~/^0~(\S+)\s+(.+?)$/ # 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 =~/~metadata/ or para =~/1~\s+Document Information/) + if para !~/(^0~|<ENDNOTES>|<EOF>)/ + 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_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body1 + when /^(2)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body2 + when /^(3)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)/ # work on see SiSU_text_parts::Split_text_object + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body4 + when /^(5)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body5 + when /^(6)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body6 + 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 =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para,ocn) + para=table.table_split + table_structure(para,ocn) + elsif para =~ /<:i1>/ + xml_structure(para,nil,nil,nil,'indent1') + elsif para =~ /<:i2>/ + xml_structure(para,nil,nil,nil,'indent2') + else + xml_structure(para,nil,nil,nil) + end + #@@xml[:body] << "#{@tab*6}<object>" << "\n" if para[@regx] + #@@xml[:body] << "#{@tab*7}<ocn>#{para[@regx,3]}</ocn>" << "\n" if para[@regx,3] + #@@xml[:body] << "#{@tab*7}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # main text, contents, body KEEP + #@@xml[:body] << "#{@tab*6}</object>" << "\n" if para[@regx] + end + elsif para =~/(Note|Endnotes?)/ and para !~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + elsif para =~/(MetaData)/ and para =~/<~(\d+);[m]\d+;\w\d+><#@dp:#@dp>$/ #debug 2003w46 add rc info + format_scroll=Format_scroll.new(@md,'<br /><a name="metadata">MetaData</a>') + 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,'<br /><a name="owner.details">Owner Details</a>') + @@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 =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\d+!>)/) # -endnote + para=case para + when /<:i1>/ + if para =~/.*<:#>.*$/ + format_text=Format_text_object.new(para,'') + format_text.scr_inden_ocn_e_no_paranum + end + when /<:i2>/ + if para =~/.*<:#>.*$/ + format_text=Format_text_object.new(para,'') + format_text.scr_inden_ocn_e_no_paranum + end + else para + end + if para !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + # i don't get the condition for no paranum + 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+?>/,'') if para ## Clean Prepared Text #bugwatch reinstate + para.gsub!(/<!.+!>/,'') if para ## Clean Prepared Text #bugwatch reinstate + end + end + 6.downto(4) do |x| + y=x - 1; v=x - 3 + @@xml[:body] << "#{@tab*5}</content>\n#{@tab*y}</contents#{v}>\n" if @level[x] == true + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}</heading#{x}>\n" if @level[x] == true + end + #6.downto(1) { |x| y=x - 1; @@xml[:body] << "#{@tab*y}</level #{x}>\n" if @level[x] == true } + end + def pre + rdf=SiSU_XML_tags::RDF.new(@md) + dir=SiSU_Env::Info_env.new + @@xml[:head],@@xml[:body]=[],[] #added + css=SiSU_Env::CSS_select.new(@md).xhtml + encoding=if @sys.locale =~/utf-?8/i #% utf8 + '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + else + '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>' + end + @@xml[:open] =<<WOK +#{encoding} +<?xml-stylesheet type="text/css" href="../#{@env.path.style}/#{css}"?> +#{rdf.comment_xml} +<document> +WOK + @@xml[:head] << %{<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />\n} + @@xml[:body] << "<body>\n" + end + def post + @@xml[:head] << "</head>\n" + @@xml[:body] << "</body>\n" + @@xml[:close] = "</document>\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(@md,content.to_s).xml + @@xml={} # check whether should be nil + end + end + class Output + include SiSU_Param + include SiSU_Env + def initialize(md,data) + @md,@data=md,data + end + def xml + @sisu=[] + @data.each do |para| + #para.strip! + 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[:xhtml]).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 #(md.fns) #if md + 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[:xhtml]}",tidyfile) + tidy.well_formed? + tell.p_off unless @md.cmd =~/q/ + end + end + end + end + end +end +__END__ +<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> +<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?xml version="1.0" encoding="UTF-16" standalone="no"?> diff --git a/lib/sisu/0.52/xml.rb b/lib/sisu/0.52/xml.rb new file mode 100644 index 00000000..f6a1623f --- /dev/null +++ b/lib/sisu/0.52/xml.rb @@ -0,0 +1,505 @@ +=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_XML_SAX + 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[:sax]}\n\t#{@env.program.xml_viewer} #{path}/#{@md.fnb}/#{@md.fn[:sax]}" + elsif @opt.cmd =~/v/; "#{@env.program.web_browser} #{loc}/#{@md.fnb}/#{@md.fn[:sax]}" + else '' + end + SiSU_Screen::Ansi.new(@opt.cmd,'invert','XML SAX',tool).colorize unless @opt.cmd =~/q/ + SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#{@md.fnb}/#{@md.fn[:sax]}").flow if @opt.cmd =~/[MV]/ + @dal_array=SiSU_DAL::Source.new(@opt).get # dal file drawn here + SiSU_XML_SAX::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_XML_SAX::Source::Scroll.new(@data,@md).songsheet + SiSU_XML_SAX::Source::Tidy.new(@md,@env).xml if @md.cmd =~/[vVM]/ # test wellformedness, comment out when not in use + SiSU_Rexml::Rexml.new(@md,@md.fn[:sax]).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 + require SiSU_lib + '/shared_txt' + require SiSU_lib + '/css' + include SiSU_text_utils + @@dp,@@env=nil,nil + @@xml={ :body=>[],:open=>[],:close=>[],:head=>[] } + 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 + @regx=/^(?:(?:<:p[bn]>\s*)?\d~(?:(\S+))?\s+)?(.+?)\s*<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + @tab="\t" + @env=SiSU_Env::Info_env.new(@md.fns) if @md + @trans=SiSU_XML_munge::Trans.new(@md) + @sys=SiSU_Env::System_call.new + end + def songsheet + pre + markup + post + publish + end + protected + def embedded_endntoes(para='') + para.gsub!(/~\{(\d+)\s+(.+?)\s*<#@dp>\}~/, + '<endnote><number>\1</number><note>\2</note></endnote> ') + para.gsub!(/~\[([*+]\d+)\s+(.+?)\s*<#@dp>\]~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + para.gsub!(/~\{([*+]+)\s+(.+?)\s*<#@dp>\}~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + end + def extract_endnotes(para='') + notes=para.scan(/~[{\[]([\d*+]+\s+.+?)\s*<#@dp>[}\]]~/) + notes.each do |e| + s=e.to_s + util=SiSU_text_utils::Wrap.new(s,70) + wrap=util.line_wrap + wrap.gsub!(/^(\d+)\s+(.+?)\s*\Z/m, <<WOK +#{@tab*1}<endnote notenumber="\\1"> +#{@tab*2}<number>\\1</number> +#{@tab*2}<note> +#{@tab*3}\\2 +#{@tab*2}</note> +#{@tab*1}</endnote> +WOK +) + wrap.gsub!(/^([*+]\d+)\s+(.+?)\s*\Z/m, <<WOK +#{@tab*1}<endnote symbol="\\1"> +#{@tab*2}<symbol>\\1</symbol> +#{@tab*2}<note> +#{@tab*3}\\2 +#{@tab*2}</note> +#{@tab*1}</endnote> +WOK +) + wrap.gsub!(/^([*+]+)\s+(.+?)\s*\Z/m, <<WOK +#{@tab*1}<endnote symbol="\\1.length"> +#{@tab*2}<symbol>\\1</symbol> +#{@tab*2}<note> +#{@tab*3}\\2 +#{@tab*2}</note> +#{@tab*1}</endnote> +WOK +) + @endnotes << wrap + end + end + def xml_head(meta) + txt=meta.text + txt.gsub!(/<br(?: \/)?>/,'') + txt.gsub!(/ & /,' and ') + el=meta.el.gsub(/\./,'_') + el_txt=meta.el.gsub(/\./,' ') + @@xml[:head] <<= if meta.type == 'meta' + <<WOK +#{@tab}<meta>#{el_txt.capitalize}:</meta> +#{@tab}<#{el} class="#{meta.attrib}"> +#{@tab*2}#{txt} +#{@tab}</#{el}> +#{@tab}<br /> +WOK + else '' + end + end + def xml_sc(md='') + sc=if @md.sc_info + <<WOK + <source_control> + <meta>filename:</meta> + <sc class="sourcefile"> + #{@md.sc_filename} + </sc><br /> + <meta>version number:</meta> + <sc class="number"> + #{@md.sc_number} + </sc><br /> + <meta>version date:</meta> + <sc class="date"> + #{@md.sc_date} + </sc><br /> + </source_control> +WOK + else '' + end + @@xml[:sc]=sc #<<<<WOK +#WOK + end + def xml_structure_ee(para='',lv='',ocn='',hname='') #embedded endnotes + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + embedded_endnotes(para) + if para[@regx] + paragraph="#{para[@regx,2]}" + util=SiSU_text_utils::Wrap.new(paragraph,70) + wrapped=util.line_wrap + end + @@xml[:body] << "#{@tab*0}<object>" << "\n" if para[@regx] + @@xml[:body] << "#{@tab*1}<ocn>#{para[@regx,3]}</ocn>" << "\n" if para[@regx,3] + @@xml[:body] << if lv; %{#{@tab*1}<text class="h#{lv}">#{wrapped}</text>\n} << "\n" + else %{#{@tab*1}<text class="norm">#{wrapped}</text>\n} # main text, contents, body KEEP + end + #@@xml[:body] << "#{@tab*1}<text>#{wrapped}</text>\n" # main text, contents, body KEEP + ##@@xml[:body] << "#{@tab*1}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # old unwrapped main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" if para[@regx] + end + def xml_structure(para='',lv='',ocn='',hname='',type='norm') #extracted endnotes + lv=lv.to_i + n=lv - 1 + n3=lv + 2 + lv=nil if lv == 0 + extract_endnotes(para) + #puts @endnotes + para.gsub!(/~[{\[]([\d*+]+)\s+(?:.+?)\s*<#@dp>[}\]]~/,'<en>\1</en>') #footnote/endnote clean + if para[@regx] + paragraph="#{para[@regx,2]}" + util=SiSU_text_utils::Wrap.new(paragraph,70) + wrapped=util.line_wrap + end + @@xml[:body] << if para[@regx,3]; %{#{@tab*0}<object id="#{para[@regx,3]}">} << "\n" + else "#{@tab*0}<object>" << "\n" if para[@regx] + end + #@@xml[:body] << "#{@tab*1}<heading>#{lv}</heading>" << "\n" if lv + @@xml[:body] << "#{@tab*1}<ocn>#{para[@regx,3]}</ocn>" << "\n" if para[@regx,3] + @@xml[:body] << if lv; %{#{@tab*1}<text class="h#{lv}">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} << "\n" + else %{#{@tab*1}<text class="#{type}">\n#{@tab*2}#{wrapped}\n#{@tab*1}</text>\n} # main text, contents, body KEEP + end + @@xml[:body] << "#{@endnotes}" if @endnotes # main text, endnotes KEEP + ##@@xml[:body] << "#{@tab*1}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # old unwrapped main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" if para[@regx] + @endnotes=[] + end + def group_structure(para='',ocn='') + para.gsub!(/<:group(?:-end)?>/,'') + para=@trans.markup_group(para) + para.strip! + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*1}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*1}<text class="group">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def poem_structure(para='',ocn='') + para.gsub!(/<:verse(?:-end)?>/,'') + para=@trans.markup_group(para) + para.strip! + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*1}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*1}<text class="verse">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def code_structure(para='',ocn='') + para.gsub!(/<:code(?:-end)?>/,'') + para=@trans.markup_group(para) + para.gsub!(/\s\s/,'  ') + para.strip! + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*1}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*1}<text class="code">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*2}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*1}</text>\n} + @@xml[:body] << "#{@tab*0}</object>" << "\n" + end + def table_structure(table='',ocn='') #tables + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" #if para[@regx] + @@xml[:body] << %{#{@tab*1}#{table}\n#{@tab*1}\n} # unless lv # main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" #if para[@regx] + @endnotes=[] + end + def markup + data=@data + xml_sc(@md) + @endnotes,@level,@cont,@copen,@xml_contents_close=[],[],[],[],[] + @rcdc=false + (0..6).each { |x| @cont[x]=@level[x]=false } + (4..6).each { |x| @xml_contents_close[x]='' } + data.each do |para| + para=@trans.markup(para) + @trans.char_enc.utf8(para) if @sys.locale =~/utf-?8/i #% utf8 + if para =~/^0~(\S+)\s+(.+?)$/ # 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 =~/~metadata/ or para =~/1~\s+Document Information/) + if para !~/(^0~|<ENDNOTES>|<EOF>)/ + 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_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body1 + when /^(2)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body2 + when /^(3)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body3 + when /^(4)~(\S+)/ # work on see Split_text_object + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body4 + when /^(5)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body5 + when /^(6)~(?:(\S+))?/ + xml_structure(para,$1,@sto.ocn,$2) + para=@sto.lev_para_ocn.heading_body6 + 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 =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para,ocn) + para=table.table_split + table_structure(para) + elsif para =~ /<:i1>/ + xml_structure(para,nil,nil,nil,'indent1') + elsif para =~ /<:i2>/ + xml_structure(para,nil,nil,nil,'indent2') + else xml_structure(para,nil,nil,nil) + end + #@@xml[:body] << "#{@tab*6}<object>" << "\n" if para[@regx] + #@@xml[:body] << "#{@tab*7}<ocn>#{para[@regx,3]}</ocn>" << "\n" if para[@regx,3] + #@@xml[:body] << "#{@tab*7}<text>#{para[@regx,2]}</text>\n" if para[@regx,2] # main text, contents, body KEEP + #@@xml[:body] << "#{@tab*6}</object>" << "\n" if para[@regx] + end + elsif para =~/(Note|Endnotes?)/ and para !~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + #format_scroll=MonoSiSU.new('<br /><a name="notes">Note</a>') + #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,'<br /><a name="metadata">MetaData</a>') + 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,'<br /><a name="owner.details">Owner Details</a>') + @@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 =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\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 !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + # i don't get the condition for no paranum + 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!(/<!.+!>/,'') ## Clean Prepared Text #bugwatch reinstate + end + end + 6.downto(4) do |x| + y=x - 1; v=x - 3 + @@xml[:body] << "#{@tab*5}</content>\n#{@tab*y}</contents#{v}>\n" if @level[x] == true + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}</heading#{x}>\n" if @level[x] == true + end + #6.downto(1) { |x| y=x - 1; @@xml[:body] << "#{@tab*y}</level #{x}>\n" if @level[x] == true } + end + def pre + rdf=SiSU_XML_tags::RDF.new(@md) + dir=SiSU_Env::Info_env.new + @@xml[:head],@@xml[:body]=[],[] #added + css=SiSU_Env::CSS_select.new(@md).xml_sax + encoding=if @sys.locale =~/utf-?8/i; '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + else '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>' + end + @@xml[:open] =<<WOK +#{encoding} +<?xml-stylesheet type="text/css" href="../#{dir.path.style}/#{css}"?> +#{rdf.comment_xml} +<document> +WOK + @@xml[:head] << "<head>\n" + @@xml[:body] << "<body>\n" + end + def post + @@xml[:head] << @@xml[:sc] + @@xml[:head] << "</head>\n" + @@xml[:body] << "</body>\n" + @@xml[:close] = "</document>\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={} # check whether should be nil + end + end + class Output + include SiSU_Param + include SiSU_Env + 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[:sax]).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 #note values can be other than true + 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[:sax]}",tidyfile) + tidy.well_formed? + tell.p_off unless @md.cmd =~/q/ + end + end + end + def xmlexp #possibly use to decide whether to call rexml + end + end + end +end +__END__ +<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> +<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?xml version="1.0" encoding="UTF-16" standalone="no"?> diff --git a/lib/sisu/0.52/xml_dom.rb b/lib/sisu/0.52/xml_dom.rb new file mode 100644 index 00000000..f600a15d --- /dev/null +++ b/lib/sisu/0.52/xml_dom.rb @@ -0,0 +1,537 @@ +=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_XML_DOM + 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[:dom]}\n\t#{@env.program.xml_viewer} #{path}/#{@md.fnb}/#{@md.fn[:dom]}" + elsif @opt.cmd =~/v/; "#{@env.program.web_browser} #{loc}/#{@md.fnb}/#{@md.fn[:dom]}" + else '' + end + SiSU_Screen::Ansi.new(@opt.cmd,'invert','XML DOM',tool).colorize unless @opt.cmd =~/q/ + SiSU_Screen::Ansi.new(@opt.cmd,@opt.fns,"#{@env.path.output_tell}/#{@md.fnb}/#{@md.fn[:dom]}").flow if @opt.cmd =~/[MV]/ + @dal_array=SiSU_DAL::Source.new(@opt).get # dal file drawn here + SiSU_XML_DOM::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_XML_DOM::Source::Scroll.new(@data,@md).songsheet + SiSU_XML_DOM::Source::Tidy.new(@md,@env).xml if @md.cmd =~/[vVM]/ # test wellformedness, comment out when not in use + SiSU_Rexml::Rexml.new(@md,@md.fn[:dom]).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 + @@xml={ :body=>[],:open=>[],:close=>[],:head=>[],:sc=>[] } + require SiSU_lib + '/shared_txt' + include SiSU_text_utils + @@dp=nil + 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>\}~/, + '<endnote><number>\1</number><note>\2</note></endnote> ') + para.gsub!(/~\[([*+]\d+)\s+(.+?)\s*<#@dp>\]~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + para.gsub!(/~\{([*+]+)\s+(.+?)\s*<#@dp>\}~/, + '<endnote><symbol>\1</symbol><note>\2</note></endnote> ') + end + def xml_head(meta) + txt=meta.text + txt.gsub!(/<br(?: \/)?>/,'') + txt.gsub!(/ & /,' and ') + el=meta.el.gsub(/\./,'_') + el_txt=meta.el.gsub(/\./,' ') + @@xml[:head] <<= if meta.type == 'meta' + <<WOK +#{@tab}<header> +#{@tab*2}<meta>#{el_txt.capitalize}:</meta> +#{@tab*2}<#{el}> +#{@tab*3}#{txt} +#{@tab*2}</#{el}> +#{@tab}</header> +WOK + else '' + end + end + def xml_sc(md='') + sc=if @md.sc_info + <<WOK + <source_control> + <meta>filename:</meta> + <sc class="sourcefile"> + #{@md.sc_filename} + </sc><br /> + <meta>version number:</meta> + <sc class="number"> + #{@md.sc_number} + </sc><br /> + <meta>version date:</meta> + <sc class="date"> + #{@md.sc_date} + </sc><br /> + </source_control> +WOK + else '' + end + @@xml[:sc]=sc #<<<<WOK +#WOK + end + def xml_element(lv='',ocn='',para='',hname='',tag='',xml_element='',xml_content='') + lv=lv.to_i + n=lv - 1 + n1=lv + n2=lv + 1 + n3=lv + 2 + v=lv - 3 + tag='' + tag="\n#{@tab*n3}<nametag>#{hname}</nametag>\n" if hname #!=nil + @@xml[:body] <<<<WOK +#{@tab*n}#{xml_element} +#{@tab*n1}<heading> +#{@tab*n2}<object id="#{ocn}"> +#{@tab*n3}<ocn>#{ocn}</ocn>#{tag} +#{@tab*n3}<text>#{para[@regx,2]}</text> +#{@tab*n2}</object> +#{@tab*n1}</heading>#{xml_content} +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}<nametag>#{hname}</nametag>\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 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[1] or @cont[2] or @cont[3] + #@@xml[:body] << "#{@tab*5}</content>\n" if @cont[1] == true or @cont[2] == true or @cont[3] == true + @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 { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[2] # 5{ + [2,1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + @copen[1]=@copen[2]=@copen[3]=false + elsif @copen[1] # 4{ + [1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + @copen[1]=@copen[2]=@copen[3]=false + end + @@xml[:body] << "#{@tab*y}</heading#{x}>\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 + xml_element="<contents#{cv}>" + xml_content="\n#{@tab*5}<content>" + case lv + when 4 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[1] + if @copen[3] == true # 6~ + [3,2,1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + elsif @copen[2] == true # 5~ + [2,1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + elsif @copen[1] == true # 4~ + [1].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + end + @cont[1]=true + when 5 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[2] or @cont[1] + if @copen[3] == true #6~ + [3,2].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + elsif @copen[2] == true #5~ + [2].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } + end + @cont[2]=true + when 6 + @@xml[:body] << "#{@tab*5}</content>\n" if @cont[3] or @cont[2] or @cont[1] + [3].each { |v| @@xml[:body] << "#{@tab*n}</contents#{v}>\n" } if @copen[3] #6{ + @cont[3]=true + end + end + xml_element(lv,ocn,para,hname,tag,xml_element,xml_content) + @level[lv]=true + ((lv+1)..6).each { |x| @level[x]=false } + end + def group_structure(para='',ocn='') + para.gsub!(/<:group(?:-end)?>/,'') + para=@trans.markup_group(para) + para.strip! + @@xml[:body] << %{#{@tab*6}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*7}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*7}<text class="group">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</text>\n} + @@xml[:body] << "#{@tab*6}</object>" << "\n" + end + def poem_structure(para='',ocn='') + para.gsub!(/<:verse(?:-end)?>/,'') + para=@trans.markup_group(para) + para.strip! + @@xml[:body] << %{#{@tab*6}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*7}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*7}<text class="verse">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</text>\n} + @@xml[:body] << "#{@tab*6}</object>" << "\n" + end + def code_structure(para='',ocn='') + para.gsub!(/<:code(?:-end)?>/,'') + para=@trans.markup_group(para) + para.gsub!(/\s\s/,'  ') + para.strip! + @@xml[:body] << %{#{@tab*6}<object id="#{ocn}">} << "\n" + @@xml[:body] << %{#{@tab*7}<ocn>#{ocn}</ocn>} << "\n" + @@xml[:body] << %{#{@tab*7}<text class="code">#{@tab*1}\n} + @@xml[:body] << %{#{@tab*8}#{para}#{@tab*1}\n} + @@xml[:body] << %{#{@tab*7}</text>\n} + @@xml[:body] << "#{@tab*6}</object>" << "\n" + end + def table_structure(table='',ocn='') #tables + @@xml[:body] << %{#{@tab*0}<object id="#{ocn}">} << "\n" #if para[@regx] + @@xml[:body] << %{#{@tab*1}#{table}\n#{@tab*1}\n} # unless lv # main text, contents, body KEEP + @@xml[:body] << "#{@tab*0}</object>" << "\n" #if para[@regx] + @endnotes=[] + end + def markup + data=@data + 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| + para=@trans.markup(para) + @trans.char_enc.utf8(para) if @sys.locale =~/utf-?8/i #% utf8 + if para =~/^0~(\S+)\s+(.+?)$/ # 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 =~/~metadata/ or para =~/1~\s+Document Information/) + if para !~/(^0~|<ENDNOTES>|<EOF>)/ + 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 #if para =~m + when /^(2)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body2 #if para =~m + when /^(3)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body3 #if para =~m + 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 #if para =~m + when /^(5)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body5 #if para =~m + when /^(6)~(?:(\S+))?/ + xml_markup(para) + xml_structure($1,@sto.ocn,para,$2) + para=@sto.lev_para_ocn.heading_body6 #if para =~m + 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 =~/<!Th?.+/ # tables come as single block #work area 2005w13 + table=SiSU_Tables::Table_xml.new(para,ocn) + para=table.table_split + @@xml[:body] << table_structure(para,ocn) + else #xml_structure(para, nil, nil, nil) + type=case para + when /^\s*<:i1>/; 'indent1' + when /^\s*<:i2>/; 'indent2' + else 'norm' + end + xml_markup(para) + @@xml[:body] << %{#{@tab*6}<object id="#{para[@regx,3]}">} << "\n" if para[@regx] and para[@regx,3] + @@xml[:body] << "#{@tab*7}<ocn>#{para[@regx,3]}</ocn>" << "\n" if para[@regx,3] + @@xml[:body] << %{#{@tab*7}<text class="#{type}">#{para[@regx,2]}</text>\n} if para[@regx,2] # main text, contents, body KEEP + @@xml[:body] << "#{@tab*6}</object>" << "\n" if para[@regx] + end + end + elsif para =~/(Note|Endnotes?)/ and para !~/<~\d+;(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>$/ + #format_scroll=MonoSiSU.new('<br /><a name="notes">Note</a>') + #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,'<br /><a name="metadata">MetaData</a>') + 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,'<br /><a name="owner.details">Owner Details</a>') + @@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 =~/<a name="n\d+">/ and para =~/^(-\{{2}~\d+|<!e[:_]\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 !~/#{@vz.margin_txt_0}|#{@vz.margin_txt_1}|#{@vz.margin_txt_2}/ + # i don't get the condition for no paranum + 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!(/<!.+!>/,' ') ## Clean Prepared Text + 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] << "#{@tab*5}</content>\n#{@tab*y}</contents#{v}>\n" + @content_flag=false + else + @@xml[:body] << "\n#{@tab*y}</contents#{v}>\n" + end + end + end + 3.downto(1) do |x| + y=x - 1 + @@xml[:body] << "#{@tab*y}</heading#{x}>\n" if @level[x] == true + end + #6.downto(1) { |x| y=x - 1; @@xml[:body] << "#{@tab*y}</level #{x}>\n" if @level[x] == true } + end + def pre + rdf=SiSU_XML_tags::RDF.new(@md) + dir=SiSU_Env::Info_env.new + css=SiSU_Env::CSS_select.new(@md).xml_dom + encoding=if @sys.locale =~/utf-?8/i; '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' + else '<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>' + end + @@xml[:open] =<<WOK +#{encoding} +<?xml-stylesheet type="text/css" href="../#{dir.path.style}/#{css}"?> +#{rdf.comment_xml} +<document> +WOK + @@xml[:head] << "<head>\n" + @@xml[:body] << "<body>\n" + end + def post + @@xml[:head] << @@xml[:sc] + @@xml[:head] << "</head>\n" + @@xml[:body] << "</body>\n" + @@xml[:close] = "</document>\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]=[],[],[] # check whether should be nil + end + end + class Output + include SiSU_Param + def initialize(data,md) + @data,@md=data,md + end + def xml + @sisu=[] + @data.each do |para| #p + #para.strip! + 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.compact! + SiSU_Env::SiSU_file.new(@md).mkdir + filename_xml=SiSU_Env::SiSU_file.new(@md,@md.fn[:dom]).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 #(md.fns) #if md + 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[:dom]}",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/xml_format.rb b/lib/sisu/0.52/xml_format.rb new file mode 100644 index 00000000..111e2bee --- /dev/null +++ b/lib/sisu/0.52/xml_format.rb @@ -0,0 +1,339 @@ +=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 template + + * 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 index.xml >> index.tidy +=end +module SiSU_XML_format + require SiSU_lib + '/param' + include SiSU_Param + include SiSU_Viz + class Paragraph_number + def initialize(md,paranum) + @md=md + @paranum=/(\d+)/m.match(paranum)[1] + end + def display + p_num_display=@paranum.gsub(/(\d+)/, + '<font size="1" color="#777777">' + + ' \1</font>') + p_num_display + end + def name + p_num_name=@paranum.gsub(/(\d+)/,'<a name="\1"></a>') + p_num_name + end + def goto + p_num_goto=@paranum.gsub(/(\d+)/,'<a href="#\1">') + p_num_goto + end + end + class Head_information + def initialize #dc rdf + @dc_title=@dc_subtitle=@dc_creator=@dc_subject=@dc_description=@dc_publisher=@dc_contributor=@dc_date=@dc_type=@dc_format=@dc_identifier=@dc_source=@dc_language=@dc_relation=@dc_coverage=@dc_rights=@copyright=@owner=@keywords='' + @sfx,@pdf,@md=@@md.sfx,@@md.pdf,@@md + # DublinCore 1 - title + @rdfurl=%{ rdf:about="http://www.jus.uio.no/lm/toc"\n} + if @md.dc_title + @dc_title=%{<meta name="dc.title" content="#{seg_name}#{@md.dc_title}" />\n} + #if @md.subtitle + # #@rdf_title=%{ dc.title="#{seg_name}#{@md.title} - #{@md.subtitle}"\n} + # @dc_title=%{<meta name="dc.title" content="#{seg_name}#{@md.title} - #{@md.subtitle}" />\n} + #else + # #@rdf_title=%{ dc.title="#{seg_name}#{@md.title}"\n} + # @dc_title=%{<meta name="dc.title" content="#{seg_name}#{@md.dc_title}" />\n} + #end + end + if @md.dc_creator # DublinCore 2 - creator/author (author) + @rdf_creator=%{ dc.creator="#{@md.dc_creator}"\n} + @dc_creator=%{<meta name="dc.creator" content="#{@md.dc_creator}" />\n} + end + if @md.dc_subject # DublinCore 3 - subject (us library of congress, eric or udc, or schema???) + @rdf_subject=%{ dc.subject="#{@md.dc_subject}"\n} + @dc_subject=%{<meta name="dc.subject" content="#{@md.dc_subject}" />\n} + end + if @md.dc_description # DublinCore 4 - description + @rdf_description=%{ dc.description="#{@md.description}"\n} + @dc_description=%{<meta name="dc.dc_description" content="#{@md.description}" />\n} + end + if @md.dc_publisher # DublinCore 5 - publisher (current copy published by) + @rdf_publisher=%{ dc.publisher="#{@md.dc_publisher}"\n} + @dc_publisher=%{<meta name="dc.publisher" content="#{@md.dc_publisher}" />\n} + end + if @md.dc_contributor # DublinCore 6 - contributor + @rdf_contributor=%{ dc.contributor="#{@md.dc_contributor}"\n} + @dc_contributor=%{<meta name="dc.contributor" content="#{@md.dc_contributor}" />\n} + end + if @md.dc_date # DublinCore 7 - date year-mm-dd + @rdf_date=%{ dc.date="#{@md.dc_date}"\n} + @dc_date=%{<meta name="dc.date" content="#{@md.dc_date}" #{@md.date_scheme} />\n} + end + if @md.dc_date_created # DublinCore 7 - date.created year-mm-dd + @rdf_date_created=%{ dc.date.created="#{@md.dc_date_created}"\n} + @dc_date_created=%{<meta name="dc.date.created" content="#{@md.dc_date_created}" #{@md.date_created_scheme} />\n} + end + if @md.dc_date_issued # DublinCore 7 - date.issued year-mm-dd + @rdf_date_issued=%{ dc.date.issued="#{@md.dc_date_issued}"\n} + @dc_date_issued=%{<meta name="dc.date.issued" content="#{@md.dc_date_issued}" #{@md.date_issued_scheme} />\n} + end + if @md.dc_date_available # DublinCore 7 - date.available year-mm-dd + @rdf_date_available=%{ dc.date.available="#{@md.dc_date_available}"\n} + @dc_date_available=%{<meta name="dc.date.available" content="#{@md.dc_date_available}" #{@md.date_available_scheme} />\n} + end + if @md.dc_date_valid # DublinCore 7 - date.valid year-mm-dd + @rdf_date_valid=%{ dc.date.valid="#{@md.dc_date_valid}"\n} + @dc_date_valid=%{<meta name="dc.date.valid" content="#{@md.dc_date_valid}" #{@md.date_valid_scheme} />\n} + end + if @md.dc_date_modified # DublinCore 7 - date.modified year-mm-dd + @rdf_date_modified=%{ dc.date.modified="#{@md.dc_date_modified}"\n} + @dc_date_modified=%{<meta name="dc.date.modified" content="#{@md.dc_date_modified}" #{@md.date_modified_scheme} />\n} + end + if @md.dc_type # DublinCore 8 - type (genre eg. report, convention etc) + @rdf_type=%{ dc.type="#{@md.dc_type}"\n} + @dc_type=%{<meta name="dc.type" content="#{@md.dc_type}" />\n} + end + if @md.dc_format # DublinCore 9 - format (use your mime type) + @rdf_format=%{ dc.format="#{@md.dc_format}"\n} + @dc_format=%{<meta name="dc.format" content="#{@md.dc_format}" />\n} + end + if @md.dc_identifier # DublinCore 10 - identifier (your identifier, could use urn which is free) + @rdf_identifier=%{ dc.identifier="#{@md.dc_identifier}"\n} + @dc_identifier=%{<meta name="dc.identifier" content="#{@md.dc_identifier}" />\n} + end + if @md.dc_source # DublinCore 11 - source (document source) + @rdf_source=%{ dc.source="#{@md.dc_source}"\n} + @dc_source=%{<meta name="dc.source" content="#{@md.dc_source}" />\n} + end + if @md.dc_language[:name] # DublinCore 12 - language (English) + @rdf_language=%{ dc.language="#{@md.dc_language[:name]}"\n} + @dc_language=%{<meta name="dc.language" content="#{@md.dc_language[:name]}" />\n} + end + if @md.language_original[:name] # DublinCore 12 - language (English) + @rdf_language_original=%{ dc.language="#{@md.language_original[:name]}"\n} + @language_original=%{<meta name="dc.language" content="#{@md.language_original[:name]}" />\n} + end + if @md.dc_relation # DublinCore 13 - relation + @rdf_relation=%{ dc.relation="#{@md.dc_relation}"\n} + @dc_relation=%{<meta name="dc.relation" content="#{@md.dc_relation}" />\n} + end + if @md.dc_coverage # DublinCore 14 - coverage + @rdf_coverage=%{ dc.coverage="#{@md.dc_coverage}"\n} + @dc_coverage=%{<meta name="dc.coverage" content="#{@md.dc_coverage}" />\n} + end + if @md.dc_rights # DublinCore 15 - rights + @rdf_rights=%{ dc.rights="#{@md.dc_rights}"\n} + @dc_rights=%{<meta name="dc.rights" content="#{@md.dc_rights}" />\n} + end + @copyright=%{<meta name="copyright" content="#{@md.dc_rights}" />\n} if @md.rights # possibly redundant see dc.rights + @owner=%{<meta name="owner" content="#{@md.owner}" />\n} if @md.owner + @keywords=%{<meta name="keywords" content="#{@md.keywords}" />\n} if @md.keywords + @vz=SiSU_Env::Get_init.instance.skin #margin,paragraph,table,banner,url,png,txt,color,font,nav_txt,nav_png,credits,js,php + @index=case @md.file_type + when /php/; 'index' # @index="index.php" + else 'index' + end + end + def toc_head_escript #embedded script in this case PHP + # %{<p>PHP or other embedded script for object persistence may go HERE</p>} + end + #def seg_head_escript #embedded script in this case PHP + # # %{<p>PHP or other embedded script for object persistence may go HERE</p>} + #end + def table_close + '</font> </td></tr></table>' + end + def buttons_home + %{\n#{@banner.home_and_index_buttons}\n} + end + def copyat + %{copy @ <a href="#{@url.home}" #{@js.home}>#{@txt.home}</a>} + end + def toc_head + #<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + # xmlns:dc="http://purl.org/dc/elements/1.1/"> + # <rdf:Description rdf:about="http://www.jus.uio.no/lm/doc" + # dc:creator="Author" + # dc:title="Title" + # dc:description="Description if any" + # dc:date="Publication Date" + # /> + #</rdf:RDF> + #Dublin Core + <<WOK +<html> +<head> +<title>#{@md.html_title}</title> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <rdf:Description +#@rdfurl +#@rdf_title +#@rdf_subtitle +#@rdf_creator +#@rdf_subject +#@rdf_description +#@rdf_publisher +#@rdf_contributor +#@rdf_date +#@rdf_date_created +#@rdf_date_issued +#@rdf_date_available +#@rdf_date_valid +#@rdf_date_modified +#@rdf_type +#@rdf_format +#@rdf_identifier +#@rdf_source +#@rdf_language +#@rdf_relation +#@rdf_coverage +#@rdf_rights + /> +</rdf:RDF> +#@dc_title +#@dc_creator +#@dc_subject +#@dc_description +#@dc_publisher +#@dc_contributor +#@dc_date +#@dc_date_created +#@dc_date_issued +#@dc_date_available +#@dc_date_valid +#@dc_date_modified +#@dc_type +#@dc_format +#@dc_identifier +#@dc_source +#@dc_language +#@dc_relation +#@dc_coverage +#@dc_rights +#@copyright +#@owner +#{@png.ico} +#{@txt.generator} +#{@js.head} +\n</head> +#{@color.body} +#{@font.css_table_file} +<a name="top"></a> +<a name="up"></a> +<a name="start"></a> +#{@js.top} +WOK + end + end + class Format_text_object + @@dp=nil + attr_accessor :md,:one,:two,:three,:parablock,:table,:link,:linkname,:format,:paranum,:p_num,:para_id,:headname,:margin,:paragraph,:table,:banner,:url,:icon,:font,:one_stripped + def initialize(md,*txt) + @md=md + txt[0].gsub!(/\.(html|pdf|php)/,'') if one =~/\.\.\/\S+/ + @one,@two,@three=txt[0],txt[1],txt[2] + @format,@parablock=txt[0],txt[1] + if txt[2]=~/\d+/ + @paranum=/(\d+)/m.match(txt[2])[1] + @headname='' + #if txt[2]=~/\d+/ + m=/\d~(\S+)/m.match(format) + headname=m[1] if m + @headname=%{<a name="h#{headname}"></a>} unless headname.nil? + @p_num=SiSU_XML_format::Paragraph_number.new(@md,@paranum) + end + #{ + rgx=/^[1-6-]~{1,2}/ #watch + link=txt[0].gsub(rgx,'') if @one =~rgx + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + rgx=/~\{\d+\s+(.+?)<#@dp>\}~/ + link=txt[0].gsub(rgx,'\1') if txt[0] =~rgx + @link,@linkname=link,txt[1] + @vz=SiSU_Env::Get_init.instance.skin + end + def scr_endnote_body + "<endnote>#@one</endnote> " + end + end + class Format_scroll < Format_text_object + def initialize(*txt) + super(*txt) + end + def heading_body + %{<p class="norm">#{@p_num.name}#@headname#@parablock </p>} + + %{<p class="paranum">#{@p_num.display} </p>\n} + end + def heading_body1 + %{<h1 class="norm">#{@p_num.name}#@headname#@parablock </h1>} + + %{<p class="paranum">#{@p_num.display} </p>\n} + end + def heading_body2 + %{<h2 class="norm">#{@p_num.name}#@headname#@parablock </h2>} + + %{<p class="paranum">#{@p_num.display} </p>\n} + end + def heading_body3 + %{<h3 class="norm">#{@p_num.name}#@headname#@parablock </h3>} + + %{<p class="paranum">#{@p_num.display} </p>\n} + end + def heading_body4 + %{<h4 class="norm">#{@p_num.name}#@headname#@parablock</h4>} + + %{<p class="paranum">#{@p_num.display} </p>\n} + end + def heading_body5 + %{<h5 class="norm">#{@p_num.name}#@headname#@parablock </h5>} + + %{<p class="paranum">#{@p_num.display} </p>\n} + end + def heading_body6 + %{<h6 class="norm">#{@p_num.name}#@headname#@parablock </h6>} + + %{<p class="paranum">#{@p_num.display} </p>\n} + end + end + class XML + end +end +__END__ + diff --git a/lib/sisu/0.52/xml_tables.rb b/lib/sisu/0.52/xml_tables.rb new file mode 100644 index 00000000..5f48c3f7 --- /dev/null +++ b/lib/sisu/0.52/xml_tables.rb @@ -0,0 +1,202 @@ +=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: common file for xml table 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_Tables + require SiSU_lib + '/defaults' + include SiSU_Viz + class Table #_xml + @@tablehead=0 + @@tablefoot=[] #watch #bug??? #check was @@tablefoot + def initialize(one,ocn='') + @one,@parablock,@ocn,@vz=one,one,ocn,SiSU_Env::Get_init.instance.skin + end + def table_split #% used but, no longer operational, revisit + @new_content=[] + @one.split(/\n/).each do |parablock| + table=Table_xml.new("#{parablock}\n") + @new_content << table.table + end + @new_content.join + end + end + class Table_xml <Table + @@tablehead=0 + @@tablefoot=[] + @@dp=nil + def initialize(one,ocn='') + @one,@parablock,@ocn,@vz=one,one,ocn,SiSU_Env::Get_init.instance.skin + @dp=@@dp ||=SiSU_Env::Info_env.new.digest.pattern + end + def table + m=@parablock[/<!f(.+?)!>/,1] + @@tablefoot << m if m + @parablock.gsub!(/<!f.+?!>/,'') + @@tablehead=1 if @parablock =~/<!Th¡/ + if @parablock =~/<!Th?¡/ + @parablock.gsub!(/<!Th?¡.+?!~(\d+);\w\d+;\w\d+>/, + %{\n<ocn>#@ocn</ocn><table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center">}) + end + if @parablock =~/<!TZ!>/ + tablefoot=[] + #bug table footers need rethink, removed for now + @@tablefoot.each {|x| tablefoot << ''} + @@tablefoot=[] + @parablock.gsub!(/<!TZ!>\s+<~(\d+);(?:\w|[0-6]:)\d+;\w\d+><#@dp:#@dp>/,"</table>\n") # + + @parablock.gsub!(/<!TZ!>\s*/,"</table>\n") + end + if @@tablehead == 1 + if @parablock =~/¡¡/ + @parablock.gsub!(/<!¡¡(\d+?)¡/, + %{<tr> + <td width="\\1%" valign="top"> + #{@vz.paragraph_table_xml}<b>}) + @parablock.gsub!(/¡¡(\d+?)¡/, + %{</b></td><td width="\\1%" valign="top"> + #{@vz.paragraph_table_xml}<b>}) + @parablock.gsub!(/!>/,"</b>\n</td>\n</tr>") + @@tablehead=0 + end + @parablock + else + @parablock.gsub!(/<!¡¡(\d+?)¡/, + %{<tr> + <td width="\\1%" valign="top"> + #{@vz.paragraph_table_xml}}) + @parablock.gsub!(/¡¡(\d+?)¡/, + %{ + </td> + <td width="\\1%" valign="top"> + #{@vz.paragraph_table_xml}}) + @parablock.gsub!(/!>/,"\n</td>\n</tr>\n") + end + @parablock + end + end + class Table_xml_exp <Table + @@tablehead=0 + @@tablefoot=[] + def initialize(one) + @one,@parablock,@vz=one,one,SiSU_Env::Get_init.instance.skin + end + def table_head(inf) + %{<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center"> + <tr> + <td valign="top" align="justify"> + <a name="#{inf}"></a> + </td> + <td> +<table summary="normal text css" width="100%" border="0" bgcolor="white" cellpadding="2" align="center">} + end + def table_end(tablefoot='') + %{</table>#{@vz.margin_numless}#{@vz.margin_numless} #{@vz.table_close} +#{tablefoot}} + end + def table_row(inf,h=false) + bold=if h; '<b>' + else '' + end + %{ +<tr> + <td width="#{inf}%" valign="top">#{bold}} + end + def table_cell(inf,h=false) + if h; %{</b></td><td width="#{inf}%" valign="top"><b>} + else %{</td><td width="#{inf}%" valign="top">} + end + end + def table_row_close(h=false) + bold_close=if h; '</b>' + else '' + end + "#{bold_close}</td></tr>" + end + def table + m=@parablock[/<!f(.+?)!>/,1] + @@tablefoot << m if m + @parablock.gsub!(/<!f.+?!>/,'') + @@tablehead=1 if @parablock =~/<!Th¡/ + if @parablock =~/<!Th?¡.+?!~(\d+);\w\d+;\w\d+>/; @parablock=table_head($1) + end + if @parablock =~/<!TZ!>/ + tablefoot=[] + @@tablefoot.each {|x| tablefoot << ''} + @@tablefoot=[] + if @parablock =~/<!TZ!>/; @parablock=table_end + end + end + if @@tablehead == 1 + if @parablock =~/¡¡/ + if @parablock =~/<!¡¡(\d+?)¡/ + @parablock.gsub!(/<!¡¡(\d+?)¡/,table_row($1,true)) + end + if @parablock =~/¡¡(\d+?)¡/ + @parablock.gsub!(/¡¡(\d+?)¡/,table_cell($1,true)) + end + if @parablock =~/!>/ + @parablock.gsub!(/!>/,table_row_close(true)) + end + @@tablehead=0 + end + @parablock + else + if @parablock =~/<!¡¡(\d+?)¡/ + @parablock.gsub!(/<!¡¡(\d+?)¡/,table_row($1)) + end + if @parablock =~/¡¡(\d+?)¡/ + @parablock.gsub!(/¡¡(\d+?)¡/,table_cell($1)) + end + if @parablock =~/!>/ + @parablock.gsub!(/!>/,table_row_close) + end + @parablock + end + @parablock + end + end +end + diff --git a/lib/sisu/0.52/zap.rb b/lib/sisu/0.52/zap.rb new file mode 100644 index 00000000..42ee840d --- /dev/null +++ b/lib/sisu/0.52/zap.rb @@ -0,0 +1,73 @@ +=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: zap wipe clean previous output of the type specified + + * 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_Zap + require SiSU_lib + '/sysenv' + include SiSU_Env + pwd=Dir.pwd + class Source + def initialize(opt) + @opt=opt + @env=SiSU_Env::Info_env.new(@opt.fns) + @zap_path="#{@env.path.output}/#{@env.fnb}" + @zap=SiSU_Env::Clean_output.new(@opt) + end + def read + if SiSU_Env::Info_settings.new.permission?('zap') + tell=SiSU_Screen::Ansi.new(@opt.cmd,"Clean files related to processing #{@opt.cmd} ->","#{@opt.fns} -> #@zap_path") + @zap.zap + @zap.zap_map + else tell=SiSU_Screen::Ansi.new(@opt.cmd,'use of -Z (zap) has not enabled in sisurc.yml') + end + tell.warn unless @opt.cmd =~/q/ + end + end +end +__END__ |