# class Sass::Util::MultibyteStringScanner

A wrapper of the native StringScanner class that works correctly with multibyte character encodings. The native class deals only in bytes, not characters, for methods like [#pos] and [#matched_size]. This class deals only in characters, instead.

### Public Class Methods

new(str) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 36
    def self.new(str)
      return StringScanner.new(str) if str.ascii_only?
      super
    end

new(str) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 9
    def initialize(str)
      super(StringScanner.new(str))
      @mb_pos = 0
      @mb_matched_size = nil
      @mb_last_pos = nil
    end

### Public Instance Methods

byte_matched_size()
Alias for: matched_size
byte_pos()
Alias for: pos
check(pattern) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 44
    def check(pattern); _match super; end

check_until(pattern) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 45
    def check_until(pattern); _matched super; end

clear()
Alias for: terminate
get_byte() click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 59
    def get_byte
      raise "MultibyteStringScanner doesn't support #get_byte."
    end

getbyte() click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 63
    def getbyte
      raise "MultibyteStringScanner doesn't support #getbyte."
    end

getch() click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 46
    def getch; _forward _match super; end

is_a?(klass) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 16
    def is_a?(klass)
      __getobj__.is_a?(klass) || super
    end

match?(pattern) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 47
    def match?(pattern); _size check(pattern); end

matched_size() click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 48
    def matched_size; @mb_matched_size; end

Also aliased as: byte_matched_size
peek(len) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 49
    def peek(len); string[@mb_pos, len]; end

Also aliased as: peep
peep(len)
Alias for: peek
pointer()
Alias for: pos
pos() click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 51
    def pos; @mb_pos; end

Also aliased as: byte_pos, pointer
pos=(n) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 67
    def pos=(n)
      @mb_last_pos = nil

      # We set position kind of a lot during parsing, so we want it to be as
      # efficient as possible. This is complicated by the fact that UTF-8 is a
      # variable-length encoding, so it's difficult to find the byte length that
      # corresponds to a given character length.
      #
      # Our heuristic here is to try to count the fewest possible characters. So
      # if the new position is close to the current one, just count the
      # characters between the two; if the new position is closer to the
      # beginning of the string, just count the characters from there.
      if @mb_pos - n < @mb_pos / 2
        # New position is close to old position
        byte_delta = @mb_pos > n ? -string[n...@mb_pos].bytesize : string[@mb_pos...n].bytesize
        super(byte_pos + byte_delta)
      else
        # New position is close to BOS
        super(string[0...n].bytesize)
      end
      @mb_pos = n
    end

reset() click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 90
    def reset
      @mb_pos = 0
      @mb_matched_size = nil
      @mb_last_pos = nil
      super
    end

rest_size() click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 53
    def rest_size; rest.size; end

scan(pattern) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 54
    def scan(pattern); _forward _match super; end

scan_full(pattern, advance_pointer_p, return_string_p) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 97
    def scan_full(pattern, advance_pointer_p, return_string_p)
      res = _match super(pattern, advance_pointer_p, true)
      _forward res if advance_pointer_p
      return res if return_string_p
    end

scan_until(pattern) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 55
    def scan_until(pattern); _forward _matched super; end

search_full(pattern, advance_pointer_p, return_string_p) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 103
    def search_full(pattern, advance_pointer_p, return_string_p)
      res = super(pattern, advance_pointer_p, true)
      _forward res if advance_pointer_p
      _matched((res if return_string_p))
    end

skip(pattern) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 56
    def skip(pattern); _size scan(pattern); end

skip_until(pattern) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 57
    def skip_until(pattern); _matched _size scan_until(pattern); end

string=(str) click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 109
    def string=(str)
      @mb_pos = 0
      @mb_matched_size = nil
      @mb_last_pos = nil
      super
    end

terminate() click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 116
    def terminate
      @mb_pos = string.size
      @mb_matched_size = nil
      @mb_last_pos = nil
      super
    end

Also aliased as: clear
unscan() click to toggle source
Calls superclass method

    # File lib/sass/util/multibyte_string_scanner.rb, line 124
    def unscan
      super
      @mb_pos = @mb_last_pos
      @mb_last_pos = @mb_matched_size = nil
    end

### Private Instance Methods

_forward(str) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 146
    def _forward(str)
      @mb_last_pos = @mb_pos
      @mb_pos += str.size if str
      str
    end

_match(str) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 136
    def _match(str)
      @mb_matched_size = str && str.size
      str
    end

_matched(res) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 141
    def _matched(res)
      _match matched
      res
    end

_size(str) click to toggle source

    # File lib/sass/util/multibyte_string_scanner.rb, line 132
    def _size(str)
      str && str.size
    end