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.
Files changed (120) hide show
  1. data/AUTHORS.txt +9 -0
  2. data/History.txt +5539 -0
  3. data/Manifest.txt +115 -0
  4. data/PostInstall.txt +17 -0
  5. data/README.rdoc +149 -0
  6. data/Rakefile +28 -0
  7. data/bin/gonzui-db +167 -0
  8. data/bin/gonzui-import +177 -0
  9. data/bin/gonzui-remove +58 -0
  10. data/bin/gonzui-search +68 -0
  11. data/bin/gonzui-server +176 -0
  12. data/bin/gonzui-update +53 -0
  13. data/data/gonzui/catalog/catalog.ja +80 -0
  14. data/data/gonzui/doc/favicon.ico +0 -0
  15. data/data/gonzui/doc/folder.png +0 -0
  16. data/data/gonzui/doc/gonzui.css +279 -0
  17. data/data/gonzui/doc/gonzui.js +111 -0
  18. data/data/gonzui/doc/text.png +0 -0
  19. data/data/gonzuirc.sample +29 -0
  20. data/ext/autopack/autopack.c +88 -0
  21. data/ext/autopack/extconf.rb +3 -0
  22. data/ext/delta/delta.c +147 -0
  23. data/ext/delta/extconf.rb +5 -0
  24. data/ext/texttokenizer/extconf.rb +5 -0
  25. data/ext/texttokenizer/texttokenizer.c +93 -0
  26. data/ext/xmlformatter/extconf.rb +5 -0
  27. data/ext/xmlformatter/xmlformatter.c +207 -0
  28. data/lib/gonzui.rb +59 -0
  29. data/lib/gonzui/apt.rb +193 -0
  30. data/lib/gonzui/autopack.so +0 -0
  31. data/lib/gonzui/bdbdbm.rb +118 -0
  32. data/lib/gonzui/cmdapp.rb +14 -0
  33. data/lib/gonzui/cmdapp/app.rb +175 -0
  34. data/lib/gonzui/cmdapp/search.rb +134 -0
  35. data/lib/gonzui/config.rb +117 -0
  36. data/lib/gonzui/content.rb +19 -0
  37. data/lib/gonzui/dbm.rb +673 -0
  38. data/lib/gonzui/deindexer.rb +162 -0
  39. data/lib/gonzui/delta.rb +49 -0
  40. data/lib/gonzui/delta.so +0 -0
  41. data/lib/gonzui/extractor.rb +347 -0
  42. data/lib/gonzui/fetcher.rb +309 -0
  43. data/lib/gonzui/gettext.rb +144 -0
  44. data/lib/gonzui/importer.rb +84 -0
  45. data/lib/gonzui/indexer.rb +316 -0
  46. data/lib/gonzui/info.rb +80 -0
  47. data/lib/gonzui/license.rb +100 -0
  48. data/lib/gonzui/logger.rb +48 -0
  49. data/lib/gonzui/monitor.rb +177 -0
  50. data/lib/gonzui/progressbar.rb +235 -0
  51. data/lib/gonzui/remover.rb +38 -0
  52. data/lib/gonzui/searcher.rb +330 -0
  53. data/lib/gonzui/searchquery.rb +235 -0
  54. data/lib/gonzui/searchresult.rb +111 -0
  55. data/lib/gonzui/texttokenizer.so +0 -0
  56. data/lib/gonzui/updater.rb +254 -0
  57. data/lib/gonzui/util.rb +415 -0
  58. data/lib/gonzui/vcs.rb +128 -0
  59. data/lib/gonzui/webapp.rb +25 -0
  60. data/lib/gonzui/webapp/advsearch.rb +123 -0
  61. data/lib/gonzui/webapp/filehandler.rb +24 -0
  62. data/lib/gonzui/webapp/jsfeed.rb +61 -0
  63. data/lib/gonzui/webapp/markup.rb +445 -0
  64. data/lib/gonzui/webapp/search.rb +269 -0
  65. data/lib/gonzui/webapp/servlet.rb +319 -0
  66. data/lib/gonzui/webapp/snippet.rb +155 -0
  67. data/lib/gonzui/webapp/source.rb +37 -0
  68. data/lib/gonzui/webapp/stat.rb +137 -0
  69. data/lib/gonzui/webapp/top.rb +63 -0
  70. data/lib/gonzui/webapp/uri.rb +140 -0
  71. data/lib/gonzui/webapp/webrick.rb +48 -0
  72. data/lib/gonzui/webapp/xmlformatter.so +0 -0
  73. data/script/console +10 -0
  74. data/script/destroy +14 -0
  75. data/script/generate +14 -0
  76. data/script/makemanifest.rb +21 -0
  77. data/tasks/extconf.rake +13 -0
  78. data/tasks/extconf/autopack.rake +43 -0
  79. data/tasks/extconf/delta.rake +43 -0
  80. data/tasks/extconf/texttokenizer.rake +43 -0
  81. data/tasks/extconf/xmlformatter.rake +43 -0
  82. data/test/_external_tools.rb +13 -0
  83. data/test/_test-util.rb +142 -0
  84. data/test/foo/Makefile.foo +66 -0
  85. data/test/foo/bar.c +5 -0
  86. data/test/foo/bar.h +6 -0
  87. data/test/foo/foo.c +25 -0
  88. data/test/foo/foo.spec +33 -0
  89. data/test/test_apt.rb +42 -0
  90. data/test/test_autopack_extn.rb +7 -0
  91. data/test/test_bdbdbm.rb +79 -0
  92. data/test/test_cmdapp-app.rb +35 -0
  93. data/test/test_cmdapp-search.rb +99 -0
  94. data/test/test_config.rb +28 -0
  95. data/test/test_content.rb +15 -0
  96. data/test/test_dbm.rb +171 -0
  97. data/test/test_deindexer.rb +50 -0
  98. data/test/test_delta.rb +66 -0
  99. data/test/test_extractor.rb +78 -0
  100. data/test/test_fetcher.rb +75 -0
  101. data/test/test_gettext.rb +50 -0
  102. data/test/test_gonzui.rb +11 -0
  103. data/test/test_helper.rb +10 -0
  104. data/test/test_importer.rb +56 -0
  105. data/test/test_indexer.rb +37 -0
  106. data/test/test_info.rb +82 -0
  107. data/test/test_license.rb +49 -0
  108. data/test/test_logger.rb +60 -0
  109. data/test/test_monitor.rb +23 -0
  110. data/test/test_searcher.rb +37 -0
  111. data/test/test_searchquery.rb +27 -0
  112. data/test/test_searchresult.rb +43 -0
  113. data/test/test_texttokenizer.rb +47 -0
  114. data/test/test_updater.rb +95 -0
  115. data/test/test_util.rb +149 -0
  116. data/test/test_vcs.rb +61 -0
  117. data/test/test_webapp-markup.rb +42 -0
  118. data/test/test_webapp-util.rb +19 -0
  119. data/test/test_webapp-xmlformatter.rb +19 -0
  120. 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