bitclust-core 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/data/bitclust/template.offline/class +85 -26
  3. data/data/bitclust/template.offline/class-index +31 -4
  4. data/data/bitclust/template.offline/doc +37 -7
  5. data/data/bitclust/template.offline/function +37 -7
  6. data/data/bitclust/template.offline/function-index +31 -5
  7. data/data/bitclust/template.offline/layout +4 -4
  8. data/data/bitclust/template.offline/library +38 -6
  9. data/data/bitclust/template.offline/library-index +31 -4
  10. data/data/bitclust/template.offline/method +52 -10
  11. data/lib/bitclust/classentry.rb +1 -0
  12. data/lib/bitclust/completion.rb +1 -0
  13. data/lib/bitclust/docentry.rb +1 -0
  14. data/lib/bitclust/libraryentry.rb +3 -1
  15. data/lib/bitclust/methodentry.rb +5 -4
  16. data/lib/bitclust/methodid.rb +1 -0
  17. data/lib/bitclust/nameutils.rb +7 -7
  18. data/lib/bitclust/preprocessor.rb +2 -2
  19. data/lib/bitclust/rdcompiler.rb +17 -8
  20. data/lib/bitclust/requesthandler.rb +3 -3
  21. data/lib/bitclust/ridatabase.rb +2 -1
  22. data/lib/bitclust/rrdparser.rb +0 -1
  23. data/lib/bitclust/screen.rb +30 -2
  24. data/lib/bitclust/simplesearcher.rb +1 -1
  25. data/lib/bitclust/subcommands/methods_command.rb +1 -1
  26. data/lib/bitclust/subcommands/server_command.rb +6 -1
  27. data/lib/bitclust/subcommands/setup_command.rb +1 -1
  28. data/lib/bitclust/subcommands/statichtml_command.rb +23 -7
  29. data/lib/bitclust/syntax_highlighter.rb +4 -3
  30. data/lib/bitclust/version.rb +1 -1
  31. data/test/test_bitclust.rb +1 -1
  32. data/test/test_syntax_highlighter.rb +8 -2
  33. data/theme/default/rurema.png +0 -0
  34. data/theme/default/rurema.svg +31 -0
  35. data/theme/default/script.js +35 -0
  36. data/theme/default/style.css +65 -0
  37. metadata +15 -13
@@ -1,16 +1,59 @@
1
1
  <%
2
2
  entry = @entries.sort.first
3
- @title = "#{entry.type_label} #{entry.label}"
3
+ @title = entry.label
4
4
  @description = entry.description
5
5
  %>
6
- <p>
7
- <%= manual_home_link() %>
8
- &gt; <a href="<%= library_index_url() %>"><%= _('All Libraries') %></a>
9
- &gt; <%= friendly_library_link(entry.library.name) %>
10
- &gt; <%= class_link(entry.klass.name, _(entry.klass.type.to_s + ' %s', entry.klass.name)) %>
11
- &gt; <% if entry.typename == :special_variable %>$<% end %><%=h entry.name %>
12
- <% unless entry.really_public? %>(<%= entry.visibility %>)<% end %>
13
- </p>
6
+ <% if @conf[:canonical_base_url] %>
7
+ <script type="application/ld+json">
8
+ <%=
9
+ breadcrumb_json_ld(
10
+ [
11
+ {
12
+ name: manual_home_name,
13
+ url: absolute_url_to(@urlmapper.document_url('index'))
14
+ },
15
+ {
16
+ name: _('All Libraries'),
17
+ url: absolute_url_to(library_index_url),
18
+ },
19
+ {
20
+ name: friendly_library_name(entry.library.name),
21
+ url: absolute_url_to(@urlmapper.library_url(entry.library.name))
22
+ },
23
+ {
24
+ name: _("#{entry.klass.type} %s", entry.klass.name),
25
+ url: absolute_url_to(@urlmapper.class_url(entry.klass.name))
26
+ },
27
+ {
28
+ name: %Q<#{'$' if entry.typename == :special_variable}#{entry.name}#{" (#{entry.visibility})" unless entry.really_public?}>,
29
+ url: canonical_url
30
+ }
31
+ ]
32
+ )
33
+ %>
34
+ </script>
35
+ <% end %>
36
+ <header>
37
+ <nav>
38
+ <ol class="inline-breadcrumb-list">
39
+ <li>
40
+ <%= manual_home_link() %>
41
+ </li>
42
+ <li>
43
+ <a href="<%= library_index_url() %>"><%= _('All Libraries') %></a>
44
+ </li>
45
+ <li>
46
+ <%= friendly_library_link(entry.library.name) %>
47
+ </li>
48
+ <li>
49
+ <%= class_link(entry.klass.name, _(entry.klass.type.to_s + ' %s', entry.klass.name)) %>
50
+ </li>
51
+ <li>
52
+ <% if entry.typename == :special_variable %>$<% end %><%=h entry.name %> <% unless entry.really_public? %>(<%= entry.visibility %>)<% end %>
53
+ </li>
54
+ </ol>
55
+ </nav>
56
+ </header>
14
57
 
15
58
  <% headline_init %>
16
59
  <%= headline("#{entry.type_label} #{entry.label}") %>
@@ -25,4 +68,3 @@
25
68
  headline_pop
26
69
  %>
27
70
  </dl>
28
-
@@ -39,6 +39,7 @@ module BitClust
39
39
  attr_reader :id
40
40
 
41
41
  def ==(other)
42
+ return false if self.class != other.class
42
43
  @id == other.id
43
44
  end
44
45
 
@@ -499,6 +499,7 @@ $cm_comb_m += 1
499
499
  end
500
500
 
501
501
  def ==(other)
502
+ return false if self.class != other.class
502
503
  @idstring == other.idstring
503
504
  end
504
505
 
@@ -28,6 +28,7 @@ module BitClust
28
28
  attr_reader :id
29
29
 
30
30
  def ==(other)
31
+ return false if self.class != other.class
31
32
  @id == other.id
32
33
  end
33
34
 
@@ -35,6 +35,7 @@ module BitClust
35
35
  @link_checked = false
36
36
  end
37
37
  init_properties
38
+ @all_classes = nil
38
39
  end
39
40
 
40
41
  attr_reader :id, :name
@@ -42,6 +43,7 @@ module BitClust
42
43
  alias label name
43
44
 
44
45
  def ==(other)
46
+ return false if self.class != other.class
45
47
  @id == other.id
46
48
  end
47
49
 
@@ -217,5 +219,5 @@ module BitClust
217
219
  @db.dirty_library self
218
220
  end
219
221
  end
220
- end
222
+ end
221
223
  end
@@ -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
 
@@ -101,7 +102,7 @@ module BitClust
101
102
  }
102
103
 
103
104
  def inspect
104
- c, t, m, lib = methodid2specparts(@id)
105
+ c, t, _m, _lib = methodid2specparts(@id)
105
106
  "\#<method #{c}#{t}#{names().join(',')}>"
106
107
  end
107
108
 
@@ -114,12 +115,12 @@ module BitClust
114
115
  end
115
116
 
116
117
  def label
117
- c, t, m, lib = methodid2specparts(@id)
118
+ c, t, m, _lib = methodid2specparts(@id)
118
119
  "#{t == '$' ? '' : c}#{t}#{m}"
119
120
  end
120
121
 
121
122
  def short_label
122
- c, t, m, lib = methodid2specparts(@id)
123
+ _c, t, m, _lib = methodid2specparts(@id)
123
124
  "#{t == '#' ? '' : t}#{m}"
124
125
  end
125
126
 
@@ -128,7 +129,7 @@ module BitClust
128
129
  end
129
130
 
130
131
  def labels
131
- c, t, m, lib = methodid2specparts(@id)
132
+ c, t, _m, _lib = methodid2specparts(@id)
132
133
  names().map {|name| "#{c}#{t}#{name}" }
133
134
  end
134
135
 
@@ -93,6 +93,7 @@ module BitClust
93
93
  end
94
94
 
95
95
  def ==(other)
96
+ return false if self.class != other.class
96
97
  @klass == other.klass and
97
98
  @type == other.type and
98
99
  @method == other.method
@@ -67,7 +67,7 @@ module BitClust
67
67
  end
68
68
 
69
69
  def methodid2specstring(id)
70
- c, t, m, lib = *split_method_id(id)
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
- c, t, m, lib = *split_method_id(id)
80
+ _c, _t, _m, lib = *split_method_id(id)
81
81
  lib
82
82
  end
83
83
 
84
84
  def methodid2classid(id)
85
- c, t, m, lib = *split_method_id(id)
85
+ c, _t, _m, _lib = *split_method_id(id)
86
86
  c
87
87
  end
88
88
 
89
89
  def methodid2typechar(id)
90
- c, t, m, lib = *split_method_id(id)
90
+ _c, t, _m, _lib = *split_method_id(id)
91
91
  t
92
92
  end
93
93
 
94
94
  def methodid2typename(id)
95
- c, t, m, lib = *split_method_id(id)
95
+ _c, t, _m, _lib = *split_method_id(id)
96
96
  typechar2name(t)
97
97
  end
98
98
 
99
99
  def methodid2typemark(id)
100
- c, t, m, lib = *split_method_id(id)
100
+ _c, t, _m, _lib = *split_method_id(id)
101
101
  typechar2mark(t)
102
102
  end
103
103
 
104
104
  def methodid2mname(id)
105
- c, t, m, lib = *split_method_id(id)
105
+ _c, _t, m, _lib = *split_method_id(id)
106
106
  decodename_url(m)
107
107
  end
108
108
 
@@ -86,7 +86,7 @@ module BitClust
86
86
  file = $1.strip
87
87
  basedir = File.dirname(line.location.file)
88
88
  @buf.concat Preprocessor.process("#{basedir}/#{file}", @params)
89
- rescue Errno::ENOENT => err
89
+ rescue Errno::ENOENT => _err
90
90
  raise WrongInclude, "#{line.location}: \#@include'ed file not exist: #{file}"
91
91
  end
92
92
  when /\A\#@since\b/
@@ -321,7 +321,7 @@ module BitClust
321
321
  file = $1.strip
322
322
  basedir = File.dirname(line.location.file)
323
323
  @buf.concat LineCollector.process("#{basedir}/#{file}")
324
- rescue Errno::ENOENT => err
324
+ rescue Errno::ENOENT => _err
325
325
  raise WrongInclude, "#{line.location}: \#@include'ed file not exist: #{file}"
326
326
  end
327
327
  else
@@ -229,9 +229,9 @@ module BitClust
229
229
  case @f.peek
230
230
  when /\A$/
231
231
  @f.gets
232
- when /\A[ \t\z]/
232
+ when /\A[ \t]/
233
233
  line '<p>'
234
- line compile_text(text_node_from_lines(@f.span(/\A[ \t\z]/)))
234
+ line compile_text(text_node_from_lines(@f.span(/\A[ \t]/)))
235
235
  line '</p>'
236
236
  when %r!\A//emlist(?:\[(?:[^\[\]]+?)?\]\[\w+?\])?\{!
237
237
  emlist
@@ -247,8 +247,8 @@ module BitClust
247
247
  line '<dd>'
248
248
  while /\A[ \t]/ =~ @f.peek or %r!\A//emlist(?:\[(?:[^\[\]]+?)?\]\[\w+?\])?\{! =~ @f.peek
249
249
  case @f.peek
250
- when /\A[ \t\z]/
251
- line compile_text(text_node_from_lines(@f.span(/\A[ \t\z]/)))
250
+ when /\A[ \t]/
251
+ line compile_text(text_node_from_lines(@f.span(/\A[ \t]/)))
252
252
  when %r!\A//emlist(?:\[(?:[^\[\]]+?)?\]\[\w+?\])?\{!
253
253
  emlist
254
254
  end
@@ -260,6 +260,11 @@ module BitClust
260
260
  "<dt>#{s}</dt>"
261
261
  end
262
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
+
263
268
  def emlist
264
269
  command = @f.gets
265
270
  if %r!\A//emlist\[(?<caption>[^\[\]]+?)?\]\[(?<lang>\w+?)\]! =~ command
@@ -276,7 +281,11 @@ module BitClust
276
281
  string BitClust::SyntaxHighlighter.new(src, filename).highlight
277
282
  rescue BitClust::SyntaxHighlighter::Error => ex
278
283
  $stderr.puts ex.message
279
- exit(false)
284
+ if stop_on_syntax_error?
285
+ exit(false)
286
+ else
287
+ string src
288
+ end
280
289
  end
281
290
  else
282
291
  string src
@@ -319,7 +328,7 @@ module BitClust
319
328
 
320
329
  def see
321
330
  header = @f.gets
322
- cmd = header.slice!(/\A\@\w+/)
331
+ header.slice!(/\A\@\w+/)
323
332
  body = [header] + @f.span(/\A\s+\S/)
324
333
  line '<p>'
325
334
  line '[SEE_ALSO] ' + compile_text(text_node_from_lines(body))
@@ -328,7 +337,7 @@ module BitClust
328
337
 
329
338
  def todo
330
339
  header = @f.gets
331
- cmd = header.slice!(/\A\@\w+/)
340
+ header.slice!(/\A\@\w+/)
332
341
  body = header
333
342
  line '<p class="todo">'
334
343
  line '[TODO]' + body
@@ -544,7 +553,7 @@ module BitClust
544
553
  end
545
554
 
546
555
  def rdoc_url(method_id, version)
547
- cname, tmark, mname, libname = methodid2specparts(method_id)
556
+ cname, tmark, mname, _libname = methodid2specparts(method_id)
548
557
  tchar = typemark2char(tmark) == 'i' ? 'i' : 'c'
549
558
  cname = cname.split(".").first
550
559
  cname = cname.gsub('::', '/')
@@ -207,7 +207,7 @@ module BitClust
207
207
  end
208
208
 
209
209
  def defined_type?
210
- type, param = parse_path_info()
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, param = parse_path_info()
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
- type, param = parse_path_info()
259
+ _type, param = parse_path_info()
260
260
  return nil unless param
261
261
  return nil if param.empty?
262
262
  param
@@ -71,6 +71,7 @@ class Ent
71
71
  attr_reader :entry
72
72
 
73
73
  def ==(other)
74
+ return false if self.class != other.class
74
75
  @name == other.name
75
76
  end
76
77
 
@@ -121,7 +122,7 @@ class RiMethodEntry < Ent
121
122
  end
122
123
 
123
124
  def fullname
124
- c, t, m = @entry.fullname.split(/([\.\#])/, 2)
125
+ c, t = @entry.fullname.split(/([\.\#])/, 2)
125
126
  "#{c}#{t}#{@name}"
126
127
  end
127
128
  end
@@ -14,7 +14,6 @@ require 'bitclust/lineinput'
14
14
  require 'bitclust/parseutils'
15
15
  require 'bitclust/nameutils'
16
16
  require 'bitclust/exception'
17
- require 'bitclust/methoddatabase'
18
17
 
19
18
  module BitClust
20
19
 
@@ -13,7 +13,9 @@ require 'bitclust/htmlutils'
13
13
  require 'bitclust/nameutils'
14
14
  require 'bitclust/messagecatalog'
15
15
  require 'erb'
16
+ require 'json'
16
17
  require 'stringio'
18
+ require 'uri'
17
19
 
18
20
  module BitClust
19
21
 
@@ -185,7 +187,7 @@ module BitClust
185
187
  private
186
188
 
187
189
  def preproc(template)
188
- template.gsub(/^\.include ([\w\-]+)/) { load($1.untaint) }.untaint
190
+ template.gsub(/^\.include ([\w\-]+)/) { load($1) }
189
191
  end
190
192
  end
191
193
 
@@ -415,8 +417,12 @@ module BitClust
415
417
  end
416
418
  end
417
419
 
420
+ def manual_home_name
421
+ _('Ruby %s Reference Manual', ruby_version())
422
+ end
423
+
418
424
  def manual_home_link
419
- document_link('index', _('Ruby %s Reference Manual', ruby_version()))
425
+ document_link('index', manual_home_name)
420
426
  end
421
427
 
422
428
  def friendly_library_link(id)
@@ -452,6 +458,28 @@ module BitClust
452
458
  yield sigs, body
453
459
  end
454
460
  end
461
+
462
+ def breadcrumb_json_ld(items)
463
+ {
464
+ '@context': 'http://schema.org',
465
+ '@type': 'BreadcrumbList',
466
+ 'itemListElement' => items.map.with_index(1) do |item, index|
467
+ {
468
+ '@type' => 'ListItem',
469
+ 'item' => item[:url],
470
+ 'name' => item[:name],
471
+ 'position' => index
472
+ }
473
+ end
474
+ }.to_json
475
+ end
476
+
477
+ def absolute_url_to(path)
478
+ ::URI.join(
479
+ canonical_url,
480
+ path
481
+ )
482
+ end
455
483
  end
456
484
 
457
485
  class IndexScreen < TemplateScreen
@@ -13,7 +13,7 @@ module BitClust
13
13
  pat = to_pattern(pat)
14
14
  return [] if pat.empty? or /\A\s+\z/ =~ pat
15
15
  cname, type, mname = parse_method_spec_pattern(pat)
16
- ret = cs = ms = []
16
+ cs = ms = []
17
17
  if cname and not cname.empty?
18
18
  if mname
19
19
  ms = find_class_method(db, cname, type, mname)
@@ -102,7 +102,7 @@ module BitClust
102
102
  ORDER = { '.' => 1, '#' => 2, '::' => 3 }
103
103
 
104
104
  def m_order(m)
105
- m, t, c = *m.reverse.split(/(\#|\.|::)/, 2)
105
+ m, t = *m.reverse.split(/(\#|\.|::)/, 2)
106
106
  [ORDER[t] || 0, m.reverse]
107
107
  end
108
108
 
@@ -27,7 +27,12 @@ module BitClust
27
27
  @srcdir = @datadir = @themedir = @theme = @templatedir = nil
28
28
  @encoding = 'utf-8' # encoding of view
29
29
  if Object.const_defined?(:Encoding)
30
- Encoding.default_external = @encoding
30
+ begin
31
+ verbose, $VERBOSE = $VERBOSE, false
32
+ Encoding.default_external = @encoding
33
+ ensure
34
+ $VERBOSE = verbose
35
+ end
31
36
  end
32
37
 
33
38
  @debugp = false