Add fingerprinting and integrity checks to generated HTML

Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
2026-05-18 21:28:38 -07:00
parent 19550ef1b2
commit 0d1e2e80eb
4 changed files with 28 additions and 25 deletions

View File

@@ -1,2 +1,2 @@
<link rel="preload" href="{{ .url }}" as="style" onload="this.onload=null;this.rel='stylesheet'" {{ .extra | safeHTMLAttr }}> <link rel="preload" href="{{ .url }}" as="style" onload="this.onload=null;this.rel='stylesheet'"{{ with .integrity }} integrity="{{ . }}"{{ end }}{{ with .extra }} {{ . | safeHTMLAttr }}{{ end }}>
<noscript><link rel="stylesheet" href="{{ .url }}"></noscript> <noscript><link rel="stylesheet" href="{{ .url }}"{{ with .integrity }} integrity="{{ . }}"{{ end }}></noscript>

View File

@@ -14,8 +14,8 @@
<!-- Fonts --> <!-- Fonts -->
{{ if not (.Site.Params.noCss) }} {{ if not (.Site.Params.noCss) }}
{{ $fonts := resources.Get "scss/fonts.scss" | css.Sass | resources.Minify }} {{ $fonts := resources.Get "scss/fonts.scss" | css.Sass | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $fonts.Permalink }}" media="screen"> <link rel="stylesheet" href="{{ $fonts.Permalink }}" integrity="{{ $fonts.Data.Integrity }}" media="screen">
{{ end }} {{ end }}
<!-- External CSS (normalize and KaTeX --> <!-- External CSS (normalize and KaTeX -->
@@ -30,22 +30,25 @@
{{ end -}} {{ end -}}
<!-- In-house CSS --> <!-- In-house CSS -->
{{ $style := resources.Get "scss/style.scss" | css.Sass | resources.Minify }} {{ $style := resources.Get "scss/style.scss" | css.Sass | resources.Minify | resources.Fingerprint }}
{{ $sidenotes := resources.Get "scss/sidenotes.scss" | css.Sass | resources.Minify }} {{ $sidenotes := resources.Get "scss/sidenotes.scss" | css.Sass | resources.Minify | resources.Fingerprint }}
{{ $code := resources.Get "scss/code.scss" | css.Sass | resources.Minify }} {{ $code := resources.Get "scss/code.scss" | css.Sass | resources.Minify | resources.Fingerprint }}
{{ $icon := resources.Get "img/favicon.png" }} {{ $icon := resources.Get "img/favicon.png" | resources.Fingerprint }}
<style>.feather { display: inline !important; width: 10px; height: 10px; }</style> <style>.feather { display: inline !important; width: 10px; height: 10px; }</style>
<style>img { max-width: 70%; }</style> <style>img { max-width: 70%; }</style>
{{ if not (.Site.Params.noCss) }} {{ if not (.Site.Params.noCss) }}
<link rel="stylesheet" href="{{ $style.Permalink }}"> <link rel="stylesheet" href="{{ $style.Permalink }}" integrity="{{ $style.Data.Integrity }}">
{{ partial "defercss.html" (dict "url" $sidenotes.Permalink "extra" "") }} {{ partial "defercss.html" (dict "url" $sidenotes.Permalink "integrity" $sidenotes.Data.Integrity "extra" "") }}
{{ partial "defercss.html" (dict "url" $code.Permalink "extra" "") }} {{ partial "defercss.html" (dict "url" $code.Permalink "integrity" $code.Data.Integrity "extra" "") }}
{{ end }} {{ end }}
<link rel="icon" type="image/png" href="{{ $icon.Permalink }}"> <link rel="icon" type="image/png" href="{{ $icon.Permalink }}" integrity="{{ $icon.Data.Integrity }}">
{{ if .Params.custom_js }} {{ if .Params.custom_js }}
{{ range $customJs := .Params.custom_js }} {{ range $customJs := .Params.custom_js }}
<script src="{{ page.Resources.Get $customJs }}"></script> {{ with page.Resources.Get $customJs }}
{{ $customJsResource := . | resources.Fingerprint }}
<script src="{{ $customJsResource.Permalink }}" integrity="{{ $customJsResource.Data.Integrity }}"></script>
{{ end }}
{{ end }} {{ end }}
{{ end }} {{ end }}
@@ -66,14 +69,14 @@
<meta name="needs-latex"> <meta name="needs-latex">
<!-- Code to support the Bergamot JS widget --> <!-- Code to support the Bergamot JS widget -->
<script defer src="{{ .Site.Params.katexJsUrl }}" crossorigin="anonymous"></script> <script defer src="{{ .Site.Params.katexJsUrl }}" crossorigin="anonymous"></script>
{{ $katexComponentJs := resources.Get "js/katex-component.js" | resources.Minify }} {{ $katexComponentJs := resources.Get "js/katex-component.js" | resources.Minify | resources.Fingerprint }}
<script defer src="{{ $katexComponentJs.Permalink }}"></script> <script defer src="{{ $katexComponentJs.Permalink }}" integrity="{{ $katexComponentJs.Data.Integrity }}"></script>
<script defer src="{{ .Site.Params.bergamotJsUrl }}"></script> <script defer src="{{ .Site.Params.bergamotJsUrl }}"></script>
<script defer src="{{ .Site.Params.bergamotObjectLanguageJsUrl }}"></script> <script defer src="{{ .Site.Params.bergamotObjectLanguageJsUrl }}"></script>
{{ $bergamotHelpers := resources.Get "js/bergamot-helpers.js" | resources.Minify }} {{ $bergamotHelpers := resources.Get "js/bergamot-helpers.js" | resources.Minify | resources.Fingerprint }}
<script defer src="{{ $bergamotHelpers.Permalink }}"></script> <script defer src="{{ $bergamotHelpers.Permalink }}" integrity="{{ $bergamotHelpers.Data.Integrity }}"></script>
{{ $bergamotStyle := resources.Get "scss/bergamot.scss" | css.Sass | resources.Minify }} {{ $bergamotStyle := resources.Get "scss/bergamot.scss" | css.Sass | resources.Minify | resources.Fingerprint }}
{{ partial "defercss.html" (dict "url" $bergamotStyle.Permalink "extra" "") }} {{ partial "defercss.html" (dict "url" $bergamotStyle.Permalink "integrity" $bergamotStyle.Data.Integrity "extra" "") }}
{{ if .Params.bergamot.render_presets }} {{ if .Params.bergamot.render_presets }}
{{ range $name, $rulefile := .Params.bergamot.render_presets }} {{ range $name, $rulefile := .Params.bergamot.render_presets }}
{{ $file := default (resources.Get $rulefile) (page.Resources.Get $rulefile) }} {{ $file := default (resources.Get $rulefile) (page.Resources.Get $rulefile) }}

View File

@@ -2,8 +2,8 @@
<h2>{{ .Title }} </h2> <h2>{{ .Title }} </h2>
{{ .Content }} {{ .Content }}
{{ $search := resources.Get "scss/search.scss" | css.Sass | resources.Minify }} {{ $search := resources.Get "scss/search.scss" | css.Sass | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $search.Permalink }}" media="screen"> <link rel="stylesheet" href="{{ $search.Permalink }}" integrity="{{ $search.Data.Integrity }}" media="screen">
<div class="stork-wrapper"> <div class="stork-wrapper">
<div class="stork-input-wrapper"> <div class="stork-input-wrapper">

View File

@@ -4,13 +4,13 @@
<head> <head>
{{- partial "head.html" . -}} {{- partial "head.html" . -}}
{{ $writingcss := resources.Get "scss/writing.scss" | css.Sass | resources.Minify }} {{ $writingcss := resources.Get "scss/writing.scss" | css.Sass | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $writingcss.Permalink }}"> <link rel="stylesheet" href="{{ $writingcss.Permalink }}" integrity="{{ $writingcss.Data.Integrity }}">
{{ if .Params.custom_css }} {{ if .Params.custom_css }}
{{ range $customCss := .Params.custom_css }} {{ range $customCss := .Params.custom_css }}
{{ $renderedCustomCss := page.Resources.Get $customCss | css.Sass (dict "includePaths" (slice "themes/vanilla/assets/scss")) | resources.Minify }} {{ $renderedCustomCss := page.Resources.Get $customCss | css.Sass (dict "includePaths" (slice "themes/vanilla/assets/scss")) | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $renderedCustomCss.Permalink }}"> <link rel="stylesheet" href="{{ $renderedCustomCss.Permalink }}" integrity="{{ $renderedCustomCss.Data.Integrity }}">
{{ end }} {{ end }}
{{ end }} {{ end }}
</head> </head>