{% if section.description -%} {%- endif %} {#- SRI pins. A jsdelivr republish or npm account takeover would otherwise execute attacker-controlled JS/CSS in every reader's browser. Hashes computed per resource at pin time; regenerate with `openssl dgst -sha384` if you bump a version. -#} {#- Known reveal.js theme names. Anything else in [extra].reveal_theme is ignored at render time AND skipped at client-side swap. -#} {%- set known_themes = ["black", "white", "league", "beige", "night", "serif", "simple", "solarized", "blood", "moon", "dracula", "sky"] -%} {%- set default_theme = section.extra.reveal_theme | default(value='black') -%} {%- if default_theme not in known_themes -%}{%- set default_theme = "black" -%}{%- endif -%} {#- SRI per theme. Server-side lookup resolves `default_sri`; the same map is emitted as JS below so the client-side swap can set the right integrity before changing href. Regenerate with `openssl dgst -sha384` if you bump reveal.js. Tera has no dict literals so we keep this as an if-chain plus a hand-written JS map — both must stay in sync. -#} {%- if default_theme == "black" -%}{%- set default_sri = "sha384-rGf1FAL+Buyw4LpDboONln7P/UqlyCftbnLG8bC6nNAaW3LcuHtUg5t5KYY3U+L8" -%} {%- elif default_theme == "white" -%}{%- set default_sri = "sha384-/TZMdZeq0ZGi4iePTHhOMXOkyv2f72ZcwmhAtOmSZlPkx+5qCOfyc/U1kjd5Su6S" -%} {%- elif default_theme == "league" -%}{%- set default_sri = "sha384-TGjsKwPMycz86Iifg+w6QmLVOVn20sb7sI+eJWqAWKb/A4b2Gp4QHBmFuGs6pspc" -%} {%- elif default_theme == "beige" -%}{%- set default_sri = "sha384-rt6XN0bOEUE+uunPfkXDxJRCcGfZlXwt88npmRTw9RWNMTY7aXztsHNOm+gBCAaT" -%} {%- elif default_theme == "night" -%}{%- set default_sri = "sha384-Q9XI5NaX0hqK5y+JskI9jDNh8uHfYHD4uT8MI5rLL2TIoViEL2JvQMzyYQDRgPCP" -%} {%- elif default_theme == "serif" -%}{%- set default_sri = "sha384-eFbSgIKvgH02fkNrerwHS6PfnPIWVjqW8ASZVOQEpIW5PE9f/yk4MSII6KZge91O" -%} {%- elif default_theme == "simple" -%}{%- set default_sri = "sha384-v5nh2ExKPN2sC3ymxjQsE5HaZHtom6tg98CZHuAIDStnwTP3u6Sv0W9RRrjH5oOo" -%} {%- elif default_theme == "solarized" -%}{%- set default_sri = "sha384-llmy26dJQpqxYl2glG5JVQHBlLBGrfcp+x0to2MkIyogkd5InkyZ6U46F7bPFyBe" -%} {%- elif default_theme == "blood" -%}{%- set default_sri = "sha384-m2cEmb3mMoGtVvYrs1JddqDUDCTG25g7zTaQw3EK9ckkAhDk+Ec5XaLzoYGazhBv" -%} {%- elif default_theme == "moon" -%}{%- set default_sri = "sha384-eWZjS0sXChUT3FAnEu8uRlj4HnLp3fb1c/9FsG0VHOJwn0PaQUeoN+BSBUrUw5Iw" -%} {%- elif default_theme == "dracula" -%}{%- set default_sri = "sha384-xIpHe7yOfVP6P05c+JY1b6jSvEoUM1ZewibGWxXBh9/1R+OgC4R3ICNsh/vjGvuV" -%} {%- elif default_theme == "sky" -%}{%- set default_sri = "sha384-4D+nRiTQX2o4Kyn+c/HCSJJVLcy66CTnqLDyISKnyyqEMtWyg838lVnoQhiFc/Ph" -%} {%- endif -%} {#- Preload any per-slide theme referenced in [page.extra.reveal_theme] to avoid FOUC on swap. Preloads intentionally have no `integrity` — the integrity check happens when the stylesheet is *activated* on the main `` below, so an attacker-served preload payload gets discarded there. Keeping preloads SRI-free dodges the Tera no-dict-literal limitation without widening the attack surface. -#} {%- set_global preloaded = [default_theme] -%} {%- for page in section.pages -%} {%- set t = page.extra.reveal_theme | default(value="") -%} {%- if t and t in known_themes and t not in preloaded -%} {%- set_global preloaded = preloaded | concat(with=t) -%} {%- endif -%} {%- endfor %} {%- if config.extra.favicon %} {%- endif %}
{%- for page in section.pages %} {%- set page_theme = page.extra.reveal_theme | default(value="") -%} {%- if page_theme and page_theme not in known_themes -%}{%- set page_theme = "" -%}{%- endif -%} {#- `background_image` is interpolated by reveal.js into a CSS `url(...)` on a style property. Setting via `.style.backgroundImage` doesn't allow declaration injection (value is parsed for that property only), but we still strip paren/quote/semicolon to keep the emitted CSS clean and defensively block any future consumer that uses `cssText`. -#} {%- set bg_image = page.extra.background_image | default(value="") | replace(from=")", to="") | replace(from="(", to="") | replace(from=";", to="") | replace(from='"', to="") | replace(from="'", to="") -%}
{{ page.content | safe }}
{%- endfor %}