summaryrefslogtreecommitdiff
path: root/lib/unicode_normalize
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicode_normalize')
-rw-r--r--lib/unicode_normalize/normalize.rb30
-rw-r--r--lib/unicode_normalize/tables.rb186
2 files changed, 204 insertions, 12 deletions
diff --git a/lib/unicode_normalize/normalize.rb b/lib/unicode_normalize/normalize.rb
index 1caf2cc8c8..0447df8de7 100644
--- a/lib/unicode_normalize/normalize.rb
+++ b/lib/unicode_normalize/normalize.rb
@@ -82,16 +82,22 @@ module UnicodeNormalize # :nodoc:
## Canonical Ordering
def self.canonical_ordering_one(string)
- sorting = string.each_char.collect { |c| [c, CLASS_TABLE[c]] }
- (sorting.length-2).downto(0) do |i| # almost, but not exactly bubble sort
- (0..i).each do |j|
- later_class = sorting[j+1].last
- if 0<later_class and later_class<sorting[j].last
- sorting[j], sorting[j+1] = sorting[j+1], sorting[j]
- end
+ result = ''
+ unordered = []
+ chars = string.chars
+ n = chars.size
+ chars.each_with_index do |char, i|
+ ccc = CLASS_TABLE[char]
+ if ccc == 0
+ unordered.sort!.each { result << chars[it % n] }
+ unordered.clear
+ result << char
+ else
+ unordered << ccc * n + i
end
end
- return sorting.collect(&:first).join('')
+ unordered.sort!.each { result << chars[it % n] }
+ result
end
## Normalization Forms for Patterns (not whole Strings)
@@ -105,16 +111,22 @@ module UnicodeNormalize # :nodoc:
start = nfd_string[0]
last_class = CLASS_TABLE[start]-1
accents = ''
+ result = ''
nfd_string[1..-1].each_char do |accent|
accent_class = CLASS_TABLE[accent]
if last_class<accent_class and composite = COMPOSITION_TABLE[start+accent]
start = composite
+ elsif accent_class == 0
+ result << start << accents
+ start = accent
+ accents = ''
+ last_class = -1
else
accents << accent
last_class = accent_class
end
end
- hangul_comp_one(start+accents)
+ hangul_comp_one(result+start+accents)
end
def self.normalize(string, form = :nfc)
diff --git a/lib/unicode_normalize/tables.rb b/lib/unicode_normalize/tables.rb
index 7448fad13f..dd5d3499b8 100644
--- a/lib/unicode_normalize/tables.rb
+++ b/lib/unicode_normalize/tables.rb
@@ -1,6 +1,9 @@
# coding: us-ascii
# frozen_string_literal: true
+Encoding::UNICODE_VERSION == "17.0.0" or
+ raise "Unicode version mismatch: 17.0.0 expected but #{Encoding::UNICODE_VERSION}"
+
# automatically generated by template/unicode_norm_gen.tmpl
module UnicodeNormalize # :nodoc:
@@ -29,7 +32,7 @@ module UnicodeNormalize # :nodoc:
"\u0825-\u0827" \
"\u0829-\u082D" \
"\u0859-\u085B" \
- "\u0898-\u089F" \
+ "\u0897-\u089F" \
"\u08CA-\u08E1" \
"\u08E3-\u08FF" \
"\u093C" \
@@ -96,7 +99,8 @@ module UnicodeNormalize # :nodoc:
"\u1A75-\u1A7C" \
"\u1A7F" \
"\u1AB0-\u1ABD" \
- "\u1ABF-\u1ACE" \
+ "\u1ABF-\u1ADD" \
+ "\u1AE0-\u1AEB" \
"\u1B34\u1B35" \
"\u1B44" \
"\u1B6B-\u1B73" \
@@ -149,7 +153,9 @@ module UnicodeNormalize # :nodoc:
"\u{10A3F}" \
"\u{10AE5}\u{10AE6}" \
"\u{10D24}-\u{10D27}" \
+ "\u{10D69}-\u{10D6D}" \
"\u{10EAB}\u{10EAC}" \
+ "\u{10EFA}\u{10EFB}" \
"\u{10EFD}-\u{10EFF}" \
"\u{10F46}-\u{10F50}" \
"\u{10F82}-\u{10F85}" \
@@ -171,6 +177,12 @@ module UnicodeNormalize # :nodoc:
"\u{11357}" \
"\u{11366}-\u{1136C}" \
"\u{11370}-\u{11374}" \
+ "\u{113B8}" \
+ "\u{113BB}" \
+ "\u{113C2}" \
+ "\u{113C5}" \
+ "\u{113C7}-\u{113C9}" \
+ "\u{113CE}-\u{113D0}" \
"\u{11442}" \
"\u{11446}" \
"\u{1145E}" \
@@ -196,8 +208,11 @@ module UnicodeNormalize # :nodoc:
"\u{11D44}\u{11D45}" \
"\u{11D97}" \
"\u{11F41}\u{11F42}" \
+ "\u{1611E}-\u{16129}" \
+ "\u{1612F}" \
"\u{16AF0}-\u{16AF4}" \
"\u{16B30}-\u{16B36}" \
+ "\u{16D67}\u{16D68}" \
"\u{16FF0}\u{16FF1}" \
"\u{1BC9E}" \
"\u{1D165}-\u{1D169}" \
@@ -216,6 +231,11 @@ module UnicodeNormalize # :nodoc:
"\u{1E2AE}" \
"\u{1E2EC}-\u{1E2EF}" \
"\u{1E4EC}-\u{1E4EF}" \
+ "\u{1E5EE}\u{1E5EF}" \
+ "\u{1E6E3}" \
+ "\u{1E6E6}" \
+ "\u{1E6EE}\u{1E6EF}" \
+ "\u{1E6F5}" \
"\u{1E8D0}-\u{1E8D6}" \
"\u{1E944}-\u{1E94A}" \
"]"
@@ -441,15 +461,25 @@ module UnicodeNormalize # :nodoc:
"\uFB40\uFB41" \
"\uFB43\uFB44" \
"\uFB46-\uFB4E" \
+ "\u{105C9}" \
+ "\u{105E4}" \
"\u{1109A}" \
"\u{1109C}" \
"\u{110AB}" \
"\u{1112E}\u{1112F}" \
"\u{1134B}\u{1134C}" \
+ "\u{11383}" \
+ "\u{11385}" \
+ "\u{1138E}" \
+ "\u{11391}" \
+ "\u{113C5}" \
+ "\u{113C7}\u{113C8}" \
"\u{114BB}\u{114BC}" \
"\u{114BE}" \
"\u{115BA}\u{115BB}" \
"\u{11938}" \
+ "\u{16121}-\u{16128}" \
+ "\u{16D68}-\u{16D6A}" \
"\u{1D15E}-\u{1D164}" \
"\u{1D1BB}-\u{1D1C0}" \
"\u{2F800}-\u{2FA1D}" \
@@ -613,14 +643,25 @@ module UnicodeNormalize # :nodoc:
"\u30DB" \
"\u30EF-\u30F2" \
"\u30FD" \
+ "\u{105D2}" \
+ "\u{105DA}" \
"\u{11099}" \
"\u{1109B}" \
"\u{110A5}" \
"\u{11131}\u{11132}" \
"\u{11347}" \
+ "\u{11382}" \
+ "\u{11384}" \
+ "\u{1138B}" \
+ "\u{11390}" \
+ "\u{113C2}" \
"\u{114B9}" \
"\u{115B8}\u{115B9}" \
"\u{11935}" \
+ "\u{1611E}" \
+ "\u{16129}" \
+ "\u{16D63}" \
+ "\u{16D67}" \
"]?#{accents}+" \
"|#{'' # precomposed Hangul syllables
}" \
@@ -891,6 +932,10 @@ module UnicodeNormalize # :nodoc:
"\u30F4" \
"\u30F7-\u30FA" \
"\u30FD\u30FE" \
+ "\u{105C9}" \
+ "\u{105D2}" \
+ "\u{105DA}" \
+ "\u{105E4}" \
"\u{11099}-\u{1109C}" \
"\u{110A5}" \
"\u{110AB}" \
@@ -898,12 +943,23 @@ module UnicodeNormalize # :nodoc:
"\u{11131}\u{11132}" \
"\u{11347}" \
"\u{1134B}\u{1134C}" \
+ "\u{11382}-\u{11385}" \
+ "\u{1138B}" \
+ "\u{1138E}" \
+ "\u{11390}\u{11391}" \
+ "\u{113C2}" \
+ "\u{113C5}" \
+ "\u{113C7}\u{113C8}" \
"\u{114B9}" \
"\u{114BB}\u{114BC}" \
"\u{114BE}" \
"\u{115B8}-\u{115BB}" \
"\u{11935}" \
"\u{11938}" \
+ "\u{1611E}" \
+ "\u{16121}-\u{16129}" \
+ "\u{16D63}" \
+ "\u{16D67}-\u{16D6A}" \
"]?#{accents}+" \
"|#{'' # Hangul syllables with separate trailer
}" \
@@ -1410,7 +1466,7 @@ module UnicodeNormalize # :nodoc:
"\u3280-\u33FF" \
"\uA69C\uA69D" \
"\uA770" \
- "\uA7F2-\uA7F4" \
+ "\uA7F1-\uA7F4" \
"\uA7F8\uA7F9" \
"\uAB5C-\uAB5F" \
"\uAB69" \
@@ -1440,6 +1496,7 @@ module UnicodeNormalize # :nodoc:
"\u{10781}-\u{10785}" \
"\u{10787}-\u{107B0}" \
"\u{107B2}-\u{107BA}" \
+ "\u{1CCD6}-\u{1CCF9}" \
"\u{1D400}-\u{1D454}" \
"\u{1D456}-\u{1D49C}" \
"\u{1D49E}\u{1D49F}" \
@@ -1789,6 +1846,7 @@ module UnicodeNormalize # :nodoc:
"\u0859"=>220,
"\u085A"=>220,
"\u085B"=>220,
+ "\u0897"=>230,
"\u0898"=>230,
"\u0899"=>220,
"\u089A"=>220,
@@ -1967,6 +2025,33 @@ module UnicodeNormalize # :nodoc:
"\u1ACC"=>230,
"\u1ACD"=>230,
"\u1ACE"=>230,
+ "\u1ACF"=>230,
+ "\u1AD0"=>230,
+ "\u1AD1"=>230,
+ "\u1AD2"=>230,
+ "\u1AD3"=>230,
+ "\u1AD4"=>230,
+ "\u1AD5"=>230,
+ "\u1AD6"=>230,
+ "\u1AD7"=>230,
+ "\u1AD8"=>230,
+ "\u1AD9"=>230,
+ "\u1ADA"=>230,
+ "\u1ADB"=>230,
+ "\u1ADC"=>230,
+ "\u1ADD"=>220,
+ "\u1AE0"=>230,
+ "\u1AE1"=>230,
+ "\u1AE2"=>230,
+ "\u1AE3"=>230,
+ "\u1AE4"=>230,
+ "\u1AE5"=>230,
+ "\u1AE6"=>220,
+ "\u1AE7"=>230,
+ "\u1AE8"=>230,
+ "\u1AE9"=>230,
+ "\u1AEA"=>230,
+ "\u1AEB"=>234,
"\u1B34"=>7,
"\u1B44"=>9,
"\u1B6B"=>230,
@@ -2234,8 +2319,15 @@ module UnicodeNormalize # :nodoc:
"\u{10D25}"=>230,
"\u{10D26}"=>230,
"\u{10D27}"=>230,
+ "\u{10D69}"=>230,
+ "\u{10D6A}"=>230,
+ "\u{10D6B}"=>230,
+ "\u{10D6C}"=>230,
+ "\u{10D6D}"=>230,
"\u{10EAB}"=>230,
"\u{10EAC}"=>230,
+ "\u{10EFA}"=>220,
+ "\u{10EFB}"=>220,
"\u{10EFD}"=>220,
"\u{10EFE}"=>220,
"\u{10EFF}"=>220,
@@ -2286,6 +2378,9 @@ module UnicodeNormalize # :nodoc:
"\u{11372}"=>230,
"\u{11373}"=>230,
"\u{11374}"=>230,
+ "\u{113CE}"=>9,
+ "\u{113CF}"=>9,
+ "\u{113D0}"=>9,
"\u{11442}"=>9,
"\u{11446}"=>7,
"\u{1145E}"=>230,
@@ -2313,6 +2408,7 @@ module UnicodeNormalize # :nodoc:
"\u{11D97}"=>9,
"\u{11F41}"=>9,
"\u{11F42}"=>9,
+ "\u{1612F}"=>9,
"\u{16AF0}"=>1,
"\u{16AF1}"=>1,
"\u{16AF2}"=>1,
@@ -2416,6 +2512,13 @@ module UnicodeNormalize # :nodoc:
"\u{1E4ED}"=>232,
"\u{1E4EE}"=>220,
"\u{1E4EF}"=>230,
+ "\u{1E5EE}"=>230,
+ "\u{1E5EF}"=>220,
+ "\u{1E6E3}"=>230,
+ "\u{1E6E6}"=>230,
+ "\u{1E6EE}"=>230,
+ "\u{1E6EF}"=>230,
+ "\u{1E6F5}"=>230,
"\u{1E8D0}"=>220,
"\u{1E8D1}"=>220,
"\u{1E8D2}"=>220,
@@ -3928,6 +4031,8 @@ module UnicodeNormalize # :nodoc:
"\uFB4C"=>"\u05D1\u05BF",
"\uFB4D"=>"\u05DB\u05BF",
"\uFB4E"=>"\u05E4\u05BF",
+ "\u{105C9}"=>"\u{105D2}\u0307",
+ "\u{105E4}"=>"\u{105DA}\u0307",
"\u{1109A}"=>"\u{11099}\u{110BA}",
"\u{1109C}"=>"\u{1109B}\u{110BA}",
"\u{110AB}"=>"\u{110A5}\u{110BA}",
@@ -3935,12 +4040,30 @@ module UnicodeNormalize # :nodoc:
"\u{1112F}"=>"\u{11132}\u{11127}",
"\u{1134B}"=>"\u{11347}\u{1133E}",
"\u{1134C}"=>"\u{11347}\u{11357}",
+ "\u{11383}"=>"\u{11382}\u{113C9}",
+ "\u{11385}"=>"\u{11384}\u{113BB}",
+ "\u{1138E}"=>"\u{1138B}\u{113C2}",
+ "\u{11391}"=>"\u{11390}\u{113C9}",
+ "\u{113C5}"=>"\u{113C2}\u{113C2}",
+ "\u{113C7}"=>"\u{113C2}\u{113B8}",
+ "\u{113C8}"=>"\u{113C2}\u{113C9}",
"\u{114BB}"=>"\u{114B9}\u{114BA}",
"\u{114BC}"=>"\u{114B9}\u{114B0}",
"\u{114BE}"=>"\u{114B9}\u{114BD}",
"\u{115BA}"=>"\u{115B8}\u{115AF}",
"\u{115BB}"=>"\u{115B9}\u{115AF}",
"\u{11938}"=>"\u{11935}\u{11930}",
+ "\u{16121}"=>"\u{1611E}\u{1611E}",
+ "\u{16122}"=>"\u{1611E}\u{16129}",
+ "\u{16123}"=>"\u{1611E}\u{1611F}",
+ "\u{16124}"=>"\u{16129}\u{1611F}",
+ "\u{16125}"=>"\u{1611E}\u{16120}",
+ "\u{16126}"=>"\u{1611E}\u{1611E}\u{1611F}",
+ "\u{16127}"=>"\u{1611E}\u{16129}\u{1611F}",
+ "\u{16128}"=>"\u{1611E}\u{1611E}\u{16120}",
+ "\u{16D68}"=>"\u{16D67}\u{16D67}",
+ "\u{16D69}"=>"\u{16D63}\u{16D67}",
+ "\u{16D6A}"=>"\u{16D63}\u{16D67}\u{16D67}",
"\u{1D15E}"=>"\u{1D157}\u{1D165}",
"\u{1D15F}"=>"\u{1D158}\u{1D165}",
"\u{1D160}"=>"\u{1D158}\u{1D165}\u{1D16E}",
@@ -5839,6 +5962,7 @@ module UnicodeNormalize # :nodoc:
"\uA69C"=>"\u044A",
"\uA69D"=>"\u044C",
"\uA770"=>"\uA76F",
+ "\uA7F1"=>"S",
"\uA7F2"=>"C",
"\uA7F3"=>"F",
"\uA7F4"=>"Q",
@@ -6950,6 +7074,42 @@ module UnicodeNormalize # :nodoc:
"\u{107B8}"=>"\u01C2",
"\u{107B9}"=>"\u{1DF0A}",
"\u{107BA}"=>"\u{1DF1E}",
+ "\u{1CCD6}"=>"A",
+ "\u{1CCD7}"=>"B",
+ "\u{1CCD8}"=>"C",
+ "\u{1CCD9}"=>"D",
+ "\u{1CCDA}"=>"E",
+ "\u{1CCDB}"=>"F",
+ "\u{1CCDC}"=>"G",
+ "\u{1CCDD}"=>"H",
+ "\u{1CCDE}"=>"I",
+ "\u{1CCDF}"=>"J",
+ "\u{1CCE0}"=>"K",
+ "\u{1CCE1}"=>"L",
+ "\u{1CCE2}"=>"M",
+ "\u{1CCE3}"=>"N",
+ "\u{1CCE4}"=>"O",
+ "\u{1CCE5}"=>"P",
+ "\u{1CCE6}"=>"Q",
+ "\u{1CCE7}"=>"R",
+ "\u{1CCE8}"=>"S",
+ "\u{1CCE9}"=>"T",
+ "\u{1CCEA}"=>"U",
+ "\u{1CCEB}"=>"V",
+ "\u{1CCEC}"=>"W",
+ "\u{1CCED}"=>"X",
+ "\u{1CCEE}"=>"Y",
+ "\u{1CCEF}"=>"Z",
+ "\u{1CCF0}"=>"0",
+ "\u{1CCF1}"=>"1",
+ "\u{1CCF2}"=>"2",
+ "\u{1CCF3}"=>"3",
+ "\u{1CCF4}"=>"4",
+ "\u{1CCF5}"=>"5",
+ "\u{1CCF6}"=>"6",
+ "\u{1CCF7}"=>"7",
+ "\u{1CCF8}"=>"8",
+ "\u{1CCF9}"=>"9",
"\u{1D400}"=>"A",
"\u{1D401}"=>"B",
"\u{1D402}"=>"C",
@@ -9242,6 +9402,8 @@ module UnicodeNormalize # :nodoc:
"\u30F1\u3099"=>"\u30F9",
"\u30F2\u3099"=>"\u30FA",
"\u30FD\u3099"=>"\u30FE",
+ "\u{105D2}\u0307"=>"\u{105C9}",
+ "\u{105DA}\u0307"=>"\u{105E4}",
"\u{11099}\u{110BA}"=>"\u{1109A}",
"\u{1109B}\u{110BA}"=>"\u{1109C}",
"\u{110A5}\u{110BA}"=>"\u{110AB}",
@@ -9249,11 +9411,29 @@ module UnicodeNormalize # :nodoc:
"\u{11132}\u{11127}"=>"\u{1112F}",
"\u{11347}\u{1133E}"=>"\u{1134B}",
"\u{11347}\u{11357}"=>"\u{1134C}",
+ "\u{11382}\u{113C9}"=>"\u{11383}",
+ "\u{11384}\u{113BB}"=>"\u{11385}",
+ "\u{1138B}\u{113C2}"=>"\u{1138E}",
+ "\u{11390}\u{113C9}"=>"\u{11391}",
+ "\u{113C2}\u{113C2}"=>"\u{113C5}",
+ "\u{113C2}\u{113B8}"=>"\u{113C7}",
+ "\u{113C2}\u{113C9}"=>"\u{113C8}",
"\u{114B9}\u{114BA}"=>"\u{114BB}",
"\u{114B9}\u{114B0}"=>"\u{114BC}",
"\u{114B9}\u{114BD}"=>"\u{114BE}",
"\u{115B8}\u{115AF}"=>"\u{115BA}",
"\u{115B9}\u{115AF}"=>"\u{115BB}",
"\u{11935}\u{11930}"=>"\u{11938}",
+ "\u{1611E}\u{1611E}"=>"\u{16121}",
+ "\u{1611E}\u{16129}"=>"\u{16122}",
+ "\u{1611E}\u{1611F}"=>"\u{16123}",
+ "\u{16129}\u{1611F}"=>"\u{16124}",
+ "\u{1611E}\u{16120}"=>"\u{16125}",
+ "\u{16121}\u{1611F}"=>"\u{16126}",
+ "\u{16122}\u{1611F}"=>"\u{16127}",
+ "\u{16121}\u{16120}"=>"\u{16128}",
+ "\u{16D67}\u{16D67}"=>"\u{16D68}",
+ "\u{16D63}\u{16D67}"=>"\u{16D69}",
+ "\u{16D69}\u{16D67}"=>"\u{16D6A}",
}.freeze
end