class RDoc::RD::InlineParser
RD format parser for inline markup such as emphasis, links, footnotes, etc.
Public Class Methods
new(block_parser)
click to toggle source
Creates a new parser for inline markup in the rd format. The
block_parser
is used to for footnotes and labels in the inline
text.
# File lib/rdoc/rd/inline_parser.rb, line 89 def initialize block_parser @block_parser = block_parser end
Public Instance Methods
inline(rdoc, reference = rdoc)
click to toggle source
Creates a new RDoc::RD::Inline for the
rdoc
markup and the raw reference
# File lib/rdoc/rd/inline_parser.rb, line 238 def inline rdoc, reference = rdoc RDoc::RD::Inline.new rdoc, reference end
next_token()
click to toggle source
Returns the next token from the inline text
# File lib/rdoc/rd/inline_parser.rb, line 107 def next_token return [false, false] if @src.eos? # p @src.rest if @yydebug if ret = @src.scan(EM_OPEN_RE) @pre << ret [:EM_OPEN, ret] elsif ret = @src.scan(EM_CLOSE_RE) @pre << ret [:EM_CLOSE, ret] elsif ret = @src.scan(CODE_OPEN_RE) @pre << ret [:CODE_OPEN, ret] elsif ret = @src.scan(CODE_CLOSE_RE) @pre << ret [:CODE_CLOSE, ret] elsif ret = @src.scan(VAR_OPEN_RE) @pre << ret [:VAR_OPEN, ret] elsif ret = @src.scan(VAR_CLOSE_RE) @pre << ret [:VAR_CLOSE, ret] elsif ret = @src.scan(KBD_OPEN_RE) @pre << ret [:KBD_OPEN, ret] elsif ret = @src.scan(KBD_CLOSE_RE) @pre << ret [:KBD_CLOSE, ret] elsif ret = @src.scan(INDEX_OPEN_RE) @pre << ret [:INDEX_OPEN, ret] elsif ret = @src.scan(INDEX_CLOSE_RE) @pre << ret [:INDEX_CLOSE, ret] elsif ret = @src.scan(REF_OPEN_RE) @pre << ret [:REF_OPEN, ret] elsif ret = @src.scan(REF_CLOSE_RE) @pre << ret [:REF_CLOSE, ret] elsif ret = @src.scan(FOOTNOTE_OPEN_RE) @pre << ret [:FOOTNOTE_OPEN, ret] elsif ret = @src.scan(FOOTNOTE_CLOSE_RE) @pre << ret [:FOOTNOTE_CLOSE, ret] elsif ret = @src.scan(VERB_OPEN_RE) @pre << ret [:VERB_OPEN, ret] elsif ret = @src.scan(VERB_CLOSE_RE) @pre << ret [:VERB_CLOSE, ret] elsif ret = @src.scan(BAR_RE) @pre << ret [:BAR, ret] elsif ret = @src.scan(QUOTE_RE) @pre << ret [:QUOTE, ret] elsif ret = @src.scan(SLASH_RE) @pre << ret [:SLASH, ret] elsif ret = @src.scan(BACK_SLASH_RE) @pre << ret [:BACK_SLASH, ret] elsif ret = @src.scan(URL_RE) @pre << ret [:URL, ret] elsif ret = @src.scan(OTHER_RE) @pre << ret [:OTHER, ret] else ret = @src.rest @pre << ret @src.terminate [:OTHER, ret] end end
next_words_on_error()
click to toggle source
Returns words following an error
# File lib/rdoc/rd/inline_parser.rb, line 227 def next_words_on_error if n = @src.rest.index("\n") @src.rest[0 .. (n-1)] else @src.rest end end
on_error(et, ev, values)
click to toggle source
Raises a ParseError when invalid formatting is found
# File lib/rdoc/rd/inline_parser.rb, line 187 def on_error(et, ev, values) lines_of_rest = @src.rest.lines.to_a.length prev_words = prev_words_on_error(ev) at = 4 + prev_words.length message = <<-MSG RD syntax error: line #{@block_parser.line_index - lines_of_rest}: ...#{prev_words} #{(ev||'')} #{next_words_on_error()} ... MSG message << " " * at + "^" * (ev ? ev.length : 0) + "\n" raise ParseError, message end
parse(inline)
click to toggle source
Parses the inline
text from RD format
into RDoc format.
# File lib/rdoc/rd/inline_parser.rb, line 96 def parse inline @inline = inline @src = StringScanner.new inline @pre = "" @yydebug = true do_parse.to_s end
prev_words_on_error(ev)
click to toggle source
Returns words before the error
# File lib/rdoc/rd/inline_parser.rb, line 204 def prev_words_on_error(ev) pre = @pre if ev and /#{Regexp.quote(ev)}$/ =~ pre pre = $` end last_line(pre) end
Private Instance Methods
last_line(src)
click to toggle source
Returns the last line of src
# File lib/rdoc/rd/inline_parser.rb, line 215 def last_line(src) if n = src.rindex("\n") src[(n+1) .. -1] else src end end