index: release v1.18 with only altgr index linked
[sheet.git] / tools / mkkeyboard-xkb-symbols
1 #!/usr/bin/env perl
2 use 5.014;
3 use warnings;
4 use utf8;
5 use re '/msx';
6 use JSON ();
7 use Data::Dump 'pp';
8
9 our $VERSION = '1.00';
10
11 my $symname = eval {
12         open my $keysymh, '<', 'data/keysymdef.json' or die $!;
13         local $/;
14         return JSON->new->decode(readline $keysymh);
15 } or die "Could not read keysym definitions: $@\n";
16
17 my %geochar = (
18         TLDE => ["`", "~"],
19         AE01 => ['1', "!"],
20         AE02 => ['2', "\@"],
21         AE03 => ['3', "#"],
22         AE04 => ['4', "\$"],
23         AE05 => ['5', "%"],
24         AE06 => ['6', "^"],
25         AE07 => ['7', "&"],
26         AE08 => ['8', "*"],
27         AE09 => ['9', "("],
28         AE10 => ['0', ")"],
29         AE11 => ["-", "_"],
30         AE12 => ["=", "+"],
31
32         AD01 => ["q", "Q"],
33         AD02 => ["w", "W"],
34         AD03 => ["e", "E"],
35         AD04 => ["r", "R"],
36         AD05 => ["t", "T"],
37         AD06 => ["y", "Y"],
38         AD07 => ["u", "U"],
39         AD08 => ["i", "I"],
40         AD09 => ["o", "O"],
41         AD10 => ["p", "P"],
42         AD11 => ["[", "{"],
43         AD12 => ["]", "}"],
44
45         AC01 => ["a", "A"],
46         AC02 => ["s", "S"],
47         AC03 => ["d", "D"],
48         AC04 => ["f", "F"],
49         AC05 => ["g", "G"],
50         AC06 => ["h", "H"],
51         AC07 => ["j", "J"],
52         AC08 => ["k", "K"],
53         AC09 => ["l", "L"],
54         AC10 => [";", ":"],
55         AC11 => ["'", '"'],
56
57         LSGT => ["§", "±"], # mac
58         AB01 => ["z", "Z"],
59         AB02 => ["x", "X"],
60         AB03 => ["c", "C"],
61         AB04 => ["v", "V"],
62         AB05 => ["b", "B"],
63         AB06 => ["n", "N"],
64         AB07 => ["m", "M"],
65         AB08 => [",", "<"],
66         AB09 => [".", ">"],
67         AB10 => ["/", "?"],
68         BKSL => ["\\","|"],
69 );
70
71 my %res;
72 while (readline) {
73         my ($pos, $def) = m/^\h* key \h+ <(\w+)> \h+ \{ (.+?) \};/ or next;
74         my @mode = map { [split /,\h*/] } $def =~ m/\[ \h* (.*?) \h* \]/g;
75         for my $shift (0, 1) {
76                 defined(my $chr = $mode[0]->[$shift + 2])
77                         or warn "missing $pos +$shift\n";
78                 if ($chr =~ m/^U ([A-F0-9]+) $/) {
79                         $chr = chr hex $1;
80                 }
81                 elsif (defined $symname->{$chr}) {
82                         $chr = $symname->{$chr};
83                 }
84                 else {
85                         warn "unknown symbol $chr at $pos\n";
86                 }
87                 $res{$geochar{$pos}->[$shift] // $pos} = $chr;
88                 #$res{$pos}[$shift] = $symname->{$chr} // $chr; # geochar
89         }
90 }
91 say pp \%res;
92
93 __END__
94
95 =head1 NAME
96
97 mkkeyboard-xkb-symbols - Character map of an xkb symbols file
98
99 =head1 SYNOPSIS
100
101     cat /usr/share/X11/xkb/symbols/us |
102     perl -ne 'print if /^xkb_symbols "intl"/../^\};/' |
103     mkkeyboard-xkb-symbols >map-us-intl.inc.pl
104
105 =head1 DESCRIPTION
106
107 Parses C<key> declarations inside an C<xkb_symbols> section
108 and returns a perl hash of normalised qwerty input to unicode output
109 of 3rd and 4th levels (altgr and shift+altgr modes)
110 to be manually cleaned and integrated in a keyboard page include.
111
112 =head1 AUTHOR
113
114 Mischa POSLAWSKY <perl@shiar.org>
115
116 =head1 LICENSE
117
118 Licensed under the GNU Affero General Public License version 3.
119