Class: Sass::Util::MultibyteStringScanner

Inherits:
StringScanner
  • Object
show all
Defined in:
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.



16
17
18
19
20
21
# File 'lib/sass/util/multibyte_string_scanner.rb', line 16

def initialize(str)
  super
  @mb_pos = 0
  @mb_matched_size = nil
  @mb_last_pos = nil
end

Class Method Details

.new(str)



11
12
13
14
# File 'lib/sass/util/multibyte_string_scanner.rb', line 11

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

Instance Method Details

#byte_matched_size



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

alias_method :byte_matched_size, :matched_size

#byte_pos



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

alias_method :byte_pos, :pos

#check(pattern)



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

def check(pattern); _match super; end

#check_until(pattern)



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

def check_until(pattern); _matched super; end

#get_byte



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

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

#getbyte



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

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

#getch



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

def getch; _forward _match super; end

#match?(pattern) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#matched_size



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

def matched_size; @mb_matched_size; end

#peek(len) Also known as: peep



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

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

#pos Also known as: pointer



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

def pos; @mb_pos; end

#pos=(n)



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/sass/util/multibyte_string_scanner.rb', line 49

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



72
73
74
75
76
77
# File 'lib/sass/util/multibyte_string_scanner.rb', line 72

def reset
  @mb_pos = 0
  @mb_matched_size = nil
  @mb_last_pos = nil
  super
end

#rest_size



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

def rest_size; rest.size; end

#scan(pattern)



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

def scan(pattern); _forward _match super; end

#scan_full(pattern, advance_pointer_p, return_string_p)



79
80
81
82
83
# File 'lib/sass/util/multibyte_string_scanner.rb', line 79

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)



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

def scan_until(pattern); _forward _matched super; end

#search_full(pattern, advance_pointer_p, return_string_p)



85
86
87
88
89
# File 'lib/sass/util/multibyte_string_scanner.rb', line 85

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)



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

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

#skip_until(pattern)



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

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

#string=(str)



91
92
93
94
95
96
# File 'lib/sass/util/multibyte_string_scanner.rb', line 91

def string=(str)
  @mb_pos = 0
  @mb_matched_size = nil
  @mb_last_pos = nil
  super
end

#terminate Also known as: clear



98
99
100
101
102
103
# File 'lib/sass/util/multibyte_string_scanner.rb', line 98

def terminate
  @mb_pos = string.size
  @mb_matched_size = nil
  @mb_last_pos = nil
  super
end

#unscan



106
107
108
109
110
# File 'lib/sass/util/multibyte_string_scanner.rb', line 106

def unscan
  super
  @mb_pos = @mb_last_pos
  @mb_last_pos = @mb_matched_size = nil
end