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'],
});
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',
- taps => 'Tap simplified',
- ics => 'Maritime flags', # International Code of Signals
-);
+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>