Mercurial > hg > smartopen
diff smartopen/smartopen.py @ 1:10fc4904c10f
now can pass data
author | k0s <k0scist@gmail.com> |
---|---|
date | Sat, 21 Nov 2009 17:29:39 -0500 |
parents | d6fa501af82f |
children | 01015b36290a |
line wrap: on
line diff
--- a/smartopen/smartopen.py Sat Nov 21 15:46:01 2009 -0500 +++ b/smartopen/smartopen.py Sat Nov 21 17:29:39 2009 -0500 @@ -1,30 +1,110 @@ -#!/usr/bin/python +#!/usr/bin/env python """ smart open the data passed in """ import os import sys -import urllib -import urllib2 from optparse import OptionParser +from pkg_resources import iter_entry_points +from ConfigParser import ConfigParser -from handlers import * +def locations(names=None, config=None): + """ + list of 2-tuples of location handlers; + * names: order names of handlers + * config: nested dictionary of configuration from names + """ + + _handlers = {} + _names = [] + if config is None: + config = {} + + for i in iter_entry_points('smartopen.locations'): + try: + handler = i.load() + except: + pass + _handlers[i.name] = handler + if not names: + _names.append(i.name) + + if not names: + names = _names + handlers = [] + for name in names: + if ':' in name: + _name, section = name.split(':', 1) + else: + _name = name + if _name in _handlers: + try: + handler = _handlers[_name](**config.get(name, {})) + except: + continue + handlers.append((name, handler)) + return handlers + +def urls(query, handlers=None): + if handlers is None: + handlers = locations() + urls = [] + for name, handler in handlers: + if handler.test(query): + urls.append((name, handler.url(query))) + return urls + +def url(query, handlers=None): + if handlers is None: + handlers = locations() + for name, handler in handlers: + if handler.test(query): + return handler.url(query) def main(args=sys.argv[1:]): # parse command line optioins parser = OptionParser() + parser.add_option('-c', '--config', dest="config", + help="config file to read") parser.add_option('-u', '--url', dest="url", action='store_true', default=False, help="print the first url handled") parser.add_option('-a', '--all', dest="all", action='store_true', default=False, help="print all handlers that match the query") + parser.add_option('-H', '--handler', dest="handlers", + action='append', + help="name of the handler to use, in order") + parser.add_option('--print-handlers', dest="print_handlers", + action='store_true', + help="print all handlers in order they would be tried") options, args = parser.parse_args(args) # sanity check assert not (options.url and options.all) + if not options.handlers: + options.handlers = None + + # config + config = ConfigParser() + if options.config and os.path.exists(options.config): + config.read(options.config) + if not options.handlers and config.has_option('DEFAULTS', 'handlers'): + options.handlers = [ i.strip() for i in config.get('DEFAULTS', 'handlers').split(',') ] + _config = {} + for section in config.sections(): + _config[section] = dict(config.items(section)) + + # get the handlers + _locations = locations(options.handlers, _config) + + # print the handlers + if options.print_handlers: + for name, loc in _locations: + print name + sys.exit(0) # get data to be operated on if args: @@ -32,26 +112,24 @@ else: data = sys.stdin.read() - locations = [ URL, - GoogleMap, - Revision, - TracTicket, - Wikipedia, - Google - ] + # print the URLs + if options.all: + _urls = urls(data, _locations) + for name, _url in _urls: + print '%s: %s' % (name, _url) + sys.exit(0) + + _url = url(data, _locations) - for loc in locations: - loc = loc() - if options.url: # print url - if loc.test(data): - print loc.url(data) - sys.exit(0) - elif options.all: - if loc.test(data): - print '%s: %s' % (loc.__class__.__name__, loc.url(data)) - else: - if loc.open(data): - sys.exit(0) + # print a URL + if options.url: + print _url + sys.exit(0) + + # open the URL in a browser + os.system("firefox '%s'" % _url) + sys.exit(0) + if __name__ == '__main__': main()