diff --git a/README.md b/README.md
index 791abac9..337b6b92 100644
--- a/README.md
+++ b/README.md
@@ -208,9 +208,15 @@ paige:
yandex: # metrica.yandex.com
account_id: "123456"
bootstrap:
- icons_path: "my-assets/my-bootstrap-icons.css" # Use local Bootstrap icons
- scripts_path: "my-assets/my-bootstrap.bundle.min.js" # Use local Bootstrap scripts
- styles_path: "my-assets/my-bootstrap.min.css" # Use local Bootstrap styles
+ icons:
+ link_href: "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css" # Local or remote file
+ link_integrity: "sha384-b6lVK+yci+bfDmaY1u0zE8YYJt0TZxLEAFyYSLHId4xoVvsrQu3INevFKo+Xir8e" # File integrity hash
+ scripts:
+ script_integrity: "sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" # File integrity hash
+ script_src: "https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" # Local or remote file
+ styles:
+ link_href: "https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" # Local or remote file
+ link_integrity: "sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" # File integrity hash
color: "#123456" # Theme color for Safari and Windows
content_max_width: 66ch # Page table of contents and content max width
comments:
@@ -234,6 +240,16 @@ paige:
date_format: "2006 January 2" # Hugo date format for page dates
hide_theme_comment: true # Don't put a link to this project in a code comment
hide_theme_link: true # Don't put a link to this project in the footer
+ math:
+ autorender:
+ script_integrity: "sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05" # File integrity hash
+ script_src: "https://cdn.jsdelivr.net/npm/katex@0.16.3/dist/contrib/auto-render.min.js" # Local or remote file
+ scripts:
+ script_integrity: "sha384-97gW6UIJxnlKemYavrqDHSX3SiygeOwIZhwyOKRfSaf0JWKRVj9hLASHgFTzT+0O" # File integrity hash
+ script_src: "https://cdn.jsdelivr.net/npm/katex@0.16.3/dist/katex.min.js" # Local or remote file
+ styles:
+ link_href: "https://cdn.jsdelivr.net/npm/katex@0.16.3/dist/katex.min.css" # Local or remote file
+ link_integrity: "sha384-Juol1FqnotbkyZUT5Z7gUPjQ9gzlwCENvUZTpQBAPxtusdwFLRy382PSDx5UUJ4/" # File integrity hash
menu_style: "links" # Menu is link list for "links", tab list for "tabs", or pill list if unset
metadata_max_width: 100ch # Page metadata max width
rss:
diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html
index 7e857945..13d76db8 100644
--- a/layouts/_default/baseof.html
+++ b/layouts/_default/baseof.html
@@ -15,7 +15,7 @@
- {{ partial "paige/script" . }}
+ {{ partial "paige/scripts" . }}
{{ if templates.Exists "partials/paige-body-last.html" }}
{{ partial "paige/body-last" . }}
{{ end }}
diff --git a/layouts/partials/paige/head.html b/layouts/partials/paige/head.html
index 9ae6b039..7c7cf259 100644
--- a/layouts/partials/paige/head.html
+++ b/layouts/partials/paige/head.html
@@ -1,7 +1,7 @@
- {{ partial "paige/meta" . }}
+ {{ partial "paige/metas" . }}
{{ partial "paige/func-title" . }}
- {{ partial "paige/link" . }}
+ {{ partial "paige/links" . }}
{{ partial "paige/style" . }}
{{ if templates.Exists "partials/paige-head-last.html" }}
{{ partial "paige/head-last" . }}
diff --git a/layouts/partials/paige/link.html b/layouts/partials/paige/link.html
index 609a5e38..cdeed88c 100644
--- a/layouts/partials/paige/link.html
+++ b/layouts/partials/paige/link.html
@@ -1,37 +1,11 @@
-
-
-
-{{ if ne (relLangURL "favicon.ico") "/favicon.ico" }}
-
-{{ end }}
-
-
-
-
-{{ with .Site.Params.paige.bootstrap.styles_path }}
-{{ with resources.Get (relLangURL .) }}
-
-{{ else }}
-
-{{ end }}
-{{ else }}
-
-{{ end }}
-{{ with .Site.Params.paige.bootstrap.icons_path }}
-{{ with resources.Get (relLangURL .) }}
-
-{{ else }}
-
-{{ end }}
-{{ else }}
-
-{{ end }}
-{{ if or .Params.paige.math (and .Params.paige.show_full_pages (where .Pages "Params.paige.math" "eq" true)) }}
-
-{{ end }}
-{{ if .AlternativeOutputFormats }}
-{{ $title := partial "paige/func-title" . }}
-{{ range .AlternativeOutputFormats }}
-
-{{ end }}
-{{ end }}
+{{ $href := .href }}
+{{ $path := false }}
+{{ if eq $href (urls.Parse $href).Path }}
+ {{ $path = true }}
+ {{ with resources.Get (relLangURL $href) }}
+ {{ $href = (. | minify | fingerprint).RelPermalink }}
+ {{ else }}
+ {{ $href = relLangURL $href }}
+ {{ end }}
+{{ end }}
+
diff --git a/layouts/partials/paige/links.html b/layouts/partials/paige/links.html
new file mode 100644
index 00000000..c209f56d
--- /dev/null
+++ b/layouts/partials/paige/links.html
@@ -0,0 +1,30 @@
+
+
+
+{{ if ne (relLangURL "favicon.ico") "/favicon.ico" }}
+
+{{ end }}
+
+
+
+
+{{ partial "paige/link" (dict
+ "href" (.Site.Params.paige.bootstrap.styles.link_href | default "https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css")
+ "integrity" (.Site.Params.paige.bootstrap.styles.link_integrity | default "sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi")
+) }}
+{{ partial "paige/link" (dict
+ "href" (.Site.Params.paige.bootstrap.icons.link_href | default "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css")
+ "integrity" (.Site.Params.paige.bootstrap.icons.link_integrity | default "sha384-b6lVK+yci+bfDmaY1u0zE8YYJt0TZxLEAFyYSLHId4xoVvsrQu3INevFKo+Xir8e")
+) }}
+{{ if or .Params.paige.math (and .Params.paige.show_full_pages (where .Pages "Params.paige.math" "eq" true)) }}
+{{ partial "paige/link" (dict
+ "href" (.Site.Params.paige.math.styles.link_href | default "https://cdn.jsdelivr.net/npm/katex@0.16.3/dist/katex.min.css")
+ "integrity" (.Site.Params.paige.math.styles.link_integrity | default "sha384-Juol1FqnotbkyZUT5Z7gUPjQ9gzlwCENvUZTpQBAPxtusdwFLRy382PSDx5UUJ4/")
+) }}
+{{ end }}
+{{ if .AlternativeOutputFormats }}
+{{ $title := partial "paige/func-title" . }}
+{{ range .AlternativeOutputFormats }}
+
+{{ end }}
+{{ end }}
diff --git a/layouts/partials/paige/meta.html b/layouts/partials/paige/metas.html
similarity index 100%
rename from layouts/partials/paige/meta.html
rename to layouts/partials/paige/metas.html
diff --git a/layouts/partials/paige/script.html b/layouts/partials/paige/script.html
index de7495f2..0032f765 100644
--- a/layouts/partials/paige/script.html
+++ b/layouts/partials/paige/script.html
@@ -1,148 +1,11 @@
-
-
-{{ with .Site.Params.paige.bootstrap.scripts_path }}
-{{ with resources.Get (relLangURL .) }}
-
-{{ else }}
-
-{{ end }}
-{{ else }}
-
-{{ end }}
-{{ if or .Params.paige.math (and .Params.paige.show_full_pages (where .Pages "Params.paige.math" "eq" true)) }}
-
-
-{{ end }}
-{{ if .Site.GoogleAnalytics }}
-{{ template "_internal/google_analytics.html" . }}
-{{ end }}
-{{ with .Site.Params.paige.analytics.chartbeat }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.clicky }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.fathom }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.finteza }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.hotjar }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.matomo }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.mixpanel }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.plausible }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.woopra }}
-
-
-{{ end }}
-{{ with .Site.Params.paige.analytics.yandex }}
-
-
-{{ end }}
+{{ $path := false }}
+{{ $src := .src }}
+{{ if eq $src (urls.Parse $src).Path }}
+ {{ $path = true }}
+ {{ with resources.Get (relLangURL $src) }}
+ {{ $src = (. | minify | fingerprint).RelPermalink }}
+ {{ else }}
+ {{ $src = relLangURL $src }}
+ {{ end }}
+{{ end }}
+
diff --git a/layouts/partials/paige/scripts.html b/layouts/partials/paige/scripts.html
new file mode 100644
index 00000000..c442a670
--- /dev/null
+++ b/layouts/partials/paige/scripts.html
@@ -0,0 +1,150 @@
+
+
+{{ partial "paige/script" (dict
+ "integrity" (.Site.Params.paige.bootstrap.scripts.script_integrity | default "sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3")
+ "src" (.Site.Params.paige.bootstrap.scripts.script_src | default "https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js")
+) }}
+{{ if or .Params.paige.math (and .Params.paige.show_full_pages (where .Pages "Params.paige.math" "eq" true)) }}
+{{ partial "paige/script" (dict
+ "integrity" (.Site.Params.paige.math.scripts.script_integrity | default "sha384-97gW6UIJxnlKemYavrqDHSX3SiygeOwIZhwyOKRfSaf0JWKRVj9hLASHgFTzT+0O")
+ "src" (.Site.Params.paige.math.scripts.script_src | default "https://cdn.jsdelivr.net/npm/katex@0.16.3/dist/katex.min.js")
+) }}
+{{ partial "paige/script" (dict
+ "integrity" (.Site.Params.paige.math.autorender.script_integrity | default "sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05")
+ "onload" "renderMathInElement(document.body);"
+ "src" (.Site.Params.paige.math.autorender.script_src | default "https://cdn.jsdelivr.net/npm/katex@0.16.3/dist/contrib/auto-render.min.js")
+) }}
+{{ end }}
+{{ if .Site.GoogleAnalytics }}
+{{ template "_internal/google_analytics.html" . }}
+{{ end }}
+{{ with .Site.Params.paige.analytics.chartbeat }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.clicky }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.fathom }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.finteza }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.hotjar }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.matomo }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.mixpanel }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.plausible }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.woopra }}
+
+
+{{ end }}
+{{ with .Site.Params.paige.analytics.yandex }}
+
+
+{{ end }}