character_set 1.1.1 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +3 -0
- data/.github/workflows/lint.yml +29 -0
- data/.github/workflows/tests.yml +22 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +11 -0
- data/BENCHMARK.md +53 -17
- data/CHANGELOG.md +47 -0
- data/README.md +38 -14
- data/Rakefile +60 -36
- data/benchmarks/count_in.rb +13 -0
- data/benchmarks/delete_in.rb +1 -1
- data/benchmarks/scan.rb +13 -0
- data/benchmarks/shared.rb +5 -0
- data/benchmarks/z_add.rb +12 -0
- data/benchmarks/z_delete.rb +12 -0
- data/benchmarks/z_merge.rb +15 -0
- data/benchmarks/z_minmax.rb +12 -0
- data/bin/console +2 -0
- data/character_set.gemspec +17 -6
- data/ext/character_set/character_set.c +963 -414
- data/ext/character_set/unicode_casefold_table.h +10 -2
- data/ext/character_set/unicode_casefold_table.h.tmpl +11 -0
- data/lib/character_set/character.rb +1 -1
- data/lib/character_set/core_ext/regexp_ext.rb +1 -1
- data/lib/character_set/core_ext/string_ext.rb +3 -1
- data/lib/character_set/expression_converter.rb +25 -27
- data/lib/character_set/parser.rb +1 -1
- data/lib/character_set/predefined_sets.rb +25 -260
- data/lib/character_set/predefined_sets/any.cps +1 -0
- data/lib/character_set/predefined_sets/ascii.cps +1 -0
- data/lib/character_set/predefined_sets/ascii_alnum.cps +3 -0
- data/lib/character_set/predefined_sets/ascii_letter.cps +2 -0
- data/lib/character_set/predefined_sets/assigned.cps +666 -0
- data/lib/character_set/predefined_sets/bmp.cps +2 -0
- data/lib/character_set/predefined_sets/crypt.cps +2 -0
- data/lib/character_set/predefined_sets/emoji.cps +151 -0
- data/lib/character_set/predefined_sets/newline.cps +3 -0
- data/lib/character_set/predefined_sets/surrogate.cps +1 -0
- data/lib/character_set/predefined_sets/unicode.cps +2 -0
- data/lib/character_set/predefined_sets/url_fragment.cps +8 -0
- data/lib/character_set/predefined_sets/url_host.cps +10 -0
- data/lib/character_set/predefined_sets/url_path.cps +7 -0
- data/lib/character_set/predefined_sets/url_query.cps +8 -0
- data/lib/character_set/predefined_sets/whitespace.cps +10 -0
- data/lib/character_set/ruby_fallback.rb +5 -3
- data/lib/character_set/ruby_fallback/character_set_methods.rb +53 -6
- data/lib/character_set/ruby_fallback/set_methods.rb +25 -17
- data/lib/character_set/shared_methods.rb +60 -49
- data/lib/character_set/version.rb +1 -1
- data/lib/character_set/writer.rb +98 -27
- metadata +88 -22
- data/.travis.yml +0 -11
- data/lib/character_set/ruby_fallback/plane_methods.rb +0 -27
@@ -1,11 +1,12 @@
|
|
1
|
-
// THIS FILE IS GENERATED BY $ rake sync_casefold_data - DO NOT EDIT
|
1
|
+
// THIS FILE IS GENERATED BY $ rake sync_casefold_data - DO NOT EDIT
|
2
|
+
// -*-C-*-
|
2
3
|
|
3
4
|
typedef struct casefold_mapping {
|
4
5
|
unsigned long from;
|
5
6
|
unsigned long to;
|
6
7
|
} casefold_mapping;
|
7
8
|
|
8
|
-
#define CASEFOLD_COUNT
|
9
|
+
#define CASEFOLD_COUNT 1383
|
9
10
|
|
10
11
|
static const casefold_mapping unicode_casefold_table[CASEFOLD_COUNT] = {
|
11
12
|
{0x0041,0x0061},
|
@@ -1278,6 +1279,13 @@ static const casefold_mapping unicode_casefold_table[CASEFOLD_COUNT] = {
|
|
1278
1279
|
{0xA7B4,0xA7B5},
|
1279
1280
|
{0xA7B6,0xA7B7},
|
1280
1281
|
{0xA7B8,0xA7B9},
|
1282
|
+
{0xA7BA,0xA7BB},
|
1283
|
+
{0xA7BC,0xA7BD},
|
1284
|
+
{0xA7BE,0xA7BF},
|
1285
|
+
{0xA7C2,0xA7C3},
|
1286
|
+
{0xA7C4,0xA794},
|
1287
|
+
{0xA7C5,0x0282},
|
1288
|
+
{0xA7C6,0x1D8E},
|
1281
1289
|
{0xAB70,0x13A0},
|
1282
1290
|
{0xAB71,0x13A1},
|
1283
1291
|
{0xAB72,0x13A2},
|
@@ -0,0 +1,11 @@
|
|
1
|
+
// THIS FILE IS GENERATED BY $ rake sync_casefold_data - DO NOT EDIT
|
2
|
+
// -*-C-*-
|
3
|
+
|
4
|
+
typedef struct casefold_mapping {
|
5
|
+
unsigned long from;
|
6
|
+
unsigned long to;
|
7
|
+
} casefold_mapping;
|
8
|
+
|
9
|
+
#define CASEFOLD_COUNT 0
|
10
|
+
|
11
|
+
static const casefold_mapping unicode_casefold_table[CASEFOLD_COUNT] = {};
|
@@ -6,11 +6,13 @@ class CharacterSet
|
|
6
6
|
end
|
7
7
|
|
8
8
|
{
|
9
|
+
count_by_character_set: :count_in,
|
9
10
|
covered_by_character_set?: :cover?,
|
10
11
|
delete_character_set: :delete_in,
|
11
12
|
delete_character_set!: :delete_in!,
|
12
13
|
keep_character_set: :keep_in,
|
13
14
|
keep_character_set!: :keep_in!,
|
15
|
+
scan_by_character_set: :scan,
|
14
16
|
uses_character_set?: :used_by?,
|
15
17
|
}.each do |string_method, set_method|
|
16
18
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
@@ -27,4 +29,4 @@ class CharacterSet
|
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
30
|
-
::String.
|
32
|
+
::String.instance_eval { include CharacterSet::CoreExt::StringExt }
|
@@ -5,7 +5,7 @@ class CharacterSet
|
|
5
5
|
Error = Class.new(ArgumentError)
|
6
6
|
|
7
7
|
def convert(expression)
|
8
|
-
CharacterSet.require_optional_dependency('regexp_parser')
|
8
|
+
CharacterSet.require_optional_dependency('regexp_parser', __method__)
|
9
9
|
|
10
10
|
case expression
|
11
11
|
when Regexp::Expression::Root
|
@@ -16,44 +16,39 @@ class CharacterSet
|
|
16
16
|
|
17
17
|
when Regexp::Expression::CharacterSet
|
18
18
|
content = expression.map { |subexp| convert(subexp) }.reduce(:+)
|
19
|
+
content ||= CharacterSet[]
|
19
20
|
expression.negative? ? content.inversion : content
|
20
21
|
|
21
22
|
when Regexp::Expression::CharacterSet::Intersection
|
22
23
|
expression.map { |subexp| convert(subexp) }.reduce(:&)
|
23
24
|
|
24
25
|
when Regexp::Expression::CharacterSet::IntersectedSequence
|
25
|
-
expression.map { |subexp| convert(subexp) }.reduce(:+)
|
26
|
+
expression.map { |subexp| convert(subexp) }.reduce(:+) || CharacterSet[]
|
26
27
|
|
27
28
|
when Regexp::Expression::CharacterSet::Range
|
28
29
|
start, finish = expression.map { |subexp| convert(subexp) }
|
29
|
-
CharacterSet.
|
30
|
+
CharacterSet.new((start.min)..(finish.max))
|
30
31
|
|
31
32
|
when Regexp::Expression::CharacterType::Any
|
32
33
|
CharacterSet.unicode
|
33
34
|
|
34
|
-
when Regexp::Expression::CharacterType::
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
when Regexp::Expression::CharacterType::Word
|
53
|
-
CharacterSet.from_ranges(48..57, 65..90, 95..95, 97..122)
|
54
|
-
|
55
|
-
when Regexp::Expression::CharacterType::NonWord
|
56
|
-
CharacterSet.from_ranges(48..57, 65..90, 95..95, 97..122).inversion
|
35
|
+
when Regexp::Expression::CharacterType::Base
|
36
|
+
/(?<negative>non)?(?<base_name>.+)/ =~ expression.token
|
37
|
+
content =
|
38
|
+
if expression.unicode_classes?
|
39
|
+
# in u-mode, type shortcuts match the same as \p{<long type name>}
|
40
|
+
CharacterSet.of_property(base_name)
|
41
|
+
else
|
42
|
+
# in normal mode, types match only ascii chars
|
43
|
+
case base_name.to_sym
|
44
|
+
when :digit then CharacterSet.from_ranges(48..57)
|
45
|
+
when :hex then CharacterSet.from_ranges(48..57, 65..70, 97..102)
|
46
|
+
when :space then CharacterSet.from_ranges(9..13, 32..32)
|
47
|
+
when :word then CharacterSet.from_ranges(48..57, 65..90, 95..95, 97..122)
|
48
|
+
else raise Error, "Unsupported CharacterType #{base_name}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
negative ? content.inversion : content
|
57
52
|
|
58
53
|
when Regexp::Expression::EscapeSequence::CodepointList
|
59
54
|
CharacterSet.new(expression.codepoints)
|
@@ -73,7 +68,7 @@ class CharacterSet
|
|
73
68
|
raise Error, 'Groups must contain exactly one expression, e.g. ([a-z])'
|
74
69
|
end
|
75
70
|
|
76
|
-
when Regexp::Expression::Alternation
|
71
|
+
when Regexp::Expression::Alternation # rubocop:disable Lint/DuplicateBranch
|
77
72
|
expression.map { |subexp| convert(subexp) }.reduce(:+)
|
78
73
|
|
79
74
|
when Regexp::Expression::Alternative
|
@@ -93,6 +88,9 @@ class CharacterSet
|
|
93
88
|
when Regexp::Expression::UnicodeProperty::Base,
|
94
89
|
Regexp::Expression::PosixClass
|
95
90
|
content = CharacterSet.of_property(expression.token)
|
91
|
+
if expression.type == :posixclass && expression.ascii_classes?
|
92
|
+
content = content.ascii_part
|
93
|
+
end
|
96
94
|
expression.negative? ? content.inversion : content
|
97
95
|
|
98
96
|
when Regexp::Expression::Base
|
data/lib/character_set/parser.rb
CHANGED
@@ -5,7 +5,7 @@ class CharacterSet
|
|
5
5
|
def codepoints_from_enumerable(object)
|
6
6
|
raise ArgumentError, 'pass an Enumerable' unless object.respond_to?(:each)
|
7
7
|
# Use #each to check first element (only this works for all Enumerables)
|
8
|
-
object.each do |e|
|
8
|
+
object.each do |e| # rubocop:disable Lint/UnreachableLoop
|
9
9
|
return object if e.is_a?(Integer) && e >= 0 && e < 0x110000
|
10
10
|
return object.map(&:ord) if e.is_a?(String) && e.length == 1
|
11
11
|
raise ArgumentError, "#{e.inspect} is not valid as a codepoint"
|
@@ -1,266 +1,31 @@
|
|
1
1
|
class CharacterSet
|
2
2
|
module PredefinedSets
|
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
|
-
def unicode
|
30
|
-
@unicode ||= from_ranges(0..0xD7FF, 0xE000..0x10FFFF).freeze
|
31
|
-
end
|
32
|
-
|
33
|
-
def url_fragment
|
34
|
-
@url_fragment ||= from_ranges(
|
35
|
-
0x21..0x21,
|
36
|
-
0x24..0x24,
|
37
|
-
0x26..0x3B,
|
38
|
-
0x3D..0x3D,
|
39
|
-
0x3F..0x5A,
|
40
|
-
0x5F..0x5F,
|
41
|
-
0x61..0x7A,
|
42
|
-
0x7E..0x7E
|
43
|
-
).freeze
|
44
|
-
end
|
45
|
-
|
46
|
-
def url_host
|
47
|
-
@url_host ||= from_ranges(
|
48
|
-
0x21..0x21,
|
49
|
-
0x24..0x24,
|
50
|
-
0x26..0x2E,
|
51
|
-
0x30..0x3B,
|
52
|
-
0x3D..0x3D,
|
53
|
-
0x41..0x5B,
|
54
|
-
0x5D..0x5D,
|
55
|
-
0x5F..0x5F,
|
56
|
-
0x61..0x7A,
|
57
|
-
0x7E..0x7E
|
58
|
-
).freeze
|
59
|
-
end
|
60
|
-
|
61
|
-
def url_path
|
62
|
-
@url_path ||= from_ranges(
|
63
|
-
0x21..0x21,
|
64
|
-
0x24..0x3A,
|
65
|
-
0x3D..0x3D,
|
66
|
-
0x40..0x5A,
|
67
|
-
0x5F..0x5F,
|
68
|
-
0x61..0x7A,
|
69
|
-
0x7E..0x7E
|
70
|
-
).freeze
|
71
|
-
end
|
72
|
-
|
73
|
-
def url_query
|
74
|
-
@url_query ||= from_ranges(
|
75
|
-
0x21..0x21,
|
76
|
-
0x24..0x24,
|
77
|
-
0x26..0x3B,
|
78
|
-
0x3D..0x3D,
|
79
|
-
0x3F..0x5A,
|
80
|
-
0x5F..0x5F,
|
81
|
-
0x61..0x7A,
|
82
|
-
0x7E..0x7E
|
83
|
-
).freeze
|
84
|
-
end
|
85
|
-
|
86
|
-
def whitespace
|
87
|
-
@whitespace ||= from_ranges(
|
88
|
-
0x9..0x9,
|
89
|
-
0xA..0xD,
|
90
|
-
0x20..0x20,
|
91
|
-
0x85..0x85,
|
92
|
-
0xA0..0xA0,
|
93
|
-
0x1680..0x1680,
|
94
|
-
0x180E..0x180E,
|
95
|
-
0x2000..0x200A,
|
96
|
-
0x2028..0x2029,
|
97
|
-
0x202F..0x202F,
|
98
|
-
0x205F..0x205F,
|
99
|
-
0x3000..0x3000
|
100
|
-
).freeze
|
101
|
-
end
|
102
|
-
|
103
|
-
def emoji
|
104
|
-
@emoji ||= from_ranges(
|
105
|
-
0x23..0x23,
|
106
|
-
0x2A..0x2A,
|
107
|
-
0x30..0x39,
|
108
|
-
0xA9..0xA9,
|
109
|
-
0xAE..0xAE,
|
110
|
-
0x203C..0x203C,
|
111
|
-
0x2049..0x2049,
|
112
|
-
0x2122..0x2122,
|
113
|
-
0x2139..0x2139,
|
114
|
-
0x2194..0x2199,
|
115
|
-
0x21A9..0x21AA,
|
116
|
-
0x231A..0x231B,
|
117
|
-
0x2328..0x2328,
|
118
|
-
0x23CF..0x23CF,
|
119
|
-
0x23E9..0x23F3,
|
120
|
-
0x23F8..0x23FA,
|
121
|
-
0x24C2..0x24C2,
|
122
|
-
0x25AA..0x25AB,
|
123
|
-
0x25B6..0x25B6,
|
124
|
-
0x25C0..0x25C0,
|
125
|
-
0x25FB..0x25FE,
|
126
|
-
0x2600..0x2604,
|
127
|
-
0x260E..0x260E,
|
128
|
-
0x2611..0x2611,
|
129
|
-
0x2614..0x2615,
|
130
|
-
0x2618..0x2618,
|
131
|
-
0x261D..0x261D,
|
132
|
-
0x2620..0x2620,
|
133
|
-
0x2622..0x2623,
|
134
|
-
0x2626..0x2626,
|
135
|
-
0x262A..0x262A,
|
136
|
-
0x262E..0x262F,
|
137
|
-
0x2638..0x263A,
|
138
|
-
0x2640..0x2640,
|
139
|
-
0x2642..0x2642,
|
140
|
-
0x2648..0x2653,
|
141
|
-
0x2660..0x2660,
|
142
|
-
0x2663..0x2663,
|
143
|
-
0x2665..0x2666,
|
144
|
-
0x2668..0x2668,
|
145
|
-
0x267B..0x267B,
|
146
|
-
0x267F..0x267F,
|
147
|
-
0x2692..0x2697,
|
148
|
-
0x2699..0x2699,
|
149
|
-
0x269B..0x269C,
|
150
|
-
0x26A0..0x26A1,
|
151
|
-
0x26AA..0x26AB,
|
152
|
-
0x26B0..0x26B1,
|
153
|
-
0x26BD..0x26BE,
|
154
|
-
0x26C4..0x26C5,
|
155
|
-
0x26C8..0x26C8,
|
156
|
-
0x26CE..0x26CF,
|
157
|
-
0x26D1..0x26D1,
|
158
|
-
0x26D3..0x26D4,
|
159
|
-
0x26E9..0x26EA,
|
160
|
-
0x26F0..0x26F5,
|
161
|
-
0x26F7..0x26FA,
|
162
|
-
0x26FD..0x26FD,
|
163
|
-
0x2702..0x2702,
|
164
|
-
0x2705..0x2705,
|
165
|
-
0x2708..0x270D,
|
166
|
-
0x270F..0x270F,
|
167
|
-
0x2712..0x2712,
|
168
|
-
0x2714..0x2714,
|
169
|
-
0x2716..0x2716,
|
170
|
-
0x271D..0x271D,
|
171
|
-
0x2721..0x2721,
|
172
|
-
0x2728..0x2728,
|
173
|
-
0x2733..0x2734,
|
174
|
-
0x2744..0x2744,
|
175
|
-
0x2747..0x2747,
|
176
|
-
0x274C..0x274C,
|
177
|
-
0x274E..0x274E,
|
178
|
-
0x2753..0x2755,
|
179
|
-
0x2757..0x2757,
|
180
|
-
0x2763..0x2764,
|
181
|
-
0x2795..0x2797,
|
182
|
-
0x27A1..0x27A1,
|
183
|
-
0x27B0..0x27B0,
|
184
|
-
0x27BF..0x27BF,
|
185
|
-
0x2934..0x2935,
|
186
|
-
0x2B05..0x2B07,
|
187
|
-
0x2B1B..0x2B1C,
|
188
|
-
0x2B50..0x2B50,
|
189
|
-
0x2B55..0x2B55,
|
190
|
-
0x3030..0x3030,
|
191
|
-
0x303D..0x303D,
|
192
|
-
0x3297..0x3297,
|
193
|
-
0x3299..0x3299,
|
194
|
-
0x1F004..0x1F004,
|
195
|
-
0x1F0CF..0x1F0CF,
|
196
|
-
0x1F170..0x1F171,
|
197
|
-
0x1F17E..0x1F17F,
|
198
|
-
0x1F18E..0x1F18E,
|
199
|
-
0x1F191..0x1F19A,
|
200
|
-
0x1F1E6..0x1F1FF,
|
201
|
-
0x1F201..0x1F202,
|
202
|
-
0x1F21A..0x1F21A,
|
203
|
-
0x1F22F..0x1F22F,
|
204
|
-
0x1F232..0x1F23A,
|
205
|
-
0x1F250..0x1F251,
|
206
|
-
0x1F300..0x1F321,
|
207
|
-
0x1F324..0x1F393,
|
208
|
-
0x1F396..0x1F397,
|
209
|
-
0x1F399..0x1F39B,
|
210
|
-
0x1F39E..0x1F3F0,
|
211
|
-
0x1F3F3..0x1F3F5,
|
212
|
-
0x1F3F7..0x1F4FD,
|
213
|
-
0x1F4FF..0x1F53D,
|
214
|
-
0x1F549..0x1F54E,
|
215
|
-
0x1F550..0x1F567,
|
216
|
-
0x1F56F..0x1F570,
|
217
|
-
0x1F573..0x1F57A,
|
218
|
-
0x1F587..0x1F587,
|
219
|
-
0x1F58A..0x1F58D,
|
220
|
-
0x1F590..0x1F590,
|
221
|
-
0x1F595..0x1F596,
|
222
|
-
0x1F5A4..0x1F5A5,
|
223
|
-
0x1F5A8..0x1F5A8,
|
224
|
-
0x1F5B1..0x1F5B2,
|
225
|
-
0x1F5BC..0x1F5BC,
|
226
|
-
0x1F5C2..0x1F5C4,
|
227
|
-
0x1F5D1..0x1F5D3,
|
228
|
-
0x1F5DC..0x1F5DE,
|
229
|
-
0x1F5E1..0x1F5E1,
|
230
|
-
0x1F5E3..0x1F5E3,
|
231
|
-
0x1F5E8..0x1F5E8,
|
232
|
-
0x1F5EF..0x1F5EF,
|
233
|
-
0x1F5F3..0x1F5F3,
|
234
|
-
0x1F5FA..0x1F64F,
|
235
|
-
0x1F680..0x1F6C5,
|
236
|
-
0x1F6CB..0x1F6D2,
|
237
|
-
0x1F6E0..0x1F6E5,
|
238
|
-
0x1F6E9..0x1F6E9,
|
239
|
-
0x1F6EB..0x1F6EC,
|
240
|
-
0x1F6F0..0x1F6F0,
|
241
|
-
0x1F6F3..0x1F6F8,
|
242
|
-
0x1F910..0x1F93A,
|
243
|
-
0x1F93C..0x1F93E,
|
244
|
-
0x1F940..0x1F945,
|
245
|
-
0x1F947..0x1F94C,
|
246
|
-
0x1F950..0x1F96B,
|
247
|
-
0x1F980..0x1F997,
|
248
|
-
0x1F9C0..0x1F9C0,
|
249
|
-
0x1F9D0..0x1F9E6
|
250
|
-
).freeze
|
251
|
-
end
|
252
|
-
|
253
|
-
def respond_to_missing?(method_name, include_private = false)
|
254
|
-
(base = method_name[/^non_(.*)/, 1]) && respond_to?(base) || super
|
255
|
-
end
|
256
|
-
|
257
|
-
def method_missing(method_name, *args, &block)
|
258
|
-
if (base = method_name[/^non_(.*)/, 1])
|
259
|
-
ivar_name = "@#{method_name}"
|
260
|
-
return instance_variable_get(ivar_name) ||
|
261
|
-
instance_variable_set(ivar_name, send(base).inversion.freeze)
|
3
|
+
Dir[File.join(__dir__, 'predefined_sets', '*.cps')].each do |path|
|
4
|
+
set_name = File.basename(path, '.cps')
|
5
|
+
|
6
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
7
|
+
def #{set_name}
|
8
|
+
@#{set_name} ||= build_from_cps_file('#{path}').freeze
|
9
|
+
end
|
10
|
+
|
11
|
+
def non_#{set_name}
|
12
|
+
@non_#{set_name} ||= build_from_cps_file('#{path}').inversion.freeze
|
13
|
+
end
|
14
|
+
RUBY
|
15
|
+
end
|
16
|
+
|
17
|
+
alias all any
|
18
|
+
alias ascii_letters ascii_letter
|
19
|
+
alias basic_multilingual_plane bmp
|
20
|
+
alias blank whitespace
|
21
|
+
alias invalid surrogate
|
22
|
+
alias valid unicode
|
23
|
+
|
24
|
+
def build_from_cps_file(path)
|
25
|
+
File.readlines(path).inject(new) do |set, line|
|
26
|
+
range_start, range_end = line.split(',')
|
27
|
+
set.merge((range_start.to_i(16))..(range_end.to_i(16)))
|
262
28
|
end
|
263
|
-
super
|
264
29
|
end
|
265
30
|
end
|
266
31
|
end
|