Patch <title> in index.html with sitename during build

mdcms build now writes the sitename from config.yml into the <title> tag
of index.html. WhatsApp, Slack, and other link-preview crawlers read the
static HTML without executing JavaScript, so the title must be correct in
the raw file. Previously it was blank (or "MD-CMS" in older templates).
This commit is contained in:
Claude 2026-05-19 08:31:47 +00:00
parent 269980ea28
commit ee3d4872a0
No known key found for this signature in database
2 changed files with 25 additions and 0 deletions

10
docs/unreleased.md Normal file
View file

@ -0,0 +1,10 @@
# Unreleased changes
Changes on `development` not yet merged to `main`.
## Fixes
- **`mdcms build` now patches `<title>` in `index.html` with `sitename` from `config.yml`.**
Previously the HTML `<title>` tag was a hardcoded blank (or "MD-CMS" in older templates),
so link previews in apps like WhatsApp showed the wrong name. After each build the tag
reflects the configured site name, which crawlers and preview scrapers read directly.

View file

@ -412,6 +412,19 @@ def validate_assets(site_path: Path, cfg: dict) -> list:
# ─── Core build logic ─────────────────────────────────────────
_TITLE_RE = re.compile(r"<title>[^<]*</title>")
def _patch_html_title(site_path: Path, sitename: str) -> None:
index = site_path / "index.html"
if not index.exists():
return
html = index.read_text(encoding="utf-8")
new_html = _TITLE_RE.sub(f"<title>{sitename}</title>", html, count=1)
if new_html != html:
index.write_text(new_html, encoding="utf-8")
def run_build(site_path: Path):
"""Scan pages/ and posts/, write nav.yml and search.json. Raises ClickException on failure."""
if not site_path.is_dir():
@ -491,6 +504,8 @@ def run_build(site_path: Path):
)
click.echo(f" Wrote search.json ({len(live_pages) + len(post_records)} entries)")
_patch_html_title(site_path, cfg.get("sitename", ""))
pwa_enabled = str(cfg.get("pwa", "no")).lower() in ("yes", "true")
if pwa_enabled:
generate_pwa(site_path, cfg)