unicode: fix diagonal arrow direction
[sheet.git] / rfc1345convert
index c6131ad9f4034fdd93bde939c878deaa34f717e8..3157e040065776dade692d6ab0729ce84807c4cf 100644 (file)
@@ -124,14 +124,22 @@ for (values %info) {
 $info{$_}->{category} .= ' Xz' for @extra;
 
 for (keys %di) {
+       $info{$_}->{string} = chr(9676) . chr($di{$_}) if $info{$_}->{combining};
        # find control characters (first 32 chars from 0 and 128)
-       next if $di{$_} & ~0b1001_1111;
+       next unless ($di{$_} & ~0b1001_1111) == 0 or $di{$_} == 127;
        # rename to something more descriptive
        $info{$_}->{name} = $info{$_}->{unicode10}
                ? '<'.$info{$_}->{unicode10}.'>'  # the old name was much more useful
                : sprintf('<control U+%04X>', $di{$_});  # at least identify by value
        # show descriptive symbols instead of control chars themselves
-       $di{$_} += 0x2400 if $di{$_} < 32;
+       $info{$_}->{string} = $di{$_} < 32 ? chr($di{$_} + 0x2400) : chr(0xFFFD);
+}
+
+# convert info hashes into arrays of strings to output in display order
+for my $row (values %info) {
+       $row = [ map { $row->{$_} } qw/name category script string/ ];
+       # strip off trailing missing values (especially string may be unknown)
+       defined $row->[-1] ? last : pop @$row for 1 .. @$row;
 }
 
 # output perl code of hash
@@ -141,9 +149,9 @@ printf '(map {$_=>0} qw{%s}),'."\n", join(' ',
        map { substr($_, 1, 1).substr($_, 0, 1) } sort keys %di
 );
 printf "q{%s}=>[%s],\n", $_, join(',',
-       $di{$_},       # glyph code point
+       $di{$_},   # original code point
        $info{$_}  # optional additional arguments
-               ? map {"'$_'"} @{ $info{$_} }{qw/name category script/}
+               ? map {"'$_'"} @{ $info{$_} }
                : ()
 ) for sort keys %di;
 print "}\n";