class JsRegex::Converter::MetaConverter
Template class implementation.
Constants
- DOT_EXPANSION
- ML_DOT_EXPANSION
Private Instance Methods
Source
# File lib/js_regex/converter/meta_converter.rb, line 35 def convert_alternatives kept_any_previous_branch = nil convert_subexpressions.transform do |node| unless dropped_branch?(node) node.children.unshift('|') if kept_any_previous_branch kept_any_previous_branch = true end node end end
Source
# File lib/js_regex/converter/meta_converter.rb, line 24 def convert_data case subtype when :alternation convert_alternatives when :dot expression.multiline? ? ML_DOT_EXPANSION : DOT_EXPANSION else warn_of_unsupported_feature end end
Possible improvements for dot conversion:
In ES2015, the ‘u’ flag allows dots to match astral chars. Unfortunately the dot keeps matching lone surrogates even with this flag, so the use of an expansion is still necessary to get the same behavior as in Ruby.
ES2018 has the dotall flag ‘s’, but it is tricky to use in conversions. ‘s’ activates matching of BOTH astral chars and “n”, whereas the dot in Ruby doesn’t match “n” by default, and even with the ‘m’ flag set on the root, subexps might still exclude “n” like so: /.(?-m:.)./m
Source
# File lib/js_regex/converter/meta_converter.rb, line 47 def dropped_branch?(branch_node) branch_node.children.any? && branch_node.children.all?(&:dropped?) end