--- /dev/null
+<:
+use utf8;
+use strict;
+use warnings;
+use open IO => ':utf8';
+
+our $VERSION = '1.0';
+
+$header{content_type} = 'text/html; charset=utf-8';
+
+:><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+<head>
+<title>digraph cheat sheet</title>
+<meta http-equiv="content-type" content="utf-8">
+<!-- link rel="stylesheet" type="text/css" media="all" href="unicode.css" -->
+<style>
+table {
+ border-collapse: collapse;
+ margin: 1ex;
+}
+td {
+ border: 1px solid #888;
+ text-align: center;
+ vertical-align: top;
+ margin: 0;
+ padding: 0;
+}
+small {
+ font-size: 50%;
+ display: block;
+ width: 3em;
+ background: #888;
+ color: #FFF;
+}
+</style>
+</head>
+
+<body>
+<h1>Common Digraphs</h1>
+
+<:
+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 table {
+ my ($width, $digraphs) = @_;
+
+ my @cells;
+ push @cells, sprintf '<td title="%s">%s%s',
+ $di{ord $_} && $diinfo->{$di{ord $_}}->[1],
+ $_ eq '-' ? ' ' : quote($_),
+ $di{ord $_} && sprintf(' <small>%s</small>', $di{ord $_})
+ for @$digraphs;
+
+ my @rows;
+ push @rows, sprintf '<tr>%s', join '', splice @cells, 0, $width, ()
+ while @cells;
+
+ return sprintf "<table>%s</table>\n", join '', @rows;
+}
+
+print "<h2>Arrows</h2>\n\n";
+print table(@$_) for (
+ [ 4 => [qw{↖ ↑ ↗ ↔ ← - → ↕ ↙ ↓ ↘ -}]],
+ [ 4 => [qw{⇖ ⇑ ⇗ ⇔ ⇐ - ⇒ ⇕ ⇘ ⇓ ⇙ -}]],
+ [ 3 => [qw{◤ ▲ ◥ ◀ ◆ ▶ ◣ ▼ ◢}]],
+ [ 3 => [qw{◸ △ ◹ ◁ ◇ ▷ ◺ ▽ ◿}]],
+);
+
+print "<h2>Line drawing</h2>\n\n";
+print table(@$_) for (
+ [ 4 => [qw{┌ ┬ ┐ ─ ├ ┼ ┤ │ └ ┴ ┘ -}]],
+ [ 4 => [qw{┏ ┳ ┓ ━ ┣ ╋ ┫ ┃ ┗ ┻ ┛ -}]],
+ [ 3 => [qw{┍ ┯ ┑ ┝ ┿ ┥ ┕ ┷ ┙}]],
+ [ 3 => [qw{┎ ┰ ┒ ┠ ╂ ┨ ┖ ┸ ┚}]],
+# [ 4 => [qw{╔ ╦ ╗ ═ ╠ ╬ ╣ ║ ╚ ╩ ╝ -}]],
+# [ 3 => [qw{╒ ╤ ╕ ╞ ╪ ╡ ╘ ╧ ╛}]],
+# [ 3 => [qw{╓ ╥ ╖ ╟ ╫ ╢ ╙ ╨ ╜}]],
+);
+
+print "<h2>Signs</h2>\n\n";
+print table(@$_) for (
+ [ 3 => [qw{▘ ▀ ▝ ▌ █ ▐ ▖ ▄ ▗}]],
+ [ 3 => [qw{░ ▒ ▓ □ ▣ ■ ▤ ▦ ▥ ▧ ▩ ▨}]],
+ [ 4 => [qw{♠ ♡ ♢ ♣ ♤ ♥ ♦ ♧}]],
+ [10 => [qw{☼ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇}]], # solar
+# [12 => [qw{♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓}]], # zodiac
+ [ 8 => [qw{¤ ¢ ₥ € £ ₨ $ ¥ ₫ ₭ ₦ ₱ ₧ ₮ ₩ ₪}]],
+);
+
+print "<h2>IPA</h2>\n\n";
+print table(@$_) for (
+ [12 => [qw{
+ p t - ʈ - c k q - ʔ - ʡ
+ b d - ɖ - ɟ ɡ ɢ - - - -
+ m ɱ - n - ɳ ɲ ŋ ɴ - - -
+ ʙ - - r - - - - - - - -
+ - ⱱ - ɾ - ɽ - - - - - -
+ ɸ f θ s ʃ ʂ ç x χ ħ h ʜ
+ β v ð z ʒ ʐ ʝ ɣ ʁ ʕ ɦ ʢ
+ - - - ɬ - - - - - - - -
+ - - - ɮ - - - - - - - -
+ - ʋ - ɹ - ɻ j ɰ - - - -
+ - - - l - ɭ ʎ ʟ - - - -
+ ʘ - ǀ ǁ ǃ - ǂ - - - - -
+ ɓ - ɗ - - - ʄ ɠ ʛ - - -
+ }]],
+ [6 => [qw{
+ i y ɨ ʉ ɯ u
+ - ɪ ʏ - ʊ -
+ e ø ɘ ɵ ɤ o
+ - - ə - - -
+ ɛ œ ɜ ɞ ʌ ɔ
+ æ - ɐ - - -
+ a ɶ - - ɑ ɒ
+ }]],
+);
+