Compute equivalence classes (diacritics stripping) only
Jarkko Hietaniemi [Mon, 9 Aug 1999 10:20:40 +0000 (10:20 +0000)]
for letters, not for ligatures.

p4raw-id: //depot/cfgperl@3936

lib/unicode/Eq/Unicode
lib/unicode/mktables.PL

index 6282b37..98d31df 100644 (file)
 01F3 01C6
 0259 025A
 025C 025D
+0262 029B
 026F 0270
 0279 027A 027B
 0283 0286
 0292 01BA 01EF 0293
+0294 02A1
+0296 01BE
 02A3 02A5
+02B0 02B1
+02B4 02B5
 0391 0386 1F08 1F09 1F0A 1F0B 1F0C 1F0D 1F0E 1F0F 1F88 1F89 1F8A 1F8B 1F8C 1F8D 1F8E 1F8F 1FB8 1FB9 1FBA 1FBB 1FBC
 0395 0388 1F18 1F19 1F1A 1F1B 1F1C 1F1D 1FC8 1FC9
 0397 0389 1F28 1F29 1F2A 1F2B 1F2C 1F2D 1F2E 1F2F 1F98 1F99 1F9A 1F9B 1F9C 1F9D 1F9E 1F9F 1FCA 1FCB 1FCC
 03C1 1FE4 1FE5
 03C5 03B0 03CB 03CD 1F50 1F51 1F52 1F53 1F54 1F55 1F56 1F57 1F7A 1F7B 1FE0 1FE1 1FE2 1FE3 1FE6 1FE7
 03C9 03CE 1F60 1F61 1F62 1F63 1F64 1F65 1F66 1F67 1F7C 1F7D 1FA0 1FA1 1FA2 1FA3 1FA4 1FA5 1FA6 1FA7 1FF2 1FF3 1FF4 1FF6 1FF7
-0410 04D0 04D2 04D4
-0413 0490 0492 0494 04A4
-0415 04D4 04D6
+0410 04D0 04D2
+0413 0490 0492 0494
+0415 04D6
 0416 0496 04C1 04DC
 0417 0498 04DE
 0418 04E2 04E4
 041A 049A 049C 049E 04C3
-041D 04A2 04A4 04C7
+041D 04A2 04C7
 041E 04E6
 041F 04A6
 0421 04AA
-0422 04AC 04B4
+0422 04AC
 0423 04EE 04F0 04F2
 0425 04B2
-0426 04B4
 0427 04B6 04B8 04F4
 042B 04F8
-0430 04D1 04D3 04D5
-0433 0491 0493 0495 04A5
-0435 04D5 04D7
+0430 04D1 04D3
+0433 0491 0493 0495
+0435 04D7
 0436 0497 04C2 04DD
 0437 0499 04DF
 0438 04E3 04E5
 043A 049B 049D 049F 04C4
-043D 04A3 04A5 04C8
+043D 04A3 04C8
 043E 04E7
 043F 04A7
 0441 04AB
-0442 04AD 04B5
+0442 04AD
 0443 04EF 04F1 04F3
 0445 04B3
-0446 04B5
 0447 04B7 04B9 04F5
 044B 04F9
 0460 047C
 04D9 04DB
 04E8 04EA
 04E9 04EB
-0565 0587 FB14
-056B FB15
-056D FB17
-0574 FB13 FB14 FB15 FB17
-0576 FB13 FB16
-057E FB16
-0582 0587
-0627 0622 0623 0625 0672 0673 FD3C FD3D
-0628 FC05 FC06 FC07 FC08 FC09 FC0A FC6A FC6B FC6C FC6D FC6E FC6F FC9C FC9D FC9E FC9F FCA0 FCE1 FCE2 FD9E FDC2
-062A 067C 067D FC0B FC0C FC0D FC0E FC0F FC10 FC70 FC71 FC72 FC73 FC74 FC75 FCA1 FCA2 FCA3 FCA4 FCA5 FCE3 FCE4 FD50 FD51 FD52 FD53 FD54 FD55 FD56 FD57 FD9F FDA0 FDA1 FDA2 FDA3 FDA4
-062B FC11 FC12 FC13 FC14 FC76 FC77 FC78 FC79 FC7A FC7B FCA6 FCE5 FCE6
-062C FC15 FC16 FCA7 FCA8 FD01 FD02 FD1D FD1E FD58 FD59 FDA5 FDA6 FDA7 FDBE
-062D 0681 0682 0685 FC17 FC18 FCA9 FCAA FCFF FD00 FD1B FD1C FD5A FD5B FDBF
-062E FC19 FC1A FC1B FCAB FCAC FD03 FD04 FD1F FD20
+05D0 FB2E FB2F FB30
+05D1 FB31 FB4C
+05D2 FB32
+05D3 FB33
+05D4 FB34
+05D5 FB35 FB4B
+05D6 FB36
+05D8 FB38
+05D9 FB39
+05DA FB3A
+05DB FB3B FB4D
+05DC FB3C
+05DE FB3E
+05E0 FB40
+05E1 FB41
+05E3 FB43
+05E4 FB44 FB4E
+05E6 FB46
+05E7 FB47
+05E8 FB48
+05E9 FB2A FB2B FB2C FB2D FB49
+05EA FB4A
+0627 0622 0623 0625 0672 0673 FE81 FE82 FE83 FE84 FE87 FE88
+062A 067C 067D
+062D 0681 0682 0685
 062F 0689 068A 068B 068F 0690
-0630 FC5B
-0631 0692 0693 0694 0695 0696 0697 0699 FC5C
-0633 069A 069B 069C FC1C FC1D FC1E FC1F FCAD FCAE FCAF FCB0 FCE7 FCE8 FCFB FCFC FD0E FD17 FD18 FD2A FD31 FD34 FD35 FD36 FD5C FD5D FD5E FD5F FD60 FD61 FD62 FD63 FDA8 FDC6
-0634 FCE9 FCEA FCFD FCFE FD09 FD0A FD0B FD0C FD0D FD19 FD1A FD25 FD26 FD27 FD28 FD29 FD2D FD2E FD2F FD30 FD32 FD37 FD38 FD39 FD67 FD68 FD69 FD6A FD6B FD6C FD6D FDAA
-0635 069D 069E FC20 FC21 FCB1 FCB2 FCB3 FD05 FD06 FD0F FD21 FD22 FD2B FD64 FD65 FD66 FDA9 FDC5
-0636 FC22 FC23 FC24 FC25 FCB4 FCB5 FCB6 FCB7 FD07 FD08 FD10 FD23 FD24 FD2C FD6E FD6F FD70 FDAB
-0637 069F FC26 FC27 FCB8 FCF5 FCF6 FD11 FD12 FD33 FD3A FD71 FD72 FD73 FD74
-0638 FC28 FCB9 FD3B
-0639 06A0 FC29 FC2A FCBA FCBB FCF7 FCF8 FD13 FD14 FD75 FD76 FD77 FD78 FDB6 FDC4
-063A FC2B FC2C FCBC FCBD FCF9 FCFA FD15 FD16 FD79 FD7A FD7B
-0641 06A2 06A3 06A5 FC2D FC2E FC2F FC30 FC31 FC32 FC7C FC7D FCBE FCBF FCC0 FCC1 FD7C FD7D FDC1
-0642 06A7 06A8 FC33 FC34 FC35 FC36 FC7E FC7F FCC2 FCC3 FD7E FD7F FDB2 FDB4
-0643 06AB 06AC 06AE FC37 FC38 FC39 FC3A FC3B FC3C FC3D FC3E FC80 FC81 FC82 FC83 FC84 FCC4 FCC5 FCC6 FCC7 FCC8 FCEB FCEC FDB7 FDBB FDC3
-0644 06B5 06B6 06B7 FC3F FC40 FC41 FC42 FC43 FC44 FC85 FC86 FC87 FCC9 FCCA FCCB FCCC FCCD FCED FD80 FD81 FD82 FD83 FD84 FD85 FD86 FD87 FD88 FDAC FDAD FDB5 FDBA FDBC FEF5 FEF6 FEF7 FEF8 FEF9 FEFA FEFB FEFC
-0645 FC45 FC46 FC47 FC48 FC49 FC4A FC88 FC89 FCCE FCCF FCD0 FCD1 FD89 FD8A FD8B FD8C FD8D FD8E FD8F FD92 FDB1 FDB9 FDC0
-0646 06BC 06BD FC4B FC4C FC4D FC4E FC4F FC50 FC8A FC8B FC8C FC8D FC8E FC8F FCD2 FCD3 FCD4 FCD5 FCD6 FCEE FCEF FD95 FD96 FD97 FD98 FD99 FD9A FD9B FDB3 FDB8 FDBD FDC7
-0647 06C0 FC51 FC52 FC53 FC54 FCD7 FCD8 FCD9 FD93 FD94
-0648 0624 06C4 06CA
-0649 FC5D FC90
-064A 0626 06CD 06CE 06D1 FBEA FBEB FBEC FBED FBEE FBEF FBF0 FBF1 FBF2 FBF3 FBF4 FBF5 FBF6 FBF7 FBF8 FC00 FC01 FC02 FC03 FC04 FC55 FC56 FC57 FC58 FC59 FC5A FC64 FC65 FC66 FC67 FC68 FC69 FC91 FC92 FC93 FC94 FC95 FC96 FC97 FC98 FC99 FC9A FC9B FCDA FCDB FCDC FCDD FCDE FCDF FCE0 FCF0 FCF1 FD9C FD9D FDAE FDAF FDB0
+0631 0692 0693 0694 0695 0696 0697 0699
+0633 069A 069B 069C
+0635 069D 069E
+0637 069F
+0639 06A0
+0641 06A2 06A3 06A5
+0642 06A7 06A8
+0643 06AB 06AC 06AE
+0644 06B5 06B6 06B7
+0646 06BC 06BD
+0647 06C0 FBA4 FBA5
+0648 0624 06C4 06CA FE85 FE86
+064A 0626 06CD 06CE 06D1 FE89 FE8A FE8B FE8C
 06AF 06B0 06B2 06B4
-06C7 0677
-FBD7 FBDD
-FE8D FD3D FE81 FE83 FE87
-FE8E FD3C FE82 FE84 FE88
-FE8F FC05 FC06 FC07 FC08 FC09 FC0A
-FE90 FC6A FC6B FC6C FC6D FC6E FC6F FD9E FDC2
-FE91 FC9C FC9D FC9E FC9F FCA0
-FE92 FCE1 FCE2
-FE95 FC0B FC0C FC0D FC0E FC0F FC10
-FE96 FC70 FC71 FC72 FC73 FC74 FC75 FD51 FD9F FDA0 FDA1 FDA2 FDA3 FDA4
-FE97 FCA1 FCA2 FCA3 FCA4 FCA5 FD50 FD52 FD53 FD54 FD55 FD56 FD57
-FE98 FCE3 FCE4
-FE99 FC11 FC12 FC13 FC14
-FE9A FC76 FC77 FC78 FC79 FC7A FC7B
-FE9B FCA6
-FE9C FCE5 FCE6
-FE9D FC15 FC16 FD01 FD02
-FE9E FD1D FD1E FD58 FDA5 FDA6 FDA7 FDBE
-FE9F FCA7 FCA8 FD59
-FEA1 FC17 FC18 FCFF FD00
-FEA2 FD1B FD1C FD5A FD5B FDBF
-FEA3 FCA9 FCAA
-FEA5 FC19 FC1A FC1B FD03 FD04
-FEA6 FD1F FD20
-FEA7 FCAB FCAC
-FEAB FC5B
-FEAD FC5C
-FEB1 FC1C FC1D FC1E FC1F FCFB FCFC FD0E
-FEB2 FD17 FD18 FD2A FD5E FD5F FD62 FDA8 FDC6
-FEB3 FCAD FCAE FCAF FCB0 FD31 FD5C FD5D FD60 FD61 FD63
-FEB4 FCE7 FCE8 FD34 FD35 FD36
-FEB5 FCFD FCFE FD09 FD0A FD0B FD0C FD0D
-FEB6 FD19 FD1A FD25 FD26 FD27 FD28 FD29 FD67 FD69 FD6A FD6C FDAA
-FEB7 FD2D FD2E FD2F FD30 FD32 FD68 FD6B FD6D
-FEB8 FCE9 FCEA FD37 FD38 FD39
-FEB9 FC20 FC21 FD05 FD06 FD0F
-FEBA FD21 FD22 FD2B FD64 FD66 FDA9
-FEBB FCB1 FCB2 FCB3 FD65 FDC5
-FEBD FC22 FC23 FC24 FC25 FD07 FD08 FD10
-FEBE FD23 FD24 FD2C FD6E FD6F FDAB
-FEBF FCB4 FCB5 FCB6 FCB7 FD70
-FEC1 FC26 FC27 FCF5 FCF6
-FEC2 FD11 FD12 FD71 FD74
-FEC3 FCB8 FD33 FD72 FD73
-FEC4 FD3A
-FEC5 FC28
-FEC7 FCB9
-FEC8 FD3B
-FEC9 FC29 FC2A FCF7 FCF8
-FECA FD13 FD14 FD75 FD76 FD78 FDB6
-FECB FCBA FCBB FD77 FDC4
-FECD FC2B FC2C FCF9 FCFA
-FECE FD15 FD16 FD79 FD7A FD7B
-FECF FCBC FCBD
-FED1 FC2D FC2E FC2F FC30 FC31 FC32
-FED2 FC7C FC7D FD7C FDC1
-FED3 FCBE FCBF FCC0 FCC1 FD7D
-FED5 FC33 FC34 FC35 FC36
-FED6 FC7E FC7F FD7E FD7F FDB2
-FED7 FCC2 FCC3 FDB4
-FED9 FC37 FC38 FC39 FC3A FC3B FC3C FC3D FC3E
-FEDA FC80 FC81 FC82 FC83 FC84 FDB7 FDBB
-FEDB FCC4 FCC5 FCC6 FCC7 FCC8 FDC3
-FEDC FCEB FCEC
-FEDD FC3F FC40 FC41 FC42 FC43 FC44 FEF5 FEF7 FEF9 FEFB
-FEDE FC85 FC86 FC87 FD80 FD81 FD82 FD84 FD85 FD87 FDAC FDAD FDBC FEF6 FEF8 FEFA FEFC
-FEDF FCC9 FCCA FCCB FCCC FCCD FD83 FD86 FD88 FDB5 FDBA
-FEE0 FCED
-FEE1 FC45 FC46 FC47 FC48 FC49 FC4A
-FEE2 FC88 FC89 FD8B FDB1 FDB9 FDC0
-FEE3 FCCE FCCF FCD0 FCD1 FD89 FD8A FD8C FD8D FD8E FD8F FD92
-FEE5 FC4B FC4C FC4D FC4E FC4F FC50
-FEE6 FC8A FC8B FC8C FC8D FC8E FC8F FD96 FD97 FD99 FD9A FD9B FDB3 FDBD FDC7
-FEE7 FCD2 FCD3 FCD4 FCD5 FCD6 FD95 FD98 FDB8
-FEE8 FCEE FCEF
-FEE9 FBA4 FC51 FC52 FC53 FC54
-FEEA FBA5
-FEEB FCD7 FCD8 FCD9 FD93 FD94
-FEED FE85
-FEEE FE86
-FEEF FC5D
-FEF0 FC90
-FEF1 FBEA FBEC FBEE FBF0 FBF2 FBF4 FBF6 FC00 FC01 FC02 FC03 FC04 FC55 FC56 FC57 FC58 FC59 FC5A FE89
-FEF2 FBEB FBED FBEF FBF1 FBF3 FBF5 FBF7 FC64 FC65 FC66 FC67 FC68 FC69 FC91 FC92 FC93 FC94 FC95 FC96 FD9C FDAE FDAF FDB0 FE8A
-FEF3 FBF8 FC97 FC98 FC99 FC9A FC9B FCDA FCDB FCDC FCDD FCDE FD9D FE8B
-FEF4 FCDF FCE0 FCF0 FCF1 FE8C
+06C1 06C2
+06C7 0677 FBDD
+06D2 06D3 FBB0 FBB1
+09B0 09F0 09F1
index fcc8eac..b2dce49 100755 (executable)
@@ -9,6 +9,74 @@ mkdir "Is", 0777;
 mkdir "To", 0777;
 mkdir "Eq", 0777;
 
+open(UNICODEDATA, $UnicodeData) || die "$0: $UnicodeData: $!\n";
+
+while (<UNICODEDATA>) {
+    ($code, $name) = split /;/;
+    
+    $code{$name} = $code;
+    $name{$code} = $name;
+
+    next unless $name =~ /^(.+? LETTER .+?) WITH .+( \w+ FORM)?$/;
+
+    push @base, [ $code, $1 ];
+    push @base, [ $code, $1.$2 ] if $2 ne '';
+
+    # Before this "diacritics stripping" phase (and for Arabic, also
+    # "form stripping" phase) all ligatures could be decomposed into
+    # their constituent letters.
+    #
+    # For example the ligature
+    # ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+    # would go first through ligature decomposition producing the two letters
+    # ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+    # ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+    # and those with diacritics stripping
+    # ARABIC LETTER YEH ISOLATED FORM
+    # ARABIC LETTER ALEF ISOLATED FORM
+    # and those with the Arabic form stripping
+    # ARABIC LETTER YEH
+    # ARABIC LETTER ALEF ISOLATED FORM
+    # ARABIC LETTER YEH
+    # ARABIC LETTER ALEF ISOLATED FORM
+    #
+    # Similarly for ligatures from other scripts.
+    # Effectively this would mean that ligatures turn into categories
+    # (Unicodese for character classes).
+}
+
+foreach my $b (@base) {
+    ($code, $base) = @$b;
+    next unless exists $code{$base};
+    push @{$unicode{$code{$base}}}, $code;
+#   print "$code: $name{$code} -> $base\n",
+}
+
+@unicode = sort keys %unicode;
+
+print "Eq/Unicode\n";
+if (open(EQ_UNICODE, ">Eq/Unicode")) {
+    foreach my $c (@unicode) {
+       print EQ_UNICODE "$c @{$unicode{$c}}\n";
+    }
+    close EQ_UNICODE;
+} else {
+    die "$0: failed to open Eq/Unicode for writing: $!\n";
+}
+
+print "Eq/Latin1\n";
+if (open(EQ_LATIN1, ">Eq/Latin1")) {
+    foreach my $c (@unicode) {
+       last if hex($c) > 255;
+       my @c = grep { hex($_) <= 255 } @{$unicode{$c}};
+       next unless @c;
+       print EQ_LATIN1 "$c @c\n";
+    }
+    close EQ_LATIN1;
+} else {
+    die "$0: failed to open Eq/Latin1 for writing: $!\n";
+}
+
 @todo = (
 # typical
 
@@ -304,74 +372,4 @@ END
 
 # Create the equivalence mappings.
 
-open(UNICODEDATA, $UnicodeData) || die "$0: $UnicodeData: $!\n";
-
-while (<UNICODEDATA>) {
-    ($code, $name) = split /;/;
-    
-    $code{$name} = $code;
-    $name{$code} = $name;
-
-    if ($name =~ /^((?:LATIN|GREEK|CYRILLIC|HEBREW|BENGALI) .+? LETTER .+?) WITH /) {
-       push @base, [ $code, $1 ];
-    } elsif ($name =~ /^(ARABIC LETTER \w+?) WITH .+ (\w+ FORM)$/) {
-       push @base, [ $code, "$1 $2" ];
-    } elsif ($name =~ /^(ARABIC LETTER \w+?) WITH /) {
-       push @base, [ $code, $1 ];
-# Is the concept of turning ligatures into character classes sound?
-    } elsif ($name =~ /^(ARABIC) LIGATURE (.+?) (WITH .+ )+(\w+ FORM)$/) {
-       my $script = $1;
-       my $base   = $2;
-       my $with   = $3;
-       my $form   = $4;
-       push @base, [ $code, "$script LETTER $base" ];
-       push @base, [ $code, "$script LETTER $base $form" ];
-       my @with = split(/\bWITH\s+/, $with);
-       shift @with;
-       @with = grep { ! /^ (?:ABOVE|BELOW)/ } @with;
-       foreach my $base (@with) {
-           push @base, [ $code, "$script LETTER $base" ];
-           push @base, [ $code, "$script LETTER $base $form" ];
-       }
-    } elsif ($name =~ /^((?:ARMENIAN|CYRILLIC) .+) LIGATURE (\w+) (\w+)$/) {
-       push @base, [ $code, "$1 LETTER $2" ];
-       push @base, [ $code, "$1 LETTER $3" ];
-# Latin ligatures (ae, oe, ij, ff, fi, fl, ffi, ffl, long st, st) ignored.
-# Hebrew Yiddish ligatures (double vav, vav yod, double yod, yod yod patah,
-# alef lamed) ignored.
-    } else {
-       next;
-    }
-
-}
-
-foreach my $b (@base) {
-    ($code, $base) = @$b;
-    next unless exists $code{$base};
-    push @{$unicode{$code{$base}}}, $code;
-    print "$code: $name{$code} -> $base\n",
-}
-
-@unicode = sort keys %unicode;
-
-if (open(EQ_UNICODE, ">Eq/Unicode")) {
-    foreach my $c (@unicode) {
-       print EQ_UNICODE "$c @{$unicode{$c}}\n";
-    }
-    close EQ_UNICODE;
-} else {
-    die "$0: failed to open Eq/Unicode for writing: $!\n";
-}
-
-if (open(EQ_LATIN1, ">Eq/Latin1")) {
-    foreach my $c (@unicode) {
-       last if hex($c) > 255;
-       my @c = grep { hex($_) <= 255 } @{$unicode{$c}};
-       next unless @c;
-       print EQ_LATIN1 "$c @c\n";
-    }
-    close EQ_LATIN1;
-} else {
-    die "$0: failed to open Eq/Latin1 for writing: $!\n";
-}