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 699 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 1049 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 1063 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 1032 def content values values.map { |value| value.content }.join end
Current line number
# File rdoc/rd/block_parser.rb, line 987 def line_index @i end
Raises a ParseError when invalid formatting is found
# File rdoc/rd/block_parser.rb, line 971 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 1039 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 711 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 935 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 1023 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 1004 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 917 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 994 def parse_subtree src @subparser ||= RDoc::RD::BlockParser.new @subparser.parse src end
# File rdoc/rd/block_parser.rb, line 962 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