class RDoc::RD::BlockParser
RD
format parser for headings, paragraphs, lists, verbatim sections that exist as blocks.
Attributes
Footnotes for this document
Path to find included files in
Labels for items in this document
Public Class Methods
Creates a new RDoc::RD::BlockParser
. Use parse
to parse an rd-format document.
# File rdoc/rd/block_parser.rb, line 695 def initialize @inline_parser = RDoc::RD::InlineParser.new self @include_path = [] # for testing @footnotes = [] @labels = {} end
Public Instance Methods
Adds footnote content
to the document
# File rdoc/rd/block_parser.rb, line 1045 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
Adds label label
to the document
# File rdoc/rd/block_parser.rb, line 1059 def add_label label @labels[label] = true label end
Retrieves the content of values
as a single String
# File rdoc/rd/block_parser.rb, line 1028 def content values values.map { |value| value.content }.join end
Current line number
# File rdoc/rd/block_parser.rb, line 983 def line_index @i end
Raises a ParseError when invalid formatting is found
# File rdoc/rd/block_parser.rb, line 967 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
Creates a paragraph for value
# File rdoc/rd/block_parser.rb, line 1035 def paragraph value content = cut_off(value).join(' ').rstrip contents = @inline_parser.parse content RDoc::Markup::Paragraph.new(*contents) end
Parses src
and returns an RDoc::Markup::Document
.
# File rdoc/rd/block_parser.rb, line 707 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
Private Instance Methods
Cuts off excess whitespace in src
# File rdoc/rd/block_parser.rb, line 931 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
Formats line numbers line_numbers
prettily
# File rdoc/rd/block_parser.rb, line 1019 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
Retrieves the content for file
from the include_path
# File rdoc/rd/block_parser.rb, line 1000 def get_included(file) included = [] @include_path.each do |dir| file_name = File.join dir, file if File.exist? file_name then included = File.readlines file_name break end end included end
Yields to the given block if indent
matches the current indent, otherwise an indentation token is processed.
# File rdoc/rd/block_parser.rb, line 913 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
Parses subtree src
# File rdoc/rd/block_parser.rb, line 990 def parse_subtree src @subparser ||= RDoc::RD::BlockParser.new @subparser.parse src end
# File rdoc/rd/block_parser.rb, line 958 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