initial commit
This commit is contained in:
commit
87a5d4be65
|
|
@ -0,0 +1,2 @@
|
|||
__pycache__
|
||||
*.pyc
|
||||
|
|
@ -0,0 +1 @@
|
|||
../todo
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/python3
|
||||
from mini_todo import todo
|
||||
|
||||
todo.main()
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
from datetime import datetime
|
||||
import subprocess
|
||||
import logging
|
||||
import configparser
|
||||
import os
|
||||
import re
|
||||
|
||||
_DATE_FORMAT = "%Y-%m-%d"
|
||||
_SECTIONS = ["TODAY", "WEEK", "MONTH", "ANYTIME"]
|
||||
_SECTION_HEADING = "##"
|
||||
_MARKERS_COMPLETED = ["X", "[X]"]
|
||||
_MARKERS_TASK = ["*", "-", "[]", "[ ]"]
|
||||
|
||||
|
||||
def loadConfig() -> dict:
|
||||
cfg_locations = [
|
||||
"~/todo/.todo.cfg",
|
||||
"~/.todo.cfg",
|
||||
os.path.join(os.path.dirname(__file__), "../todo.cfg"),
|
||||
]
|
||||
for cfg_file in cfg_locations:
|
||||
cfg_file = os.path.expanduser(cfg_file)
|
||||
if os.path.exists(cfg_file) and os.path.isfile(cfg_file):
|
||||
break
|
||||
|
||||
config = configparser.ConfigParser()
|
||||
print(cfg_file)
|
||||
config.read(cfg_file)
|
||||
if cfg_file == cfg_locations[-1]:
|
||||
default_location = os.path.expanduser(cfg_locations[0])
|
||||
config_dir = os.path.dirname(default_location)
|
||||
|
||||
if not os.path.exists(config_dir):
|
||||
os.makedirs(config_dir)
|
||||
with open(default_location, "w") as f:
|
||||
config.write(f)
|
||||
|
||||
paths = ["root_dir"]
|
||||
props = paths + ["editor"]
|
||||
cfg = {}
|
||||
for prop in props:
|
||||
cfg[prop] = config["DEFAULT"][prop]
|
||||
for path in paths:
|
||||
cfg[path] = os.path.expanduser(cfg[path])
|
||||
|
||||
return cfg
|
||||
|
||||
|
||||
def parse_note(note_f: str, line_matcher: re.Pattern) -> dict:
|
||||
print(note_f)
|
||||
todo = {}
|
||||
with open(note_f) as note:
|
||||
curr_section = None
|
||||
for line in note:
|
||||
m = line_matcher.match(line)
|
||||
if not m:
|
||||
continue
|
||||
if m.group(1):
|
||||
section = m.group(4)
|
||||
todo[section] = []
|
||||
curr_section = section
|
||||
continue
|
||||
else:
|
||||
if m.group(2) and curr_section:
|
||||
todo[curr_section].append(m.group(4))
|
||||
return todo
|
||||
|
||||
|
||||
def write_notes(fname: str, date: datetime, yesterdays_notes: dict):
|
||||
with open(fname, "w") as fout:
|
||||
fout.write(f"# Daily Tasks {date.strftime(_DATE_FORMAT)}\n")
|
||||
for section in _SECTIONS:
|
||||
fout.write(f"\n{_SECTION_HEADING} {section}\n\n")
|
||||
notes = yesterdays_notes.get(section)
|
||||
if not notes:
|
||||
continue
|
||||
for note in notes:
|
||||
if note:
|
||||
fout.write(f" {_MARKERS_TASK[0]} {note}\n")
|
||||
|
||||
|
||||
def main():
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
cfg = loadConfig()
|
||||
today = datetime.strptime(datetime.now().strftime(_DATE_FORMAT), _DATE_FORMAT)
|
||||
logging.info(cfg)
|
||||
editor = cfg["editor"]
|
||||
|
||||
root_dir = os.path.expanduser(cfg["root_dir"])
|
||||
if not os.path.exists(root_dir):
|
||||
os.makedirs(root_dir)
|
||||
todays_notes = f"daily_tracker_{today.strftime(_DATE_FORMAT)}.md"
|
||||
todays_notes = os.path.join(root_dir, todays_notes)
|
||||
if not os.path.exists(os.path.join(root_dir, todays_notes)):
|
||||
todo_marker_groups = "|".join([f"(?:{m})" for m in _MARKERS_TASK]).replace(
|
||||
"*", r"\*"
|
||||
)
|
||||
comp_marker_groups = "|".join([f"(?:{m})" for m in _MARKERS_COMPLETED]).replace(
|
||||
"*", r"\*"
|
||||
)
|
||||
line_regex = re.compile(
|
||||
rf"^\s*({_SECTION_HEADING})?({todo_marker_groups})?({comp_marker_groups})?\s*(\S+)$".replace(
|
||||
"[", "\["
|
||||
).replace(
|
||||
"]", "\]"
|
||||
)
|
||||
)
|
||||
print(line_regex)
|
||||
|
||||
files = os.listdir(root_dir)
|
||||
print(files)
|
||||
file_matcher = re.compile(".*(\d{4}-\d{2}-\d{2}).md")
|
||||
previous_notes = {}
|
||||
for file in files:
|
||||
m = file_matcher.match(file)
|
||||
if m:
|
||||
date = datetime.strptime(m.group(1), _DATE_FORMAT)
|
||||
previous_notes[date] = file
|
||||
last_note = previous_notes[max(list(previous_notes.keys()))]
|
||||
last_note = os.path.join(root_dir, last_note)
|
||||
last_note_content = parse_note(last_note, line_regex)
|
||||
write_notes(todays_notes, today, last_note_content)
|
||||
|
||||
subprocess.call([editor, todays_notes])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Reference in New Issue