class RDoc::RD::InlineParser
用于处理内联标记(如强调、链接、脚注等)的 RD
格式解析器。
公共类方法
new(block_parser) 点击切换源代码
为 rd 格式的内联标记创建一个新的解析器。 block_parser
用于内联文本中的脚注和标签。
# File rdoc/rd/inline_parser.rb, line 734 def initialize block_parser @block_parser = block_parser end
公共实例方法
inline(rdoc, reference = rdoc) 点击切换源代码
为 rdoc
标记和原始 reference
创建一个新的 RDoc::RD::Inline
。
# File rdoc/rd/inline_parser.rb, line 883 def inline rdoc, reference = rdoc RDoc::RD::Inline.new rdoc, reference end
next_token() 点击切换源代码
从内联文本中返回下一个 token。
# File rdoc/rd/inline_parser.rb, line 752 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() 点击切换源代码
返回错误之后的单词。
# File rdoc/rd/inline_parser.rb, line 872 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) 点击切换源代码
当发现无效格式时,引发 ParseError。
# File rdoc/rd/inline_parser.rb, line 832 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) 点击切换源代码
prev_words_on_error(ev) 点击切换源代码
返回错误之前的单词。
# File rdoc/rd/inline_parser.rb, line 849 def prev_words_on_error(ev) pre = @pre if ev and /#{Regexp.quote(ev)}$/ =~ pre pre = $` end last_line(pre) end
私有实例方法
last_line(src) 点击切换源代码
返回 src
的最后一行。
# File rdoc/rd/inline_parser.rb, line 860 def last_line(src) if n = src.rindex("\n") src[(n+1) .. -1] else src end end