latin: encode row data in named hashes
[sheet.git] / latin.plp
index eb648c3d85d912ea71e628f30d89e89aa784115c..1dcd8c7881f81f7757426665289677f3e28f7504 100644 (file)
--- a/latin.plp
+++ b/latin.plp
@@ -2,15 +2,16 @@
 
 Html({
        title => 'latin alphabet cheat sheet',
-       version => 'v1.1',
+       version => '1.3',
        description => [
        ],
        keywords => [qw'
                latin roman alphabet script letter unicode font glyph abc
-               writing comparison character sample test language spelling
-               cursive fraktur blind deaf
+               code encoding spelling symbol writing comparison character
+               secret cursive fraktur blind braille morse deaf asl hand
+               barcode bar color semaphore flag
        '],
-       stylesheet => [qw'light dark red'],
+       stylesheet => [qw( light dark red mono )],
        data => ['writing-latn.inc.pl'],
 });
 
@@ -20,44 +21,156 @@ Html({
                font-family: Suetterlin; /* R. G. Arens */
                src: url("/suetterlin.ttf");
        }
-       .glyphs tr:first-child+tr td { font-family: Suetterlin }
+       #sütterlin td { font-family: Suetterlin }
+       #ita2 td,
+       #tap-code td,
+       #short-tap td {
+               white-space: normal;
+               word-spacing: 5em; /* force line break between words */
+       }
+       #tap-code td,
+       #short-tap td {
+               line-height: 1ex;
+       }
+       #ita2 td {
+               font-size: 50%;
+       }
+       #cards td {
+               font-family: Symbola, "DejaVu Sans", serif, sans;
+       }
+       #pigpen {
+               stroke-linecap: square;
+       }
+       #nyctographs,
+       #old-roman-cursive {
+               stroke-linecap: round;
+               stroke-linejoin: round;
+       }
+       td {
+               white-space: nowrap;
+       }
+       th {
+               width: auto !important;
+       }
+
+       .sample {
+               vertical-align: middle;
+               text-align: left;
+               padding: 1px 0.3em;
+       }
+       #old-roman-cursive .sample span {
+               margin-right: -10px;
+       }
+       #tap-code .sample,
+       #short-tap .sample {
+               font-size: 80%;
+       }
+       #ita2 .sample,
+       #tap-code .sample,
+       #short-tap .sample {
+               word-spacing: 0;
+       }
+       #ita2 .sample span,
+       #tap-code .sample span,
+       #short-tap .sample span {
+               margin-right: 1ex;
+               white-space: nowrap;
+       }
+       #sutton-asl .sample span,
+       #maritime-flags .sample span,
+       #morse .sample span {
+               margin-right: 0.5ex;
+       }
+       #pigpen .sample svg {
+               margin-right: 0.1em;
+       }
+       #nyctographs .sample svg {
+               background: rgba(0,0,0, .1);
+               padding: 0.1em;
+               margin-right: 0.2em;
+       }
+       #unistrokes svg path {
+               stroke-linecap: round;
+               stroke-linejoin: round;
+       }
+
+       svg path:not([fill]) {
+               stroke: currentColor;
+               fill: none;
+       }
+       svg circle:not([fill]) {
+               fill: currentColor;
+       }
+
+       td {
+               vertical-align: top;
+       }
+       td svg {
+               vertical-align: middle;
+       }
 </style>
 
 <h1>Latin alphabet</h1>
 
-<p>Also see <a href="/writing">other alphabets</a>
-and <a href="/unicode">common chars</a>.</p>
+<p id=intro>Variant encodings of the common ASCII (latin, roman,
+or <span title="fuck yeah!">'mercan</span>) letters A–Z.
+Also see <a href="/writing">related alphabets</a>
+and <a href="/chars/abc">font comparison</a>.</p>
 
-<div class="-diinfo">
+<div>
 
 <:
-use Shiar_Sheet::FormatChar;
-my $glyphs = Shiar_Sheet::FormatChar->new;
-unless (exists $get{v}) {
-       $glyphs->{unicode}--;
-       $glyphs->{anno}  = [];
-       $glyphs->{style} = 0;
-}
-
-my %scriptname = (
-       latn     => 'Latin',
-       latfsuet => 'Sütterlin',
-       asl      => '<abbr title="American Sign Lanugage">ASL</abbr>', # American manual alphabet
-       brai     => 'Braille',
-       morse    => 'Morse',
-       tap      => 'Tap code',
-);
+use List::Util qw( pairs );
 
 my @table = do 'writing-latn.inc.pl';
 if ($! or $@) {
-       printf "<p class=error>Table data not found: <em>%s</em>.</p>\n", $@ || $!;
+       Alert("Table data not found", $@ || $!);
 }
 else {
-       print $glyphs->table([map {
-               ref $_ ne 'ARRAY' ? ".>$scriptname{$_}"
-                       : exists $get{uc} ? map {uc} @$_ : @$_
-       } @table]);
+       my %VOWELCOLS = (map { ($_ => 1) } 0, 4, 8, 14, 20, 24);
+       say '<table class="glyphs">';
+       say '<thead><tr><th># <small>ASCII − 64</small>';
+       print '<td>', $_ for 1 .. 26;
+       say '</thead>';
+
+       for my $row (pairs @table) {
+               my ($title, $info) = @{$row};
+               printf '<tr id="%s">', (lc $title) =~ s/<[^>]+>//gr =~ s/\s+/-/gr;
+               say '<th>', $title;
+               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;
+               }
+       }
+       say "</table>\n";
 }
 
-print "</div>\n";
+:></div>
+
+<script type="text/javascript" src="/latinsample.js"></script>
+<script type="text/javascript"> prependinput(document.getElementById('intro')) </script>