common: bump version to 1.11
[sheet.git] / latin.plp
index 1c2e229..199a49c 100644 (file)
--- a/latin.plp
+++ b/latin.plp
@@ -2,7 +2,7 @@
 
 Html({
        title => 'latin alphabet cheat sheet',
-       version => '1.3',
+       version => '1.5',
        description => [
        ],
        keywords => [qw'
@@ -11,79 +11,38 @@ Html({
                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'],
 });
 
 :>
 <style>
-       @font-face {
-               font-family: Suetterlin; /* R. G. Arens */
-               src: url("/suetterlin.ttf");
-       }
-       #sütterlin td { font-family: Suetterlin }
-       #tap-code td,
-       #tap-simplified td {
-               line-height: 1ex;
-               white-space: normal;
-               word-spacing: 5em; /* force line break between words */
-       }
-       #pigpen {
-               stroke-linecap: square;
-       }
-       #nyctographs,
-       #old-roman-cursive {
-               stroke-linecap: round;
-               stroke-linejoin: round;
-       }
-       td {
-               white-space: nowrap;
-       }
-
-       .sample {
+       td svg {
                vertical-align: middle;
        }
-       #old-roman-cursive .sample span {
-               margin-right: -10px;
-       }
-       #tap-code .sample,
-       #tap-simplified .sample {
-               font-size: 80%;
-               word-spacing: 0;
-       }
-       #tap-code .sample span,
-       #tap-simplified .sample span {
-               margin-right: 1ex;
-               white-space: nowrap;
-       }
-       #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;
-       }
-
        svg path:not([fill]) {
                stroke: currentColor;
                fill: none;
        }
+       svg circle:not([fill]) {
+               fill: currentColor;
+       }
 
-       td {
-               vertical-align: top;
+       .sample {
+               text-align: left;
+               padding: 1px 0.3em;
        }
-       td > svg {
-               vertical-align: middle;
+       td.sample {
+               width: auto;
+       }
+       th {
+               white-space: nowrap; /* prevent resize by sample */
        }
 </style>
 
 <h1>Latin alphabet</h1>
 
-<p>Variant encodings of the common ASCII (latin, roman,
+<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>
@@ -98,23 +57,54 @@ if ($! or $@) {
        Alert("Table data not found", $@ || $!);
 }
 else {
+       say '<style>';
+       for my $row (pairs @table) {
+               my ($id, $info) = @{$row};
+               my $style = $info->{style} or next;
+               ref $style or $style = [$style];
+               say "\t", !/^@/ && "#$id ", $_ for @{$style};
+       }
+       say "</style>\n";
+
+       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, $cells) = @{$row};
-               printf '<tr id="%s">', (lc $title) =~ s/<[^>]+>//gr =~ s/\s+/-/gr;
-               say '<th>', $title;
+               my ($id, $info) = @{$row};
+
+               printf '<tr id="%s">', $id;
+               my $th = 'th';
+               $th .= sprintf ' title="%s"', $_ for $info->{title} || ();
+               say "<$th>", $info->{name} // ucfirst $id;
+
                my $colspan = 1;
-               for (@{$cells}) {
+               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;
                        }
-                       print ' class=', $_ ? 'ex' : 'u-invalid' if s/^-//;
+                       printf ' class="%s"', "@class" if @class;
                        print '>';
                        say;
                }
@@ -124,45 +114,8 @@ else {
 
 :></div>
 
-<script>
-var inputel = document.createElement('INPUT');
-inputel.oninput = function () {
-       var rows = document.getElementsByClassName('glyphs')[0].rows;
-       for (var row of rows) {
-               cols = [ row.cells[0] ];
-               for (var col = 1; col <= 26; col++) {
-                       cols[col] = cols[ col - 1 ].nextSibling;
-                       for (var span = 1; span < cols[col].colSpan; span++) {
-                               var same = cols[col];
-                               cols[++col] = same;
-                       }
-               }
-               var samplecol = row.getElementsByClassName('sample');
-               if (samplecol.length) {
-                       samplecol = samplecol[0];
-               }
-               else {
-                       samplecol = row.appendChild(document.createElement('TD'));
-                       samplecol.className = 'sample';
-               }
-
-               var output = '';
-               var input = inputel.value.toUpperCase();
-               for (var i = 0; i < input.length; i++) {
-                       var col = input.charCodeAt(i) - 64;
-                       if (col < 1 || col > 26) {
-                               output += ' &nbsp; ';
-                       }
-                       else {
-                               output += '<span>' + cols[col].innerHTML.trimRight() + '</span>';
-                       }
-               }
-               samplecol.innerHTML = output;
-       }
-};
-
-var container = document.createElement('P');
-container.appendChild(inputel);
-document.body.appendChild(container);
+<script type="text/javascript" src="/latinsample.js"></script>
+<script type="text/javascript"><!--
+       prependinput(document.getElementById('intro'));
+//--></script>
 
-</script>