feat(cms): U4 one-command site build + local preview
Add tools/build_site.py: runs the full pipeline in dependency order (build_content -> build_listings -> seo_inject --all --sitemap -> build_botlinks -> build_search_index), each as a subprocess so a failing step aborts the build before anything downstream runs (no partial deploy). --check verifies non-destructively; --images also runs optimize_images. This is what CI will run in U5. Fix a build_content idempotence bug found via U4: the hero and article-header regions were emitted with leading indentation while the regex left the template's pre-tag whitespace in place, so indentation compounded (+16 spaces) on every rebuild. First line is now unindented; the full build is verified idempotent (identical git tree across two runs). Added a fixpoint test (re-rendering a page's own output is byte-identical) so this can't regress. docs/local-preview.md: build + serve on :8000 in all three languages. tools/README.md: document build_site + build_content. 26 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
8ff968739a
commit
2d535db7d5
5 files changed
+175
-2
No files matched your search
@@ -118,7 +118,9 @@ def render_article_header(meta):
|
||||
f' <h1>{html_mod.escape(meta["title"])}</h1>']
|
||||
if meta.get("subtitle"):
|
||||
lines.append(f' <p class="article-subtitle">{html_mod.escape(meta["subtitle"])}</p>')
|
||||
return "\n".join(lines)
|
||||
# First line carries no indent: the template's pre-tag whitespace positions
|
||||
# it. Adding our own would compound on every rebuild (non-idempotent).
|
||||
return "\n".join(lines).lstrip()
|
||||
|
||||
|
||||
def render_hero(hero, css_class):
|
||||
@@ -138,7 +140,9 @@ def render_hero(hero, css_class):
|
||||
if hero.get("caption_html"):
|
||||
fig.append(f' <figcaption>{hero["caption_html"]}</figcaption>')
|
||||
fig.append(' </figure>')
|
||||
return "\n".join(fig)
|
||||
# First line unindented — the template's pre-tag whitespace positions it
|
||||
# (otherwise indentation compounds on every rebuild).
|
||||
return "\n".join(fig).lstrip()
|
||||
|
||||
|
||||
# ------------------------------------------------------------- page assembly
|
||||
|
||||
Reference in new issue
Block a user