From e43c0ea58d647972f0cc11d260226a118766f9f5 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Sun, 18 Feb 2018 22:51:23 +0530 Subject: [PATCH] Override text browser with 'O' --- README.md | 1 + buku.1 | 3 +++ buku.py | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 594d5b5..b48a091 100644 --- a/README.md +++ b/README.md @@ -265,6 +265,7 @@ PROMPT KEYS: append, set, remove (all or specific) tags w [editor|id] edit and add or update a bookmark c id copy url at search result index to clipboard + O toggle try to open in a GUI browser ? show this help q, ^D, double Enter exit buku ``` diff --git a/buku.1 b/buku.1 index c502ec6..fca7e9d 100644 --- a/buku.1 +++ b/buku.1 @@ -314,6 +314,9 @@ Edit and add or update a bookmark. .BI "c id" Copy url at search result index to clipboard. .TP +.BI "O" +Toggles ignore text-based browsers. If enabled, tries to open urls in a GUI based browser (even if BROWSER is set). +.TP .BI "?" Show help on prompt keys. .TP diff --git a/buku.py b/buku.py index 9e709d3..e37783a 100755 --- a/buku.py +++ b/buku.py @@ -76,6 +76,7 @@ COLORMAP = {k: '\x1b[%sm' % v for k, v in { USER_AGENT = 'Buku/{} (textmode; Linux x86_64; 1024x768)'.format(__version__) myheaders = None # Default dictionary of headers myproxy = None # Default proxy +text_browsers = ['elinks', 'links', 'links2', 'lynx', 'w3m', 'www-browser'] # Set up logging logger = logging.getLogger() @@ -2436,6 +2437,7 @@ PROMPT KEYS: append, set, remove (all or specific) tags w [editor|id] edit and add or update a bookmark c id copy url at search result index to clipboard + O toggle try to open in a GUI browser ? show this help q, ^D, double Enter exit buku @@ -3065,7 +3067,7 @@ def taglist_subprompt(obj, noninteractive=False): new_results = False elif nav == 't': new_results = True - elif (nav == 'q' or nav == 'd' or nav == '?' or + elif (nav == 'q' or nav == 'd' or nav == '?' or nav == 'O' or nav.startswith(('s ', 'S ', 'r ', 't ', 'o ', 'p ', 'g ', 'w ', 'c ')) or nav == 'w'): return nav else: @@ -3176,6 +3178,12 @@ def prompt(obj, results, noninteractive=False, deep=False, subprompt=False, sugg continue + # Toggle GUI browser with 'O' + if nav == 'O': + browse.override_text_browser = not browse.override_text_browser + print('text browser override toggled') + continue + # Show help with '?' if nav == '?': ExtendedArgumentParser.prompt_help(sys.stdout) @@ -3482,6 +3490,8 @@ def browse(url): suppress_browser_output : bool True if a text based browser is detected. Must be initialized (as applicable) to use the API. + override_text_browser : bool + If True, tries to open links in a GUI based browser. """ if not parse_url(url).scheme: @@ -3492,6 +3502,17 @@ def browse(url): logerr('scheme missing in URI, trying http') url = 'http://' + url + browser = webbrowser.get() + if browse.override_text_browser: + browser_output = browse.suppress_browser_output + for name in [b for b in webbrowser._tryorder if b not in text_browsers]: + browser = webbrowser.get(name) + logdbg(browser) + + # Found a GUI browser, suppress browser output + browse.suppress_browser_output = True + break + if browse.suppress_browser_output: _stderr = os.dup(2) os.close(2) @@ -3502,7 +3523,7 @@ def browse(url): os.dup2(fd, 1) try: if sys.platform != 'win32': - webbrowser.open(url, new=2) + browser.open(url, new=2) else: # On Windows, the webbrowser module does not fork. # Use threads instead. @@ -3519,6 +3540,9 @@ def browse(url): os.dup2(_stderr, 2) os.dup2(_stdout, 1) + if browse.override_text_browser: + browse.suppress_browser_output = browser_output + def check_upstream_release(): """Check and report the latest upstream release version.""" @@ -4250,11 +4274,14 @@ POSITIONAL ARGUMENTS: bdb.add_rec(url, title_in, tags, desc_in, args.immutable) # Enable browser output in case of a text based browser - if os.getenv('BROWSER') in ['elinks', 'links', 'lynx', 'w3m', 'links2']: + if os.getenv('BROWSER') in text_browsers: browse.suppress_browser_output = False else: browse.suppress_browser_output = True + # Overriding text browsers is disabled by default + browse.override_text_browser = False + # Search record search_results = None search_opted = True