Class: RDoc::RD::BlockParser

Inherits:
Racc::Parser
  • Object
show all
Defined in:
lib/rdoc/rd/block_parser.rb

Overview

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

Constant Summary collapse

TMPFILE =

:stopdoc:

["rdtmp", $$, 0]
MARK_TO_LEVEL =
{
  '='    => 1,
  '=='   => 2,
  '==='  => 3,
  '====' => 4,
  '+'    => 5,
  '++'   => 6,
}
Racc_arg =
[
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_token_to_s_table =
[
"$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_debug_parser =
false

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBlockParser

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



52
53
54
55
56
57
58
59
# 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

Instance Attribute Details

#footnotesObject (readonly)

Footnotes for this document



36
37
38
# File 'lib/rdoc/rd/block_parser.rb', line 36

def footnotes
  @footnotes
end

#include_pathObject

Path to find included files in



46
47
48
# File 'lib/rdoc/rd/block_parser.rb', line 46

def include_path
  @include_path
end

#labelsObject (readonly)

Labels for items in this document



41
42
43
# File 'lib/rdoc/rd/block_parser.rb', line 41

def labels
  @labels
end

Instance Method Details

#_reduce_1(val, _values, result) ⇒ Object

reduce 0 omitted



679
680
681
682
# File 'lib/rdoc/rd/block_parser.rb', line 679

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

#_reduce_10(val, _values, result) ⇒ Object



721
722
723
724
# File 'lib/rdoc/rd/block_parser.rb', line 721

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

#_reduce_11(val, _values, result) ⇒ Object



726
727
728
729
# File 'lib/rdoc/rd/block_parser.rb', line 726

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

#_reduce_12(val, _values, result) ⇒ Object



731
732
733
734
735
736
737
# File 'lib/rdoc/rd/block_parser.rb', line 731

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) ⇒ Object



739
740
741
742
743
# File 'lib/rdoc/rd/block_parser.rb', line 739

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

    result
end

#_reduce_14(val, _values, result) ⇒ Object



745
746
747
748
749
750
# File 'lib/rdoc/rd/block_parser.rb', line 745

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

    result
end

#_reduce_15(val, _values, result) ⇒ Object



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

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

#_reduce_16(val, _values, result) ⇒ Object



757
758
759
760
# File 'lib/rdoc/rd/block_parser.rb', line 757

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

#_reduce_17(val, _values, result) ⇒ Object



762
763
764
765
766
767
768
769
770
771
# File 'lib/rdoc/rd/block_parser.rb', line 762

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) ⇒ Object



773
774
775
776
777
778
779
780
781
782
# File 'lib/rdoc/rd/block_parser.rb', line 773

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) ⇒ Object



784
785
786
787
788
# File 'lib/rdoc/rd/block_parser.rb', line 784

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

    result
end

#_reduce_2(val, _values, result) ⇒ Object

Raises:

  • (ParseError)


684
685
686
687
# File 'lib/rdoc/rd/block_parser.rb', line 684

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

#_reduce_20(val, _values, result) ⇒ Object



790
791
792
793
794
# File 'lib/rdoc/rd/block_parser.rb', line 790

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

    result
end

#_reduce_21(val, _values, result) ⇒ Object



796
797
798
799
800
# File 'lib/rdoc/rd/block_parser.rb', line 796

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

    result
end

#_reduce_22(val, _values, result) ⇒ Object



802
803
804
805
806
807
808
# File 'lib/rdoc/rd/block_parser.rb', line 802

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

    result
end

#_reduce_27(val, _values, result) ⇒ Object

reduce 26 omitted



818
819
820
821
822
# File 'lib/rdoc/rd/block_parser.rb', line 818

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

    result
end

#_reduce_28(val, _values, result) ⇒ Object



824
825
826
827
828
# File 'lib/rdoc/rd/block_parser.rb', line 824

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

    result
end

#_reduce_29(val, _values, result) ⇒ Object



830
831
832
833
834
# File 'lib/rdoc/rd/block_parser.rb', line 830

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

    result
end

#_reduce_3(val, _values, result) ⇒ Object



689
690
691
692
# File 'lib/rdoc/rd/block_parser.rb', line 689

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

#_reduce_30(val, _values, result) ⇒ Object



836
837
838
839
# File 'lib/rdoc/rd/block_parser.rb', line 836

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

#_reduce_31(val, _values, result) ⇒ Object



841
842
843
844
# File 'lib/rdoc/rd/block_parser.rb', line 841

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

#_reduce_32(val, _values, result) ⇒ Object



846
847
848
849
850
# File 'lib/rdoc/rd/block_parser.rb', line 846

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

    result
end

#_reduce_33(val, _values, result) ⇒ Object



852
853
854
855
# File 'lib/rdoc/rd/block_parser.rb', line 852

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

#_reduce_34(val, _values, result) ⇒ Object



857
858
859
860
# File 'lib/rdoc/rd/block_parser.rb', line 857

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

#_reduce_35(val, _values, result) ⇒ Object



862
863
864
865
866
# File 'lib/rdoc/rd/block_parser.rb', line 862

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

    result
end

#_reduce_36(val, _values, result) ⇒ Object



868
869
870
871
872
# File 'lib/rdoc/rd/block_parser.rb', line 868

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

    result
end

#_reduce_37(val, _values, result) ⇒ Object



874
875
876
877
# File 'lib/rdoc/rd/block_parser.rb', line 874

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

#_reduce_38(val, _values, result) ⇒ Object



879
880
881
882
# File 'lib/rdoc/rd/block_parser.rb', line 879

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

#_reduce_39(val, _values, result) ⇒ Object



884
885
886
887
888
# File 'lib/rdoc/rd/block_parser.rb', line 884

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

    result
end

#_reduce_4(val, _values, result) ⇒ Object



694
695
696
697
# File 'lib/rdoc/rd/block_parser.rb', line 694

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

#_reduce_40(val, _values, result) ⇒ Object



890
891
892
893
894
# File 'lib/rdoc/rd/block_parser.rb', line 890

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

    result
end

#_reduce_41(val, _values, result) ⇒ Object



896
897
898
899
# File 'lib/rdoc/rd/block_parser.rb', line 896

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

#_reduce_42(val, _values, result) ⇒ Object



901
902
903
904
# File 'lib/rdoc/rd/block_parser.rb', line 901

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

#_reduce_43(val, _values, result) ⇒ Object



906
907
908
909
910
911
912
# File 'lib/rdoc/rd/block_parser.rb', line 906

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) ⇒ Object



914
915
916
917
918
# File 'lib/rdoc/rd/block_parser.rb', line 914

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

    result
end

#_reduce_45(val, _values, result) ⇒ Object



920
921
922
923
# File 'lib/rdoc/rd/block_parser.rb', line 920

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

#_reduce_46(val, _values, result) ⇒ Object



925
926
927
928
# File 'lib/rdoc/rd/block_parser.rb', line 925

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

#_reduce_47(val, _values, result) ⇒ Object



930
931
932
933
934
# File 'lib/rdoc/rd/block_parser.rb', line 930

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) ⇒ Object



936
937
938
939
940
# File 'lib/rdoc/rd/block_parser.rb', line 936

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

    result
end

#_reduce_49(val, _values, result) ⇒ Object



942
943
944
945
946
# File 'lib/rdoc/rd/block_parser.rb', line 942

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

    result
end

#_reduce_5(val, _values, result) ⇒ Object



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

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

#_reduce_50(val, _values, result) ⇒ Object



948
949
950
951
952
# File 'lib/rdoc/rd/block_parser.rb', line 948

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

    result
end

#_reduce_51(val, _values, result) ⇒ Object



954
955
956
957
958
# File 'lib/rdoc/rd/block_parser.rb', line 954

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

    result
end

#_reduce_52(val, _values, result) ⇒ Object



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

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

#_reduce_54(val, _values, result) ⇒ Object

reduce 53 omitted



967
968
969
970
# File 'lib/rdoc/rd/block_parser.rb', line 967

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

#_reduce_55(val, _values, result) ⇒ Object



972
973
974
975
# File 'lib/rdoc/rd/block_parser.rb', line 972

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

#_reduce_57(val, _values, result) ⇒ Object

reduce 56 omitted



979
980
981
982
# File 'lib/rdoc/rd/block_parser.rb', line 979

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

#_reduce_6(val, _values, result) ⇒ Object



704
705
706
707
# File 'lib/rdoc/rd/block_parser.rb', line 704

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

#_reduce_62(val, _values, result) ⇒ Object

reduce 61 omitted



992
993
994
995
996
# File 'lib/rdoc/rd/block_parser.rb', line 992

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

    result
end

#_reduce_63(val, _values, result) ⇒ Object



998
999
1000
1001
1002
# File 'lib/rdoc/rd/block_parser.rb', line 998

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

    result
end

#_reduce_64(val, _values, result) ⇒ Object



1004
1005
1006
1007
1008
# File 'lib/rdoc/rd/block_parser.rb', line 1004

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

    result
end

#_reduce_65(val, _values, result) ⇒ Object



1010
1011
1012
1013
1014
# File 'lib/rdoc/rd/block_parser.rb', line 1010

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

    result
end

#_reduce_66(val, _values, result) ⇒ Object



1016
1017
1018
1019
1020
# File 'lib/rdoc/rd/block_parser.rb', line 1016

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

    result
end

#_reduce_67(val, _values, result) ⇒ Object



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

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

#_reduce_68(val, _values, result) ⇒ Object



1027
1028
1029
1030
# File 'lib/rdoc/rd/block_parser.rb', line 1027

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

#_reduce_69(val, _values, result) ⇒ Object



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

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

#_reduce_71(val, _values, result) ⇒ Object

reduce 70 omitted



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

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

#_reduce_72(val, _values, result) ⇒ Object



1044
1045
1046
1047
# File 'lib/rdoc/rd/block_parser.rb', line 1044

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

#_reduce_8(val, _values, result) ⇒ Object

reduce 7 omitted



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

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

#_reduce_9(val, _values, result) ⇒ Object



716
717
718
719
# File 'lib/rdoc/rd/block_parser.rb', line 716

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

#_reduce_none(val, _values, result) ⇒ Object



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

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

#add_footnote(content) ⇒ Object

Adds footnote content to the document



396
397
398
399
400
401
402
403
404
405
# 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) ⇒ Object

Adds label label to the document



410
411
412
413
414
# File 'lib/rdoc/rd/block_parser.rb', line 410

def add_label label
  @labels[label] = true

  label
end

#content(values) ⇒ Object

Retrieves the content of values as a single String



379
380
381
# File 'lib/rdoc/rd/block_parser.rb', line 379

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

#line_indexObject

Current line number



334
335
336
# File 'lib/rdoc/rd/block_parser.rb', line 334

def line_index
  @i
end

#next_tokenObject

Returns the next token from the document



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
# File 'lib/rdoc/rd/block_parser.rb', line 108

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
      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
    # non-RD part end
    when /^=end/
      if @in_part # if in non-RD part
#  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 formated
          subtree = parse_subtree(part_out.to_a)
        else # if output is target formated
          basename = TMPFILE.join('.')
          TMPFILE[-1] += 1
          tmpfile = open(@tree.tmp_dir + "/" + basename + ".#{@in_part}", "w")
          tmpfile.print(part_out)
          tmpfile.close
          subtree = parse_subtree(["=begin\n", "<<< #{basename}\n", "=end\n"])
        end
        @in_part = nil
        return [:SUBTREE, subtree]
      end
    else
      if @in_part # if in non-RD part
        @part_content.push(line)
      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 occured."
  end
end

#on_error(et, ev, _values) ⇒ Object

Raises a ParseError when invalid formatting is found

Raises:

  • (ParseError)


318
319
320
321
322
323
324
325
326
327
328
329
# 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) ⇒ Object

Creates a paragraph for value



386
387
388
389
390
391
# 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) ⇒ Object

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



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# 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