X-Git-Url: http://git.shiar.nl/sheet.git/blobdiff_plain/667fc3716d8e2e824df69cf0e4f446b72e5f76d8..HEAD:/writing-latn.inc.pl diff --git a/writing-latn.inc.pl b/writing-latn.inc.pl index 9cd97c9..4ad57ff 100644 --- a/writing-latn.inc.pl +++ b/writing-latn.inc.pl @@ -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', @@ -15,10 +15,10 @@ my @wrapstyle = ( 'td { white-space: normal; word-spacing: 10em }', # force line break between words '.sample { word-spacing: 0 }', - '.sample span { margin-right: 1ex; white-space: nowrap; display: inline-block }', + '.sample svg { margin-right: 1ex; white-space: nowrap; display: inline-block }', # larger space between letters ); -my $spacestyle = '.sample span { margin-right: 0.5ex }'; # separate letters +my $spacestyle = '.sample svg { margin-right: 0.5ex }'; # separate letters my @tapstyle = ( @wrapstyle, '{ line-height: 1ex }', @@ -53,6 +53,66 @@ sub disptap { return $prefix . join(' ', map { '·' x $_ } @dots); } +sub dispdomino { + my $code = shift; + my ($prefix, @dots) = $code =~ m/\A(-?)(\d)(\d)/ or return $code; + # unicode glyph alternative as DOMINO TILE HORIZONTAL-0a-0b + 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( + '' + . '', + $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?)/ + or return $code; + my %path = ( + S => 'm0,1h1v-1h1', + Z => 'm0,0h1v1h1', + L => 'm0,0v2h1', + v => 'm0,0v1h1', + J => 'm1,0v2h-1', + T => 'm0,0h2.5h-1.5v1', + O => 'm0,0h1v1h-1', + I => 'm0,1h3', + i => 'm0,1h2', + o => 'm0,1h1', + ); + 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(?' + . '', + $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"', + ), + ); +} + sub dispbar { my $code = shift or return ''; @@ -92,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 }], }, @@ -107,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 }], }, @@ -114,7 +191,7 @@ roman => { name => 'Old Roman Cursive', style => [ 'svg path { stroke-linecap: round; stroke-linejoin: round }', - '.sample span { margin-right: -10px }', + '.sample svg { margin-right: -10px }', ], list => [ map { @@ -164,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 @@ -171,8 +259,9 @@ unistrokes => { list => [ map { ''.$_.'' } map { - sprintf('', m/\AM(\d+),(\d+)(.?)/) . # start point - (!!$3 && qq()) + my ($x, $y, $next) = m/\AM(\d+),(\d+)(.)?/; + sprintf('', $x, $y) . # start point + (defined $next && qq()) } 'M3,8 V0', 'M0,0 6,4 0,8', @@ -228,9 +317,6 @@ edgewrite => { ) ], }, -#graffiti => { -# name => 'Palm Graffiti', -#}, ita2 => { name => 'ITA2', style => [@wrapstyle, 'td { font-size: 50% }'], @@ -240,6 +326,38 @@ ita2 => { 00100 )], }, +moon => { + list => [ + map { qq() } + 'M0,6 3,0 6,6', + 'M1,0 V4 A2,2 0,0,0 5,4', + 'M5,0 A4.5,3 0,0,0 5,6', + 'M1,0 A4.5,3 0,0,1 1,6', + 'M0,6 V0 H6', + 'M1,6 V2 A2,2 0,0,1 5,2', + 'M5,6 V2 A2,2 0,1,0 1,2', + 'M1.5,3 A1.5,1.5 0,0,0 4.5,3 1.5,1.5 0,0,0 1.5,3 M3,1.5 A1,1.5 0,0,0 3,4.5', + 'M3,0 V6', + 'M5,0 V4 A2,2 0,0,1 1,4', + 'M6,0 0,3 6,6', + 'M0,0 V6 H6', + 'M0,0 H6 V6', + 'M0,6 V2 L6,6 V0', + 'M0,3 A3,3 0,0,0 6,3 3,3 0,0,0 0,3', + 'M6,4 H2 A2,1 0,0,1 2,2', + 'M0,4 H4 A2,1 0,0,0 4,2', + 'M0,0 6,6', + 'M0,6 6,0', + 'M0,3 H6', + 'M0,0 V3 A3,3 0,0,0 6,3 V0', + 'M0,0 3,6 6,0', + 'M0,6 V3 A3,3 0,0,1 6,3 V6', + 'M0,0 6,3 0,6', + 'M6,0 V6 H0', + 'M0,0 H6 L2,6 H6', + ], + style => 'svg path { stroke-linecap: round; stroke-linejoin: round }', +}, braille => { list => [qw{ ⠁ ⠃ ⠉ ⠙ ⠑ ⠋ ⠛ ⠓ ⠊ ⠚ ⠅ ⠇ ⠍ ⠝ ⠕ ⠏ ⠟ ⠗ ⠎ ⠞ ⠥ ⠧ ⠺ ⠭ ⠽ ⠵ }], }, @@ -279,10 +397,39 @@ 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 }], + 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 + }], +}, +tetromino => { + style => [ + 'svg path { stroke-linecap: square }', + '.sample .gapl1 + .gapr1 { margin-left: -6.3px }', + ], + name => 'Tetrominos', + list => [map { dispblock($_) } qw{ + T2 T1 I T3 + i L1 J L3 + o1 I1 L2 L -S1 Z1 + O J2 v2 -J3 S T + J1 v1 v v3 i1 Z + }], }, cards => { style => 'td { font-family: Symbola, "DejaVu Sans", serif, sans }', @@ -548,7 +695,7 @@ dni => { name => "D'ni", style => [ 'svg { border: 1px solid currentColor }', - '.sample span + span svg { border-left: 0 }', + '.sample svg + svg { border-left: 0 }', ], list => [ map { @@ -630,9 +777,12 @@ nyctographs => { ], }, chromacons => { -# style => '.sample { word-break: break-all }', + title => 'Colour Alphabet by Paul Green-Armytage (2010)', + style => [ + #'.sample { word-break: break-all }', + '.sample { background: white }', + ], list => [ - # Colour Alphabet by Paul Green-Armytage (2010) map { sprintf('%s', !!$_ && sprintf(' style="background:#%s" title="%s"', split /:/), @@ -650,4 +800,4 @@ chromacons => { } ], }, -); +};