#! /usr/bin/env python3 from getopt import getopt, GetoptError from urllib.parse import urlsplit, parse_qsl, quote, quote_plus, urlencode import sys from m_lib.defenc import default_encoding # This must be imported and called before webbrowser # because webbrowser reads BROWSER environment variable at the import time from browser_stack import set_current_browser set_current_browser() import webbrowser # noqa: E402 module level import not at top of file def usage(): sys.exit('Usage: %s [-e|--encoding=encoding] [-n|--newwin|-t|--tab] URL' % sys.argv[0]) try: options, arguments = getopt( sys.argv[1:], 'e:nt', ['encoding=', 'newwin', 'tab']) except GetoptError: usage() if len(arguments) != 1: usage() encoding = None new = 0 for option, value in options: if option in ('-e', '--encoding'): encoding = value elif option in ('-n', '--newwin'): new = 1 elif option in ('-t', '--tab'): new = 2 if not encoding: encoding = default_encoding url = arguments[0] split_results = urlsplit(url) protocol, netloc, path, query, tag = split_results user = split_results.username password = split_results.password host = split_results.hostname port = split_results.port if query: qlist = [] for name, value in parse_qsl(query): if isinstance(name, bytes): name = name.decode(default_encoding) value = value.decode(default_encoding) name = name.encode(encoding) value = value.encode(encoding) qlist.append((name, value)) url = protocol + "://" if user: if isinstance(user, bytes): user = user.decode(default_encoding) url += quote(user.encode(encoding)) if password: if isinstance(password, bytes): password = password.decode(default_encoding) url += ':' + quote(password.encode(encoding)) url += '@' if host: if isinstance(host, bytes): host = host.decode(encoding) url += host.encode('idna').decode('ascii') if port: url += ':%d' % port if path: if protocol == "file": url += quote(path) else: if isinstance(path, bytes): path = path.decode(default_encoding) url += quote(path.encode(encoding)) if query: url += '?' + urlencode(qlist) if tag: if isinstance(tag, bytes): tag = tag.decode(default_encoding) url += '#' + quote_plus(tag.encode(encoding)) webbrowser.open(url, new)