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



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

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

#_reduce_10(val, _values, result) ⇒ Object



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

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

#_reduce_11(val, _values, result) ⇒ Object



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

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

#_reduce_12(val, _values, result) ⇒ Object



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

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



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

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

    result
end

#_reduce_14(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_15(val, _values, result) ⇒ Object



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

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

#_reduce_16(val, _values, result) ⇒ Object



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

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

#_reduce_17(val, _values, result) ⇒ Object



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

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



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

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



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

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

    result
end

#_reduce_2(val, _values, result) ⇒ Object

Raises:

  • (ParseError)


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

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

#_reduce_20(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_21(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_22(val, _values, result) ⇒ Object



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

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



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

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

    result
end

#_reduce_28(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_29(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_3(val, _values, result) ⇒ Object



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

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

#_reduce_30(val, _values, result) ⇒ Object



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

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

#_reduce_31(val, _values, result) ⇒ Object



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

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

#_reduce_32(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_33(val, _values, result) ⇒ Object



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

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

#_reduce_34(val, _values, result) ⇒ Object



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

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

#_reduce_35(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_36(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_37(val, _values, result) ⇒ Object



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

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

#_reduce_38(val, _values, result) ⇒ Object



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

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

#_reduce_39(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_4(val, _values, result) ⇒ Object



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

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

#_reduce_40(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_41(val, _values, result) ⇒ Object



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

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

#_reduce_42(val, _values, result) ⇒ Object



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

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

#_reduce_43(val, _values, result) ⇒ Object



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

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



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

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

    result
end

#_reduce_45(val, _values, result) ⇒ Object



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

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

#_reduce_46(val, _values, result) ⇒ Object



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

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

#_reduce_47(val, _values, result) ⇒ Object



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

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



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

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

    result
end

#_reduce_49(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_5(val, _values, result) ⇒ Object



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

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

#_reduce_50(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_51(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_52(val, _values, result) ⇒ Object



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

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

#_reduce_54(val, _values, result) ⇒ Object

reduce 53 omitted



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

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

#_reduce_55(val, _values, result) ⇒ Object



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

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

#_reduce_57(val, _values, result) ⇒ Object

reduce 56 omitted



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

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

#_reduce_6(val, _values, result) ⇒ Object



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

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

#_reduce_62(val, _values, result) ⇒ Object

reduce 61 omitted



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

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

    result
end

#_reduce_63(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_64(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_65(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_66(val, _values, result) ⇒ Object



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

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

    result
end

#_reduce_67(val, _values, result) ⇒ Object



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

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

#_reduce_68(val, _values, result) ⇒ Object



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

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

#_reduce_69(val, _values, result) ⇒ Object



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

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

#_reduce_71(val, _values, result) ⇒ Object

reduce 70 omitted



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

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

#_reduce_72(val, _values, result) ⇒ Object



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

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

#_reduce_8(val, _values, result) ⇒ Object

reduce 7 omitted



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

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

#_reduce_9(val, _values, result) ⇒ Object



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

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

#_reduce_none(val, _values, result) ⇒ Object



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

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 occured."
  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