예제 #1
0
    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), "...",
예제 #3
0
    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
예제 #4
0
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:
예제 #5
0
    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
예제 #6
0
    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']
             }
예제 #7
0
    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 }