1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
# regular string scanner works with bytes
# this one works with chars and provides #scan_next
class Converter
class CharStringScanner
extend Forwardable
def initialize(*args)
@s = StringScanner.new(*args)
end
def_delegators :@s, :scan_until, :skip_until, :string
# advance scanner to pos after the next match of pattern and return the match
def scan_next(pattern)
return unless @s.scan_until(pattern)
@s.matched
end
def pos
byte_to_str_pos @s.pos
end
def pos=(i)
@s.pos = str_to_byte_pos i
i
end
private
def byte_to_str_pos(pos)
@s.string.byteslice(0, pos).length
end
def str_to_byte_pos(pos)
@s.string.slice(0, pos).bytesize
end
end
end
|