+use utf8;
+use strict;
+use warnings;
+use Shiar_Sheet::KeyboardChars 'kbchars';
+
+my %rows = qw{
+ +! ๐ +@ ๐ +# ๐
+$ ๐ +% ๐ +^ ๐ +& ๐ +* ๐ +( ๐ +) ๐ +_ ๐ ++ ๐
+ +1 โ +2 โ +3 โ +4 โ +5 โ +6 โ +7 โ +8 โ +9 โ +0 โ +- โ += โ
+
+ $ โ 4 โ % โก 5 โ ^ โ 6 โ
\{ โ
+ & โ * โฅ ( โฆ ) โฃ
+ - โบ _ โน = โป
+ = โผ + โ
+
+ q โ w โ e โ Q โ W โ E โ +q โค +w โฒ +e โฅ +Q โธ +W โณ +E โน
+ a โ s โ d โ A โ S โ D โ +a โ +s โ +d โถ +A โ +S โ +D โท
+ z โ x โ c โ Z โ X โ C โ +z โฃ +x โผ +c โข +Z โบ +X โฝ +C โฟ
+ 1 โคก 2 โ 3 โคข ! โ @ โ # โบ
+
+ r โ t โฌ y โ R โ T โฆ Y โ
+ f โ g โผ h โค F โ G โฌ H โฃ
+ v โ b โด n โ V โ B โฉ N โ
+ ' โ \ โ " โ | โ +' โ +\ โ +" โ +| โ
+
+ +r โ +R โ +t โค +T โฅ +y โ +Y โ
+ +f โ +F โ +g โช +G โซ +h โก +H โข
+ +v โ +V โ +b โง +B โจ +n โ +N โ
+
+ > โ . โ , โ M โ m โ
+ l โ L โ k โ J โ j โ ; โ : โ +; ๐ฎ +: ๐ฎ
+ O โ o โ i โ U โ u โ / โ ? โ +/ ๐ฎ +? ๐ฎ
+ 7 โ 8 โ 9 โ
+ I ๐ฎ K ๐ฎ < ๐ฎ
+
+ +i ๐ญฏ +, ๐ญญ +j ๐ญฎ +l ๐ญฌ +[ ๐ฎ +k ๐ฎ
+ +u โญ +o โฎ +m โฐ +. โฏ
+
+ +U ๐ฎฃ +I ๐ฎฆ +O ๐ฎข
+ +J ๐ฎฅ +K ๐ฎฎ +L ๐ฎค
+ +M ๐ฎก +< ๐ฎง +> ๐ฎ
+ p โฑ [ โณ ] โฒ
+ P ๐ฎจ \} ๐ฎฉ +p ๐ฎซ +] ๐ฎช +P ๐ฎฌ +\} ๐ฎญ
+};
+$rows{' '} = "\N{FIGURE SPACE}";
+
+# remaining candidates: โโ ๐ฎ ๐ฎ โคโงโกโข โโ โโ โโ โฌ
+
+my $groups = kbchars(\%rows);
+
+use Encode 'decode';
+my %cpcompat = (
+ # lower cp437 representations from charset-encoding excluding BEL/BS/CR/LF
+ (map {$_ => 'g3'} split //, 'โบโปโฅโฆโฃโ โโโโซโผโบโโโผยถยงโฌโจโโโโโโโฒโผ'),
+ # upper characters converted to unicode
+ (map {$_ => 'g4'} split //, decode('cp437', pack 'C*', 127..255)),
+ (map {$_ => 'g2'} split //, decode('cp850', pack 'C*', 127..255)),
+);
+
+while (my ($k, $c) = each %rows) {
+ $groups->{def}{''}{$k} = $cpcompat{$c} // (
+ $c =~ /\p{In=1.1}/ ? 'g5' :
+ $c =~ /\p{In=6.0}/ ? 'g6' :
+ $c =~ /[\x{1FB00}-\x{1FBFF}]/ ? 'g7' : # Age=V13.0
+ 'g0'
+ );
+}
+
++{
+ %{ $groups },
+ version => '1.0',
+ title => 'Unicode semigraphics',
+ category => 'specialized',
+ intro => join("\n",
+ sprintf('Keyboard mode to %s draw character graphics.',
+ '<span title="without requiring a specialised editor">manually</span>',
+ ),
+ 'Inspired by <a href="/keyboard/altgr/msx-graph">MSX graph</a> mode,',
+ 'but reimagined for modern Unicode coverage.',
+ ),
+ moderows => '5421-21',
+ flag => {
+ g2 => ['cp850' => 'shared international repetoire in most DOS code pages'],
+ g3 => ['historic' => 'extended graphics presentations of control characters in cp437 ea'],
+ g4 => ['cp437' => '<em>ANSI art</em> drawing glyphs in English code page 437 (OEM-US)'],
+ g5 => ['standard' => 'gathered in the original Unicode release in 1993'],
+ g6 => ['extended' => 'later additions accumulated within a decade, mostly Unicode 3.2'],
+ g7 => ['rare' => 'exceptional <em>symbols for legacy computing</em> in Unicode since <abbr title="Unicode 13.0">2020</abbr>'],
+ },
+}