refactoring
This commit is contained in:
parent
d0d0816d79
commit
d64e5539d4
@ -21,30 +21,43 @@ ALL_TODO_RE = re.compile(
|
|||||||
)
|
)
|
||||||
CHECKBOX_RE = re.compile(r"\s*-\s*\[([ x]?)\]\s*(.*)")
|
CHECKBOX_RE = re.compile(r"\s*-\s*\[([ x]?)\]\s*(.*)")
|
||||||
TAG_SPLIT_RE = re.compile(r"\{([^:]+):([^}]+)\}")
|
TAG_SPLIT_RE = re.compile(r"\{([^:]+):([^}]+)\}")
|
||||||
TODO_TODO_RE = re.compile(r"^(TODO):?\s*")
|
TODO_TODO_RE = re.compile(
|
||||||
|
r"""^
|
||||||
|
(?:\s*-\s*)?
|
||||||
|
(TODO|IDEA|DONE):? # label starts a line
|
||||||
|
""",
|
||||||
|
re.VERBOSE,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def parse_todo_tag(tag, val) -> tuple[str, str]:
|
def get_files(dirname):
|
||||||
"""
|
if not dirname:
|
||||||
return tag, style_override
|
dirname = "~/wiki/"
|
||||||
"""
|
p = pathlib.Path(dirname[0]).expanduser()
|
||||||
if tag == "by":
|
return p.rglob("*.md")
|
||||||
dval = parser.parse(val)
|
|
||||||
days_left = dval - now
|
|
||||||
style = "red" if days_left.days <= 0 else "yellow"
|
|
||||||
return f"by {dval.date()} ({days_left.days})", style
|
|
||||||
else:
|
|
||||||
return f"{tag}:{val}", ""
|
|
||||||
|
|
||||||
|
|
||||||
def scan_contents(file: pathlib.Path) -> dict:
|
def lod_table(data: list["TodoItem"]) -> Table | str:
|
||||||
text = file.read_text()
|
"""list of dicts to Table"""
|
||||||
words = text.split()
|
if not data:
|
||||||
return {"words": len(words), "todos": len(TODO_TODO_RE.findall(text))}
|
return "no results"
|
||||||
|
|
||||||
|
table = Table()
|
||||||
|
for key in data[0].fields():
|
||||||
|
table.add_column(key)
|
||||||
|
|
||||||
|
for row in data:
|
||||||
|
table.add_row(*row.to_row(), style=row.style)
|
||||||
|
|
||||||
|
return table
|
||||||
|
|
||||||
|
|
||||||
def render_checkbox(done: bool):
|
@click.group()
|
||||||
return "☑" if done else "☐"
|
def cli():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# todo listing #####
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@ -88,6 +101,23 @@ class TodoItem:
|
|||||||
return f" {done}/{total}"
|
return f" {done}/{total}"
|
||||||
|
|
||||||
|
|
||||||
|
def parse_todo_tag(tag, val) -> tuple[str, str]:
|
||||||
|
"""
|
||||||
|
return tag, style_override
|
||||||
|
"""
|
||||||
|
if tag == "by":
|
||||||
|
dval = parser.parse(val)
|
||||||
|
days_left = dval - now
|
||||||
|
style = "red" if days_left.days <= 0 else "yellow"
|
||||||
|
return f"by {dval.date()} ({days_left.days})", style
|
||||||
|
else:
|
||||||
|
return f"{tag}:{val}", ""
|
||||||
|
|
||||||
|
|
||||||
|
def render_checkbox(done: bool):
|
||||||
|
return "☑" if done else "☐"
|
||||||
|
|
||||||
|
|
||||||
def pull_todos(file: pathlib.Path):
|
def pull_todos(file: pathlib.Path):
|
||||||
text = file.read_text().splitlines()
|
text = file.read_text().splitlines()
|
||||||
active_todo = None
|
active_todo = None
|
||||||
@ -130,6 +160,44 @@ def pull_todos(file: pathlib.Path):
|
|||||||
yield active_todo
|
yield active_todo
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command()
|
||||||
|
@click.argument("dirname", nargs=-1)
|
||||||
|
def todos(dirname):
|
||||||
|
output = [] # list of data
|
||||||
|
for file in get_files(dirname):
|
||||||
|
output += pull_todos(file)
|
||||||
|
table = lod_table(output)
|
||||||
|
console.print(table)
|
||||||
|
|
||||||
|
|
||||||
|
# ls command #####
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class LsItem:
|
||||||
|
file: str
|
||||||
|
modified: datetime.datetime
|
||||||
|
words: str
|
||||||
|
todos: int
|
||||||
|
style: str
|
||||||
|
|
||||||
|
def fields(self):
|
||||||
|
return [
|
||||||
|
"file",
|
||||||
|
"modified",
|
||||||
|
"words",
|
||||||
|
"todos",
|
||||||
|
]
|
||||||
|
|
||||||
|
def to_row(self):
|
||||||
|
return [
|
||||||
|
self.file,
|
||||||
|
human_readable_date(self.modified),
|
||||||
|
str(self.words),
|
||||||
|
str(self.todos),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def human_readable_date(dt: datetime.datetime) -> str:
|
def human_readable_date(dt: datetime.datetime) -> str:
|
||||||
delta = now - dt
|
delta = now - dt
|
||||||
if delta < datetime.timedelta(hours=1):
|
if delta < datetime.timedelta(hours=1):
|
||||||
@ -140,41 +208,10 @@ 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[TodoItem]) -> Table | str:
|
def scan_contents(file: pathlib.Path) -> dict:
|
||||||
"""list of dicts to Table"""
|
text = file.read_text()
|
||||||
if not data:
|
words = text.split()
|
||||||
return "no results"
|
return {"words": len(words), "todos": len(TODO_TODO_RE.findall(text))}
|
||||||
|
|
||||||
table = Table()
|
|
||||||
for key in data[0].fields():
|
|
||||||
table.add_column(key)
|
|
||||||
|
|
||||||
for row in data:
|
|
||||||
table.add_row(*row.to_row(), style=row.style)
|
|
||||||
|
|
||||||
return table
|
|
||||||
|
|
||||||
|
|
||||||
@click.group()
|
|
||||||
def cli():
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def get_files(dirname):
|
|
||||||
if not dirname:
|
|
||||||
dirname = "~/wiki/"
|
|
||||||
p = pathlib.Path(dirname[0]).expanduser()
|
|
||||||
return p.rglob("*.md")
|
|
||||||
|
|
||||||
|
|
||||||
@cli.command()
|
|
||||||
@click.argument("dirname", nargs=-1)
|
|
||||||
def todos(dirname):
|
|
||||||
output = [] # list of data
|
|
||||||
for file in get_files(dirname):
|
|
||||||
output += pull_todos(file)
|
|
||||||
table = lod_table(output)
|
|
||||||
console.print(table)
|
|
||||||
|
|
||||||
|
|
||||||
@cli.command()
|
@cli.command()
|
||||||
@ -187,12 +224,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(
|
||||||
{
|
LsItem(
|
||||||
"file": file.name,
|
file=file.name,
|
||||||
"modified": human_readable_date(modified),
|
modified=modified,
|
||||||
|
style="yellow" if scan["todos"] else "white",
|
||||||
**scan,
|
**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