#!/usr/bin/env python # Copyright (C) 2011 Daiki Ueno # 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