bitclust-core 1.2.1 → 1.2.6
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.
- checksums.yaml +4 -4
- data/data/bitclust/catalog/ja_JP.UTF-8 +4 -0
- data/data/bitclust/template.lillia/layout +1 -1
- data/data/bitclust/template.offline/class +127 -34
- data/data/bitclust/template.offline/class-index +33 -6
- data/data/bitclust/template.offline/doc +41 -8
- data/data/bitclust/template.offline/function +42 -9
- data/data/bitclust/template.offline/function-index +33 -7
- data/data/bitclust/template.offline/layout +21 -14
- data/data/bitclust/template.offline/library +48 -12
- data/data/bitclust/template.offline/library-index +33 -6
- data/data/bitclust/template.offline/method +56 -11
- data/lib/bitclust/classentry.rb +13 -2
- data/lib/bitclust/compat.rb +8 -0
- data/lib/bitclust/completion.rb +1 -0
- data/lib/bitclust/docentry.rb +4 -2
- data/lib/bitclust/entry.rb +3 -0
- data/lib/bitclust/functionentry.rb +8 -7
- data/lib/bitclust/functionreferenceparser.rb +2 -0
- data/lib/bitclust/libraryentry.rb +4 -1
- data/lib/bitclust/lineinput.rb +6 -2
- data/lib/bitclust/methoddatabase.rb +3 -0
- data/lib/bitclust/methodentry.rb +10 -8
- data/lib/bitclust/methodid.rb +1 -0
- data/lib/bitclust/nameutils.rb +15 -11
- data/lib/bitclust/preprocessor.rb +26 -21
- data/lib/bitclust/rdcompiler.rb +29 -19
- data/lib/bitclust/requesthandler.rb +3 -3
- data/lib/bitclust/ridatabase.rb +2 -1
- data/lib/bitclust/rrdparser.rb +19 -20
- data/lib/bitclust/screen.rb +39 -4
- data/lib/bitclust/silent_progress_bar.rb +8 -4
- data/lib/bitclust/simplesearcher.rb +1 -1
- data/lib/bitclust/subcommand.rb +9 -0
- data/lib/bitclust/subcommands/chm_command.rb +3 -3
- data/lib/bitclust/subcommands/methods_command.rb +1 -1
- data/lib/bitclust/subcommands/server_command.rb +6 -1
- data/lib/bitclust/subcommands/setup_command.rb +2 -2
- data/lib/bitclust/subcommands/statichtml_command.rb +44 -21
- data/lib/bitclust/syntax_highlighter.rb +5 -3
- data/lib/bitclust/version.rb +1 -1
- data/test/test_bitclust.rb +1 -1
- data/test/test_entry.rb +14 -1
- data/test/test_functionreferenceparser.rb +4 -4
- data/test/test_preprocessor.rb +21 -0
- data/test/test_rdcompiler.rb +240 -0
- data/test/test_rrdparser.rb +16 -0
- data/test/test_syntax_highlighter.rb +22 -4
- data/theme/default/rurema.png +0 -0
- data/theme/default/rurema.svg +31 -0
- data/theme/default/script.js +34 -0
- data/theme/default/style.css +112 -8
- metadata +32 -19
data/lib/bitclust/lineinput.rb
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require 'stringio'
|
12
|
+
require 'bitclust/parseutils'
|
12
13
|
|
13
14
|
# Utility class for line-wise file parsing
|
14
15
|
class LineInput
|
@@ -34,7 +35,7 @@ class LineInput
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def path
|
37
|
-
@input.path
|
38
|
+
@input.path if @input.respond_to?(:path)
|
38
39
|
end
|
39
40
|
|
40
41
|
def name
|
@@ -52,12 +53,15 @@ class LineInput
|
|
52
53
|
def gets
|
53
54
|
unless @buf.empty?
|
54
55
|
@lineno += 1
|
55
|
-
|
56
|
+
line = @buf.pop
|
57
|
+
line&.location ||= BitClust::Location.new(path, @lineno)
|
58
|
+
return line
|
56
59
|
end
|
57
60
|
return nil if @eof_p # to avoid ARGF blocking.
|
58
61
|
line = @input.gets
|
59
62
|
@eof_p = true unless line
|
60
63
|
@lineno += 1
|
64
|
+
line&.location ||= BitClust::Location.new(path, @lineno)
|
61
65
|
line
|
62
66
|
end
|
63
67
|
|
@@ -175,14 +175,17 @@ module BitClust
|
|
175
175
|
end
|
176
176
|
|
177
177
|
def copy_doc
|
178
|
+
root_path = Pathname.new(@root).expand_path
|
178
179
|
Dir.glob("#{@root}/../../doc/**/*.rd").each do |f|
|
179
180
|
if %r!\A#{Regexp.escape(@root)}/\.\./\.\./doc/([-\./\w]+)\.rd\z! =~ f
|
180
181
|
id = libname2id($1)
|
181
182
|
se = DocEntry.new(self, id)
|
182
183
|
s = Preprocessor.read(f, properties)
|
183
184
|
title, source = RRDParser.split_doc(s)
|
185
|
+
relative_path = Pathname.new(f).expand_path(@root).relative_path_from(root_path)
|
184
186
|
se.title = title
|
185
187
|
se.source = source
|
188
|
+
se.source_location = Location.new(relative_path, 1)
|
186
189
|
se.save
|
187
190
|
end
|
188
191
|
end
|
data/lib/bitclust/methodentry.rb
CHANGED
@@ -29,6 +29,7 @@ module BitClust
|
|
29
29
|
attr_reader :id
|
30
30
|
|
31
31
|
def ==(other)
|
32
|
+
return false if self.class != other.class
|
32
33
|
@id == other.id
|
33
34
|
end
|
34
35
|
|
@@ -94,14 +95,15 @@ module BitClust
|
|
94
95
|
attr_writer :klass
|
95
96
|
|
96
97
|
persistent_properties {
|
97
|
-
property :names,
|
98
|
-
property :visibility,
|
99
|
-
property :kind,
|
100
|
-
property :source,
|
98
|
+
property :names, '[String]'
|
99
|
+
property :visibility, 'Symbol' # :public | :private | :protected
|
100
|
+
property :kind, 'Symbol' # :defined | :added | :redefined
|
101
|
+
property :source, 'String'
|
102
|
+
property :source_location, 'Location'
|
101
103
|
}
|
102
104
|
|
103
105
|
def inspect
|
104
|
-
c, t,
|
106
|
+
c, t, _m, _lib = methodid2specparts(@id)
|
105
107
|
"\#<method #{c}#{t}#{names().join(',')}>"
|
106
108
|
end
|
107
109
|
|
@@ -114,12 +116,12 @@ module BitClust
|
|
114
116
|
end
|
115
117
|
|
116
118
|
def label
|
117
|
-
c, t, m,
|
119
|
+
c, t, m, _lib = methodid2specparts(@id)
|
118
120
|
"#{t == '$' ? '' : c}#{t}#{m}"
|
119
121
|
end
|
120
122
|
|
121
123
|
def short_label
|
122
|
-
|
124
|
+
_c, t, m, _lib = methodid2specparts(@id)
|
123
125
|
"#{t == '#' ? '' : t}#{m}"
|
124
126
|
end
|
125
127
|
|
@@ -128,7 +130,7 @@ module BitClust
|
|
128
130
|
end
|
129
131
|
|
130
132
|
def labels
|
131
|
-
c, t,
|
133
|
+
c, t, _m, _lib = methodid2specparts(@id)
|
132
134
|
names().map {|name| "#{c}#{t}#{name}" }
|
133
135
|
end
|
134
136
|
|
data/lib/bitclust/methodid.rb
CHANGED
data/lib/bitclust/nameutils.rb
CHANGED
@@ -19,8 +19,8 @@ module BitClust
|
|
19
19
|
LIBNAME_RE = %r<[\w\-]+(/[\w\-]+)*>
|
20
20
|
CONST_RE = /[A-Z]\w*/
|
21
21
|
CONST_PATH_RE = /#{CONST_RE}(?:::#{CONST_RE})*/
|
22
|
-
CLASS_NAME_RE = /(?:#{CONST_RE}(?:::compatible)?|fatal|ARGF
|
23
|
-
CLASS_PATH_RE = /(?:#{CONST_PATH_RE}(?:::compatible)?|fatal|ARGF
|
22
|
+
CLASS_NAME_RE = /(?:#{CONST_RE}(?:::compatible)?|fatal|ARGF\.class|main)/
|
23
|
+
CLASS_PATH_RE = /(?:#{CONST_PATH_RE}(?:::compatible)?|fatal|ARGF\.class|main)/
|
24
24
|
METHOD_NAME_RE = /\w+[?!=]?|===|==|=~|<=>|<=|>=|!=|!~|!@|!|\[\]=|\[\]|\*\*|>>|<<|\+@|\-@|[~+\-*\/%&|^<>`]/
|
25
25
|
TYPEMARK_RE = /(?:\.|\#|\.\#|::|\$)/
|
26
26
|
METHOD_SPEC_RE = /#{CLASS_PATH_RE}#{TYPEMARK_RE}#{METHOD_NAME_RE}/
|
@@ -67,7 +67,7 @@ module BitClust
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def methodid2specstring(id)
|
70
|
-
c, t, m,
|
70
|
+
c, t, m, _lib = *split_method_id(id)
|
71
71
|
classid2name(c) + typechar2mark(t) + decodename_url(m)
|
72
72
|
end
|
73
73
|
|
@@ -77,32 +77,32 @@ module BitClust
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def methodid2libid(id)
|
80
|
-
|
80
|
+
_c, _t, _m, lib = *split_method_id(id)
|
81
81
|
lib
|
82
82
|
end
|
83
83
|
|
84
84
|
def methodid2classid(id)
|
85
|
-
c,
|
85
|
+
c, _t, _m, _lib = *split_method_id(id)
|
86
86
|
c
|
87
87
|
end
|
88
88
|
|
89
89
|
def methodid2typechar(id)
|
90
|
-
|
90
|
+
_c, t, _m, _lib = *split_method_id(id)
|
91
91
|
t
|
92
92
|
end
|
93
93
|
|
94
94
|
def methodid2typename(id)
|
95
|
-
|
95
|
+
_c, t, _m, _lib = *split_method_id(id)
|
96
96
|
typechar2name(t)
|
97
97
|
end
|
98
98
|
|
99
99
|
def methodid2typemark(id)
|
100
|
-
|
100
|
+
_c, t, _m, _lib = *split_method_id(id)
|
101
101
|
typechar2mark(t)
|
102
102
|
end
|
103
103
|
|
104
104
|
def methodid2mname(id)
|
105
|
-
|
105
|
+
_c, _t, m, _lib = *split_method_id(id)
|
106
106
|
decodename_url(m)
|
107
107
|
end
|
108
108
|
|
@@ -120,10 +120,14 @@ module BitClust
|
|
120
120
|
"#{cid}/#{typename2char(t)}.#{encodename_url(name)}.#{libid}"
|
121
121
|
end
|
122
122
|
|
123
|
+
@@split_method_id = {}
|
124
|
+
|
123
125
|
# private module function
|
124
126
|
def split_method_id(id)
|
125
|
-
|
126
|
-
|
127
|
+
@@split_method_id[id] ||= begin
|
128
|
+
c, rest = id.split("/")
|
129
|
+
[c, *rest.split(%r<[/\.]>, 3)]
|
130
|
+
end
|
127
131
|
end
|
128
132
|
|
129
133
|
NAME_TO_MARK = {
|
@@ -71,11 +71,20 @@ module BitClust
|
|
71
71
|
cond_init
|
72
72
|
end
|
73
73
|
|
74
|
+
def path
|
75
|
+
@f.path if @f.respond_to?(:path)
|
76
|
+
end
|
77
|
+
|
74
78
|
private
|
75
79
|
|
76
80
|
def next_line(f)
|
77
81
|
while line = f.gets
|
78
82
|
case line
|
83
|
+
when /\A(?!\#@)/
|
84
|
+
if current_cond.processing?
|
85
|
+
@buf.push line
|
86
|
+
break
|
87
|
+
end
|
79
88
|
when /\A\#@\#/ # preprocessor comment
|
80
89
|
;
|
81
90
|
when /\A\#@todo/i
|
@@ -86,7 +95,7 @@ module BitClust
|
|
86
95
|
file = $1.strip
|
87
96
|
basedir = File.dirname(line.location.file)
|
88
97
|
@buf.concat Preprocessor.process("#{basedir}/#{file}", @params)
|
89
|
-
rescue Errno::ENOENT =>
|
98
|
+
rescue Errno::ENOENT => _err
|
90
99
|
raise WrongInclude, "#{line.location}: \#@include'ed file not exist: #{file}"
|
91
100
|
end
|
92
101
|
when /\A\#@since\b/
|
@@ -107,13 +116,8 @@ module BitClust
|
|
107
116
|
parse_error "no matching \#@if", line if cond_toplevel?
|
108
117
|
cond_pop
|
109
118
|
end
|
110
|
-
when /\A\#@/
|
111
|
-
parse_error "unknown preprocessor directive", line
|
112
119
|
else
|
113
|
-
|
114
|
-
@buf.push line
|
115
|
-
break
|
116
|
-
end
|
120
|
+
parse_error "unknown preprocessor directive", line
|
117
121
|
end
|
118
122
|
end
|
119
123
|
if @buf.empty?
|
@@ -149,7 +153,7 @@ module BitClust
|
|
149
153
|
end
|
150
154
|
|
151
155
|
def cond_init
|
152
|
-
@state_stack = [State.new(
|
156
|
+
@state_stack = [State.new(true, :toplevel)]
|
153
157
|
end
|
154
158
|
|
155
159
|
def cond_toplevel?
|
@@ -158,13 +162,13 @@ module BitClust
|
|
158
162
|
|
159
163
|
def cond_push(bool)
|
160
164
|
last = @state_stack.last
|
161
|
-
@state_stack.push(
|
165
|
+
@state_stack.push(last.next(bool, :condition))
|
162
166
|
end
|
163
167
|
|
164
168
|
def cond_invert
|
165
169
|
b = @state_stack.pop.processing?
|
166
170
|
last = @state_stack.last
|
167
|
-
@state_stack.push(
|
171
|
+
@state_stack.push(last.next(!b, :condition))
|
168
172
|
end
|
169
173
|
|
170
174
|
def cond_pop
|
@@ -254,7 +258,7 @@ module BitClust
|
|
254
258
|
|
255
259
|
def samplecode_push(description)
|
256
260
|
last = @state_stack.last
|
257
|
-
@state_stack.push(
|
261
|
+
@state_stack.push(last.next(true, :samplecode))
|
258
262
|
end
|
259
263
|
|
260
264
|
def samplecode_pop
|
@@ -276,24 +280,25 @@ module BitClust
|
|
276
280
|
class State
|
277
281
|
attr_reader :current
|
278
282
|
|
279
|
-
def initialize(
|
280
|
-
@
|
281
|
-
@
|
283
|
+
def initialize(is_processing, label)
|
284
|
+
@is_processing = is_processing
|
285
|
+
@label = label
|
286
|
+
end
|
287
|
+
|
288
|
+
def next(is_processing, label)
|
289
|
+
State.new(@is_processing && is_processing, label)
|
282
290
|
end
|
283
291
|
|
284
292
|
def toplevel?
|
285
|
-
@
|
293
|
+
@label == :toplevel
|
286
294
|
end
|
287
295
|
|
288
296
|
def processing?
|
289
|
-
|
290
|
-
(@current == true && @previous != false) ||
|
291
|
-
(@current == :samplecode && @previous == true) ||
|
292
|
-
(@current == :samplecode && @previous == :toplevel)
|
297
|
+
@is_processing
|
293
298
|
end
|
294
299
|
|
295
300
|
def samplecode?
|
296
|
-
@
|
301
|
+
@label == :samplecode
|
297
302
|
end
|
298
303
|
end
|
299
304
|
end
|
@@ -320,7 +325,7 @@ module BitClust
|
|
320
325
|
file = $1.strip
|
321
326
|
basedir = File.dirname(line.location.file)
|
322
327
|
@buf.concat LineCollector.process("#{basedir}/#{file}")
|
323
|
-
rescue Errno::ENOENT =>
|
328
|
+
rescue Errno::ENOENT => _err
|
324
329
|
raise WrongInclude, "#{line.location}: \#@include'ed file not exist: #{file}"
|
325
330
|
end
|
326
331
|
else
|
data/lib/bitclust/rdcompiler.rb
CHANGED
@@ -229,11 +229,9 @@ module BitClust
|
|
229
229
|
case @f.peek
|
230
230
|
when /\A$/
|
231
231
|
@f.gets
|
232
|
-
when /\A[ \t
|
232
|
+
when /\A[ \t]/
|
233
233
|
line '<p>'
|
234
|
-
@f.
|
235
|
-
line compile_text(line.strip)
|
236
|
-
end
|
234
|
+
line compile_text(text_node_from_lines(@f.span(/\A[ \t]/)))
|
237
235
|
line '</p>'
|
238
236
|
when %r!\A//emlist(?:\[(?:[^\[\]]+?)?\]\[\w+?\])?\{!
|
239
237
|
emlist
|
@@ -249,10 +247,8 @@ module BitClust
|
|
249
247
|
line '<dd>'
|
250
248
|
while /\A[ \t]/ =~ @f.peek or %r!\A//emlist(?:\[(?:[^\[\]]+?)?\]\[\w+?\])?\{! =~ @f.peek
|
251
249
|
case @f.peek
|
252
|
-
when /\A[ \t
|
253
|
-
@f.
|
254
|
-
line compile_text(line.strip)
|
255
|
-
end
|
250
|
+
when /\A[ \t]/
|
251
|
+
line compile_text(text_node_from_lines(@f.span(/\A[ \t]/)))
|
256
252
|
when %r!\A//emlist(?:\[(?:[^\[\]]+?)?\]\[\w+?\])?\{!
|
257
253
|
emlist
|
258
254
|
end
|
@@ -264,6 +260,11 @@ module BitClust
|
|
264
260
|
"<dt>#{s}</dt>"
|
265
261
|
end
|
266
262
|
|
263
|
+
def stop_on_syntax_error?
|
264
|
+
return true unless @option.key?(:stop_on_syntax_error)
|
265
|
+
@option[:stop_on_syntax_error]
|
266
|
+
end
|
267
|
+
|
267
268
|
def emlist
|
268
269
|
command = @f.gets
|
269
270
|
if %r!\A//emlist\[(?<caption>[^\[\]]+?)?\]\[(?<lang>\w+?)\]! =~ command
|
@@ -280,7 +281,11 @@ module BitClust
|
|
280
281
|
string BitClust::SyntaxHighlighter.new(src, filename).highlight
|
281
282
|
rescue BitClust::SyntaxHighlighter::Error => ex
|
282
283
|
$stderr.puts ex.message
|
283
|
-
|
284
|
+
if stop_on_syntax_error?
|
285
|
+
exit(false)
|
286
|
+
else
|
287
|
+
string src
|
288
|
+
end
|
284
289
|
end
|
285
290
|
else
|
286
291
|
string src
|
@@ -313,9 +318,7 @@ module BitClust
|
|
313
318
|
|
314
319
|
def paragraph
|
315
320
|
line '<p>'
|
316
|
-
read_paragraph(@f)
|
317
|
-
line compile_text(line.strip)
|
318
|
-
end
|
321
|
+
line compile_text(text_node_from_lines(read_paragraph(@f)))
|
319
322
|
line '</p>'
|
320
323
|
end
|
321
324
|
|
@@ -325,16 +328,16 @@ module BitClust
|
|
325
328
|
|
326
329
|
def see
|
327
330
|
header = @f.gets
|
328
|
-
|
331
|
+
header.slice!(/\A\@\w+/)
|
329
332
|
body = [header] + @f.span(/\A\s+\S/)
|
330
333
|
line '<p>'
|
331
|
-
line '[SEE_ALSO] ' + compile_text(body
|
334
|
+
line '[SEE_ALSO] ' + compile_text(text_node_from_lines(body))
|
332
335
|
line '</p>'
|
333
336
|
end
|
334
337
|
|
335
338
|
def todo
|
336
339
|
header = @f.gets
|
337
|
-
|
340
|
+
header.slice!(/\A\@\w+/)
|
338
341
|
body = header
|
339
342
|
line '<p class="todo">'
|
340
343
|
line '[TODO]' + body
|
@@ -368,9 +371,7 @@ module BitClust
|
|
368
371
|
# FIXME: parse @param, @return, ...
|
369
372
|
def entry_paragraph
|
370
373
|
line '<p>'
|
371
|
-
read_entry_paragraph(@f)
|
372
|
-
line compile_text(line.strip)
|
373
|
-
end
|
374
|
+
line compile_text(text_node_from_lines(read_entry_paragraph(@f)))
|
374
375
|
line '</p>'
|
375
376
|
end
|
376
377
|
|
@@ -392,6 +393,10 @@ module BitClust
|
|
392
393
|
string a_href(@urlmapper.method_url(methodid2specstring(@method.id)), "permalink")
|
393
394
|
string ']['
|
394
395
|
string rdoc_link(@method.id, @option[:database].properties["version"])
|
396
|
+
if @option[:edit_base_url] && @method.source_location
|
397
|
+
string ']['
|
398
|
+
string a_href(@urlmapper.edit_url(@method.source_location), 'edit')
|
399
|
+
end
|
395
400
|
string ']</span>'
|
396
401
|
end
|
397
402
|
if @method and not @method.defined?
|
@@ -552,7 +557,7 @@ module BitClust
|
|
552
557
|
end
|
553
558
|
|
554
559
|
def rdoc_url(method_id, version)
|
555
|
-
cname, tmark, mname,
|
560
|
+
cname, tmark, mname, _libname = methodid2specparts(method_id)
|
556
561
|
tchar = typemark2char(tmark) == 'i' ? 'i' : 'c'
|
557
562
|
cname = cname.split(".").first
|
558
563
|
cname = cname.gsub('::', '/')
|
@@ -591,6 +596,11 @@ module BitClust
|
|
591
596
|
@out.puts
|
592
597
|
end
|
593
598
|
|
599
|
+
def text_node_from_lines(lines)
|
600
|
+
lines.map(&:strip).join("\n").gsub(/(\P{ascii})\n(\P{ascii})/) do
|
601
|
+
"#{::Regexp.last_match(1)}#{::Regexp.last_match(2)}"
|
602
|
+
end
|
603
|
+
end
|
594
604
|
end
|
595
605
|
|
596
606
|
end
|
@@ -207,7 +207,7 @@ module BitClust
|
|
207
207
|
end
|
208
208
|
|
209
209
|
def defined_type?
|
210
|
-
type,
|
210
|
+
type, _param = parse_path_info()
|
211
211
|
case type
|
212
212
|
when 'library', 'class', 'method', 'function', 'search', 'opensearchdescription'
|
213
213
|
true
|
@@ -217,7 +217,7 @@ module BitClust
|
|
217
217
|
end
|
218
218
|
|
219
219
|
def type_id
|
220
|
-
type,
|
220
|
+
type, _param = parse_path_info()
|
221
221
|
type.intern if type
|
222
222
|
end
|
223
223
|
|
@@ -256,7 +256,7 @@ module BitClust
|
|
256
256
|
private
|
257
257
|
|
258
258
|
def type_param
|
259
|
-
|
259
|
+
_type, param = parse_path_info()
|
260
260
|
return nil unless param
|
261
261
|
return nil if param.empty?
|
262
262
|
param
|