sisu 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. checksums.yaml +7 -0
  2. data/bin/sisu +367 -0
  3. data/bin/sisugem +367 -0
  4. data/data/sisu/image/arrow_next_red.png +0 -0
  5. data/data/sisu/image/arrow_prev_red.png +0 -0
  6. data/data/sisu/image/arrow_up_red.png +0 -0
  7. data/data/sisu/image/b_bluebell.png +0 -0
  8. data/data/sisu/image/b_doc.png +0 -0
  9. data/data/sisu/image/b_epub.png +0 -0
  10. data/data/sisu/image/b_home.png +0 -0
  11. data/data/sisu/image/b_info.png +0 -0
  12. data/data/sisu/image/b_odf.png +0 -0
  13. data/data/sisu/image/b_pdf.png +0 -0
  14. data/data/sisu/image/b_search.png +0 -0
  15. data/data/sisu/image/b_toc.png +0 -0
  16. data/data/sisu/image/bullet_08.png +0 -0
  17. data/data/sisu/image/bullet_09.png +0 -0
  18. data/data/sisu/image/bullet_10.png +0 -0
  19. data/data/sisu/image/bullet_11.png +0 -0
  20. data/data/sisu/image/bullet_12.png +0 -0
  21. data/data/sisu/image/bullet_doc.png +0 -0
  22. data/data/sisu/image/bullet_red.png +0 -0
  23. data/data/sisu/image/dot_clear.png +0 -0
  24. data/data/sisu/image/dot_white.png +0 -0
  25. data/data/sisu/image/gplv3.png +0 -0
  26. data/data/sisu/image/gplv3_free_software.png +0 -0
  27. data/data/sisu/image/next.png +0 -0
  28. data/data/sisu/image/previous.png +0 -0
  29. data/data/sisu/image/rb7.ico +0 -0
  30. data/data/sisu/image/sisu.png +0 -0
  31. data/data/sisu/image/toctoc.png +0 -0
  32. data/data/sisu/version.yml +5 -0
  33. data/lib/sisu.rb +94 -0
  34. data/lib/sisu/air.rb +80 -0
  35. data/lib/sisu/ao.rb +590 -0
  36. data/lib/sisu/ao_character_check.rb +102 -0
  37. data/lib/sisu/ao_composite.rb +286 -0
  38. data/lib/sisu/ao_doc_objects.rb +565 -0
  39. data/lib/sisu/ao_doc_str.rb +2269 -0
  40. data/lib/sisu/ao_endnotes.rb +136 -0
  41. data/lib/sisu/ao_expand_insertions.rb +514 -0
  42. data/lib/sisu/ao_hash_digest.rb +174 -0
  43. data/lib/sisu/ao_idx.rb +422 -0
  44. data/lib/sisu/ao_images.rb +187 -0
  45. data/lib/sisu/ao_metadata.rb +86 -0
  46. data/lib/sisu/ao_misc_arrange.rb +207 -0
  47. data/lib/sisu/ao_numbering.rb +720 -0
  48. data/lib/sisu/ao_persist.rb +194 -0
  49. data/lib/sisu/ao_references.rb +502 -0
  50. data/lib/sisu/ao_syntax.rb +640 -0
  51. data/lib/sisu/cgi.rb +84 -0
  52. data/lib/sisu/cgi_pgsql.rb +270 -0
  53. data/lib/sisu/cgi_sql_common.rb +986 -0
  54. data/lib/sisu/cgi_sqlite.rb +244 -0
  55. data/lib/sisu/conf.rb +287 -0
  56. data/lib/sisu/constants.rb +388 -0
  57. data/lib/sisu/css.rb +3484 -0
  58. data/lib/sisu/db_columns.rb +1997 -0
  59. data/lib/sisu/db_create.rb +689 -0
  60. data/lib/sisu/db_dbi.rb +90 -0
  61. data/lib/sisu/db_drop.rb +207 -0
  62. data/lib/sisu/db_import.rb +877 -0
  63. data/lib/sisu/db_indexes.rb +146 -0
  64. data/lib/sisu/db_load_tuple.rb +323 -0
  65. data/lib/sisu/db_remove.rb +182 -0
  66. data/lib/sisu/db_select.rb +230 -0
  67. data/lib/sisu/db_sqltxt.rb +173 -0
  68. data/lib/sisu/db_tests.rb +114 -0
  69. data/lib/sisu/dbi.rb +166 -0
  70. data/lib/sisu/dbi_discrete.rb +206 -0
  71. data/lib/sisu/digests.rb +306 -0
  72. data/lib/sisu/dp.rb +1606 -0
  73. data/lib/sisu/dp_identify_markup.rb +161 -0
  74. data/lib/sisu/dp_make.rb +668 -0
  75. data/lib/sisu/embedded.rb +149 -0
  76. data/lib/sisu/errors.rb +84 -0
  77. data/lib/sisu/generic_parts.rb +131 -0
  78. data/lib/sisu/git.rb +277 -0
  79. data/lib/sisu/html.rb +775 -0
  80. data/lib/sisu/html_concordance.rb +391 -0
  81. data/lib/sisu/html_format.rb +1348 -0
  82. data/lib/sisu/html_harvest.rb +109 -0
  83. data/lib/sisu/html_harvest_author_format.rb +111 -0
  84. data/lib/sisu/html_harvest_authors.rb +466 -0
  85. data/lib/sisu/html_harvest_topics.rb +893 -0
  86. data/lib/sisu/html_lite_shared.rb +324 -0
  87. data/lib/sisu/html_manifest.rb +1032 -0
  88. data/lib/sisu/html_minitoc.rb +230 -0
  89. data/lib/sisu/html_parts.rb +437 -0
  90. data/lib/sisu/html_persist.rb +237 -0
  91. data/lib/sisu/html_promo.rb +440 -0
  92. data/lib/sisu/html_scroll.rb +235 -0
  93. data/lib/sisu/html_segments.rb +716 -0
  94. data/lib/sisu/html_shared.rb +62 -0
  95. data/lib/sisu/html_table.rb +64 -0
  96. data/lib/sisu/html_tune.rb +301 -0
  97. data/lib/sisu/hub.rb +277 -0
  98. data/lib/sisu/hub_actions.rb +1122 -0
  99. data/lib/sisu/hub_loop_markup_files.rb +170 -0
  100. data/lib/sisu/hub_options.rb +1695 -0
  101. data/lib/sisu/i18n.rb +702 -0
  102. data/lib/sisu/manpage.rb +377 -0
  103. data/lib/sisu/manpage_format.rb +85 -0
  104. data/lib/sisu/object_munge.rb +307 -0
  105. data/lib/sisu/prog_text_translation.rb +1702 -0
  106. data/lib/sisu/qrcode.rb +754 -0
  107. data/lib/sisu/relaxng.rb +1153 -0
  108. data/lib/sisu/remote.rb +246 -0
  109. data/lib/sisu/rexml.rb +148 -0
  110. data/lib/sisu/se.rb +158 -0
  111. data/lib/sisu/se_cleanoutput.rb +145 -0
  112. data/lib/sisu/se_clear.rb +105 -0
  113. data/lib/sisu/se_createsite.rb +273 -0
  114. data/lib/sisu/se_css.rb +221 -0
  115. data/lib/sisu/se_date.rb +92 -0
  116. data/lib/sisu/se_db.rb +214 -0
  117. data/lib/sisu/se_envcall.rb +326 -0
  118. data/lib/sisu/se_file_op.rb +2758 -0
  119. data/lib/sisu/se_filemap.rb +247 -0
  120. data/lib/sisu/se_get_init.rb +238 -0
  121. data/lib/sisu/se_hub_particulars.rb +234 -0
  122. data/lib/sisu/se_info_env.rb +2179 -0
  123. data/lib/sisu/se_info_port.rb +70 -0
  124. data/lib/sisu/se_info_system.rb +202 -0
  125. data/lib/sisu/se_load.rb +108 -0
  126. data/lib/sisu/se_processing.rb +659 -0
  127. data/lib/sisu/se_programs.rb +394 -0
  128. data/lib/sisu/se_remotes.rb +553 -0
  129. data/lib/sisu/se_standardise_lang.rb +176 -0
  130. data/lib/sisu/se_version.rb +174 -0
  131. data/lib/sisu/shared_images.rb +137 -0
  132. data/lib/sisu/shared_markup_alt.rb +336 -0
  133. data/lib/sisu/shared_metadata.rb +1361 -0
  134. data/lib/sisu/shared_sem.rb +156 -0
  135. data/lib/sisu/sisu_thor_lib.rb +407 -0
  136. data/lib/sisu/sitemaps.rb +224 -0
  137. data/lib/sisu/src_kdissert_share.rb +102 -0
  138. data/lib/sisu/src_po4a_share.rb +309 -0
  139. data/lib/sisu/src_po4a_shelf.rb +1217 -0
  140. data/lib/sisu/src_po4a_shelf_set.rb +297 -0
  141. data/lib/sisu/src_po4a_sst_ao_sst.rb +893 -0
  142. data/lib/sisu/src_po4a_sst_ao_sst_set.rb +284 -0
  143. data/lib/sisu/src_po4a_sstm.rb +135 -0
  144. data/lib/sisu/src_shared.rb +347 -0
  145. data/lib/sisu/src_sisupod_make.rb +171 -0
  146. data/lib/sisu/src_sisupod_sstm.rb +109 -0
  147. data/lib/sisu/sst_convert_markup.rb +323 -0
  148. data/lib/sisu/sst_do_inline_footnotes.rb +440 -0
  149. data/lib/sisu/sst_from_xml.rb +178 -0
  150. data/lib/sisu/sst_identify_markup.rb +482 -0
  151. data/lib/sisu/sst_to_s_xml_sax.rb +471 -0
  152. data/lib/sisu/termsheet.rb +163 -0
  153. data/lib/sisu/texinfo.rb +430 -0
  154. data/lib/sisu/texinfo_format.rb +541 -0
  155. data/lib/sisu/texpdf.rb +1162 -0
  156. data/lib/sisu/texpdf_format.rb +1689 -0
  157. data/lib/sisu/texpdf_parts.rb +235 -0
  158. data/lib/sisu/txt_asciidoc.rb +354 -0
  159. data/lib/sisu/txt_asciidoc_decorate.rb +207 -0
  160. data/lib/sisu/txt_markdown.rb +389 -0
  161. data/lib/sisu/txt_markdown_decorate.rb +207 -0
  162. data/lib/sisu/txt_orgmode.rb +376 -0
  163. data/lib/sisu/txt_orgmode_decorate.rb +186 -0
  164. data/lib/sisu/txt_output.rb +86 -0
  165. data/lib/sisu/txt_plain.rb +410 -0
  166. data/lib/sisu/txt_plain_decorate.rb +189 -0
  167. data/lib/sisu/txt_read.rb +109 -0
  168. data/lib/sisu/txt_rst.rb +371 -0
  169. data/lib/sisu/txt_rst_decorate.rb +186 -0
  170. data/lib/sisu/txt_shared.rb +241 -0
  171. data/lib/sisu/txt_textile.rb +367 -0
  172. data/lib/sisu/txt_textile_decorate.rb +186 -0
  173. data/lib/sisu/update.rb +141 -0
  174. data/lib/sisu/urls.rb +696 -0
  175. data/lib/sisu/utils.rb +232 -0
  176. data/lib/sisu/utils_composite.rb +115 -0
  177. data/lib/sisu/utils_response.rb +114 -0
  178. data/lib/sisu/utils_screen_text_color.rb +472 -0
  179. data/lib/sisu/utils_spell.rb +99 -0
  180. data/lib/sisu/webrick.rb +191 -0
  181. data/lib/sisu/wikispeak.rb +375 -0
  182. data/lib/sisu/xhtml.rb +472 -0
  183. data/lib/sisu/xhtml_epub2.rb +890 -0
  184. data/lib/sisu/xhtml_epub2_concordance.rb +322 -0
  185. data/lib/sisu/xhtml_epub2_format.rb +2272 -0
  186. data/lib/sisu/xhtml_epub2_persist.rb +278 -0
  187. data/lib/sisu/xhtml_epub2_segments.rb +599 -0
  188. data/lib/sisu/xhtml_epub2_tune.rb +330 -0
  189. data/lib/sisu/xhtml_parts.rb +183 -0
  190. data/lib/sisu/xhtml_shared.rb +62 -0
  191. data/lib/sisu/xhtml_table.rb +97 -0
  192. data/lib/sisu/xml_docbook5.rb +376 -0
  193. data/lib/sisu/xml_dom.rb +624 -0
  194. data/lib/sisu/xml_fictionbook2.rb +389 -0
  195. data/lib/sisu/xml_format.rb +865 -0
  196. data/lib/sisu/xml_md_oai_pmh_dc.rb +229 -0
  197. data/lib/sisu/xml_odf_odt.rb +887 -0
  198. data/lib/sisu/xml_odf_odt_format.rb +674 -0
  199. data/lib/sisu/xml_parts.rb +191 -0
  200. data/lib/sisu/xml_persist.rb +126 -0
  201. data/lib/sisu/xml_sax.rb +521 -0
  202. data/lib/sisu/xml_scaffold_structure_collapsed.rb +198 -0
  203. data/lib/sisu/xml_scaffold_structure_sisu.rb +201 -0
  204. data/lib/sisu/xml_shared.rb +665 -0
  205. data/lib/sisu/xml_tables.rb +261 -0
  206. data/lib/sisu/zap.rb +90 -0
  207. metadata +251 -0
data/lib/sisu/cgi.rb ADDED
@@ -0,0 +1,84 @@
1
+ # encoding: utf-8
2
+ =begin
3
+
4
+ * Name: SiSU
5
+
6
+ ** Description: documents, structuring, processing, publishing, search
7
+ *** generates naive cgi search form for search of sisu database (pgsql sqlite)
8
+
9
+ ** Author: Ralph Amissah
10
+ <ralph@amissah.com>
11
+ <ralph.amissah@gmail.com>
12
+
13
+ ** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
14
+ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Ralph Amissah,
15
+ All Rights Reserved.
16
+
17
+ ** License: GPL 3 or later:
18
+
19
+ SiSU, a framework for document structuring, publishing and search
20
+
21
+ Copyright (C) Ralph Amissah
22
+
23
+ This program is free software: you can redistribute it and/or modify it
24
+ under the terms of the GNU General Public License as published by the Free
25
+ Software Foundation, either version 3 of the License, or (at your option)
26
+ any later version.
27
+
28
+ This program is distributed in the hope that it will be useful, but WITHOUT
29
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
30
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
31
+ more details.
32
+
33
+ You should have received a copy of the GNU General Public License along with
34
+ this program. If not, see <http://www.gnu.org/licenses/>.
35
+
36
+ If you have Internet connection, the latest version of the GPL should be
37
+ available at these locations:
38
+ <http://www.fsf.org/licensing/licenses/gpl.html>
39
+ <http://www.gnu.org/licenses/gpl.html>
40
+
41
+ <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html>
42
+
43
+ ** SiSU uses:
44
+ * Standard SiSU markup syntax,
45
+ * Standard SiSU meta-markup syntax, and the
46
+ * Standard SiSU object citation numbering and system
47
+
48
+ ** Hompages:
49
+ <http://www.jus.uio.no/sisu>
50
+ <http://www.sisudoc.org>
51
+
52
+ ** Git
53
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
54
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/cgi.rb;hb=HEAD>
55
+
56
+ =end
57
+ module SiSU_CGI #% database building documents
58
+ require_relative 'se' # se.rb
59
+ require_relative 'cgi_pgsql' # cgi_pgsql.rb
60
+ require_relative 'cgi_sqlite' # cgi_sqlite.rb
61
+ class SearchSQL
62
+ def initialize(opt)
63
+ @opt=opt
64
+ @webserv=@opt.files[0].to_s.strip
65
+ end
66
+ def read
67
+ if @opt.act[:sample_search_form][:db]==:pg # cgi_pgsql.rb
68
+ SiSU_CGI_PgSQL::SearchPgSQL.new(@opt,@webserv).pgsql
69
+ elsif @opt.act[:sample_search_form][:db]==:sqlite # cgi_sqlite.rb
70
+ SiSU_CGI_SQLite::SearchSQLite.new(@opt,@webserv).sqlite
71
+ else
72
+ puts <<-WOK
73
+ please select database type for which sample search form should be built (pgsql or sqlite)
74
+ sisu --sample-search-form --db=sqlite
75
+ sisu --sample-search-form --db=pg
76
+ other options include
77
+ --webserv-cgi='[cgi-server-name]'
78
+ --webserv-output='[sisu-output-server-with-base-path]'
79
+ WOK
80
+ end
81
+ end
82
+ end
83
+ end
84
+ __END__
@@ -0,0 +1,270 @@
1
+ # encoding: utf-8
2
+ =begin
3
+
4
+ * Name: SiSU
5
+
6
+ ** Description: documents, structuring, processing, publishing, search
7
+ *** generates naive cgi search form for search of sisu database (pgsql)
8
+
9
+ ** Author: Ralph Amissah
10
+ <ralph@amissah.com>
11
+ <ralph.amissah@gmail.com>
12
+
13
+ ** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
14
+ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Ralph Amissah,
15
+ All Rights Reserved.
16
+
17
+ ** License: GPL 3 or later:
18
+
19
+ SiSU, a framework for document structuring, publishing and search
20
+
21
+ Copyright (C) Ralph Amissah
22
+
23
+ This program is free software: you can redistribute it and/or modify it
24
+ under the terms of the GNU General Public License as published by the Free
25
+ Software Foundation, either version 3 of the License, or (at your option)
26
+ any later version.
27
+
28
+ This program is distributed in the hope that it will be useful, but WITHOUT
29
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
30
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
31
+ more details.
32
+
33
+ You should have received a copy of the GNU General Public License along with
34
+ this program. If not, see <http://www.gnu.org/licenses/>.
35
+
36
+ If you have Internet connection, the latest version of the GPL should be
37
+ available at these locations:
38
+ <http://www.fsf.org/licensing/licenses/gpl.html>
39
+ <http://www.gnu.org/licenses/gpl.html>
40
+
41
+ <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html>
42
+
43
+ ** SiSU uses:
44
+ * Standard SiSU markup syntax,
45
+ * Standard SiSU meta-markup syntax, and the
46
+ * Standard SiSU object citation numbering and system
47
+
48
+ ** Hompages:
49
+ <http://www.jus.uio.no/sisu>
50
+ <http://www.sisudoc.org>
51
+
52
+ ** Git
53
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
54
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/cgi_pgsql.rb;hb=HEAD>
55
+
56
+ =end
57
+ module SiSU_CGI_PgSQL #% database building documents
58
+ require_relative 'se' # se.rb
59
+ require_relative 'cgi_sql_common' # cgi_sql_common.rb
60
+ include SiSU_CGI_SQL
61
+ class SearchPgSQL < CGI_Common
62
+ def initialize(opt,webserv)
63
+ @opt,@webserv=opt,webserv
64
+ @cX=SiSU_Screen::Ansi.new(opt.act[:color_state][:set]).cX
65
+ @env=SiSU_Env::InfoEnv.new('',opt)
66
+ @sys=SiSU_Env::SystemCall.new
67
+ @db=SiSU_Env::InfoDb.new
68
+ get_init=SiSU_Env::GetInit.new
69
+ @rc=get_init.sisu_yaml.rc
70
+ @name_of={}
71
+ @name_of[:output_dir_structure]=if opt.dir_structure_by.to_s =~/(?:language|filetype|filename)/
72
+ opt.dir_structure_by.to_s
73
+ else 'language'
74
+ end
75
+ @name_of[:lingual]=if opt.lingual.to_s =~/(?:mono|multi)/
76
+ opt.lingual.to_s
77
+ else 'multi'
78
+ end
79
+ @name_of[:db]=if defined? @rc['search'] \
80
+ and defined? @rc['search']['sisu'] \
81
+ and defined? @rc['search']['sisu']['action'] \
82
+ and @rc['search']['sisu']['action'] =~/https?:\/\/\S+?\.cgi/ \
83
+ and defined? @rc['search']['sisu']['db'] \
84
+ and @rc['search']['sisu']['db'] =~/\S+/
85
+ @rc['search']['sisu']['db']
86
+ else
87
+ @env.path.base_markup_dir_stub #'sisu' #breaks if not present
88
+ end
89
+ @name_of[:host_url_cgi]=%q{http://#{ENV['HTTP_HOST']}#{ENV['PATH_INFO']}}
90
+ @name_of[:host_url_docs]=%q{http://#{ENV['HTTP_HOST']}}
91
+ @name_of[:cgi_script]=%q{#{ENV['SCRIPT_NAME']}}
92
+ @name_of[:user]=@db.psql.user(opt)
93
+ @image_src=%q{http://#{ENV['HTTP_HOST']}/_sisu/image_sys}
94
+ @common=SiSU_CGI_SQL::CGI_Common.new(@webserv,opt,@image_src,@env)
95
+ @cgi_file_name=@env.url.cgi_sample_search_form_name(opt)
96
+ end
97
+ def pgsql
98
+ serve=[]
99
+ if @sys.psql
100
+ available_db_table=`psql --list` # system call requires psql
101
+ available_db=available_db_table.scan(/(#{Db[:name_prefix]}\S+)/) if not available_db_table.nil?
102
+ if available_db \
103
+ and available_db.is_a?(Array)
104
+ available_db.flatten.each do |x|
105
+ serve << x.gsub(/#{Db[:name_prefix]}(\S+)/,'\1')
106
+ end
107
+ else STDERR.puts "WARNING: no postgresql database available, (have you created one?)"
108
+ end
109
+ serve=serve.sort
110
+ f1,f2='',''
111
+ serve.each do |x|
112
+ f1 << %{ <option value="#{Db[:name_prefix]}#{x}">#{x}</option>\n} unless x =~/apache|sisu\/image/ #check
113
+ end
114
+ end
115
+ f2 << %q{ selected_db=%{<option value="#{@db_name_prefix}#{@stub}">#{@stub}</option>}} + "\n"
116
+ if FileTest.writable?('.')
117
+ output=File.open(@cgi_file_name,'w')
118
+ output << header0 << header1 << header_desc << header2 << f1 << buttons1 << buttons1_pgsql << buttons2 << search_request << search_statement << search_statement_common << search_query1 << @common.pages << search_query2 << @common.tail << @common.main1 << f2 << dbi_connect << @common.main2 << @common.dir_structure << @common.main3
119
+ puts <<-WOK
120
+ generated sample search form: #{@cX.green}#{@cgi_file_name}#{@cX.off}
121
+ default database name: #{@cX.green}#{Db[:name_prefix]}#{@name_of[:db]}#{@cX.off} (#{@name_of[:db]})
122
+ db user: #{@cX.green}#{@name_of[:user]}#{@cX.off}
123
+ to modify use: #{@cX.brown}sisu --db-pg --db-user='#{@name_of[:user]}'#{@cX.off}
124
+
125
+ #{@cX.fuchsia}BASED ON ALREADY EXISTING databases#{@cX.off} (default database name: #{@db.psql.db})
126
+ NOTE it is first necessary to createdb,
127
+ use sisu to create the tables & populate the postgresql db
128
+
129
+ the database to be used for this directory (#{@db.psql.db})
130
+ will have to be created manually if it does not exist:
131
+ using postgresql tools directly (the following may work):
132
+ (i) if you are not yet a postgresql user,
133
+ #{@cX.brown}sudo su postgres
134
+ createuser -d -a #{@env.user}
135
+ exit#{@cX.off}
136
+ (ii) create the database:
137
+ #{@cX.brown}createdb #{@db.psql.db}#{@cX.off}
138
+ [for a list of existing databases try 'psql --list']"
139
+
140
+ you can use sisu to create the database tables and populate the database with documents
141
+
142
+ sisu --pg --dropall # removes existing postgresql db & tables
143
+ sisu --pg --createall -v # creates postgresql db & tables
144
+ sisu --pg --update -v *.sst *.ssm # populate the db
145
+ sisu --sample-search-form --db-pg # creates the postgresql search form
146
+ # this should be done after creating the db
147
+ # to be searched
148
+ sisu --webrick & # starts ruby webrick web server
149
+
150
+ # if necessary make the directory '/usr/lib/cgi-bin'
151
+ # here we copy the postgresql search form to cgi-bin
152
+ # (copy #{@cgi_file_name} to your cgi directory)
153
+ # set file permissions to 755
154
+ WOK
155
+ a=case @webserv
156
+ when /pwd/ then ''
157
+ else <<-WOK
158
+
159
+ sudo cp -vi #{Dir.pwd}/#{@cgi_file_name} /usr/lib/cgi-bin/.; \\
160
+ sudo chmod -v 755 /usr/lib/cgi-bin/#{@cgi_file_name}
161
+ WOK
162
+ end
163
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],a).warn
164
+ a=<<-WOK
165
+ #{@env.webserv_base_cgi(@opt)}/cgi-bin/#{@cgi_file_name}
166
+ WOK
167
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],a).print_blue
168
+ a="\n\t(to create and populate postgresql database see 'man sisu' and in particular the --pg option)\n\t[the database to be used for this directory (#{@db.psql.db}) will have to be created manually if it does not exist,\n\tusing postgresql tools directly: 'createdb #{@db.psql.db}' for a list of existing databases try 'psql --list']"
169
+ SiSU_Screen::Ansi.new(@opt.act[:color_state][:set],a).txt_grey
170
+ else puts 'failed in attempt to write #{@cgi_file_name} to present directory, is directory writable?'
171
+ end
172
+ end
173
+ def header0
174
+ <<-WOK_SQL
175
+ #!/usr/bin/env ruby
176
+ =begin
177
+ #{about}
178
+ * Description: generates naive cgi search form for search of sisu database (pgsql)
179
+ #{gpl}
180
+ =end
181
+ begin
182
+ require 'cgi'
183
+ require 'fcgi'
184
+ require 'pg'
185
+ rescue LoadError
186
+ puts 'cgi, fcgi or pg NOT FOUND (LoadError)'
187
+ end
188
+ @stub_default='#{@name_of[:db]}'
189
+ @image_src="#{@image_src}"
190
+ @hosturl_cgi="#{@name_of[:host_url_cgi]}"
191
+ @hosturl_files="#{@name_of[:host_url_docs]}"
192
+ @output_dir_structure_by='#{@name_of[:output_dir_structure]}'
193
+ @lingual='#{@name_of[:lingual]}'
194
+ @port='#{@db.psql.port}'
195
+ @db_name_prefix='#{Db[:name_prefix]}'
196
+ @user='#{@name_of[:user]}' # check user name for access to pg database: e.g. www-data or '#{@env.user}'
197
+ @base="#{@name_of[:host_url_cgi]}#{@name_of[:cgi_script]}"
198
+ WOK_SQL
199
+ end
200
+ def search_statement
201
+ <<-'WOK_SQL'
202
+ class DBI_SearchString
203
+ def initialize(l,t,q,cse=false)
204
+ @l,@t,@q,@c=l,t,q,cse
205
+ end
206
+ def string
207
+ search={ search: [], flag: false }
208
+ if @t =~/\S+/ or @q =~/\S+/
209
+ if @t =~/\S+/ then unescaped_search=CGI.unescape(@t)
210
+ elsif @q =~/\S+/ then unescaped_search=CGI.unescape(@q)
211
+ end
212
+ search_construct=[]
213
+ unescaped_search=if @c
214
+ unescaped_search.gsub(/\s*(AND|OR)\s*/,"' \) \\1 #{@l}~\( '").
215
+ gsub(/(.+)/,"#{@l}~\( '\\1' \)")
216
+ else
217
+ unescaped_search.gsub(/\s*(AND|OR)\s*/,"' \) \\1 #{@l}~*\( '").
218
+ gsub(/(.+)/,"#{@l}~*\( '\\1' \)")
219
+ end
220
+ search_construct << unescaped_search
221
+ search_construct=search_construct.join(' ')
222
+ search[:search] << search_construct
223
+ search[:flag]=true
224
+ search
225
+ end
226
+ search
227
+ end
228
+ end
229
+ WOK_SQL
230
+ end
231
+ def search_query1
232
+ <<-'WOK_SQL'
233
+ @search_text=''
234
+ @search_text=search[:text].flatten.join(' AND ')
235
+ @search_text=@search_text.gsub(/(doc_objects\.clean~[*]?\(\s*'[^']+'\s*\)\s+(?:(?:AND|OR)\s+doc_objects\.clean~[*]?\(\s*'[^']+'\s*\))+)/,'(\1)')
236
+ end
237
+ WOK_SQL
238
+ end
239
+ def search_query2
240
+ <<-'WOK_SQL'
241
+ def sql_select_body
242
+ limit ||=@@limit
243
+ offset ||=@@offset
244
+ @sql_statement[:body]=%{SELECT metadata_and_text.title, metadata_and_text.creator_author, metadata_and_text.src_filename, metadata_and_text.language_document_char, metadata_and_text.notes_suffix, doc_objects.body, doc_objects.seg, doc_objects.ocn, metadata_and_text.tid FROM doc_objects, metadata_and_text WHERE (#{@search_text}) AND doc_objects.metadata_tid = metadata_and_text.tid ORDER BY metadata_and_text.language_document_char, metadata_and_text.title, metadata_and_text.src_filename, doc_objects.ocn}
245
+ @sql_statement[:range]=%{LIMIT #{limit} OFFSET #{offset} ;}
246
+ select=@sql_statement[:body] + ' ' + @sql_statement[:range]
247
+ select
248
+ end
249
+ def sql_select_body_format
250
+ %{<font color="#666666" size="2">#{sql_select_body}</font>}
251
+ end
252
+ def contents
253
+ @conn.exec(sql_select_body)
254
+ end
255
+ end
256
+ WOK_SQL
257
+ end
258
+ def buttons1_pgsql
259
+ <<-'WOK_SQL'
260
+ <input type="checkbox" name="casesense" #{@checked_case}> case sensitive
261
+ WOK_SQL
262
+ end
263
+ def dbi_connect
264
+ <<-'WOK_SQL'
265
+ @conn=PG::Connection.open(dbname: @db, port: @port, user: @user)
266
+ WOK_SQL
267
+ end
268
+ end
269
+ end
270
+ __END__
@@ -0,0 +1,986 @@
1
+ # encoding: utf-8
2
+ =begin
3
+
4
+ * Name: SiSU
5
+
6
+ ** Description: documents, structuring, processing, publishing, search
7
+ *** generates naive cgi search form for search of sisu database (pgsql sqlite)
8
+
9
+ ** Author: Ralph Amissah
10
+ <ralph@amissah.com>
11
+ <ralph.amissah@gmail.com>
12
+
13
+ ** Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
14
+ 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Ralph Amissah,
15
+ All Rights Reserved.
16
+
17
+ ** License: GPL 3 or later:
18
+
19
+ SiSU, a framework for document structuring, publishing and search
20
+
21
+ Copyright (C) Ralph Amissah
22
+
23
+ This program is free software: you can redistribute it and/or modify it
24
+ under the terms of the GNU General Public License as published by the Free
25
+ Software Foundation, either version 3 of the License, or (at your option)
26
+ any later version.
27
+
28
+ This program is distributed in the hope that it will be useful, but WITHOUT
29
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
30
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
31
+ more details.
32
+
33
+ You should have received a copy of the GNU General Public License along with
34
+ this program. If not, see <http://www.gnu.org/licenses/>.
35
+
36
+ If you have Internet connection, the latest version of the GPL should be
37
+ available at these locations:
38
+ <http://www.fsf.org/licensing/licenses/gpl.html>
39
+ <http://www.gnu.org/licenses/gpl.html>
40
+
41
+ <http://www.sisudoc.org/sisu/en/manifest/gpl.fsf.html>
42
+
43
+ ** SiSU uses:
44
+ * Standard SiSU markup syntax,
45
+ * Standard SiSU meta-markup syntax, and the
46
+ * Standard SiSU object citation numbering and system
47
+
48
+ ** Hompages:
49
+ <http://www.jus.uio.no/sisu>
50
+ <http://www.sisudoc.org>
51
+
52
+ ** Git
53
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=summary>
54
+ <http://git.sisudoc.org/gitweb/?p=code/sisu.git;a=blob;f=lib/sisu/cgi_sql_common.rb;hb=HEAD>
55
+
56
+ =end
57
+ module SiSU_CGI_SQL
58
+ class CGI_Common
59
+ def initialize(webserv,opt,image_src,dir)
60
+ @webserv,@opt,@image_src,@env=webserv,opt,image_src,dir
61
+ end
62
+ def about
63
+ <<-'WOK_SQL'
64
+ * Name: SiSU information Structuring Universe
65
+ * Author: Ralph Amissah
66
+ * http://www.jus.uio.no/sisu
67
+ * http://www.jus.uio.no/sisu/SiSU/download
68
+ WOK_SQL
69
+ end
70
+ def gpl
71
+ <<-'WOK_SQL'
72
+ * Name: SiSU generated sample cgi search form
73
+
74
+ * Description: generated sample cgi search form for SiSU
75
+ (SiSU is a framework for document structuring, publishing and search)
76
+
77
+ * Author: Ralph Amissah
78
+
79
+ * Copyright: (C) 1997 - 2014, Ralph Amissah, All Rights Reserved.
80
+
81
+ * License: GPL 3 or later:
82
+
83
+ SiSU, a framework for document structuring, publishing and search
84
+
85
+ Copyright (C) Ralph Amissah
86
+
87
+ This program is free software: you can redistribute it and/or modify it
88
+ under the terms of the GNU General Public License as published by the Free
89
+ Software Foundation, either version 3 of the License, or (at your option)
90
+ any later version.
91
+
92
+ This program is distributed in the hope that it will be useful, but WITHOUT
93
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
94
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
95
+ more details.
96
+
97
+ You should have received a copy of the GNU General Public License along with
98
+ this program. If not, see <http://www.gnu.org/licenses/>.
99
+
100
+ If you have Internet connection, the latest version of the GPL should be
101
+ available at these locations:
102
+ <http://www.fsf.org/licenses/gpl.html>
103
+ <http://www.gnu.org/licenses/gpl.html>
104
+ <http://www.jus.uio.no/sisu/gpl.fsf>
105
+
106
+ * SiSU uses:
107
+ * Standard SiSU markup syntax,
108
+ * Standard SiSU meta-markup syntax, and the
109
+ * Standard SiSU object citation numbering and system
110
+
111
+ * Hompages:
112
+ <http://www.jus.uio.no/sisu>
113
+ <http://www.sisudoc.org>
114
+
115
+ * Ralph Amissah
116
+ <ralph@amissah.com>
117
+ <ralph.amissah@gmail.com>
118
+ WOK_SQL
119
+ end
120
+ def header1
121
+ <<-'WOK_SQL'
122
+ #Common TOP
123
+ @@offset=0
124
+ @@canned_search_url=@base
125
+ @color_heading='#DDFFAA'
126
+ @color_match='#ffff48'
127
+ class Form
128
+ def initialize(base,search_field,selected_db,result_type,checked_sql_limit,checked_tip,checked_stats,checked_searched,checked_url,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,search_note,the_can='')
129
+ search_note='' if checked_searched !~/\S/
130
+ the_can='' if checked_url !~/\S/
131
+ search_field='' if checked_echo !~/\S/
132
+ @base,@search_field,@selected_db,@result_type,@checked_sql_limit,@checked_tip,@checked_stats,@checked_searched,@checked_url,@checked_case,@checked_echo,@checked_sql,@checked_all,@checked_none,@checked_selected,@checked_default,@search_note,@the_can=base,search_field,selected_db,result_type,checked_sql_limit,checked_tip,checked_stats,checked_searched,checked_url,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,search_note,the_can
133
+ @tip=if checked_tip =~/\S/
134
+ '<font size="2" color="#666666">text:__; fulltxt:__; keywords:__; title:__; author:__; topic_register:__; subject:__; description:__; publisher:__; editor:__; contributor:__; date:__; type:__; format:__; identifier:__; source:__; language:__; relation:__; coverage:__; rights:__; comment:__; abstract:__; filename:__;</font><br>'
135
+ else ''
136
+ end
137
+ end
138
+ def submission_form
139
+ search_form=<<-WOK
140
+ WOK_SQL
141
+ end
142
+ def header_desc
143
+ <<-WOK_SQL
144
+ <!DOCTYPE html>
145
+ <html>
146
+ <head>
147
+ <title>
148
+ <meta charset="utf-8">
149
+ <meta name="sourcefile" content="SiSU._sst" />
150
+ SiSU search form (sample): SiSU information Structuring Universe
151
+ </title>
152
+ <link rel="generator" href="http://www.jus.uio.no/sisu" />
153
+ <link rel="shortcut icon" href="#{@image_src}/rb7.ico" />
154
+ <link href="../_sisu/css/html.css" rel="stylesheet">
155
+ </head>
156
+ <body lang="en" xml:lang="en">
157
+ <table summary="band" border="0" cellpadding="3" cellspacing="0">
158
+ <tr><td width="20%">
159
+ <table summary="home button / home information" border="0" cellpadding="3" cellspacing="0">
160
+ <tr><td align="left">
161
+ <br><a href="http://sisudoc.org/" target="_top">
162
+ <b>SiSU</b>
163
+ </a>
164
+ <br><a href="http://git.sisudoc.org/" target="_top">
165
+ git
166
+ </a>
167
+ </td></tr>
168
+ </table>
169
+ </td>
170
+ <td>
171
+ <label for="find"><b>#{@env.sample_search_form_title(@opt.dir_structure_by)}</b></label>
172
+ </td></tr>
173
+ </table>
174
+ WOK_SQL
175
+ end
176
+ def header2
177
+ <<-'WOK_SQL'
178
+ <form action="#{@base}" id="Test Form" method="post">
179
+ <table cellpadding="2">
180
+ <tr><td valign=\"top\">
181
+ <textarea id="find" name="find" type="text" rows="6" cols="40" maxlength="256">#{@search_field}</textarea>
182
+ </td>
183
+ <td valign=\"top\">
184
+ #{@tip}
185
+ #{@search_note}
186
+ #{@the_can}
187
+ </td></tr></table>
188
+ <td valign=\"top\"><tr><td>
189
+ <!input type="text" id="find" name="find" value="#{@search_field}" />
190
+ <!input type="text" id="find" name="find" value="" />
191
+ <font size="2" color="#222222">
192
+ <b>to search:</b> select which database to search (drop-down menu below); enter your search query (in the form above); and <b>click on the search button</b> (below)
193
+ <br>
194
+ <select name="db" size="1">
195
+ #{@selected_db}
196
+ WOK_SQL
197
+ end
198
+ def buttons1
199
+ <<-'WOK_SQL'
200
+ </select>
201
+ <input type="submit" value="SiSU search" />
202
+ <input type="radio" name="view" value="index" #{@result_type[:index]}> index
203
+ <input type="radio" name="view" value="text" #{@result_type[:text]}> text / grep
204
+ WOK_SQL
205
+ end
206
+ def buttons2
207
+ <<-'WOK_SQL'
208
+ <br>
209
+ match limit:
210
+ <input type="radio" name="sql_match_limit" value="1000" #{@checked_sql_limit[:l1000]}> 1,000
211
+ <input type="radio" name="sql_match_limit" value="2500" #{@checked_sql_limit[:l2500]}> 2,500
212
+ <br>
213
+ <input type="checkbox" name="echo" #{@checked_echo}> echo query
214
+ <input type="checkbox" name="stats" #{@checked_stats}> result stats
215
+ <input type="checkbox" name="url" #{@checked_url}> search url
216
+ <input type="checkbox" name="searched" #{@checked_searched}> searched
217
+ <input type="checkbox" name="tip" #{@checked_tip}> available fields
218
+ <input type="checkbox" name="sql" #{@checked_sql}> sql statement
219
+ <br>
220
+ checks:
221
+ <input type="radio" name="checks" value="check_default" #{@checked_default}> default
222
+ <input type="radio" name="checks" value="check_selected" #{@checked_selected}> selected
223
+ <input type="radio" name="checks" value="check_all" #{@checked_all}> all
224
+ <input type="radio" name="checks" value="check_none" #{@checked_none}> none
225
+ </font>
226
+ </td></tr>
227
+ </table>
228
+ </form>
229
+ WOK
230
+ end
231
+ end
232
+ WOK_SQL
233
+ end
234
+ def search_request
235
+ <<-'WOK_SQL'
236
+ class SearchRequest #% search_for
237
+ attr_accessor :text1,:fulltext,:keywords,:title,:author,:topic_register,:subject,:description,:publisher,:editor,:contributor,:date,:type,:format,:identifier,:source,:language,:relation,:coverage,:rights,:comment,:abstract,:owner,:date_created,:date_issued,:date_modified,:date_available,:date_valid,:filename
238
+ def initialize(search_field='',q='')
239
+ @search_field,@q=search_field,q
240
+ @text1=@fulltext=@keywords=@title=@author=@topic_register=@subject=@description=@publisher=@editor=@contributor=@date=@type=@format=@identifier=@source=@language=@relation=@coverage=@rights=@comment=@abstract=@owner=@date_created=@date_issued=@date_modified=@date_available=@date_valid=@filename=''
241
+ if @search_field=~/\S/
242
+ @text1=text_to_match('text:')
243
+ @fulltext=text_to_match('fulltxt:')
244
+ @topic_register=text_to_match('topic_register:')
245
+ @title=text_to_match('title:') # DublinCore 1 - title
246
+ @author=text_to_match('(?:author|creator)s?:') # DublinCore 2 - creator/author
247
+ @subject=text_to_match('subj(?:ect)?:') # DublinCore 3 - subject
248
+ @description=text_to_match('description:') # DublinCore 4 - description
249
+ @publisher=text_to_match('pub(?:lisher)?:') # DublinCore 5 - publisher
250
+ @editor=text_to_match('editor:')
251
+ @contributor=text_to_match('contributor:') # DublinCore 6 - contributor
252
+ @date=text_to_match('date:') # DublinCore 7 - date dd-mm-yy
253
+ @type=text_to_match('type:') # DublinCore 8 - type
254
+ @format=text_to_match('format:') # DublinCore 9 - format
255
+ @identifier=text_to_match('identifier:') # DublinCore 10 - identifier
256
+ @source=text_to_match('source:') # DublinCore 11 - source
257
+ @language=text_to_match('language:') # DublinCore 12 - language
258
+ @relation=text_to_match('relation:') # DublinCore 13 - relation
259
+ @coverage=text_to_match('coverage:') # DublinCore 14 - coverage
260
+ @rights=text_to_match('rights:') # DublinCore 15 - rights
261
+ @keywords=text_to_match('key(?:words?)?:')
262
+ @comment=text_to_match('comment:')
263
+ @abstract=text_to_match('abs(?:tract)?:')
264
+ @owner=text_to_match('owner:')
265
+ @date_created=text_to_match('date_created:')
266
+ @date_issued=text_to_match('date_issued:')
267
+ @date_modified=text_to_match('date_modified:')
268
+ @date_available=text_to_match('date_available:')
269
+ @date_valid=text_to_match('date_valid:')
270
+ @filename=text_to_match('filename:')
271
+ @text1=text_to_match unless @keywords or @author or @title or @text1 or @fulltext or @comment or @abstract or @rights or @subject or @publisher or @date or @filename or @topic_register
272
+ else
273
+ @text1=q['s1'] if q['s1']=~/\S/
274
+ @fulltext=q['ft'] if q['ft']=~/\S/
275
+ @keywords=q['key'] if q['key']=~/\S/
276
+ @title=q['ti'] if q['ti']=~/\S/
277
+ @author=q['au'] if q['au']=~/\S/
278
+ @topic_register=q['tr'] if q['tr']=~/\S/
279
+ @subject=q['sj'] if q['sj']=~/\S/
280
+ @description=q['dsc'] if q['dsc']=~/\S/
281
+ @publisher=q['pb'] if q['pb']=~/\S/
282
+ @editor=q['cntr'] if q['cntr']=~/\S/
283
+ @contributor=q['cntr'] if q['cntr']=~/\S/
284
+ @date=q['dt'] if q['dt']=~/\S/
285
+ @type=q['ty'] if q['ty']=~/\S/
286
+ @identifier=q['id'] if q['id']=~/\S/
287
+ @source=q['src'] if q['src']=~/\S/
288
+ @language=q['lang'] if q['lang']=~/\S/
289
+ @relation=q['rel'] if q['rel']=~/\S/
290
+ @coverage=q['cov'] if q['cov']=~/\S/
291
+ @rights=q['cr'] if q['cr']=~/\S/
292
+ @comment=q['co'] if q['co']=~/\S/
293
+ @abstract=q['ab'] if q['ab']=~/\S/
294
+ @date_created=q['dtc'] if q['dtc']=~/\S/
295
+ @date_issued=q['dti'] if q['dti']=~/\S/
296
+ @date_modified=q['dtm'] if q['dtm']=~/\S/
297
+ @date_available=q['dta'] if q['dta']=~/\S/
298
+ @date_valid=q['dtv'] if q['dtv']=~/\S/
299
+ @filename=if q['doc'] and q['search'] !~/search db/ then q['doc']
300
+ elsif q['fns']=~/\S/ then q['fns']
301
+ end
302
+ @@limit=q['ltd'] if q['ltd']=~/\d+/ # 1000
303
+ @@offset=q['off'] if q['off']=~/\d+/ # 0
304
+ end
305
+ end
306
+ def text_to_match(identifier='')
307
+ m={
308
+ string: /#{identifier}\s*(.+?)/,
309
+ string: /#{identifier}\s*(.+?)(?:;|\n|\r|$)/,
310
+ word: /#{identifier}[\s(]*(\S+)/
311
+ }
312
+ search_string=if @search_field =~m[:word]
313
+ search_string=if @search_field =~m[:braces] then m[:braces].match(@search_field)[1]
314
+ elsif @search_field =~m[:string] then m[:string].match(@search_field)[1]
315
+ else
316
+ str=m[:word].match(@search_field)[1]
317
+ str=str.gsub(/[()]/,'')
318
+ str
319
+ end
320
+ search_string=search_string.strip.gsub(/\s+/,'+')
321
+ #else
322
+ # "__"
323
+ end
324
+ end
325
+ end
326
+ WOK_SQL
327
+ end
328
+ def search_statement_common
329
+ <<-'WOK_SQL'
330
+ class DBI_SearchStatement
331
+ attr_reader :text_search_flag,:sql_select_body_format,:sql_offset,:sql_limit
332
+ def initialize(conn,search_for,q,c)
333
+ @conn=conn
334
+ @text_search_flag=false
335
+ @sql_statement={ body: '', endnotes: '', range: '' }
336
+ #@offset||=@@offset
337
+ #@offset+=@@limit
338
+ search={ text: [], endnotes: [] }
339
+ cse=(c =~/\S/) ? true : false
340
+ st=DBI_SearchString.new('doc_objects.clean',search_for.text1,q['s1'],cse).string
341
+ se=DBI_SearchString.new('endnotes.clean',search_for.text1,q['s1'],cse).string
342
+ @text_search_flag=st[:flag]
343
+ if st[:flag]
344
+ search[:text] << st[:search]
345
+ end
346
+ st=DBI_SearchString.new('metadata_and_text.fulltext',search_for.fulltext,q['ft'],cse).string
347
+ if st[:flag]
348
+ search[:text] << st[:search]
349
+ end
350
+ st=DBI_SearchString.new('metadata_and_text.title',search_for.title,q['ti'],cse).string
351
+ if st[:flag]
352
+ search[:text] << st[:search]
353
+ end
354
+ st=DBI_SearchString.new('metadata_and_text.creator_author',search_for.author,q['au'],cse).string
355
+ if st[:flag]
356
+ search[:text] << st[:search]
357
+ end
358
+ st=DBI_SearchString.new('metadata_and_text.classify_topic_register',search_for.topic_register,q['tr'],cse).string
359
+ if st[:flag]
360
+ search[:text] << st[:search]
361
+ end
362
+ st=DBI_SearchString.new('metadata_and_text.classify_subject',search_for.subject,q['sj'],cse).string
363
+ if st[:flag]
364
+ search[:text] << st[:search]
365
+ end
366
+ st=DBI_SearchString.new('metadata_and_text.classify_keywords',search_for.keywords,q['key'],cse).string
367
+ if st[:flag]
368
+ search[:text] << st[:search]
369
+ end
370
+ st=DBI_SearchString.new('metadata_and_text.notes_description',search_for.description,q['dsc'],cse).string
371
+ if st[:flag]
372
+ search[:text] << st[:search]
373
+ end
374
+ st=DBI_SearchString.new('metadata_and_text.publisher',search_for.publisher,q['pb'],cse).string
375
+ if st[:flag]
376
+ search[:text] << st[:search]
377
+ end
378
+ st=DBI_SearchString.new('metadata_and_text.creator_editor',search_for.editor,q['cntr'],cse).string
379
+ if st[:flag]
380
+ search[:text] << st[:search]
381
+ end
382
+ st=DBI_SearchString.new('metadata_and_text.creator_contributor',search_for.contributor,q['cntr'],cse).string
383
+ if st[:flag]
384
+ search[:text] << st[:search]
385
+ end
386
+ st=DBI_SearchString.new('metadata_and_text.date_published',search_for.date,q['dt'],cse).string
387
+ if st[:flag]
388
+ search[:text] << st[:search]
389
+ end
390
+ st=DBI_SearchString.new('metadata_and_text.notes_type',search_for.type,q['ty'],cse).string
391
+ if st[:flag]
392
+ search[:text] << st[:search]
393
+ end
394
+ st=DBI_SearchString.new('metadata_and_text.original_source',search_for.source,q['src'],cse).string
395
+ if st[:flag]
396
+ search[:text] << st[:search]
397
+ end
398
+ st=DBI_SearchString.new('metadata_and_text.language_document_char',search_for.language,q['lang'],cse).string
399
+ if st[:flag]
400
+ search[:text] << st[:search]
401
+ end
402
+ st=DBI_SearchString.new('metadata_and_text.notes_relation',search_for.relation,q['rel'],cse).string
403
+ if st[:flag]
404
+ search[:text] << st[:search]
405
+ end
406
+ st=DBI_SearchString.new('metadata_and_text.notes_coverage',search_for.coverage,q['cov'],cse).string
407
+ if st[:flag]
408
+ search[:text] << st[:search]
409
+ end
410
+ st=DBI_SearchString.new('metadata_and_text.rights_all',search_for.rights,q['cr'],cse).string
411
+ if st[:flag]
412
+ search[:text] << st[:search]
413
+ end
414
+ st=DBI_SearchString.new('metadata_and_text.notes_comment',search_for.comment,q['co'],cse).string
415
+ if st[:flag]
416
+ search[:text] << st[:search]
417
+ end
418
+ st=DBI_SearchString.new('metadata_and_text.notes_abstract',search_for.abstract,q['ab'],cse).string
419
+ if st[:flag]
420
+ search[:text] << st[:search]
421
+ end
422
+ st=DBI_SearchString.new('metadata_and_text.src_filename',search_for.filename,q['fns'],cse).string
423
+ if st[:flag]
424
+ search[:text] << st[:search]
425
+ end
426
+ @@limit=q['ltd'] if q['ltd']=~/\d+/ # 1000
427
+ @@offset=q['off'] if q['off']=~/\d+/ # 0
428
+ WOK_SQL
429
+ end
430
+ def pages
431
+ <<-'WOK_SQL'
432
+ def sql_offset
433
+ @@offset
434
+ end
435
+ def sql_match_limit
436
+ @@limit
437
+ end
438
+ def sql_canned_search
439
+ @offset_next=sql_offset.to_i + sql_match_limit.to_i
440
+ @offset_previous=sql_offset.to_i - sql_match_limit.to_i
441
+ def current
442
+ @@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + sql_offset.to_s
443
+ end
444
+ def next
445
+ @@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + @offset_next.to_s
446
+ end
447
+ def previous
448
+ @offset_previous >= 0 \
449
+ ? (@@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + @offset_previous.to_s)
450
+ : ''
451
+ end
452
+ def start
453
+ @@canned_search_url.to_s + '&ltd=' + sql_match_limit.to_s + '&off=' + 0.to_s
454
+ end
455
+ self
456
+ end
457
+ def pre_next(beyond_limit,img)
458
+ can=sql_canned_search
459
+ page=(sql_offset.to_i + sql_match_limit.to_i)/sql_match_limit.to_i
460
+ if beyond_limit
461
+ if page.to_s =~ /^1$/
462
+ %{<br><center>
463
+ pg. #{page.to_s}
464
+ <a href="#{can.next}">
465
+ <img border="0" width="22" height="22" src="#{img}/arrow_next_red.png" alt="&nbsp;&gt;&gt;" />
466
+ </a>
467
+ </center>}
468
+ elsif page.to_s =~ /^2$/
469
+ %{<br><center>
470
+ <a href="#{can.previous}">
471
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
472
+ </a>
473
+ pg. #{page.to_s}
474
+ <a href="#{can.next}">
475
+ <img border="0" width="22" height="22" src="#{img}/arrow_next_red.png" alt="&nbsp;&gt;&gt;" />
476
+ </a>
477
+ </center>}
478
+ else
479
+ %{<br><center>
480
+ <a href="#{can.start}">
481
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="|&lt;&nbsp;" />
482
+ </a>
483
+ <a href="#{can.previous}">
484
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
485
+ </a>
486
+ pg. #{page.to_s}
487
+ <a href="#{can.next}">
488
+ <img border="0" width="22" height="22" src="#{img}/arrow_next_red.png" alt="&nbsp;&gt;&gt;" />
489
+ </a>
490
+ </center>}
491
+ end
492
+ else
493
+ if page.to_s =~ /^1$/ then ''
494
+ elsif page.to_s =~ /^2$/
495
+ %{<br><center>
496
+ <a href="#{can.previous}">
497
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
498
+ </a>
499
+ pg. #{page.to_s}
500
+ </center>}
501
+ else
502
+ %{<br><center>
503
+ <a href="#{can.start}">
504
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="|&lt;&nbsp;" />
505
+ </a>
506
+ <a href="#{can.previous}">
507
+ <img border="0" width="22" height="22" src="#{img}/arrow_prev_red.png" alt="&lt;&lt;&nbsp;" />
508
+ </a>
509
+ pg. #{page.to_s}
510
+ </center>}
511
+ end
512
+ end
513
+ end
514
+ WOK_SQL
515
+ end
516
+ def tail
517
+ v=SiSU_Env::InfoVersion.instance.get_version
518
+ <<-WOK_SQL
519
+ def tail
520
+ <<-'WOK'
521
+ <br><hr /><br>
522
+ <table summary="SiSU summary" cellpadding="2" border="0">
523
+ <!-- widget sisu -->
524
+ <tr><td valign="top" width="10%">
525
+ <table summary="home button / home information" border="0" cellpadding="3" cellspacing="0">
526
+ <tr><td align="left">
527
+ <br><a href="http://sisudoc.org/" target="_top">
528
+ <b>SiSU</b>
529
+ </a>
530
+ <br><a href="http://git.sisudoc.org/" target="_top">
531
+ git
532
+ </a>
533
+ </td></tr>
534
+ </table>
535
+ </td>
536
+ <td valign="top" width="45%">
537
+ <!-- SiSU Rights -->
538
+ <p class="tiny_left"><font color="#666666" size="2">
539
+ Generated by
540
+ #{v.project} #{v.version} #{v.date} (#{v.date_stamp})
541
+ <br>
542
+ <a href="http://www.sisudoc.org" >
543
+ <b>#{v.project}</b></a> <sup>&copy;</sup> Ralph Amissah
544
+ 1993, current 2014.
545
+ All Rights Reserved.
546
+ <br>
547
+ #{v.project} is software for document structuring, publishing and search,
548
+ <br>
549
+ <a href="http://www.jus.uio.no/sisu" >
550
+ www.jus.uio.no/sisu
551
+ </a>
552
+ and
553
+ <a href="http://www.sisudoc.org" >
554
+ www.sisudoc.org
555
+ </a>
556
+ sources
557
+ <a href="http://git.sisudoc.org" >
558
+ git.sisudoc.org
559
+ </a>
560
+ <br>
561
+ <i>w3 since October 3 1993</i>
562
+ <a href="mailto:ralph@amissah.com" >
563
+ ralph@amissah.com
564
+ </a>
565
+ <br>
566
+ mailing list subscription
567
+ <a href="http://lists.sisudoc.org/listinfo/sisu" >
568
+ http://lists.sisudoc.org/listinfo/sisu
569
+ </a>
570
+ <br>
571
+ <a href="mailto:sisu@lists.sisudoc.org" >
572
+ sisu@lists.sisudoc.org
573
+ </a>
574
+ </font></p>
575
+ </td><td valign="top" width="45%">
576
+ <p class="tiny_left"><font color="#666666" size="2">
577
+ #{v.project} using:
578
+ <br>Standard SiSU markup syntax,
579
+ <br>Standard SiSU meta-markup syntax, and the
580
+ <br>Standard SiSU <u>object citation numbering</u> and system, (object/text identifying/locating system)
581
+ <br>
582
+ <sup>&copy;</sup> Ralph Amissah 1997, current 2014.
583
+ All Rights Reserved.
584
+ </font></p>
585
+ </td></tr>
586
+ <!-- widget way better -->
587
+ <tr><td valign="top" width="10%">
588
+ <p class="tiny_left"><font color="#666666" size="2">
589
+ <a href="http://www.gnu.org/licenses/gpl.html">
590
+ .:
591
+ </a>
592
+ </font></p>
593
+ </td><td valign="top" width="45%">
594
+ <p class="tiny_left"><font color="#666666" size="2">
595
+ SiSU is released under
596
+ <a href="http://www.gnu.org/licenses/gpl.html">GPL&nbsp;v3</a>
597
+ or later,
598
+ <a href="http://www.gnu.org/licenses/gpl.html">
599
+ http://www.gnu.org/licenses/gpl.html
600
+ </a>
601
+ </font></p>
602
+ </td><td valign="top" width="45%">
603
+ <p class="tiny_left"><font color="#666666" size="2">
604
+ #{v.project}, developed using
605
+ <a href="http://www.ruby-lang.org/en/">
606
+ Ruby
607
+ </a>
608
+ on
609
+ <a href="http://www.debian.org/">
610
+ Debian/Gnu/Linux
611
+ </a>
612
+ software infrastructure,
613
+ with the usual GPL (or OSS) suspects.
614
+ </font></p>
615
+ </td></tr>
616
+ </table>
617
+ <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>
618
+ </body></html>
619
+ WOK
620
+ end
621
+ WOK_SQL
622
+ end
623
+ def main1
624
+ <<-'WOK_SQL'
625
+ @tail=tail
626
+ @counter_txt_doc,@counter_txt_ocn,@counter_endn_doc,@counter_endn_ocn=0,0,0,0
627
+ @counters_txt,@counters_endn,@sql_select_body='','',''
628
+ FCGI.each_cgi do |cgi|
629
+ begin # all code goes in begin section
630
+ @search={ text: [], endnotes: [] }
631
+ q=CGI.new
632
+ @db=if cgi['db'] =~ /#{@db_name_prefix}(\S+)/
633
+ @stub=$1
634
+ cgi['db']
635
+ else
636
+ @stub=@stub_default
637
+ @db_name_prefix + @stub
638
+ end
639
+ checked_url,checked_stats,checked_searched,checked_tip,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,selected_db='','','','','','','','',''
640
+ result_type=(cgi['view']=~/text/) \
641
+ ? result_type={ index: '', text: 'checked'}
642
+ : result_type={ index: 'checked', text: ''}
643
+ @@limit=if cgi['sql_match_limit'].to_s=~/2500/
644
+ checked_sql_limit={ l1000: '', l2500: 'checked'}
645
+ '2500'
646
+ else
647
+ checked_sql_limit={ l1000: 'checked', l2500: ''}
648
+ '1000'
649
+ end
650
+ checked_echo='checked' if cgi['echo'] =~/\S/
651
+ checked_stats='checked' if cgi['stats'] =~/\S/
652
+ checked_url='checked' if cgi['url'] =~/\S/ or cgi['u'].to_i==1
653
+ checked_searched='checked' if cgi['searched'] =~/\S/
654
+ checked_tip='checked' if cgi['tip'] =~/\S/
655
+ checked_case='checked' if cgi['casesense'] =~/\S/
656
+ checked_sql='checked' if cgi['sql'] =~/\S/
657
+ if cgi['checks'] =~/check_all/ or cgi['check_all'] =~/\S/ or cgi['a'].to_i==1
658
+ checked_all='checked'
659
+ checked_echo=checked_stats=checked_url=checked_searched=checked_tip=checked_sql='checked'
660
+ checked_none=''
661
+ elsif cgi['checks'] =~/check_none/
662
+ checked_none='checked'
663
+ checked_all=checked_url=checked_stats=checked_searched=checked_tip=checked_echo=checked_sql=''
664
+ elsif cgi['checks'] =~/check_selected/
665
+ checked_selected='checked'
666
+ elsif cgi['checks'] =~/check_default/
667
+ checked_default='checked'
668
+ checked_echo=checked_stats=checked_url='checked'
669
+ checked_searched=checked_tip=checked_case=checked_sql=''
670
+ else
671
+ checked_selected='checked'
672
+ checked_echo=checked_stats=checked_url='checked'
673
+ checked_searched=checked_tip=checked_case=checked_sql=''
674
+ end
675
+ WOK_SQL
676
+ end
677
+ def main2
678
+ <<-'WOK_SQL'
679
+ search_field=cgi['find'] if cgi['find'] # =~/\S+/
680
+ @search_for=SearchRequest.new(search_field,q) #.analyze #% search_for
681
+ #% searches
682
+ #Canned_search.new(@base,@search_for.text1,cgi)
683
+ if @search_for.text1=~/\S+/ or @search_for.fulltext=~/\S+/ or @search_for.author=~/\S+/ or @search_for.topic_register=~/\S+/ #and search_field =~/\S/
684
+ s1='s1=' + CGI.escape(@search_for.text1) if @search_for.text1=~/\S/
685
+ ft='&ft=' + CGI.escape(@search_for.fulltext) if @search_for.fulltext=~/\S/
686
+ key='key=' + CGI.escape(@search_for.keywords) if @search_for.keywords=~/\S/
687
+ ti='&ti=' + CGI.escape(@search_for.title) if @search_for.title=~/\S/
688
+ au='&au=' + CGI.escape(@search_for.author) if @search_for.author=~/\S/
689
+ tr='&tr=' + CGI.escape(@search_for.topic_register) if @search_for.topic_register=~/\S/
690
+ sj='&sj=' + CGI.escape(@search_for.subject) if @search_for.subject=~/\S/
691
+ dsc='&dsc=' + CGI.escape(@search_for.description) if @search_for.description=~/\S/
692
+ pb='&pb=' + CGI.escape(@search_for.publisher) if @search_for.publisher=~/\S/
693
+ edt='&edt=' + CGI.escape(@search_for.editor) if @search_for.editor=~/\S/
694
+ cntr='&cntr=' + CGI.escape(@search_for.contributor) if @search_for.contributor=~/\S/
695
+ dt='&dt=' + CGI.escape(@search_for.date) if @search_for.date=~/\S/
696
+ ty='&ty=' + CGI.escape(@search_for.type) if @search_for.type=~/\S/
697
+ id='&id=' + CGI.escape(@search_for.identifier) if @search_for.identifier=~/\S/
698
+ src='&src=' + CGI.escape(@search_for.source) if @search_for.source=~/\S/
699
+ lang='&lang=' + CGI.escape(@search_for.language) if @search_for.language=~/\S/
700
+ rel='&rel=' + CGI.escape(@search_for.relation) if @search_for.relation=~/\S/
701
+ cov='&cov=' + CGI.escape(@search_for.coverage) if @search_for.coverage=~/\S/
702
+ cr='&cr=' + CGI.escape(@search_for.rights) if @search_for.rights=~/\S/
703
+ co='&co=' + CGI.escape(@search_for.comment) if @search_for.comment=~/\S/
704
+ ab='&ab=' + CGI.escape(@search_for.abstract) if @search_for.abstract=~/\S/
705
+ dtc='&dtc=' + CGI.escape(@search_for.date_created) if @search_for.date_created=~/\S/
706
+ dti='&dti=' + CGI.escape(@search_for.date_issued) if @search_for.date_issued=~/\S/
707
+ dtm='&dtm=' + CGI.escape(@search_for.date_modified) if @search_for.date_modified=~/\S/
708
+ dta='&dta=' + CGI.escape(@search_for.date_available) if @search_for.date_available=~/\S/
709
+ dtv='&dtv=' + CGI.escape(@search_for.date_valid) if @search_for.date_valid=~/\S/
710
+ fns='&fns=' + CGI.escape(@search_for.filename) if @search_for.filename=~/\S/
711
+ @@canned_search_url=(checked_all =~/checked/) \
712
+ ? "#{@base}?#{s1}#{ft}#{key}#{ti}#{au}#{tr}#{sj}#{dsc}#{pb}#{edt}#{cntr}#{dt}#{ty}#{id}#{src}#{lang}#{rel}#{cov}#{cr}#{co}#{ab}#{dtc}#{dti}#{dtm}#{dta}#{dtv}#{fns}&db=#{cgi['db']}&view=#{cgi['view']}&a=1"
713
+ : "#{@base}?#{s1}#{ft}#{key}#{ti}#{au}#{tr}#{sj}#{dsc}#{pb}#{edt}#{cntr}#{dt}#{ty}#{id}#{src}#{lang}#{rel}#{cov}#{cr}#{co}#{ab}#{dtc}#{dti}#{dtm}#{dta}#{dtv}#{fns}&db=#{cgi['db']}&view=#{cgi['view']}"
714
+ mod=ft=~/\S+/ ? (ft.gsub(/ft/,'s1')) : s1
715
+ @canned_base_url="#{@base}?#{mod}&db=#{cgi['db']}"
716
+ if checked_case=~/\S/
717
+ @search[:text][1]=%{doc_objects.clean~'#{@search_for.text1}'} #s1
718
+ else
719
+ @search[:text][1]=%{doc_objects.clean~*'#{@search_for.text1}'} #s1
720
+ end
721
+ canned_note='search url:'
722
+ else
723
+ @@canned_search_url="#{@base}?db=#{@db}&view=index"
724
+ canned_note='search url example:'
725
+ end
726
+ if search_field =~/\S+/
727
+ analyze_format=search_field.gsub(/\s*\n/,'; ')
728
+ elsif checked_all =~/checked/ or checked_url =~/checked/
729
+ canned_search=@@canned_search_url.scan(/(?:s1|ft|au|ti|fns|tr)=[^&]+/)
730
+ af=canned_search.join('; ')
731
+ af=af.gsub(/s1=/,'text: ').
732
+ gsub(/ft=/,'fulltxt: ').
733
+ gsub(/au=/,'author: ').
734
+ gsub(/ti=/,'title: ').
735
+ gsub(/fns=/,'filename: ').
736
+ gsub(/tr=/,'topic_register: ').
737
+ gsub(/%2B/,' ')
738
+ analyze_format=af
739
+ st=af.split(/\s*;\s*/)
740
+ search_field=st.join("\n")
741
+ end
742
+ green=%{<font size="2" color="#004000">}
743
+ canned_search_url_txt=CGI.escapeHTML(@@canned_search_url)
744
+ the_can=%{<font size="2" color="#666666">#{canned_note} <a href="#{@@canned_search_url}">#{canned_search_url_txt}</a></font><br>}
745
+ p_text=p_fulltext=p_keywords=p_title=p_author=p_topic_register=p_subject=p_description=p_publisher=p_editor=p_contributor=p_date=p_type=p_format=p_identifier=p_source=p_language=p_relation=p_coverage=p_rights=p_comment=p_abstract=p_filename=''
746
+ p_filename=%{filename: #{green}#{@search_for.filename}</font><br>} if @search_for.filename =~/\S+/
747
+ p_text=%{text: #{green}#{@search_for.text1}</font><br>} if @search_for.text1 =~/\S+/
748
+ p_fulltext=%{fulltxt: #{green}#{@search_for.fulltext}</font><br>} if @search_for.fulltext =~/\S+/
749
+ p_title=%{title: #{green}#{@search_for.title}</font><br>} if @search_for.title =~/\S+/
750
+ p_author=%{author: #{green}#{@search_for.author}</font><br>} if @search_for.author =~/\S+/
751
+ p_editor=%{editor: #{green}#{@search_for.editor}</font><br>} if @search_for.editor=~/\S+/
752
+ p_contributor=%{contributor: #{green}#{@search_for.contributor}</font><br>} if @search_for.contributor =~/\S+/
753
+ p_date=%{date: #{green}#{@search_for.date}</font><br>} if @search_for.date =~/\S+/
754
+ p_rights=%{rights: #{green}#{@search_for.rights}</font><br>} if @search_for.rights =~/\S+/
755
+ p_topic_register=%{topic_register: #{green}#{@search_for.topic_register}</font><br>} if @search_for.topic_register =~/\S+/
756
+ p_subject=%{subject: #{green}#{@search_for.subject}</font><br>} if @search_for.subject =~/\S+/
757
+ p_keywords=%{keywords: #{green}#{@search_for.keywords}</font><br>} if @search_for.keywords =~/\S+/
758
+ p_identifier=%{identifier: #{green}#{@search_for.identifier}</font><br>} if @search_for.identifier =~/\S+/
759
+ p_type=%{type: #{green}#{@search_for.type}</font><br>} if @search_for.type =~/\S+/
760
+ p_format=%{format: #{green}#{@search_for.format}</font><br>} if @search_for.format =~/\S+/
761
+ p_relation=%{relation: #{green}#{@search_for.relation}</font><br>} if @search_for.relation =~/\S+/
762
+ p_coverage=%{coverage: #{green}#{@search_for.coverage}</font><br>} if @search_for.coverage =~/\S+/
763
+ p_description=%{description: #{green}#{@search_for.description}</font><br>} if @search_for.description =~/\S+/
764
+ p_abstract=%{abstract: #{green}#{@search_for.abstract}</font><br>} if @search_for.abstract =~/\S+/
765
+ p_comment=%{comment: #{green}#{@search_for.comment}</font><br>} if @search_for.comment =~/\S+/
766
+ p_publisher=%{publisher: #{green}#{@search_for.publisher}</font><br>} if @search_for.publisher =~/\S+/
767
+ p_source=%{source: #{green}#{@search_for.source}</font><br>} if @search_for.source =~/\S+/
768
+ p_language=%{language: #{green}#{@search_for.language}</font><br>} if @search_for.language =~/\S+/
769
+ search_note=<<-WOK
770
+ <font size="2" color="#666666">
771
+ <b>database:</b> #{green}#{@db}</font>; <b>selected view:</b> #{green}#{cgi['view']}</font>
772
+ <b>search string:</b> "#{green}#{analyze_format}</font>"<br>
773
+ #{p_text} #{p_fulltext} #{p_keywords} #{p_title} #{p_author} #{p_topic_register} #{p_subject} #{p_description} #{p_publisher} #{p_editor} #{p_contributor} #{p_date} #{p_type} #{p_format} #{p_identifier} #{p_source} #{p_language} #{p_relation} #{p_coverage} #{p_rights} #{p_comment} #{p_abstract} #{p_filename}
774
+ </font>
775
+ WOK
776
+ #eg = %{canned search e.g.:<br> <a href="#{url}">#{url}</a><br>find: #{analyze}<br>database: #{database}}
777
+ #% dbi_canning
778
+ @header=Form.new(@base,search_field,selected_db,result_type,checked_sql_limit,checked_tip,checked_stats,checked_searched,checked_url,checked_case,checked_echo,checked_sql,checked_all,checked_none,checked_selected,checked_default,search_note,the_can).submission_form #% form
779
+ unless q['s1'] =~/\S/ or q['au'] =~/\S/ or @search[:text][1] =~/\S/
780
+ print "Content-type: text/html\n\n"
781
+ puts (@header+@tail)
782
+ else #% searches
783
+ s1=(@search_for.text1 =~/\S/) \
784
+ ? @search_for.text1
785
+ : 'Unavailable'
786
+ if checked_case=~/\S/
787
+ @search[:text]<<%{doc_objects.clean~'#{CGI.unescape(s1)}'}
788
+ else
789
+ @search[:text]<<%{doc_objects.clean~*'#{CGI.unescape(s1)}'}
790
+ end
791
+ #% dbi_request
792
+ dbi_statement=DBI_SearchStatement.new(@conn,@search_for,q,checked_case)
793
+ @text_search_flag=false
794
+ @text_search_flag=dbi_statement.text_search_flag
795
+ s_contents=dbi_statement.contents
796
+ @body_main=''
797
+ @search_regx=nil
798
+ oldtid=0
799
+ if @text_search_flag
800
+ if checked_sql =~/\S/
801
+ sql_select_body=dbi_statement.sql_select_body_format
802
+ else sql_select_body=''
803
+ end
804
+ @body_main << sql_select_body
805
+ else
806
+ end
807
+ @hostpath="#{@hosturl_files}/#{@stub}"
808
+ WOK_SQL
809
+ end
810
+ def dir_structure #@opt.dir_structure_by
811
+ <<-'WOK_SQL'
812
+ def path_manifest(fn,ln=nil)
813
+ case @output_dir_structure_by
814
+ when 'filename'
815
+ @lingual =='mono' \
816
+ ? "#{@hostpath}/#{fn}/sisu_manifest.html"
817
+ : "#{@hostpath}/#{fn}/sisu_manifest.#{ln}.html"
818
+ when 'filetype'
819
+ @lingual =='mono' \
820
+ ? "#{@hostpath}/manifest/#{fn}.html"
821
+ : "#{@hostpath}/manifest/#{fn}.#{ln}.html"
822
+ else
823
+ "#{@hostpath}/#{ln}/manifest/#{fn}.html"
824
+ end
825
+ end
826
+ def path_html_seg(fn,ln=nil)
827
+ case @output_dir_structure_by
828
+ when 'filename'
829
+ "#{@hostpath}/#{fn}"
830
+ when 'filetype'
831
+ "#{@hostpath}/html/#{fn}"
832
+ else
833
+ "#{@hostpath}/#{ln}/html/#{fn}"
834
+ end
835
+ end
836
+ def path_toc(fn,ln=nil)
837
+ if @output_dir_structure_by =='filename' \
838
+ or @output_dir_structure_by =='filetype'
839
+ @lingual =='mono' \
840
+ ? "#{path_html_seg(fn,ln)}/toc.html"
841
+ : "#{path_html_seg(fn,ln)}/toc.#{ln}.html"
842
+ else
843
+ "#{path_html_seg(fn,ln)}/toc.html"
844
+ end
845
+ end
846
+ def path_filename(fn,seg,ln=nil)
847
+ if @output_dir_structure_by =='filename' \
848
+ or @output_dir_structure_by =='filetype'
849
+ @lingual =='mono' \
850
+ ? "#{path_html_seg(fn,ln)}/#{seg}.html"
851
+ : "#{path_html_seg(fn,ln)}/#{seg}.#{ln}.html"
852
+ else
853
+ "#{path_html_seg(fn,ln)}/#{seg}.html"
854
+ end
855
+ end
856
+ def path_html_doc(fn,ln=nil)
857
+ case @output_dir_structure_by
858
+ when 'filename'
859
+ @lingual =='mono' \
860
+ ? "#{path_html_seg(fn,ln)}/scroll.html"
861
+ : "#{path_html_seg(fn,ln)}/scroll.#{ln}.html"
862
+ when 'filetype'
863
+ @lingual =='mono' \
864
+ ? "#{@hostpath}/html/#{fn}.html"
865
+ : "#{@hostpath}/html/#{fn}.#{ln}.html"
866
+ else
867
+ "#{@hostpath}/#{ln}/html/#{fn}.html"
868
+ end
869
+ end
870
+ WOK_SQL
871
+ end
872
+ def main3
873
+ <<-'WOK_SQL'
874
+ #% text_objects_body
875
+ s_contents.each do |c| #% text body
876
+ location=c['src_filename'][/(.+?)\.(?:ssm\.sst|sst)$/,1]
877
+ file_suffix=c['src_filename'][/.+?\.(ssm\.sst|sst)$/,1]
878
+ lang=if location =~ /\S+?~(\S\S\S?)$/
879
+ l=location[/\S+?~(\S\S\S?)$/,1]
880
+ location=location.gsub(/(\S+?)~\S\S\S?/,'\1')
881
+ l=".#{l}"
882
+ else ''
883
+ end
884
+ #% metadata_found_body
885
+ if c['tid'].to_i != oldtid.to_i
886
+ ti=c['title']
887
+ can_txt_srch=(cgi['view']=~/index/) \
888
+ ? %{<a href="#{@canned_base_url}&fns=#{c['src_filename']}&lang=#{c['language_document_char']}&view=text"><img border="0" width="24" height="16" src="#{@image_src}/b_search.png" alt="search"></a>&nbsp;}
889
+ : %{<a href="#{@canned_base_url}&fns=#{c['src_filename']}&lang=#{c['language_document_char']}&view=index"><img border="0" width="24" height="16" src="#{@image_src}/b_search.png" alt="search"></a>&nbsp;}
890
+ title=%{<span style="background-color: #{@color_heading}"><a href="#{path_toc(location,c['language_document_char'])}"><img border="0" width="15" height="18" src="#{@image_src}/b_toc.png" alt="toc html">&nbsp;#{ti}</a></span> [#{c['language_document_char']}] by #{c['creator_author']} <a href="#{path_manifest(location,c['language_document_char'])}"><img border="0" width="15" height="15" src="#{@image_src}/b_info.png" alt="manifest"></a> #{can_txt_srch}<br>} if file_suffix=~/s/ #hmm watch file_suffix
891
+ title=@text_search_flag \
892
+ ? '<br><hr>'+title
893
+ : '<br>'+title
894
+ @counter_txt_doc+=1
895
+ oldtid=c['tid'].to_i
896
+ else title=''
897
+ end
898
+ if @text_search_flag
899
+ if cgi['view']=~/text/ \
900
+ or (cgi['view']!~/index/ and cgi['search'] !~/search db/) #% txt body
901
+ text=if c['suffix'] !~/1/ #seg
902
+ if @search_for.text1 =~/\S+/ \
903
+ or q['s1'] =~/\S+/ #% only this branch is working !!
904
+ unescaped_search=if @search_for.text1 =~/\S+/
905
+ CGI.unescape(@search_for.text1)
906
+ elsif q['s1'] =~/\S+/
907
+ CGI.unescape(q['s1'])
908
+ else nil
909
+ end
910
+ @search_regx=if unescaped_search #check
911
+ search_regex=unescaped_search.scan(/\S+/).each.map do |g|
912
+ (g.to_s =~/(AND|OR)/) \
913
+ ? ('|')
914
+ : (%{#{g.to_s}})
915
+ end.join(' ')
916
+ search_regex=search_regex.gsub(/\s*\|\s*/,'|')
917
+ Regexp.new(search_regex, Regexp::IGNORECASE)
918
+ else nil
919
+ end
920
+ else nil
921
+ end
922
+ matched_para=(@search_regx.to_s.class==String && @search_regx.to_s=~/\S\S+/) \
923
+ ? (c['body'].gsub(/(<a\s+href="https?:\/\/[^><\s]+#{@search_regx}[^>]+?>|#{@search_regx})/mi,%{<span style="background-color: #{@color_match}">\\1</span>}))
924
+ : c['body']
925
+ %{<hr><p><font size="2">ocn <b><a href="#{path_filename(location,c['seg'],c['language_document_char'])}##{c['ocn']}">#{c['ocn']}</a></b>:</font></p>#{matched_para}}
926
+ elsif c['suffix'] =~/1/ #doc
927
+ %{#{title}<hr><p><font size="2">ocn #{c['ocn']}:#{c['body']}}
928
+ end
929
+ @counter_txt_ocn+=1
930
+ output=title+text
931
+ else #elsif cgi['view']=~/index/ #% idx body
932
+ if c['suffix'] !~/1/ #seg
933
+ index=%{<a href="#{path_filename(location,c['seg'],c['language_document_char'])}##{c['ocn']}">#{c['ocn']}</a>, } if @text_search_flag
934
+ elsif c['suffix'] =~/1/ #doc #FIX
935
+ index=%{<a href="#{path_html_doc(location,c['language_document_char'])}##{c['ocn']}">#{c['ocn']}</a>, }
936
+ end
937
+ if c['seg'] =~/\S+/
938
+ if @text_search_flag
939
+ @counter_txt_ocn+=1
940
+ output=title+index
941
+ end
942
+ else
943
+ @counter_txt_ocn+=1
944
+ output=c['suffix'] !~/1/ \
945
+ ? title+index
946
+ : %{#{title}#{c['ocn'].sort}, }
947
+ end
948
+ end
949
+ else output=title
950
+ end
951
+ @counters_txt=if @counter_txt_doc > 0
952
+ if checked_stats =~/\S/
953
+ @@lt_t=(@counter_txt_ocn==dbi_statement.sql_match_limit.to_i) ? true : false
954
+ start=(@@offset.to_i+1).to_s
955
+ range=(@@offset.to_i+@counter_txt_ocn.to_i).to_s
956
+ %{<hr /><font size="2" color="#666666">Found #{@counter_txt_ocn} times in the main body of #{@counter_txt_doc} documents [ matches #{start} to #{range} ]</font><br>}
957
+ else ''
958
+ end
959
+ else ''
960
+ end
961
+ @body_main << output #+ details
962
+ end
963
+ oldtid = 0
964
+ offset=dbi_statement.sql_offset.to_s
965
+ limit=dbi_statement.sql_match_limit.to_s
966
+ @@lt_t ||=false; @@lt_e ||=false
967
+ canned=(@@lt_t or @@lt_e) \
968
+ ? dbi_statement.pre_next(true,@image_src).to_s
969
+ : dbi_statement.pre_next(false,@image_src).to_s
970
+ limit=dbi_statement.sql_match_limit.to_s
971
+ cgi.out{@header.force_encoding("UTF-8") + @counters_txt.force_encoding("UTF-8") + @counters_endn.force_encoding("UTF-8") + canned.force_encoding("UTF-8") + @body_main.force_encoding("UTF-8") + canned.force_encoding("UTF-8") + @tail.force_encoding("UTF-8")} #% print cgi_output_header+counters+body
972
+ end
973
+ rescue Exception => e
974
+ s='<pre>' + CGI::escapeHTML(e.backtrace.reverse.join("\n"))
975
+ s << CGI::escapeHTML(e.message) + '</pre>'
976
+ cgi.out{s}
977
+ next
978
+ ensure # eg. disconnect from server
979
+ @conn.disconnect if @conn
980
+ end
981
+ end
982
+ WOK_SQL
983
+ end
984
+ end
985
+ end
986
+ __END__