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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# bitclust/reloadable_request_handler.rb
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
require 'bitclust/methoddatabase'
|
|
7
|
+
require 'bitclust/functiondatabase'
|
|
8
|
+
require 'bitclust/requesthandler'
|
|
9
|
+
|
|
10
|
+
module BitClust
|
|
11
|
+
|
|
12
|
+
# `bitclust server` を再起動しなくても `rake generate` で再生成された DB を
|
|
13
|
+
# 読み直せるようにするラッパー(bitclust#275)。
|
|
14
|
+
#
|
|
15
|
+
# MethodDatabase/FunctionDatabase はエントリを一度読むとメモリ上にメモ化
|
|
16
|
+
# し続けるため、App#initialize で一度だけ生成した RequestHandler をずっと
|
|
17
|
+
# 使い回す従来の作りでは、DB をディスク上で再生成してもプロセスは古い内容
|
|
18
|
+
# を返し続けてしまう。
|
|
19
|
+
#
|
|
20
|
+
# 新鮮さの判定は DB ディレクトリ直下の "properties" ファイルの mtime で行う。
|
|
21
|
+
# `rake generate` は対象を rm_rf してから MethodDatabase#init(properties を
|
|
22
|
+
# touch) → update という手順を踏むため、再生成のたびに properties は必ず
|
|
23
|
+
# 書き直される。#handle は毎リクエストその mtime を stat するだけなので
|
|
24
|
+
# コストは無視できる。
|
|
25
|
+
#
|
|
26
|
+
# 再生成の途中(rm_rf 直後〜init 前)は properties が一時的に存在しない。
|
|
27
|
+
# その間は新鮮さを判定できないので、古い RequestHandler をそのまま使い
|
|
28
|
+
# 続けてリクエストを失敗させない。次のリクエストで改めて判定する。
|
|
29
|
+
class ReloadableRequestHandler
|
|
30
|
+
|
|
31
|
+
def initialize(dbpath, capi, manager, request_handler_class)
|
|
32
|
+
@dbpath = dbpath
|
|
33
|
+
@capi = capi
|
|
34
|
+
@manager = manager
|
|
35
|
+
@request_handler_class = request_handler_class
|
|
36
|
+
@properties_mtime = properties_mtime
|
|
37
|
+
@handler = build_handler
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def handle(req)
|
|
41
|
+
reload_if_stale
|
|
42
|
+
@handler.handle(req)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def reload_if_stale
|
|
48
|
+
mtime = properties_mtime
|
|
49
|
+
return unless mtime # 再生成中で properties が一時的に無い: 判定を諦めて継続
|
|
50
|
+
return if @properties_mtime == mtime
|
|
51
|
+
|
|
52
|
+
@properties_mtime = mtime
|
|
53
|
+
@handler = build_handler
|
|
54
|
+
$bitclust_context_cache = nil # clear cache
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def properties_mtime
|
|
58
|
+
File.mtime("#{@dbpath}/properties")
|
|
59
|
+
rescue Errno::ENOENT
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def build_handler
|
|
64
|
+
db = BitClust::MethodDatabase.new(@dbpath)
|
|
65
|
+
if @capi
|
|
66
|
+
db = [db, BitClust::FunctionDatabase.new(@dbpath)] #: [MethodDatabase, FunctionDatabase]
|
|
67
|
+
end
|
|
68
|
+
@request_handler_class.new(db, @manager)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
|
|
2
3
|
# bitclust/requesthandler.rb
|
|
3
4
|
#
|
|
@@ -58,22 +59,25 @@ module BitClust
|
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
def handle_library(req)
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
library_name = req.library_name
|
|
63
|
+
return library_index() unless library_name
|
|
64
|
+
lib = @db.fetch_library(library_name)
|
|
63
65
|
@screenmanager.library_screen(lib, @conf).response
|
|
64
66
|
end
|
|
65
67
|
|
|
66
68
|
def handle_class(req)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
class_name = req.class_name
|
|
70
|
+
return class_index() unless class_name
|
|
71
|
+
c = @db.fetch_class(class_name)
|
|
72
|
+
h = @conf.dup #: RequestHandler::conf_class
|
|
70
73
|
h[:level] = req.ancestors_level
|
|
71
74
|
@screenmanager.class_screen(c, h).response
|
|
72
75
|
end
|
|
73
76
|
|
|
74
77
|
def handle_method(req)
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
method_spec = req.method_spec or raise RequestError, 'method request but method_spec is nil'
|
|
79
|
+
ms = @db.fetch_methods(method_spec)
|
|
80
|
+
raise MethodNotFound.new(method_spec.to_s) if ms.nil? || ms.empty?
|
|
77
81
|
@screenmanager.method_screen(ms, @conf).response
|
|
78
82
|
end
|
|
79
83
|
|
|
@@ -90,13 +94,12 @@ module BitClust
|
|
|
90
94
|
end
|
|
91
95
|
|
|
92
96
|
def handle_search(req)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
q = URI.unescape(q0)
|
|
97
|
+
q0 = req.query['q'].to_s
|
|
98
|
+
q = URI.decode_www_form_component(q0)
|
|
96
99
|
start = Time.now.to_i
|
|
97
100
|
ret = SimpleSearcher.search_pattern(@db, q)
|
|
98
101
|
elapsed_time = Time.now.to_f - start.to_f
|
|
99
|
-
c = @conf.dup
|
|
102
|
+
c = @conf.dup #: RequestHandler::conf_search
|
|
100
103
|
c[:q] = q0
|
|
101
104
|
c[:elapsed_time] = elapsed_time
|
|
102
105
|
@screenmanager.search_screen(ret, c).response
|
|
@@ -106,10 +109,11 @@ module BitClust
|
|
|
106
109
|
d = @db.fetch_doc(req.doc_name || 'index' )
|
|
107
110
|
@screenmanager.doc_screen(d, @conf).response
|
|
108
111
|
end
|
|
109
|
-
|
|
112
|
+
|
|
110
113
|
def handle_function(req)
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
function_name = req.function_name
|
|
115
|
+
return function_index() unless function_name
|
|
116
|
+
f = @cdb.fetch_function(function_name)
|
|
113
117
|
@screenmanager.function_screen(f, @conf).response
|
|
114
118
|
end
|
|
115
119
|
|
|
@@ -150,7 +154,7 @@ module BitClust
|
|
|
150
154
|
end
|
|
151
155
|
|
|
152
156
|
def doc_name
|
|
153
|
-
name = path_info.sub(%r!\A/!, '')
|
|
157
|
+
name = (path_info || raise).sub(%r!\A/!, '')
|
|
154
158
|
name unless name.empty?
|
|
155
159
|
end
|
|
156
160
|
|
|
@@ -187,6 +191,7 @@ module BitClust
|
|
|
187
191
|
unless typechar?(typechar)
|
|
188
192
|
raise InvalidKey, "invalid method-type ID: #{typechar.inspect}"
|
|
189
193
|
end
|
|
194
|
+
# @type var typechar: NameUtils::typechar
|
|
190
195
|
cname = classid2name(cid)
|
|
191
196
|
tmark = typechar2mark(typechar)
|
|
192
197
|
mname = decodename_url(mencoded)
|
|
@@ -308,7 +313,8 @@ module BitClust
|
|
|
308
313
|
end
|
|
309
314
|
|
|
310
315
|
def update(webrick_res)
|
|
311
|
-
|
|
316
|
+
status = @screen.status
|
|
317
|
+
webrick_res.status = status if status
|
|
312
318
|
webrick_res['Content-Type'] = @screen.content_type
|
|
313
319
|
# webrick_res['Last-Modified'] = @screen.last_modified
|
|
314
320
|
body = @screen.body
|
data/lib/bitclust/ridatabase.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'rdoc/ri/ri_reader'
|
|
2
3
|
require 'rdoc/ri/ri_cache'
|
|
3
4
|
require 'rdoc/ri/ri_paths'
|
|
@@ -168,7 +169,7 @@ module RI
|
|
|
168
169
|
name = full_name()
|
|
169
170
|
unless /\#/ =~ name
|
|
170
171
|
components = name.split('::')
|
|
171
|
-
m = components.pop
|
|
172
|
+
m = components.pop || raise
|
|
172
173
|
components.join('::') + '.' + m
|
|
173
174
|
else
|
|
174
175
|
name
|
|
@@ -236,7 +237,7 @@ class Formatter
|
|
|
236
237
|
line "--- #{m.full_name}#{trim_space(m.params)}"
|
|
237
238
|
else
|
|
238
239
|
m.params.lines.each do |sig|
|
|
239
|
-
line "--- #{trim_sig(sig)}
|
|
240
|
+
line "--- #{trim_sig(sig)}#%todo\n"
|
|
240
241
|
end
|
|
241
242
|
end
|
|
242
243
|
unless m.aliases.empty?
|
|
@@ -258,15 +259,17 @@ class Formatter
|
|
|
258
259
|
s = trim_space(s)
|
|
259
260
|
s.sub!(/\A[a-z]\w+\./, '')
|
|
260
261
|
s.sub!(/=>/, '->')
|
|
262
|
+
# steep:ignore:start
|
|
261
263
|
s.sub!(/(->.*)\bstr(ing)?\b/){ $1 + 'String' }
|
|
262
264
|
s.sub!(/(->.*)\bint(eger)?\b/){ $1 + 'Integer' }
|
|
263
265
|
s.sub!(/(->.*)\b(an_)?obj\b/){ $1 + 'object' }
|
|
264
266
|
s.sub!(/(->.*)\b(a_)?hash\b/){ $1 + 'Hash' }
|
|
265
267
|
s.sub!(/(->.*)\b(an_)?array\b/){ $1 + 'Array' }
|
|
266
|
-
|
|
268
|
+
# steep:ignore:end
|
|
269
|
+
s.sub!(/ or /, ' | ')
|
|
267
270
|
s
|
|
268
271
|
end
|
|
269
|
-
|
|
272
|
+
|
|
270
273
|
def format_elements(elems)
|
|
271
274
|
return "" unless elems
|
|
272
275
|
return "" if elems.empty?
|
|
@@ -274,6 +277,7 @@ class Formatter
|
|
|
274
277
|
end
|
|
275
278
|
|
|
276
279
|
def format_element(e)
|
|
280
|
+
# steep:ignore:start
|
|
277
281
|
case e
|
|
278
282
|
when SM::Flow::P, SM::Flow::LI
|
|
279
283
|
paragraph(e)
|
|
@@ -288,6 +292,7 @@ class Formatter
|
|
|
288
292
|
else
|
|
289
293
|
raise "unkwnown markup: #{e.class}"
|
|
290
294
|
end
|
|
295
|
+
# steep:ignore:end
|
|
291
296
|
end
|
|
292
297
|
|
|
293
298
|
def headline(e)
|
|
@@ -305,6 +310,7 @@ class Formatter
|
|
|
305
310
|
end
|
|
306
311
|
|
|
307
312
|
def list(e)
|
|
313
|
+
# steep:ignore:start
|
|
308
314
|
case e.type
|
|
309
315
|
when SM::ListBase::BULLET
|
|
310
316
|
e.contents.map {|item| "* #{format_element(e)}" }.join("\n")
|
|
@@ -328,6 +334,7 @@ class Formatter
|
|
|
328
334
|
else
|
|
329
335
|
raise "unknown list type: #{e.type.inspect}"
|
|
330
336
|
end
|
|
337
|
+
# steep:ignore:end
|
|
331
338
|
end
|
|
332
339
|
|
|
333
340
|
def remove_inline(str)
|