--- /dev/null
+#!/bin/python
+
+from glob import glob
+from os import path, get_terminal_size
+import orgparse
+from datetime import date
+
+# TODO: read org location from config
+org_glob = '~/org/**.org'
+org_todos = ['TODO', 'WAITING', 'NEXT']
+org_dones = ['DONE', 'CANCELLED']
+
+
+def org_is_archived(root):
+ return "ARCHIVE" in root.tags
+
+
+def org_is_overdue(node, end=None):
+ if not node.scheduled:
+ return False
+
+ if node.todo in org_dones:
+ return False
+
+ if node.closed:
+ return False
+
+ if end is None:
+ end = orgparse.date.OrgDate(date.today())
+
+ r = orgparse.date.OrgDate(0, end)
+ return node.scheduled.has_overlap(r)
+
+
+def org_is_scheduled(node: orgparse.node, start=None, end=None):
+ if not node.scheduled:
+ return False
+
+ if node.todo in org_dones:
+ return False
+
+ if start is None and end is None:
+ return True
+
+ if start is None:
+ start = orgparse.date.OrgDate(0)
+
+ if end is None:
+ end = start
+
+ r = orgparse.date.OrgDate(start, end)
+ return node.scheduled.has_overlap(r)
+
+
+def format_tags(tags):
+ if not tags:
+ return ""
+ return "".join([":{}:".format(t) for t in tags])
+
+
+def print_node(node):
+ [f, _] = path.splitext(path.basename(n.env.filename))
+ [cols, rows] = get_terminal_size()
+ wf = 12
+ wh = min(50, cols - wf)
+ wt = cols - wf - wh
+ print("{:<{wf}}{:<{wh}}{:>{wt}}".format(f+":", "{} {}".format(n.todo, n.heading)[:wh], format_tags(n.tags),
+ wf=wf, wh=wh, wt=wt))
+
+
+nodes_today = []
+nodes_overdue = []
+nodes_done_today = []
+#TODO nodes_deadline
+for org_file in glob(path.expanduser(org_glob)):
+ with open(org_file) as f:
+ env = orgparse.node.OrgEnv(todos=org_todos, dones=org_dones, filename=org_file)
+ root = orgparse.load(f, env=env)
+ # print(root.env.all_todo_keys)
+ for node in root[1:]:
+ if org_is_archived(node):
+ continue
+ if org_is_overdue(node, date.today()):
+ nodes_overdue.append(node)
+ elif org_is_scheduled(node, date.today()):
+ nodes_today.append(node)
+
+for n in nodes_overdue:
+ print_node(n)
+for n in nodes_today:
+ print_node(n)