@@ -234,7 +234,9 @@ def tomdoc?
234234 # There are more, but already handled by RDoc::Parser::C
235235 COLON_LESS_DIRECTIVES = %w[ call-seq Document-method ] . freeze # :nodoc:
236236
237- private_constant :MULTILINE_DIRECTIVES , :COLON_LESS_DIRECTIVES
237+ DIRECTIVE_OR_ESCAPED_DIRECTIV_REGEXP = /\A (?<colon>\\ ?:|:?)(?<directive>[\w -]+):(?<param>.*)/
238+
239+ private_constant :MULTILINE_DIRECTIVES , :COLON_LESS_DIRECTIVES , :DIRECTIVE_OR_ESCAPED_DIRECTIV_REGEXP
238240
239241 class << self
240242
@@ -271,7 +273,7 @@ def from_document(document) # :nodoc:
271273 # # private comment
272274 # #++
273275
274- def parse ( text , filename , line_no , type )
276+ def parse ( text , filename , line_no , type , & include_callback )
275277 case type
276278 when :ruby
277279 text = text . gsub ( /^#+/ , '' ) if text . start_with? ( '#' )
@@ -283,8 +285,6 @@ def parse(text, filename, line_no, type)
283285 private_end_regexp = /^(\s *\* )?\+ {2}$/
284286 indent_regexp = /^\s *(\/ \* +|\* )?\s */
285287 text = text . gsub ( /\s *\* +\/ \s *\z / , '' )
286- # TODO: should not be here. Looks like another type of directive
287- # text = text.gsub %r%Document-method:\s+[\w:.#=!?|^&<>~+\-/*\%@`\[\]]+%, ''
288288 when :simple
289289 # Unlike other types, this implementation only looks for two dashes at
290290 # the beginning of the line. Three or more dashes are considered to be
@@ -302,10 +302,12 @@ def parse(text, filename, line_no, type)
302302 line = lines . shift
303303 read_lines = 1
304304 if in_private
305+ # If `++` appears in a private section that starts with `--`, private section ends.
305306 in_private = false if line . match? ( private_end_regexp )
306307 line_no += read_lines
307308 next
308309 elsif line . match? ( private_start_regexp )
310+ # If `--` appears in a line, private section starts.
309311 in_private = true
310312 line_no += read_lines
311313 next
@@ -314,20 +316,29 @@ def parse(text, filename, line_no, type)
314316 prefix = line [ indent_regexp ]
315317 prefix_indent = ' ' * prefix . size
316318 line = line . byteslice ( prefix . bytesize ..)
317- /\A (?<colon>\\ ?:|:?)(?<directive>[\w -]+):(?<param>.*)/ =~ line
318319
319- if colon == '\\:'
320- # unescape if escaped
320+ if ( directive_match = DIRECTIVE_OR_ESCAPED_DIRECTIV_REGEXP . match ( line ) )
321+ colon = directive_match [ :colon ]
322+ directive = directive_match [ :directive ]
323+ raw_param = directive_match [ :param ]
324+ param = raw_param . strip
325+ else
326+ colon = directive = raw_param = param = nil
327+ end
328+
329+ if !directive
330+ comment_lines << prefix_indent + line
331+ elsif colon == '\\:'
332+ # If directive is escaped, unescape it
321333 comment_lines << prefix_indent + line . sub ( '\\:' , ':' )
322- elsif ! directive || param . start_with? ( ':' ) || ( colon . empty? && !COLON_LESS_DIRECTIVES . include? ( directive ) )
334+ elsif raw_param . start_with? ( ':' ) || ( colon . empty? && !COLON_LESS_DIRECTIVES . include? ( directive ) )
323335 # Something like `:toto::` is not a directive
324336 # Only few directives allows to start without a colon
325337 comment_lines << prefix_indent + line
326338 elsif directive == 'include'
327- filename_to_include = param . strip
328- yield ( filename_to_include , prefix_indent ) . lines . each { |l | comment_lines << l . chomp }
339+ filename_to_include = param
340+ include_callback . call ( filename_to_include , prefix_indent ) . lines . each { |l | comment_lines << l . chomp }
329341 elsif MULTILINE_DIRECTIVES . include? ( directive )
330- param = param . strip
331342 value_lines = take_multiline_directive_value_lines ( directive , filename , line_no , lines , prefix_indent . size , indent_regexp , !param . empty? )
332343 read_lines += value_lines . size
333344 lines . shift ( value_lines . size )
@@ -338,8 +349,7 @@ def parse(text, filename, line_no, type)
338349 value = value_lines . join ( "\n " )
339350 directives [ directive ] = [ value . empty? ? nil : value , line_no ]
340351 else
341- value = param . strip
342- directives [ directive ] = [ value . empty? ? nil : value , line_no ]
352+ directives [ directive ] = [ param . empty? ? nil : param , line_no ]
343353 end
344354 line_no += read_lines
345355 end
0 commit comments