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 14
def initialize(str)
  super(StringScanner.new(str))
  @mb_pos = 0
  @mb_matched_size = nil
  @mb_last_pos = nil
end
new(str) click to toggle source
Calls superclass method
# File lib/sass/util/multibyte_string_scanner.rb, line 41
def self.new(str)
  return StringScanner.new(str) if str.ascii_only?
  super
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 49
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 50
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 64
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 68
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 51
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 21
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 52
def match?(pattern); _size check(pattern); end
matched_size() click to toggle source
# File lib/sass/util/multibyte_string_scanner.rb, line 53
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 54
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 56
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 72
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 95
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 58
def rest_size; rest.size; end
scan(pattern) click to toggle source
Calls superclass method
# File lib/sass/util/multibyte_string_scanner.rb, line 59
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 102
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 60
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 108
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 61
def skip(pattern); _size scan(pattern); end
skip_until(pattern) click to toggle source
# File lib/sass/util/multibyte_string_scanner.rb, line 62
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 114
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 121
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 129
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 151
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 141
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 146
def _matched(res)
  _match matched
  res
end
_size(str) click to toggle source
# File lib/sass/util/multibyte_string_scanner.rb, line 137
def _size(str)
  str && str.size
end