Import script from caribou source
This commit is contained in:
parent
06174be777
commit
affdcdcb0e
111
convert_cldr.py
Executable file
111
convert_cldr.py
Executable file
@ -0,0 +1,111 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
from gi.repository import Gdk
|
||||||
|
from xml.etree.ElementTree import ElementTree, Element
|
||||||
|
import re
|
||||||
|
|
||||||
|
ESCAPE_PATTERN = re.compile(r'\\u\{([0-9A-Fa-f]+?)\}')
|
||||||
|
ISO_PATTERN = re.compile(r'[A-E]([0-9]+)')
|
||||||
|
|
||||||
|
|
||||||
|
def parse_single_key(value):
|
||||||
|
key = Element('key')
|
||||||
|
uc = 0
|
||||||
|
if hasattr(__builtins__, 'unichr'):
|
||||||
|
def unescape(m):
|
||||||
|
return chr(int(m.group(1), 16))
|
||||||
|
else:
|
||||||
|
def unescape(m):
|
||||||
|
return chr(int(m.group(1), 16))
|
||||||
|
value = ESCAPE_PATTERN.sub(unescape, value)
|
||||||
|
if len(value) > 1:
|
||||||
|
key.set('text', value)
|
||||||
|
uc = ord(value[0])
|
||||||
|
keyval = Gdk.unicode_to_keyval(uc)
|
||||||
|
name = Gdk.keyval_name(keyval)
|
||||||
|
key.set('name', name)
|
||||||
|
return key
|
||||||
|
|
||||||
|
|
||||||
|
def convert(source, tree):
|
||||||
|
root = Element('layout')
|
||||||
|
for index, keymap in enumerate(tree.iter('keyMap')):
|
||||||
|
level = Element('level')
|
||||||
|
rows = {}
|
||||||
|
root.append(level)
|
||||||
|
level.set('name', 'level%d' % (index+1))
|
||||||
|
# FIXME: heuristics here
|
||||||
|
modifiers = keymap.get('modifiers')
|
||||||
|
if not modifiers:
|
||||||
|
mode = 'default'
|
||||||
|
elif 'shift' in modifiers.split(' ') or 'lock' in modifiers.split(' '):
|
||||||
|
mode = 'latched'
|
||||||
|
else:
|
||||||
|
mode = 'locked'
|
||||||
|
level.set('mode', mode)
|
||||||
|
for _map in keymap.iter('map'):
|
||||||
|
value = _map.get('to')
|
||||||
|
key = parse_single_key(value)
|
||||||
|
iso = _map.get('iso')
|
||||||
|
if not ISO_PATTERN.match(iso):
|
||||||
|
sys.stderr.write('invalid ISO key name: %s\n' % iso)
|
||||||
|
continue
|
||||||
|
if not iso[0] in rows:
|
||||||
|
rows[iso[0]] = []
|
||||||
|
rows[iso[0]].append((int(iso[1:]), key))
|
||||||
|
# add attribute to certain keys
|
||||||
|
name = key.get('name')
|
||||||
|
if name == 'space':
|
||||||
|
key.set('align', 'center')
|
||||||
|
key.set('width', '6.0')
|
||||||
|
if name in ('space', 'BackSpace'):
|
||||||
|
key.set('repeatable', 'yes')
|
||||||
|
# add subkeys
|
||||||
|
longPress = _map.get('longPress')
|
||||||
|
if longPress:
|
||||||
|
for value in longPress.split(' '):
|
||||||
|
subkey = parse_single_key(value)
|
||||||
|
key.append(subkey)
|
||||||
|
for k, v in sorted(list(rows.items()), key=lambda x: x[0], reverse=True):
|
||||||
|
row = Element('row')
|
||||||
|
for key in sorted(v, key=lambda x: x):
|
||||||
|
row.append(key[1])
|
||||||
|
level.append(row)
|
||||||
|
return root
|
||||||
|
|
||||||
|
|
||||||
|
def indent(elem, level=0):
|
||||||
|
i = "\n" + level*" "
|
||||||
|
if len(elem):
|
||||||
|
if not elem.text or not elem.text.strip():
|
||||||
|
elem.text = i + " "
|
||||||
|
if not elem.tail or not elem.tail.strip():
|
||||||
|
elem.tail = i
|
||||||
|
for elem in elem:
|
||||||
|
indent(elem, level+1)
|
||||||
|
if not elem.tail or not elem.tail.strip():
|
||||||
|
elem.tail = i
|
||||||
|
else:
|
||||||
|
if level and (not elem.tail or not elem.tail.strip()):
|
||||||
|
elem.tail = i
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print("supply a CLDR keyboard file")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
source = sys.argv[-1]
|
||||||
|
itree = ElementTree()
|
||||||
|
itree.parse(source)
|
||||||
|
|
||||||
|
root = convert(source, itree)
|
||||||
|
indent(root)
|
||||||
|
|
||||||
|
otree = ElementTree(root)
|
||||||
|
if hasattr(sys.stdout, 'buffer'):
|
||||||
|
out = sys.stdout.buffer
|
||||||
|
else:
|
||||||
|
out = sys.stdout
|
||||||
|
otree.write(out, xml_declaration=True, encoding='UTF-8')
|
Loading…
Reference in New Issue
Block a user