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.



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

Instance Attribute Details

#footnotesObject (readonly)

Footnotes for this document



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

def footnotes
  @footnotes
end

#include_pathObject

Path to find included files in



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

def include_path
  @include_path
end

#labelsObject (readonly)

Labels for items in this document



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

def labels
  @labels
end

Instance Method Details

#_reduce_1(val, _values, result) ⇒ Object

reduce 0 omitted



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

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

#_reduce_10(val, _values, result) ⇒ Object



724
725
726
727
# File 'lib/rdoc/rd/block_parser.rb', line 724

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

#_reduce_11(val, _values, result) ⇒ Object



729
730
731
732
# File 'lib/rdoc/rd/block_parser.rb', line 729

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

#_reduce_12(val, _values, result) ⇒ Object



734
735
736
737
738
739
740
# File 'lib/rdoc/rd/block_parser.rb', line 734

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



742
743
744
745
746
# File 'lib/rdoc/rd/block_parser.rb', line 742

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

    result
end

#_reduce_14(val, _values, result) ⇒ Object



748
749
750
751
752
753
# File 'lib/rdoc/rd/block_parser.rb', line 748

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

    result
end

#_reduce_15(val, _values, result) ⇒ Object



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

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

#_reduce_16(val, _values, result) ⇒ Object



760
761
762
763
# File 'lib/rdoc/rd/block_parser.rb', line 760

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

#_reduce_17(val, _values, result) ⇒ Object



765
766
767
768
769
770
771
772
773
774
# File 'lib/rdoc/rd/block_parser.rb', line 765

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



776
777
778
779
780
781
782
783
784
785
# File 'lib/rdoc/rd/block_parser.rb', line 776

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



787
788
789
790
791
# File 'lib/rdoc/rd/block_parser.rb', line 787

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

    result
end

#_reduce_2(val, _values, result) ⇒ Object

Raises:

  • (ParseError)


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

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

#_reduce_20(val, _values, result) ⇒ Object



793
794
795
796
797
# File 'lib/rdoc/rd/block_parser.rb', line 793

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

    result
end

#_reduce_21(val, _values, result) ⇒ Object



799
800
801
802
803
# File 'lib/rdoc/rd/block_parser.rb', line 799

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

    result
end

#_reduce_22(val, _values, result) ⇒ Object



805
806
807
808
809
810
811
# File 'lib/rdoc/rd/block_parser.rb', line 805

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



821
822
823
824
825
# File 'lib/rdoc/rd/block_parser.rb', line 821

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

    result
end

#_reduce_28(val, _values, result) ⇒ Object



827
828
829
830
831
# File 'lib/rdoc/rd/block_parser.rb', line 827

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

    result
end

#_reduce_29(val, _values, result) ⇒ Object



833
834
835
836
837
# File 'lib/rdoc/rd/block_parser.rb', line 833

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

    result
end

#_reduce_3(val, _values, result) ⇒ Object



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

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

#_reduce_30(val, _values, result) ⇒ Object



839
840
841
842
# File 'lib/rdoc/rd/block_parser.rb', line 839

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

#_reduce_31(val, _values, result) ⇒ Object



844
845
846
847
# File 'lib/rdoc/rd/block_parser.rb', line 844

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

#_reduce_32(val, _values, result) ⇒ Object



849
850
851
852
853
# File 'lib/rdoc/rd/block_parser.rb', line 849

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

    result
end

#_reduce_33(val, _values, result) ⇒ Object



855
856
857
858
# File 'lib/rdoc/rd/block_parser.rb', line 855

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

#_reduce_34(val, _values, result) ⇒ Object



860
861
862
863
# File 'lib/rdoc/rd/block_parser.rb', line 860

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

#_reduce_35(val, _values, result) ⇒ Object



865
866
867
868
869
# File 'lib/rdoc/rd/block_parser.rb', line 865

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

    result
end

#_reduce_36(val, _values, result) ⇒ Object



871
872
873
874
875
# File 'lib/rdoc/rd/block_parser.rb', line 871

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

    result
end

#_reduce_37(val, _values, result) ⇒ Object



877
878
879
880
# File 'lib/rdoc/rd/block_parser.rb', line 877

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

#_reduce_38(val, _values, result) ⇒ Object



882
883
884
885
# File 'lib/rdoc/rd/block_parser.rb', line 882

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

#_reduce_39(val, _values, result) ⇒ Object



887
888
889
890
891
# File 'lib/rdoc/rd/block_parser.rb', line 887

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

    result
end

#_reduce_4(val, _values, result) ⇒ Object



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

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

#_reduce_40(val, _values, result) ⇒ Object



893
894
895
896
897
# File 'lib/rdoc/rd/block_parser.rb', line 893

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

    result
end

#_reduce_41(val, _values, result) ⇒ Object



899
900
901
902
# File 'lib/rdoc/rd/block_parser.rb', line 899

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

#_reduce_42(val, _values, result) ⇒ Object



904
905
906
907
# File 'lib/rdoc/rd/block_parser.rb', line 904

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

#_reduce_43(val, _values, result) ⇒ Object



909
910
911
912
913
914
915
# File 'lib/rdoc/rd/block_parser.rb', line 909

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



917
918
919
920
921
# File 'lib/rdoc/rd/block_parser.rb', line 917

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

    result
end

#_reduce_45(val, _values, result) ⇒ Object



923
924
925
926
# File 'lib/rdoc/rd/block_parser.rb', line 923

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

#_reduce_46(val, _values, result) ⇒ Object



928
929
930
931
# File 'lib/rdoc/rd/block_parser.rb', line 928

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

#_reduce_47(val, _values, result) ⇒ Object



933
934
935
936
937
# File 'lib/rdoc/rd/block_parser.rb', line 933

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



939
940
941
942
943
# File 'lib/rdoc/rd/block_parser.rb', line 939

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

    result
end

#_reduce_49(val, _values, result) ⇒ Object



945
946
947
948
949
# File 'lib/rdoc/rd/block_parser.rb', line 945

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

    result
end

#_reduce_5(val, _values, result) ⇒ Object



702
703
704
705
# File 'lib/rdoc/rd/block_parser.rb', line 702

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

#_reduce_50(val, _values, result) ⇒ Object



951
952
953
954
955
# File 'lib/rdoc/rd/block_parser.rb', line 951

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

    result
end

#_reduce_51(val, _values, result) ⇒ Object



957
958
959
960
961
# File 'lib/rdoc/rd/block_parser.rb', line 957

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

    result
end

#_reduce_52(val, _values, result) ⇒ Object



963
964
965
966
# File 'lib/rdoc/rd/block_parser.rb', line 963

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

#_reduce_54(val, _values, result) ⇒ Object

reduce 53 omitted



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

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

#_reduce_55(val, _values, result) ⇒ Object



975
976
977
978
# File 'lib/rdoc/rd/block_parser.rb', line 975

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

#_reduce_57(val, _values, result) ⇒ Object

reduce 56 omitted



982
983
984
985
# File 'lib/rdoc/rd/block_parser.rb', line 982

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

#_reduce_6(val, _values, result) ⇒ Object



707
708
709
710
# File 'lib/rdoc/rd/block_parser.rb', line 707

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

#_reduce_62(val, _values, result) ⇒ Object

reduce 61 omitted



995
996
997
998
999
# File 'lib/rdoc/rd/block_parser.rb', line 995

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

    result
end

#_reduce_63(val, _values, result) ⇒ Object



1001
1002
1003
1004
1005
# File 'lib/rdoc/rd/block_parser.rb', line 1001

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

    result
end

#_reduce_64(val, _values, result) ⇒ Object



1007
1008
1009
1010
1011
# File 'lib/rdoc/rd/block_parser.rb', line 1007

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

    result
end

#_reduce_65(val, _values, result) ⇒ Object



1013
1014
1015
1016
1017
# File 'lib/rdoc/rd/block_parser.rb', line 1013

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

    result
end

#_reduce_66(val, _values, result) ⇒ Object



1019
1020
1021
1022
1023
# File 'lib/rdoc/rd/block_parser.rb', line 1019

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

    result
end

#_reduce_67(val, _values, result) ⇒ Object



1025
1026
1027
1028
# File 'lib/rdoc/rd/block_parser.rb', line 1025

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

#_reduce_68(val, _values, result) ⇒ Object



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

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

#_reduce_69(val, _values, result) ⇒ Object



1035
1036
1037
1038
# File 'lib/rdoc/rd/block_parser.rb', line 1035

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

#_reduce_71(val, _values, result) ⇒ Object

reduce 70 omitted



1042
1043
1044
1045
# File 'lib/rdoc/rd/block_parser.rb', line 1042

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

#_reduce_72(val, _values, result) ⇒ Object



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

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

#_reduce_8(val, _values, result) ⇒ Object

reduce 7 omitted



714
715
716
717
# File 'lib/rdoc/rd/block_parser.rb', line 714

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

#_reduce_9(val, _values, result) ⇒ Object



719
720
721
722
# File 'lib/rdoc/rd/block_parser.rb', line 719

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

#_reduce_none(val, _values, result) ⇒ Object



1052
1053
1054
# File 'lib/rdoc/rd/block_parser.rb', line 1052

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

#add_footnote(content) ⇒ Object

Adds footnote content to the document



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

Adds label label to the document



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

def add_label label
  @labels[label] = true

  label
end

#content(values) ⇒ Object

Retrieves the content of values as a single String



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

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

#line_indexObject

Current line number



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

def line_index
  @i
end

#next_tokenObject

Returns the next token from the document



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
259
# File 'lib/rdoc/rd/block_parser.rb', line 109

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 formatted
          subtree = parse_subtree(part_out.to_a)
        else # if output is target formatted
          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 occurred."
  end
end

#on_error(et, ev, _values) ⇒ Object

Raises a ParseError when invalid formatting is found

Raises:

  • (ParseError)


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

Creates a paragraph for value



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

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



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
104
# 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