character_set 1.7.0 → 1.9.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/CHANGELOG.md +19 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +4 -3
  6. data/Rakefile +12 -5
  7. data/ext/character_set/character_set.c +91 -67
  8. data/ext/character_set/java/src/main/java/org/jaynetics/characterset/CharacterSetService.java +15 -0
  9. data/ext/character_set/java/src/main/java/org/jaynetics/characterset/RubyCharacterSet.java +493 -0
  10. data/ext/character_set/java/src/main/java/org/jaynetics/characterset/StringOperations.java +138 -0
  11. data/lib/character_set/core_ext/regexp_ext.rb +8 -0
  12. data/lib/character_set/expression_converter.rb +37 -54
  13. data/lib/character_set/java.rb +6 -0
  14. data/lib/character_set/parser.rb +5 -3
  15. data/lib/character_set/predefined_sets/assigned.cps +95 -58
  16. data/lib/character_set/predefined_sets/emoji.cps +9 -11
  17. data/lib/character_set/predefined_sets.rb +1 -1
  18. data/lib/character_set/ruby_fallback/character_set_methods.rb +7 -14
  19. data/lib/character_set/ruby_fallback/set_methods.rb +215 -53
  20. data/lib/character_set/ruby_fallback.rb +4 -2
  21. data/lib/character_set/set_method_adapters.rb +1 -1
  22. data/lib/character_set/shared_methods.rb +43 -2
  23. data/lib/character_set/version.rb +1 -1
  24. data/lib/character_set/writer.rb +1 -1
  25. data/lib/character_set.rb +6 -1
  26. metadata +8 -38
  27. data/.gitattributes +0 -3
  28. data/.github/workflows/gouteur.yml +0 -20
  29. data/.github/workflows/lint.yml +0 -29
  30. data/.github/workflows/tests.yml +0 -26
  31. data/.gitignore +0 -33
  32. data/.gouteur.yml +0 -2
  33. data/.rspec +0 -3
  34. data/BENCHMARK.md +0 -90
  35. data/Gemfile +0 -20
  36. data/bin/console +0 -21
  37. data/bin/setup +0 -8
  38. data/character_set.gemspec +0 -24
  39. data/ext/character_set/unicode_casefold_table.h +0 -1438
  40. data/ext/character_set/unicode_casefold_table.h.tmpl +0 -11
  41. data/lib/character_set/ruby_fallback/vendored_set_classes.rb +0 -492
  42. data/tasks/benchmark.rake +0 -20
  43. data/tasks/benchmarks/count_in.rb +0 -13
  44. data/tasks/benchmarks/cover.rb +0 -25
  45. data/tasks/benchmarks/delete_in.rb +0 -29
  46. data/tasks/benchmarks/keep_in.rb +0 -29
  47. data/tasks/benchmarks/scan.rb +0 -13
  48. data/tasks/benchmarks/shared.rb +0 -28
  49. data/tasks/benchmarks/used_by.rb +0 -25
  50. data/tasks/benchmarks/z_add.rb +0 -12
  51. data/tasks/benchmarks/z_delete.rb +0 -12
  52. data/tasks/benchmarks/z_merge.rb +0 -15
  53. data/tasks/benchmarks/z_minmax.rb +0 -12
  54. data/tasks/sync_casefold_data.rake +0 -20
  55. data/tasks/sync_predefined_sets.rake +0 -9
  56. data/tasks/sync_ruby_spec.rake +0 -65
@@ -4,86 +4,61 @@ class CharacterSet
4
4
 
5
5
  Error = Class.new(ArgumentError)
6
6
 
7
- def convert(expression, to = CharacterSet)
7
+ def convert(expression, to = CharacterSet, acc = [])
8
8
  CharacterSet.require_optional_dependency('regexp_parser', __method__)
9
9
 
10
10
  case expression
11
- when Regexp::Expression::Root
12
- if expression.count != 1
13
- raise Error, 'Pass a Regexp with exactly one expression, e.g. /[a-z]/'
14
- end
15
- convert(expression[0], to)
16
-
17
11
  when Regexp::Expression::CharacterSet
18
- content = expression.map { |subexp| convert(subexp, to) }.reduce(:+)
19
- content ||= to[]
20
- expression.negative? ? content.inversion : content
12
+ content = expression.map { |subexp| convert(subexp, to) }.reduce(:+) || to[]
13
+ acc << (expression.negative? ? content.inversion : content)
21
14
 
22
15
  when Regexp::Expression::CharacterSet::Intersection
23
- expression.map { |subexp| convert(subexp, to) }.reduce(:&)
24
-
25
- when Regexp::Expression::CharacterSet::IntersectedSequence
26
- expression.map { |subexp| convert(subexp, to) }.reduce(:+) || to[]
16
+ acc << expression.map { |subexp| convert(subexp, to) }.reduce(:&)
27
17
 
28
18
  when Regexp::Expression::CharacterSet::Range
29
19
  start, finish = expression.map { |subexp| convert(subexp, to) }
30
- to.new((start.min)..(finish.max))
20
+ acc << to.new((start.min)..(finish.max))
21
+
22
+ when Regexp::Expression::Subexpression # root, group, alternation, etc.
23
+ expression.each { |subexp| convert(subexp, to, acc) }
31
24
 
32
25
  when Regexp::Expression::CharacterType::Any
33
- to.unicode
26
+ acc << to.unicode
34
27
 
35
28
  when Regexp::Expression::CharacterType::Base
36
29
  /(?<negative>non)?(?<base_name>.+)/ =~ expression.token
37
30
  content =
38
31
  if expression.unicode_classes?
39
- # in u-mode, type shortcuts match the same as \p{<long type name>}
40
- to.of_property(base_name)
32
+ # in u-mode, most type shortcuts match the same as \p{<long type name>}
33
+ if base_name == 'linebreak'
34
+ to.from_ranges(10..13, 133..133, 8232..8233)
35
+ else
36
+ to.of_property(base_name)
37
+ end
41
38
  else
42
39
  # in normal mode, types match only ascii chars
43
40
  case base_name.to_sym
44
- when :digit then to.from_ranges(48..57)
45
- when :hex then to.from_ranges(48..57, 65..70, 97..102)
46
- when :space then to.from_ranges(9..13, 32..32)
47
- when :word then to.from_ranges(48..57, 65..90, 95..95, 97..122)
41
+ when :digit then to.from_ranges(48..57)
42
+ when :hex then to.from_ranges(48..57, 65..70, 97..102)
43
+ when :linebreak then to.from_ranges(10..13)
44
+ when :space then to.from_ranges(9..13, 32..32)
45
+ when :word then to.from_ranges(48..57, 65..90, 95..95, 97..122)
48
46
  else raise Error, "Unsupported CharacterType #{base_name}"
49
47
  end
50
48
  end
51
- negative ? content.inversion : content
49
+ acc << (negative ? content.inversion : content)
52
50
 
53
51
  when Regexp::Expression::EscapeSequence::CodepointList
54
- to.new(expression.codepoints)
52
+ content = to.new(expression.codepoints)
53
+ acc << (expression.i? ? content.case_insensitive : content)
55
54
 
56
55
  when Regexp::Expression::EscapeSequence::Base
57
- to[expression.codepoint]
58
-
59
- when Regexp::Expression::Group::Capture,
60
- Regexp::Expression::Group::Passive,
61
- Regexp::Expression::Group::Named,
62
- Regexp::Expression::Group::Atomic,
63
- Regexp::Expression::Group::Options
64
- case expression.count
65
- when 0 then to[]
66
- when 1 then convert(expression.first, to)
67
- else
68
- raise Error, 'Groups must contain exactly one expression, e.g. ([a-z])'
69
- end
70
-
71
- when Regexp::Expression::Alternation # rubocop:disable Lint/DuplicateBranch
72
- expression.map { |subexp| convert(subexp, to) }.reduce(:+)
73
-
74
- when Regexp::Expression::Alternative
75
- case expression.count
76
- when 0 then to[]
77
- when 1 then convert(expression.first, to)
78
- else
79
- raise Error, 'Alternatives must contain exactly one expression'
80
- end
56
+ content = to[expression.codepoint]
57
+ acc << (expression.i? ? content.case_insensitive : content)
81
58
 
82
59
  when Regexp::Expression::Literal
83
- if expression.set_level == 0 && expression.text.size != 1
84
- raise Error, 'Literal runs outside of sets are codepoint *sequences*'
85
- end
86
- to[expression.text.ord]
60
+ content = to[*expression.text.chars]
61
+ acc << (expression.i? ? content.case_insensitive : content)
87
62
 
88
63
  when Regexp::Expression::UnicodeProperty::Base,
89
64
  Regexp::Expression::PosixClass
@@ -91,14 +66,22 @@ class CharacterSet
91
66
  if expression.type == :posixclass && expression.ascii_classes?
92
67
  content = content.ascii_part
93
68
  end
94
- expression.negative? ? content.inversion : content
69
+ acc << (expression.negative? ? content.inversion : content)
70
+
71
+ when Regexp::Expression::Anchor::Base,
72
+ Regexp::Expression::Backreference::Base,
73
+ Regexp::Expression::Keep::Mark,
74
+ Regexp::Expression::Quantifier
75
+ # ignore zero-length and repeat expressions
95
76
 
96
77
  when Regexp::Expression::Base
97
78
  raise Error, "Unsupported expression class `#{expression.class}`"
98
79
 
99
80
  else
100
- raise Error, "Pass an expression (result of Regexp::Parser.parse)"
81
+ raise Error, 'Pass an expression (result of Regexp::Parser.parse)'
101
82
  end
83
+
84
+ acc.reduce(:+) || to[]
102
85
  end
103
86
  end
104
87
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'java'
4
+ require_relative 'character_set.jar'
5
+
6
+ JRuby::Util.load_ext('org.jaynetics.characterset.CharacterSetService')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CharacterSet
2
4
  module Parser
3
5
  module_function
@@ -18,7 +20,7 @@ class CharacterSet
18
20
 
19
21
  def codepoints_from_bracket_expression(string)
20
22
  raise ArgumentError, 'pass a String' unless string.is_a?(String)
21
- raise ArgumentError, 'advanced syntax' if string =~ /\\[^uUx]|[^\\]\[|&&/
23
+ raise ArgumentError, 'advanced syntax' if string.match?(/\\[^uUx]|[^\\]\[|&&/)
22
24
 
23
25
  content = strip_brackets(string)
24
26
  literal_content = eval_escapes(content)
@@ -26,7 +28,7 @@ class CharacterSet
26
28
  prev_chr = nil
27
29
  in_range = false
28
30
 
29
- literal_content.each_char.map do |chr|
31
+ literal_content.each_char.filter_map do |chr|
30
32
  if chr == '-' && prev_chr && prev_chr != '\\' && prev_chr != '-'
31
33
  in_range = true
32
34
  nil
@@ -36,7 +38,7 @@ class CharacterSet
36
38
  prev_chr = chr
37
39
  result
38
40
  end
39
- end.compact.flatten
41
+ end.flatten
40
42
  end
41
43
 
42
44
  def strip_brackets(string)
@@ -19,9 +19,8 @@
19
19
  840,85B
20
20
  85E,85E
21
21
  860,86A
22
- 870,88E
23
- 890,891
24
- 898,983
22
+ 870,891
23
+ 897,983
25
24
  985,98C
26
25
  98F,990
27
26
  993,9A8
@@ -104,7 +103,7 @@ C46,C48
104
103
  C4A,C4D
105
104
  C55,C56
106
105
  C58,C5A
107
- C5D,C5D
106
+ C5C,C5D
108
107
  C60,C63
109
108
  C66,C6F
110
109
  C77,C8C
@@ -116,10 +115,10 @@ CBC,CC4
116
115
  CC6,CC8
117
116
  CCA,CCD
118
117
  CD5,CD6
119
- CDD,CDE
118
+ CDC,CDE
120
119
  CE0,CE3
121
120
  CE6,CEF
122
- CF1,CF2
121
+ CF1,CF3
123
122
  D00,D0C
124
123
  D0E,D10
125
124
  D12,D44
@@ -149,7 +148,7 @@ EA5,EA5
149
148
  EA7,EBD
150
149
  EC0,EC4
151
150
  EC6,EC6
152
- EC8,ECD
151
+ EC8,ECE
153
152
  ED0,ED9
154
153
  EDC,EDF
155
154
  F00,F47
@@ -211,13 +210,13 @@ FCE,FDA
211
210
  1A7F,1A89
212
211
  1A90,1A99
213
212
  1AA0,1AAD
214
- 1AB0,1ACE
213
+ 1AB0,1ADD
214
+ 1AE0,1AEB
215
215
  1B00,1B4C
216
- 1B50,1B7E
217
- 1B80,1BF3
216
+ 1B4E,1BF3
218
217
  1BFC,1C37
219
218
  1C3B,1C49
220
- 1C4D,1C88
219
+ 1C4D,1C8A
221
220
  1C90,1CBA
222
221
  1CBD,1CC7
223
222
  1CD0,1CFA
@@ -241,14 +240,13 @@ FCE,FDA
241
240
  2066,2071
242
241
  2074,208E
243
242
  2090,209C
244
- 20A0,20C0
243
+ 20A0,20C1
245
244
  20D0,20F0
246
245
  2100,218B
247
- 2190,2426
246
+ 2190,2429
248
247
  2440,244A
249
248
  2460,2B73
250
- 2B76,2B95
251
- 2B97,2CF3
249
+ 2B76,2CF3
252
250
  2CF9,2D25
253
251
  2D27,2D27
254
252
  2D2D,2D2D
@@ -267,23 +265,19 @@ FCE,FDA
267
265
  2E80,2E99
268
266
  2E9B,2EF3
269
267
  2F00,2FD5
270
- 2FF0,2FFB
271
- 3000,303F
268
+ 2FF0,303F
272
269
  3041,3096
273
270
  3099,30FF
274
271
  3105,312F
275
272
  3131,318E
276
- 3190,31E3
277
- 31F0,321E
273
+ 3190,31E5
274
+ 31EF,321E
278
275
  3220,A48C
279
276
  A490,A4C6
280
277
  A4D0,A62B
281
278
  A640,A6F7
282
- A700,A7CA
283
- A7D0,A7D1
284
- A7D3,A7D3
285
- A7D5,A7D9
286
- A7F2,A82C
279
+ A700,A7DC
280
+ A7F1,A82C
287
281
  A830,A839
288
282
  A840,A877
289
283
  A880,A8C5
@@ -309,7 +303,7 @@ ABF0,ABF9
309
303
  AC00,D7A3
310
304
  D7B0,D7C6
311
305
  D7CB,D7FB
312
- D800,FA6D
306
+ E000,FA6D
313
307
  FA70,FAD9
314
308
  FB00,FB06
315
309
  FB13,FB17
@@ -318,10 +312,7 @@ FB38,FB3C
318
312
  FB3E,FB3E
319
313
  FB40,FB41
320
314
  FB43,FB44
321
- FB46,FBC2
322
- FBD3,FD8F
323
- FD92,FDC7
324
- FDCF,FDCF
315
+ FB46,FDCF
325
316
  FDF0,FE19
326
317
  FE20,FE52
327
318
  FE54,FE66
@@ -373,6 +364,7 @@ FFF9,FFFD
373
364
  105A3,105B1
374
365
  105B3,105B9
375
366
  105BB,105BC
367
+ 105C0,105F3
376
368
  10600,10736
377
369
  10740,10755
378
370
  10760,10767
@@ -391,7 +383,7 @@ FFF9,FFFD
391
383
  108F4,108F5
392
384
  108FB,1091B
393
385
  1091F,10939
394
- 1093F,1093F
386
+ 1093F,10959
395
387
  10980,109B7
396
388
  109BC,109CF
397
389
  109D2,10A03
@@ -416,11 +408,16 @@ FFF9,FFFD
416
408
  10CC0,10CF2
417
409
  10CFA,10D27
418
410
  10D30,10D39
411
+ 10D40,10D65
412
+ 10D69,10D85
413
+ 10D8E,10D8F
419
414
  10E60,10E7E
420
415
  10E80,10EA9
421
416
  10EAB,10EAD
422
417
  10EB0,10EB1
423
- 10F00,10F27
418
+ 10EC2,10EC7
419
+ 10ED0,10ED8
420
+ 10EFA,10F27
424
421
  10F30,10F59
425
422
  10F70,10F89
426
423
  10FB0,10FCB
@@ -437,7 +434,7 @@ FFF9,FFFD
437
434
  11180,111DF
438
435
  111E1,111F4
439
436
  11200,11211
440
- 11213,1123E
437
+ 11213,11241
441
438
  11280,11286
442
439
  11288,11288
443
440
  1128A,1128D
@@ -460,6 +457,17 @@ FFF9,FFFD
460
457
  1135D,11363
461
458
  11366,1136C
462
459
  11370,11374
460
+ 11380,11389
461
+ 1138B,1138B
462
+ 1138E,1138E
463
+ 11390,113B5
464
+ 113B7,113C0
465
+ 113C2,113C2
466
+ 113C5,113C5
467
+ 113C7,113CA
468
+ 113CC,113D5
469
+ 113D7,113D8
470
+ 113E1,113E2
463
471
  11400,1145B
464
472
  1145D,11461
465
473
  11480,114C7
@@ -471,6 +479,7 @@ FFF9,FFFD
471
479
  11660,1166C
472
480
  11680,116B9
473
481
  116C0,116C9
482
+ 116D0,116E3
474
483
  11700,1171A
475
484
  1171D,1172B
476
485
  11730,11746
@@ -490,6 +499,10 @@ FFF9,FFFD
490
499
  11A00,11A47
491
500
  11A50,11AA2
492
501
  11AB0,11AF8
502
+ 11B00,11B09
503
+ 11B60,11B67
504
+ 11BC0,11BE1
505
+ 11BF0,11BF9
493
506
  11C00,11C08
494
507
  11C0A,11C36
495
508
  11C38,11C45
@@ -510,7 +523,12 @@ FFF9,FFFD
510
523
  11D90,11D91
511
524
  11D93,11D98
512
525
  11DA0,11DA9
526
+ 11DB0,11DDB
527
+ 11DE0,11DE9
513
528
  11EE0,11EF8
529
+ 11F00,11F10
530
+ 11F12,11F3A
531
+ 11F3E,11F5A
514
532
  11FB0,11FB0
515
533
  11FC0,11FF1
516
534
  11FFF,12399
@@ -518,9 +536,10 @@ FFF9,FFFD
518
536
  12470,12474
519
537
  12480,12543
520
538
  12F90,12FF2
521
- 13000,1342E
522
- 13430,13438
539
+ 13000,13455
540
+ 13460,143FA
523
541
  14400,14646
542
+ 16100,16139
524
543
  16800,16A38
525
544
  16A40,16A5E
526
545
  16A60,16A69
@@ -533,20 +552,25 @@ FFF9,FFFD
533
552
  16B5B,16B61
534
553
  16B63,16B77
535
554
  16B7D,16B8F
555
+ 16D40,16D79
536
556
  16E40,16E9A
557
+ 16EA0,16EB8
558
+ 16EBB,16ED3
537
559
  16F00,16F4A
538
560
  16F4F,16F87
539
561
  16F8F,16F9F
540
562
  16FE0,16FE4
541
- 16FF0,16FF1
542
- 17000,187F7
543
- 18800,18CD5
544
- 18D00,18D08
563
+ 16FF0,16FF6
564
+ 17000,18CD5
565
+ 18CFF,18D1E
566
+ 18D80,18DF2
545
567
  1AFF0,1AFF3
546
568
  1AFF5,1AFFB
547
569
  1AFFD,1AFFE
548
570
  1B000,1B122
571
+ 1B132,1B132
549
572
  1B150,1B152
573
+ 1B155,1B155
550
574
  1B164,1B167
551
575
  1B170,1B2FB
552
576
  1BC00,1BC6A
@@ -554,6 +578,10 @@ FFF9,FFFD
554
578
  1BC80,1BC88
555
579
  1BC90,1BC99
556
580
  1BC9C,1BCA3
581
+ 1CC00,1CCFC
582
+ 1CD00,1CEB3
583
+ 1CEBA,1CED0
584
+ 1CEE0,1CEF0
557
585
  1CF00,1CF2D
558
586
  1CF30,1CF46
559
587
  1CF50,1CFC3
@@ -561,6 +589,7 @@ FFF9,FFFD
561
589
  1D100,1D126
562
590
  1D129,1D1EA
563
591
  1D200,1D245
592
+ 1D2C0,1D2D3
564
593
  1D2E0,1D2F3
565
594
  1D300,1D356
566
595
  1D360,1D378
@@ -588,11 +617,14 @@ FFF9,FFFD
588
617
  1DA9B,1DA9F
589
618
  1DAA1,1DAAF
590
619
  1DF00,1DF1E
620
+ 1DF25,1DF2A
591
621
  1E000,1E006
592
622
  1E008,1E018
593
623
  1E01B,1E021
594
624
  1E023,1E024
595
625
  1E026,1E02A
626
+ 1E030,1E06D
627
+ 1E08F,1E08F
596
628
  1E100,1E12C
597
629
  1E130,1E13D
598
630
  1E140,1E149
@@ -600,6 +632,12 @@ FFF9,FFFD
600
632
  1E290,1E2AE
601
633
  1E2C0,1E2F9
602
634
  1E2FF,1E2FF
635
+ 1E4D0,1E4F9
636
+ 1E5D0,1E5FA
637
+ 1E5FF,1E5FF
638
+ 1E6C0,1E6DE
639
+ 1E6E0,1E6F5
640
+ 1E6FE,1E6FF
603
641
  1E7E0,1E7E6
604
642
  1E7E8,1E7EB
605
643
  1E7ED,1E7EE
@@ -657,11 +695,10 @@ FFF9,FFFD
657
695
  1F240,1F248
658
696
  1F250,1F251
659
697
  1F260,1F265
660
- 1F300,1F6D7
661
- 1F6DD,1F6EC
698
+ 1F300,1F6D8
699
+ 1F6DC,1F6EC
662
700
  1F6F0,1F6FC
663
- 1F700,1F773
664
- 1F780,1F7D8
701
+ 1F700,1F7D9
665
702
  1F7E0,1F7EB
666
703
  1F7F0,1F7F0
667
704
  1F800,1F80B
@@ -669,28 +706,28 @@ FFF9,FFFD
669
706
  1F850,1F859
670
707
  1F860,1F887
671
708
  1F890,1F8AD
672
- 1F8B0,1F8B1
673
- 1F900,1FA53
709
+ 1F8B0,1F8BB
710
+ 1F8C0,1F8C1
711
+ 1F8D0,1F8D8
712
+ 1F900,1FA57
674
713
  1FA60,1FA6D
675
- 1FA70,1FA74
676
- 1FA78,1FA7C
677
- 1FA80,1FA86
678
- 1FA90,1FAAC
679
- 1FAB0,1FABA
680
- 1FAC0,1FAC5
681
- 1FAD0,1FAD9
682
- 1FAE0,1FAE7
683
- 1FAF0,1FAF6
714
+ 1FA70,1FA7C
715
+ 1FA80,1FA8A
716
+ 1FA8E,1FAC6
717
+ 1FAC8,1FAC8
718
+ 1FACD,1FADC
719
+ 1FADF,1FAEA
720
+ 1FAEF,1FAF8
684
721
  1FB00,1FB92
685
- 1FB94,1FBCA
686
- 1FBF0,1FBF9
722
+ 1FB94,1FBFA
687
723
  20000,2A6DF
688
- 2A700,2B738
689
- 2B740,2B81D
690
- 2B820,2CEA1
724
+ 2A700,2B81D
725
+ 2B820,2CEAD
691
726
  2CEB0,2EBE0
727
+ 2EBF0,2EE5D
692
728
  2F800,2FA1D
693
729
  30000,3134A
730
+ 31350,33479
694
731
  E0001,E0001
695
732
  E0020,E007F
696
733
  E0100,E01EF
@@ -131,8 +131,8 @@ AE,AE
131
131
  1F5FA,1F64F
132
132
  1F680,1F6C5
133
133
  1F6CB,1F6D2
134
- 1F6D5,1F6D7
135
- 1F6DD,1F6E5
134
+ 1F6D5,1F6D8
135
+ 1F6DC,1F6E5
136
136
  1F6E9,1F6E9
137
137
  1F6EB,1F6EC
138
138
  1F6F0,1F6F0
@@ -142,12 +142,10 @@ AE,AE
142
142
  1F90C,1F93A
143
143
  1F93C,1F945
144
144
  1F947,1F9FF
145
- 1FA70,1FA74
146
- 1FA78,1FA7C
147
- 1FA80,1FA86
148
- 1FA90,1FAAC
149
- 1FAB0,1FABA
150
- 1FAC0,1FAC5
151
- 1FAD0,1FAD9
152
- 1FAE0,1FAE7
153
- 1FAF0,1FAF6
145
+ 1FA70,1FA7C
146
+ 1FA80,1FA8A
147
+ 1FA8E,1FAC6
148
+ 1FAC8,1FAC8
149
+ 1FACD,1FADC
150
+ 1FADF,1FAEA
151
+ 1FAEF,1FAF8
@@ -23,7 +23,7 @@ class CharacterSet
23
23
 
24
24
  def build_from_cps_file(path)
25
25
  if defined?(Ractor) && Ractor.current != Ractor.main
26
- raise <<-EOS.gsub(/^ */, '')
26
+ raise <<~EOS
27
27
  CharacterSet's predefined sets are lazy-loaded.
28
28
  Pre-load them to use them in Ractors. E.g.:
29
29
 
@@ -44,12 +44,11 @@ class CharacterSet
44
44
  end
45
45
 
46
46
  def cover?(string)
47
- utf8_str!(string).each_codepoint { |cp| return false unless include?(cp) }
48
- true
47
+ utf8_str!(string).each_codepoint.all? { |cp| include?(cp) }
49
48
  end
50
49
 
51
50
  def delete_in(string)
52
- utf8_str!(string).each_codepoint.with_object('') do |cp, new_str|
51
+ utf8_str!(string).each_codepoint.with_object(+'') do |cp, new_str|
53
52
  include?(cp) || (new_str << cp)
54
53
  end.encode(string.encoding)
55
54
  end
@@ -60,7 +59,7 @@ class CharacterSet
60
59
  end
61
60
 
62
61
  def keep_in(string)
63
- utf8_str!(string).each_codepoint.with_object('') do |cp, new_str|
62
+ utf8_str!(string).each_codepoint.with_object(+'') do |cp, new_str|
64
63
  include?(cp) && (new_str << cp)
65
64
  end.encode(string.encoding)
66
65
  end
@@ -71,14 +70,13 @@ class CharacterSet
71
70
  end
72
71
 
73
72
  def scan(string)
74
- utf8_str!(string).each_codepoint.with_object([]) do |cp, arr|
75
- arr.push(cp.chr('utf-8')) if include?(cp)
73
+ utf8_str!(string).each_codepoint.filter_map do |cp|
74
+ cp.chr('utf-8') if include?(cp)
76
75
  end
77
76
  end
78
77
 
79
78
  def used_by?(string)
80
- utf8_str!(string).each_codepoint { |cp| return true if include?(cp) }
81
- false
79
+ utf8_str!(string).each_codepoint.any? { |cp| include?(cp) }
82
80
  end
83
81
 
84
82
  def section(from:, upto: 0x10FFFF)
@@ -98,8 +96,7 @@ class CharacterSet
98
96
  end
99
97
 
100
98
  def planes
101
- plane_size = 0x10000.to_f
102
- inject({}) { |hash, cp| hash.merge((cp / plane_size).floor => 1) }.keys
99
+ map { |cp| cp / 0x10000 }.uniq
103
100
  end
104
101
 
105
102
  def plane(num)
@@ -122,10 +119,6 @@ class CharacterSet
122
119
  raise ArgumentError, 'pass a String' unless obj.respond_to?(:codepoints)
123
120
  obj.encode('utf-8')
124
121
  end
125
-
126
- def make_new_str(original, &block)
127
- utf8_str!(original).each_codepoint.with_object('', &block)
128
- end
129
122
  end
130
123
  end
131
124
  end