From 88a70e7b1241885ac6992e2e912808c9468cd0bd Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Sun, 31 Dec 2023 04:25:19 +0100 Subject: [PATCH] keyboard/altgr: classify glyphs within submodes --- keyboard/altgr/eurkey.eng.inc.pl | 326 ++++++++++++++-------------- keyboard/altgr/groups.inc.pl | 66 +++--- keyboard/altgr/macos-abc.eng.inc.pl | 189 ++++++++-------- 3 files changed, 286 insertions(+), 295 deletions(-) diff --git a/keyboard/altgr/eurkey.eng.inc.pl b/keyboard/altgr/eurkey.eng.inc.pl index b2a98cb..33550f9 100644 --- a/keyboard/altgr/eurkey.eng.inc.pl +++ b/keyboard/altgr/eurkey.eng.inc.pl @@ -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", diff --git a/keyboard/altgr/groups.inc.pl b/keyboard/altgr/groups.inc.pl index 2968e4b..66d1226 100644 --- a/keyboard/altgr/groups.inc.pl +++ b/keyboard/altgr/groups.inc.pl @@ -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; diff --git a/keyboard/altgr/macos-abc.eng.inc.pl b/keyboard/altgr/macos-abc.eng.inc.pl index f4a4a00..a2cdb18 100644 --- a/keyboard/altgr/macos-abc.eng.inc.pl +++ b/keyboard/altgr/macos-abc.eng.inc.pl @@ -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", -- 2.30.0