-print '<table class="glyphs"><tbody>'."\n";
-for (my $i = 0; $i <= $#info; $i++) {
- my $name = $info[$i++];
- my ($input, $char, $desc) = @{ $info[$i] };
- if ($char < 0) {
- # inexact
- $char = -$char;
+for my $system (qw'gmail msn yahoo') {
+ my @info = do "emoji-$system.inc.pl";
+ my $meta = shift @info or die $@;
+ ref $meta eq 'HASH' or Abort("Invalid $system definitions", 404);
+ my $title = $meta->{name} // $system;
+ $title = showlink($title, $_) for $meta->{source} || ();
+
+ say sprintf '<div class="section"><h2>%s</h2>', $meta->{name} // $system;
+ say '<table><tbody>';
+ for (my $i = 0; $i <= $#info; $i++) {
+ my $name = $info[$i];
+ unless (ref $info[$i+1] eq 'ARRAY') {
+ say '</table><table><tbody>';
+ next;
+ }
+ my ($input, $flags, $char, $desc) = @{ $info[++$i] };
+ say sprintf('<tr><th><img src="%s" alt="%s"><td><kbd>%s</kbd><td>%s%s',
+ sprintf($meta->{ $flags =~ /\bext\b/ ? 'iconext' : 'icon' } // '%s', $name),
+ EscapeHTML($name),
+ EscapeHTML($input),
+ $desc // $name,
+ $char ? '<td>'.chr($char) : '',
+ );