gonzui 1.2-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- 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
|