"""! @package menudata.py @brief Complex list for main menu entries for GRASS wxPython GUI. Classes: - Data - MenuTree Usage: @code python menudata.py action [file] @endcode where action: - strings (default) - tree - commands (C) 2007-2009 by the GRASS Development Team This program is free software under the GNU General Public License (>=v2). Read the file COPYING that comes with GRASS for details. @author Michael Barton (Arizona State University) @author Yann Chemin @author Martin Landa @author Glynn Clements """ import os import sys try: import xml.etree.ElementTree as etree except ImportError: import elementtree.ElementTree as etree # Python <= 2.4 class Data: '''!Data object that returns menu descriptions to be used in wxgui.py.''' def __init__(self, gisbase=None): if not gisbase: gisbase = os.getenv('GISBASE') filename = os.path.join(gisbase, 'etc', 'wxpython', 'xml', 'menudata.xml') self.tree = etree.parse(filename) def getMenuItem(self, mi): if mi.tag == 'separator': return ('', '', '', '', '') elif mi.tag == 'menuitem': label = _(mi.find('label').text) help = _(mi.find('help').text) handler = mi.find('handler').text gcmd = mi.find('command') # optional keywords = mi.find('keywords') # optional shortcut = mi.find('shortcut') # optional if gcmd != None: gcmd = gcmd.text else: gcmd = "" if keywords != None: keywords = keywords.text else: keywords = "" if shortcut != None: shortcut = shortcut.text else: shortcut = "" return (label, help, handler, gcmd, keywords, shortcut) elif mi.tag == 'menu': return self.getMenu(mi) else: raise Exception() def getMenu(self, m): label = _(m.find('label').text) items = m.find('items') return (label, tuple(map(self.getMenuItem, items))) def getMenuBar(self, mb): return tuple(map(self.getMenu, mb.findall('menu'))) def getMenuData(self, md): return list(map(self.getMenuBar, md.findall('menubar'))) def GetMenu(self): return self.getMenuData(self.tree.getroot()) def PrintStrings(self, fh): """!Print menu strings to file (used for localization) @param fh file descriptor""" fh.write('menustrings = [\n') for node in self.tree.getiterator(): if node.tag in ['label', 'help']: fh.write(' _(%r),\n' % node.text) fh.write(' \'\']\n') def PrintTree(self, fh): """!Print menu tree to file @param fh file descriptor""" level = 0 for eachMenuData in self.GetMenu(): for label, items in eachMenuData: fh.write('- %s\n' % label) self.__PrintTreeItems(fh, level + 1, items) def __PrintTreeItems(self, fh, level, menuData): """!Print menu tree items to file (used by PrintTree) @param fh file descriptor @param level menu level @param menuData menu data to print out""" for eachItem in menuData: if len(eachItem) == 2: if eachItem[0]: fh.write('%s - %s\n' % (' ' * level, eachItem[0])) self.__PrintTreeItems(fh, level + 1, eachItem[1]) else: if eachItem[0]: fh.write('%s - %s\n' % (' ' * level, eachItem[0])) def PrintCommands(self, fh, itemSep = ' | ', menuSep = ' > '): """!Print commands list (command | menu item > menu item) @param fh file descriptor """ level = 0 for eachMenuData in self.GetMenu(): for label, items in eachMenuData: menuItems = [label, ] self.__PrintCommandsItems(fh, level + 1, items, menuItems, itemSep, menuSep) def __PrintCommandsItems(self, fh, level, menuData, menuItems, itemSep, menuSep): """!Print commands item (used by PrintCommands) @param fh file descriptor @param menuItems list of menu items """ for eachItem in menuData: if len(eachItem) == 2: if eachItem[0]: try: menuItems[level] = eachItem[0] except IndexError: menuItems.append(eachItem[0]) self.__PrintCommandsItems(fh, level + 1, eachItem[1], menuItems, itemSep, menuSep) else: try: del menuItems[level] except IndexError: pass if eachItem[3]: fh.write('%s%s' % (eachItem[3], itemSep)) fh.write(menuSep.join(menuItems)) fh.write('%s%s' % (menuSep, eachItem[0])) fh.write('\n') def GetModules(self): """!Create dictionary of modules used to search module by keywords, description, etc.""" modules = dict() for node in self.tree.getiterator(): if node.tag == 'menuitem': module = description = '' keywords = [] for child in node.getchildren(): if child.tag == 'help': description = child.text if child.tag == 'command': module = child.text if child.tag == 'keywords': if child.text: keywords = child.text.split(',') if module: modules[module] = { 'desc': description, 'keywords' : keywords } if len(keywords) < 1: print >> sys.stderr, "WARNING: Module <%s> has no keywords" % module return modules if __name__ == "__main__": import sys # i18N import gettext gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True) file = None if len(sys.argv) == 1: action = 'strings' elif len(sys.argv) > 1: action = sys.argv[1] if len(sys.argv) > 2: file = sys.argv[2] if file: data = Data(file) else: data = Data() if action == 'strings': data.PrintStrings(sys.stdout) elif action == 'tree': data.PrintTree(sys.stdout) elif action == 'commands': data.PrintCommands(sys.stdout) sys.exit(0)