Class: RDoc::RD::BlockParser
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
Racc::Parser
|
|
Instance Chain:
self,
Racc::Parser
|
|
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 22{ '=' => 1, '==' => 2, '===' => 3, '====' => 4, '+' => 5, '++' => 6, }
-
Racc_arg =
Internal use only
# File 'lib/rdoc/rd/block_parser.rb', line 607[ 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 673false
-
Racc_token_to_s_table =
Internal use only
# File 'lib/rdoc/rd/block_parser.rb', line 623[ "$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" ]
-
TMPFILE =
Internal use only
# File 'lib/rdoc/rd/block_parser.rb', line 20["rdtmp", $$, 0]
Class Method Summary
-
.new ⇒ BlockParser
constructor
Creates a new
BlockParser
.
Instance Attribute Summary
-
#footnotes
readonly
Footnotes for this document.
-
#include_path
rw
Path to find included files in.
-
#labels
readonly
Labels for items in this document.
Instance Method Summary
-
#add_footnote(content)
Adds footnote #content to the document.
-
#add_label(label)
Adds label
label
to the document. -
#content(values)
Retrieves the content of
values
as a single String. -
#line_index
Current line number.
-
#on_error(et, ev, _values)
Raises a ParseError when invalid formatting is found.
-
#paragraph(value)
Creates a paragraph for
value
-
#parse(src)
Parses
src
and returns an ::RDoc::Markup::Document. -
#cut_off(src)
private
Cuts off excess whitespace in
src
-
#format_line_num(*line_numbers)
private
Formats line numbers
line_numbers
prettily. -
#get_included(file)
private
Retrieves the content for
file
from the include_path. -
#if_current_indent_equal(indent)
private
Yields to the given block if
indent
matches the current indent, otherwise an indentation token is processed. -
#parse_subtree(src)
private
Parses subtree
src
- #set_term_to_element(parent, term) private
-
#_reduce_1(val, _values, result)
Internal use only
reduce 0 omitted.
- #_reduce_10(val, _values, result) Internal use only
- #_reduce_11(val, _values, result) Internal use only
- #_reduce_12(val, _values, result) Internal use only
- #_reduce_13(val, _values, result) Internal use only
- #_reduce_14(val, _values, result) Internal use only
- #_reduce_15(val, _values, result) Internal use only
- #_reduce_16(val, _values, result) Internal use only
- #_reduce_17(val, _values, result) Internal use only
- #_reduce_18(val, _values, result) Internal use only
- #_reduce_19(val, _values, result) Internal use only
- #_reduce_2(val, _values, result) Internal use only
- #_reduce_20(val, _values, result) Internal use only
- #_reduce_21(val, _values, result) Internal use only
- #_reduce_22(val, _values, result) Internal use only
-
#_reduce_27(val, _values, result)
Internal use only
reduce 26 omitted.
- #_reduce_28(val, _values, result) Internal use only
- #_reduce_29(val, _values, result) Internal use only
- #_reduce_3(val, _values, result) Internal use only
- #_reduce_30(val, _values, result) Internal use only
- #_reduce_31(val, _values, result) Internal use only
- #_reduce_32(val, _values, result) Internal use only
- #_reduce_33(val, _values, result) Internal use only
- #_reduce_34(val, _values, result) Internal use only
- #_reduce_35(val, _values, result) Internal use only
- #_reduce_36(val, _values, result) Internal use only
- #_reduce_37(val, _values, result) Internal use only
- #_reduce_38(val, _values, result) Internal use only
- #_reduce_39(val, _values, result) Internal use only
- #_reduce_4(val, _values, result) Internal use only
- #_reduce_40(val, _values, result) Internal use only
- #_reduce_41(val, _values, result) Internal use only
- #_reduce_42(val, _values, result) Internal use only
- #_reduce_43(val, _values, result) Internal use only
- #_reduce_44(val, _values, result) Internal use only
- #_reduce_45(val, _values, result) Internal use only
- #_reduce_46(val, _values, result) Internal use only
- #_reduce_47(val, _values, result) Internal use only
- #_reduce_48(val, _values, result) Internal use only
- #_reduce_49(val, _values, result) Internal use only
- #_reduce_5(val, _values, result) Internal use only
- #_reduce_50(val, _values, result) Internal use only
- #_reduce_51(val, _values, result) Internal use only
- #_reduce_52(val, _values, result) Internal use only
-
#_reduce_54(val, _values, result)
Internal use only
reduce 53 omitted.
- #_reduce_55(val, _values, result) Internal use only
-
#_reduce_57(val, _values, result)
Internal use only
reduce 56 omitted.
- #_reduce_6(val, _values, result) Internal use only
-
#_reduce_62(val, _values, result)
Internal use only
reduce 61 omitted.
- #_reduce_63(val, _values, result) Internal use only
- #_reduce_64(val, _values, result) Internal use only
- #_reduce_65(val, _values, result) Internal use only
- #_reduce_66(val, _values, result) Internal use only
- #_reduce_67(val, _values, result) Internal use only
- #_reduce_68(val, _values, result) Internal use only
- #_reduce_69(val, _values, result) Internal use only
-
#_reduce_71(val, _values, result)
Internal use only
reduce 70 omitted.
- #_reduce_72(val, _values, result) Internal use only
-
#_reduce_8(val, _values, result)
Internal use only
reduce 7 omitted.
- #_reduce_9(val, _values, result) Internal use only
- #_reduce_none(val, _values, result) Internal use only
-
#next_token
Internal use only
Returns the next token from the document.
Constructor Details
.new ⇒ BlockParser
Creates a new BlockParser
. Use #parse to parse an rd-format document.
# 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
#footnotes (readonly)
Footnotes for this document
# File 'lib/rdoc/rd/block_parser.rb', line 36
attr_reader :footnotes
#include_path (rw)
Path to find included files in
# File 'lib/rdoc/rd/block_parser.rb', line 46
attr_accessor :include_path
#labels (readonly)
Labels for items in this document
# File 'lib/rdoc/rd/block_parser.rb', line 41
attr_reader :labels
Instance Method Details
#_reduce_1(val, _values, result)
reduce 0 omitted
#_reduce_10(val, _values, result)
#_reduce_11(val, _values, result)
# 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)
#_reduce_13(val, _values, result)
#_reduce_14(val, _values, result)
# 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)
# 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)
# 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)
#_reduce_18(val, _values, result)
#_reduce_19(val, _values, result)
# 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)
# 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)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 796
def _reduce_21(val, _values, result) result << "\n" result end
#_reduce_22(val, _values, result)
# 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)
reduce 26 omitted
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
#_reduce_33(val, _values, result)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 857
def _reduce_34(val, _values, result) result = val result end
#_reduce_35(val, _values, result)
#_reduce_36(val, _values, result)
#_reduce_37(val, _values, result)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 879
def _reduce_38(val, _values, result) result = val result end
#_reduce_39(val, _values, result)
#_reduce_4(val, _values, result)
# 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)
#_reduce_41(val, _values, result)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 901
def _reduce_42(val, _values, result) result = val result end
#_reduce_43(val, _values, result)
#_reduce_44(val, _values, result)
#_reduce_45(val, _values, result)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 925
def _reduce_46(val, _values, result) result = val result end
#_reduce_47(val, _values, result)
#_reduce_48(val, _values, result)
# 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)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 699
def _reduce_5(val, _values, result) result = val result end
#_reduce_50(val, _values, result)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 954
def _reduce_51(val, _values, result) result = [] result end
#_reduce_52(val, _values, result)
# 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)
reduce 53 omitted
# File 'lib/rdoc/rd/block_parser.rb', line 967
def _reduce_54(val, _values, result) result = val result end
#_reduce_55(val, _values, result)
# File 'lib/rdoc/rd/block_parser.rb', line 972
def _reduce_55(val, _values, result) result = val result end
#_reduce_57(val, _values, result)
reduce 56 omitted
# File 'lib/rdoc/rd/block_parser.rb', line 979
def _reduce_57(val, _values, result) result = [] result end
#_reduce_6(val, _values, result)
# File 'lib/rdoc/rd/block_parser.rb', line 704
def _reduce_6(val, _values, result) result = val result end
#_reduce_62(val, _values, result)
reduce 61 omitted
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# File 'lib/rdoc/rd/block_parser.rb', line 1032
def _reduce_69(val, _values, result) result = val result end
#_reduce_71(val, _values, result)
reduce 70 omitted
# File 'lib/rdoc/rd/block_parser.rb', line 1039
def _reduce_71(val, _values, result) result = [] result end
#_reduce_72(val, _values, result)
# File 'lib/rdoc/rd/block_parser.rb', line 1044
def _reduce_72(val, _values, result) result = [] result end
#_reduce_8(val, _values, result)
reduce 7 omitted
# File 'lib/rdoc/rd/block_parser.rb', line 711
def _reduce_8(val, _values, result) result = val result end
#_reduce_9(val, _values, result)
# File 'lib/rdoc/rd/block_parser.rb', line 716
def _reduce_9(val, _values, result) result = val result end
#_reduce_none(val, _values, result)
# File 'lib/rdoc/rd/block_parser.rb', line 1049
def _reduce_none(val, _values, result) val[0] end
#add_footnote(content)
Adds footnote #content to the document
# 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)
Adds label label
to the document
# File 'lib/rdoc/rd/block_parser.rb', line 410
def add_label label @labels[label] = true label end
#content(values)
Retrieves the content of values
as a single String
# File 'lib/rdoc/rd/block_parser.rb', line 379
def content values values.map { |value| value.content }.join end
#cut_off(src) (private)
Cuts off excess whitespace in src
# File 'lib/rdoc/rd/block_parser.rb', line 282
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
# File 'lib/rdoc/rd/block_parser.rb', line 370
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
# File 'lib/rdoc/rd/block_parser.rb', line 351
def get_included(file) included = [] @include_path.each do |dir| file_name = File.join dir, file if File.exist? file_name then included = IO.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.
# File 'lib/rdoc/rd/block_parser.rb', line 264
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
# File 'lib/rdoc/rd/block_parser.rb', line 334
def line_index @i end
#next_token
Returns the next token from the document
# 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 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)
Raises a ParseError when invalid formatting is found
# 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)
Creates a paragraph for value
#parse(src)
Parses src
and returns an ::RDoc::Markup::Document.
# 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
#parse_subtree(src) (private)
Parses subtree src
#set_term_to_element(parent, term) (private)
[ GitHub ]# File 'lib/rdoc/rd/block_parser.rb', line 309
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