codestock 0.1.2 → 0.1.3
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/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/cdweb +2 -2
- data/codestock.gemspec +56 -10
- data/lib/cdstk/cdstk.rb +4 -1
- data/lib/codestock/cdweb/app.rb +136 -0
- data/lib/codestock/cdweb/cli_cdweb.rb +84 -0
- data/lib/codestock/cdweb/config.ru +3 -0
- data/lib/codestock/cdweb/lib/coderay_wrapper.rb +94 -0
- data/lib/codestock/cdweb/lib/command.rb +67 -0
- data/lib/{cdweb → codestock/cdweb/lib}/database.rb +55 -28
- data/lib/{cdweb → codestock/cdweb/lib}/grep.rb +24 -8
- data/lib/codestock/cdweb/lib/mkurl.rb +56 -0
- data/lib/{cdweb → codestock/cdweb/lib}/query.rb +3 -4
- data/lib/codestock/cdweb/lib/search_contents.rb +117 -0
- data/lib/codestock/cdweb/lib/search_files.rb +88 -0
- data/lib/{cdweb → codestock/cdweb}/public/css/gren.css +16 -1
- data/lib/codestock/cdweb/public/images/directory.png +0 -0
- data/lib/codestock/cdweb/public/images/file.png +0 -0
- data/lib/codestock/cdweb/views/filelist.haml +14 -0
- data/lib/codestock/cdweb/views/help.haml +16 -0
- data/lib/codestock/cdweb/views/index.haml +17 -0
- data/lib/codestock/cdweb/views/layout.haml +33 -0
- data/lib/codestock/cdweb/views/search.haml +12 -0
- data/lib/codestock/cdweb/views/view.haml +16 -0
- data/test/file_assert.rb +41 -0
- data/test/test_coderay_wrapper.rb +22 -0
- data/test/test_coderay_wrapper_data.rb +91 -0
- data/test/test_database.rb +54 -0
- data/test/test_mkurl.rb +30 -0
- data/test/test_query.rb +54 -0
- metadata +52 -26
- data/lib/cdweb/cli_cdweb.rb +0 -54
- data/lib/cdweb/coderay_wrapper.rb +0 -38
- data/lib/cdweb/grenweb.ru +0 -35
- data/lib/cdweb/help.rb +0 -40
- data/lib/cdweb/home.rb +0 -40
- data/lib/cdweb/html_renderer.rb +0 -243
- data/lib/cdweb/searcher.rb +0 -130
- data/lib/cdweb/viewer.rb +0 -52
- data/test/test_grenweb_database.rb +0 -36
- data/test/test_grenweb_html_renderer.rb +0 -41
- data/test/test_grenweb_query.rb +0 -54
- data/test/test_grenweb_searcher.rb +0 -35
- /data/lib/{cdweb → codestock/cdweb}/public/css/coderay.css +0 -0
- /data/lib/{cdweb → codestock/cdweb}/public/images/gren-icon-mini.png +0 -0
- /data/lib/{cdweb → codestock/cdweb}/public/images/gren-icon.png +0 -0
data/Rakefile
CHANGED
@@ -27,6 +27,7 @@ Jeweler::Tasks.new do |gem|
|
|
27
27
|
gem.add_runtime_dependency 'rack','>=1.2.1'
|
28
28
|
gem.add_runtime_dependency 'launchy', '>=0.3.7'
|
29
29
|
gem.add_runtime_dependency 'coderay', '>=0.9.8'
|
30
|
+
gem.add_runtime_dependency 'thin', '>=1.2.10'
|
30
31
|
|
31
32
|
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
32
33
|
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/bin/cdweb
CHANGED
data/codestock.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{codestock}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["ongaeshi"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-07-20}
|
13
13
|
s.description = %q{longer description of your gem}
|
14
14
|
s.email = %q{ongaeshi0621@gmail.com}
|
15
15
|
s.executables = ["cdweb", "cdv", "cdstk", "cdview"]
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
".document",
|
22
22
|
"Gemfile",
|
23
23
|
"Gemfile.lock",
|
24
|
+
"HISTORY.rdoc",
|
24
25
|
"LICENSE.txt",
|
25
26
|
"README.rdoc",
|
26
27
|
"Rakefile",
|
@@ -30,7 +31,34 @@ Gem::Specification.new do |s|
|
|
30
31
|
"bin/cdview",
|
31
32
|
"bin/cdweb",
|
32
33
|
"codestock.gemspec",
|
34
|
+
"lib/cdstk/cdstk.rb",
|
35
|
+
"lib/cdstk/cdstk_yaml.rb",
|
36
|
+
"lib/cdstk/cli_cdstk.rb",
|
37
|
+
"lib/cdview/cli_cdview.rb",
|
33
38
|
"lib/codestock.rb",
|
39
|
+
"lib/codestock/cdweb/app.rb",
|
40
|
+
"lib/codestock/cdweb/cli_cdweb.rb",
|
41
|
+
"lib/codestock/cdweb/config.ru",
|
42
|
+
"lib/codestock/cdweb/lib/coderay_wrapper.rb",
|
43
|
+
"lib/codestock/cdweb/lib/command.rb",
|
44
|
+
"lib/codestock/cdweb/lib/database.rb",
|
45
|
+
"lib/codestock/cdweb/lib/grep.rb",
|
46
|
+
"lib/codestock/cdweb/lib/mkurl.rb",
|
47
|
+
"lib/codestock/cdweb/lib/query.rb",
|
48
|
+
"lib/codestock/cdweb/lib/search_contents.rb",
|
49
|
+
"lib/codestock/cdweb/lib/search_files.rb",
|
50
|
+
"lib/codestock/cdweb/public/css/coderay.css",
|
51
|
+
"lib/codestock/cdweb/public/css/gren.css",
|
52
|
+
"lib/codestock/cdweb/public/images/directory.png",
|
53
|
+
"lib/codestock/cdweb/public/images/file.png",
|
54
|
+
"lib/codestock/cdweb/public/images/gren-icon-mini.png",
|
55
|
+
"lib/codestock/cdweb/public/images/gren-icon.png",
|
56
|
+
"lib/codestock/cdweb/views/filelist.haml",
|
57
|
+
"lib/codestock/cdweb/views/help.haml",
|
58
|
+
"lib/codestock/cdweb/views/index.haml",
|
59
|
+
"lib/codestock/cdweb/views/layout.haml",
|
60
|
+
"lib/codestock/cdweb/views/search.haml",
|
61
|
+
"lib/codestock/cdweb/views/view.haml",
|
34
62
|
"lib/common/dbdir.rb",
|
35
63
|
"lib/common/display_util.rb",
|
36
64
|
"lib/common/grenfiletest.rb",
|
@@ -40,15 +68,21 @@ Gem::Specification.new do |s|
|
|
40
68
|
"lib/common/util.rb",
|
41
69
|
"lib/findgrep/findgrep.rb",
|
42
70
|
"lib/findgrep/result.rb",
|
71
|
+
"test/file_assert.rb",
|
43
72
|
"test/file_test_utils.rb",
|
73
|
+
"test/rake_test_loader.rb",
|
44
74
|
"test/runner.rb",
|
75
|
+
"test/test_bin_exec.rb",
|
76
|
+
"test/test_cdstk.rb",
|
77
|
+
"test/test_cdstk_yaml.rb",
|
78
|
+
"test/test_coderay_wrapper.rb",
|
79
|
+
"test/test_coderay_wrapper_data.rb",
|
80
|
+
"test/test_database.rb",
|
45
81
|
"test/test_dbdir.rb",
|
46
82
|
"test/test_gren_util.rb",
|
47
|
-
"test/test_grenweb_database.rb",
|
48
|
-
"test/test_grenweb_html_renderer.rb",
|
49
|
-
"test/test_grenweb_query.rb",
|
50
|
-
"test/test_grenweb_searcher.rb",
|
51
83
|
"test/test_helper.rb",
|
84
|
+
"test/test_mkurl.rb",
|
85
|
+
"test/test_query.rb",
|
52
86
|
"test/test_string_snip.rb"
|
53
87
|
]
|
54
88
|
s.homepage = %q{http://github.com/ongaeshi/codestock}
|
@@ -57,15 +91,21 @@ Gem::Specification.new do |s|
|
|
57
91
|
s.rubygems_version = %q{1.3.6}
|
58
92
|
s.summary = %q{one-line summary of your gem}
|
59
93
|
s.test_files = [
|
94
|
+
"test/file_assert.rb",
|
60
95
|
"test/file_test_utils.rb",
|
96
|
+
"test/rake_test_loader.rb",
|
61
97
|
"test/runner.rb",
|
98
|
+
"test/test_bin_exec.rb",
|
99
|
+
"test/test_cdstk.rb",
|
100
|
+
"test/test_cdstk_yaml.rb",
|
101
|
+
"test/test_coderay_wrapper.rb",
|
102
|
+
"test/test_coderay_wrapper_data.rb",
|
103
|
+
"test/test_database.rb",
|
62
104
|
"test/test_dbdir.rb",
|
63
105
|
"test/test_gren_util.rb",
|
64
|
-
"test/test_grenweb_database.rb",
|
65
|
-
"test/test_grenweb_html_renderer.rb",
|
66
|
-
"test/test_grenweb_query.rb",
|
67
|
-
"test/test_grenweb_searcher.rb",
|
68
106
|
"test/test_helper.rb",
|
107
|
+
"test/test_mkurl.rb",
|
108
|
+
"test/test_query.rb",
|
69
109
|
"test/test_string_snip.rb"
|
70
110
|
]
|
71
111
|
|
@@ -81,6 +121,8 @@ Gem::Specification.new do |s|
|
|
81
121
|
s.add_runtime_dependency(%q<rroonga>, [">= 1.0.0"])
|
82
122
|
s.add_runtime_dependency(%q<rack>, [">= 1.2.1"])
|
83
123
|
s.add_runtime_dependency(%q<launchy>, [">= 0.3.7"])
|
124
|
+
s.add_runtime_dependency(%q<coderay>, [">= 0.9.8"])
|
125
|
+
s.add_runtime_dependency(%q<thin>, [">= 1.2.10"])
|
84
126
|
else
|
85
127
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
86
128
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -89,6 +131,8 @@ Gem::Specification.new do |s|
|
|
89
131
|
s.add_dependency(%q<rroonga>, [">= 1.0.0"])
|
90
132
|
s.add_dependency(%q<rack>, [">= 1.2.1"])
|
91
133
|
s.add_dependency(%q<launchy>, [">= 0.3.7"])
|
134
|
+
s.add_dependency(%q<coderay>, [">= 0.9.8"])
|
135
|
+
s.add_dependency(%q<thin>, [">= 1.2.10"])
|
92
136
|
end
|
93
137
|
else
|
94
138
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -98,6 +142,8 @@ Gem::Specification.new do |s|
|
|
98
142
|
s.add_dependency(%q<rroonga>, [">= 1.0.0"])
|
99
143
|
s.add_dependency(%q<rack>, [">= 1.2.1"])
|
100
144
|
s.add_dependency(%q<launchy>, [">= 0.3.7"])
|
145
|
+
s.add_dependency(%q<coderay>, [">= 0.9.8"])
|
146
|
+
s.add_dependency(%q<thin>, [">= 1.2.10"])
|
101
147
|
end
|
102
148
|
end
|
103
149
|
|
data/lib/cdstk/cdstk.rb
CHANGED
@@ -10,6 +10,7 @@ require 'cdstk/cdstk_yaml'
|
|
10
10
|
require 'common/grenfiletest'
|
11
11
|
require 'common/util'
|
12
12
|
include CodeStock
|
13
|
+
require 'kconv'
|
13
14
|
|
14
15
|
module CodeStock
|
15
16
|
class Cdstk
|
@@ -240,7 +241,9 @@ module CodeStock
|
|
240
241
|
# タイムスタンプが新しければデータベースに格納
|
241
242
|
if (document[:timestamp] < values[:timestamp])
|
242
243
|
# 実際に使うタイミングでファイルの内容を読み込み
|
243
|
-
values[:content] = open(filename).read
|
244
|
+
# values[:content] = open(filename).read
|
245
|
+
# データベース内の文字コードは'utf-8'で統一
|
246
|
+
values[:content] = File.read(filename).kconv(Kconv::UTF8)
|
244
247
|
|
245
248
|
# データベースに格納
|
246
249
|
values.each do |key, value|
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2011/06/25
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'sinatra'
|
10
|
+
require 'haml'
|
11
|
+
require 'sass'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift '../..'
|
14
|
+
require 'codestock/cdweb/lib/database'
|
15
|
+
require 'codestock/cdweb/lib/command'
|
16
|
+
require 'codestock/cdweb/lib/mkurl'
|
17
|
+
|
18
|
+
set :haml, :format => :html5
|
19
|
+
|
20
|
+
get '/' do
|
21
|
+
@version = '0.1.2'
|
22
|
+
@package_num = Database.instance.fileList('').size
|
23
|
+
@file_num = Database.instance.fileNum
|
24
|
+
haml :index
|
25
|
+
end
|
26
|
+
|
27
|
+
post '/home*' do |path|
|
28
|
+
path = path.sub(/^\//, "")
|
29
|
+
|
30
|
+
case params[:shead]
|
31
|
+
when 'all'
|
32
|
+
path = ""
|
33
|
+
when 'package'
|
34
|
+
path = path.split('/')[0]
|
35
|
+
end
|
36
|
+
|
37
|
+
redirect Mkurl.new("home/#{path}", params).inherit_query_shead
|
38
|
+
end
|
39
|
+
|
40
|
+
get '/home*' do |path|
|
41
|
+
before = Time.now
|
42
|
+
path = path.sub(/^\//, "")
|
43
|
+
record = Database.instance.record(path)
|
44
|
+
|
45
|
+
if (record)
|
46
|
+
view(record, params, before)
|
47
|
+
else
|
48
|
+
unless (params[:query])
|
49
|
+
filelist(path, params, before)
|
50
|
+
else
|
51
|
+
search(path, params, before)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
get %r{/help} do
|
57
|
+
haml :help
|
58
|
+
end
|
59
|
+
|
60
|
+
# -- helper function --
|
61
|
+
|
62
|
+
helpers do
|
63
|
+
# -- escape functions --
|
64
|
+
alias h escape_html
|
65
|
+
alias escape_url escape
|
66
|
+
|
67
|
+
def escape_path(src)
|
68
|
+
escape_url(src).gsub("%2F", '/')
|
69
|
+
end
|
70
|
+
|
71
|
+
# -- utility --
|
72
|
+
def link(query)
|
73
|
+
"<a href='#{'/home?query=' + escape_url(query)}'>#{query}</a>"
|
74
|
+
end
|
75
|
+
|
76
|
+
def create_form(path, query, shead)
|
77
|
+
shead = shead || 'directory'
|
78
|
+
|
79
|
+
# こっちにすると'検索'ボタンを押した時に新しくウィンドウが開く
|
80
|
+
# <form action='' target='_blank' method='post'>
|
81
|
+
<<EOF
|
82
|
+
<form action='' method='post'>
|
83
|
+
<p>
|
84
|
+
<input name='query' size='60' type='text' value='#{query}' />
|
85
|
+
<input type='submit' value='検索'><br></input>
|
86
|
+
#{create_radio('all', shead)}
|
87
|
+
<label>全体を検索</label>
|
88
|
+
#{create_radio('package', shead)}
|
89
|
+
<label> #{package_name(path)} 以下</label>
|
90
|
+
#{create_radio('directory', shead)}
|
91
|
+
<label> #{current_name(path)} 以下</label>
|
92
|
+
</p>
|
93
|
+
</form>
|
94
|
+
EOF
|
95
|
+
end
|
96
|
+
|
97
|
+
def create_radio(value, shead)
|
98
|
+
str = (value == shead) ? 'checked' : ''
|
99
|
+
"<input name='shead' type='radio' value='#{value}' #{str}/>"
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_headmenu(path, query)
|
103
|
+
# href = "#{request.path_info}?'#{request.query_string}"
|
104
|
+
# href = '/home/rack-1.3.0/lib/rack/handler/cgi.rb?shead=directory'
|
105
|
+
href = Mkurl.new('/home/' + path, params).inherit_query_shead
|
106
|
+
<<EOF
|
107
|
+
<a href="/home" class="headmenu">全てのパッケージ</a>
|
108
|
+
<a href="#{href}" class="headmenu" onclick="window.open('#{href}'); return false;">新しい検索</a>
|
109
|
+
EOF
|
110
|
+
end
|
111
|
+
|
112
|
+
def topic_path(path, params)
|
113
|
+
href = '/home'
|
114
|
+
path.split('/').map {|v|
|
115
|
+
href += '/' + v
|
116
|
+
"<a href='#{Mkurl.new(href, params).inherit_shead}'>#{v}</a>"
|
117
|
+
}.join('/')
|
118
|
+
end
|
119
|
+
|
120
|
+
def package_name(path)
|
121
|
+
(path == "") ? 'root' : path.split('/')[0]
|
122
|
+
end
|
123
|
+
|
124
|
+
def current_name(path)
|
125
|
+
(path == "") ? 'root' : File.basename(path)
|
126
|
+
end
|
127
|
+
|
128
|
+
def path_title(path)
|
129
|
+
(path == "") ? "root" : path
|
130
|
+
end
|
131
|
+
|
132
|
+
def filelist_title(path)
|
133
|
+
(path == "") ? "Package List" : path
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rack'
|
4
|
+
require 'launchy'
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
module Rack
|
8
|
+
class Server
|
9
|
+
def start
|
10
|
+
if options[:warn]
|
11
|
+
$-w = true
|
12
|
+
end
|
13
|
+
|
14
|
+
if includes = options[:include]
|
15
|
+
$LOAD_PATH.unshift(*includes)
|
16
|
+
end
|
17
|
+
|
18
|
+
if library = options[:require]
|
19
|
+
require library
|
20
|
+
end
|
21
|
+
|
22
|
+
if options[:debug]
|
23
|
+
$DEBUG = true
|
24
|
+
require 'pp'
|
25
|
+
p options[:server]
|
26
|
+
pp wrapped_app
|
27
|
+
pp app
|
28
|
+
end
|
29
|
+
|
30
|
+
# Touch the wrapped app, so that the config.ru is loaded before
|
31
|
+
# daemonization (i.e. before chdir, etc).
|
32
|
+
wrapped_app
|
33
|
+
|
34
|
+
daemonize_app if options[:daemonize]
|
35
|
+
write_pid if options[:pid]
|
36
|
+
|
37
|
+
trap(:INT) do
|
38
|
+
if server.respond_to?(:shutdown)
|
39
|
+
server.shutdown
|
40
|
+
else
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
server.run wrapped_app, options do
|
46
|
+
if (options[:LaunchBrowser])
|
47
|
+
host = options[:Host] || options[:BindAddress] # options[:BindAddress] for WEBrick
|
48
|
+
Launchy.open("http://#{host}:#{options[:Port]}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
module CodeStock
|
56
|
+
class CLI_Cdweb
|
57
|
+
def self.execute(stdout, argv)
|
58
|
+
options = {
|
59
|
+
:environment => ENV['RACK_ENV'] || "development",
|
60
|
+
:pid => nil,
|
61
|
+
:Port => 9292,
|
62
|
+
:Host => "0.0.0.0",
|
63
|
+
:AccessLog => [],
|
64
|
+
:config => "config.ru",
|
65
|
+
# ----------------------------
|
66
|
+
:server => "thin",
|
67
|
+
:LaunchBrowser => true
|
68
|
+
}
|
69
|
+
|
70
|
+
opts = OptionParser.new("#{File.basename($0)}")
|
71
|
+
opts.on('--db DB_DIR', 'Database dir (default : ~/.codestock)') {|v| options[:DbDir] = v }
|
72
|
+
opts.on("-o", "--host HOST", "listen on HOST (default: 0.0.0.0)") {|host| options[:Host] = host }
|
73
|
+
opts.on('-p', '--port PORT', 'use PORT (default: 9292)') {|v| options[:Port] = v }
|
74
|
+
opts.on('-n', '--no-browser', 'No launch browser.') {|v| options[:LaunchBrowser] = false }
|
75
|
+
opts.parse!(argv)
|
76
|
+
|
77
|
+
# サーバースクリプトのある場所へ移動
|
78
|
+
FileUtils.cd(File.dirname(__FILE__))
|
79
|
+
|
80
|
+
# Rackサーバー起動
|
81
|
+
Rack::Server.start(options)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2011/07/03
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'coderay'
|
10
|
+
require 'coderay/helpers/file_type'
|
11
|
+
|
12
|
+
module CodeStock
|
13
|
+
class CodeRayWrapper
|
14
|
+
attr_reader :line_number_start
|
15
|
+
|
16
|
+
def initialize(content, filename, match_lines = [])
|
17
|
+
@content = content
|
18
|
+
@filename = filename
|
19
|
+
@match_lines = match_lines
|
20
|
+
@highlight_lines = match_lines.map{|v|v.index+1}
|
21
|
+
@line_number_start = 1
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_range(range)
|
25
|
+
content_a = @content.to_a
|
26
|
+
range = limit_range(range, content_a)
|
27
|
+
@content = content_a[range]
|
28
|
+
@line_number_start = range.first + 1
|
29
|
+
end
|
30
|
+
|
31
|
+
def limit_range(range, array)
|
32
|
+
Range.new(range.first < 0 ? 0 : range.first,
|
33
|
+
range.last >= array.size ? array.size - 1 : range.last)
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_html
|
37
|
+
html = CodeRay.scan(@content, file_type).
|
38
|
+
html(
|
39
|
+
:wrap => nil,
|
40
|
+
:line_numbers => :table,
|
41
|
+
:css => :class,
|
42
|
+
:highlight_lines => @highlight_lines,
|
43
|
+
:line_number_start => @line_number_start
|
44
|
+
)
|
45
|
+
|
46
|
+
codestock_ornament(html)
|
47
|
+
end
|
48
|
+
|
49
|
+
def codestock_ornament(html)
|
50
|
+
a = html.split("\n")
|
51
|
+
|
52
|
+
line_number = @line_number_start
|
53
|
+
is_code_content = false
|
54
|
+
|
55
|
+
a.each_with_index do |l, index|
|
56
|
+
if (l =~ / <td class="code"><pre (.*?)>(.*)<tt>/)
|
57
|
+
a[index] = " <td class=\"code\"><pre #{$1}><span #{line_attr(line_number)}>#{$2}</span><tt>"
|
58
|
+
is_code_content = true
|
59
|
+
line_number += 1
|
60
|
+
next
|
61
|
+
elsif (l =~ %r|</tt></pre></td>|)
|
62
|
+
is_code_content = false
|
63
|
+
end
|
64
|
+
|
65
|
+
if (is_code_content)
|
66
|
+
if (l =~ %r|</tt>(.*)<tt>|)
|
67
|
+
a[index] = "</tt><span #{line_attr(line_number)}>#{$1}</span><tt>"
|
68
|
+
line_number += 1
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
a.join("\n") + "\n"
|
74
|
+
end
|
75
|
+
|
76
|
+
def file_type
|
77
|
+
case File.extname(@filename)
|
78
|
+
when ".el"
|
79
|
+
:scheme
|
80
|
+
else
|
81
|
+
CodeRay::FileType.fetch @filename, :plaintext
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def line_attr(no)
|
86
|
+
r = []
|
87
|
+
r << "id=\"#{no}\""
|
88
|
+
r << "class=\"highlight-line\"" if @highlight_lines.include?(no)
|
89
|
+
r.join(" ")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# @file
|
4
|
+
# @brief
|
5
|
+
# @author ongaeshi
|
6
|
+
# @date 2011/07/11
|
7
|
+
|
8
|
+
require 'codestock/cdweb/lib/database'
|
9
|
+
require 'codestock/cdweb/lib/coderay_wrapper'
|
10
|
+
require 'codestock/cdweb/lib/search_contents'
|
11
|
+
require 'codestock/cdweb/lib/search_files'
|
12
|
+
require 'codestock/cdweb/lib/mkurl'
|
13
|
+
|
14
|
+
module CodeStock
|
15
|
+
def view(record, params, before)
|
16
|
+
@title = record.shortpath
|
17
|
+
@path = record.shortpath
|
18
|
+
|
19
|
+
q = params[:query] && Query.new(params[:query])
|
20
|
+
|
21
|
+
if (q and !q.keywords.empty?)
|
22
|
+
grep = Grep.new(record.content)
|
23
|
+
match_lines = grep.match_lines_and(q.keywords)
|
24
|
+
@record_content = CodeRayWrapper.new(record.content, record.shortpath, match_lines).to_html
|
25
|
+
else
|
26
|
+
@record_content = CodeRayWrapper.new(record.content, record.shortpath).to_html
|
27
|
+
end
|
28
|
+
|
29
|
+
@elapsed = Time.now - before
|
30
|
+
haml :view
|
31
|
+
end
|
32
|
+
|
33
|
+
def search(path, params, before)
|
34
|
+
@path = path
|
35
|
+
query = Query.new(params[:query])
|
36
|
+
@title = "'#{query.query_string}' in #{path_title(path)}"
|
37
|
+
|
38
|
+
if (query.keywords.size > 0)
|
39
|
+
searcher = SearchContents.new(path, params, query)
|
40
|
+
else
|
41
|
+
searcher = SearchFiles.new(path, params, query)
|
42
|
+
end
|
43
|
+
|
44
|
+
@total_records = searcher.total_records
|
45
|
+
@range = searcher.data_range
|
46
|
+
@record_content = searcher.html_contents + searcher.html_pagination;
|
47
|
+
@elapsed = Time.now - before
|
48
|
+
haml :search
|
49
|
+
end
|
50
|
+
|
51
|
+
def filelist(path, params, before)
|
52
|
+
@title = filelist_title(path)
|
53
|
+
@path = path
|
54
|
+
fileList = Database.instance.fileList(path)
|
55
|
+
@total_records = fileList.size
|
56
|
+
@record_content = fileList.map do |v|
|
57
|
+
"<dt class='result-file'>#{file_or_dirimg(v[1])}<a href='#{Mkurl.new('/home/' + v[0], params).inherit_query_shead}'>#{File.basename v[0]}</a></dt>"
|
58
|
+
end
|
59
|
+
@elapsed = Time.now - before
|
60
|
+
haml :filelist
|
61
|
+
end
|
62
|
+
|
63
|
+
def file_or_dirimg(is_file)
|
64
|
+
src = (is_file) ? '/images/file.png' : '/images/directory.png'
|
65
|
+
"<img alt='' style='vertical-align:bottom; border: 0; margin: 1px;' src='#{src}'>"
|
66
|
+
end
|
67
|
+
end
|
@@ -15,14 +15,15 @@ include CodeStock
|
|
15
15
|
module CodeStock
|
16
16
|
class Database
|
17
17
|
include Singleton
|
18
|
-
|
18
|
+
|
19
|
+
@@db_dir = nil
|
19
20
|
|
20
21
|
def self.setup(db_dir)
|
21
22
|
@@db_dir = db_dir
|
22
23
|
end
|
23
24
|
|
24
25
|
def initialize
|
25
|
-
open(@@db_dir)
|
26
|
+
open(@@db_dir || db_default_dir)
|
26
27
|
end
|
27
28
|
|
28
29
|
def open(db_dir)
|
@@ -38,34 +39,20 @@ module CodeStock
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def record(shortpath)
|
41
|
-
before = Time.now
|
42
42
|
table = @documents.select { |record| record.shortpath == shortpath }
|
43
|
-
|
44
|
-
return table.records[0], elapsed
|
43
|
+
return table.records[0]
|
45
44
|
end
|
46
45
|
|
47
46
|
def fileNum
|
48
47
|
@documents.select.size
|
49
48
|
end
|
50
|
-
|
51
|
-
def search(patterns, packages, fpaths, suffixs,
|
52
|
-
|
53
|
-
|
54
|
-
# 全てのパターンを検索
|
55
|
-
if (fpaths.include?("*"))
|
56
|
-
records, total_records = selectAll(page, limit)
|
57
|
-
else
|
58
|
-
records, total_records = searchMain(patterns, packages, fpaths, suffixs, page, limit)
|
59
|
-
end
|
60
|
-
|
61
|
-
# 検索にかかった時間
|
62
|
-
elapsed = Time.now - before
|
63
|
-
|
64
|
-
# 結果
|
65
|
-
return records, total_records, elapsed
|
49
|
+
|
50
|
+
def search(patterns, packages, fpaths, suffixs, offset = 0, limit = -1)
|
51
|
+
# @todo fpathを厳密に検索するには、検索結果からさらに先頭からのパスではないものを除外する
|
52
|
+
records, total_records = searchMain(patterns, packages, fpaths, suffixs, offset, limit)
|
66
53
|
end
|
67
54
|
|
68
|
-
def selectAll(
|
55
|
+
def selectAll(offset = 0, limit = -1)
|
69
56
|
table = @documents.select
|
70
57
|
|
71
58
|
# マッチ数
|
@@ -79,12 +66,45 @@ module CodeStock
|
|
79
66
|
# :limit => limit)
|
80
67
|
|
81
68
|
# ソート
|
82
|
-
|
69
|
+
if (limit != -1)
|
70
|
+
records = table.records.sort_by{|record| record.shortpath.downcase }[offset, limit]
|
71
|
+
else
|
72
|
+
records = table.records.sort_by{|record| record.shortpath.downcase }[offset..limit]
|
73
|
+
end
|
74
|
+
|
83
75
|
|
84
76
|
return records, total_records
|
85
77
|
end
|
86
78
|
|
87
|
-
|
79
|
+
# @sample test/test_database.rb:43 TestDatabase#t_fileList
|
80
|
+
def fileList(base)
|
81
|
+
base_parts = base.split("/")
|
82
|
+
base_depth = base_parts.length
|
83
|
+
|
84
|
+
# shortpathにマッチするものだけに絞り込む
|
85
|
+
if (base == "")
|
86
|
+
records = @documents.select.records
|
87
|
+
else
|
88
|
+
records = @documents.select {|record| record.shortpath =~ base }.to_a
|
89
|
+
end
|
90
|
+
|
91
|
+
# ファイルリストの生成
|
92
|
+
paths = records.map {|record|
|
93
|
+
record.shortpath.split("/")
|
94
|
+
}.find_all {|parts|
|
95
|
+
parts.length > base_depth and parts[0, base_depth] == base_parts
|
96
|
+
}.map {|parts|
|
97
|
+
is_file = parts.length == base_depth + 1
|
98
|
+
path = parts[0, base_depth + 1].join("/")
|
99
|
+
[path, is_file]
|
100
|
+
}.uniq
|
101
|
+
|
102
|
+
paths
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def searchMain(patterns, packages, fpaths, suffixs, offset, limit)
|
88
108
|
table = @documents.select do |record|
|
89
109
|
expression = nil
|
90
110
|
|
@@ -132,15 +152,22 @@ module CodeStock
|
|
132
152
|
expression
|
133
153
|
end
|
134
154
|
|
135
|
-
# マッチ数
|
136
|
-
total_records = table.size
|
137
|
-
|
138
155
|
# スコアとタイムスタンプでソート
|
139
156
|
records = table.sort([{:key => "_score", :order => "descending"},
|
140
157
|
{:key => "timestamp", :order => "descending"}],
|
141
|
-
:offset =>
|
158
|
+
:offset => offset,
|
142
159
|
:limit => limit)
|
160
|
+
|
161
|
+
# パッケージの条件追加
|
162
|
+
if (packages.size > 0)
|
163
|
+
records.delete_if do |record|
|
164
|
+
!packages.any?{|package| record.shortpath.split('/')[0] =~ /#{package}/ }
|
165
|
+
end
|
166
|
+
end
|
143
167
|
|
168
|
+
# マッチ数
|
169
|
+
total_records = records.size
|
170
|
+
|
144
171
|
return records, total_records
|
145
172
|
end
|
146
173
|
private :searchMain
|