class RDoc::Comment

A comment holds the text comment for a RDoc::CodeObject and provides a unified way of cleaning it up and parsing it into an RDoc::Markup::Document.

Each comment may have a different markup format set by format=. By default ‘rdoc’ is used. The :markup: directive tells RDoc which format to use.

See Other directives at RDoc::Markup for instructions on adding an alternate format.

Attributes

Overrides the content returned by parse. Use when there is no text source for this comment

The format of this comment. Defaults to RDoc::Markup

Line where this Comment was written

The RDoc::TopLevel this comment was found in

The text for this comment

The text for this comment

Public Class Methods

Creates a new comment with text that is found in the RDoc::TopLevel location.

# File lib/rdoc/comment.rb, line 56
def initialize text = nil, location = nil, language = nil
  @location = location
  @text     = text.nil? ? nil : text.dup
  @language = language

  @document   = nil
  @format     = 'rdoc'
  @normalized = false
end

Public Instance Methods

A comment is empty if its text String is empty.

# File lib/rdoc/comment.rb, line 144
def empty?
  @text.empty?
end

HACK dubious

# File lib/rdoc/comment.rb, line 151
def encode! encoding
  # TODO: Remove this condition after Ruby 2.2 EOL
  if RUBY_VERSION < '2.3.0'
    @text = @text.force_encoding encoding
  else
    @text = String.new @text, encoding: encoding
  end
  self
end

Look for a ‘call-seq’ in the comment to override the normal parameter handling. The :call-seq: is indented from the baseline. All lines of the same indentation level and prefix are consumed.

For example, all of the following will be used as the :call-seq:

# :call-seq:
#   ARGF.readlines(sep=$/)     -> array
#   ARGF.readlines(limit)      -> array
#   ARGF.readlines(sep, limit) -> array
#
#   ARGF.to_a(sep=$/)     -> array
#   ARGF.to_a(limit)      -> array
#   ARGF.to_a(sep, limit) -> array
# File lib/rdoc/comment.rb, line 95
def extract_call_seq method
  # we must handle situations like the above followed by an unindented first
  # comment.  The difficulty is to make sure not to match lines starting
  # with ARGF at the same indent, but that are after the first description
  # paragraph.
  if @text =~ /^\s*:?call-seq:(.*?(?:\S).*?)^\s*$/m then
    all_start, all_stop = $~.offset(0)
    seq_start, seq_stop = $~.offset(1)

    # we get the following lines that start with the leading word at the
    # same indent, even if they have blank lines before
    if $1 =~ /(^\s*\n)+^(\s*\w+)/m then
      leading = $2 # ' *    ARGF' in the example above
      re = %r%
        \A(
           (^\s*\n)+
           (^#{Regexp.escape leading}.*?\n)+
          )+
        ^\s*$
      %xm

      if @text[seq_stop..-1] =~ re then
        all_stop = seq_stop + $~.offset(0).last
        seq_stop = seq_stop + $~.offset(1).last
      end
    end

    seq = @text[seq_start..seq_stop]
    seq.gsub!(/^\s*(\S|\n)/m, '\1')
    @text.slice! all_start...all_stop

    method.call_seq = seq.chomp

  else
    regexp = /^\s*:?call-seq:(.*?)(^\s*$|\z)/m
    if regexp =~ @text then
      @text = @text.sub(regexp, '')
      seq = $1
      seq.gsub!(/^\s*/, '')
      method.call_seq = seq
    end
  end

  method
end

Sets the format of this comment and resets any parsed document

# File lib/rdoc/comment.rb, line 164
def format= format
  @format = format
  @document = nil
end

Normalizes the text. See RDoc::Text#normalize_comment for details

# File lib/rdoc/comment.rb, line 178
def normalize
  return self unless @text
  return self if @normalized # TODO eliminate duplicate normalization

  @text = normalize_comment @text

  @normalized = true

  self
end

Parses the comment into an RDoc::Markup::Document. The parsed document is cached until the text is changed.

Calls superclass method RDoc::Text#parse
# File lib/rdoc/comment.rb, line 200
def parse
  return @document if @document

  @document = super @text, @format
  @document.file = @location
  @document
end

Removes private sections from this comment. Private sections are flush to the comment marker and start with -- and end with ++. For C-style comments, a private marker may not start at the opening of the comment.

/*
 *--
 * private
 *++
 * public
 */
# File lib/rdoc/comment.rb, line 221
def remove_private
  # Workaround for gsub encoding for Ruby 1.9.2 and earlier
  empty = ''
  empty = RDoc::Encoding.change_encoding empty, @text.encoding

  @text = @text.gsub(%r%^\s*([#*]?)--.*?^\s*(\1)\+\+\n?%m, empty)
  @text = @text.sub(%r%^\s*[#*]?--.*%m, '')
end

Replaces this comment’s text with text and resets the parsed document.

An error is raised if the comment contains a document but no text.

# File lib/rdoc/comment.rb, line 235
def text= text
  raise RDoc::Error, 'replacing document-only comment is not allowed' if
    @text.nil? and @document

  @document = nil
  @text = text.nil? ? nil : text.dup
end

Returns true if this comment is in TomDoc format.

# File lib/rdoc/comment.rb, line 246
def tomdoc?
  @format == 'tomdoc'
end