Fix the footer leaking "wrapper. #}" from a broken Jinja comment (#211)

The note explaining the hidden digest form contained a literal "{# … #}" in its
prose. Jinja doesn't nest comments, so the inner "#}" closed the comment early and
the trailing "wrapper. #}" rendered as visible text at the top of every footer.

Reworded the note without comment delimiters. Adds a test asserting no base-
template page's footer contains a stray "{#"/"#}" (fails against the old template).

Claude-Session: https://claude.ai/code/session_013dRZmX9D3JEntfMKWMTWZ8
This commit is contained in:
Emi Griffith 2026-07-19 21:14:56 -07:00 committed by GitHub
parent 024613c06d
commit a5f90ad6e3
2 changed files with 14 additions and 2 deletions

View file

@ -72,8 +72,8 @@
<footer class="site-footer">
{# The compact digest signup is the site-wide footer pattern, not a
homepage-only surface every page is a possible entry point.
Hidden for now; restore by removing the surrounding {# … #} wrapper. #}
homepage-only surface: every page is a possible entry point.
Hidden for now; restore by uncommenting the form block below. #}
{#
<form class="digest-form digest-compact" method="post" action="{{ base }}/digest"
data-digest aria-labelledby="footer-digest-label">

View file

@ -197,6 +197,18 @@ def test_hub_glossary_about(client):
assert client.get(f"{B}/about").status_code == 200
def test_footer_has_no_leaked_jinja_comment(client):
# A comment whose prose contained a literal "#}" closed early and leaked
# "wrapper. #}" into the footer. Guard every base-template page against a
# stray Jinja comment delimiter reaching the rendered HTML.
import re
for path in (f"{B}/about", f"{B}/climate/{SLUG}", f"{B}/climate/{SLUG}/records"):
b = client.get(path).text
footer = re.search(r"<footer.*?</footer>", b, re.S)
assert footer, f"no footer on {path}"
assert "#}" not in footer.group(0) and "{#" not in footer.group(0), path
def test_title_name_is_short_and_unique():
# Titles lead with the bare city name so the payload ("… in July") survives
# SERP truncation — display_name()'s region+country is what pushed it off the