rendering: show link preview after links

This commit is contained in:
dece 2021-03-08 22:30:39 +01:00
parent 84764644df
commit 85934eedcf
2 changed files with 45 additions and 18 deletions

View file

@ -3,6 +3,7 @@ from enum import IntEnum
class ColorPair(IntEnum): class ColorPair(IntEnum):
# Colors for specific Gemtext line type.
NORMAL = 0 NORMAL = 0
ERROR = 1 ERROR = 1
LINK = 2 LINK = 2
@ -12,6 +13,9 @@ class ColorPair(IntEnum):
TITLE_3 = 6 TITLE_3 = 6
PREFORMATTED = 7 PREFORMATTED = 7
BLOCKQUOTE = 8 BLOCKQUOTE = 8
# Colors for other usage in the browser.
LINK_PREVIEW = 9
DEBUG = 99 DEBUG = 99
@ -26,4 +30,5 @@ def init_colors():
curses.init_pair(ColorPair.TITLE_3, curses.COLOR_MAGENTA, -1) curses.init_pair(ColorPair.TITLE_3, curses.COLOR_MAGENTA, -1)
curses.init_pair(ColorPair.PREFORMATTED, curses.COLOR_YELLOW, -1) curses.init_pair(ColorPair.PREFORMATTED, curses.COLOR_YELLOW, -1)
curses.init_pair(ColorPair.BLOCKQUOTE, curses.COLOR_CYAN, -1) curses.init_pair(ColorPair.BLOCKQUOTE, curses.COLOR_CYAN, -1)
curses.init_pair(ColorPair.LINK_PREVIEW, curses.COLOR_WHITE, -1)
curses.init_pair(ColorPair.DEBUG, curses.COLOR_BLACK, curses.COLOR_GREEN) curses.init_pair(ColorPair.DEBUG, curses.COLOR_BLACK, curses.COLOR_GREEN)

View file

@ -223,27 +223,49 @@ def render_lines(metalines, window, max_width):
new_dimensions = num_lines, max_width new_dimensions = num_lines, max_width
window.resize(*new_dimensions) window.resize(*new_dimensions)
for line_index, metaline in enumerate(metalines): for line_index, metaline in enumerate(metalines):
meta, line = metaline
line = line[:max_width - 1]
line_type = meta["type"]
if line_type == LineType.TITLE_1:
attr = curses.color_pair(ColorPair.TITLE_1) | curses.A_BOLD
elif line_type == LineType.TITLE_2:
attr = curses.color_pair(ColorPair.TITLE_2) | curses.A_BOLD
elif line_type == LineType.TITLE_3:
attr = curses.color_pair(ColorPair.TITLE_3)
elif line_type == LineType.LINK:
attr = curses.color_pair(ColorPair.LINK)
elif line_type == LineType.PREFORMATTED:
attr = curses.color_pair(ColorPair.PREFORMATTED)
elif line_type == LineType.BLOCKQUOTE:
attr = curses.color_pair(ColorPair.BLOCKQUOTE) | curses.A_ITALIC
else: # includes LineType.PARAGRAPH
attr = curses.color_pair(ColorPair.NORMAL)
try: try:
window.addstr(line, attr) render_line(metaline, window, max_width)
except ValueError: except ValueError:
return new_dimensions return new_dimensions
if line_index < num_lines - 1: if line_index < num_lines - 1:
window.addstr("\n") window.addstr("\n")
return new_dimensions return new_dimensions
def render_line(metaline, window, max_width):
"""Write a single line to the window."""
meta, line = metaline
line_type = meta["type"]
attributes = get_base_line_attributes(line_type)
line = line[:max_width - 1]
window.addstr(line, attributes)
if meta["type"] == LineType.LINK and "url" in meta:
url_text = f' - {meta["url"]}'
attributes = (
curses.color_pair(ColorPair.LINK_PREVIEW)
| curses.A_DIM
| curses.A_ITALIC
)
window.addstr(url_text, attributes)
def get_base_line_attributes(line_type):
"""Return the base attributes for this line type.
Other attributes may be freely used later for this line type but this is
what is used at the start of most lines of the given type.
"""
if line_type == LineType.TITLE_1:
return curses.color_pair(ColorPair.TITLE_1) | curses.A_BOLD
elif line_type == LineType.TITLE_2:
return curses.color_pair(ColorPair.TITLE_2) | curses.A_BOLD
elif line_type == LineType.TITLE_3:
return curses.color_pair(ColorPair.TITLE_3)
elif line_type == LineType.LINK:
return curses.color_pair(ColorPair.LINK)
elif line_type == LineType.PREFORMATTED:
return curses.color_pair(ColorPair.PREFORMATTED)
elif line_type == LineType.BLOCKQUOTE:
return curses.color_pair(ColorPair.BLOCKQUOTE) | curses.A_ITALIC
else: # includes LineType.PARAGRAPH
return curses.color_pair(ColorPair.NORMAL)