js_regex 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2abae347b737c7635396c45a3a1489c72d6957e5
4
- data.tar.gz: 5b674eaf6902686ab94648000308090fa154783c
3
+ metadata.gz: f0d3967319afceb3aaf95fbb0b107f4c2facf675
4
+ data.tar.gz: 40ade866a8c49d767f9006fc9db8a3a52b43732a
5
5
  SHA512:
6
- metadata.gz: 3406867e15cb70cbc0a9f137f2449fce1af94fb448bcdbee3cfa6e439f64c92d4df9a5407fee251ea127a59faf8f6cbf81d55b38279d79e1a6de24e5b1c6673a
7
- data.tar.gz: d0e63535e25eb8adb3e8d95859a884ce0eaec81ba25f1da8970213f4572fd558b9cbb7e3b25dc59d261213a9a0d7f9e0e7bb29b4f14cffba5fa9df49b0ec4780
6
+ metadata.gz: 4e8c66d97c6564e4c72f75f38e28ac6dfbdeddd03d7906c7ce81b497b064b0ef65b17c6452c8ac1d23393f56dcfef5c4102c48838fe9601d26e6552620483b44
7
+ data.tar.gz: 35e0bea37b8d7f1142f216c1168ec449dfaf8cb8fd0718edc2198eaa15cd132e0bce99bb20943c43b5ab4ab676f287ec5f3427eae2457f070ed1d48ab5e64846
@@ -24,8 +24,7 @@ class JsRegex
24
24
  end
25
25
 
26
26
  def convert_number_ref
27
- # after regexp_parser update, replace data[/\d+/] with expression.number
28
- "\\#{context.new_capturing_group_position(Integer(data[/\d+/]))}"
27
+ "\\#{context.new_capturing_group_position(Integer(expression.number))}"
29
28
  end
30
29
 
31
30
  def convert_number_rel_ref
@@ -10,10 +10,10 @@ class JsRegex
10
10
  class Context
11
11
  attr_reader :buffered_set_extractions,
12
12
  :buffered_set_members,
13
+ :case_insensitive_root,
13
14
  :in_atomic_group,
14
15
  :named_group_positions,
15
16
  :negative_base_set,
16
- :root_options,
17
17
  :warnings
18
18
 
19
19
  def initialize(ruby_regex)
@@ -22,14 +22,8 @@ class JsRegex
22
22
  self.named_group_positions = {}
23
23
  self.warnings = []
24
24
 
25
- self.root_options = {}
26
- root_options[:m] = !(ruby_regex.options & Regexp::MULTILINE).equal?(0)
27
- end
28
-
29
- # option context
30
-
31
- def multiline?
32
- root_options.fetch(:m)
25
+ self.case_insensitive_root =
26
+ !(ruby_regex.options & Regexp::IGNORECASE).equal?(0)
33
27
  end
34
28
 
35
29
  # set context
@@ -96,10 +90,10 @@ class JsRegex
96
90
 
97
91
  attr_writer :buffered_set_extractions,
98
92
  :buffered_set_members,
93
+ :case_insensitive_root,
99
94
  :in_atomic_group,
100
95
  :named_group_positions,
101
96
  :negative_base_set,
102
- :root_options,
103
97
  :warnings
104
98
  end
105
99
  end
@@ -41,8 +41,12 @@ class JsRegex
41
41
  end
42
42
 
43
43
  def build_options_group
44
- warn_of_unsupported_feature('group-specific options')
45
- build_group(head: '(')
44
+ unless (encoding_options = data.scan(/[adu]/)).empty?
45
+ warn_of_unsupported_feature("encoding options #{encoding_options}")
46
+ end
47
+ # TODO: replace this check in Regexp::Parser v1
48
+ switch_only = !data.include?(':')
49
+ switch_only ? drop_without_warning : build_group(head: '(')
46
50
  end
47
51
 
48
52
  def build_passive_group
@@ -43,7 +43,20 @@ class JsRegex
43
43
  private
44
44
 
45
45
  def convert_data
46
- self.class.convert_data(data)
46
+ result = self.class.convert_data(data)
47
+ if context.case_insensitive_root && !expression.case_insensitive?
48
+ warn_of_unsupported_feature('nested case-sensitive literal')
49
+ elsif !context.case_insensitive_root && expression.case_insensitive?
50
+ return handle_locally_case_insensitive_literal(result)
51
+ end
52
+ result
53
+ end
54
+
55
+ HAS_CASE_PATTERN = /[\p{lower}\p{upper}]/
56
+
57
+ def handle_locally_case_insensitive_literal(literal)
58
+ return literal unless literal =~ HAS_CASE_PATTERN
59
+ "[#{literal}#{literal.swapcase}]"
47
60
  end
48
61
  end
49
62
  end
@@ -15,7 +15,7 @@ class JsRegex
15
15
  when :alternation
16
16
  convert_alternation
17
17
  when :dot
18
- context.multiline? ? '(?:.|\n)' : '.'
18
+ expression.multiline? ? '(?:.|\n)' : '.'
19
19
  else
20
20
  warn_of_unsupported_feature
21
21
  end
@@ -52,8 +52,7 @@ class JsRegex
52
52
  when PROPERTY_PATTERN
53
53
  handle_property($1, $2, $3)
54
54
  else
55
- literal_conversion = LiteralConverter.convert_data(utf8_data)
56
- buffer_set_member(literal_conversion)
55
+ handle_literal(utf8_data)
57
56
  end
58
57
  end
59
58
 
@@ -85,6 +84,31 @@ class JsRegex
85
84
  end
86
85
  end
87
86
 
87
+ def handle_literal(utf8_data)
88
+ conversion = LiteralConverter.convert_data(utf8_data)
89
+ if context.case_insensitive_root && !expression.case_insensitive?
90
+ warn_of_unsupported_feature('nested case-sensitive set member')
91
+ elsif !context.case_insensitive_root && expression.case_insensitive?
92
+ return handle_locally_case_insensitive_literal(conversion)
93
+ end
94
+ buffer_set_member(conversion)
95
+ end
96
+
97
+ DESCENDING_CASE_RANGE_PATTERN = /\p{upper}-\p{lower}/
98
+
99
+ def handle_locally_case_insensitive_literal(literal)
100
+ buffer_set_member(
101
+ if literal =~ DESCENDING_CASE_RANGE_PATTERN
102
+ warn_of_unsupported_feature(
103
+ 'nested case-insensitive range going from upper to lower case'
104
+ )
105
+ literal
106
+ else
107
+ [literal, literal.swapcase].uniq
108
+ end
109
+ )
110
+ end
111
+
88
112
  def standardize_property_name(name)
89
113
  Regexp::Parser.parse("\\p{#{name}}").expressions.first.token
90
114
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class JsRegex
4
- VERSION = '2.0.0'
4
+ VERSION = '2.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js_regex
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janosch Müller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-25 00:00:00.000000000 Z
11
+ date: 2017-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: regexp_parser
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.4.6
19
+ version: 0.4.7
20
20
  - - "<="
21
21
  - !ruby/object:Gem::Version
22
22
  version: 0.5.0
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.4.6
29
+ version: 0.4.7
30
30
  - - "<="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 0.5.0