milkode 0.1.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.
Files changed (70) hide show
  1. data/.document +5 -0
  2. data/Gemfile +12 -0
  3. data/Gemfile.lock +18 -0
  4. data/HISTORY.rdoc +5 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.rdoc +19 -0
  7. data/Rakefile +78 -0
  8. data/VERSION +1 -0
  9. data/bin/cdv +6 -0
  10. data/bin/cdview +10 -0
  11. data/bin/milk +10 -0
  12. data/lib/milkode/cdstk/cdstk.rb +508 -0
  13. data/lib/milkode/cdstk/cdstk_yaml.rb +106 -0
  14. data/lib/milkode/cdstk/cli_cdstk.rb +103 -0
  15. data/lib/milkode/cdstk/cli_cdstksub.rb +102 -0
  16. data/lib/milkode/cdview/cli_cdview.rb +43 -0
  17. data/lib/milkode/cdweb/app.rb +136 -0
  18. data/lib/milkode/cdweb/cli_cdweb.rb +111 -0
  19. data/lib/milkode/cdweb/config.ru +3 -0
  20. data/lib/milkode/cdweb/lib/coderay_wrapper.rb +94 -0
  21. data/lib/milkode/cdweb/lib/command.rb +67 -0
  22. data/lib/milkode/cdweb/lib/database.rb +260 -0
  23. data/lib/milkode/cdweb/lib/grep.rb +68 -0
  24. data/lib/milkode/cdweb/lib/mkurl.rb +56 -0
  25. data/lib/milkode/cdweb/lib/query.rb +81 -0
  26. data/lib/milkode/cdweb/lib/search_contents.rb +117 -0
  27. data/lib/milkode/cdweb/lib/search_files.rb +88 -0
  28. data/lib/milkode/cdweb/public/css/coderay.css +131 -0
  29. data/lib/milkode/cdweb/public/css/gren.css +75 -0
  30. data/lib/milkode/cdweb/public/images/directory.png +0 -0
  31. data/lib/milkode/cdweb/public/images/file.png +0 -0
  32. data/lib/milkode/cdweb/public/images/gren-icon-mini.png +0 -0
  33. data/lib/milkode/cdweb/public/images/gren-icon.png +0 -0
  34. data/lib/milkode/cdweb/views/filelist.haml +14 -0
  35. data/lib/milkode/cdweb/views/help.haml +16 -0
  36. data/lib/milkode/cdweb/views/index.haml +17 -0
  37. data/lib/milkode/cdweb/views/layout.haml +33 -0
  38. data/lib/milkode/cdweb/views/search.haml +12 -0
  39. data/lib/milkode/cdweb/views/view.haml +16 -0
  40. data/lib/milkode/common/dbdir.rb +39 -0
  41. data/lib/milkode/common/display_util.rb +62 -0
  42. data/lib/milkode/common/grenfiletest.rb +19 -0
  43. data/lib/milkode/common/grensnip.rb +37 -0
  44. data/lib/milkode/common/platform.rb +17 -0
  45. data/lib/milkode/common/string_snip.rb +61 -0
  46. data/lib/milkode/common/util.rb +144 -0
  47. data/lib/milkode/findgrep/findgrep.rb +408 -0
  48. data/lib/milkode/findgrep/result.rb +43 -0
  49. data/milkode.gemspec +159 -0
  50. data/test/data/abc.zip +0 -0
  51. data/test/data/nodir_abc.zip +0 -0
  52. data/test/data/nodir_abc_xpi.xpi +0 -0
  53. data/test/file_assert.rb +41 -0
  54. data/test/file_test_utils.rb +59 -0
  55. data/test/rake_test_loader.rb +7 -0
  56. data/test/runner.rb +11 -0
  57. data/test/test_bin_exec.rb +30 -0
  58. data/test/test_cdstk.rb +90 -0
  59. data/test/test_cdstk_yaml.rb +157 -0
  60. data/test/test_coderay_wrapper.rb +22 -0
  61. data/test/test_coderay_wrapper_data.rb +91 -0
  62. data/test/test_database.rb +78 -0
  63. data/test/test_dbdir.rb +60 -0
  64. data/test/test_gren_util.rb +34 -0
  65. data/test/test_helper.rb +2 -0
  66. data/test/test_mkurl.rb +30 -0
  67. data/test/test_query.rb +54 -0
  68. data/test/test_string_snip.rb +31 -0
  69. data/test/test_util.rb +40 -0
  70. metadata +300 -0
@@ -0,0 +1,75 @@
1
+ body {
2
+ }
3
+
4
+ div.header {
5
+ }
6
+
7
+ div.footer {
8
+ }
9
+
10
+ div.header_home {
11
+ font-size: 170%;
12
+ }
13
+
14
+ div.footer_home {
15
+ font-size: 85%;
16
+ margin-top: 3em;
17
+ }
18
+
19
+ div.search-summary {
20
+ border-color:#F4CA3F;
21
+ background-color:#FEFFF0;
22
+ border-top-style:solid;
23
+ border-top-width:1px;
24
+ border-bottom-style:solid;
25
+ border-bottom-width:1px;
26
+ margin-bottom:1em;
27
+ margin-top:1em;
28
+ padding-bottom:5px;
29
+ padding-top:5px;
30
+ padding-left:5px;
31
+ }
32
+
33
+ dt.result-record {
34
+ font-size: 105%;
35
+ }
36
+
37
+ dt.result-file {
38
+ font-size: 95%;
39
+ }
40
+
41
+ div.pagination {
42
+ background-color:#FEFFF0;
43
+ text-align: center;
44
+ margin-bottom: 20px;
45
+ }
46
+
47
+ pre.lines {
48
+ border: 1px solid #dedede;
49
+ margin-bottom: 5px;
50
+ padding-left: 5px;
51
+ background-color: #fdfdfd;
52
+ font-weight: inherit;
53
+ margin-top: 5px;
54
+ padding-top: 5px;
55
+ padding-bottom: 5px;
56
+ }
57
+
58
+ span.keyword {
59
+ font-weight: bold;
60
+ }
61
+
62
+ font.version {
63
+ font-size: 35%;
64
+ }
65
+
66
+ span.highlight-line {
67
+ background-color: #d0ff9c;
68
+ /* background-color: #FFFF55; */
69
+ }
70
+
71
+ a.headmenu {
72
+ font-size: 40%;
73
+ font-weight: normal;
74
+ }
75
+
@@ -0,0 +1,14 @@
1
+ .header
2
+ %h1
3
+ <a href="/"><img src="/images/gren-icon-mini.png" alt="gren-icon" border="0"/></a>
4
+ Milkode
5
+ = create_headmenu(@path, params)
6
+
7
+ .content
8
+ = create_form(@path, params[:query], params[:shead])
9
+
10
+ .search-summary
11
+ <span class="keyword">#{topic_path(@path, params)}</span> <span class="total-entries">#{@total_records}</span>件(#{@elapsed}秒)
12
+ ~ @record_content
13
+
14
+
@@ -0,0 +1,16 @@
1
+ - @title = 'help'
2
+
3
+ .header
4
+ %h1
5
+ <a href="/"><img src="/images/gren-icon-mini.png" alt="gren-icon" border="0"/></a>
6
+ #{@title} - Milkode
7
+
8
+ .content
9
+ .sample-code
10
+ %ol
11
+ %li キーワードで検索<br>#{link('def open')}
12
+ %li1フレーズとして検索<br>#{link('"def open"')}
13
+ %li パッケージ名で絞り込み<br>#{link('def open p:gren')}
14
+ %li ファイル名や拡張子で絞り込み<br>#{link('def open f:test s:rb')}
15
+ %li 組み合わせ<br>#{link('p:gren p:tidtools s:rb f:test assert f:cli')}
16
+
@@ -0,0 +1,17 @@
1
+ %div(align="center")
2
+ .header_home
3
+ %h1 <a href="/"><img src="/images/gren-icon.png" alt="gren-icon" border="0" height="100px"/></a> Milkode <font class="version">#{@version}</font>
4
+
5
+ .content
6
+ %form(method="post" action="home")
7
+ %p
8
+ %input(name="query" type="text" size="60")
9
+ %input(type="submit" value="検索")
10
+
11
+ .footer_home
12
+ <a href="/home">#{@package_num}</a>のパッケージ<br>
13
+ <a href="/home?query=f:*">#{@file_num}</a>のファイル<br>
14
+ <a href="/help">ヘルプ</a> ,
15
+ <a href="http://milkode.ongaeshi.me">milkodeについて</a>
16
+
17
+
@@ -0,0 +1,33 @@
1
+ !!!
2
+
3
+ %html(lang='ja')
4
+ %head
5
+ %meta(charset='utf-8')
6
+ %title= [@title, 'Milkode'].compact.join(' - ')
7
+ %link(rel="stylesheet" href="/css/gren.css" type="text/css" media="all")
8
+ %link(rel="stylesheet" href="/css/coderay.css" type="text/css" media="all")
9
+
10
+ %body
11
+ -# %header
12
+ -# %h1 <a href=".">Milkode</a>
13
+
14
+ != yield
15
+
16
+ %script{:type=>"text/javascript"}
17
+ var _gaq = _gaq || [];
18
+ _gaq.push(['_setAccount', 'UA-13136329-8']);
19
+ _gaq.push(['_trackPageview']);
20
+
21
+ (function() {
22
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
23
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
24
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
25
+ })();
26
+
27
+ -# %hr
28
+
29
+ -# %footer
30
+ -# %p
31
+ -# ! Develop by <a href="./contact.html">ongaeshi</a>
32
+ -# ! Powered by <a href="http://www.ruby-lang.org/">Ruby</a> #{::RUBY_VERSION},
33
+ -# ! <a href="http://www.sinatrarb.com/">Sinatra</a> #{Sinatra::VERSION}
@@ -0,0 +1,12 @@
1
+ .header
2
+ %h1
3
+ <a href="/"><img src="/images/gren-icon-mini.png" alt="gren-icon" border="0"/></a>
4
+ Milkode
5
+ = create_headmenu(@path, params)
6
+
7
+ .content
8
+ = create_form(@path, params[:query], params[:shead])
9
+
10
+ .search-summary
11
+ <span class="keyword">#{topic_path(@path, params)}</span> <span class="total-entries">#{@total_records}</span>件中 <span class="display-range">#{@range.first} - #{@range.last}</span>件(#{@elapsed}秒)
12
+ ~ @record_content
@@ -0,0 +1,16 @@
1
+ .header
2
+ %h1
3
+ <a href="/"><img src="/images/gren-icon-mini.png" alt="gren-icon" border="0"/></a>
4
+ Milkode
5
+ = create_headmenu(@path, params)
6
+
7
+ .content
8
+ = create_form(@path, params[:query], params[:shead])
9
+
10
+ .search-summary
11
+ <span class="keyword">#{topic_path(@path, params)}</span>(#{@elapsed}秒)
12
+ ~ @record_content
13
+
14
+
15
+
16
+
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief
5
+ # @author ongaeshi
6
+ # @date 2011/03/08
7
+
8
+ require 'fileutils'
9
+
10
+ module Milkode
11
+ module Dbdir
12
+ module_function
13
+
14
+ def default_dir
15
+ if (ENV['MILKODE_DEFAULT_DIR'])
16
+ File.expand_path ENV['MILKODE_DEFAULT_DIR']
17
+ else
18
+ File.expand_path '~/.milkode'
19
+ end
20
+ end
21
+
22
+ def groonga_path(path = '.')
23
+ (Pathname.new(path) + 'db/milkode.db').to_s
24
+ end
25
+
26
+ def expand_groonga_path(path = '.')
27
+ File.expand_path groonga_path(path)
28
+ end
29
+
30
+ def yaml_path(path = '.')
31
+ (Pathname.new(path) + 'milkode.yaml').to_s
32
+ end
33
+
34
+ def dbdir?(path = '.')
35
+ FileTest.exist? yaml_path(path)
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,62 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Gren
4
+ module DisplayUtil
5
+ def time_s(time)
6
+ t = time.truncate
7
+ h = t / 3600
8
+ t = t % 3600
9
+ m = t / 60
10
+ t = t % 60
11
+ t += round(time - time.prec_i, 2)
12
+
13
+ if (h > 0 && m > 0)
14
+ "#{h}h #{m}m #{t}s"
15
+ elsif (m > 0)
16
+ "#{m}m #{t}s"
17
+ else
18
+ "#{t}sec"
19
+ end
20
+ end
21
+ module_function :time_s
22
+
23
+ def round(n, d)
24
+ (n * 10 ** d).round / 10.0 ** d
25
+ end
26
+ module_function :round
27
+
28
+ def size_s(size)
29
+ tb = 1024 ** 4
30
+ gb = 1024 ** 3
31
+ mb = 1024 ** 2
32
+ kb = 1024
33
+
34
+ if (size >= tb)
35
+ round(size / tb.prec_f, 2).to_s + "TB"
36
+ elsif (size >= gb)
37
+ round(size / gb.prec_f, 2).to_s + "GB"
38
+ elsif (size >= mb)
39
+ round(size / mb.prec_f, 2).to_s + "MB"
40
+ elsif (size >= kb)
41
+ round(size / kb.prec_f, 2).to_s + "KB"
42
+ else
43
+ size.to_s + "Byte"
44
+ end
45
+ end
46
+ module_function :size_s
47
+
48
+ def dump_methods(c)
49
+ unless c.is_a?(Class)
50
+ c = c.class
51
+ end
52
+
53
+ while (true)
54
+ p c
55
+ break if (c == Object)
56
+ puts "↓ " + c.public_instance_methods(false).inspect
57
+ c = c.superclass
58
+ end
59
+ end
60
+ module_function :dump_methods
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module GrenFileTest
4
+ IGNORE_FILE = /(\A#.*#\Z)|(~\Z)|(\A\.#)|(\.d\Z)|(\.map\Z)|(\.MAP\Z)/
5
+ IGNORE_DIR = /(\A\.svn\Z)|(\A\.git\Z)|(\ACVS\Z)/
6
+
7
+ def self.ignoreDir?(fpath)
8
+ IGNORE_DIR.match(File.basename(fpath))
9
+ end
10
+
11
+ def self.ignoreFile?(fpath)
12
+ IGNORE_FILE.match(File.basename(fpath))
13
+ end
14
+
15
+ def self.binary?(fpath)
16
+ s = File.read(fpath, 1024) or return false
17
+ return s.index("\x00")
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'milkode/common/string_snip'
4
+
5
+ class GrenSnip
6
+ MAX_LINE_SIZE = 256
7
+ HEADER_SIZE = 32
8
+ MARGIN_SIZE = 32
9
+ DELIMITER = '<<snip>>'
10
+
11
+ def self.snip(str, match_datas)
12
+ return str if (str.size <= MAX_LINE_SIZE)
13
+
14
+ ranges = []
15
+ ranges << (0..HEADER_SIZE-1)
16
+ ranges << (-HEADER_SIZE..-1)
17
+
18
+ match_datas.each do |m|
19
+ ranges << (m.begin(0)-MARGIN_SIZE..m.end(0)+MARGIN_SIZE)
20
+ end
21
+
22
+ snipper = StringSnip.new(MAX_LINE_SIZE, DELIMITER)
23
+ return snipper.snip(str, ranges)
24
+ end
25
+
26
+ def self.coloring(line, match_datas)
27
+ match_datas.each do |m|
28
+ line = line.split(m[0]).join(HighLine::ON_GREEN + m[0] + HighLine::CLEAR)
29
+ end
30
+
31
+ line = line.split(DELIMITER).join(HighLine::ON_CYAN + DELIMITER + HighLine::CLEAR)
32
+
33
+ line
34
+ end
35
+ end
36
+
37
+
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'kconv'
3
+
4
+ # LinuxやBSD等にも対応予定(その場合のエンコードって何が適切なんだろ?EUC?UTF8?)
5
+ class Platform
6
+ def self.windows_os?
7
+ RUBY_PLATFORM =~ /mswin(?!ce)|mingw|cygwin|bccwin/
8
+ end
9
+
10
+ def self.get_shell_kcode
11
+ if windows_os?
12
+ Kconv::SJIS
13
+ else
14
+ Kconv::UTF8
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,61 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ class StringSnip
4
+ def initialize(size = 256, delimiter = '<<snip>>', pri = nil)
5
+ @size = size
6
+ @delimiter = delimiter
7
+ @pri = pri
8
+ end
9
+
10
+ def snip(str, ranges)
11
+ @str = str
12
+ @ranges = ranges
13
+
14
+ # no snip
15
+ return @str if (@str.size <= @size)
16
+
17
+ # snip
18
+ @ranges = StringSnip::ranges_conv(@ranges, @str)
19
+ @ranges = StringSnip::ranges_sort(@ranges)
20
+ @ranges = StringSnip::ranges_compound(@ranges)
21
+
22
+ # result
23
+ results = []
24
+ @ranges.each {|r| results << @str[r] }
25
+ return results.join(@delimiter)
26
+ end
27
+
28
+ def self.ranges_conv(ranges, str)
29
+ ranges.map {|i| index_conv(str, i.begin)..index_conv(str, i.end)}
30
+ end
31
+
32
+ def self.index_conv(str, value)
33
+ if (value < 0)
34
+ str.size + value
35
+ else
36
+ value
37
+ end
38
+ end
39
+
40
+ def self.ranges_sort(ranges)
41
+ ranges.sort_by{|i| i.begin}
42
+ end
43
+
44
+ def self.ranges_compound(ranges)
45
+ result = []
46
+
47
+ index = 0
48
+ while (ranges.size > 0)
49
+ if (ranges.size > 1 && ranges[0].end + 1 >= ranges[1].begin)
50
+ v1, v2 = ranges.shift(2)
51
+ ranges.unshift v1.begin..((v1.end > v2.end) ? v1.end : v2.end)
52
+ else
53
+ result << ranges.shift
54
+ end
55
+ end
56
+
57
+ result
58
+ end
59
+ end
60
+
61
+
@@ -0,0 +1,144 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'archive/zip'
5
+ require 'fileutils'
6
+
7
+ module Milkode
8
+ module Util
9
+ module_function
10
+
11
+ class ZipfileNotFound < RuntimeError ; end
12
+
13
+ # zipファイルを展開し、展開フォルダ名を返す
14
+ # ファイルが見つからなかった時はnilを返す
15
+ def zip_extract(filename, dst_dir)
16
+ raise ZipfileNotFound unless File.exist?(filename)
17
+
18
+ root_list = root_entrylist(filename)
19
+
20
+ if (root_list.size == 1)
21
+ # そのまま展開
22
+ Archive::Zip.extract filename, dst_dir
23
+ return root_list[0].gsub("/", "")
24
+ else
25
+ # ディレクトリを作ってその先で展開
26
+ dir = File.basename(filename).sub(/#{File.extname(filename)}$/, "")
27
+ FileUtils.mkdir_p File.join(dst_dir, dir)
28
+ Archive::Zip.extract filename, File.join(dst_dir, dir)
29
+ return dir
30
+ end
31
+ end
32
+
33
+ def root_entrylist(filename)
34
+ list = []
35
+
36
+ Archive::Zip.open(filename) do |archive|
37
+ archive.each do |entry|
38
+ list << entry.zip_path if entry.zip_path.split('/').size == 1
39
+ end
40
+ end
41
+
42
+ list
43
+ end
44
+ end
45
+ end
46
+
47
+ # -- 将来的には Milkode に統一 ---
48
+
49
+ module Gren
50
+ module Util
51
+ # アルファベットと演算子で表示する数を変える
52
+ ALPHABET_DISP_NUM = 5
53
+ OPERATOR_DISP_NUM = 10
54
+
55
+ def time_s(time)
56
+ t = time.truncate
57
+ h = t / 3600
58
+ t = t % 3600
59
+ m = t / 60
60
+ t = t % 60
61
+ t += round(time - time.prec_i, 2)
62
+
63
+ if (h > 0 && m > 0)
64
+ "#{h}h #{m}m #{t}s"
65
+ elsif (m > 0)
66
+ "#{m}m #{t}s"
67
+ else
68
+ "#{t}sec"
69
+ end
70
+ end
71
+ module_function :time_s
72
+
73
+ def round(n, d)
74
+ (n * 10 ** d).round / 10.0 ** d
75
+ end
76
+ module_function :round
77
+
78
+ def size_s(size)
79
+ tb = 1024 ** 4
80
+ gb = 1024 ** 3
81
+ mb = 1024 ** 2
82
+ kb = 1024
83
+
84
+ if (size >= tb)
85
+ round(size / tb.prec_f, 2).to_s + "TB"
86
+ elsif (size >= gb)
87
+ round(size / gb.prec_f, 2).to_s + "GB"
88
+ elsif (size >= mb)
89
+ round(size / mb.prec_f, 2).to_s + "MB"
90
+ elsif (size >= kb)
91
+ round(size / kb.prec_f, 2).to_s + "KB"
92
+ else
93
+ size.to_s + "Byte"
94
+ end
95
+ end
96
+ module_function :size_s
97
+
98
+ def p_classtree(c)
99
+ unless c.is_a?(Class)
100
+ c = c.class
101
+ end
102
+
103
+ while (true)
104
+ puts c.name
105
+ break if (c == Object)
106
+ p_classtree_sub(c)
107
+ c = c.superclass
108
+ end
109
+ end
110
+ module_function :p_classtree
111
+
112
+ def p_classtree_sub(c)
113
+ # メソッドの一覧を得る
114
+ group = c.public_instance_methods(false).sort.partition { |m| m =~ /\w/ }
115
+ array = group.flatten
116
+ operator_start_index = group[0].size
117
+ limit = ALPHABET_DISP_NUM
118
+
119
+ print((array.size > limit) ? "| " : "↓ ")
120
+
121
+ counter = 0
122
+ array.each_with_index do |v, index|
123
+ if (index == operator_start_index)
124
+ limit = OPERATOR_DISP_NUM
125
+ counter = 0
126
+ puts
127
+ print((array.size - index > limit) ? "| " : "↓ ")
128
+ end
129
+
130
+ if (counter >= limit)
131
+ counter = 0
132
+ puts
133
+ print((array.size - index > limit) ? "| " : "↓ ")
134
+ end
135
+
136
+ print v + ", "
137
+ counter += 1
138
+ end
139
+ puts
140
+ end
141
+ module_function :p_classtree_sub
142
+
143
+ end
144
+ end