class JsRegex::Converter::LiteralConverter

Template class implementation.

Constants

ASTRAL_PLANE_CODEPOINT_PATTERN
ESCAPES
HAS_CASE_PATTERN
LITERAL_REQUIRING_ESCAPE_PATTERN

Public Class Methods

convert_astral_data(data) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 25
def convert_astral_data(data)
  data.each_char.each_with_object(Node.new) do |char, node|
    if char.ord > 0xFFFF
      node << surrogate_substitution_for(char)
    else
      node << escape_incompatible_bmp_literals(char)
    end
  end
end
convert_data(data, context) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 13
def convert_data(data, context)
  if !context.u? && data =~ ASTRAL_PLANE_CODEPOINT_PATTERN
    if context.enable_u_option
      escape_incompatible_bmp_literals(data)
    else
      convert_astral_data(data)
    end
  else
    escape_incompatible_bmp_literals(data)
  end
end
escape_incompatible_bmp_literals(data) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 39
def escape_incompatible_bmp_literals(data)
  data.gsub(LITERAL_REQUIRING_ESCAPE_PATTERN, ESCAPES)
end

Private Class Methods

surrogate_substitution_for(char) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 45
def surrogate_substitution_for(char)
  CharacterSet::Writer.write_surrogate_ranges([], [char.codepoints])
end

Private Instance Methods

case_insensitivize(literal) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 68
def case_insensitivize(literal)
  literal.each_char.each_with_object(Node.new) do |chr, node|
    node << (chr =~ HAS_CASE_PATTERN ? "[#{chr}#{chr.swapcase}]" : chr)
  end
end
convert_data() click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 52
def convert_data
  result = self.class.convert_data(data, context)
  if context.case_insensitive_root && !expression.case_insensitive?
    warn_of_unsupported_feature('nested case-sensitive literal')
  elsif !context.case_insensitive_root && expression.case_insensitive?
    return handle_locally_case_insensitive_literal(result)
  end
  result
end
handle_locally_case_insensitive_literal(literal) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 64
def handle_locally_case_insensitive_literal(literal)
  literal =~ HAS_CASE_PATTERN ? case_insensitivize(literal) : literal
end