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.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/README.md +65 -0
  4. data/Rakefile +32 -0
  5. data/data/bitclust/catalog/ja_JP.UTF-8 +19 -1
  6. data/data/bitclust/searchpage/index.html +90 -0
  7. data/data/bitclust/template/class +69 -8
  8. data/data/bitclust/template/function +2 -2
  9. data/data/bitclust/template/layout +11 -3
  10. data/data/bitclust/template/method +2 -2
  11. data/data/bitclust/template/search +1 -1
  12. data/data/bitclust/template.epub/class +22 -1
  13. data/data/bitclust/template.epub/function +2 -2
  14. data/data/bitclust/template.epub/layout +1 -3
  15. data/data/bitclust/template.epub/method +2 -2
  16. data/data/bitclust/template.lillia/class +26 -5
  17. data/data/bitclust/template.lillia/layout +1 -3
  18. data/data/bitclust/template.lillia/method +2 -2
  19. data/data/bitclust/template.offline/class +49 -5
  20. data/data/bitclust/template.offline/function +2 -2
  21. data/data/bitclust/template.offline/layout +27 -3
  22. data/data/bitclust/template.offline/method +2 -2
  23. data/lib/bitclust/app.rb +17 -17
  24. data/lib/bitclust/capi_converter.rb +20 -0
  25. data/lib/bitclust/classentry.rb +68 -17
  26. data/lib/bitclust/compat.rb +3 -2
  27. data/lib/bitclust/completion.rb +59 -27
  28. data/lib/bitclust/crossrubyutils.rb +9 -5
  29. data/lib/bitclust/database.rb +29 -8
  30. data/lib/bitclust/doc_converter.rb +63 -0
  31. data/lib/bitclust/docentry.rb +2 -1
  32. data/lib/bitclust/entity_splitter.rb +221 -0
  33. data/lib/bitclust/entry.rb +48 -7
  34. data/lib/bitclust/exception.rb +1 -0
  35. data/lib/bitclust/functiondatabase.rb +14 -1
  36. data/lib/bitclust/functionentry.rb +6 -1
  37. data/lib/bitclust/functionreferenceparser.rb +5 -4
  38. data/lib/bitclust/generators/epub.rb +11 -3
  39. data/lib/bitclust/htmlutils.rb +2 -1
  40. data/lib/bitclust/include_graph.rb +375 -0
  41. data/lib/bitclust/include_pruner.rb +144 -0
  42. data/lib/bitclust/interface.rb +2 -1
  43. data/lib/bitclust/libraryentry.rb +9 -7
  44. data/lib/bitclust/lineinput.rb +8 -5
  45. data/lib/bitclust/link_checker.rb +179 -0
  46. data/lib/bitclust/markdown_bridge.rb +186 -0
  47. data/lib/bitclust/markdown_orchestrator.rb +267 -0
  48. data/lib/bitclust/markdown_to_rrd.rb +824 -0
  49. data/lib/bitclust/markdown_tree.rb +217 -0
  50. data/lib/bitclust/mdcompiler.rb +883 -0
  51. data/lib/bitclust/mdparser.rb +347 -0
  52. data/lib/bitclust/messagecatalog.rb +4 -3
  53. data/lib/bitclust/method_since_calculator.rb +117 -0
  54. data/lib/bitclust/methoddatabase.rb +125 -14
  55. data/lib/bitclust/methodentry.rb +130 -7
  56. data/lib/bitclust/methodid.rb +13 -11
  57. data/lib/bitclust/methodsignature.rb +11 -4
  58. data/lib/bitclust/nameutils.rb +42 -22
  59. data/lib/bitclust/parseutils.rb +1 -0
  60. data/lib/bitclust/preprocessor.rb +70 -32
  61. data/lib/bitclust/progress_bar.rb +1 -0
  62. data/lib/bitclust/rdcompiler.rb +197 -96
  63. data/lib/bitclust/refsdatabase.rb +24 -8
  64. data/lib/bitclust/reloadable_request_handler.rb +72 -0
  65. data/lib/bitclust/requesthandler.rb +22 -16
  66. data/lib/bitclust/ridatabase.rb +11 -4
  67. data/lib/bitclust/rrd_to_markdown.rb +925 -0
  68. data/lib/bitclust/rrdparser.rb +197 -30
  69. data/lib/bitclust/runner.rb +18 -2
  70. data/lib/bitclust/screen.rb +81 -11
  71. data/lib/bitclust/search_index_generator.rb +288 -0
  72. data/lib/bitclust/searcher.rb +72 -22
  73. data/lib/bitclust/server.rb +6 -1
  74. data/lib/bitclust/silent_progress_bar.rb +1 -0
  75. data/lib/bitclust/simplesearcher.rb +25 -12
  76. data/lib/bitclust/subcommand.rb +8 -1
  77. data/lib/bitclust/subcommands/ancestors_command.rb +10 -2
  78. data/lib/bitclust/subcommands/checklink_command.rb +54 -0
  79. data/lib/bitclust/subcommands/chm_command.rb +16 -7
  80. data/lib/bitclust/subcommands/classes_command.rb +6 -0
  81. data/lib/bitclust/subcommands/epub_command.rb +1 -0
  82. data/lib/bitclust/subcommands/extract_command.rb +6 -0
  83. data/lib/bitclust/subcommands/htmlfile_command.rb +22 -7
  84. data/lib/bitclust/subcommands/init_command.rb +5 -1
  85. data/lib/bitclust/subcommands/list_command.rb +13 -4
  86. data/lib/bitclust/subcommands/lookup_command.rb +29 -9
  87. data/lib/bitclust/subcommands/methods_command.rb +11 -2
  88. data/lib/bitclust/subcommands/methodsince_command.rb +80 -0
  89. data/lib/bitclust/subcommands/preproc_command.rb +6 -0
  90. data/lib/bitclust/subcommands/property_command.rb +3 -1
  91. data/lib/bitclust/subcommands/query_command.rb +1 -0
  92. data/lib/bitclust/subcommands/searchpage_command.rb +102 -0
  93. data/lib/bitclust/subcommands/server_command.rb +16 -10
  94. data/lib/bitclust/subcommands/setup_command.rb +25 -10
  95. data/lib/bitclust/subcommands/statichtml_command.rb +132 -6
  96. data/lib/bitclust/subcommands/update_command.rb +111 -2
  97. data/lib/bitclust/syntax_highlighter.rb +52 -5
  98. data/lib/bitclust/textutils.rb +4 -3
  99. data/lib/bitclust/version.rb +2 -1
  100. data/lib/bitclust/version_badges.rb +90 -0
  101. data/lib/bitclust/whole_file_gate.rb +137 -0
  102. data/lib/bitclust.rb +1 -0
  103. data/test/test_app.rb +269 -0
  104. data/test/test_bitclust.rb +2 -0
  105. data/test/test_capi_converter.rb +91 -0
  106. data/test/test_class_screen.rb +413 -0
  107. data/test/test_copy_doc_md.rb +53 -0
  108. data/test/test_doc_converter.rb +78 -0
  109. data/test/test_entity_splitter.rb +231 -0
  110. data/test/test_entry.rb +207 -2
  111. data/test/test_eol_warning.rb +43 -0
  112. data/test/test_functionreferenceparser.rb +11 -0
  113. data/test/test_include_graph.rb +640 -0
  114. data/test/test_include_pruner.rb +133 -0
  115. data/test/test_link_checker.rb +114 -0
  116. data/test/test_lookup_command.rb +135 -0
  117. data/test/test_markdown_bridge.rb +217 -0
  118. data/test/test_markdown_orchestrator.rb +478 -0
  119. data/test/test_markdown_to_rrd.rb +757 -0
  120. data/test/test_markdown_tree.rb +369 -0
  121. data/test/test_mdcompiler.rb +1276 -0
  122. data/test/test_mdparser.rb +538 -0
  123. data/test/test_method_screen.rb +166 -0
  124. data/test/test_method_since_calculator.rb +290 -0
  125. data/test/test_methoddatabase.rb +16 -0
  126. data/test/test_methodentry.rb +328 -0
  127. data/test/test_methodsignature.rb +3 -1
  128. data/test/test_methodsince_command.rb +168 -0
  129. data/test/test_nameutils.rb +22 -0
  130. data/test/test_preprocessor.rb +215 -0
  131. data/test/test_rdcompiler.rb +429 -27
  132. data/test/test_refsdatabase.rb +32 -0
  133. data/test/test_rrd_to_markdown.rb +968 -0
  134. data/test/test_rrdparser.rb +295 -2
  135. data/test/test_run_ruby_wasm.rb +54 -0
  136. data/test/test_run_worker_prelude.rb +83 -0
  137. data/test/test_runner.rb +51 -0
  138. data/test/test_search_index_generator.rb +513 -0
  139. data/test/test_search_screen.rb +48 -0
  140. data/test/test_searcher.rb +153 -0
  141. data/test/test_searchpage_command.rb +167 -0
  142. data/test/test_simplesearcher.rb +28 -0
  143. data/test/test_statichtml_command.rb +204 -0
  144. data/test/test_syntax_highlighter.rb +60 -0
  145. data/test/test_whole_file_gate.rb +175 -0
  146. data/theme/default/js/NOTICE +42 -0
  147. data/theme/default/js/run-worker.js +111 -0
  148. data/theme/default/js/run.js +350 -0
  149. data/theme/default/js/search_controller.js +134 -0
  150. data/theme/default/js/search_init.js +176 -0
  151. data/theme/default/js/search_navigation.js +110 -0
  152. data/theme/default/js/search_page.js +202 -0
  153. data/theme/default/js/search_ranker.js +244 -0
  154. data/theme/default/script.js +91 -18
  155. data/theme/default/search.css +149 -0
  156. data/theme/default/style.css +193 -21
  157. data/theme/default/syntax-highlight.css +8 -0
  158. data/theme/lillia/style.css +45 -1
  159. metadata +178 -21
  160. 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\#@\#/ # preprocessor comment
95
+ when /\A\#[@%]\#/ # preprocessor comment
89
96
  ;
90
- when /\A\#@todo/i
91
- @buf.push line.gsub(/\A\#/, '') if current_cond.processing?
92
- when /\A\#@include\s*\((.*?)\)/
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
- @buf.concat Preprocessor.process("#{basedir}/#{file}", @params)
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\#@since\b/
118
+ when /\A\#[@%]since\b/
102
119
  cond_stmt_begin line, build_cond_by_value(line, 'version >=')
103
- when /\A\#@until\b/
120
+ when /\A\#[@%]until\b/
104
121
  cond_stmt_begin line, build_cond_by_value(line, 'version <')
105
- when /\A\#@samplecode\b/
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\#@if\b/
108
- cond_stmt_begin line, line.sub(/\A\#@if/, '').strip
109
- when /\A\#@else\s*\z/
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\#@end\s*\z/
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\#@\w+/, '').strip
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\#@samplecode/, "")
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\#@include\s*\((.*?)\)/ =~ line
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}"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  begin
3
4
  require 'progressbar'