no warnings 'uninitialized'; # save some useless checks for more legible code
use Carp;
-our $VERSION = '1.01';
+our $VERSION = '1.03';
-my @casedesc = qw(ctrl shift);
+my @casedesc = (undef, qw/shift ctrl meta/, 'shift meta');
my @rowdesc = qw(numeric top home bottom);
my %keyrows = do 'keys.inc.pl';
+# add first two cases of each row again with each char prepended by + (alt)
+push @$_, map { [map {"+$_"} @$_] } @$_[0,1] for map {@$_} values %keyrows;
my %keytrans = qw(
^@ NUL ^a SOH ^b STX ^c ETX ^d EOT ^e ENQ ^f ACK ^g BEL
sub escapeclass {
local $_ = shift;
s/\^/_c/g;
+ s/\+/_m/g;
s/\[/_sbo/g;
s/\]/_sbc/g;
s/^$/_/;
my $self = shift;
my ($key, $ancestry) = @_;
- $key =~ s/(\S*?)(\^?\S)($|\s.*)/$2/;
+ $key =~ s/(\S*?)(\+?\^?\S)($|\s.*)/$2/;
my $mode = $1;
my $keyinfo = $self->{keys}->{$mode}->{$key};
$keytxt .= $self->{sign}->{$1} while $flags =~ s/(?:^| )(arg[a-ln-z]?)\b//; # arguments
$keytxt .= "<small>$self->{sign}->{motion}</small>" if $flags =~ s/ ?\bargm\b//; # motion argument
$keytxt =~ s{\^(?=.)}{<small>^</small>}; # element around ctrl-identifier
+ $keytxt =~ s{\+(?=.)}{<small>+</small>}; # meta
my $onclick = $flags =~ s/ ?\bmode(\S*)// && defined $self->{keys}{$1} && sprintf(
' onclick="setmode(%s)"',
$1 eq '' ? '' : sprintf(q{'mode%s'}, escapeclass($1))
$onclick .= sprintf(q{ onclick="document.location='%s'"}, $1)
if $flags =~ s/ ?\blink(\S*)//;
my $keyhint = defined($mnem) && qq{ title="$mnem"};
+ $flags .= ' chr'.ord(substr $key, -1) if $key ne '^0';
print qq{\t\t<li class="$flags"$onclick><b$keyhint>$keytxt</b>};
print ' ', $desc if defined $desc;
for (my $row = 0; $row <= $#{ $keyrows{$self->{map}} }; $row++) {
my $keyrow = $keyrows{$self->{map}}->[$row];
- my @caserows = 0 .. $#$keyrow;
print qq{<li class="row row$row"><ul>\n};
for my $modefull (@moderows) {
my $mode = $modefull;
my @showcase = $mode =~ s/(\d+)(?:-(\d+))?$//
- ? (map {3 - $_} split //, $row == 0 && $2 || $1) : @caserows;
+ ? (map {$_ - 1} split //, $row == 0 && $2 || $1) : (2, 1, 0);
my $modekeys = $self->{keys}{$mode};
for my $case (@showcase) {
=head1 DESCRIPTION
-Used by http://sheet.shiar.net to display keyboard sheets.
+Used by http://sheet.shiar.nl to display keyboard sheets.
Assumes specific stylesheets and javascript from this site,
so probably not of much use elsewhere.
=head1 AUTHOR
-Mischa POSLAWSKY <perl@shiar.org>
+Mischa POSLAWSKY <perl@shiar.nl>
=head1 LICENSE