latin: tap code function per cell like dispbar
[sheet.git] / writing-latn.inc.pl
index 43b77b341f541bf442e1c793bdd958ff14696e67..59218023b9cce42bc44ffc27c36bab3daef85036 100644 (file)
@@ -1,22 +1,42 @@
+use 5.014;
 use utf8;
 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 {
 
 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 }],
 
 (
 '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",
 '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
        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
        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
 'Cards' => [(
        map { chr(0x1F0A0 + $_), sprintf('<b>%s</b>', chr(0x1F0B0 + $_)) }  # spades, hearts
        1 .. 11, 13, 14  # A 2-10 J Q K
@@ -256,30 +276,19 @@ my $U = 0;  # optional unicode alternatives
 ],
 'Code 39' => [
        # ISO/IEC 16388
 ],
 'Code 39' => [
        # ISO/IEC 16388
-       map { tr/012/ ❘❙/r } qw(
+       map { !!$_ && tr/012/ ❘❙/r }
+       # bar widths (1-2) followed by space of width 1 (implied) or 2 (0)
+       qw(
                211012 121012 221011 112012 212011 122011 111022 211021 121021 112021
                211102 121102 221101 112102 212101 122101 111202 211201 121201 112201
                211012 121012 221011 112012 212011 122011 111022 211021 121021 112021
                211102 121102 221101 112102 212101 122101 111202 211201 121201 112201
-               201112 102112 202111 101212 201211 102211                      102121
-       )
-],
-'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
+               201112 102112 202111 101212 201211 102211        102121 0 101221
        )
 ],
        )
 ],
+'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>',
 '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>',
@@ -299,15 +308,19 @@ my $U = 0;  # optional unicode alternatives
        )
 ],
 '<abbr title="Royal Mail 4-State Customer Code">RM4SCC</abbr>' => [
        )
 ],
 '<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
        }
        qw(
                                    2121 2301
@@ -316,7 +329,31 @@ my $U = 0;  # optional unicode alternatives
                1032 1212 1230 3012 3030 3210
                1122 1302 1320 3102 3120 3300
                0033
                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 {
 ],
 'Pigpen' => [
        map {