class RbJSON5::EscapeSequence

@api private Utility class to unescape the given escape sequence

Constants

ESCAPE_CHARACTERS

list of charactors needing escape

Public Class Methods

new(sequence, valid_patterns = [], &ifinvalid) click to toggle source

@param sequence [Parslet::Slice]

escape sequence

@param valid_patterns [Array<Regexp>]

list of patterns for valid unescaped character

@yield [character, sequence]

call back block called when unespaced character is not matched
with the given valid_patterns

@yieldparam character [String]

character unescaped from the given escape sequence

@yieldparam sequence [Parslet::Slice]

the given escape sequence
# File lib/rb_json5/escape_sequence.rb, line 18
def initialize(sequence, valid_patterns = [], &ifinvalid)
  @character = unescape(sequence.to_s)
  validate(@character, sequence, valid_patterns, ifinvalid)
end

Public Instance Methods

to_s() click to toggle source

returns the character unescaped from the given escape sequence

@return [String]

unescaped character
# File lib/rb_json5/escape_sequence.rb, line 27
def to_s
  @character
end

Private Instance Methods

unescape(sequence) click to toggle source
# File lib/rb_json5/escape_sequence.rb, line 40
def unescape(sequence)
  if ['x', 'u'].include?(sequence[1])
    instance_eval("\"#{sequence}\"", __FILE__, __LINE__)
  else
    ESCAPE_CHARACTERS[sequence[1]] || sequence[1]
  end
end
valid_character?(character, valid_patterns) click to toggle source
# File lib/rb_json5/escape_sequence.rb, line 53
def valid_character?(character, valid_patterns)
  valid_patterns.empty? ||
    valid_patterns.any? { |pattern| pattern.match?(character) }
end
validate(character, sequence, valid_patterns, ifinvalid) click to toggle source
# File lib/rb_json5/escape_sequence.rb, line 48
def validate(character, sequence, valid_patterns, ifinvalid)
  valid_character?(character, valid_patterns) ||
    ifinvalid&.call(character, sequence)
end