index: release v1.18 with only altgr index linked
[sheet.git] / writing-latn.inc.pl
index ad13ae5fe3905112aceb1c4843d2e5663260811a..4ad57fff76110e15849bd48444e6dc73b6bc4169 100644 (file)
@@ -1,7 +1,7 @@
 use 5.014;
 use utf8;
 use warnings;
-use List::Util qw( pairs pairmap sum );
+use List::Util qw( pairs pairmap sum min max );
 
 my %C = (
        red    => '#EC1C24',
@@ -60,6 +60,22 @@ sub dispdomino {
        return $prefix . chr(0x1F031 + ($dots[0] * 7) + $dots[1]);
 }
 
+sub dispdash {
+       my $code = shift;
+       my ($prefix, @dots) = $code =~ m/\A(-?)(\d)(\d)/ or return $code;
+       my ($w, $h) = (max(6, 4 * max(@dots)), 9);
+       my ($w0, $w1) = ($w / $dots[0], $dots[1] ? $w / $dots[1] : 1);
+       return sprintf(
+               '<svg height="20"%s viewBox="-.5 -.5 %s %s">'
+               . '<path d="%s" /></svg>',
+               $prefix && ' style="opacity:.5"',
+               $w + 1, $h + 1, join(' ',
+                       "m0,$h l+$w0,-$h" x $dots[0], # slashes
+                       "m0,$h l-$w1,-$h" x $dots[1], # backslashes
+               )
+       );
+}
+
 sub dispblock {
        my $code = shift;
        my ($prefix, $shape, $rotate) = $code =~ m/\A(-?)(\w)(\d?)/
@@ -76,15 +92,20 @@ sub dispblock {
                i => 'm0,1h2',
                o => 'm0,1h1',
        );
-       my %col = qw(
-               S 120  Z 0  J 240  L 30  T 300  O 60  I 180
-               v 45,50%  i 165,50%  o 165,0%
+       my %col = (
+               S => 120, Z => 0, J => 240, L => 30, T => 300, O => 60, I => 180,
+               v => '45,50%', i => '165,50%', o => '165,0%',
        );
        s/\z(?<!%)/,100%/ for values %col;
+       my @gaps = (grep $_,
+               $code =~ /[Ii]$|T[23]|L3?$|S1|Z$|J1|v3?$/ ? 'gapl1' : (),
+               $code =~ /T$|L2|Z$/ ? 'gapr1' : (),
+       );
        return sprintf(
-               '<svg height="24" viewBox="-.5 -.5 %s 4">'
+               '<svg height="24" viewBox="-.5 -.5 %s 4"%s>'
                . '<path d="%s" stroke="%s" fill="none"%s /></svg>',
                $code eq 'I' ? 4 : $code =~ /T3|[LJO]$|[Iio]1/ ? 2 : 3,
+               @gaps ? qq( class="@gaps") : '',
                $path{$shape}, "hsl($col{$shape},50%)", join('',
                        $rotate && sprintf(' transform="rotate(%s 1 1)"', $rotate * 90),
                        $prefix && ' style="opacity:.5"',
@@ -131,7 +152,23 @@ sub disphues {
        );
 }
 
-(
++{
+default => [qw( written sign digital touch tactile sound games semaphore barcode personal )],
+written => [qw( uppercase lowercase suetterlin roman )],
+digital => [qw( stroke ita2 )],
+stroke => [qw( graffiti unistrokes edgewrite )],
+touch => [qw( moon braille )],
+sign => ['sutton'],
+sound => [qw( morse tap shorttap )],
+games => [qw( domino tetromino cards )],
+semaphore => [qw( maritime flag chappe prussian )],
+barcode => [qw( rm4scc code39 code93 code128 )],
+personal => [qw( rgbmap cmymap dni pigpen nyctographs chromacons )],
+
+order => {
+       name => '#',
+       list => [1 .. 26],
+},
 uppercase => {
        list => [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 }],
 },
@@ -146,6 +183,7 @@ suetterlin => {
                        src: url("/suetterlin.ttf");
                }',
                'td { font-family: Suetterlin }',
+               'td:hover::first-letter { text-transform: uppercase }',
        ],
        list => [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 }],
 },
@@ -203,6 +241,17 @@ sutton => {
                0         965aa6
        }],
 },
+graffiti => {
+       name => 'Palm Graffiti',
+       style => [
+               '@font-face {
+                       font-family: Graffiti;
+                       src: url("/graffiti.ttf");
+               }',
+               'td { font-family: Graffiti }',
+       ],
+       list => [qw{ a b c d e f g h i j k l m n o p q r s t u v w * y z }],
+},
 unistrokes => {
        name => 'Unistrokes',
        url   => 'https://www.google.com/patents/US5596656', # by Xerox
@@ -210,8 +259,9 @@ unistrokes => {
        list => [
                map { '<svg width="14" height="16" viewBox="-1 -1 8 10">'.$_.'</svg>' }
                map {
-                       sprintf('<circle cx="%s" cy="%s" r="1"/>', m/\AM(\d+),(\d+)(.?)/) . # start point
-                       (!!$3 && qq(<path d="$_"/>))
+                       my ($x, $y, $next) = m/\AM(\d+),(\d+)(.)?/;
+                       sprintf('<circle cx="%s" cy="%s" r="1"/>', $x, $y) . # start point
+                       (defined $next && qq(<path d="$_"/>))
                }
                'M3,8 V0',
                'M0,0 6,4 0,8',
@@ -267,9 +317,6 @@ edgewrite => {
                )
        ],
 },
-#graffiti => {
-#      name => 'Palm Graffiti',
-#},
 ita2 => {
        name => '<abbr title="International Telegraph Alphabet">ITA</abbr>2',
        style => [@wrapstyle, 'td { font-size: 50% }'],
@@ -350,17 +397,21 @@ tap => {
 shorttap => {
        name => 'Short Tap',
        style => \@tapstyle,
-       list => [map { disptap($_) } qw{
+       altlist => [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
        }],
-       altlist => [map { disptap($_) } qw{
-               10 14 -13 12 20 23 22 21 30 -34 13 33 32
-               31 40 43 -13 42 41 11 50 -23 -50 -1341 -31 -41
+       list => [map { dispdash($_) } qw{
+               10 14 -24 12 20 23 22 21 30 -34 13 33 32
+               31 40 43 -13 42 41 11 50 -53 -44 -52 -51 -54
        }],
 },
 domino => {
        name => 'Domino tiles',
+       style => [
+               # enlarge single tile height to span full vertical combinations
+               'td { font-size: 200%; line-height: .6; padding: 0 0 .3ex }',
+       ],
        list => [map { dispdomino($_) } qw{
                10 11 20 21 22 30 31 32 33 40 41 42 43
                44 50 51 52 53 54 55 60 61 62 63 64 65
@@ -369,6 +420,7 @@ domino => {
 tetromino => {
        style => [
                'svg path { stroke-linecap: square }',
+               '.sample .gapl1 + .gapr1 { margin-left: -6.3px }',
        ],
        name => 'Tetrominos',
        list => [map { dispblock($_) } qw{
@@ -726,7 +778,10 @@ nyctographs => {
 },
 chromacons => {
        title => 'Colour Alphabet by Paul Green-Armytage (2010)',
-#      style => '.sample { word-break: break-all }',
+       style => [
+               #'.sample { word-break: break-all }',
+               '.sample { background: white }',
+       ],
        list => [
                map {
                        sprintf('<span%s>%s</span>',
@@ -745,4 +800,4 @@ chromacons => {
                }
        ],
 },
-);
+};