g.manual.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/usr/bin/env python
  2. ############################################################################
  3. #
  4. # MODULE: g.manual
  5. # AUTHOR(S): Markus Neteler
  6. # Converted to Python by Glynn Clements
  7. # PURPOSE: Display the HTML/MAN pages
  8. # COPYRIGHT: (C) 2003-2015 by the GRASS Development Team
  9. #
  10. # This program is free software under the GNU General Public
  11. # License (>=v2). Read the file COPYING that comes with GRASS
  12. # for details.
  13. #
  14. #############################################################################
  15. #%module
  16. #% description: Displays the manual pages of GRASS modules.
  17. #% keyword: general
  18. #% keyword: manual
  19. #% keyword: help
  20. #%end
  21. #%flag
  22. #% key: i
  23. #% description: Display index
  24. #% suppress_required: yes
  25. #%end
  26. #%flag
  27. #% key: t
  28. #% description: Display topics
  29. #% suppress_required: yes
  30. #%end
  31. #%flag
  32. #% key: m
  33. #% description: Display as MAN text page instead of HTML page in browser
  34. #%end
  35. #%flag
  36. #% key: o
  37. #% label: Display online manuals instead of locally installed
  38. #% description: Use online manuals available at http://grass.osgeo.org website. This flag has no effect when displaying MAN text pages.
  39. #%end
  40. #%option
  41. #% key: entry
  42. #% type: string
  43. #% description: Manual entry to be displayed
  44. #% required : yes
  45. #%end
  46. import sys
  47. import os
  48. try:
  49. from urllib2 import urlopen
  50. except ImportError:
  51. # python3
  52. from urllib.request import urlopen
  53. import webbrowser
  54. from grass.script.utils import basename
  55. from grass.script import core as grass
  56. # i18N
  57. import gettext
  58. gettext.install('grassmods', os.path.join(os.getenv("GISBASE"), 'locale'))
  59. def start_browser(entry):
  60. if browser and \
  61. browser not in ('xdg-open', 'start') and \
  62. not grass.find_program(browser):
  63. grass.fatal(_("Browser '%s' not found") % browser)
  64. if flags['o']:
  65. major, minor, patch = grass.version()['version'].split('.')
  66. url_path = 'http://grass.osgeo.org/grass%s%s/manuals/%s.html' % (major, minor, entry)
  67. if urlopen(url_path).getcode() != 200:
  68. url_path = 'http://grass.osgeo.org/grass%s%s/manuals/addons/%s.html' % (
  69. major, minor, entry)
  70. else:
  71. path = os.path.join(gisbase, 'docs', 'html', entry + '.html')
  72. if not os.path.exists(path) and os.getenv('GRASS_ADDON_BASE'):
  73. path = os.path.join(os.getenv('GRASS_ADDON_BASE'), 'docs', 'html', entry + '.html')
  74. if not os.path.exists(path):
  75. grass.fatal(_("No HTML manual page entry for '%s'") % entry)
  76. url_path = 'file://' + path
  77. if browser and browser not in ('xdg-open', 'start'):
  78. webbrowser.register(browser_name, None)
  79. grass.verbose(_("Starting browser '%(browser)s' for manual"
  80. " entry '%(entry)s'...") %
  81. dict(browser=browser_name, entry=entry))
  82. try:
  83. webbrowser.open(url_path)
  84. except:
  85. grass.fatal(_("Error starting browser '%(browser)s' for HTML file"
  86. " '%(path)s'") % dict(browser=browser, path=path))
  87. def start_man(entry):
  88. path = os.path.join(gisbase, 'docs', 'man', 'man1', entry + '.1')
  89. if not os.path.exists(path) and os.getenv('GRASS_ADDON_BASE'):
  90. path = os.path.join(os.getenv('GRASS_ADDON_BASE'), 'docs', 'man', 'man1', entry + '.1')
  91. for ext in ['', '.gz', '.bz2']:
  92. if os.path.exists(path + ext):
  93. os.execlp('man', 'man', path + ext)
  94. grass.fatal(_("Error starting 'man' for '%s'") % path)
  95. grass.fatal(_("No manual page entry for '%s'") % entry)
  96. def main():
  97. global gisbase, browser, browser_name
  98. if flags['i'] and flags['t']:
  99. grass.fatal(_("Flags -%c and -%c are mutually exclusive") % ('i', 't'))
  100. special = None
  101. if flags['i']:
  102. special = 'index'
  103. elif flags['t']:
  104. special = 'topics'
  105. if flags['m']:
  106. start = start_man
  107. else:
  108. start = start_browser
  109. entry = options['entry']
  110. gisbase = os.environ['GISBASE']
  111. browser = os.getenv('GRASS_HTML_BROWSER', '')
  112. if sys.platform == 'darwin':
  113. # hack for MacOSX
  114. browser_name = os.getenv('GRASS_HTML_BROWSER_MACOSX', '..').split('.')[2]
  115. elif sys.platform == 'cygwin':
  116. # hack for Cygwin
  117. browser_name = basename(browser, 'exe')
  118. else:
  119. browser_name = basename(browser)
  120. # keep order!
  121. # first test for index...
  122. if special:
  123. start(special)
  124. else:
  125. start(entry)
  126. return 0
  127. if __name__ == "__main__":
  128. options, flags = grass.parser()
  129. sys.exit(main())