diff --git a/bumblebee_status/modules/contrib/todo_org.py b/bumblebee_status/modules/contrib/todo_org.py new file mode 100644 index 0000000..05fa90b --- /dev/null +++ b/bumblebee_status/modules/contrib/todo_org.py @@ -0,0 +1,57 @@ +# pylint: disable=C0111,R0903 +"""Displays the number of todo items from an org-mode file +Parameters: + * todo_org.file: File to read TODOs from (defaults to ~/org/todo.org) + * todo_org.remaining: False by default. When true, will output the number of remaining todos instead of the number completed (i.e. 1/4 means 1 of 4 todos remaining, rather than 1 of 4 todos completed) +Based on the todo module by `codingo ` +""" + +import re +import os.path + +import core.module +import core.widget +import core.input +from util.format import asbool + +class Module(core.module.Module): + def __init__(self, config, theme): + super().__init__(config, theme, core.widget.Widget(self.output)) + + self.__todo_regex = re.compile("^\\s*\\*+\\s*TODO") + self.__done_regex = re.compile("^\\s*\\*+\\s*DONE") + + self.__doc = os.path.expanduser( + self.parameter("file", "~/org/todo.org") + ) + self.__remaining = asbool(self.parameter("remaining", "False")) + self.__todo, self.__total = self.count_items() + core.input.register( + self, + button=core.input.LEFT_MOUSE, + cmd="emacs {}".format(self.__doc) + ) + + def output(self, widget): + if self.__remaining: + return "TODO: {}/{}".format(self.__todo, self.__total) + return "TODO: {}/{}".format(self.__total-self.__todo, self.__total) + + def update(self): + self.__todo, self.__total = self.count_items() + + def count_items(self): + todo, total = 0, 0 + try: + with open(self.__doc, "r") as f: + for line in f: + if self.__todo_regex.match(line.upper()) is not None: + todo += 1 + total += 1 + elif self.__done_regex.match(line.upper()) is not None: + total += 1 + return todo, total + except OSError: + return -1, -1 + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4