retronews

a featureful fork of the luke8086/retronews hn+lobste.rs tui
Log | Files | Refs | README | LICENSE

commit fd1307c7cacffa01e915c3326f8075f640878a77
parent 85955680ca0147b9521a315680a8fedaf78a248e
Author: luke8086 <55237178+luke8086@users.noreply.github.com>
Date:   Fri, 16 Jun 2023 16:31:01 +0000

Add support for opening links in browser

Diffstat:
Mretronews.py | 38++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+), 0 deletions(-)

diff --git a/retronews.py b/retronews.py @@ -25,6 +25,7 @@ import re import sqlite3 import unicodedata import urllib.request +import webbrowser from datetime import datetime from functools import partial, reduce from textwrap import wrap @@ -47,6 +48,7 @@ KEY_BINDINGS: dict[int, Callable[["AppState"], None]] = { ord("?"): lambda app: cmd_help(app), ord("\n"): lambda app: cmd_open(app), ord(" "): lambda app: cmd_open(app), + ord("o"): lambda app: cmd_show_links(app), ord("x"): lambda app: cmd_close(app), ord("s"): lambda app: cmd_star(app), ord("S"): lambda app: cmd_star_thread(app), @@ -86,6 +88,7 @@ Available commands: ; , Set mark, jump to mark & swap (valid within thread) RETURN, SPACE Open selected message x Close current message / thread + o Select link and open in browser 1 - 5 Change group R Refresh current page < > Go to previous / next page @@ -649,6 +652,10 @@ def cmd_help(app: AppState): app_show_help_screen(app) +def cmd_show_links(app: AppState): + app_show_links_screen(app) + + def cmd_up(app: AppState) -> None: cmd_pager_up(app) if app.pager_visible else cmd_prev(app) @@ -1221,6 +1228,37 @@ def app_show_help_screen(app: AppState) -> None: app.screen.getch() +def app_show_links_screen(app: AppState) -> None: + app.screen.erase() + app.screen.addstr(0, 0, "Select link to open:") + app.screen.refresh() + + lines = app.selected_message.lines if app.selected_message is not None else [] + + keys = "1234567890abcdefghij" + urls = URL_REX.findall(" ".join(lines)) + items = dict(zip((ord(k) for k in keys), urls)) + + if len(items) == 0: + return app_show_flash(app, "No links available for opening") + + for (i, (key, url)) in enumerate(items.items()): + app.screen.addstr(i + 2, 0, f"{chr(key)} - {url}") + + key = app.screen.getch() + + if key not in items.keys(): + return app_show_flash(app, "Unknown key") + + url = items[key] + + app_show_flash(app, f"Opening {url}") + webbrowser.open(url) + + # Refresh window in case a terminal browser was used + app.screen.clearok(True) + + def app_show_flash(app: AppState, flash: Optional[str]) -> None: app.flash = flash app_render(app)