from datetime import datetime from pathlib import Path import json def moment_to_strftime(format_string:str) -> str: replacements = [ ("YYYY", "%Y"), ("YY", "%y"), ("MMMM", "%B"), ("MMM", "%b"), ("MM", "%m"), ("DDDD", "%j"), ("DD", "%d"), ("dddd", "%A"), ("ddd", "%a"), ] converted = format_string or "YYYY-MM-DD" for moment_token, strftime_token in replacements: converted = converted.replace(moment_token, strftime_token) return converted def daily_note_path_for_vault(vault_root:Path, now:datetime|None = None) -> str: settings_path = vault_root / ".obsidian" / "daily-notes.json" folder = "" format_string = "YYYY-MM-DD" if settings_path.exists() and settings_path.is_file(): try: settings = json.loads(settings_path.read_text(encoding="utf-8")) if isinstance(settings, dict): folder_value = settings.get("folder") format_value = settings.get("format") if isinstance(folder_value, str): folder = folder_value.strip().strip("/") if isinstance(format_value, str) and format_value.strip(): format_string = format_value.strip() except (OSError, json.JSONDecodeError): pass note_name = (now or datetime.now()).strftime(moment_to_strftime(format_string)) if not note_name.endswith(".md"): note_name += ".md" return f"{folder}/{note_name}" if folder else note_name