use Text::Unidecode ();
use Shiar_Sheet::FormatChar;
-our $VERSION = '1.02';
+our $VERSION = '1.05';
our @EXPORT = qw( kbchars kbmodes );
my $uc = Shiar_Sheet::FormatChar->new;
our %unaccent = qw(
⍺ a ⍵ w ∊ E ⍷ E ⍴ r ⍳ i ⍸ i ○ O ⍥ O ⌿ / ⍟ (*) ⊕ (+)
- Ʊ U ǝ e Ǝ E ʌ v χ X ɥ h ʘ O ɰ mw ɯ mw Ɯ MW ə @ae Ə @AE
+ Ʊ U ǝ e Ǝ E ʌ vA Ʌ VA ɥ h ʘ O ɰ mw ɯ mw Ɯ MW ə @ae Ə @AE
ɸ PF ʎ yl ɔ co Ɔ CO ɛ 3E ƣ q Ƣ Q ∀ A ∃ E ∪ u ∩ n ≠ !=
≈ =~ ∅ /0 ∘ o ⋅ . ∫ s ≝ =d ″ " ≤ < ≥ > √ rV ∛ 3V ∜ 4V
+ Α A Β B Γ G Δ D Ε E Ζ Z Η H Θ CQ Ι I Κ K Λ L Μ M
+ Ν N Ξ X Ο O Π P Ρ R Σ S Τ T Υ YU Φ F Χ CX Ψ Y Ω W
+ α a β b γ g δ d ε e ζ z η h θ cq ι i κ k λ l μ m
+ ν n ξ x ο o π p ρ r σ s τ t υ yu φ f χ cx ψ y ω w
+ ς sc ϑ cq µ mu
);
sub unidecode {
sub kbmodes ($modes) {
my %g; # present group classes
my %info = (
+ tableclass => 'keys big',
rows => [1, 0],
);
for my $lead (keys %{$modes}) {
if ($lead ne '') {
- $info{def}->{''}->{$lead} = "g1 mode$lead";
+ $info{def}->{''}->{$lead}[0] = "g1 mode$lead";
$g{g1} = 1;
$info{mode}->{$lead} //= "mode $lead";
- $info{def}->{$lead}{$lead} = 'g1 mode'; # back
+ $info{def}->{$lead}{$lead} = ['g1 mode']; # back
}
- while (my ($c, $v) = each %{ $modes->{$lead} }) {
+ while (my ($k, $v) = each %{ $modes->{$lead} }) {
+ my @class;
+ if (ref $v eq 'SCALAR') {
+ my ($reflead, $ref) = split /(.)$/, ${$v};
+ $v = $modes->{$reflead}->{$ref};
+ @class = 'ext';
+ }
my ($glyph, $title) = $uc->glyph_html($v);
- $info{key}{$lead.$c} = join "\n", $glyph, $title;
+ my $c = $k =~ s/\A[+^](?=.)//r; # trim modifier indicator
- my $class = 'g'.(
- !defined $v || $c eq $v ? 1 # identical
- : $v =~ /\A\p{Mn}+\z/ ? 9 # combining accent
- : NFKD($v) =~ /\Q$c/ ? 2 # decomposed equivalent
- : unidecode($v) =~ /\Q$c\E+/i ? 4 # transliterated
- : $v =~ /\A[\p{Sk}\p{Lm}]+\z/ ? 8 # modifier symbol
- : $v =~ /\A[\pM\pP]+\z/ ? 7 # mark
- : $v =~ /^\p{Latin}/ ? 5 # latin script
- : 6
+ unshift @class, (
+ !defined $v || $c eq $v ? 'no' # identical
+ : $v =~ /\A\p{Mn}+\z/ ? 'g9' # combining accent
+ : NFKD($v) =~ /\A\Q$c\E\p{Mn}*\z/ ? 'g2' # decomposed equivalent
+ : unidecode($v) =~ /\Q$c\E+/i ? 'g4' # transliterated
+ : $v =~ /\A[\p{Sk}\p{Lm}]+\z/ ? 'g8' # modifier symbol
+ : $v =~ /\A[\pM\pP]+\z/ ? 'g7' # mark
+ : $v =~ /^\p{Latin}/ ? 'g5' # latin script
+ : 'g6'
);
- $g{$class} = 1;
- $info{def}{$lead}{$c} //= $class;
+ $g{$_} = 1 for grep { $_ ne 'no' } @class;
+ $info{def}{$lead}{$k} //= [join ' ', @class];
+ $info{def}{$lead}{$k}[1] = join "\n", $glyph, $title;
}
}
$info{flag} = {%{{
g7 => ['punctuation', "(punctuation) mark"],
g8 => ['mark', "modifier letter or mark (spacing diacritic)"],
g9 => ['combining', "diacritical mark to be combined with a following character"],
+ ext => ['alias', 'alternative with identical results as something else'],
}}{keys %g}};
return \%info;
}