class JsRegex::Converter::GroupConverter

Template class implementation.

Private Instance Methods

build_absence_group() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 76
def build_absence_group
  head = "(?:(?:.|\\n){,#{expression.inner_match_length.min - 1}}|(?:(?!"
  tail = ')(?:.|\n))*)'
  build_group(head: head, tail: tail, capturing: false)
end
build_absence_group_if_simple() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 58
def build_absence_group_if_simple
  if unmatchable_absence_group?
    unmatchable_substitution
  elsif expression.inner_match_length.fixed?
    build_absence_group
  else
    warn_of_unsupported_feature('variable-length absence group content')
  end
end
build_group(opts = {}) click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 82
def build_group(opts = {})
  head = opts[:head] || '('
  tail = opts[:tail] || ')'
  return Node.new(*wrap(head, tail)) if opts[:capturing].equal?(false)

  context.capture_group
  ref = expression.number
  Node.new(*wrap(head, tail), reference: ref, type: :captured_group)
end
build_named_group() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 24
def build_named_group
  if context.es_2018_or_higher?
    # ES 2018+ supports named groups, but only the angled-bracket syntax
    build_group(head: "(?<#{expression.name}>")
  else
    build_group
  end
end
build_options_group() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 45
def build_options_group
  if subtype.equal?(:options_switch)
    # can be ignored since #options on subsequent Expressions are correct
    drop_without_warning
  else
    build_passive_group
  end
end
build_passive_group() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 54
def build_passive_group
  build_group(head: '(?:', capturing: false)
end
convert_data() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 11
def convert_data
  case subtype
  when :capture then build_group
  when :named then build_named_group
  when :atomic then emulate_atomic_group
  when :comment then drop_without_warning
  when :options, :options_switch then build_options_group
  when :passive then build_passive_group
  when :absence then build_absence_group_if_simple
  else warn_of_unsupported_feature
  end
end
emulate_atomic_group() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 33
def emulate_atomic_group
  if context.in_atomic_group
    warn_of_unsupported_feature('nested atomic group')
    build_passive_group
  else
    context.start_atomic_group
    result = wrap_in_backrefed_lookahead(convert_subexpressions)
    context.end_atomic_group
    result
  end
end
unmatchable_absence_group?() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 68
def unmatchable_absence_group?
  expression.empty?
end
unmatchable_substitution() click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 72
def unmatchable_substitution
  '(?!)'
end
wrap(head, tail) click to toggle source
# File lib/js_regex/converter/group_converter.rb, line 92
def wrap(head, tail)
  [head, convert_subexpressions, tail]
end