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
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
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
pos()
click to toggle source
# File lib/sass/util/multibyte_string_scanner.rb, line 56 def pos; @mb_pos; end
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