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/parser.rb CHANGED
@@ -1,289 +1,296 @@
1
1
  # -*- coding: us-ascii -*-
2
2
  # frozen_string_literal: true
3
3
 
4
- ##
5
- # A parser is simple a class that subclasses RDoc::Parser and implements #scan
6
- # to fill in an RDoc::TopLevel with parsed data.
7
- #
8
- # The initialize method takes an RDoc::TopLevel to fill with parsed content,
9
- # the name of the file to be parsed, the content of the file, an RDoc::Options
10
- # object and an RDoc::Stats object to inform the user of parsed items. The
11
- # scan method is then called to parse the file and must return the
12
- # RDoc::TopLevel object. By calling super these items will be set for you.
13
- #
14
- # In order to be used by RDoc the parser needs to register the file extensions
15
- # it can parse. Use ::parse_files_matching to register extensions.
16
- #
17
- # require 'rdoc'
18
- #
19
- # class RDoc::Parser::Xyz < RDoc::Parser
20
- # parse_files_matching /\.xyz$/
21
- #
22
- # def initialize top_level, file_name, content, options, stats
23
- # super
24
- #
25
- # # extra initialization if needed
26
- # end
27
- #
28
- # def scan
29
- # # parse file and fill in @top_level
30
- # end
31
- # end
32
-
33
- class RDoc::Parser
34
-
35
- @parsers = []
36
-
37
- class << self
4
+ module RDoc
5
+ ##
6
+ # A parser is simple a class that subclasses RDoc::Parser and implements #scan
7
+ # to fill in an RDoc::TopLevel with parsed data.
8
+ #
9
+ # The initialize method takes an RDoc::TopLevel to fill with parsed content,
10
+ # the name of the file to be parsed, the content of the file, an RDoc::Options
11
+ # object and an RDoc::Stats object to inform the user of parsed items. The
12
+ # scan method is then called to parse the file and must return the
13
+ # RDoc::TopLevel object. By calling super these items will be set for you.
14
+ #
15
+ # In order to be used by RDoc the parser needs to register the file extensions
16
+ # it can parse. Use ::parse_files_matching to register extensions.
17
+ #
18
+ # require 'rdoc'
19
+ #
20
+ # class RDoc::Parser::Xyz < RDoc::Parser
21
+ # parse_files_matching /\.xyz$/
22
+ #
23
+ # def initialize top_level, file_name, content, options, stats
24
+ # super
25
+ #
26
+ # # extra initialization if needed
27
+ # end
28
+ #
29
+ # def scan
30
+ # # parse file and fill in @top_level
31
+ # end
32
+ # end
38
33
 
39
- ##
40
- # An Array of arrays that maps file extension (or name) regular
41
- # expressions to parser classes that will parse matching filenames.
42
- #
43
- # Use parse_files_matching to register a parser's file extensions.
34
+ class Parser
44
35
 
45
- attr_reader :parsers
36
+ @parsers = []
46
37
 
47
- end
38
+ class << self
48
39
 
49
- ##
50
- # The name of the file being parsed
40
+ ##
41
+ # An Array of arrays that maps file extension (or name) regular
42
+ # expressions to parser classes that will parse matching filenames.
43
+ #
44
+ # Use parse_files_matching to register a parser's file extensions.
51
45
 
52
- attr_reader :file_name
46
+ attr_reader :parsers
53
47
 
54
- ##
55
- # Alias an extension to another extension. After this call, files ending
56
- # "new_ext" will be parsed using the same parser as "old_ext"
48
+ end
57
49
 
58
- def self.alias_extension(old_ext, new_ext)
59
- old_ext = old_ext.sub(/^\.(.*)/, '\1')
60
- new_ext = new_ext.sub(/^\.(.*)/, '\1')
50
+ ##
51
+ # The name of the file being parsed
61
52
 
62
- parser = can_parse_by_name "xxx.#{old_ext}"
63
- return false unless parser
53
+ attr_reader :file_name
64
54
 
65
- RDoc::Parser.parsers.unshift [/\.#{new_ext}$/, parser]
55
+ ##
56
+ # Alias an extension to another extension. After this call, files ending
57
+ # "new_ext" will be parsed using the same parser as "old_ext"
66
58
 
67
- true
68
- end
59
+ def self.alias_extension(old_ext, new_ext)
60
+ old_ext = old_ext.sub(/^\.(.*)/, '\1')
61
+ new_ext = new_ext.sub(/^\.(.*)/, '\1')
69
62
 
70
- ##
71
- # Determines if the file is a "binary" file which basically means it has
72
- # content that an RDoc parser shouldn't try to consume.
63
+ parser = can_parse_by_name "xxx.#{old_ext}"
64
+ return false unless parser
73
65
 
74
- def self.binary?(file)
75
- return false if file =~ /\.(rdoc|txt)$/
66
+ Parser.parsers.unshift [/\.#{new_ext}$/, parser]
76
67
 
77
- s = File.read(file, 1024) or return false
68
+ true
69
+ end
78
70
 
79
- return true if s[0, 2] == Marshal.dump('')[0, 2] or s.index("\x00")
71
+ ##
72
+ # Determines if the file is a "binary" file which basically means it has
73
+ # content that an RDoc parser shouldn't try to consume.
80
74
 
81
- mode = 'r:utf-8' # default source encoding has been changed to utf-8
82
- s.sub!(/\A#!.*\n/, '') # assume shebang line isn't longer than 1024.
83
- encoding = s[/^\s*\#\s*(?:-\*-\s*)?(?:en)?coding:\s*([^\s;]+?)(?:-\*-|[\s;])/, 1]
84
- mode = "rb:#{encoding}" if encoding
85
- s = File.open(file, mode) {|f| f.gets(nil, 1024)}
75
+ def self.binary?(file)
76
+ return false if file =~ /\.(rdoc|txt)$/
86
77
 
87
- not s.valid_encoding?
88
- end
78
+ s = File.read(file, 1024) or return false
89
79
 
90
- ##
91
- # Checks if +file+ is a zip file in disguise. Signatures from
92
- # http://www.garykessler.net/library/file_sigs.html
80
+ return true if s[0, 2] == Marshal.dump('')[0, 2] or s.index("\x00")
93
81
 
94
- def self.zip?(file)
95
- zip_signature = File.read file, 4
82
+ mode = 'r:utf-8' # default source encoding has been changed to utf-8
83
+ s.sub!(/\A#!.*\n/, '') # assume shebang line isn't longer than 1024.
84
+ encoding = s[/^\s*\#\s*(?:-\*-\s*)?(?:en)?coding:\s*([^\s;]+?)(?:-\*-|[\s;])/, 1]
85
+ mode = "rb:#{encoding}" if encoding
86
+ s = File.open(file, mode) {|f| f.gets(nil, 1024)}
96
87
 
97
- zip_signature == "PK\x03\x04" or
98
- zip_signature == "PK\x05\x06" or
99
- zip_signature == "PK\x07\x08"
100
- rescue
101
- false
102
- end
88
+ not s.valid_encoding?
89
+ end
103
90
 
104
- ##
105
- # Return a parser that can handle a particular extension
91
+ ##
92
+ # Checks if +file+ is a zip file in disguise. Signatures from
93
+ # http://www.garykessler.net/library/file_sigs.html
106
94
 
107
- def self.can_parse(file_name)
108
- parser = can_parse_by_name file_name
95
+ def self.zip?(file)
96
+ zip_signature = File.read file, 4
109
97
 
110
- # HACK Selenium hides a jar file using a .txt extension
111
- return if parser == RDoc::Parser::Simple and zip? file_name
98
+ zip_signature == "PK\x03\x04" or
99
+ zip_signature == "PK\x05\x06" or
100
+ zip_signature == "PK\x07\x08"
101
+ rescue
102
+ false
103
+ end
112
104
 
113
- parser
114
- end
105
+ ##
106
+ # Return a parser that can handle a particular extension
115
107
 
116
- ##
117
- # Returns a parser that can handle the extension for +file_name+. This does
118
- # not depend upon the file being readable.
108
+ def self.can_parse(file_name)
109
+ parser = can_parse_by_name file_name
119
110
 
120
- def self.can_parse_by_name(file_name)
121
- _, parser = RDoc::Parser.parsers.find { |regexp,| regexp =~ file_name }
111
+ # HACK Selenium hides a jar file using a .txt extension
112
+ return if parser == Parser::Simple and zip? file_name
122
113
 
123
- # The default parser must not parse binary files
124
- ext_name = File.extname file_name
125
- return parser if ext_name.empty?
114
+ parser
115
+ end
126
116
 
127
- if parser == RDoc::Parser::Simple and ext_name !~ /txt|rdoc/ then
128
- case mode = check_modeline(file_name)
129
- when nil, 'rdoc' then # continue
130
- else
131
- RDoc::Parser.parsers.find { |_, p| return p if mode.casecmp?(p.name[/\w+\z/]) }
132
- return nil
117
+ ##
118
+ # Returns a parser that can handle the extension for +file_name+. This does
119
+ # not depend upon the file being readable.
120
+
121
+ def self.can_parse_by_name(file_name)
122
+ _, parser = Parser.parsers.find { |regexp,| regexp =~ file_name }
123
+
124
+ # The default parser must not parse binary files
125
+ ext_name = File.extname file_name
126
+ return parser if ext_name.empty?
127
+
128
+ if parser == Parser::Simple and ext_name !~ /txt|rdoc/
129
+ case mode = check_modeline(file_name)
130
+ when nil, 'rdoc' # continue
131
+ else
132
+ Parser.parsers.find { |_, p| return p if mode.casecmp?(p.name[/\w+\z/]) }
133
+ return nil
134
+ end
133
135
  end
134
- end
135
136
 
136
- parser
137
- rescue Errno::EACCES
138
- end
137
+ parser
138
+ rescue Errno::EACCES
139
+ end
139
140
 
140
- ##
141
- # Returns the file type from the modeline in +file_name+
141
+ ##
142
+ # Returns the file type from the modeline in +file_name+
142
143
 
143
- def self.check_modeline(file_name)
144
- line = File.open file_name do |io|
145
- io.gets
146
- end
144
+ def self.check_modeline(file_name)
145
+ line = File.open file_name do |io|
146
+ io.gets
147
+ end
147
148
 
148
- /-\*-\s*(.*?\S)\s*-\*-/ =~ line
149
+ /-\*-\s*(.*?\S)\s*-\*-/ =~ line
149
150
 
150
- return nil unless type = $1
151
+ return nil unless type = $1
151
152
 
152
- if /;/ =~ type then
153
- return nil unless /(?:\s|\A)mode:\s*([^\s;]+)/i =~ type
154
- type = $1
155
- end
153
+ if /;/ =~ type
154
+ return nil unless /(?:\s|\A)mode:\s*([^\s;]+)/i =~ type
155
+ type = $1
156
+ end
156
157
 
157
- return nil if /coding:/i =~ type
158
+ return nil if /coding:/i =~ type
158
159
 
159
- type.downcase
160
- rescue ArgumentError
161
- rescue Encoding::InvalidByteSequenceError # invalid byte sequence
160
+ type.downcase
161
+ rescue ArgumentError
162
+ rescue ::Encoding::InvalidByteSequenceError # invalid byte sequence
162
163
 
163
- end
164
+ end
164
165
 
165
- ##
166
- # Finds and instantiates the correct parser for the given +file_name+ and
167
- # +content+.
166
+ ##
167
+ # Finds and instantiates the correct parser for the given +file_name+ and
168
+ # +content+.
168
169
 
169
- def self.for(top_level, content, options, stats)
170
- file_name = top_level.absolute_name
171
- return if binary? file_name
170
+ def self.for(top_level, content, options, stats)
171
+ file_name = top_level.absolute_name
172
+ return if binary? file_name
172
173
 
173
- parser = use_markup content
174
+ parser = use_markup content
174
175
 
175
- unless parser then
176
- parse_name = file_name
176
+ unless parser
177
+ parse_name = file_name
177
178
 
178
- # If no extension, look for shebang
179
- if file_name !~ /\.\w+$/ && content =~ %r{\A#!(.+)} then
180
- shebang = $1
181
- case shebang
182
- when %r{env\s+ruby}, %r{/ruby}
183
- parse_name = 'dummy.rb'
179
+ # If no extension, look for shebang
180
+ if file_name !~ /\.\w+$/ && content =~ %r{\A#!(.+)}
181
+ shebang = $1
182
+ case shebang
183
+ when %r{env\s+ruby}, %r{/ruby}
184
+ parse_name = 'dummy.rb'
185
+ end
184
186
  end
187
+
188
+ parser = can_parse parse_name
185
189
  end
186
190
 
187
- parser = can_parse parse_name
188
- end
191
+ return unless parser
189
192
 
190
- return unless parser
193
+ content = remove_modeline content
191
194
 
192
- content = remove_modeline content
195
+ parser.new top_level, content, options, stats
196
+ rescue SystemCallError
197
+ nil
198
+ end
193
199
 
194
- parser.new top_level, content, options, stats
195
- rescue SystemCallError
196
- nil
197
- end
200
+ ##
201
+ # Record which file types this parser can understand.
202
+ #
203
+ # It is ok to call this multiple times.
198
204
 
199
- ##
200
- # Record which file types this parser can understand.
201
- #
202
- # It is ok to call this multiple times.
205
+ def self.parse_files_matching(regexp)
206
+ Parser.parsers.unshift [regexp, self]
207
+ end
203
208
 
204
- def self.parse_files_matching(regexp)
205
- RDoc::Parser.parsers.unshift [regexp, self]
206
- end
209
+ ##
210
+ # Removes an emacs-style modeline from the first line of the document
207
211
 
208
- ##
209
- # Removes an emacs-style modeline from the first line of the document
212
+ def self.remove_modeline(content)
213
+ content.sub(/\A.*-\*-\s*(.*?\S)\s*-\*-.*\r?\n/, '')
214
+ end
210
215
 
211
- def self.remove_modeline(content)
212
- content.sub(/\A.*-\*-\s*(.*?\S)\s*-\*-.*\r?\n/, '')
213
- end
216
+ ##
217
+ # If there is a <tt>markup: parser_name</tt> comment at the front of the
218
+ # file, use it to determine the parser. For example:
219
+ #
220
+ # # markup: rdoc
221
+ # # Class comment can go here
222
+ #
223
+ # class C
224
+ # end
225
+ #
226
+ # The comment should appear as the first line of the +content+.
227
+ #
228
+ # If the content contains a shebang or editor modeline the comment may
229
+ # appear on the second or third line.
230
+ #
231
+ # Any comment style may be used to hide the markup comment.
232
+ #
233
+ # The +tomdoc+ and +markdown+ markups name comment formats rather than
234
+ # parsers, so no parser is selected for them and RDoc::Parser.for picks one
235
+ # from the file name instead.
214
236
 
215
- ##
216
- # If there is a <tt>markup: parser_name</tt> comment at the front of the
217
- # file, use it to determine the parser. For example:
218
- #
219
- # # markup: rdoc
220
- # # Class comment can go here
221
- #
222
- # class C
223
- # end
224
- #
225
- # The comment should appear as the first line of the +content+.
226
- #
227
- # If the content contains a shebang or editor modeline the comment may
228
- # appear on the second or third line.
229
- #
230
- # Any comment style may be used to hide the markup comment.
237
+ def self.use_markup(content)
238
+ markup = content.lines.first(3).grep(/markup:\s+(\w+)/) { $1 }.first
231
239
 
232
- def self.use_markup(content)
233
- markup = content.lines.first(3).grep(/markup:\s+(\w+)/) { $1 }.first
240
+ return unless markup
234
241
 
235
- return unless markup
242
+ # tomdoc and markdown name a comment format, not a parser. Skipping them
243
+ # keeps the search below from matching RDoc::Parser::Markdown for a file
244
+ # that is not markdown.
245
+ return if %w[tomdoc markdown].include? markup
236
246
 
237
- # TODO Ruby should be returned only when the filename is correct
238
- return RDoc::Parser::Ruby if %w[tomdoc markdown].include? markup
247
+ markup = Regexp.escape markup
239
248
 
240
- markup = Regexp.escape markup
249
+ _, selected = Parser.parsers.find do |_, parser|
250
+ /^#{markup}$/i =~ parser.name.sub(/.*:/, '')
251
+ end
241
252
 
242
- _, selected = RDoc::Parser.parsers.find do |_, parser|
243
- /^#{markup}$/i =~ parser.name.sub(/.*:/, '')
253
+ selected
244
254
  end
245
255
 
246
- selected
247
- end
248
-
249
- ##
250
- # Creates a new Parser storing +top_level+, +file_name+, +content+,
251
- # +options+ and +stats+ in instance variables. In +@preprocess+ an
252
- # RDoc::Markup::PreProcess object is created which allows processing of
253
- # directives.
254
-
255
- def initialize(top_level, content, options, stats)
256
- @top_level = top_level
257
- @top_level.parser = self.class
258
- @store = @top_level.store
259
-
260
- @file_name = top_level.absolute_name
261
- @content = content
262
- @options = options
263
- @stats = stats
264
-
265
- @preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include
266
- @preprocess.options = @options
267
- end
256
+ ##
257
+ # Creates a new Parser storing +top_level+, +file_name+, +content+,
258
+ # +options+ and +stats+ in instance variables. In +@preprocess+ an
259
+ # RDoc::Markup::PreProcess object is created which allows processing of
260
+ # directives.
261
+
262
+ def initialize(top_level, content, options, stats)
263
+ @top_level = top_level
264
+ @top_level.parser = self.class
265
+ @store = @top_level.store
266
+
267
+ @file_name = top_level.absolute_name
268
+ @content = content
269
+ @options = options
270
+ @stats = stats
271
+
272
+ @preprocess = Markup::PreProcess.new @file_name, @options.rdoc_include
273
+ @preprocess.options = @options
274
+ end
268
275
 
269
- autoload :RubyTools, "#{__dir__}/parser/ruby_tools"
270
- autoload :Text, "#{__dir__}/parser/text"
276
+ autoload :Text, "#{__dir__}/parser/text"
271
277
 
272
- ##
273
- # Normalizes tabs in +body+
274
-
275
- def handle_tab_width(body)
276
- if /\t/ =~ body
277
- tab_width = @options.tab_width
278
- body.split(/\n/).map do |line|
279
- 1 while line.gsub!(/\t+/) do
280
- b, e = $~.offset(0)
281
- ' ' * (tab_width * (e-b) - b % tab_width)
282
- end
283
- line
284
- end.join "\n"
285
- else
286
- body
278
+ ##
279
+ # Normalizes tabs in +body+
280
+
281
+ def handle_tab_width(body)
282
+ if /\t/ =~ body
283
+ tab_width = @options.tab_width
284
+ body.split(/\n/).map do |line|
285
+ 1 while line.gsub!(/\t+/) do
286
+ b, e = $~.offset(0)
287
+ ' ' * (tab_width * (e-b) - b % tab_width)
288
+ end
289
+ line
290
+ end.join "\n"
291
+ else
292
+ body
293
+ end
287
294
  end
288
295
  end
289
296
  end
@@ -294,4 +301,6 @@ require_relative 'parser/c'
294
301
  require_relative 'parser/changelog'
295
302
  require_relative 'parser/markdown'
296
303
  require_relative 'parser/rd'
304
+ require_relative 'parser/rbs'
297
305
  require_relative 'parser/ruby'
306
+ require_relative 'parser/ruby_colorizer'