charset: symbols inheritance, override private use
[sheet.git] / charset.plp
index 3be6a96cac927faefd0284abce90661fd092ac07..e8382f508a60fa7ce5b51e44c334f5ffdc6dd453 100644 (file)
@@ -48,6 +48,7 @@ print join " •\n", (
        }
        [
                iso      => 'ISO',
+               win      => 'Windows',
                dos      => 'DOS',
                mac      => 'Apple',
                ebcdic   => 'EBCDIC',
@@ -104,7 +105,7 @@ sub tabinput {
                hebrew     => [qw( iso-8859-8 cp1255 MacHebrew cp862  U59-5F )],
                thai       => [qw( iso-8859-11 cp874 MacThai )],
                vietnamese => [qw( viscii cp1258 MacVietnamese )],
-               symbol     => [qw( symbol dingbats MacDingbats AdobeZdingbat AdobeSymbol )],
+               symbols    => [qw( symbol dingbats MacDingbats )],
 
                # iso-code shorthand
                1 => 'westeur',
@@ -124,7 +125,7 @@ sub tabinput {
                return;
        }
 
-       state $visible = {};  # all present tables
+       state $visible = {'' => 1};  # all present tables
        my %row = (offset => 0, cols => 16);
        my $params = $input =~ s/[+](.*)\z// ? $1 : undef;
 
@@ -132,6 +133,11 @@ sub tabinput {
                state $INHERIT = {
                        'cp437'       => ['cp850' => 0, 'ascii' => '0-31+128'], # ascii range overridden later
                        'gsm0338'     => ['ascii' => '0-127'],
+                       'dingbats'    => ['' => '32-127+160'],
+                       'MacDingbats' => ['dingbats' => '128-159'],
+                       'AdobeZdingbat'=> ['MacDingbats' => '128-159'], # should be identical but maps to private use
+                       'symbol'      => ['' => '32-127+160'],
+                       'AdobeSymbol' => ['symbol' => '32-127+160', '' => '32-127+160'], # minor differences, irrelevant except for different '€'
 
                        'iso-8859-2'  => ['iso-8859-1' => '160'],
                        'iso-8859-3'  => ['iso-8859-1' => '160'], #TODO: also apply to iso-8859-9
@@ -312,6 +318,21 @@ sub tabinput {
                                );
                        }
                }
+               elsif ($row{set} eq 'symbol') {
+                       if ($row{offset} <= 0x60 and $row{endpoint} >= 0x60 - $row{offset}) {
+                               # replace radical extender by closest unicode equivalent
+                               substr($row{table}, 0x60 - $row{offset},  1) = '│';
+                       }
+                       if ($row{offset} <= 0xBD and $row{endpoint} >= 0xFF - $row{offset}) {
+                               substr($row{table}, 0xBD - $row{offset},  2) = '⏐⎯'; # arrow extenders
+                               substr($row{table}, 0xD2 - $row{offset},  3) = '®©™'; # serif variants
+                               substr($row{table}, 0xE0 - $row{offset},  1) = '◊'; # replace lookalike, should match AdobeSymbol
+                               substr($row{table}, 0xE2 - $row{offset},  3) = '®©™'; # sans-serif variants
+                               substr($row{table}, 0xE6 - $row{offset}, 10) = '⎛⎜⎝⎡⎢⎣⎧⎨⎩⎪';
+                               substr($row{table}, 0xF0 - $row{offset},  1) = '€';
+                               substr($row{table}, 0xF4 - $row{offset}, 11) = '⎮⌡⎞⎟⎠⎤⎥⎦⎫⎬⎭';
+                       }
+               }
 
                $visible->{ascii} =  # assume common base
                $visible->{ $row{set} } = 1;
@@ -345,15 +366,16 @@ sub range_cell {
                if ($len -= $rest) {
                        # continued on new row
                        my @next = ($len * $colsize, "$class joinu");
+                       my $separate = $cols - $len > $rest;  # columns not on next row
                        if ($len > $rest) {
                                # minority remains
                                push @next, $name, $title;
                                $title ||= $name;
-                               $name = '';
+                               $name = $separate && '…';
                        }
                        else {
                                # minority on next row
-                               push @next, '"', $title || $name;
+                               push @next, $separate && '"', $title || $name;
                        }
                        $table->{$offset + $colsize*$rest} //= \@next;
                        $class .= ' joind';