return $prefix . chr(0x1F031 + ($dots[0] * 7) + $dots[1]);
}
+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 = qw(
+ 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;
+ return sprintf(
+ '<svg height="24" viewBox="-.5 -.5 %s 4">'
+ . '<path d="%s" stroke="%s" fill="none"%s /></svg>',
+ $code eq 'I' ? 4 : $code =~ /T3|[LJO]$|[Iio]1/ ? 2 : 3,
+ $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 '';
44 50 51 52 53 54 55 60 61 62 63 64 65
}],
},
+tetromino => {
+ style => [
+ 'svg path { stroke-linecap: square }',
+ ],
+ 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 }',
list => [(