<:
my $diinfo = do 'digraphs.inc.pl';
my %di = map { $diinfo->{$_}->[0] => $_ } grep { ref $diinfo->{$_} }
- keys %$diinfo;
+ sort { length $a <=> length $b } keys %$diinfo;
sub quote {
local $_ = shift;
@@ -112,53 +46,85 @@ sub quote {
return $_;
}
-sub table {
- my ($width, $digraphs, $rowheads, $colheads) = @_;
+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) {
- my $class;
- if ($cell eq '.') {
+ if ($cell =~ s/^\.//) {
+ # dot indicates start of a new row
push @rows, '';
- $rows[-1] .= ''.(shift @$rowheads || ' ') if $rowheads;
+ 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];
+ my ($code, $name);
- if ($cell =~ s/^-//) {
-# $class = 'Empty';
+ # determine display class
+ my @class;
+ if ($cell eq '-') {
+ $cell = '';
}
elsif ($cell eq '=') {
- $class = 'Reserved';
+ push @class, 'di-invalid';
$cell = '';
}
- elsif ($cell =~ /[ -~]/) {
- $class = 'Ascii';
- }
- elsif (not $code) {
- $class = 'DiNone';
- }
- elsif ($diinfo->{$code}->[2] =~ /\bXz\b/) {
- $class = 'DiProp';
- }
else {
- $class = 'Di';
+ if ($cell =~ s/^-//) {
+ push @class, 'di-rare'; # discouraged
+ }
+
+ $code = join '', map { $di{ord $_} || '' } split //, $cell;
+ $name = $diinfo->{$code}->[1];
+ length $code == 2 or undef $code;
+
+ if (defined $code) {
+ push @class, 'di-d'; # digraph
+ push @class, 'di-prop' # unofficial
+ if $diinfo->{$code}->[2] =~ /\bXz\b/;
+ }
+ elsif (defined $name) {
+ push @class, 'X';
+ }
+
+ 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"} : '',
- defined $class ? qq{ class="$class"} : '',
+ @class ? sprintf(' class="%s"', join ' ', @class) : '',
$colspan > 1 && qq{ colspan="$colspan"},
$cell eq '' ? ' ' : quote($cell),
- $code ne '' ? sprintf(' %s', quote($code))
+ defined $code ? sprintf(' %s', quote($code))
: length($cell) == 1 && $cell !~ /[a-z]/
? sprintf(' %04X', 'value', ord $cell)
: '',
@@ -167,200 +133,174 @@ sub table {
$colspan = 1;
}
- if ($colheads) {
- unshift @rows, sprintf '%s | | ', join '',
- map { sprintf '%s', split(/:/, $_, 2), '', '' }
- @$colheads
- }
-
- return sprintf "\n", join '', map {" | $_\n"} @rows;
+ return sprintf qq{\n},
+ join '', map {"
$_\n"} @rows;
}
-print "Common
\n\n";
-print table(@$_) for (
- [ 3 => [qw{. « » . ⹠⺠. â â . â â . â â}]],
- [ 3 => [qw{. â ⡠⢠. § ¶ # . © ® ⢠. â à ÷ . ± ² â}]],
- [ 3 => [qw{. Ã¥ ä ö ü à . Ã
æ ø ű ſ}]],
- [ 3 => [qw{. ¿ ç ñ é ê è}]],
-);
-
-print "Arrows
\n\n";
-print table(@$_) for (
- [ 4 => [qw{. â â â â . â - â â . â â â -}]],
- [ 4 => [qw{. â â â â . â - â â . â â â -}]],
- [ 3 => [qw{. ⤠Ⲡ⥠. â â ⶠ. ⣠⼠â¢}]],
- [ 3 => [qw{. ⸠Ⳡ⹠. â â â· . ⺠⽠â¿}]],
-);
+sub print_glyph_tables {
+ while (@_) {
+ printf "%s
\n\n", shift;
+ while (ref $_[0] and $_ = shift) {
+ print glyph_table($_);
+ }
+ print '';
+ }
+}
-print "Line drawing
\n\n";
-print table(@$_) for (
- [ 4 => [qw{. â ⬠â . â ⼠⤠. â â´ â}]],
- [ 4 => [qw{. â â³ â . ⣠â â« . â â» â}]],
- [ 3 => [qw{. â ⯠â . â ⿠⥠. â â· â}]],
- [ 3 => [qw{. â â° â . â â ⨠. â ⸠â}]],
- [ 4 => [qw{
+our $verbose = exists $get{v};
+
+print_glyph_tables(
+ 'Popular',
+ [qw{. « » . ⹠⺠. â â . â â . â â . â â}],
+ [qw{. â ⡠⢠. § ¶ # . © ® ⢠. ° â² â³ . â à ÷ . ± ² â}],
+ [qw{. â â . â â . ⺠⹠. â â . â â . â ⺠}],
+ [qw{. Ã¥ ä ö ü à . Ã
æ ø ű ſ}],
+ [qw{. ¿ ç ñ é ê è}],
+
+ 'Signs',
+ [qw{. ¤ ¢ ⥠⬠£ ⨠$ Â¥ . â« â ⦠Ⱡ⧠⮠⩠âª}],
+ [qw{. â ⡠⢠⣠. ⤠⥠⦠â§}],
+ [qw{. â â¿ â â â â â â
â â}], # solar
+ [qw{. â â â â â â â â â â â â}], # zodiac
+
+ 'Arrows',
+ [qw{. â â â â . â - â â . â â â -}],
+ [qw{. â â â â . â - â â . â â â -}],
+ [qw{. ⬠⧠⬠⬠. ⦠- ⨠Ⳡ. ⬠⩠⬠-}],
+ [qw{. ⬠⬠⬠⬠. â¬
- ⡠⬠. ⬠⬠⬠-}],
+ [qw{. ⩠⬠⬠. ⧠⡠⨠. ⬠⬠⪠}],
+ [qw{. ⤠Ⲡ⥠. â â ⶠ. ⣠⼠⢠}],
+ [qw{. ⸠Ⳡ⹠. â â â· . ⺠⽠⿠}],
+$verbose ? (
+ [qw{. î© î§ îª . î¥ - î¦ . î« î¨ î¬ }],
+ [qw{. î± î¯ î² . î - î® . î³ î° î´ }],
+) : (),
+
+ 'Line drawing',
+ [qw{. â ⦠â â . â ⬠⣠â . â â© â - }],
+ [qw{. â ⤠â . â ⪠⡠. â ⧠â }],
+ [qw{. â ⥠â . â ⫠⢠. â ⨠â }],
+ [qw{. â ⬠â . â ⼠⤠. â â´ â}],
+ [qw{. â â³ â . ⣠â â« . â â» â}],
+ [qw{. â ⯠â . â ⿠⥠. â â· â}],
+ [qw{. â â° â . â â ⨠. â ⸠â}],
+ [qw{
. â´ â â â â ⶠâ¾
. ⸠â â â
â ⺠â¼
. âµ â â â â â· â¿
. â¹ â â â â â» â½
- }]],
- [ 1 => [qw{. â± â³ â² }]],
- [ 4 => [qw{. â ⦠â â . â ⬠⣠â . â â© â - }]],
- [ 3 => [qw{. â ⤠â . â ⪠⡠. â ⧠â }]],
- [ 3 => [qw{. â ⥠â . â ⫠⢠. â ⨠â }]],
-);
-
-print "Blocks
\n\n";
-print table(@$_) for (
- [ 3 => [qw{. â â â . â â â . â â â }]],
- [ 3 => [qw{. â . â . â }]],
- [ 2 => [qw{. â â â . â â â }]],
- [ 2 => [qw{. â â â â â
â â â . â â â â â â â â }]],
- [ 3 => [qw{. ⡠⣠â . ⤠⦠⥠. ⧠⩠â¨}]],
-);
-
-print "Signs
\n\n";
-print table(@$_) for (
- [ 8 => [qw{. ¤ ¢ ⥠⬠£ ⨠$ Â¥ . â« â ⦠Ⱡ⧠⮠⩠âª}]],
- [ 4 => [qw{. â ⡠⢠⣠. ⤠⥠⦠â§}]],
- [ 5 => [qw{. â â¿ â â â â â â
â â}]], # solar
- [12 => [qw{. â â â â â â â â â â â â}]], # zodiac
-);
-
-print "IPA
\n\n";
-print table(@$_) for (
- [
- 12 => [qw{
- . p p̪ > > t Ê c k q = Ê¡ Ê
- . b b̪ > > d É É É¡ É¢ = - =
- . m ɱ > > n ɳ ɲ Šɴ = = =
- . Ê - > > r - - = Ê = -Ñ =
- . - â±± > > ɾ ɽ - = É¢Ì = - =
- . ɸ f θ s Ê Ê Ã§ x Ï Ä§ Ê h
- . β v ð z Ê Ê Ê É£ Ê Ê Ê¢ ɦ
- . = = > > ɬ - - - - = = =
- . = = > > É® - - - - = = =
- . - Ê > > ɹ É» j É° - - - =
- . = = > > l É Ê Ê - = = =
- . Ê - Ç Ç Ç -â¼ Ç - - = = =
- . É É̪ > > É -á¶ Ê É Ê = = =
- }],
- [
- 'Plosive',
- 'Voiced plosive',
- 'Nasal',
- 'Trill',
- 'Tap/flap',
- 'Fricative',
- 'Voiced fricative',
- 'Lateral fricative',
- 'Voiced lateral fricative',
- 'Approximant',
- 'Lateral approximant',
- 'Click',
- 'Implosive',
- ],
- [
- 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',
- ],
- ],
- [
- 6 => [qw{
- . i y ɨ Ê É¯ u
- . - ɪ Ê - Ê -
- . e ø É Éµ ɤ o
- . - - É - - -
- . É Å É É Ê É
- . æ - É - - -
- . a ɶ - - É É
- }],
- [qw{Close Near-close Close-mid Mid Open-mid Near-open Open}],
- [map {substr($_, 0, 1).':'.$_, substr($_, 0, 1)." r:$_ rounded"} qw{Front Central Back}]
- ],
-);
-
-print "Alphabetics
\n\n";
-print table(1,
- [ map { ('.', split //, $_->[1]) } @$_ ],
- [ map { $_->[0] } @$_ ],
-) for [
- [Latin => 'aīıÄôɳÅṡšÄðƷ'],
- [Cyrillic => 'аÑйÑÑнÑÑÑÑÑЯ'],
- [Greek => 'αίÏηÏÏÏÏÏθξΩ'],
- [Hebrew => '×ײ××¢×× ×סש×צץ'],
-];
-
-print "Japanese
\n\n";
-print table(@$_) for (
- [
- 1 => [qw{
- . ã ã ã ã ã =
- . ã ã ã ã ã =
- . ã ã ã ã ã =
- . ã 㡠㤠㦠㨠=
- . 㪠㫠㬠ã ã® ã
- . 㯠㲠㵠㸠㻠=
- . ã¾ ã¿ ã ã ã =
- . ã = ã = ã =
- . ã ã ã ã ã =
- . ã ã = ã ã =
- }],
- ['', qw{K S T N H M Y R W}],
- [qw{A I U E O}, ''],
- ],
- [
- 1 => [qw{
- . ã ã ã ã ã
- . ã ã ã ã ã
- . ã 㢠㥠㧠ã©
- . 㰠㳠㶠㹠ã¼
- . 㱠㴠㷠㺠ã½
- }],
- [qw{G Z D B P}],
- [qw{A I U E O}],
- ],
- [
- 1 => [qw{
- . 㢠㤠㦠㨠㪠ã¼
- . ã« ã 㯠㱠㳠=
- . ãµ ã· ã¹ ã» ã½ =
- . ã¿ ã ã ã ã =
- . ã ã ã ã ã ã³
- . ã ã ã ã ã =
- . ã ã ã 㡠㢠=
- . 㤠- 㦠- 㨠=
- . 㩠㪠㫠㬠ã =
- . 㯠㰠- 㱠㲠=
- }],
- ['', qw{K S T N H M Y R W}],
- [qw{A I U E O}, ''],
- ],
- [
- 1 => [qw{
- . 㬠㮠㰠㲠ã´
- . 㶠㸠㺠㼠ã¾
- . ã ã ã
ã ã
- . ã ã ã ã ã
- . ã ã ã ã ã
- . 㷠㸠㴠㹠ãº
- }],
- [qw{G Z D B P V}],
- [qw{A I U E O}],
- ],
+ }],
+ [qw{. â± â³ â² }],
+
+ 'Blocks',
+ [qw{. ⡠⣠â . ⤠⦠⥠. ⧠⩠â¨}],
+ [qw{. â . â . â }],
+ [qw{. â â â . â â â . â â â }],
+ [qw{. â â â . â â â }],
+ [qw{. â â â â â
â â â . â â â â â â â â }],
+
+ '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 ɶ - - É É
+ }],
+
+$verbose ? (
+ '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
+ |
+
+
+