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,68 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief grenwebで使用する行指向の検索
5
+ # @author ongaeshi
6
+ # @date 2010/10/18
7
+
8
+ module Milkode
9
+ class Grep
10
+ def initialize(content)
11
+ @content = content
12
+ end
13
+
14
+ MatchLineResult = Struct.new(:index, :match_datas)
15
+
16
+ def match_lines_and(patterns)
17
+ result = []
18
+ patternRegexps = strs2regs(patterns, true)
19
+ index = 0
20
+
21
+ @content.each_line do |line|
22
+ match_datas = []
23
+ patternRegexps.each {|v| match_datas << v.match(line)}
24
+
25
+ if (match_datas.all?)
26
+ result << MatchLineResult.new(index, match_datas)
27
+ end
28
+
29
+ index += 1
30
+ end
31
+
32
+ result
33
+ end
34
+
35
+ def one_match_and(patterns)
36
+ patternRegexps = strs2regs(patterns, true)
37
+ index = 0
38
+
39
+ @content.each_line do |line|
40
+ match_datas = []
41
+ patternRegexps.each {|v| match_datas << v.match(line)}
42
+
43
+ if (match_datas.all?)
44
+ return MatchLineResult.new(index, match_datas)
45
+ end
46
+
47
+ index += 1
48
+ end
49
+
50
+ nil
51
+ end
52
+
53
+ private
54
+
55
+ def strs2regs(strs, ignore = false)
56
+ regs = []
57
+
58
+ strs.each do |v|
59
+ option = 0
60
+ option |= Regexp::IGNORECASE if (ignore)
61
+ regs << Regexp.new(v, option)
62
+ end
63
+
64
+ regs
65
+ end
66
+ end
67
+ end
68
+
@@ -0,0 +1,56 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief
5
+ # @author ongaeshi
6
+ # @date 2011/07/13
7
+
8
+ require 'rubygems'
9
+ require 'rack'
10
+ include Rack::Utils
11
+
12
+ module Milkode
13
+ class Mkurl
14
+ def initialize(path, params)
15
+ @path = escape_path(path)
16
+ @params = params
17
+ end
18
+
19
+ def inherit_query_shead_offset
20
+ create_url(query_param(true, true, true))
21
+ end
22
+
23
+ def inherit_query_shead
24
+ create_url(query_param(true, true, false))
25
+ end
26
+
27
+ def inherit_shead
28
+ create_url(query_param(false, true, false))
29
+ end
30
+
31
+ private
32
+
33
+ def escape_path(src)
34
+ escape(src).gsub("%2F", '/')
35
+ end
36
+
37
+ def create_url(qp)
38
+ if (qp == "")
39
+ @path
40
+ else
41
+ "#{@path}?#{qp}"
42
+ end
43
+ end
44
+
45
+ def query_param(query_inherit, shead_inherit, offset_inherit)
46
+ qparam = []
47
+ qparam << "query=#{escape(@params[:query])}" if (query_inherit and @params[:query])
48
+ qparam << "shead=#{escape(@params[:shead])}" if (shead_inherit and @params[:shead])
49
+ qparam << "offset=#{escape(@params[:offset])}" if (offset_inherit and @params[:offset])
50
+ qparam.join('&')
51
+ end
52
+ end
53
+ end
54
+
55
+
56
+
@@ -0,0 +1,81 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief クエリーの解析
5
+ # @author ongaeshi
6
+ # @date 2010/10/21
7
+
8
+ require 'rubygems'
9
+ require 'rack'
10
+
11
+ module Milkode
12
+ class Query
13
+ attr_reader :query_string
14
+
15
+ OPTIONS = [
16
+ ['package', 'p'],
17
+ ['filepath', 'fpath', 'f'],
18
+ ['suffix', 's'],
19
+ ]
20
+
21
+ def initialize(str)
22
+ @query_string = str
23
+ init_hash
24
+ parse
25
+ end
26
+
27
+ def escape_html
28
+ Rack::Utils::escape_html(@query_string)
29
+ end
30
+
31
+ def empty?
32
+ keywords.size == 0 && packages.size == 0 && fpaths.size == 0 && suffixs.size == 0
33
+ end
34
+
35
+ def keywords
36
+ @hash['keywords']
37
+ end
38
+
39
+ def packages
40
+ calc_param(0)
41
+ end
42
+
43
+ def fpaths
44
+ calc_param(1)
45
+ end
46
+
47
+ def suffixs
48
+ calc_param(2)
49
+ end
50
+
51
+ private
52
+
53
+ def calc_param(index)
54
+ OPTIONS[index].inject([]){|result, item| result.concat @hash[item] }
55
+ end
56
+
57
+ def init_hash
58
+ @hash = {}
59
+ @hash['keywords'] = []
60
+
61
+ OPTIONS.flatten.each do |key|
62
+ @hash[key] = []
63
+ end
64
+ end
65
+
66
+ def parse
67
+ kp = OPTIONS.flatten.join('|')
68
+ parts = @query_string.scan(/(?:(#{kp}):)?(?:"(.+)"|(\S+))/)
69
+
70
+ parts.each do |key, quoted_value, value|
71
+ text = quoted_value || value
72
+ unless (key)
73
+ @hash['keywords'] << text
74
+ else
75
+ @hash[key] << text
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+
@@ -0,0 +1,117 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief
5
+ # @author ongaeshi
6
+ # @date 2011/07/18
7
+
8
+ require 'milkode/cdweb/lib/query'
9
+ require 'milkode/cdweb/lib/grep'
10
+ require 'milkode/cdweb/lib/mkurl'
11
+
12
+ module Milkode
13
+ class SearchContents
14
+ attr_reader :total_records
15
+ attr_reader :elapsed
16
+ attr_reader :page
17
+
18
+ DISP_NUM = 20 # 1ページの表示数
19
+ LIMIT_NUM = 50 # 最大検索ファイル数
20
+ NTH = 3 # 表示範囲
21
+
22
+ def initialize(path, params, query)
23
+ @params = params
24
+ @q = query
25
+ @page = params[:page].to_i || 0
26
+ @offset = params[:offset].to_i
27
+ fpaths = @q.fpaths
28
+ fpaths << path unless path == ""
29
+ @records, @total_records, @elapsed = Database.instance.search(@q.keywords, @q.packages, fpaths, @q.suffixs, @offset, LIMIT_NUM)
30
+ grep_contents
31
+ end
32
+
33
+ def query
34
+ @q.query_string
35
+ end
36
+
37
+ def next_offset
38
+ @offset + @next_index
39
+ end
40
+
41
+ def data_range
42
+ @offset..(next_offset - 1)
43
+ end
44
+
45
+ def html_contents
46
+ @match_records.map {|match_record| result_match_record(match_record)}.join
47
+ end
48
+
49
+ def html_pagination
50
+ return "" if @q.empty?
51
+ return "" if next_offset >= @total_records
52
+
53
+ return <<EOF
54
+ <div class='pagination'>
55
+ #{pagination_link(next_offset, "next >>")}
56
+ </div>
57
+ EOF
58
+ end
59
+
60
+ private
61
+
62
+ MatchRecord = Struct.new(:record, :match_line)
63
+
64
+ def grep_contents
65
+ @match_records = []
66
+ @next_index = @records.size
67
+
68
+ @records.each_with_index do |record, index|
69
+ grep = Grep.new(record.content)
70
+ match_line = grep.one_match_and(@q.keywords)
71
+ @match_records << MatchRecord.new(record, match_line) if match_line
72
+
73
+ if @match_records.size > DISP_NUM
74
+ @next_index = index + 1
75
+ break
76
+ end
77
+ end
78
+ end
79
+
80
+ def result_match_record(match_record)
81
+ record = match_record.record
82
+ match_line = match_record.match_line
83
+
84
+ first_index = match_line.index - NTH
85
+ last_index = match_line.index + NTH
86
+
87
+ coderay = CodeRayWrapper.new(record.content, record.shortpath, [match_line])
88
+ coderay.set_range(first_index..last_index)
89
+
90
+ <<EOS
91
+ <dt class='result-record'><a href='#{"/home/" + record_link(record) + "##{coderay.line_number_start}"}'>#{record.shortpath}</a></dt>
92
+ <dd>
93
+ #{coderay.to_html}
94
+ </dd>
95
+ EOS
96
+ end
97
+
98
+ def pagination_link(offset, label)
99
+ tmpp = @params
100
+ tmpp[:offset] = offset.to_s
101
+ href = Mkurl.new("", tmpp).inherit_query_shead_offset
102
+ pagination_span("<a href='#{href}'>#{label}</a>")
103
+ end
104
+
105
+ def pagination_span(content)
106
+ "<span class='pagination-link'>#{content}</span>\n"
107
+ end
108
+
109
+ def record_link(record) #
110
+ Mkurl.new(record.shortpath, @params).inherit_query_shead
111
+ end
112
+
113
+ end
114
+ end
115
+
116
+
117
+
@@ -0,0 +1,88 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # @file
4
+ # @brief
5
+ # @author ongaeshi
6
+ # @date 2011/07/18
7
+
8
+ require 'milkode/cdweb/lib/query'
9
+ require 'milkode/cdweb/lib/mkurl'
10
+ require 'milkode/cdweb/lib/command'
11
+
12
+ module Milkode
13
+ class SearchFiles
14
+ attr_reader :total_records
15
+
16
+ DISP_NUM = 100 # 1ページの表示数
17
+
18
+ def initialize(path, params, query)
19
+ @params = params
20
+ @q = query
21
+
22
+ @offset = params[:offset].to_i
23
+
24
+ fpaths = @q.fpaths
25
+ fpaths << path unless path == ""
26
+
27
+ if (fpaths.include?("*"))
28
+ @records, @total_records = Database.instance.selectAll(@offset, DISP_NUM)
29
+ else
30
+ @records, @total_records = Database.instance.search(@q.keywords, @q.packages, fpaths, @q.suffixs, @offset, DISP_NUM)
31
+ end
32
+ end
33
+
34
+ def query
35
+ @q.query_string
36
+ end
37
+
38
+ def next_offset
39
+ @offset + @records.size
40
+ end
41
+
42
+ def data_range
43
+ @offset..(next_offset - 1)
44
+ end
45
+
46
+ def html_contents
47
+ @records.map {|record| result_record(record)}.join
48
+ end
49
+
50
+ def html_pagination
51
+ return "" if @q.empty?
52
+ return "" if next_offset >= @total_records
53
+
54
+ return <<EOF
55
+ <div class='pagination'>
56
+ #{pagination_link(next_offset, "next >>")}
57
+ </div>
58
+ EOF
59
+ end
60
+
61
+ private
62
+
63
+ def pagination_link(offset, label)
64
+ tmpp = @params
65
+ tmpp[:offset] = offset.to_s
66
+ href = Mkurl.new("", tmpp).inherit_query_shead_offset
67
+ pagination_span("<a href='#{href}'>#{label}</a>")
68
+ end
69
+
70
+ def pagination_span(content)
71
+ "<span class='pagination-link'>#{content}</span>\n"
72
+ end
73
+
74
+ def result_record(record)
75
+ <<EOS
76
+ <dt class='result-file'>#{file_or_dirimg(true)}<a href='#{"/home/" + record_link(record)}'>#{record.shortpath}</a></dt>
77
+ EOS
78
+ end
79
+
80
+ def record_link(record)
81
+ Mkurl.new(record.shortpath, @params).inherit_query_shead
82
+ end
83
+
84
+ end
85
+ end
86
+
87
+
88
+
@@ -0,0 +1,131 @@
1
+ .CodeRay {
2
+ background-color: #f8f8f8;
3
+ border: 1px solid silver;
4
+ font-family: 'Courier New', 'Terminal', monospace;
5
+ color: #000;
6
+ }
7
+ .CodeRay pre { margin: 0px }
8
+
9
+ div.CodeRay { }
10
+
11
+ span.CodeRay { white-space: pre; border: 0px; padding: 2px }
12
+
13
+ table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }
14
+ table.CodeRay td { padding: 2px 4px; vertical-align: top }
15
+
16
+ .CodeRay .line_numbers, .CodeRay .no {
17
+ background-color: #def;
18
+ color: gray;
19
+ text-align: right;
20
+ }
21
+ .CodeRay .line_numbers tt { font-weight: bold }
22
+ .CodeRay .line_numbers .highlighted { color: red }
23
+ .CodeRay .line { display: block; float: left; width: 100%; }
24
+ .CodeRay .no { padding: 0px 4px }
25
+ .CodeRay .code { width: 100% }
26
+
27
+ ol.CodeRay { font-size: 10pt }
28
+ ol.CodeRay li { white-space: pre }
29
+
30
+ .CodeRay .code pre { overflow: auto }
31
+
32
+ .CodeRay .debug { color:white ! important; background:blue ! important; }
33
+
34
+ .CodeRay .af { color:#00C }
35
+ .CodeRay .an { color:#007 }
36
+ .CodeRay .at { color:#f08 }
37
+ .CodeRay .av { color:#700 }
38
+ .CodeRay .aw { color:#C00 }
39
+ .CodeRay .bi { color:#509; font-weight:bold }
40
+ .CodeRay .c { color:#888; }
41
+
42
+ .CodeRay .ch { color:#04D }
43
+ .CodeRay .ch .k { color:#04D }
44
+ .CodeRay .ch .dl { color:#039 }
45
+
46
+ .CodeRay .cl { color:#B06; font-weight:bold }
47
+ .CodeRay .cm { color:#A08; font-weight:bold }
48
+ .CodeRay .co { color:#036; font-weight:bold }
49
+ .CodeRay .cr { color:#0A0 }
50
+ .CodeRay .cv { color:#369 }
51
+ .CodeRay .de { color:#B0B; }
52
+ .CodeRay .df { color:#099; font-weight:bold }
53
+ .CodeRay .di { color:#088; font-weight:bold }
54
+ .CodeRay .dl { color:black }
55
+ .CodeRay .do { color:#970 }
56
+ .CodeRay .dt { color:#34b }
57
+ .CodeRay .ds { color:#D42; font-weight:bold }
58
+ .CodeRay .e { color:#666; font-weight:bold }
59
+ .CodeRay .en { color:#800; font-weight:bold }
60
+ .CodeRay .er { color:#F00; background-color:#FAA }
61
+ .CodeRay .ex { color:#C00; font-weight:bold }
62
+ .CodeRay .fl { color:#60E; font-weight:bold }
63
+ .CodeRay .fu { color:#06B; font-weight:bold }
64
+ .CodeRay .gv { color:#d70; font-weight:bold }
65
+ .CodeRay .hx { color:#058; font-weight:bold }
66
+ .CodeRay .i { color:#00D; font-weight:bold }
67
+ .CodeRay .ic { color:#B44; font-weight:bold }
68
+
69
+ .CodeRay .il { background: #ddd; color: black }
70
+ .CodeRay .il .il { background: #ccc }
71
+ .CodeRay .il .il .il { background: #bbb }
72
+ .CodeRay .il .idl { background: #ddd; font-weight: bold; color: #666 }
73
+ .CodeRay .idl { background-color: #bbb; font-weight: bold; color: #666; }
74
+
75
+ .CodeRay .im { color:#f00; }
76
+ .CodeRay .in { color:#B2B; font-weight:bold }
77
+ .CodeRay .iv { color:#33B }
78
+ .CodeRay .la { color:#970; font-weight:bold }
79
+ .CodeRay .lv { color:#963 }
80
+ .CodeRay .oc { color:#40E; font-weight:bold }
81
+ .CodeRay .of { color:#000; font-weight:bold }
82
+ .CodeRay .op { }
83
+ .CodeRay .pc { color:#038; font-weight:bold }
84
+ .CodeRay .pd { color:#369; font-weight:bold }
85
+ .CodeRay .pp { color:#579; }
86
+ .CodeRay .ps { color:#00C; font-weight:bold }
87
+ .CodeRay .pt { color:#074; font-weight:bold }
88
+ .CodeRay .r, .kw { color:#080; font-weight:bold }
89
+
90
+ .CodeRay .ke { color: #808; }
91
+ .CodeRay .ke .dl { color: #606; }
92
+ .CodeRay .ke .ch { color: #80f; }
93
+ .CodeRay .vl { color: #088; }
94
+
95
+ .CodeRay .rx { background-color:#fff0ff }
96
+ .CodeRay .rx .k { color:#808 }
97
+ .CodeRay .rx .dl { color:#404 }
98
+ .CodeRay .rx .mod { color:#C2C }
99
+ .CodeRay .rx .fu { color:#404; font-weight: bold }
100
+
101
+ .CodeRay .s { background-color:#fff0f0; color: #D20; }
102
+ .CodeRay .s .s { background-color:#ffe0e0 }
103
+ .CodeRay .s .s .s { background-color:#ffd0d0 }
104
+ .CodeRay .s .k { }
105
+ .CodeRay .s .ch { color: #b0b; }
106
+ .CodeRay .s .dl { color: #710; }
107
+
108
+ .CodeRay .sh { background-color:#f0fff0; color:#2B2 }
109
+ .CodeRay .sh .k { }
110
+ .CodeRay .sh .dl { color:#161 }
111
+
112
+ .CodeRay .sy { color:#A60 }
113
+ .CodeRay .sy .k { color:#A60 }
114
+ .CodeRay .sy .dl { color:#630 }
115
+
116
+ .CodeRay .ta { color:#070 }
117
+ .CodeRay .tf { color:#070; font-weight:bold }
118
+ .CodeRay .ts { color:#D70; font-weight:bold }
119
+ .CodeRay .ty { color:#339; font-weight:bold }
120
+ .CodeRay .v { color:#036 }
121
+ .CodeRay .xt { color:#444 }
122
+
123
+ .CodeRay .ins { background: #afa; }
124
+ .CodeRay .del { background: #faa; }
125
+ .CodeRay .chg { color: #aaf; background: #007; }
126
+ .CodeRay .head { color: #f8f; background: #505 }
127
+
128
+ .CodeRay .ins .ins { color: #080; font-weight:bold }
129
+ .CodeRay .del .del { color: #800; font-weight:bold }
130
+ .CodeRay .chg .chg { color: #66f; }
131
+ .CodeRay .head .head { color: #f4f; }