def parse_layout_slave(self, xkbfilename, variantname=None): # print "+++++We are recursive, called with", xkbfilename, variantname char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding="utf-8") lexer = XKBGrammarLexer(char_stream) tokens = antlr3.CommonTokenStream(lexer) parser = XKBGrammarParser(tokens) parser_layout = parser.layout() variants = [] xml_layout = etree.Element("layout") xml_layout.attrib["layoutname"] = os.path.basename(xkbfilename) includes = [] for symbols in parser_layout.tree.getChildren(): eSymbol = etree.SubElement(xml_layout, "symbols") for mapobject in symbols.getChildren(): if mapobject.getType() == MAPTYPE: for maptypesect in mapobject.getChildren(): if maptypesect.getType() == MAPOPTIONS: for mapoption in maptypesect.getChildren(): if mapoption.getText() == "xkb_symbols" or mapoption.getText() == "hidden": eMapOption = etree.SubElement(eSymbol, "mapoption") eMapOption.text = mapoption.getText() elif maptypesect.getType() == MAPNAME: if maptypesect.getChildCount() == 1: eMapName = etree.SubElement(eSymbol, "mapname") eMapName.text = maptypesect.getChildren()[0].getText()[1:-1] variants.append(maptypesect.getChildren()[0].getText()[1:-1]) else: return {"success": False} else: return {"success": False} elif mapobject.getType() == MAPMATERIAL: eMapMaterial = etree.SubElement(eSymbol, "mapmaterial") for name in self.getChildrenByType(mapobject, TOKEN_NAME): nameText = name.getChild(0).getText()[1:-1] eTokenName = etree.SubElement(eMapMaterial, "tokenname", name=nameText) for include in self.getChildrenByType(mapobject, TOKEN_INCLUDE): eInclude = etree.SubElement(eMapMaterial, "tokeninclude") eInclude.text = include.getChild(0).getText()[1:-1] includes.append(eInclude.text) for keytype in self.getChildrenByType(mapobject, TOKEN_KEY_TYPE): keytypeText = keytype.getChild(0).getText() eKeyType = etree.SubElement(eMapMaterial, "tokentype") eKeyType.text = keytypeText[1:-1] for modmap in self.getChildrenByType(mapobject, TOKEN_MODIFIER_MAP): eModMap = etree.SubElement(eMapMaterial, "tokenmodifiermap", state=modmap.getChild(0).getText()) for modstate in self.getChildrenByTypes(modmap, KEYCODE, KEYCODEX): if modstate.getType() == KEYCODE: eModState = etree.SubElement(eModMap, "keycode", value=modstate.getChild(0).getText()) elif modstate.getType() == KEYCODEX: eModState = etree.SubElement(eModMap, "keycodex", value=modstate.getChild(0).getText()) else: return {"success": False} # print "Unexpected token encountered. Aborting...", modstate.getText() # sys.exit(-1) allkeysymgroups = {} for keyset in self.getChildrenByType(mapobject, TOKEN_KEY): allkeysymgroups[keyset.getChild(0).getChild(0).getText()] = keyset sortedkeysymgroups = self.sortDict(allkeysymgroups, KeycodesReader.compare_keycode) for keyset in sortedkeysymgroups: elem_keysymgroup = self.getChildrenByType(keyset, ELEM_KEYSYMGROUP) elem_virtualmods = self.getChildrenByType(keyset, ELEM_VIRTUALMODS) elem_overlay = self.getChildrenByType(keyset, OVERLAY) override = self.getChildrenListByType(keyset, OVERRIDE) eTokenKey = etree.SubElement(eMapMaterial, "tokenkey") eKeyCodeName = etree.SubElement(eTokenKey, "keycodename") keycodex = self.getChildrenListByType(keyset, KEYCODEX) if len(keycodex) == 1: eKeyCodeName.text = keycodex[0].getChild(0).getText() else: return {"success": False} # print "Could not retrieve keycode name" # exit(-1) if len(override) == 1: eTokenKey.attrib["override"] = "True" else: eTokenKey.attrib["override"] = "False" if len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)): elem_keysyms = self.getChildrenListByType(keyset, ELEM_KEYSYMS) eKeySymGroup = etree.SubElement(eTokenKey, "keysymgroup") keysymgroup_counter = len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)) for elem in elem_keysymgroup: eSymbolsGroup = etree.SubElement(eKeySymGroup, "symbolsgroup") for elem2 in elem.getChildren(): for elem3 in elem2.getChildren(): eSymbol = etree.SubElement(eSymbolsGroup, "symbol") eSymbol.text = elem3.getText() if len(elem_keysyms) > 0: if len(elem_keysyms) == 1: ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, "typegroup", value=ksname[1:-1]) else: """ We are probably processing level3; we keep first item """ ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, "typegroup", value=ksname[1:-1]) # print "Possibly processing level3" if len(self.getChildrenListByType(keyset, ELEM_VIRTUALMODS)): for vmods in elem_virtualmods: etree.SubElement( eKeySymGroup, "tokenvirtualmodifiers", value=vmods.getChild(0).getText() ) if len(self.getChildrenListByType(keyset, OVERLAY)): for elem in elem_overlay: for elem2 in self.getChildrenByType(elem, KEYCODEX): pass else: return {"success": False} extraction_result = ExtractVariantsKeycodes(xml_layout, variantname) return { "success": True, "all_variants": variants, "variants": extraction_result["variants"], "layout": xml_layout, "keydict": extraction_result["keydict"], }
# print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", sys.argv[1] try: xkbfile = open(xkbfilename, 'r') except OSError: print "Could not open file ", xkbfilename, ". Aborting..." sys.exit(-1) xkbfile.close char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding='utf-8') lexer = XKBGrammarLexer(char_stream) tokens = antlr3.CommonTokenStream(lexer) parser = XKBGrammarParser(tokens) result = parser.layout() # print "tree =", result.tree.toStringTree() nodes = antlr3.tree.CommonTreeNodeStream(result.tree) nodes.setTokenStream(tokens) walker = XKBGrammarWalker(nodes) # walker.layout() layout = etree.Element('layout') doc = etree.ElementTree(layout) layout.attrib['layoutname'] = os.path.basename(xkbfilename) #print "Processing", os.path.basename(xkbfilename), "...",
def parse(self, xkbfilename): char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding="utf-8") lexer = XKBGrammarLexer(char_stream) tokens = antlr3.CommonTokenStream(lexer) parser = XKBGrammarParser(tokens) result = parser.layout() # print "tree =", result.tree.toStringTree() nodes = antlr3.tree.CommonTreeNodeStream(result.tree) nodes.setTokenStream(tokens) walker = XKBGrammarWalker(nodes) # walker.layout() layout = etree.Element("layout") doc = etree.ElementTree(layout) layout.attrib["layoutname"] = os.path.basename(xkbfilename) # print "Processing", os.path.basename(xkbfilename), "...", for symbols in result.tree.getChildren(): eSymbol = etree.SubElement(layout, "symbols") for mapobject in symbols.getChildren(): if mapobject.getType() == MAPTYPE: for maptypesect in mapobject.getChildren(): if maptypesect.getType() == MAPOPTIONS: for mapoption in maptypesect.getChildren(): if mapoption.getText() == "xkb_symbols" or mapoption.getText() == "hidden": eMapOption = etree.SubElement(eSymbol, "mapoption") eMapOption.text = mapoption.getText() elif maptypesect.getType() == MAPNAME: if maptypesect.getChildCount() == 1: eMapName = etree.SubElement(eSymbol, "mapname") eMapName.text = maptypesect.getChildren()[0].getText()[1:-1] else: print "\t\t\tInternal error in mapoption" else: print "\t\tInternal error in maptypesect" sys.exit(-2) elif mapobject.getType() == MAPMATERIAL: eMapMaterial = etree.SubElement(eSymbol, "mapmaterial") for name in self.getChildrenByType(mapobject, TOKEN_NAME): nameText = name.getChild(0).getText()[1:-1] eTokenName = etree.SubElement(eMapMaterial, "tokenname", name=nameText) for include in self.getChildrenByType(mapobject, TOKEN_INCLUDE): eInclude = etree.SubElement(eMapMaterial, "tokeninclude") eInclude.text = include.getChild(0).getText()[1:-1] for keytype in self.getChildrenByType(mapobject, TOKEN_KEY_TYPE): keytypeText = keytype.getChild(0).getText() eKeyType = etree.SubElement(eMapMaterial, "tokentype") eKeyType.text = keytypeText[1:-1] for modmap in self.getChildrenByType(mapobject, TOKEN_MODIFIER_MAP): eModMap = etree.SubElement(eMapMaterial, "tokenmodifiermap", state=modmap.getChild(0).getText()) for modstate in self.getChildrenByTypes(modmap, KEYCODE, KEYCODEX): if modstate.getType() == KEYCODE: eModState = etree.SubElement(eModMap, "keycode", value=modstate.getChild(0).getText()) elif modstate.getType() == KEYCODEX: eModState = etree.SubElement(eModMap, "keycodex", value=modstate.getChild(0).getText()) else: print "Unexpected token encountered. Aborting...", modstate.getText() sys.exit(-1) allkeysymgroups = {} for keyset in self.getChildrenByType(mapobject, TOKEN_KEY): allkeysymgroups[keyset.getChild(0).getChild(0).getText()] = keyset sortedkeysymgroups = self.sortDict(allkeysymgroups, KeycodesReader.compare_keycode) for keyset in sortedkeysymgroups: elem_keysymgroup = self.getChildrenByType(keyset, ELEM_KEYSYMGROUP) elem_virtualmods = self.getChildrenByType(keyset, ELEM_VIRTUALMODS) elem_overlay = self.getChildrenByType(keyset, OVERLAY) override = self.getChildrenListByType(keyset, OVERRIDE) eTokenKey = etree.SubElement(eMapMaterial, "tokenkey") eKeyCodeName = etree.SubElement(eTokenKey, "keycodename") keycodex = self.getChildrenListByType(keyset, KEYCODEX) if len(keycodex) == 1: eKeyCodeName.text = keycodex[0].getChild(0).getText() else: print "Could not retrieve keycode name" exit(-1) if len(override) == 1: eTokenKey.attrib["override"] = "True" else: eTokenKey.attrib["override"] = "False" if len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)): elem_keysyms = self.getChildrenListByType(keyset, ELEM_KEYSYMS) eKeySymGroup = etree.SubElement(eTokenKey, "keysymgroup") keysymgroup_counter = len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)) for elem in elem_keysymgroup: eSymbolsGroup = etree.SubElement(eKeySymGroup, "symbolsgroup") for elem2 in elem.getChildren(): for elem3 in elem2.getChildren(): eSymbol = etree.SubElement(eSymbolsGroup, "symbol") eSymbol.text = elem3.getText() if len(elem_keysyms) > 0: if len(elem_keysyms) == 1: ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, "typegroup", value=ksname[1:-1]) else: """ We are probably processing level3; we keep first item """ ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, "typegroup", value=ksname[1:-1]) # print "Possibly processing level3" if len(self.getChildrenListByType(keyset, ELEM_VIRTUALMODS)): for vmods in elem_virtualmods: etree.SubElement( eKeySymGroup, "tokenvirtualmodifiers", value=vmods.getChild(0).getText() ) if len(self.getChildrenListByType(keyset, OVERLAY)): for elem in elem_overlay: for elem2 in self.getChildrenByType(elem, KEYCODEX): pass else: print "\tInternal error at map level,", mapobject.getText() # sys.exit(-2) return layout
try: xkbfile = open(xkbfilename, 'r') except OSError: print "Could not open file ", xkbfilename, ". Aborting..." sys.exit(-1) xkbfile.close # char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding='utf-8') char_stream = antlr3.ANTLRFileStream(xkbfilename) lexer = XKBGrammarLexer(char_stream) tokens = antlr3.CommonTokenStream(lexer) parser = XKBGrammarParser(tokens) result = parser.layout() print "XXXXXXXXXXXXXXXXXXXXXXX", xkbfilename print "tree =", result.tree.toStringTree() nodes = antlr3.tree.CommonTreeNodeStream(result.tree) nodes.setTokenStream(tokens) walker = XKBGrammarWalker(nodes) # walker.layout() MAX = 10 TABS = "\t\t\t\t\t\t\t\t\t\t" def print_tree(node, depth): if depth >= MAX:
def parse(self, xkbfilename): char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding='utf-8') lexer = XKBGrammarLexer(char_stream) tokens = antlr3.CommonTokenStream(lexer) parser = XKBGrammarParser(tokens) result = parser.layout() # print "tree =", result.tree.toStringTree() nodes = antlr3.tree.CommonTreeNodeStream(result.tree) nodes.setTokenStream(tokens) walker = XKBGrammarWalker(nodes) # walker.layout() layout = etree.Element('layout') doc = etree.ElementTree(layout) layout.attrib['layoutname'] = os.path.basename(xkbfilename) #print "Processing", os.path.basename(xkbfilename), "...", for symbols in result.tree.getChildren(): eSymbol = etree.SubElement(layout, 'symbols') for mapobject in symbols.getChildren(): if mapobject.getType() == MAPTYPE: for maptypesect in mapobject.getChildren(): if maptypesect.getType() == MAPOPTIONS: for mapoption in maptypesect.getChildren(): if mapoption.getText() == 'xkb_symbols' or mapoption.getText() == 'hidden': eMapOption = etree.SubElement(eSymbol, 'mapoption') eMapOption.text = mapoption.getText() elif maptypesect.getType() == MAPNAME: if maptypesect.getChildCount() == 1: eMapName = etree.SubElement(eSymbol, 'mapname') eMapName.text = maptypesect.getChildren()[0].getText()[1:-1] else: print "\t\t\tInternal error in mapoption" else: print "\t\tInternal error in maptypesect" sys.exit(-2) elif mapobject.getType() == MAPMATERIAL: eMapMaterial = etree.SubElement(eSymbol, 'mapmaterial') for name in self.getChildrenByType(mapobject, TOKEN_NAME): nameText = name.getChild(0).getText()[1:-1] eTokenName = etree.SubElement(eMapMaterial, 'tokenname', name=nameText ) for include in self.getChildrenByType(mapobject, TOKEN_INCLUDE): eInclude = etree.SubElement(eMapMaterial, 'tokeninclude') eInclude.text = include.getChild(0).getText()[1:-1] for keytype in self.getChildrenByType(mapobject, TOKEN_KEY_TYPE): keytypeText = keytype.getChild(0).getText() eKeyType = etree.SubElement(eMapMaterial, 'tokentype') eKeyType.text = keytypeText[1:-1] for modmap in self.getChildrenByType(mapobject, TOKEN_MODIFIER_MAP): eModMap = etree.SubElement(eMapMaterial, 'tokenmodifiermap', state=modmap.getChild(0).getText()) for modstate in self.getChildrenByTypes(modmap, KEYCODE, KEYCODEX): if modstate.getType() == KEYCODE: eModState = etree.SubElement(eModMap, "keycode", value=modstate.getChild(0).getText()) elif modstate.getType() == KEYCODEX: eModState = etree.SubElement(eModMap, "keycodex", value=modstate.getChild(0).getText()) else: print "Unexpected token encountered. Aborting...", modstate.getText() sys.exit(-1) allkeysymgroups = {} for keyset in self.getChildrenByType(mapobject, TOKEN_KEY): keycodex = keyset.getChild(0) if str(keyset.getChild(0)) == "keycodex" else keyset.getChild(1) allkeysymgroups[keycodex.getChild(0).getText()] = keyset sortedkeysymgroups = self.sortDict(allkeysymgroups, KeycodesReader.compare_keycode) for keyset in sortedkeysymgroups: elem_keysymgroup = self.getChildrenByType(keyset, ELEM_KEYSYMGROUP) elem_virtualmods = self.getChildrenByType(keyset, ELEM_VIRTUALMODS) elem_overlay = self.getChildrenByType(keyset, OVERLAY) override = self.getChildrenListByType(keyset, OVERRIDE) eTokenKey = etree.SubElement(eMapMaterial, 'tokenkey') eKeyCodeName = etree.SubElement(eTokenKey, 'keycodename') keycodex = self.getChildrenListByType(keyset, KEYCODEX) if len(keycodex) == 1: eKeyCodeName.text = keycodex[0].getChild(0).getText() else: print "Could not retrieve keycode name" exit(-1) if len(override) == 1: eTokenKey.attrib['override'] = "True" else: eTokenKey.attrib['override'] = "False" if len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)): elem_keysyms = self.getChildrenListByType(keyset, ELEM_KEYSYMS) eKeySymGroup = etree.SubElement(eTokenKey, 'keysymgroup') keysymgroup_counter = len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)) for elem in elem_keysymgroup: eSymbolsGroup = etree.SubElement(eKeySymGroup, 'symbolsgroup') for elem2 in elem.getChildren(): for elem3 in elem2.getChildren(): eSymbol = etree.SubElement(eSymbolsGroup, 'symbol') eSymbol.text = elem3.getText() if len(elem_keysyms) > 0: if len(elem_keysyms) == 1: ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, 'typegroup', value=ksname[1:-1]) else: """ We are probably processing level3; we keep first item """ ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, 'typegroup', value=ksname[1:-1]) #print "Possibly processing level3" if len(self.getChildrenListByType(keyset, ELEM_VIRTUALMODS)): for vmods in elem_virtualmods: etree.SubElement(eKeySymGroup, 'tokenvirtualmodifiers', value=vmods.getChild(0).getText()) if len(self.getChildrenListByType(keyset, OVERLAY)): for elem in elem_overlay: for elem2 in self.getChildrenByType(elem, KEYCODEX): pass else: print "\tInternal error at map level,", mapobject.getText() # sys.exit(-2) return layout
def parse_layout_slave(self, xkbfilename, variantname = None): #print "+++++We are recursive, called with", xkbfilename, variantname char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding='utf-8') lexer = XKBGrammarLexer(char_stream) tokens = antlr3.CommonTokenStream(lexer) parser = XKBGrammarParser(tokens) parser_layout = parser.layout() variants = [] xml_layout = etree.Element('layout') xml_layout.attrib['layoutname'] = os.path.basename(xkbfilename) includes = [] for symbols in parser_layout.tree.getChildren(): eSymbol = etree.SubElement(xml_layout, 'symbols') for mapobject in symbols.getChildren(): if mapobject.getType() == MAPTYPE: for maptypesect in mapobject.getChildren(): if maptypesect.getType() == MAPOPTIONS: for mapoption in maptypesect.getChildren(): if mapoption.getText() == 'xkb_symbols' or mapoption.getText() == 'hidden': eMapOption = etree.SubElement(eSymbol, 'mapoption') eMapOption.text = mapoption.getText() elif maptypesect.getType() == MAPNAME: if maptypesect.getChildCount() == 1: eMapName = etree.SubElement(eSymbol, 'mapname') eMapName.text = maptypesect.getChildren()[0].getText()[1:-1] variants.append(maptypesect.getChildren()[0].getText()[1:-1]) else: return { "success": False } else: return { "success": False } elif mapobject.getType() == MAPMATERIAL: eMapMaterial = etree.SubElement(eSymbol, 'mapmaterial') for name in self.getChildrenByType(mapobject, TOKEN_NAME): nameText = name.getChild(0).getText()[1:-1] eTokenName = etree.SubElement(eMapMaterial, 'tokenname', name=nameText ) for include in self.getChildrenByType(mapobject, TOKEN_INCLUDE): eInclude = etree.SubElement(eMapMaterial, 'tokeninclude') eInclude.text = include.getChild(0).getText()[1:-1] includes.append(eInclude.text) for keytype in self.getChildrenByType(mapobject, TOKEN_KEY_TYPE): keytypeText = keytype.getChild(0).getText() eKeyType = etree.SubElement(eMapMaterial, 'tokentype') eKeyType.text = keytypeText[1:-1] for modmap in self.getChildrenByType(mapobject, TOKEN_MODIFIER_MAP): eModMap = etree.SubElement(eMapMaterial, 'tokenmodifiermap', state=modmap.getChild(0).getText()) for modstate in self.getChildrenByTypes(modmap, KEYCODE, KEYCODEX): if modstate.getType() == KEYCODE: eModState = etree.SubElement(eModMap, "keycode", value=modstate.getChild(0).getText()) elif modstate.getType() == KEYCODEX: eModState = etree.SubElement(eModMap, "keycodex", value=modstate.getChild(0).getText()) else: return { "success": False } # print "Unexpected token encountered. Aborting...", modstate.getText() # sys.exit(-1) allkeysymgroups = {} for keyset in self.getChildrenByType(mapobject, TOKEN_KEY): allkeysymgroups[keyset.getChild(0).getChild(0).getText()] = keyset sortedkeysymgroups = self.sortDict(allkeysymgroups, KeycodesReader.compare_keycode) for keyset in sortedkeysymgroups: elem_keysymgroup = self.getChildrenByType(keyset, ELEM_KEYSYMGROUP) elem_virtualmods = self.getChildrenByType(keyset, ELEM_VIRTUALMODS) elem_overlay = self.getChildrenByType(keyset, OVERLAY) override = self.getChildrenListByType(keyset, OVERRIDE) eTokenKey = etree.SubElement(eMapMaterial, 'tokenkey') eKeyCodeName = etree.SubElement(eTokenKey, 'keycodename') keycodex = self.getChildrenListByType(keyset, KEYCODEX) if len(keycodex) == 1: eKeyCodeName.text = keycodex[0].getChild(0).getText() else: return { "success": False } #print "Could not retrieve keycode name" #exit(-1) if len(override) == 1: eTokenKey.attrib['override'] = "True" else: eTokenKey.attrib['override'] = "False" if len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)): elem_keysyms = self.getChildrenListByType(keyset, ELEM_KEYSYMS) eKeySymGroup = etree.SubElement(eTokenKey, 'keysymgroup') keysymgroup_counter = len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)) for elem in elem_keysymgroup: eSymbolsGroup = etree.SubElement(eKeySymGroup, 'symbolsgroup') for elem2 in elem.getChildren(): for elem3 in elem2.getChildren(): eSymbol = etree.SubElement(eSymbolsGroup, 'symbol') eSymbol.text = elem3.getText() if len(elem_keysyms) > 0: if len(elem_keysyms) == 1: ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, 'typegroup', value=ksname[1:-1]) else: """ We are probably processing level3; we keep first item """ ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, 'typegroup', value=ksname[1:-1]) #print "Possibly processing level3" if len(self.getChildrenListByType(keyset, ELEM_VIRTUALMODS)): for vmods in elem_virtualmods: etree.SubElement(eKeySymGroup, 'tokenvirtualmodifiers', value=vmods.getChild(0).getText()) if len(self.getChildrenListByType(keyset, OVERLAY)): for elem in elem_overlay: for elem2 in self.getChildrenByType(elem, KEYCODEX): pass else: return { "success": False } extraction_result = ExtractVariantsKeycodes(xml_layout, variantname) return { 'success': True, 'all_variants': variants, 'variants': extraction_result['variants'], 'layout': xml_layout, 'keydict': extraction_result['keydict'] }
def parse_layout(self, xkbfilename, variant = None): char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding='utf-8') lexer = XKBGrammarLexer(char_stream) tokens = antlr3.CommonTokenStream(lexer) parser = XKBGrammarParser(tokens) result = parser.layout() variants = [] layout = etree.Element('layout') layout.attrib['layoutname'] = os.path.basename(xkbfilename) #print "Processing", os.path.basename(xkbfilename), "...", for symbols in result.tree.getChildren(): eSymbol = etree.SubElement(layout, 'symbols') for mapobject in symbols.getChildren(): if mapobject.getType() == MAPTYPE: for maptypesect in mapobject.getChildren(): if maptypesect.getType() == MAPOPTIONS: for mapoption in maptypesect.getChildren(): if mapoption.getText() == 'xkb_symbols' or mapoption.getText() == 'hidden': eMapOption = etree.SubElement(eSymbol, 'mapoption') eMapOption.text = mapoption.getText() elif maptypesect.getType() == MAPNAME: if maptypesect.getChildCount() == 1: eMapName = etree.SubElement(eSymbol, 'mapname') eMapName.text = maptypesect.getChildren()[0].getText()[1:-1] variants.append(maptypesect.getChildren()[0].getText()[1:-1]) else: return { "success": False } #print "\t\t\tInternal error in mapoption" else: return { "success": False } #print "\t\tInternal error in maptypesect" #sys.exit(-2) elif mapobject.getType() == MAPMATERIAL: eMapMaterial = etree.SubElement(eSymbol, 'mapmaterial') for name in self.getChildrenByType(mapobject, TOKEN_NAME): nameText = name.getChild(0).getText()[1:-1] eTokenName = etree.SubElement(eMapMaterial, 'tokenname', name=nameText ) for include in self.getChildrenByType(mapobject, TOKEN_INCLUDE): eInclude = etree.SubElement(eMapMaterial, 'tokeninclude') eInclude.text = include.getChild(0).getText()[1:-1] for keytype in self.getChildrenByType(mapobject, TOKEN_KEY_TYPE): keytypeText = keytype.getChild(0).getText() eKeyType = etree.SubElement(eMapMaterial, 'tokentype') eKeyType.text = keytypeText[1:-1] for modmap in self.getChildrenByType(mapobject, TOKEN_MODIFIER_MAP): eModMap = etree.SubElement(eMapMaterial, 'tokenmodifiermap', state=modmap.getChild(0).getText()) for modstate in self.getChildrenByTypes(modmap, KEYCODE, KEYCODEX): if modstate.getType() == KEYCODE: eModState = etree.SubElement(eModMap, "keycode", value=modstate.getChild(0).getText()) elif modstate.getType() == KEYCODEX: eModState = etree.SubElement(eModMap, "keycodex", value=modstate.getChild(0).getText()) else: return { "success": False } # print "Unexpected token encountered. Aborting...", modstate.getText() # sys.exit(-1) allkeysymgroups = {} for keyset in self.getChildrenByType(mapobject, TOKEN_KEY): try: allkeysymgroups[keyset.getChild(0).getChild(0).getText()] = keyset except AttributeError: print "Error setting keyset:", keyset sortedkeysymgroups = self.sortDict(allkeysymgroups, KeycodesReader.compare_keycode) for keyset in sortedkeysymgroups: elem_keysymgroup = self.getChildrenByType(keyset, ELEM_KEYSYMGROUP) elem_virtualmods = self.getChildrenByType(keyset, ELEM_VIRTUALMODS) elem_overlay = self.getChildrenByType(keyset, OVERLAY) override = self.getChildrenListByType(keyset, OVERRIDE) eTokenKey = etree.SubElement(eMapMaterial, 'tokenkey') eKeyCodeName = etree.SubElement(eTokenKey, 'keycodename') keycodex = self.getChildrenListByType(keyset, KEYCODEX) if len(keycodex) == 1: eKeyCodeName.text = keycodex[0].getChild(0).getText() else: return { "success": False } #print "Could not retrieve keycode name" #exit(-1) if len(override) == 1: eTokenKey.attrib['override'] = "True" else: eTokenKey.attrib['override'] = "False" if len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)): elem_keysyms = self.getChildrenListByType(keyset, ELEM_KEYSYMS) eKeySymGroup = etree.SubElement(eTokenKey, 'keysymgroup') keysymgroup_counter = len(self.getChildrenListByType(keyset, ELEM_KEYSYMGROUP)) for elem in elem_keysymgroup: eSymbolsGroup = etree.SubElement(eKeySymGroup, 'symbolsgroup') for elem2 in elem.getChildren(): for elem3 in elem2.getChildren(): eSymbol = etree.SubElement(eSymbolsGroup, 'symbol') eSymbol.text = elem3.getText() if len(elem_keysyms) > 0: if len(elem_keysyms) == 1: ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, 'typegroup', value=ksname[1:-1]) else: """ We are probably processing level3; we keep first item """ ksname = elem_keysyms[0].getChild(0).getText() eKeySyms = etree.SubElement(eKeySymGroup, 'typegroup', value=ksname[1:-1]) #print "Possibly processing level3" if len(self.getChildrenListByType(keyset, ELEM_VIRTUALMODS)): for vmods in elem_virtualmods: etree.SubElement(eKeySymGroup, 'tokenvirtualmodifiers', value=vmods.getChild(0).getText()) if len(self.getChildrenListByType(keyset, OVERLAY)): for elem in elem_overlay: for elem2 in self.getChildrenByType(elem, KEYCODEX): pass else: return { "success": False } #print "\tInternal error at map level,", mapobject.getText() # sys.exit(-2) return { "success": True, "variants": variants, "layout": layout }