36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
"""Slug helpers for archive dir and branch filenames."""
|
|
from __future__ import annotations
|
|
import re
|
|
|
|
_MENTION: re.Pattern[str] = re.compile(r"^(@[A-Za-z0-9_]+(\s+|$))+")
|
|
_APOS: re.Pattern[str] = re.compile(r"['\u2019\u2018]")
|
|
_NON_SLUG: re.Pattern[str] = re.compile(r"[^a-z0-9]+")
|
|
|
|
def date_prefix(timestamp: str) -> str:
|
|
if len(timestamp) >= 10 and timestamp[4] == "-" and timestamp[7] == "-":
|
|
return timestamp[:10]
|
|
return "unknown-date"
|
|
|
|
def slugify(text: str, max_len: int = 50) -> str:
|
|
s = _MENTION.sub("", (text or "").strip()).lower()
|
|
s = _APOS.sub("", s)
|
|
s = _NON_SLUG.sub("-", s).strip("-")
|
|
if not s:
|
|
return "thread"
|
|
if len(s) <= max_len:
|
|
return s
|
|
cut = s[:max_len]
|
|
if cut.endswith("-"):
|
|
return cut.rstrip("-")
|
|
cut = cut.rstrip("-")
|
|
if "-" in cut:
|
|
cut = cut.rsplit("-", 1)[0]
|
|
return cut or s[:max_len]
|
|
|
|
def thread_dir_name(date: str, first_spine_line: str, override: str | None) -> str:
|
|
slug = override.strip() if override else slugify(first_spine_line)
|
|
return f"{date}-{slug}"
|
|
|
|
def branch_file_name(date: str, handle: str, first_line: str) -> str:
|
|
return f"{date}-{handle}-{slugify(first_line)}.md"
|