rdoc 7.2.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 (150) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +4 -7
  3. data/LICENSE.rdoc +4 -0
  4. data/README.md +43 -2
  5. data/RI.md +75 -75
  6. data/doc/markup_reference/markdown.md +104 -3
  7. data/exe/rdoc +2 -2
  8. data/lib/rdoc/code_object/alias.rb +70 -74
  9. data/lib/rdoc/code_object/any_method.rb +305 -298
  10. data/lib/rdoc/code_object/attr.rb +150 -143
  11. data/lib/rdoc/code_object/class_module.rb +801 -765
  12. data/lib/rdoc/code_object/constant.rb +178 -150
  13. data/lib/rdoc/code_object/context/section.rb +133 -160
  14. data/lib/rdoc/code_object/context.rb +925 -952
  15. data/lib/rdoc/code_object/extend.rb +7 -5
  16. data/lib/rdoc/code_object/include.rb +7 -5
  17. data/lib/rdoc/code_object/method_attr.rb +325 -324
  18. data/lib/rdoc/code_object/mixin.rb +97 -95
  19. data/lib/rdoc/code_object/normal_class.rb +77 -78
  20. data/lib/rdoc/code_object/normal_module.rb +61 -59
  21. data/lib/rdoc/code_object/require.rb +23 -39
  22. data/lib/rdoc/code_object/single_class.rb +21 -19
  23. data/lib/rdoc/code_object/top_level.rb +212 -213
  24. data/lib/rdoc/code_object.rb +305 -305
  25. data/lib/rdoc/comment.rb +274 -337
  26. data/lib/rdoc/cross_reference.rb +194 -212
  27. data/lib/rdoc/encoding.rb +105 -103
  28. data/lib/rdoc/erb_partial.rb +13 -11
  29. data/lib/rdoc/erbio.rb +29 -27
  30. data/lib/rdoc/generator/aliki.rb +165 -140
  31. data/lib/rdoc/generator/darkfish.rb +647 -631
  32. data/lib/rdoc/generator/json_index.rb +233 -229
  33. data/lib/rdoc/generator/markup.rb +165 -122
  34. data/lib/rdoc/generator/pot/message_extractor.rb +57 -51
  35. data/lib/rdoc/generator/pot/po.rb +52 -51
  36. data/lib/rdoc/generator/pot/po_entry.rb +138 -132
  37. data/lib/rdoc/generator/pot.rb +85 -81
  38. data/lib/rdoc/generator/ri.rb +23 -19
  39. data/lib/rdoc/generator/template/aliki/DESIGN.md +538 -0
  40. data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +1 -1
  41. data/lib/rdoc/generator/template/aliki/_footer.rhtml +1 -1
  42. data/lib/rdoc/generator/template/aliki/_head.rhtml +11 -11
  43. data/lib/rdoc/generator/template/aliki/_header.rhtml +29 -44
  44. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +8 -6
  45. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +8 -6
  46. data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +1 -1
  47. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +2 -2
  48. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +4 -4
  49. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +1 -1
  50. data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +1 -1
  51. data/lib/rdoc/generator/template/aliki/class.rhtml +56 -46
  52. data/lib/rdoc/generator/template/aliki/css/rdoc.css +538 -283
  53. data/lib/rdoc/generator/template/aliki/index.rhtml +1 -1
  54. data/lib/rdoc/generator/template/aliki/js/aliki.js +80 -102
  55. data/lib/rdoc/generator/template/aliki/page.rhtml +1 -1
  56. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
  57. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +2 -2
  58. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +1 -1
  59. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -6
  60. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -6
  61. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +1 -1
  62. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +1 -1
  63. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +1 -1
  64. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +5 -5
  65. data/lib/rdoc/generator/template/darkfish/class.rhtml +18 -21
  66. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +0 -1
  67. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +3 -3
  68. data/lib/rdoc/generator.rb +48 -46
  69. data/lib/rdoc/i18n/locale.rb +99 -95
  70. data/lib/rdoc/i18n/text.rb +109 -105
  71. data/lib/rdoc/i18n.rb +7 -5
  72. data/lib/rdoc/markdown/byte_runtime.rb +80 -0
  73. data/lib/rdoc/markdown.kpeg +30 -21
  74. data/lib/rdoc/markdown.rb +329 -151
  75. data/lib/rdoc/markup/block_quote.rb +12 -8
  76. data/lib/rdoc/markup/document.rb +127 -123
  77. data/lib/rdoc/markup/formatter.rb +215 -221
  78. data/lib/rdoc/markup/heading.rb +1 -4
  79. data/lib/rdoc/markup/include.rb +33 -29
  80. data/lib/rdoc/markup/indented_paragraph.rb +37 -33
  81. data/lib/rdoc/markup/inline_parser.rb +281 -277
  82. data/lib/rdoc/markup/list.rb +80 -88
  83. data/lib/rdoc/markup/list_item.rb +73 -85
  84. data/lib/rdoc/markup/paragraph.rb +23 -19
  85. data/lib/rdoc/markup/parser.rb +501 -497
  86. data/lib/rdoc/markup/pre_process.rb +284 -305
  87. data/lib/rdoc/markup/raw.rb +2 -2
  88. data/lib/rdoc/markup/rule.rb +16 -12
  89. data/lib/rdoc/markup/to_ansi.rb +143 -139
  90. data/lib/rdoc/markup/to_bs.rb +72 -68
  91. data/lib/rdoc/markup/to_html.rb +600 -493
  92. data/lib/rdoc/markup/to_html_crossref.rb +221 -191
  93. data/lib/rdoc/markup/to_html_snippet.rb +232 -227
  94. data/lib/rdoc/markup/to_joined_paragraph.rb +40 -41
  95. data/lib/rdoc/markup/to_label.rb +63 -59
  96. data/lib/rdoc/markup/to_markdown.rb +212 -208
  97. data/lib/rdoc/markup/to_rdoc.rb +336 -332
  98. data/lib/rdoc/markup/to_table_of_contents.rb +66 -62
  99. data/lib/rdoc/markup/to_test.rb +60 -56
  100. data/lib/rdoc/markup/to_tt_only.rb +83 -86
  101. data/lib/rdoc/markup/verbatim.rb +62 -58
  102. data/lib/rdoc/markup.rb +198 -196
  103. data/lib/rdoc/options.rb +1063 -1076
  104. data/lib/rdoc/parser/c.rb +1039 -1036
  105. data/lib/rdoc/parser/changelog.rb +319 -315
  106. data/lib/rdoc/parser/markdown.rb +17 -13
  107. data/lib/rdoc/parser/rbs.rb +279 -0
  108. data/lib/rdoc/parser/rd.rb +17 -13
  109. data/lib/rdoc/parser/ruby.rb +1231 -2222
  110. data/lib/rdoc/parser/ruby_colorizer.rb +303 -0
  111. data/lib/rdoc/parser/simple.rb +31 -27
  112. data/lib/rdoc/parser/text.rb +12 -8
  113. data/lib/rdoc/parser.rb +230 -221
  114. data/lib/rdoc/rbs_helper.rb +186 -0
  115. data/lib/rdoc/rd/inline.rb +57 -53
  116. data/lib/rdoc/rd.rb +90 -88
  117. data/lib/rdoc/rdoc.rb +547 -366
  118. data/lib/rdoc/ri/driver.rb +1141 -1130
  119. data/lib/rdoc/ri/formatter.rb +7 -3
  120. data/lib/rdoc/ri/paths.rb +140 -136
  121. data/lib/rdoc/ri/servlet.rb +456 -0
  122. data/lib/rdoc/ri/store.rb +4 -2
  123. data/lib/rdoc/ri/task.rb +55 -51
  124. data/lib/rdoc/ri.rb +14 -11
  125. data/lib/rdoc/rubygems_hook.rb +194 -192
  126. data/lib/rdoc/server.rb +462 -0
  127. data/lib/rdoc/stats/normal.rb +46 -42
  128. data/lib/rdoc/stats/quiet.rb +39 -35
  129. data/lib/rdoc/stats/verbose.rb +35 -31
  130. data/lib/rdoc/stats.rb +363 -338
  131. data/lib/rdoc/store.rb +919 -725
  132. data/lib/rdoc/task.rb +260 -255
  133. data/lib/rdoc/text.rb +130 -245
  134. data/lib/rdoc/token_stream.rb +101 -115
  135. data/lib/rdoc/tom_doc.rb +203 -201
  136. data/lib/rdoc/version.rb +1 -1
  137. data/lib/rdoc.rb +35 -7
  138. data/lib/rubygems_plugin.rb +2 -11
  139. data/rdoc-logo.svg +43 -0
  140. data/rdoc.gemspec +6 -4
  141. metadata +36 -20
  142. data/lib/rdoc/code_object/anon_class.rb +0 -10
  143. data/lib/rdoc/code_object/ghost_method.rb +0 -6
  144. data/lib/rdoc/code_object/meta_method.rb +0 -6
  145. data/lib/rdoc/markdown/literals.kpeg +0 -21
  146. data/lib/rdoc/markdown/literals.rb +0 -454
  147. data/lib/rdoc/parser/prism_ruby.rb +0 -1112
  148. data/lib/rdoc/parser/ripper_state_lex.rb +0 -302
  149. data/lib/rdoc/parser/ruby_tools.rb +0 -163
  150. data/lib/rdoc/servlet.rb +0 -452
data/lib/rdoc/text.rb CHANGED
@@ -5,57 +5,30 @@
5
5
 
6
6
  require 'strscan'
7
7
 
8
- ##
9
- # Methods for manipulating comment text
10
-
11
- module RDoc::Text
12
-
8
+ module RDoc
13
9
  ##
14
- # The language for this text. This affects stripping comments
15
- # markers.
10
+ # Methods for manipulating comment text
16
11
 
17
- attr_accessor :language
12
+ module Text
18
13
 
19
- ##
20
- # Maps markup formats to classes that can parse them. If the format is
21
- # unknown, "rdoc" format is used.
14
+ ##
15
+ # The language for this text. This affects stripping comments
16
+ # markers.
22
17
 
23
- MARKUP_FORMAT = {
24
- 'markdown' => RDoc::Markdown,
25
- 'rdoc' => RDoc::Markup,
26
- 'rd' => RDoc::RD,
27
- 'tomdoc' => RDoc::TomDoc,
28
- }
18
+ attr_accessor :language
29
19
 
30
- MARKUP_FORMAT.default = RDoc::Markup
20
+ ##
21
+ # Maps markup formats to classes that can parse them. If the format is
22
+ # unknown, "rdoc" format is used.
31
23
 
32
- ##
33
- # Maps an encoding to a Hash of characters properly transcoded for that
34
- # encoding.
35
- #
36
- # See also encode_fallback.
37
-
38
- TO_HTML_CHARACTERS = Hash.new do |h, encoding|
39
- h[encoding] = {
40
- :close_dquote => encode_fallback('”', encoding, '"'),
41
- :close_squote => encode_fallback('’', encoding, '\''),
42
- :copyright => encode_fallback('©', encoding, '(c)'),
43
- :ellipsis => encode_fallback('…', encoding, '...'),
44
- :em_dash => encode_fallback('—', encoding, '---'),
45
- :en_dash => encode_fallback('–', encoding, '--'),
46
- :open_dquote => encode_fallback('“', encoding, '"'),
47
- :open_squote => encode_fallback('‘', encoding, '\''),
48
- :trademark => encode_fallback('®', encoding, '(r)'),
24
+ MARKUP_FORMAT = {
25
+ 'markdown' => Markdown,
26
+ 'rdoc' => Markup,
27
+ 'rd' => RD,
28
+ 'tomdoc' => TomDoc,
49
29
  }
50
- end
51
-
52
- ##
53
- # Transcodes +character+ to +encoding+ with a +fallback+ character.
54
30
 
55
- def self.encode_fallback(character, encoding, fallback)
56
- character.encode(encoding, :fallback => { character => fallback },
57
- :undef => :replace, :replace => fallback)
58
- end
31
+ MARKUP_FORMAT.default = Markup
59
32
 
60
33
  ##
61
34
  # Expands tab characters in +text+ to eight spaces
@@ -66,7 +39,7 @@ module RDoc::Text
66
39
  text.each_line do |line|
67
40
  nil while line.gsub!(/(?:\G|\r)((?:.{8})*?)([^\t\r\n]{0,7})\t/) do
68
41
  r = "#{$1}#{$2}#{' ' * (8 - $2.size)}"
69
- r = RDoc::Encoding.change_encoding r, text.encoding
42
+ r = Encoding.change_encoding r, text.encoding
70
43
  r
71
44
  end
72
45
 
@@ -76,249 +49,160 @@ module RDoc::Text
76
49
  expanded.join
77
50
  end
78
51
 
79
- ##
80
- # Flush +text+ left based on the shortest line
52
+ ##
53
+ # Flush +text+ left based on the shortest line
81
54
 
82
- def flush_left(text)
83
- indent = 9999
55
+ def flush_left(text)
56
+ indent = 9999
84
57
 
85
- text.each_line do |line|
86
- line_indent = line =~ /\S/ || 9999
87
- indent = line_indent if indent > line_indent
88
- end
58
+ text.each_line do |line|
59
+ line_indent = line =~ /\S/ || 9999
60
+ indent = line_indent if indent > line_indent
61
+ end
89
62
 
90
- empty = ''
91
- empty = RDoc::Encoding.change_encoding empty, text.encoding
63
+ empty = ''
64
+ empty = Encoding.change_encoding empty, text.encoding
92
65
 
93
- text.gsub(/^ {0,#{indent}}/, empty)
94
- end
66
+ text.gsub(/^ {0,#{indent}}/, empty)
67
+ end
95
68
 
96
- ##
97
- # Convert a string in markup format into HTML.
98
- #
99
- # Requires the including class to implement #formatter
69
+ ##
70
+ # Convert a string in markup format into HTML.
71
+ #
72
+ # Requires the including class to implement #formatter
100
73
 
101
- def markup(text)
102
- if @store.options
103
- locale = @store.options.locale
104
- else
105
- locale = nil
106
- end
107
- if locale
108
- i18n_text = RDoc::I18n::Text.new(text)
109
- text = i18n_text.translate(locale)
74
+ def markup(text)
75
+ if @store.options
76
+ locale = @store.options.locale
77
+ else
78
+ locale = nil
79
+ end
80
+ if locale
81
+ i18n_text = I18n::Text.new(text)
82
+ text = i18n_text.translate(locale)
83
+ end
84
+ parse(text).accept formatter
110
85
  end
111
- parse(text).accept formatter
112
- end
113
86
 
114
- ##
115
- # Strips hashes, expands tabs then flushes +text+ to the left
87
+ ##
88
+ # Strips hashes, expands tabs then flushes +text+ to the left
116
89
 
117
- def normalize_comment(text)
118
- return text if text.empty?
90
+ def normalize_comment(text)
91
+ return text if text.empty?
119
92
 
120
- case language
121
- when :ruby
122
- text = strip_hashes text
123
- when :c
124
- text = strip_stars text
93
+ case language
94
+ when :ruby
95
+ text = strip_hashes text
96
+ when :c
97
+ text = strip_stars text
98
+ end
99
+ text = expand_tabs text
100
+ text = flush_left text
101
+ text = strip_newlines text
102
+ text
125
103
  end
126
- text = expand_tabs text
127
- text = flush_left text
128
- text = strip_newlines text
129
- text
130
- end
131
-
132
- ##
133
- # Normalizes +text+ then builds a RDoc::Markup::Document from it
134
104
 
135
- def parse(text, format = 'rdoc')
136
- return text if RDoc::Markup::Document === text
137
- return text.parse if RDoc::Comment === text
105
+ ##
106
+ # Normalizes +text+ then builds a RDoc::Markup::Document from it
138
107
 
139
- text = normalize_comment text # TODO remove, should not be necessary
108
+ def parse(text, format = 'rdoc')
109
+ return text if Markup::Document === text
110
+ return text.parse if Comment === text
140
111
 
141
- return RDoc::Markup::Document.new if text =~ /\A\n*\z/
112
+ text = normalize_comment text # TODO remove, should not be necessary
142
113
 
143
- MARKUP_FORMAT[format].parse text
144
- end
114
+ return Markup::Document.new if text =~ /\A\n*\z/
145
115
 
146
- ##
147
- # The first +limit+ characters of +text+ as HTML
116
+ MARKUP_FORMAT[format].parse text
117
+ end
148
118
 
149
- def snippet(text, limit = 100)
150
- document = parse text
119
+ ##
120
+ # The first +limit+ characters of +text+ as HTML
151
121
 
152
- RDoc::Markup::ToHtmlSnippet.new(options, limit).convert document
153
- end
122
+ def snippet(text, limit = 100)
123
+ document = parse text
154
124
 
155
- ##
156
- # Strips leading # characters from +text+
125
+ Markup::ToHtmlSnippet.new(limit).convert document
126
+ end
157
127
 
158
- def strip_hashes(text)
159
- return text if text =~ /^(?>\s*)[^\#]/
128
+ ##
129
+ # Strips leading # characters from +text+
160
130
 
161
- empty = ''
162
- empty = RDoc::Encoding.change_encoding empty, text.encoding
131
+ def strip_hashes(text)
132
+ return text if text =~ /^(?>\s*)[^\#]/
163
133
 
164
- text.gsub(/^\s*(#+)/) { $1.tr '#', ' ' }.gsub(/^\s+$/, empty)
165
- end
134
+ empty = ''
135
+ empty = Encoding.change_encoding empty, text.encoding
166
136
 
167
- ##
168
- # Strips leading and trailing \n characters from +text+
137
+ text.gsub(/^\s*(#+)/) { $1.tr '#', ' ' }.gsub(/^\s+$/, empty)
138
+ end
169
139
 
170
- def strip_newlines(text)
171
- text.gsub(/\A\n*(.*?)\n*\z/m) do $1 end # block preserves String encoding
172
- end
140
+ ##
141
+ # Strips leading and trailing \n characters from +text+
173
142
 
174
- ##
175
- # Strips /* */ style comments
143
+ def strip_newlines(text)
144
+ text.gsub(/\A\n*(.*?)\n*\z/m) do $1 end # block preserves String encoding
145
+ end
176
146
 
177
- def strip_stars(text)
178
- return text unless text =~ %r%/\*.*\*/%m
147
+ ##
148
+ # Strips /* */ style comments
179
149
 
180
- encoding = text.encoding
150
+ def strip_stars(text)
151
+ return text unless text =~ %r%/\*.*\*/%m
181
152
 
182
- text = text.gsub %r%Document-method:\s+[\w:.#=!?|^&<>~+\-/*\%@`\[\]]+%, ''
153
+ encoding = text.encoding
183
154
 
184
- space = ' '
185
- space = RDoc::Encoding.change_encoding space, encoding if encoding
155
+ text = text.gsub %r%Document-method:\s+[\w:.#=!?|^&<>~+\-/*\%@`\[\]]+%, ''
186
156
 
187
- text.sub! %r%/\*+% do space * $&.length end
188
- text.sub! %r%\*+/% do space * $&.length end
189
- text.gsub! %r%^[ \t]*\*%m do space * $&.length end
157
+ space = ' '
158
+ space = Encoding.change_encoding space, encoding if encoding
190
159
 
191
- empty = ''
192
- empty = RDoc::Encoding.change_encoding empty, encoding if encoding
193
- text.gsub(/^\s+$/, empty)
194
- end
160
+ text.sub! %r%/\*+% do space * $&.length end
161
+ text.sub! %r%\*+/% do space * $&.length end
162
+ text.gsub! %r%^[ \t]*\*%m do space * $&.length end
195
163
 
196
- def to_html(text)
197
- to_html_characters(text)
198
- end
164
+ empty = ''
165
+ empty = Encoding.change_encoding empty, encoding if encoding
166
+ text.gsub(/^\s+$/, empty)
167
+ end
199
168
 
200
- ##
201
- # Converts ampersand, dashes, ellipsis, quotes, copyright and registered
202
- # trademark symbols in +text+ to properly encoded characters.
203
-
204
- def to_html_characters(text)
205
- html = (''.encode text.encoding).dup
206
-
207
- encoded = RDoc::Text::TO_HTML_CHARACTERS[text.encoding]
208
-
209
- s = StringScanner.new text
210
- insquotes = false
211
- indquotes = false
212
- after_word = nil
213
-
214
- until s.eos? do
215
- case
216
- when s.scan(/<(tt|code)>.*?<\/\1>/) then # skip contents of tt
217
- html << s.matched
218
- when s.scan(/<(tt|code)>.*?/) then
219
- warn "mismatched <#{s[1]}> tag" # TODO signal file/line
220
- html << s.matched
221
- when s.scan(/<[^>]+\/?s*>/) then # skip HTML tags
222
- html << s.matched
223
- when s.scan(/\.\.\.(\.?)/) then
224
- html << s[1] << encoded[:ellipsis]
225
- after_word = nil
226
- when s.scan(/\(c\)/i) then
227
- html << encoded[:copyright]
228
- after_word = nil
229
- when s.scan(/\(r\)/i) then
230
- html << encoded[:trademark]
231
- after_word = nil
232
- when s.scan(/---/) then
233
- html << encoded[:em_dash]
234
- after_word = nil
235
- when s.scan(/--/) then
236
- html << encoded[:en_dash]
237
- after_word = nil
238
- when s.scan(/&quot;|"/) then
239
- html << encoded[indquotes ? :close_dquote : :open_dquote]
240
- indquotes = !indquotes
241
- after_word = nil
242
- when s.scan(/``/) then # backtick double quote
243
- html << encoded[:open_dquote]
244
- after_word = nil
245
- when s.scan(/(?:&#39;|'){2}/) then # tick double quote
246
- html << encoded[:close_dquote]
247
- after_word = nil
248
- when s.scan(/`/) then # backtick
249
- if insquotes or after_word
250
- html << '`'
251
- after_word = false
252
- else
253
- html << encoded[:open_squote]
254
- insquotes = true
255
- end
256
- when s.scan(/&#39;|'/) then # single quote
257
- if insquotes
258
- html << encoded[:close_squote]
259
- insquotes = false
260
- elsif after_word
261
- # Mary's dog, my parents' house: do not start paired quotes
262
- html << encoded[:close_squote]
263
- else
264
- html << encoded[:open_squote]
265
- insquotes = true
266
- end
169
+ ##
170
+ # Wraps +txt+ to +line_len+
267
171
 
268
- after_word = nil
269
- else # advance to the next potentially significant character
270
- match = s.scan(/.+?(?=[<\\.("'`&-])/) #"
172
+ def wrap(txt, line_len = 76)
173
+ res = []
174
+ sp = 0
175
+ ep = txt.length
271
176
 
272
- if match then
273
- html << match
274
- after_word = match =~ /\w$/
177
+ while sp < ep
178
+ # scan back for a space
179
+ p = sp + line_len - 1
180
+ if p >= ep
181
+ p = ep
275
182
  else
276
- html << s.rest
277
- break
278
- end
279
- end
280
- end
281
-
282
- html
283
- end
284
-
285
- ##
286
- # Wraps +txt+ to +line_len+
287
-
288
- def wrap(txt, line_len = 76)
289
- res = []
290
- sp = 0
291
- ep = txt.length
292
-
293
- while sp < ep
294
- # scan back for a space
295
- p = sp + line_len - 1
296
- if p >= ep
297
- p = ep
298
- else
299
- while p > sp and txt[p] != ?\s
300
- p -= 1
301
- end
302
- if p <= sp
303
- p = sp + line_len
304
- while p < ep and txt[p] != ?\s
305
- p += 1
183
+ while p > sp and txt[p] != ?\s
184
+ p -= 1
185
+ end
186
+ if p <= sp
187
+ p = sp + line_len
188
+ while p < ep and txt[p] != ?\s
189
+ p += 1
190
+ end
306
191
  end
307
192
  end
193
+ res << txt[sp...p] << "\n"
194
+ sp = p
195
+ sp += 1 while sp < ep and txt[sp] == ?\s
308
196
  end
309
- res << txt[sp...p] << "\n"
310
- sp = p
311
- sp += 1 while sp < ep and txt[sp] == ?\s
312
- end
313
197
 
314
- res.join.strip
315
- end
198
+ res.join.strip
199
+ end
316
200
 
317
- ##
318
- # Character class to be separated by a space when concatenating
319
- # lines.
201
+ ##
202
+ # Character class to be separated by a space when concatenating
203
+ # lines.
320
204
 
321
- SPACE_SEPARATED_LETTER_CLASS = /[\p{Nd}\p{Lc}\p{Pc}]|[!-~&&\W]/
205
+ SPACE_SEPARATED_LETTER_CLASS = /[\p{Nd}\p{Lc}\p{Pc}]|[!-~&&\W]/
322
206
 
323
207
  ##
324
208
  # Converts +text+ to a GitHub-style anchor ID:
@@ -358,4 +242,5 @@ module RDoc::Text
358
242
  label
359
243
  end
360
244
 
245
+ end
361
246
  end
@@ -1,126 +1,112 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ##
4
- # A TokenStream is a list of tokens, gathered during the parse of some entity
5
- # (say a method). Entities populate these streams by being registered with the
6
- # lexer. Any class can collect tokens by including TokenStream. From the
7
- # outside, you use such an object by calling the start_collecting_tokens
8
- # method, followed by calls to add_token and pop_token.
9
-
10
- module RDoc::TokenStream
11
-
3
+ module RDoc
12
4
  ##
13
- # Converts +token_stream+ to HTML wrapping various tokens with
14
- # <tt><span></tt> elements. Some tokens types are wrapped in spans
15
- # with the given class names. Other token types are not wrapped in spans.
16
-
17
- def self.to_html(token_stream)
18
- starting_title = false
19
-
20
- token_stream.map do |t|
21
- next unless t
22
-
23
- style = case t[:kind]
24
- when :on_const then 'ruby-constant'
25
- when :on_kw then 'ruby-keyword'
26
- when :on_ivar then 'ruby-ivar'
27
- when :on_cvar then 'ruby-identifier'
28
- when :on_gvar then 'ruby-identifier'
29
- when '=' != t[:text] && :on_op
30
- then 'ruby-operator'
31
- when :on_tlambda then 'ruby-operator'
32
- when :on_ident then 'ruby-identifier'
33
- when :on_label then 'ruby-value'
34
- when :on_backref, :on_dstring
35
- then 'ruby-node'
36
- when :on_comment then 'ruby-comment'
37
- when :on_embdoc then 'ruby-comment'
38
- when :on_regexp then 'ruby-regexp'
39
- when :on_tstring then 'ruby-string'
40
- when :on_int, :on_float,
41
- :on_rational, :on_imaginary,
42
- :on_heredoc,
43
- :on_symbol, :on_CHAR then 'ruby-value'
44
- when :on_heredoc_beg, :on_heredoc_end
45
- then 'ruby-identifier'
46
- end
47
-
48
- text = t[:text]
49
-
50
- if :on_ident == t[:kind] && starting_title
51
- starting_title = false
52
- style = 'ruby-identifier ruby-title'
53
- end
54
-
55
- if :on_kw == t[:kind] and 'def' == t[:text]
56
- starting_title = true
5
+ # A TokenStream is a list of tokens, gathered during the parse of some entity
6
+ # (say a method). Entities populate these streams by being registered with the
7
+ # lexer. Any class can collect tokens by including TokenStream. From the
8
+ # outside, you use such an object by calling the start_collecting_tokens
9
+ # method, followed by calls to add_token and pop_token.
10
+
11
+ module TokenStream
12
+
13
+ ##
14
+ # Converts +token_stream+ to HTML wrapping various tokens with
15
+ # <tt><span></tt> elements. Some tokens types are wrapped in spans
16
+ # with the given class names. Other token types are not wrapped in spans.
17
+
18
+ def self.to_html(token_stream)
19
+ token_stream.map do |t|
20
+ next unless t
21
+
22
+ style = case t[:kind]
23
+ when :operator then 'ruby-operator'
24
+ when :keyword then 'ruby-keyword'
25
+ when :constant then 'ruby-constant'
26
+ when :ivar then 'ruby-ivar'
27
+ when :comment then 'ruby-comment'
28
+ when :value then 'ruby-value'
29
+ when :string then 'ruby-string'
30
+ when :symbol then 'ruby-value'
31
+ when :x_string then 'ruby-string'
32
+ when :regexp then 'ruby-regexp'
33
+ when :identifier then 'ruby-identifier'
34
+ end
35
+
36
+ text = t[:text]
37
+
38
+ text = CGI.escapeHTML text
39
+
40
+ if style
41
+ end_with_newline = text.end_with?("\n")
42
+ text = text.chomp if end_with_newline
43
+ "<span class=\"#{style}\">#{text}</span>#{"\n" if end_with_newline}"
44
+ else
45
+ text
46
+ end
47
+ end.join
48
+ end
49
+
50
+ ##
51
+ # Adds +tokens+ to the collected tokens
52
+
53
+ def add_tokens(tokens)
54
+ token_stream.concat(tokens)
55
+ end
56
+
57
+ ##
58
+ # Adds one +token+ to the collected tokens
59
+
60
+ def add_token(token)
61
+ token_stream.push(token)
62
+ end
63
+
64
+ ##
65
+ # Starts collecting tokens
66
+ #
67
+ # The optional +loader+ is called once on first access and its result is reused.
68
+
69
+ def collect_tokens(language, loader: nil)
70
+ @token_stream = []
71
+ @token_stream_loader = loader
72
+ @token_stream_language = language
73
+ end
74
+
75
+ alias start_collecting_tokens collect_tokens
76
+
77
+ ##
78
+ # Remove the last token from the collected tokens
79
+
80
+ def pop_token
81
+ token_stream.pop
82
+ end
83
+
84
+ ##
85
+ # Current token stream
86
+
87
+ def token_stream
88
+ if @token_stream_loader
89
+ @token_stream = @token_stream_loader.call
90
+ @token_stream_loader = nil
57
91
  end
92
+ @token_stream
93
+ end
58
94
 
59
- text = CGI.escapeHTML text
60
-
61
- if style then
62
- end_with_newline = text.end_with?("\n")
63
- text = text.chomp if end_with_newline
64
- "<span class=\"#{style}\">#{text}</span>#{"\n" if end_with_newline}"
65
- else
66
- text
67
- end
68
- end.join
69
- end
70
-
71
- ##
72
- # Adds +tokens+ to the collected tokens
73
-
74
- def add_tokens(tokens)
75
- @token_stream.concat(tokens)
76
- end
77
-
78
- ##
79
- # Adds one +token+ to the collected tokens
80
-
81
- def add_token(token)
82
- @token_stream.push(token)
83
- end
84
-
85
- ##
86
- # Starts collecting tokens
87
- #
88
-
89
- def collect_tokens(language)
90
- @token_stream = []
91
- @token_stream_language = language
92
- end
93
-
94
- alias start_collecting_tokens collect_tokens
95
-
96
- ##
97
- # Remove the last token from the collected tokens
98
-
99
- def pop_token
100
- @token_stream.pop
101
- end
95
+ ##
96
+ # Returns a string representation of the token stream
102
97
 
103
- ##
104
- # Current token stream
105
-
106
- def token_stream
107
- @token_stream
108
- end
109
-
110
- ##
111
- # Returns a string representation of the token stream
98
+ def tokens_to_s
99
+ (token_stream or return '').compact.map { |token| token[:text] }.join ''
100
+ end
112
101
 
113
- def tokens_to_s
114
- (token_stream or return '').compact.map { |token| token[:text] }.join ''
115
- end
102
+ ##
103
+ # Returns the source language of the token stream as a string
104
+ #
105
+ # Returns 'c' or 'ruby'
116
106
 
117
- ##
118
- # Returns the source language of the token stream as a string
119
- #
120
- # Returns 'c' or 'ruby'
107
+ def source_language
108
+ @token_stream_language == :c ? 'c' : 'ruby'
109
+ end
121
110
 
122
- def source_language
123
- @token_stream_language == :c ? 'c' : 'ruby'
124
111
  end
125
-
126
112
  end