Sha256: 41226f8a3fa97422a198c2c794b921b120f88488ffa44e92d32d5c17631830ed

Contents?: true

Size: 1.19 KB

Versions: 2

Compression:

Stored size: 1.19 KB

Contents

module Hobo::Dryml::Parser
  
  # A REXML source that keeps track of where in the buffer it is
  class Source < REXML::Source
    
    def initialize(src)
      super(src)
      @buffer_offset = 0
    end

    attr_reader :last_match_offset

    def remember_match(m)
      if m
        @last_match = m
        @last_match_offset = @buffer_offset + m.begin(0)
        @orig[@last_match_offset..@last_match_offset+m[0].length] == @buffer[m.begin(0)..m.end(0)]
      end
      m
    end

    def advance_buffer(md)
      @buffer = md.post_match
      @buffer_offset += md.end(0)
    end

    def scan(pattern, cons=false)
      raise '!'
      return nil if @buffer.nil?
      rv = @buffer.scan(pattern)
      if cons and rv.size > 0
        advance_buffer(Regexp.last_match)
      end
      rv
    end

    def consume(pattern)
      md = remember_match(pattern.match(@buffer))
      if md
        advance_buffer(md)
        @buffer
      end
    end

    def match(pattern, cons=false)
      md = remember_match(pattern.match(@buffer))
      advance_buffer(md) if cons and md
      return md
    end

    def current_line
      pos = last_match_offset || 0
      [0, 0, @orig[0..pos].count("\n") + 1] 
    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
hobo-0.7.4 hobo_files/plugin/lib/hobo/dryml/parser/source.rb
hobo-0.7.5 hobo_files/plugin/lib/hobo/dryml/parser/source.rb