latin: tap code function per cell like dispbar
[sheet.git] / writing-latn.inc.pl
index 1be023d367e7e17f184785ae3cb2a3b44b003d36..59218023b9cce42bc44ffc27c36bab3daef85036 100644 (file)
@@ -1,22 +1,42 @@
+use 5.014;
 use utf8;
-use List::Util qw( pairs );
+use List::Util qw( pairs pairmap sum );
+
+my %C = qw(red #EC1C24  blue #3953A3  yellow #F9EC31  black #231F20);
+my $U = 0;  # optional unicode alternatives
 
 sub disptap {
-       return map {
-               !m/\A(-?)(\d)(\d)/ ? $_ :
-               $1.join(' ',
-                       '·' x $2, '·' x $3,
-               );
-       } @_;
+       my $code = shift;
+       $code =~ m/\A(-?)(\d)(\d)/ or return $code;
+       return $1 . join(' ', '·' x $2, '·' x $3);
 }
 
-my %C = qw(red #EC1C24  blue #3953A3  yellow #F9EC31  black #231F20);
-my $U = 0;  # optional unicode alternatives
+sub dispbar {
+       my $code = shift;
+
+       return join '', pairmap {
+               ($a =~ tr/123/❘❙❚/r) . ($b =~ tr/321/  /dr)
+       } split //, $code if $U;
+
+       my @cols = split //, $code;  # bar and space widths
+       my $width = sum(@cols);
+       return sprintf(
+               '<svg width="%d" height="%d" viewBox="-.5 0 %d %d"><path d="%s"/></svg>',
+               $width * 2, 14, $width, 7, join(' ',
+                       'M0,0',
+                       map {
+                               join('m1,-7', ('v7') x $_->[0]),  # line per bar width
+                               (map { sprintf 'm%d,-7', $_ + 1 } $_->[1] || ()),  # space forward
+                       }
+                       pairs @cols
+               )
+       );
+}
 
 (
 'Uppercase' => [qw{ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }],
 'Lowercase' => [qw{ a b c d e f g h i j k l m n o p q r s t u v w x y z }],
-'Sütterlin' => [qw{ a b c d e f g h i j k l m n o p q r ſs t u v w x y z }],
+'Sütterlin' => [qw{ a b c d e f g h i j k l m n o p q r ſ s t u v w x y z }],
 'Old Roman Cursive' => [
        map { m/^(-?)(\w.*)/ ? $1.'<svg width="20" height="20" viewBox="0 0 12 20"><path d="'.$2.'"/></svg>' : $_ }
        "m2,4 c1,2 8,9 8,9 M2,15 6,9",
@@ -83,14 +103,14 @@ my $U = 0;  # optional unicode alternatives
        .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. --
        -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..
 }],
-'Tap code' => [disptap(qw{
+'Tap code' => [map { disptap($_) } qw{
        11 12 13 14 15 21 22 23  > 24 25 31 32
        33 34 35 41 42 43 44 45 51 52 53 54 55
-})],
-'Tap simplified' => [disptap(qw{
+}],
+'Short Tap' => [map { disptap($_) } qw{
        11 12 13 14 21 22 23 20 > 31 -13 32 33
        30 41 42 -13 43 40 10 51 52 53 50 -31 -40
-})],
+}],
 'Cards' => [(
        map { chr(0x1F0A0 + $_), sprintf('<b>%s</b>', chr(0x1F0B0 + $_)) }  # spades, hearts
        1 .. 11, 13, 14  # A 2-10 J Q K
@@ -264,24 +284,11 @@ my $U = 0;  # optional unicode alternatives
                201112 102112 202111 101212 201211 102211        102121 0 101221
        )
 ],
-'Code 93' => [
-       map {
-               sprintf
-               '<svg width="18" height="14" viewBox="-.5 0 9 7"><path d="M0,0 %s"/></svg>',
-               join ' ',
-               map {
-                       join('m1,-7', ('v7') x $_->[0]),  # line per bar width
-                       (map { sprintf 'm%d,-7', $_ + 1 } $_->[1] || ()),  # space forward
-               }
-               pairs split //
-       }
-       # bar and space widths (1-3)
-       qw(
-               21111 21121 21131 22111 22121 23111 11211 11221 11231
-               12211 13211 11112 11122 11132 12112 13112 21211 21221
-               21112 21122 22112 22211 11212 11222 12212 12311 31121
-       )
-],
+'Code 93' => [map { dispbar($_) } qw(
+       211113 211212 211311 221112 221211 231111 112113 112212 112311 122112
+       132111 111123 111222 111321 121122 131121 212112 212211 211122 211221
+       221121 222111 112122 112221 122121 123111        311211
+)],
 'Code 128' => [
        map { $U ? tr/1-3-/❘❙❚ /r : sprintf
                '<svg width="22" height="14" viewBox="-.5 0 11 7"><path d="M0,0 %s"/></svg>',
@@ -301,15 +308,19 @@ my $U = 0;  # optional unicode alternatives
        )
 ],
 '<abbr title="Royal Mail 4-State Customer Code">RM4SCC</abbr>' => [
-       map { sprintf
-               '<svg width="20" height="20" viewBox="0 0 8 6">'
-               . '<path d="M1%s"/></svg>',
-               join ' m2',
-               map { sprintf ',%dv%dm0,-%d',
-                       ($_ & 1 ? 0 : 2),  2 + ($_ & 2) + ($_ & 1) * 2,
-                       ($_ & 1 ? 0 : 2) + 2 + ($_ & 2) + ($_ & 1) * 2,
-               }
-               split //
+       map {
+               my $len = length $_;
+               !$len ? '' : sprintf(
+                       '<svg width="%d" height="20" viewBox="0 0 %d 6">'
+                       . '<path d="M1%s"/></svg>',
+                       $len * 5, $len * 2,
+                       join ' m2',
+                       map { sprintf ',%dv%dm0,-%d',
+                               ($_ & 1 ? 0 : 2),  2 + ($_ & 2) + ($_ & 1) * 2,
+                               ($_ & 1 ? 0 : 2) + 2 + ($_ & 2) + ($_ & 1) * 2,
+                       }
+                       split //
+               );
        }
        qw(
                                    2121 2301
@@ -318,7 +329,31 @@ my $U = 0;  # optional unicode alternatives
                1032 1212 1230 3012 3030 3210
                1122 1302 1320 3102 3120 3300
                0033
-       ) # 0 for space
+       ), # 0 for space
+       '', 1, 3  # start/end
+],
+"D'ni" => [
+       map {
+               state $window = 'M-.5,-.5H8.5V8.5H-.5Z';
+               state $v = [
+                       '',
+                       'M0,4 8,4',
+                       'M0,8 Q4,4 8,8',
+                       'M0,4 4,8 8,4',
+                       'M2,0 2,4 8,4',
+                       'M0,0 8,8 M0,8 8,0', # cross
+                       'M3.5,4 h1', # dot
+               ];
+               state $h = [
+                       '',
+                       'M4,0 4,8',
+                       'M0,0 Q4,4 0,8',
+                       'M4,-.5 0,4 4,8.5',
+                       'M4,8 4,2 8,2',
+               ];
+               sprintf '<svg width="16" height="16" viewBox="-.5 -.5 9 9"><path d="%s"/></svg>',
+                       $window . ($h->[$_ % 5] . $v->[$_ / 5] || $v->[6]);
+       } 0 .. 5*5
 ],
 'Pigpen' => [
        map {