bitclust-dev 0.5.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/lib/bitclust.rb +9 -0
- data/tools/bc-ancestors.rb +153 -0
- data/tools/bc-checkparams.rb +246 -0
- data/tools/bc-classes.rb +80 -0
- data/tools/bc-convert.rb +165 -0
- data/tools/bc-list.rb +63 -0
- data/tools/bc-methods.rb +171 -0
- data/tools/bc-preproc.rb +42 -0
- data/tools/bc-rdoc.rb +343 -0
- data/tools/bc-tochm.rb +301 -0
- data/tools/bc-tohtml.rb +125 -0
- data/tools/bc-tohtmlpackage.rb +241 -0
- data/tools/check-signature.rb +19 -0
- data/tools/forall-ruby.rb +20 -0
- data/tools/gencatalog.rb +69 -0
- data/tools/statrefm.rb +98 -0
- data/tools/stattodo.rb +150 -0
- data/tools/update-database.rb +146 -0
- metadata +118 -0
data/tools/bc-tochm.rb
ADDED
@@ -0,0 +1,301 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
require 'pathname'
|
4
|
+
def srcdir_root
|
5
|
+
(Pathname.new(__FILE__).realpath.dirname + '..').cleanpath
|
6
|
+
end
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift srcdir_root() + 'lib'
|
9
|
+
|
10
|
+
#def srcdir_root
|
11
|
+
# #Pathname.new(__FILE__).realpath.dirname.parent.cleanpath
|
12
|
+
# Pathname.new(__FILE__).dirname.parent.cleanpath
|
13
|
+
#end
|
14
|
+
#$LOAD_PATH.unshift srcdir_root + 'lib'
|
15
|
+
|
16
|
+
require 'bitclust'
|
17
|
+
require 'erb'
|
18
|
+
require 'fileutils'
|
19
|
+
require 'kconv'
|
20
|
+
require 'optparse'
|
21
|
+
begin
|
22
|
+
require 'progressbar'
|
23
|
+
rescue LoadError
|
24
|
+
class ProgressBar
|
25
|
+
def initialize(title, total, out = STDERR)
|
26
|
+
@title, @total, @out = title, total, out
|
27
|
+
end
|
28
|
+
attr_reader :title
|
29
|
+
|
30
|
+
def inc(step = 1)
|
31
|
+
end
|
32
|
+
|
33
|
+
def finish
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
HHP_SKEL = <<EOS
|
39
|
+
[OPTIONS]
|
40
|
+
Compatibility=1.1 or later
|
41
|
+
Compiled file=refm.chm
|
42
|
+
Contents file=refm.hhc
|
43
|
+
Default Window=titlewindow
|
44
|
+
Default topic=doc/index.html
|
45
|
+
Display compile progress=No
|
46
|
+
Error log file=refm.log
|
47
|
+
Full-text search=Yes
|
48
|
+
Index file=refm.hhk
|
49
|
+
Language=0x411 日本語 (日本)
|
50
|
+
Title=Rubyリファレンスマニュアル
|
51
|
+
|
52
|
+
[WINDOWS]
|
53
|
+
titlewindow="Rubyリファレンスマニュアル","refm.hhc","refm.hhk","doc/index.html","doc/index.html",,,,,0x21420,,0x387e,,,,,,,,0
|
54
|
+
|
55
|
+
[FILES]
|
56
|
+
<%= @html_files.join("\n") %>
|
57
|
+
EOS
|
58
|
+
|
59
|
+
HHC_SKEL = <<EOS
|
60
|
+
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
61
|
+
<HTML>
|
62
|
+
<HEAD>
|
63
|
+
</HEAD>
|
64
|
+
<BODY>
|
65
|
+
<UL><% [:library].each do |k| %>
|
66
|
+
<%= @sitemap[k].to_html %>
|
67
|
+
<% end %></UL>
|
68
|
+
</BODY>
|
69
|
+
</HTML>
|
70
|
+
EOS
|
71
|
+
|
72
|
+
HHK_SKEL = <<EOS
|
73
|
+
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
74
|
+
<HTML>
|
75
|
+
<HEAD>
|
76
|
+
</HEAD>
|
77
|
+
<BODY>
|
78
|
+
<UL><% @index_contents.sort.each do |content| %>
|
79
|
+
<%= content.to_html %>
|
80
|
+
<% end %></UL>
|
81
|
+
</BODY>
|
82
|
+
</HTML>
|
83
|
+
EOS
|
84
|
+
|
85
|
+
class Sitemap
|
86
|
+
def initialize(name, local = nil)
|
87
|
+
@name = name
|
88
|
+
@contents = Content.new(name, local)
|
89
|
+
end
|
90
|
+
|
91
|
+
def method_missing(name, *args, &block)
|
92
|
+
@contents.send(name, *args, &block)
|
93
|
+
end
|
94
|
+
|
95
|
+
class Content
|
96
|
+
include Enumerable
|
97
|
+
include ERB::Util
|
98
|
+
|
99
|
+
def initialize(name, local = nil)
|
100
|
+
@name = name
|
101
|
+
@local = local
|
102
|
+
@contents = []
|
103
|
+
end
|
104
|
+
attr_reader :name, :local, :contents
|
105
|
+
|
106
|
+
def [](index)
|
107
|
+
@contents[index]
|
108
|
+
end
|
109
|
+
|
110
|
+
def <<(content)
|
111
|
+
@contents << content
|
112
|
+
end
|
113
|
+
|
114
|
+
def <=>(other)
|
115
|
+
@name <=> other.name
|
116
|
+
end
|
117
|
+
|
118
|
+
def each
|
119
|
+
@contents.each do |content|
|
120
|
+
yield content
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def to_html
|
125
|
+
str = "<LI> <OBJECT type=\"text/sitemap\">\n"
|
126
|
+
str << " <param name=\"Name\" value=\"<%=h @name%>\">\n"
|
127
|
+
if @local
|
128
|
+
str << " <param name=\"Local\" value=\"<%=@local%>\">\n"
|
129
|
+
end
|
130
|
+
str << " </OBJECT>\n"
|
131
|
+
unless contents.empty?
|
132
|
+
str << "<UL>\n"
|
133
|
+
@contents.each do |content|
|
134
|
+
str << content.to_html
|
135
|
+
end
|
136
|
+
str << "</UL>\n"
|
137
|
+
end
|
138
|
+
ERB.new(str).result(binding)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
module BitClust
|
144
|
+
|
145
|
+
class URLMapperEx < URLMapper
|
146
|
+
def library_url(name)
|
147
|
+
if name == '/'
|
148
|
+
"/library/index.html"
|
149
|
+
else
|
150
|
+
"/library/#{encodename_fs(name)}.html"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def class_url(name)
|
155
|
+
"/class/#{encodename_fs(name)}.html"
|
156
|
+
end
|
157
|
+
|
158
|
+
def method_url(spec)
|
159
|
+
cname, tmark, mname = *split_method_spec(spec)
|
160
|
+
"/method/#{encodename_fs(cname)}/#{typemark2char(tmark)}/#{encodename_fs(mname)}.html"
|
161
|
+
end
|
162
|
+
|
163
|
+
def document_url(name)
|
164
|
+
"/doc/#{encodename_fs(name)}.html"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def main
|
170
|
+
@sitemap = {
|
171
|
+
:library => Sitemap.new('ライブラリ', 'library/index.html'),
|
172
|
+
}
|
173
|
+
@sitemap[:library] << Sitemap::Content.new('標準ライブラリ', 'library/_builtin.html')
|
174
|
+
@sitemap[:library] << Sitemap::Content.new('添付ライブラリ')
|
175
|
+
@stdlibs = {}
|
176
|
+
@index_contents = []
|
177
|
+
prefix = Pathname.new('./db')
|
178
|
+
outputdir = Pathname.new('./chm')
|
179
|
+
manager_config = {
|
180
|
+
:baseurl => 'http://example.com/',
|
181
|
+
:suffix => '.html',
|
182
|
+
:templatedir => srcdir_root + 'data'+ 'bitclust' + 'template',
|
183
|
+
:themedir => srcdir_root + 'theme' + 'default',
|
184
|
+
:css_url => 'style.css',
|
185
|
+
:cgi_url => '',
|
186
|
+
:tochm_mode => true
|
187
|
+
}
|
188
|
+
manager_config[:urlmapper] = BitClust::URLMapperEx.new(manager_config)
|
189
|
+
|
190
|
+
parser = OptionParser.new
|
191
|
+
parser.on('-d', '--database=PATH', 'Database prefix') do |path|
|
192
|
+
prefix = Pathname.new(path).realpath
|
193
|
+
end
|
194
|
+
parser.on('-o', '--outputdir=PATH', 'Output directory') do |path|
|
195
|
+
begin
|
196
|
+
outputdir = Pathname.new(path).realpath
|
197
|
+
rescue Errno::ENOENT
|
198
|
+
FileUtils.mkdir_p(path, :verbose => true)
|
199
|
+
retry
|
200
|
+
end
|
201
|
+
end
|
202
|
+
parser.on('--help', 'Prints this message and quit') do
|
203
|
+
puts(parser.help)
|
204
|
+
exit(0)
|
205
|
+
end
|
206
|
+
begin
|
207
|
+
parser.parse!
|
208
|
+
rescue OptionParser::ParseError => err
|
209
|
+
STDERR.puts(err.message)
|
210
|
+
STDERR.puts(parser.help)
|
211
|
+
exit(1)
|
212
|
+
end
|
213
|
+
|
214
|
+
db = BitClust::MethodDatabase.new(prefix.to_s)
|
215
|
+
manager = BitClust::ScreenManager.new(manager_config)
|
216
|
+
@html_files = []
|
217
|
+
db.transaction do
|
218
|
+
methods = {}
|
219
|
+
pb = ProgressBar.new('method', db.methods.size)
|
220
|
+
db.methods.each_with_index do |entry, i|
|
221
|
+
method_name = entry.klass.name + entry.typemark + entry.name
|
222
|
+
(methods[method_name] ||= []) << entry
|
223
|
+
pb.inc
|
224
|
+
end
|
225
|
+
pb.finish
|
226
|
+
entries = db.docs + db.libraries.sort + db.classes.sort + methods.values.sort
|
227
|
+
pb = ProgressBar.new('entry', entries.size)
|
228
|
+
entries.each_with_index do |c, i|
|
229
|
+
filename = create_html_file(c, manager, outputdir, db)
|
230
|
+
@html_files << filename
|
231
|
+
e = c.is_a?(Array) ? c.sort.first : c
|
232
|
+
case e.type_id
|
233
|
+
when :library
|
234
|
+
content = Sitemap::Content.new(e.name.to_s, filename)
|
235
|
+
if e.name.to_s != '_builtin'
|
236
|
+
@sitemap[:library][1] << content
|
237
|
+
@stdlibs[e.name.to_s] = content
|
238
|
+
end
|
239
|
+
@index_contents << Sitemap::Content.new(e.name.to_s, filename)
|
240
|
+
when :class
|
241
|
+
content = Sitemap::Content.new(e.name.to_s, filename)
|
242
|
+
if e.library.name.to_s == '_builtin'
|
243
|
+
@sitemap[:library][0] << content
|
244
|
+
else
|
245
|
+
@stdlibs[e.library.name.to_s] << content
|
246
|
+
end
|
247
|
+
@index_contents << Sitemap::Content.new("#{e.name} (#{e.library.name})", filename)
|
248
|
+
when :method
|
249
|
+
e.names.each do |e_name|
|
250
|
+
name = e.typename == :special_variable ? "$#{e_name}" : e_name
|
251
|
+
@index_contents <<
|
252
|
+
Sitemap::Content.new("#{name} (#{e.library.name} - #{e.klass.name})", filename)
|
253
|
+
@index_contents <<
|
254
|
+
Sitemap::Content.new("#{e.klass.name}#{e.typemark}#{name} (#{e.library.name})", filename)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
pb.title.replace(e.name)
|
258
|
+
pb.inc
|
259
|
+
end
|
260
|
+
pb.finish
|
261
|
+
end
|
262
|
+
@html_files.sort!
|
263
|
+
create_file(outputdir + 'refm.hhp', HHP_SKEL, true)
|
264
|
+
create_file(outputdir + 'refm.hhc', HHC_SKEL, true)
|
265
|
+
create_file(outputdir + 'refm.hhk', HHK_SKEL, true)
|
266
|
+
create_file(outputdir + 'library/index.html', manager.library_index_screen(db.libraries.sort, {:database => db}).body)
|
267
|
+
create_file(outputdir + 'class/index.html', manager.class_index_screen(db.classes.sort, {:database => db}).body)
|
268
|
+
FileUtils.cp(manager_config[:themedir] + manager_config[:css_url],
|
269
|
+
outputdir.to_s, {:verbose => true, :preserve => true})
|
270
|
+
end
|
271
|
+
|
272
|
+
def create_html_file(entry, manager, outputdir, db)
|
273
|
+
html = manager.entry_screen(entry, {:database => db}).body
|
274
|
+
e = entry.is_a?(Array) ? entry.sort.first : entry
|
275
|
+
path = case e.type_id
|
276
|
+
when :library, :class, :doc
|
277
|
+
outputdir + e.type_id.to_s + (BitClust::NameUtils.encodename_fs(e.name) + '.html')
|
278
|
+
when :method
|
279
|
+
outputdir + e.type_id.to_s + BitClust::NameUtils.encodename_fs(e.klass.name) +
|
280
|
+
e.typechar + (BitClust::NameUtils.encodename_fs(e.name) + '.html')
|
281
|
+
else
|
282
|
+
raise
|
283
|
+
end
|
284
|
+
FileUtils.mkdir_p(path.dirname) unless path.dirname.directory?
|
285
|
+
path.open('w') do |f|
|
286
|
+
f.write(html)
|
287
|
+
end
|
288
|
+
path.relative_path_from(outputdir).to_s
|
289
|
+
end
|
290
|
+
|
291
|
+
def create_file(path, skel, sjis_flag = false)
|
292
|
+
STDERR.print("creating #{path} ...")
|
293
|
+
str = ERB.new(skel).result(binding)
|
294
|
+
str = str.tosjis if sjis_flag
|
295
|
+
path.open('w') do |f|
|
296
|
+
f.write(str)
|
297
|
+
end
|
298
|
+
STDERR.puts(" done.")
|
299
|
+
end
|
300
|
+
|
301
|
+
main
|
data/tools/bc-tohtml.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# bc-tohtml.rb
|
4
|
+
#
|
5
|
+
# Copyright (c) 2006-2007 Minero Aoki
|
6
|
+
#
|
7
|
+
# This program is free software.
|
8
|
+
# You can distribute/modify this program under the Ruby License.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'pathname'
|
12
|
+
|
13
|
+
def srcdir_root
|
14
|
+
(Pathname.new(__FILE__).realpath.dirname + '..').cleanpath
|
15
|
+
end
|
16
|
+
|
17
|
+
$LOAD_PATH.unshift srcdir_root() + 'lib'
|
18
|
+
|
19
|
+
$KCODE = 'UTF-8' unless Object.const_defined?(:Encoding)
|
20
|
+
|
21
|
+
require 'bitclust'
|
22
|
+
require 'optparse'
|
23
|
+
|
24
|
+
def main
|
25
|
+
templatedir = srcdir_root() + 'data' + 'bitclust' + 'template.offline'
|
26
|
+
target = nil
|
27
|
+
baseurl = 'file://' + srcdir_root.to_s
|
28
|
+
parser = OptionParser.new
|
29
|
+
ver = '1.9.0'
|
30
|
+
parser.banner = "Usage: #{File.basename($0, '.*')} rdfile"
|
31
|
+
parser.on('--target=NAME', 'Compile NAME to HTML.') {|name|
|
32
|
+
target = name
|
33
|
+
}
|
34
|
+
parser.on('--force', '-f', 'Force to use rd_file template.') {|name|
|
35
|
+
@rd_file = true
|
36
|
+
}
|
37
|
+
parser.on('--ruby_version=VER', '--ruby=VER', 'Set Ruby version') {|v|
|
38
|
+
ver = v
|
39
|
+
}
|
40
|
+
parser.on('--db=DB', '--database=DB', 'Set database path') {|path|
|
41
|
+
db = BitClust::Database.new(path)
|
42
|
+
}
|
43
|
+
parser.on('--baseurl=URL', 'Base URL of generated HTML') {|url|
|
44
|
+
baseurl = url
|
45
|
+
}
|
46
|
+
parser.on('--templatedir=PATH', 'Template directory') {|path|
|
47
|
+
templatedir = path
|
48
|
+
}
|
49
|
+
parser.on('--help', 'Prints this message and quit.') {
|
50
|
+
puts parser.help
|
51
|
+
exit 0
|
52
|
+
}
|
53
|
+
parser.on('--capi', 'C API mode.') {
|
54
|
+
@capi = true
|
55
|
+
}
|
56
|
+
begin
|
57
|
+
parser.parse!
|
58
|
+
rescue OptionParser::ParseError => err
|
59
|
+
$stderr.puts err.message
|
60
|
+
$stderr.puts parser.help
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
if ARGV.size > 1
|
64
|
+
$stderr.puts "too many arguments (expected 1)"
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
|
68
|
+
db ||= BitClust::Database.dummy({'version' => ver})
|
69
|
+
manager = BitClust::ScreenManager.new(
|
70
|
+
:templatedir => templatedir,
|
71
|
+
:base_url => baseurl,
|
72
|
+
:cgi_url => baseurl,
|
73
|
+
:default_encoding => 'utf-8')
|
74
|
+
unless @rd_file
|
75
|
+
begin
|
76
|
+
if @capi
|
77
|
+
lib = BitClust::FunctionReferenceParser.parse_file(ARGV[0], {'version' => ver})
|
78
|
+
unless target
|
79
|
+
raise NotImplementedError, "generating a C API html without --target=NAME is not implemented yet."
|
80
|
+
end
|
81
|
+
else
|
82
|
+
lib = BitClust::RRDParser.parse_stdlib_file(ARGV[0], {'version' => ver})
|
83
|
+
end
|
84
|
+
entry = target ? lookup(lib, target) : lib
|
85
|
+
puts manager.entry_screen(entry, {:database => db}).body
|
86
|
+
return
|
87
|
+
rescue BitClust::ParseError => ex
|
88
|
+
$stderr.puts ex.message
|
89
|
+
$stderr.puts ex.backtrace[0], ex.backtrace[1..-1].map{|s| "\tfrom " + s}
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
ent = BitClust::DocEntry.new(db, ARGV[0])
|
94
|
+
ret = BitClust::Preprocessor.read(ARGV[0], {'version' => ver})
|
95
|
+
ent.source = ret
|
96
|
+
puts manager.doc_screen(ent, {:database => db} ).body
|
97
|
+
return
|
98
|
+
rescue BitClust::WriterError => err
|
99
|
+
$stderr.puts err.message
|
100
|
+
exit 1
|
101
|
+
end
|
102
|
+
|
103
|
+
def lookup(lib, key)
|
104
|
+
case
|
105
|
+
when @capi && BitClust::NameUtils.functionname?(key)
|
106
|
+
lib.find {|func| func.name == key}
|
107
|
+
when BitClust::NameUtils.method_spec?(key)
|
108
|
+
spec = BitClust::MethodSpec.parse(key)
|
109
|
+
if spec.constant?
|
110
|
+
begin
|
111
|
+
lib.fetch_class(key)
|
112
|
+
rescue BitClust::UserError
|
113
|
+
lib.fetch_methods(spec)
|
114
|
+
end
|
115
|
+
else
|
116
|
+
lib.fetch_methods(spec)
|
117
|
+
end
|
118
|
+
when BitClust::NameUtils.classname?(key)
|
119
|
+
lib.fetch_class(key)
|
120
|
+
else
|
121
|
+
raise BitClust::InvalidKey, "wrong search key: #{key.inspect}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
main
|
@@ -0,0 +1,241 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
def srcdir_root
|
6
|
+
(Pathname.new(__FILE__).realpath.dirname + '..').cleanpath
|
7
|
+
end
|
8
|
+
$LOAD_PATH.unshift srcdir_root() + 'lib'
|
9
|
+
|
10
|
+
require 'bitclust'
|
11
|
+
require 'fileutils'
|
12
|
+
require 'optparse'
|
13
|
+
|
14
|
+
if Object.const_defined?(:Encoding)
|
15
|
+
Encoding.default_external = 'utf-8'
|
16
|
+
end
|
17
|
+
|
18
|
+
module BitClust
|
19
|
+
|
20
|
+
class URLMapperEx < URLMapper
|
21
|
+
def library_url(name)
|
22
|
+
if name == '/'
|
23
|
+
$bitclust_html_base + "/library/index.html"
|
24
|
+
else
|
25
|
+
$bitclust_html_base + "/library/#{encodename_package(name)}.html"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def class_url(name)
|
30
|
+
$bitclust_html_base + "/class/#{encodename_package(name)}.html"
|
31
|
+
end
|
32
|
+
|
33
|
+
def method_url(spec)
|
34
|
+
cname, tmark, mname = *split_method_spec(spec)
|
35
|
+
$bitclust_html_base +
|
36
|
+
"/method/#{encodename_package(cname)}/#{typemark2char(tmark)}/#{encodename_package(mname)}.html"
|
37
|
+
end
|
38
|
+
|
39
|
+
def function_url(name)
|
40
|
+
$bitclust_html_base + "/function/#{name.empty? ? 'index' : name}.html"
|
41
|
+
end
|
42
|
+
|
43
|
+
def document_url(name)
|
44
|
+
$bitclust_html_base + "/doc/#{encodename_package(name)}.html"
|
45
|
+
end
|
46
|
+
|
47
|
+
def css_url
|
48
|
+
$bitclust_html_base + "/" + @css_url
|
49
|
+
end
|
50
|
+
|
51
|
+
def favicon_url
|
52
|
+
$bitclust_html_base + "/" + @favicon_url
|
53
|
+
end
|
54
|
+
|
55
|
+
def library_index_url
|
56
|
+
$bitclust_html_base + "/library/index.html"
|
57
|
+
end
|
58
|
+
|
59
|
+
def function_index_url
|
60
|
+
$bitclust_html_base + "/function/index.html"
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def main
|
67
|
+
prefix = Pathname.new('./db')
|
68
|
+
outputdir = Pathname.new('./doc')
|
69
|
+
templatedir = srcdir_root + 'data'+ 'bitclust' + 'template'
|
70
|
+
catalogdir = nil
|
71
|
+
verbose = true
|
72
|
+
parser = OptionParser.new
|
73
|
+
parser.on('-d', '--database=PATH', 'Database prefix') do |path|
|
74
|
+
prefix = Pathname.new(path).realpath
|
75
|
+
end
|
76
|
+
parser.on('-o', '--outputdir=PATH', 'Output directory') do |path|
|
77
|
+
begin
|
78
|
+
outputdir = Pathname.new(path).realpath
|
79
|
+
rescue Errno::ENOENT
|
80
|
+
FileUtils.mkdir_p(path, :verbose => verbose)
|
81
|
+
retry
|
82
|
+
end
|
83
|
+
end
|
84
|
+
parser.on('--catalog=PATH', 'Catalog directory') do |path|
|
85
|
+
catalogdir = Pathname.new(path).realpath
|
86
|
+
end
|
87
|
+
parser.on('--templatedir=PATH', 'Template directory') do |path|
|
88
|
+
templatedir = Pathname.new(path).realpath
|
89
|
+
end
|
90
|
+
parser.on('--fs-casesensitive', 'Filesystem is case-sensitive') do
|
91
|
+
$fs_casesensitive = true
|
92
|
+
end
|
93
|
+
parser.on('--[no-]quiet', 'Be quiet') do |quiet|
|
94
|
+
verbose = !quiet
|
95
|
+
end
|
96
|
+
parser.on('--help', 'Prints this message and quit') do
|
97
|
+
puts(parser.help)
|
98
|
+
exit(0)
|
99
|
+
end
|
100
|
+
begin
|
101
|
+
parser.parse!
|
102
|
+
rescue OptionParser::ParseError => err
|
103
|
+
STDERR.puts(err.message)
|
104
|
+
STDERR.puts(parser.help)
|
105
|
+
exit(1)
|
106
|
+
end
|
107
|
+
|
108
|
+
manager_config = {
|
109
|
+
:catalogdir => catalogdir,
|
110
|
+
:suffix => '.html',
|
111
|
+
:templatedir => templatedir,
|
112
|
+
:themedir => srcdir_root + 'theme' + 'default',
|
113
|
+
:css_url => 'style.css',
|
114
|
+
:favicon_url => 'rurema.png',
|
115
|
+
:cgi_url => '',
|
116
|
+
:tochm_mode => true
|
117
|
+
}
|
118
|
+
manager_config[:urlmapper] = BitClust::URLMapperEx.new(manager_config)
|
119
|
+
|
120
|
+
db = BitClust::MethodDatabase.new(prefix.to_s)
|
121
|
+
fdb = BitClust::FunctionDatabase.new(prefix.to_s)
|
122
|
+
manager = BitClust::ScreenManager.new(manager_config)
|
123
|
+
db.transaction do
|
124
|
+
methods = {}
|
125
|
+
db.methods.each_with_index do |entry, i|
|
126
|
+
method_name = entry.klass.name + entry.typemark + entry.name
|
127
|
+
(methods[method_name] ||= []) << entry
|
128
|
+
end
|
129
|
+
entries = db.docs + db.libraries.sort + db.classes.sort + methods.values
|
130
|
+
entries.each_with_index do |c, i|
|
131
|
+
create_html_file(c, manager, outputdir, db)
|
132
|
+
$stderr.puts("#{i}/#{entries.size} done") if i % 100 == 0 and verbose
|
133
|
+
end
|
134
|
+
end
|
135
|
+
fdb.transaction do
|
136
|
+
functions = {}
|
137
|
+
fdb.functions.each_with_index do |entry, i|
|
138
|
+
create_html_file(entry, manager, outputdir, fdb)
|
139
|
+
$stderr.puts("#{i} done") if i % 100 == 0 and verbose
|
140
|
+
end
|
141
|
+
end
|
142
|
+
$bitclust_html_base = '..'
|
143
|
+
create_file(outputdir + 'library/index.html',
|
144
|
+
manager.library_index_screen(db.libraries.sort, {:database => db}).body,
|
145
|
+
:verbose => verbose)
|
146
|
+
create_file(outputdir + 'class/index.html',
|
147
|
+
manager.class_index_screen(db.classes.sort, {:database => db}).body,
|
148
|
+
:verbose => verbose)
|
149
|
+
create_file(outputdir + 'function/index.html',
|
150
|
+
manager.function_index_screen(fdb.functions.sort, { :database => fdb }).body,
|
151
|
+
:verbose => verbose)
|
152
|
+
create_index_html(outputdir)
|
153
|
+
FileUtils.cp(manager_config[:themedir] + manager_config[:css_url],
|
154
|
+
outputdir.to_s, {:verbose => verbose, :preserve => true})
|
155
|
+
FileUtils.cp(manager_config[:themedir] + manager_config[:favicon_url],
|
156
|
+
outputdir.to_s, {:verbose => verbose, :preserve => true})
|
157
|
+
Dir.mktmpdir do |tmpdir|
|
158
|
+
FileUtils.cp_r(manager_config[:themedir] + 'images', tmpdir,
|
159
|
+
{:verbose => verbose, :preserve => true})
|
160
|
+
Dir.glob(File.join(tmpdir, 'images', '/**/.svn')).each do |d|
|
161
|
+
FileUtils.rm_r(d, {:verbose => verbose})
|
162
|
+
end
|
163
|
+
FileUtils.cp_r(File.join(tmpdir, 'images'), outputdir.to_s,
|
164
|
+
{:verbose => verbose, :preserve => true})
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def encodename_package(str)
|
169
|
+
if $fs_casesensitive
|
170
|
+
BitClust::NameUtils.encodename_url(str)
|
171
|
+
else
|
172
|
+
BitClust::NameUtils.encodename_fs(str)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def create_index_html(outputdir)
|
177
|
+
path = outputdir + 'index.html'
|
178
|
+
File.open(path, 'w'){|io|
|
179
|
+
io.write <<HERE
|
180
|
+
<meta http-equiv="refresh" content="0; URL=doc/index.html">
|
181
|
+
<a href="doc/index.html">Go</a>
|
182
|
+
HERE
|
183
|
+
}
|
184
|
+
end
|
185
|
+
|
186
|
+
def create_html_file(entry, manager, outputdir, db)
|
187
|
+
e = entry.is_a?(Array) ? entry.sort.first : entry
|
188
|
+
case e.type_id
|
189
|
+
when :library, :class, :doc
|
190
|
+
$bitclust_html_base = '..'
|
191
|
+
path = outputdir + e.type_id.to_s + (encodename_package(e.name) + '.html')
|
192
|
+
create_html_file_p(entry, manager, path, db)
|
193
|
+
path.relative_path_from(outputdir).to_s
|
194
|
+
when :method
|
195
|
+
create_html_method_file(entry, manager, outputdir, db)
|
196
|
+
when :function
|
197
|
+
create_html_function_file(entry, manager, outputdir, db)
|
198
|
+
else
|
199
|
+
raise
|
200
|
+
end
|
201
|
+
e.unload
|
202
|
+
end
|
203
|
+
|
204
|
+
def create_html_method_file(entry, manager, outputdir, db)
|
205
|
+
path = nil
|
206
|
+
$bitclust_html_base = '../../..'
|
207
|
+
e = entry.is_a?(Array) ? entry.sort.first : entry
|
208
|
+
e.names.each{|name|
|
209
|
+
path = outputdir + e.type_id.to_s + encodename_package(e.klass.name) +
|
210
|
+
e.typechar + (encodename_package(name) + '.html')
|
211
|
+
create_html_file_p(entry, manager, path, db)
|
212
|
+
}
|
213
|
+
path.relative_path_from(outputdir).to_s
|
214
|
+
end
|
215
|
+
|
216
|
+
def create_html_function_file(entry, manager, outputdir, db)
|
217
|
+
path = nil
|
218
|
+
$bitclust_html_base = '..'
|
219
|
+
path = outputdir + entry.type_id.to_s + (entry.name + '.html')
|
220
|
+
create_html_file_p(entry, manager, path, db)
|
221
|
+
path.relative_path_from(outputdir).to_s
|
222
|
+
end
|
223
|
+
|
224
|
+
def create_html_file_p(entry, manager, path, db)
|
225
|
+
FileUtils.mkdir_p(path.dirname) unless path.dirname.directory?
|
226
|
+
html = manager.entry_screen(entry, {:database => db}).body
|
227
|
+
path.open('w') do |f|
|
228
|
+
f.write(html)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def create_file(path, str, options={})
|
233
|
+
verbose = options[:verbose]
|
234
|
+
STDERR.print("creating #{path} ...") if verbose
|
235
|
+
path.open('w') do |f|
|
236
|
+
f.write(str)
|
237
|
+
end
|
238
|
+
STDERR.puts(" done.") if verbose
|
239
|
+
end
|
240
|
+
|
241
|
+
main
|