color
This commit is contained in:
parent
dad14b9c6e
commit
2d5b0d7482
@ -13,16 +13,20 @@ ALL_TODO_RE = re.compile(r"^(TODO|IDEA|DONE):?\s*([^\{\n]+)(\{.*\})?", re.MULTIL
|
|||||||
TODO_TODO_RE = re.compile(r"(TODO):?\s*")
|
TODO_TODO_RE = re.compile(r"(TODO):?\s*")
|
||||||
|
|
||||||
|
|
||||||
def parse_todo_tag(tag):
|
def parse_todo_tag(tag) -> tuple[str, str]:
|
||||||
|
"""
|
||||||
|
return tag, style_override
|
||||||
|
"""
|
||||||
if not tag:
|
if not tag:
|
||||||
return ""
|
return "", ""
|
||||||
name, val = tag.strip("{}").split(":", 1)
|
name, val = tag.strip("{}").split(":", 1)
|
||||||
if name == "by":
|
if name == "by":
|
||||||
dval = parser.parse(val)
|
dval = parser.parse(val)
|
||||||
days_left = dval - now
|
days_left = dval - now
|
||||||
return f"by {dval.date()} ({days_left.days})"
|
style = "red" if days_left.days <= 0 else ""
|
||||||
|
return f"by {dval.date()} ({days_left.days})", style
|
||||||
else:
|
else:
|
||||||
return f"{name}:{val}"
|
return f"{name}:{val}", ""
|
||||||
|
|
||||||
|
|
||||||
def scan_contents(file: pathlib.Path) -> dict:
|
def scan_contents(file: pathlib.Path) -> dict:
|
||||||
@ -35,11 +39,14 @@ def pull_todos(file: pathlib.Path):
|
|||||||
text = file.read_text()
|
text = file.read_text()
|
||||||
todos = ALL_TODO_RE.findall(text)
|
todos = ALL_TODO_RE.findall(text)
|
||||||
for t in todos:
|
for t in todos:
|
||||||
|
style = {"TODO": "yellow", "DONE": "#999999"}[t[0]]
|
||||||
|
tags, style_override = parse_todo_tag(t[2])
|
||||||
yield {
|
yield {
|
||||||
"file": file.name,
|
"file": file.name,
|
||||||
"status": t[0],
|
"status": t[0],
|
||||||
"description": t[1],
|
"description": t[1],
|
||||||
"tags": parse_todo_tag(t[2]),
|
"tags": tags,
|
||||||
|
"style": style_override or style,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -53,17 +60,19 @@ def human_readable_date(dt: datetime.datetime) -> str:
|
|||||||
return f"{int(delta.total_seconds() / 3600 / 24)}d ago"
|
return f"{int(delta.total_seconds() / 3600 / 24)}d ago"
|
||||||
|
|
||||||
|
|
||||||
def lod_table(data: list[dict]) -> Table:
|
def lod_table(data: list[dict]) -> Table | str:
|
||||||
"""list of dicts to Table"""
|
"""list of dicts to Table"""
|
||||||
if not data:
|
if not data:
|
||||||
return "no results"
|
return "no results"
|
||||||
|
|
||||||
table = Table()
|
table = Table()
|
||||||
for key in data[0].keys():
|
for key in data[0].keys():
|
||||||
table.add_column(key)
|
if key != "style":
|
||||||
|
table.add_column(key)
|
||||||
|
|
||||||
for row in data:
|
for row in data:
|
||||||
table.add_row(*(str(x) for x in row.values()))
|
style = row.pop("style", None)
|
||||||
|
table.add_row(*(str(x) for x in row.values()), style=style)
|
||||||
|
|
||||||
return table
|
return table
|
||||||
|
|
||||||
@ -100,7 +109,12 @@ def ls(dirname):
|
|||||||
modified = datetime.datetime.fromtimestamp(st.st_mtime)
|
modified = datetime.datetime.fromtimestamp(st.st_mtime)
|
||||||
scan = scan_contents(file)
|
scan = scan_contents(file)
|
||||||
output.append(
|
output.append(
|
||||||
{"file": file.name, "modified": human_readable_date(modified), **scan}
|
{
|
||||||
|
"file": file.name,
|
||||||
|
"modified": human_readable_date(modified),
|
||||||
|
**scan,
|
||||||
|
"style": "yellow" if scan["todos"] else "white",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
table = lod_table(output)
|
table = lod_table(output)
|
||||||
console.print(table)
|
console.print(table)
|
||||||
|
Loading…
Reference in New Issue
Block a user