feat: dynamically fetch indices
This commit is contained in:
		
							parent
							
								
									4587b13360
								
							
						
					
					
						commit
						fcd5d2807d
					
				
					 10 changed files with 205 additions and 175 deletions
				
			
		
							
								
								
									
										2
									
								
								.github/workflows/deploy.yaml
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/deploy.yaml
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -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
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -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
 | 
				
			||||||
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 `/`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 -}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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" . }}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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}}
 | 
				
			||||||
| 
						 | 
					@ -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>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue