quartz/layouts/partials/head.html
2022-09-18 18:12:41 -04:00

233 lines
10 KiB
HTML

<!-- set data/config yaml file based on website language -->
{{ $config := cond (eq $.Site.Language.Lang "en") "config" (printf "config.%s" $.Site.Language.Lang) }}
{{ $data := index $.Site.Data $config }}
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-N38HWMV');</script>
<!-- End Google Tag Manager -->
<!-- Meta tags -->
<meta charset="UTF-8">
<title>{{ if and (.Title) (not .IsHome) }}{{ .Title }} | {{ $.Site.Data.config.page_title }}{{ else }}{{ $.Site.Data.config.page_title }} | {{ $.Site.Data.config.tagline }}{{ end }}</title>
<meta name="author" content="Matthew Wong">
<meta name="description" content="{{if .IsHome}}{{$.Site.Data.config.description}}{{else}}{{if .Description}}{{.Description}}{{else}}{{.Summary}}{{end}}{{end}}">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:title" content="{{ $.Site.Data.config.page_title }}">
<meta name="og:description" content="{{if .IsHome}}{{$.Site.Data.config.description}}{{else}}{{if .Description}}{{.Description}}{{else}}{{.Summary}}{{end}}{{end}}">
<meta property="og:image" content="{{$.Site.BaseURL}}icon.png">
<meta property="og:locale" content="en_US">
<meta property="og:site_name" content="{{ $.Site.Data.config.page_title }}">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ .Site.Params.hostName }}{{ .Permalink | absURL }}">
<meta name="twitter:card" content="summary">
<meta property="twitter:title" content="{{if .Title}}{{.Title}}{{else}}{{ $.Site.Data.config.page_title }}{{end}}">
<meta name="twitter:description" content="{{if .IsHome}}{{$.Site.Data.config.description}}{{else}}{{if .Description}}{{.Description}}{{else}}{{.Summary}}{{end}}{{end}}">
<meta property="twitter:image" content="{{$.Site.BaseURL}}icon.png">
<link rel="shortcut icon" type="image/png" href="{{$.Site.BaseURL}}icon.png" />
<!-- HTML Favicon -->
{{ $favicon := $data.favicon | default $.Site.Data.config.favicon | default (slice (dict "rel" "shortcut icon" "type" "image/png" "href" "icon.png")) }}
{{ $type := (printf "%T" $favicon) }}
{{ if eq $type "string" }}
{{ $favicon | safeHTML }}
{{ else }}
{{ range $favicon }}
<link rel="{{.rel}}" {{if .type}}type="{{.type}}"{{end}} {{if .sizes}}sizes="{{.sizes}}"{{end}} href="{{$.Site.BaseURL}}/{{.href}}" />
{{- end }}
{{ end }}
<!-- CSS Stylesheets and Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&family=Source+Sans+Pro:wght@400;600;700&family=Fira+Code:wght@400;700&display=swap" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
{{$sass := resources.Match "styles/[!_]*.scss" }}
{{$css := slice }}
{{range $sass}}
{{$scss := . | resources.ToCSS (dict "outputStyle" "compressed") }}
{{$css = $css | append $scss}}
{{end}}
{{if $data.enableCallouts | default $.Site.Data.config.enableCallouts}}
{{$scss := resources.Get "styles/_callouts.scss" | resources.ToCSS (dict "outputStyle" "compressed") }}
{{$css = $css | append $scss}}
{{end}}
{{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | resources.Minify }}
<link href="{{$finalCss.Permalink}}" rel="stylesheet" />
{{$lightSyntax := resources.Get "styles/_light_syntax.scss" | resources.ToCSS (dict "outputStyle" "compressed") | resources.Fingerprint "md5" | resources.Minify }}
<link href="{{$lightSyntax.Permalink}}" rel="stylesheet" id="theme-link">
<!-- Base scripts -->
{{$scripts := (slice "js/darkmode.js" "js/util.js")}}
{{range $scripts}}
{{$scriptname := .}}
{{ $s := resources.Get $scriptname | resources.ExecuteAsTemplate $scriptname . | resources.Fingerprint "md5" | resources.Minify }}
<script src="{{$s.Permalink}}"></script>
{{end}}
{{partial "katex.html" .}}
<script src="https://unpkg.com/@floating-ui/core@0.7.3"></script>
<script src="https://unpkg.com/@floating-ui/dom@0.5.4"></script>
{{ $popover := resources.Get "js/popover.js" | resources.Fingerprint "md5" |
resources.Minify }}
<script src="{{$popover.Permalink}}"></script>
<!-- Optional scripts -->
{{ if $data.enableCodeBlockTitle | default $.Site.Data.config.enableCallouts }}
{{ $codeTitle := resources.Get "js/code-title.js" | resources.Fingerprint "md5" | resources.Minify }}
<script src="{{$codeTitle.Permalink}}"></script>
{{end}}
{{ if $data.enableCodeBlockCopy | default $.Site.Data.config.enableCodeBlockCopy }}
{{ $clipboard := resources.Get "js/clipboard.js" | resources.Fingerprint "md5" | resources.Minify }}
<script src="{{$clipboard.Permalink}}"></script>
{{ end }}
{{ if $data.enableCallouts | default $.Site.Data.config.enableCallouts }}
{{ $callouts := resources.Get "js/callouts.js" | resources.Fingerprint "md5" | resources.Minify }}
<script src="{{$callouts.Permalink}}"></script>
{{ end }}
<!-- Preload page vars -->
{{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint
"md5" | resources.Minify | }} {{$contentIndex := resources.Get
"indices/contentIndex.json" | resources.Fingerprint "md5" | resources.Minify
}}
<script>
const BASE_URL = {{.Site.BaseURL}}
const fetchData = Promise.all([
fetch("{{ $linkIndex.Permalink }}")
.then(data => data.json())
.then(data => ({
index: data.index,
links: data.links,
})),
fetch("{{ $contentIndex.Permalink }}")
.then(data => data.json()),
])
.then(([{index, links}, content]) => ({
index,
links,
content,
}))
const render = () => {
// NOTE: everything within this callback will be executed for every page navigation. This is a good place to put JavaScript that loads or modifies data on the page, adds event listeners, etc. If you are only dealing with basic DOM replacement, use the init function
const siteBaseURL = new URL(BASE_URL);
const pathBase = siteBaseURL.pathname;
const pathWindow = window.location.pathname;
const isHome = pathBase == pathWindow;
{{if $data.enableCodeBlockCopy | default $.Site.Data.config.enableCodeBlockCopy -}}
addCopyButtons();
{{ end }}
{{if $data.enableSPA | default $.Site.Data.config.enableSPA -}}
addTitleToCodeBlocks();
{{ end }}
{{if $data.enableCallouts | default $.Site.Data.config.enableCallouts -}}
addCollapsibleCallouts();
{{ end }}
{{if $data.enableLinkPreview | default $.Site.Data.config.enableLinkPreview}}
initPopover(
{{strings.TrimRight "/" .Site.BaseURL }},
{{$data.enableContextualBacklinks | default $.Site.Data.config.enableContextualBacklinks}},
{{$data.enableLatex | default $.Site.Data.config.enableLatex}}
)
{{end}}
{{if $data.enableFooter | default $.Site.Data.config.enableFooter}}
const footer = document.getElementById("footer")
if (footer) {
const container = document.getElementById("graph-container")
// retry if the graph is not ready
if (!container) return requestAnimationFrame(render)
// clear the graph in case there is anything within it
container.textContent = ""
const drawGlobal = isHome && {{$.Site.Data.graphConfig.enableGlobalGraph}};
drawGraph(
{{strings.TrimRight "/" .Site.BaseURL}},
drawGlobal,
{{$.Site.Data.graphConfig.paths}},
drawGlobal ? {{$.Site.Data.graphConfig.globalGraph}} : {{$.Site.Data.graphConfig.localGraph}}
);
}
{{end}}
}
const init = (doc = document) => {
// NOTE: everything within this callback will be executed for initial page navigation. This is a good place to put JavaScript that only replaces DOM nodes.
{{if $data.enableCodeBlockCopy | default $.Site.Data.config.enableCodeBlockCopy -}}
addCopyButtons();
{{ end }}
{{if $data.enableCodeBlockTitle | default $.Site.Data.config.enableCodeBlockTitle -}}
addTitleToCodeBlocks();
{{- end -}}
{{if $data.enableLatex | default $.Site.Data.config.enableLatex}}
renderMathInElement(doc.body, {
delimiters: [
{left: '$$', right: '$$', display: true},
{left: '$', right: '$', display: false},
],
throwOnError : false
});
{{end}}
};
</script>
{{if $data.enableSPA | default $.Site.Data.config.enableSPA}}
{{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" |
resources.Minify }}
<script type="module">
import { attachSPARouting } from "{{$router.Permalink}}"
attachSPARouting(init, render)
</script>
{{else}}
<script>
window.Million = {
navigate: (url) => (window.location.href = url),
prefetch: () => {},
}
window.addEventListener("DOMContentLoaded", () => {
init()
render()
})
</script>
{{end}}
<!-- Meta Pixel Code -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '665534241214885');
fbq('track', 'PageView');
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=665534241214885&ev=PageView&noscript=1"
/></noscript>
<!-- End Meta Pixel Code -->
</head>
{{ template "_internal/google_analytics.html" . }}
<script>
window.dataLayer.push({
'gitBranch': '{{ getenv "BRANCH" }}',
});
</script>