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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
require_relative 'base'
require_relative 'literal_converter'
class JsRegex
module Converter
#
# Template class implementation.
#
class EscapeConverter < JsRegex::Converter::Base
ESCAPES_SHARED_BY_RUBY_AND_JS = %i[
alternation
backslash
backspace
bol
carriage
codepoint
dot
eol
form_feed
group_close
group_open
hex
interval_close
interval_open
newline
one_or_more
set_close
set_open
tab
vertical_tab
zero_or_more
zero_or_one
].freeze
private
def convert_data
case subtype
when :codepoint_list
convert_codepoint_list
when :control, :meta_sequence
unicode_escape_codepoint
when :literal
LiteralConverter.convert_data(expression.char, context)
when *ESCAPES_SHARED_BY_RUBY_AND_JS
pass_through
when :bell, :escape, :octal
hex_escape_codepoint
else
warn_of_unsupported_feature
end
end
def convert_codepoint_list
if context.enable_u_option
split_codepoint_list
else
expression.chars.each_with_object(Node.new) do |char, node|
node << LiteralConverter.convert_data(Regexp.escape(char), context)
end
end
end
def split_codepoint_list
expression.codepoints.map { |cp| "\\u{#{cp.to_s(16).upcase}}" }.join
end
def unicode_escape_codepoint
"\\u#{expression.codepoint.to_s(16).upcase.rjust(4, '0')}"
end
def hex_escape_codepoint
"\\x#{expression.codepoint.to_s(16).upcase.rjust(2, '0')}"
end
end
end
end
|