diff --git a/Common.py b/Common.py index 04ce776..1e9d91f 100644 --- a/Common.py +++ b/Common.py @@ -20,9 +20,10 @@ keytypes = Enum.Enum("SIMPLE SPECIAL").vals(illegal=255) alignments = Enum.Enum("LEFT CENTRE RIGHT").vals(illegal=255) keysegments = Enum.Enum("ALL ONE TWO THREE FOUR NONE").vals(illegal=255) -keyvaluetype = Enum.Enum("UNICHAR CODEPOINT KEYSYM CONSTANT DEADKEY ANY VOIDSYMBOL NOSYMBOL NOACTION VERBATIM").vals(illegal=255) +keyvaluetype = Enum.Enum("UNICHAR CODEPOINT KEYSYM CONSTANT DEADKEY ANY VOIDSYMBOL NOSYMBOL NOACTION VERBATIM").vals( + illegal=255) -keysegmentslist = [keysegments.ONE, keysegments.TWO, +keysegmentslist = [keysegments.ONE, keysegments.TWO, keysegments.THREE, keysegments.FOUR] keysegmentslistreverse = list(keysegmentslist) keysegmentslistreverse.reverse() @@ -52,10 +53,10 @@ HOMEDIR = '' # The application's official full name. -applicationname="Keyboard Layout Editor" +applicationname = "Keyboard Layout Editor" # Holds the current filename. -currentlayoutfile='' +currentlayoutfile = '' # The directory to the xkeyboard-config base directory. basedir = '/usr/share/X11/xkb/' @@ -78,27 +79,31 @@ """ + # Sorts a dictionary by value, produces a sorted list of values. -def sortDict(adict, cmp_function = None): +def sortDict(adict, cmp_function=None): keys = adict.keys() keys.sort(cmp_function) return map(adict.get, keys) + def addtostatusbar(message): statusbar.push(statusbar.console_context, message) + def parseIncludeString(include): """ Parses strings of the form 'us(intl)', 'us', and produces { 'filename': 'us', 'variant': 'intl' }, { 'filename': 'us', 'variant': 'basic' } """ if include.partition('(')[1] == '(': - return { 'filename': include.partition('(')[0], 'variant': include.partition('(')[2].partition(')')[0] } + return {'filename': include.partition('(')[0], 'variant': include.partition('(')[2].partition(')')[0]} else: - return { 'filename': include.partition('(')[0], 'variant': '' } + return {'filename': include.partition('(')[0], 'variant': ''} + -if __name__ == '__main__': - print parseIncludeString('us') - print parseIncludeString('us(level1)') - - +if __name__ != '__main__': + pass +else: + print(parseIncludeString('us')) + print(parseIncludeString('us(level1)')) diff --git a/DeadKeysDict.py b/DeadKeysDict.py index 782f1af..4b46197 100644 --- a/DeadKeysDict.py +++ b/DeadKeysDict.py @@ -15,42 +15,43 @@ # along with this program. If not, see class DeadKeysClass: - def __init__(self): - self.dict = { - 'dead_grave' : ('Grave', '`'), - 'dead_acute' : ('Acute', '´'), - 'dead_circumflex' : ('Circumflex', '^'), - 'dead_tilde' : ('Tilde', '~'), - 'dead_perispomeni' : ('Perispomeni', '῀'), - 'dead_macron' : ('Macron', 'ˉ'), - 'dead_breve' : ('Breve', '˘'), - 'dead_abovedot' : ('Abovedot', '˙'), - 'dead_diaeresis' : ('Diaeresis', '¨'), - 'dead_abovering' : ('Abovering', '˚'), - 'dead_doubleacute' : ('Double Acute', '˝'), - 'dead_caron' : ('Caron', 'ˇ'), - 'dead_cedilla' : ('Cedilla', '¸'), - 'dead_ogonek' : ('Ogonek', '˛'), - 'dead_iota' : ('Iota', 'ͺ'), - 'dead_voiced_sound' : ('Voiced Sound', '゙'), # TODO (maybe) - 'dead_semivoiced_sound' : ('Semivoiced Sound', '゚'), # TODO (maybe) - 'dead_belowdot' : ('Below Dot', '?'), # TODO - 'dead_hook' : ('Hook', '?'), # TODO - 'dead_horn' : ('Horn', '?'), # TODO - 'dead_stroke' : ('Stroke', '?'), # TODO - 'dead_abovecomma' : ('Above Comma', '?'), # TODO - 'dead_psili' : ('Psili', '?'), # TODO - 'dead_abovereversedcomma' : ('Above Reversed Comma', 'ʽ'), - 'dead_dasia' : ('Dasia', '῾'), - 'dead_belowring' : ('Below Ring', '˳'), - 'dead_belowmacron' : ('Below Macron', 'ˍ'), - 'dead_belowcircumflex' : ('Below Circumflex', 'ˬ'), - 'dead_belowtilde' : ('Below Tilde', '˷'), - 'dead_belowbreve' : ('Below Breve', '?'), # TODO - 'dead_belowdiaeresis' : ('Below Diaeresis', '?') } # TODO + def __init__(self): + self.dict = { + 'dead_grave': ('Grave', '`'), + 'dead_acute': ('Acute', '´'), + 'dead_circumflex': ('Circumflex', '^'), + 'dead_tilde': ('Tilde', '~'), + 'dead_perispomeni': ('Perispomeni', '῀'), + 'dead_macron': ('Macron', 'ˉ'), + 'dead_breve': ('Breve', '˘'), + 'dead_abovedot': ('Abovedot', '˙'), + 'dead_diaeresis': ('Diaeresis', '¨'), + 'dead_abovering': ('Abovering', '˚'), + 'dead_doubleacute': ('Double Acute', '˝'), + 'dead_caron': ('Caron', 'ˇ'), + 'dead_cedilla': ('Cedilla', '¸'), + 'dead_ogonek': ('Ogonek', '˛'), + 'dead_iota': ('Iota', 'ͺ'), + 'dead_voiced_sound': ('Voiced Sound', '゙'), # TODO (maybe) + 'dead_semivoiced_sound': ('Semivoiced Sound', '゚'), # TODO (maybe) + 'dead_belowdot': ('Below Dot', '?'), # TODO + 'dead_hook': ('Hook', '?'), # TODO + 'dead_horn': ('Horn', '?'), # TODO + 'dead_stroke': ('Stroke', '?'), # TODO + 'dead_abovecomma': ('Above Comma', '?'), # TODO + 'dead_psili': ('Psili', '?'), # TODO + 'dead_abovereversedcomma': ('Above Reversed Comma', 'ʽ'), + 'dead_dasia': ('Dasia', '῾'), + 'dead_belowring': ('Below Ring', '˳'), + 'dead_belowmacron': ('Below Macron', 'ˍ'), + 'dead_belowcircumflex': ('Below Circumflex', 'ˬ'), + 'dead_belowtilde': ('Below Tilde', '˷'), + 'dead_belowbreve': ('Below Breve', '?'), # TODO + 'dead_belowdiaeresis': ('Below Diaeresis', '?')} # TODO + DeadKeys = DeadKeysClass() if __name__ == "__main__": for k in DeadKeys.dict.keys(): - print k, DeadKeys.dict[k] \ No newline at end of file + print(k, DeadKeys.dict[k]) diff --git a/DumbKey.py b/DumbKey.py index a146248..c919b5f 100644 --- a/DumbKey.py +++ b/DumbKey.py @@ -23,11 +23,12 @@ import KeyValue from KeyDict import KeyDict, included_files, activated_variants + class DumbKey(gtk.DrawingArea): - def __init__(self, size = 1, keycode = None, vertical = False, - keytype = Common.keytypes.SIMPLE, - level1 = '', level2 = '', - level3 = '', level4 = ''): + def __init__(self, size=1, keycode=None, vertical=False, + keytype=Common.keytypes.SIMPLE, + level1='', level2='', + level3='', level4=''): gtk.DrawingArea.__init__(self) self.connect("expose_event", self.expose) @@ -36,26 +37,26 @@ def __init__(self, size = 1, keycode = None, vertical = False, self.dvalues = {} self.dvalues_inherited = {} - self.setvalues(size, keycode, vertical, keytype, + self.setvalues(size, keycode, vertical, keytype, level1, level2, level3, level4) self.modifier = 1 self.highlight_x = -1 self.highlight_y = -1 self.highlight = False - self.pending = { "ispending": False, + self.pending = {"ispending": False, "keysegment": Common.keysegments.NONE, - "value": '', - "coordinates": (-1, -1) } + "value": '', + "coordinates": (-1, -1)} self.popup_highlight = 0 - + self.infowin = gtk.Window() self.infowin.set_decorated(False) - - def setvalues(self, size = 1, keycode = None, vertical = False, - keytype = Common.keytypes.SIMPLE, - level1 = '', level2 = '', - level3 = '', level4 = ''): + + def setvalues(self, size=1, keycode=None, vertical=False, + keytype=Common.keytypes.SIMPLE, + level1='', level2='', + level3='', level4=''): self.keycode = keycode self.size = size self.vertical = vertical @@ -64,26 +65,26 @@ def setvalues(self, size = 1, keycode = None, vertical = False, self.verbatim = True else: self.verbatim = False - self.keyvalues = { - Common.keysegments.ONE: KeyValue.KeyValue(level1.decode('utf-8'), self.verbatim), - Common.keysegments.TWO: KeyValue.KeyValue(level2.decode('utf-8'), self.verbatim), - Common.keysegments.THREE: KeyValue.KeyValue(level3.decode('utf-8'), self.verbatim), - Common.keysegments.FOUR: KeyValue.KeyValue(level4.decode('utf-8'), self.verbatim) - } + self.keyvalues = { + Common.keysegments.ONE: KeyValue.KeyValue(level1.decode('utf-8'), self.verbatim), + Common.keysegments.TWO: KeyValue.KeyValue(level2.decode('utf-8'), self.verbatim), + Common.keysegments.THREE: KeyValue.KeyValue(level3.decode('utf-8'), self.verbatim), + Common.keysegments.FOUR: KeyValue.KeyValue(level4.decode('utf-8'), self.verbatim) + } # Fills up the dvalues list with the values to display self.extract_display_keyvalues() def expose(self, widget, event): self.context = widget.window.cairo_create() - + # set a clip region for the expose event - self.context.rectangle(event.area.x, event.area.y, - event.area.width, event.area.height) + self.context.rectangle(event.area.x, event.area.y, + event.area.width, event.area.height) self.context.clip() self.a = self.parent.get_parent() self.b = self.a.parent.get_parent() - self.set_size_request(int(self.__key_width*self.size), -1) + self.set_size_request(int(self.__key_width * self.size), -1) self.draw(self.context) return False @@ -95,14 +96,14 @@ def draw(self, context): """ Draw the rectangle, filling in with color """ self.context.set_source_rgb(0.0, 0.0, 0.0) self.roundedrec(context, 0, 0, rect.width, rect.height, 15, 3) - + if self.keytype == Common.keytypes.SIMPLE: - context.set_source_rgb(1.0 * self.modifier, - 1.0 * self.modifier, + context.set_source_rgb(1.0 * self.modifier, + 1.0 * self.modifier, 0.9 * self.modifier) elif self.keytype == Common.keytypes.SPECIAL: context.set_source_rgb(.7 * self.modifier, - .7 * self.modifier, + .7 * self.modifier, .5 * self.modifier) self.context.fill_preserve() self.context.stroke() @@ -110,13 +111,13 @@ def draw(self, context): """ Highlight the segment """ if self.highlight or self.popup_highlight: self.context.set_source_rgb(1.0, 1.0, 0.6) - self.roundedrec_segment(context, self.pending["keysegment"], + self.roundedrec_segment(context, self.pending["keysegment"], 0, 0, rect.width, rect.height, 15, 3) self.context.fill_preserve() self.context.stroke() """ Draw the cross """ - context.set_source_rgb(.1,.1,.1) + context.set_source_rgb(.1, .1, .1) context.set_line_width(0.3) if self.dvalues[Common.keysegments.THREE].getPValue() != '' \ or self.dvalues[Common.keysegments.FOUR].getPValue() != '': @@ -128,42 +129,42 @@ def draw(self, context): self.context.stroke() """ Draw the four characters on the key """ - self.context.set_source_rgb(0,1,0) + self.context.set_source_rgb(0, 1, 0) if self.dvalues[Common.keysegments.ONE].getPValue() == '': pass if self.dvalues[Common.keysegments.TWO].getPValue() == '' and \ - self.dvalues[Common.keysegments.THREE].getPValue() == '' and \ - self.dvalues[Common.keysegments.FOUR].getPValue() == '' \ - or self.dvalues[Common.keysegments.THREE].getPValue() == '' and \ - self.dvalues[Common.keysegments.FOUR].getPValue() == '': - self.draw_character(context, self.dvalues[Common.keysegments.ONE].getPValue(), - Common.alignments.LEFT, + self.dvalues[Common.keysegments.THREE].getPValue() == '' and \ + self.dvalues[Common.keysegments.FOUR].getPValue() == '' \ + or self.dvalues[Common.keysegments.THREE].getPValue() == '' and \ + self.dvalues[Common.keysegments.FOUR].getPValue() == '': + self.draw_character(context, self.dvalues[Common.keysegments.ONE].getPValue(), + Common.alignments.LEFT, 0, rect.height / 2, rect.width, rect.height / 2) else: - self.draw_character(context, self.dvalues[Common.keysegments.ONE].getPValue(), - Common.alignments.CENTRE, + self.draw_character(context, self.dvalues[Common.keysegments.ONE].getPValue(), + Common.alignments.CENTRE, 0, rect.height / 2, rect.width / 2, rect.height / 2) if self.dvalues[Common.keysegments.THREE].getPValue() == '' and \ - self.dvalues[Common.keysegments.FOUR].getPValue() == '': - self.draw_character(context, self.dvalues[Common.keysegments.TWO].getPValue(), - Common.alignments.LEFT, + self.dvalues[Common.keysegments.FOUR].getPValue() == '': + self.draw_character(context, self.dvalues[Common.keysegments.TWO].getPValue(), + Common.alignments.LEFT, 0, 0, rect.width, rect.height / 2) else: - self.draw_character(context, self.dvalues[Common.keysegments.TWO].getPValue(), - Common.alignments.CENTRE, + self.draw_character(context, self.dvalues[Common.keysegments.TWO].getPValue(), + Common.alignments.CENTRE, 0, 0, rect.width / 2, rect.height / 2) - self.draw_character(context, self.dvalues[Common.keysegments.THREE].getPValue(), - Common.alignments.CENTRE, - rect.width / 2, rect.height / 2, - rect.width / 2, rect.height / 2 ) - self.draw_character(context, self.dvalues[Common.keysegments.FOUR].getPValue(), - Common.alignments.CENTRE, + self.draw_character(context, self.dvalues[Common.keysegments.THREE].getPValue(), + Common.alignments.CENTRE, + rect.width / 2, rect.height / 2, + rect.width / 2, rect.height / 2) + self.draw_character(context, self.dvalues[Common.keysegments.FOUR].getPValue(), + Common.alignments.CENTRE, rect.width / 2, 0, rect.width / 2, rect.height / 2) def draw_segment(self, segment): pass - + def draw_line(self, context, x1, y1, x2, y2): self.context.move_to(x1, y1) self.context.line_to(x2, y2) @@ -171,40 +172,40 @@ def draw_line(self, context, x1, y1, x2, y2): def draw_linewh(self, context, x, y, w, h): self.context.move_to(x, y) - self.context.line_to(x+w, y+h) + self.context.line_to(x + w, y + h) self.context.stroke() - + def draw_character(self, context, char, align, cx, cy, cwidth, cheight): if char == '': return - self.context.select_font_face(Common.fontname, Common.fontstyle, + self.context.select_font_face(Common.fontname, Common.fontstyle, Common.fontweight) self.context.set_font_size(Common.fontsize * 1.0) fascent, fdescent, fheight, fxadvance, fyadvance = self.context.font_extents() xbearing, ybearing, width, height, xadvance, yadvance = \ - self.context.text_extents(char) + self.context.text_extents(char) if align == Common.alignments.CENTRE: - self.context.move_to(cx + cwidth/2 - width/2 - xbearing, - cy + cheight/2 - height/2 - ybearing) + self.context.move_to(cx + cwidth / 2 - width / 2 - xbearing, + cy + cheight / 2 - height / 2 - ybearing) elif align == Common.alignments.LEFT: - self.context.move_to(cx + cwidth/16 - xbearing, - cy + cheight - cheight/16 + ybearing) + self.context.move_to(cx + cwidth / 16 - xbearing, + cy + cheight - cheight / 16 + ybearing) elif align == Common.alignments.RIGHT: - self.context.move_to(cx + cwidth/2 - width/2 - xbearing, - cy + cheight/2 - height/2 - ybearing) + self.context.move_to(cx + cwidth / 2 - width / 2 - xbearing, + cy + cheight / 2 - height / 2 - ybearing) else: - print "Error; unknown alignment" + print("Error; unknown alignment") sys.exit(-1) self.context.set_source_rgb(.30, .30, .30) self.context.show_text(char) - + def redraw(self): - (x,y,width,height) = self.get_allocation() - self.queue_draw_area(x, y, width, height) - - def roundedrec(self, context, x, y, w, h, r = 10, line_width=1): + (x, y, width, height) = self.get_allocation() + self.queue_draw_area(x, y, width, height) + + def roundedrec(self, context, x, y, w, h, r=10, line_width=1): "Draw a rounded rectangle (source: anonymous/pygtk website)" # A****BQ # H C @@ -213,17 +214,17 @@ def roundedrec(self, context, x, y, w, h, r = 10, line_width=1): # F****E context.set_line_width(line_width) - context.move_to(x+r,y) # Move to A - context.line_to(x+w-r,y) # Straight line to B - context.curve_to(x+w,y,x+w,y,x+w,y+r) # Curve to C, Control points are both at Q - context.line_to(x+w,y+h-r) # Move to D - context.curve_to(x+w,y+h,x+w,y+h,x+w-r,y+h) # Curve to E - context.line_to(x+r,y+h) # Line to F - context.curve_to(x,y+h,x,y+h,x,y+h-r) # Curve to G - context.line_to(x,y+r) # Line to H - context.curve_to(x,y,x,y,x+r,y) # Curve to A - - def roundedrec_segment(self,context, which_segment, x, y, w, h, r = 10, + context.move_to(x + r, y) # Move to A + context.line_to(x + w - r, y) # Straight line to B + context.curve_to(x + w, y, x + w, y, x + w, y + r) # Curve to C, Control points are both at Q + context.line_to(x + w, y + h - r) # Move to D + context.curve_to(x + w, y + h, x + w, y + h, x + w - r, y + h) # Curve to E + context.line_to(x + r, y + h) # Line to F + context.curve_to(x, y + h, x, y + h, x, y + h - r) # Curve to G + context.line_to(x, y + r) # Line to H + context.curve_to(x, y, x, y, x + r, y) # Curve to A + + def roundedrec_segment(self, context, which_segment, x, y, w, h, r=10, line_width=1): "Draw a rounded rectangle (source: anonymous/pygtk website)" # A****BQ @@ -236,41 +237,41 @@ def roundedrec_segment(self,context, which_segment, x, y, w, h, r = 10, if which_segment == Common.keysegments.ALL: self.roundedrec(context, x, y, w, h, r, line_width) elif which_segment == Common.keysegments.ONE: - context.move_to(x, y + h / 2) # Move to GH-middle - context.line_to(x, y + h - r) # Line to G - context.curve_to(x, y + h, x, y + h, x + r, y+h)# Curve to F - context.line_to(x + w / 2, y + h) # Line to FE-middle - context.line_to(x + w / 2, y + h / 2) # Line to middle - context.line_to(x, y + h / 2) # Line to GH-middle + context.move_to(x, y + h / 2) # Move to GH-middle + context.line_to(x, y + h - r) # Line to G + context.curve_to(x, y + h, x, y + h, x + r, y + h) # Curve to F + context.line_to(x + w / 2, y + h) # Line to FE-middle + context.line_to(x + w / 2, y + h / 2) # Line to middle + context.line_to(x, y + h / 2) # Line to GH-middle elif which_segment == Common.keysegments.TWO: - context.move_to(x, y + h / 2) # Move to GH-middle - context.line_to(x, y + r) # Line to H - context.curve_to(x, y, x, y, x + r, y) # Curve to A - context.line_to(x + w / 2, y) # Line to AB-middle - context.line_to(x + w / 2, y + h / 2) # Line to middle - context.line_to(x, y + h / 2) # Line to GH-middle + context.move_to(x, y + h / 2) # Move to GH-middle + context.line_to(x, y + r) # Line to H + context.curve_to(x, y, x, y, x + r, y) # Curve to A + context.line_to(x + w / 2, y) # Line to AB-middle + context.line_to(x + w / 2, y + h / 2) # Line to middle + context.line_to(x, y + h / 2) # Line to GH-middle elif which_segment == Common.keysegments.THREE: - context.move_to(x + w / 2, y + h) # Move to FE-middle - context.line_to(x + w - r, y + h) # Line to E - context.curve_to(x + w, y + h, x + w, y + h, - x + w, y + h - r) # Curve to D - context.line_to(x + w, y + h / 2) # Line to CD-middle - context.line_to(x + w / 2, y + h / 2) # Line to middle - context.line_to(x + w / 2, y + h) # Line to FE-middle + context.move_to(x + w / 2, y + h) # Move to FE-middle + context.line_to(x + w - r, y + h) # Line to E + context.curve_to(x + w, y + h, x + w, y + h, + x + w, y + h - r) # Curve to D + context.line_to(x + w, y + h / 2) # Line to CD-middle + context.line_to(x + w / 2, y + h / 2) # Line to middle + context.line_to(x + w / 2, y + h) # Line to FE-middle elif which_segment == Common.keysegments.FOUR: - context.move_to(x + w, y + h / 2) # Move to CD-middle - context.line_to(x + w, y + r) # Line to C - context.curve_to(x + w, y, x + w, y, - x + w - r, y) # Curve to B - context.line_to(x + w / 2, y) # Line to AB-middle - context.line_to(x + w / 2, y + h / 2) # Line to middle - context.line_to(x + w, y + h / 2) # Line to CD-middle - - def do_highlight(self, do_highlight = Common.keysegments.NONE, x = -1, y = -1): + context.move_to(x + w, y + h / 2) # Move to CD-middle + context.line_to(x + w, y + r) # Line to C + context.curve_to(x + w, y, x + w, y, + x + w - r, y) # Curve to B + context.line_to(x + w / 2, y) # Line to AB-middle + context.line_to(x + w / 2, y + h / 2) # Line to middle + context.line_to(x + w, y + h / 2) # Line to CD-middle + + def do_highlight(self, do_highlight=Common.keysegments.NONE, x=-1, y=-1): self.highlight_x = x self.highlight_y = y - - #print "do_highlight():", x, y + + # print "do_highlight():", x, y if do_highlight: self.modifier = .8 else: @@ -290,8 +291,8 @@ def extract_display_keyvalues(self): if activated_variants[layout][variant].has_key(self.keycode): if activated_variants[layout][variant][self.keycode].has_key(counter): self.dvalues_inherited[counter] = True - self.dvalues[counter] = copy.copy(activated_variants[layout][variant][self.keycode][counter]) + self.dvalues[counter] = copy.copy( + activated_variants[layout][variant][self.keycode][counter]) if self.dvalues[counter].getType() == Common.keyvaluetype.NOSYMBOL: self.dvalues_inherited[counter] = False self.dvalues[counter] = copy.copy(self.keyvalues[counter]) - \ No newline at end of file diff --git a/GenericLayout.py b/GenericLayout.py index 32c7cfb..a1b6a26 100644 --- a/GenericLayout.py +++ b/GenericLayout.py @@ -18,6 +18,7 @@ from lxml import etree from KeyDict import KeyDict, included_files, activated_variants + # # # @@ -37,12 +38,13 @@ # # # -# +# class GenericLayout: - def __init__(self): - self.generic_layout = etree.Element("layout", layoutname = "CHANGEME") + def __init__(self): + self.tokenkey = None + self.generic_layout = etree.Element("layout", layoutname="CHANGEME") self.symbols = etree.SubElement(self.generic_layout, "symbols") @@ -67,13 +69,14 @@ def __init__(self): for counter in range(Common.LEVELS): etree.SubElement(self.symbolsgroup, "symbol") """ - + def create_layout(self, layoutcode, layoutvariant, layoutcountry, layoutname, layoutkeys): """ Creates an lxml construct with the layout. Makes use of KeyDict.included_files, KeyDict.activated_variants """ - self.new_layout = etree.Element("layout", layoutname = layoutcode) + global max_index + self.new_layout = etree.Element("layout", layoutname=layoutcode) self.symbols = etree.SubElement(self.new_layout, "symbols") @@ -92,7 +95,7 @@ def create_layout(self, layoutcode, layoutvariant, layoutcountry, layoutname, la for keycodename in layoutkeys.keys(): if keycodename in KeyDict.IgnoreKeys: - #print "keycodename", keycodename, "is in ignorekeys" + # print "keycodename", keycodename, "is in ignorekeys" continue votes_empty = 0 for counter in Common.keysegmentslist: @@ -101,13 +104,13 @@ def create_layout(self, layoutcode, layoutvariant, layoutcountry, layoutname, la if votes_empty == len(Common.keysegmentslist): # print "Keycode", keycodename, "is empty, skipping" continue - else: + else: # print keycodename, "we only had", votes_empty, "votes," for counter in Common.keysegmentslist: pass - #print layoutkeys[keycodename].key.keyvalues[counter].getValue(), - #print - #print layoutkeys[keycodename].key.keyvalues[Common.keysegments.ONE].getValue() + # print layoutkeys[keycodename].key.keyvalues[counter].getValue(), + # print + # print layoutkeys[keycodename].key.keyvalues[Common.keysegments.ONE].getValue() self.tokenkey = etree.SubElement(self.mapmaterial, "tokenkey") self.tokenkey.attrib["override"] = "False" @@ -121,12 +124,12 @@ def create_layout(self, layoutcode, layoutvariant, layoutcountry, layoutname, la for counter in Common.keysegmentslistreverse: max_index = counter if layoutkeys[keycodename].key.keyvalues[counter].getType() == Common.keyvaluetype.NOSYMBOL: - #print "O", + # print "O", continue else: break - #print - #print "Doing look between", Common.keysegments.ONE, "and", max_index + # print + # print "Doing look between", Common.keysegments.ONE, "and", max_index for counter in range(Common.keysegments.ONE, max_index + 1): sym = etree.SubElement(self.symbolsgroup, "symbol") sym.text = layoutkeys[keycodename].key.keyvalues[counter].getValue() @@ -135,7 +138,7 @@ def create_layout(self, layoutcode, layoutvariant, layoutcountry, layoutname, la # print "sym.text", sym.text return self.new_layout - + def create_tokenkey(self, keycodenametext): if not self.exists_tokenkey(keycodenametext): tokenkey = etree.SubElement(self.mapmaterial, "tokenkey") @@ -155,11 +158,11 @@ def create_tokenkey(self, keycodenametext): def return_tokenkey(self, keycode): all_tokenkeys = self.generic_layout.findall(".//tokenkey") - if all_tokenkeys == []: + if not all_tokenkeys: return None for tk in all_tokenkeys: keycodenames = tk.findall(".//keycodename") - if keycodenames == []: + if not keycodenames: SystemError("Internal error, expecting a keycodename") if len(keycodenames) > 1: SystemError("Internal error, expecting only one keycodename") @@ -168,11 +171,11 @@ def return_tokenkey(self, keycode): def exists_tokenkey(self, keycode): all_tokenkeys = self.generic_layout.findall(".//tokenkey") - if all_tokenkeys == []: + if not all_tokenkeys: return False for tk in all_tokenkeys: keycodenames = tk.findall(".//keycodename") - if keycodenames == []: + if not keycodenames: SystemError("Internal error, expecting a keycodename") if len(keycodenames) > 1: SystemError("Internal error, expecting only one keycodename") @@ -180,10 +183,11 @@ def exists_tokenkey(self, keycode): return True else: return False - + def tostring(self): - return etree.tostring(self.generic_layout, pretty_print = True) - + return etree.tostring(self.generic_layout, pretty_print=True) + + if __name__ == "__main__": gl = GenericLayout() - print gl.tostring() + print(gl.tostring()) diff --git a/Key.py b/Key.py index 233a5a3..417e5fa 100644 --- a/Key.py +++ b/Key.py @@ -22,19 +22,20 @@ import KeyValue from KeyDict import KeyDict -class Key(gtk.EventBox): + +class Key(gtk.EventBox): TARGET_TYPE_TEXT = 80 - __toKey__ = [ ( "text/plain", 0, TARGET_TYPE_TEXT ) ] - - def __init__(self, size = 1, keycode = None, vertical = False, - keytype = Common.keytypes.SIMPLE, - level1 = '', level2 = '', level3 = '', level4 = ''): + __toKey__ = [("text/plain", 0, TARGET_TYPE_TEXT)] + + def __init__(self, size=1, keycode=None, vertical=False, + keytype=Common.keytypes.SIMPLE, + level1='', level2='', level3='', level4=''): gtk.EventBox.__init__(self) self.keycode = keycode - #print "Key: Invoked __init__(), level1:", level1 + # print "Key: Invoked __init__(), level1:", level1 - self.key = DumbKey.DumbKey(size, keycode, vertical, keytype, + self.key = DumbKey.DumbKey(size, keycode, vertical, keytype, level1, level2, level3, level4) self.add(self.key) self.set_events(gtk.gdk.BUTTON_PRESS_MASK) @@ -45,24 +46,24 @@ def __init__(self, size = 1, keycode = None, vertical = False, self.context_menu = gtk.Menu() self.context_menu_item = gtk.MenuItem("Remove") self.context_menu.add(self.context_menu_item) - self.context_menu_item.connect("activate", self.menu_item_activate_callback, + self.context_menu_item.connect("activate", self.menu_item_activate_callback, "remove") self.context_menu.connect("selection-done", self.menu_selection_done_callback) self.context_menu.show_all() - + # Adding DnD support if self.keycode not in KeyDict.IgnoreKeys: self.connect("drag_data_received", self.drag_data_get_callback) self.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT | - gtk.DEST_DEFAULT_DROP, - self.__toKey__, gtk.gdk.ACTION_COPY) - + gtk.DEST_DEFAULT_HIGHLIGHT | + gtk.DEST_DEFAULT_DROP, + self.__toKey__, gtk.gdk.ACTION_COPY) + self.add_events(self.get_events() | gtk.gdk.EXPOSURE_MASK - | gtk.gdk.BUTTON1_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK - | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.DRAG_MOTION - | gtk.gdk.DROP_FINISHED | gtk.gdk.DRAG_STATUS | gtk.gdk.ENTER_NOTIFY - | gtk.gdk.DRAG_ENTER) + | gtk.gdk.BUTTON1_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK + | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.DRAG_MOTION + | gtk.gdk.DROP_FINISHED | gtk.gdk.DRAG_STATUS | gtk.gdk.ENTER_NOTIFY + | gtk.gdk.DRAG_ENTER) # self.connect("motion-notify-event", self.mouse_move_signal) self.connect("enter_notify_event", self.enter_notify_callback) self.connect("leave_notify_event", self.leave_notify_callback) @@ -71,37 +72,37 @@ def __init__(self, size = 1, keycode = None, vertical = False, self.connect("drag_leave", self.drag_leave_callback) self.tooltips = gtk.Tooltips() self.tooltips.set_tip(self, "Keycode: " + self.keycode) - + def drag_data_get_callback(self, widget, context, x, y, selection, targetType, time): - #print "Callback drag_data_get: Received a callback for '%(str)s', segment: %(s)d at %(x)d, %(y)d" % \ + # print "Callback drag_data_get: Received a callback for '%(str)s', segment: %(s)d at %(x)d, %(y)d" % \ # { "s": self.key.pending["keysegment"], "str": selection.data.decode('utf-8'), "x": x, "y": y } if selection.data[0] == '\\' and \ - (selection.data[1] == 'u' or selection.data[1] == 'U'): + (selection.data[1] == 'u' or selection.data[1] == 'U'): newval = selection.data.decode('unicode-escape') else: newval = selection.data self.key.pending["ispending"] = True self.key.pending["value"] = newval - #print "drag_data_get" - #print "self.key.pending[\"keysegment\"]:", self.key.pending["keysegment"] + # print "drag_data_get" + # print "self.key.pending[\"keysegment\"]:", self.key.pending["keysegment"] self.key.keyvalues[self.key.pending["keysegment"]].add(newval) self.key.extract_display_keyvalues() self.key.redraw() self.set_tooltip() Common.addtostatusbar('Added ' + newval + ' to key ' + self.keycode + \ ', at level ' + str(self.key.pending["keysegment"])) - + def mouse_move_callback(self, widget, event): pass - + def enter_notify_callback(self, widget, event): - #print "enter_notify" + # print "enter_notify" self.key.do_highlight(True) self.set_tooltip() def leave_notify_callback(self, widget, event): - #self.key.infowin.hide() - #print "leave_notify" + # self.key.infowin.hide() + # print "leave_notify" self.key.do_highlight(False, event.x, event.y) def drag_drop_callback(self, widget, drag_context, x, y, timestamp): @@ -109,13 +110,13 @@ def drag_drop_callback(self, widget, drag_context, x, y, timestamp): pass def drag_motion_callback(self, widget, drag_context, x, y, timestamp): - #print "drag_motion" + # print "drag_motion" self.key.highlight = True self.key.do_highlight(True, x, y) self.key.pending["keysegment"] = self.find_highlighted_segment(x, y) - + def drag_leave_callback(self, widget, drag_context, timestamp): - #print "drag_leave" + # print "drag_leave" self.key.highlight = False self.key.do_highlight(False) @@ -127,7 +128,7 @@ def button_press_event_callback(self, widget, event): self.key.pending["keysegment"] = self.find_highlighted_segment(event.x, event.y) # Tell calling code that we have handled this event. return True - + # Tell calling code we have not handled this code; pass it on return False @@ -145,28 +146,28 @@ def menu_item_activate_callback(self, menuitem, action): self.key.extract_display_keyvalues() self.set_tooltip() self.key.redraw() - + def myname(self): return "[%(k1)s, %(k2)s, %(k3)s, %(k4)s]" % \ - { "k1": self.key.keyvalues[Common.keysegments.ONE].getValue(), - "k2": self.key.keyvalues[Common.keysegments.TWO].getValue(), - "k3": self.key.keyvalues[Common.keysegments.THREE].getValue(), - "k4": self.key.keyvalues[Common.keysegments.FOUR].getValue() - } - + {"k1": self.key.keyvalues[Common.keysegments.ONE].getValue(), + "k2": self.key.keyvalues[Common.keysegments.TWO].getValue(), + "k3": self.key.keyvalues[Common.keysegments.THREE].getValue(), + "k4": self.key.keyvalues[Common.keysegments.FOUR].getValue() + } + def find_highlighted_segment(self, x, y): dummy, dummy, width, height = self.get_allocation() - #print "find:", width, height, x, y + # print "find:", width, height, x, y if x != -1 and y != -1: - if x <= width/2: - if y <= height/2: + if x <= width / 2: + if y <= height / 2: return Common.keysegments.TWO else: return Common.keysegments.ONE - elif y <= height/2: - return Common.keysegments.FOUR + elif y <= height / 2: + return Common.keysegments.FOUR else: - return Common.keysegments.THREE + return Common.keysegments.THREE else: return Common.keysegments.NONE @@ -175,10 +176,10 @@ def set_tooltip(self): counter_empty = 0 for counter in Common.keysegmentslist: if self.key.dvalues[counter].getType() == Common.keyvaluetype.NOSYMBOL: - counter_empty +=1 + counter_empty += 1 if counter_empty < len(Common.keysegmentslist): for counter in Common.keysegmentslist: - tooltip_string += '\n' + str(counter) + '. ' +\ - str(self.key.dvalues[counter].getValue()) + ' ' +\ - self.key.dvalues[counter].getPValue() + tooltip_string += '\n' + str(counter) + '. ' + \ + str(self.key.dvalues[counter].getValue()) + ' ' + \ + self.key.dvalues[counter].getPValue() self.tooltips.set_tip(self, tooltip_string) diff --git a/KeyDict.py b/KeyDict.py index 8e73c8a..f470ea9 100644 --- a/KeyDict.py +++ b/KeyDict.py @@ -17,104 +17,106 @@ import Key import Common + class KeyDictClass: def __init__(self): - self.Keys = {} + self.Keys = {} - self.IgnoreKeys = [ "ESC", "FK01", "FK02", "FK03", "FK04", "FK05", "FK06", - "FK07", "FK08", "FK09", "FK10", "FK11", "FK12", - "BKSP", "TAB", "CAPS", "RTRN", "LFSH", "RTSH", "LCTL", - "LWIN", "LALT", "SPCE", "RALT", "RWIN", "MENU", "RCTL" ] + self.IgnoreKeys = ["ESC", "FK01", "FK02", "FK03", "FK04", "FK05", "FK06", + "FK07", "FK08", "FK09", "FK10", "FK11", "FK12", + "BKSP", "TAB", "CAPS", "RTRN", "LFSH", "RTSH", "LCTL", + "LWIN", "LALT", "SPCE", "RALT", "RWIN", "MENU", "RCTL"] def set(self): self.Keys = { - "ESC" : Key.Key(1, "ESC", False, Common.keytypes.SPECIAL,'Esc'), - "FK01": Key.Key(1, "FK01", False, Common.keytypes.SIMPLE, 'F1'), - "FK02": Key.Key(1, "FK02", False, Common.keytypes.SIMPLE, 'F2'), - "FK03": Key.Key(1, "FK03", False, Common.keytypes.SIMPLE, 'F3'), - "FK04": Key.Key(1, "FK04", False, Common.keytypes.SIMPLE, 'F4'), - "FK05": Key.Key(1, "FK05", False, Common.keytypes.SIMPLE, 'F5'), - "FK06": Key.Key(1, "FK06", False, Common.keytypes.SIMPLE, 'F6'), - "FK07": Key.Key(1, "FK07", False, Common.keytypes.SIMPLE, 'F7'), - "FK08": Key.Key(1, "FK08", False, Common.keytypes.SIMPLE, 'F8'), - "FK09": Key.Key(1, "FK09", False, Common.keytypes.SIMPLE, 'F9'), - "FK10": Key.Key(1, "FK10", False, Common.keytypes.SIMPLE, 'F10'), - "FK11": Key.Key(1, "FK11", False, Common.keytypes.SIMPLE, 'F11'), - "FK12": Key.Key(1, "FK12", False, Common.keytypes.SIMPLE, 'F12'), + "ESC": Key.Key(1, "ESC", False, Common.keytypes.SPECIAL, 'Esc'), + "FK01": Key.Key(1, "FK01", False, Common.keytypes.SIMPLE, 'F1'), + "FK02": Key.Key(1, "FK02", False, Common.keytypes.SIMPLE, 'F2'), + "FK03": Key.Key(1, "FK03", False, Common.keytypes.SIMPLE, 'F3'), + "FK04": Key.Key(1, "FK04", False, Common.keytypes.SIMPLE, 'F4'), + "FK05": Key.Key(1, "FK05", False, Common.keytypes.SIMPLE, 'F5'), + "FK06": Key.Key(1, "FK06", False, Common.keytypes.SIMPLE, 'F6'), + "FK07": Key.Key(1, "FK07", False, Common.keytypes.SIMPLE, 'F7'), + "FK08": Key.Key(1, "FK08", False, Common.keytypes.SIMPLE, 'F8'), + "FK09": Key.Key(1, "FK09", False, Common.keytypes.SIMPLE, 'F9'), + "FK10": Key.Key(1, "FK10", False, Common.keytypes.SIMPLE, 'F10'), + "FK11": Key.Key(1, "FK11", False, Common.keytypes.SIMPLE, 'F11'), + "FK12": Key.Key(1, "FK12", False, Common.keytypes.SIMPLE, 'F12'), + + "TLDE": Key.Key(1, "TLDE", False, Common.keytypes.SIMPLE), + "AE01": Key.Key(1, "AE01", False, Common.keytypes.SIMPLE), + "AE02": Key.Key(1, "AE02", False, Common.keytypes.SIMPLE), + "AE03": Key.Key(1, "AE03", False, Common.keytypes.SIMPLE), + "AE04": Key.Key(1, "AE04", False, Common.keytypes.SIMPLE), + "AE05": Key.Key(1, "AE05", False, Common.keytypes.SIMPLE), + "AE06": Key.Key(1, "AE06", False, Common.keytypes.SIMPLE), + "AE07": Key.Key(1, "AE07", False, Common.keytypes.SIMPLE), + "AE08": Key.Key(1, "AE08", False, Common.keytypes.SIMPLE), + "AE09": Key.Key(1, "AE09", False, Common.keytypes.SIMPLE), + "AE10": Key.Key(1, "AE10", False, Common.keytypes.SIMPLE), + "AE11": Key.Key(1, "AE11", False, Common.keytypes.SIMPLE), + "AE12": Key.Key(1, "AE12", False, Common.keytypes.SIMPLE), + "BKSP": Key.Key(2, "BKSP", False, Common.keytypes.SPECIAL, 'Backspace'), - "TLDE": Key.Key(1, "TLDE", False, Common.keytypes.SIMPLE), - "AE01": Key.Key(1, "AE01", False, Common.keytypes.SIMPLE), - "AE02": Key.Key(1, "AE02", False, Common.keytypes.SIMPLE), - "AE03": Key.Key(1, "AE03", False, Common.keytypes.SIMPLE), - "AE04": Key.Key(1, "AE04", False, Common.keytypes.SIMPLE), - "AE05": Key.Key(1, "AE05", False, Common.keytypes.SIMPLE), - "AE06": Key.Key(1, "AE06", False, Common.keytypes.SIMPLE), - "AE07": Key.Key(1, "AE07", False, Common.keytypes.SIMPLE), - "AE08": Key.Key(1, "AE08", False, Common.keytypes.SIMPLE), - "AE09": Key.Key(1, "AE09", False, Common.keytypes.SIMPLE), - "AE10": Key.Key(1, "AE10", False, Common.keytypes.SIMPLE), - "AE11": Key.Key(1, "AE11", False, Common.keytypes.SIMPLE), - "AE12": Key.Key(1, "AE12", False, Common.keytypes.SIMPLE), - "BKSP": Key.Key(2, "BKSP", False, Common.keytypes.SPECIAL,'Backspace'), + "TAB": Key.Key(1.8, "TAB", False, Common.keytypes.SPECIAL, 'Tab', 'ISO_Left'), + "AD01": Key.Key(1, "AD01", False, Common.keytypes.SIMPLE), + "AD02": Key.Key(1, "AD02", False, Common.keytypes.SIMPLE), + "AD03": Key.Key(1, "AD03", False, Common.keytypes.SIMPLE), + "AD04": Key.Key(1, "AD04", False, Common.keytypes.SIMPLE), + "AD05": Key.Key(1, "AD05", False, Common.keytypes.SIMPLE), + "AD06": Key.Key(1, "AD06", False, Common.keytypes.SIMPLE), + "AD07": Key.Key(1, "AD07", False, Common.keytypes.SIMPLE), + "AD08": Key.Key(1, "AD08", False, Common.keytypes.SIMPLE), + "AD09": Key.Key(1, "AD09", False, Common.keytypes.SIMPLE), + "AD10": Key.Key(1, "AD10", False, Common.keytypes.SIMPLE), + "AD11": Key.Key(1, "AD11", False, Common.keytypes.SIMPLE), + "AD12": Key.Key(1, "AD12", False, Common.keytypes.SIMPLE), + "BKSL": Key.Key(1, "BKSL", False, Common.keytypes.SIMPLE), - "TAB" : Key.Key(1.8, "TAB", False, Common.keytypes.SPECIAL, 'Tab', 'ISO_Left'), - "AD01": Key.Key(1, "AD01", False, Common.keytypes.SIMPLE), - "AD02": Key.Key(1, "AD02", False, Common.keytypes.SIMPLE), - "AD03": Key.Key(1, "AD03", False, Common.keytypes.SIMPLE), - "AD04": Key.Key(1, "AD04", False, Common.keytypes.SIMPLE), - "AD05": Key.Key(1, "AD05", False, Common.keytypes.SIMPLE), - "AD06": Key.Key(1, "AD06", False, Common.keytypes.SIMPLE), - "AD07": Key.Key(1, "AD07", False, Common.keytypes.SIMPLE), - "AD08": Key.Key(1, "AD08", False, Common.keytypes.SIMPLE), - "AD09": Key.Key(1, "AD09", False, Common.keytypes.SIMPLE), - "AD10": Key.Key(1, "AD10", False, Common.keytypes.SIMPLE), - "AD11": Key.Key(1, "AD11", False, Common.keytypes.SIMPLE), - "AD12": Key.Key(1, "AD12", False, Common.keytypes.SIMPLE), - "BKSL": Key.Key(1, "BKSL", False, Common.keytypes.SIMPLE), + "CAPS": Key.Key(2, "CAPS", False, Common.keytypes.SPECIAL, 'Caps Lock'), + "AC01": Key.Key(1, "AC01", False, Common.keytypes.SIMPLE), + "AC02": Key.Key(1, "AC02", False, Common.keytypes.SIMPLE), + "AC03": Key.Key(1, "AC03", False, Common.keytypes.SIMPLE), + "AC04": Key.Key(1, "AC04", False, Common.keytypes.SIMPLE), + "AC05": Key.Key(1, "AC05", False, Common.keytypes.SIMPLE), + "AC06": Key.Key(1, "AC06", False, Common.keytypes.SIMPLE), + "AC07": Key.Key(1, "AC07", False, Common.keytypes.SIMPLE), + "AC08": Key.Key(1, "AC08", False, Common.keytypes.SIMPLE), + "AC09": Key.Key(1, "AC09", False, Common.keytypes.SIMPLE), + "AC10": Key.Key(1, "AC10", False, Common.keytypes.SIMPLE), + "AC11": Key.Key(1, "AC11", False, Common.keytypes.SIMPLE), + "RTRN": Key.Key(2, "RTRN", False, Common.keytypes.SPECIAL, 'Return'), - "CAPS": Key.Key(2, "CAPS", False, Common.keytypes.SPECIAL, 'Caps Lock'), - "AC01": Key.Key(1, "AC01", False, Common.keytypes.SIMPLE), - "AC02": Key.Key(1, "AC02", False, Common.keytypes.SIMPLE), - "AC03": Key.Key(1, "AC03", False, Common.keytypes.SIMPLE), - "AC04": Key.Key(1, "AC04", False, Common.keytypes.SIMPLE), - "AC05": Key.Key(1, "AC05", False, Common.keytypes.SIMPLE), - "AC06": Key.Key(1, "AC06", False, Common.keytypes.SIMPLE), - "AC07": Key.Key(1, "AC07", False, Common.keytypes.SIMPLE), - "AC08": Key.Key(1, "AC08", False, Common.keytypes.SIMPLE), - "AC09": Key.Key(1, "AC09", False, Common.keytypes.SIMPLE), - "AC10": Key.Key(1, "AC10", False, Common.keytypes.SIMPLE), - "AC11": Key.Key(1, "AC11", False,Common.keytypes.SIMPLE), - "RTRN": Key.Key(2, "RTRN", False, Common.keytypes.SPECIAL, 'Return'), + "LFSH": Key.Key(1, "LFSH", False, Common.keytypes.SPECIAL, 'Shift L', 'ISO Prev'), + "LSGT": Key.Key(1, "LSGT", False, Common.keytypes.SIMPLE), + "AB01": Key.Key(1, "AB01", False, Common.keytypes.SIMPLE), + "AB02": Key.Key(1, "AB02", False, Common.keytypes.SIMPLE), + "AB03": Key.Key(1, "AB03", False, Common.keytypes.SIMPLE), + "AB04": Key.Key(1, "AB04", False, Common.keytypes.SIMPLE), + "AB05": Key.Key(1, "AB05", False, Common.keytypes.SIMPLE), + "AB06": Key.Key(1, "AB06", False, Common.keytypes.SIMPLE), + "AB07": Key.Key(1, "AB07", False, Common.keytypes.SIMPLE), + "AB08": Key.Key(1, "AB08", False, Common.keytypes.SIMPLE), + "AB09": Key.Key(1, "AB09", False, Common.keytypes.SIMPLE), + "AB10": Key.Key(1, "AB10", False, Common.keytypes.SIMPLE), + "RTSH": Key.Key(2.5, "RTSH", False, Common.keytypes.SPECIAL, 'Shift R', 'ISO Next'), - "LFSH": Key.Key(1, "LFSH", False, Common.keytypes.SPECIAL,'Shift L', 'ISO Prev'), - "LSGT": Key.Key(1, "LSGT", False, Common.keytypes.SIMPLE), - "AB01": Key.Key(1, "AB01", False, Common.keytypes.SIMPLE), - "AB02": Key.Key(1, "AB02", False, Common.keytypes.SIMPLE), - "AB03": Key.Key(1, "AB03", False, Common.keytypes.SIMPLE), - "AB04": Key.Key(1, "AB04", False, Common.keytypes.SIMPLE), - "AB05": Key.Key(1, "AB05", False, Common.keytypes.SIMPLE), - "AB06": Key.Key(1, "AB06", False, Common.keytypes.SIMPLE), - "AB07": Key.Key(1, "AB07", False, Common.keytypes.SIMPLE), - "AB08": Key.Key(1, "AB08", False, Common.keytypes.SIMPLE), - "AB09": Key.Key(1, "AB09", False, Common.keytypes.SIMPLE), - "AB10": Key.Key(1, "AB10", False, Common.keytypes.SIMPLE), - "RTSH": Key.Key(2.5, "RTSH", False, Common.keytypes.SPECIAL, 'Shift R', 'ISO Next'), + "LCTL": Key.Key(1.8, "LCTL", False, Common.keytypes.SPECIAL, 'Control L'), + "LWIN": Key.Key(1.5, "LWIN", False, Common.keytypes.SPECIAL, 'Super L'), + "LALT": Key.Key(1.5, "LALT", False, Common.keytypes.SPECIAL, 'Alt L'), + "SPCE": Key.Key(9.0, "SPCE", False, Common.keytypes.SIMPLE, 'Spacebar'), + "RALT": Key.Key(1.3, "RALT", False, Common.keytypes.SPECIAL, 'AltGr'), + "RWIN": Key.Key(1.3, "RWIN", False, Common.keytypes.SPECIAL, 'Super R'), + "MENU": Key.Key(1.3, "MENU", False, Common.keytypes.SPECIAL, 'Compose'), + "RCTL": Key.Key(1.5, "RCTL", False, Common.keytypes.SPECIAL, 'Control R') + } - "LCTL": Key.Key(1.8, "LCTL", False, Common.keytypes.SPECIAL, 'Control L'), - "LWIN": Key.Key(1.5, "LWIN", False, Common.keytypes.SPECIAL, 'Super L'), - "LALT": Key.Key(1.5, "LALT", False, Common.keytypes.SPECIAL, 'Alt L'), - "SPCE": Key.Key(9.0, "SPCE", False, Common.keytypes.SIMPLE, 'Spacebar'), - "RALT": Key.Key(1.3, "RALT", False, Common.keytypes.SPECIAL, 'AltGr'), - "RWIN": Key.Key(1.3, "RWIN", False, Common.keytypes.SPECIAL, 'Super R'), - "MENU": Key.Key(1.3, "MENU", False, Common.keytypes.SPECIAL, 'Compose'), - "RCTL": Key.Key(1.5, "RCTL", False, Common.keytypes.SPECIAL, 'Control R') - } # The dict keeps the current variants that are selected. # For example, { "latin": {"basic": parsed1, "east": parsed2}, # "kpdl": {"one": parsed3, "two":parsed4} } activated_variants = {} - + # This dict keeps track of included files # For example, included_files["latin"] = { "file": "/tmp/latin", # "variants": variants_list, "xml": xml_layout } @@ -124,4 +126,4 @@ def set(self): if __name__ == "__main__": for k in KeyDict.Keys.keys(): - print k, KeyDict.Keys[k] + print(k, KeyDict.Keys[k]) diff --git a/KeyValue.py b/KeyValue.py index f73a905..f25916e 100644 --- a/KeyValue.py +++ b/KeyValue.py @@ -20,32 +20,33 @@ from KeysymsUniByValue import KeysymsUniByValue from KeysymsUni import KeysymsUni + class KeyValue: - def __init__(self, value = None, verbatim = False): + def __init__(self, value=None, verbatim=False): # Any of Common.keyvaluetype. self.__type__ = "" # String that goes to the XKB file self.__value__ = "" # String shown in the editor self.__presentation_value__ = "" - + if value != None: self.add(value, verbatim) - + def getType(self): return self.__type__ - + def getValue(self): return self.__value__ - + def getPValue(self): """ Accessor to retrieve the PresenationValue """ return self.__presentation_value__ - + def tostring(self): return "type: %(type)s, value: %(value)s, pvalue: %(pvalue)s" % \ - { "type": self.getType(), "value": self.getValue(), - "pvalue": self.getPValue() } + {"type": self.getType(), "value": self.getValue(), + "pvalue": self.getPValue()} def copy(self, existing): self.__type__ = existing.getType() @@ -53,9 +54,9 @@ def copy(self, existing): self.__presentation_value__ = existing.getPValue() def reset(self): - self.add('') - - def add(self, value, verbatim = False): + self.add(decode, '') + + def add(self, value, verbatim=False): if verbatim: if value != '': self.__type__ = Common.keyvaluetype.VERBATIM @@ -64,13 +65,13 @@ def add(self, value, verbatim = False): return try: intval = ord(value.decode('utf8')) - except TypeError, e: + except TypeError as e: intval = 0 if value == '': """ If value is empty, we put NoSymbol and inherit from above. """ self.__type__ = Common.keyvaluetype.NOSYMBOL self.__value__ = '' - self.__presentation_value__ = '' + self.__presentation_value__ = '' elif intval > 0: """ If value is a verbatim character, """ if KeysymsUniByValue.has_key(intval): @@ -85,7 +86,7 @@ def add(self, value, verbatim = False): """ if value is of the form Uxxxx, where xxxx a hex number, """ try: val = int(value[1:], 16) - except ValueError, e: + except ValueError as e: val = 0 if val > 0: self.__type__ = Common.keyvaluetype.CODEPOINT @@ -103,10 +104,10 @@ def add(self, value, verbatim = False): 0x1000 000. This should not have happened because we\ changed this in the code, all over the place.\ Sorry, I cannot continue. Error with %(e)s, value %(v)d" - % { "e": value, "v": val} ) + % {"e": value, "v": val}) self.__type__ = Common.keyvaluetype.CONSTANT self.__value__ = value.lower() - self.__presentation_value__ = unichr(val - 0x1000000) # TODO: 0x200E (special) + self.__presentation_value__ = unichr(val - 0x1000000) # TODO: 0x200E (special) elif value[:5] == "dead_": self.__type__ = Common.keyvaluetype.DEADKEY self.__value__ = value @@ -134,13 +135,13 @@ def add(self, value, verbatim = False): else: self.__presentation_value__ = value + if __name__ == "__main__": - print KeyValue("U0392").tostring() - print KeyValue("U4FE8").tostring() - print KeyValue("0x1000389").tostring() - print KeyValue("dead_acute").tostring() - print KeyValue("0x1000392").tostring() - print KeyValue("A").tostring() - print KeyValue("'").tostring() - print KeyValue("α").tostring() - \ No newline at end of file + print(KeyValue("U0392").tostring()) + print(KeyValue("U4FE8").tostring()) + print(KeyValue("0x1000389").tostring()) + print(KeyValue("dead_acute").tostring()) + print(KeyValue("0x1000392").tostring()) + print(KeyValue("A").tostring()) + print(KeyValue("'").tostring()) + print(KeyValue("α").tostring()) diff --git a/Keyboard.py b/Keyboard.py index f6f7ab9..c69a4dd 100644 --- a/Keyboard.py +++ b/Keyboard.py @@ -26,18 +26,20 @@ from ParseXML import ParseXML from KeyDict import KeyDict, included_files, activated_variants + class Keyboard(gtk.Frame): __gtype_name__ = 'Keyboard' - + SPACING = 6 def __init__(self, layout): gtk.Frame.__init__(self) + self.gl_layout = None self.connect("expose_event", self.expose) # This is a GenericLayout object, created in KeyboardLayoutEditor. self.xmllayout = layout - + self.layoutcode = '' self.layoutvariant = '' self.layoutcountry = '' @@ -48,38 +50,44 @@ def __init__(self, layout): # Fill in the KeyDict structure with xml branches for key in KeyDict.Keys.keys(): if self.xmllayout.exists_tokenkey(key): - print "Key", key, "already exists in xmllayout." - if KeyDict.Keys[key].xmlbranch == None: - print "Key", key, "was not set, setting now" + print("Key", key, "already exists in xmllayout.") + if KeyDict.Keys[key].xmlbranch is None: + print("Key", key, "was not set, setting now") elif KeyDict.Keys[key].xmlbranch != xmllayout.return_tokenkey(key): - print "Key", key, "already set to something..." + print("Key", key, "already set to something...") else: KeyDict.Keys[key].xmlbranch = xmllayout.create_tokenkey(key) - elif self.xmllayout.create_tokenkey(key) != None: + elif self.xmllayout.create_tokenkey(key) is not None: pass - #print "Added", key + # print "Added", key else: SystemError("Unable to add " + key) - - #print self.xmllayout.tostring() - + + # print self.xmllayout.tostring() + self.set_label("") self.set_shadow_type(gtk.SHADOW_NONE) - __row1 = ("ESC" , "FK01", "FK02", "FK03", "FK04", "FK05", "FK06", "FK07", "FK08", "FK09", "FK10", "FK11", "FK12") + __row1 = ("ESC", "FK01", "FK02", "FK03", "FK04", "FK05", "FK06", "FK07", "FK08", "FK09", "FK10", "FK11", "FK12") __row1_esc = ("ESC",) __row1_f14 = ("FK01", "FK02", "FK03", "FK04") __row1_f58 = ("FK05", "FK06", "FK07", "FK08") __row1_f92 = ("FK09", "FK10", "FK11", "FK12") - __row2 = ("TLDE", "AE01", "AE02", "AE03", "AE04", "AE05", "AE06", "AE07", "AE08", "AE09", "AE10", "AE11", "AE12", "BKSP") - __row3 = ("TAB" , "AD01", "AD02", "AD03", "AD04", "AD05", "AD06", "AD07", "AD08", "AD09", "AD10", "AD11", "AD12", "BKSL") - __row4 = ("CAPS", "AC01", "AC02", "AC03", "AC04", "AC05", "AC06", "AC07", "AC08", "AC09", "AC10", "AC11", "RTRN") - __row5 = ("LFSH", "LSGT", "AB01", "AB02", "AB03", "AB04", "AB05", "AB06", "AB07", "AB08", "AB09", "AB10", "RTSH") + __row2 = ( + "TLDE", "AE01", "AE02", "AE03", "AE04", "AE05", "AE06", "AE07", "AE08", "AE09", "AE10", "AE11", "AE12", + "BKSP") + __row3 = ( + "TAB", "AD01", "AD02", "AD03", "AD04", "AD05", "AD06", "AD07", "AD08", "AD09", "AD10", "AD11", "AD12", + "BKSL") + __row4 = ( + "CAPS", "AC01", "AC02", "AC03", "AC04", "AC05", "AC06", "AC07", "AC08", "AC09", "AC10", "AC11", "RTRN") + __row5 = ( + "LFSH", "LSGT", "AB01", "AB02", "AB03", "AB04", "AB05", "AB06", "AB07", "AB08", "AB09", "AB10", "RTSH") __row6 = ("LCTL", "LWIN", "LALT", "SPCE", "RALT", "RWIN", "MENU", "RCTL") - vbox = gtk.VBox(False, Keyboard.SPACING) - + vbox = gtk.VBox(False, Keyboard.SPACING) + hbox1 = gtk.HBox(False, Keyboard.SPACING) hbox2 = gtk.HBox(False, Keyboard.SPACING) hbox3 = gtk.HBox(False, Keyboard.SPACING) @@ -91,18 +99,18 @@ def __init__(self, layout): hboxtop_f14 = gtk.HBox(False, Keyboard.SPACING) hboxtop_f58 = gtk.HBox(False, Keyboard.SPACING) hboxtop_f92 = gtk.HBox(False, Keyboard.SPACING) - aligntop_esc = gtk.Alignment( 0, 0, .1, 1) + aligntop_esc = gtk.Alignment(0, 0, .1, 1) aligntop_f14 = gtk.Alignment(.1, 0, .5, 1) aligntop_f58 = gtk.Alignment(.8, 0, .5, 1) - aligntop_f92 = gtk.Alignment( 1, 0, .4, 1) + aligntop_f92 = gtk.Alignment(1, 0, .4, 1) aligntop_esc.add(hboxtop_esc) aligntop_f14.add(hboxtop_f14) aligntop_f58.add(hboxtop_f58) aligntop_f92.add(hboxtop_f92) - hbox1.pack_start(aligntop_esc, expand=True, fill=True) - hbox1.pack_start(aligntop_f14, expand=True, fill=True) - hbox1.pack_start(aligntop_f58, expand=True, fill=True) - hbox1.pack_start(aligntop_f92, expand=True, fill=True) + hbox1.pack_start(aligntop_esc, expand=True, fill=True) + hbox1.pack_start(aligntop_f14, expand=True, fill=True) + hbox1.pack_start(aligntop_f58, expand=True, fill=True) + hbox1.pack_start(aligntop_f92, expand=True, fill=True) vbox.pack_start(hbox1, expand=True, fill=True) vbox.pack_start(hbox2, expand=True, fill=True) @@ -121,20 +129,20 @@ def __init__(self, layout): hboxtop_f92.pack_start(KeyDict.Keys[item], expand=True, fill=True) for item in __row2: - hbox2.pack_start(KeyDict.Keys[item], expand=True, fill=True) + hbox2.pack_start(KeyDict.Keys[item], expand=True, fill=True) for item in __row3: - hbox3.pack_start(KeyDict.Keys[item], expand=True, fill=True) + hbox3.pack_start(KeyDict.Keys[item], expand=True, fill=True) for item in __row4: - hbox4.pack_start(KeyDict.Keys[item], expand=True, fill=True) + hbox4.pack_start(KeyDict.Keys[item], expand=True, fill=True) for item in __row5: - hbox5.pack_start(KeyDict.Keys[item], expand=True, fill=True) + hbox5.pack_start(KeyDict.Keys[item], expand=True, fill=True) for item in __row6: - hbox6.pack_start(KeyDict.Keys[item], expand=True, fill=True) - + hbox6.pack_start(KeyDict.Keys[item], expand=True, fill=True) + self.add(vbox) def draw(self, context): - pass + pass def expose(self, widget, event): self.context = widget.window.cairo_create() @@ -142,15 +150,15 @@ def expose(self, widget, event): # set a clip region for the expose event self.context.set_source_rgb(0.81, 0.84, 0.81) self.context.rectangle(event.area.x, event.area.y, - event.area.width, event.area.height) + event.area.width, event.area.height) self.context.fill_preserve() self.context.clip() self.draw(self.context) return False - + def receiveCallback(widget, context, x, y, selection, targetType, time): - print "Keyboard: Received a callback for", selection, "at", x, y, "at", time + print("Keyboard: Received a callback for", selection, "at", x, y, "at", time) def redraw(self): for keycode in KeyDict.Keys.keys(): @@ -160,18 +168,17 @@ def redraw(self): def save(self, layout_file): try: fout = open(layout_file, "w") - except IOError, e: + except IOError as e: return False self.gl_layout = GenericLayout.GenericLayout() - newxml = self.gl_layout.create_layout(self.layoutcode, - self.layoutvariant, + newxml = self.gl_layout.create_layout(self.layoutcode, + self.layoutvariant, self.layoutcountry, - self.layoutname, + self.layoutname, KeyDict.Keys) fout.write(Common.layout_preamble) ParseXML(newxml, fout) fout.close() - - return True + return True diff --git a/KeyboardLayoutEditor b/KeyboardLayoutEditor index c82a974..15bdae0 100755 --- a/KeyboardLayoutEditor +++ b/KeyboardLayoutEditor @@ -27,34 +27,36 @@ try: import sys import copy import string - import gtk + import pygtk import gobject import pango -except ImportError, e: - raise SystemExit("Import error, Keyboard Layout Editor: " + str(e)) +except (ImportError, e): + raise SystemExit(f"Import error, Keyboard Layout Editor: {str(e)}") if gtk.pygtk_version < (2, 12): - print "PyGtk 2.12 or later required for this application" - print "You have pyGTK", gtk.pygtk_version + print("PyGtk 2.12 or later required for this application") + print("You have pyGTK", gtk.pygtk_version) raise SystemExit try: import cairo -except ImportError, e: +except (ImportError, e) as exc: raise SystemExit("The Python bindings for Cairo are required \ - for this application: " + str(e)) + for this application: " + str(e)) from exc + try: from lxml import etree -except ImportError, e: - raise SystemExit("The Python bindings for libxml2 were not found: " + str(e)) +except (ImportError, e) as err: + raise SystemExit(f"The Python bindings for libxml2 were not found: {str(e)}") from err + try: import antlr3 -except ImportError, err: - print 'Import error:', err - print 'This script requires to have the python antl3 package installed.' - print 'Please see the README file for further instructions.\nExiting...' +except(ImportError, err): + print('Import error:', err) + print('This script requires to have the python antl3 package installed.') + print('Please see the README file for further instructions.\nExiting...') sys.exit(-10) try: @@ -68,9 +70,8 @@ try: from KeyDict import KeyDict, included_files, activated_variants from ParseXML import ExtractVariantsKeycodes from DeadKeysDict import DeadKeys -except ImportError, e: - raise SystemExit("Import error, Keyboard Layout Editor: " + str(e)) - +except (ImportError, e): + raise SystemExit(f"Import error, Keyboard Layout Editor: {str(e)}") class Controller_KeyboardLayoutEditor: """ The keyboard layout editor controller """ @@ -804,11 +805,11 @@ Please do not put punctuation marks." if activated_variants.has_key(selected_layout): del activated_variants[selected_layout] - print "clicked_removeentry_callback:", included_files + print("clicked_removeentry_callback:", included_files) del included_files[selected_layout] del self.include_layout_selected["model"][self.include_layout_selected["paths"][0]] - self.mykeyboard.redraw() - Common.addtostatusbar('Removed layout ' + selected_layout) + self.myke('Import error:', erryboard.redraw()) + Common.addtostatusbar(f'Removed layout {selected_layout}') button.set_sensitive(False) def col1_toggled_callback( self, cell, path, model ): @@ -966,9 +967,7 @@ Please do not put punctuation marks." def keypress_filter_callback(self, event, data = None): if event.type == gtk.gdk.KEY_PRESS: - #print event.keyval, event.string - pass - gtk.main_do_event(event) + gtk.main_do_event(event) if __name__ == "__main__": myeditor = Controller_KeyboardLayoutEditor() diff --git a/KeycodesReader.py b/KeycodesReader.py index 6a72d0e..dc9198d 100644 --- a/KeycodesReader.py +++ b/KeycodesReader.py @@ -30,12 +30,12 @@ # Helper function to iterate through all children of a given type def getChildrenListByType(tree, type_value): - list = [] + a_list = [] for i in range(tree.getChildCount()): child = tree.getChild(i) if child.getType() == type_value: - list.append(child) - return list + a_list.append(child) + return a_list def parseFile(fileandvariant = "/usr/share/X11/xkb/keycodes/xfree86|xfree86", *morefilesandvariants): @@ -46,9 +46,9 @@ def parseFile(fileandvariant = "/usr/share/X11/xkb/keycodes/xfree86|xfree86", *m try: file = open(filename, 'r') except OSError: - print "Could not open file ", filename, " Aborting..." + print("Could not open file ", filename, " Aborting...") sys.exit(-1) - file.close + file.close() char_stream = antlr3.ANTLRFileStream(filename) lexer = KeycodesLexer(char_stream) @@ -69,10 +69,10 @@ def parseFile(fileandvariant = "/usr/share/X11/xkb/keycodes/xfree86|xfree86", *m listType = getChildrenListByType(itemKeycodeDoc, KEYCODELISTTYPE) material = getChildrenListByType(itemKeycodeDoc, KEYCODEMATERIAL) if len(listType) != 1: - print "Requires single node for KEYCODELISTTYPE. Found", len(listType) + print("Requires single node for KEYCODELISTTYPE. Found", len(listType)) sys.exit(-1) if len(material) != 1: - print "Requires single node for KEYCODEMATERIAL. Found", len(material) + print("Requires single node for KEYCODEMATERIAL. Found", len(material)) sys.exit(-1) for listNameGroup in getChildrenListByType(listType[0], KEYCODELISTNAME): diff --git a/ParseXKB.py b/ParseXKB.py index d27b063..05c4033 100644 --- a/ParseXKB.py +++ b/ParseXKB.py @@ -26,8 +26,8 @@ from XKBGrammarLexer import XKBGrammarLexer from XKBGrammarParser import XKBGrammarParser from XKBGrammarWalker import XKBGrammarWalker, LAYOUT, SYMBOLS, MAPMATERIAL, MAPTYPE, MAPOPTIONS, MAPOPTS, MAPNAME, TOKEN_INCLUDE, TOKEN_NAME, TOKEN_KEY_TYPE, TOKEN_KEY, TOKEN_TYPE, TOKEN_MODIFIER_MAP, TOKEN_VIRTUAL_MODIFIERS, KEYCODE, KEYCODEX, ELEM_KEYSYMS, ELEM_KEYSYMGROUP, ELEM_VIRTUALMODS, OVERLAY, VALUE, STATE, NAME, DQSTRING, OVERRIDE -except ImportError, e: - raise SystemExit("A generated source file by ANTLR was not found.\nSee the README on how to generate.\nImport error: " + str(e)) +except ImportError as e: + raise SystemExit("A generated source file by ANTLR was not found.\nSee the README on how to generate.\nImport error: " + str(e)) import KeycodesReader import KeysymsUni @@ -36,288 +36,289 @@ from ParseXML import ExtractVariantsKeycodes class ParseXKB: - def __init__(self): - KeycodesReader.initialise() - - # Sorts a dictionary by value, produces a sorted list of values. - def sortDict(self, adict, cmp_function = None): - keys = adict.keys() - keys.sort(cmp_function) - return map(adict.get, keys) - - # Helper function to iterate through all children of a given type - def getChildrenByType(self, tree, type_value): - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - yield child - - # Helper function to iterate through all children of a given type - def getChildrenByTypes(self, tree, type_value1, type_value2): - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value1 or child.getType() == type_value2: - yield child - - # Helper function to iterate through all children of a given type - def getChildrenListByType(self, tree, type_value): - list = [] - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - list.append(child) - return list - - # Helper function to iterate through all children of a given type - def getChildrenListByTypes(self, tree, type_value1, type_value2): - list = [] - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value1 or child.getType() == type_value2: - list.append(child) - return list - - def hasChildByType(self, tree, type_value): - has = False - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - has = True - break - return has - - 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 - - - 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 } + def __init__(self): + KeycodesReader.initialise() + + # Sorts a dictionary by value, produces a sorted list of values. + def sortDict(self, adict, cmp_function = None): + keys = adict.keys() + keys.sort(cmp_function) + return map(adict.get, keys) + + # Helper function to iterate through all children of a given type + def getChildrenByType(self, tree, type_value): + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + yield child + + # Helper function to iterate through all children of a given type + def getChildrenByTypes(self, tree, type_value1, type_value2): + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value1 or child.getType() == type_value2: + yield child + + # Helper function to iterate through all children of a given type + def getChildrenListByType(self, tree, type_value): + list = [] + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + list.append(child) + return list + + # Helper function to iterate through all children of a given type + def getChildrenListByTypes(self, tree, type_value1, type_value2): + list = [] + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value1 or child.getType() == type_value2: + list.append(child) + return list + + def hasChildByType(self, tree, type_value): + has = False + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + has = True + break + return has + + def parse(self, xkbfilename): + global eKeySymGroup + 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 + + + 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 } @@ -338,181 +339,181 @@ def parse_layout(self, xkbfilename, variant = None): # 1. Collect include statements # 2. Parse include files # - def parse_layout_controller(self, store_keydict, xkbfilename, variantname = None): - self.parse_layout_recursive(store_keydict, xkbfilename, variantname, start = True) - return store_keydict - - def parse_layout_recursive(self, store_keydict, xkbfilename, variantname = None, start = True): - #print "Processing", os.path.basename(xkbfilename), "..." - parsed_layout = self.parse_layout_slave(xkbfilename, variantname) - - #print "############# ", xkbfilename, variantname, "Looping for", parsed_layout['variants'] - for includefile in parsed_layout['variants']: - #print " Doing includefile:", includefile - include_components = Common.parseIncludeString(includefile) - if include_components['variant'] == '': - #print " variant was empty", - include_parse_result = self.parse_layout(xkbfilename) - include_components['variant'] = include_parse_result["variants"][0] - #print " we fix to", include_components - - #print " Calling ourselves", Common.symbolsdir + include_components['filename'], include_components['variant'] - new_parsed_layout = self.parse_layout_recursive(store_keydict, - Common.symbolsdir + include_components['filename'], - include_components['variant'], - True) - #print " new_parsed_result for variantname", include_components['variant'], " is ", new_parsed_layout - if new_parsed_layout.has_key('keydict'): - #print " LINES:", len(new_parsed_layout['keydict'].keys()) - for k in new_parsed_layout['keydict'].keys(): - for i in parsed_layout['keydict'][k].keys(): - #print parsed_layout['keydict'][k][i].getPValue(), - if store_keydict.has_key(k) == False: - store_keydict[k] = {} - store_keydict[k][i] = copy.copy(new_parsed_layout['keydict'][k][i]) - #print - - #extraction_result = ExtractVariantsKeycodes(parsed_layout['layout'], variantname) - if start == True: - #print "parsed_result for variantname", variantname, " is ", parsed_layout - if parsed_layout.has_key('keydict'): - #print " LINES:", len(parsed_layout['keydict'].keys()) - for k in parsed_layout['keydict'].keys(): - #print k, - for i in parsed_layout['keydict'][k].keys(): - #print parsed_layout['keydict'][k][i].getPValue(), - if store_keydict.has_key(k) == False: - store_keydict[k] = {} - store_keydict[k][i] = copy.copy(parsed_layout['keydict'][k][i]) - #print - - return { 'success': True, 'layout': parsed_layout['layout'], 'variants': parsed_layout['variants'] } - - 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_controller(self, store_keydict, xkbfilename, variantname = None): + self.parse_layout_recursive(store_keydict, xkbfilename, variantname, start = True) + return store_keydict + + def parse_layout_recursive(self, store_keydict, xkbfilename, variantname = None, start = True): + #print "Processing", os.path.basename(xkbfilename), "..." + parsed_layout = self.parse_layout_slave(xkbfilename, variantname) + + #print "############# ", xkbfilename, variantname, "Looping for", parsed_layout['variants'] + for includefile in parsed_layout['variants']: + #print " Doing includefile:", includefile + include_components = Common.parseIncludeString(includefile) + if include_components['variant'] == '': + #print " variant was empty", + include_parse_result = self.parse_layout(xkbfilename) + include_components['variant'] = include_parse_result["variants"][0] + #print " we fix to", include_components + + #print " Calling ourselves", Common.symbolsdir + include_components['filename'], include_components['variant'] + new_parsed_layout = self.parse_layout_recursive(store_keydict, + Common.symbolsdir + include_components['filename'], + include_components['variant'], + True) + #print " new_parsed_result for variantname", include_components['variant'], " is ", new_parsed_layout + if new_parsed_layout.has_key('keydict'): + #print " LINES:", len(new_parsed_layout['keydict'].keys()) + for k in new_parsed_layout['keydict'].keys(): + for i in parsed_layout['keydict'][k].keys(): + #print parsed_layout['keydict'][k][i].getPValue(), + if store_keydict.has_key(k) == False: + store_keydict[k] = {} + store_keydict[k][i] = copy.copy(new_parsed_layout['keydict'][k][i]) + #print + + #extraction_result = ExtractVariantsKeycodes(parsed_layout['layout'], variantname) + if start == True: + #print "parsed_result for variantname", variantname, " is ", parsed_layout + if parsed_layout.has_key('keydict'): + #print " LINES:", len(parsed_layout['keydict'].keys()) + for k in parsed_layout['keydict'].keys(): + #print k, + for i in parsed_layout['keydict'][k].keys(): + #print parsed_layout['keydict'][k][i].getPValue(), + if store_keydict.has_key(k) == False: + store_keydict[k] = {} + store_keydict[k][i] = copy.copy(parsed_layout['keydict'][k][i]) + #print + + return { 'success': True, 'layout': parsed_layout['layout'], 'variants': parsed_layout['variants'] } + + 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'] + } if __name__ == '__main__': - px = ParseXKB() - - store_keydict = {} - px.parse_layout_controller(store_keydict, '/usr/share/X11/xkb/symbols/gr', 'polytonic') - print "About to print" - for k in store_keydict.keys(): - print k, - for i in store_keydict[k].keys(): - print store_keydict[k][i].getValue(), - print + px = ParseXKB() + + store_keydict = {} + px.parse_layout_controller(store_keydict, '/usr/share/X11/xkb/symbols/gr', 'polytonic') + print("About to print") + for k in store_keydict.keys(): + print(k,) + for i in store_keydict[k].keys(): + print(store_keydict[k][i].getValue(),) + print() diff --git a/ParseXML.py b/ParseXML.py index c5235a8..65e805b 100644 --- a/ParseXML.py +++ b/ParseXML.py @@ -21,9 +21,11 @@ import Common import KeyValue + def __recurse_tree__(node, fout): + global keycodelinekeycode if node.tag == "layout": - #print "Parsing", node.attrib["layoutname"] + # print "Parsing", node.attrib["layoutname"] for n in node: __recurse_tree__(n, fout) elif node.tag == "symbols": @@ -32,31 +34,31 @@ def __recurse_tree__(node, fout): fout.write(k.text) fout.write(" ") elif k.tag == "mapname": - fout.write("\"%(s)s\"\n{\n" % { "s": k.text }) + fout.write("\"%(s)s\"\n{\n" % {"s": k.text}) elif k.tag == "mapmaterial": keycodedict_lines = {} for t in k: if t.tag == "tokenname": - fout.write("\tname[Group1] = \"%(s)s\";\n" % { "s": t.attrib["name"] }) + fout.write("\tname[Group1] = \"%(s)s\";\n" % {"s": t.attrib["name"]}) elif t.tag == "tokeninclude": - fout.write("\tinclude \"%(s)s\"\n" % { "s": t.text }) + fout.write("\tinclude \"%(s)s\"\n" % {"s": t.text}) elif t.tag == "tokentype": - fout.write("\tkey.type = \"%(s)s\";\n" % { "s": t.text }) + fout.write("\tkey.type = \"%(s)s\";\n" % {"s": t.text}) elif t.tag == "tokenmodifiermap": - fout.write("\tmodifier_map %(s)s { " % { "s": t.attrib['state'] }) + fout.write("\tmodifier_map %(s)s { " % {"s": t.attrib['state']}) count_mm = len(t) for mm in t: if mm.tag == "keycodex": - fout.write("<%(s)s>" % { "s": mm.attrib["value"] }) + fout.write("<%(s)s>" % {"s": mm.attrib["value"]}) elif mm.tag == "keycode": - fout.write("%(s)s" % { "s": mm.attrib["value"] }) + fout.write("%(s)s" % {"s": mm.attrib["value"]}) if count_mm > 1: fout.write(", ") count_mm -= 1 fout.write(' };\n') elif t.tag == "tokenkey": # We attempt to sort the keycode lines by keycode value. - keycodelinelist = [] + keycodelinelist = [] keycodelinecomment = [] keycodelinelist.append("\t") keycodelinecomment.append(" // ") @@ -64,7 +66,7 @@ def __recurse_tree__(node, fout): keycodelinelist.append("override ") for tk in t: if tk.tag == "keycodename": - keycodelinelist.append("key <%(s)s> { " % { "s": tk.text }) + keycodelinelist.append("key <%(s)s> { " % {"s": tk.text}) keycodelinekeycode = tk.text elif tk.tag == "keysymgroup": gotitem = False @@ -72,12 +74,12 @@ def __recurse_tree__(node, fout): if ks.tag == "typegroup": if gotitem: keycodelinelist.append(", ") - keycodelinelist.append("type = \"%(s)s\" " % { "s": ks.attrib["value"] }) + keycodelinelist.append("type = \"%(s)s\" " % {"s": ks.attrib["value"]}) gotitem = True elif ks.tag == "tokenvirtualmodifiers": if gotitem: keycodelinelist.append(", ") - keycodelinelist.append("virtualMods = %(s)s " % { "s": ks.attrib["value"] }) + keycodelinelist.append("virtualMods = %(s)s " % {"s": ks.attrib["value"]}) elif ks.tag == "symbolsgroup": if gotitem: keycodelinelist.append(', ') @@ -87,40 +89,42 @@ def __recurse_tree__(node, fout): for sg in ks: if sg.tag == 'symbol': if count_sg > 1: - keycodelinelist.append("%(s)14s, " % { "s": sg.text }) + keycodelinelist.append("%(s)14s, " % {"s": sg.text}) else: - keycodelinelist.append("%(s)14s " % { "s": sg.text }) + keycodelinelist.append("%(s)14s " % {"s": sg.text}) count_sg -= 1 kval = KeyValue.KeyValue(sg.text) keycodelinecomment.append(kval.getPValue()) keycodelinecomment.append(' ') else: - print 'ERROR' + print('ERROR') sys.exit(-1) for spaces_count in range(Common.LEVELMAX - len(ks)): - keycodelinelist.append('%(s)15s ' % { 's': ' ' }) + keycodelinelist.append('%(s)15s ' % {'s': ' '}) keycodelinelist.append(']') keycodelinelist.append(' };') keycodelinecomment.append('\n') keycodedict_lines[keycodelinekeycode] = "".join(keycodelinelist) \ - + "".join(keycodelinecomment) + + "".join(keycodelinecomment) keycodeslist = keycodedict_lines.keys() keycodeslist.sort() for kc in keycodeslist: fout.write(keycodedict_lines[kc]) fout.write("};\n\n") + def __extract_keycodes__(node, variants, keydict, variant): + global keycodename we_are_shooting = False variant_verbose_name = '' if node.tag == "layout": - #print "Parsing", node.attrib["layoutname"] + # print "Parsing", node.attrib["layoutname"] for n in node: result = __extract_keycodes__(n, variants, keydict, variant) if result != None: if result['done'] == True: return result - + if node.tag == "symbols": for k in node: if k.tag == "mapoption": @@ -141,8 +145,8 @@ def __extract_keycodes__(node, variants, keydict, variant): # t.text pass elif t.tag == "tokenmodifiermap": - pass - elif t.tag == "tokenkey": + pass + elif t.tag == "tokenkey": if t.attrib["override"] == "True": pass for tk in t: @@ -167,21 +171,24 @@ def __extract_keycodes__(node, variants, keydict, variant): key_index += 1 keydict[keycodename] = keyvalues if we_are_shooting: - return { 'done' : True, 'variants': variants, 'keydict': keydict, 'variant_name': variant_verbose_name } + return {'done': True, 'variants': variants, 'keydict': keydict, 'variant_name': variant_verbose_name} + def ParseXML(xmllayoutroot, fout): return __recurse_tree__(xmllayoutroot, fout) + def ExtractVariantsKeycodes(xmllayoutroot, variant): VariantsNew = [] KeyDictNew = {} return __extract_keycodes__(xmllayoutroot, VariantsNew, KeyDictNew, variant) - + + if __name__ == "__main__": sourcefile = "/home/user/WORK/KEYBOARDLAYOUTEDITOR/keyboardlayouteditor/XKBGrammar/demo.xml" sourcefile = "/home/user/WORK/KEYBOARDLAYOUTEDITOR/keyboardlayouteditor/XKBGrammar/us.xml" doc = etree.parse(sourcefile) - #print doc - #print etree.tounicode(doc, pretty_print=True) - #ParseXML(doc.getroot(), sys.stdout) - print ExtractVariantsKeycodes(doc.getroot(), "euro") \ No newline at end of file + # print doc + # print etree.tounicode(doc, pretty_print=True) + # ParseXML(doc.getroot(), sys.stdout) + print(ExtractVariantsKeycodes(doc.getroot(), "euro")) diff --git a/parse_xkb_to_xml.py b/parse_xkb_to_xml.py index d37a932..2c773e6 100644 --- a/parse_xkb_to_xml.py +++ b/parse_xkb_to_xml.py @@ -6,14 +6,16 @@ import sys import os.path import pdb -import urllib # for urlretrieve +import urllib # for urlretrieve import string import antlr3 import re from lxml import etree -from XKBGrammarLexer import XKBGrammarLexer +from XKBGrammarLexer import XKBGrammarLexer from XKBGrammarParser import XKBGrammarParser -from XKBGrammarWalker import XKBGrammarWalker, LAYOUT, SYMBOLS, MAPMATERIAL, MAPTYPE, MAPOPTIONS, MAPOPTS, MAPNAME, TOKEN_INCLUDE, TOKEN_NAME, TOKEN_KEY_TYPE, TOKEN_KEY, TOKEN_TYPE, TOKEN_MODIFIER_MAP, TOKEN_VIRTUAL_MODIFIERS, KEYCODE, KEYCODEX, ELEM_KEYSYMS, ELEM_KEYSYMGROUP, ELEM_VIRTUALMODS, OVERLAY, VALUE, STATE, NAME, DQSTRING, OVERRIDE +from XKBGrammarWalker import XKBGrammarWalker, LAYOUT, SYMBOLS, MAPMATERIAL, MAPTYPE, MAPOPTIONS, MAPOPTS, MAPNAME, \ + TOKEN_INCLUDE, TOKEN_NAME, TOKEN_KEY_TYPE, TOKEN_KEY, TOKEN_TYPE, TOKEN_MODIFIER_MAP, TOKEN_VIRTUAL_MODIFIERS, \ + KEYCODE, KEYCODEX, ELEM_KEYSYMS, ELEM_KEYSYMGROUP, ELEM_VIRTUALMODS, OVERLAY, VALUE, STATE, NAME, DQSTRING, OVERRIDE import KeycodesReader URL_KEYSYMSTXT = "http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt" @@ -21,125 +23,137 @@ keysymdb = {} opt_verbose = True + # Sorts a dictionary by value, produces a sorted list of values. -def sortDict(adict, cmp_function = None): +def sortDict(adict, cmp_function=None): keys = adict.keys() keys.sort(cmp_function) return map(adict.get, keys) + # Helper function to iterate through all children of a given type def getChildrenByType(tree, type_value): - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - yield child + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + yield child + # Helper function to iterate through all children of a given type def getChildrenByTypes(tree, type_value1, type_value2): - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value1 or child.getType() == type_value2: - yield child + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value1 or child.getType() == type_value2: + yield child + # Helper function to iterate through all children of a given type def getChildrenListByType(tree, type_value): - list = [] - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - list.append(child) - return list + list = [] + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + list.append(child) + return list + # Helper function to iterate through all children of a given type def getChildrenListByTypes(tree, type_value1, type_value2): - list = [] - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value1 or child.getType() == type_value2: - list.append(child) - return list + list = [] + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value1 or child.getType() == type_value2: + list.append(child) + return list + def hasChildByType(tree, type_value): - has = False - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - has = True - break - return has + has = False + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + has = True + break + return has + def download_file(url): - """ Downloads a file provided a URL. Returns the filename. """ - """ Borks on failure """ - localfilename = url.split('/')[-1] - if not os.path.isfile(localfilename) or os.path.getsize(localfilename) <= 0: - print "Downloading ", url, "..." - try: - urllib.urlretrieve(url, localfilename, download_hook) - except IOError, (errno, strerror): - print "I/O errorxx(%s): %s" % (errno, strerror) - sys.exit(-1) - except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - print " done." - else: - if opt_verbose: - print "Using cached file for ", url + """ Downloads a file provided a URL. Returns the filename. """ + """ Borks on failure """ + localfilename = url.split('/')[-1] + if not os.path.isfile(localfilename) or os.path.getsize(localfilename) <= 0: + print("Downloading ", url, "...") + try: + urllib.urlretrieve(url, localfilename, download_hook) + except IOError as (errno, strerror): + print("I/O errorxx(%s): %s" % (errno, strerror)) + sys.exit(-1) + except: + print("Unexpected error: ", sys.exc_info()[0]) + sys.exit(-1) + print(" done.") + + elif optVerbose: + print("Using cached file for ", url) return localfilename + def download_hook(blocks_transferred, block_size, file_size): - """ A download hook to provide some feedback when downloading """ - if blocks_transferred == 0: - if file_size > 0: - if opt_verbose: - print "Downloading", file_size, "bytes: ", - else: - if opt_verbose: - print "Downloading: ", - sys.stdout.write('#') - sys.stdout.flush() + """ A download hook to provide some feedback when downloading """ + if blocks_transferred == 0: + if file_size <= 0: + if opt_verbose: + print("Downloading: ") + else: + if not opt_verbose: + return + print("Downloading", file_size, "bytes: ") + sys.stdout.write('#') + sys.stdout.flush() def process_keysymstxt(): - """ Grabs and opens the keysyms.txt file that Markus Kuhn maintains """ - """ This file keeps a record between keysyms <-> unicode chars """ - filename_keysymstxt = download_file(URL_KEYSYMSTXT) - try: - keysymstxt = open(filename_keysymstxt, 'r') - except IOError, (errno, strerror): - print "I/O errorxx(%s): %s" % (errno, strerror) - sys.exit(-1) - except: - print "Unexpected error: ", sys.exc_info()[0] - sys.exit(-1) - - """ Parse the keysyms.txt file and place content in keysymdb """ - linenum_keysymstxt = 0 - keysymdb = {} - for line in keysymstxt.readlines(): - linenum_keysymstxt += 1 - line = line.strip() - if line == "" or re.match('^#', line): - continue - components = re.split('\s+', line) - if len(components) < 5: - print "Invalid line %(linenum)d in %(filename)s: %(line)s'"\ - % {'linenum': linenum_keysymstxt, 'filename': filename_keysymstxt, 'line': line} - print "Was expecting 5 items in the line" - sys.exit(-1) - if components[1][0] == 'U' and re.match('[0-9a-fA-F]+$', components[1][1:]): - unival = string.atoi(components[1][1:], 16) - if unival == 0: - continue - keysymdb[components[4]] = unival - keysymstxt.close() - - """ Patch up the keysymdb with some of our own stuff """ - - """ This is preferential treatment for Greek """ - """ => we get more savings if used for Greek """ - # keysymdb['dead_tilde'] = 0x342 + """ Grabs and opens the keysyms.txt file that Markus Kuhn maintains """ + global unival + """ This file keeps a record between keysyms <-> unicode chars """ + filename_keysymstxt = download_file(URL_KEYSYMSTXT) + try: + keysymstxt = open(filename_keysymstxt, 'r') + except IOError as (errno, strerror): + print("I/O errorxx(%s): %s" % (errno, strerror)) + sys.exit(-1) + except: + print("Unexpected error: ", sys.exc_info()[0]) + sys.exit(-1) + + """ Parse the keysyms.txt file and place content in keysymdb """ + linenum_keysymstxt = 0 + keysymdb = {} + for line in keysymstxt.readlines(): + linenum_keysymstxt += 1 + line = line.strip() + if line == "" or re.match('^#', line): + continue + components = re.split('\s+', line) + if len(components) < 5: + print("Invalid line %(linenum)d in %(filename)s: %(line)s'" + % {'linenum': linenum_keysymstxt, 'filename': filename_keysymstxt, 'line': line}) + print("Was expecting 5 items in the line") + sys.exit(-1) + if components[1][0] == 'U' and re.match('[0-9a-fA-F]+$', components[1][1:]): + unival = string.atoi(components[1][1:], 16) + if unival == 0: + continue + keysymdb[components[4]] = unival + keysymstxt.close() + + """ Patch up the keysymdb with some of our own stuff """ + + """ This is preferential treatment for Greek """ + """ => we get more savings if used for Greek """ + + +# keysymdb['dead_tilde'] = 0x342 process_keysymstxt() @@ -151,13 +165,13 @@ def process_keysymstxt(): # print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", sys.argv[1] -try: - xkbfile = open(xkbfilename, 'r') +try: + xkbfile = open(xkbfilename, 'r') except OSError: - print "Could not open file ", xkbfilename, ". Aborting..." - sys.exit(-1) + print("Could not open file ", xkbfilename, ". Aborting...") + sys.exit(-1) -xkbfile.close +xkbfile.close() char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding='utf-8') lexer = XKBGrammarLexer(char_stream) @@ -179,98 +193,98 @@ def process_keysymstxt(): layout.attrib['layoutname'] = os.path.basename(xkbfilename) -#print "Processing", 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 getChildrenByType(mapobject, TOKEN_NAME): - nameText = name.getChild(0).getText()[1:-1] - eTokenName = etree.SubElement(eMapMaterial, 'tokenname', name=nameText ) - for include in getChildrenByType(mapobject, TOKEN_INCLUDE): - eInclude = etree.SubElement(eMapMaterial, 'tokeninclude') - eInclude.text = include.getChild(0).getText()[1:-1] - for keytype in getChildrenByType(mapobject, TOKEN_KEY_TYPE): - keytypeText = keytype.getChild(0).getText() - eKeyType = etree.SubElement(eMapMaterial, 'tokentype') - eKeyType.text = keytypeText[1:-1] - for modmap in getChildrenByType(mapobject, TOKEN_MODIFIER_MAP): - eModMap = etree.SubElement(eMapMaterial, 'tokenmodifiermap', state=modmap.getChild(0).getText()) - for modstate in 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 getChildrenByType(mapobject, TOKEN_KEY): - allkeysymgroups[keyset.getChild(0).getChild(0).getText()] = keyset - sortedkeysymgroups = sortDict(allkeysymgroups, KeycodesReader.compare_keycode) - for keyset in sortedkeysymgroups: - elem_keysymgroup = getChildrenByType(keyset, ELEM_KEYSYMGROUP) - elem_virtualmods = getChildrenByType(keyset, ELEM_VIRTUALMODS) - elem_overlay = getChildrenByType(keyset, OVERLAY) - override = getChildrenListByType(keyset, OVERRIDE) - eTokenKey = etree.SubElement(eMapMaterial, 'tokenkey') - eKeyCodeName = etree.SubElement(eTokenKey, 'keycodename') - keycodex = 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(getChildrenListByType(keyset, ELEM_KEYSYMGROUP)): - elem_keysyms = getChildrenListByType(keyset, ELEM_KEYSYMS) - eKeySymGroup = etree.SubElement(eTokenKey, 'keysymgroup') - keysymgroup_counter = len(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(getChildrenListByType(keyset, ELEM_VIRTUALMODS)): - for vmods in elem_virtualmods: - etree.SubElement(eKeySymGroup, 'tokenvirtualmodifiers', value=vmods.getChild(0).getText()) - if len(getChildrenListByType(keyset, OVERLAY)): - for elem in elem_overlay: - for elem2 in getChildrenByType(elem, KEYCODEX): - pass - else: - print "\tInternal error at map level,", mapobject.getText() - # sys.exit(-2) + 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 getChildrenByType(mapobject, TOKEN_NAME): + nameText = name.getChild(0).getText()[1:-1] + eTokenName = etree.SubElement(eMapMaterial, 'tokenname', name=nameText) + for include in getChildrenByType(mapobject, TOKEN_INCLUDE): + eInclude = etree.SubElement(eMapMaterial, 'tokeninclude') + eInclude.text = include.getChild(0).getText()[1:-1] + for keytype in getChildrenByType(mapobject, TOKEN_KEY_TYPE): + keytypeText = keytype.getChild(0).getText() + eKeyType = etree.SubElement(eMapMaterial, 'tokentype') + eKeyType.text = keytypeText[1:-1] + for modmap in getChildrenByType(mapobject, TOKEN_MODIFIER_MAP): + eModMap = etree.SubElement(eMapMaterial, 'tokenmodifiermap', state=modmap.getChild(0).getText()) + for modstate in 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 getChildrenByType(mapobject, TOKEN_KEY): + allkeysymgroups[keyset.getChild(0).getChild(0).getText()] = keyset + sortedkeysymgroups = sortDict(allkeysymgroups, KeycodesReader.compare_keycode) + for keyset in sortedkeysymgroups: + elem_keysymgroup = getChildrenByType(keyset, ELEM_KEYSYMGROUP) + elem_virtualmods = getChildrenByType(keyset, ELEM_VIRTUALMODS) + elem_overlay = getChildrenByType(keyset, OVERLAY) + override = getChildrenListByType(keyset, OVERRIDE) + eTokenKey = etree.SubElement(eMapMaterial, 'tokenkey') + eKeyCodeName = etree.SubElement(eTokenKey, 'keycodename') + keycodex = getChildrenListByType(keyset, KEYCODEX) + if len(keycodex) != 1: + print("Could not retrieve keycode name") + exit(-1) + else: + eKeyCodeName.text = keycodex[0].getChild(0).getText() + if len(override) == 1: + eTokenKey.attrib['override'] = "True" + else: + eTokenKey.attrib['override'] = "False" + if len(getChildrenListByType(keyset, ELEM_KEYSYMGROUP)): + elem_keysyms = getChildrenListByType(keyset, ELEM_KEYSYMS) + eKeySymGroup = etree.SubElement(eTokenKey, 'keysymgroup') + keysymgroup_counter = len(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(getChildrenListByType(keyset, ELEM_VIRTUALMODS)): + for vmods in elem_virtualmods: + etree.SubElement(eKeySymGroup, 'tokenvirtualmodifiers', value=vmods.getChild(0).getText()) + if len(getChildrenListByType(keyset, OVERLAY)): + for elem in elem_overlay: + for elem2 in getChildrenByType(elem, KEYCODEX): + pass + else: + print("\tInternal error at map level,", mapobject.getText()) + # sys.exit(-2) fout = open(os.path.basename(xkbfilename) + ".xml", "w") fout.write("\n") @@ -279,6 +293,6 @@ def process_keysymstxt(): fout.write(etree.tostring(layout, pretty_print=True)) fout.close() -print " done." +print(" done.") -#pdb.set_trace() +# pdb.set_trace() diff --git a/parse_xml_to_xkb.py b/parse_xml_to_xkb.py index 654736d..9088d58 100644 --- a/parse_xml_to_xkb.py +++ b/parse_xml_to_xkb.py @@ -11,96 +11,97 @@ xmlfilename = "xkbsample.xml" if len(sys.argv) > 1: - xmlfilename = sys.argv[1] + xmlfilename = sys.argv[1] try: - xmlfile = open(xmlfilename, 'r') - xmlfile.close + xmlfile = open(xmlfilename, 'r') + xmlfile.close() except OSError: - print "Could not open file ", xmlfilename, ". Aborting..." - sys.exit(-1) - + print("Could not open file ", xmlfilename, ". Aborting...") + sys.exit(-1) doc = etree.parse(xmlfilename) # for elem in doc.getiterator(): # print elem.tag, "has", len(elem), "children", elem.attrib, elem.text -TABS="\t\t\t\t\t\t\t\t\t\t\t\t" +TABS = "\t\t\t\t\t\t\t\t\t\t\t\t" xkbfilename = os.path.basename(xmlfilename)[:-4] fout = open(xkbfilename, "w") + def recurse_tree(node, depth): - if node.tag == "layout": - print "Parsing", node.attrib["layoutname"] - for n in node: - recurse_tree(n, depth+1) - elif node.tag == "symbols": - for k in node: - if k.tag == "mapoption": - fout.write(k.text) - fout.write(" ") - elif k.tag == "mapname": - fout.write("\"%(s)s\"\n{\n" % { "s": k.text }) - elif k.tag == "mapmaterial": - for t in k: - if t.tag == "tokenname": - fout.write("\tname = \"%(s)s\";\n" % { "s": t.attrib["name"] }) - elif t.tag == "tokeninclude": - fout.write("\tinclude \"%(s)s\"\n" % { "s": t.text }) - elif t.tag == "tokentype": - fout.write("\tkey.type = \"%(s)s\";\n" % { "s": t.text }) - elif t.tag == "tokenmodifiermap": - fout.write("\tmodifier_map %(s)s { " % { "s": t.attrib['state'] }) - count_mm = len(t) - for mm in t: - if mm.tag == "keycodex": - fout.write("<%(s)s>" % { "s": mm.attrib["value"] }) - elif mm.tag == "keycode": - fout.write("%(s)s" % { "s": mm.attrib["value"] }) - if count_mm > 1: - fout.write(", ") - count_mm -= 1 - fout.write(" };\n") - - elif t.tag == "tokenkey": - fout.write("\t") - if t.attrib["override"] == "True": - fout.write("override ") - for tk in t: - if tk.tag == "keycodename": - fout.write("key <%(s)s> { " % { "s": tk.text }) - elif tk.tag == "keysymgroup": - gotitem = False - for ks in tk: - if ks.tag == "typegroup": - if gotitem: - fout.write(", ") - fout.write("type = \"%(s)s\" " % { "s": ks.attrib["value"] }) - gotitem = True - elif ks.tag == "tokenvirtualmodifiers": - if gotitem: - fout.write(", ") - fout.write("virtualMods = %(s)s " % { "s": ks.attrib["value"] }) - elif ks.tag == "symbolsgroup": - if gotitem: - fout.write(", ") - gotitem = True - fout.write("[ ") - count_sg = len(ks) - for sg in ks: - if sg.tag == "symbol": - if count_sg > 1: - fout.write("%(s)s, " % { "s": sg.text }) - else: - fout.write("%(s)s " % { "s": sg.text }) - count_sg -= 1 - else: - print "ERROR" - sys.exit(-1) - fout.write("]") - fout.write(" };\n") - fout.write("};\n\n") + if node.tag == "layout": + print("Parsing", node.attrib["layoutname"]) + for n in node: + recurse_tree(n, depth + 1) + elif node.tag == "symbols": + for k in node: + if k.tag == "mapoption": + fout.write(k.text) + fout.write(" ") + elif k.tag == "mapname": + fout.write("\"%(s)s\"\n{\n" % {"s": k.text}) + elif k.tag == "mapmaterial": + for t in k: + if t.tag == "tokenname": + fout.write("\tname = \"%(s)s\";\n" % {"s": t.attrib["name"]}) + elif t.tag == "tokeninclude": + fout.write("\tinclude \"%(s)s\"\n" % {"s": t.text}) + elif t.tag == "tokentype": + fout.write("\tkey.type = \"%(s)s\";\n" % {"s": t.text}) + elif t.tag == "tokenmodifiermap": + fout.write("\tmodifier_map %(s)s { " % {"s": t.attrib['state']}) + count_mm = len(t) + for mm in t: + if mm.tag == "keycodex": + fout.write("<%(s)s>" % {"s": mm.attrib["value"]}) + elif mm.tag == "keycode": + fout.write("%(s)s" % {"s": mm.attrib["value"]}) + if count_mm > 1: + fout.write(", ") + count_mm -= 1 + fout.write(" };\n") + + elif t.tag == "tokenkey": + fout.write("\t") + if t.attrib["override"] == "True": + fout.write("override ") + for tk in t: + if tk.tag == "keycodename": + fout.write("key <%(s)s> { " % {"s": tk.text}) + elif tk.tag == "keysymgroup": + gotitem = False + for ks in tk: + if ks.tag == "typegroup": + if gotitem: + fout.write(", ") + fout.write("type = \"%(s)s\" " % {"s": ks.attrib["value"]}) + gotitem = True + elif ks.tag == "tokenvirtualmodifiers": + if gotitem: + fout.write(", ") + fout.write("virtualMods = %(s)s " % {"s": ks.attrib["value"]}) + elif ks.tag == "symbolsgroup": + if gotitem: + fout.write(", ") + gotitem = True + fout.write("[ ") + count_sg = len(ks) + for sg in ks: + if sg.tag == "symbol": + if count_sg > 1: + fout.write("%(s)s, " % {"s": sg.text}) + else: + fout.write("%(s)s " % {"s": sg.text}) + count_sg -= 1 + else: + print("ERROR") + sys.exit(-1) + fout.write("]") + fout.write(" };\n") + fout.write("};\n\n") + recurse_tree(doc.getroot(), 0) diff --git a/print_tree.py b/print_tree.py index 066cbb3..bbded68 100644 --- a/print_tree.py +++ b/print_tree.py @@ -6,37 +6,41 @@ import sys import pdb import antlr3 -from XKBGrammarLexer import XKBGrammarLexer, LAYOUT, SYMBOLS, MAPTYPE, MAPNAME, MAPOPTIONS, MAPMATERIAL, TOKEN_INCLUDE, TOKEN_NAME, TOKEN_KEY_TYPE, TOKEN_KEY, VALUE, KEYCODE, KEYCODEX +from XKBGrammarLexer import XKBGrammarLexer, LAYOUT, SYMBOLS, MAPTYPE, MAPNAME, MAPOPTIONS, MAPMATERIAL, TOKEN_INCLUDE, \ + TOKEN_NAME, TOKEN_KEY_TYPE, TOKEN_KEY, VALUE, KEYCODE, KEYCODEX from XKBGrammarParser import XKBGrammarParser from XKBGrammarWalker import XKBGrammarWalker + # Helper function to iterate through all children of a given type def getChildrenByType(tree, type_value): - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - yield child + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + yield child + # Helper function to iterate through all children of a given type def getChildrenListByType(tree, type_value): - list = [] - for i in range(tree.getChildCount()): - child = tree.getChild(i) - if child.getType() == type_value: - list.append(child) - return list + a_list = [] + for i in range(tree.getChildCount()): + child = tree.getChild(i) + if child.getType() == type_value: + a_list.append(child) + return a_list + xkbfilename = "gr" if len(sys.argv) > 1: xkbfilename = sys.argv[1] -try: - xkbfile = open(xkbfilename, 'r') +try: + xkbfile = open(xkbfilename, 'r') except OSError: - print "Could not open file ", xkbfilename, ". Aborting..." - sys.exit(-1) + print("Could not open file ", xkbfilename, ". Aborting...") + sys.exit(-1) -xkbfile.close +xkbfile.close() # char_stream = antlr3.ANTLRFileStream(xkbfilename, encoding='utf-8') char_stream = antlr3.ANTLRFileStream(xkbfilename) @@ -46,8 +50,8 @@ def getChildrenListByType(tree, type_value): result = parser.layout() -print "XXXXXXXXXXXXXXXXXXXXXXX", xkbfilename -print "tree =", result.tree.toStringTree() +print("XXXXXXXXXXXXXXXXXXXXXXX", xkbfilename) +print("tree =", result.tree.toStringTree()) nodes = antlr3.tree.CommonTreeNodeStream(result.tree) nodes.setTokenStream(tokens) @@ -57,14 +61,15 @@ def getChildrenListByType(tree, type_value): MAX = 10 TABS = "\t\t\t\t\t\t\t\t\t\t" + def print_tree(node, depth): - if depth >= MAX: - return - for n in node.getChildren(): - print TABS[:depth], "===", n.getText(), "===" - print_tree(n, depth + 1) - - -print result.tree.getChild(0).getText() -print + if depth >= MAX: + return + for n in node.getChildren(): + print(TABS[:depth], "===", n.getText(), "===") + print_tree(n, depth + 1) + + +print(result.tree.getChild(0).getText()) +print() print_tree(result.tree, 0) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b86b027 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +pygtk=>2.24.0 +gobject=>0.1.0 +lxml=>4.8.0 +Enum=>0.4.7 \ No newline at end of file