rdoc 5.1.0 → 6.3.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rdoc might be problematic. Click here for more details.

Files changed (158) hide show
  1. checksums.yaml +5 -5
  2. data/CONTRIBUTING.rdoc +4 -4
  3. data/Gemfile +9 -0
  4. data/History.rdoc +4 -4
  5. data/README.rdoc +5 -6
  6. data/Rakefile +35 -67
  7. data/lib/rdoc/alias.rb +1 -1
  8. data/lib/rdoc/anon_class.rb +1 -1
  9. data/lib/rdoc/any_method.rb +59 -15
  10. data/lib/rdoc/attr.rb +1 -1
  11. data/lib/rdoc/class_module.rb +5 -3
  12. data/lib/rdoc/code_object.rb +2 -9
  13. data/lib/rdoc/code_objects.rb +1 -1
  14. data/lib/rdoc/comment.rb +32 -11
  15. data/lib/rdoc/constant.rb +3 -3
  16. data/lib/rdoc/context/section.rb +1 -14
  17. data/lib/rdoc/context.rb +63 -20
  18. data/lib/rdoc/cross_reference.rb +33 -15
  19. data/lib/rdoc/encoding.rb +58 -30
  20. data/lib/rdoc/erb_partial.rb +2 -2
  21. data/lib/rdoc/erbio.rb +8 -4
  22. data/lib/rdoc/extend.rb +1 -1
  23. data/lib/rdoc/generator/darkfish.rb +60 -29
  24. data/lib/rdoc/generator/json_index.rb +6 -3
  25. data/lib/rdoc/generator/markup.rb +3 -13
  26. data/lib/rdoc/generator/pot/message_extractor.rb +1 -1
  27. data/lib/rdoc/generator/pot/po.rb +3 -3
  28. data/lib/rdoc/generator/pot/po_entry.rb +11 -11
  29. data/lib/rdoc/generator/pot.rb +4 -4
  30. data/lib/rdoc/generator/ri.rb +1 -1
  31. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +2 -2
  32. data/lib/rdoc/generator/template/darkfish/_head.rhtml +9 -7
  33. data/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +2 -2
  34. data/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +2 -2
  35. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +7 -7
  36. data/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +2 -2
  37. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +7 -7
  38. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +6 -6
  39. data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +5 -5
  40. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +5 -5
  41. data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +5 -5
  42. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +4 -4
  43. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +4 -4
  44. data/lib/rdoc/generator/template/darkfish/class.rhtml +45 -47
  45. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +55 -6
  46. data/lib/rdoc/generator/template/darkfish/index.rhtml +3 -4
  47. data/lib/rdoc/generator/template/darkfish/js/darkfish.js +22 -99
  48. data/lib/rdoc/generator/template/darkfish/js/search.js +32 -31
  49. data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +15 -16
  50. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +16 -16
  51. data/lib/rdoc/generator/template/json_index/js/navigation.js +4 -41
  52. data/lib/rdoc/generator/template/json_index/js/searcher.js +6 -6
  53. data/lib/rdoc/generator.rb +1 -1
  54. data/lib/rdoc/ghost_method.rb +1 -1
  55. data/lib/rdoc/i18n/locale.rb +1 -1
  56. data/lib/rdoc/i18n/text.rb +5 -5
  57. data/lib/rdoc/i18n.rb +3 -3
  58. data/lib/rdoc/include.rb +1 -1
  59. data/lib/rdoc/known_classes.rb +1 -1
  60. data/lib/rdoc/markdown/entities.rb +1 -1
  61. data/lib/rdoc/markdown/literals.kpeg +1 -0
  62. data/lib/rdoc/markdown/literals.rb +19 -7
  63. data/lib/rdoc/markdown.kpeg +92 -44
  64. data/lib/rdoc/markdown.rb +1171 -610
  65. data/lib/rdoc/markup/attr_changer.rb +1 -1
  66. data/lib/rdoc/markup/attr_span.rb +9 -3
  67. data/lib/rdoc/markup/attribute_manager.rb +115 -50
  68. data/lib/rdoc/markup/attributes.rb +7 -7
  69. data/lib/rdoc/markup/blank_line.rb +1 -1
  70. data/lib/rdoc/markup/block_quote.rb +1 -1
  71. data/lib/rdoc/markup/document.rb +1 -1
  72. data/lib/rdoc/markup/formatter.rb +25 -24
  73. data/lib/rdoc/markup/hard_break.rb +1 -1
  74. data/lib/rdoc/markup/heading.rb +4 -4
  75. data/lib/rdoc/markup/include.rb +1 -1
  76. data/lib/rdoc/markup/indented_paragraph.rb +1 -1
  77. data/lib/rdoc/markup/list.rb +1 -1
  78. data/lib/rdoc/markup/list_item.rb +1 -1
  79. data/lib/rdoc/markup/paragraph.rb +1 -1
  80. data/lib/rdoc/markup/parser.rb +79 -47
  81. data/lib/rdoc/markup/pre_process.rb +11 -6
  82. data/lib/rdoc/markup/raw.rb +1 -1
  83. data/lib/rdoc/markup/regexp_handling.rb +41 -0
  84. data/lib/rdoc/markup/rule.rb +1 -1
  85. data/lib/rdoc/markup/to_ansi.rb +1 -1
  86. data/lib/rdoc/markup/to_bs.rb +4 -4
  87. data/lib/rdoc/markup/to_html.rb +68 -26
  88. data/lib/rdoc/markup/to_html_crossref.rb +41 -26
  89. data/lib/rdoc/markup/to_html_snippet.rb +10 -10
  90. data/lib/rdoc/markup/to_joined_paragraph.rb +7 -32
  91. data/lib/rdoc/markup/to_label.rb +10 -10
  92. data/lib/rdoc/markup/to_markdown.rb +9 -9
  93. data/lib/rdoc/markup/to_rdoc.rb +35 -7
  94. data/lib/rdoc/markup/to_table_of_contents.rb +2 -1
  95. data/lib/rdoc/markup/to_test.rb +1 -1
  96. data/lib/rdoc/markup/to_tt_only.rb +3 -3
  97. data/lib/rdoc/markup/verbatim.rb +1 -1
  98. data/lib/rdoc/markup.rb +14 -17
  99. data/lib/rdoc/meta_method.rb +1 -1
  100. data/lib/rdoc/method_attr.rb +2 -2
  101. data/lib/rdoc/mixin.rb +1 -1
  102. data/lib/rdoc/normal_class.rb +3 -3
  103. data/lib/rdoc/normal_module.rb +1 -1
  104. data/lib/rdoc/options.rb +79 -21
  105. data/lib/rdoc/parser/c.rb +147 -194
  106. data/lib/rdoc/parser/changelog.rb +150 -19
  107. data/lib/rdoc/parser/markdown.rb +1 -1
  108. data/lib/rdoc/parser/rd.rb +1 -1
  109. data/lib/rdoc/parser/ripper_state_lex.rb +590 -0
  110. data/lib/rdoc/parser/ruby.rb +632 -466
  111. data/lib/rdoc/parser/ruby_tools.rb +33 -34
  112. data/lib/rdoc/parser/simple.rb +3 -3
  113. data/lib/rdoc/parser/text.rb +1 -1
  114. data/lib/rdoc/parser.rb +9 -34
  115. data/lib/rdoc/rd/block_parser.rb +47 -46
  116. data/lib/rdoc/rd/block_parser.ry +2 -2
  117. data/lib/rdoc/rd/inline.rb +5 -5
  118. data/lib/rdoc/rd/inline_parser.rb +139 -138
  119. data/lib/rdoc/rd/inline_parser.ry +1 -1
  120. data/lib/rdoc/rd.rb +1 -1
  121. data/lib/rdoc/rdoc.rb +54 -41
  122. data/lib/rdoc/require.rb +1 -1
  123. data/lib/rdoc/ri/driver.rb +132 -42
  124. data/lib/rdoc/ri/formatter.rb +1 -1
  125. data/lib/rdoc/ri/paths.rb +4 -18
  126. data/lib/rdoc/ri/store.rb +1 -1
  127. data/lib/rdoc/ri/task.rb +2 -2
  128. data/lib/rdoc/ri.rb +1 -1
  129. data/lib/rdoc/rubygems_hook.rb +3 -3
  130. data/lib/rdoc/servlet.rb +21 -12
  131. data/lib/rdoc/single_class.rb +1 -1
  132. data/lib/rdoc/stats/normal.rb +24 -18
  133. data/lib/rdoc/stats/quiet.rb +1 -1
  134. data/lib/rdoc/stats/verbose.rb +1 -1
  135. data/lib/rdoc/stats.rb +1 -1
  136. data/lib/rdoc/store.rb +38 -27
  137. data/lib/rdoc/task.rb +2 -2
  138. data/lib/rdoc/text.rb +16 -21
  139. data/lib/rdoc/token_stream.rb +56 -33
  140. data/lib/rdoc/tom_doc.rb +17 -12
  141. data/lib/rdoc/top_level.rb +9 -3
  142. data/lib/rdoc/version.rb +8 -0
  143. data/lib/rdoc.rb +24 -10
  144. data/man/ri.1 +247 -0
  145. data/rdoc.gemspec +206 -15
  146. metadata +15 -64
  147. data/.document +0 -5
  148. data/.gitignore +0 -13
  149. data/.travis.yml +0 -24
  150. data/lib/gauntlet_rdoc.rb +0 -82
  151. data/lib/rdoc/generator/template/darkfish/js/jquery.js +0 -4
  152. data/lib/rdoc/markup/formatter_test_case.rb +0 -764
  153. data/lib/rdoc/markup/inline.rb +0 -2
  154. data/lib/rdoc/markup/special.rb +0 -41
  155. data/lib/rdoc/markup/text_formatter_test_case.rb +0 -115
  156. data/lib/rdoc/ruby_lex.rb +0 -1367
  157. data/lib/rdoc/ruby_token.rb +0 -461
  158. data/lib/rdoc/test_case.rb +0 -204
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  require 'strscan'
3
3
 
4
4
  ##
@@ -9,8 +9,9 @@ require 'strscan'
9
9
  # RDoc::Markup::ToHTML.
10
10
  #
11
11
  # The parser only handles the block-level constructs Paragraph, List,
12
- # ListItem, Heading, Verbatim, BlankLine and Rule. Inline markup such as
13
- # <tt>\+blah\+</tt> is handled separately by RDoc::Markup::AttributeManager.
12
+ # ListItem, Heading, Verbatim, BlankLine, Rule and BlockQuote.
13
+ # Inline markup such as <tt>\+blah\+</tt> is handled separately by
14
+ # RDoc::Markup::AttributeManager.
14
15
  #
15
16
  # To see what markup the Parser implements read RDoc. To see how to use
16
17
  # RDoc markup to format text in your program read RDoc::Markup.
@@ -79,10 +80,6 @@ class RDoc::Markup::Parser
79
80
  @binary_input = nil
80
81
  @current_token = nil
81
82
  @debug = false
82
- @input = nil
83
- @input_encoding = nil
84
- @line = 0
85
- @line_pos = 0
86
83
  @s = nil
87
84
  @tokens = []
88
85
  end
@@ -249,7 +246,7 @@ class RDoc::Markup::Parser
249
246
 
250
247
  min_indent = nil
251
248
  generate_leading_spaces = true
252
- line = ''
249
+ line = ''.dup
253
250
 
254
251
  until @tokens.empty? do
255
252
  type, data, column, = get
@@ -257,7 +254,7 @@ class RDoc::Markup::Parser
257
254
  if type == :NEWLINE then
258
255
  line << data
259
256
  verbatim << line
260
- line = ''
257
+ line = ''.dup
261
258
  generate_leading_spaces = true
262
259
  next
263
260
  end
@@ -318,13 +315,6 @@ class RDoc::Markup::Parser
318
315
  verbatim
319
316
  end
320
317
 
321
- ##
322
- # The character offset for the input string at the given +byte_offset+
323
-
324
- def char_pos byte_offset
325
- @input.byteslice(0, byte_offset).length
326
- end
327
-
328
318
  ##
329
319
  # Pulls the next token from the stream.
330
320
 
@@ -381,6 +371,17 @@ class RDoc::Markup::Parser
381
371
  when :TEXT then
382
372
  unget
383
373
  parse_text parent, indent
374
+ when :BLOCKQUOTE then
375
+ type, _, column = get
376
+ if type == :NEWLINE
377
+ type, _, column = get
378
+ end
379
+ unget if type
380
+ bq = RDoc::Markup::BlockQuote.new
381
+ p :blockquote_start => [data, column] if @debug
382
+ parse bq, column
383
+ p :blockquote_end => indent if @debug
384
+ parent << bq
384
385
  when *LIST_TOKENS then
385
386
  unget
386
387
  parent << build_list(indent)
@@ -412,15 +413,53 @@ class RDoc::Markup::Parser
412
413
  token
413
414
  end
414
415
 
416
+ ##
417
+ # A simple wrapper of StringScanner that is aware of the current column and lineno
418
+
419
+ class MyStringScanner
420
+ def initialize(input)
421
+ @line = @column = 0
422
+ @s = StringScanner.new input
423
+ end
424
+
425
+ def scan(re)
426
+ ret = @s.scan(re)
427
+ @column += ret.length if ret
428
+ ret
429
+ end
430
+
431
+ def unscan(s)
432
+ @s.pos -= s.bytesize
433
+ @column -= s.length
434
+ end
435
+
436
+ def pos
437
+ [@column, @line]
438
+ end
439
+
440
+ def newline!
441
+ @column = 0
442
+ @line += 1
443
+ end
444
+
445
+ def eos?
446
+ @s.eos?
447
+ end
448
+
449
+ def matched
450
+ @s.matched
451
+ end
452
+
453
+ def [](i)
454
+ @s[i]
455
+ end
456
+ end
457
+
415
458
  ##
416
459
  # Creates the StringScanner
417
460
 
418
461
  def setup_scanner input
419
- @line = 0
420
- @line_pos = 0
421
- @input = input.dup
422
-
423
- @s = StringScanner.new input
462
+ @s = MyStringScanner.new input
424
463
  end
425
464
 
426
465
  ##
@@ -455,31 +494,30 @@ class RDoc::Markup::Parser
455
494
  @tokens << case
456
495
  # [CR]LF => :NEWLINE
457
496
  when @s.scan(/\r?\n/) then
458
- token = [:NEWLINE, @s.matched, *token_pos(pos)]
459
- @line_pos = char_pos @s.pos
460
- @line += 1
497
+ token = [:NEWLINE, @s.matched, *pos]
498
+ @s.newline!
461
499
  token
462
500
  # === text => :HEADER then :TEXT
463
501
  when @s.scan(/(=+)(\s*)/) then
464
502
  level = @s[1].length
465
- header = [:HEADER, level, *token_pos(pos)]
503
+ header = [:HEADER, level, *pos]
466
504
 
467
505
  if @s[2] =~ /^\r?\n/ then
468
- @s.pos -= @s[2].length
506
+ @s.unscan(@s[2])
469
507
  header
470
508
  else
471
509
  pos = @s.pos
472
510
  @s.scan(/.*/)
473
511
  @tokens << header
474
- [:TEXT, @s.matched.sub(/\r$/, ''), *token_pos(pos)]
512
+ [:TEXT, @s.matched.sub(/\r$/, ''), *pos]
475
513
  end
476
514
  # --- (at least 3) and nothing else on the line => :RULE
477
515
  when @s.scan(/(-{3,}) *\r?$/) then
478
- [:RULE, @s[1].length - 2, *token_pos(pos)]
516
+ [:RULE, @s[1].length - 2, *pos]
479
517
  # * or - followed by white space and text => :BULLET
480
518
  when @s.scan(/([*-]) +(\S)/) then
481
- @s.pos -= @s[2].bytesize # unget \S
482
- [:BULLET, @s[1], *token_pos(pos)]
519
+ @s.unscan(@s[2])
520
+ [:BULLET, @s[1], *pos]
483
521
  # A. text, a. text, 12. text => :UALPHA, :LALPHA, :NUMBER
484
522
  when @s.scan(/([a-z]|\d+)\. +(\S)/i) then
485
523
  # FIXME if tab(s), the column will be wrong
@@ -488,7 +526,7 @@ class RDoc::Markup::Parser
488
526
  # before (and provide a check for that at least in debug
489
527
  # mode)
490
528
  list_label = @s[1]
491
- @s.pos -= @s[2].bytesize # unget \S
529
+ @s.unscan(@s[2])
492
530
  list_type =
493
531
  case list_label
494
532
  when /[a-z]/ then :LALPHA
@@ -497,20 +535,24 @@ class RDoc::Markup::Parser
497
535
  else
498
536
  raise ParseError, "BUG token #{list_label}"
499
537
  end
500
- [list_type, list_label, *token_pos(pos)]
538
+ [list_type, list_label, *pos]
501
539
  # [text] followed by spaces or end of line => :LABEL
502
540
  when @s.scan(/\[(.*?)\]( +|\r?$)/) then
503
- [:LABEL, @s[1], *token_pos(pos)]
541
+ [:LABEL, @s[1], *pos]
504
542
  # text:: followed by spaces or end of line => :NOTE
505
543
  when @s.scan(/(.*?)::( +|\r?$)/) then
506
- [:NOTE, @s[1], *token_pos(pos)]
544
+ [:NOTE, @s[1], *pos]
545
+ # >>> followed by end of line => :BLOCKQUOTE
546
+ when @s.scan(/>>> *(\w+)?$/) then
547
+ [:BLOCKQUOTE, @s[1], *pos]
507
548
  # anything else: :TEXT
508
- else @s.scan(/(.*?)( )?\r?$/)
509
- token = [:TEXT, @s[1], *token_pos(pos)]
549
+ else
550
+ @s.scan(/(.*?)( )?\r?$/)
551
+ token = [:TEXT, @s[1], *pos]
510
552
 
511
553
  if @s[2] then
512
554
  @tokens << token
513
- [:BREAK, @s[2], *token_pos(pos + @s[1].length)]
555
+ [:BREAK, @s[2], pos[0] + @s[1].length, pos[1]]
514
556
  else
515
557
  token
516
558
  end
@@ -520,16 +562,6 @@ class RDoc::Markup::Parser
520
562
  self
521
563
  end
522
564
 
523
- ##
524
- # Calculates the column (by character) and line of the current token based
525
- # on +byte_offset+.
526
-
527
- def token_pos byte_offset
528
- offset = char_pos byte_offset
529
-
530
- [offset - @line_pos, @line]
531
- end
532
-
533
565
  ##
534
566
  # Returns the current token to the token stream
535
567
 
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  ##
3
3
  # Handle common directives that can occur in a block of text:
4
4
  #
@@ -105,7 +105,7 @@ class RDoc::Markup::PreProcess
105
105
  # regexp helper (square brackets for optional)
106
106
  # $1 $2 $3 $4 $5
107
107
  # [prefix][\]:directive:[spaces][param]newline
108
- text.gsub!(/^([ \t]*(?:#|\/?\*)?[ \t]*)(\\?):(\w+):([ \t]*)(.+)?(\r?\n|$)/) do
108
+ text = text.gsub(/^([ \t]*(?:#|\/?\*)?[ \t]*)(\\?):(\w+):([ \t]*)(.+)?(\r?\n|$)/) do
109
109
  # skip something like ':toto::'
110
110
  next $& if $4.empty? and $5 and $5[0, 1] == ':'
111
111
 
@@ -123,7 +123,11 @@ class RDoc::Markup::PreProcess
123
123
  handle_directive $1, $3, $5, code_object, text.encoding, &block
124
124
  end
125
125
 
126
- comment = text unless comment
126
+ if comment then
127
+ comment.text = text
128
+ else
129
+ comment = text
130
+ end
127
131
 
128
132
  self.class.post_processors.each do |handler|
129
133
  handler.call comment, code_object
@@ -150,7 +154,7 @@ class RDoc::Markup::PreProcess
150
154
 
151
155
  case directive
152
156
  when 'arg', 'args' then
153
- return "#{prefix}:#{directive}: #{param}\n" unless code_object
157
+ return "#{prefix}:#{directive}: #{param}\n" unless code_object && code_object.kind_of?(RDoc::AnyMethod)
154
158
 
155
159
  code_object.params = param
156
160
 
@@ -174,7 +178,7 @@ class RDoc::Markup::PreProcess
174
178
 
175
179
  blankline
176
180
  when 'include' then
177
- filename = param.split.first
181
+ filename = param.split(' ', 2).first
178
182
  include_file filename, prefix, encoding
179
183
  when 'main' then
180
184
  @options.main_page = param if @options.respond_to? :main_page
@@ -212,7 +216,7 @@ class RDoc::Markup::PreProcess
212
216
  when 'yield', 'yields' then
213
217
  return blankline unless code_object
214
218
  # remove parameter &block
215
- code_object.params.sub!(/,?\s*&\w+/, '') if code_object.params
219
+ code_object.params = code_object.params.sub(/,?\s*&\w+/, '') if code_object.params
216
220
 
217
221
  code_object.block_params = param
218
222
 
@@ -262,6 +266,7 @@ class RDoc::Markup::PreProcess
262
266
  end
263
267
 
264
268
  content = RDoc::Encoding.read_file full_name, encoding, true
269
+ content = RDoc::Encoding.remove_magic_comment content
265
270
 
266
271
  # strip magic comment
267
272
  content = content.sub(/\A# .*coding[=:].*$/, '').lstrip
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  ##
3
3
  # A section of text that is added to the output document as-is
4
4
 
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ ##
3
+ # Hold details of a regexp handling sequence
4
+
5
+ class RDoc::Markup::RegexpHandling
6
+
7
+ ##
8
+ # Regexp handling type
9
+
10
+ attr_reader :type
11
+
12
+ ##
13
+ # Regexp handling text
14
+
15
+ attr_accessor :text
16
+
17
+ ##
18
+ # Creates a new regexp handling sequence of +type+ with +text+
19
+
20
+ def initialize(type, text)
21
+ @type, @text = type, text
22
+ end
23
+
24
+ ##
25
+ # Regexp handlings are equal when the have the same text and type
26
+
27
+ def ==(o)
28
+ self.text == o.text && self.type == o.type
29
+ end
30
+
31
+ def inspect # :nodoc:
32
+ "#<RDoc::Markup::RegexpHandling:0x%x @type=%p, @text=%p>" % [
33
+ object_id, @type, text.dump]
34
+ end
35
+
36
+ def to_s # :nodoc:
37
+ "RegexpHandling: type=#{type} text=#{text.dump}"
38
+ end
39
+
40
+ end
41
+
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  ##
3
3
  # A horizontal rule with a weight
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  ##
3
3
  # Outputs RDoc markup with vibrant ANSI color!
4
4
 
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  ##
3
3
  # Outputs RDoc markup with hot backspace action! You will probably need a
4
4
  # pager to use this output format.
@@ -41,7 +41,7 @@ class RDoc::Markup::ToBs < RDoc::Markup::ToRdoc
41
41
  end
42
42
 
43
43
  ##
44
- # Turns on or off special handling for +convert_string+
44
+ # Turns on or off regexp handling for +convert_string+
45
45
 
46
46
  def annotate tag
47
47
  case tag
@@ -54,9 +54,9 @@ class RDoc::Markup::ToBs < RDoc::Markup::ToRdoc
54
54
  end
55
55
 
56
56
  ##
57
- # Calls convert_string on the result of convert_special
57
+ # Calls convert_string on the result of convert_regexp_handling
58
58
 
59
- def convert_special special
59
+ def convert_regexp_handling target
60
60
  convert_string super
61
61
  end
62
62
 
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  require 'cgi'
3
3
 
4
4
  ##
@@ -52,19 +52,32 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
52
52
  @th = nil
53
53
  @hard_break = "<br>\n"
54
54
 
55
- # external links
56
- @markup.add_special(/(?:link:|https?:|mailto:|ftp:|irc:|www\.)\S+\w/,
57
- :HYPERLINK)
58
-
59
- add_special_RDOCLINK
60
- add_special_TIDYLINK
55
+ init_regexp_handlings
61
56
 
62
57
  init_tags
63
58
  end
64
59
 
65
- # :section: Special Handling
60
+ # :section: Regexp Handling
66
61
  #
67
- # These methods handle special markup added by RDoc::Markup#add_special.
62
+ # These methods are used by regexp handling markup added by RDoc::Markup#add_regexp_handling.
63
+
64
+ ##
65
+ # Adds regexp handlings.
66
+
67
+ def init_regexp_handlings
68
+ # external links
69
+ @markup.add_regexp_handling(/(?:link:|https?:|mailto:|ftp:|irc:|www\.)\S+\w/,
70
+ :HYPERLINK)
71
+ init_link_notation_regexp_handlings
72
+ end
73
+
74
+ ##
75
+ # Adds regexp handlings about link notations.
76
+
77
+ def init_link_notation_regexp_handlings
78
+ add_regexp_handling_RDOCLINK
79
+ add_regexp_handling_TIDYLINK
80
+ end
68
81
 
69
82
  def handle_RDOCLINK url # :nodoc:
70
83
  case url
@@ -91,14 +104,14 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
91
104
  end
92
105
 
93
106
  ##
94
- # +special+ is a <code><br></code>
107
+ # +target+ is a <code><br></code>
95
108
 
96
- def handle_special_HARD_BREAK special
109
+ def handle_regexp_HARD_BREAK target
97
110
  '<br>'
98
111
  end
99
112
 
100
113
  ##
101
- # +special+ is a potential link. The following schemes are handled:
114
+ # +target+ is a potential link. The following schemes are handled:
102
115
  #
103
116
  # <tt>mailto:</tt>::
104
117
  # Inserted as-is.
@@ -109,14 +122,14 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
109
122
  # <tt>link:</tt>::
110
123
  # Reference to a local file relative to the output directory.
111
124
 
112
- def handle_special_HYPERLINK(special)
113
- url = special.text
125
+ def handle_regexp_HYPERLINK(target)
126
+ url = target.text
114
127
 
115
128
  gen_url url, url
116
129
  end
117
130
 
118
131
  ##
119
- # +special+ is an rdoc-schemed link that will be converted into a hyperlink.
132
+ # +target+ is an rdoc-schemed link that will be converted into a hyperlink.
120
133
  #
121
134
  # For the +rdoc-ref+ scheme the named reference will be returned without
122
135
  # creating a link.
@@ -124,16 +137,16 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
124
137
  # For the +rdoc-label+ scheme the footnote and label prefixes are stripped
125
138
  # when creating a link. All other contents will be linked verbatim.
126
139
 
127
- def handle_special_RDOCLINK special
128
- handle_RDOCLINK special.text
140
+ def handle_regexp_RDOCLINK target
141
+ handle_RDOCLINK target.text
129
142
  end
130
143
 
131
144
  ##
132
- # This +special+ is a link where the label is different from the URL
145
+ # This +target+ is a link where the label is different from the URL
133
146
  # <tt>label[url]</tt> or <tt>{long label}[url]</tt>
134
147
 
135
- def handle_special_TIDYLINK(special)
136
- text = special.text
148
+ def handle_regexp_TIDYLINK(target)
149
+ text = target.text
137
150
 
138
151
  return text unless
139
152
  text =~ /^\{(.*)\}\[(.*?)\]$/ or text =~ /^(\S+)\[(.*?)\]$/
@@ -186,7 +199,7 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
186
199
  @res << "\n<p>"
187
200
  text = paragraph.text @hard_break
188
201
  text = text.gsub(/\r?\n/, ' ')
189
- @res << wrap(to_html(text))
202
+ @res << to_html(text)
190
203
  @res << "</p>\n"
191
204
  end
192
205
 
@@ -200,11 +213,13 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
200
213
 
201
214
  content = if verbatim.ruby? or parseable? text then
202
215
  begin
203
- tokens = RDoc::RubyLex.tokenize text, @options
216
+ tokens = RDoc::Parser::RipperStateLex.parse text
204
217
  klass = ' class="ruby"'
205
218
 
206
- RDoc::TokenStream.to_html tokens
207
- rescue RDoc::RubyLex::Error
219
+ result = RDoc::TokenStream.to_html tokens
220
+ result = result + "\n" unless "\n" == result[-1]
221
+ result
222
+ rescue
208
223
  CGI.escapeHTML text
209
224
  end
210
225
  else
@@ -212,7 +227,7 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
212
227
  end
213
228
 
214
229
  if @options.pipe then
215
- @res << "\n<pre><code>#{CGI.escapeHTML text}</code></pre>\n"
230
+ @res << "\n<pre><code>#{CGI.escapeHTML text}\n</code></pre>\n"
216
231
  else
217
232
  @res << "\n<pre#{klass}>#{content}</pre>\n"
218
233
  end
@@ -299,6 +314,29 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
299
314
  @res << raw.parts.join("\n")
300
315
  end
301
316
 
317
+ ##
318
+ # Adds +table+ to the output
319
+
320
+ def accept_table header, body, aligns
321
+ @res << "\n<table role=\"table\">\n<thead>\n<tr>\n"
322
+ header.zip(aligns) do |text, align|
323
+ @res << '<th'
324
+ @res << ' align="' << align << '"' if align
325
+ @res << '>' << CGI.escapeHTML(text) << "</th>\n"
326
+ end
327
+ @res << "</tr>\n</thead>\n<tbody>\n"
328
+ body.each do |row|
329
+ @res << "<tr>\n"
330
+ row.zip(aligns) do |text, align|
331
+ @res << '<td'
332
+ @res << ' align="' << align << '"' if align
333
+ @res << '>' << CGI.escapeHTML(text) << "</td>\n"
334
+ end
335
+ @res << "</tr>\n"
336
+ end
337
+ @res << "</tbody>\n</table>\n"
338
+ end
339
+
302
340
  # :section: Utilities
303
341
 
304
342
  ##
@@ -310,7 +348,7 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
310
348
 
311
349
  ##
312
350
  # Generate a link to +url+ with content +text+. Handles the special cases
313
- # for img: and link: described under handle_special_HYPERLINK
351
+ # for img: and link: described under handle_regexp_HYPERLINK
314
352
 
315
353
  def gen_url url, text
316
354
  scheme, url, id = parse_url url
@@ -319,6 +357,10 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter
319
357
  url =~ /\.(gif|png|jpg|jpeg|bmp)$/ then
320
358
  "<img src=\"#{url}\" />"
321
359
  else
360
+ if scheme != 'link' and /\.(?:rb|rdoc|md)\z/i =~ url
361
+ url = url.sub(%r%\A([./]*)(.*)\z%) { "#$1#{$2.tr('.', '_')}.html" }
362
+ end
363
+
322
364
  text = text.sub %r%^#{scheme}:/*%i, ''
323
365
  text = text.sub %r%^[*\^](\d+)$%, '\1'
324
366