Skip to content

Instantly share code, notes, and snippets.

@mruwek
Last active February 14, 2016 19:11
Show Gist options
  • Save mruwek/260a369ed5c91fd0f913 to your computer and use it in GitHub Desktop.
Save mruwek/260a369ed5c91fd0f913 to your computer and use it in GitHub Desktop.
Prototype of urwid coloring approach in topydo
import re
import urwid
from string import ascii_uppercase
from topydo.lib.Color import Color
from topydo.lib.Config import config
from topydo.ui.TodoWidget import _to_urwid_color
if config().colors():
project_color = _to_urwid_color(config().project_color())
context_color = _to_urwid_color(config().context_color())
metadata_color = _to_urwid_color(config().metadata_color())
link_color = _to_urwid_color(config().link_color())
neutral_color = _to_urwid_color(Color('NEUTRAL'))
PRJ_CON_PATTERN = r'\B(?:\+|@)(?:\S*\w)'
TAG_PATTERN = r'\b\S+:[^/\s]\S*\b'
URL_PATTERN = r'(?:^|\s)(?:\w+:){1}(?://\S+)'
todo_item = '(A) Tomorrow is +yet @another busy:day http://at.work lol'
pattern = r'|'.join([PRJ_CON_PATTERN, TAG_PATTERN, URL_PATTERN])
pattern = r'(' + pattern + r')'
palette = [
('project_color', 'default', 'default', 'default', project_color, 'default'),
('context_color', 'default', 'default', 'default', context_color, 'default'),
('metadata_color', 'default', 'default', 'default', metadata_color, 'default'),
('link_color', 'default', 'default', 'default', link_color, 'default'),
]
for C in ascii_uppercase:
pri_color = _to_urwid_color(config().priority_color(C))
palette.append((
'pri_' + C, 'default', 'default', 'default', pri_color, 'default'
))
splitted = re.split(pattern, todo_item)
markup = []
for substring in splitted:
if not substring:
continue
if re.match(TAG_PATTERN, substring):
markup.append(('metadata_color', substring))
elif re.match(URL_PATTERN, substring):
markup.append(('link_color', substring))
elif re.match(PRJ_CON_PATTERN, substring):
if substring.startswith('+'):
markup.append(('project_color', substring))
else:
markup.append(('context_color', substring))
else:
markup.append(substring)
txt = urwid.AttrMap(urwid.Text(markup), 'pri_A')
fill = urwid.Filler(txt, 'top')
screen = urwid.raw_display.Screen()
loop = urwid.MainLoop(fill, screen=screen)
screen.register_palette(palette)
screen.set_terminal_properties(256)
loop.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment