def getEditorCommand(self): """Return the editor command""" editor = self.options.get('editor') if win32 and editor is None: from _winreg import HKEY_CLASSES_ROOT, OpenKeyEx, \ QueryValueEx, EnumKey from win32api import FindExecutable import pywintypes # Find editor application based on mime type and extension content_type = self.metadata.get('content_type') extension = self.options.get('extension') if content_type: # Search registry for the extension by MIME type try: key = 'MIME\\Database\\Content Type\\%s' % content_type key = OpenKeyEx(HKEY_CLASSES_ROOT, key) extension, nil = QueryValueEx(key, 'Extension') except EnvironmentError: pass if extension is None: url = self.metadata['url'] dot = url.rfind('.') if dot != -1 and dot > url.rfind('/'): extension = url[dot:] if extension is not None: try: key = OpenKeyEx(HKEY_CLASSES_ROOT, extension) classname, nil = QueryValueEx(key, None) except EnvironmentError: classname = None if classname is not None: try: # Look for Edit action in registry key = OpenKeyEx(HKEY_CLASSES_ROOT, classname+'\\Shell\\Edit\\Command') editor, nil = QueryValueEx(key, None) except EnvironmentError: pass if editor is None: # Enumerate the actions looking for one # starting with 'Edit' try: key = OpenKeyEx(HKEY_CLASSES_ROOT, classname+'\\Shell') index = 0 while 1: try: subkey = EnumKey(key, index) index += 1 if str(subkey).lower().startswith('edit'): subkey = OpenKeyEx(key, subkey + '\\Command') editor, nil = QueryValueEx(subkey, None) else: continue except EnvironmentError: break except EnvironmentError: pass if editor is None: try: # Look for Open action in registry key = OpenKeyEx(HKEY_CLASSES_ROOT, classname+'\\Shell\\Open\\Command') editor, nil = QueryValueEx(key, None) except EnvironmentError: pass if editor is None: try: nil, editor = FindExecutable(self.content_file, '') except pywintypes.error: pass # Don't use IE as an "editor" if editor is not None and editor.find('\\iexplore.exe') != -1: editor = None if not editor and not win32 and has_tk(): from tkSimpleDialog import askstring editor = askstring('Zope External Editor', 'Enter the command to launch the default editor') if not editor: sys.exit(0) self.config.set('general', 'editor', editor) self.config.save() if editor is not None: return editor else: fatalError('No editor was found for that object.\n' 'Specify an editor in the configuration file:\n' '(%s)' % self.config.path)
def getEditorCommand(self): """Return the editor command""" editor = self.options.get('editor') if win32 and editor is None: from _winreg import HKEY_CLASSES_ROOT, OpenKeyEx, \ QueryValueEx, EnumKey from win32api import FindExecutable, ExpandEnvironmentStrings # Find editor application based on mime type and extension content_type = self.metadata.get('content_type') extension = self.options.get('extension') logger.debug('Have content type: %r, extension: %r', content_type, extension) if content_type: # Search registry for the extension by MIME type try: key = 'MIME\\Database\\Content Type\\%s' % content_type key = OpenKeyEx(HKEY_CLASSES_ROOT, key) extension, nil = QueryValueEx(key, 'Extension') logger.debug( 'Registry has extension %r for ' 'content type %r', extension, content_type) except EnvironmentError: pass if extension is None: url = self.metadata['url'] dot = url.rfind('.') if dot != -1 and dot > url.rfind('/'): extension = url[dot:] logger.debug('Extracted extension from url: %r', extension) classname = editor = None if extension is not None: try: key = OpenKeyEx(HKEY_CLASSES_ROOT, extension) classname, nil = QueryValueEx(key, None) logger.debug('ClassName for extension %r is: %r', extension, classname) except EnvironmentError: classname = None if classname is not None: try: # Look for Edit action in registry key = OpenKeyEx(HKEY_CLASSES_ROOT, classname + '\\Shell\\Edit\\Command') editor, nil = QueryValueEx(key, None) logger.debug('Edit action for %r is: %r', classname, editor) except EnvironmentError: pass if classname is not None and editor is None: logger.debug( 'Could not find Edit action for %r. ' 'Brute-force enumeration.', classname) # Enumerate the actions looking for one # starting with 'Edit' try: key = OpenKeyEx(HKEY_CLASSES_ROOT, classname + '\\Shell') index = 0 while 1: try: subkey = EnumKey(key, index) index += 1 if str(subkey).lower().startswith('edit'): subkey = OpenKeyEx(key, subkey + '\\Command') editor, nil = QueryValueEx(subkey, None) if editor is None: continue logger.debug( 'Found action %r for %r. ' 'Command will be: %r', subkey, classname, editor) except EnvironmentError: break except EnvironmentError: pass if classname is not None and editor is None: try: # Look for Open action in registry key = OpenKeyEx(HKEY_CLASSES_ROOT, classname + '\\Shell\\Open\\Command') editor, nil = QueryValueEx(key, None) logger.debug('Open action for %r has command: %r. ', classname, editor) except EnvironmentError: pass if editor is None: try: nil, editor = FindExecutable(self.content_file, '') logger.debug('Executable for %r is: %r. ', self.content_file, editor) except pywintypes.error: pass # Don't use IE as an "editor" if editor is not None and editor.find('\\iexplore.exe') != -1: logger.debug('Found iexplore.exe. Skipping.') editor = None if editor is not None: return ExpandEnvironmentStrings(editor) if editor is None: fatalError('No editor was found for that object.\n' 'Specify an editor in the configuration file:\n' '(%s)' % self.config.path) return editor