forked from simos/keyboardlayouteditor
-
Notifications
You must be signed in to change notification settings - Fork 2
/
GenericLayout.py
189 lines (161 loc) · 7.56 KB
/
GenericLayout.py
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/usr/bin/env python
# -*- encoding: UTF-8 -*-
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
import Common
from lxml import etree
from KeyDict import KeyDict, included_files, activated_variants
# <layout layoutname="CHANGEME">
# <symbols>
# <mapoption/>
# <mapname/>
# <mapmaterial>
# <tokenname name="CHANGEME"/>
# <tokeninclude/>
# <tokenkey override="CHANGEME">
# <keycodename/>
# <keysymgroup/>
# <symbolsgroup>
# <symbol/>
# <symbol/>
# <symbol/>
# <symbol/>
# </symbolsgroup>
# </tokenkey>
# </mapmaterial>
# </symbols>
#</layout>
class GenericLayout:
def __init__(self):
self.generic_layout = etree.Element("layout", layoutname = "CHANGEME")
self.symbols = etree.SubElement(self.generic_layout, "symbols")
self.mapoption = etree.SubElement(self.symbols, "mapoption")
self.mapname = etree.SubElement(self.symbols, "mapname")
self.mapmaterial = etree.SubElement(self.symbols, "mapmaterial")
self.tokenname = etree.SubElement(self.mapmaterial, "tokenname")
self.tokenname.attrib["name"] = "CHANGEME"
self.tokinclude = etree.SubElement(self.mapmaterial, "tokeninclude")
"""for keycodename in KeyDict.Keys.keys():
self.tokenkey = etree.SubElement(self.mapmaterial, "tokenkey")
self.tokenkey.attrib["override"] = "False"
self.keycodename = etree.SubElement(self.tokenkey, "keycodename")
self.keycodename.text = keycodename
self.keysymgroup = etree.SubElement(self.tokenkey, "keysymgroup")
self.symbolsgroup = etree.SubElement(self.tokenkey, "symbolsgroup")
for counter in range(Common.LEVELS):
etree.SubElement(self.symbolsgroup, "symbol")
"""
def create_layout(self, layoutcode, layoutvariant, layoutcountry, layoutname, layoutkeys):
"""
Creates an lxml construct with the layout.
Makes use of KeyDict.included_files, KeyDict.activated_variants
"""
self.new_layout = etree.Element("layout", layoutname = layoutcode)
self.symbols = etree.SubElement(self.new_layout, "symbols")
self.mapoption = etree.SubElement(self.symbols, "mapoption")
self.mapoption.text = "xkb_symbols"
self.mapname = etree.SubElement(self.symbols, "mapname")
self.mapname.text = layoutvariant
self.mapmaterial = etree.SubElement(self.symbols, "mapmaterial")
self.tokenname = etree.SubElement(self.mapmaterial, "tokenname")
self.tokenname.attrib["name"] = layoutname
for includefile in activated_variants.keys():
for variant in activated_variants[includefile].keys():
self.tokinclude = etree.SubElement(self.mapmaterial, "tokeninclude")
self.tokinclude.text = includefile + '(' + variant + ')'
for keycodename in layoutkeys.keys():
if keycodename in KeyDict.IgnoreKeys:
#print "keycodename", keycodename, "is in ignorekeys"
continue
votes_empty = 0
for counter in Common.keysegmentslist:
if layoutkeys[keycodename].key.keyvalues[counter].getType() == Common.keyvaluetype.NOSYMBOL:
votes_empty += 1
if votes_empty == len(Common.keysegmentslist):
# print "Keycode", keycodename, "is empty, skipping"
continue
else:
# print keycodename, "we only had", votes_empty, "votes,"
for counter in Common.keysegmentslist:
pass
#print layoutkeys[keycodename].key.keyvalues[counter].getValue(),
#print
#print layoutkeys[keycodename].key.keyvalues[Common.keysegments.ONE].getValue()
self.tokenkey = etree.SubElement(self.mapmaterial, "tokenkey")
self.tokenkey.attrib["override"] = "False"
self.keycodename = etree.SubElement(self.tokenkey, "keycodename")
self.keycodename.text = keycodename
self.keysymgroup = etree.SubElement(self.tokenkey, "keysymgroup")
self.symbolsgroup = etree.SubElement(self.keysymgroup, "symbolsgroup")
# print "Counting elems in key:",
for counter in Common.keysegmentslistreverse:
max_index = counter
if layoutkeys[keycodename].key.keyvalues[counter].getType() == Common.keyvaluetype.NOSYMBOL:
#print "O",
continue
else:
break
#print
#print "Doing look between", Common.keysegments.ONE, "and", max_index
for counter in range(Common.keysegments.ONE, max_index + 1):
sym = etree.SubElement(self.symbolsgroup, "symbol")
sym.text = layoutkeys[keycodename].key.keyvalues[counter].getValue()
if sym.text == "":
sym.text = "NoSymbol"
# print "sym.text", sym.text
return self.new_layout
def create_tokenkey(self, keycodenametext):
if not self.exists_tokenkey(keycodenametext):
tokenkey = etree.SubElement(self.mapmaterial, "tokenkey")
tokenkey.attrib["override"] = "False"
keycodename = etree.SubElement(tokenkey, "keycodename")
keycodename.text = keycodenametext
keysymgroup = etree.SubElement(tokenkey, "keysymgroup")
symbolsgroup = etree.SubElement(tokenkey, "symbolsgroup")
for counter in Common.keysegmentslist:
etree.SubElement(symbolsgroup, "symbol")
return tokenkey
else:
return None
def return_tokenkey(self, keycode):
all_tokenkeys = self.generic_layout.findall(".//tokenkey")
if all_tokenkeys == []:
return None
for tk in all_tokenkeys:
keycodenames = tk.findall(".//keycodename")
if keycodenames == []:
SystemError("Internal error, expecting a keycodename")
if len(keycodenames) > 1:
SystemError("Internal error, expecting only one keycodename")
if keycodenames[0].text == keycode:
return tk
def exists_tokenkey(self, keycode):
all_tokenkeys = self.generic_layout.findall(".//tokenkey")
if all_tokenkeys == []:
return False
for tk in all_tokenkeys:
keycodenames = tk.findall(".//keycodename")
if keycodenames == []:
SystemError("Internal error, expecting a keycodename")
if len(keycodenames) > 1:
SystemError("Internal error, expecting only one keycodename")
if keycodenames[0].text == keycode:
return True
else:
return False
def tostring(self):
return etree.tostring(self.generic_layout, pretty_print = True)
if __name__ == "__main__":
gl = GenericLayout()
print gl.tostring()