:
use utf8;
use strict;
use warnings;
no warnings 'qw'; # that's not a comment, it's a NUMBER SIGN
use open IO => ':utf8';
our $VERSION = '1.0';
$header{content_type} = 'text/html; charset=utf-8';
:>
<:
my $diinfo = do 'digraphs.inc.pl';
my %di = map { $diinfo->{$_}->[0] => $_ } grep { ref $diinfo->{$_} }
keys %$diinfo;
sub quote {
local $_ = shift;
s/"/"/g;
s/</g;
s/>/>/g;
return $_;
}
sub glyph_table {
my ($digraphs) = @_;
my @rows;
my @colheads;
while ($digraphs->[0] !~ /^\./) {
my $cell = shift @$digraphs or last;
push @colheads, sprintf(
'<%s%s>%s',
$cell =~ s/^-// ? 'td' : 'th',
$cell =~ s/:(.*)// ? qq{ title="$1"} : '',
$cell eq '_' ? ' ' : $cell
);
}
push @rows, sprintf '
%s
', join '', @colheads if @colheads;
my $colspan = 1;
for my $cell (@$digraphs) {
if ($cell =~ s/^\.//) {
# dot indicates start of a new row
push @rows, '';
if ($cell =~ s/^>//) {
# header cell text follows
$cell =~ s/_/ /g; # underscores may be used instead of whitespace (for qw//ability)
$rows[-1] .= ''.($cell || ' ');
}
next;
}
elsif ($cell eq '>') {
# merge this cell to the next column
$colspan++;
next;
}
my $code = join '', map { $di{ord $_} || '' } split //, $cell;
my $name = $diinfo->{$code}->[1];
# determine display class
my @class;
if ($cell eq '-') {
$cell = '';
}
elsif ($cell eq '=') {
push @class, 'di-invalid';
$cell = '';
}
else {
if ($cell =~ s/^-//) {
push @class, 'di-rare'; # discouraged
}
if ($code) {
push @class, 'di-d'; # digraph
push @class, 'di-prop' # unofficial
if $diinfo->{$code}->[2] =~ /\bXz\b/;
}
if ($cell =~ /[ -~]/) {
push @class, 'di-a'; # ascii
}
else {
push @class, 'di-b'; # basic unicode
}
}
# add cell html
$rows[-1] .= sprintf(' | %s%s',
defined $name ? qq{ title="$name"} : '',
@class ? sprintf(' class="%s"', join ' ', @class) : '',
$colspan > 1 && qq{ colspan="$colspan"},
$cell eq '' ? ' ' : quote($cell),
$code ne '' ? sprintf(' %s', quote($code))
: length($cell) == 1 && $cell !~ /[a-z]/
? sprintf(' %04X', 'value', ord $cell)
: '',
);
$colspan = 1;
}
return sprintf qq{\n},
join '', map {" | $_\n"} @rows;
}
sub print_glyph_tables {
while (@_) {
printf "%s
\n\n", shift;
while (ref $_[0] and $_ = shift) {
print glyph_table($_);
}
print '';
}
}
print_glyph_tables(
'Popular',
[qw{. « » . ‹ › . ‘ ’ . “ ” . „ ‚ . ‟ ‛}],
[qw{. † ‡ • . § ¶ # . © ® ™ . ° ′ ″ . − × ÷ . ± ² √}],
[qw{. å ä ö ü ß . Å æ ø ű ſ}],
[qw{. ¿ ç ñ é ê è}],
'Arrows',
[qw{. ↖ ↑ ↗ ↔ . ← - → ↕ . ↙ ↓ ↘ -}],
[qw{. ⇖ ⇑ ⇗ ⇔ . ⇐ - ⇒ ⇕ . ⇙ ⇓ ⇘ -}],
[qw{. ◤ ▲ ◥ . ◀ ◆ ▶ . ◣ ▼ ◢ }],
[qw{. ◸ △ ◹ . ◁ ◇ ▷ . ◺ ▽ ◿ }],
'Line drawing',
[qw{. ┌ ┬ ┐ . ├ ┼ ┤ . └ ┴ ┘}],
[qw{. ┏ ┳ ┓ . ┣ ╋ ┫ . ┗ ┻ ┛}],
[qw{. ┍ ┯ ┑ . ┝ ┿ ┥ . ┕ ┷ ┙}],
[qw{. ┎ ┰ ┒ . ┠ ╂ ┨ . ┖ ┸ ┚}],
[qw{
. ╴ ─ ╌ ┄ ┈ ╶ ╾
. ╸ ━ ╍ ┅ ┉ ╺ ╼
. ╵ │ ╎ ┆ ┊ ╷ ╿
. ╹ ┃ ╏ ┇ ┋ ╻ ╽
}],
[qw{. ╱ ╳ ╲ }],
[qw{. ╔ ╦ ╗ ═ . ╠ ╬ ╣ ║ . ╚ ╩ ╝ - }],
[qw{. ╒ ╤ ╕ . ╞ ╪ ╡ . ╘ ╧ ╛ }],
[qw{. ╓ ╥ ╖ . ╟ ╫ ╢ . ╙ ╨ ╜ }],
'Blocks',
[qw{. ▘ ▀ ▝ . ▌ █ ▐ . ▖ ▄ ▗ }],
[qw{. ░ . ▒ . ▓ }],
[qw{. ▛ ▚ ▟ . ▙ ▞ ▜ }],
[qw{. ▁ ▂ ▃ ▄ ▅ ▆ ▇ ▔ . ▏ ▎ ▍ ▌ ▋ ▊ ▉ ▕ }],
[qw{. □ ▣ ■ . ▤ ▦ ▥ . ▧ ▩ ▨}],
'Signs',
[qw{. ¤ ¢ ₥ € £ ₨ $ ¥ . ₫ ₭ ₦ ₱ ₧ ₮ ₩ ₪}],
[qw{. ♠ ♡ ♢ ♣ . ♤ ♥ ♦ ♧}],
[qw{. ☉ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇}], # solar
[qw{. ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓}], # zodiac
'IPA',
[qw{
- BiL:Bilabial LD:Labiodental D:Dental Alv:Alveolar PA:Postalveolar
Rf:Retroflex Pal:Palatal Vel:Velar Uv:Uvular Ph:Pharyngeal
EG:Epiglottal Gl:Glottal
.>Plosive p -ȹ > > t ʈ c k q = ʡ ʔ
.>Voiced_Plosive b -ȸ > > d ɖ ɟ ɡ ɢ = - =
.>Nasal m ɱ > > n ɳ ɲ ŋ ɴ = = =
.>Trill ʙ - > > r - - = ʀ = -я =
.>Tap/flap - ⱱ > > ɾ ɽ - = ɢ̆ = - =
.>Fricative ɸ f θ s ʃ ʂ ç x χ ħ ʜ h
.>Voiced_fricative β v ð z ʒ ʐ ʝ ɣ ʁ ʕ ʢ ɦ
.>Lateral_fricative = = > > ɬ - - - - = = =
.>Voiced_lateral_fricative = = > > ɮ - - - - = = =
.>Approximant - ʋ > > ɹ ɻ j ɰ - - - =
.>Lateral_approximant = = > > l ɭ ʎ ʟ - = = =
.>Click ʘ - ǀ ǁ ǃ -‼ ǂ - - = = =
.>Implosive ɓ ɗ̪ > > ɗ -ᶑ ʄ ɠ ʛ = = =
}],
[qw{
co . ɕ . ʑ . ɧ . ɥ . ʍ . w
}],
[(
'-',
map { substr($_, 0, 1).':'.$_, substr($_, 0, 1)." r:$_ rounded" }
qw{Front Central Back}
), qw{
.>Close i y ɨ ʉ ɯ u
.>Near-close ɪ ʏ - - - ʊ
.>Close-mid e ø ɘ ɵ ɤ o
.>Mid - - ə - - -
.>Open-mid ɛ œ ɜ ɞ ʌ ɔ
.>Near-open æ - ɐ - - -
.>Open a ɶ - - ɑ ɒ
}],
'Alphabetics',
[qw{
.>Latin a ī ı ę ô ɳ ŋ ṡ š đ ð Ʒ
.>Cyrillic а і й э ё н њ ш щ ч ь Я
.>Greek α ί ϊ η ϋ π ψ σ ς θ ξ Ω
.>Hebrew א ײ י ע ו נ ן ס ש ט צ ץ
}],
'Japanese',
[qw{
- A I U E O _
.> あ い う え お =
.>K か き く け こ =
.>S さ し す せ そ =
.>T た ち つ て と =
.>N な に ぬ ね の ん
.>H は ひ ふ へ ほ =
.>M ま み む め も =
.>Y や = ゆ = よ =
.>R ら り る れ ろ =
.>W わ -ゐ = -ゑ を =
}],
[qw{
- A I U E O
.>G が ぎ ぐ げ ご
.>Z ざ じ ず ぜ ぞ
.>D だ ぢ づ で ど
.>B ば び ぶ べ ぼ
.>P ぱ ぴ ぷ ぺ ぽ
}],
[qw{
- A I U E O _
.> ア イ ウ エ オ ー
.>K カ キ ク ケ コ =
.>S サ シ ス セ ソ =
.>T タ チ ツ テ ト =
.>N ナ ニ ヌ ネ ノ ン
.>H ハ ヒ フ ヘ ホ =
.>M マ ミ ム メ モ =
.>Y ヤ - ユ - ヨ =
.>R ラ リ ル レ ロ =
.>W ワ ヰ - ヱ ヲ =
}],
[qw{
- A I U E O
.>G ガ ギ グ ゲ ゴ
.>Z ザ ジ ズ ゼ ゾ
.>D ダ ヂ ヅ デ ド
.>B バ ビ ブ ベ ボ
.>P パ ピ プ ペ ポ
.>V ヷ ヸ ヴ ヹ ヺ
}],
);
:>
ascii
| digraph
| proposed
| other unicode
| discouraged
|