123456789_123456789_123456789_123456789_123456789_

Class: RDoc::RD::BlockParser

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: Racc::Parser
Defined in: lib/rdoc/rd/block_parser.rb

Overview

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

Constant Summary

  • MARK_TO_LEVEL = Internal use only
    # File 'lib/rdoc/rd/block_parser.rb', line 669
    {
      '='    => 1,
      '=='   => 2,
      '==='  => 3,
      '====' => 4,
      '+'    => 5,
      '++'   => 6,
    }
  • Racc_arg = Internal use only
    # File 'lib/rdoc/rd/block_parser.rb', line 1260
    [
    racc_action_table,
    racc_action_check,
    racc_action_default,
    racc_action_pointer,
    racc_goto_table,
    racc_goto_check,
    racc_goto_default,
    racc_goto_pointer,
    racc_nt_base,
    racc_reduce_table,
    racc_token_table,
    racc_shift_n,
    racc_reduce_n,
    racc_use_result_var ]
  • Racc_debug_parser = Internal use only
    # File 'lib/rdoc/rd/block_parser.rb', line 1328
    false
  • Racc_token_to_s_table = Internal use only
    # File 'lib/rdoc/rd/block_parser.rb', line 1277
    [
    "$end",
    "error",
    "DUMMY",
    "ITEMLISTLINE",
    "ENUMLISTLINE",
    "DESCLISTLINE",
    "METHODLISTLINE",
    "STRINGLINE",
    "WHITELINE",
    "SUBTREE",
    "HEADLINE",
    "INCLUDE",
    "INDENT",
    "DEDENT",
    "$start",
    "document",
    "blocks",
    "block",
    "textblock",
    "verbatim",
    "lists",
    "headline",
    "include",
    "textblockcontent",
    "verbatimcontent",
    "verbatim_after_lists",
    "list",
    "itemlist",
    "enumlist",
    "desclist",
    "methodlist",
    "lists2",
    "itemlistitems",
    "itemlistitem",
    "first_textblock_in_itemlist",
    "other_blocks_in_list",
    "enumlistitems",
    "enumlistitem",
    "first_textblock_in_enumlist",
    "desclistitems",
    "desclistitem",
    "description_part",
    "methodlistitems",
    "methodlistitem",
    "whitelines",
    "blocks_in_list",
    "block_in_list",
    "whitelines2" ]

::Racc::Parser - Inherited

Racc_Runtime_Core_Version_R, Racc_Runtime_Version

Class Method Summary

::Racc::Parser - Inherited

.racc_runtime_type

See additional method definition at file lib/rdoc/rd/block_parser.rb line 239.

Instance Attribute Summary

Instance Method Summary

::Racc::Parser - Inherited

#_racc_do_parse_rb

See additional method definition at file lib/rdoc/rd/block_parser.rb line 302.

#_racc_do_reduce

See additional method definition at file lib/rdoc/rd/block_parser.rb line 502.

#_racc_evalact

common.

#_racc_init_sysvars

See additional method definition at file lib/rdoc/rd/block_parser.rb line 255.

#_racc_setup

See additional method definition at file lib/rdoc/rd/block_parser.rb line 243.

#_racc_yyparse_rb

See additional method definition at file lib/rdoc/rd/block_parser.rb line 352.

#next_token

The method to fetch next token.

#on_error

This method is called when a parse error is found.

#racc_accept

See additional method definition at file lib/rdoc/rd/block_parser.rb line 607.

#racc_e_pop

See additional method definition at file lib/rdoc/rd/block_parser.rb line 612.

#racc_next_state

See additional method definition at file lib/rdoc/rd/block_parser.rb line 619.

#racc_print_stacks

See additional method definition at file lib/rdoc/rd/block_parser.rb line 625.

#racc_print_states

See additional method definition at file lib/rdoc/rd/block_parser.rb line 634.

#racc_read_token

For debugging output.

#racc_reduce

See additional method definition at file lib/rdoc/rd/block_parser.rb line 594.

#racc_shift

See additional method definition at file lib/rdoc/rd/block_parser.rb line 588.

#racc_token2str

See additional method definition at file lib/rdoc/rd/block_parser.rb line 641.

#token_to_str

Convert internal ID of token symbol to the string.

#yyaccept

Exit parser.

#yyerrok

Leave error recovering mode.

#yyerror

Enter error recovering mode.

Constructor Details

.newBlockParser

Creates a new BlockParser. Use #parse to parse an rd-format document.

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 699

def initialize
  @inline_parser = RDoc::RD::InlineParser.new self
  @include_path = []

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

Instance Attribute Details

#footnotes (readonly)

Footnotes for this document

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 683

attr_reader :footnotes

#include_path (rw)

Path to find included files in

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 693

attr_accessor :include_path

#labels (readonly)

Labels for items in this document

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 688

attr_reader :labels

Instance Method Details

#_reduce_1(val, _values, result)

This method is for internal use only.

reduce 0 omitted

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1334

def _reduce_1(val, _values, result)
 result = RDoc::Markup::Document.new(*val[0])
    result
end

#_reduce_10(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1376

def _reduce_10(val, _values, result)
 result = [RDoc::Markup::BlankLine.new]
    result
end

#_reduce_11(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1381

def _reduce_11(val, _values, result)
 result = val[0].parts
    result
end

#_reduce_12(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1386

def _reduce_12(val, _values, result)
      # val[0] is like [level, title]
      title = @inline_parser.parse(val[0][1])
      result = RDoc::Markup::Heading.new(val[0][0], title)

    result
end

#_reduce_13(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1394

def _reduce_13(val, _values, result)
      result = RDoc::Markup::Include.new val[0], @include_path

    result
end

#_reduce_14(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1400

def _reduce_14(val, _values, result)
      # val[0] is Array of String
      result = paragraph val[0]

    result
end

#_reduce_15(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1407

def _reduce_15(val, _values, result)
 result << val[1].rstrip
    result
end

#_reduce_16(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1412

def _reduce_16(val, _values, result)
 result = [val[0].rstrip]
    result
end

#_reduce_17(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1417

def _reduce_17(val, _values, result)
      # val[1] is Array of String
      content = cut_off val[1]
      result = RDoc::Markup::Verbatim.new(*content)

      # imform to lexer.
      @in_verbatim = false

    result
end

#_reduce_18(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1428

def _reduce_18(val, _values, result)
      # val[0] is Array of String
      content = cut_off val[0]
      result = RDoc::Markup::Verbatim.new(*content)

      # imform to lexer.
      @in_verbatim = false

    result
end

#_reduce_19(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1439

def _reduce_19(val, _values, result)
      result << val[1]

    result
end

#_reduce_2(val, _values, result)

This method is for internal use only.

Raises:

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1339

def _reduce_2(val, _values, result)
 raise ParseError, "file empty"
    result
end

#_reduce_20(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1445

def _reduce_20(val, _values, result)
      result.concat val[2]

    result
end

#_reduce_21(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1451

def _reduce_21(val, _values, result)
      result << "\n"

    result
end

#_reduce_22(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1457

def _reduce_22(val, _values, result)
      result = val
      # inform to lexer.
      @in_verbatim = true

    result
end

#_reduce_27(val, _values, result)

This method is for internal use only.

reduce 26 omitted

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1473

def _reduce_27(val, _values, result)
      result = val[0]

    result
end

#_reduce_28(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1479

def _reduce_28(val, _values, result)
      result = val[1]

    result
end

#_reduce_29(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1485

def _reduce_29(val, _values, result)
      result = val[1].push(val[2])

    result
end

#_reduce_3(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1344

def _reduce_3(val, _values, result)
 result = val[0].concat val[1]
    result
end

#_reduce_30(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1491

def _reduce_30(val, _values, result)
 result = val[0] << val[1]
    result
end

#_reduce_31(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1496

def _reduce_31(val, _values, result)
 result = [val[0]]
    result
end

#_reduce_32(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1501

def _reduce_32(val, _values, result)
      result = RDoc::Markup::List.new :BULLET, *val[0]

    result
end

#_reduce_33(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1507

def _reduce_33(val, _values, result)
 result.push(val[1])
    result
end

#_reduce_34(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1512

def _reduce_34(val, _values, result)
 result = val
    result
end

#_reduce_35(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1517

def _reduce_35(val, _values, result)
      result = RDoc::Markup::ListItem.new nil, val[0], *val[1]

    result
end

#_reduce_36(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1523

def _reduce_36(val, _values, result)
      result = RDoc::Markup::List.new :NUMBER, *val[0]

    result
end

#_reduce_37(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1529

def _reduce_37(val, _values, result)
 result.push(val[1])
    result
end

#_reduce_38(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1534

def _reduce_38(val, _values, result)
 result = val
    result
end

#_reduce_39(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1539

def _reduce_39(val, _values, result)
      result = RDoc::Markup::ListItem.new nil, val[0], *val[1]

    result
end

#_reduce_4(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1349

def _reduce_4(val, _values, result)
 result = val[0]
    result
end

#_reduce_40(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1545

def _reduce_40(val, _values, result)
      result = RDoc::Markup::List.new :NOTE, *val[0]

    result
end

#_reduce_41(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1551

def _reduce_41(val, _values, result)
 result.push(val[1])
    result
end

#_reduce_42(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1556

def _reduce_42(val, _values, result)
 result = val
    result
end

#_reduce_43(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1561

def _reduce_43(val, _values, result)
      term = @inline_parser.parse val[0].strip

      result = RDoc::Markup::ListItem.new term, *val[1]

    result
end

#_reduce_44(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1569

def _reduce_44(val, _values, result)
      result = RDoc::Markup::List.new :LABEL, *val[0]

    result
end

#_reduce_45(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1575

def _reduce_45(val, _values, result)
 result.push(val[1])
    result
end

#_reduce_46(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1580

def _reduce_46(val, _values, result)
 result = val
    result
end

#_reduce_47(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1585

def _reduce_47(val, _values, result)
      result = RDoc::Markup::ListItem.new "<tt>#{val[0].strip}</tt>", *val[1]

    result
end

#_reduce_48(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1591

def _reduce_48(val, _values, result)
      result = [val[1]].concat(val[2])

    result
end

#_reduce_49(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1597

def _reduce_49(val, _values, result)
      result = [val[1]]

    result
end

#_reduce_5(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1354

def _reduce_5(val, _values, result)
 result = val
    result
end

#_reduce_50(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1603

def _reduce_50(val, _values, result)
      result = val[2]

    result
end

#_reduce_51(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1609

def _reduce_51(val, _values, result)
      result = []

    result
end

#_reduce_52(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1615

def _reduce_52(val, _values, result)
 result.concat val[1]
    result
end

#_reduce_54(val, _values, result)

This method is for internal use only.

reduce 53 omitted

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1622

def _reduce_54(val, _values, result)
 result = val
    result
end

#_reduce_55(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1627

def _reduce_55(val, _values, result)
 result = val
    result
end

#_reduce_57(val, _values, result)

This method is for internal use only.

reduce 56 omitted

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1634

def _reduce_57(val, _values, result)
 result = []
    result
end

#_reduce_6(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1359

def _reduce_6(val, _values, result)
 result = val
    result
end

#_reduce_62(val, _values, result)

This method is for internal use only.

reduce 61 omitted

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1647

def _reduce_62(val, _values, result)
      result = paragraph [val[0]].concat(val[1])

    result
end

#_reduce_63(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1653

def _reduce_63(val, _values, result)
      result = paragraph [val[0]]

    result
end

#_reduce_64(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1659

def _reduce_64(val, _values, result)
      result = paragraph [val[0]].concat(val[1])

    result
end

#_reduce_65(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1665

def _reduce_65(val, _values, result)
      result = paragraph [val[0]]

    result
end

#_reduce_66(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1671

def _reduce_66(val, _values, result)
      result = [val[0]].concat(val[1])

    result
end

#_reduce_67(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1677

def _reduce_67(val, _values, result)
 result.concat val[1]
    result
end

#_reduce_68(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1682

def _reduce_68(val, _values, result)
 result = val[1]
    result
end

#_reduce_69(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1687

def _reduce_69(val, _values, result)
 result = val
    result
end

#_reduce_71(val, _values, result)

This method is for internal use only.

reduce 70 omitted

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1694

def _reduce_71(val, _values, result)
 result = []
    result
end

#_reduce_72(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1699

def _reduce_72(val, _values, result)
 result = []
    result
end

#_reduce_8(val, _values, result)

This method is for internal use only.

reduce 7 omitted

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1366

def _reduce_8(val, _values, result)
 result = val
    result
end

#_reduce_9(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1371

def _reduce_9(val, _values, result)
 result = val
    result
end

#_reduce_none(val, _values, result)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1704

def _reduce_none(val, _values, result)
  val[0]
end

#add_footnote(content)

Adds footnote #content to the document

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1049

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)

Adds label label to the document

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1063

def add_label label
  @labels[label] = true

  label
end

#content(values)

Retrieves the content of values as a single String

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1032

def content values
 values.map { |value| value.content }.join
end

#cut_off(src) (private)

Cuts off excess whitespace in src

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 935

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) (private)

Formats line numbers line_numbers prettily

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1023

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) (private)

Retrieves the content for file from the include_path

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1004

def get_included(file)
  included = []

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

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

  included
end

#if_current_indent_equal(indent) (private)

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

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 917

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

#line_index

Current line number

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 987

def line_index
  @i
end

#next_token

This method is for internal use only.

Returns the next token from the document

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 755

def next_token # :nodoc:
  # preprocessing
  # if it is not in RD part
  # => method
  while @in_part != "rd"
    line = @src[@i]
    @i += 1 # next line

    case line
    # src end
    when false
      return [false, false]
    # RD part begin
    when /^=begin\s*(?:\bRD\b.*)?\s*$/
      if @in_part # if in non-RD part
        @part_content.push(line)
      else
        @in_part = "rd"
        return [:WHITELINE, "=begin\n"] # <= for textblockand
      end
    # non-RD part begin
    when /^=begin\s(\w)/
      part = $1
=begin # not imported to RDoc
      if @in_part # if in non-RD part
        @part_content.push(line)
      else
        @in_part = part if @tree.filter[part] # if filter exists
#  p "BEGIN_PART: #{@in_part}" # DEBUG
      end
=end
      @in_part = part
    # non-RD part end
    when /^=end(?:$|[\s\0\C-d\C-z])/
      if @in_part # if in non-RD part
=begin # not imported to RDoc
#  p "END_PART: #{@in_part}" # DEBUG
        # make Part-in object
        part = RDoc::RD::Part.new(@part_content.join(""), @tree, "r")
        @part_content.clear
        # call filter, part_out is output(Part object)
        part_out = @tree.filter[@in_part].call(part)

        if @tree.filter[@in_part].mode == :rd # if output is RD formatted
          subtree = parse_subtree(part_out.to_a)
        else # if output is target formatted
          basename = Tempfile.create(["rdtmp", ".#{@in_part}"], @tree.tmp_dir) do |tmpfile|
            tmpfile.print(part_out)
            File.basename(tmpfile.path)
          end
          subtree = parse_subtree(["=begin\n", "<<< #{basename}\n", "=end\n"])
        end
        @in_part = nil
        return [:SUBTREE, subtree]
=end
      end
    else
=begin # not imported to RDoc
      if @in_part # if in non-RD part
        @part_content.push(line)
      end
=end
    end
  end

  @current_indent = @indent_stack.join("")
  line = @src[@i]
  case line
  when false
    if_current_indent_equal("") do
      [false, false]
    end
  when /^=end/
    if_current_indent_equal("") do
      @in_part = nil
      [:WHITELINE, "=end"] # MUST CHANGE??
    end
  when /^\s*$/
    @i += 1 # next line
    return [:WHITELINE, ':WHITELINE']
  when /^\#/  # comment line
    @i += 1 # next line
    self.next_token()
  when /^(={1,4})(?!=)\s*(?=\S)/, /^(\{1,2})(?!\)\s*(?=\S)/
    rest = $'                    # '
    rest.strip!
    mark = $1
    if_current_indent_equal("") do
      return [:HEADLINE, [MARK_TO_LEVEL[mark], rest]]
    end
  when /^<<<\s*(\S+)/
    file = $1
    if_current_indent_equal("") do
      suffix = file[-3 .. -1]
      if suffix == ".rd" or suffix == ".rb"
        subtree = parse_subtree(get_included(file))
        [:SUBTREE, subtree]
      else
        [:INCLUDE, file]
      end
    end
  when /^(\s*)\*(\s*)/
    rest = $'                   # '
    newIndent = $2
    if_current_indent_equal($1) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s" + newIndent)
        [:ITEMLISTLINE, rest]
      end
    end
  when /^(\s*)(\(\d+\))(\s*)/
    rest = $'                     # '
    mark = $2
    newIndent = $3
    if_current_indent_equal($1) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s" * mark.size + newIndent)
        [:ENUMLISTLINE, rest]
      end
    end
  when /^(\s*):(\s*)/
    rest = $'                    # '
    newIndent = $2
    if_current_indent_equal($1) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s#{$2}")
        [:DESCLISTLINE, rest]
      end
    end
  when /^(\s*)---(?!-|\s*$)/
    indent = $1
    rest = $'
    /\s*/ === rest
    term = $'
    new_indent = $&
    if_current_indent_equal(indent) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s\s\s" + new_indent)
        [:METHODLISTLINE, term]
      end
    end
  when /^(\s*)/
    if_current_indent_equal($1) do
      [:STRINGLINE, line]
    end
  else
    raise "[BUG] parsing error may occurred."
  end
end

#on_error(et, ev, _values)

Raises a ParseError when invalid formatting is found

Raises:

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 971

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)

Creates a paragraph for value

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 1039

def paragraph value
  content = cut_off(value).join(' ').rstrip
  contents = @inline_parser.parse content

  RDoc::Markup::Paragraph.new(*contents)
end

#parse(src)

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

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 711

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

#parse_subtree(src) (private)

Parses subtree src

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 994

def parse_subtree src
  @subparser ||= RDoc::RD::BlockParser.new

  @subparser.parse src
end

#set_term_to_element(parent, term) (private)

[ GitHub ]

  
# File 'lib/rdoc/rd/block_parser.rb', line 962

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