Source code for panvimwiki.catvimwiki

"""Concatenate Vimwiki diary files."""

import datetime
import fileinput
import os
from pathlib import Path

from dateutil.relativedelta import MO, TH, relativedelta


[docs] def get_last_thursday(today: datetime.date | None = None) -> datetime.date: """Return datetime for closest Thursday before today. Parameters ---------- today Any date object Returns ------- datetime.date Previous Thursday before today, unless today is Thursday. """ if today is None: today = datetime.date.today() return today + relativedelta(weekday=TH(-1))
[docs] def get_last_monday(today: datetime.date | None = None) -> datetime.date: """Return datetime for closest Monday before today. Parameters ---------- today Any date object Returns ------- datetime.date Previous Monday before today, unless today is Monday. """ if today is None: today = datetime.date.today() return today + relativedelta(weekday=MO(-1))
[docs] def catdiary( startdate: datetime.date, enddate: datetime.date, wikidiary: Path | None = None, ) -> Path: """Concatenate Vimwiki diary files. Assume diary wiki files are named using ISO date, e.g., `2021-06-09.wiki`. Parameters ---------- startdate Starting date for Vimwiki diary entry. enddate End date date for Vimwiki diary entry. wikidiary Path to Vimwiki diary directory. Defaults to `$HOME/vimwiki/diary`. Returns ------- pathlib.Path Path to concatenated Vimwiki diary entries from startdate to enddate, inclusive of both. Raises ------ ValueError If `startdate` is after `enddate` """ if wikidiary is None: wikidiary = Path.home() / "vimwiki/diary" if startdate > enddate: errmsg = f"enddate {enddate} should not precede startdate {startdate}." raise ValueError(errmsg) diaryin = sorted( day for day in wikidiary.glob("[0-9]*.wiki") if startdate <= datetime.date.fromisoformat(day.stem) <= enddate ) if not diaryin: raise OSError(f"Diary not found at {wikidiary=}") tmppath: str = os.getenv("TMP", os.getcwd()) diaryout: Path = Path(tmppath) / "prepm.wiki" with ( open(diaryout, "w", encoding="utf8") as fout, fileinput.input(files=diaryin, openhook=fileinput.hook_encoded("utf-8")) as fin, ): for line in fin: fout.write(line) return diaryout