menudata.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. """!
  2. @package menudata.py
  3. @brief Complex list for main menu entries for GRASS wxPython GUI.
  4. Classes:
  5. - Data
  6. - MenuTree
  7. Usage:
  8. @code
  9. python menudata.py action [file]
  10. @endcode
  11. where <i>action</i>:
  12. - strings (default)
  13. - tree
  14. - commands
  15. (C) 2007-2009 by the GRASS Development Team
  16. This program is free software under the GNU General Public
  17. License (>=v2). Read the file COPYING that comes with GRASS
  18. for details.
  19. @author Michael Barton (Arizona State University)
  20. @author Yann Chemin <yann.chemin gmail.com>
  21. @author Martin Landa <landa.martin gmail.com>
  22. @author Glynn Clements
  23. """
  24. import os
  25. import sys
  26. try:
  27. import xml.etree.ElementTree as etree
  28. except ImportError:
  29. import elementtree.ElementTree as etree # Python <= 2.4
  30. class Data:
  31. '''!Data object that returns menu descriptions to be used in wxgui.py.'''
  32. def __init__(self, gisbase=None):
  33. if not gisbase:
  34. gisbase = os.getenv('GISBASE')
  35. filename = os.path.join(gisbase, 'etc', 'wxpython', 'xml', 'menudata.xml')
  36. self.tree = etree.parse(filename)
  37. def getMenuItem(self, mi):
  38. if mi.tag == 'separator':
  39. return ('', '', '', '', '')
  40. elif mi.tag == 'menuitem':
  41. label = _(mi.find('label').text)
  42. help = _(mi.find('help').text)
  43. handler = mi.find('handler').text
  44. gcmd = mi.find('command') # optional
  45. keywords = mi.find('keywords') # optional
  46. shortcut = mi.find('shortcut') # optional
  47. if gcmd != None:
  48. gcmd = gcmd.text
  49. else:
  50. gcmd = ""
  51. if keywords != None:
  52. keywords = keywords.text
  53. else:
  54. keywords = ""
  55. if shortcut != None:
  56. shortcut = shortcut.text
  57. else:
  58. shortcut = ""
  59. return (label, help, handler, gcmd, keywords, shortcut)
  60. elif mi.tag == 'menu':
  61. return self.getMenu(mi)
  62. else:
  63. raise Exception()
  64. def getMenu(self, m):
  65. label = _(m.find('label').text)
  66. items = m.find('items')
  67. return (label, tuple(map(self.getMenuItem, items)))
  68. def getMenuBar(self, mb):
  69. return tuple(map(self.getMenu, mb.findall('menu')))
  70. def getMenuData(self, md):
  71. return list(map(self.getMenuBar, md.findall('menubar')))
  72. def GetMenu(self):
  73. return self.getMenuData(self.tree.getroot())
  74. def PrintStrings(self, fh):
  75. """!Print menu strings to file (used for localization)
  76. @param fh file descriptor"""
  77. fh.write('menustrings = [\n')
  78. for node in self.tree.getiterator():
  79. if node.tag in ['label', 'help']:
  80. fh.write(' _(%r),\n' % node.text)
  81. fh.write(' \'\']\n')
  82. def PrintTree(self, fh):
  83. """!Print menu tree to file
  84. @param fh file descriptor"""
  85. level = 0
  86. for eachMenuData in self.GetMenu():
  87. for label, items in eachMenuData:
  88. fh.write('- %s\n' % label)
  89. self.__PrintTreeItems(fh, level + 1, items)
  90. def __PrintTreeItems(self, fh, level, menuData):
  91. """!Print menu tree items to file (used by PrintTree)
  92. @param fh file descriptor
  93. @param level menu level
  94. @param menuData menu data to print out"""
  95. for eachItem in menuData:
  96. if len(eachItem) == 2:
  97. if eachItem[0]:
  98. fh.write('%s - %s\n' % (' ' * level, eachItem[0]))
  99. self.__PrintTreeItems(fh, level + 1, eachItem[1])
  100. else:
  101. if eachItem[0]:
  102. fh.write('%s - %s\n' % (' ' * level, eachItem[0]))
  103. def PrintCommands(self, fh, itemSep = ' | ', menuSep = ' > '):
  104. """!Print commands list (command | menu item > menu item)
  105. @param fh file descriptor
  106. """
  107. level = 0
  108. for eachMenuData in self.GetMenu():
  109. for label, items in eachMenuData:
  110. menuItems = [label, ]
  111. self.__PrintCommandsItems(fh, level + 1, items,
  112. menuItems, itemSep, menuSep)
  113. def __PrintCommandsItems(self, fh, level, menuData,
  114. menuItems, itemSep, menuSep):
  115. """!Print commands item (used by PrintCommands)
  116. @param fh file descriptor
  117. @param menuItems list of menu items
  118. """
  119. for eachItem in menuData:
  120. if len(eachItem) == 2:
  121. if eachItem[0]:
  122. try:
  123. menuItems[level] = eachItem[0]
  124. except IndexError:
  125. menuItems.append(eachItem[0])
  126. self.__PrintCommandsItems(fh, level + 1, eachItem[1],
  127. menuItems, itemSep, menuSep)
  128. else:
  129. try:
  130. del menuItems[level]
  131. except IndexError:
  132. pass
  133. if eachItem[3]:
  134. fh.write('%s%s' % (eachItem[3], itemSep))
  135. fh.write(menuSep.join(menuItems))
  136. fh.write('%s%s' % (menuSep, eachItem[0]))
  137. fh.write('\n')
  138. def GetModules(self):
  139. """!Create dictionary of modules used to search module by
  140. keywords, description, etc."""
  141. modules = dict()
  142. for node in self.tree.getiterator():
  143. if node.tag == 'menuitem':
  144. module = description = ''
  145. keywords = []
  146. for child in node.getchildren():
  147. if child.tag == 'help':
  148. description = child.text
  149. if child.tag == 'command':
  150. module = child.text
  151. if child.tag == 'keywords':
  152. if child.text:
  153. keywords = child.text.split(',')
  154. if module:
  155. modules[module] = { 'desc': description,
  156. 'keywords' : keywords }
  157. if len(keywords) < 1:
  158. print >> sys.stderr, "WARNING: Module <%s> has no keywords" % module
  159. return modules
  160. if __name__ == "__main__":
  161. import sys
  162. # i18N
  163. import gettext
  164. gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
  165. file = None
  166. if len(sys.argv) == 1:
  167. action = 'strings'
  168. elif len(sys.argv) > 1:
  169. action = sys.argv[1]
  170. if len(sys.argv) > 2:
  171. file = sys.argv[2]
  172. if file:
  173. data = Data(file)
  174. else:
  175. data = Data()
  176. if action == 'strings':
  177. data.PrintStrings(sys.stdout)
  178. elif action == 'tree':
  179. data.PrintTree(sys.stdout)
  180. elif action == 'commands':
  181. data.PrintCommands(sys.stdout)
  182. sys.exit(0)