gonzui 1.2-x86-mswin32-60
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.
- data/AUTHORS.txt +9 -0
- data/History.txt +5539 -0
- data/Manifest.txt +115 -0
- data/PostInstall.txt +17 -0
- data/README.rdoc +149 -0
- data/Rakefile +28 -0
- data/bin/gonzui-db +167 -0
- data/bin/gonzui-import +177 -0
- data/bin/gonzui-remove +58 -0
- data/bin/gonzui-search +68 -0
- data/bin/gonzui-server +176 -0
- data/bin/gonzui-update +53 -0
- data/data/gonzui/catalog/catalog.ja +80 -0
- data/data/gonzui/doc/favicon.ico +0 -0
- data/data/gonzui/doc/folder.png +0 -0
- data/data/gonzui/doc/gonzui.css +279 -0
- data/data/gonzui/doc/gonzui.js +111 -0
- data/data/gonzui/doc/text.png +0 -0
- data/data/gonzuirc.sample +29 -0
- data/ext/autopack/autopack.c +88 -0
- data/ext/autopack/extconf.rb +3 -0
- data/ext/delta/delta.c +147 -0
- data/ext/delta/extconf.rb +5 -0
- data/ext/texttokenizer/extconf.rb +5 -0
- data/ext/texttokenizer/texttokenizer.c +93 -0
- data/ext/xmlformatter/extconf.rb +5 -0
- data/ext/xmlformatter/xmlformatter.c +207 -0
- data/lib/gonzui.rb +59 -0
- data/lib/gonzui/apt.rb +193 -0
- data/lib/gonzui/autopack.so +0 -0
- data/lib/gonzui/bdbdbm.rb +118 -0
- data/lib/gonzui/cmdapp.rb +14 -0
- data/lib/gonzui/cmdapp/app.rb +175 -0
- data/lib/gonzui/cmdapp/search.rb +134 -0
- data/lib/gonzui/config.rb +117 -0
- data/lib/gonzui/content.rb +19 -0
- data/lib/gonzui/dbm.rb +673 -0
- data/lib/gonzui/deindexer.rb +162 -0
- data/lib/gonzui/delta.rb +49 -0
- data/lib/gonzui/delta.so +0 -0
- data/lib/gonzui/extractor.rb +347 -0
- data/lib/gonzui/fetcher.rb +309 -0
- data/lib/gonzui/gettext.rb +144 -0
- data/lib/gonzui/importer.rb +84 -0
- data/lib/gonzui/indexer.rb +316 -0
- data/lib/gonzui/info.rb +80 -0
- data/lib/gonzui/license.rb +100 -0
- data/lib/gonzui/logger.rb +48 -0
- data/lib/gonzui/monitor.rb +177 -0
- data/lib/gonzui/progressbar.rb +235 -0
- data/lib/gonzui/remover.rb +38 -0
- data/lib/gonzui/searcher.rb +330 -0
- data/lib/gonzui/searchquery.rb +235 -0
- data/lib/gonzui/searchresult.rb +111 -0
- data/lib/gonzui/texttokenizer.so +0 -0
- data/lib/gonzui/updater.rb +254 -0
- data/lib/gonzui/util.rb +415 -0
- data/lib/gonzui/vcs.rb +128 -0
- data/lib/gonzui/webapp.rb +25 -0
- data/lib/gonzui/webapp/advsearch.rb +123 -0
- data/lib/gonzui/webapp/filehandler.rb +24 -0
- data/lib/gonzui/webapp/jsfeed.rb +61 -0
- data/lib/gonzui/webapp/markup.rb +445 -0
- data/lib/gonzui/webapp/search.rb +269 -0
- data/lib/gonzui/webapp/servlet.rb +319 -0
- data/lib/gonzui/webapp/snippet.rb +155 -0
- data/lib/gonzui/webapp/source.rb +37 -0
- data/lib/gonzui/webapp/stat.rb +137 -0
- data/lib/gonzui/webapp/top.rb +63 -0
- data/lib/gonzui/webapp/uri.rb +140 -0
- data/lib/gonzui/webapp/webrick.rb +48 -0
- data/lib/gonzui/webapp/xmlformatter.so +0 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/makemanifest.rb +21 -0
- data/tasks/extconf.rake +13 -0
- data/tasks/extconf/autopack.rake +43 -0
- data/tasks/extconf/delta.rake +43 -0
- data/tasks/extconf/texttokenizer.rake +43 -0
- data/tasks/extconf/xmlformatter.rake +43 -0
- data/test/_external_tools.rb +13 -0
- data/test/_test-util.rb +142 -0
- data/test/foo/Makefile.foo +66 -0
- data/test/foo/bar.c +5 -0
- data/test/foo/bar.h +6 -0
- data/test/foo/foo.c +25 -0
- data/test/foo/foo.spec +33 -0
- data/test/test_apt.rb +42 -0
- data/test/test_autopack_extn.rb +7 -0
- data/test/test_bdbdbm.rb +79 -0
- data/test/test_cmdapp-app.rb +35 -0
- data/test/test_cmdapp-search.rb +99 -0
- data/test/test_config.rb +28 -0
- data/test/test_content.rb +15 -0
- data/test/test_dbm.rb +171 -0
- data/test/test_deindexer.rb +50 -0
- data/test/test_delta.rb +66 -0
- data/test/test_extractor.rb +78 -0
- data/test/test_fetcher.rb +75 -0
- data/test/test_gettext.rb +50 -0
- data/test/test_gonzui.rb +11 -0
- data/test/test_helper.rb +10 -0
- data/test/test_importer.rb +56 -0
- data/test/test_indexer.rb +37 -0
- data/test/test_info.rb +82 -0
- data/test/test_license.rb +49 -0
- data/test/test_logger.rb +60 -0
- data/test/test_monitor.rb +23 -0
- data/test/test_searcher.rb +37 -0
- data/test/test_searchquery.rb +27 -0
- data/test/test_searchresult.rb +43 -0
- data/test/test_texttokenizer.rb +47 -0
- data/test/test_updater.rb +95 -0
- data/test/test_util.rb +149 -0
- data/test/test_vcs.rb +61 -0
- data/test/test_webapp-markup.rb +42 -0
- data/test/test_webapp-util.rb +19 -0
- data/test/test_webapp-xmlformatter.rb +19 -0
- metadata +292 -0
@@ -0,0 +1,269 @@
|
|
1
|
+
#
|
2
|
+
# search.rb - search servlet
|
3
|
+
#
|
4
|
+
# Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
|
5
|
+
# All rights reserved.
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
7
|
+
#
|
8
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the GNU General Public License version 2.
|
10
|
+
#
|
11
|
+
|
12
|
+
module Gonzui
|
13
|
+
class SearchServlet < GonzuiAbstractServlet
|
14
|
+
def self.mount_point
|
15
|
+
"search"
|
16
|
+
end
|
17
|
+
|
18
|
+
def do_make_status_line(result)
|
19
|
+
right = ""
|
20
|
+
if result.nhits > 0
|
21
|
+
qs = @search_query.string
|
22
|
+
from = (@search_query.package or @search_query.path)
|
23
|
+
qs = @search_query.simplified_string if from
|
24
|
+
to = [result.nhits, @from + @nresults_per_page].min
|
25
|
+
right = [:span]
|
26
|
+
limit_exceeded_mark = if result.limit_exceeded? then "+" else "" end
|
27
|
+
right.push(_("Results "),
|
28
|
+
[:strong, commify(@from + 1)], " - ",
|
29
|
+
[:strong, commify(to)], _(" of "),
|
30
|
+
[:strong, commify(result.nhits)],
|
31
|
+
limit_exceeded_mark,
|
32
|
+
_(" for "),
|
33
|
+
[:strong, qs])
|
34
|
+
right.push(_(" from "), [:strong, from]) if from
|
35
|
+
end
|
36
|
+
center = [:a, {:href => make_google_uri(@search_query)},
|
37
|
+
_("Google it")]
|
38
|
+
return center, right
|
39
|
+
end
|
40
|
+
|
41
|
+
def make_expansion_link(item)
|
42
|
+
if item.has_more_in_package?
|
43
|
+
package_name = @dbm.get_package_name(item.package_id)
|
44
|
+
# FIXME: it should be simplified.
|
45
|
+
qs = sprintf("package:%s %s", package_name,
|
46
|
+
@search_query.simplified_string)
|
47
|
+
search_query = SearchQuery.new(@config, qs, @search_query.options)
|
48
|
+
uri = make_search_uri(search_query)
|
49
|
+
from = package_name
|
50
|
+
elsif item.has_more_in_path?
|
51
|
+
path = @dbm.get_path(item.path_id)
|
52
|
+
qs = sprintf("path:%s %s", path,
|
53
|
+
@search_query.simplified_string)
|
54
|
+
search_query = SearchQuery.new(@config, qs, @search_query.options)
|
55
|
+
uri = make_search_uri(search_query)
|
56
|
+
from = File.basename(path)
|
57
|
+
else
|
58
|
+
assert_not_reached
|
59
|
+
end
|
60
|
+
dd = [:dd,[:a, {:href => uri, :class => "more" },
|
61
|
+
sprintf(_("More results from %s"), from)]]
|
62
|
+
return dd
|
63
|
+
end
|
64
|
+
|
65
|
+
def make_package_name_line(package_name)
|
66
|
+
uri = make_markup_uri(package_name)
|
67
|
+
dt = [:dt, {:class => "package"}, [:a, {:href => uri}, package_name]]
|
68
|
+
return dt
|
69
|
+
end
|
70
|
+
|
71
|
+
def make_source_path_line(item, package_name, path, markup_uri)
|
72
|
+
lineno_uri = make_lineno_uri(markup_uri, item.list.first.lineno)
|
73
|
+
source_line = [:dt, {:class => "source"}, [:a,
|
74
|
+
{:href => lineno_uri},
|
75
|
+
File.relative_path(path, package_name)]]
|
76
|
+
file_info = @dbm.get_content_info(item.path_id)
|
77
|
+
size = [:span, {:class => "size"},
|
78
|
+
sprintf(_(" - %s - %s lines"),
|
79
|
+
format_bytes(file_info.size),
|
80
|
+
commify(file_info.nlines))
|
81
|
+
]
|
82
|
+
source_line.push(size)
|
83
|
+
end
|
84
|
+
|
85
|
+
def make_result_list_by_snippet(result)
|
86
|
+
dl = [:dl]
|
87
|
+
prev_package_id = nil
|
88
|
+
nresults = 0
|
89
|
+
|
90
|
+
result.each_from(@from) {|item|
|
91
|
+
assert(item.list.length > 0)
|
92
|
+
package_name = @dbm.get_package_name(item.package_id)
|
93
|
+
|
94
|
+
if item.package_id != prev_package_id
|
95
|
+
dt = make_package_name_line(package_name)
|
96
|
+
dl.push(dt)
|
97
|
+
prev_package_id = item.package_id
|
98
|
+
end
|
99
|
+
|
100
|
+
path = @dbm.get_path(item.path_id)
|
101
|
+
markup_uri = make_markup_uri(path, @search_query)
|
102
|
+
dt = make_source_path_line(item, package_name, path, markup_uri)
|
103
|
+
dl.push(dt)
|
104
|
+
|
105
|
+
#
|
106
|
+
# FIXME: if the target content is a text file, it's
|
107
|
+
# better to make a snippet like google's one instead
|
108
|
+
# of a line-oriented style.
|
109
|
+
#
|
110
|
+
content = @dbm.get_content(item.path_id)
|
111
|
+
maker = SnippetMaker.new(content, item, markup_uri)
|
112
|
+
pre = maker.make_line_oriented_kwic
|
113
|
+
dl.push([:dd, pre])
|
114
|
+
|
115
|
+
if item.has_more?
|
116
|
+
link = make_expansion_link(item)
|
117
|
+
dl.push(link)
|
118
|
+
end
|
119
|
+
nresults += 1
|
120
|
+
break if nresults >= @nresults_per_page
|
121
|
+
}
|
122
|
+
return dl
|
123
|
+
end
|
124
|
+
|
125
|
+
def make_result_list_like_grep(result)
|
126
|
+
assert_equal(1, result.length)
|
127
|
+
dl = [:dl]
|
128
|
+
item = result.first
|
129
|
+
|
130
|
+
package_name = @dbm.get_package_name(item.package_id)
|
131
|
+
path = @dbm.get_path(item.path_id)
|
132
|
+
markup_uri = make_markup_uri(path, @search_query)
|
133
|
+
|
134
|
+
dl.push(make_package_name_line(package_name))
|
135
|
+
dl.push(make_source_path_line(item, package_name, path, markup_uri))
|
136
|
+
|
137
|
+
content = @dbm.get_content(item.path_id)
|
138
|
+
maker = SnippetMaker.new(content, item, markup_uri)
|
139
|
+
snippet = maker.make_context_grep
|
140
|
+
dl.push([:dd, snippet])
|
141
|
+
return dl
|
142
|
+
end
|
143
|
+
|
144
|
+
def do_make_navi(from)
|
145
|
+
make_search_uri(@search_query,
|
146
|
+
:from => from,
|
147
|
+
:nresults_per_page => @nresults_per_page)
|
148
|
+
end
|
149
|
+
|
150
|
+
def redirect_to_uri(uri)
|
151
|
+
@response.set_redirect(HTTPStatus::MovedPermanently, uri)
|
152
|
+
assert_not_reached
|
153
|
+
end
|
154
|
+
|
155
|
+
# FIXME: it's not used
|
156
|
+
def redirect_to_single_result(result)
|
157
|
+
item = result.first
|
158
|
+
occ = item.list.first
|
159
|
+
path = @dbm.get_path(item.path_id)
|
160
|
+
lineno = (occ.lineno or 1)
|
161
|
+
markup_uri = make_markup_uri(path, @search_query)
|
162
|
+
lineno_uri = make_lineno_uri(markup_uri, lineno)
|
163
|
+
redirect_to_uri(lineno_uri)
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
def make_not_found_message
|
168
|
+
message = [:div, {:class => "message"},
|
169
|
+
sprintf(_("No contents were found matching your search - %s."),
|
170
|
+
@search_query.string)
|
171
|
+
]
|
172
|
+
return message
|
173
|
+
end
|
174
|
+
|
175
|
+
def make_query_error_message(e)
|
176
|
+
message =[:div]
|
177
|
+
message.push(make_not_found_message)
|
178
|
+
message.push([:div, {:class => "message"}, _(e.message)])
|
179
|
+
return message
|
180
|
+
end
|
181
|
+
|
182
|
+
def make_result_content(result)
|
183
|
+
@from = 0 if @from >= result.length
|
184
|
+
|
185
|
+
if result.empty?
|
186
|
+
make_not_found_message
|
187
|
+
elsif result.single_path?
|
188
|
+
make_result_list_like_grep(result)
|
189
|
+
else
|
190
|
+
make_result_list_by_snippet(result)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def redirect_if_necessary
|
195
|
+
if @search_query.empty?
|
196
|
+
redirect_to_uri(make_top_uri)
|
197
|
+
elsif @search_query.path_only?
|
198
|
+
markup_uri = make_markup_uri(@search_query.path, @search_query)
|
199
|
+
redirect_to_uri(markup_uri)
|
200
|
+
elsif @search_query.package_only?
|
201
|
+
markup_uri = make_markup_uri(@search_query.package, @search_query)
|
202
|
+
redirect_to_uri(markup_uri)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def make_result_navi(result)
|
207
|
+
make_navi(result.length, @from, @nresults_per_page, @config.max_pages)
|
208
|
+
end
|
209
|
+
|
210
|
+
def make_notice
|
211
|
+
if @search_query.ignored_words.empty?
|
212
|
+
return ""
|
213
|
+
else
|
214
|
+
div = [:div, {:class => "notice"}]
|
215
|
+
message =
|
216
|
+
sprintf(_("\"%s\" (and any subsequent words) was ignored because queries are limited to %d words."),
|
217
|
+
@search_query.ignored_words.first,
|
218
|
+
@config.max_words
|
219
|
+
)
|
220
|
+
div.push(message)
|
221
|
+
return div
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def do_GET(request, response)
|
226
|
+
init_servlet(request, response)
|
227
|
+
log(@search_query.string)
|
228
|
+
|
229
|
+
title = make_title(@search_query.string)
|
230
|
+
html = make_html
|
231
|
+
head = [:head, title, make_script, *make_meta_and_css]
|
232
|
+
body = [:body]
|
233
|
+
body.push(make_h1)
|
234
|
+
body.push(make_search_form)
|
235
|
+
|
236
|
+
result = nil
|
237
|
+
navi = nil
|
238
|
+
begin
|
239
|
+
@search_query.validate
|
240
|
+
redirect_if_necessary
|
241
|
+
|
242
|
+
searcher = Searcher.new(@dbm, @search_query,
|
243
|
+
@config.max_results_overall)
|
244
|
+
result = searcher.search
|
245
|
+
content = make_result_content(result)
|
246
|
+
if result.length > @nresults_per_page
|
247
|
+
navi = make_result_navi(result)
|
248
|
+
end
|
249
|
+
rescue QueryError => e
|
250
|
+
result = SearchResult.new
|
251
|
+
content = make_query_error_message(e)
|
252
|
+
end
|
253
|
+
status_line = make_status_line(_("Search"), result)
|
254
|
+
|
255
|
+
body.push(make_notice)
|
256
|
+
body.push(status_line)
|
257
|
+
body.push(content)
|
258
|
+
body.push(navi) if navi
|
259
|
+
|
260
|
+
body.push(make_footer)
|
261
|
+
html.push(head)
|
262
|
+
html.push(body)
|
263
|
+
set_content_type_text_html
|
264
|
+
response.body = format_html(html)
|
265
|
+
end
|
266
|
+
|
267
|
+
GonzuiServlet.register(self)
|
268
|
+
end
|
269
|
+
end
|
@@ -0,0 +1,319 @@
|
|
1
|
+
#
|
2
|
+
# servlet.rb - servelt framework
|
3
|
+
#
|
4
|
+
# Copyright (C) 2004-2005 Satoru Takabayashi <satoru@namazu.org>
|
5
|
+
# All rights reserved.
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
7
|
+
#
|
8
|
+
# You can redistribute it and/or modify it under the terms of
|
9
|
+
# the GNU General Public License version 2.
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'webrick'
|
13
|
+
include WEBrick
|
14
|
+
|
15
|
+
module Gonzui
|
16
|
+
module GonzuiServlet
|
17
|
+
extend Util
|
18
|
+
ServletRegistry = {}
|
19
|
+
|
20
|
+
module_function
|
21
|
+
def servlets
|
22
|
+
ServletRegistry.values
|
23
|
+
end
|
24
|
+
|
25
|
+
def register(klass)
|
26
|
+
mount_point = klass.mount_point
|
27
|
+
assert(!ServletRegistry.include?(mount_point))
|
28
|
+
ServletRegistry[mount_point] = klass
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module HTMLMaker
|
33
|
+
def make_content_script_type
|
34
|
+
[:meta,
|
35
|
+
{
|
36
|
+
"http-equiv" => "content-script-type",
|
37
|
+
:content => "text/javascript"
|
38
|
+
}
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
def make_css
|
43
|
+
[:link,
|
44
|
+
{
|
45
|
+
:rel => "stylesheet",
|
46
|
+
:href => make_doc_uri("gonzui.css"),
|
47
|
+
:media => "all", :type => "text/css"
|
48
|
+
}
|
49
|
+
]
|
50
|
+
end
|
51
|
+
|
52
|
+
def make_footer
|
53
|
+
[:div, {:class => "footer"},
|
54
|
+
[:a, {:href => make_markup_uri}, _("List of all packages")],
|
55
|
+
" - ",
|
56
|
+
[:a, {:href => make_stat_uri}, _("Statistics")],
|
57
|
+
" - ",
|
58
|
+
[:a, {:href => Gonzui::GONZUI_URI}, _("About gonzui")],
|
59
|
+
]
|
60
|
+
end
|
61
|
+
|
62
|
+
def make_html
|
63
|
+
[:html, {:xmlns => "http://www.w3.org/1999/xhtml"}]
|
64
|
+
end
|
65
|
+
def make_meta
|
66
|
+
[:meta, {:name => "robots", :content => "noarchive"}]
|
67
|
+
end
|
68
|
+
|
69
|
+
def make_meta_and_css
|
70
|
+
[ make_meta, make_content_script_type, make_css ]
|
71
|
+
end
|
72
|
+
|
73
|
+
def make_title(sub_title = nil)
|
74
|
+
if sub_title
|
75
|
+
return [:title, sprintf("%s: %s", @config.site_title, sub_title)]
|
76
|
+
else
|
77
|
+
return [:title, @config.site_title]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def make_h1
|
82
|
+
[:h1, [:a, {:href => make_top_uri}, @config.site_title]]
|
83
|
+
end
|
84
|
+
|
85
|
+
def make_navi(nitems, from, max_per_page, max_pages = nil)
|
86
|
+
return "" if nitems <= max_per_page
|
87
|
+
navi = [:div, {:class => "navi"}]
|
88
|
+
if from > 0
|
89
|
+
f = [from - max_per_page, 0].max
|
90
|
+
uri = do_make_navi(f)
|
91
|
+
navi.push([:a, {:href => uri}, _("prev")], " ")
|
92
|
+
end
|
93
|
+
|
94
|
+
if nitems > max_per_page
|
95
|
+
(0..((nitems - 1) / max_per_page)).each {|i|
|
96
|
+
break if max_pages and i >= max_pages
|
97
|
+
f = i * max_per_page
|
98
|
+
if f == from
|
99
|
+
navi.push((i + 1).to_s + " ")
|
100
|
+
else
|
101
|
+
uri = do_make_navi(f)
|
102
|
+
navi.push([:a, {:href => uri}, (i + 1).to_s], " ")
|
103
|
+
end
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
if from + max_per_page < nitems
|
108
|
+
f = [from + max_per_page, 0].max
|
109
|
+
uri = do_make_navi(f)
|
110
|
+
navi.push([:a, {:href => uri}, _("next")])
|
111
|
+
end
|
112
|
+
return navi
|
113
|
+
end
|
114
|
+
|
115
|
+
def make_script
|
116
|
+
[:script, {:type => "text/javascript",
|
117
|
+
:src => make_doc_uri("gonzui.js")}, ""]
|
118
|
+
end
|
119
|
+
|
120
|
+
def make_property_select(short_name, current_value, each, *excludes)
|
121
|
+
select = [:select, {:name => short_name}]
|
122
|
+
o = [:option, {:type => "radio", :name => short_name, :value => "all"},
|
123
|
+
_("All")]
|
124
|
+
select.push(o)
|
125
|
+
@dbm.send(each) {|id, abbrev, name|
|
126
|
+
next if excludes.include?(abbrev)
|
127
|
+
o = [:option,
|
128
|
+
{:type => "radio", :name => short_name, :value => abbrev},
|
129
|
+
_(name)]
|
130
|
+
if abbrev == current_value
|
131
|
+
o[1][:selected] = "selected"
|
132
|
+
end
|
133
|
+
select.push(o)
|
134
|
+
}
|
135
|
+
return select
|
136
|
+
end
|
137
|
+
|
138
|
+
def make_format_select
|
139
|
+
make_property_select(get_short_name(:format),
|
140
|
+
@search_query.format,
|
141
|
+
:each_format,
|
142
|
+
"binary")
|
143
|
+
end
|
144
|
+
|
145
|
+
def make_license_select
|
146
|
+
make_property_select(get_short_name(:license),
|
147
|
+
@search_query.license,
|
148
|
+
:each_license)
|
149
|
+
end
|
150
|
+
|
151
|
+
def make_search_form(options = {})
|
152
|
+
query = @search_query.string
|
153
|
+
form = [:form, {:method => "get", :action =>
|
154
|
+
make_uri_general(SearchServlet)}]
|
155
|
+
iquery = [:input, {:type => "text", :size => 50,
|
156
|
+
:name => get_short_name(:basic_query),
|
157
|
+
:value => query}]
|
158
|
+
isubmit = [:input, {:type => "submit", :value => _("Search")}]
|
159
|
+
p = [:p]
|
160
|
+
p.push(iquery)
|
161
|
+
if options[:central]
|
162
|
+
p.push([:br])
|
163
|
+
else
|
164
|
+
p.push(" ")
|
165
|
+
end
|
166
|
+
|
167
|
+
p.push(isubmit)
|
168
|
+
select = make_format_select
|
169
|
+
p.push([:br])
|
170
|
+
p.push(_("Format: "))
|
171
|
+
p.push(select)
|
172
|
+
p.push(make_spacer)
|
173
|
+
uri = make_advanced_search_uri(@search_query)
|
174
|
+
p.push([:a, {:href => uri, :onclick => "passQuery(this)"},
|
175
|
+
_("Advanced Search")])
|
176
|
+
p.push([:script, "initFocus();"])
|
177
|
+
form.push(p)
|
178
|
+
return form
|
179
|
+
end
|
180
|
+
|
181
|
+
def make_spacer
|
182
|
+
[:span, {:class => "spacer" }, " "]
|
183
|
+
end
|
184
|
+
|
185
|
+
def make_status_line(status_title, *options)
|
186
|
+
status_line = [:table, {:class => "status"}]
|
187
|
+
items = do_make_status_line(*options)
|
188
|
+
right = (items.pop or "")
|
189
|
+
|
190
|
+
tds = []
|
191
|
+
tds.push([:td, {:class => "left"}, status_title])
|
192
|
+
items.each {|item|
|
193
|
+
tds.push([:td, {:class => "center"}, item])
|
194
|
+
}
|
195
|
+
unless right.empty?
|
196
|
+
r = [:td, {:class => "right"}, right]
|
197
|
+
r.push(" (", [:strong, sprintf("%.2f", Time.now - @start_time)],
|
198
|
+
_(" seconds)"))
|
199
|
+
tds.push(r)
|
200
|
+
end
|
201
|
+
status_line.push([:tr, *tds])
|
202
|
+
return status_line
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class ServletError < GonzuiError; end
|
207
|
+
|
208
|
+
class GonzuiAbstractServlet < HTTPServlet::AbstractServlet
|
209
|
+
include Util
|
210
|
+
include GetText
|
211
|
+
include URIMaker
|
212
|
+
include HTMLMaker
|
213
|
+
|
214
|
+
def initialize(server, config, logger, dbm, catalog_repository)
|
215
|
+
@server = server
|
216
|
+
@config = config
|
217
|
+
@logger = logger
|
218
|
+
@dbm = dbm
|
219
|
+
@catalog_repository = catalog_repository
|
220
|
+
@servlet_name = /(\w+)Servlet$/.match(self.class.to_s)[1].downcase
|
221
|
+
@start_time = Time.now
|
222
|
+
end
|
223
|
+
|
224
|
+
private
|
225
|
+
def make_search_query(query)
|
226
|
+
format = get_query_value(query, :format)
|
227
|
+
license = get_query_value(query, :license)
|
228
|
+
|
229
|
+
basic_query = get_query_value(query, :basic_query)
|
230
|
+
target_type = get_query_value(query, :target_type)
|
231
|
+
phrase_query = get_query_value(query, :phrase_query)
|
232
|
+
query_string = ""
|
233
|
+
query_string << target_type << ":" if target_type
|
234
|
+
query_string << basic_query if basic_query
|
235
|
+
if phrase_query
|
236
|
+
query_string << " " unless basic_query.empty?
|
237
|
+
query_string << '"' << phrase_query << '"'
|
238
|
+
end
|
239
|
+
@search_query = SearchQuery.new(@config,
|
240
|
+
query_string,
|
241
|
+
:format => format,
|
242
|
+
:license => license)
|
243
|
+
end
|
244
|
+
|
245
|
+
def parse_request
|
246
|
+
query = @request.query
|
247
|
+
@from = get_query_value(query, :from)
|
248
|
+
@grep_pattern = get_query_value(query, :grep_pattern)
|
249
|
+
@display_language = get_query_value(query, :display_language)
|
250
|
+
@nresults_per_page = get_query_value(query, :nresults_per_page)
|
251
|
+
|
252
|
+
@from = 0 if @from < 0
|
253
|
+
@nresults_per_page = 1 if @nresults_per_page <= 0
|
254
|
+
if @nresults_per_page > @config.max_results_per_page
|
255
|
+
@nresults_per_page = @config.max_results_per_page
|
256
|
+
end
|
257
|
+
|
258
|
+
@search_query = make_search_query(query)
|
259
|
+
@ip_address = @request.peeraddr[3]
|
260
|
+
end
|
261
|
+
|
262
|
+
def init_catalog
|
263
|
+
if @display_language
|
264
|
+
catalog = @catalog_repository.choose(@display_language)
|
265
|
+
set_catalog(catalog)
|
266
|
+
else
|
267
|
+
accept_languages = @request.accept_language
|
268
|
+
accept_languages.each {|lang|
|
269
|
+
catalog = @catalog_repository.choose(lang)
|
270
|
+
if catalog
|
271
|
+
set_catalog(catalog)
|
272
|
+
break
|
273
|
+
end
|
274
|
+
}
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
public
|
279
|
+
def get_mime_type(path)
|
280
|
+
HTTPUtils.mime_type(path, @server[:MimeTypes])
|
281
|
+
end
|
282
|
+
|
283
|
+
# ex. image
|
284
|
+
def get_media_type(path)
|
285
|
+
get_mime_type(path).split("/").first
|
286
|
+
end
|
287
|
+
|
288
|
+
def format_html(html)
|
289
|
+
formatter = XMLFormatter.new
|
290
|
+
formatter.add_xml_declaration
|
291
|
+
formatter.add_doctype
|
292
|
+
return formatter.format(html)
|
293
|
+
end
|
294
|
+
|
295
|
+
def set_content_type_text_html
|
296
|
+
@response["Content-Type"] = "text/html; charset=utf-8"
|
297
|
+
end
|
298
|
+
|
299
|
+
def init_servlet(request, response)
|
300
|
+
@request = request
|
301
|
+
@response = response
|
302
|
+
parse_request
|
303
|
+
init_catalog
|
304
|
+
end
|
305
|
+
|
306
|
+
def log(message = nil)
|
307
|
+
if message
|
308
|
+
@logger.log("%s %s [%s]", @servlet_name, message, @ip_address)
|
309
|
+
else
|
310
|
+
@logger.log("%s [%s]", @servlet_name, @ip_address)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
def make_path
|
315
|
+
path = @request.path_info.prechop
|
316
|
+
return path
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|