Class: RDoc::TomDoc
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Class Chain: 
          self,
           Markup::Parser | |
| Instance Chain: 
          self,
           Markup::Parser,Text | |
| Inherits: | RDoc::Markup::Parser 
 | 
| Defined in: | lib/rdoc/tom_doc.rb | 
Overview
A parser for TomDoc based on TomDoc 1.0.0-rc1 (02adef9b5a)
The TomDoc specification can be found at tomdoc.org.
To choose TomDoc as your only default format see RDoc::Options@Saved+Options for instructions on setting up a .rdoc_options file to store your project default.
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.
Constant Summary
Text - Included
  MARKUP_FORMAT, SPACE_SEPARATED_LETTER_CLASS, TO_HTML_CHARACTERS
Markup::Parser - Inherited
  
Class Method Summary
- 
    
      .new  ⇒ TomDoc 
    
    constructor
    Public: Creates a new TomDocparser.
- 
    
      .parse(text)  
    
    Public: Parses TomDoc from text. 
- 
    
      .signature(comment)  
    
    Internal: Extracts the Signature section’s method signature. 
- 
    
      .add_post_processor  
    
    Internal use only
    Internal: Adds a post-processor which sets the RDocsection based on the comment’s status.
Markup::Parser - Inherited
Instance Attribute Summary
- 
    
      #tokens  
    
    readonly
    Internal: Token accessor. 
Markup::Parser - Inherited
Text - Included
| #language | The language for this text. | 
Instance Method Summary
- 
    
      #build_heading(level)  
    
    Internal: Builds a heading from the token stream. 
- 
    
      #build_paragraph(margin)  
    
    Internal: Builds a paragraph from the token stream. 
- 
    
      #build_verbatim(margin)  
    
    Internal: Builds a verbatim from the token stream. 
- 
    
      #tokenize(text)  
    
    Internal: Turns text into an Array of tokens. 
- 
    
      #parse_text(parent, indent)  
    
    Internal use only
    Detects a section change to “Returns” and adds a heading. 
Markup::Parser - Inherited
| #build_heading | Builds a Heading of  | 
| #build_list | Builds a List flush to  | 
| #build_paragraph | Builds a Paragraph that is flush to  | 
| #build_verbatim | Builds a Verbatim that is indented from  | 
| #get | Pulls the next token from the stream. | 
| #parse | Parses the tokens into an array of  | 
| #peek_token | Returns the next token on the stream without modifying the stream. | 
| #setup_scanner | Creates the StringScanner. | 
| #skip | Skips the next token if its type is  | 
| #tokenize | Turns text  | 
| #unget | Returns the current token to the token stream. | 
| #parse_text | Small hook that is overridden by  | 
Text - Included
| #expand_tabs | Expands tab characters in  | 
| #flush_left | Flush  | 
| #markup | Convert a string in markup format into HTML. | 
| #normalize_comment | Strips hashes, expands tabs then flushes  | 
| #parse | Normalizes  | 
| #snippet | The first  | 
| #strip_hashes | Strips leading # characters from  | 
| #strip_newlines | Strips leading and trailing n characters from  | 
| #strip_stars | Strips /* */ style comments. | 
| #to_html | Converts ampersand, dashes, ellipsis, quotes, copyright and registered trademark symbols in  | 
| #wrap | Wraps  | 
Constructor Details
    .new  ⇒ TomDoc 
  
Public: Creates a new TomDoc parser.  See also Markup.parse
# File 'lib/rdoc/tom_doc.rb', line 124
def initialize super @section = nil @seen_returns = false end
Class Method Details
.add_post_processor
Internal: Adds a post-processor which sets the RDoc section based on the comment’s status.
Returns nothing.
# File 'lib/rdoc/tom_doc.rb', line 47
def self.add_post_processor # :nodoc: RDoc::Markup::PreProcess.post_process do |comment, code_object| next unless code_object and RDoc::Comment === comment and comment.format == 'tomdoc' comment.text.gsub!(/(\A\s*# )(Public|Internal|Deprecated):\s+/) do section = code_object.add_section $2 code_object.temporary_section = section $1 end end end
.parse(text)
Public: Parses TomDoc from text
text - A String containing TomDoc-format text.
Examples
RDoc::TomDoc.parse <<-TOMDOC
This method does some things
Returns nothing.
TOMDOC
# => #<RDoc::Markup::Document:0xXXX @parts=[...], @file=nil>Returns an Markup::Document representing the TomDoc format.
.signature(comment)
Internal: Extracts the Signature section’s method signature
comment - An Comment that will be parsed and have the signature
extractedReturns a String containing the signature and nil if not
# File 'lib/rdoc/tom_doc.rb', line 94
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
Instance Attribute Details
#tokens (readonly)
Internal: Token accessor
# File 'lib/rdoc/tom_doc.rb', line 40
attr_reader :tokens
Instance Method Details
#build_heading(level)
Internal: Builds a heading from the token stream
level - 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
#build_paragraph(margin)
# 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 case type when :TEXT then @section = 'Returns' if data =~ /\A(Returns|Raises)/ paragraph << data when :NEWLINE then if :TEXT == peek_token[0] then # Lines beginning with 'Raises' in the Returns section should not be # treated as multiline text if 'Returns' == @section and peek_token[1].start_with?('Raises') then break else paragraph << ' ' end else break end else unget break end end p :paragraph_end => margin if @debug paragraph end
#build_verbatim(margin)
Internal: Builds a verbatim from the token stream. A verbatim in the Examples section will be marked as in Ruby format.
margin - The indentation from the margin for lines that belong to this
verbatim section.Returns an Markup::Verbatim
# File 'lib/rdoc/tom_doc.rb', line 153
def build_verbatim(margin) verbatim = super verbatim.format = :ruby if @section == 'Examples' verbatim end
#parse_text(parent, indent)
Detects a section change to “Returns” and adds a heading
# File 'lib/rdoc/tom_doc.rb', line 207
def parse_text(parent, indent) # :nodoc: paragraph = build_paragraph indent if false == @seen_returns and 'Returns' == @section then @seen_returns = true parent << RDoc::Markup::Heading.new(3, 'Returns') parent << RDoc::Markup::BlankLine.new end parent << paragraph end
#tokenize(text)
Internal: Turns text into an Array of tokens
text - A String containing TomDoc-format text.
Returns self.
# File 'lib/rdoc/tom_doc.rb', line 225
def tokenize(text) text = text.sub(/\A(Public|Internal|Deprecated):\s+/, '') setup_scanner text 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(/ +/) @tokens << case when @s.scan(/\r?\n/) then token = [:NEWLINE, @s.matched, *pos] @s.newline! token when @s.scan(/(Examples|Signature)$/) then @tokens << [:HEADER, 3, *pos] [:TEXT, @s[1], *pos] when @s.scan(/([:\w][\w\[\]]*)[ ]+- /) then [:NOTE, @s[1], *pos] else @s.scan(/.*/) [:TEXT, @s.matched.sub(/\r$/, ''), *pos] end end self end