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

MARK_TO_LEVEL =

:stopdoc:

{
  '='    => 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.



51
52
53
54
55
56
57
58
# File 'lib/rdoc/rd/block_parser.rb', line 51

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



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

def footnotes
  @footnotes
end

#include_pathObject

Path to find included files in



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

def include_path
  @include_path
end

#labelsObject (readonly)

Labels for items in this document



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

def labels
  @labels
end

Instance Method Details

#_reduce_1(val, _values, result) ⇒ Object

reduce 0 omitted



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

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

#_reduce_10(val, _values, result) ⇒ Object



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

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

#_reduce_11(val, _values, result) ⇒ Object



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

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

#_reduce_12(val, _values, result) ⇒ Object



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

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



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

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

    result
end

#_reduce_14(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_15(val, _values, result) ⇒ Object



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

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

#_reduce_16(val, _values, result) ⇒ Object



764
765
766
767
# File 'lib/rdoc/rd/block_parser.rb', line 764

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

#_reduce_17(val, _values, result) ⇒ Object



769
770
771
772
773
774
775
776
777
778
# File 'lib/rdoc/rd/block_parser.rb', line 769

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



780
781
782
783
784
785
786
787
788
789
# File 'lib/rdoc/rd/block_parser.rb', line 780

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



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

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

    result
end

#_reduce_2(val, _values, result) ⇒ Object

Raises:

  • (ParseError)


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

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

#_reduce_20(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_21(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_22(val, _values, result) ⇒ Object



809
810
811
812
813
814
815
# File 'lib/rdoc/rd/block_parser.rb', line 809

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



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

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

    result
end

#_reduce_28(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_29(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_3(val, _values, result) ⇒ Object



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

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

#_reduce_30(val, _values, result) ⇒ Object



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

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

#_reduce_31(val, _values, result) ⇒ Object



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

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

#_reduce_32(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_33(val, _values, result) ⇒ Object



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

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

#_reduce_34(val, _values, result) ⇒ Object



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

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

#_reduce_35(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_36(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_37(val, _values, result) ⇒ Object



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

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

#_reduce_38(val, _values, result) ⇒ Object



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

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

#_reduce_39(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_4(val, _values, result) ⇒ Object



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

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

#_reduce_40(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_41(val, _values, result) ⇒ Object



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

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

#_reduce_42(val, _values, result) ⇒ Object



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

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

#_reduce_43(val, _values, result) ⇒ Object



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

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



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

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

    result
end

#_reduce_45(val, _values, result) ⇒ Object



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

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

#_reduce_46(val, _values, result) ⇒ Object



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

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

#_reduce_47(val, _values, result) ⇒ Object



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

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



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

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

    result
end

#_reduce_49(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_5(val, _values, result) ⇒ Object



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

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

#_reduce_50(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_51(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_52(val, _values, result) ⇒ Object



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

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

#_reduce_54(val, _values, result) ⇒ Object

reduce 53 omitted



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

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

#_reduce_55(val, _values, result) ⇒ Object



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

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

#_reduce_57(val, _values, result) ⇒ Object

reduce 56 omitted



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

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

#_reduce_6(val, _values, result) ⇒ Object



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

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

#_reduce_62(val, _values, result) ⇒ Object

reduce 61 omitted



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

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

    result
end

#_reduce_63(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_64(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_65(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_66(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_67(val, _values, result) ⇒ Object



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

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

#_reduce_68(val, _values, result) ⇒ Object



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

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

#_reduce_69(val, _values, result) ⇒ Object



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

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

#_reduce_71(val, _values, result) ⇒ Object

reduce 70 omitted



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

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

#_reduce_72(val, _values, result) ⇒ Object



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

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

#_reduce_8(val, _values, result) ⇒ Object

reduce 7 omitted



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

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

#_reduce_9(val, _values, result) ⇒ Object



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

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

#_reduce_none(val, _values, result) ⇒ Object



1056
1057
1058
# File 'lib/rdoc/rd/block_parser.rb', line 1056

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

#add_footnote(content) ⇒ Object

Adds footnote content to the document



401
402
403
404
405
406
407
408
409
410
# File 'lib/rdoc/rd/block_parser.rb', line 401

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



415
416
417
418
419
# File 'lib/rdoc/rd/block_parser.rb', line 415

def add_label label
  @labels[label] = true

  label
end

#content(values) ⇒ Object

Retrieves the content of values as a single String



384
385
386
# File 'lib/rdoc/rd/block_parser.rb', line 384

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

#line_indexObject

Current line number



339
340
341
# File 'lib/rdoc/rd/block_parser.rb', line 339

def line_index
  @i
end

#next_tokenObject

Returns the next token from the document



107
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
259
260
261
262
263
# File 'lib/rdoc/rd/block_parser.rb', line 107

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

Raises a ParseError when invalid formatting is found

Raises:

  • (ParseError)


323
324
325
326
327
328
329
330
331
332
333
334
# File 'lib/rdoc/rd/block_parser.rb', line 323

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



391
392
393
394
395
396
# File 'lib/rdoc/rd/block_parser.rb', line 391

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.



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

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