milkode 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/HISTORY.ja.rdoc +29 -0
- data/HISTORY.rdoc +14 -0
- data/VERSION +1 -1
- data/bin/gmilk +1 -1
- data/bin/milk +1 -1
- data/lib/milkode/cdstk/cdstk.rb +90 -38
- data/lib/milkode/cdstk/milkode_yaml.rb +6 -0
- data/lib/milkode/cdstk/yaml_file_wrapper.rb +4 -0
- data/lib/milkode/cdweb/app.rb +5 -5
- data/lib/milkode/cdweb/lib/command.rb +20 -4
- data/lib/milkode/cdweb/lib/database.rb +20 -16
- data/lib/milkode/cdweb/lib/grep.rb +6 -6
- data/lib/milkode/cdweb/lib/query.rb +36 -1
- data/lib/milkode/cdweb/lib/search_contents.rb +134 -19
- data/lib/milkode/cdweb/lib/search_fuzzy_gotoline.rb +162 -0
- data/lib/milkode/cdweb/lib/web_setting.rb +9 -1
- data/lib/milkode/cdweb/public/css/milkode.css +5 -0
- data/lib/milkode/cdweb/public/images/favicon.ico +0 -0
- data/lib/milkode/cdweb/public/js/milkode.js +46 -48
- data/lib/milkode/cdweb/views/index.haml +1 -0
- data/lib/milkode/cli.rb +6 -3
- data/lib/milkode/common/util.rb +19 -0
- data/lib/milkode/database/document_table.rb +40 -22
- data/lib/milkode/database/package_table.rb +1 -1
- data/lib/milkode/database/updater.rb +14 -7
- data/lib/milkode/findgrep/findgrep.rb +23 -11
- data/lib/milkode/grep/cli_grep.rb +1 -4
- data/milkode.gemspec +10 -5
- data/test/data/.gitignore.sjis +46 -0
- data/test/data/ignore_test_sjis/.gitignore +2 -0
- data/test/data/ignore_test_sjis/a.txt +1 -0
- data/test/test_cdstk.rb +2 -1
- data/test/test_ignore_setting.rb +9 -0
- data/test/test_query.rb +6 -0
- data/test/test_updater.rb +13 -1
- data/test/test_util.rb +10 -0
- metadata +17 -4
@@ -88,20 +88,23 @@ module Milkode
|
|
88
88
|
|
89
89
|
# 検索
|
90
90
|
result, total_records = [], 0
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
91
|
+
|
92
|
+
begin
|
93
|
+
unless is_not_search
|
94
|
+
result, total_records = @documents.search_with_match(
|
95
|
+
:patterns => patterns,
|
96
|
+
:keywords => keywords,
|
97
|
+
:paths => paths,
|
98
|
+
:packages => packages,
|
99
|
+
:strict_packages => strict_packages,
|
100
|
+
:restpaths => fpaths,
|
101
|
+
:suffixs => suffixs,
|
102
|
+
:fpath_or_packages => fpath_or_packages,
|
103
|
+
:offset => offset,
|
104
|
+
:limit => limit
|
105
|
+
)
|
106
|
+
end
|
107
|
+
rescue Groonga::TooLargeOffset
|
105
108
|
end
|
106
109
|
|
107
110
|
# 結果
|
@@ -198,8 +201,9 @@ module Milkode
|
|
198
201
|
def update_in(package)
|
199
202
|
updater = Updater.new(@grndb, package.name)
|
200
203
|
updater.set_package_ignore IgnoreSetting.new("/", package.ignore)
|
201
|
-
updater.enable_no_auto_ignore
|
202
|
-
updater.enable_update_with_git_pull
|
204
|
+
updater.enable_no_auto_ignore if package.options[:no_auto_ignore]
|
205
|
+
updater.enable_update_with_git_pull if package.options[:update_with_git_pull]
|
206
|
+
updater.enable_update_with_svn_update if package.options[:update_with_svn_update]
|
203
207
|
updater.exec
|
204
208
|
updater.result
|
205
209
|
end
|
@@ -17,7 +17,7 @@ module Milkode
|
|
17
17
|
|
18
18
|
def match_lines_stopover(patterns, max_match, start_index, is_sensitive)
|
19
19
|
result = []
|
20
|
-
patternRegexps = strs2regs(patterns,
|
20
|
+
patternRegexps = strs2regs(patterns, is_sensitive)
|
21
21
|
index = start_index
|
22
22
|
|
23
23
|
lines = @content.split($/)
|
@@ -45,7 +45,7 @@ module Milkode
|
|
45
45
|
|
46
46
|
def match_lines_and(patterns, is_sensitive)
|
47
47
|
result = []
|
48
|
-
patternRegexps = strs2regs(patterns,
|
48
|
+
patternRegexps = strs2regs(patterns, is_sensitive)
|
49
49
|
index = 0
|
50
50
|
|
51
51
|
@content.each_line do |line|
|
@@ -63,7 +63,7 @@ module Milkode
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def one_match_and(patterns, is_sensitive)
|
66
|
-
patternRegexps = strs2regs(patterns,
|
66
|
+
patternRegexps = strs2regs(patterns, is_sensitive)
|
67
67
|
index = 0
|
68
68
|
|
69
69
|
@content.each_line do |line|
|
@@ -82,13 +82,13 @@ module Milkode
|
|
82
82
|
|
83
83
|
private
|
84
84
|
|
85
|
-
def strs2regs(strs,
|
85
|
+
def strs2regs(strs, is_sensitive)
|
86
86
|
regs = []
|
87
87
|
|
88
88
|
strs.each do |v|
|
89
89
|
option = 0
|
90
|
-
option |= Regexp::IGNORECASE if (
|
91
|
-
regs
|
90
|
+
option |= Regexp::IGNORECASE if (!is_sensitive && Util::downcase?(v))
|
91
|
+
regs << Regexp.new(Regexp.escape(v), option)
|
92
92
|
end
|
93
93
|
|
94
94
|
regs
|
@@ -18,6 +18,7 @@ module Milkode
|
|
18
18
|
['suffix', 's'],
|
19
19
|
['fp'], # fpath or package
|
20
20
|
['keyword', 'k'],
|
21
|
+
['gotoline', 'g'],
|
21
22
|
]
|
22
23
|
|
23
24
|
def initialize(str)
|
@@ -31,7 +32,11 @@ module Milkode
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def empty?
|
34
|
-
keywords.size == 0 && packages.size == 0 && fpaths.size == 0 && suffixs.size == 0 && fpath_or_packages.size == 0
|
35
|
+
keywords.size == 0 && packages.size == 0 && fpaths.size == 0 && suffixs.size == 0 && fpath_or_packages.size == 0 && gotolines.size == 0
|
36
|
+
end
|
37
|
+
|
38
|
+
def only_keywords
|
39
|
+
packages.size == 0 && fpaths.size == 0 && suffixs.size == 0 && fpath_or_packages.size == 0 && gotolines.size == 0
|
35
40
|
end
|
36
41
|
|
37
42
|
def keywords
|
@@ -59,6 +64,10 @@ module Milkode
|
|
59
64
|
calc_param(4)
|
60
65
|
end
|
61
66
|
|
67
|
+
def gotolines
|
68
|
+
calc_param(5)
|
69
|
+
end
|
70
|
+
|
62
71
|
def conv_keywords_to_fpath
|
63
72
|
s = query_string.split.map {|v|
|
64
73
|
if keywords.include? v
|
@@ -83,6 +92,32 @@ module Milkode
|
|
83
92
|
Query.new(s)
|
84
93
|
end
|
85
94
|
|
95
|
+
# 'name def test' -> 'fp:name def test'
|
96
|
+
def conv_head_keyword_to_fpath_or_packages
|
97
|
+
s = query_string.split.map {|v|
|
98
|
+
if keywords[0].include? v
|
99
|
+
"fp:#{v}"
|
100
|
+
else
|
101
|
+
v
|
102
|
+
end
|
103
|
+
}.join(' ')
|
104
|
+
|
105
|
+
Query.new(s)
|
106
|
+
end
|
107
|
+
|
108
|
+
# 'cdstk.rb:11' -> 'g:cdstk.rb:11'
|
109
|
+
def conv_fuzzy_gotoline
|
110
|
+
s = query_string.split.map {|v|
|
111
|
+
if keywords[0].include? v
|
112
|
+
"g:#{v}"
|
113
|
+
else
|
114
|
+
v
|
115
|
+
end
|
116
|
+
}.join(' ')
|
117
|
+
|
118
|
+
Query.new(s)
|
119
|
+
end
|
120
|
+
|
86
121
|
private
|
87
122
|
|
88
123
|
def calc_param(index)
|
@@ -9,11 +9,11 @@ require 'milkode/cdweb/lib/query'
|
|
9
9
|
require 'milkode/cdweb/lib/grep'
|
10
10
|
require 'milkode/cdweb/lib/mkurl'
|
11
11
|
require 'milkode/common/util'
|
12
|
+
require 'milkode/cdweb/lib/search_fuzzy_gotoline'
|
12
13
|
|
13
14
|
module Milkode
|
14
15
|
class SearchContents
|
15
16
|
attr_reader :total_records
|
16
|
-
attr_reader :elapsed
|
17
17
|
attr_reader :page
|
18
18
|
|
19
19
|
DISP_NUM = 20 # 1ページの表示数
|
@@ -23,7 +23,7 @@ module Milkode
|
|
23
23
|
|
24
24
|
MATH_FILE_DISP = 3 # マッチファイルの最大表示数
|
25
25
|
MATH_FILE_LIMIT = MATH_FILE_DISP + 1 # マッチファイルの検索リミット数
|
26
|
-
|
26
|
+
|
27
27
|
def initialize(path, params, query)
|
28
28
|
@path = path
|
29
29
|
@params = params
|
@@ -33,23 +33,48 @@ module Milkode
|
|
33
33
|
@line = params[:line].to_i
|
34
34
|
@is_onematch = params[:onematch] == 'on'
|
35
35
|
@is_sensitive = params[:sensitive] == 'on'
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
@searcher_fuzzy_gotoline = nil
|
37
|
+
|
38
|
+
# 検索1 : クエリーそのまま
|
39
|
+
@records, @total_records = Database.instance.search(@q.keywords, @q.multi_match_keywords, @q.packages, path, @q.fpaths, @q.suffixs, @q.fpath_or_packages, @offset, LIMIT_NUM)
|
40
|
+
grep_contents(@q.keywords)
|
41
|
+
|
42
|
+
# 検索2 : マッチしなかった時におすすめクエリーがある場合
|
43
|
+
if @match_records.empty?
|
44
|
+
if recommended_fuzzy_gotoline?
|
45
|
+
# 専用の Searcher を作成
|
46
|
+
@searcher_fuzzy_gotoline = SearchFuzzyGotoLine.new(@path, @params, @q)
|
47
|
+
|
48
|
+
# 結果をコピーする
|
49
|
+
@total_records = @searcher_fuzzy_gotoline.total_records
|
50
|
+
@match_records = @searcher_fuzzy_gotoline.match_records
|
51
|
+
@next_index = @searcher_fuzzy_gotoline.next_index
|
52
|
+
@end_index = @searcher_fuzzy_gotoline.end_index
|
53
|
+
@next_line = nil
|
54
|
+
|
55
|
+
elsif recommended_fpath_or_packages?
|
56
|
+
# おすすめクエリーに変換
|
57
|
+
q2 = @q.conv_head_keyword_to_fpath_or_packages
|
58
|
+
|
59
|
+
# 検索
|
60
|
+
@records, @total_records = Database.instance.search(q2.keywords, q2.multi_match_keywords, q2.packages, path, q2.fpaths, q2.suffixs, q2.fpath_or_packages, @offset, LIMIT_NUM)
|
61
|
+
|
62
|
+
# 再grep
|
63
|
+
grep_contents(q2.keywords)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# 検索3 : マッチするファイル
|
41
68
|
@match_files = []
|
42
69
|
if @offset == 0 && @line == 0
|
43
70
|
t = 0
|
44
71
|
|
45
72
|
if (@path != "")
|
46
|
-
@match_files, t
|
73
|
+
@match_files, t = Database.instance.search([], @q.multi_match_keywords, @q.packages, path, @q.fpaths + @q.keywords, @q.suffixs, @q.fpath_or_packages, @offset, MATH_FILE_LIMIT)
|
47
74
|
else
|
48
|
-
@match_files, t
|
75
|
+
@match_files, t = Database.instance.search([], @q.multi_match_keywords, @q.packages, path, @q.fpaths, @q.suffixs, @q.fpath_or_packages + @q.keywords, @offset, MATH_FILE_LIMIT)
|
49
76
|
end
|
50
77
|
end
|
51
|
-
|
52
|
-
grep_contents
|
53
78
|
end
|
54
79
|
|
55
80
|
def query
|
@@ -85,11 +110,59 @@ module Milkode
|
|
85
110
|
end
|
86
111
|
|
87
112
|
<<EOF
|
88
|
-
#{
|
113
|
+
#{recommended_contents}
|
89
114
|
#{match_groups.map{|g|result_match_record(g)}.join}
|
90
115
|
EOF
|
91
116
|
end
|
92
117
|
|
118
|
+
def recommended_contents
|
119
|
+
contents = []
|
120
|
+
|
121
|
+
str = recommended_query_contents
|
122
|
+
contents << str unless str.empty?
|
123
|
+
|
124
|
+
str = match_files_contents
|
125
|
+
contents << str unless str.empty?
|
126
|
+
|
127
|
+
unless contents.empty?
|
128
|
+
contents.join
|
129
|
+
else
|
130
|
+
""
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def recommended_fuzzy_gotoline?
|
135
|
+
@q.keywords.size == 1 && @q.only_keywords && Util::fuzzy_gotoline_keyword?(@q.keywords[0])
|
136
|
+
end
|
137
|
+
|
138
|
+
def recommended_fpath_or_packages?
|
139
|
+
@q.keywords.size >= 2 && @q.only_keywords
|
140
|
+
end
|
141
|
+
|
142
|
+
def recommended_query_contents
|
143
|
+
if recommended_fuzzy_gotoline?
|
144
|
+
conv_query = @q.conv_fuzzy_gotoline
|
145
|
+
tmpp = @params.clone
|
146
|
+
tmpp[:query] = conv_query.query_string
|
147
|
+
url = Mkurl.new(@path, tmpp).inherit_query_shead
|
148
|
+
<<EOS
|
149
|
+
<dt class='result-file'>#{img_icon('document-new-4.png')}<a href='#{url}'>#{conv_query.query_string}</a></dt>
|
150
|
+
<hr>
|
151
|
+
EOS
|
152
|
+
elsif recommended_fpath_or_packages?
|
153
|
+
conv_query = @q.conv_head_keyword_to_fpath_or_packages
|
154
|
+
tmpp = @params.clone
|
155
|
+
tmpp[:query] = conv_query.query_string
|
156
|
+
url = Mkurl.new(@path, tmpp).inherit_query_shead
|
157
|
+
<<EOS
|
158
|
+
<dt class='result-file'>#{img_icon('document-new-4.png')}<a href='#{url}'>#{conv_query.query_string}</a></dt>
|
159
|
+
<hr>
|
160
|
+
EOS
|
161
|
+
else
|
162
|
+
""
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
93
166
|
def match_files_contents
|
94
167
|
unless @match_files.empty?
|
95
168
|
is_and_more = @match_files.size >= MATH_FILE_LIMIT
|
@@ -107,7 +180,7 @@ EOF
|
|
107
180
|
""
|
108
181
|
end
|
109
182
|
end
|
110
|
-
|
183
|
+
|
111
184
|
def html_pagination
|
112
185
|
return "" if @q.empty?
|
113
186
|
return "" if next_offset >= @total_records
|
@@ -123,11 +196,19 @@ EOF
|
|
123
196
|
@match_records.size
|
124
197
|
end
|
125
198
|
|
199
|
+
def directjump?
|
200
|
+
@searcher_fuzzy_gotoline && @searcher_fuzzy_gotoline.directjump?
|
201
|
+
end
|
202
|
+
|
203
|
+
def directjump_url
|
204
|
+
@searcher_fuzzy_gotoline.directjump_url
|
205
|
+
end
|
206
|
+
|
126
207
|
private
|
127
208
|
|
128
209
|
MatchRecord = Struct.new(:record, :match_line)
|
129
210
|
|
130
|
-
def grep_contents
|
211
|
+
def grep_contents(keywords)
|
131
212
|
@match_records = []
|
132
213
|
@end_index = @next_index = @records.size
|
133
214
|
@next_line = nil
|
@@ -137,7 +218,7 @@ EOF
|
|
137
218
|
|
138
219
|
if @is_onematch
|
139
220
|
grep = Grep.new(record.content)
|
140
|
-
match_line = grep.one_match_and(
|
221
|
+
match_line = grep.one_match_and(keywords, @is_sensitive)
|
141
222
|
@match_records << MatchRecord.new(record, match_line) if match_line
|
142
223
|
|
143
224
|
if @match_records.size >= DISP_NUM
|
@@ -146,7 +227,7 @@ EOF
|
|
146
227
|
break
|
147
228
|
end
|
148
229
|
else
|
149
|
-
break if grep_match_lines_stopover(record, index)
|
230
|
+
break if grep_match_lines_stopover(record, index, keywords)
|
150
231
|
end
|
151
232
|
else
|
152
233
|
@match_records << MatchRecord.new(record, Grep::MatchLineResult.new(0, nil))
|
@@ -160,9 +241,9 @@ EOF
|
|
160
241
|
end
|
161
242
|
end
|
162
243
|
|
163
|
-
def grep_match_lines_stopover(record, index)
|
244
|
+
def grep_match_lines_stopover(record, index, keywords)
|
164
245
|
grep = Grep.new(record.content)
|
165
|
-
r = grep.match_lines_stopover(
|
246
|
+
r = grep.match_lines_stopover(keywords, DISP_NUM - @match_records.size, (index == 0) ? @line : 0, @is_sensitive)
|
166
247
|
|
167
248
|
r[:result].each do |match_line|
|
168
249
|
@match_records << MatchRecord.new(record, match_line) if match_line
|
@@ -197,7 +278,7 @@ EOF
|
|
197
278
|
url = "/home/" + record_link(record)
|
198
279
|
|
199
280
|
<<EOS
|
200
|
-
<dt class='result-record'><a href='#{url + "#n#{coderay.highlight_lines[0]}"}'>#{Util::relative_path record.shortpath, @path}</a
|
281
|
+
<dt class='result-record'><a href='#{url + "#n#{coderay.highlight_lines[0]}"}'>#{Util::relative_path record.shortpath, @path}</a>#{result_refinement(record)}</dt>
|
201
282
|
<dd>
|
202
283
|
#{coderay.to_html_anchorlink(url)}
|
203
284
|
</dd>
|
@@ -226,6 +307,40 @@ EOS
|
|
226
307
|
Mkurl.new(record.shortpath, @params).inherit_query_shead
|
227
308
|
end
|
228
309
|
|
310
|
+
def refinement_suffix(suffix)
|
311
|
+
params = @params.clone
|
312
|
+
params[:query] = [@params[:query], "s:#{suffix}"].join(" ")
|
313
|
+
"/home/" + Mkurl.new(@path, params).inherit_query_shead
|
314
|
+
end
|
315
|
+
|
316
|
+
def refinement_directory(path)
|
317
|
+
"/home/" + Mkurl.new(path, @params).inherit_query_shead
|
318
|
+
end
|
319
|
+
|
320
|
+
def result_refinement(record)
|
321
|
+
refinements = []
|
322
|
+
|
323
|
+
# 拡張子で絞り込み
|
324
|
+
refinements << "<a href='#{refinement_suffix(record.suffix)}'>.#{record.suffix}で絞り込み</a>" if record.suffix
|
325
|
+
|
326
|
+
# ディレクトリで絞り込み
|
327
|
+
path = Util::relative_path(record.shortpath, @path)
|
328
|
+
dirname = path.to_s.split('/')[-2]
|
329
|
+
refinements << "<a href='#{refinement_directory(record.shortpath + '/..')}'>#{dirname}/以下で再検索</a>" if dirname
|
330
|
+
|
331
|
+
unless refinements.empty?
|
332
|
+
space1 = ' '
|
333
|
+
space2 = ' , '
|
334
|
+
|
335
|
+
<<EOF
|
336
|
+
#{space1}<span id="result-refinement">[#{refinements.join(space2)}]</span>
|
337
|
+
EOF
|
338
|
+
else
|
339
|
+
''
|
340
|
+
end
|
341
|
+
|
342
|
+
end
|
343
|
+
|
229
344
|
end
|
230
345
|
end
|
231
346
|
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief 曖昧ジャンプ
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2012/07/08
|
7
|
+
|
8
|
+
require 'milkode/cdweb/lib/query'
|
9
|
+
require 'milkode/cdweb/lib/grep'
|
10
|
+
require 'milkode/cdweb/lib/mkurl'
|
11
|
+
require 'milkode/common/util'
|
12
|
+
|
13
|
+
module Milkode
|
14
|
+
class SearchFuzzyGotoLine
|
15
|
+
attr_reader :total_records
|
16
|
+
attr_reader :match_records
|
17
|
+
attr_reader :next_index
|
18
|
+
attr_reader :end_index
|
19
|
+
|
20
|
+
DISP_NUM = 20 # 1ページの表示数
|
21
|
+
LIMIT_NUM = 50 # 最大検索ファイル数
|
22
|
+
NTH = 3 # 表示範囲
|
23
|
+
COL_LIMIT = 200 # 1行の桁制限
|
24
|
+
|
25
|
+
def initialize(path, params, query)
|
26
|
+
@path = path
|
27
|
+
@params = params
|
28
|
+
@q = query
|
29
|
+
@page = params[:page].to_i || 0
|
30
|
+
@offset = params[:offset].to_i
|
31
|
+
|
32
|
+
# 検索クエリを解析
|
33
|
+
gotolines = Util::parse_gotoline(@q.gotolines + @q.keywords)
|
34
|
+
@gotoline = gotolines[0]
|
35
|
+
|
36
|
+
# 検索
|
37
|
+
fpaths = @q.fpaths + @gotoline[0]
|
38
|
+
@records, @total_records = Database.instance.search([], @q.multi_match_keywords, @q.packages, path, fpaths, @q.suffixs, @q.fpath_or_packages, @offset, LIMIT_NUM)
|
39
|
+
|
40
|
+
# 検索結果を表示
|
41
|
+
grep_contents
|
42
|
+
end
|
43
|
+
|
44
|
+
def query
|
45
|
+
@q.query_string
|
46
|
+
end
|
47
|
+
|
48
|
+
def next_offset
|
49
|
+
@offset + @next_index
|
50
|
+
end
|
51
|
+
|
52
|
+
def data_range
|
53
|
+
@offset..(@offset + @end_index)
|
54
|
+
end
|
55
|
+
|
56
|
+
def html_contents
|
57
|
+
match_groups = @match_records.reduce([]) do |g, m|
|
58
|
+
# 近接マッチ無効
|
59
|
+
g << [m]
|
60
|
+
end
|
61
|
+
|
62
|
+
<<EOF
|
63
|
+
#{match_groups.map{|g|result_match_record(g)}.join}
|
64
|
+
EOF
|
65
|
+
end
|
66
|
+
|
67
|
+
def html_pagination
|
68
|
+
return "" if @q.empty?
|
69
|
+
return "" if next_offset >= @total_records
|
70
|
+
|
71
|
+
return <<EOF
|
72
|
+
<div class='pagination pagination-centered'>
|
73
|
+
#{pagination_link(next_offset, @next_line, "next >>")}
|
74
|
+
</div>
|
75
|
+
EOF
|
76
|
+
end
|
77
|
+
|
78
|
+
def match_num
|
79
|
+
@match_records.size
|
80
|
+
end
|
81
|
+
|
82
|
+
def directjump?
|
83
|
+
match_num == 1
|
84
|
+
end
|
85
|
+
|
86
|
+
def directjump_url
|
87
|
+
path = File.join('/home', @match_records[0].record.shortpath)
|
88
|
+
lineno = "#n#{@gotoline[1]}"
|
89
|
+
Mkurl.new(path, @params).inherit_query_shead + lineno
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
MatchRecord = Struct.new(:record, :match_line)
|
95
|
+
|
96
|
+
def grep_contents
|
97
|
+
@match_records = []
|
98
|
+
@end_index = @next_index = @records.size
|
99
|
+
@next_line = nil
|
100
|
+
|
101
|
+
@records.each_with_index do |record, index|
|
102
|
+
lineidx = @gotoline[1] - 1
|
103
|
+
|
104
|
+
if (lineidx < record.content.split("\n").size)
|
105
|
+
@match_records << MatchRecord.new(record, Grep::MatchLineResult.new(lineidx, nil))
|
106
|
+
|
107
|
+
if @match_records.size >= DISP_NUM
|
108
|
+
@end_index = index
|
109
|
+
@next_index = index + 1
|
110
|
+
break
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def result_match_record(match_group)
|
117
|
+
record = match_group[0].record
|
118
|
+
|
119
|
+
first_index = match_group[0].match_line.index - NTH
|
120
|
+
last_index = match_group[-1].match_line.index + NTH
|
121
|
+
match_lines = match_group.map{|m| m.match_line}
|
122
|
+
|
123
|
+
coderay = CodeRayWrapper.new(record.content, record.shortpath, match_lines)
|
124
|
+
coderay.col_limit(COL_LIMIT)
|
125
|
+
coderay.set_range(first_index..last_index)
|
126
|
+
|
127
|
+
url = "/home/" + record_link(record)
|
128
|
+
|
129
|
+
<<EOS
|
130
|
+
<dt class='result-record'><a href='#{url + "#n#{coderay.highlight_lines[0]}"}'>#{Util::relative_path record.shortpath, @path}</a></dt>
|
131
|
+
<dd>
|
132
|
+
#{coderay.to_html_anchorlink(url)}
|
133
|
+
</dd>
|
134
|
+
EOS
|
135
|
+
end
|
136
|
+
|
137
|
+
def pagination_link(offset, line, label)
|
138
|
+
tmpp = @params.clone
|
139
|
+
tmpp[:offset] = offset.to_s
|
140
|
+
tmpp[:line] = line.to_s
|
141
|
+
href = Mkurl.new("", tmpp).inherit_query_shead_offset
|
142
|
+
pagination_span("<a href='#{href}' rel='next'>#{label}</a>")
|
143
|
+
end
|
144
|
+
|
145
|
+
def pagination_span(content)
|
146
|
+
"<ul><li>#{content}</li></ul>\n"
|
147
|
+
end
|
148
|
+
|
149
|
+
def result_record(record)
|
150
|
+
<<EOS
|
151
|
+
<dt class='result-file'>#{file_or_dirimg(true)}<a href='#{"/home/" + record_link(record)}'>#{Util::relative_path record.shortpath, @path}</a></dt>
|
152
|
+
EOS
|
153
|
+
end
|
154
|
+
|
155
|
+
def record_link(record)
|
156
|
+
Mkurl.new(record.shortpath, @params).inherit_query_shead
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
|