bitclust-core 1.2.6 → 1.6.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.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/README.md +65 -0
- data/Rakefile +32 -0
- data/data/bitclust/catalog/ja_JP.UTF-8 +19 -1
- data/data/bitclust/searchpage/index.html +90 -0
- data/data/bitclust/template/class +69 -8
- data/data/bitclust/template/function +2 -2
- data/data/bitclust/template/layout +11 -3
- data/data/bitclust/template/method +2 -2
- data/data/bitclust/template/search +1 -1
- data/data/bitclust/template.epub/class +22 -1
- data/data/bitclust/template.epub/function +2 -2
- data/data/bitclust/template.epub/layout +1 -3
- data/data/bitclust/template.epub/method +2 -2
- data/data/bitclust/template.lillia/class +26 -5
- data/data/bitclust/template.lillia/layout +1 -3
- data/data/bitclust/template.lillia/method +2 -2
- data/data/bitclust/template.offline/class +49 -5
- data/data/bitclust/template.offline/function +2 -2
- data/data/bitclust/template.offline/layout +27 -3
- data/data/bitclust/template.offline/method +2 -2
- data/lib/bitclust/app.rb +17 -17
- data/lib/bitclust/capi_converter.rb +20 -0
- data/lib/bitclust/classentry.rb +68 -17
- data/lib/bitclust/compat.rb +3 -2
- data/lib/bitclust/completion.rb +59 -27
- data/lib/bitclust/crossrubyutils.rb +9 -5
- data/lib/bitclust/database.rb +29 -8
- data/lib/bitclust/doc_converter.rb +63 -0
- data/lib/bitclust/docentry.rb +2 -1
- data/lib/bitclust/entity_splitter.rb +221 -0
- data/lib/bitclust/entry.rb +48 -7
- data/lib/bitclust/exception.rb +1 -0
- data/lib/bitclust/functiondatabase.rb +14 -1
- data/lib/bitclust/functionentry.rb +6 -1
- data/lib/bitclust/functionreferenceparser.rb +5 -4
- data/lib/bitclust/generators/epub.rb +11 -3
- data/lib/bitclust/htmlutils.rb +2 -1
- data/lib/bitclust/include_graph.rb +375 -0
- data/lib/bitclust/include_pruner.rb +144 -0
- data/lib/bitclust/interface.rb +2 -1
- data/lib/bitclust/libraryentry.rb +9 -7
- data/lib/bitclust/lineinput.rb +8 -5
- data/lib/bitclust/link_checker.rb +179 -0
- data/lib/bitclust/markdown_bridge.rb +186 -0
- data/lib/bitclust/markdown_orchestrator.rb +267 -0
- data/lib/bitclust/markdown_to_rrd.rb +824 -0
- data/lib/bitclust/markdown_tree.rb +217 -0
- data/lib/bitclust/mdcompiler.rb +883 -0
- data/lib/bitclust/mdparser.rb +347 -0
- data/lib/bitclust/messagecatalog.rb +4 -3
- data/lib/bitclust/method_since_calculator.rb +117 -0
- data/lib/bitclust/methoddatabase.rb +125 -14
- data/lib/bitclust/methodentry.rb +130 -7
- data/lib/bitclust/methodid.rb +13 -11
- data/lib/bitclust/methodsignature.rb +11 -4
- data/lib/bitclust/nameutils.rb +42 -22
- data/lib/bitclust/parseutils.rb +1 -0
- data/lib/bitclust/preprocessor.rb +70 -32
- data/lib/bitclust/progress_bar.rb +1 -0
- data/lib/bitclust/rdcompiler.rb +197 -96
- data/lib/bitclust/refsdatabase.rb +24 -8
- data/lib/bitclust/reloadable_request_handler.rb +72 -0
- data/lib/bitclust/requesthandler.rb +22 -16
- data/lib/bitclust/ridatabase.rb +11 -4
- data/lib/bitclust/rrd_to_markdown.rb +925 -0
- data/lib/bitclust/rrdparser.rb +197 -30
- data/lib/bitclust/runner.rb +18 -2
- data/lib/bitclust/screen.rb +81 -11
- data/lib/bitclust/search_index_generator.rb +288 -0
- data/lib/bitclust/searcher.rb +72 -22
- data/lib/bitclust/server.rb +6 -1
- data/lib/bitclust/silent_progress_bar.rb +1 -0
- data/lib/bitclust/simplesearcher.rb +25 -12
- data/lib/bitclust/subcommand.rb +8 -1
- data/lib/bitclust/subcommands/ancestors_command.rb +10 -2
- data/lib/bitclust/subcommands/checklink_command.rb +54 -0
- data/lib/bitclust/subcommands/chm_command.rb +16 -7
- data/lib/bitclust/subcommands/classes_command.rb +6 -0
- data/lib/bitclust/subcommands/epub_command.rb +1 -0
- data/lib/bitclust/subcommands/extract_command.rb +6 -0
- data/lib/bitclust/subcommands/htmlfile_command.rb +22 -7
- data/lib/bitclust/subcommands/init_command.rb +5 -1
- data/lib/bitclust/subcommands/list_command.rb +13 -4
- data/lib/bitclust/subcommands/lookup_command.rb +29 -9
- data/lib/bitclust/subcommands/methods_command.rb +11 -2
- data/lib/bitclust/subcommands/methodsince_command.rb +80 -0
- data/lib/bitclust/subcommands/preproc_command.rb +6 -0
- data/lib/bitclust/subcommands/property_command.rb +3 -1
- data/lib/bitclust/subcommands/query_command.rb +1 -0
- data/lib/bitclust/subcommands/searchpage_command.rb +102 -0
- data/lib/bitclust/subcommands/server_command.rb +16 -10
- data/lib/bitclust/subcommands/setup_command.rb +25 -10
- data/lib/bitclust/subcommands/statichtml_command.rb +132 -6
- data/lib/bitclust/subcommands/update_command.rb +111 -2
- data/lib/bitclust/syntax_highlighter.rb +52 -5
- data/lib/bitclust/textutils.rb +4 -3
- data/lib/bitclust/version.rb +2 -1
- data/lib/bitclust/version_badges.rb +90 -0
- data/lib/bitclust/whole_file_gate.rb +137 -0
- data/lib/bitclust.rb +1 -0
- data/test/test_app.rb +269 -0
- data/test/test_bitclust.rb +2 -0
- data/test/test_capi_converter.rb +91 -0
- data/test/test_class_screen.rb +413 -0
- data/test/test_copy_doc_md.rb +53 -0
- data/test/test_doc_converter.rb +78 -0
- data/test/test_entity_splitter.rb +231 -0
- data/test/test_entry.rb +207 -2
- data/test/test_eol_warning.rb +43 -0
- data/test/test_functionreferenceparser.rb +11 -0
- data/test/test_include_graph.rb +640 -0
- data/test/test_include_pruner.rb +133 -0
- data/test/test_link_checker.rb +114 -0
- data/test/test_lookup_command.rb +135 -0
- data/test/test_markdown_bridge.rb +217 -0
- data/test/test_markdown_orchestrator.rb +478 -0
- data/test/test_markdown_to_rrd.rb +757 -0
- data/test/test_markdown_tree.rb +369 -0
- data/test/test_mdcompiler.rb +1276 -0
- data/test/test_mdparser.rb +538 -0
- data/test/test_method_screen.rb +166 -0
- data/test/test_method_since_calculator.rb +290 -0
- data/test/test_methoddatabase.rb +16 -0
- data/test/test_methodentry.rb +328 -0
- data/test/test_methodsignature.rb +3 -1
- data/test/test_methodsince_command.rb +168 -0
- data/test/test_nameutils.rb +22 -0
- data/test/test_preprocessor.rb +215 -0
- data/test/test_rdcompiler.rb +429 -27
- data/test/test_refsdatabase.rb +32 -0
- data/test/test_rrd_to_markdown.rb +968 -0
- data/test/test_rrdparser.rb +295 -2
- data/test/test_run_ruby_wasm.rb +54 -0
- data/test/test_run_worker_prelude.rb +83 -0
- data/test/test_runner.rb +51 -0
- data/test/test_search_index_generator.rb +513 -0
- data/test/test_search_screen.rb +48 -0
- data/test/test_searcher.rb +153 -0
- data/test/test_searchpage_command.rb +167 -0
- data/test/test_simplesearcher.rb +28 -0
- data/test/test_statichtml_command.rb +204 -0
- data/test/test_syntax_highlighter.rb +60 -0
- data/test/test_whole_file_gate.rb +175 -0
- data/theme/default/js/NOTICE +42 -0
- data/theme/default/js/run-worker.js +111 -0
- data/theme/default/js/run.js +350 -0
- data/theme/default/js/search_controller.js +134 -0
- data/theme/default/js/search_init.js +176 -0
- data/theme/default/js/search_navigation.js +110 -0
- data/theme/default/js/search_page.js +202 -0
- data/theme/default/js/search_ranker.js +244 -0
- data/theme/default/script.js +91 -18
- data/theme/default/search.css +149 -0
- data/theme/default/style.css +193 -21
- data/theme/default/syntax-highlight.css +8 -0
- data/theme/lillia/style.css +45 -1
- metadata +178 -21
- data/README +0 -32
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
#
|
|
2
3
|
# bitclust/preprocessor.rb
|
|
3
4
|
#
|
|
@@ -7,6 +8,7 @@
|
|
|
7
8
|
# You can distribute/modify this program under the Ruby License.
|
|
8
9
|
#
|
|
9
10
|
|
|
11
|
+
require 'bitclust/compat'
|
|
10
12
|
require 'bitclust/parseutils'
|
|
11
13
|
require 'strscan'
|
|
12
14
|
|
|
@@ -39,15 +41,20 @@ module BitClust
|
|
|
39
41
|
|
|
40
42
|
|
|
41
43
|
# Handle pragmas like #@todo, #@include, #@since, etc.
|
|
44
|
+
#
|
|
45
|
+
# bitclust#285: prefix は #% が正式(GitHub が #@since 等の @英字 を
|
|
46
|
+
# ユーザー mention として解釈してしまうため)。旧 prefix #@ も、凍結タグ
|
|
47
|
+
# (frozen-*)の旧ソースを再取込する場合に備えて引き続き受け付ける。
|
|
42
48
|
class Preprocessor < LineFilter
|
|
43
49
|
|
|
44
50
|
def self.read(path, params = {})
|
|
45
51
|
if path.respond_to?(:gets)
|
|
52
|
+
# @type var path: File
|
|
46
53
|
io = wrap(path, params)
|
|
47
54
|
else
|
|
48
55
|
io = wrap(fopen(path, 'r:UTF-8'), params)
|
|
49
56
|
end
|
|
50
|
-
ret = ""
|
|
57
|
+
ret = +""
|
|
51
58
|
while s = io.gets
|
|
52
59
|
ret << s
|
|
53
60
|
end
|
|
@@ -80,36 +87,48 @@ module BitClust
|
|
|
80
87
|
def next_line(f)
|
|
81
88
|
while line = f.gets
|
|
82
89
|
case line
|
|
83
|
-
when /\A(
|
|
90
|
+
when /\A(?!\#[@%])/
|
|
84
91
|
if current_cond.processing?
|
|
85
92
|
@buf.push line
|
|
86
93
|
break
|
|
87
94
|
end
|
|
88
|
-
when /\A
|
|
95
|
+
when /\A\#[@%]\#/ # preprocessor comment
|
|
89
96
|
;
|
|
90
|
-
when /\A
|
|
91
|
-
|
|
92
|
-
|
|
97
|
+
when /\A\#[@%]todo/i
|
|
98
|
+
# 出力は prefix によらず @todo に正規化する(下流の表示処理は
|
|
99
|
+
# 従来どおり @todo だけを見ればよい)
|
|
100
|
+
@buf.push line.sub(/\A\#[@%]/, '@') if current_cond.processing?
|
|
101
|
+
when /\A\#[@%]include\s*\((.*?)\)/
|
|
93
102
|
next unless current_cond.processing?
|
|
94
103
|
begin
|
|
95
|
-
file = $1.strip
|
|
96
|
-
basedir = File.dirname(line.location.file)
|
|
97
|
-
|
|
104
|
+
file = ($1 || raise).strip
|
|
105
|
+
basedir = File.dirname(line.location.file || raise)
|
|
106
|
+
path = "#{basedir}/#{file}"
|
|
107
|
+
# md ツリーのネイティブパース: 断片は .md 拡張子付きで保存されるが
|
|
108
|
+
# include ターゲットは元式の名前のまま(拡張子なしの pack-template、
|
|
109
|
+
# .rd 付きの fiddle/2.0/fiddle.lib.rd 等)。md 側の実ファイル名を試す
|
|
110
|
+
unless File.exist?(path)
|
|
111
|
+
cand = ["#{path}.md", path.sub(/\.rd\z/, '.md')].find { |c| File.exist?(c) }
|
|
112
|
+
path = cand if cand
|
|
113
|
+
end
|
|
114
|
+
@buf.concat Preprocessor.process(path, @params)
|
|
98
115
|
rescue Errno::ENOENT => _err
|
|
99
116
|
raise WrongInclude, "#{line.location}: \#@include'ed file not exist: #{file}"
|
|
100
117
|
end
|
|
101
|
-
when /\A
|
|
118
|
+
when /\A\#[@%]since\b/
|
|
102
119
|
cond_stmt_begin line, build_cond_by_value(line, 'version >=')
|
|
103
|
-
when /\A
|
|
120
|
+
when /\A\#[@%]until\b/
|
|
104
121
|
cond_stmt_begin line, build_cond_by_value(line, 'version <')
|
|
105
|
-
when /\A
|
|
122
|
+
when /\A\#[@%]version\b/
|
|
123
|
+
cond_stmt_begin line, build_cond_by_range(line)
|
|
124
|
+
when /\A\#[@%]samplecode\b/
|
|
106
125
|
samplecode_begin(line, samplecode_description_by_value(line))
|
|
107
|
-
when /\A
|
|
108
|
-
cond_stmt_begin line, line.sub(/\A
|
|
109
|
-
when /\A
|
|
126
|
+
when /\A\#[@%]if\b/
|
|
127
|
+
cond_stmt_begin line, line.sub(/\A\#[@%]if/, '').strip
|
|
128
|
+
when /\A\#[@%]else\s*\z/
|
|
110
129
|
parse_error "no matching \#@if", line if cond_toplevel?
|
|
111
130
|
cond_invert
|
|
112
|
-
when /\A
|
|
131
|
+
when /\A\#[@%]end\s*\z/
|
|
113
132
|
if samplecode_processing?
|
|
114
133
|
samplecode_end
|
|
115
134
|
else
|
|
@@ -122,7 +141,7 @@ module BitClust
|
|
|
122
141
|
end
|
|
123
142
|
if @buf.empty?
|
|
124
143
|
unless cond_toplevel?
|
|
125
|
-
parse_error "unterminated \#@if", @last_if
|
|
144
|
+
parse_error "unterminated \#@if", @last_if || raise
|
|
126
145
|
end
|
|
127
146
|
end
|
|
128
147
|
@buf.shift
|
|
@@ -137,8 +156,27 @@ module BitClust
|
|
|
137
156
|
end
|
|
138
157
|
end
|
|
139
158
|
|
|
159
|
+
# 版範囲の省略記法(#285): #%version A...B は半開区間 [A, B)。
|
|
160
|
+
# Ruby の終端排他 Range リテラルに合わせて3点ドット(.. は終端を含むと
|
|
161
|
+
# 誤解しやすいため受け付けない)。A... は A 以上、...B は B 未満。
|
|
162
|
+
# 版はダブルクォート付きでもよい
|
|
163
|
+
VERSION_LITERAL = /"(\d+(?:\.\d+)*)"|(\d+(?:\.\d+)*)/
|
|
164
|
+
def build_cond_by_range(line)
|
|
165
|
+
raw = line.sub(/\A\#[@%]version\b/, '').strip
|
|
166
|
+
case raw
|
|
167
|
+
when /\A#{VERSION_LITERAL}\.\.\.#{VERSION_LITERAL}\z/o
|
|
168
|
+
%Q(version >= "#{$1 || $2}" and version < "#{$3 || $4}")
|
|
169
|
+
when /\A#{VERSION_LITERAL}\.\.\.\z/o
|
|
170
|
+
%Q(version >= "#{$1 || $2}")
|
|
171
|
+
when /\A\.\.\.#{VERSION_LITERAL}\z/o
|
|
172
|
+
%Q(version < "#{$1 || $2}")
|
|
173
|
+
else
|
|
174
|
+
parse_error "wrong version range (expected A...B / A... / ...B)", line
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
140
178
|
def build_cond_by_value(line, left)
|
|
141
|
-
case ver = line.sub(/\A
|
|
179
|
+
case ver = line.sub(/\A\#[@%]\w+/, '').strip
|
|
142
180
|
when /\A[\d\.]+\z/
|
|
143
181
|
%Q(#{left} "#{ver}")
|
|
144
182
|
when /\A"[\d\.]+"\z/
|
|
@@ -149,7 +187,7 @@ module BitClust
|
|
|
149
187
|
end
|
|
150
188
|
|
|
151
189
|
def current_cond
|
|
152
|
-
@state_stack.last
|
|
190
|
+
@state_stack.last || raise
|
|
153
191
|
end
|
|
154
192
|
|
|
155
193
|
def cond_init
|
|
@@ -161,13 +199,13 @@ module BitClust
|
|
|
161
199
|
end
|
|
162
200
|
|
|
163
201
|
def cond_push(bool)
|
|
164
|
-
last = @state_stack.last
|
|
202
|
+
last = @state_stack.last || raise
|
|
165
203
|
@state_stack.push(last.next(bool, :condition))
|
|
166
204
|
end
|
|
167
205
|
|
|
168
206
|
def cond_invert
|
|
169
|
-
b = @state_stack.pop.processing?
|
|
170
|
-
last = @state_stack.last
|
|
207
|
+
b = (@state_stack.pop || raise).processing?
|
|
208
|
+
last = @state_stack.last || raise
|
|
171
209
|
@state_stack.push(last.next(!b, :condition))
|
|
172
210
|
end
|
|
173
211
|
|
|
@@ -228,10 +266,10 @@ module BitClust
|
|
|
228
266
|
def eval_primary(s)
|
|
229
267
|
s.skip(/\s+/)
|
|
230
268
|
if t = s.scan(/\w+/)
|
|
231
|
-
unless @params.key?(t)
|
|
269
|
+
unless @params.key?(t) # steep:ignore
|
|
232
270
|
scan_error "database property `#{t}' not exist"
|
|
233
271
|
end
|
|
234
|
-
@params[t]
|
|
272
|
+
@params[t] # steep:ignore
|
|
235
273
|
elsif t = s.scan(/".*?"/)
|
|
236
274
|
eval(t)
|
|
237
275
|
elsif t = s.scan(/'.*?'/)
|
|
@@ -247,17 +285,17 @@ module BitClust
|
|
|
247
285
|
description = description.strip
|
|
248
286
|
samplecode_push(description)
|
|
249
287
|
return unless current_cond.processing?
|
|
250
|
-
@buf.push("//emlist[#{description}][ruby]{\n")
|
|
288
|
+
@buf.push(+"//emlist[#{description}][ruby]{\n")
|
|
251
289
|
end
|
|
252
290
|
|
|
253
291
|
def samplecode_end
|
|
254
292
|
samplecode_pop
|
|
255
293
|
return unless current_cond.processing?
|
|
256
|
-
@buf.push("//}\n")
|
|
294
|
+
@buf.push(+"//}\n")
|
|
257
295
|
end
|
|
258
296
|
|
|
259
297
|
def samplecode_push(description)
|
|
260
|
-
last = @state_stack.last
|
|
298
|
+
last = @state_stack.last || raise
|
|
261
299
|
@state_stack.push(last.next(true, :samplecode))
|
|
262
300
|
end
|
|
263
301
|
|
|
@@ -266,11 +304,11 @@ module BitClust
|
|
|
266
304
|
end
|
|
267
305
|
|
|
268
306
|
def samplecode_processing?
|
|
269
|
-
@state_stack.last.samplecode?
|
|
307
|
+
(@state_stack.last || raise).samplecode?
|
|
270
308
|
end
|
|
271
309
|
|
|
272
310
|
def samplecode_description_by_value(line)
|
|
273
|
-
line.sub(/\A
|
|
311
|
+
line.sub(/\A\#[@%]samplecode/, "")
|
|
274
312
|
end
|
|
275
313
|
|
|
276
314
|
def scan_error(msg)
|
|
@@ -320,10 +358,10 @@ module BitClust
|
|
|
320
358
|
|
|
321
359
|
def next_line(f)
|
|
322
360
|
while line = f.gets
|
|
323
|
-
if /\A
|
|
361
|
+
if /\A\#[@%]include\s*\((.*?)\)/ =~ line
|
|
324
362
|
begin
|
|
325
|
-
file = $1.strip
|
|
326
|
-
basedir = File.dirname(line.location.file)
|
|
363
|
+
file = ($1 || raise).strip
|
|
364
|
+
basedir = File.dirname(line.location.file || raise)
|
|
327
365
|
@buf.concat LineCollector.process("#{basedir}/#{file}")
|
|
328
366
|
rescue Errno::ENOENT => _err
|
|
329
367
|
raise WrongInclude, "#{line.location}: \#@include'ed file not exist: #{file}"
|