Class: RDoc::Comment
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Instance Chain:
self,
Text
|
|
| Inherits: | Object |
| Defined in: | lib/rdoc/comment.rb |
Constant Summary
-
COLON_LESS_DIRECTIVES =
private
Internal use only
# File 'lib/rdoc/comment.rb', line 235
There are more, but already handled by
Parser::C%w[call-seq Document-method].freeze
-
DIRECTIVE_OR_ESCAPED_DIRECTIV_REGEXP =
private
Internal use only
# File 'lib/rdoc/comment.rb', line 237/\A(?<colon>\\?:|:?)(?<directive>[\w-]+):(?<param>.*)/ -
MULTILINE_DIRECTIVES =
private
Internal use only
# File 'lib/rdoc/comment.rb', line 232%w[call-seq].freeze
Text - Included
MARKUP_FORMAT, SPACE_SEPARATED_LETTER_CLASS, TO_HTML_CHARACTERS
Class Method Summary
- .new(text = nil, location = nil, language = nil) ⇒ Comment constructor
- .normalize_comment_lines(lines)
-
.parse(text, filename, line_no, type, &include_callback)
Parse comment, collect directives as an attribute and return [normalized_comment_text, directives_hash] This method expands include and removes everything not needed in the document text, such as private section, directive line, comment characters
# /* * */and indent spaces. - .take_multiline_directive_value_lines(directive, filename, line_no, lines, base_indent_size, indent_regexp, has_param)
-
.from_document(document)
Internal use only
Create a new parsed comment from a document.
Instance Attribute Summary
-
#document=(value)
writeonly
Overrides the content returned by #parse.
-
#empty? ⇒ Boolean
readonly
A comment is empty if its text String is empty.
-
#format
rw
The format of this comment.
-
#format=(format)
rw
Sets the format of this comment and resets any parsed document.
-
#line
rw
Line where this
Commentwas written. -
#location
(also: #file)
rw
The
TopLevelthis comment was found in. -
#normalized=(value)
rw
Change normalized, when creating already normalized comment.
-
#text
(also: #to_s)
rw
The text for this comment.
-
#text=(text)
rw
Replaces this comment’s text with #text and resets the parsed document.
-
#to_s
readonly
Aliasfor text. -
#tomdoc? ⇒ Boolean
readonly
Returns true if this comment is in
TomDocformat. -
#file
readonly
Internal use only
For duck-typing when merging classes at load time.
-
#normalized? ⇒ Boolean
rw
Internal use only
Was this text normalized?
Text - Included
| #language | The language for this text. |
Instance Method Summary
-
#encode!(encoding)
HACK dubious.
-
#extract_call_seq
Look for a ‘call-seq’ in the comment to override the normal parameter handling.
-
#normalize
Normalizes the text.
-
#parse
Parses the comment into an
Markup::Document. -
#remove_private
Removes private sections from this comment.
- #==(other) Internal use only
- #initialize_copy(copy) Internal use only
- #inspect Internal use only
Text - Included
| #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 |
| #snippet | The first |
| #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 |
Constructor Details
.new(text = nil, location = nil, language = nil) ⇒ Comment
[ GitHub ]
Class Method Details
.from_document(document)
Create a new parsed comment from a document
.normalize_comment_lines(lines)
[ GitHub ]# File 'lib/rdoc/comment.rb', line 363
private def normalize_comment_lines(lines) blank_line_regexp = /\A\s*\z/ lines = lines.dup lines.shift while lines.first&.match?(blank_line_regexp) lines.pop while lines.last&.match?(blank_line_regexp) min_spaces = lines.map do |l| l.match(/\A *(?=\S)/)&.end(0) end.compact.min if min_spaces && min_spaces > 0 lines.map { |l| l[min_spaces..] || '' } else lines end end
.parse(text, filename, line_no, type, &include_callback)
Parse comment, collect directives as an attribute and return [normalized_comment_text, directives_hash] This method expands include and removes everything not needed in the document text, such as private section, directive line, comment characters # /* * */ and indent spaces.
RDoc comment consists of include, directive, multiline directive, private section and comment text.
# :include: filename
Directive
# :directive-without-value:
# :directive-with-value: value
Multiline directive (only :call-seq:)
# :multiline-directive:
# value1
# value2
Private section
#--
# private comment
#++
# File 'lib/rdoc/comment.rb', line 276
def parse(text, filename, line_no, type, &include_callback) case type when :ruby text = text.gsub(/^#+/, '') if text.start_with?('#') private_start_regexp = /^-{2,}$/ private_end_regexp = /^\+{2}$/ indent_regexp = /^\s*/ when :c private_start_regexp = /^(\s*\*)?-{2,}$/ private_end_regexp = /^(\s*\*)?\+{2}$/ indent_regexp = /^\s*(\/\*+|\*)?\s*/ text = text.gsub(/\s*\*+\/\s*\z/, '') when :simple # Unlike other types, this implementation only looks for two dashes at # the beginning of the line. Three or more dashes are considered to be # a rule and ignored. private_start_regexp = /^-{2}$/ private_end_regexp = /^\+{2}$/ indent_regexp = /^\s*/ end directives = {} lines = text.split("\n") in_private = false comment_lines = [] until lines.empty? line = lines.shift read_lines = 1 if in_private # If `++` appears in a private section that starts with `--`, private section ends. in_private = false if line.match?(private_end_regexp) line_no += read_lines next elsif line.match?(private_start_regexp) # If `--` appears in a line, private section starts. in_private = true line_no += read_lines next end prefix = line[indent_regexp] prefix_indent = ' ' * prefix.size line = line.byteslice(prefix.bytesize..) if (directive_match = DIRECTIVE_OR_ESCAPED_DIRECTIV_REGEXP.match(line)) colon = directive_match[:colon] directive = directive_match[:directive] raw_param = directive_match[:param] param = raw_param.strip else colon = directive = raw_param = param = nil end if !directive comment_lines << prefix_indent + line elsif colon == '\\:' # If directive is escaped, unescape it comment_lines << prefix_indent + line.sub('\\:', ':') elsif raw_param.start_with?(':') || (colon.empty? && !COLON_LESS_DIRECTIVES.include?(directive)) # Something like `:toto::` is not a directive # Only few directives allows to start without a colon comment_lines << prefix_indent + line elsif directive == 'include' filename_to_include = param include_callback.call(filename_to_include, prefix_indent).lines.each { |l| comment_lines << l.chomp } elsif MULTILINE_DIRECTIVES.include?(directive) value_lines = take_multiline_directive_value_lines(directive, filename, line_no, lines, prefix_indent.size, indent_regexp, !param.empty?) read_lines += value_lines.size lines.shift(value_lines.size) unless param.empty? # Accept `:call-seq: first-line\n second-line` for now value_lines.unshift(param) end value = value_lines.join("\n") directives[directive] = [value.empty? ? nil : value, line_no] else directives[directive] = [param.empty? ? nil : param, line_no] end line_no += read_lines end normalized_comment = String.new(encoding: text.encoding) << normalize_comment_lines(comment_lines).join("\n") [normalized_comment, directives] end
.take_multiline_directive_value_lines(directive, filename, line_no, lines, base_indent_size, indent_regexp, has_param)
[ GitHub ]# File 'lib/rdoc/comment.rb', line 381
private def take_multiline_directive_value_lines(directive, filename, line_no, lines, base_indent_size, indent_regexp, has_param) return [] if lines.empty? first_indent_size = lines.first.match(indent_regexp).end(0) # Blank line or unindented line is not part of multiline-directive value return [] if first_indent_size <= base_indent_size if has_param # :multiline-directive: line1 # line2 # line3 # value_lines = lines.take_while do |l| l.rstrip.match(indent_regexp).end(0) > base_indent_size end min_indent = value_lines.map { |l| l.match(indent_regexp).end(0) }.min value_lines.map { |l| l[min_indent..] } else # Take indented lines accepting blank lines between them value_lines = lines.take_while do |l| l = l.rstrip indent = l[indent_regexp] if indent == l || indent.size >= first_indent_size true end end value_lines.map! { |l| (l[first_indent_size..] || '').chomp } if value_lines.size != lines.size && !value_lines.last.empty? warn "#{filename}:#{line_no} Multiline directive :#{directive}: should end with a blank line." end value_lines.pop while value_lines.last&.empty? value_lines end end
Instance Attribute Details
#document=(value) (writeonly)
[ GitHub ]# File 'lib/rdoc/comment.rb', line 50
attr_writer :document
#empty? ⇒ Boolean (readonly)
A comment is empty if its text String is empty.
# File 'lib/rdoc/comment.rb', line 125
def empty? @text.empty? && (@document.nil? || @document.empty?) end
#file (readonly)
For duck-typing when merging classes at load time
# File 'lib/rdoc/comment.rb', line 34
alias file location # :nodoc:
#format (rw)
The format of this comment. Defaults to Markup
# File 'lib/rdoc/comment.rb', line 19
attr_reader :format
#format=(format) (rw)
Sets the format of this comment and resets any parsed document
#line (rw)
Line where this Comment was written
# File 'lib/rdoc/comment.rb', line 29
attr_accessor :line
#location (rw) Also known as: #file
The TopLevel this comment was found in
# File 'lib/rdoc/comment.rb', line 24
attr_accessor :location
#normalized=(value) (rw)
Change normalized, when creating already normalized comment.
# File 'lib/rdoc/comment.rb', line 167
def normalized=(value) @normalized = value end
#normalized? ⇒ Boolean (rw)
Was this text normalized?
# File 'lib/rdoc/comment.rb', line 174
def normalized? # :nodoc: @normalized end
#text (rw) Also known as: #to_s
The text for this comment
# 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.
#to_s (readonly)
Alias for text
# File 'lib/rdoc/comment.rb', line 44
alias to_s text
#tomdoc? ⇒ Boolean (readonly)
Returns true if this comment is in TomDoc format.
# File 'lib/rdoc/comment.rb', line 228
def tomdoc? @format == 'tomdoc' end
Instance Method Details
#==(other)
#encode!(encoding)
HACK dubious
# File 'lib/rdoc/comment.rb', line 132
def encode!(encoding) @text = String.new @text, encoding: encoding self end
#extract_call_seq
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 # 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)
# File 'lib/rdoc/comment.rb', line 70
def initialize_copy(copy) # :nodoc: @text = copy.text.dup end
#inspect
#normalize
Normalizes the text. See Text#normalize_comment for details
# 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
#parse
Parses the comment into an Markup::Document. The parsed document is cached until the text is changed.
# File 'lib/rdoc/comment.rb', line 182
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
*/