Jacky Zhao
2022-05-03 a09974446d5be617267c2e6ad8c956e88ce83176
Merge pull request #123 from aidenybai/fix-popover

1 files deleted
1 files added
7 files modified
122 ■■■■ changed files
assets/js/popover.js 40 ●●●● patch | view | raw | blame | history
assets/js/router.js 12 ●●●●● patch | view | raw | blame | history
layouts/_default/section.html 1 ●●●● patch | view | raw | blame | history
layouts/_default/single.html 3 ●●●● patch | view | raw | blame | history
layouts/_default/taxonomy.html 1 ●●●● patch | view | raw | blame | history
layouts/_default/term.html 1 ●●●● patch | view | raw | blame | history
layouts/index.html 4 ●●● patch | view | raw | blame | history
layouts/partials/head.html 53 ●●●● patch | view | raw | blame | history
layouts/partials/popover.html 7 ●●●●● patch | view | raw | blame | history
assets/js/popover.js
@@ -1,5 +1,5 @@
function htmlToElement(html) {
  const template = document.createElement('template')
  const template = document.createElement("template")
  html = html.trim()
  template.innerHTML = html
  return template.content.firstChild
@@ -7,29 +7,27 @@
function initPopover(baseURL) {
  const basePath = baseURL.replace(window.location.origin, "")
  document.addEventListener("DOMContentLoaded", () => {
    fetchData.then(({ content }) => {
      const links = [...document.getElementsByClassName("internal-link")]
      links
        .filter(li => li.dataset.src)
        .forEach(li => {
          const linkDest = content[li.dataset.src.replace(/\/$/g, "").replace(basePath, "")]
          if (linkDest) {
            const popoverElement = `<div class="popover">
  fetchData.then(({ content }) => {
    const links = [...document.getElementsByClassName("internal-link")]
    links
      .filter((li) => li.dataset.src)
      .forEach((li) => {
        const linkDest = content[li.dataset.src.replace(/\/$/g, "").replace(basePath, "")]
        if (linkDest) {
          const popoverElement = `<div class="popover">
    <h3>${linkDest.title}</h3>
    <p>${removeMarkdown(linkDest.content).split(" ", 20).join(" ")}...</p>
    <p class="meta">${new Date(linkDest.lastmodified).toLocaleDateString()}</p>
</div>`
            const el = htmlToElement(popoverElement)
            li.appendChild(el)
            li.addEventListener("mouseover", () => {
              el.classList.add("visible")
            })
            li.addEventListener("mouseout", () => {
              el.classList.remove("visible")
            })
          }
        })
    })
          const el = htmlToElement(popoverElement)
          li.appendChild(el)
          li.addEventListener("mouseover", () => {
            el.classList.add("visible")
          })
          li.addEventListener("mouseout", () => {
            el.classList.remove("visible")
          })
        }
      })
  })
}
assets/js/router.js
New file
@@ -0,0 +1,12 @@
import { router, navigate } from "https://unpkg.com/million@1.8.9-0/dist/router.mjs"
export const attachSPARouting = (draw) => {
  // SPA navigation for access later
  window.navigate = navigate
  // We only mutate document.title and content within .singlePage element
  router(".singlePage")
  // We need on initial load, then subsequent redirs
  // requestAnimationFrame() delays graph draw until SPA routing is finished
  window.addEventListener("million:navigate", () => requestAnimationFrame(draw))
  window.addEventListener("DOMContentLoaded", () => requestAnimationFrame(draw))
}
layouts/_default/section.html
@@ -19,7 +19,6 @@
    </article>
    {{partial "contact.html" .}}
</div>
{{partial "popover.html" .}}
</body>
</html>
layouts/_default/single.html
@@ -22,11 +22,10 @@
          <li><a href="{{ .Permalink }}">{{ .LinkTitle | humanize }}</a></li>
          {{ end }}
      </ul>
      {{partial "toc.html" .}}
      {{partial "toc.html" .}}
      {{partial "textprocessing.html" . }}
    </article>
    {{partial "footer.html" .}}
    {{partial "popover.html" .}}
</div>
</body>
layouts/_default/taxonomy.html
@@ -28,7 +28,6 @@
    </article>
    {{partial "contact.html" .}}
</div>
{{partial "popover.html" .}}
</body>
</html>
layouts/_default/term.html
@@ -19,7 +19,6 @@
    </article>
    {{partial "contact.html" .}}
</div>
{{partial "popover.html" .}}
</body>
</html>
layouts/index.html
@@ -13,12 +13,10 @@
        {{partial "darkmode.html" .}}
    </header>
    <article>
        {{partial "toc.html" .}}
        {{partial "toc.html" .}}
        {{partial "textprocessing.html" . }}
    </article>
    {{partial "footer.html" .}}
    {{partial "popover.html" .}}
</div>
</body>
</html>
layouts/partials/head.html
@@ -35,6 +35,10 @@
  <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
@@ -59,35 +63,32 @@
        }))
  </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 = "";
    import { attachSPARouting } from '{{$router.Permalink}}';
    // 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.
    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 "/" .Site.BaseURL}},
          {{$.Site.Data.graphConfig.paths}},
          {{$.Site.Data.graphConfig.depth}},
          {{$.Site.Data.graphConfig.enableDrag}},
          {{$.Site.Data.graphConfig.enableLegend}},
          {{$.Site.Data.graphConfig.enableZoom}}
        );
      };
      requestAnimationFrame(draw);
      drawGraph(
        {{strings.TrimRight "/" .Site.BaseURL}},
        {{$.Site.Data.graphConfig.paths}},
        {{$.Site.Data.graphConfig.depth}},
        {{$.Site.Data.graphConfig.enableDrag}},
        {{$.Site.Data.graphConfig.enableLegend}},
        {{$.Site.Data.graphConfig.enableZoom}}
      );
      {{if $.Site.Data.config.enableLinkPreview}}
        initPopover({{strings.TrimRight "/" .Site.BaseURL }})
      {{end}}
    };
    // We need on initial load, then subsequent redirs
    window.addEventListener("million:navigate", callback);
    window.addEventListener("DOMContentLoaded", callback);
    attachSPARouting(draw);
  </script>
  {{else}}
  <script>window.navigate = (url) => window.location.href = url</script>
layouts/partials/popover.html
File was deleted