Merge pull request #2467 from ZhenShuo2021/fix/head

🐛 Fix(head): meta handling and conditional analytics loading
This commit is contained in:
Nuno C.
2025-10-07 23:14:09 +01:00
committed by GitHub
3 changed files with 152 additions and 162 deletions

View File

@@ -27,7 +27,7 @@
<div class="relative flex flex-col grow"> <div class="relative flex flex-col grow">
<main id="main-content" class="grow"> <main id="main-content" class="grow">
{{ block "main" . }}{{ end }} {{ block "main" . }}{{ end }}
{{ if and (site.Params.footer.showScrollToTop | default true) (gt .WordCount 1) }} {{ if and (site.Params.footer.showScrollToTop | default true) }}
{{- partial "scroll-to-top.html" . -}} {{- partial "scroll-to-top.html" . -}}
{{ end }} {{ end }}
</main> </main>

View File

@@ -1,12 +1,12 @@
{{ with site.Params.fathomAnalytics.site }} {{ if site.Params.fathomAnalytics.site }}
{{ partial "analytics/fathom.html" }} {{ partial "analytics/fathom.html" . }}
{{ end }} {{ end }}
{{ with site.Config.Services.GoogleAnalytics.ID }} {{ if site.Config.Services.GoogleAnalytics.ID }}
{{ partial "analytics/ga.html" }} {{ partial "analytics/ga.html" . }}
{{ end }} {{ end }}
{{ with site.Params.umamiAnalytics.websiteid }} {{ if site.Params.umamiAnalytics.websiteid }}
{{ partial "analytics/umami.html" }} {{ partial "analytics/umami.html" . }}
{{ end }} {{ end }}
{{ with site.Params.selineAnalytics.token }} {{ if site.Params.selineAnalytics.token }}
{{ partial "analytics/seline.html" }} {{ partial "analytics/seline.html" . }}
{{ end }} {{ end }}

View File

@@ -8,21 +8,21 @@
<meta name="theme-color"> <meta name="theme-color">
{{/* Title */}} {{/* Title */}}
{{ if .IsHome -}} {{ if .IsHome }}
<title>{{ .Site.Title | emojify }}</title> <title>{{ .Site.Title | emojify }}</title>
<meta name="title" content="{{ .Site.Title | emojify }}"> <meta name="title" content="{{ .Site.Title | emojify }}">
{{- else -}} {{ else }}
<title>{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}</title> <title>{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}</title>
<meta name="title" content="{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}"> <meta name="title" content="{{ .Title | emojify }} &middot; {{ .Site.Title | emojify }}">
{{- end }} {{ end }}
{{/* Metadata */}} {{/* Metadata */}}
{{ with (.Params.Summary | default .Params.Description) | default .Site.Params.description -}} {{ with (.Params.Summary | default .Params.Description) | default .Site.Params.description }}
<meta name="description" content="{{ . }}"> <meta name="description" content="{{ . }}">
{{- end }} {{ end }}
{{ with .Params.Tags | default .Site.Params.keywords -}} {{ with .Params.Tags | default .Site.Params.keywords }}
<meta name="keywords" content="{{ range . }}{{ . }},{{ end -}}"> <meta name="keywords" content="{{ range . }}{{ . }},{{ end }}">
{{- end }} {{ end }}
{{ with .Site.Params.robots }} {{ with .Site.Params.robots }}
<meta name="robots" content="{{ . }}"> <meta name="robots" content="{{ . }}">
{{ end }} {{ end }}
@@ -30,112 +30,51 @@
<meta name="robots" content="{{ . }}"> <meta name="robots" content="{{ . }}">
{{ end }} {{ end }}
<link rel="canonical" href="{{ .Permalink }}"> <link rel="canonical" href="{{ .Permalink }}">
{{ range .AlternativeOutputFormats -}} {{ range .AlternativeOutputFormats }}
{{ printf ` {{ printf `
<link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .RelPermalink ($.Site.Title | emojify) | <link rel="%s" type="%s" href="%s" title="%s" />` .Rel .MediaType.Type .RelPermalink ($.Site.Title | emojify) |
safeHTML safeHTML
}} }}
{{ end -}}
{{/* Asset bundles */}}
{{ $assets := newScratch }}
{{ $cssScheme := resources.Get (printf "css/schemes/%s.css" (.Site.Params.colorScheme | default "blowfish")) }}
{{ if not $cssScheme }}
{{ $cssScheme = resources.Get "css/schemes/blowfish.css" }}
{{ end }}
{{ $assets.Add "css" (slice $cssScheme) }}
{{ $cssMain := resources.Get "css/compiled/main.css" }}
{{ $assets.Add "css" (slice $cssMain) }}
{{ $cssCustom := resources.Get "css/custom.css" }}
{{ if $cssCustom }}
{{ $assets.Add "css" (slice $cssCustom) }}
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $cssZoom := resources.Get "lib/zoom/style.css" }}
{{ $assets.Add "css" (slice $cssZoom) }}
{{ end }}
{{ $bundleCSS := $assets.Get "css" | resources.Concat "css/main.bundle.css" | resources.Minify | resources.Fingerprint
(.Site.Params.fingerprintAlgorithm | default "sha512")
}}
<link
type="text/css"
rel="stylesheet"
href="{{ $bundleCSS.RelPermalink }}"
integrity="{{ $bundleCSS.Data.Integrity }}">
{{ $jsAppearance := resources.Get "js/appearance.js" }}
{{ $jsAppearance = $jsAppearance | resources.ExecuteAsTemplate "js/appearance.js" . | resources.Minify | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
<script
type="text/javascript"
src="{{ $jsAppearance.RelPermalink }}"
integrity="{{ $jsAppearance.Data.Integrity }}"></script>
{{ if site.Params.footer.showScrollToTop | default true }}
{{ $jsToTop := resources.Get "js/scroll-to-top.js" }}
{{ $assets.Add "js" (slice $jsToTop) }}
{{ end }}
{{ if .Site.Params.enableA11y | default false }}
{{ $jsA11y := resources.Get "js/a11y.js" }}
{{ $jsA11y = $jsA11y | resources.Minify | resources.Fingerprint (site.Params.fingerprintAlgorithm | default "sha512") }}
<script src="{{ $jsA11y.RelPermalink }}" integrity="{{ $jsA11y.Data.Integrity }}"></script>
{{ end }}
{{ $shouldIncludeZenMode := or (.Site.Params.enableA11y | default false) (.Params.showZenMode | default (.Site.Params.article.showZenMode | default false)) }}
{{ if and .IsPage $shouldIncludeZenMode }}
{{ $jsZenMode := resources.Get "js/zen-mode.js" }}
{{ $jsZenMode = $jsZenMode | resources.Minify | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
<script
type="text/javascript"
src="{{ $jsZenMode.RelPermalink }}"
integrity="{{ $jsZenMode.Data.Integrity }}"></script>
{{ end }}
{{ if site.Params.footer.showScrollToTop | default true }}
{{ $jsToTop := resources.Get "js/scroll-to-top.js" }}
{{ $assets.Add "js" (slice $jsToTop) }}
{{ end }}
{{ if .Site.Params.enableSearch | default false }}
{{ $jsFuse := resources.Get "lib/fuse/fuse.min.js" }}
{{ $jsSearch := resources.Get "js/search.js" }}
{{ $assets.Add "js" (slice $jsFuse $jsSearch) }}
{{ end }}
{{ if .Site.Params.enableCodeCopy | default false }}
{{ $jsCode := resources.Get "js/code.js" }}
{{ $assets.Add "js" (slice $jsCode) }}
{{ end }}
{{ if .Site.Params.rtl | default false }}
{{ $jsRTL := resources.Get "js/rtl.js" }}
{{ $assets.Add "js" (slice $jsRTL) }}
{{ end }}
{{ $jsMobileMenu := resources.Get "js/mobilemenu.js" }}
{{ $assets.Add "js" (slice $jsMobileMenu) }}
{{ $buttonLikes := resources.Get "js/button-likes.js" }}
{{ $assets.Add "js" (slice $buttonLikes) }}
{{ $katexRender := resources.Get "js/katex-render.js" }}
{{ $assets.Add "js" (slice $katexRender) }}
{{ if $assets.Get "js" }}
{{ $bundleJS := $assets.Get "js" | resources.Concat "js/main.bundle.js" | resources.Minify | resources.Fingerprint
(.Site.Params.fingerprintAlgorithm | default "sha512")
}}
<script
defer
type="text/javascript"
id="script-bundle"
src="{{ $bundleJS.RelPermalink }}"
integrity="{{ $bundleJS.Data.Integrity }}"
data-copy="{{ i18n "code.copy" }}"
data-copied="{{ i18n "code.copied" }}"></script>
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $zoomJS := resources.Get "lib/zoom/zoom.min.umd.js" | resources.Fingerprint (.Site.Params.fingerprintAlgorithm | default "sha512") }}
<script src="{{ $zoomJS.RelPermalink }}" integrity="{{ $zoomJS.Data.Integrity }}"></script>
{{ end }} {{ end }}
{{/* Icons */}} {{/* Me */}}
{{ if templates.Exists "partials/favicons.html" }} {{ with .Site.Params.Author.name }}
{{ partialCached "favicons.html" .Site }} <meta name="author" content="{{ . }}">
{{ else }} {{ end }}
<link rel="apple-touch-icon" sizes="180x180" href="{{ "apple-touch-icon.png" | relURL }}"> {{ with .Site.Params.Author.links }}
<link rel="icon" type="image/png" sizes="32x32" href="{{ "favicon-32x32.png" | relURL }}"> {{ range $links := . }}
<link rel="icon" type="image/png" sizes="16x16" href="{{ "favicon-16x16.png" | relURL }}"> {{ range $name, $url := $links }}
<link rel="manifest" href="{{ "site.webmanifest" | relURL }}"> {{ if not (strings.HasPrefix $url "mailto:") }}
<link href="{{ $url }}" rel="me">
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{/* Social */}}
{{ template "_internal/opengraph.html" . }}
{{ template "_internal/twitter_cards.html" . }}
{{/* Use defaultSocialImage if feature image does not exist */}}
{{ $featureImage := "" }}
{{ $pageImages := .Resources.ByType "image" }}
{{ range slice "*featured*" "*cover*" "*thumbnail*" }}
{{ if not $featureImage }}
{{ $featureImage = $pageImages.GetMatch . }}
{{ end }}
{{ end }}
{{ if not $featureImage }}
{{ with .Site.Params.defaultSocialImage }}
{{ $socialImage := "" }}
{{ if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") }}
{{ $socialImage = resources.GetRemote . }}
{{ else }}
{{ $socialImage = resources.Get . }}
{{ end }}
{{ with $socialImage }}
<meta name="twitter:image" content="{{ .RelPermalink | absURL }}">
<meta property="og:image" content="{{ .RelPermalink | absURL }}">
{{ end }}
{{ end }}
{{ end }} {{ end }}
{{/* Site Verification */}} {{/* Site Verification */}}
@@ -155,52 +94,101 @@
<meta name="fediverse:creator" content="{{ . }}"> <meta name="fediverse:creator" content="{{ . }}">
{{ end }} {{ end }}
{{/* Social */}} {{ $alg := .Site.Params.fingerprintAlgorithm | default "sha512" }}
{{ template "_internal/opengraph.html" . }}
{{ template "_internal/twitter_cards.html" . }}
{{- /* Main page always uses this; fallback elsewhere if no feature image */ -}} {{/* CSS */}}
{{- /* See https://gohugo.io/templates/embedded/#open-graph */ -}} {{ $cssResources := slice }}
{{- $images := .Resources.ByType "image" -}} {{ $schemeName := .Site.Params.colorScheme | default "blowfish" }}
{{- $socialImage := $images.GetMatch "*feature*" -}} {{ $cssScheme := resources.Get (printf "css/schemes/%s.css" $schemeName) | default (resources.Get "css/schemes/blowfish.css") }}
{{ $cssResources = $cssResources | append $cssScheme }}
{{ $cssResources = $cssResources | append (resources.Get "css/compiled/main.css") }}
{{ with resources.Get "css/custom.css" }}
{{ $cssResources = $cssResources | append . }}
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $cssResources = $cssResources | append (resources.Get "lib/zoom/style.css") }}
{{ end }}
{{ $bundleCSS := $cssResources | resources.Concat "css/main.bundle.css" | resources.Minify | resources.Fingerprint $alg }}
<link
type="text/css"
rel="stylesheet"
href="{{ $bundleCSS.RelPermalink }}"
integrity="{{ $bundleCSS.Data.Integrity }}">
{{- if not $socialImage -}} {{/* JS loaded immediately */}}
{{- with .Site.Params.defaultSocialImage -}} {{ $jsAppearance := resources.Get "js/appearance.js" | resources.ExecuteAsTemplate "js/appearance.js" . | resources.Minify | resources.Fingerprint $alg }}
{{- if or (strings.HasPrefix . "http:") (strings.HasPrefix . "https:") -}} <script
{{- $socialImage = resources.GetRemote . -}} type="text/javascript"
{{- else -}} src="{{ $jsAppearance.RelPermalink }}"
{{- $socialImage = resources.Get . -}} integrity="{{ $jsAppearance.Data.Integrity }}"></script>
{{- end -}} {{ $enableA11y := .Site.Params.enableA11y | default false }}
{{- end -}} {{ if $enableA11y }}
{{- end -}} {{ $jsA11y := resources.Get "js/a11y.js" | resources.Minify | resources.Fingerprint $alg }}
<script src="{{ $jsA11y.RelPermalink }}" integrity="{{ $jsA11y.Data.Integrity }}"></script>
{{ end }}
{{ $showZenMode := .Params.showZenMode | default (.Site.Params.article.showZenMode | default false) }}
{{ $shouldIncludeZenMode := or $enableA11y $showZenMode }}
{{ if and .IsPage $shouldIncludeZenMode }}
{{ $jsZenMode := resources.Get "js/zen-mode.js" | resources.Minify | resources.Fingerprint $alg }}
<script
type="text/javascript"
src="{{ $jsZenMode.RelPermalink }}"
integrity="{{ $jsZenMode.Data.Integrity }}"></script>
{{ end }}
{{ if not .Site.Params.disableImageZoom | default true }}
{{ $zoomJS := resources.Get "lib/zoom/zoom.min.umd.js" | resources.Fingerprint $alg }}
<script src="{{ $zoomJS.RelPermalink }}" integrity="{{ $zoomJS.Data.Integrity }}"></script>
{{ end }}
{{- with $socialImage -}} {{/* JS deferred */}}
<meta name="twitter:image" content="{{ .RelPermalink | absURL }}"> {{ $jsResources := slice }}
<meta property="og:image" content="{{ .RelPermalink | absURL }}"> {{ if site.Params.footer.showScrollToTop | default true }}
{{- end -}} {{ $jsResources = $jsResources | append (resources.Get "js/scroll-to-top.js") }}
{{ end }}
{{ if .Site.Params.enableSearch | default false }}
{{ $jsResources = $jsResources | append (resources.Get "lib/fuse/fuse.min.js") | append (resources.Get "js/search.js") }}
{{ end }}
{{ if .Site.Params.enableCodeCopy | default false }}
{{ $jsResources = $jsResources | append (resources.Get "js/code.js") }}
{{ end }}
{{ if .Site.Params.rtl | default false }}
{{ $jsResources = $jsResources | append (resources.Get "js/rtl.js") }}
{{ end }}
{{ $jsResources = $jsResources | append (resources.Get "js/mobilemenu.js") }}
{{ $jsResources = $jsResources | append (resources.Get "js/button-likes.js") }}
{{ $jsResources = $jsResources | append (resources.Get "js/katex-render.js") }}
{{ if $jsResources }}
{{ $bundleJS := $jsResources | resources.Concat "js/main.bundle.js" | resources.Minify | resources.Fingerprint $alg }}
<script
defer
type="text/javascript"
id="script-bundle"
src="{{ $bundleJS.RelPermalink }}"
integrity="{{ $bundleJS.Data.Integrity }}"
data-copy="{{ i18n "code.copy" }}"
data-copied="{{ i18n "code.copied" }}"></script>
{{ end }}
{{/* Conditional loaded resources */}}
{{ partial "vendor.html" . }}
{{/* Icons */}}
{{ if templates.Exists "partials/favicons.html" }}
{{ partialCached "favicons.html" .Site }}
{{ else }}
<link rel="apple-touch-icon" sizes="180x180" href="{{ "apple-touch-icon.png" | relURL }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ "favicon-32x32.png" | relURL }}">
<link rel="icon" type="image/png" sizes="16x16" href="{{ "favicon-16x16.png" | relURL }}">
<link rel="manifest" href="{{ "site.webmanifest" | relURL }}">
{{ end }}
{{/* Schema */}} {{/* Schema */}}
{{ partial "schema.html" . }} {{ partial "schema.html" . }}
{{/* Me */}}
{{ with .Site.Params.Author.name }}
<meta name="author" content="{{ . }}">
{{ end }}
{{ with .Site.Params.Author.links }}
{{ range $links := . }}
{{ range $name, $url := $links }}
{{ if not (strings.HasPrefix $url "mailto:") }}
<link href="{{ $url }}" rel="me">
{{ end }}
{{ end }}
{{ end }}
{{ end }}
{{/* Vendor */}}
{{ partial "vendor.html" . }}
{{/* Analytics */}} {{/* Analytics */}}
{{ partial "analytics/main.html" .Site }} {{ if hugo.IsProduction }}
{{ partial "analytics/main.html" . }}
{{ end }}
{{/* Extend head - eg. for custom analytics scripts, etc. */}} {{/* Extend head - eg. for custom analytics scripts, etc. */}}
{{ if templates.Exists "partials/extend-head.html" }} {{ if templates.Exists "partials/extend-head.html" }}
@@ -218,7 +206,7 @@
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-firestore.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-auth.js"></script> <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-auth.js"></script>
<script> <script>
const firebaseConfig = { const firebaseConfig = {
apiKey: {{ $.Site.Params.firebase.apiKey }}, apiKey: {{ $.Site.Params.firebase.apiKey }},
@@ -230,18 +218,20 @@
measurementId: {{ $.Site.Params.firebase.measurementId }} measurementId: {{ $.Site.Params.firebase.measurementId }}
}; };
var app = firebase.initializeApp(firebaseConfig); var app = firebase.initializeApp(firebaseConfig);
var db = firebase.firestore(); var db = firebase.firestore();
var auth = firebase.auth(); var auth = firebase.auth();
</script> </script>
{{ end }} {{ end }}
{{ end }} {{ end }}
{{/* Advertisement */}} {{/* Advertisement */}}
{{ with .Site.Params.advertisement.adsense }} {{ with .Site.Params.advertisement.adsense }}
<meta name="google-adsense-account" content="{{ . }}"> <meta name="google-adsense-account" content="{{ . }}">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={{ . }}" <script
crossorigin="anonymous"></script> async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client={{ . }}"
crossorigin="anonymous"></script>
{{ end }} {{ end }}
</head> </head>