X-Git-Url: http://git.shiar.net/sheet.git/blobdiff_plain/2f6bd0f228e04949e561c9e5d7713a0baef77cd5..f213c32b75192ca0f7ffe6ad8ee410d130c00fa5:/charset.plp?ds=sidebyside
diff --git a/charset.plp b/charset.plp
index ed495fe..0dd1537 100644
--- a/charset.plp
+++ b/charset.plp
@@ -5,7 +5,7 @@ my @tablist = split m{/+}, $Request || 'default';
Html({
title => 'charset cheat sheet',
- version => '1.0',
+ version => '1.1',
description => [
"Reference sheet with all glyphs in common character encoding tables,",
"and an overview of Unicode ranges and UTF-8 bytes.",
@@ -36,18 +36,10 @@ else {
say "Charset comparison:";
}
-sub optionlink {
- my ($title, $href, $selected) = @_;
- return sprintf(
- $selected ? '%s' : '%s',
- EscapeHTML($title), $href
- );
-}
-
print join " â¢\n", (
map {
join " ·\n", pairmap {
- optionlink($b || ucfirst $a, '/charset'.($a && "/$a?compare"), $a eq $Request);
+ showlink($b || ucfirst $a, '/charset'.($a && "/$a?compare"), $a eq $Request);
} @{$_}
}
[
@@ -147,12 +139,14 @@ sub tabinput {
eval { $charset->{setup}->(\%row) }
or Alert("Incomplete setup of $input", $@);
}
+ $row{endpoint} ||= 0xFF;
- if ($row{set}) {}
+ if (defined $row{table} or defined $row{cell}) {
+ $row{set} //= $input;
+ }
elsif ($row{set} = Encode::resolve_alias($input)) {
$row{offset} = delete $row{startpoint};
- $row{endpoint} ||= 0xFF;
- if ($row{set} eq 'MacHebrew' or $row{set} eq 'MacThai') {
+ if ($charset->{varchar}) {
# array of possibly multiple characters per code point
$row{table} = [
map { Encode::decode($row{set}, pack 'C*', $_) } $row{offset} .. $row{endpoint}
@@ -164,43 +158,47 @@ sub tabinput {
$row{table} = Encode::decode($row{set}, pack 'C*', $row{offset} .. $row{endpoint});
}
- if ($row{set} eq 'cp437') {
- if ($row{offset} <= 0xED and $row{endpoint} >= 0xED) {
- # replace phi glyph
- substr($row{table}, 0xED - $row{offset}, 1) = 'Ï';
- }
- if ($row{offset} < 0x20) {
- # replace control characters by visible variants
- my $sub = substr 'ââºâ»â¥â¦â£â â¢ââââââªâ«â¼âºâââ¼Â¶Â§â¬â¨âââââââ²â¼', $row{offset};
- substr($row{table}, 0, length $sub) = $sub;
- }
- }
- elsif ($row{set} eq 'symbol') {
- if ($row{offset} <= 0x60 and $row{endpoint} >= 0x60) {
- # replace radical extender by closest unicode equivalent
- substr($row{table}, 0x60 - $row{offset}, 1) = 'â';
- }
- if ($row{offset} <= 0xBD and $row{endpoint} >= 0xFF) {
- 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) = 'â®â¡âââ â¤â¥â¦â«â¬â';
- }
- }
-
$row{endpoint} -= $row{offset};
-
- $visible->{ascii} = # assume common base
- $visible->{ $row{set} } = 1;
+ $visible->{ascii}++; # assume common base
}
else {
Alert("Encoding $input
unknown");
return;
}
+
+ if (my $replace = $charset->{replace}) {
+ while (my ($offset, $sub) = each %{$replace}) {
+ $offset -= $row{offset};
+
+ if (ref $row{table} eq 'ARRAY') {
+ $row{table}->[$offset] = $sub
+ if $offset >= 0 and $offset <= $row{endpoint};
+ next;
+ }
+
+ my $length = length $sub;
+
+ if ($offset < 0) {
+ $offset > -$length or next; # at least one character after start
+ # trim leftmost part to start at offset
+ substr($sub, 0, -$offset) = '';
+ $length += $offset;
+ $offset = 0;
+ }
+
+ if ((my $excess = $row{endpoint} - $offset - $length + 1) < 0) {
+ $excess > -$length or next;
+ # trim rightmost part to prevent overflow
+ substr($sub, $excess) = '';
+ $length += $excess;
+ }
+
+ substr($row{table}, $offset, $length) = $sub;
+ }
+ }
+
push @request, \%row;
+ $visible->{ $row{set} } = 1 if $row{table};
}
tabinput($_) for @tablist;
@@ -324,7 +322,7 @@ for my $row (@request) {
my $cp = $offset + $row->{offset};
my $glyph = ref $row->{table} eq 'ARRAY' ? $row->{table}->[$offset] :
substr $row->{table}, $offset, 1;
- my ($cell, $name, $class) = $glyph eq $NOCHAR ? () :
+ my ($cell, $name, $class) = !defined $glyph || $glyph eq $NOCHAR ? () :
$glyphs->glyph_html($glyph);
if ($mode) {