class JsRegex::Converter::LiteralConverter

Template class implementation.

Constants

ASTRAL_PLANE_CODEPOINT_PATTERN
HAS_CASE_PATTERN

Public Class Methods

convert_astral_data(data) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 20
def convert_astral_data(data)
  data.each_char.each_with_object(Node.new) do |char, node|
    if char =~ ASTRAL_PLANE_CODEPOINT_PATTERN
      node << surrogate_substitution_for(char)
    else
      node << escape_incompatible_bmp_literals(char)
    end
  end
end
convert_data(data) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 12
def convert_data(data)
  if data =~ ASTRAL_PLANE_CODEPOINT_PATTERN
    convert_astral_data(data)
  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 30
def escape_incompatible_bmp_literals(data)
  data.gsub('/', '\\/').gsub(/[\f\n\r\t]/) { |lit| Regexp.escape(lit) }
end

Private Class Methods

surrogate_substitution_for(char) click to toggle source
# File lib/js_regex/converter/literal_converter.rb, line 36
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 59
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 43
def convert_data
  result = self.class.convert_data(data)
  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 55
def handle_locally_case_insensitive_literal(literal)
  literal =~ HAS_CASE_PATTERN ? case_insensitivize(literal) : literal
end