rdoc 6.17.0 → 8.1.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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +193 -0
  3. data/LEGAL.rdoc +6 -0
  4. data/LICENSE.rdoc +4 -0
  5. data/README.md +132 -8
  6. data/RI.md +75 -75
  7. data/doc/markup_reference/markdown.md +659 -0
  8. data/doc/markup_reference/rdoc.rdoc +1169 -0
  9. data/exe/rdoc +2 -2
  10. data/lib/rdoc/code_object/alias.rb +70 -74
  11. data/lib/rdoc/code_object/any_method.rb +308 -293
  12. data/lib/rdoc/code_object/attr.rb +150 -142
  13. data/lib/rdoc/code_object/class_module.rb +802 -715
  14. data/lib/rdoc/code_object/constant.rb +181 -144
  15. data/lib/rdoc/code_object/context/section.rb +140 -130
  16. data/lib/rdoc/code_object/context.rb +925 -941
  17. data/lib/rdoc/code_object/extend.rb +7 -5
  18. data/lib/rdoc/code_object/include.rb +7 -5
  19. data/lib/rdoc/code_object/method_attr.rb +328 -315
  20. data/lib/rdoc/code_object/mixin.rb +97 -92
  21. data/lib/rdoc/code_object/normal_class.rb +77 -78
  22. data/lib/rdoc/code_object/normal_module.rb +61 -59
  23. data/lib/rdoc/code_object/require.rb +23 -39
  24. data/lib/rdoc/code_object/single_class.rb +21 -19
  25. data/lib/rdoc/code_object/top_level.rb +215 -202
  26. data/lib/rdoc/code_object.rb +305 -305
  27. data/lib/rdoc/comment.rb +274 -337
  28. data/lib/rdoc/cross_reference.rb +195 -206
  29. data/lib/rdoc/encoding.rb +105 -103
  30. data/lib/rdoc/erb_partial.rb +13 -11
  31. data/lib/rdoc/erbio.rb +29 -27
  32. data/lib/rdoc/generator/aliki.rb +196 -30
  33. data/lib/rdoc/generator/darkfish.rb +647 -629
  34. data/lib/rdoc/generator/json_index.rb +233 -229
  35. data/lib/rdoc/generator/markup.rb +165 -122
  36. data/lib/rdoc/generator/pot/message_extractor.rb +57 -51
  37. data/lib/rdoc/generator/pot/po.rb +52 -51
  38. data/lib/rdoc/generator/pot/po_entry.rb +138 -132
  39. data/lib/rdoc/generator/pot.rb +85 -81
  40. data/lib/rdoc/generator/ri.rb +23 -19
  41. data/lib/rdoc/generator/template/aliki/DESIGN.md +538 -0
  42. data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +1 -1
  43. data/lib/rdoc/generator/template/aliki/_footer.rhtml +2 -2
  44. data/lib/rdoc/generator/template/aliki/_head.rhtml +15 -10
  45. data/lib/rdoc/generator/template/aliki/_header.rhtml +29 -44
  46. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +8 -6
  47. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +8 -6
  48. data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +1 -1
  49. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +3 -3
  50. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +3 -3
  51. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +1 -1
  52. data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +1 -1
  53. data/lib/rdoc/generator/template/aliki/class.rhtml +71 -61
  54. data/lib/rdoc/generator/template/aliki/css/rdoc.css +796 -323
  55. data/lib/rdoc/generator/template/aliki/index.rhtml +1 -1
  56. data/lib/rdoc/generator/template/aliki/js/aliki.js +119 -113
  57. data/lib/rdoc/generator/template/aliki/js/bash_highlighter.js +167 -0
  58. data/lib/rdoc/generator/template/aliki/js/c_highlighter.js +1 -1
  59. data/lib/rdoc/generator/template/aliki/js/{search.js → search_controller.js} +16 -7
  60. data/lib/rdoc/generator/template/aliki/js/search_navigation.js +105 -0
  61. data/lib/rdoc/generator/template/aliki/js/search_ranker.js +239 -0
  62. data/lib/rdoc/generator/template/aliki/page.rhtml +1 -1
  63. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
  64. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +2 -2
  65. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +1 -1
  66. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -6
  67. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -6
  68. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +1 -1
  69. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +2 -2
  70. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +1 -1
  71. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +5 -5
  72. data/lib/rdoc/generator/template/darkfish/class.rhtml +29 -32
  73. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +19 -1
  74. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +3 -3
  75. data/lib/rdoc/generator.rb +48 -46
  76. data/lib/rdoc/i18n/locale.rb +99 -95
  77. data/lib/rdoc/i18n/text.rb +109 -105
  78. data/lib/rdoc/i18n.rb +7 -5
  79. data/lib/rdoc/markdown/byte_runtime.rb +80 -0
  80. data/lib/rdoc/markdown.kpeg +52 -33
  81. data/lib/rdoc/markdown.rb +365 -177
  82. data/lib/rdoc/markup/blank_line.rb +25 -23
  83. data/lib/rdoc/markup/block_quote.rb +12 -8
  84. data/lib/rdoc/markup/document.rb +127 -123
  85. data/lib/rdoc/markup/element.rb +21 -0
  86. data/lib/rdoc/markup/formatter.rb +220 -203
  87. data/lib/rdoc/markup/hard_break.rb +30 -27
  88. data/lib/rdoc/markup/heading.rb +163 -77
  89. data/lib/rdoc/markup/include.rb +33 -29
  90. data/lib/rdoc/markup/indented_paragraph.rb +37 -33
  91. data/lib/rdoc/markup/inline_parser.rb +316 -0
  92. data/lib/rdoc/markup/list.rb +80 -88
  93. data/lib/rdoc/markup/list_item.rb +73 -85
  94. data/lib/rdoc/markup/paragraph.rb +23 -19
  95. data/lib/rdoc/markup/parser.rb +501 -497
  96. data/lib/rdoc/markup/pre_process.rb +284 -305
  97. data/lib/rdoc/markup/raw.rb +52 -55
  98. data/lib/rdoc/markup/rule.rb +16 -12
  99. data/lib/rdoc/markup/table.rb +48 -40
  100. data/lib/rdoc/markup/to_ansi.rb +143 -92
  101. data/lib/rdoc/markup/to_bs.rb +86 -102
  102. data/lib/rdoc/markup/to_html.rb +608 -506
  103. data/lib/rdoc/markup/to_html_crossref.rb +219 -210
  104. data/lib/rdoc/markup/to_html_snippet.rb +210 -205
  105. data/lib/rdoc/markup/to_joined_paragraph.rb +40 -41
  106. data/lib/rdoc/markup/to_label.rb +64 -51
  107. data/lib/rdoc/markup/to_markdown.rb +212 -184
  108. data/lib/rdoc/markup/to_rdoc.rb +341 -277
  109. data/lib/rdoc/markup/to_table_of_contents.rb +66 -62
  110. data/lib/rdoc/markup/to_test.rb +62 -50
  111. data/lib/rdoc/markup/to_tt_only.rb +83 -92
  112. data/lib/rdoc/markup/verbatim.rb +62 -58
  113. data/lib/rdoc/markup.rb +196 -215
  114. data/lib/rdoc/options.rb +1063 -1076
  115. data/lib/rdoc/parser/c.rb +1039 -1036
  116. data/lib/rdoc/parser/changelog.rb +320 -287
  117. data/lib/rdoc/parser/markdown.rb +17 -13
  118. data/lib/rdoc/parser/rbs.rb +279 -0
  119. data/lib/rdoc/parser/rd.rb +17 -13
  120. data/lib/rdoc/parser/ruby.rb +1231 -2222
  121. data/lib/rdoc/parser/ruby_colorizer.rb +303 -0
  122. data/lib/rdoc/parser/simple.rb +31 -27
  123. data/lib/rdoc/parser/text.rb +12 -8
  124. data/lib/rdoc/parser.rb +230 -221
  125. data/lib/rdoc/rbs_helper.rb +186 -0
  126. data/lib/rdoc/rd/inline.rb +57 -53
  127. data/lib/rdoc/rd.rb +90 -88
  128. data/lib/rdoc/rdoc.rb +547 -366
  129. data/lib/rdoc/ri/driver.rb +1141 -1130
  130. data/lib/rdoc/ri/formatter.rb +7 -3
  131. data/lib/rdoc/ri/paths.rb +140 -136
  132. data/lib/rdoc/ri/servlet.rb +456 -0
  133. data/lib/rdoc/ri/store.rb +4 -2
  134. data/lib/rdoc/ri/task.rb +55 -51
  135. data/lib/rdoc/ri.rb +14 -11
  136. data/lib/rdoc/rubygems_hook.rb +194 -192
  137. data/lib/rdoc/server.rb +462 -0
  138. data/lib/rdoc/stats/normal.rb +46 -42
  139. data/lib/rdoc/stats/quiet.rb +39 -35
  140. data/lib/rdoc/stats/verbose.rb +35 -31
  141. data/lib/rdoc/stats.rb +363 -338
  142. data/lib/rdoc/store.rb +919 -725
  143. data/lib/rdoc/task.rb +260 -255
  144. data/lib/rdoc/text.rb +164 -240
  145. data/lib/rdoc/token_stream.rb +88 -106
  146. data/lib/rdoc/tom_doc.rb +203 -201
  147. data/lib/rdoc/version.rb +1 -1
  148. data/lib/rdoc.rb +35 -7
  149. data/lib/rubygems_plugin.rb +2 -11
  150. data/rdoc-logo.svg +43 -0
  151. data/rdoc.gemspec +9 -7
  152. metadata +46 -32
  153. data/CONTRIBUTING.rdoc +0 -219
  154. data/ExampleMarkdown.md +0 -39
  155. data/ExampleRDoc.rdoc +0 -210
  156. data/lib/rdoc/code_object/anon_class.rb +0 -10
  157. data/lib/rdoc/code_object/ghost_method.rb +0 -6
  158. data/lib/rdoc/code_object/meta_method.rb +0 -6
  159. data/lib/rdoc/markdown/literals.kpeg +0 -21
  160. data/lib/rdoc/markdown/literals.rb +0 -454
  161. data/lib/rdoc/markup/attr_changer.rb +0 -22
  162. data/lib/rdoc/markup/attr_span.rb +0 -35
  163. data/lib/rdoc/markup/attribute_manager.rb +0 -405
  164. data/lib/rdoc/markup/attributes.rb +0 -70
  165. data/lib/rdoc/markup/regexp_handling.rb +0 -40
  166. data/lib/rdoc/parser/prism_ruby.rb +0 -1100
  167. data/lib/rdoc/parser/ripper_state_lex.rb +0 -302
  168. data/lib/rdoc/parser/ruby_tools.rb +0 -163
  169. data/lib/rdoc/servlet.rb +0 -452
@@ -1,361 +1,425 @@
1
1
  # frozen_string_literal: true
2
- ##
3
- # Outputs RDoc markup as RDoc markup! (mostly)
2
+ module RDoc
3
+ class Markup
4
+ ##
5
+ # Outputs RDoc markup as RDoc markup! (mostly)
4
6
 
5
- class RDoc::Markup::ToRdoc < RDoc::Markup::Formatter
6
- DEFAULT_HEADINGS = {
7
- 1 => ['= ', ''],
8
- 2 => ['== ', ''],
9
- 3 => ['=== ', ''],
10
- 4 => ['==== ', ''],
11
- 5 => ['===== ', ''],
12
- 6 => ['====== ', '']
13
- }
14
- DEFAULT_HEADINGS.default = []
15
- DEFAULT_HEADINGS.freeze
7
+ class ToRdoc < Markup::Formatter
8
+ DEFAULT_HEADINGS = {
9
+ 1 => ['= ', ''],
10
+ 2 => ['== ', ''],
11
+ 3 => ['=== ', ''],
12
+ 4 => ['==== ', ''],
13
+ 5 => ['===== ', ''],
14
+ 6 => ['====== ', '']
15
+ }
16
+ DEFAULT_HEADINGS.default = []
17
+ DEFAULT_HEADINGS.freeze
16
18
 
17
- ##
18
- # Current indent amount for output in characters
19
+ ##
20
+ # Current indent amount for output in characters
19
21
 
20
- attr_accessor :indent
22
+ attr_accessor :indent
21
23
 
22
- ##
23
- # Output width in characters
24
+ ##
25
+ # Output width in characters
24
26
 
25
- attr_accessor :width
27
+ attr_accessor :width
26
28
 
27
- ##
28
- # Stack of current list indexes for alphabetic and numeric lists
29
+ ##
30
+ # Stack of current list indexes for alphabetic and numeric lists
29
31
 
30
- attr_reader :list_index
32
+ attr_reader :list_index
31
33
 
32
- ##
33
- # Stack of list types
34
+ ##
35
+ # Stack of list types
34
36
 
35
- attr_reader :list_type
37
+ attr_reader :list_type
36
38
 
37
- ##
38
- # Stack of list widths for indentation
39
+ ##
40
+ # Stack of list widths for indentation
39
41
 
40
- attr_reader :list_width
42
+ attr_reader :list_width
41
43
 
42
- ##
43
- # Prefix for the next list item. See #use_prefix
44
+ ##
45
+ # Prefix for the next list item. See #use_prefix
44
46
 
45
- attr_reader :prefix
47
+ attr_reader :prefix
46
48
 
47
- ##
48
- # Output accumulator
49
+ ##
50
+ # Output accumulator
49
51
 
50
- attr_reader :res
52
+ attr_reader :res
51
53
 
52
- ##
53
- # Creates a new formatter that will output (mostly) \RDoc markup
54
+ ##
55
+ # Creates a new formatter that will output (mostly) \RDoc markup
54
56
 
55
- def initialize(markup = nil)
56
- super nil, markup
57
+ def initialize
58
+ super
57
59
 
58
- @markup.add_regexp_handling(/\\\S/, :SUPPRESSED_CROSSREF)
59
- @width = 78
60
- init_tags
60
+ @markup.add_regexp_handling(/\\\S/, :SUPPRESSED_CROSSREF)
61
+ @width = 78
61
62
 
62
- @headings = DEFAULT_HEADINGS.dup
63
- @hard_break = "\n"
64
- end
63
+ @headings = DEFAULT_HEADINGS.dup
64
+ @hard_break = "\n"
65
+ end
65
66
 
66
- ##
67
- # Maps attributes to HTML sequences
67
+ ##
68
+ # Adds +blank_line+ to the output
68
69
 
69
- def init_tags
70
- add_tag :BOLD, "<b>", "</b>"
71
- add_tag :TT, "<tt>", "</tt>"
72
- add_tag :EM, "<em>", "</em>"
73
- end
70
+ def accept_blank_line(blank_line)
71
+ @res << "\n"
72
+ end
74
73
 
75
- ##
76
- # Adds +blank_line+ to the output
74
+ ##
75
+ # Adds +paragraph+ to the output
77
76
 
78
- def accept_blank_line(blank_line)
79
- @res << "\n"
80
- end
77
+ def accept_block_quote(block_quote)
78
+ @indent += 2
81
79
 
82
- ##
83
- # Adds +paragraph+ to the output
80
+ block_quote.parts.each do |part|
81
+ @prefix = '> '
84
82
 
85
- def accept_block_quote(block_quote)
86
- @indent += 2
83
+ part.accept self
84
+ end
87
85
 
88
- block_quote.parts.each do |part|
89
- @prefix = '> '
86
+ @indent -= 2
87
+ end
90
88
 
91
- part.accept self
92
- end
89
+ ##
90
+ # Adds +heading+ to the output
93
91
 
94
- @indent -= 2
95
- end
92
+ def accept_heading(heading)
93
+ use_prefix or @res << ' ' * @indent
94
+ @res << @headings[heading.level][0]
95
+ @res << attributes(heading.text)
96
+ @res << @headings[heading.level][1]
97
+ @res << "\n"
98
+ end
96
99
 
97
- ##
98
- # Adds +heading+ to the output
100
+ ##
101
+ # Finishes consumption of +list+
99
102
 
100
- def accept_heading(heading)
101
- use_prefix or @res << ' ' * @indent
102
- @res << @headings[heading.level][0]
103
- @res << attributes(heading.text)
104
- @res << @headings[heading.level][1]
105
- @res << "\n"
106
- end
103
+ def accept_list_end(list)
104
+ @list_index.pop
105
+ @list_type.pop
106
+ @list_width.pop
107
+ end
107
108
 
108
- ##
109
- # Finishes consumption of +list+
109
+ ##
110
+ # Finishes consumption of +list_item+
111
+
112
+ def accept_list_item_end(list_item)
113
+ width = case @list_type.last
114
+ when :BULLET
115
+ 2
116
+ when :NOTE, :LABEL
117
+ if @prefix
118
+ @res << @prefix.strip
119
+ @prefix = nil
120
+ end
121
+
122
+ @res << "\n"
123
+ 2
124
+ else
125
+ bullet = @list_index.last.to_s
126
+ @list_index[-1] = @list_index.last.succ
127
+ bullet.length + 2
128
+ end
129
+
130
+ @indent -= width
131
+ end
110
132
 
111
- def accept_list_end(list)
112
- @list_index.pop
113
- @list_type.pop
114
- @list_width.pop
115
- end
133
+ ##
134
+ # Prepares the visitor for consuming +list_item+
135
+
136
+ def accept_list_item_start(list_item)
137
+ type = @list_type.last
138
+
139
+ case type
140
+ when :NOTE, :LABEL
141
+ stripped_labels = Array(list_item.label).map do |label|
142
+ attributes(label).strip
143
+ end
144
+
145
+ bullets = case type
146
+ when :NOTE
147
+ stripped_labels.map { |b| "#{b}::" }
148
+ when :LABEL
149
+ stripped_labels.map { |b| "[#{b}]" }
150
+ end
151
+
152
+ bullets = bullets.join("\n")
153
+ bullets << "\n" unless stripped_labels.empty?
154
+
155
+ @prefix = ' ' * @indent
156
+ @indent += 2
157
+ @prefix << bullets + (' ' * @indent)
158
+ else
159
+ bullet = type == :BULLET ? '*' : @list_index.last.to_s + '.'
160
+ @prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1)
161
+ width = bullet.length + 1
162
+ @indent += width
163
+ end
164
+ end
116
165
 
117
- ##
118
- # Finishes consumption of +list_item+
119
-
120
- def accept_list_item_end(list_item)
121
- width = case @list_type.last
122
- when :BULLET then
123
- 2
124
- when :NOTE, :LABEL then
125
- if @prefix then
126
- @res << @prefix.strip
127
- @prefix = nil
128
- end
129
-
130
- @res << "\n"
131
- 2
132
- else
133
- bullet = @list_index.last.to_s
134
- @list_index[-1] = @list_index.last.succ
135
- bullet.length + 2
136
- end
137
-
138
- @indent -= width
139
- end
166
+ ##
167
+ # Prepares the visitor for consuming +list+
168
+
169
+ def accept_list_start(list)
170
+ case list.type
171
+ when :BULLET
172
+ @list_index << nil
173
+ @list_width << 1
174
+ when :LABEL, :NOTE
175
+ @list_index << nil
176
+ @list_width << 2
177
+ when :LALPHA
178
+ @list_index << 'a'
179
+ @list_width << list.items.length.to_s.length
180
+ when :NUMBER
181
+ @list_index << 1
182
+ @list_width << list.items.length.to_s.length
183
+ when :UALPHA
184
+ @list_index << 'A'
185
+ @list_width << list.items.length.to_s.length
186
+ else
187
+ raise Error, "invalid list type #{list.type}"
188
+ end
189
+
190
+ @list_type << list.type
191
+ end
192
+
193
+ ##
194
+ # Adds +paragraph+ to the output
140
195
 
141
- ##
142
- # Prepares the visitor for consuming +list_item+
196
+ def accept_paragraph(paragraph)
197
+ text = paragraph.text @hard_break
198
+ wrap attributes text
199
+ end
143
200
 
144
- def accept_list_item_start(list_item)
145
- type = @list_type.last
201
+ ##
202
+ # Adds +paragraph+ to the output
146
203
 
147
- case type
148
- when :NOTE, :LABEL then
149
- stripped_labels = Array(list_item.label).map do |label|
150
- attributes(label).strip
204
+ def accept_indented_paragraph(paragraph)
205
+ @indent += paragraph.indent
206
+ text = paragraph.text @hard_break
207
+ wrap attributes text
208
+ @indent -= paragraph.indent
151
209
  end
152
210
 
153
- bullets = case type
154
- when :NOTE
155
- stripped_labels.map { |b| "#{b}::" }
156
- when :LABEL
157
- stripped_labels.map { |b| "[#{b}]" }
211
+ ##
212
+ # Adds +raw+ to the output
213
+
214
+ def accept_raw(raw)
215
+ @res << raw.parts.join("\n")
158
216
  end
159
217
 
160
- bullets = bullets.join("\n")
161
- bullets << "\n" unless stripped_labels.empty?
218
+ ##
219
+ # Adds +rule+ to the output
162
220
 
163
- @prefix = ' ' * @indent
164
- @indent += 2
165
- @prefix << bullets + (' ' * @indent)
166
- else
167
- bullet = type == :BULLET ? '*' : @list_index.last.to_s + '.'
168
- @prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1)
169
- width = bullet.length + 1
170
- @indent += width
171
- end
172
- end
221
+ def accept_rule(rule)
222
+ use_prefix or @res << ' ' * @indent
223
+ @res << '-' * (@width - @indent)
224
+ @res << "\n"
225
+ end
173
226
 
174
- ##
175
- # Prepares the visitor for consuming +list+
176
-
177
- def accept_list_start(list)
178
- case list.type
179
- when :BULLET then
180
- @list_index << nil
181
- @list_width << 1
182
- when :LABEL, :NOTE then
183
- @list_index << nil
184
- @list_width << 2
185
- when :LALPHA then
186
- @list_index << 'a'
187
- @list_width << list.items.length.to_s.length
188
- when :NUMBER then
189
- @list_index << 1
190
- @list_width << list.items.length.to_s.length
191
- when :UALPHA then
192
- @list_index << 'A'
193
- @list_width << list.items.length.to_s.length
194
- else
195
- raise RDoc::Error, "invalid list type #{list.type}"
196
- end
227
+ ##
228
+ # Outputs +verbatim+ indented 2 columns
197
229
 
198
- @list_type << list.type
199
- end
230
+ def accept_verbatim(verbatim)
231
+ indent = ' ' * (@indent + 2)
200
232
 
201
- ##
202
- # Adds +paragraph+ to the output
233
+ verbatim.parts.each do |part|
234
+ @res << indent unless part == "\n"
235
+ @res << part
236
+ end
203
237
 
204
- def accept_paragraph(paragraph)
205
- text = paragraph.text @hard_break
206
- wrap attributes text
207
- end
238
+ @res << "\n"
239
+ end
208
240
 
209
- ##
210
- # Adds +paragraph+ to the output
241
+ ##
242
+ # Adds +table+ to the output
243
+
244
+ def accept_table(header, body, aligns)
245
+ header = header.map { |h| attributes h }
246
+ body = body.map { |row| row.map { |t| attributes t } }
247
+ widths = header.zip(*body).map do |cols|
248
+ cols.compact.map { |col| calculate_text_width(col) }.max
249
+ end
250
+ aligns = aligns.map do |a|
251
+ case a
252
+ when nil, :center
253
+ :center
254
+ when :left
255
+ :ljust
256
+ when :right
257
+ :rjust
258
+ end
259
+ end
260
+ @res << header.zip(widths, aligns).map do |h, w, a|
261
+ extra_width = h.size - calculate_text_width(h)
262
+ h.__send__(a, w + extra_width)
263
+ end.join("|").rstrip << "\n"
264
+ @res << widths.map {|w| "-" * w }.join("|") << "\n"
265
+ body.each do |row|
266
+ @res << widths.zip(aligns).each_with_index.map do |(w, a), i|
267
+ t = row[i] || ""
268
+ extra_width = t.size - calculate_text_width(t)
269
+ t.__send__(a, w + extra_width)
270
+ end.join("|").rstrip << "\n"
271
+ end
272
+ end
211
273
 
212
- def accept_indented_paragraph(paragraph)
213
- @indent += paragraph.indent
214
- text = paragraph.text @hard_break
215
- wrap attributes text
216
- @indent -= paragraph.indent
217
- end
274
+ def calculate_text_width(text)
275
+ text.size
276
+ end
218
277
 
219
- ##
220
- # Adds +raw+ to the output
278
+ def handle_PLAIN_TEXT(text)
279
+ add_text(text)
280
+ end
221
281
 
222
- def accept_raw(raw)
223
- @res << raw.parts.join("\n")
224
- end
282
+ def handle_REGEXP_HANDLING_TEXT(text)
283
+ add_text(text)
284
+ end
225
285
 
226
- ##
227
- # Adds +rule+ to the output
286
+ def handle_BOLD(target)
287
+ on(:BOLD)
288
+ super
289
+ off(:BOLD)
290
+ end
228
291
 
229
- def accept_rule(rule)
230
- use_prefix or @res << ' ' * @indent
231
- @res << '-' * (@width - @indent)
232
- @res << "\n"
233
- end
292
+ def handle_EM(target)
293
+ on(:EM)
294
+ super
295
+ off(:EM)
296
+ end
234
297
 
235
- ##
236
- # Outputs +verbatim+ indented 2 columns
298
+ def handle_BOLD_WORD(word)
299
+ on(:BOLD)
300
+ super
301
+ off(:BOLD)
302
+ end
237
303
 
238
- def accept_verbatim(verbatim)
239
- indent = ' ' * (@indent + 2)
304
+ def handle_EM_WORD(word)
305
+ on(:EM)
306
+ super
307
+ off(:EM)
308
+ end
240
309
 
241
- verbatim.parts.each do |part|
242
- @res << indent unless part == "\n"
243
- @res << part
244
- end
310
+ def handle_TT(code)
311
+ on(:TT)
312
+ super
313
+ off(:TT)
314
+ end
245
315
 
246
- @res << "\n"
247
- end
316
+ def handle_STRIKE(target)
317
+ on(:STRIKE)
318
+ super
319
+ off(:STRIKE)
320
+ end
248
321
 
249
- ##
250
- # Adds +table+ to the output
322
+ def handle_HARD_BREAK
323
+ add_text("\n")
324
+ end
251
325
 
252
- def accept_table(header, body, aligns)
253
- header = header.map { |h| attributes h }
254
- body = body.map { |row| row.map { |t| attributes t } }
255
- widths = header.zip(*body).map do |cols|
256
- cols.map { |col| calculate_text_width(col) }.max
257
- end
258
- aligns = aligns.map do |a|
259
- case a
260
- when nil, :center
261
- :center
262
- when :left
263
- :ljust
264
- when :right
265
- :rjust
326
+ def handle_TIDYLINK(label_part, url)
327
+ super
328
+ add_text("( #{url} )")
266
329
  end
267
- end
268
- @res << header.zip(widths, aligns).map do |h, w, a|
269
- extra_width = h.size - calculate_text_width(h)
270
- h.__send__(a, w + extra_width)
271
- end.join("|").rstrip << "\n"
272
- @res << widths.map {|w| "-" * w }.join("|") << "\n"
273
- body.each do |row|
274
- @res << row.zip(widths, aligns).map do |t, w, a|
275
- extra_width = t.size - calculate_text_width(t)
276
- t.__send__(a, w + extra_width)
277
- end.join("|").rstrip << "\n"
278
- end
279
- end
280
330
 
281
- def calculate_text_width(text)
282
- text.size
283
- end
331
+ def handle_inline(text, initial_attributes = [])
332
+ @attributes = Hash.new(0)
333
+ initial_attributes.each { |attr| on(attr) }
334
+ out = @inline_output = +''
335
+ super(text)
336
+ @inline_output = nil
337
+ out
338
+ end
284
339
 
285
- ##
286
- # Applies attribute-specific markup to +text+ using RDoc::AttributeManager
340
+ def on(attr)
341
+ @attributes[attr] += 1
342
+ end
287
343
 
288
- def attributes(text)
289
- flow = @am.flow text.dup
290
- convert_flow flow
291
- end
344
+ def off(attr)
345
+ @attributes[attr] -= 1
346
+ @attributes.delete(attr) if @attributes[attr] == 0
347
+ end
292
348
 
293
- ##
294
- # Returns the generated output
349
+ def add_text(text)
350
+ emit_inline(text)
351
+ end
295
352
 
296
- def end_accepting
297
- @res.join
298
- end
353
+ def emit_inline(text)
354
+ @inline_output << text
355
+ end
299
356
 
300
- ##
301
- # Removes preceding \\ from the suppressed crossref +target+
357
+ ##
358
+ # Applies attribute-specific markup to +text+ using RDoc::Markup::InlineParser
302
359
 
303
- def handle_regexp_SUPPRESSED_CROSSREF(target)
304
- text = target.text
305
- text = text.sub('\\', '') unless in_tt?
306
- text
307
- end
360
+ def attributes(text)
361
+ handle_inline(text)
362
+ end
308
363
 
309
- ##
310
- # Adds a newline to the output
364
+ ##
365
+ # Returns the generated output
311
366
 
312
- def handle_regexp_HARD_BREAK(target)
313
- "\n"
314
- end
367
+ def end_accepting
368
+ @res.join
369
+ end
315
370
 
316
- ##
317
- # Prepares the visitor for text generation
371
+ ##
372
+ # Removes preceding \\ from the suppressed crossref +target+
318
373
 
319
- def start_accepting
320
- @res = [""]
321
- @indent = 0
322
- @prefix = nil
374
+ def handle_regexp_SUPPRESSED_CROSSREF(text)
375
+ text.sub('\\', '')
376
+ end
323
377
 
324
- @list_index = []
325
- @list_type = []
326
- @list_width = []
327
- end
378
+ ##
379
+ # Prepares the visitor for text generation
328
380
 
329
- ##
330
- # Adds the stored #prefix to the output and clears it. Lists generate a
331
- # prefix for later consumption.
381
+ def start_accepting
382
+ @res = [""]
383
+ @indent = 0
384
+ @prefix = nil
332
385
 
333
- def use_prefix
334
- prefix, @prefix = @prefix, nil
335
- @res << prefix if prefix
386
+ @list_index = []
387
+ @list_type = []
388
+ @list_width = []
389
+ end
336
390
 
337
- prefix
338
- end
391
+ ##
392
+ # Adds the stored #prefix to the output and clears it. Lists generate a
393
+ # prefix for later consumption.
394
+
395
+ def use_prefix
396
+ prefix, @prefix = @prefix, nil
397
+ @res << prefix if prefix
398
+
399
+ prefix
400
+ end
401
+
402
+ ##
403
+ # Wraps +text+ to #width
339
404
 
340
- ##
341
- # Wraps +text+ to #width
405
+ def wrap(text)
406
+ return unless text && !text.empty?
342
407
 
343
- def wrap(text)
344
- return unless text && !text.empty?
408
+ text_len = @width - @indent
345
409
 
346
- text_len = @width - @indent
410
+ text_len = 20 if text_len < 20
347
411
 
348
- text_len = 20 if text_len < 20
412
+ next_prefix = ' ' * @indent
349
413
 
350
- next_prefix = ' ' * @indent
414
+ prefix = @prefix || next_prefix
415
+ @prefix = nil
351
416
 
352
- prefix = @prefix || next_prefix
353
- @prefix = nil
417
+ text.scan(/\G(?:([^ \n]{#{text_len}})(?=[^ \n])|(.{1,#{text_len}})(?:[ \n]|\z))/) do
418
+ @res << prefix << ($1 || $2) << "\n"
419
+ prefix = next_prefix
420
+ end
421
+ end
354
422
 
355
- text.scan(/\G(?:([^ \n]{#{text_len}})(?=[^ \n])|(.{1,#{text_len}})(?:[ \n]|\z))/) do
356
- @res << prefix << ($1 || $2) << "\n"
357
- prefix = next_prefix
358
423
  end
359
424
  end
360
-
361
425
  end