summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/support/bibtexperllibs/LaTeX-ToUnicode/script/convert.pl
blob: 70cc0bda848dde1ff1afe2b0b6e86cf6f8964b46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/perl 

use strict;
use warnings;
use utf8;

use feature 'say';
use FindBin;

my $UNICODE_DATA_URL = "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt";


my $stream;
if ( -f "$FindBin::Bin/UnicodeData.txt" ) {
    open $stream, "<", "$FindBin::Bin/UnicodeData.txt" or die;
} else {
    open $stream, "-|", "curl $UNICODE_DATA_URL" or die;
}
my %data;

my %chars = (
  'ACUTE' => "'",
  'ACUTE AND DOT ABOVE' => '',
  'BAR' => '',
  'BELT' => '',
  'BREVE' => 'u',
  'BREVE AND ACUTE' => '',
  'BREVE AND DOT BELOW' => '',
  'BREVE AND GRAVE' => '',
  'BREVE AND HOOK ABOVE' => '',
  'BREVE AND TILDE' => '',
  'BREVE BELOW' => '',
  'CARON' => 'v',
  'CARON AND DOT ABOVE' => '',
  'CEDILLA' => 'c',
  'CEDILLA AND ACUTE' => '',
  'CEDILLA AND BREVE' => '',
  'CIRCUMFLEX' => '^',
  'CIRCUMFLEX AND ACUTE' => '',
  'CIRCUMFLEX AND DOT BELOW' => '',
  'CIRCUMFLEX AND GRAVE' => '',
  'CIRCUMFLEX AND HOOK ABOVE' => '',
  'CIRCUMFLEX AND TILDE' => '',
  'CIRCUMFLEX BELOW' => '',
  'COMMA' => '',
  'COMMA BELOW' => '',
  'CROSSED-TAIL' => '',
  'CURL' => '',
  'DESCENDER' => '',
  'DIAERESIS' => '"',
  'DIAERESIS AND ACUTE' => '',
  'DIAERESIS AND CARON' => '',
  'DIAERESIS AND GRAVE' => '',
  'DIAERESIS AND MACRON' => '',
  'DIAERESIS BELOW' => '',
  'DIAGONAL STROKE' => '',
  'DOT ABOVE' => '.',
  'DOT ABOVE AND MACRON' => '',
  'DOT BELOW' => 'd',
  'DOT BELOW AND DOT ABOVE' => '',
  'DOT BELOW AND MACRON' => '',
  'DOUBLE ACUTE' => 'H',
  'DOUBLE BAR' => '',
  'DOUBLE GRAVE' => '',
  'FISHHOOK' => '',
  'FISHHOOK AND MIDDLE TILDE' => '',
  'FLOURISH' => '',
  'GRAVE' => '`',
  'HIGH STROKE' => '',
  'HOOK' => '',
  'HOOK ABOVE' => 'h',
  'HOOK AND TAIL' => '',
  'HOOK TAIL' => '',
  'HORIZONTAL BAR' => '',
  'HORN' => '',
  'HORN AND ACUTE' => '',
  'HORN AND DOT BELOW' => '',
  'HORN AND GRAVE' => '',
  'HORN AND HOOK ABOVE' => '',
  'HORN AND TILDE' => '',
  'INVERTED BREVE' => '',
  'LEFT HOOK' => '',
  'LINE BELOW' => '',
  'LONG LEG' => '',
  'LONG RIGHT LEG' => '',
  'LONG STROKE OVERLAY' => '',
  'LOOP' => '',
  'LOW RING INSIDE' => '',
  'MACRON' => '=',
  'MACRON AND ACUTE' => '',
  'MACRON AND DIAERESIS' => '',
  'MACRON AND GRAVE' => '',
  'MIDDLE DOT' => '',
  'MIDDLE TILDE' => '',
  'NOTCH' => '',
  'OGONEK' => 'k',
  'OGONEK AND MACRON' => '',
  'PALATAL HOOK' => '',
  'RETROFLEX HOOK' => '',
  'RIGHT HALF RING' => '',
  'RIGHT HOOK' => '',
  'RING ABOVE' => 'r',
  'RING ABOVE AND ACUTE' => '',
  'RING BELOW' => '',
  'SMALL LETTER J' => '',
  'SMALL LETTER Z' => '',
  'SMALL LETTER Z WITH CARON' => '',
  'SQUIRREL TAIL' => '',
  'STRIKETHROUGH' => '',
  'STROKE' => '',
  'STROKE AND ACUTE' => '',
  'STROKE AND DIAGONAL STROKE' => '',
  'STROKE THROUGH DESCENDER' => '',
  'SWASH TAIL' => '',
  'TAIL' => '',
  'TILDE' => '~',
  'TILDE AND ACUTE' => '',
  'TILDE AND DIAERESIS' => '',
  'TILDE AND MACRON' => '',
  'TILDE BELOW' => '',
  'TOPBAR' => '',
);

my %missing;

while(<$stream>) {
    chomp;
    my @F = split /;/; 
    my $hex = $F[0]; 
    if ( $F[1] =~ /LATIN (SMALL|CAPITAL) LETTER ((?:\w+ )*\w{1,2}) WITH (.+)$/ ) {
        my $case = $1;
        my $letter = $2;
        my $accent = $3;

        if ( $case eq 'SMALL' ) {
            $letter = lc $letter;
        }
        if ( $chars{$accent} && $letter !~ / / ) {
            my $char = chr( eval "0x$hex" );
            $data{ $chars{$accent} }->{ $letter } = $char;
            if ( lc( $letter ) eq 'i' ) {
                my $additional_letter = "\\$letter";
                $data{ $chars{$accent} }->{ $additional_letter } = $char;
            }
        } else {
            push @{ $missing{$accent} }, $letter;
        }
    }
}

use Data::Dumper::Concise;

binmode(STDOUT, ":utf8");

say Dumper( \%data );
#say Dumper( \%missing );