Jacky Zhao
2022-06-29 8a100edeb81382dc838f600ee1b8dbd3e7560e37
layouts/partials/head.html
@@ -10,11 +10,17 @@
    end }}
  </title>
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <link
    rel="shortcut icon"
    type="image/png"
    href="{{$.Site.BaseURL}}/icon.png"
  />
  <!-- HTML Favicon -->
  {{ $favicon := $.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
@@ -30,11 +36,14 @@
  {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | resources.Minify  }}
  <link href="{{$finalCss.Permalink}}" rel="stylesheet" />
  {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" |
  resources.Minify }}
  {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | resources.Minify }}
  <script src="{{$darkMode.Permalink}}"></script>
  {{partial "katex.html" .}}
  {{ $popover := resources.Get "js/popover.js" | resources.Fingerprint "md5" |
  resources.Minify }}
  <script src="{{$popover.Permalink}}"></script>
  <!--  Preload page vars  -->
  {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint
  "md5" | resources.Minify | }} {{$contentIndex := resources.Get
@@ -57,41 +66,70 @@
          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 $.Site.Data.config.enableFooter}}
      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}}
      {{if $.Site.Data.config.enableLinkPreview}}
      initPopover(
        {{strings.TrimRight "/" .Site.BaseURL }},
        {{$.Site.Data.config.enableContextualBacklinks}},
        {{$.Site.Data.config.enableLatex}}
      )
      {{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 $.Site.Data.config.enableLatex}}
      renderMathInElement(doc.body, {
        delimiters: [
          {left: '$$', right: '$$', display: true},
          {left: '$', right: '$', display: false},
        ],
        throwOnError : false
      });
      {{end}}
    };
  </script>
  {{if $.Site.Data.config.enableSPA}}
  {{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" |
  resources.Minify }}
  <script type="module">
    import { router, navigate } from "https://unpkg.com/million/dist/router.mjs";
    // SPA navigation for access later
    window.navigate = navigate;
    // We only mutate document.title and content within .singlePage element
    router(".singlePage");
    const callback = () => {
      // requestAnimationFrame() delays graph draw until SPA routing is finished
      const draw = () => {
        const container = document.getElementById("graph-container");
        // retry if the graph is not ready
        if (!container) return requestAnimationFrame(draw);
        // clear the graph in case there is anything within it
        container.textContent = "";
        drawGraph(
          {{strings.TrimRight "/" .Page.Permalink}},
          {{strings.TrimRight "/" .Site.BaseURL}},
          {{$.Site.Data.graphConfig.paths}},
          {{$.Site.Data.graphConfig.depth}},
          {{$.Site.Data.graphConfig.enableDrag}},
          {{$.Site.Data.graphConfig.enableLegend}},
          {{$.Site.Data.graphConfig.enableZoom}}
        );
      };
      requestAnimationFrame(draw);
    };
    // We need on initial load, then subsequent redirs
    window.addEventListener("million:navigate", callback);
    window.addEventListener("DOMContentLoaded", callback);
    import { attachSPARouting } from "{{$router.Permalink}}"
    attachSPARouting(init, render)
  </script>
  {{else}}
  <script>window.navigate = (url) => window.location.href = url</script>
  <script>
    window.Million = {
      navigate: (url) => (window.location.href = url),
      prefetch: () => {},
    }
    init()
    render()
  </script>
  {{end}}
</head>
{{ template "_internal/google_analytics.html" . }}