UI-KeyboardLayout
view release on metacpan or search on metacpan
lib/UI/KeyboardLayout.pm view on Meta::CPAN
⥠uptack
â circle
â upstile
⪠downshoe
â rightshoe
â leftshoe
⣠lefttack
⢠righttack
⤠lessthanequal
â notequal
⥠greaterthanequal
â« integral
â´ therefore
â variation
â infinity
â nabla
â¼ approximate
â similarequal
â ifonlyif
â implies
â¡ identical
â radical
â includedin
â includes
â© intersection
⪠union
â§ logicaland
⨠logicalor
â partialderivative
Æ function
â leftarrow
â uparrow
â rightarrow
â downarrow
â soliddiamond
â checkerboard
CP Multi_key
+# KP_Add
-# KP_Subtract
*# KP_Multiply
/# KP_Divide
.# KP_Decimal
=# KP_Equal
SPC# KP_Space
â Left â Right â Up â Down
!, map {("$_#", "KP_$_")} 0..9);
} # `
my %dec_dotcompose = reverse @enc_dotcompose;
# perl -C31 -wne "/^(.)\tCyrillic_(\w+)/ and print qq($2 $1 )" oooo3 >oooo-cyr
# perl -C31 -wne "/^(.)\thebrew_(\w+)/ and print qq($2 $1 )" oooo3 >oooo-heb
my %cyr = qw( GHE_bar Ò ghe_bar Ò ZHE_descender Ò zhe_descender Ò KA_descender Ò ka_descender Ò KA_vertstroke Ò ka_vertstroke Ò
EN_descender Ò¢ en_descender Ò£ U_straight Ò® u_straight Ò¯ U_straight_bar Ò° u_straight_bar Ò± HA_descender Ò²
ha_descender Ò³ CHE_descender Ò¶ che_descender Ò· CHE_vertstroke Ò¸ che_vertstroke Ò¹ SHHA Òº shha Ò» SCHWA Ó schwa Ó
I_macron Ó¢ i_macron Ó£ O_bar Ó¨ o_bar Ó© U_macron Ó® u_macron Ó¯ io Ñ je Ñ lje Ñ nje Ñ dzhe Ñ IO Ð JE Ð LJE Ð NJE Ð
DZHE Ð yu Ñ a а be б tse Ñ de д ie е ef Ñ ghe г ha Ñ
i и shorti й ka к el л em м en н o о pe п ya Ñ er Ñ es Ñ te Ñ
u Ñ zhe ж ve в softsign Ñ yeru Ñ ze з sha Ñ e Ñ shcha Ñ che Ñ hardsign Ñ YU Ю A Ð BE Ð TSE Ц DE Ð IE Ð EF Ф GHE Ð
HA Ð¥ I Ð SHORTI Ð KA Ð EL Ð EM Ð EN Ð O Ð PE Ð YA Я ER Ð ES С TE Т U У ZHE Ð VE Ð SOFTSIGN Ь YERU Ы ZE Ð SHA Ш E Ð
SHCHA Щ CHE Ч HARDSIGN Ъ );
my %heb = qw( doublelowline â aleph × bet × gimel × dalet × he × waw × zain × chet × tet × yod × finalkaph × kaph × lamed ×
finalmem × mem × finalnun × nun × samech ס ayin ×¢ finalpe ×£ pe פ finalzade ×¥ zade צ qoph ×§ resh ר shin ש taw ת
beth × gimmel × daleth × samekh ס zayin × het × teth × zadi צ kuf ×§ taf ת );
my %grk = qw( ALPHAaccent Î EPSILONaccent Î ETAaccent Î IOTAaccent Î IOTAdieresis Ϊ OMICRONaccent Î UPSILONaccent Î
UPSILONdieresis Ϋ OMEGAaccent Î accentdieresis Î
horizbar â alphaaccent ά epsilonaccent Î etaaccent ή iotaaccent ί
iotadieresis Ï iotaaccentdieresis Î omicronaccent Ï upsilonaccent Ï upsilondieresis Ï upsilonaccentdieresis ΰ
omegaaccent Ï ALPHA Î BETA Î GAMMA Î DELTA Î EPSILON Î ZETA Î ETA Î THETA Î IOTA Î KAPPA Î LAMDA Î LAMBDA Î MU Î
NU ΠXI ΠOMICRON ΠPI ΠRHO Ρ SIGMA Σ TAU Τ UPSILON Υ PHI Φ CHI Χ PSI Ψ OMEGA Ω alpha α beta β gamma γ delta δ
epsilon ε zeta ζ eta η theta θ iota ι kappa κ lamda λ lambda λ mu μ nu ν xi ξ omicron ο pi Ï rho Ï sigma Ï
finalsmallsigma Ï tau Ï upsilon Ï
phi Ï chi Ï psi Ï omega Ï );
$dec_dotcompose{"Cyrillic_$_"} = "Cyr_$cyr{$_}" for keys %cyr;
$dec_dotcompose{"hebrew_$_"} = "heb_$heb{$_}" for keys %heb;
$dec_dotcompose{"Greek_$_"} = "Gr_$grk{$_}" for keys %grk;
sub shorten_dotcompose ($$;$) { # Shorten but leave readable disambiguous (to allow more concise printout)
shift; # self [Later we massage out Cyr_ Gr_ uni_ prefixes
(my $in = shift) =~ s/\b(Cyr|Ukr|Gr|heb|Ar)[a-z]+(?=_)/$1/;
$in =~ s/\b(dead)(?=_)/d/;
$in =~ s/\b(Gr_\w+dier|d_diaer)esis/$1/;
$in =~ s/^U([a-fA-F\d]{4,6})$/ 'uni_' . chr hex $1 /e if shift;
$in
}
sub dec_dotcompose ($$;$) {
my($self, $in, $dec_U) = (shift, shift, shift);
my($pre, $post) = split /:/, $in, 2;
$post or warn("Can't parse <<$in>>"), return;
my @pre = ($pre =~ /<(\w+)>/g) or warn("Unknown format of IN in <<$in>>"), return;
my($p) = ($post =~ /"(.+?)"/) or warn("Unknown format of OUT in <<$in>>"), return;
@pre = map { exists $KeySyms{$_}
? $KeySyms{$_}
: ( exists $dec_dotcompose{$_} ? $dec_dotcompose{$_} : $self->shorten_dotcompose($_, $dec_U) ) } @pre;
(@pre, $p)
}
# Stats: about 250 in: egrep "CP.*d_|d_.*CP" o-std
sub process_dotcompose ($$$;$) {
my($self, $fh, $sub, $dec_U) = (shift, shift, shift, shift);
while (<$fh>) {
next if /^\s*(#|include\b)/;
next unless /\S/;
next unless my @in = $self->dec_dotcompose($_, $dec_U);
$sub->($self, $in[-1], @in[0..$#in-1]);
}
}
sub filter_dotcompose ($;$) {
my ($self, $fh) = (shift, shift || \*ARGV);
$self->process_dotcompose($fh, sub ($$@) {
my($self, $out) = (shift, shift);
print "@_ $out\n"; # Two spaces to allow for combining marks
});
}
sub put_val_deep ($$$$@) {
my($self, $h, $term, $val, $k) = (shift, shift, shift, shift, shift);
# die "No key(s) in put_val_deep()" unless @_; # It is OK to have an empty list
while (@_) {
( run in 1.651 second using v1.01-cache-2.11-cpan-71847e10f99 )