class JsRegex::Converter::Context

Passed among Converters to globalize basic status data.

The Converters themselves are stateless.

Attributes

added_capturing_groups_after_group[RW]
capturing_group_count[RW]
case_insensitive_root[RW]
fail_fast[RW]
in_atomic_group[RW]
recursions_per_expression[RW]
required_options_hash[RW]
target[RW]
warnings[RW]

Public Class Methods

new(case_insensitive_root: false, fail_fast: false, target: nil) click to toggle source
# File lib/js_regex/converter/context.rb, line 15
def initialize(case_insensitive_root: false, fail_fast: false, target: nil)
  self.added_capturing_groups_after_group = Hash.new(0)
  self.capturing_group_count = 0
  self.fail_fast = fail_fast
  self.recursions_per_expression = {}
  self.required_options_hash = {}
  self.warnings = []

  self.case_insensitive_root = case_insensitive_root
  self.target = target
end

Public Instance Methods

capture_group() click to toggle source

group context

# File lib/js_regex/converter/context.rb, line 55
def capture_group
  self.capturing_group_count = capturing_group_count + 1
end
count_recursion(exp) click to toggle source
# File lib/js_regex/converter/context.rb, line 76
def count_recursion(exp)
  recursions_per_expression[recursion_id(exp)] = recursions(exp) + 1
end
enable_u_option() click to toggle source

these methods allow appending options to the final Conversion output

# File lib/js_regex/converter/context.rb, line 39
def enable_u_option
  return false unless es_2015_or_higher?

  required_options_hash['u'] = true
end
end_atomic_group() click to toggle source
# File lib/js_regex/converter/context.rb, line 63
def end_atomic_group
  self.in_atomic_group = false
end
es_2015_or_higher?() click to toggle source

target context

# File lib/js_regex/converter/context.rb, line 29
def es_2015_or_higher?
  target >= Target::ES2015
end
es_2018_or_higher?() click to toggle source
# File lib/js_regex/converter/context.rb, line 33
def es_2018_or_higher?
  target >= Target::ES2018
end
increment_local_capturing_group_count() click to toggle source
# File lib/js_regex/converter/context.rb, line 67
def increment_local_capturing_group_count
  added_capturing_groups_after_group[original_capturing_group_count] += 1
  capture_group
end
new_capturing_group_position(old_position) click to toggle source

takes and returns 1-indexed group positions. new is different from old if capturing groups were added in between.

# File lib/js_regex/converter/context.rb, line 86
def new_capturing_group_position(old_position)
  increment = 0
  added_capturing_groups_after_group.each do |after_n_groups, count|
    increment += count if after_n_groups < old_position
  end
  old_position + increment
end
original_capturing_group_count() click to toggle source
# File lib/js_regex/converter/context.rb, line 94
def original_capturing_group_count
  capturing_group_count - total_added_capturing_groups
end
recursion_id(exp) click to toggle source
# File lib/js_regex/converter/context.rb, line 80
def recursion_id(exp)
  [exp.class, exp.starts_at]
end
recursions(exp) click to toggle source
# File lib/js_regex/converter/context.rb, line 72
def recursions(exp)
  recursions_per_expression[recursion_id(exp)] || 0
end
required_options() click to toggle source
# File lib/js_regex/converter/context.rb, line 49
def required_options
  required_options_hash.keys
end
start_atomic_group() click to toggle source
# File lib/js_regex/converter/context.rb, line 59
def start_atomic_group
  self.in_atomic_group = true
end
u?() click to toggle source
# File lib/js_regex/converter/context.rb, line 45
def u?
  required_options_hash['u']
end

Private Instance Methods

total_added_capturing_groups() click to toggle source
# File lib/js_regex/converter/context.rb, line 111
def total_added_capturing_groups
  added_capturing_groups_after_group.values.inject(0, &:+)
end