feat: dynamically fetch indices

This commit is contained in:
Jacky Zhao 2022-02-15 19:39:14 -05:00
parent 4587b13360
commit fcd5d2807d
10 changed files with 205 additions and 175 deletions

View File

@ -12,7 +12,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Build Link Index - name: Build Link Index
uses: jackyzha0/hugo-obsidian@v2.7 uses: jackyzha0/hugo-obsidian@v2.8
with: with:
index: true index: true
input: content input: content

4
.gitignore vendored
View File

@ -3,5 +3,5 @@ public
resources resources
.idea .idea
content/.obsidian content/.obsidian
data/linkIndex.yaml static/linkIndex.json
data/contentIndex.yaml static/contentIndex.json

View File

@ -4,4 +4,4 @@ help: ## Show all Makefile targets
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
serve: ## serve serve: ## serve
hugo-obsidian -input=content -output=data -index -root=. && hugo server hugo-obsidian -input=content -output=static -index -root=. && hugo server

View File

@ -1,5 +1,5 @@
--- ---
title: 🪴 Quartz 3 title: 🪴 Quartz 3.1
--- ---
Host your second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening) for free. Quartz features Host your second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening) for free. Quartz features
1. Extremely fast full-text search by pressing `/` 1. Extremely fast full-text search by pressing `/`

View File

@ -5,7 +5,7 @@ description:
Here is the page description. This is an example Quartz site that details installation, Here is the page description. This is an example Quartz site that details installation,
setup, customization, and troubleshooting for Quartz itself. setup, customization, and troubleshooting for Quartz itself.
page_title: page_title:
"🪴 Quartz 3" "🪴 Quartz 3.1"
links: links:
- link_name: Twitter - link_name: Twitter
link: https://twitter.com/_jzhao link: https://twitter.com/_jzhao

View File

@ -3,8 +3,9 @@
{{$url := urls.Parse .Site.BaseURL }} {{$url := urls.Parse .Site.BaseURL }}
{{$host := strings.TrimRight "/" $url.Path }} {{$host := strings.TrimRight "/" $url.Path }}
{{$curPage := strings.TrimPrefix $host (strings.TrimRight "/" .Page.RelPermalink) }} {{$curPage := strings.TrimPrefix $host (strings.TrimRight "/" .Page.RelPermalink) }}
{{$inbound := index $.Site.Data.linkIndex.index.backlinks $curPage}} {{$linkIndex := getJSON "/static/linkIndex.json"}}
{{$contentTable := $.Site.Data.contentIndex}} {{$inbound := index $linkIndex.index.backlinks $curPage}}
{{$contentTable := getJSON "/static/contentIndex.json"}}
{{if $inbound}} {{if $inbound}}
{{$cleanedInbound := apply (apply $inbound "index" "." "source") "replace" "." " " "-"}} {{$cleanedInbound := apply (apply $inbound "index" "." "source") "replace" "." " " "-"}}
{{- range $cleanedInbound | uniq -}} {{- range $cleanedInbound | uniq -}}

View File

@ -11,6 +11,8 @@
} }
</style> </style>
<script> <script>
async function run() {
const { index, links, content } = await fetchData()
const curPage = {{ strings.TrimRight "/" .Page.Permalink }}.replace({{strings.TrimRight "/" .Site.BaseURL }}, "") const curPage = {{ strings.TrimRight "/" .Page.Permalink }}.replace({{strings.TrimRight "/" .Site.BaseURL }}, "")
const pathColors = {{$.Site.Data.graphConfig.paths}} const pathColors = {{$.Site.Data.graphConfig.paths}}
let depth = {{$.Site.Data.graphConfig.depth}} let depth = {{$.Site.Data.graphConfig.depth}}
@ -225,12 +227,15 @@
.attr("x1", d => d.source.x) .attr("x1", d => d.source.x)
.attr("y1", d => d.source.y) .attr("y1", d => d.source.y)
.attr("x2", d => d.target.x) .attr("x2", d => d.target.x)
.attr("y2", d => d.target.y); .attr("y2", d => d.target.y)
node node
.attr("cx", d => d.x) .attr("cx", d => d.x)
.attr("cy", d => d.y); .attr("cy", d => d.y)
labels labels
.attr("x", d => d.x) .attr("x", d => d.x)
.attr("y", d => d.y); .attr("y", d => d.y)
}); });
}
run()
</script> </script>

View File

@ -26,9 +26,24 @@
<!-- Preload page vars --> <!-- Preload page vars -->
<script> <script>
const content = {{$.Site.Data.contentIndex}} const fetchData = async () => {
const index = {{$.Site.Data.linkIndex.index}} const promises = [
const links = {{$.Site.Data.linkIndex.links}} fetch("/linkIndex.json")
.then(data => data.json())
.then(data => ({
index: data.index,
links: data.links,
})),
fetch("/contentIndex.json")
.then(data => data.json()),
]
const [{index, links}, content] = await Promise.all(promises)
return ({
index,
links,
content,
})
}
</script> </script>
</head> </head>
{{ template "_internal/google_analytics.html" . }} {{ template "_internal/google_analytics.html" . }}

View File

@ -1,5 +1,7 @@
{{if $.Site.Data.config.enableLinkPreview}} {{if $.Site.Data.config.enableLinkPreview}}
<script> <script>
async function run() {
const {content} = await fetchData()
function htmlToElement(html) { function htmlToElement(html) {
const template = document.createElement('template') const template = document.createElement('template')
html = html.trim() html = html.trim()
@ -11,7 +13,6 @@
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
[...document.getElementsByClassName("internal-link")] [...document.getElementsByClassName("internal-link")]
.forEach(li => { .forEach(li => {
console.log(li.dataset.src.replace(pathRegex, ''))
const linkDest = content[li.dataset.src.replace(pathRegex, '')] const linkDest = content[li.dataset.src.replace(pathRegex, '')]
if (linkDest) { if (linkDest) {
const popoverElement = `<div class="popover"> const popoverElement = `<div class="popover">
@ -29,5 +30,8 @@
} }
}) })
}) })
}
run()
</script> </script>
{{end}} {{end}}

View File

@ -67,6 +67,7 @@
}; };
</script> </script>
<script> <script>
async function run() {
const contentIndex = new FlexSearch.Document({ const contentIndex = new FlexSearch.Document({
cache: true, cache: true,
charset: "latin:extra", charset: "latin:extra",
@ -89,6 +90,7 @@
} }
}) })
const { content } = await fetchData()
for (const [key, value] of Object.entries(content)) { for (const [key, value] of Object.entries(content)) {
contentIndex.add({ contentIndex.add({
id: key, id: key,
@ -147,7 +149,7 @@
window.location.href = "{{.Site.BaseURL}}" + `${id}#:~:text=${encodeURIComponent(term)}` window.location.href = "{{.Site.BaseURL}}" + `${id}#:~:text=${encodeURIComponent(term)}`
} }
const fetch = id => ({ const formatForDisplay = id => ({
id, id,
url: id, url: id,
title: content[id].title, title: content[id].title,
@ -185,7 +187,7 @@
} }
} }
const allIds = new Set([...getByField('title'), ...getByField('content')]) const allIds = new Set([...getByField('title'), ...getByField('content')])
const finalResults = [...allIds].map(fetch) const finalResults = [...allIds].map(formatForDisplay)
// display // display
if (finalResults.length === 0) { if (finalResults.length === 0) {
@ -210,6 +212,7 @@
const searchContainer = document.getElementById("search-container") const searchContainer = document.getElementById("search-container")
function openSearch() { function openSearch() {
if (searchContainer.style.display === "none" || searchContainer.style.display === "") { if (searchContainer.style.display === "none" || searchContainer.style.display === "") {
source.value = "" source.value = ""
@ -251,5 +254,7 @@
evt.stopPropagation() evt.stopPropagation()
}) })
}) })
}
run()
</script> </script>