keyboard/altgr: classify glyphs within submodes
authorMischa POSLAWSKY <perl@shiar.org>
Sun, 31 Dec 2023 03:25:19 +0000 (04:25 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Mon, 1 Jan 2024 08:32:50 +0000 (09:32 +0100)
keyboard/altgr/eurkey.eng.inc.pl
keyboard/altgr/groups.inc.pl
keyboard/altgr/macos-abc.eng.inc.pl

index b2a98cbc0f422076954109a1891e7a73b4e000a2..33550f997097b33ffc2b7194172c5c8e2b1618f5 100644 (file)
@@ -6,28 +6,8 @@ do './keyboard/altgr/groups.inc.pl';
 my $V = v1.3;
 
 my $presymbol = $V ge v1.3 ? '\\' : '-';
-my %arrows = (
-       'h' => '←',
-       'H' => '⇐',
-       'j' => '↓',
-       'J' => '⇓',
-       'k' => '↑',
-       'K' => '⇑',
-       'l' => '→',
-       'L' => '⇒',
-       'u' => '↖',
-       'U' => '⇖',
-       'i' => '↗',
-       'I' => '⇗',
-       'n' => '↙',
-       'N' => '⇙',
-       'm' => '↘',
-       'M' => '⇘',
-       '=' => '↔',
-       '+' => '⇔',
-);
-
 my %rows = (
+       '' => {
        '1' => '¡',
        '!' => '¹',
        '2' => 'ª',
@@ -124,167 +104,179 @@ my %rows = (
        '>' => 'Ó',
        '/' => '¿',
        '?' => '…',
+       },
 
        # greek
-       'ma' => 'α',
-       'mb' => 'β', # v
-       'mg' => 'γ',
-       'md' => 'δ',
-       'me' => 'ε',
-       'mz' => 'ζ',
-       'mi' => 'η',
-       'mh' => 'θ',
-       'mj' => 'ι',
-       'mk' => 'κ',
-       'ml' => 'λ',
-       'mm' => 'μ',
-       'mn' => 'ν',
-       'mx' => 'ξ',
-       'mo' => 'ο',
-       'mp' => 'π',
-       'mr' => 'ρ',
-       'ms' => 'σ',
-       'mt' => 'τ',
-       'my' => 'υ',
-       'mf' => 'φ',
-       'mc' => 'χ',
-       'mw' => 'ψ',
-       'mq' => 'ω', # u
+       'm' => {
+               'a' => 'α',
+               'b' => 'β', # v
+               'g' => 'γ',
+               'd' => 'δ',
+               'e' => 'ε',
+               'z' => 'ζ',
+               'i' => 'η',
+               'h' => 'θ',
+               'j' => 'ι',
+               'k' => 'κ',
+               'l' => 'λ',
+               'm' => 'μ',
+               'n' => 'ν',
+               'x' => 'ξ',
+               'o' => 'ο',
+               'p' => 'π',
+               'r' => 'ρ',
+               's' => 'σ',
+               't' => 'τ',
+               'y' => 'υ',
+               'f' => 'φ',
+               'c' => 'χ',
+               'w' => 'ψ',
+               'q' => 'ω', # u
 
-       # suþscript
-       'm1' => '¹',
-       'm2' => '²',
-       'm3' => '³',
-       'm4' => '⁴',
-       'm5' => '⁵',
-       'm6' => '⁶',
-       'm7' => '⁷',
-       'm8' => '⁸',
-       'm9' => '⁹',
-       'm0' => '⁰',
-       'm!' => '₁',
-       'm@' => '₂',
-       'm#' => '₃',
-       'm$' => '₄',
-       'm%' => '₅',
-       'm^' => '₆',
-       'm&' => '₇',
-       'm*' => '₈',
-       'm(' => '₉',
-       'm)' => '₀',
+               # suþscript
+               '1' => '¹',
+               '2' => '²',
+               '3' => '³',
+               '4' => '⁴',
+               '5' => '⁵',
+               '6' => '⁶',
+               '7' => '⁷',
+               '8' => '⁸',
+               '9' => '⁹',
+               '0' => '⁰',
+               '!' => '₁',
+               '@' => '₂',
+               '#' => '₃',
+               '$' => '₄',
+               '%' => '₅',
+               '^' => '₆',
+               '&' => '₇',
+               '*' => '₈',
+               '(' => '₉',
+               ')' => '₀',
+       },
 
        # maths
-       'M!' => '≠',
-       'M~' => '≈',
-       'M=' => '≝',
-       'M>' => '≥',
-       'M<' => '≤',
-       'M-' => '±',
-       'Mi' => '∞',
-       'Mn' => 'ⁿ',
-       'Mr' => '√',
-       'M3' => '∛',
-       'M4' => '∜',
-       'M%' => '‰',
+       'M' => {
+               '!' => '≠',
+               '~' => '≈',
+               '=' => '≝',
+               '>' => '≥',
+               '<' => '≤',
+               '-' => '±',
+               'i' => '∞',
+               'n' => 'ⁿ',
+               'r' => '√',
+               '3' => '∛',
+               '4' => '∜',
+               '%' => '‰',
 
-       'Mf' => 'ƒ',
-       'MS' => '∫',
-       "M'" => '′',
-       'M"' => '″',
-       'Mp' => '∂',
-       'Md' => 'Δ',
-       'MD' => '∇',
-       'M+' => '⊕',
-       'M*' => '⊗',
-       'M^' => '℘',
+               'f' => 'ƒ',
+               'S' => '∫',
+               "'" => '′',
+               '"' => '″',
+               'p' => '∂',
+               'd' => 'Δ',
+               'D' => '∇',
+               '+' => '⊕',
+               '*' => '⊗',
+               '^' => '℘',
 
-       'Ms' => '∩',
-       'Mu' => '∪',
-       'MU' => '∖',
-       'MO' => '∅',
-       'Mg' => '⊂',
-       'MG' => '⊃',
-       'Mh' => '⊄',
-       'MH' => '⊅',
-       'Mb' => '⊆',
-       'MB' => '⊇',
-       'Mm' => '∈',
-       'MM' => '∉',
-       'Mk' => '∋',
-       'MK' => '∌',
+               's' => '∩',
+               'u' => '∪',
+               'U' => '∖',
+               'O' => '∅',
+               'g' => '⊂',
+               'G' => '⊃',
+               'h' => '⊄',
+               'H' => '⊅',
+               'b' => '⊆',
+               'B' => '⊇',
+               'm' => '∈',
+               'M' => '∉',
+               'k' => '∋',
+               'K' => '∌',
 
-       'MA' => '∀',
-       'ME' => '∃',
-       'MX' => '∄',
-       'M&' => '∧',
-       'M|' => '∨',
-       'Mc' => '∝',
-       'M.' => '⋅',
-       'Mo' => '∘',
-       'M:' => '∴',
-       'M;' => '∵',
-       'Mz' => '↯',
-       'MF' => '∎',
+               'A' => '∀',
+               'E' => '∃',
+               'X' => '∄',
+               '&' => '∧',
+               '|' => '∨',
+               'c' => '∝',
+               '.' => '⋅',
+               'o' => '∘',
+               ':' => '∴',
+               ';' => '∵',
+               'z' => '↯',
+               'F' => '∎',
 
-       'MR' => 'ℝ',
-       'MC' => 'ℂ',
-       'MN' => 'ℕ',
-       'MP' => 'ℙ',
-       'MQ' => 'ℚ',
-       'MZ' => 'ℤ',
-       'M9' => '∟',
-       'M8' => '∠',
-       'M7' => '∡',
-       'Ml' => '∥',
-       'ML' => '∦',
+               'R' => 'ℝ',
+               'C' => 'ℂ',
+               'N' => 'ℕ',
+               'P' => 'ℙ',
+               'Q' => 'ℚ',
+               'Z' => 'ℤ',
+               '9' => '∟',
+               '8' => '∠',
+               '7' => '∡',
+               'l' => '∥',
+               'L' => '∦',
+       },
 
        # symbols
-       '-1' => '¼',
-       '-2' => '½',
-       '-3' => '¾',
-       '-4' => '⅓',
-       '-5' => '⅔',
-       '-c' => '©',
-       '-p' => '℗',
-       '-r' => '®',
-       '-s' => '℠',
-       '-t' => '™',
-
-       '\s' => '§',
-       '\1' => '№',
-       '\2' => '½',
-       '\3' => '⅓',
-       '\4' => '¼',
-       '\5' => '⅔',
-       '\6' => '¾',
-       '\c' => '©',
-       '\p' => '℗',
-       '\r' => '®',
-       '\t' => '™',
-       '\T' => '℠',
+       $presymbol => {
+               't' => '™',
+               'c' => '©',
+               'p' => '℗',
+               'r' => '®',
+                       $V lt v1.3 ? (
+               '1' => '¼',
+               '2' => '½',
+               '3' => '¾',
+               '4' => '⅓',
+               '5' => '⅔',
+               's' => '℠',
+                       ) : (
+               's' => '§',
+               '1' => '№',
+               '2' => '½',
+               '3' => '⅓',
+               '4' => '¼',
+               '5' => '⅔',
+               '6' => '¾',
+               'T' => '℠',
+                       ),
 
-       (map { ($presymbol.$_ => $arrows{$_}) } keys %arrows),
+               # arrows
+               'h' => '←',
+               'H' => '⇐',
+               'j' => '↓',
+               'J' => '⇓',
+               'k' => '↑',
+               'K' => '⇑',
+               'l' => '→',
+               'L' => '⇒',
+               'u' => '↖',
+               'U' => '⇖',
+               'i' => '↗',
+               'I' => '⇗',
+               'n' => '↙',
+               'N' => '⇙',
+               'm' => '↘',
+               'M' => '⇘',
+               '=' => '↔',
+               '+' => '⇔',
+       },
 );
 
-my $groups = kbchars(\%rows);
-$groups->{mode} = {
-       ''  => 'option-shifted ⌥',
-       'm' => 'Ω greek prefix ⌥m',
-       'M' => '√ maths prefix ⌥M',
-       $presymbol => "$rows{$presymbol} symbol prefix ⌥$presymbol",
-};
-for my $m (qw' m M ', $presymbol) {
-       $groups->{def}->{''}->{$m} = "g1 mode$m";
-       $groups->{mode}->{$m} //= "mode $m";
-       $groups->{def}->{$m} = {
-               (map {s/^.//r => 'g0'} grep {/^\Q$m/} keys %rows),
-               $m => 'g1 mode',
-       };
-}
-$groups->{flag}->{g1} = ['mode' => "switch to an alternate set of keys"];
-
 +{
-       %{$groups},
+       %{ kbmodes(\%rows) },
+       mode => {
+               ''  => 'option-shifted ⌥',
+               'm' => 'Ω greek prefix ⌥m',
+               'M' => '√ maths prefix ⌥M',
+               $presymbol => "$rows{$presymbol} symbol prefix ⌥$presymbol",
+       },
        version => '1.0',
        title => 'EurKEY',
        intro => join("\n",
index 2968e4bccda7f62b5a41a71f2454e48bda982b21..66d12261ae1017ceca8c118b0c78638070d40767 100644 (file)
@@ -8,35 +8,41 @@ use Shiar_Sheet::FormatChar;
 my $uc = Shiar_Sheet::FormatChar->new;
 
 sub kbchars ($rows) {
+       return kbmodes({'' => $rows});
+}
+
+sub kbmodes ($modes) {
        my %g; # present group classes
-       return {
-       rows => [1, 0],
-       def => {
-               '' => {
-                       map {
-                               my $v = $rows->{$_};
-                               my $class = 'g'.(
-                                         !defined $v || $_ eq $v ? 1 # identical
-                                       : $v =~ /\A\p{Mn}+\z/ ? 9 # combining accent
-                                       : $v =~ /\A[\p{Sk}\p{Lm}]+\z/ ? 8 # modifier symbol
-                                       : $v =~ /\A[\pM\pP]+\z/ ? 7 # mark
-                                       : NFKD($v) =~ /\Q$_/ ? 2 # decomposed equivalent
-                                       : unidecode($v) =~ /\Q$_\E+/i ? 4 # transliterated
-                                       : $v =~ /^\p{Latin}/ ? 5 # latin script
-                                       : 6
-                               );
-                               $g{$class} = 1;
-                               $_ => $class
-                       } keys %{$rows}
-               },
-       },
-       key => {
-               map {
-                       my ($glyph, $title) = $uc->glyph_html($rows->{$_});
-                       $_ => join "\n", $glyph, $title
-               } keys %{$rows}
-       },
-       flag => {%{{
+       my %info = (
+               rows => [1, 0],
+       );
+       for my $lead (keys %{$modes}) {
+               if ($lead ne '') {
+                       $info{def}->{''}->{$lead} = "g1 mode$lead";
+                       $g{g1} = 1;
+                       $info{mode}->{$lead} //= "mode $lead";
+                       $info{def}->{$lead}{$lead} = 'g1 mode'; # back
+               }
+               while (my ($c, $v) = each %{ $modes->{$lead} }) {
+                       my ($glyph, $title) = $uc->glyph_html($v);
+                       $info{key}{$lead.$c} = join "\n", $glyph, $title;
+
+                       my $class = 'g'.(
+                                 !defined $v || $c eq $v ? 1 # identical
+                               : $v =~ /\A\p{Mn}+\z/ ? 9 # combining accent
+                               : $v =~ /\A[\p{Sk}\p{Lm}]+\z/ ? 8 # modifier symbol
+                               : $v =~ /\A[\pM\pP]+\z/ ? 7 # mark
+                               : NFKD($v) =~ /\Q$c/ ? 2 # decomposed equivalent
+                               : unidecode($v) =~ /\Q$c\E+/i ? 4 # transliterated
+                               : $v =~ /^\p{Latin}/ ? 5 # latin script
+                               : 6
+                       );
+                       $g{$class} = 1;
+                       $info{def}{$lead}{$c} //= $class;
+               }
+       }
+       $info{flag} = {%{{
+               g1 => ['mode' => "switch to an alternate set of keys"],
                g2 => ['accented', "decomposes to the original letter with a combining accent"],
                g4 => ['similar', "transliterates (mostly) into the unmodified letter"],
                g5 => ['latin', "a different (accented) latin letter"],
@@ -44,8 +50,8 @@ sub kbchars ($rows) {
                g7 => ['punctuation', "(punctuation) mark"],
                g8 => ['mark', "modifier letter or mark (spacing diacritic)"],
                g9 => ['combining', "diacritical mark to be combined with a following character"],
-       }}{keys %g}},
-       };
+       }}{keys %g}};
+       return \%info;
 }
 
 1;
index f4a4a0023d6c2192fb5a2c045e58e760594dba06..a2cdb1832bdb238d11455175192672e55651611c 100644 (file)
@@ -4,6 +4,7 @@ use warnings;
 do './keyboard/altgr/groups.inc.pl';
 
 my %rows = (
+       '' => {
        'A' => "\N{MACRON}",
        'a' => "\N{COMBINING MACRON}",
        'B' => "\N{BREVE}",
@@ -98,109 +99,101 @@ my %rows = (
        '_' => '—',
        '+' => '±',
        '=' => '≠',
+       },
 
-       '::' => ' ',
-       ':@' => 'Ƨ',
-       ':2' => 'ƨ',
-       ':#' => 'Ɛ',
-       ':3' => 'ɛ',
-       ':%' => 'Ƽ',
-       ':5' => 'ƽ',
-       ':^' => 'Ƅ',
-       ':6' => 'ƅ', #XXX
-       ':7' => '⁊',
-       ':*' => 'Ȣ',
-       ':8' => 'ȣ',
-       ':Q' => 'Ƣ',
-       ':q' => 'ƣ',
-       ':W' => 'Ƿ',
-       ':w' => 'ƿ',
-       ':E' => 'Ǝ',
-       ':e' => 'ǝ', #XXX ə
-       ':R' => 'Ʀ',
-       ':r' => 'ʀ', #XXX
-       ':k' => 'ĸ',
-       ':Y' => 'Ɜ',
-       ':y' => 'ɜ',
-       ':U' => 'Ʊ',
-       ':u' => 'ʊ',
-       ':A' => 'Ə',
-       ':a' => 'ə',
-       ':s' => 'ſ',
-       ':G' => 'Ɣ',
-       ':g' => 'ɣ',
-       ':H' => 'Ƕ',
-       ':h' => 'ƕ',
-       ':J' => 'Ƞ',
-       ':j' => 'ƞ', #XXX ɳ
-       ':K' => 'Ǩ',
-       ':Z' => 'Ʒ',
-       ':z' => 'ʒ',
-       ':C' => 'Ɔ',
-       ':c' => 'ɔ',
-       ':v' => 'ʌ',
-       ':N' => 'Ŋ', #XXX
-       ':n' => 'ŋ',
-       ':M' => 'Ɯ',
-       ':m' => 'ɯ',
-       ':"' => '″', #XXX ʺ
-       ":'" => '′', #XXX ʹ
+       ':' => {
+               '@' => 'Ƨ',
+               '2' => 'ƨ',
+               '#' => 'Ɛ',
+               '3' => 'ɛ',
+               '%' => 'Ƽ',
+               '5' => 'ƽ',
+               '^' => 'Ƅ',
+               '6' => 'ƅ', #XXX
+               '7' => '⁊',
+               '*' => 'Ȣ',
+               '8' => 'ȣ',
+               'Q' => 'Ƣ',
+               'q' => 'ƣ',
+               'W' => 'Ƿ',
+               'w' => 'ƿ',
+               'E' => 'Ǝ',
+               'e' => 'ǝ', #XXX ə
+               'R' => 'Ʀ',
+               'r' => 'ʀ', #XXX
+               'k' => 'ĸ',
+               'Y' => 'Ɜ',
+               'y' => 'ɜ',
+               'U' => 'Ʊ',
+               'u' => 'ʊ',
+               'A' => 'Ə',
+               'a' => 'ə',
+               's' => 'ſ',
+               'G' => 'Ɣ',
+               'g' => 'ɣ',
+               'H' => 'Ƕ',
+               'h' => 'ƕ',
+               'J' => 'Ƞ',
+               'j' => 'ƞ', #XXX ɳ
+               'K' => 'Ǩ',
+               'Z' => 'Ʒ',
+               'z' => 'ʒ',
+               'C' => 'Ɔ',
+               'c' => 'ɔ',
+               'v' => 'ʌ',
+               'N' => 'Ŋ', #XXX
+               'n' => 'ŋ',
+               'M' => 'Ɯ',
+               'm' => 'ɯ',
+               '"' => '″', #XXX ʺ
+               "'" => '′', #XXX ʹ
+       },
 
-       '>>' => ' ',
-       '>q' => 'ʠ',
-       '>R' => 'Ʈ', #XXX mirrored?
-       '>r' => 'ʈ',
-       '>T' => 'Ƭ',
-       '>t' => 'ƭ',
-       '>Y' => 'Ƴ',
-       '>y' => 'ƴ',
-       '>U' => 'Ʋ',
-       '>u' => 'ʋ',
-       '>I' => 'Ɩ',
-       '>i' => 'ɩ',
-       '>P' => 'Ƥ',
-       '>p' => 'ƥ',
-       '>S' => 'Ʃ',
-       '>s' => 'ʃ',
-       '>D' => 'Ɗ',
-       '>d' => 'ɗ',
-       '>F' => 'Ƒ',
-       '>f' => 'ƒ',
-       '>G' => 'Ɠ',
-       '>g' => 'ɠ',
-       '>h' => 'ɦ',
-       '>K' => 'Ƙ',
-       '>k' => 'ƙ',
-       '>Z' => 'Ȥ',
-       '>z' => 'ȥ',
-       '>X' => 'Ɖ',
-       '>x' => 'ɖ',
-       '>C' => 'Ƈ',
-       '>c' => 'ƈ',
-       '>N' => 'Ɲ',
-       '>n' => 'ɲ',
-       '>B' => 'Ɓ',
-       '>b' => 'ɓ',
+       '>' => {
+               'q' => 'ʠ',
+               'R' => 'Ʈ', #XXX mirrored?
+               'r' => 'ʈ',
+               'T' => 'Ƭ',
+               't' => 'ƭ',
+               'Y' => 'Ƴ',
+               'y' => 'ƴ',
+               'U' => 'Ʋ',
+               'u' => 'ʋ',
+               'I' => 'Ɩ',
+               'i' => 'ɩ',
+               'P' => 'Ƥ',
+               'p' => 'ƥ',
+               'S' => 'Ʃ',
+               's' => 'ʃ',
+               'D' => 'Ɗ',
+               'd' => 'ɗ',
+               'F' => 'Ƒ',
+               'f' => 'ƒ',
+               'G' => 'Ɠ',
+               'g' => 'ɠ',
+               'h' => 'ɦ',
+               'K' => 'Ƙ',
+               'k' => 'ƙ',
+               'Z' => 'Ȥ',
+               'z' => 'ȥ',
+               'X' => 'Ɖ',
+               'x' => 'ɖ',
+               'C' => 'Ƈ',
+               'c' => 'ƈ',
+               'N' => 'Ɲ',
+               'n' => 'ɲ',
+               'B' => 'Ɓ',
+               'b' => 'ɓ',
+       },
 );
 
-my $groups = kbchars(\%rows);
-$groups->{mode} = {
-       ''  => 'option-shifted ⌥',
-       ':' => '№ number prefix ⌥:',
-       '>' => 'ʔ hook prefix ⌥>',
-};
-for my $m (qw' : > ') {
-       $groups->{def}->{''}->{$m} = "g1 mode$m";
-       $groups->{mode}->{$m} //= "mode $m";
-       $groups->{def}->{$m} = {
-               (map {s/^.//r => 'g0'} grep {/^\Q$m/} keys %rows),
-               $m => 'g1 mode',
-       };
-}
-$groups->{flag}->{g1} = ['mode' => "switch to an alternate set of keys"];
-
 +{
-       %{$groups},
+       %{ kbmodes(\%rows) },
+       mode => {
+               ''  => 'option-shifted ⌥',
+               ':' => '№ number prefix ⌥:',
+               '>' => 'ʔ hook prefix ⌥>',
+       },
        version => '1.0',
        title => 'ABC option',
        intro => join("\n",