class RDoc::RD::BlockParser

RD format parser for headings, paragraphs, lists, verbatim sections that exist as blocks.

Attributes

footnotes[R]

Footnotes for this document

include_path[RW]

Path to find included files in

labels[R]

Labels for items in this document

Public Class Methods

new() click to toggle source

Creates a new RDoc::RD::BlockParser. Use parse to parse an rd-format document.

# File lib/rdoc/rd/block_parser.rb, line 53
def initialize
  @inline_parser = RDoc::RD::InlineParser.new self
  @include_path = []

  # for testing
  @footnotes = []
  @labels    = {}
end

Public Instance Methods

add_footnote(content) click to toggle source

Adds footnote content to the document

# File lib/rdoc/rd/block_parser.rb, line 397
def add_footnote content
  index = @footnotes.length / 2 + 1

  footmark_link = "{^#{index}}[rdoc-label:footmark-#{index}:foottext-#{index}]"

  @footnotes << RDoc::Markup::Paragraph.new(footmark_link, ' ', *content)
  @footnotes << RDoc::Markup::BlankLine.new

  index
end
add_label(label) click to toggle source

Adds label label to the document

# File lib/rdoc/rd/block_parser.rb, line 411
def add_label label
  @labels[label] = true

  label
end
content(values) click to toggle source

Retrieves the content of values as a single String

# File lib/rdoc/rd/block_parser.rb, line 380
def content values
 values.map { |value| value.content }.join
end
line_index() click to toggle source

Current line number

# File lib/rdoc/rd/block_parser.rb, line 335
def line_index
  @i
end
on_error(et, ev, _values) click to toggle source

Raises a ParseError when invalid formatting is found

# File lib/rdoc/rd/block_parser.rb, line 319
def on_error(et, ev, _values)
  prv, cur, nxt = format_line_num(@i, @i+1, @i+2)

  raise ParseError, <<Msg

RD syntax error: line #{@i+1}:
  #{prv}  |#{@src[@i-1].chomp}
  #{cur}=>|#{@src[@i].chomp}
  #{nxt}  |#{@src[@i+1].chomp}

Msg
end
paragraph(value) click to toggle source

Creates a paragraph for value

# File lib/rdoc/rd/block_parser.rb, line 387
def paragraph value
  content = cut_off(value).join(' ').rstrip
  contents = @inline_parser.parse content

  RDoc::Markup::Paragraph.new(*contents)
end
parse(src) click to toggle source

Parses src and returns an RDoc::Markup::Document.

# File lib/rdoc/rd/block_parser.rb, line 65
def parse src
  @src = src
  @src.push false

  @footnotes = []
  @labels    = {}

  # @i: index(line no.) of src
  @i = 0

  # stack for current indentation
  @indent_stack = []

  # how indented.
  @current_indent = @indent_stack.join("")

  # RDoc::RD::BlockParser for tmp src
  @subparser = nil

  # which part is in now
  @in_part = nil
  @part_content = []

  @in_verbatim = false

  @yydebug = true

  document = do_parse

  unless @footnotes.empty? then
    blankline = document.parts.pop

    document.parts << RDoc::Markup::Rule.new(1)
    document.parts.concat @footnotes

    document.parts.push blankline
  end

  document
end

Private Instance Methods

cut_off(src) click to toggle source

Cuts off excess whitespace in src

# File lib/rdoc/rd/block_parser.rb, line 283
def cut_off(src)
  ret = []
  whiteline_buf = []

  line = src.shift
  /^\s*/ =~ line

  indent = Regexp.quote($&)
  ret.push($')

  while line = src.shift
    if /^(\s*)$/ =~ line
      whiteline_buf.push(line)
    elsif /^#{indent}/ =~ line
      unless whiteline_buf.empty?
        ret.concat(whiteline_buf)
        whiteline_buf.clear
      end
      ret.push($')
    else
      raise "[BUG]: probably Parser Error while cutting off.\n"
    end
  end
  ret
end
format_line_num(*line_numbers) click to toggle source

Formats line numbers line_numbers prettily

# File lib/rdoc/rd/block_parser.rb, line 371
def format_line_num(*line_numbers)
  width = line_numbers.collect{|i| i.to_s.length }.max
  line_numbers.collect{|i| sprintf("%#{width}d", i) }
end
get_included(file) click to toggle source

Retrieves the content for file from the #include_path

# File lib/rdoc/rd/block_parser.rb, line 352
def get_included(file)
  included = []

  @include_path.each do |dir|
    file_name = File.join dir, file

    if File.exist? file_name then
      included = IO.readlines file_name
      break
    end
  end

  included
end
if_current_indent_equal(indent) { || ... } click to toggle source

Yields to the given block if indent matches the current indent, otherwise an indentation token is processed.

# File lib/rdoc/rd/block_parser.rb, line 265
def if_current_indent_equal(indent)
  indent = indent.sub(/\t/, "\s" * 8)
  if @current_indent == indent
    @i += 1 # next line
    yield
  elsif indent.index(@current_indent) == 0
    @indent_stack.push(indent[@current_indent.size .. -1])
    [:INDENT, ":INDENT"]
  else
    @indent_stack.pop
    [:DEDENT, ":DEDENT"]
  end
end
parse_subtree(src) click to toggle source

Parses subtree src

# File lib/rdoc/rd/block_parser.rb, line 342
def parse_subtree src
  @subparser ||= RDoc::RD::BlockParser.new

  @subparser.parse src
end
set_term_to_element(parent, term) click to toggle source
# File lib/rdoc/rd/block_parser.rb, line 310
def set_term_to_element(parent, term)
#  parent.set_term_under_document_struct(term, @tree.document_struct)
  parent.set_term_without_document_struct(term)
end