charset: unabbreviated planes in unicode preset
[sheet.git] / latin.plp
index 9dd8fe93ada0c9e16377184dc1d061a179d8acc0..193779b6d28f6132e05799229df7ab68526bade2 100644 (file)
--- a/latin.plp
+++ b/latin.plp
@@ -21,12 +21,60 @@ Html({
                font-family: Suetterlin; /* R. G. Arens */
                src: url("/suetterlin.ttf");
        }
-       .glyphs tr:first-child+tr+tr td { font-family: Suetterlin }
+       #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 {
+               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;
@@ -41,21 +89,83 @@ Html({
 <p>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="/unicode">common chars</a>.</p>
+and <a href="/chars/abc">font comparison</a>.</p>
 
 <div>
 
 <:
+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 {
        say '<table class="glyphs">';
-       print ref $_ ne 'ARRAY' ? "<tr><th>$_\n" : map {/^<td/ ? $_ : "\t<td>$_\n"} @$_
-               for @table;
+       for my $row (pairs @table) {
+               my ($title, $cells) = @{$row};
+               printf '<tr id="%s">', (lc $title) =~ s/<[^>]+>//gr =~ s/\s+/-/gr;
+               say '<th>', $title;
+               my $colspan = 1;
+               for (@{$cells}) {
+                       if ($_ eq '>') {
+                               $colspan++;
+                               next;
+                       }
+                       print "\t<td";
+                       if ($colspan > 1) {
+                               print " colspan=$colspan";
+                               $colspan = 1;
+                       }
+                       print ' class=', $_ ? 'ex' : 'u-invalid' if s/^-//;
+                       print '>';
+                       say;
+               }
+       }
        say "</table>\n";
 }
 
 :></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>