74 lines
2.9 KiB
Python
Executable File
74 lines
2.9 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
|
|
# Copyright (C) 2011 Red Hat, Inc.
|
|
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public License
|
|
# as published by the Free Software Foundation; either version 2 of
|
|
# the License, or (at your option) any later version.
|
|
|
|
# This library 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
|
|
# Lesser General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
# 02110-1301 USA
|
|
|
|
import json
|
|
import gtk.gdk
|
|
import sys, os.path, re
|
|
|
|
class MapFile(object):
|
|
MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*(?:"(.*?)"|\?(.*?))\)')
|
|
|
|
def __init__(self, path):
|
|
self.__dict = dict()
|
|
|
|
with open(path, 'r') as fp:
|
|
for line in fp:
|
|
match = re.match(self.MAPENTRY_PATTERN, line)
|
|
if match:
|
|
if match.group(1):
|
|
keyseq = re.sub(r'\\(.)', r'\1', match.group(1))
|
|
# should check G-* and A-*
|
|
else:
|
|
keyseq = re.sub(r'\\(.)', r'\1', match.group(2))
|
|
# combination of keys is not supported
|
|
if len(keyseq) > 1:
|
|
continue
|
|
try:
|
|
keyval = gtk.gdk.unicode_to_keyval(ord(keyseq))
|
|
keyseq = gtk.gdk.keyval_name(keyval)
|
|
except:
|
|
pass
|
|
if match.group(3):
|
|
insert = match.group(3).decode('UTF-8')
|
|
else:
|
|
insert = match.group(4).decode('UTF-8')
|
|
replace = {}
|
|
if len(insert) > 1:
|
|
replace = { 'name': insert,
|
|
'label': insert }
|
|
else:
|
|
try:
|
|
keyval = gtk.gdk.unicode_to_keyval(ord(insert))
|
|
name = gtk.gdk.keyval_name(keyval)
|
|
replace = { 'name': name,
|
|
'label': insert,
|
|
'xkeysym': keyval }
|
|
except:
|
|
replace = { 'name': insert,
|
|
'label': insert }
|
|
self.__dict[keyseq] = replace
|
|
|
|
def __str__(self):
|
|
return json.dumps(self.__dict)
|
|
|
|
if __name__ == "__main__":
|
|
mapfile = MapFile(sys.argv[1])
|
|
print mapfile
|