-my %info = eval {
- require Unicode::UCD;
- map {
- $_ => Unicode::UCD::charinfo($di{$_})
- || { block => '?', category => 'Xn', name => '', script => '' }
- } keys %di;
-};
-
-# add custom categories for certain blocks
-for (values %info) {
- $_->{category} .= ' Xa' if $_->{block} eq 'Basic Latin';
- $_->{category} .= ' Xl' if $_->{block} eq 'Latin-1 Supplement';
-}
-
-# mark unofficial extras as such
-$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 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
- $info{$_}->{string} = $di{$_} < 32 ? chr($di{$_} + 0x2400) : chr(0xFFFD);
-}
-# presentational string for some control(lish) entries
-$info{$_}->{string} = '-' for grep { $di{$_} == 0x00AD } keys %di;
-$info{$_}->{string} = '␣' for grep { $di{$_} == 0x200B } keys %di;
-$info{$_}->{string} = '|' for grep { $di{$_} == 0x200C } keys %di;
-$info{$_}->{string} = '⁀' for grep { $di{$_} == 0x200D } keys %di;
-$info{$_}->{string} = '→' for grep { $di{$_} == 0x200E } keys %di;
-$info{$_}->{string} = '←' for grep { $di{$_} == 0x200F } keys %di;