use Text::Unidecode ();
use Shiar_Sheet::FormatChar;
-our $VERSION = '1.04';
+our $VERSION = '1.05';
our @EXPORT = qw( kbchars kbmodes );
my $uc = Shiar_Sheet::FormatChar->new;
);
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 ($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.$k} = join "\n", $glyph, $title;
my $c = $k =~ s/\A[+^](?=.)//r; # trim modifier indicator
- my $class = (
+ unshift @class, (
!defined $v || $c eq $v ? 'no' # identical
: $v =~ /\A\p{Mn}+\z/ ? 'g9' # combining accent
- : NFKD($v) =~ /\Q$c/ ? 'g2' # decomposed equivalent
+ : 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 unless $class eq 'no';
- $info{def}{$lead}{$k} //= $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;
}