# 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