"""FlowDeck — Wiki-links & page mentions (v5.11.0). Inline references live inside plain-text block content as tokens:: [[fdpage:123]] link to page id 123, label resolved at render time [[fddate:2026-10-01]] date chip (static label) The page token stores only the id, so renaming a page propagates everywhere (the label is resolved through the DB / the titles endpoint at render time). Backlinks keep working because the server renderer emits ``/pages/`` anchors, and the backlink scanner also matches the raw token. Pure-stdlib helpers shared by the public renderer and the block export. """ from __future__ import annotations import html as _html import re WIKI_PAGE_RE = re.compile(r"\[\[fdpage:(\d+)\]\]") WIKI_DATE_RE = re.compile(r"\[\[fddate:(\d{4}-\d{2}-\d{2})(?:T[0-9:]{5,8})?\]\]") _DATE_LABELS = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun"} _MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] def extract_page_ids(text: str) -> list[int]: """All page ids referenced by wiki tokens in a content string.""" return sorted({int(m) for m in WIKI_PAGE_RE.findall(text or "")}) def _date_label(iso: str) -> str: try: parts = iso.split("-") y, m, d = int(parts[0]), int(parts[1]), int(parts[2]) import datetime as _dt wd = _dt.date(y, m, d).weekday() return f"{_DATE_LABELS[wd]} {d} {_MONTHS[m-1]} {y}" except (ValueError, IndexError): return iso def token_labels(conn, content: str) -> dict[str, str]: """Map every token in ``content`` to its display label (page title).""" out: dict[str, str] = {} ids = extract_page_ids(content) if ids: placeholders = ",".join("?" * len(ids)) rows = conn.execute( f"SELECT id, title, page_icon FROM pages WHERE id IN ({placeholders})", ids, ).fetchall() by_id = {str(r["id"]): (r["title"] or "Untitled", r["page_icon"] or "") for r in rows} for token_id in ids: title, icon = by_id.get(str(token_id), ("Deleted page", "")) out[f"[[fdpage:{token_id}]]"] = f"{icon + ' ' if icon else ''}{title}" for m in WIKI_DATE_RE.finditer(content or ""): iso = m.group(1) out[f"[[fddate:{iso}]]"] = _date_label(iso) return out def resolve_tokens_html(content: str, titles: dict[str, str]) -> str: """Escape plain-text content then turn wiki tokens into HTML chips/links. ``titles`` maps token → label (from :func:`token_labels`). Used by the public page renderer and any server-side HTML output of block content. """ s = _html.escape(content or "") def _page(m: re.Match) -> str: pid = m.group(1) label = titles.get(m.group(0)) or "Deleted page" return (f'{_html.escape(label)}') def _date(m: re.Match) -> str: iso = m.group(1) label = titles.get(f"[[fddate:{iso}]]") or iso return f'{_html.escape(label)}' s = WIKI_PAGE_RE.sub(_page, s) s = WIKI_DATE_RE.sub(_date, s) return s