milkode 0.8.1 → 0.9.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.
- data/Gemfile +1 -0
- data/HISTORY.ja.rdoc +36 -0
- data/HISTORY.rdoc +20 -0
- data/VERSION +1 -1
- data/bin/gmilk +1 -1
- data/bin/milk +1 -1
- data/lib/milkode/cdweb/app.rb +69 -8
- data/lib/milkode/cdweb/lib/coderay_html2.rb +24 -16
- data/lib/milkode/cdweb/lib/coderay_wrapper.rb +3 -1
- data/lib/milkode/cdweb/lib/command.rb +21 -4
- data/lib/milkode/cdweb/lib/database.rb +12 -6
- data/lib/milkode/cdweb/lib/grep.rb +8 -6
- data/lib/milkode/cdweb/lib/mkurl.rb +7 -2
- data/lib/milkode/cdweb/lib/query.rb +36 -1
- data/lib/milkode/cdweb/lib/search_contents.rb +54 -13
- data/lib/milkode/cdweb/lib/search_files.rb +4 -4
- data/lib/milkode/cdweb/lib/search_gotoline.rb +151 -0
- data/lib/milkode/cdweb/public/css/coderay-patch.css +24 -0
- data/lib/milkode/cdweb/public/css/milkode.css +39 -5
- data/lib/milkode/cdweb/public/js/milkode.js +19 -1
- data/lib/milkode/cdweb/views/help.haml +13 -0
- data/lib/milkode/cdweb/views/layout.haml +4 -4
- data/lib/milkode/cdweb/views/search_form.haml +19 -23
- data/lib/milkode/cdweb/views/view.haml +2 -2
- data/lib/milkode/common/util.rb +10 -2
- data/lib/milkode/database/document_table.rb +12 -0
- data/lib/milkode/grep/cli_grep.rb +25 -6
- data/milkode.gemspec +8 -2
- data/test/data/a_project/empty.txt +0 -0
- data/test/test_cdweb_app.rb +73 -0
- data/test/test_query.rb +25 -0
- data/test/test_util.rb +18 -0
- metadata +22 -5
data/Gemfile
CHANGED
data/HISTORY.ja.rdoc
CHANGED
@@ -1,3 +1,39 @@
|
|
1
|
+
=== 0.9.0 2012/07/09
|
2
|
+
|
3
|
+
* milk web
|
4
|
+
* ページデザインを刷新
|
5
|
+
* メインページ以外もTwitter bootstrapに対応
|
6
|
+
* デザインの調整
|
7
|
+
* ファイル一覧 -> ディレクトリ に文章変更
|
8
|
+
* 検索時にキーワードにマッチするファイルも合わせて表示するように
|
9
|
+
* パッケージセレクタの追加
|
10
|
+
* 現在パッケージ名を選択
|
11
|
+
* パッケージの切り替え
|
12
|
+
* ダイレクトジャンプ
|
13
|
+
* viewモードで行番号をクリックするとダイレクトパス(現在行を表すテキスト)を表示
|
14
|
+
* ダイレクトパス入力時に指定行に直接ジャンプ出来るように
|
15
|
+
* 検索オプション追加
|
16
|
+
* fp(fpath_or_packages)
|
17
|
+
* k(keyword)
|
18
|
+
* 大文字/小文字を区別する(:sensitive)
|
19
|
+
* バグ修正
|
20
|
+
* 空ファイルを表示出来ない問題を修正
|
21
|
+
* 半角スペースを含むファイルが正しく表示出来ない
|
22
|
+
* ファイル検索時に次の100件が表示されない
|
23
|
+
* ヘルプに文言追加
|
24
|
+
* Webアプリのテストを追加(test_cdweb_app)
|
25
|
+
|
26
|
+
* gmilk
|
27
|
+
* 引数解析して'-g'オプション無くても-gモードに移行出来るように
|
28
|
+
* ダイレクトパス入力時に指定行に直接ジャンプ出来るように
|
29
|
+
|
30
|
+
* database
|
31
|
+
* fpath_or_packages(fp)オプションに対応
|
32
|
+
|
33
|
+
=== 0.8.1 2012/06/20
|
34
|
+
|
35
|
+
* gmilk -a -u 時にエラーになる問題を修正 (thanks hazy_moon)
|
36
|
+
|
1
37
|
=== 0.8.0 2012/06/20
|
2
38
|
|
3
39
|
* milk web
|
data/HISTORY.rdoc
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
=== 0.9.0 2012/07/09
|
2
|
+
|
3
|
+
* milk web
|
4
|
+
* Renew page design
|
5
|
+
* Display match files when searching
|
6
|
+
* Add package selector
|
7
|
+
* Direct jump
|
8
|
+
* Add search options
|
9
|
+
* Bug fix
|
10
|
+
|
11
|
+
* gmilk
|
12
|
+
* Direct jump
|
13
|
+
|
14
|
+
* database
|
15
|
+
* fpath_or_packages
|
16
|
+
|
17
|
+
=== 0.8.1 2012/06/20
|
18
|
+
|
19
|
+
* Fix, gmilk -a -u error (thanks hazy_moon)
|
20
|
+
|
1
21
|
=== 0.8.0 2012/06/20
|
2
22
|
|
3
23
|
* milk web
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.9.0
|
data/bin/gmilk
CHANGED
data/bin/milk
CHANGED
data/lib/milkode/cdweb/app.rb
CHANGED
@@ -16,12 +16,13 @@ require 'milkode/cdweb/lib/command'
|
|
16
16
|
require 'milkode/cdweb/lib/mkurl'
|
17
17
|
require 'milkode/cdweb/lib/web_setting'
|
18
18
|
require 'milkode/cdweb/lib/package_list'
|
19
|
+
require 'milkode/common/util'
|
19
20
|
|
20
21
|
set :haml, :format => :html5
|
21
22
|
|
22
23
|
get '/' do
|
23
24
|
@setting = WebSetting.new
|
24
|
-
@version = "0.
|
25
|
+
@version = "0.9.0"
|
25
26
|
@package_num = Database.instance.yaml_package_num
|
26
27
|
@file_num = Database.instance.totalRecords
|
27
28
|
@package_list = PackageList.new(Database.instance.grndb)
|
@@ -49,7 +50,15 @@ post '/search*' do
|
|
49
50
|
path = package_path(path)
|
50
51
|
end
|
51
52
|
|
52
|
-
|
53
|
+
query = Query.new(params[:query])
|
54
|
+
# gotolineモードで1つだけ渡された時は直接ジャンプ
|
55
|
+
if query.keywords.size == 1 && Milkode::Util::gotoline_keyword?(query.keywords[0])
|
56
|
+
gotoline = Milkode::Util::parse_gotoline(query.keywords)[0]
|
57
|
+
path2 = File.join('/home', gotoline[0][0])
|
58
|
+
redirect Mkurl.new(path2, params).inherit_query_shead + "#n#{gotoline[1]}"
|
59
|
+
else
|
60
|
+
redirect Mkurl.new("#{path}", params).inherit_query_shead
|
61
|
+
end
|
53
62
|
end
|
54
63
|
end
|
55
64
|
|
@@ -96,14 +105,37 @@ helpers do
|
|
96
105
|
"<a href='#{'/home?query=' + escape_url(query)}'>#{query}</a>"
|
97
106
|
end
|
98
107
|
|
99
|
-
def
|
100
|
-
|
101
|
-
|
108
|
+
def create_select_shead(value)
|
109
|
+
value ||= "package"
|
110
|
+
|
111
|
+
data = [
|
112
|
+
['all' , '全て' ],
|
113
|
+
['package' , 'パッケージ' ],
|
114
|
+
['directory', 'ディレクトリ'],
|
115
|
+
]
|
116
|
+
|
117
|
+
<<EOF
|
118
|
+
<select name="shead" id="shead">
|
119
|
+
#{data.map{|v| "<option value='#{v[0]}' #{v[0] == value ? 'selected' : ''}>#{v[1]}</option>"}}
|
120
|
+
</select>
|
121
|
+
EOF
|
102
122
|
end
|
103
123
|
|
104
|
-
def
|
124
|
+
def create_select_package(path)
|
125
|
+
value = package_name(path)
|
126
|
+
value = '---' if value == "root"
|
127
|
+
data = ['---'] + Database.instance.packages(nil)
|
128
|
+
|
129
|
+
<<EOF
|
130
|
+
<select name="package" id="package" onchange="select_package()">
|
131
|
+
#{data.map{|v| "<option value='#{v}' #{v == value ? 'selected' : ''}>#{v}</option>"}}
|
132
|
+
</select>
|
133
|
+
EOF
|
134
|
+
end
|
135
|
+
|
136
|
+
def create_checkbox(name, value, label)
|
105
137
|
str = (value) ? 'checked' : ''
|
106
|
-
"<input type='checkbox' name='#{name}' value='on' #{str}
|
138
|
+
"<label class='checkbox inline'><input type='checkbox' name='#{name}' value='on' #{str}/>#{label}</label>"
|
107
139
|
end
|
108
140
|
|
109
141
|
def create_headmenu(path, query, flistpath = '')
|
@@ -112,7 +144,7 @@ helpers do
|
|
112
144
|
<<EOF
|
113
145
|
#{headicon('go-home-5.png')} <a href="/home" class="headmenu">全てのパッケージ</a>
|
114
146
|
#{headicon('document-new-4.png')} <a href="#{href}" class="headmenu" onclick="window.open('#{href}'); return false;">新しい検索</a>
|
115
|
-
#{headicon('directory.png')} <a href="#{flist}" class="headmenu"
|
147
|
+
#{headicon('directory.png')} <a href="#{flist}" class="headmenu">ディレクトリ</a>
|
116
148
|
#{headicon('help.png')} <a href="/help" class="headmenu">ヘルプ</a>
|
117
149
|
EOF
|
118
150
|
end
|
@@ -131,6 +163,35 @@ EOF
|
|
131
163
|
}.join('/')
|
132
164
|
end
|
133
165
|
|
166
|
+
HASH = {
|
167
|
+
'.h' => ['.c', '.cpp', '.m', '.mm'],
|
168
|
+
'.c' => ['.h'],
|
169
|
+
'.hpp' => ['.cpp'],
|
170
|
+
'.cpp' => ['.hpp', '.h'],
|
171
|
+
'.m' => ['.h'],
|
172
|
+
'.mm' => ['.h'],
|
173
|
+
}
|
174
|
+
|
175
|
+
def additional_info(path, parms)
|
176
|
+
suffix = File.extname path
|
177
|
+
cadet = HASH[suffix]
|
178
|
+
|
179
|
+
if (cadet)
|
180
|
+
result = cadet.find do |v|
|
181
|
+
Database.instance.record(path.gsub(/#{suffix}\Z/, v))
|
182
|
+
end
|
183
|
+
|
184
|
+
if (result)
|
185
|
+
path2 = path.gsub(/#{suffix}\Z/, result)
|
186
|
+
" (<a href='#{Mkurl.new(File.join('/home', path2), params).inherit_query_shead}'>#{result}</a>) "
|
187
|
+
else
|
188
|
+
''
|
189
|
+
end
|
190
|
+
else
|
191
|
+
''
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
134
195
|
def package_name(path)
|
135
196
|
(path == "") ? 'root' : path.split('/')[0]
|
136
197
|
end
|
@@ -72,22 +72,7 @@ module Encoders
|
|
72
72
|
raise ArgumentError, "Invalid value %p for :line_number_start; Integer expected." % start
|
73
73
|
end
|
74
74
|
|
75
|
-
|
76
|
-
anchor_prefix = 'line' if anchor_prefix == true
|
77
|
-
anchor_prefix = anchor_prefix.to_s[/\w+/] if anchor_prefix
|
78
|
-
|
79
|
-
anchor_url = options[:line_number_anchor_url] || ""
|
80
|
-
|
81
|
-
anchoring =
|
82
|
-
if anchor_prefix
|
83
|
-
proc do |line|
|
84
|
-
line = line.to_s
|
85
|
-
anchor = anchor_prefix + line
|
86
|
-
"<a href=\"#{anchor_url}##{anchor}\" name=\"#{anchor}\">#{line}</a>"
|
87
|
-
end
|
88
|
-
else
|
89
|
-
proc { |line| line.to_s } # :to_s.to_proc in Ruby 1.8.7+
|
90
|
-
end
|
75
|
+
anchoring = create_anchor(options)
|
91
76
|
|
92
77
|
bold_every = options[:bold_every]
|
93
78
|
highlight_lines = options[:highlight_lines]
|
@@ -166,6 +151,29 @@ module Encoders
|
|
166
151
|
|
167
152
|
output
|
168
153
|
end
|
154
|
+
|
155
|
+
def self.create_anchor(options)
|
156
|
+
anchor_prefix = options[:line_number_anchors]
|
157
|
+
anchor_prefix = 'line' if anchor_prefix == true
|
158
|
+
anchor_prefix = anchor_prefix.to_s[/\w+/] if anchor_prefix
|
159
|
+
|
160
|
+
if anchor_prefix
|
161
|
+
anchor_url = options[:line_number_anchor_url] || ""
|
162
|
+
|
163
|
+
proc do |line|
|
164
|
+
line = line.to_s
|
165
|
+
anchor = anchor_prefix + line
|
166
|
+
"<a href=\"#{anchor_url}##{anchor}\" name=\"#{anchor}\">#{line}</a>"
|
167
|
+
end
|
168
|
+
elsif options[:onclick_copy_line_number]
|
169
|
+
prefix = options[:onclick_copy_prefix] || ""
|
170
|
+
proc do |line|
|
171
|
+
"<a href=\"#!\" onclick=\"alert('#{prefix + line.to_s}');\" title=\"Display line number\">#{line.to_s}</a>"
|
172
|
+
end
|
173
|
+
else
|
174
|
+
proc { |line| line.to_s } # :to_s.to_proc in Ruby 1.8.7+
|
175
|
+
end
|
176
|
+
end
|
169
177
|
end
|
170
178
|
end
|
171
179
|
end
|
@@ -55,7 +55,9 @@ module Milkode
|
|
55
55
|
:css => :class,
|
56
56
|
:highlight_lines => @highlight_lines,
|
57
57
|
:line_number_start => @line_number_start,
|
58
|
-
:line_number_anchors => false
|
58
|
+
:line_number_anchors => false,
|
59
|
+
:onclick_copy_line_number => true,
|
60
|
+
:onclick_copy_prefix => "/#{@filename}:"
|
59
61
|
)
|
60
62
|
end
|
61
63
|
|
@@ -9,6 +9,7 @@ require 'milkode/cdweb/lib/database'
|
|
9
9
|
require 'milkode/cdweb/lib/coderay_wrapper'
|
10
10
|
require 'milkode/cdweb/lib/search_contents'
|
11
11
|
require 'milkode/cdweb/lib/search_files'
|
12
|
+
require 'milkode/cdweb/lib/search_gotoline'
|
12
13
|
require 'milkode/cdweb/lib/mkurl'
|
13
14
|
require 'milkode/common/util'
|
14
15
|
|
@@ -17,13 +18,25 @@ module Milkode
|
|
17
18
|
@setting = WebSetting.new
|
18
19
|
@title = record.shortpath
|
19
20
|
@path = record.shortpath
|
21
|
+
is_sensitive = params[:sensitive] == 'on'
|
20
22
|
|
21
23
|
q = params[:query] && Query.new(params[:query])
|
22
24
|
|
23
25
|
if (Util::larger_than_oneline(record.content) and q and !q.keywords.empty?)
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
if Util::gotoline_keyword? q.keywords[0]
|
27
|
+
gotolines = Util::parse_gotoline(q.keywords)
|
28
|
+
match_lines = []
|
29
|
+
gotolines.each do |v|
|
30
|
+
if v[0][0][1..-1] == record.shortpath
|
31
|
+
match_lines << Grep::MatchLineResult.new(v[1] - 1, nil)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
@record_content = CodeRayWrapper.new(record.content, record.shortpath, match_lines).to_html
|
35
|
+
else
|
36
|
+
grep = Grep.new(record.content)
|
37
|
+
match_lines = grep.match_lines_and(q.keywords, is_sensitive)
|
38
|
+
@record_content = CodeRayWrapper.new(record.content, record.shortpath, match_lines).to_html
|
39
|
+
end
|
27
40
|
else
|
28
41
|
@record_content = CodeRayWrapper.new(record.content, record.shortpath).to_html
|
29
42
|
end
|
@@ -40,7 +53,11 @@ module Milkode
|
|
40
53
|
@title = "'#{query.query_string}' in #{path_title(path)}"
|
41
54
|
|
42
55
|
if (query.keywords.size > 0)
|
43
|
-
|
56
|
+
if Util::gotoline_keyword? query.keywords[0]
|
57
|
+
searcher = SearchGotoLine.new(path, params, query)
|
58
|
+
else
|
59
|
+
searcher = SearchContents.new(path, params, query)
|
60
|
+
end
|
44
61
|
else
|
45
62
|
searcher = SearchFiles.new(path, params, query)
|
46
63
|
end
|
@@ -12,6 +12,7 @@ require 'groonga'
|
|
12
12
|
require 'milkode/common/dbdir'
|
13
13
|
require 'milkode/cdstk/yaml_file_wrapper'
|
14
14
|
require 'milkode/database/groonga_database'
|
15
|
+
require 'milkode/common/util'
|
15
16
|
include Milkode
|
16
17
|
|
17
18
|
module Milkode
|
@@ -42,18 +43,22 @@ module Milkode
|
|
42
43
|
|
43
44
|
def open
|
44
45
|
if !@grndb || @grndb.closed?
|
45
|
-
|
46
|
-
@grndb.open(Database.dbdir)
|
47
|
-
@grndb.yaml_sync(yaml_load.contents)
|
48
|
-
@documents = @grndb.documents
|
46
|
+
open_force
|
49
47
|
end
|
50
48
|
end
|
51
49
|
|
50
|
+
def open_force
|
51
|
+
@grndb = GroongaDatabase.new
|
52
|
+
@grndb.open(Database.dbdir)
|
53
|
+
@grndb.yaml_sync(yaml_load.contents)
|
54
|
+
@documents = @grndb.documents
|
55
|
+
end
|
56
|
+
|
52
57
|
def record(shortpath)
|
53
58
|
DocumentRecord.create @documents.find_shortpath(shortpath)
|
54
59
|
end
|
55
60
|
|
56
|
-
def search(patterns, packages, current_path, fpaths, suffixs, offset = 0, limit = -1)
|
61
|
+
def search(patterns, keywords, packages, current_path, fpaths, suffixs, fpath_or_packages, offset = 0, limit = -1)
|
57
62
|
paths = []
|
58
63
|
|
59
64
|
# パッケージ名未指定の時は現在位置を検索条件に追加
|
@@ -73,11 +78,12 @@ module Milkode
|
|
73
78
|
# 検索
|
74
79
|
result = @documents.search(
|
75
80
|
:patterns => patterns,
|
76
|
-
|
81
|
+
:keywords => keywords,
|
77
82
|
:paths => paths,
|
78
83
|
:packages => packages,
|
79
84
|
:restpaths => fpaths,
|
80
85
|
:suffixs => suffixs,
|
86
|
+
:fpath_or_packages => fpath_or_packages,
|
81
87
|
:offset => offset,
|
82
88
|
:limit => limit
|
83
89
|
)
|
@@ -5,6 +5,8 @@
|
|
5
5
|
# @author ongaeshi
|
6
6
|
# @date 2010/10/18
|
7
7
|
|
8
|
+
require 'milkode/common/util'
|
9
|
+
|
8
10
|
module Milkode
|
9
11
|
class Grep
|
10
12
|
def initialize(content)
|
@@ -13,9 +15,9 @@ module Milkode
|
|
13
15
|
|
14
16
|
MatchLineResult = Struct.new(:index, :match_datas)
|
15
17
|
|
16
|
-
def match_lines_stopover(patterns, max_match, start_index)
|
18
|
+
def match_lines_stopover(patterns, max_match, start_index, is_sensitive)
|
17
19
|
result = []
|
18
|
-
patternRegexps = strs2regs(patterns,
|
20
|
+
patternRegexps = strs2regs(patterns, Util::ignore_case?(patterns, is_sensitive))
|
19
21
|
index = start_index
|
20
22
|
|
21
23
|
lines = @content.split($/)
|
@@ -41,9 +43,9 @@ module Milkode
|
|
41
43
|
{:result => result, :next_line => index}
|
42
44
|
end
|
43
45
|
|
44
|
-
def match_lines_and(patterns)
|
46
|
+
def match_lines_and(patterns, is_sensitive)
|
45
47
|
result = []
|
46
|
-
patternRegexps = strs2regs(patterns,
|
48
|
+
patternRegexps = strs2regs(patterns, Util::ignore_case?(patterns, is_sensitive))
|
47
49
|
index = 0
|
48
50
|
|
49
51
|
@content.each_line do |line|
|
@@ -60,8 +62,8 @@ module Milkode
|
|
60
62
|
result
|
61
63
|
end
|
62
64
|
|
63
|
-
def one_match_and(patterns)
|
64
|
-
patternRegexps = strs2regs(patterns,
|
65
|
+
def one_match_and(patterns, is_sensitive)
|
66
|
+
patternRegexps = strs2regs(patterns, Util::ignore_case?(patterns, is_sensitive))
|
65
67
|
index = 0
|
66
68
|
|
67
69
|
@content.each_line do |line|
|
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
require 'rubygems'
|
9
9
|
require 'rack'
|
10
|
-
include Rack::Utils
|
11
10
|
|
12
11
|
module Milkode
|
13
12
|
class Mkurl
|
@@ -39,7 +38,12 @@ module Milkode
|
|
39
38
|
private
|
40
39
|
|
41
40
|
def escape_path(src)
|
42
|
-
|
41
|
+
# /rack-1.3.0/lib/rack/utils.rb:29
|
42
|
+
Rack::Utils::escape_path(src).gsub("%2F", '/')
|
43
|
+
end
|
44
|
+
|
45
|
+
def escape(src)
|
46
|
+
Rack::Utils::escape(src)
|
43
47
|
end
|
44
48
|
|
45
49
|
def create_url(qp)
|
@@ -55,6 +59,7 @@ module Milkode
|
|
55
59
|
qparam << "query=#{escape(@params[:query])}" if (query_inherit and @params[:query])
|
56
60
|
qparam << "shead=#{escape(@params[:shead])}" if (shead_inherit and @params[:shead])
|
57
61
|
qparam << "onematch=#{escape(@params[:onematch])}" if (shead_inherit and @params[:onematch])
|
62
|
+
qparam << "sensitive=#{escape(@params[:sensitive])}" if (shead_inherit and @params[:sensitive])
|
58
63
|
qparam << "offset=#{escape(@params[:offset])}" if (offset_inherit and @params[:offset])
|
59
64
|
qparam << "line=#{escape(@params[:line])}" if (offset_inherit and @params[:line])
|
60
65
|
qparam << "sort=#{sort_kind}" if sort_kind
|