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' => 'ª',
'>' => 'Ó',
'/' => '¿',
'?' => '…',
+ },
# 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",
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"],
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;
do './keyboard/altgr/groups.inc.pl';
my %rows = (
+ '' => {
'A' => "\N{MACRON}",
'a' => "\N{COMBINING MACRON}",
'B' => "\N{BREVE}",
'_' => '—',
'+' => '±',
'=' => '≠',
+ },
- '::' => ' ',
- ':@' => 'Ƨ',
- ':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",