keyboard/altgr/index: move ctrl rows to distinct inventory mode
[sheet.git] / Shiar_Sheet / KeyboardChars.pm
index b2ee11d615c7ade7d5bd1ed403e38cc22e56e73e..7077d3c863236c3f594b266a3572835efecb406e 100644 (file)
@@ -9,14 +9,14 @@ use Unicode::Normalize qw( NFKD );
 use Text::Unidecode ();
 use Shiar_Sheet::FormatChar;
 
-our $VERSION = '1.04';
+our $VERSION = '1.05';
 our @EXPORT = qw( kbchars kbmodes );
 
 my $uc = Shiar_Sheet::FormatChar->new;
 
 our %unaccent = qw(
        ⍺ a  ⍵ w  ∊ E  ⍷ E  ⍴ r  ⍳ i  ⍸ i  ○ O  ⍥ O  ⌿ /  ⍟ (*) ⊕ (+)
-       Ʊ U  ǝ e  Ǝ E  ʌ v       ɥ h  ʘ O  ɰ mw ɯ mw Ɯ MW ə @ae Ə @AE
+       Ʊ U  ǝ e  Ǝ E  ʌ vA Ʌ VA ɥ h  ʘ O  ɰ mw ɯ mw Ɯ MW ə @ae Ə @AE
        ɸ PF ʎ yl ɔ co Ɔ CO ɛ 3E ƣ q  Ƣ Q  ∀ A  ∃ E  ∪ u  ∩ n   ≠ !=
        ≈ =~ ∅ /0 ∘ o  ⋅ .  ∫ s  ≝ =d ″ "  ≤ <  ≥ >  √ rV ∛ 3V  ∜ 4V
        Α A  Β B  Γ G  Δ D  Ε E  Ζ Z  Η H  Θ CQ Ι I  Κ K  Λ L  Μ M
@@ -42,28 +42,34 @@ sub kbmodes ($modes) {
        );
        for my $lead (keys %{$modes}) {
                if ($lead ne '') {
-                       $info{def}->{''}->{$lead} = "g1 mode$lead";
+                       $info{def}->{''}->{$lead}[0] = "g1 mode$lead";
                        $g{g1} = 1;
                        $info{mode}->{$lead} //= "mode $lead";
-                       $info{def}->{$lead}{$lead} = 'g1 mode'; # back
+                       $info{def}->{$lead}{$lead} = ['g1 mode']; # back
                }
                while (my ($k, $v) = each %{ $modes->{$lead} }) {
+                       my @class;
+                       if (ref $v eq 'SCALAR') {
+                               my ($reflead, $ref) = split /(.)$/, ${$v};
+                               $v = $modes->{$reflead}->{$ref};
+                               @class = 'ext';
+                       }
                        my ($glyph, $title) = $uc->glyph_html($v);
-                       $info{key}{$lead.$k} = join "\n", $glyph, $title;
                        my $c = $k =~ s/\A[+^](?=.)//r;  # trim modifier indicator
 
-                       my $class = (
+                       unshift @class, (
                                  !defined $v || $c eq $v ? 'no' # identical
                                : $v =~ /\A\p{Mn}+\z/ ? 'g9' # combining accent
-                               : NFKD($v) =~ /\Q$c/ ? 'g2' # decomposed equivalent
+                               : NFKD($v) =~ /\A\Q$c\E\p{Mn}*\z/ ? 'g2' # decomposed equivalent
                                : unidecode($v) =~ /\Q$c\E+/i ? 'g4' # transliterated
                                : $v =~ /\A[\p{Sk}\p{Lm}]+\z/ ? 'g8' # modifier symbol
                                : $v =~ /\A[\pM\pP]+\z/ ? 'g7' # mark
                                : $v =~ /^\p{Latin}/ ? 'g5' # latin script
                                : 'g6'
                        );
-                       $g{$class} = 1 unless $class eq 'no';
-                       $info{def}{$lead}{$k} //= $class;
+                       $g{$_} = 1 for grep { $_ ne 'no' } @class;
+                       $info{def}{$lead}{$k} //= [join ' ', @class];
+                       $info{def}{$lead}{$k}[1] = join "\n", $glyph, $title;
                }
        }
        $info{flag} = {%{{
@@ -75,6 +81,7 @@ sub kbmodes ($modes) {
                g7 => ['punctuation', "(punctuation) mark"],
                g8 => ['mark', "modifier letter or mark (spacing diacritic)"],
                g9 => ['combining', "diacritical mark to be combined with a following character"],
+               ext => ['alias', 'alternative with identical results as something else'],
        }}{keys %g}};
        return \%info;
 }