+
+my %VOWELCOLS = (map { ($_ => 1) } 0, 4, 8, 14, 20, 24);
+say '<table class="glyphs">';
+say '<thead>';
+printtr('order');
+say '</thead>';
+printtr('default');
+say "</table></div>";
+
+sub printtr {
+ for my $id (@_) {
+ my $info = $table->{$id};
+
+ if (ref $info eq 'ARRAY') {
+ printtr(@{$info});
+ next;
+ }
+
+ printf '<tr id="%s">', $id;
+ my $th = 'th';
+ $th .= sprintf ' title="%s"', $_ for $info->{title} || ();
+ say "<$th>", $info->{name} // ucfirst $id;
+
+ my $colspan = 1;
+ my $col = 0;
+ for (@{ $info->{list} }) {
+ $col++;
+ if ($_ eq '>') {
+ $colspan++;
+ next;
+ }
+ my @class;
+ push @class ,'l0' if $VOWELCOLS{$col - $colspan};
+ push @class, $_ ? 'ex' : 'u-invalid' if s/^-//;
+
+ print "\t<td";
+ if ($col > 26) {
+ # special character for sample generation
+ print ' hidden'; # sample only
+ }
+ else {
+ print ' title=', chr($col + ord('A') - $colspan);
+ }
+ if ($colspan > 1) {
+ print " colspan=$colspan";
+ $colspan = 1;
+ }
+ printf ' class="%s"', "@class" if @class;
+ print '>';
+ say;
+ }
+ }