123456789_123456789_123456789_123456789_123456789_

Class: RDoc::Comment

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, Text
Inherits: Object
Defined in: lib/rdoc/comment.rb

Overview

A comment holds the text comment for a CodeObject and provides a unified way of cleaning it up and parsing it into an 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 RDoc::Markup@Other+directives for instructions on adding an alternate format.

Constant Summary

Text - Included

MARKUP_FORMAT, TO_HTML_CHARACTERS

Class Method Summary

Instance Attribute Summary

Text - Included

Instance Method Summary

Text - Included

#expand_tabs

Expands tab characters in #text to eight spaces.

#flush_left

Flush #text left based on the shortest line.

#markup

Convert a string in markup format into HTML.

#normalize_comment

Strips hashes, expands tabs then flushes #text to the left.

#parse

Normalizes #text then builds a Markup::Document from it.

#snippet

The first limit characters of #text as HTML.

#strip_hashes

Strips leading # characters from #text

#strip_newlines

Strips leading and trailing n characters from #text

#strip_stars

Strips /* */ style comments.

#to_html

Converts ampersand, dashes, ellipsis, quotes, copyright and registered trademark symbols in #text to properly encoded characters.

#wrap

Wraps txt to line_len

Constructor Details

.new(text = nil, location = nil, language = nil) ⇒ Comment

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

[ GitHub ]

  
# 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

Instance Attribute Details

#document=(value) (writeonly)

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

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 50

attr_writer   :document

#empty?Boolean (readonly)

A comment is empty if its text String is empty.

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 144

def empty?
  @text.empty?
end

#file (readonly)

This method is for internal use only.

For duck-typing when merging classes at load time

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 34

alias file location # :nodoc:

#format (rw)

The format of this comment. Defaults to Markup

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 19

attr_reader :format

#format=(format) (rw)

Sets the format of this comment and resets any parsed document

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 164

def format= format
  @format = format
  @document = nil
end

#line (rw)

Line where this Comment was written

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 29

attr_accessor :line

#location (rw) Also known as: #file

The TopLevel this comment was found in

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 24

attr_accessor :location

#normalized?Boolean (readonly)

This method is for internal use only.

Was this text normalized?

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 192

def normalized? # :nodoc:
  @normalized
end

#text (rw) Also known as: #to_s

The text for this comment

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 39

attr_reader :text

#text=(text) (rw)

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.

Raises:

[ GitHub ]

  
# 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

#to_s (readonly)

Alias for text

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 44

alias to_s text

#tomdoc?Boolean (readonly)

Returns true if this comment is in TomDoc format.

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 246

def tomdoc?
  @format == 'tomdoc'
end

Instance Method Details

#==(other)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 74

def == other # :nodoc:
  self.class === other and
    other.text == @text and other.location == @location
end

#encode!(encoding)

HACK dubious

[ GitHub ]

  
# 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

#extract_call_seq(method)

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
[ GitHub ]

  
# 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

#initialize_copy(copy)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 70

def initialize_copy copy # :nodoc:
  @text = copy.text.dup
end

#inspect

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 169

def inspect # :nodoc:
  location = @location ? @location.relative_name : '(unknown)'

  "#<%s:%x %s %p>" % [self.class, object_id, location, @text]
end

#normalize

Normalizes the text. See Text#normalize_comment for details

[ GitHub ]

  
# 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

#parse

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

[ GitHub ]

  
# File 'lib/rdoc/comment.rb', line 200

def parse
  return @document if @document

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

#remove_private

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
 */
[ GitHub ]

  
# 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