A parser for TomDoc based on TomDoc 1.0.0-rc1 (02adef9b5a)
The TomDoc specification can be found at:
The latest version of the TomDoc specification can be found at:
github.com/mojombo/tomdoc/blob/master/tomdoc.md
There are a few differences between this parser and the specification. A best-effort was made to follow the specification as closely as possible but some choices to deviate were made.
A future version of RDoc will warn when a MUST or MUST NOT is violated and may warn when a SHOULD or SHOULD NOT is violated. RDoc will always try to emit documentation even if given invalid TomDoc.
Here are some implementation choices this parser currently makes:
This parser allows rdoc-style inline markup but you should not depended on it.
This parser allows a space between the comment and the method body.
This parser does not require the default value to be described for an optional argument.
This parser does not examine the order of sections. An Examples section may precede the Arguments section.
This class is documented in TomDoc format. Since this is a subclass of the RDoc markup parser there isn’t much to see here, unfortunately.
Creates a new TomDoc parser. See also RDoc::Markup.parse
# File lib/rdoc/tom_doc.rb, line 125
def initialize
  super
  @section = nil
end
						Parses TomDoc from text
A String containing TomDoc-format text.
RDoc::TomDoc.parse "This method does some things Returns nothing. " # => #<RDoc::Markup::Document:0xXXX @parts=[...], @file=nil>
Returns an RDoc::Markup::Document representing the TomDoc format.
# File lib/rdoc/tom_doc.rb, line 79
def self.parse text
  parser = new
  parser.tokenize text
  doc = RDoc::Markup::Document.new
  parser.parse doc
  doc
end
						Token accessor
Extracts the Signature section’s method signature
An RDoc::Comment that will be parsed and have the signature extracted
Returns a String containing the signature and nil if not
# File lib/rdoc/tom_doc.rb, line 95
def self.signature comment
  return unless comment.tomdoc?
  document = comment.parse
  signature = nil
  found_heading = false
  found_signature = false
  document.parts.delete_if do |part|
    next false if found_signature
    found_heading ||=
      RDoc::Markup::Heading === part && part.text == 'Signature'
    next false unless found_heading
    next true if RDoc::Markup::BlankLine === part
    if RDoc::Markup::Verbatim === part then
      signature = part
      found_signature = true
    end
  end
  signature and signature.text
end
						Builds a heading from the token stream
The level of heading to create
Returns an RDoc::Markup::Heading
# File lib/rdoc/tom_doc.rb, line 137
def build_heading level
  heading = super
  @section = heading.text
  heading
end
						Builds a paragraph from the token stream
Unused
Returns an RDoc::Markup::Paragraph.
# File lib/rdoc/tom_doc.rb, line 167
def build_paragraph margin
  p :paragraph_start => margin if @debug
  paragraph = RDoc::Markup::Paragraph.new
  until @tokens.empty? do
    type, data, = get
    if type == :TEXT then
      paragraph << data
      skip :NEWLINE
    else
      unget
      break
    end
  end
  p :paragraph_end => margin if @debug
  paragraph
end
						Builds a verbatim from the token stream. A verbatim in the Examples section will be marked as in ruby format.
The indentation from the margin for lines that belong to this verbatim section.
Returns an RDoc::Markup::Verbatim
# File lib/rdoc/tom_doc.rb, line 153
def build_verbatim margin
  verbatim = super
  verbatim.format = :ruby if @section == 'Examples'
  verbatim
end
						Turns text into an Array of tokens
A String containing TomDoc-format text.
Returns self.
# File lib/rdoc/tom_doc.rb, line 195
def tokenize text
  text.sub!(%r\A(Public|Internal|Deprecated):\s+/, '')
  s = StringScanner.new text
  @line = 0
  @line_pos = 0
  until s.eos? do
    pos = s.pos
    # leading spaces will be reflected by the column of the next token
    # the only thing we loose are trailing spaces at the end of the file
    next if s.scan(%r +/)
    @tokens << case
               when s.scan(%r\r?\n/) then
                 token = [:NEWLINE, s.matched, *token_pos(pos)]
                 @line_pos = s.pos
                 @line += 1
                 token
               when s.scan(%r(Examples|Signature)$/) then
                 @tokens << [:HEADER, 3, *token_pos(pos)]
                 [:TEXT, s[1], *token_pos(pos)]
               when s.scan(%r([:\w]\w*)[ ]+- /) then
                 [:NOTE, s[1], *token_pos(pos)]
               else
                 s.scan(%r.*/)
                 [:TEXT, s.matched.sub(%r\r$/, ''), *token_pos(pos)]
               end
  end
  self
end
						| / | Search | 
|---|---|
| ? | Show this help |