X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/ec70841119a49ebeed4e14ce682f29d15e1ed27d..22df5af9280e24267be789edcff52be9c43fd8ca:/Shiar_Sheet/Keyboard.pm?ds=inline diff --git a/Shiar_Sheet/Keyboard.pm b/Shiar_Sheet/Keyboard.pm index 2b3cc86..c7e455b 100644 --- a/Shiar_Sheet/Keyboard.pm +++ b/Shiar_Sheet/Keyboard.pm @@ -6,7 +6,7 @@ use warnings; no warnings 'uninitialized'; # save some useless checks for more legible code use Carp; -our $VERSION = 'v2.05'; +our $VERSION = '2.10'; my @casedesc = (undef, qw/shift ctrl meta/, 'shift meta'); my @rowdesc = qw(numeric top home bottom); @@ -14,12 +14,12 @@ 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 - ^h BS ^i tab ^j LF ^k VT ^l FF ^m CR ^n SO ^o SI - ^p DLE ^q DC1 ^r DC2 ^s DC3 ^t DC4 ^u NAK ^v SYN ^w ETB - ^x CAN ^y EM ^z SUB ^[ ESC ^\ FS ^] GS ^^ RS ^_ US - ^? DEL +my %keytrans = ( + '^h' => "\x{232B}", # BS + '^i' => "\x{21E5}", # TAB + '^m' => "\x{21B5}", # CR + '^?' => "\x{2326}", # DEL + '^[' => "\x{238B}", # ESC ); sub new { @@ -36,6 +36,9 @@ sub new { \%Shiar_Sheet::KeySigns::sign; }; + $self->{showkeys} = $PLP::Script::showkeys; + $self->{style } = $PLP::Script::style; + bless $self, $class; } @@ -53,6 +56,7 @@ sub escapeclass { s/\+/_m/g; s/\[/_sbo/g; s/\]/_sbc/g; + s/\\/_b/g; s/^$/_/; return $_; } @@ -86,6 +90,19 @@ sub keyunalias { return $self->keyunalias($keyinfo, $ancestry); } +sub print_letter { + my $self = shift; + my ($key, $mode) = @_; + + return if $key eq '^0'; + return 'Esc' if $key eq "\e"; + return $keytrans{$key} if defined $keytrans{$key}; + my $html = $self->{def}{$mode}{lead} . escapehtml($key); + $html =~ s{\^(?=.)}{^}; # element around ctrl-identifier + $html =~ s{\+(?=.)}{+}; # meta + return $html; +} + sub print_key { my $self = shift; my ($mode, $key, $flags) = @_; @@ -94,21 +111,18 @@ sub print_key { if (not defined $flags) { $flags = $key eq '^0' ? 'ni' : 'no'; } - elsif ($flags =~ s/^=//) { # alias - $desc = $self->{sign}->{alias}; - $desc .= $flags eq "\e" ? 'esc' : $flags; - $flags = $self->keyunalias($flags) . ' alias'; + elsif ($flags =~ s/^=(\S+)\s?//) { # alias + my $ref = $1; + $desc = $self->{sign}->{alias} . ($ref eq "\e" ? 'esc' : $ref); + $flags = join ' ', $self->keyunalias($ref), 'alias', $flags; } if (my $txt = $self->{key}->{$mode.$key}) { ($desc, $mnem) = split /\n/, $self->escapedesc($txt); } -# $key = $keytrans{$key} if defined $keytrans{$key}; - my $keytxt = $key eq "\e" ? 'Esc' : $self->{def}{$mode}{lead} . escapehtml($key) if $key ne '^0'; - $keytxt .= $self->{sign}->{$1} while $flags =~ s/(?:^| )(arg[a-ln-z]?)\b//; # arguments + my $keytxt = $self->print_letter($key, $mode); $keytxt .= "$self->{sign}->{motion}" if $flags =~ s/ ?\bargm\b//; # motion argument - $keytxt =~ s{\^(?=.)}{^}; # element around ctrl-identifier - $keytxt =~ s{\+(?=.)}{+}; # meta + $keytxt .= $self->{sign}->{$1} while $flags =~ s/(?:^| )(arg[a-ln-z]?)\b//; # arguments my $keyhint = defined($mnem) && qq{ title="$mnem"}; $keytxt = "$keytxt"; $keytxt .= ' '.$desc if defined $desc; @@ -117,6 +131,8 @@ sub print_key { ' onclick="setmode(%s)"', $1 eq '' ? '' : sprintf(q{'mode%s'}, escapeclass($1)) ); + $flags =~ s/\bx\w+/ext/; + $flags =~ s/\bv\d+/new/; $flags .= ' chr'.ord(substr $key, -1) if $key ne '^0'; print qq{\t\t