Class: Sass::Util::MultibyteStringScanner

Inherits:
StringScanner
  • Object
show all
Defined in:
lib/sass/util/multibyte_string_scanner.rb,
lib/sass/util/multibyte_string_scanner.rb,
lib/sass/util/multibyte_string_scanner.rb

Overview

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.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(str) ⇒ MultibyteStringScanner

Returns a new instance of MultibyteStringScanner.



14
15
16
17
18
19
# 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

Class Method Details

.new(str)



41
42
43
44
# File 'lib/sass/util/multibyte_string_scanner.rb', line 41

def self.new(str)
  return StringScanner.new(str) if str.ascii_only?
  super
end

Instance Method Details

#byte_matched_size



47
# File 'lib/sass/util/multibyte_string_scanner.rb', line 47

alias_method :byte_matched_size, :matched_size

#byte_pos



46
# File 'lib/sass/util/multibyte_string_scanner.rb', line 46

alias_method :byte_pos, :pos

#check(pattern)



49
# File 'lib/sass/util/multibyte_string_scanner.rb', line 49

def check(pattern); _match super; end

#check_until(pattern)



50
# File 'lib/sass/util/multibyte_string_scanner.rb', line 50

def check_until(pattern); _matched super; end

#get_byte



64
65
66
# File 'lib/sass/util/multibyte_string_scanner.rb', line 64

def get_byte
  raise "MultibyteStringScanner doesn't support #get_byte."
end

#getbyte



68
69
70
# File 'lib/sass/util/multibyte_string_scanner.rb', line 68

def getbyte
  raise "MultibyteStringScanner doesn't support #getbyte."
end

#getch



51
# File 'lib/sass/util/multibyte_string_scanner.rb', line 51

def getch; _forward _match super; end

#is_a?(klass) ⇒ Boolean

Returns:

  • (Boolean)


21
22
23
# File 'lib/sass/util/multibyte_string_scanner.rb', line 21

def is_a?(klass)
  __getobj__.is_a?(klass) || super
end

#match?(pattern) ⇒ Boolean

Returns:

  • (Boolean)


52
# File 'lib/sass/util/multibyte_string_scanner.rb', line 52

def match?(pattern); _size check(pattern); end

#matched_size



53
# File 'lib/sass/util/multibyte_string_scanner.rb', line 53

def matched_size; @mb_matched_size; end

#peek(len) Also known as: peep



54
# File 'lib/sass/util/multibyte_string_scanner.rb', line 54

def peek(len); string[@mb_pos, len]; end

#pos Also known as: pointer



56
# File 'lib/sass/util/multibyte_string_scanner.rb', line 56

def pos; @mb_pos; end

#pos=(n)



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 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



95
96
97
98
99
100
# 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



58
# File 'lib/sass/util/multibyte_string_scanner.rb', line 58

def rest_size; rest.size; end

#scan(pattern)



59
# 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)



102
103
104
105
106
# 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)



60
# 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)



108
109
110
111
112
# 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)



61
# File 'lib/sass/util/multibyte_string_scanner.rb', line 61

def skip(pattern); _size scan(pattern); end

#skip_until(pattern)



62
# File 'lib/sass/util/multibyte_string_scanner.rb', line 62

def skip_until(pattern); _matched _size scan_until(pattern); end

#string=(str)



114
115
116
117
118
119
# 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 Also known as: clear



121
122
123
124
125
126
# 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

#unscan



129
130
131
132
133
# 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