Class: RDoc::Comment

Inherits:
Object
  • Object
show all
Includes:
Text
Defined in:
lib/rdoc/comment.rb

Constant Summary

Constants included from Text

Text::MARKUP_FORMAT, Text::SPACE_SEPARATED_LETTER_CLASS, Text::TO_HTML_CHARACTERS

Instance Attribute Summary collapse

Attributes included from Text

#language

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Text

encode_fallback, #expand_tabs, #flush_left, #markup, #normalize_comment, #snippet, #strip_hashes, #strip_newlines, #strip_stars, #to_html, #wrap

Constructor Details

#initialize(text = nil, location = nil, language = nil) ⇒ Comment

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



56
57
58
59
60
61
62
63
64
# 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) ⇒ Object (writeonly)

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



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

def document=(value)
  @document = value
end

#formatObject

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



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

def format
  @format
end

#lineObject

Line where this Comment was written



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

def line
  @line
end

#locationObject Also known as: file

The RDoc::TopLevel this comment was found in



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

def location
  @location
end

#textObject Also known as: to_s

The text for this comment



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

def text
  @text
end

Class Method Details

.from_document(document) ⇒ Object

Create a new parsed comment from a document



229
230
231
232
233
234
# File 'lib/rdoc/comment.rb', line 229

def self.from_document(document) # :nodoc:
  comment = RDoc::Comment.new('')
  comment.document = document
  comment.location = RDoc::TopLevel.new(document.file) if document.file
  comment
end

Instance Method Details

#==(other) ⇒ Object

:nodoc:



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

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

#empty?Boolean

A comment is empty if its text String is empty.

Returns:

  • (Boolean)


125
126
127
# File 'lib/rdoc/comment.rb', line 125

def empty?
  @text.empty? && (@document.nil? || @document.empty?)
end

#encode!(encoding) ⇒ Object

HACK dubious



132
133
134
135
# File 'lib/rdoc/comment.rb', line 132

def encode!(encoding)
  @text = String.new @text, encoding: encoding
  self
end

#extract_call_seqObject

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


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/rdoc/comment.rb', line 95

def extract_call_seq
  # 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 /^(?<S> ((?!\n)\s)*+        (?# whitespaces except newline))
       :?call-seq:
         (?<B> \g<S>(?<N>\n|\z)  (?# trailing spaces))?
       (?<seq>
         (\g<S>(?!\w)\S.*\g<N>)*
         (?>
           (?<H> \g<S>\w+        (?# ' #   ARGF' in the example above))
           .*\g<N>)?
         (\g<S>\S.*\g<N>         (?# other non-blank line))*+
         (\g<B>+(\k<H>.*\g<N>    (?# ARGF.to_a lines))++)*+
       )
       (?m:^\s*$|\z)
      /x =~ @text
    seq = $~[:seq]

    all_start, all_stop = $~.offset(0)
    @text.slice! all_start...all_stop

    seq.gsub!(/^\s*/, '')
  end
end

#initialize_copy(copy) ⇒ Object

– TODO deep copy @document



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

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

#inspectObject

:nodoc:



145
146
147
148
149
# File 'lib/rdoc/comment.rb', line 145

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

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

#normalizeObject

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



154
155
156
157
158
159
160
161
162
163
# File 'lib/rdoc/comment.rb', line 154

def normalize
  return self unless @text
  return self if @normalized # TODO eliminate duplicate normalization

  @text = normalize_comment @text

  @normalized = true

  self
end

#normalized?Boolean

Was this text normalized?

Returns:

  • (Boolean)


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

def normalized? # :nodoc:
  @normalized
end

#parseObject

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



176
177
178
179
180
181
182
# File 'lib/rdoc/comment.rb', line 176

def parse
  return @document if @document

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

#remove_privateObject

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
 */


197
198
199
200
201
202
203
204
# File 'lib/rdoc/comment.rb', line 197

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

#tomdoc?Boolean

Returns true if this comment is in TomDoc format.

Returns:

  • (Boolean)


222
223
224
# File 'lib/rdoc/comment.rb', line 222

def tomdoc?
  @format == 'tomdoc'
end