# 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 52
    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 396
    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 410
    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 379
    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 334
    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 318
    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 386
    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 64
    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 282
    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 370
    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 351
    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 264
    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 341
    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 309
    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