From c01138a81c7052b87073395429500356ce4596f2 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 09:35:42 -0400 Subject: [PATCH 0001/1221] add base structure --- .gitignore | 5 + LICENSE.txt | 21 +++ README.md | 10 ++ assets/darkmode.js | 26 ++++ assets/darkmode.scss | 67 ++++++++++ assets/syntax.scss | 99 ++++++++++++++ config.toml | 4 + content/_index.md | 0 content/moc/directory.md | 0 content/notes/config.md | 0 content/notes/setup.md | 0 content/notes/troubleshooting.md | 0 content/notes/welcome.md | 0 data/config.yaml | 11 ++ data/graphConfig.yaml | 11 ++ layouts/404.html | 0 layouts/_default/baseof.html | 10 ++ layouts/_default/single.html | 24 ++++ layouts/index.html | 0 layouts/partials/backlinks.html | 9 ++ layouts/partials/darkmode.html | 16 +++ layouts/partials/footer.html | 21 +++ layouts/partials/graph.html | 218 +++++++++++++++++++++++++++++++ layouts/partials/head.html | 24 ++++ layouts/partials/header.html | 0 static/icon.png | Bin 0 -> 31988 bytes 26 files changed, 576 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 assets/darkmode.js create mode 100644 assets/darkmode.scss create mode 100644 assets/syntax.scss create mode 100644 config.toml create mode 100644 content/_index.md create mode 100644 content/moc/directory.md create mode 100644 content/notes/config.md create mode 100644 content/notes/setup.md create mode 100644 content/notes/troubleshooting.md create mode 100644 content/notes/welcome.md create mode 100644 data/config.yaml create mode 100644 data/graphConfig.yaml create mode 100644 layouts/404.html create mode 100644 layouts/_default/baseof.html create mode 100644 layouts/_default/single.html create mode 100644 layouts/index.html create mode 100644 layouts/partials/backlinks.html create mode 100644 layouts/partials/darkmode.html create mode 100644 layouts/partials/footer.html create mode 100644 layouts/partials/graph.html create mode 100644 layouts/partials/head.html create mode 100644 layouts/partials/header.html create mode 100644 static/icon.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..0de29389 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +public +resources +.idea +content/.obsidian \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..147e2ca1 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 jackyzha0 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..0666d7b9 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# quartz +Simple second brain and digital garden. + +```shell +# Installation +go install github.com/jackyzha0/hugo-obsidian + +# Run +hugo-obsidian -input=content -output=data +``` \ No newline at end of file diff --git a/assets/darkmode.js b/assets/darkmode.js new file mode 100644 index 00000000..93bf6dac --- /dev/null +++ b/assets/darkmode.js @@ -0,0 +1,26 @@ +// Darkmode toggle +const toggleSwitch = document.querySelector('#darkmode-toggle') + +const userPref = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark' +const currentTheme = localStorage.getItem('theme') ?? userPref + +if (currentTheme) { + document.documentElement.setAttribute('saved-theme', currentTheme); + if (currentTheme === 'dark') { + toggleSwitch.checked = true + } +} + +const switchTheme = (e) => { + if (e.target.checked) { + document.documentElement.setAttribute('saved-theme', 'dark') + localStorage.setItem('theme', 'dark') + } + else { + document.documentElement.setAttribute('saved-theme', 'light') + localStorage.setItem('theme', 'light') + } +} + +// listen for toggle +toggleSwitch.addEventListener('change', switchTheme, false) \ No newline at end of file diff --git a/assets/darkmode.scss b/assets/darkmode.scss new file mode 100644 index 00000000..dde5be66 --- /dev/null +++ b/assets/darkmode.scss @@ -0,0 +1,67 @@ + +.darkmode { + text-align: right; + + & > .toggle { + display: none; + box-sizing: border-box; + + &:checked + .toggle-button:after { + left: 50%; + } + + & + .toggle-button { + box-sizing: border-box; + outline: 0; + display: inline-block; + width: 3em; + height: 1.5em; + position: relative; + cursor: pointer; + border: 2px solid var(--gray); + user-select: none; + padding: 2px; + transition: all 0.2s ease; + border-radius: 2em; + + &:after, &:before { + position: relative; + display: block; + box-sizing: border-box; + content: ""; + width: 50%; + height: 100%; + } + + &:before { + display: none; + } + + &:after { + left: 0; + transition: all 0.2s ease; + background: var(--gray); + content: ""; + border-radius: 1em; + } + } + } + + & #dayIcon { + position: relative; + width: 20px; + height: 20px; + top: -1.5px; + margin: 0 7px; + fill: var(--gray); + } + + & #nightIcon { + position: relative; + width: 18px; + height: 18px; + top: -2px; + margin: 0 7px; + fill: var(--gray); + } +} \ No newline at end of file diff --git a/assets/syntax.scss b/assets/syntax.scss new file mode 100644 index 00000000..27c37f4b --- /dev/null +++ b/assets/syntax.scss @@ -0,0 +1,99 @@ +/* Background */ .chroma { color: #f8f8f2; background-color: #282a36 } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } +/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Keyword */ .chroma .k { color: #ff79c6 } +/* KeywordConstant */ .chroma .kc { color: #ff79c6 } +/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic } +/* KeywordNamespace */ .chroma .kn { color: #ff79c6 } +/* KeywordPseudo */ .chroma .kp { color: #ff79c6 } +/* KeywordReserved */ .chroma .kr { color: #ff79c6 } +/* KeywordType */ .chroma .kt { color: #8be9fd } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { color: #50fa7b } +/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic } +/* NameBuiltinPseudo */ .chroma .bp { } +/* NameClass */ .chroma .nc { color: #50fa7b } +/* NameConstant */ .chroma .no { } +/* NameDecorator */ .chroma .nd { } +/* NameEntity */ .chroma .ni { } +/* NameException */ .chroma .ne { } +/* NameFunction */ .chroma .nf { color: #50fa7b } +/* NameFunctionMagic */ .chroma .fm { } +/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic } +/* NameNamespace */ .chroma .nn { } +/* NameOther */ .chroma .nx { } +/* NameProperty */ .chroma .py { } +/* NameTag */ .chroma .nt { color: #ff79c6 } +/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic } +/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic } +/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic } +/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic } +/* NameVariableMagic */ .chroma .vm { } +/* Literal */ .chroma .l { } +/* LiteralDate */ .chroma .ld { } +/* LiteralString */ .chroma .s { color: #f1fa8c } +/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c } +/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c } +/* LiteralStringChar */ .chroma .sc { color: #f1fa8c } +/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c } +/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c } +/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c } +/* LiteralStringEscape */ .chroma .se { color: #f1fa8c } +/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c } +/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c } +/* LiteralStringOther */ .chroma .sx { color: #f1fa8c } +/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c } +/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c } +/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c } +/* LiteralNumber */ .chroma .m { color: #bd93f9 } +/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 } +/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 } +/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 } +/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 } +/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 } +/* Operator */ .chroma .o { color: #ff79c6 } +/* OperatorWord */ .chroma .ow { color: #ff79c6 } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #6272a4 } +/* CommentHashbang */ .chroma .ch { color: #6272a4 } +/* CommentMultiline */ .chroma .cm { color: #6272a4 } +/* CommentSingle */ .chroma .c1 { color: #6272a4 } +/* CommentSpecial */ .chroma .cs { color: #6272a4 } +/* CommentPreproc */ .chroma .cp { color: #ff79c6 } +/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { color: #8b080b } +/* GenericEmph */ .chroma .ge { text-decoration: underline } +/* GenericError */ .chroma .gr { } +/* GenericHeading */ .chroma .gh { font-weight: bold } +/* GenericInserted */ .chroma .gi { font-weight: bold } +/* GenericOutput */ .chroma .go { color: #44475a } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { } +/* GenericSubheading */ .chroma .gu { font-weight: bold } +/* GenericTraceback */ .chroma .gt { } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { } + +.lntd:first-of-type > .chroma { + padding-right: 0; +} + +.chroma code { + font-family: 'Fira Code' !important; + font-size: 0.85em; + line-height: 1em; + background: none; + padding: 0; +} + +.chroma { + border-radius: 3px; + margin: 0; +} \ No newline at end of file diff --git a/config.toml b/config.toml new file mode 100644 index 00000000..da90bbfd --- /dev/null +++ b/config.toml @@ -0,0 +1,4 @@ +baseURL = "https://quartz.jzhao.xyz/" +languageCode = "en-us" +googleAnalytics = "UA-148413215-1" +pygmentsUseClasses = true \ No newline at end of file diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 00000000..e69de29b diff --git a/content/moc/directory.md b/content/moc/directory.md new file mode 100644 index 00000000..e69de29b diff --git a/content/notes/config.md b/content/notes/config.md new file mode 100644 index 00000000..e69de29b diff --git a/content/notes/setup.md b/content/notes/setup.md new file mode 100644 index 00000000..e69de29b diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md new file mode 100644 index 00000000..e69de29b diff --git a/content/notes/welcome.md b/content/notes/welcome.md new file mode 100644 index 00000000..e69de29b diff --git a/data/config.yaml b/data/config.yaml new file mode 100644 index 00000000..8d0ae8aa --- /dev/null +++ b/data/config.yaml @@ -0,0 +1,11 @@ +name: Quartz Example Page +description: + Here is the page description. This is an example Quartz site that details installation, + setup, customization, and troubleshooting for Quartz itself. +page_title: + Quartz Example Page +links: + - link_name: twitter + link: https://twitter.com/_jzhao + - link_name: github + link: https://github.com/jackyzha0 \ No newline at end of file diff --git a/data/graphConfig.yaml b/data/graphConfig.yaml new file mode 100644 index 00000000..089d5d30 --- /dev/null +++ b/data/graphConfig.yaml @@ -0,0 +1,11 @@ +enableLegend: false +enableDrag: true +enableZoom: false +base: + node: "#284b63" + activeNode: "#f28482" + inactiveNode: "#a8b3bd" + link: "#babdbf" + activeLink: "#5a7282" +paths: + - /moc: "#4388cc" \ No newline at end of file diff --git a/layouts/404.html b/layouts/404.html new file mode 100644 index 00000000..e69de29b diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html new file mode 100644 index 00000000..ccb3b93a --- /dev/null +++ b/layouts/_default/baseof.html @@ -0,0 +1,10 @@ + + +{{ block "head" . }} +{{ end }} + + +{{ block "main" . }} +{{ end }} + + \ No newline at end of file diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 00000000..c7ce8819 --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,24 @@ + + +{{ partial "head.html" . }} + + +
+ + {{partial "darkmode.html" .}} +
+ {{if .Title}}

{{ .Title }}

{{end}} + {{- .Content -}} +
+ {{partial "footer.html" .}} +
+ +{{- with resources.Get "darkmode.js" | minify -}} + +{{- end -}} + + + + \ No newline at end of file diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 00000000..e69de29b diff --git a/layouts/partials/backlinks.html b/layouts/partials/backlinks.html new file mode 100644 index 00000000..2ae49760 --- /dev/null +++ b/layouts/partials/backlinks.html @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/layouts/partials/darkmode.html b/layouts/partials/darkmode.html new file mode 100644 index 00000000..3d36d9a1 --- /dev/null +++ b/layouts/partials/darkmode.html @@ -0,0 +1,16 @@ +
+ + + + +
\ No newline at end of file diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html new file mode 100644 index 00000000..3afeb8e7 --- /dev/null +++ b/layouts/partials/footer.html @@ -0,0 +1,21 @@ +
+
+ {{partial "graph.html" .}} + +
+ + +
+
+

made by {{ $.Site.Data.config.name }}, © {{ dateFormat "2006" now }}

+ source + {{ if not .IsHome }} + home + {{end}} + {{- range $.Site.Data.links.footer -}} + {{.link_name}} + {{- end -}} +
+
\ No newline at end of file diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html new file mode 100644 index 00000000..ea9cf1a1 --- /dev/null +++ b/layouts/partials/graph.html @@ -0,0 +1,218 @@ + +
+ + \ No newline at end of file diff --git a/layouts/partials/head.html b/layouts/partials/head.html new file mode 100644 index 00000000..5e42a2cf --- /dev/null +++ b/layouts/partials/head.html @@ -0,0 +1,24 @@ + + + + {{ template "_internal/google_analytics_async.html" . }} + + + + + {{$.Site.Data.config.page_title}} + + + + + + {{ $css := slice "darkmode.scss" "syntax.scss"}} + {{range $css}} + {{$sass := resources.Get . | resources.ToCSS }} + {{with $sass | minify}} + + {{end}} + {{end}} + \ No newline at end of file diff --git a/layouts/partials/header.html b/layouts/partials/header.html new file mode 100644 index 00000000..e69de29b diff --git a/static/icon.png b/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7294a8b2effc5feace23726654d415802c6ba4a4 GIT binary patch literal 31988 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 literal 0 HcmV?d00001 From ea69050587407022a02011e18874c9bcdfe779bd Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 11:54:00 -0400 Subject: [PATCH 0002/1221] add base pages --- .github/workflows/deploy.yaml | 35 ++++ .gitignore | 3 +- README.md | 2 +- assets/base.scss | 201 +++++++++++++++++++++ assets/custom.scss | 24 +++ config.toml | 20 +- content/_index.md | 7 + content/moc/directory.md | 7 + content/notes/config.md | 3 + content/notes/images/obsidian-settings.png | Bin 0 -> 26089 bytes content/notes/setup.md | 8 + content/notes/troubleshooting.md | 3 + content/notes/welcome.md | 0 content/templates/post.md | 3 + data/config.yaml | 7 +- layouts/404.html | 18 ++ layouts/_default/_markup/render-link.html | 2 + layouts/_default/single.html | 6 + layouts/index.html | 15 ++ layouts/partials/footer.html | 11 +- layouts/partials/graph.html | 4 +- layouts/partials/head.html | 2 +- 22 files changed, 365 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/deploy.yaml create mode 100644 assets/base.scss create mode 100644 assets/custom.scss create mode 100644 content/notes/images/obsidian-settings.png delete mode 100644 content/notes/welcome.md create mode 100644 content/templates/post.md create mode 100644 layouts/_default/_markup/render-link.html diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 00000000..9bc8d43a --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,35 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: + - hugo + +jobs: + deploy: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + + - name: Build Link Index + uses: jackyzha0/hugo-obsidian@v1.4 + with: + input: content + output: data + + - name: Setup Hugo + uses: peaceiris/actions-hugo@v2 + with: + hugo-version: '0.79.1' + extended: true + + - name: Build + run: hugo --minify + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./public + publish_branch: master # deploying branch + cname: quartz.jzhao.xyz \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0de29389..c216e497 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ public resources .idea -content/.obsidian \ No newline at end of file +content/.obsidian +data/linkIndex.yaml \ No newline at end of file diff --git a/README.md b/README.md index 0666d7b9..7fca44d8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# quartz +# Quartz Simple second brain and digital garden. ```shell diff --git a/assets/base.scss b/assets/base.scss new file mode 100644 index 00000000..a0df87f6 --- /dev/null +++ b/assets/base.scss @@ -0,0 +1,201 @@ +:root { + --lt-colours-light: var(--light) !important; + --lt-colours-lightgray: var(--lightgray) !important; + --lt-colours-dark: var(--navy) !important; + --lt-colours-secondary: var(--olive) !important; + --lt-colours-gray: var(--outlinegray) !important; +} + +h1, h2, h3, h4, ol, ul, thead { + font-family: Inter; + color: var(--dark) +} + +p, ul, text { + font-family: 'Source Sans Pro', sans-serif; + color: var(--gray); + fill: var(--gray); +} + +a { + font-family: Inter; + font-weight: 700; + font-size: 1em; + text-decoration: none; + transition: all 0.2s ease; + color: var(--navy); + + &:hover { + color: var(--olive) !important; + } +} + +#TableOfContents > ol { + counter-reset: section; + margin-left: 0em; + padding-left: 1.5em; + & > li { + counter-increment: section; + & > ol { + counter-reset: subsection; + & > li { + counter-increment: subsection; + &::marker { + content: counter(section) "." counter(subsection) " "; + } + } + } + } + + & > li::marker { + content: counter(section) " "; + } + + & > li::marker, & > li > ol > li::marker { + font-family: Source Sans Pro; + font-weight: 700; + } +} + +footer { + margin-top: 4em; + text-align: center; +} + + +table { + width: 100%; +} + +img { + width: 100%; + border-radius: 3px; + margin: 1em 0; +} + +p>img+em { + display: block; + transform: translateY(-1em); +} + +sup { + line-height: 0 +} + +p, tbody, li { + font-family: Source Sans Pro; + color: var(--gray); + line-height: 1.5em; +} + +h2 { + opacity: 0.85; +} + +h3 { + opacity: 0.75; +} + +blockquote { + margin-left: 0em; + border-left: 3px solid var(--navy); + padding-left: 1em; + transition: border-color 0.2s ease; + + &:hover { + border-color: var(--olive); + } +} + +table { + padding: 1.5em; +} + +td, th { + padding: 0.1em 0.5em; +} + +.footnotes p { + margin: 0.5em 0; +} + +article a { + font-family: Source Sans Pro; + font-weight: 600; + text-decoration: underline; + text-decoration-color: var(--olive); + text-decoration-thickness: .15em; +} + +sup > a { + text-decoration: none; + padding: 0 0.1em 0 0.2em; +} + +pre { + font-family: 'Fira Code'; + padding: 0.75em; + border-radius: 3px; + overflow-x: scroll; +} + +code { + font-family: 'Fira Code'; + font-size: 0.85em; + padding: 0.15em 0.3em; + border-radius: 5px; + background: var(--lightgray); +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + height: 100vh; + width: 100vw; + overflow-x: hidden; + background-color: var(--light); +} + +@keyframes fadeIn { + 0% {opacity:0;} + 100% {opacity:1;} +} + +footer { + margin-top: 4em; + + & > a { + font-size: 1em; + color: var(--navy); + padding: 0 0.5em 3em 0.5em; + } +} + +hr { + width: 25%; + margin: 4em auto; + height: 2px; + border-radius: 1px; + border-width: 0; + color: var(--dark); + background-color: var(--dark); +} + +// internal link +a[href^="/"] { + text-decoration: none; + background-color: #afbfc922; + padding: 0 0.2em; + border-radius: 3px; +} + +.singlePage { + margin: 4em 30vw; + + @media all and (max-width: 1200px) { + margin: 25px 5vw; + } +} \ No newline at end of file diff --git a/assets/custom.scss b/assets/custom.scss new file mode 100644 index 00000000..9fcccd3e --- /dev/null +++ b/assets/custom.scss @@ -0,0 +1,24 @@ +// Add your own CSS here! +:root { + --light: #faf8f8; + --dark: #141021; + --navy: #284b63; + --olive: #84a59d; + --visited: #afbfc9; + --salmon: #f28482; + --gray: #4e4e4e; + --lightgray: #f0f0f0; + --outlinegray: #dadada; +} + +[saved-theme="dark"] { + --light: #1e1e21 !important; + --dark: #fbfffe !important; + --navy: #5b778a !important; + --visited: #4a575e !important; + --olive: #84a59d !important; + --salmon: #f58382 !important; + --gray: #d4d4d4 !important; + --lightgray: #292633 !important; + --outlinegray: #343434 !important; +} \ No newline at end of file diff --git a/config.toml b/config.toml index da90bbfd..44cb8389 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,22 @@ baseURL = "https://quartz.jzhao.xyz/" languageCode = "en-us" googleAnalytics = "UA-148413215-1" -pygmentsUseClasses = true \ No newline at end of file +pygmentsUseClasses = true +ignoreFiles = ["/content/templates/*"] + +[markup] + [markup.tableOfContents] + endLevel = 3 + ordered = true + startLevel = 2 + [markup.highlight] + anchorLineNos = false + codeFences = true + guessSyntax = true + hl_Lines = "" + lineAnchors = "" + lineNoStart = 1 + lineNos = true + lineNumbersInTable = true + style = "dracula" + tabWidth = 4 \ No newline at end of file diff --git a/content/_index.md b/content/_index.md index e69de29b..d5ecfd8c 100644 --- a/content/_index.md +++ b/content/_index.md @@ -0,0 +1,7 @@ +# 💎 Quartz +Simple second brain and digital garden. 🌱 + +## Why Quartz? + +## Get Started +[directory](moc/directory.md) diff --git a/content/moc/directory.md b/content/moc/directory.md index e69de29b..2459e2b0 100644 --- a/content/moc/directory.md +++ b/content/moc/directory.md @@ -0,0 +1,7 @@ +--- +title: "Directory" +--- + +[setup](notes/setup.md) +[config](notes/config.md) +[troubleshooting](notes/troubleshooting.md) \ No newline at end of file diff --git a/content/notes/config.md b/content/notes/config.md index e69de29b..13c2bde6 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -0,0 +1,3 @@ +--- +title: "config" +--- diff --git a/content/notes/images/obsidian-settings.png b/content/notes/images/obsidian-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..8dfbfdc3436672627c1248508b6b02c08d5a7c9a GIT binary patch literal 26089 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 BCmjF) literal 0 HcmV?d00001 diff --git a/content/notes/setup.md b/content/notes/setup.md index e69de29b..6f7bdc2f 100644 --- a/content/notes/setup.md +++ b/content/notes/setup.md @@ -0,0 +1,8 @@ +--- +title: "Setup" +--- + +![](/notes/images/obsidian-settings.png) + + +Having problems? [troubleshooting](notes/troubleshooting.md) \ No newline at end of file diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index e69de29b..cd296d6a 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -0,0 +1,3 @@ +--- +title: "troubleshooting" +--- diff --git a/content/notes/welcome.md b/content/notes/welcome.md deleted file mode 100644 index e69de29b..00000000 diff --git a/content/templates/post.md b/content/templates/post.md new file mode 100644 index 00000000..c2a9b337 --- /dev/null +++ b/content/templates/post.md @@ -0,0 +1,3 @@ +--- +title: "{{title}}" +--- diff --git a/data/config.yaml b/data/config.yaml index 8d0ae8aa..49479077 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -1,11 +1,12 @@ -name: Quartz Example Page +name: Jacky Zhao +enableToc: true description: Here is the page description. This is an example Quartz site that details installation, setup, customization, and troubleshooting for Quartz itself. page_title: Quartz Example Page links: - - link_name: twitter + - link_name: Twitter link: https://twitter.com/_jzhao - - link_name: github + - link_name: Github link: https://github.com/jackyzha0 \ No newline at end of file diff --git a/layouts/404.html b/layouts/404.html index e69de29b..2c925051 100644 --- a/layouts/404.html +++ b/layouts/404.html @@ -0,0 +1,18 @@ + + +{{ partial "head.html" . }} + + +
+ {{partial "darkmode.html" .}} +
+

404.

+

Hey! You look a little lost.

+ +
+
+ + + \ No newline at end of file diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html new file mode 100644 index 00000000..10856fa7 --- /dev/null +++ b/layouts/_default/_markup/render-link.html @@ -0,0 +1,2 @@ +{{$trimmed := strings.TrimSuffix ".md" (.Destination | safeURL)}} +{{ .Text | safeHTML }} \ No newline at end of file diff --git a/layouts/_default/single.html b/layouts/_default/single.html index c7ce8819..14a3b05d 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -8,6 +8,12 @@ {{partial "darkmode.html" .}}
{{if .Title}}

{{ .Title }}

{{end}} + {{if $.Site.Data.config.enableToc}} + + {{end}} {{- .Content -}}
{{partial "footer.html" .}} diff --git a/layouts/index.html b/layouts/index.html index e69de29b..a68d61fb 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -0,0 +1,15 @@ +{{define "head"}} +{{ partial "head.html" . }} +{{end}} + +{{define "main"}} + +
+ {{.Content}} + + +
+ {{partial "footer.html" .}} +
+
+{{end}} \ No newline at end of file diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index 3afeb8e7..9d3c5dcd 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,20 +1,17 @@

+ {{partial "backlinks.html" .}} {{partial "graph.html" .}} -
-

made by {{ $.Site.Data.config.name }}, © {{ dateFormat "2006" now }}

- source +

Made by {{ $.Site.Data.config.name }} using Quartz, © {{ dateFormat "2006" now }}

{{ if not .IsHome }} - home + Home {{end}} - {{- range $.Site.Data.links.footer -}} + {{- range $.Site.Data.config.links -}} {{.link_name}} {{- end -}}
diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index ea9cf1a1..c315b8f8 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -23,7 +23,7 @@ } const color = (d) => { - if (d.id === curPage) { + if (d.id === curPage || (d.id === "/" && curPage === "")) { return "var(--g-node-active)" } @@ -64,7 +64,7 @@ .on("end", enableDrag ? dragended : noop); } - const height = 400 + const height = 250 const width = document.getElementById("graph-container").offsetWidth const simulation = d3.forceSimulation(data.nodes) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 5e42a2cf..2f295e91 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -12,7 +12,7 @@ - {{ $css := slice "darkmode.scss" "syntax.scss"}} + {{ $css := slice "custom.scss" "base.scss" "darkmode.scss" "syntax.scss"}} {{range $css}} {{$sass := resources.Get . | resources.ToCSS }} {{with $sass | minify}} From 898932457132d147913ec85d5bea59073b92f33d Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 11:55:45 -0400 Subject: [PATCH 0003/1221] bump ga version --- .github/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 9bc8d43a..403379eb 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Build Link Index - uses: jackyzha0/hugo-obsidian@v1.4 + uses: jackyzha0/hugo-obsidian@v2.0 with: input: content output: data From 672a641cec42b4dc2bb6b068d5936c87a10f32e7 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 12:06:36 -0400 Subject: [PATCH 0004/1221] fix darkmode --- assets/base.scss | 16 ++++++++-------- assets/custom.scss | 12 ++++++------ layouts/index.html | 7 +++++++ layouts/partials/graph.html | 10 +++++----- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/assets/base.scss b/assets/base.scss index a0df87f6..5a3a4532 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -1,8 +1,8 @@ :root { --lt-colours-light: var(--light) !important; --lt-colours-lightgray: var(--lightgray) !important; - --lt-colours-dark: var(--navy) !important; - --lt-colours-secondary: var(--olive) !important; + --lt-colours-dark: var(--secondary) !important; + --lt-colours-secondary: var(--tertiary) !important; --lt-colours-gray: var(--outlinegray) !important; } @@ -23,10 +23,10 @@ a { font-size: 1em; text-decoration: none; transition: all 0.2s ease; - color: var(--navy); + color: var(--secondary); &:hover { - color: var(--olive) !important; + color: var(--tertiary) !important; } } @@ -98,12 +98,12 @@ h3 { blockquote { margin-left: 0em; - border-left: 3px solid var(--navy); + border-left: 3px solid var(--secondary); padding-left: 1em; transition: border-color 0.2s ease; &:hover { - border-color: var(--olive); + border-color: var(--tertiary); } } @@ -123,7 +123,7 @@ article a { font-family: Source Sans Pro; font-weight: 600; text-decoration: underline; - text-decoration-color: var(--olive); + text-decoration-color: var(--tertiary); text-decoration-thickness: .15em; } @@ -169,7 +169,7 @@ footer { & > a { font-size: 1em; - color: var(--navy); + color: var(--secondary); padding: 0 0.5em 3em 0.5em; } } diff --git a/assets/custom.scss b/assets/custom.scss index 9fcccd3e..cb8babb3 100644 --- a/assets/custom.scss +++ b/assets/custom.scss @@ -2,10 +2,10 @@ :root { --light: #faf8f8; --dark: #141021; - --navy: #284b63; - --olive: #84a59d; + --secondary: #284b63; + --tertiary: #84a59d; --visited: #afbfc9; - --salmon: #f28482; + --primary: #f28482; --gray: #4e4e4e; --lightgray: #f0f0f0; --outlinegray: #dadada; @@ -14,10 +14,10 @@ [saved-theme="dark"] { --light: #1e1e21 !important; --dark: #fbfffe !important; - --navy: #5b778a !important; + --secondary: #5b778a !important; --visited: #4a575e !important; - --olive: #84a59d !important; - --salmon: #f58382 !important; + --tertiary: #84a59d !important; + --primary: #f58382 !important; --gray: #d4d4d4 !important; --lightgray: #292633 !important; --outlinegray: #343434 !important; diff --git a/layouts/index.html b/layouts/index.html index a68d61fb..5dccbf90 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -5,6 +5,7 @@ {{define "main"}}
+ {{partial "darkmode.html" .}} {{.Content}} @@ -12,4 +13,10 @@ {{partial "footer.html" .}}
+ +{{- with resources.Get "darkmode.js" | minify -}} + +{{- end -}} {{end}} \ No newline at end of file diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index c315b8f8..81ea3f4b 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -2,11 +2,11 @@
+

Interactive Graph

{{end}} {{end}} - \ No newline at end of file + +{{ template "_internal/google_analytics.html" . }} \ No newline at end of file From 69e42886a6a7e094577618f4b37c6dde3b540c1d Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 16:40:53 -0400 Subject: [PATCH 0007/1221] flesh out docs --- content/moc/directory.md | 2 ++ content/moc/showcase.md | 10 ++++++ content/notes/config.md | 43 ++++++++++++++++++++++-- content/notes/editing.md | 14 ++++++++ content/notes/hosting.md | 41 ++++++++++++++++++++-- content/notes/images/google-domains.png | Bin 0 -> 73570 bytes content/notes/obsidian.md | 22 +++++++++--- content/notes/troubleshooting.md | 35 +++++++++++++++++++ data/graphConfig.yaml | 6 ---- 9 files changed, 157 insertions(+), 16 deletions(-) create mode 100644 content/moc/showcase.md create mode 100644 content/notes/images/google-domains.png diff --git a/content/moc/directory.md b/content/moc/directory.md index 7726de83..039fd81c 100644 --- a/content/moc/directory.md +++ b/content/moc/directory.md @@ -12,6 +12,8 @@ Let's get to business and get you started! - 🎨 [Customizing and Styling Quartz](notes/config.md) - 🌍 [Hosting Quartz online!](notes/hosting.md) +Not convinced yet? Look at some [cool digital gardens](moc/showcase) + ## Troubleshooting - 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) - 🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues) \ No newline at end of file diff --git a/content/moc/showcase.md b/content/moc/showcase.md new file mode 100644 index 00000000..3c2a0b4a --- /dev/null +++ b/content/moc/showcase.md @@ -0,0 +1,10 @@ +--- +title: "Showcase" +--- + +Want to see what Quartz can do? Here are some cool community gardens :) + +- [Quartz Documentation (this site!)](https://quartz.jzhao.xyz/) +- [Jacky Zhao's Garden](https://jzhao.xyz/toc/directory/) + +If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/hugo/content/moc/showcase.md)! \ No newline at end of file diff --git a/content/notes/config.md b/content/notes/config.md index 89e7d8db..f7014737 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -2,7 +2,44 @@ title: "Configuration" --- +## Configuration +Quartz is designed to be extremely configurable. You can find the bulk of the configuration scattered throughout the repository depending on how in-depth you'd like to get. + +The majority of configuration can be be found under `data/config.yaml`. An annotated example configuration is shown below. + +```yaml +name: Your name here! # Shows in the footer +enableToc: true # Whether to show a Table of Contents +description: Page description to show to search engines +page_title: Quartz Example Page # Default Page Title + +links: # Links to show in footer + - link_name: Twitter + link: https://twitter.com/_jzhao + - link_name: Github + link: https://github.com/jackyzha0 +``` + +### Graph View +To customize the Interactive Graph view, you can poke around `data/graphConfig.yaml`. + +```yaml +enableLegend: false # automatically generate a legend +enableDrag: true # allow dragging nodes in the graph +enableZoom: true # allow zooming and panning the graph +paths: # colour specific nodes path off of their path + - /moc: "#4388cc" +``` + + ## Styling -## Layouts -### Home Page -### Partials \ No newline at end of file +Want to go even more in-depth? You can add custom CSS styling and change existing colours through editing `assets/custom.scss`. If you'd like to target specific parts of the site, you can add ids and classes to the HTML partials in `/layouts/partials`. + +### Partials +Partials are what dictate what actually gets rendered to the page. Want to change how pages are styled and structured? You can edit the appropriate layout in `/layouts`. + +For example, the structure of the home page can be edited through `/layouts/index.html`. To customize the footer, you can edit `/layouts/partials/footer.html` + +More info about partials on [Hugo's website.](https://gohugo.io/templates/partials/) + +Still having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md). \ No newline at end of file diff --git a/content/notes/editing.md b/content/notes/editing.md index 3264d4b0..6b477679 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -7,6 +7,8 @@ Quartz runs on top of [Hugo](https://gohugo.io/) so all notes are written in [Ma **All content in your garden can found in the `/content` folder.** To make edits, you can open any of the files and make changes directly and save it. You can organize content into any folder you'd like. +**To edit the main home page, open `/content/_index.md`.** + To create a link, just create a normal link using Markdown pointing to the document in question. Please note that **all links should be relative to the root `/content` path**. ```markdown @@ -14,6 +16,18 @@ For example, I want to link this current document to `config.md`. [A link to the config page](config.md) ``` +### Front Matter +Hugo is picky when it comes to metadata for files. Ensure that you have a title defined at the top of your file like so: + +```markdown +--- +title: "Example Title" +--- + +## Headers should start at H2 +Rest of your content here... +``` + ### Obsidian I *strongly* recommend using [Obsidian](http://obsidian.md/) as a way to edit and grow your digital garden. It comes with a really nice editor and graphical interface to preview all of my local files. diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 18717f87..8ddaf1cb 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -2,13 +2,48 @@ title: "Deploying to GitHub Pages" --- + ## GitHub Pages +Quartz is designed to be effortless to deploy. If you forked and cloned Quartz directly from the repository, everything should already be good to go! You can head to ` +``` + +### Registrar +For this last bit to take effect, you also need to create a CNAME record with the DNS provider you register your domain with (i.e. NameCheap, Google Domains). + +GitHub has some [documentation on this](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site), but the tldr; is to + +1. Go to your forked repository (`github.com//quartz`) settings page and go to the Pages tab. Under "Custom domain", type your custom domain, then click **Save**. +2. Go to your DNS Provider and create a CNAME record that points from your domain to `pFh1Jp>@^zikbiQ%MZ?;JNN3<&6|cP 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%0D#U0UdtI3sPMQg+A@p5a9C9rAv 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 Files and Links, set the New link format to always be Absolute Path in Vault and disabled WikiLinks so Obsidian generates regular Markdown links. + +![Obsidian Settings](/notes/images/obsidian-settings.png)*Obsidian Settings* + +## Templates +Inserting front matter everytime you want to create a new Note gets really annoying really quickly. Luckily, Obsidian supports templates which makes inserting new content really easily. + +**If you decide to overwrite the `/content` folder completely, don't remove the `/content/templates` folder!** + +Head over to Options > Core Plugins and enable the Templates plugin. Then go to Options > Hotkeys and set a hotkey for 'Insert Template'. That way, when you create a new note, you can just press the hotkey for a new template and be ready to go! \ No newline at end of file diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index 8a986b16..db3da72b 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -1,3 +1,38 @@ --- title: "Troubleshooting and FAQ" --- + +## Common Pitfalls +### How come my notes aren't being rendered? +You probably forgot to include front matter in your Markdown files. You can either setup [Obsidian](notes/obsidian) to do this for you or you need to manually define it. More details in [the 'how to edit' guide](notes/editing.md). + +### My custom domain isn't working! +Walk through the steps in [the hosting guide](notes/hosting.md) again. Make sure you wait 30 min to 1 hour for changes to take effect. + +### How do I setup Google Analytics? +You can edit it in `config.toml` and either use a V3 (UA-) or V4 (G-) tag. + +### How do I change the content on the home page? +To edit the main home page, open `/content/_index.md`. + +### How do I change the colours? +You can change the theme by editing `assets/custom.scss`. More details on customization and themeing can be found in the [customization guide](notes/config.md). + +### How do I add images? +You can put images anywhere in the `/content` folder. The only caveat is that you should reference them in your Markdown by prefixing it with a `/`. + +```markdown +Example image (source is in content/notes/images/example.png) +![Example Image](/content/notes/images/example.png) +``` + +### My Interactive Graph and Backlinks aren't up to date +By default, the `linkIndex.yaml` (which Quartz needs to generate the Interactive Graph and Backlinks) are not regenerated locally. To set that up, see the guide on [local editing](notes/editing.md) + +### Can I use React/Vue/some other framework? +Not out of the box. You could probably make it work by editing `/layouts/_default/single.html` but that's not what Quartz is designed to work with. 99% of things you are trying to do with those frameworks you can accomplish perfectly fine using just vanilla HTML/CSS/JS. + +## Still Stuck? +Quartz isn't perfect! If you're still having troubles, file an issue in the GitHub repo with as much information as you can reasonably provide. + +🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues) \ No newline at end of file diff --git a/data/graphConfig.yaml b/data/graphConfig.yaml index 67f481bd..4104e428 100644 --- a/data/graphConfig.yaml +++ b/data/graphConfig.yaml @@ -1,11 +1,5 @@ enableLegend: false enableDrag: true enableZoom: true -base: - node: "#284b63" - activeNode: "#f28482" - inactiveNode: "#a8b3bd" - link: "#babdbf" - activeLink: "#5a7282" paths: - /moc: "#4388cc" \ No newline at end of file From ef396d552debc0860bba2b5fdbd2902839252ac6 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 16:46:34 -0400 Subject: [PATCH 0008/1221] bump ga ver --- .github/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index ba148252..df50f6b5 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Build Link Index - uses: jackyzha0/hugo-obsidian@v2.0 + uses: jackyzha0/hugo-obsidian@v2.1 with: input: content output: data From 233e1e85fb60da10f505cceba5f39a6f671793d9 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 16:49:21 -0400 Subject: [PATCH 0009/1221] wording update --- content/moc/directory.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/moc/directory.md b/content/moc/directory.md index 039fd81c..5eee52ff 100644 --- a/content/moc/directory.md +++ b/content/moc/directory.md @@ -12,7 +12,7 @@ Let's get to business and get you started! - 🎨 [Customizing and Styling Quartz](notes/config.md) - 🌍 [Hosting Quartz online!](notes/hosting.md) -Not convinced yet? Look at some [cool digital gardens](moc/showcase) +Not convinced yet? Look at some [cool community digital gardens](moc/showcase)! ## Troubleshooting - 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) From df425a8ab4bd9b7cd72e90e5a4e0c0ea81a49d41 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 20:48:26 -0400 Subject: [PATCH 0010/1221] replace readme --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7fca44d8..079e6c10 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ # Quartz Simple second brain and digital garden. -```shell -# Installation -go install github.com/jackyzha0/hugo-obsidian +> “He who works with the door open gets all kinds of interruptions, but he also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming -# Run -hugo-obsidian -input=content -output=data -``` \ No newline at end of file +🔗 Get Started: https://quartz.jzhao.xyz/ \ No newline at end of file From 35fa8d882310bbef4e3d6a482b1c092044a16144 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 22:10:37 -0400 Subject: [PATCH 0011/1221] better mobile support --- assets/base.scss | 4 ++++ content/_index.md | 2 +- content/notes/hosting.md | 3 +++ content/notes/troubleshooting.md | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/assets/base.scss b/assets/base.scss index 8d84a9f3..f547e784 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -204,6 +204,10 @@ a[href^="/"] { display: flex; flex-direction: row; + @media all and (max-width: 780px) { + flex-direction: column; + } + & > * { flex: 1 0 0; } diff --git a/content/_index.md b/content/_index.md index c46b25a2..4b44062f 100644 --- a/content/_index.md +++ b/content/_index.md @@ -11,7 +11,7 @@ I've personally found that > “He who works with the door open gets all kinds of interruptions, but he also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming -**The goal of Quartz is to make hosting your own public digital garden free and simple.** +**The goal of Quartz is to make hosting your own public digital garden free and simple.** You don't even need your own website. Quartz does all of that for you and gives your own little corner of the internet. ## Get Started The entire Quartz documentation is fully hosted using Quartz! You can navigate it using the interactive Graph view below. diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 8ddaf1cb..00e9aefd 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -8,6 +8,9 @@ Quartz is designed to be effortless to deploy. If you forked and cloned Quartz d By default, Github Actions will run on forks of repos. You should not need to do any more config to see it up to date. +### Pushing Changes +[TODO] + ### Custom subdomain Have a fancy custom domain or want to subdomain your Quartz? That's easy too. diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index db3da72b..fe0c9723 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -3,6 +3,9 @@ title: "Troubleshooting and FAQ" --- ## Common Pitfalls +### Do I need a website already? +No! Setting up Quartz means you set up a site too :) + ### How come my notes aren't being rendered? You probably forgot to include front matter in your Markdown files. You can either setup [Obsidian](notes/obsidian) to do this for you or you need to manually define it. More details in [the 'how to edit' guide](notes/editing.md). From b841471613d35ef3983aba518d5aae81fba60926 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Sun, 18 Jul 2021 22:18:26 -0400 Subject: [PATCH 0012/1221] add pushing changes docs --- content/notes/hosting.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 00e9aefd..31865673 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -9,7 +9,19 @@ Quartz is designed to be effortless to deploy. If you forked and cloned Quartz d By default, Github Actions will run on forks of repos. You should not need to do any more config to see it up to date. ### Pushing Changes -[TODO] +Quartz is essentially a `git` repository so updating it is the same workflow as you would follow as normal. + +```shell +# Navigate to Quartz folder +cd + +# Commit all changes +git add . +git commit -m "message describing changes" + +# Push to GitHub to update site +git push origin hugo +``` ### Custom subdomain Have a fancy custom domain or want to subdomain your Quartz? That's easy too. From c0ee39a9370295e6c6096bacf4948647fd62855b Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Mon, 19 Jul 2021 00:36:15 -0400 Subject: [PATCH 0013/1221] more desc --- content/_index.md | 8 ++-- content/notes/editing.md | 57 +++++++++++------------- content/notes/hosting.md | 32 ++++++++++--- content/notes/images/github-actions.png | Bin 0 -> 118756 bytes content/notes/images/github-pages.png | Bin 0 -> 231282 bytes content/notes/troubleshooting.md | 14 +++++- 6 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 content/notes/images/github-actions.png create mode 100644 content/notes/images/github-pages.png diff --git a/content/_index.md b/content/_index.md index 4b44062f..c24bd6f0 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,5 +1,5 @@ # 🌱 Quartz -Simple second brain and digital garden. +Simple second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening). ## Why Quartz? Hosting a public digital garden isn't easy. There are an overwhelming number of tutorials, resources, and guides for tools like [Notion](https://www.notion.so/), [Roam](https://roamresearch.com/), and [Obsidian](https://obsidian.md/), yet none of them have super easy to use *free* tools to publish that garden to the world. @@ -11,11 +11,11 @@ I've personally found that > “He who works with the door open gets all kinds of interruptions, but he also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming +I was really inspired by [Bianca](https://garden.bianca.digital/) and [Joel](https://joelhooks.com/digital-garden)'s digital gardens and wanted to try making my own. + **The goal of Quartz is to make hosting your own public digital garden free and simple.** You don't even need your own website. Quartz does all of that for you and gives your own little corner of the internet. ## Get Started -The entire Quartz documentation is fully hosted using Quartz! You can navigate it using the interactive Graph view below. - -If you'd prefer more traditional navigation, you can also find all relevant pages through the main directory. +The entire Quartz documentation is fully hosted using Quartz! To get started, let's visit the main directory. 👉 [Directory](moc/directory.md) \ No newline at end of file diff --git a/content/notes/editing.md b/content/notes/editing.md index 6b477679..2cb95721 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -5,11 +5,21 @@ title: "Editing Content in Quartz" ## Editing Quartz runs on top of [Hugo](https://gohugo.io/) so all notes are written in [Markdown](https://www.markdownguide.org/getting-started/). +### Obsidian +I *strongly* recommend using [Obsidian](http://obsidian.md/) as a way to edit and grow your digital garden. It comes with a really nice editor and graphical interface to preview all of my local files. + +**🔗 [How to link your Obsidian Vault](notes/obsidian.md)** + +Of course, all the files are in Markdown so you could just use your favourite text editor of choice, I'm not going to stop you! + +### Folder Structure +Here's a rough overview of what's what. + **All content in your garden can found in the `/content` folder.** To make edits, you can open any of the files and make changes directly and save it. You can organize content into any folder you'd like. -**To edit the main home page, open `/content/_index.md`.** +**To edit the main home page, open `/content/_index.md`.** This is the home page which is slightly special. You don't need front matter here! -To create a link, just create a normal link using Markdown pointing to the document in question. Please note that **all links should be relative to the root `/content` path**. +To create a link between notes in your garden, just create a normal link using Markdown pointing to the document in question. Please note that **all links should be relative to the root `/content` path**. ```markdown For example, I want to link this current document to `config.md`. @@ -24,44 +34,18 @@ Hugo is picky when it comes to metadata for files. Ensure that you have a title title: "Example Title" --- -## Headers should start at H2 Rest of your content here... ``` -### Obsidian -I *strongly* recommend using [Obsidian](http://obsidian.md/) as a way to edit and grow your digital garden. It comes with a really nice editor and graphical interface to preview all of my local files. - -**🔗 [How to link your Obsidian Vault](notes/obsidian.md)** - -Of course, all the files are in Markdown so you could just use your favourite text editor of choice, I'm not going to stop you! - ## Previewing Changes This step is purely optional and mostly for those who want to see the published version of their digital garden locally before opening it up to the internet. For those who like to live life more on the edge, viewing the garden through Obsidian gets you pretty close to the real thing. -### Installing Hugo -Hugo is the static site generator that powers Quartz. If you'd like to preview your site locally, [install Hugo](https://gohugo.io/getting-started/installing/). - -``` -# Navigate to your local Quartz folder -$ cd - -# Start local server -$ hugo server - -# View your site in a browser at http://localhost:1313/ -``` - ### Install `hugo-obsidian` -This step is **doubly optional** and only applies to those who want to see their Interactive Graph and backlinks locally while previewing changes on the site. - -Ensure you have Go (>= 1.16) installed. +This step will generate the list of backlinks for Hugo to parse. Ensure you have [Go](https://golang.org/doc/install) (>= 1.16) installed. ```shell -# Clone the Repository -$ git clone https://github.com/jackyzha0/hugo-obsidian.git - # Install and link `hugo-obsidian` locally -$ go install . +$ go install github.com/jackyzha0/hugo-obsidian # Navigate to your local Quartz folder $ cd @@ -72,6 +56,19 @@ $ hugo-obsidian -input=content -output=data Afterwards, start the Hugo server as shown above and your local backlinks and interactive graph should be populated! +### Installing Hugo +Hugo is the static site generator that powers Quartz. If you'd like to preview your site locally, [install Hugo](https://gohugo.io/getting-started/installing/). + +``` +# Navigate to your local Quartz folder +$ cd + +# Start local server +$ hugo server + +# View your site in a browser at http://localhost:1313/ +``` + ## Publishing Changes Now that you know the basics of managing your digital garden using Quartz, you can publish it to the internet! diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 31865673..4a5a06b9 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -6,10 +6,22 @@ title: "Deploying to GitHub Pages" ## GitHub Pages Quartz is designed to be effortless to deploy. If you forked and cloned Quartz directly from the repository, everything should already be good to go! You can head to `.github.io` (which GitHub gives to you for free!) as your domain. -Change `baseURL` in `/config.toml`. [Reference.](https://github.com/jackyzha0/quartz/blob/hugo/config.toml) +[Reference.](https://github.com/jackyzha0/quartz/blob/hugo/config.toml) ```toml baseURL = "https:///" ``` -Change `cname` in `/.github/workflows/deploy.yaml`. [Reference.](https://github.com/jackyzha0/quartz/blob/hugo/.github/workflows/deploy.yaml) +Change `cname` in `/.github/workflows/deploy.yaml`. Again, if you don't have a custom domain to use, you can use `.github.io`. + +[Reference.](https://github.com/jackyzha0/quartz/blob/hugo/.github/workflows/deploy.yaml) ```yaml - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: - github_token: ${{ secrets.GITHUB_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} # this can stay as is, GitHub fills this in for us! publish_dir: ./public publish_branch: master cname: ``` ### Registrar +This step is only applicable if you are using a **custom domain**! If you are using `.github.io`, you can skip this step. + For this last bit to take effect, you also need to create a CNAME record with the DNS provider you register your domain with (i.e. NameCheap, Google Domains). GitHub has some [documentation on this](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site), but the tldr; is to diff --git a/content/notes/images/github-actions.png b/content/notes/images/github-actions.png new file mode 100644 index 0000000000000000000000000000000000000000..8e977cb17794657bc8c52c50f0387b95323f37ba GIT binary patch literal 118756 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 literal 0 HcmV?d00001 diff --git a/content/notes/images/github-pages.png b/content/notes/images/github-pages.png new file mode 100644 index 0000000000000000000000000000000000000000..2c606f588f22641ba11fcf97310d3e694fb25d95 GIT binary patch literal 231282 zcmeFZWmr`0`!+g?f(1w;DXpY*gGjf4bO}gzH;AA#sB{j}J<=W0-QCg+Lk%%7@0!PW zfBX5pANKyRkG((q=QxIg1+2C1`&!p^Ugvq<_YnMAK@$A|(E|_&gf1;5rVIi-Fa&|_ zy4^zsep2K6dI$u13X&ERdE=J6JMZcgZ9IdvM0{JuOhoLK-w>{tJ%J~SrS?OH2SE*? z4HO~ss<@t$;}u4t;&(h*(kMex3=Nc?zM-IJZGK9zdgUJ}6)!FI>1Dd!ByVy`&0@}6 zl$he#`HH&*E*>7(*8YonRtiw*59KM>Y)37 z4?fe1$o)Nd&vD=I_TQsS>Bl&K51z_@i2r*4GXI}j{RzhZ1n^HJK>znQno6l`GgSB#LG#GHg;R(rxBzOVswl@@@XqO0F1Z z2=L0U4dygf5;5rOzv4XFpv$kt11+)Si!}6^MUTIJ`ln!SsBhRr`t*+p+LFN=_)QRX zZuadlP5y~|T?Px|d#^yCg3jfZ7L7OGdGMLxOzSM?*DU^plhsNbRMEN<2F87*69I&_s3n$B$6U8~F0e_1bVEv5Z1g)j7Q1Cw-^CIT7hw zQ*5z{9)C(S=6Hk)dR=j}!4g#CE{pgY6!ixQmLiKxRJp(NG0{K6ZMg%=PeDE1#s>%R zZfw+)F-q4|MkB56Wvr{d@7Bzq0_Pubbu=Qg{ zATq0iieh47t*EE@)x@Cp?|OYCyTM>P`af_47r8d~k4MHoC@aTcqNgi&*#-pqI^NUu zObE|$`hfZO1)Irx!Q4SLc1mJmV|isRc&@iWuWOB)3K*~E|A64R(Zwh#D**wnm{^-u zg{7)J9SD@AeOA{~x~ThiSh2vc%F^tl#R4q5Z@ss$o<5-O^>O_Jhc_BG<^PF*8apZJ_XTc?`GC!T}1@%n5wp3_pTu<7Qq z#6B=$*r(M+sZMP#-v%;O4QUFdiWH*74i-BR`gzWCFejuskNx*jZytV#SA7cG056a9 z-jE((kSlG+?^Vuo6*pY=OuhBTxBOl078bcT+5UFGOO|=Q?E3)Y!QFTLVT!Ki3XPkyd%w7Q1QNPNf&&zQPck4cRG|*$;bs> z`AHh2jbJt^N=hy3q4E%ZO^Y8bV!I76AJ&bWxuBq_LdT8sLDDM8(d-?%@DzSmo8(y- zobX~;5)11~Lc){QMGq<>PK$CakDcl*6D+Kf+2Xp62G_+3tuqivhTFMgr0LOc<0*g} zfAHG`PXdni36(=(Lk%5F5hsD^l{W?Tb$$aIkgqRrRmmtL4@nWVu z@`*RCZ%9&>q=|X&&(%PG1d?~SBChlq^_1fsBHLvjtW3h;=bXY#)oO>cw(S*nAFjs{ zHWli9uTJY5tf{uMmy73NUGRa;$G@;QWMtN8Oo`l=glfT4m{u;Cu<80tyJr0lN`YSTB?r}@Qe!_fyh?Em1s(tv7Hr

wPkjz7=o|sfbY!dU=d}5d<^EhW9Fkk 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%0D#Q%D76p60{ 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 )5`YXX zji=*UBAXpRZV~VYS)@A^`uZuJ-#$ z^M+k*Rws8+>*0N^8%&c?#PzGe3Ij9h4X&efaTna+p)bx}`iB=kP_Vl>H0Mpi37WBU z^rzrp=+{qylDYK6=fmf{K6Ob~J|=3%h0T-S5H|U4Ex)_yF@Gpd@6pgld@-)JD|-Ug zIJPZFY+?8Z$k^@?<}@h4CGWBsvH*k>g?yAGq<4jqsJSvh=5cY7-*H@U3i<j*IWV|&|N@yMaadxKY&!JD2mxHHa`qNtAd9y*SJ9jD+9?QU9+CTYibWqZE zW5a&dyh{SKzH|^BCj~8&X}%J2^iuxv;iIU4P`?5oB!Yf?&C3C9{%8Ykw0o5xqMFtw zEqFELD3z(M8_X$8i0Z1evc25wJCx7PXEmuXBj|!A^L~`@55ln6gXIs2LQ5S4zA&Kk zx*Wm}tzTp}85tK|`*;Lkl6L$!_Wud#)y z$IS)kUSwla$ZUR)gfV&a=�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⪙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

  • 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�m2XTeGI9$jTkS!}yd9ta@&KI;fiVo_k~E}3d` z{oY1Q-ve{A*-iqZ%!MK~u8(3i^sJz;pn8{o=2mJ@&;28zBjs2xV47iroUvRh%=z}M zFxPgn1P#n`ceF+~rS-se*b9G?*28gAm?&b=`i=FVCG*#nb!-okK5F!pORj4U5mDt; zJU4uSv7Y!rPTAKRp+!$hBr>nn`CR|QVCcd7IKUL^J=mrr`RynK>XPQ*hG&mxB zv15}aDjN#5x^g{%QR~8M+ztp8Rh)_Fb2O~-WTNDTgX}!+{a&-c{{>TP$2<^x>pDdT zy>)LN)kg_(TF4P2as^B|f#yjQM@R|D+aD_vq3k4^w!irB={&Xp2HzsL+s^C)P~{u? z8EAn30pn%t@d4y=n-$%iBL;^4?@P_Zj(s4w@I0J&#BFE8Aw>wD2xi5P-~`T*ynhw* z07qAOp%^|}2krJCm5g2kWI<;CX8LeZ3{oxha!po+{3jjXQk1{ehf_+@4&}BPaEgw& zg*RzHQkwL^V&*=|n1OfE^~#KZvg>P;;YWU6MiWMG)7m8BF@4Ai=~!sb=tZM~`_RzZ zAhQbjuzG4=`A!Bma(V0V2ACv#=o^8DRk_DXp+Ci%|52{I?by_&BIS_SMf{VZ*$z; znZDl6jE91R>Ao=Q8)e<`P#`8T;f$_h7oD&tTge~xl{2!BWv6kzmlMt@>}bn_!R}+V zyl_EX)s#di0-vZq$zg=Gd2MBA{cY~Zm%g`i{4;$0(M&|*$??a$avr`9JTqWBg0$y#@?>`*$7ylJdiQ qO%?~B|9nMm!GA0!pRo{#z0M%vbN%X#(?83s13%~VMYa8vZ~g?FiSKv- literal 0 HcmV?d00001 diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index fe0c9723..7d508c63 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -6,6 +6,18 @@ title: "Troubleshooting and FAQ" ### Do I need a website already? No! Setting up Quartz means you set up a site too :) +### `command not found: hugo-obsidian` +Make sure you set your `GOPATH` correctly! This will allow your terminal to correctly recognize `hugo-obsidian` as an executable. + +``` +# Add the following 2 lines to your ~/.bash_profile +export GOPATH=/Users/$USER/go +export PATH=$GOPATH/bin:$PATH + +# In your current terminal, to reload the session +source ~/.bash_profile +``` + ### How come my notes aren't being rendered? You probably forgot to include front matter in your Markdown files. You can either setup [Obsidian](notes/obsidian) to do this for you or you need to manually define it. More details in [the 'how to edit' guide](notes/editing.md). @@ -36,6 +48,6 @@ By default, the `linkIndex.yaml` (which Quartz needs to generate the Interactive Not out of the box. You could probably make it work by editing `/layouts/_default/single.html` but that's not what Quartz is designed to work with. 99% of things you are trying to do with those frameworks you can accomplish perfectly fine using just vanilla HTML/CSS/JS. ## Still Stuck? -Quartz isn't perfect! If you're still having troubles, file an issue in the GitHub repo with as much information as you can reasonably provide. +Quartz isn't perfect! If you're still having troubles, file an issue in the GitHub repo with as much information as you can reasonably provide. Alternatively, you can message me on [Twitter](https://twitter.com/_jzhao) and I'll try to get back to you as soon as I can. 🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues) \ No newline at end of file From 875d3f8e069125af9a7fa4734b9c89eda6970dd7 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Mon, 19 Jul 2021 00:40:55 -0400 Subject: [PATCH 0014/1221] improve docs --- content/notes/editing.md | 4 ++-- content/notes/hosting.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/notes/editing.md b/content/notes/editing.md index 2cb95721..0975f492 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -22,8 +22,8 @@ Here's a rough overview of what's what. To create a link between notes in your garden, just create a normal link using Markdown pointing to the document in question. Please note that **all links should be relative to the root `/content` path**. ```markdown -For example, I want to link this current document to `config.md`. -[A link to the config page](config.md) +For example, I want to link this current document to `notes/config.md`. +[A link to the config page](notes/config.md) ``` ### Front Matter diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 4a5a06b9..db42aa17 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -9,7 +9,7 @@ Quartz is designed to be effortless to deploy. If you forked and cloned Quartz d ### Enable GitHub Actions By default, GitHub disables workflows from running automatically on Forked Repostories. Head to the 'Actions' tab of your forked repository and Enable Workflows to setup deploying your Quartz site! -![Enable GitHub Actions](notes/images/github-actions.png)*Enable GitHub Actions* +![Enable GitHub Actions](/notes/images/github-actions.png)*Enable GitHub Actions* ### Enable GitHub Pages @@ -18,7 +18,7 @@ Head to the 'Settings' tab of your forked repository and go to the 'Pages' tab. 1. Set the source to deploy from `master` using `/ (root)` 2. Set a custom domain here if you have one! -![Enable GitHub Pages](notes/images/github-pages.png)*Enable GitHub Pages* +![Enable GitHub Pages](/notes/images/github-pages.png)*Enable GitHub Pages* ### Pushing Changes To see your changes on the internet, we need to push it them to GitHub. Quartz is essentially a `git` repository so updating it is the same workflow as you would follow as normal. From d197e191428ce765583009a24d28555c80570755 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Mon, 19 Jul 2021 16:30:36 -0400 Subject: [PATCH 0015/1221] fix 404 styling --- assets/base.scss | 4 ++++ layouts/404.html | 14 +++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/assets/base.scss b/assets/base.scss index f547e784..025c2035 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -231,4 +231,8 @@ a[href^="/"] { border: var(--outlinegray) 1px solid; border-radius: 5px } +} + +.centered { + margin-top: 30vh; } \ No newline at end of file diff --git a/layouts/404.html b/layouts/404.html index a27fdf25..232fada8 100644 --- a/layouts/404.html +++ b/layouts/404.html @@ -3,16 +3,20 @@ {{ partial "head.html" . }} - - -{{- with resources.Get "darkmode.js" | minify -}} - -{{- end -}} - \ No newline at end of file + diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 14a3b05d..9e647ffa 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -18,13 +18,6 @@

    Table of Contents

    {{partial "footer.html" .}} - -{{- with resources.Get "darkmode.js" | minify -}} - -{{- end -}} - - \ No newline at end of file + diff --git a/layouts/index.html b/layouts/index.html index 83f6fb8a..fdc03b1f 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -13,10 +13,4 @@ {{partial "footer.html" .}} - -{{- with resources.Get "darkmode.js" | minify -}} - -{{- end -}} -{{end}} \ No newline at end of file +{{end}} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index e53ebe1d..3810078c 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -17,5 +17,11 @@ {{end}} {{end}} + + {{- with resources.Get "darkmode.js" | minify -}} + + {{- end -}} -{{ template "_internal/google_analytics.html" . }} \ No newline at end of file +{{ template "_internal/google_analytics.html" . }} From a0ff5ec48c4db78e553beb15889e92dc6193f6d3 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Wed, 18 Aug 2021 17:17:09 -0700 Subject: [PATCH 0022/1221] fix language highlighting --- content/notes/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index 3a966592..3552fc93 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -15,7 +15,7 @@ No! Setting up Quartz means you set up a site too :) ### `command not found: hugo-obsidian` Make sure you set your `GOPATH` correctly! This will allow your terminal to correctly recognize `hugo-obsidian` as an executable. -``` +```shell # Add the following 2 lines to your ~/.bash_profile export GOPATH=/Users/$USER/go export PATH=$GOPATH/bin:$PATH From 1c851271ea38826cd7a0d027b25bd12452e979fe Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Fri, 27 Aug 2021 14:08:11 -0400 Subject: [PATCH 0023/1221] add search support --- .github/workflows/deploy.yaml | 3 +- .gitignore | 3 +- assets/base.scss | 116 +++++++++++++++++ assets/darkmode.scss | 81 +++++------- content/_index.md | 2 +- content/notes/preview-changes.md | 2 +- layouts/_default/single.html | 9 +- layouts/partials/darkmode.html | 3 +- layouts/partials/header.html | 0 layouts/partials/search.html | 208 +++++++++++++++++++++++++++++++ 10 files changed, 367 insertions(+), 60 deletions(-) delete mode 100644 layouts/partials/header.html create mode 100644 layouts/partials/search.html diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index df50f6b5..21901945 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -12,8 +12,9 @@ jobs: - uses: actions/checkout@v2 - name: Build Link Index - uses: jackyzha0/hugo-obsidian@v2.1 + uses: jackyzha0/hugo-obsidian@v2.3 with: + index: true input: content output: data diff --git a/.gitignore b/.gitignore index c216e497..1eaad608 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ public resources .idea content/.obsidian -data/linkIndex.yaml \ No newline at end of file +data/linkIndex.yaml +data/contentIndex.yaml \ No newline at end of file diff --git a/assets/base.scss b/assets/base.scss index 025c2035..a1b5c7b8 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -235,4 +235,120 @@ a[href^="/"] { .centered { margin-top: 30vh; +} + +header { + display: flex; + flex-direction: row; + align-items: center; + + & > nav { + @media all and (max-width: 600px) { + display: none; + } + + & > a { + margin-left: 2em; + } + } + + & > .spacer { + flex: 1 1 auto; + } + + & > svg { + cursor: pointer; + width: 18px; + min-width: 18px; + margin: 0 1em; + + &:hover .search-path { + stroke: var(--tertiary); + } + + .search-path { + stroke: var(--gray); + stroke-width: 2px; + transition: stroke 0.5s ease; + } + } +} + +#search-container { + position: fixed; + z-index: 9999; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + display: none; + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + + & > div { + width: 50%; + margin-top: 15vh; + margin-left: auto; + margin-right: auto; + + @media all and (max-width: 1200px) { + width: 90%; + } + + & > * { + width: 100%; + border-radius: 4px; + background: var(--light); + box-shadow: 0 14px 50px rgba(27, 33, 48, 0.12), 0 10px 30px rgba(27, 33, 48, 0.16); + margin-bottom: 2em; + } + + & > input { + box-sizing: border-box; + padding: 0.5em 1em; + font-family: Inter, sans-serif; + color: var(--dark); + font-size: 1.1em; + border: 1px solid var(--outlinegray); + + &:focus { + outline: none; + } + } + + & > #results-container { + & > .result-card { + padding: 1em; + cursor: pointer; + transition: background 0.2s ease; + border: 1px solid var(--outlinegray); + border-bottom: none; + + &:hover { + background: rgba(180, 180, 180, 0.15); + } + + &:first-of-type { + border-top-left-radius: 5px; + border-top-right-radius: 5px; + } + + &:last-of-type { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-bottom: 1px solid var(--outlinegray); + } + + & > h3, & > p { + margin: 0; + } + + & .search-highlight { + background-color: #afbfc966; + padding: 0.05em 0.2em; + border-radius: 3px; + } + } + } + } } \ No newline at end of file diff --git a/assets/darkmode.scss b/assets/darkmode.scss index dde5be66..61967d79 100644 --- a/assets/darkmode.scss +++ b/assets/darkmode.scss @@ -1,67 +1,44 @@ - .darkmode { - text-align: right; + float: right; + padding: 1em; + min-width: 30px; + position: relative; + + @media all and (max-width: 450px) { + padding: 1em; + } & > .toggle { display: none; box-sizing: border-box; - - &:checked + .toggle-button:after { - left: 50%; - } - - & + .toggle-button { - box-sizing: border-box; - outline: 0; - display: inline-block; - width: 3em; - height: 1.5em; - position: relative; - cursor: pointer; - border: 2px solid var(--gray); - user-select: none; - padding: 2px; - transition: all 0.2s ease; - border-radius: 2em; - - &:after, &:before { - position: relative; - display: block; - box-sizing: border-box; - content: ""; - width: 50%; - height: 100%; - } - - &:before { - display: none; - } - - &:after { - left: 0; - transition: all 0.2s ease; - background: var(--gray); - content: ""; - border-radius: 1em; - } - } } - & #dayIcon { - position: relative; + & svg { + opacity: 0; + position: absolute; width: 20px; height: 20px; - top: -1.5px; + top: calc(50% - 10px); margin: 0 7px; fill: var(--gray); + transition: opacity 0.1s ease; } +} - & #nightIcon { - position: relative; - width: 18px; - height: 18px; - top: -2px; - margin: 0 7px; - fill: var(--gray); +.toggle:checked ~ label { + & > #dayIcon { + opacity: 0; + } + & > #nightIcon { + opacity: 1; + } +} + +.toggle:not(:checked) ~ label { + & > #dayIcon { + opacity: 1; + } + & > #nightIcon { + opacity: 0; } } \ No newline at end of file diff --git a/content/_index.md b/content/_index.md index 3d19704a..b665a3de 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,5 +1,5 @@ # 🌱 Quartz -## v1.1 +## v2.0 Simple second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening). diff --git a/content/notes/preview-changes.md b/content/notes/preview-changes.md index 21e106ad..dac619e0 100644 --- a/content/notes/preview-changes.md +++ b/content/notes/preview-changes.md @@ -15,7 +15,7 @@ $ go install github.com/jackyzha0/hugo-obsidian $ cd # Scrape all links in your Quartz folder and generate info for Quartz -$ hugo-obsidian -input=content -output=data +$ hugo-obsidian -input=content -output=data -index=true ``` Afterwards, start the Hugo server as shown above and your local backlinks and interactive graph should be populated! diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 14a3b05d..19220832 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -3,11 +3,16 @@ {{ partial "head.html" . }} +{{partial "search.html" .}}
    - {{partial "darkmode.html" .}} -
    +
    {{if .Title}}

    {{ .Title }}

    {{end}} + Search IconIcon to open search +
    + {{partial "darkmode.html" .}} +
    +
    {{if $.Site.Data.config.enableToc}}
    From e1366ecb6173b7c5e799c46e3ed8acbb50aaf447 Mon Sep 17 00:00:00 2001 From: Blake Allen Date: Fri, 22 Oct 2021 18:56:26 -0700 Subject: [PATCH 0028/1221] fix accidental code --- layouts/partials/backlinks.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/layouts/partials/backlinks.html b/layouts/partials/backlinks.html index 48ffecc4..16b96cdf 100644 --- a/layouts/partials/backlinks.html +++ b/layouts/partials/backlinks.html @@ -8,10 +8,9 @@

    Backlinks

    {{- range $inbound -}} {{$src := index . "source"}} {{$src = replace $src " " "-"}} - {{$src = replace $src `\` ""}}
    +
    {{partial "darkmode.html" .}} - + +{{- with resources.Get "darkmode.js" | minify -}} + +{{- end -}} \ No newline at end of file From 2563afe44a8423707fc50d304cf7fee72f7a5537 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Mon, 19 Jul 2021 18:02:16 -0400 Subject: [PATCH 0016/1221] doc bump --- config.toml | 5 +++- content/_index.md | 2 ++ content/moc/directory.md | 2 +- content/moc/showcase.md | 3 ++- content/notes/editing.md | 38 ++++++++----------------------- content/notes/external-hosting.md | 6 +++++ content/notes/hosting.md | 7 ++++-- content/notes/ignore-notes.md | 22 ++++++++++++++++++ content/notes/preview-changes.md | 34 +++++++++++++++++++++++++++ content/notes/troubleshooting.md | 6 +++++ content/private/private-note.md | 5 ++++ layouts/404.html | 2 +- 12 files changed, 97 insertions(+), 35 deletions(-) create mode 100644 content/notes/external-hosting.md create mode 100644 content/notes/ignore-notes.md create mode 100644 content/notes/preview-changes.md create mode 100644 content/private/private-note.md diff --git a/config.toml b/config.toml index 82831235..884b5b12 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,10 @@ baseURL = "https://quartz.jzhao.xyz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true -ignoreFiles = ["/content/templates/*"] +ignoreFiles = [ + "/content/templates/*", + "/content/private/*", +] [markup] [markup.tableOfContents] diff --git a/content/_index.md b/content/_index.md index c24bd6f0..3d19704a 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,4 +1,6 @@ # 🌱 Quartz +## v1.1 + Simple second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening). ## Why Quartz? diff --git a/content/moc/directory.md b/content/moc/directory.md index 5eee52ff..b77f2ee5 100644 --- a/content/moc/directory.md +++ b/content/moc/directory.md @@ -12,7 +12,7 @@ Let's get to business and get you started! - 🎨 [Customizing and Styling Quartz](notes/config.md) - 🌍 [Hosting Quartz online!](notes/hosting.md) -Not convinced yet? Look at some [cool community digital gardens](moc/showcase)! +Not convinced yet? Look at some [community digital gardens](moc/showcase) built with Quartz! ## Troubleshooting - 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) diff --git a/content/moc/showcase.md b/content/moc/showcase.md index 3c2a0b4a..173ac575 100644 --- a/content/moc/showcase.md +++ b/content/moc/showcase.md @@ -5,6 +5,7 @@ title: "Showcase" Want to see what Quartz can do? Here are some cool community gardens :) - [Quartz Documentation (this site!)](https://quartz.jzhao.xyz/) -- [Jacky Zhao's Garden](https://jzhao.xyz/toc/directory/) +- [Jacky Zhao](https://jzhao.xyz/toc/directory/) +- [Anson Yu](http://garden.ansonyu.me/) If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/hugo/content/moc/showcase.md)! \ No newline at end of file diff --git a/content/notes/editing.md b/content/notes/editing.md index 0975f492..db76af8a 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -10,7 +10,12 @@ I *strongly* recommend using [Obsidian](http://obsidian.md/) as a way to edit an **🔗 [How to link your Obsidian Vault](notes/obsidian.md)** -Of course, all the files are in Markdown so you could just use your favourite text editor of choice, I'm not going to stop you! +Of course, all the files are in Markdown so you could just use your favourite text editor of choice. + +### Ignoring Files +Only want to publish a subset of all of your notes? Don't worry, Quartz makes this a simple two-step process. + +❌ [Excluding pages from being published](notes/ignore-notes.md) ### Folder Structure Here's a rough overview of what's what. @@ -38,36 +43,11 @@ Rest of your content here... ``` ## Previewing Changes -This step is purely optional and mostly for those who want to see the published version of their digital garden locally before opening it up to the internet. For those who like to live life more on the edge, viewing the garden through Obsidian gets you pretty close to the real thing. - -### Install `hugo-obsidian` -This step will generate the list of backlinks for Hugo to parse. Ensure you have [Go](https://golang.org/doc/install) (>= 1.16) installed. - -```shell -# Install and link `hugo-obsidian` locally -$ go install github.com/jackyzha0/hugo-obsidian - -# Navigate to your local Quartz folder -$ cd - -# Scrape all links in your Quartz folder and generate info for Quartz -$ hugo-obsidian -input=content -output=data -``` - -Afterwards, start the Hugo server as shown above and your local backlinks and interactive graph should be populated! - -### Installing Hugo -Hugo is the static site generator that powers Quartz. If you'd like to preview your site locally, [install Hugo](https://gohugo.io/getting-started/installing/). +This step is purely optional and mostly for those who want to see the published version of their digital garden locally before opening it up to the internet. This is *highly recommended*. -``` -# Navigate to your local Quartz folder -$ cd - -# Start local server -$ hugo server +👀 [Preview Quartz Changes](notes/preview-changes.md) -# View your site in a browser at http://localhost:1313/ -``` +For those who like to live life more on the edge, viewing the garden through Obsidian gets you pretty close to the real thing. ## Publishing Changes Now that you know the basics of managing your digital garden using Quartz, you can publish it to the internet! diff --git a/content/notes/external-hosting.md b/content/notes/external-hosting.md new file mode 100644 index 00000000..4d2ba008 --- /dev/null +++ b/content/notes/external-hosting.md @@ -0,0 +1,6 @@ +--- +title: "External Hosting" +--- + + + diff --git a/content/notes/hosting.md b/content/notes/hosting.md index db42aa17..7a5973c6 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -1,8 +1,7 @@ --- -title: "Deploying to GitHub Pages" +title: "Deploying Quartz to the Web" --- - ## GitHub Pages Quartz is designed to be effortless to deploy. If you forked and cloned Quartz directly from the repository, everything should already be good to go! You can head to `" +] +``` + +`ignoreFiles` supports the use of Regular Expressions (RegEx) so you can ignore patterns as well (e.g. ignoring all `.png`s by doing `\\.png$`). + +More details in [Hugo's documentation](https://gohugo.io/getting-started/configuration/#ignore-content-and-data-files-when-rendering). + +### Global Ignore +However, just adding to the `ignoreFiles` will only prevent the page from being access through Quartz. If you want to prevent the file from being pushed to GitHub (for example if you have a public repository), you need to also add the path to the `.gitignore` file at the root of the repository. \ No newline at end of file diff --git a/content/notes/preview-changes.md b/content/notes/preview-changes.md new file mode 100644 index 00000000..21e106ad --- /dev/null +++ b/content/notes/preview-changes.md @@ -0,0 +1,34 @@ +--- +title: "Preview Changes" +--- + +If you'd like to preview what your Quartz site looks like before deploying it to the internet, here's exactly how to do that! + +## Install `hugo-obsidian` +This step will generate the list of backlinks for Hugo to parse. Ensure you have [Go](https://golang.org/doc/install) (>= 1.16) installed. + +```shell +# Install and link `hugo-obsidian` locally +$ go install github.com/jackyzha0/hugo-obsidian + +# Navigate to your local Quartz folder +$ cd + +# Scrape all links in your Quartz folder and generate info for Quartz +$ hugo-obsidian -input=content -output=data +``` + +Afterwards, start the Hugo server as shown above and your local backlinks and interactive graph should be populated! + +## Installing Hugo +Hugo is the static site generator that powers Quartz. If you'd like to preview your site locally, [install Hugo](https://gohugo.io/getting-started/installing/). + +``` +# Navigate to your local Quartz folder +$ cd + +# Start local server +$ hugo server + +# View your site in a browser at http://localhost:1313/ +``` \ No newline at end of file diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index 7d508c63..3a966592 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -3,6 +3,12 @@ title: "Troubleshooting and FAQ" --- ## Common Pitfalls +### Can I publish only a subset of my pages? +Yes! Quartz makes selective publishing really easy. Heres a guide on [excluding pages from being published](notes/ignore-notes.md). + +### Can I host this myself and not on GitHub Pages? +Yes! All built files can be found under `/public` in the `master` branch. More details under [hosting](notes/hosting.md). + ### Do I need a website already? No! Setting up Quartz means you set up a site too :) diff --git a/content/private/private-note.md b/content/private/private-note.md new file mode 100644 index 00000000..6930c102 --- /dev/null +++ b/content/private/private-note.md @@ -0,0 +1,5 @@ +--- +title: "Private Stuff" +--- + +This page doesn't get published! \ No newline at end of file diff --git a/layouts/404.html b/layouts/404.html index 232fada8..84949101 100644 --- a/layouts/404.html +++ b/layouts/404.html @@ -7,7 +7,7 @@ {{partial "darkmode.html" .}}

    404.

    -

    Hey! You look a little lost.

    +

    Hey! You look a little lost. This page doesn't exist (or may be private).

    ↳ Let's get you home.
    From ccec4b30e7146bd51b742832e1d1c04af617f1f2 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Thu, 22 Jul 2021 15:27:38 -0400 Subject: [PATCH 0017/1221] config fixes --- config.toml | 2 ++ layouts/partials/graph.html | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 884b5b12..dabe513d 100644 --- a/config.toml +++ b/config.toml @@ -2,6 +2,8 @@ baseURL = "https://quartz.jzhao.xyz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true +relativeURLs = true +disablePathToLower = true ignoreFiles = [ "/content/templates/*", "/content/private/*", diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index d5a995b1..0e9684d6 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -126,7 +126,7 @@

    Interactive Graph

    .attr("fill", color) .style("cursor", "pointer") .on("click", (_, d) => { - window.location.href = d.id; + window.location.href = {{.Site.BaseURL}} + d.id; }) .on("mouseover", function (_, d) { d3.selectAll(".node") From 618dd7055c3bd8efbc7c860d7d0580ff5ca47fbc Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Thu, 29 Jul 2021 21:26:18 -0400 Subject: [PATCH 0018/1221] add to showcase --- content/moc/showcase.md | 7 +++++-- content/notes/ignore-notes.md | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/content/moc/showcase.md b/content/moc/showcase.md index 173ac575..00fb18cc 100644 --- a/content/moc/showcase.md +++ b/content/moc/showcase.md @@ -5,7 +5,10 @@ title: "Showcase" Want to see what Quartz can do? Here are some cool community gardens :) - [Quartz Documentation (this site!)](https://quartz.jzhao.xyz/) -- [Jacky Zhao](https://jzhao.xyz/toc/directory/) -- [Anson Yu](http://garden.ansonyu.me/) +- [Strengthening Online Social Bonds: Research Garden](https://communities.digital/) +- [Jacky Zhao's Garden](https://garden.jzhao.xyz/) +- [Anson Yu's Garden](http://garden.ansonyu.me/) +- [Shihyu's PKM](https://shihyuho.github.io/pkm/) +- [Chloe's Garden](https://garden.chloeabrasada.online/) If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/hugo/content/moc/showcase.md)! \ No newline at end of file diff --git a/content/notes/ignore-notes.md b/content/notes/ignore-notes.md index ddf48d40..49bf5f36 100644 --- a/content/notes/ignore-notes.md +++ b/content/notes/ignore-notes.md @@ -10,7 +10,7 @@ Edit `ignoreFiles` in `config.toml` to include paths you'd like to exclude from ignoreFiles = [ "/content/templates/*", "/content/private/*", - "" + "" ] ``` From 9b427faa9312425343694cc50fd35ecd635c8035 Mon Sep 17 00:00:00 2001 From: jackyzha0 Date: Thu, 12 Aug 2021 09:29:35 -0400 Subject: [PATCH 0019/1221] backlinks fix --- layouts/partials/backlinks.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/layouts/partials/backlinks.html b/layouts/partials/backlinks.html index 21b26dbe..2e978202 100644 --- a/layouts/partials/backlinks.html +++ b/layouts/partials/backlinks.html @@ -1,6 +1,8 @@

    Backlinks

  • - {{index . "source"}} + {{index . "source"}}
  • {{- end -}} {{else}} From 299533a4f47d2379ddbc209bcd6923a70a81e65d Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 24 Oct 2021 23:17:00 -0700 Subject: [PATCH 0029/1221] bump hugo-obsidian version --- .github/workflows/deploy.yaml | 2 +- README.md | 2 +- content/moc/directory.md | 19 ------------------- 3 files changed, 2 insertions(+), 21 deletions(-) delete mode 100644 content/moc/directory.md diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 21901945..b36c49c6 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Build Link Index - uses: jackyzha0/hugo-obsidian@v2.3 + uses: jackyzha0/hugo-obsidian@v2.4 with: index: true input: content diff --git a/README.md b/README.md index 079e6c10..ec801394 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Quartz Simple second brain and digital garden. -> “He who works with the door open gets all kinds of interruptions, but he also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming +> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming 🔗 Get Started: https://quartz.jzhao.xyz/ \ No newline at end of file diff --git a/content/moc/directory.md b/content/moc/directory.md deleted file mode 100644 index b77f2ee5..00000000 --- a/content/moc/directory.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Quartz Documentation" ---- - -## Setup -Welcome to Quartz! Whether you're setting up a website and project for the first time or a seasoned digital gardener, I hope that you'll find something useful about this project. - -Let's get to business and get you started! - -- 📚 [Setup your own digital garden using Quartz](notes/setup.md) -- 🔗 [Linking with an Obsidian Vault](notes/obsidian.md) -- 🎨 [Customizing and Styling Quartz](notes/config.md) -- 🌍 [Hosting Quartz online!](notes/hosting.md) - -Not convinced yet? Look at some [community digital gardens](moc/showcase) built with Quartz! - -## Troubleshooting -- 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) -- 🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues) \ No newline at end of file From 6fd19069deb06988b3d34482a151a79a53b589d0 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 24 Oct 2021 23:17:13 -0700 Subject: [PATCH 0030/1221] search improvements --- layouts/partials/search.html | 373 ++++++++++++++++++----------------- 1 file changed, 192 insertions(+), 181 deletions(-) diff --git a/layouts/partials/search.html b/layouts/partials/search.html index e2285eab..7ee139db 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -1,208 +1,219 @@
    -
    - +
    +
    \ No newline at end of file From c1c061fbea8f6cdc6aec4992d21d2df73dc6ba4e Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 24 Oct 2021 23:17:20 -0700 Subject: [PATCH 0031/1221] bump docs --- content/_index.md | 12 ++++++++++-- content/notes/ignore-notes.md | 9 +++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/content/_index.md b/content/_index.md index b665a3de..09941245 100644 --- a/content/_index.md +++ b/content/_index.md @@ -18,6 +18,14 @@ I was really inspired by [Bianca](https://garden.bianca.digital/) and [Joel](htt **The goal of Quartz is to make hosting your own public digital garden free and simple.** You don't even need your own website. Quartz does all of that for you and gives your own little corner of the internet. ## Get Started -The entire Quartz documentation is fully hosted using Quartz! To get started, let's visit the main directory. +The entire Quartz documentation is fully hosted using Quartz! Whether you're setting up a website and project for the first time or a seasoned digital gardener, I hope that you'll find something useful about this project. -👉 [Directory](moc/directory.md) \ No newline at end of file +Let's get to business and get you started! + +> 📚 [Setup your own digital garden using Quartz](notes/setup.md) + +Not convinced yet? Look at some [community digital gardens](moc/showcase) built with Quartz! + +## Troubleshooting +- 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) +- 🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues) \ No newline at end of file diff --git a/content/notes/ignore-notes.md b/content/notes/ignore-notes.md index 49bf5f36..e0314211 100644 --- a/content/notes/ignore-notes.md +++ b/content/notes/ignore-notes.md @@ -15,6 +15,15 @@ ignoreFiles = [ ``` `ignoreFiles` supports the use of Regular Expressions (RegEx) so you can ignore patterns as well (e.g. ignoring all `.png`s by doing `\\.png$`). +To ignore a specific file, you can also add the tag `draft: true` to the frontmatter of a note. + +```markdown +--- +title: Some Private Note +draft: true +--- +... +``` More details in [Hugo's documentation](https://gohugo.io/getting-started/configuration/#ignore-content-and-data-files-when-rendering). From 22a9c0ddfcb38a15d4340f532faca7733349702b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 24 Oct 2021 23:31:09 -0700 Subject: [PATCH 0032/1221] docs updates, add search to main page, fix redir bug --- README.md | 2 +- content/_index.md | 15 +++++++-------- layouts/index.html | 36 ++++++++++++++++++++++++------------ layouts/partials/search.html | 10 ++++++---- 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index ec801394..abcfb68d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Quartz -Simple second brain and digital garden. +Host your own second brain and digital garden for free. > “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming diff --git a/content/_index.md b/content/_index.md index 09941245..4cfe1be1 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,7 +1,10 @@ -# 🌱 Quartz -## v2.0 +--- +title: 🪴 Quartz v2.1 +--- -Simple second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening). +Host your second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening) for free. + +Curious what it can do? You're on it right now! The entire Quartz documentation is fully hosted using Quartz. ## Why Quartz? Hosting a public digital garden isn't easy. There are an overwhelming number of tutorials, resources, and guides for tools like [Notion](https://www.notion.so/), [Roam](https://roamresearch.com/), and [Obsidian](https://obsidian.md/), yet none of them have super easy to use *free* tools to publish that garden to the world. @@ -11,17 +14,13 @@ I've personally found that 2. Having a public digital garden invites open conversations 3. It makes keeping personal notes and knowledge *playful and fun* -> “He who works with the door open gets all kinds of interruptions, but he also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming +> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming I was really inspired by [Bianca](https://garden.bianca.digital/) and [Joel](https://joelhooks.com/digital-garden)'s digital gardens and wanted to try making my own. **The goal of Quartz is to make hosting your own public digital garden free and simple.** You don't even need your own website. Quartz does all of that for you and gives your own little corner of the internet. ## Get Started -The entire Quartz documentation is fully hosted using Quartz! Whether you're setting up a website and project for the first time or a seasoned digital gardener, I hope that you'll find something useful about this project. - -Let's get to business and get you started! - > 📚 [Setup your own digital garden using Quartz](notes/setup.md) Not convinced yet? Look at some [community digital gardens](moc/showcase) built with Quartz! diff --git a/layouts/index.html b/layouts/index.html index fdc03b1f..c30cd4fe 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -1,16 +1,28 @@ -{{define "head"}} + + {{ partial "head.html" . }} -{{end}} -{{define "main"}} - + +{{partial "search.html" .}}
    - {{partial "darkmode.html" .}} - {{.Content}} - - -
    - {{partial "footer.html" .}} -
    + +
    + {{if .Title}}

    {{ .Title }}

    {{end}} + Search IconIcon to open search +
    + {{partial "darkmode.html" .}} +
    +
    + {{if $.Site.Data.config.enableToc}} + + {{end}} + {{- .Content -}} +
    + {{partial "footer.html" .}}
    -{{end}} + + + diff --git a/layouts/partials/search.html b/layouts/partials/search.html index 7ee139db..78b77653 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -126,13 +126,17 @@

    ${resultTitle}

    ` } + const redir = (id, term) => { + window.location.href = {{.Site.BaseURL}} + `${id}#:~:text=${encodeURIComponent(term)}` + } + const source = document.getElementById('search-bar') const results = document.getElementById("results-container") let term source.addEventListener("keyup", (e) => { if (e.key === "Enter") { const anchor = document.getElementsByClassName("result-card")[0] - window.location.href = `${anchor.id}#:~:text=${encodeURIComponent(term)}` + redir(anchor.id, term) } }) source.addEventListener('input', (e) => { @@ -163,9 +167,7 @@

    ${resultTitle}

    .join("\n") const anchors = document.getElementsByClassName("result-card"); [...anchors].forEach(anchor => { - anchor.onclick = () => { - window.location.href = `${anchor.id}#:~:text=${encodeURIComponent(term)}` - } + anchor.onclick = () => redir(anchor.id, term) }) } }) From f56642f13cb5bffb8c05b239c6a7b90e1b6453e5 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 24 Oct 2021 23:32:55 -0700 Subject: [PATCH 0033/1221] forgot string lol --- layouts/partials/search.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/search.html b/layouts/partials/search.html index 78b77653..22b50a18 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -127,7 +127,7 @@

    ${resultTitle}

    } const redir = (id, term) => { - window.location.href = {{.Site.BaseURL}} + `${id}#:~:text=${encodeURIComponent(term)}` + window.location.href = "{{.Site.BaseURL}}" + `${id}#:~:text=${encodeURIComponent(term)}` } const source = document.getElementById('search-bar') From 1835b97a7a2faf23809bb39d0bec7a2b77b3b81c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 24 Oct 2021 23:45:55 -0700 Subject: [PATCH 0034/1221] better homepage --- content/_index.md | 26 +++++++------------------- content/notes/philosophy.md | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 content/notes/philosophy.md diff --git a/content/_index.md b/content/_index.md index 4cfe1be1..d9815914 100644 --- a/content/_index.md +++ b/content/_index.md @@ -1,29 +1,17 @@ --- title: 🪴 Quartz v2.1 --- - -Host your second brain and [digital garden](https://jzhao.xyz/posts/digital-gardening) for free. - -Curious what it can do? You're on it right now! The entire Quartz documentation is fully hosted using Quartz. - -## Why Quartz? -Hosting a public digital garden isn't easy. There are an overwhelming number of tutorials, resources, and guides for tools like [Notion](https://www.notion.so/), [Roam](https://roamresearch.com/), and [Obsidian](https://obsidian.md/), yet none of them have super easy to use *free* tools to publish that garden to the world. - -I've personally found that -1. It's nice to access notes from anywhere -2. Having a public digital garden invites open conversations -3. It makes keeping personal notes and knowledge *playful and fun* - -> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming - -I was really inspired by [Bianca](https://garden.bianca.digital/) and [Joel](https://joelhooks.com/digital-garden)'s digital gardens and wanted to try making my own. - -**The goal of Quartz is to make hosting your own public digital garden free and simple.** You don't even need your own website. Quartz does all of that for you and gives your own little corner of the internet. +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 `/` +2. Beautiful, out-of-the-box website creation and deployment +3. Display for backlinks of each note +4. A customizable graph view +5. Endlessly powerful page and theme customization ## Get Started > 📚 [Setup your own digital garden using Quartz](notes/setup.md) -Not convinced yet? Look at some [community digital gardens](moc/showcase) built with Quartz! +Not convinced yet? Look at some [community digital gardens](moc/showcase) built with Quartz, or read about [why I made Quartz](notes/philosophy.md) to begin with! ## Troubleshooting - 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) diff --git a/content/notes/philosophy.md b/content/notes/philosophy.md new file mode 100644 index 00000000..93254156 --- /dev/null +++ b/content/notes/philosophy.md @@ -0,0 +1,17 @@ +--- +title: Quartz Philosophy +--- + +> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming + +## Why Quartz? +Hosting a public digital garden isn't easy. There are an overwhelming number of tutorials, resources, and guides for tools like [Notion](https://www.notion.so/), [Roam](https://roamresearch.com/), and [Obsidian](https://obsidian.md/), yet none of them have super easy to use *free* tools to publish that garden to the world. + +I've personally found that +1. It's nice to access notes from anywhere +2. Having a public digital garden invites open conversations +3. It makes keeping personal notes and knowledge *playful and fun* + +I was really inspired by [Bianca](https://garden.bianca.digital/) and [Joel](https://joelhooks.com/digital-garden)'s digital gardens and wanted to try making my own. + +**The goal of Quartz is to make hosting your own public digital garden free and simple.** You don't even need your own website. Quartz does all of that for you and gives your own little corner of the internet. From f7b89db8ee85e54a438db2e2cac3c55e805281c9 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 25 Oct 2021 15:00:55 -0700 Subject: [PATCH 0035/1221] search fix --- layouts/partials/search.html | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/layouts/partials/search.html b/layouts/partials/search.html index 22b50a18..ce6038fb 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -1,7 +1,6 @@
    - +
    @@ -72,6 +71,7 @@ tokenize: "reverse", charset: "latin:extra", suggest: true, + cache: 10, }) const scrapedContent = {{$.Site.Data.contentIndex}} @@ -80,10 +80,10 @@ } const highlight = (content, term) => { - const highlightWindow = 15 + const highlightWindow = 20 const tokenizedTerm = term.split(/\s+/).filter(t => t !== "") const splitText = content.split(/\s+/).filter(t => t !== "") - const includesCheck = (token) => tokenizedTerm.some(term => token.toLowerCase().includes(term.toLowerCase())) + const includesCheck = (token) => tokenizedTerm.some(term => token.toLowerCase().startsWith(term.toLowerCase())) const occurrencesIndices = splitText .map(includesCheck) @@ -116,8 +116,7 @@ } const resultToHTML = ({url, title, content, term}) => { - const md = content.split("---")[2] - const text = removeMarkdown(md) + const text = removeMarkdown(content) const resultTitle = highlight(title, term) const resultText = highlight(text, term) return `
    diff --git a/layouts/_default/single.html b/layouts/_default/single.html index fd061e51..a84ec915 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -17,6 +17,11 @@

    {{ .Site.Data.config.page_titl

    Last updated {{if ne .Date .Lastmod}}{{ .Lastmod.Format "January 2, 2006" }}{{else}}Unknown{{end}}

    +
    {{if $.Site.Data.config.enableToc}}

    diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index cd5577f4..f0893569 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -146,7 +146,7 @@

    Interactive Graph

    .attr("fill", color) .style("cursor", "pointer") .on("click", (_, d) => { - window.location.href = {{.Site.BaseURL}} + d.id.replace(" ", "-").replace("%20", "-"); + window.location.href = {{.Site.BaseURL}} + decodeURI(d.id).replace(/[\s_]+/g, '-') }) .on("mouseover", function (_, d) { d3.selectAll(".node") @@ -204,7 +204,7 @@

    Interactive Graph

    const labels = graphNode.append("text") .attr("dx", 12) .attr("dy", ".35em") - .text((d) => content[d.id.replace("%20", "-")]?.title || "Untitled") + .text((d) => content[decodeURI(d.id).replace(/[\s_]+/g, '-')]?.title || "Untitled") .style("opacity", 0) .style("pointer-events", "none") .call(drag(simulation)); From 3722e600ee3bd75130e4e228ea45c2074649329c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 27 Dec 2021 20:52:30 -0500 Subject: [PATCH 0072/1221] bump hugo-obsidian --- .github/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index fc3a5c23..60773590 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Build Link Index - uses: jackyzha0/hugo-obsidian@v2.6 + uses: jackyzha0/hugo-obsidian@v2.7 with: index: true input: content From ca886e40752a8a30762708ea87d7228f737c0cd2 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 28 Dec 2021 14:28:08 -0500 Subject: [PATCH 0073/1221] fix render link for apostrophe --- layouts/_default/_markup/render-link.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html index f37614f0..a9a6eca3 100644 --- a/layouts/_default/_markup/render-link.html +++ b/layouts/_default/_markup/render-link.html @@ -1,8 +1,8 @@ {{$trimmed := strings.TrimSuffix ".md" (.Destination | safeURL)}} -{{$trimmed = replace $trimmed "%20" "-"}} +{{$trimmed = replace $trimmed "%20" "-" }} {{$external := strings.HasPrefix $trimmed "http" }} {{ if $external }}
    {{ .Text | safeHTML }} {{else}} -{{ .Text | safeHTML }} +{{ .Text | safeHTML }} {{end}} \ No newline at end of file From 7507fd29912015a72f990b23023ae2946c6cd51b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 2 Jan 2022 19:49:41 -0500 Subject: [PATCH 0074/1221] fix search styling --- layouts/partials/search.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/layouts/partials/search.html b/layouts/partials/search.html index 90f4040a..5544bc1a 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -190,9 +190,10 @@

    ${resultTitle}

    // display if (finalResults.length === 0) { - results.innerHTML = `
    -

    No results.

    -
    ` + results.innerHTML = `` } else { results.innerHTML = finalResults .map(result => resultToHTML({ From 2b432d7f0b35987ca6886e7041dce861b7e21abb Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 2 Jan 2022 20:02:47 -0500 Subject: [PATCH 0075/1221] fix flex gap --- assets/base.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/base.scss b/assets/base.scss index c4447ee1..e31f5ebb 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -276,6 +276,7 @@ hr { .page-end { display: flex; flex-direction: row; + gap: 2em; @media all and (max-width: 780px) { flex-direction: column; @@ -289,7 +290,6 @@ hr { & > ul { list-style: none; padding-left: 0; - margin-right: 2em; & > li { margin: 0.5em 0; From 4a3c4fdef550547aa80947ebaff1bda44b943d4d Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 3 Jan 2022 13:18:31 -0500 Subject: [PATCH 0076/1221] popover implementation --- assets/base.scss | 33 +++++++++++++++++++++-- data/config.yaml | 4 +-- layouts/_default/_markup/render-link.html | 9 ++++--- layouts/_default/taxonomy.html | 2 +- layouts/_default/term.html | 2 +- layouts/partials/graph.html | 3 --- layouts/partials/head.html | 10 ++++++- layouts/partials/popover.html | 29 ++++++++++++++++++++ layouts/partials/search.html | 7 +++-- 9 files changed, 81 insertions(+), 18 deletions(-) create mode 100644 layouts/partials/popover.html diff --git a/assets/base.scss b/assets/base.scss index e31f5ebb..dcb0ae71 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -179,8 +179,7 @@ article { font-family: Source Sans Pro; font-weight: 600; - // internal link - &[href^="./"], &[href^="/"] { + &.internal-link { text-decoration: none; background-color: transparentize(#8f9fa9, 0.85); padding: 0 0.1em; @@ -463,4 +462,34 @@ header { opacity: 0.6; } } +} + +.popover { + z-index: 999; + position: absolute; + width: 15em; + display: inline; + background-color: var(--light); + padding: 1em; + border: 1px solid var(--outlinegray); + border-radius: 5px; + transform: translate(-50%, 40%); + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease, transform 0.2s ease; + transition-delay: 0.3s; + + &.visible { + opacity: 1; + transform: translate(-50%, 20%); + } + + & > h3 { + margin: 0.5em 0; + } + + & > p { + margin: 0; + font-weight: 400; + } } \ No newline at end of file diff --git a/data/config.yaml b/data/config.yaml index 1ca6d198..0ebe8011 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -4,9 +4,9 @@ description: Here is the page description. This is an example Quartz site that details installation, setup, customization, and troubleshooting for Quartz itself. page_title: - "🪴 Quartz v3" + "🪴 Quartz 3" links: - link_name: Twitter link: https://twitter.com/_jzhao - link_name: Github - link: https://github.com/jackyzha0 + link: https://github.com/jackyzha0 \ No newline at end of file diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html index a9a6eca3..2bde76cd 100644 --- a/layouts/_default/_markup/render-link.html +++ b/layouts/_default/_markup/render-link.html @@ -1,8 +1,9 @@ {{$trimmed := strings.TrimSuffix ".md" (.Destination | safeURL)}} {{$trimmed = replace $trimmed "%20" "-" }} {{$external := strings.HasPrefix $trimmed "http" }} -{{ if $external }} +{{- if $external -}} {{ .Text | safeHTML }} -{{else}} -{{ .Text | safeHTML }} -{{end}} \ No newline at end of file +{{- else -}} +{{$fixedUrl := (cond (hasPrefix $trimmed "/") $trimmed (print "/" $trimmed)) | urlize}} +{{ .Text | safeHTML }} +{{- end -}} \ No newline at end of file diff --git a/layouts/_default/taxonomy.html b/layouts/_default/taxonomy.html index 45a713af..e0a1e876 100644 --- a/layouts/_default/taxonomy.html +++ b/layouts/_default/taxonomy.html @@ -17,7 +17,7 @@

    All {{.Title}}

    {{ range .Site.Taxonomies.tags.ByCount }}
    -

    {{ .Page.Title | humanize }}

    +

    {{ .Page.Title }}

    {{ .Count }} notes with this tag {{if gt .Count 2}}(showing first 2 results){{end}}

    {{ with ($.Site.GetPage (printf "/tags/%s" .Page.Title)) }} diff --git a/layouts/_default/term.html b/layouts/_default/term.html index fd01425b..58f024bc 100644 --- a/layouts/_default/term.html +++ b/layouts/_default/term.html @@ -13,7 +13,7 @@

    {{ .Site.Data.config.page_titl {{partial "darkmode.html" .}}
    -

    Category: {{.Title | humanize}}

    +

    Tag: {{.Title | humanize}}

    {{partial "page-list.html" .Paginator.Pages}} {{ template "_internal/pagination.html" . }}
    diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index f0893569..02085625 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -11,9 +11,6 @@

    Interactive Graph

    } {{- end -}} + + + {{ template "_internal/google_analytics.html" . }} +{{ partial "popover.html" .}} diff --git a/layouts/partials/popover.html b/layouts/partials/popover.html new file mode 100644 index 00000000..d9cc941d --- /dev/null +++ b/layouts/partials/popover.html @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/layouts/partials/search.html b/layouts/partials/search.html index 5544bc1a..0c853a05 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -89,8 +89,7 @@ } }) - const scrapedContent = {{$.Site.Data.contentIndex}} - for (const [key, value] of Object.entries(scrapedContent)) { + for (const [key, value] of Object.entries(content)) { contentIndex.add({ id: key, title: value.title, @@ -151,8 +150,8 @@

    ${resultTitle}

    const fetch = id => ({ id, url: id, - title: scrapedContent[id].title, - content: scrapedContent[id].content + title: content[id].title, + content: content[id].content }) const source = document.getElementById('search-bar') From e49a1ac9db92c6c967be404b5a3b9e3194a4ed99 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 3 Jan 2022 13:22:04 -0500 Subject: [PATCH 0077/1221] made link preview optional --- data/config.yaml | 1 + layouts/partials/popover.html | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/data/config.yaml b/data/config.yaml index 0ebe8011..5759ab2e 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -1,5 +1,6 @@ name: Jacky Zhao enableToc: true +enableLinkPreview: true description: Here is the page description. This is an example Quartz site that details installation, setup, customization, and troubleshooting for Quartz itself. diff --git a/layouts/partials/popover.html b/layouts/partials/popover.html index d9cc941d..afcf4c56 100644 --- a/layouts/partials/popover.html +++ b/layouts/partials/popover.html @@ -1,3 +1,4 @@ +{{if $.Site.Data.config.enableLinkPreview}} \ No newline at end of file + +{{end}} \ No newline at end of file From 4e639979f8175b0a639ba2e25bbd8fa550d728bf Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 3 Jan 2022 15:36:58 -0500 Subject: [PATCH 0078/1221] fix copy selection --- assets/base.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/base.scss b/assets/base.scss index dcb0ae71..1ed1dffd 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -478,6 +478,7 @@ header { pointer-events: none; transition: opacity 0.2s ease, transform 0.2s ease; transition-delay: 0.3s; + user-select: none; &.visible { opacity: 1; @@ -492,4 +493,4 @@ header { margin: 0; font-weight: 400; } -} \ No newline at end of file +} From 4a3766db56bd08990b59f73e805008e03817556c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 3 Jan 2022 16:37:24 -0500 Subject: [PATCH 0079/1221] update featurelist --- content/_index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/_index.md b/content/_index.md index 8c3a0eb6..9bc97817 100644 --- a/content/_index.md +++ b/content/_index.md @@ -3,11 +3,11 @@ title: 🪴 Quartz 3 --- 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 `/` -2. Beautiful, out-of-the-box website creation and deployment -3. Display for backlinks of each note -4. A customizable graph view -5. Endlessly powerful page and theme customization -6. Automatically generated tag and section lists of content +2. Display for backlinks of each note +3. Fully customizable local graph view +4. Endlessly powerful page and theme customization using CSS +5. Automatically generated tag and section lists of content +6. Beautiful link previews ## Get Started > 📚 [Setup your own digital garden using Quartz](notes/setup.md) From 99aea4826068564f81e7f1b402e00e3e101a1476 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 4 Jan 2022 11:39:22 -0500 Subject: [PATCH 0080/1221] docs update --- content/_index.md | 3 ++- content/custom Domain.md | 13 +++++++++++++ content/notes/Obsidian.md | 10 ++++++---- content/notes/config.md | 1 + content/notes/editing.md | 19 ++++++++++++++----- content/notes/hosting.md | 25 ++++++------------------- content/notes/obsidian.md | 10 ++++++---- content/notes/preview changes.md | 6 +++--- content/{moc => notes}/showcase.md | 0 content/notes/troubleshooting.md | 7 +++++-- 10 files changed, 56 insertions(+), 38 deletions(-) create mode 100644 content/custom Domain.md rename content/{moc => notes}/showcase.md (100%) diff --git a/content/_index.md b/content/_index.md index 9bc97817..cc1f7329 100644 --- a/content/_index.md +++ b/content/_index.md @@ -12,7 +12,7 @@ Host your second brain and [digital garden](https://jzhao.xyz/posts/digital-gard ## Get Started > 📚 [Setup your own digital garden using Quartz](notes/setup.md) -Not convinced yet? Look at some [community digital gardens](moc/showcase) built with Quartz, or read about [why I made Quartz](notes/philosophy.md) to begin with! +Not convinced yet? Look at some [community digital gardens](notes/showcase.md) built with Quartz, or read about [why I made Quartz](notes/philosophy.md) to begin with! ## Content Lists If you prefer browsing the contents of this site through a list instead of a graph, you can find content lists here too: @@ -23,3 +23,4 @@ If you prefer browsing the contents of this site through a list instead of a gra ## Troubleshooting - 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) - 🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues) +- 👀 [Discord Community](https://discord.gg/cRFFHYye7t) diff --git a/content/custom Domain.md b/content/custom Domain.md new file mode 100644 index 00000000..93a6b9ee --- /dev/null +++ b/content/custom Domain.md @@ -0,0 +1,13 @@ +### Registrar +This step is only applicable if you are using a **custom domain**! If you are using a `.github.io` domain, you can skip this step. + +For this last bit to take effect, you also need to create a CNAME record with the DNS provider you register your domain with (i.e. NameCheap, Google Domains). + +GitHub has some [documentation on this](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site), but the tldr; is to + +1. Go to your forked repository (`github.com//quartz`) settings page and go to the Pages tab. Under "Custom domain", type your custom domain, then click **Save**. +2. Go to your DNS Provider and create a CNAME record that points from your domain to ` Files and Links, set the New link format to always be Absolute Path in Vault and disabled WikiLinks so Obsidian generates regular Markdown links. +1. Under Options > Files and Links, set the New link format to always be Absolute Path in Vault and disabled WikiLinks so Obsidian generates regular Markdown links. +2. Go to Settings > Files & Links > Turn "on" automatically update internal links. +3. Use [[Wikilinks]] should be off (Wikilinks are not officially supported yet) ![Obsidian Settings](/notes/images/obsidian-settings.png)*Obsidian Settings* @@ -25,4 +27,4 @@ Inserting front matter everytime you want to create a new Note gets annoying rea **If you decide to overwrite the `/content` folder completely, don't remove the `/content/templates` folder!** -Head over to Options > Core Plugins and enable the Templates plugin. Then go to Options > Hotkeys and set a hotkey for 'Insert Template'. That way, when you create a new note, you can just press the hotkey for a new template and be ready to go! \ No newline at end of file +Head over to Options > Core Plugins and enable the Templates plugin. Then go to Options > Hotkeys and set a hotkey for 'Insert Template' (I recomment `[cmd]+T`). That way, when you create a new note, you can just press the hotkey for a new template and be ready to go! \ No newline at end of file diff --git a/content/notes/config.md b/content/notes/config.md index a5c194fc..8de7de69 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -12,6 +12,7 @@ The majority of configuration can be be found under `data/config.yaml`. An annot ```yaml name: Your name here! # Shows in the footer enableToc: true # Whether to show a Table of Contents +enableLinkPreview: true # whether to render card previews for links description: Page description to show to search engines page_title: Quartz Example Page # Default Page Title diff --git a/content/notes/editing.md b/content/notes/editing.md index e53fcc79..a9d7290c 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -8,11 +8,11 @@ tags: Quartz runs on top of [Hugo](https://gohugo.io/) so all notes are written in [Markdown](https://www.markdownguide.org/getting-started/). ### Obsidian -I *strongly* recommend using [Obsidian](http://obsidian.md/) as a way to edit and grow your digital garden. It comes with a really nice editor and graphical interface to preview all of my local files. +I recommend using [Obsidian](http://obsidian.md/) as a way to edit and grow your digital garden. It comes with a really nice editor and graphical interface to preview all of your local files. -🔗 How to link your Obsidian Vault](notes/Obsidian.md) +This step is **highly recommended**. -Of course, all the files are in Markdown so you could just use your favourite text editor of choice. +🔗 [How to setup your Obsidian Vault to work with Quartz](notes/obsidian.md) ### Ignoring Files Only want to publish a subset of all of your notes? Don't worry, Quartz makes this a simple two-step process. @@ -33,19 +33,28 @@ For example, I want to link this current document to `notes/config.md`. [A link to the config page](notes/config.md) ``` +Similarly, you can put local images anywhere in the `/content` folder. The only caveat is that you should reference them in your Markdown by prefixing it with a `/`. + +```markdown +Example image (source is in content/notes/images/example.png) +![Example Image](/content/notes/images/example.png) +``` + ### Front Matter -Hugo is picky when it comes to metadata for files. Make sure that your title is double-quoted and that you have a title defined at the top of your file like so: +Hugo is picky when it comes to metadata for files. Make sure that your title is double-quoted and that you have a title defined at the top of your file like so. You can also add tags here as well. ```markdown --- title: "Example Title" +tags: +- example-tag --- Rest of your content here... ``` ## Previewing Changes -This step is purely optional and mostly for those who want to see the published version of their digital garden locally before opening it up to the internet. This is *highly recommended*. +This step is purely optional and mostly for those who want to see the published version of their digital garden locally before opening it up to the internet. This is *highly recommended* but not required. 👀 [Preview Quartz Changes](notes/preview%20changes.md) diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 9e26ad2b..b474652e 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -5,7 +5,7 @@ tags: --- ## GitHub Pages -Quartz is designed to be effortless to deploy. If you forked and cloned Quartz directly from the repository, everything should already be good to go! You can head to `.github.io` (which GitHub gives to you for free!) as your domain. +Here, we take advantage of GitHub's free page hosting to deploy our site. Change `baseURL` in `/config.toml`. [Reference `config.toml` here](https://github.com/jackyzha0/quartz/blob/hugo/config.toml) @@ -67,22 +69,7 @@ Change `cname` in `/.github/workflows/deploy.yaml`. Again, if you don't have a c cname: ``` -### Registrar -This step is only applicable if you are using a **custom domain**! If you are using `.github.io`, you can skip this step. - -For this last bit to take effect, you also need to create a CNAME record with the DNS provider you register your domain with (i.e. NameCheap, Google Domains). - -GitHub has some [documentation on this](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site), but the tldr; is to - -1. Go to your forked repository (`github.com//quartz`) settings page and go to the Pages tab. Under "Custom domain", type your custom domain, then click **Save**. -2. Go to your DNS Provider and create a CNAME record that points from your domain to ` Files and Links, set the New link format to always be Absolute Path in Vault and disabled WikiLinks so Obsidian generates regular Markdown links. +1. Under Options > Files and Links, set the New link format to always be Absolute Path in Vault and disabled WikiLinks so Obsidian generates regular Markdown links. +2. Go to Settings > Files & Links > Turn "on" automatically update internal links. +3. Use [[Wikilinks]] should be off (Wikilinks are not officially supported yet) ![Obsidian Settings](/notes/images/obsidian-settings.png)*Obsidian Settings* @@ -25,4 +27,4 @@ Inserting front matter everytime you want to create a new Note gets annoying rea **If you decide to overwrite the `/content` folder completely, don't remove the `/content/templates` folder!** -Head over to Options > Core Plugins and enable the Templates plugin. Then go to Options > Hotkeys and set a hotkey for 'Insert Template'. That way, when you create a new note, you can just press the hotkey for a new template and be ready to go! \ No newline at end of file +Head over to Options > Core Plugins and enable the Templates plugin. Then go to Options > Hotkeys and set a hotkey for 'Insert Template' (I recomment `[cmd]+T`). That way, when you create a new note, you can just press the hotkey for a new template and be ready to go! \ No newline at end of file diff --git a/content/notes/preview changes.md b/content/notes/preview changes.md index dac619e0..45f60f37 100644 --- a/content/notes/preview changes.md +++ b/content/notes/preview changes.md @@ -9,19 +9,19 @@ This step will generate the list of backlinks for Hugo to parse. Ensure you have ```shell # Install and link `hugo-obsidian` locally -$ go install github.com/jackyzha0/hugo-obsidian +$ go install github.com/jackyzha0/hugo-obsidian@latest # Navigate to your local Quartz folder $ cd # Scrape all links in your Quartz folder and generate info for Quartz -$ hugo-obsidian -input=content -output=data -index=true +$ hugo-obsidian -input=content -output=data -index -root=. ``` Afterwards, start the Hugo server as shown above and your local backlinks and interactive graph should be populated! ## Installing Hugo -Hugo is the static site generator that powers Quartz. If you'd like to preview your site locally, [install Hugo](https://gohugo.io/getting-started/installing/). +Hugo is the static site generator that powers Quartz. [Install Hugo](https://gohugo.io/getting-started/installing/) first. Then, ``` # Navigate to your local Quartz folder diff --git a/content/moc/showcase.md b/content/notes/showcase.md similarity index 100% rename from content/moc/showcase.md rename to content/notes/showcase.md diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index 0330fed3..6aab5efc 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -2,7 +2,10 @@ title: "Troubleshooting and FAQ" --- -## Common Pitfalls +Still having trouble? Here are a list of common questions and problems people encounter when installing Quartz. + +While you're here, join our [Discord](https://discord.gg/cRFFHYye7t) :) + ### Some of my pages have 'January 1, 0001' as the last modified date This is a problem caused by `git` treating files as case-insensitive by default and some of your posts probably have capitalized file names. You can turn this off in your Quartz by running this command. @@ -36,7 +39,7 @@ source ~/.bash_profile ``` ### How come my notes aren't being rendered? -You probably forgot to include front matter in your Markdown files. You can either setup [Obsidian](notes/Obsidian.md) to do this for you or you need to manually define it. More details in [the 'how to edit' guide](notes/editing.md). +You probably forgot to include front matter in your Markdown files. You can either setup [obsidian](notes/obsidian.md) to do this for you or you need to manually define it. More details in [the 'how to edit' guide](notes/editing.md). ### My custom domain isn't working! Walk through the steps in [the hosting guide](notes/hosting.md) again. Make sure you wait 30 min to 1 hour for changes to take effect. From 532bc610254db096807453bf223acaa91634fd81 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 5 Jan 2022 19:42:13 -0500 Subject: [PATCH 0081/1221] set relativeUrls to true --- config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 5c4dfcb4..01d8d3d8 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,7 @@ baseURL = "https://quartz.jzhao.xyz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true -relativeURLs = false +relativeURLs = true disablePathToLower = true ignoreFiles = [ "/content/templates/*", From 6f9a29c174f8657a90d7dda8d39e933c220fa717 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 10 Jan 2022 08:49:29 -0800 Subject: [PATCH 0082/1221] various path fixes --- config.toml | 3 ++- layouts/partials/graph.html | 2 +- layouts/partials/popover.html | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/config.toml b/config.toml index 01d8d3d8..336e7408 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,5 @@ -baseURL = "https://quartz.jzhao.xyz/" +#baseURL = "https://quartz.jzhao.xyz/" +baseURL = "https://jackyzha0.github.io/quartz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index 02085625..ae934c03 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -11,7 +11,7 @@

    Interactive Graph

    } diff --git a/layouts/partials/head.html b/layouts/partials/head.html index b754ca39..7ab5aeab 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -8,7 +8,7 @@ - {{ $css := slice "base.scss" "darkmode.scss" "syntax.scss" "custom.scss"}} + {{$css := slice "base.scss" "darkmode.scss" "syntax.scss" "custom.scss"}} {{range $css}} {{$sass := resources.Get . | resources.ToCSS }} {{with $sass | minify}} @@ -26,9 +26,24 @@ {{ template "_internal/google_analytics.html" . }} diff --git a/layouts/partials/popover.html b/layouts/partials/popover.html index 3a7de110..35f0738f 100644 --- a/layouts/partials/popover.html +++ b/layouts/partials/popover.html @@ -1,5 +1,7 @@ {{if $.Site.Data.config.enableLinkPreview}} {{end}} \ No newline at end of file diff --git a/layouts/partials/search.html b/layouts/partials/search.html index 0c853a05..c2ff77f0 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -67,189 +67,194 @@ }; From 8e85e274f6e5913694b67319f1beb7a2ec5b5bed Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 15 Feb 2022 19:42:45 -0500 Subject: [PATCH 0094/1221] change output to static instead of data --- .github/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 3ec76dae..933261f9 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -16,7 +16,7 @@ jobs: with: index: true input: content - output: data + output: static - name: Setup Hugo uses: peaceiris/actions-hugo@v2 From 3b3e6ec3b2a56ee4d03b6f4c84af886821bfbe84 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 15 Feb 2022 22:54:20 -0500 Subject: [PATCH 0095/1221] fix relative pathing for dynamic fetch --- assets/base.scss | 11 +++++- config.toml | 2 +- layouts/_default/_markup/render-link.html | 3 +- layouts/partials/head.html | 45 +++++++++++++--------- layouts/partials/popover.html | 47 ++++++++++++----------- 5 files changed, 63 insertions(+), 45 deletions(-) diff --git a/assets/base.scss b/assets/base.scss index 6f47da3a..a462a33a 100644 --- a/assets/base.scss +++ b/assets/base.scss @@ -470,7 +470,7 @@ header { .popover { z-index: 999; position: absolute; - width: 15em; + width: 20em; display: inline-block; visibility: hidden; background-color: var(--light); @@ -491,11 +491,18 @@ header { } & > h3 { - margin: 0.5em 0; + font-size: 1rem; + margin: 0.25em 0; + } + + & > .meta { + margin-top: 0.25em; + opacity: 0.5; } & > p { margin: 0; font-weight: 400; + user-select: none; } } diff --git a/config.toml b/config.toml index 01d8d3d8..5c4dfcb4 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,7 @@ baseURL = "https://quartz.jzhao.xyz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true -relativeURLs = true +relativeURLs = false disablePathToLower = true ignoreFiles = [ "/content/templates/*", diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html index 2bde76cd..c720c458 100644 --- a/layouts/_default/_markup/render-link.html +++ b/layouts/_default/_markup/render-link.html @@ -5,5 +5,6 @@
    {{ .Text | safeHTML }} {{- else -}} {{$fixedUrl := (cond (hasPrefix $trimmed "/") $trimmed (print "/" $trimmed)) | urlize}} -{{ .Text | safeHTML }} +{{$rooted := strings.TrimRight "/" (.Page.GetPage $fixedUrl).RelPermalink }} +{{ .Text | safeHTML }} {{- end -}} \ No newline at end of file diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 7ab5aeab..1afa3c64 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -26,24 +26,33 @@ {{ template "_internal/google_analytics.html" . }} diff --git a/layouts/partials/popover.html b/layouts/partials/popover.html index 35f0738f..37f0db48 100644 --- a/layouts/partials/popover.html +++ b/layouts/partials/popover.html @@ -1,37 +1,38 @@ {{if $.Site.Data.config.enableLinkPreview}} {{end}} \ No newline at end of file From f192f9a23df34d30e223e20ab5e8cb8210a7dfe9 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 15 Feb 2022 23:03:02 -0500 Subject: [PATCH 0096/1221] fix #54: root all image urls --- content/notes/hosting.md | 2 +- layouts/_default/_markup/render-image.html | 8 ++++++++ layouts/partials/popover.html | 3 --- 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 layouts/_default/_markup/render-image.html diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 0227fde0..a6725b72 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -10,7 +10,7 @@ Quartz is designed to be effortless to deploy. If you forked and cloned Quartz d ### Enable GitHub Actions By default, GitHub disables workflows from running automatically on Forked Repostories. Head to the 'Actions' tab of your forked repository and Enable Workflows to setup deploying your Quartz site! -![Enable GitHub Actions](/notes/images/github-actions.png)*Enable GitHub Actions* +![Enable GitHub Actions](notes/images/github-actions.png)*Enable GitHub Actions* ### Enable GitHub Pages diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html new file mode 100644 index 00000000..ff4e8b39 --- /dev/null +++ b/layouts/_default/_markup/render-image.html @@ -0,0 +1,8 @@ +{{$src := .Destination | safeURL }} +{{$external := strings.HasPrefix $src "http" }} +{{- if $external -}} +{{ .Text }} +{{- else -}} +{{$fixedUrl := (cond (hasPrefix $src "/") $src (print "/" $src)) | urlize}} +{{ .Text }} +{{- end -}} diff --git a/layouts/partials/popover.html b/layouts/partials/popover.html index 37f0db48..32f019ff 100644 --- a/layouts/partials/popover.html +++ b/layouts/partials/popover.html @@ -11,9 +11,6 @@ fetchData().then(({content}) => { const links = [...document.getElementsByClassName("internal-link")] links.forEach(li => { - console.log(li.dataset.src.replace(baseUrl, "")) - console.log(content[li.dataset.src.replace(baseUrl, "")]) - console.log(content) const linkDest = content[li.dataset.src.replace(baseUrl, "")] // const linkDest = content[li.dataset.src] if (linkDest) { From 388a2bf78bb08c2b37e918c3a2e0acc72803e187 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Feb 2022 10:44:39 -0500 Subject: [PATCH 0097/1221] docs updates --- content/notes/editing.md | 4 ++-- content/notes/hosting.md | 10 +++++++--- content/notes/preview changes.md | 6 +++++- content/notes/troubleshooting.md | 3 +++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/content/notes/editing.md b/content/notes/editing.md index 17730eff..9a084c89 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -24,7 +24,7 @@ Here's a rough overview of what's what. **All content in your garden can found in the `/content` folder.** To make edits, you can open any of the files and make changes directly and save it. You can organize content into any folder you'd like. -**To edit the main home page, open `/content/_index.md`.** This is the home page which is slightly special. You don't need front matter here! +**To edit the main home page, open `/content/_index.md`.* To create a link between notes in your garden, just create a normal link using Markdown pointing to the document in question. Please note that **all links should be relative to the root `/content` path**. @@ -33,7 +33,7 @@ For example, I want to link this current document to `notes/config.md`. [A link to the config page](notes/config.md) ``` -Similarly, you can put local images anywhere in the `/content` folder. The only caveat is that you should reference them in your Markdown by prefixing it with a `/`. +Similarly, you can put local images anywhere in the `/content` folder. ```markdown Example image (source is in content/notes/images/example.png) diff --git a/content/notes/hosting.md b/content/notes/hosting.md index a6725b72..bb1d912e 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -16,13 +16,13 @@ By default, GitHub disables workflows from running automatically on Forked Repos Head to the 'Settings' tab of your forked repository and go to the 'Pages' tab. -1. (IMPORTANT) Set the source to deploy from `master` using `/ (root)` +1. (IMPORTANT) Set the source to deploy from `master` (and not `hugo`) using `/ (root)` 2. Set a custom domain here if you have one! ![Enable GitHub Pages](/notes/images/github-pages.png)*Enable GitHub Pages* ### Pushing Changes -To see your changes on the internet, we need to push it them to GitHub. Quartz is essentially a `git` repository so updating it is the same workflow as you would follow as normal. +To see your changes on the internet, we need to push it them to GitHub. Quartz is a `git` repository so updating it is the same workflow as you would follow as if it were just a regular software project. ```shell # Navigate to Quartz folder @@ -43,13 +43,15 @@ Now let's get this site up and running. Never hosted a site before? No problem. Here, we take advantage of GitHub's free page hosting to deploy our site. Change `baseURL` in `/config.toml`. +Make sure that your `baseURL` has a trailing `/`! + [Reference `config.toml` here](https://github.com/jackyzha0/quartz/blob/hugo/config.toml) ```toml baseURL = "https:///" ``` -If you are using this under a subdomain (e.g. `.github.io/quartz`), include the trailing path. +If you are using this under a subdomain (e.g. `.github.io/quartz`), include the trailing `/`. ```toml baseURL = "https://.github.io/quartz/" @@ -57,6 +59,8 @@ baseURL = "https://.github.io/quartz/" Change `cname` in `/.github/workflows/deploy.yaml`. Again, if you don't have a custom domain to use, you can use `.github.io`. +Please note that the `cname` field should *not* have any path `e.g. end with /quartz` or have a trailing `/`. + [Reference `deploy.yaml` here](https://github.com/jackyzha0/quartz/blob/hugo/.github/workflows/deploy.yaml) ```yaml diff --git a/content/notes/preview changes.md b/content/notes/preview changes.md index 191810eb..8d2a3892 100644 --- a/content/notes/preview changes.md +++ b/content/notes/preview changes.md @@ -4,6 +4,8 @@ title: "Preview Changes" If you'd like to preview what your Quartz site looks like before deploying it to the internet, here's exactly how to do that! +Note that both of these steps need to be completed. + ## Install `hugo-obsidian` This step will generate the list of backlinks for Hugo to parse. Ensure you have [Go](https://golang.org/doc/install) (>= 1.16) installed. @@ -15,9 +17,11 @@ $ go install github.com/jackyzha0/hugo-obsidian@latest $ cd # Scrape all links in your Quartz folder and generate info for Quartz -$ hugo-obsidian -input=content -output=data -index -root=. +$ hugo-obsidian -input=content -output=static -index -root=. ``` +If you are running into an error saying that `command not found: hugo-obsidian`, make sure you set your `GOPATH` correctly! This will allow your terminal to correctly recognize hugo-obsidian as an executable. + Afterwards, start the Hugo server as shown above and your local backlinks and interactive graph should be populated! ## Installing Hugo diff --git a/content/notes/troubleshooting.md b/content/notes/troubleshooting.md index 6aab5efc..226216be 100644 --- a/content/notes/troubleshooting.md +++ b/content/notes/troubleshooting.md @@ -6,6 +6,9 @@ Still having trouble? Here are a list of common questions and problems people en While you're here, join our [Discord](https://discord.gg/cRFFHYye7t) :) +### My GitHub pages is just showing the README and not Quartz +Make sure you set the source to deploy from `master` (and not `hugo`) using `/ (root)`! See more in the [hosting](/notes/hosting) guide + ### Some of my pages have 'January 1, 0001' as the last modified date This is a problem caused by `git` treating files as case-insensitive by default and some of your posts probably have capitalized file names. You can turn this off in your Quartz by running this command. From 9c04ca026676445849081d32efb8e840465994d5 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Feb 2022 10:49:41 -0500 Subject: [PATCH 0098/1221] rtl docs --- content/notes/config.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/content/notes/config.md b/content/notes/config.md index 8de7de69..637a19f1 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -46,4 +46,20 @@ For example, the structure of the home page can be edited through `/layouts/inde More info about partials on [Hugo's website.](https://gohugo.io/templates/partials/) -Still having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md). \ No newline at end of file +Still having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md). + +## Multilingual +Want to support languages that read from right-to-left (like Arabic)? Hugo (and by proxy, Quartz) supports this natively. + +Follow the steps [Hugo provides here](https://gohugo.io/content-management/multilingual/#configure-languages) and modify your `config.toml` + +For example: + +```toml +defaultContentLanguage = 'ar' +[languages] + [languages.ar] + languagedirection = 'rtl' + title = 'مدونتي' + weight = 1 +``` \ No newline at end of file From 714b4fcfa30ac1155747b9af90bc0e9519cb4bba Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 20 Feb 2022 21:40:10 -0500 Subject: [PATCH 0099/1221] fix links being broken for pages with spaces --- layouts/_default/_markup/render-link.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html index c720c458..7ae8a3e9 100644 --- a/layouts/_default/_markup/render-link.html +++ b/layouts/_default/_markup/render-link.html @@ -1,10 +1,11 @@ {{$trimmed := strings.TrimSuffix ".md" (.Destination | safeURL)}} -{{$trimmed = replace $trimmed "%20" "-" }} -{{$external := strings.HasPrefix $trimmed "http" }} +{{$dashedurl := replace $trimmed "%20" "-" }} +{{$external := strings.HasPrefix $dashedurl "http" }} {{- if $external -}} -{{ .Text | safeHTML }} +{{ .Text | safeHTML }} {{- else -}} -{{$fixedUrl := (cond (hasPrefix $trimmed "/") $trimmed (print "/" $trimmed)) | urlize}} -{{$rooted := strings.TrimRight "/" (.Page.GetPage $fixedUrl).RelPermalink }} +{{$spacedurl := replace $trimmed "%20" " " }} +{{$fixedUrl := (cond (hasPrefix $spacedurl "/") $spacedurl (print "/" $spacedurl)) | urlize}} +{{$rooted := default $spacedurl (strings.TrimRight "/" (.Page.GetPage $spacedurl).RelPermalink) }} {{ .Text | safeHTML }} {{- end -}} \ No newline at end of file From cdc4f1a8407449be7a514414795f27ff3b70bf37 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 22 Feb 2022 13:36:08 -0500 Subject: [PATCH 0100/1221] fix: relink search button (move outside content load listener) --- layouts/partials/search.html | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/layouts/partials/search.html b/layouts/partials/search.html index c2ff77f0..6cc7e24f 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -239,20 +239,18 @@

    No results.

    } }) - window.addEventListener('DOMContentLoaded', () => { - const searchButton = document.getElementById("search-icon") - searchButton.addEventListener('click', (evt) => { - openSearch() - }) - searchButton.addEventListener('keydown', (evt) => { - openSearch() - }) - searchContainer.addEventListener('click', (evt) => { - closeSearch() - }) - document.getElementById("search-space").addEventListener('click', (evt) => { - evt.stopPropagation() - }) + const searchButton = document.getElementById("search-icon") + searchButton.addEventListener('click', (evt) => { + openSearch() + }) + searchButton.addEventListener('keydown', (evt) => { + openSearch() + }) + searchContainer.addEventListener('click', (evt) => { + closeSearch() + }) + document.getElementById("search-space").addEventListener('click', (evt) => { + evt.stopPropagation() }) } From 73e526a7d50315b9177c2c11d12ebcde71b05fbd Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 23 Feb 2022 12:28:25 -0500 Subject: [PATCH 0101/1221] add screenshot to readme --- README.md | 14 ++++++++++++-- screenshot.png | Bin 0 -> 945268 bytes 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 screenshot.png diff --git a/README.md b/README.md index abcfb68d..15beae54 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,16 @@ # Quartz -Host your own second brain and digital garden for free. + +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 `/` +2. Display for backlinks of each note +3. Fully customizable local graph view +4. Endlessly powerful page and theme customization using CSS +5. Automatically generated tag and section lists of content +6. Beautiful link previews > “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming -🔗 Get Started: https://quartz.jzhao.xyz/ \ No newline at end of file +🔗 Get Started: https://quartz.jzhao.xyz/ + +![Quartz Example Screenshot](./screenshot.png)*Quartz Example Screenshot* \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff1999935232447e537c935b376871b07076d99 GIT binary patch literal 945268 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 z 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�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

    JFm=~PM&D91~fvT=aZfN6$pD4Rh9Kz82 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�^y`FofwxlYy0} zMTW4iEpBbHdq*2vA=u3}aUO>2rk;O3?)0vH>SgHBxc&Ob*bgiK2U7sIWYiaEW;)r{ z1ZCzkIySMs-awvnd_0^eAu|?nv2PaXeI70XDZM(nm?5Xu&84#hHwB%`?4DucnH6 zH4tjRsGN)1A$i^rMJE+*IPPKLG8^?+NF^b#R{kx+_dnOw2zn1bI`FwUVii`=DUorb z!J8GtFXr)IoS7gi7PdDUNOdJIZOzEj^NioY?%5ySMR7=i}ra z^XjPSkm3cbWBE+oYSz%pXy31~ADfGj&4NM*cTY1_z^fTUkH{Sw{h|oLG2Zlc#Cv;Ox0-=^S z3r_@;s~jN@gQkk9;|hmS-#r1@YZuY~`_d0;%gM(ezlB8YFMqDQJ$>Q&#Z0ce(O&ia ziPKz0pb^f*<9{3Qb!UzPIc2bvoEhDsi4X%#sK|KTUq;rXYVlv1ObYi&x3z$q;O3H0 zmAt_evwl-iuXjyv8g@T~Da*uKs)-2`f8{9;J=PJ_wcW8E{Dl3i0)%2S&0rIpJQ^;q z#iIrP^O4AztbD(LgAfLm9;0}jtk-pdha`m+-fL1>4GqOh6S)i|E@puve&y7O;ujq} zo!|LUD)_D;aD6+bN@VcC1y6U))q$&!x?0&kx)Tv#>Ti`*n8qsN8d{p@i0Zap_}zdX zd=>)xBRHBN%>hNOeIT<7_E-}W(kL_ONY&ZTRVz}Kg@T+3ETOl5*#A}ZkTYd*{x)hK zJ#h3@v7RxMwd1~ns&g~EGAM;`T}L+4#Dq-Mg;(!j6j(ul9c778MZTly2~7w1i~;h1 zK9*HWrtGdtnGzU%Aaz{WzZVm|Qa4SPk=!fxnxIZHQlV|P5?$bXg_e4zuC;as)h~`&8Keq4|EqWR?*UWz4+bPiNj$hC z&kngA;9pe=uOQ=lHp+KcKh`P4AoQcwzv@C2I4moh=NA?eYe9+YSwzn52=~ z=$8}lDwS7poyKf`e8h|~4~zkSgV*4_5hc~C-+?=7`~|@l^MOHSDEn#2x2B!41mMe6 zp0!HD;zw{?r#2G0A#SmkYdW4{LnxDsdwN{MyR)kxh}RS2?ijcEL3yqK@yJqnF<1IT zcx>Upj}M+meo0WT`o*c(z2Mn+k^hiHyH7DtH=9G8SZCQu_7wn{=Cp~GIX2TTx~_^} z&h_ju23DvXZX>*K*x=+Y;4Z0-#oc}0*o6z)6+R?)c;UiX{99I0RI@Q(6g=Hhja6J< z`1I zRIY{lE@#T^LU*}l!Ip21F8;R7im7z!Qv*MX5f&Hb@q8ocmd4sVXJm=L$c`elnZ)v% zcduByAk5neYBd*SQ3#TXUfVY>GEML+F!{dX$x_Ak2AQ@st*AZ$*veY_%C#)Wm*jxm6NM%*-T`u$ zD_Ik}jlKiHhp;e*J9ye!85Q$QZ38je6FcbxKHD&`-~Bt~#L)7M5Fi11iGg{yJA;GFv3 zk$FG8>q}AGa4yh~h@=#9`%N=^R^a9rpJPN|ykDkq`v>bvt}xZeL@G;o8eQnnpzqgg zbsp4vardWq!Y5#Rx*SJV4w-G;<^5u z+y@4A=*mI`G?vyNlRun-y}Z$Ea5$fUtxXME)Hpi8HiYb8-wel*evgwXhb_AHn;r%Q z%hoODz$q$n*P8L$&YUz2Dmr8lb^iu6h(a85OSTTNxEYkSeQ-3khR!>|VlfQG#I9SruT>M~# zjG;E6oGj{RzYOd@Xc0)i92fmr7`OY^f(DFL zQ6iW4HL9J^qC~Ku7v=Wdw(zE%7xBsd_@B9SNAs1Km0qof zZgJtMZ~8kr+MfuZ6bs27x>8>#bypUTaW=C&l|==|XadBS_pjUr@X-BR9W@gP6!HfI z#9O&9;ThPeKwqlTuV#1XE2NBEd)6|(HIsM-SWf<1WoP+j%h}vLGJ#9p&Loh^96z_d z!I5iQ{2z*xli}Y3%|U(#=L|nxD`~hsy~e;Q^%knSHz@O(gHg18y~^|sV)!62n8)7Qz7 zf8sPd_|yZuAS{F} zQHrYUj@s^T&B_rD#LUYL*EcU5ftzXfe4>bd zZc4APQtJpHQI(1bfK8{)5m1w_LF6|Hu|~3*QvQp;s?=HnQYXW$>7f4@btC13?q^GQ z*5s!v2K~h?pPiV~g5_Mzf={dQ+{qW8+q--CP3u6#hVELwnch^2GZ}hPNl0_Z{IJ=u zR&X>RT&me5v;Morj2rtkk|)#1eerHi3iTw{+Fm)j-ZL^OsZpZO%@Y zr`ESvLK~W08#k(GS!wcl*b1e$)DD)b+8{fWf-e)k1EDihjQYx7{AMFIz#>@ywzXV$RHZQ_$mblstE~Nl|KV{5 z8Huo}ywS6^Hk~Azo}uRN5g>vYT3l;L8}11sC?ug{qK+P1(=c7MylfGY7blFiPVo_8 z43+Fy+YLEf3h~$^Jc>bU_N1Q(?Rn>c{QFipXq$PPh`vCOpR{g8G@tXua)cdR;thZK z;!DkM$rT>k)wspnOYwfOkRP{qAMU0ZO3k;pbLp_9U#3)ayMyul>C5&8LN+V580(^> z*?CAlTHuXs5oOV$f}>5_$VC_fARRVEl)j$!RDoZbu0z;kgap#ZAd}Vx(vzMpq(}dj zjjrN#nJ3g(!1&tk`#oqD=5c`hts(dS2T7VUhU=PvfY#zecKM5z87K?o#+e(2PlQHESFt7viD@{`Zw23Usq2);B#Zp0 zr=-Kaag?>(cjp_zo4StPvl?`K#D=5LmIkskXx2U{Ha8jFtEYnl>!?|QD$=8_6E(Y) zXt*?0X?As+Gt$vAlR@<)ZRbcoUgc|ylKzkL;R?1@Q!1GX)^{2gN2^e-{9T09hLFy*sl)lG-8%o_QIu(7^+hsiRrtO_!q_AB*pJ(?;I?F~}Ox-G6s zD{bvRg*x=glMBzOkNBhL?7a7>W!~>$)G^proD&c+!VeQ3~XFX!G~#q_ynMxw0B z#?3J1$cr9#Ks7<7Xg-GTdN-#V@J%_I>ld|su}~uY9O#g|oI3!(MulG9rgw`PWbC%_ z>cr>B{LxH8EXPR5QMyQ_>{bY)VIbmdX`(`aebH7AEMotmBb**fhA~I=l2`OqqdR{! ztP+E@i=Lf3mW(AeH*H5$02$ojb_K4lq-yo6;}Pdi8;mf#8@$rOB-}l}d3d|jn^x9= z`?9AT8Mc4Qrf0J#51YSLW_;d79 zRz~%!mx0qK(V6dL^LnhGT6_EW&@|aBneeEP!~V(ppHvH*@gnPYK~qUjE%o8>jTG$Z zV>9`Wa#cPIsabMVC7|8%I$$;RsD$0!y4$z>ofq72yL-9y4PctnG~2eSZ1A8ou>y|*+h)XYtqnv9iO^Q7`D8RiTM5>gz6+i zUko%UU~kB<{MN&ysH5blBn)Sg`VmkcVnYr+^_ZiS-YSp25oJqyQFvBYRQGMoX+rl7 zit;2t)Wf}>JMWD9FK)4u(8X3x712XuHE7Nq#+Ub_%0_sqJdmKL>hK2)Q3AgS9Lh?! zT`^HyD>s|zE|S*PwWtrzOs>G4Y8U&D!pU!vj@y}r^RACiQ<5VqNjaR|?tICy25cJ5 z?R<_ue`l|hC?#$-qnj-ZRu-(f)qg&a_zZe`@VLnE&2Yst>AaWsc`E>f^K+S~zI^T3L|8_+yi^WJ3r3KX`q60Vls%>Gm6zv8|Hv7YgQ5h zMA;UfRBgs4@o&W>_5B(amzS$_=33O zTD-w2uDDHMv7g$)@EgePWso6FCw&O&Qkps{Y&SWa5yln( zBYu*#I@dHTyRhU}hv}`+Uu{FS!%S8d=hiw>=DduJAiLYG#%c*l`<{ix$)uP8N4tOB z@?yzjA6I{qNZ!OJNWK~e(QbT&+1-4k)z9dL&m)92!f5v}7ryBr&h5RO>K^qPNR7Tb zFpw!IdD8RDM@)9+n_an5P$`pA*7d)F*Z-}Af5oA6EV$V=fEN6K8I*VOjk|kx+?`v9 zFVU>Fv0wy_H7OxAt$AiAgn*fqJlUA!(RVe(tDLKq!=_Udeoi53piL##>{kJNX4qsd z%34q>w*A*74e55i;8(YlD=ZfuvIW}4BX=wFmhtM2TNU3{gSS(tzo%+K7N5cwf7h58 z5Nj{xOWImQ4@x%eI@;Qa;tBJ)SP6&2K{XZYonxhDC`na3fxDxvRs5N)i3kfHdGvB zV)>_d{7+(DtT2jG+?tki#L*tt1*d!NT*(_`G#`(>kfbGJ46Je+Em~GrMI89w^!MZ z!ZJr+;-ZMvX`VG3^It-tN@_`C>vz_DI`8p#t2`~wy5*9olG({4=RNh6U%%w5jIEJHXIu**#CQ=drIf10Jl(&72_@H{P;GFVsHy$S(6H`am7`s45WrB# zerZ%CeUEOe#~cX;z|Mn6$*J>y&jQYbX@+uxrqjUUr`=qJSVEUmf8Wmzyfc1RSeQ<# zAun>{Yvfp#ervf~r#r+2Ee24`cn`ohP915Jo+RPMv-2LZ>5|FnU|hh4w3&i1d@%>T zhk0zUS8xyIU-muku-meUMH}(RfNGmb`cbhNQ8hN)uxgN?6QqEKmu8LBwLcdZkBs|f zU8HN|YT{XOR?00)A!>H_cWwr;^nPrz-z$-K~B%N%72FU;tgh#mVX@yXcZDLB}1)Oc}U#A#YWl~A2y=GOO4cmD9`;NU@z@ty+0z#=4=GV7d!# zH(Sn*O6k?ff#BuZcMn>w!)?HOeYZY%rx{pKigF>+WvkaDy}>5Du}e?ib*w;H9b(x>;oPbUF+}Lt zqer-xD-wg(6D%{{X_$?os~YZ8CX`?mj&n7}G$UingQu3Bu^)8S-X{R8j9*)U1i{P> zpj`=al@lB=uf!yXR#$@uIInE3^~2Jlp&kal3vT02&*uR%6PiAR{c_6XJ80tIisjngt9?koj371UjDlB=x)4uZD$agOJx&{65`vIO~Gca^xvcAH5 zB|;#-8&dzV!Jz?EU14%e6gQ(#5rUj*D@ckfYPPw)lY;Kxcmpa`i~g3#>wx9lh3pL) zc%LYS`~NGiELL9UL~%_vo_D}ldIzn1PU*Lxt{ZTdd0bzXOfj#j`gHZ-8g#(~!gJp9 z>ikcMDW>8#9O2Tw*mTkcd9`aeOY7OrB9lwhm-=#|Y>kLHyhp)5U{UGO+1a`xT2ST(OHT`6 z??S~qRJFi)j`$Mj-m4{cOZ1+o!2LIpa{4@BH}vDR&>4@Be$Xf?9Yk72i z(#q!kh_lnb`I9`B3d>gU?-bJJRz3GO8}}SepI;cF5!wra8S{0 z{RqdbCXYSc-6PkR`nI_1 zC9sQYo$q67zP+XG;lA=(85>T?5q{lc2U!I$?-IJs>clt}QDPPH{3|gpS;B43>FeG8 z@H3%u%=ZGiX%!b^4Xs__Zau-#(+TKB)^j0{Xxc&tqJUlcOR}Gn-l=0VQRIQH10^Vf z^MAlg>RB528E)N`V8UFnnl$d(o?U4bK75(t2z_#g{Q6dY#pe_Y6+zG4zR!g?*%O96 zr$B4blkc~?%X=S$G|Wb--Ssli_sSoM78S#sH}~qharoX~!S(W6ky5qF0@Y(8?))J~ z)ElFmO(GXt4vDCvPcH58J@CT|hP$xd_+Ir8I*bA{8@Vm|(D+jLRii5p3pzdp{1_^5 zPe4Tlez@P=My?>t4|MPt-!)LLYUBcaLr{hNL?#2b8dnafTlxv=hkl1$zILzBAset2 zrup_Ev(Hw4^!|x-z}GUSb*~jyyfZT&JABjmhf$NzbRoknsCEN@ORjnxc}NM1UBUb? zIw*R^PUvc368uzZ5;(q5y+mzqx$-i@rOwf%WbC$7#P`$JEU~fFox`myc>v?H6M=}= zSjG;l9eONf9#qnAHS~HvUg{oAI})=pcc~n5DzQJ|RNdjJTtGJadMXOWQonLTd|@sP z?v|wIbU~(hx4%x33&-#VDu2KdLf;$awvjbHsPo@ESQ;p)-$>3=y0k~TV&JsrpDBK^ z^{eOTXpctEj@>~|^~Ae&U*_CGOC~;e(^uN9hAdJHx;g zmOhl7F$Z|=67EHoK%B+R&o7A`8k9#SuC|IWJJwtDy?zSLU&MCkZkU#*UaFVT==FHoEVeIB!h z{F73<21U4eS?a<7pGo^dvaqExns2t({S5I#Fy%!NC!ft&A?+7JSU8fy03PQ!HUGH8Mo4I9CM3P10Ji~PCNfjh_UvmM%^ed>AhWJluH>LN`<&DKB2Zj?T+D&2c_lLC+CioA4byj^>9{G#FaT<82WTeW z-u!F8=liZxoHI(SyKX}w0ZO~W-u(~1i4;PKrh$#I)AEe(?NZ}@9=wh_r zuRdMVt>@^erX!}gv^~eYNCZk3#csbPS)4 z6dJ>hSt}?mmd@l8t5Mym(^-UVq{E65+c8U|*Q`13FpMe&x*Jqyiumqzu$ZC`umT~CgL(&2|38@J?YD0)w{88w zCI~@tgF4zHgmicUBrx8~sk^M4FVbqfmNP2!in8^)R2-XrYnPqZfENQK8_(F)Snpq& z0t6TL>{c-*TYPlhhcb3ySPk!hO_8;1Y%NFeQ+j~^`xw7XOBIC;4YNwxE}>j2Wo`tq zDlaLWO414*GA#1=?PTFnv&tV6cpZN~s?Si3zYm`#u2p9DXfL|0qG`&+V^zzWy9iJX zyx{nXZCJhPo2CgLGVE%S0~89BuN@}3{>HiLoCa=LezadLtf5V-SD2*zy&Wy>plxSb z)l!1`dc1oV8E;`iLy*i3Dbgx##+{Z$OmFaNoj)4VeHf1O}1QTz-> z*|;(3ltP|Qw375jR4d1DY4)wx-vNYF7^uiA+(flr*rNvTja1qI{D*@0!z&TN$W6sd zSsc?_ls&iLBniDNB+vQhhCvfI6&hVJkf!S(w{*(H8 zACYjg$;I|*=U|MBsdMF1=^^agd)$dr;PK+>sdVUy(y{pcy+eSkvrT~DQ^z{uiTrL>kKQ{9xSsAasS%ZuprhihBhT^)Hu9eZ@>IFg@aQ6qRi-u;2*`>EGH^_*qtNmbOnE65fI#?)o)c-5bPwbQ zFyMJ>=w`^U%Fa*mdV0toF7oPLQlRx?@p=Dusq>${@Bi2mHc*cqVtwjok-P zo17O5geTP`w1RC`2IjP#5$(~>{NEeQNwn|Wt2ThrFdvkE>wIAN&Wqn$*CE(Jaqq%n zcw-@8z5$02j8pO4h56yeN0w!8SPXkVS61*6F~fx&YG2ejb1CG`?7+u*v^rsmw;szH zG&0Hm%+A9nx9+dG+yXOX)0_w}VqfuIml@{kN#MZ8ih$drj$IEv$jP9`rY*f=xdGWo zs@w(RUg)xkK{kbjztlc1(uU4GK>>HtlwxZ%eodiM6S|QI0e-H*Mk{u;-~QOl+lTW| zRPXu!L>*CC8c>X(lbKE(ES`Cp0Zx1Z)7wQR|LYE{XwV(&2<`lyX?k;?YPMV&+$*2A zy2~>}0arjd?Zt%8_+sNWJx@ob?lLQp&$Wd4#j}q)xk~2L{o~FuDP&zK@((G39r8Uo~M9Gv+6PdA_(-cH!8}EFj@~M&8YX1wKS zo2#hl=Tonric0;}Fcf@HRL2dP3hI(}q&em-e(sVg*QInm(tbK{Lt(Rv8X}TqTw7~z zag9!o9g)R^oY@!ss=hE2HUMbF%w5GlfZ^vr$&xcYfFRUyZq&i|Yu}6C-Ala60cSk+ zp5%_w^wsyCjCpP~!U|;K_8}<$>sh18?hFEX@Hq{)orN1-%fBlQl1(M>0YK&EzeQUe zZiXi1>2{hLJD0WfUy;oG}f`I%XyvN51n}-tX7;Zv7Ey z-{qG#I%8ieU&{eH7dg46Rw?mu@%`NQe4-%G3#+Zwkp6ScKmC|?MJI_>_!QD{T$=Y0 z2bboWzC&51OtV8`KRGesWT2R(Ewrq+q$?(ouqI>6EnZKKkLC8KuNwZMs z!;QcX$RF)bUwr)j85@twl{Yx7)mD2{8C0ReH^`ZmV`QkyUAQw56rZX{6lFp{J!dDR z7xd1GUTcT#Iq|z)hCzs2_m{G&p}72P>JSiVCn~5Nk*VSYXc)sItK12w6PzSF zFJ$<+EUjIH-o3gSd08&~CU~$-XwpK3PPG+Kp9}FjsmF@{+s330K(MJY(y!Ug|Hfl&#=EnlfPx z7^kVWn2#@Pyz5v*1kZf7E55W=Qd$!2Ck#@V{)!-sY!1g78LM@q?D;QsFBDX7&Tq{D z%Icp6=})U4F^B>B`gJGsJlE{*Hf>CV_Ua`PVc{59^bL&eTN*W_^7b1GNCj&arhcCq zhEeOXe020_Vvxty6>hMirl89C;1~&1siS`twPbM_@KRW*4ocbz$kz^`TcVX&xl~j zytrAVGVh7hGN;?&1)zoakObSQ+zzFw7_^FPSD7jAfQoyPt#SRR3X-*JF3V9;{-|K) z2Fu8>nM;tTUBGVmfG_D{G$f$OFwomdMb5v|Fd{-88y@8%SwSiD(np5cF&PzEv5#e3 zd02X8B|__G=j-C%z?~1&p49;~1Zb8wvg^lIwBo&`plAYmOKTeu4XGZ?Q7S#{BY~TI zHTRVzZSPT#!Jf@qIV4{S-(NhbZgMR(HmBtm~X;3_PgR!%~PevQh0szt>s*-kTMv#>%(dmNPW`l0tqnZ_M z==uTauEJ7fBh%eJ$mZ^<<3O~ZCf|qF7PX90U=8!pBg_?$0CJGIH&EaAL+E?FkR{wb zN?y*HO4qPoli}3lJDYad)z)Bbc+uX@3xjHxJ3Q-g#0+bNsRL1uo0n|8teF{TcWe)P zi2f0une_6806?2K*SZyWEwGEWVV`Zy_dl!blFAuR3aBWa;)nP<4NrZoWI3Ca`l>bB z6oMNs3>#d|ig`2jnLGQT#z(DEx6;Uh4GZB+yoa*U0Opp)Cs)zp@3UAOise z)Uz$Cme3B9B8m^>bCxlH9Fy~omHZH^9&GLA<7!UY$!o%@Q7+L3xPe0q7-?)G_K)xA zCmzWEBW3w)Q1A8WG>N(`^4uglZ1Kqv20>`(_93KF^6v9-#&KOF5?Qe_b$$E9PAx~a zYrEhZ8kFD^pz7Dl){bhQ(xgC34*8boM!JS#1t6lQKPq`U@8rpfVp?Pf2g)`2iDU|`c56Im_p>h%>_umh@ zb>s*h%<4>eWlq;zL!$MHIu|@ck9-)x8hprOldP+P-1iHLX zA}r*c9%C3} zX1}|ZH`gtcpRjHMYNb-{t2Bqsu=K`jcj?B8<^ihHtEfv5`ukn}(X8KMU+PuOMj(yLbOmnEphP3_*zg)kL&ZU}j$EFocd2t)oHKj46F*OK6JU5w%5M%gaMvR{4V z>*t5ut=g3n-dFye`1JujO^_y=z2VQMMC-!zE5Y9lNg<%;VLndCBzfc|%)GlhHCY0a`sl2D2_I97)23}eZH}p_ZhS>3NuH}crSSD^dEi>F z4k7aw4PA)64KmL-8S2f>nf6`LE0ptRsQt#rgZ-aFjXV=H;IVw1U^+|N#4zGttqS^(-*1zTU4|96zd3kyg;TurA^ANkhbAL#>j&^ z&W2a_PK|d1oQ$Pe%|MR%__cQx#3ZnM_f7GVxH{gSFDizH*t(D0JADO3UBmj-*jtBg zraPD5NH>vqKi6kRIa@LH^nlua?b||W2Vo||9r{pu4`57YlGkT&eFNPLiVuM{OC#>k zC_}YOv#GjK1OHinun)z+j;`x~LMtETd2cAIqtpDatey$``a|$wONaVXQ4EbaQv+8V zH$3;@0i>mMAogX%_K)ID*vX$tPWEZ8hAO0? zk&2)5i=3OtMuV8L(VRCC{%q2{vZ8x&*Zr~KVJ;6Y&?+i zv*IBe;h5o%(>T#-oX(V)isZ^-B4jnCv4zhQn*o6|J7uRD>hC*K8#(4Z$OQxrewB>y8#Wcc>N-u+_-HBijyxA^M(SM96Xh zWF-<83@%HeT+XX$|HKzC)zmE(7*41&fp3S+d=^Tv-xZ$p&u*^~^lNXM8>>nl2alKnf>ZqzV-C=j^4X7L+fd5~b2$Vse;#$k zpsPG^1JK4?idGBmiw(Nxk5qtJfEM1*=MGY)UqPpf$ojNqE$b{GQ3NH zPpssny#go~!&9q{!O}05*@{G8HmKbKsGQ@X86LL}C9F5TWec5DlEHiCn82m&o97Tj z_EQ{z_e1ygH|uuf^gjl9|L72U1Kf#hAk(96>l924rCt6WQVg^UP(UxgC~Xd>oXs7z z^gkh0X#;SP{8J0FK=dit*hw}&Q4mS5uc9?(6-3)fu752QalLsrExCdLjV&7NLtD~h}0T*6U)8DEZ6pA>mA%{<#fSF-b8N~uQ8NY z{pi7-&x1XmlE-?0nDioyQ2hMDiDm6*J`2B%Jyy`GgEqyzrDfshSrPLhv&0$iMOeVA zqp6(=Y`$VGKCbEo!0sWX_GdD{A+=Xr2lj+4yAKR+dko;(? z!n`Y1xU|Vz24rwa7L!k_XeK4NC?QcvN`JlAF@Aw^e^*o0*3qtCdLcjI`ZK&Nz(7J4 zunA=p@&tVpxgjl539$0cdpR*KwtbC!HP;+Ep#7EZXh*7@z{I37&4moThW7RG(h<3J zkH$$6wX(vjJqJ~08e!7~ZuSmV@qVEfS&WRA(zhmV z`Yn~id@lt_n43g4Ia)DTu^fqS-ZMy+6LX~qXoS_719Vb z>1OGF$e~dJ^Cz>X=jyqdnegRbgFfI1q|W(NHqRI3p)?$Bbzd2DE>B^I0U+guajIg| z!h7-3{4xo5*YMHJ`psH@H(O7X58G+vM#RiP712~YaexX`!}iKQg4mrVPLS~`UpGiD zRqG^=`K=Wni*<`jTwt|RS@tHUvHh>~E(AFX?#=2Dk{(ucjpu+^=xH+!nemwHOJ~RT z&8%FTuwD$y^Gkaf-u!}IyDLDH3bQCK-F*1tE^#B0rDLx^Q=;NdT1_td#UfY0))YwD z(V|uB3Y36WX|%p4&8TI*NDr)=h~Dk&*etN+RsDF|s)YyoWs`8Kc_7?@!ZXf3{2FP+KikJxivBeAf3g6o$5q|%F*+CU-@AA+ll_{--i}yY zroC1-x>z|8y9RBk1C>~3x07;VEPR`j3Tf7d}>z28%6yB)$_d9)}g#dU$;`ES8xFwHW3#KHZ9eWZt^8Lq*K6oX@%K*;P`>@M91je ztuyY-NlxF*Q2w1r=;7Y8DhNbms1{yu?Rz#(;B(zFfy>Ja8p*r#pUto`(G=HaD#3i2 zDZ66i^}ey~L7_qj`c!YB;!)fgiklo|t0Uy?Cm=D~4RumPv z-ia8hAhBsmG*`Q+dfvyMt;;?p>C=vK7_)>0K98I$J=)hQEuhI zKK|Sb@?N9g2)Q`Q2`5g_gDd+j|8(GeM_v0qcChbNEe-Y26nXJ@anIJDc^W{&pa6UA zFe+PLQ{NBpEm@lDk{NYlj2ZwJ>Mwg}9dz7U9(N35NsxHodM@nI=emKD#}0t)&(Iynf{rOtSCu%awGZmn0-JZlA z8n-ad5ZRvVi zrU#1AePH0s127+$$;2LU1o?vSwGuOv4N>7b5hI~7m;rsf@Zm8#`=KA6V%bZgQqBO( z!lSn>7Mp1-9N+3e-{tP zw6J}jd9_>o2&fVJE88AUkP{7iJhGC>A@{A;a%i%%Cp5W;-ccnWlnVTL+xil&Q5Xj+xr86_G>TeZ!0lyJx+5W@HEwW@bQ+ zOEsT1zFM75`rh(YaKXZ?6n&2rRB!>zy`q{z>vu9-mwco26tXkdgf8<6_Xr<`mvpKX zR)n)OYbM9SJsrcch-rAA@p-IH*XpgWq?(Ph)^wcm~I+R99+1X}v}>FpXqnbgmd{J- zM|~ZgTXZq&KY&(d&anuLaLS9y@TIifg-#NyfeI~cKcvA2XlZWbd89QItnWPpdUk1b zjKV)+M1TMAnNlK%wqZ^P6bXoD!#@sRkXnO=jyv=|i`P)3ZcQd0(_6vLrY*DU6+saC z+j0+1Dd#(>lob>GlOrI0ukA|a`)-yu@#UJ62YDsIh27kD6XwM)SPd>4X>Mw%Xj>CS zgMFH`6}sb*p*f}V1gDJM_6V4JZwNE2t#3Z?xy!y?~|xQA_!{Iab#y25W!IA z^u2Le_z9wRI!@Rs{q;B(9|?TyB#Nfj(z59tSET6*55et?;QIMGLgRg?&vF4qv3U(l zJjZ0jWLqiYPr2OOogu;^!i6Xi+q{|s)Fs->iQiGQHY~rVO8*w)gL8O0>&}XPa?{;Xuyj$Fvk{|YIS-uY&Dcc~aHno#PTlk}!OS2kUO4x? z7-rX2y@*;IpQ*Lhp;`bZ_3$i(czQ-PsV2Ybv%Q&Lc121JY}t6qSRoq5`@le68$lEL z@}%K{w|b8m3g>%k@_}_#cIra!DP7hhLzXk9a zZDcD>&$<@`lg6`|kd>`ht7=P1&I`7j2@E6sreXxnnV(#=Xf*C)mW->f% z(~9LD@{Fw-I9A+!q6Yhdg$&y-$*GIjiargsC7U)6=X9xF|_kJn#E-m3b) zU)OEtI=~{I_nb-b>?s~R8m`RSz1I)u&q^vr5=4I`VypzQE7Nmi1A9tq>#3I{i0|=R zsKbBO+`6Bp3D_sf+S1WBl#n&@f*_0&T=G4lS&5%p&PQ>&uCYq2XyRnGCuB`E)JQn5 z;uy|L!Ac5MNi(+4sxwH~*4u&G2DTj8IG)QP@e5e4uHIMh_0Sfb0H+weU>H>jpvTGW zWlj$18(NSNdTsw3R4jvUGUt4-d88t-$C4})M#0)Q znM3R;R#l5ZF0cyv7EsAeP3T7bgB;k5|XWb=W_TIoWH*F(D$$9QF6Qg@Gfrk z!JRvt5vF_Ph|ca%Z7jAk`gZBP|NPxuScZtmcrSmC!(?f)f}-atkILN)ofJulm0=QW zR;lk)kFe35n4Jc@&t`|}jNvPJxJuIm)mCS-ZmzJ)$J48Aa~qv7f&i!GfOTu$USe5$ zlkzm!zff9|%YEw%GK0$PCx#>=A_c`Ka02x|)a3!ev;XA989Av{)^AP5l^xfc)cF!! ziqmqF^c93-cviSmW6ONPzJ-bgmr-uz4cV)jRb2^|e+)<=3{wF#R3AdjgE3uyvIZuL zR3ogK*|OJtdnOZLN^+)qP7spqY z8;KA=DXyhlQ+4e+gwL2D%MH6xGuEPOw1=z<_chvIofoA|^s3#kTZCj^g@y#_Uo8Bw z2TO-%BNQ?fm-|Yxyi?Y3tacN62*0BN;gs!tu?IiF-cLo93f`Z;9{!uyi~r%YqG8Y1 zJG=i{q&j=Nq~uZ4?iJUp>{l{Odq5mW*!Y{&nK1R?kkYU^+aB58mJrCzz1eAq>6d@qV?4&yz`z5bI zCu?MUtf_=(2a;lICrwt3`p6NI z8v%oLn~s17I)wfE+As7{P7ZHUR9xd`sZ_c>lUYCJ6?Mb8Z?f%IR9A-2v~KF74;J@8D_DQEc*<5166t#8 z&a|jDGK^Ta5~I2KCapbZ7>|syEHQ~3VpwvPm~9g=6=#oYv%naTXG9~N%@>jef>#`$ z=fJm5x1^QMJ`g@8n5%4=mr^_fOS=vK3~_RjL`4-zDjCCFvF2ww1X@MM1>7xpM=Vi$ z1t!xnQ}^|wWfc%j1@LCphoY`8LFMwzYb|dRaU?eQn;SDz0a+0i}kYhxfJisTp0Cuw(%G@nf zm$*$>AzQSI_GpPxrTWx$wQo{9iA*PzpV(8}f0>vf={W~PC6TAH-KVUv>gr)PjC7x$3$mEz`0$}14M;MYt&m&cF1>OaVmKR`YK}q=)Fh;dE!4vUyFs`_K z^FX^ZQL7Mfyfw6l2jX%gwdaCoEOzKfsx+db&ej;NU|Ko=2{QzU=XosGJm^jd*+eb( zJ*!cdMM)90J?q2dU+tC?J24>g+XND+pf@r~k5(k;iPdaukM^8K`Sp|T5;@&`D5>4|g|Jmh z(RphP4N6w>r3KbJo<1W-J|myfwFyLK66t@2TK@kXWZ9j2yS~$m)W_qWv=Loz^&DP? zjU3cTh6hZ06mYs18t#jk?XrIx^F{tpe}1e<=;?6XpRAtmBO(oAPYJm&!R5@6<<-~s zG(#@XJ^iz*-yyi+P@?*MONsFEUZWz-V|^=!91(IXH=`hzb_5*Z0bSy+b5QPLf36+w z-+sP}%iT_joD`c`!@Xb(t6FA{SZM^$iwo3~dhAarfo+pwnbjaoj*^lAQ^t@IqYQ?& z_45J}d+Vfk8N-Xork+^QlCT2jAx$D?+p;K%#1|iZypZJuc<(+d%ha^-%bIYln&#*C zPpuXf0D_RITnjzxsR#NQvi88TzV5n(6WuK)H1Z0di1vVfk6j1lmKd-U<`cQw{|Vh| zA6)|kEqpzJY#n6d^6OPCw2S7$_Dk=9JKeYJ=GnVd%Qj|~fJ2ZR)hhN!59itDF`A&K zk6OAPZJmL_4_*qtssFU1IVj|6v9&qsT{`;WKX;QgnG9!x$Y^~g0p-&)-+{CWJ&hTB zlibk7xeO63fp2x5@SZbsx43DUF!O5kcvkG1$z%?OuTz)dMP;;qr+DVHv7V%-OjKKl zVJswZK0lz6G8af8ywC7iN(EQT%r6KKWkY&z(&v_Kgk?e!srXwb5O7KnWII2LZwOvl z&GRfOGD%iwB~r|olXwa&t(J<2#S`*~=1SOTQ;nM0>0K<|6^KnlmRxr&<`9`)zWhMY zQU|r9v-fxkI53uCl_L342GT5v-OpCgyKF~gyGNJZ^9lO!#b09#x%IPr&$kGZ>b z8t5yT9rQftPgd)H3K#yb`+q(LEsM)DH0N6nN2N@MJuKc>D0^v%01~OG6Kd^bSz;0 zRie?h%yj5PAJ2%mJKl&nyUwj$=gx74GiIwV#Ag&0prEwWdMfov&6z(d`2MZ_``ug6 zvrkz{0YG$( zoz!kP0+k%A=s(1T1lxKXW)n1_(VpCU?}O*F7y9^IlSnK;>R)utY@E?0svnlg0lH z^-D53`Ddwq|JL68;adjq?a%`tn=f6i24_Nh?VfsQkic=moL`O&lR;cFzE9_yh$JVn zgPV$vUj-`b9u)}XVujnqijC`OPM4&?+{pX**7ks8ovJqBF0(Uwa7!sS_U;#O$pDgU zf@3ro1j{afjL_8x-Ql6u}2itx!m*t1wAgc zhTz?jzQ593h|}>20~TIn$6h`f?lWtY$iC;mk!@z^>)639gyaDqQ$k2 z|J=1dsb2nGnf$M>uN~U_6upaqXw_e2))U6q2PX{TpkEtXYOdc*(QFhE5_DJA#W;sG zIpD0fdo+8cTl$3ncmrUZ!ANfLXxtXJ5myNZ#I47+6M?s(i0AUL3*QCys(`0OHWgox zuyF%L5>r^f1#>USR}aD@0`zfjS&dLb)y;op6f46qFI`>_b1MyEU9R)S!hCS1E0l65 zOLAjeCf|JGIaPn!>u>}mZqE&72lwF+rx6Hsnv0S={;1PUW;k2C|^BIYU+HVo0H&pVafSuZqhxx zL$MVFu#u^k=TL_*ZWn`V!8%atkden~2G+~c!c%Rl1Lg2&xSmp2=jLElQm{SD)*lPT zT%Tu$Q?X_5Sys1JdhKJ`O0+7bkJwaY063pxmA5xrYa6|YdNvG@ilQ@9inHJV8?sTR zExO#MQ?w2^6xQ+c0mf#Mp79au#fAYu2Ap|gjyxW*$bo=vY7|*@5(fM|2$P3s(R2D! zfLFTb-EX13KX_XI_Gs?|5x!erBF{Ji5tvZW^_C#$@e%f+3)HRIik25HVSu*bvl7l*iwWFkPKYj4m9Gm=23)(p$h)Bo$7*#aON3GR&O{>pUzwBaTAW z3ru+AacXW3()d|xhayy05oEm*Z?-x_zYtb}JWQ|qdXcxeJ!mRdUPtc}W!mETH7K)c zwGwkG-XV;Of!tO?pI!BsxVv^fB^zB9jHA6h{Td=o*VL1c%Y*Igofqomx;2f35eEX| zuWC?yr|>Wor7YNc8o)57+wL6S!)v+Yout>gQ%OK)_Rx2RU*rGj4a#!vt&k=q3&Bs@ z@bE9jq4U>oU~|4Rtz>%WKkRMccFzhqXRRz9MontuCg@0OWt!`wO@2tubyy;xxEQlr zh*4^8&+%+;;p5V-Asfefm&#^vhwb#csTKEXL8;u5tL;r`&Ed>u8HsRt*3I6Q(;e2! zhaI%PT~r$<=-8S6hlkoVQQB>~21O5NZ@m+uAQxUP@|81GF)1u`HlaO1aW1=`*^K1h z%LYHbKB>vBEpTQVOa@P#Q-Co3oSiVL+1)Z1UW%V?H0jWS`$^8MlyebnJ5`iRWPu1^ zMN6_n)mwM*nZ~={uAS>WSl90?To4-s-n|vf8A8JuLR-3$*3OgFjt$TDJ^2d8alUSOj3wMY6IS8Dl?9J#?v*WCq{4jtsu9E6iM zP$pdUlr{3?ITn039|A33G0iA}BdX;d8pvOJw;Bdgox0K#=fP%y+T=MQ+(p;$dzsbk z!U>x;@Z90t$N5rz%JjnM`Bxp9{E;!LWv}6mg?{5(A3n^9LX%i{8s4MM%vb&A9_-&v z#oxYdIN*7 z5hl-FP^2?+33(}jd&6fk!tsYYjRNT0eyU>3#JB$eS^Z%{_PZamVS5&^x0ClQmhS1d zAo~9{xjG6EY7R}V$(R3Say9fc228FbN)uMo05G}A|1!CnPy2t#*?NDWs{gytF$6S{ z)Tty`)^4JL-1SwUikpJR+i`Inp=B`t?0`jt@)7VnI+Mp&bRCb`yf@lo{BHb#;vg_S zJe()rA^XTh?X$*k;Q)R}F0rOqtJqh@EU<}z4H?OOb|O(acd$DJC6Ih=f}qr97afx= z53cTF7R;>$EUpIR{!A6(J&C=t;xC5-#EtClN5f{`mL{=g*F^%l!@K#eV}59K>z_c; z|NGAW+uy36mE!Lp=jUE<0eUo;%4~9v?TSrtuaqNRTJp^PZ7e>+7Gb$$nD`AaNtzec zkxhP?Bs;8>I!%Ogt3t3Az&_EDAJn;Sj(L%}Nft8Yky>Xm`_g++O&BNhMT4IN$agcT zMu|$=C;j?w9V9(a^I2Ce29tSHXn9;dTvfWpcuIlZP)eA&j$$)8XV-=~F}FskVOV8* z?G$o#hod7!b^RVRU=U8LL~|QO9oXrKMa>t~pItb)uCo3HOR{4+K*)=j63S8~m)>aY;dK3=+5!EG_^+3w7Gn9FSfsM@|-KkHDw3&7<>5zm!-}Zi?@9hUIYz*Lnxe%UnuOoo^K+ zT+*32Yi(~QXoQ;X|NcoQdK7KAXCiLJAB7(^uf5pS|J0v&@2!Q;tQ*X8GCNw|Z*u_c#QSE|lw2I>fNhPTk_b_`98M;j1Uls$CR-$oVh!MuhNb zH#K7mOMIyhrKVUq1ab{=UovF^cGuV^xa>wVZ`}D^332TaV%t+gKooeNo<7Tuc4t z(xG(6rA*5*uy$Q}vf{&s+%Z6%J=eqq*GHCCJxB>W9!mOGZqA31E1O!AzD;(Co{Ejw zn(s3mtZMtNzL$d%a=Lgly4;`diFUPjyH&HeTYENfWMa+Mc7A(%{9Ae6AgA{_@L=Du z;kEit{E3rjdK$KBv9Lw%DFS!t&CXynoc7-2C-YyUvV!I{3)(yN=ma8TVX(~)?mW6zF zgGUu+c{PsZ%ssw))S=!v6h?pVEvs;@<|P`)yKi9E9N@pWXJD&MQAV}3V$7}tQe&{mIo!CA26ei6;Ypz?j*n0XV(C3+|LFcNXC@#Q=Y43v z0T+7>n9<8Y%k4mb*MODZ!+qzJiC}z0OQh~D^RqU`9EZhN5zyq7nkBDc@S(>h{c#Cy zI>j;X>&{z?Z3|1#mhO(n9^`ii)4zRAkfjMo42ft-NdW|U(V_JJGFa`N1G&rHisTN6 zj4_upXcr2Wf1{*Lw1I;uAw}VaOndF-a<}_!GKUt6t{`p0?)9JHcn()uTw%%c3U@3O z7xWx#G(Le!7-baPS@(Javw+)^s#@;}A|~(7wzXzZ7mCLV=L?RN&3_6I6@D#h1m=Gu zQTY6pW&l~~bhDL@@;fq?6yekvwp7(Gw!@ySNTD%6>Hj>pwIvdVKzlohMXQkd8;uiD z0z~zfI#Q<1<)(q;!Nz4)G}=nrX`v?k1aM89F^Mo2AS-6mJ?jkn1T$D9Zw?KmOeie$ z;fLz;A&%by|G9~8h!c7YoSbiwr5~kK0eYLCr&DPrE$kcKG?`XI+E)P3KJ!zFT$j7# zj4VB3wE7NRQN!+CCS#=}1aQI%Zw}^JVzA`!IUQjg(}e=nWYeQhXVL=$4jFRUIzYh+ z5h}iJwK*9J%e4azVIh&7%A})DN5(+jK;YTi5CPwOYUP*EJN(=G8EK~B%@AGMhMgZD zrTP7KS2zj{u8b<8Jfr0MDqSb~tlYatmb!BS)(*>J!{vo9!h(6IS>dfIEEHl*n}ME8w?%NQaG$|&eg_n6xqd&_bn z)*2{O=ki3z2xEQyB7cwDg_!CsmMOy{C8u}NG-(@>OjVPLg1>}gR6cHaUfA%|CYq@T zucRd^?F==x2%zG+`2>+sz}2vND?73UX0UF{91FMqtYgsh{>Och_2y85re=5{tHDhK z#+plzERW(==0?+Fyi>;I^Jj{_`*u9`$jlh4T zY6|A6TtO{@tf(Z>1pw<&4-yc`nn`X&ND3l}QI0~Zx0}}1O+EtA7=}Fhd88NARe~Mk? zs=Jj7BW`0afrbwnju0l$Y8iv5N6$~OWqxWQ0*NZtAn(l)uRL}bL@Ch!gmleg4qNfM_TrcLJ^YN6+teW1k`TVYvZy zqoQuzbw|-(;6GcK{{?&IGrYb+KA2$QR(vO)+elXLz(0Qy@vvk{vp$Fcttw}LFKbRh zuz}k!!@3`1H^Qc}GU)!A&x-*XqhMb)bg!TwDqpkMzmT_-PZQ#&l0?lWTw0|(*v<0R zK2zHcnLlrMwrmj*j(}#kS;Xo{K(IDzX4d-UWqH)4Qa+4Nh@mv`lZC{^Qd?i}2Tv9z z^+t-_U`u5c^l8`(>pNMsVWJ)ZCarHU&t4>;jHaB=U_brI=00;nVHThEx?uo+?r4Oe z`>W6oD4<;7G@CYL#N0GKlb)ZIQQWa*o*My_W+~LopP3h+_rLw7 zpf!qa0Q4}a(JJ%#YhT9>tmTuvGJN{NUHt?$@+z}ne<_oMgPCCq0TaCXq7gt)&0z-D z5-Tla|NRtPx;`xg?_CFhVqJ0U-7-2u>+`oy#b@R79vxG z=KGxM9ddg8&Ry*fKz#Vr9m71jdbCj&rF{482~Y>GfFx*F5ye53__w3{cWB6Utt}$aMg}DFWVCg-zgt|M?_xnN z7GB7DM~S&!-><)=JH@M^|42P`0s;4HM;P$=ttIA0puXg1;LAeB2?DNLM7SzW@Q#x8 zUYNbL0@k+wRsc#31!t; zM4QR+sn9HX`D8>mF->)ft&v9<)0u~klg*}Q$=!<2q!yMIRents`QV+Q&BtWnyR z;()E>*zBRnRxW~-o*x&CTdgh`Zdwjvk^4tt_?ejQ_bHa4rMj66$K9=!f~qPd{(!Id z9LKXXixPJEo6Z~#J^>sYi<)$9K*4l=|D3CvxfsamFm0w+M_{mEQSV^aUU{Q(q7SI8 z&6bwl?QJ-w;|5AegwOXaIY2H~ZLf1ieezzL%gd{pNm)Qde4}m1IQrCx+W24Js;;X$ zS#aW*mUGC`2fc;j@-K1PO2mc4Ux&B%w}%xuKu2)(as}vdVc^_0=y%`dzkROC^8H{O znj|B1%E=`_RHGs)1U{)wc=6!)sng8vjtxoKh|g$dS3YEuObhIk_Pp3JL2U_b=Q}F+ z))rtlb-9!5Bo9^bdA8i1PXK8paIj9VX$|D;JG^f_AB?KC*DrEs!(`wKu9Phnc`SwKCcdaf7GQtp zJ8qoJ-e74dxB_W%%4B|Vc>wWsfIe4c9bJ-UR44APuVh)IChu`&!+W+35^yHK)+eq= zg)}7I{TB=s_Q`nl)yl(%24VqK(eQWW|BN0t#9e5R^s~?Oa~VRSRS&Pe(So}`E&&gx z!hsMQ9(qcsbFx|$IKr>_QZ_|&no0thch@lz?4RG9_;OYH6cF%$*`d<^#CHWVoSjK> z|AKAUT@~GT!%8>9-$J(gjS6r%=Uv6`!4#M_08_pillh4tD6hgVQv9gJ3+JmmnFSuzt!P_*CuIJ( zecd7>aC<62Z|7$Pywjd(n-BtL=xEm&d;; zV-^Rc@r~uJvr|w_oBL`Ls9au|vw@uM%{y!NV~s$q-O*gu-a>(@U#JDJDa;a$Yr-gx zT11slJf`F5#De1ofja4V&++zw32{u#tNJ`nbDL+uW0_O-7F-~=;1&TtiBo)X7bQ=R zr82aN=B=o%q62q@4-_2tA^ZNp9VdWcZ}nr9rxFgV*FEYMO6wta1DZItIjHAA&SAjt zu(W_B+yG^>S!JcXy69(ATU!h65AmD*3dZGw$72x(n|unO4|HMoR?c42IN1`)bn+R` z0U}f0-JddnfUQK@N$j)>a~Y|Yw2gB;G*4V9>qIUk`gJND5w4o=xY)(%mt-3@;~a_4 zS3~aWd<24_0mA`7^Cw_9xVtVIjB09@`x&osi1lBDz|ioBQ43LGt+}>_qfjM2EDrSxA`zZ3AG-RoGh$=ItAC zC2-RwRHGza_<31vJ8$c^*slUp+$MV@uZ*dnHm{Bq5 zIV?JvBj+L{UPS|@EW%#kwx04jmY}?*_A|}BFHb{;7#~ktZI^iW$`Y{t=5|j=-3Y9n z$++2YQ)*^>A!OCV4y{6UsNSev=mW~O(eab`Zsmnypzzz!O~YOFTmD2(h&O|$Bja2j zTb-{9+42={3Yyyf$ObxO)3;5b^DADV_8G3)RAc|8d#a3}1OJ1)xh-~RYngxgzQbgz z%7Eb105u1gx;Hd5)OU16K5z`R>1hK}8x2ghOE7ejPk2*SO82xo#Kx(9ZxaKFjqzKG zH#NWaqOh5M8&dM>W765`iPhaE>A=D9y9_g{yMP-zv2JA@ef1U^Vmf!2E`W>H1Gh`h@CS%~72S5#I@I0wy`e>`%VyPKhbM6s$ULn}TFkb6@YblyCiH zY!*;vV;txGiULw2ARUw-pfn@BO8{vK(xio;f`%TE-c_WRNRtj0 zdT#*)1PMKWkU;3=PS!sAoOj>7Jny>qo_~BasLw;l{LOC}<1+?e-dpo9Y8sE`(y~uC zh@DcL2QS@zGm=8GQnI!#`vOZXrg+z>Is;d?H`D5x4@g$_Ub9BFHZGKFw_!*RjpV%2 zU&>F%{wQ;#)U7bel^wMMT-2*9&ZaM;-{;Q2#6A3jva3o8VAg$VfkQvOXQNkXT(tO= z><4U#jSSrs(#t=577MmdsSb|)^wOvNT2-75yO6WC^6|%0`xM#>Pix}UTIBG zRh-1) z%Z_92o^AYDA9$61eve}FY2jR01Nov^qE7iWqJeJpRSTI~z8L|YGD0U3U@xfjQ|luk zt2q@fpMX%lg1cuYo{p|}dJGi|&I~!Evq0K+(sq|@`?Fy*1+EFv+lnK;EAIM~!qvN| zZ5L#$$CpRky@uaUL@o*w#il!H;}GP{y|)utHkcjOqQQ3nkm&4?w-U3MF*VrY2OBmF z8Kw>L*ettOZ(p2m&^6h@lnREaeLpO_CeExdq^%TNY$?smEpCQwRSxxUUOL0#Tnb0! zP9t7OZLasG`|fSKKBy7F8|Ci_ZX26fk#YTi(0pHaS*qah5usw#TMs4AwF;wcDeyOA zQjFW)9&3?e_`3A#Y~604S~6Dp`$HFSDWTlJU~o$E=ZjkE_V!GdkM9U1VDD{ac${%5C4U0Ru%m5uRo~@Mbcq zPJRDkdWCBNds}~HcGl+Q%ymbMSk5H{obC9Rfe!&ChIVQ2+X-%b3CvIj%&Qtf>97XJ zdbzX2{O{kQRpq!ONk!Kq49UEy6J79g8!d1)6+*V+?pAhlx`b`R1?_W$>%exblI+9h z+2?$E-yk|mte-((@wLT<{$pH5{kZCO!$)k1eZ=7&Eu?E0Yf-T>xbZ0zAW zsM}`KSy|p!r#dMtE+_0>gD3|EG14W0q5FABQp{C4CIzrGlX15zGYd(gMZ0jby{Pj? z(=Md?u4wv)nQVSMk5N<*Vk~!QZIj!c-_MBAzZ)uCWp`=)iIpBdmo#}gN_OnSZF5gs ztHTd1y-c)UI4P9w1yG(o?B_gq!-o9%9JlOPP*7mMX!-4$W%rq8wzx~icAPKur+kSR z&Bt_jJmv`$uUyeEgf7Y^p&AIP&LS&rH1YptV@w`hfvh_lKRCv=x&TEKu zMzcqZR-g{iiqldDHyOoboHhh*>u;$m1clQMtxCJ-O#b{5;D+>++<>QFxKPwYyMK9W zGJh<2qneig$j=saW2(C<=ojF)w^2x(yc`Xiz5z`0S?H`e|JG*NY`;ZfTb@sn5D}+Y^R>O_o`%s5HX?K`WBBrLr}~dmTKx?f5m^!Z9zrF zDK&56ry;5UWq9l@HBCJrN?oI3t28Uw^ReSWfo7>@^C%|Ze(>S;lNMm{@2xPSOFHV% zgI%~eU5ZI;tD76Uy4&PPf8rBor&E5vDjh)(Iw=u<|~VHYlG z*VPM4t<>C&Zrfbka4E??5ruRnN=S>>HLuOlS*#nD9sH98fT^N;T{RtBe%F=S;ajb^ zLq4MHcvY zs~}Q8-Y&m|g4S6`u_zj>i-ls*>UfpG`ybWW%U`mCz&pJ&U1fubj+wxZqbN2PwzEWu z_l;dK3u95QJoXxUyzz6zp7ZBEP7-c81WCP@e_ybc_9{w-P|H~U$#p7AfhI7T^4f0( zUjMqaI%+OOE6=R2OeoISeujXBXX%h?dZ3!td+9S%tCmaYjR@tBA3QYH66I0PpL?xq z<}bQTwvmY?81~!?ioH4>t2!8oT2Y);gf=SWrH_n1Q=aj35oS`yze`y~4h=O4T$x z4zVndSqEE$Ies@Qqvuu;k*dyw-Xsa~K$^6~mJr=6qf0)nBB(;6#D`+M=iKC+13<$(;d?L?t?*9C9+}5aR%SdtF$x`5? zEXV8Y28XXn;{P{DM7KL~1Xm$bt*YS?J`nKN8~ zPkojeO>Pu24GK|d?DW7W9(ZY~eh#q9l@ocP66gaaU@Pl&N2?4Od<%EpAQ>yBkRHh? z6(vDm$(gToxngp&KJ8($i^|KV{E)!WIv0WW3WrCyEjI54x^0oQyy^I8i#(7}Ej5?y zcGYQ{<+`;RZkC~b&xZLtm*96jfUWiywlfQ9+LDI<0cqvtfIWKZGlmMfTv|%A<7Yg` zH#cPF?^h+)#Rn4)_9_;48m|G>`L&@s;&uToMS0)d=T6$?wz1wF>L6I|46#;p)6~s_ zQdYhWy>gb5U4Oi=b!U8Qd?qYNZ&6Zf@T5Jtn{9ICa2$V{Pi{f& zEAGxJvDzT&42IrB(^+H3>B~O+2&uDTh&I0U8T$%ZO(N%u5bmmCMcOC!P z492oPICZ<8;11&$?bC=(I9r;UiFRp<=0S)M@)woojubw>HJ+C|HBXkeTOIbAkFukvkpU4=IOc`A)=U*oAe&DLyMU47Koo zQF>}R)>FCK^Uhd*>h!)s!5;%xGv3nniliBEkBT@s_;M+K9)81lQ}+G7uV&HArnbdD z2Gt${V+Wkm(MrJoUb*PF=Eb0c^ zyWfnQK9OE^liB~fKVU@hFV_y4SNN8a79*2rwiEeY24DNAE!w{vEPJxOY|vQU#AquF zV*FGeiS1yQyf7GU!b?M4l$wus@5@@?9L z^LyyOTivd|fE;$y|LA>oD*!}RvCzl}DXWFiw?S2X8=2+LyU8z2>YT0gS%uni^m4e7 zL^nhoj+~<%t$L}hdTC`xz=;^`-93Eh4qx38j3!~Db%v9Hqp2!PXz_fyDZ;}EInYy` zo#~KsgV@%aZQ5uT))S$kI$_B3zlIHec$uhS!k=f?)U`T&W z822Ur1XbWGHXipY_paJHSs+Mp_IFWjnU|hh0DF~8mYH3X1$!#g$33y&c?CWo6^o^~ zx$~%k*rZpTj=%b;5thv(08Y!XpRF#7I5Yn}E9#ktVouw}PrjUt8JRH*dCwf28{N{W z9TaDsm5g*vRCIb9<>7gw(OrV8N-5AA6lQuY5(XA#oe6)AYhE%~bkyxDz1?V>iNkKt zIX(u!3Zv4-IWJ;7G$qhX@5$r7C7*9)9cC1bx_4~}>@I#X90z?zh=`BCZQEBh$C zWAQY+zO|tJ{W8nU_7zCJKTRsLg~8Z^!4{t#W1&S!e7{bePwa~uPL!sI;47sucYEVc zJj=Kl^SO3oOl;zV(Upr)NB2#1cIHu{dtHJ~M3o^NrJ~UN4X=NjNiro?vO0#M2sF{{ zES!s9&B%QfbK|~QbE&?b zb(GVSQ7dkN#+0!T&yHSI$v+mS7Z(=cXJ*c2jU`qtTurhQIMhH+N2-#1aC!!szD?a< z3iJ0;4}nBrmgV9_6I7kq8Hn@Vc6Waxr)d*GNgZc7ZJQiO5I_<`?I$YedVaIx`rpU;nNziSl5d>xcusqlm%WBjazU;l@xk zKFfI@nX8_nrBd=MzYhB?5@wl*?|-*iG<&bZqbFY9rDI0K>RGd~$U7+&joMaV{N-PZ z#xjRpC)tn|$F}rT)5l@^jO6Ut9i7wg)SbLj>0Jep%bbDvSKUMR1+1m{~voK0F7KWhAT zM<@EyG4lF9*!7!S0?fT-O}vj!76Yggb=YW?^`EuVd$S7z2Dk14{?3tJ>l}-M>0{Ee zKkU`noI!G{Igz{$b`=jj&8+(w6v$P^oBH=a43Lh6+1U?1d&kZELz5ULn{A2f!$r8w z0L0O}FN-6LF)}XW!5^w-tXav0O{6_ah$JQ5^sSc<^1AZPv$C+b;sZ1tBvvVRC*1YQ z@e|L+C@bB@)Hb_hSEi>(wJKT$8@KAUS#Y~kKRkH@&4!P9MPa$aJr&FE1|grGBqQ;` z!6rO588`DqC_aau5jYN#qNJ)=zD&e_4V8y9DMZs(o*Qksm8}q=jZ4Fu1o33a7>E- zmy_O(b+pg9M}ChD`QOD#(>y&Q;;N={gZ`f(K#wTHzOE58VNFRAJz+ne*duPQCAfC| zl;(Ly94A^josE`_Jf56)-sNh~@fgltgN?(=^o~!`2&`>$(~YH^OaHb&4X!4-1Dyk_LvvU(*># zB5Ph#zk?C3FnOG!wrGlVYs{`U&+izL{)cnh{n8G^Bpr`a`~;laSfiD^gWPvTN6zi^ zOA=7rL)~+Gi8@&dLkis94Wv7tw$XEnXGj02odIS(}D@7Cu z($reagRFA6P>mm3#=lc}5q*E@KG@{^It(?bivTG!4dFf+oktV!{))!O0C0Qlhxd3? zcCN-2e9U3feN5)nRDER65|$|F@J4xD`U&soOvkt+;l z(MJ@=er-$=%gWx56;g5%jRBZ!7q&emfiNoMY=UjyI9z+9Kd+Fm;W!P3=4zXPAL(|1 z!Xbusq{Zi(YLQuZ?Zpd`{@!B`pZ*{Z&E5Ba^L$lw(z813q_ui#n*sUQm43kFVSug$ zry<8YjD@Woi~DYyCO`4DRgwKaE&_kXV?Px@$WE#cAqN=#zQtcPaVa+d{oIY{h8o(Djh zqvX#xIft`6?sls0jm4@frxugemhVEmyv8zHh8|jk9ezso-T3Zz$0h%7S37EN{rBoO zgF(J0=nM+z>3Ivmsb`PN;S%Is6mjvkXD9ZG!oF-CW#R^Barr= zfG$!uYbo7lI%dsqwkoVG9pjM4yW0VESXEoR%}$hw8nj6(PTd=@GEcqZ+t5BxUZ=0U zEgN=$(8_l+*&JBw2`GsvQ6HCC2&ICMupCpP!0~4t)SjYBR7Rc`etND;O4kv zqLd55N0I$^6Yqf&w5*(~lbQTsCV42=orUdF1+9LuAg8X~a65`#QujwM3Wj^it?~ieyzCzI{lGAydDy%yZ56t##@>u)GTAs0Nee&y2M_ahk6J$mJ48 z+=H4qcHe1f$uDd&4!S;qP6kmDl9F@Xq!JL^{;J8Am^87MNlz0?@wtw4&o6vtdnON) z^tG~0aZw?=&4xj~lB@bLH-9v(fScJ^dMW(QjvNU z{1u)L?1?$W94-V-`Iy0?n9aM23SGhcaeiTP8nwi=Y(?K``eq|9|HkXN!oK;?l*;7u z2B~)(x8?;K@)Y-{dG*PQ`>hMscb7`xZujD0I?<OvaU#vdb%a>yF;=z1V)O6n(p#b_Z2k!Vb`X{?t!iX} z+E~wK@Fm=eID5GLSV%~06}zz3ZuFO`lw;?&_|6P8YEx=PgtDw%GJW!e-!%;UY`|_& z8F7@~r_laqK>-MV)N_Q;pfJzy`7u^)50-b#iG-eqv*l zyeJHyNw}w;wlKT3faP+mYo&|JO6|tolI|NOG2PbRDl+a3szIb~I8C#BM{!T|yn~%D zzZ_eBweZu3gZ-wNr(Upmcm|(?JLRppRL8<=m{FoigC@For@)5fDCn##HDy@S)6g2De#>Mx6Xj9hW{i6 zyl9qoSsQv?aV)=FKh;87UAWSE1lh0I|K(*+_JK6tr#}lARep%FGE!r8_LG{Q|I#H3 z^poXQpIyI^?5>r=RkXXq*o`2v`+1hb%cD(SjGlfaHfOyIN%Q?@%~DIpnOomPdMb~k zw3VEAR1(Oir{4rFrGM(M-1sco9rNp|`g~ZkP98mw_a05zni}Y%CQu4a1#;p}*k~}g zF`)R|57Oh^=Tbapqc!oiL=_gNZ1=zYQC^LtpC79CCva4yFPx&DKK1!A{+7TMy0iwh zEiX}(J>zsY2gl9E9?LXFprq9ivacH!aHMMn&)LQn9Yx$%ZNXQlkb{tBEbHv_z4P3! ze~{YcKa<#fmWSG=(kb>=N7nrNU&(iB8lcKDktzuCkH+MeVSUqrC=gktt2AIbS&k zR+C*Vl3exfh`)AWKgWbX{25%_gZ6ns-mgr$O!eO9yqS1^5X2EX!@Qs}Cm63cumnln z-M!3pJ@Dn&DbF>b^6C5Jq?5k%dO3${Q%xE28)G`{x(xOno}b=)0~K?s3fj*8Gh`nJ z*DF>%b~&=TnW?GK=%X9{Q=Y{E!C>KNthWfGk>>F`a7$}n8$akxfzUo>X$*J2t{f`h zzo2gXl+nb*=7sefpXB(eZjYw5C@k3+ z@do1kr*}l^_gqswukc-asr+Z*k+)}B^Mzw(`}?fpWOS5P8$u-TQBdp0+YClLM+vyz z<_Eq1csA2RxVRJ)oIdTXQ&4>%`Fj2Q{Cr`IR;^2FDr`o;U3z6)Aq>_&;@{4S=@$LtB{G8OHyk`A%bfLhiwLZg+#JZ zIf&%kMbmBrdhN=MdUNeX`&$sN&$muz`0q_|Y_~XK%k)Q}CopD4Ox0a7i#!UdMt@FS zYGy|qfx^KoMkh98^d=35#N7qThqJ@-@21keFOrv>@pa0+D#=^i4TGnvzzM(_S&`LeW&{qeHi5v z*0O0N;;q(Sr$r(+Je&sSzs_Sl2U^&h_}JnHWq47ua*5~D50ceU{@ikvW)-HAwI#dm*a8Y#=Xnx9PE&K>kOivS0Q}=MJ>eMfCres38BE=f*sWKbTL) zWOBn+2Y^_6vzp!ld5@0Cqx@0*v4~SM%RchKx$Zxww58tR(N7lh#kzX**{fwu`1z(@ zVJAnOMmgh7zAw|n&x#m%t86nm?{_-)eVTabpx66u26AGfC8=B&S-CpKQ5Mm2b89kSvDyDpAB`0iuCvkIsCdFpd8(U(Uv;Pm3Do61ghu^-Bn=3d?jYEJeWWOPG-w4LZ* zcN`Jx*$R#t#0HYubhCnop;#Zr;_CfW{3`r-y#p=QaN};ju?J&D`~5ms;vzC^3rZeH zmLtq_Y8Mfjt2#n$%=7A9nQUYjR?=lg7DaQ7PTLl}efG!Vw` zD|OWlFSm}-DLbEyq{NpWse$SuX(lh@GsX?UJe@ezoRwzordjoCXHhm}X$bQbxtRzvgs$dbSE^*= zKei9*xa$jaaQ(Mj&U0CqFqW&iCVe;?nbGBaKL}A-snxXEMpoQ4Qu@fBM+G^`d2wGa zYIcxyab!WrD`Tz`_VyU+)%K@WAoXDB)SA+^CURspIHdKDd8$5k-`i<-=<15+)1cV9 zMLOGMRo*qtn>U8vYOLHls`Fh{l%q31(v+Kh_ZIt`7)ftb{E7}P50g<5Tf47x;%ExH zLff>QHg|Di&3CEJcZZal_cUnxEyc}{f$n<@w{v@s6!3sO{*qde<*p?nJ!zq$=ptQV zUFssm&A@adP5Y%F>>Qj(wx~Z7nf824)CgsvMMZHl{u~uNtIjrVtHZYM7ICd)&$)-i zxh{d4GR83CW)v+^J4KZvyFhV}Odik{snykF2F#eEb>}{gU?1?ch78GwZ{1oCe&?e1ptH ztAQy?ZQ_8C!Wwv8r!b-{ER(J*hRz4A4PgTtF~tr)!na6jxW@vcE4j`XT#`&_3N zNnfz6d)IOO39E}?)7io(M7tLHmo5Jv*VaHlF{`IulqnYhYsG5VVhA>Q=_Emz9Zodu(0oo%?J}3=WR0f zyb@EG36Azr>s@#ZG7sd88OsD(^`B#W4Q>R*EX5ygm{0Wh$bN14vVfnVo#`0qt3M9o z>ZhfYtte+I_-SEs($}0myz#Toh#}eD+^>K28O^fD^8~J8Kyh=UeKh}qe+OJO<2Hkt zZo4@K=qCBaWt=YVE~j|vOVGvnT?uqPj^7(IZxXV;t{fcX4CY9J2JF>4OEM?OANfwY z|8aXgIG*YqtCF&UW6|`Y{knZthV&niATxjsaqooB*o7wFy^ZpEO{+9-m5en*1_)jm z5=49N#sqRL!(-4~78=1Odt?9CX1zA$`48mAs zHqU%1STd0O5iMM?`nARs9Gd`U~_9~;?d6Ts?L?;-KKX@{I&yWf&#`>QVN-r-Pzv@ks#wZhzerqZc5`e`lx;B=+JN`T?Ojw!2_d((UFR9DGw* zzqT1n-@X=%*!|^M7xnTLwsyy1#|>FPu+{Odo-Dl#na-dUP6ciKbyOkAPu9BS^*RXZ z$YgP3_$xp%iuyzF{S#Tk(TXAYb_W-A{FL@fe@r!6gu%#@be7w!{rMuMs zDJSpcs@>?W_f{U0O9= z*^%;rdHaV>bp_dxcazU zbHdc~N3ubP_mj)X!w&62zIr7WAREyihY_I}k(?;}MrL8Y0NwY;02|&#bu7%Om2iz? zvZdFhe;gP^j9-d_xTU1BGcTYdmLHUQAth?CY02XKtKtXuH=YGh-#t=q6yW{ilEW(u zU>^fKcp=IkZWPnL!Z}OqIpb1oK?vqoay-an46>^dYw$;-dtBZrMQ3gmD#$KxJ`_CZ zKC_HAn{hRn`GfPlKmjVe(tF)WfgUh$w38~ z?$5)b)}f=Vn6eRUvSfYwSG_-8j`8c~AE7I@jHYrAHO8kf#RmfyAfHN0KP*cIFzHmi%F2}qr|Msc zb;TnNpwTO*BJO~I^YJgu6p@7Oxm1&FOFv!8Ds{RCWkyNKK*(;iW#Z-w5Xk>NkNT@u zfC!`BSrm#wTmO7}O9*b~B{yG0`xWF++)4|iaV(9+L`vbIvy`WMVNhF(qWlcMHx;kt z8nl;)A7|lO8YMZ@MIA-Ob3ENV94oi{LFADmS)^O3(?@$yuEA=?c%OG!g8(~+d-rKa z;1yDXoPA3!Qw+CQoR!!ioA8JG2p?-hHb447fy!3G;uD9a$&0)e6*3S`8kc1ASZ0#F zH3qqp9pUpz0CqohFpU08v1(0Mv$+u!lubU!fDPGE)?EGiTR;vww{HWK*^i>hfYp`x)sc)%e#aO+NaI_@PykkL^b^g6ow z*Imljcc(;D;sAcV)N@)=QZmjY=K{p3vhmWwpAj&`ImH#)Z!bpQe;ReFUeBQo6)!eW zsz49ludU=?4eL$MyGJ~)Q{Ny7RPujj?mzfNz&8to_iv$(rI+ZO!!u!0VK7Zm#YxwigK*~#wJdg&A;ab%q zcEx>{(U;LeWVD%ymZ7z64ZD{il2Hp=9ck$bV!7a4KNV5axOqnMTH6M*^!16<95S#5 znEGkPky*~1RgW~}C+P`=?*`gMvd|U5s1>9pUggL;QU7?q?^qywQ}^r?sHkN*bECil zCIFR|t7X7F;W?H$G=D?0Ztf_pF)RGWnCQeG!`Uj{?K6cS2;>Ll5Z@;Ojz@(xgj{zp zU2)$T;X9+6%zw<+ zjtWD$GcC&~G{}y;!`J4|Ask{N(0+L1@;s|s?`<|GjG&`X{T^w% zB*Fh+TfKblZyv|1qDGYKRGoAT7>RT29U`9}vC)iN(MS{$hf^*v5{tTn>}k$L1tI}q z0LvQOsEe*7yh9_*3m0JLRM<(;?TM^|A>0fcjyvzmzN(&63G)kM)Ic>xJ0g1Qa#X+5 za7d4EYt^nov;6lTwQ;K0hTD@tU*ov>eBf6LMR|WIu(pwPX2#iKP`nJ2-nHmKx zXVMWDgg4ELt9E~5)IRbygXY@H2SpZ&`+AzqQL!N9&z{>5~<3e>3kBqt;G0(FT-g}zv&#RfYZ>}we`w*t~46N(W3T>we)tw`F;v2!PQ%B z>(ZwuM~927`a?MtrrBl_9Sb{bSATx-E0n0Dr`_1wFKRA+X8W9$uT!>LPCiy;ufaDA zkV(WnYmQ6a<9b2J3qEc8_9{i*NqmW_uK1NOY$uw-n}_Hj-rga`8>qHtW!3+lJhNL` zzS3;F>W(Z7TG%=}o8bFvk1U;`fKi$2>&Eyu*#@>mV^0SnG&MEDzm{OI+^BIm&=BQF z<715-at7uzzY0@bV5yN+T96#~;tnkX2DeEkUxu9ihUk^Dxio);TBa3Ao)g7EE!)yR zSOUZ<=_^QURPR;+#A5=&mUr23#%*%$-rKsS1PEJ<_$TQoXyE*-&>adz>G@ckz?+^;N< zZ%@@nzhw{e(Ty|C&2bCNYXfjUk|?57Uuc^N>bk{INx-hCUY(bPOtKz zy}%)nuchLqDI2ye+>g(MPK}Nv?ly}g8=at}{>`RN!;B&W@|p!QWZ_(!>9h%Ee5kJCkubqpM&RFD$ZjjKOEX;f7>zAy)YprubbuNt6s_y} zFO&{5P$3ih^Td4!K;dN+)LSh&I5%S8ze5bdZg^0Wf*;#G+OTeTa*sMJ=43kz_=H}~ zv_}E<$RMMB(4dBRnq6GGLq^KaPMBvFCmZv&s~HZm$Xa zsMpH&BV;orr($7`R^&G|fJKuu@N)jw-+hAqv&xBj`Psc+GfsrfkpV&-`ra;%mJ=HL zLbk!b4_em5YSkIQ9^$o7!$Yv5vFc>4z2Js`cJ|(k@%yf0Hap#Gu_M^27gfi|U6$R> z*RP;3J5w1HS*MQL5uMZM@Xl^k%U^dU0H~F<#oT3fs{&KPgZ!B0$^jGKu%!~!{Bh3A z6wPp%mAxVE%MN#`G3H9#yIUT7+uvgLncL&6yF#PVVdtCM@y%dtg*_Mn9GA8uVW}wo zVpeLyS~RgiZ7eHtlT(!j7|6qx@-F!r3n-X+TcF6wW6i8Og0^3p6A!{jG4f4@5Jv0Y z46Ih6oT5UM5EEnL`)+P-JHVbBrNtsI^TYpeKjEkdPwbLj%pbs}9b8+sqQEu(ZJO+V ze6qK0o*}6!u)LnPaRmSqpya^TqjsH zSmoY+jHDljHfMQl6C(jYa08QQbNyIazsK1B~XQuLX+S#?;sUBcx0Dr0sh3%k0K z6XSOT4E7}m^1;nn5|#NZ%#BrI7r6@`@%X2kN*ovTo}oIAH6DOKGHISmqY@BI&;ndq z*+wZgl9B!Sy?p!ve>VMgWS(0bF)`0MopD1qNg67*+LO9B+4faoXDX^i8-HM#R=0iNx)DZ!^TSr~lQ} z_HU2V|DqCo7T3CYNW1qxVUT&O;WaFkm0VSG};(y`)!Z+@qkTVLE zfC|QQR&c+g*N{`ZAxH-ZXr_2C>1dLN65($63);fk^5zl?-@c13)MlqkdjvIRv4+c7 zJ@UAo@{$q1Fp)vm!xHscQ>5AWWzM_fy~(P(l(?XN^+xgI_bqUZSh-rMO3D*NvF2f` z&H`@=^~Yq4{SEwcSw42ava2%|E3B8Yi+@KgG7S46zD8>fRtm);-Scbm(yRjB|5>Mo6R6nsJ*Sy@0U#6-@9#D zqBAmLO^c%@sQ*u&r1o()LC*9$oiT{igB~!~Wo4)F5tO$}pdET=^`_;V(0PooU(}~y z*4aL{J8Lf$LQMBMV%nJ>U+}fd6Wz(7c4;VY3ZM>^8eBTx&BqNYCb@iYQAtrbj>9Sm z6WI|Cbltn^S($6-yxeY9MQNW4&C&yD^7dccZxHh85qbgeUFL7NVYOdf!&#S`Oo^<@ zXj{O_j@6U^KO$7RsRQ9QnSMH3QCcQorvzJtWgPo6ZS4-)j{I((i}wZ8(_Nh26Y9YOKX4)F*Zlx1W^u`b>V6*|J~)Sp-HiMI3u!9xBIJI z)zGa|q8}vV+>pTZ=Xk2Ct5<=#wy%Q0T&?6B)0^A~t4T6&zeMILWY`p`TiU zc-~;}rik7j5UYeW={S6Q;`IFhG-H@F)L3i|*>KH(m`_~%F^@HD3=|l;FU;MfKn&k0 z!YrHxc6OA*e9FN2`f;>3Oy|q1q)F?v7f3#bx9`KL-!eW2Dv~Xat$6*l;!A+VWV(Nm zTP+`ocot?+2WWbZ8{XCw;o5UNfUp-a*l-y?wNJDh5oq)o;L+M|)nRJ_J77Zo`Uh$W z50%+1cP&B)6O_;nU`G8fnKx@UrQZK$F!C>N$M2Af|MvQeo2D|cjc`rPF-XP5RIeVf zca3;}7c=V%vM|2Bmthwy4=`>c>B8j;mJJ{E{TlPGLcz*0w$e2|PesFx#=az4RS@G) zj0yT^PNlfg2+J2YC9oAHrvs_4gJtqdnS8xaX$5kYuv-}8M)tb{XeWw9@G!J$kQ6^D zKK97d^%*_06ZLyj6?WvzmzMtaHx>+i3p3tyvsZ57s696XVkLYD-;(!=>rc2+eArpX zZocE)9nkT=HONHpCfw#A4>4tPE0V$9pPmHGJ>}crXdxe?Zie@`Iw;5J&G4zL^sKOA zSk08;|J|GOm;dS@>&!aUvCB7(ywI;6Pu()P@{ZMwg0_%T`zt2%3?~O_8KNBKxE;syRVLrx!*v6~s(m@o6I0(Q`!T>R< z7Ocs1A8F)`LbF|2KBG#(Pv| zm(mGMr82TILcy0>zqIh8;VQzJ@`LNP4OxcdKEoze!(VxD2`@CeCVKJOy4j7y;if|43mW>XIV3sjp!f>S5bu}B84V2e- zV-iU^>b4?o1EGc|o`o&-2f$Y@fc1kd=CoC3wJ1V{!$a@5V%hLF;XjT&=np*e;ct&_ z|Lq+9#YgP{J*dQ|@kM{)g}CvzCIV^C9Ai(sGHdsiN9!vFN*|heN4nvoig@#Hs*Vo*hrtf_8e$qzn7TJG|@elby7xKhRp| zUtH{vVUS+30_aV7Cg3bekucSh$6eN!A6~IOv2J}W6Bd2jgVv!%TMqp-UO@Y_e)6CX zJY2d+K2FBQA8|poPT3pUxzBXc!cE18UR!9EaSov=ui^214$gMMdm3RQ=Lqb^@@F}S z0Fa#isVlGI$qXwVB!I@ErMmcTU3NpP>abLA)qeUk+aQ^K`&m@b7D$Ku|Aa~XKmGo> z_z(B~E5ht717mwmKN&C4?C=DSSNLHhWUe4P=ssI^^eWkhYx@8_<%hI4K^Qm`T0rW( zlT$~)!=hEsmEK=+qdo(%GA2JLWR?-ABQ1>#B@7QS=~)oN8r;lhmmFz0eAnR$ZpeIz zCh?>$SU5P|61Y%#4OGe*4vCBHRZ)=xEZkZ&=lF9~#QDQ(eaw(SL+h6F5Ar2!c`!xm zQK8zq`O?S9jM8WgzhIp7YK|f?KjvGap#~Y0{A|GK2Q5qWnfT#s~F7JJCIZdo`?-Uz^I zG#JXuO2x^*l&hKC^67u{URCP3keGhvoiq?#sz53{j@l7Pdu7l*ze+nT&&Yk1m>Q@~ zzaNRY!wLfLimr3iUf7=I(fIk(-*(%{61ReZ}`*)1u_KZ_UpcamlY_ z&U$#4W=XxBzd23yKto`7;PW~~!%rPBs56gX^tl%$ooU$lT}K$24<)rBcUppOAysKq z9Af8sDr2<$oQ@*L6_)tTUnn##bP&*K($cw_5r9HlR_aL%Bu*twU`7uGAt%EB2j4yj z#n^$Q<<~$kg4j+m1U9q8E8=E$nLRg&qH(9fq-Cz|ZP7Lt>7RAm8+h;`6|rjBfM@{5 zt1x6o3`f75t=S;gDV=1WYp>w829I%9^yeOES-6`KFjqrO5yL~i;OgKd67D2BoNrI{ zX)c8U%gb7%ws`_adp-kzFNor+B~CtNxscQVH$6RQ{PhNjxbQ4Lc!+B8Jt_DKV4=G;HVdw2nW%g?}POI+GPNf6UW)in|@^Un~UOH2)R7 zHQX%BG%+|Btpo|8{QEwmzcY5Ay$RVer-T4mRjeU(C}77Tq*UA=WY9)PD{Kef8v5X+ zGPo6NGmtEi>0=xfK%L93Em%1s;s~8P8#bLQk}httWEpZLwFF9^evsd5lT(lQ8gouj ze%-vmYCz8)F>LTiW6eAPCg_JtgYOO)m?1|(?F(V4gsDYqFu$QlH>B3R(Qk^j?qr>6 z6fO9!qk!tf9p`w(QN*%6q7(i^Pvj)zPh`_x$4TYNu#ibX#&mqy!)X=89d)E?n5(Yp zeol_mM!Xdvzjf*QKUn~`Su>d%Rv&Cl+lHqp&{N(IEpu&KGanf2yB@zN<#+tQNsIok z?)G=jxqo}znt~G2%X;pSgTuMz!DU0*zIWbVd(2$|IJlcyQpGLv69iJhTiL4&rx9=) zZg!Ww?6&Nv%-xub_A1pG(Lq%dV+_yMZ!j)sQ}5<8N#`Mkqh6`IEl=7OrW)s|JhIU- z+irXT-*1gc~Q=Q|)zKa}7$>HP9d||x!lXO0v)%-2$2~tK>n#@>m^0Lx( zbnzjLpGNbd~f@t6zl^xI& zRTm)ZhSSVUrqf8v4Y2hCM@uwz3aLFIF!{IrJ^%Lh{QEn)*L~jWaDP+hFNr4~djABT zh->~g#FIY99NwZ3c;VoZrA=zrdwCT?9w-;GwM86SSMN+@9E8A4EA?q+7EA~FeQ9-e z%9;~&snQ5yD-Rs{0Qs`CJNtcybhJh|W0@+evP1l$i%?c#h(f$@hd^;+4H+#2oYUVW{sWWqNT3J{&XW zztweRN*}BNtG!h{YQJyyfBcRGI8DU`CQ-<-pEs6ud-yotMA>P5l|nM^+7&U<3EH#u z*F2>0yFi>zG8~%v8nZZM%OS7Jk9wa)_?gA-=wq4N%$l|*Lq&E!xUOGzkXE|}DJkKb z*!=M8l`vb*y8sG`Ke#9qPoB7NJ4A_(^Mrlh2ha09B9Y@!Jr{MCf}TCgenz>sP^)(C zb|OzT|K5aeaku5hXo;<4>nRGk6%W6T4q4}f6$RV4MJ{hf(s1)?PJOBA(xh#H-;Pys z#!@gw0+k9o%};@)X{XenqXu(UHv%`$qgXM*4%9qs)Do#T;gZedcvzYODw8u%)>|49K5_>%!ZneZo;wG4ZmUD2=pF-m4l|TAr>Kk zDAQLU>&a$Hqvg-m@8r=qI;{2psbGBn`EOa?PaFP|0#L=>$(&%WjHc%+XtgOUQ=xtz z$Mx#l$Jio^a5x+8!G|;jU00*UD<_YqxyD=Nb|%Y{ZOsz{(Ocx~Q{0%HBCKa_)5nJv z2k{T--Xmpbc0(++5lT2=)nx$#38qF@Yf6Z18(xtLGWi=R`TtePO-bRmv)&pPL0+EV zI0j;F-u5fyHSmFMxYQuOR}4DDZ5D@U!3AKXrGpOQqtHcYc!~ISu$5LJDH_DsgOn~1 zBU}n%g#9j9Y`jB*g#zhyD2$)Q`KWO%C2o9<4Z^|+6i)Ha(!504M8 zb_62m1gt={%`;}D4S?w6IaWr{3KeIn7$ueA#YLuq8ZBnwY2+3ctL7V7eG~$0#ie1_re&tcLX&K2#N8echt}=anm5p+7vu26(` zo7@cW0*4_J_GBbcxZdo|dx|RZxfurox1zHSK*Wff~3Lt=}w5{<$;yJH_6A z{hilm)_?W$YKEvc??_6P2U@Ag(HFc+@8hOp1xRUR(8*p=PIE4HMaRbL&E3Y(u>6Zz z$ZaMvt!kaPiH#pJS7!q*PipfPbTd<#=~XSmMfuG#N_c%Bb78zv?kpB-8)>5mP?7Er z@^~A9iCJFO-m=Oc9yS*)Yl#$kA@%ALT^MVn+zMJ}Zd(I``GW!Nva(B%Jw|R{ieQ>v z(=rYenK!FMh5!I#xt|)Ig8g51y3~$i;Q`ou!0=w8|BJl$jB2uN*L49=QIx8J^r9dl zO+W}GC@4r5>Ai_am)?U43P=;F(jp>VdhZIMOYaasdM^PI0)(({{N|i%ukq?$@7VwL z*nj!uNPM2$_jR4;ajbrbm>Dpr!lEdFX&^aKcuD<^<4-x2B>q(JlO@06@A212Z(JuQXQvQ=sf2y~F(TGYN?U24DiM88+>8 zw6Ox$n0`h@=yLDH|)nK@?*n1`YHCaB5`5@SuFh7P^Tsqbfe5%NouCqbyPocus3eAYSeMBu+%VZYB zH?55BEc#YZZ9(Se9fG&0D~@y8HWd@c-#y=8c3sywytp2>zM{s58BD{`TVVO@8Aa?D zjq1FbZ@#Mit4r9#i)s|zDy34;fcLU@+zIB)czx!4xy{HBtj2^78biEUwUpwr<-4Cg zq^-}BSJ-%w`A8f;2R~8DOmWkLw$e0gzZLQsEzA}h@LYn!@lFHE5cdhYa{1}$XHnTX zg6Z;-u6VAEBeiC~@#z9iNO#*eJRo{6!Xuz4zitDd>F5Xh!||ws&42q%aqtfjd!aXz zy#hD0R2yJm=EreF*96j8Fx0-M*ZxKb z!ONEt%O86osKT&&3e}t!HcDIT7enV~qu>UYq@0;n@+idQjUO2<=KM$rc=D(2Q^a8) z_cWeUiv3`H4f(C_ZJ+TL2)c$wLKm*PsNjBjg3}z7lzr)=@o}~s&rt6{<51sV>0Eap zlUc``^}-CbF%3RMJ&qwq?&1UEc6T6?xB`FRm8z!U2&a%y|LOo}LC07d<89LG$ zy3;%>o$Pg0m!6TQy~C7c76EV0eB7-MzTLs_%=t!!v~s3d6g2>GOL#F4v0Azy2}bAX z|7Ji29kA_Rz%nFta?rDK8YV*e+(@*__|#t^GJb2CY#52W;~o*}KILgC25{P$S;H%o z4cm>Rs%k1}zw(J;h8rR|$GQ{V00Z6c2RPIXn4M0ZIIqK_9mj1P8ag`kpTaB#ra>>$MbUUisN79qbW4~OHp&>kqJQKuk=&g!yUBH)0f}>>Duxi zoPDk-GTK&;K=fwmbKGcdK^4boRs7(yB+nqOata?-nZDENy&id@&nWW5=;f5B)v&JR zab;GClAy1Oh`DBRq^_Y0s(D2fw9#JMm9J!2tx*vF1^M;Q^@E8l zORxBEl1HYo6u=XLO2~!et3={^DztPQi$U9?e9eAT%SAmh`LaS!z6sB^X0-xeK(_vH zV}a;SX98kopsKAosIMty>MbR3XY(&wkfY^B(j{m47buK}Z-iF^`}6PuklA1@axw*H zMy|K38R8JJD6CjKk(g~ML?hrGtxdu$RraHwuJQ51Mmp!sjU#5!Y={>T28#fK@ZK`q z>MOJJj~on}D)S}B_nG&cWtoC^g47I@O4Opnz<4}Ckg5Q>THtFP$0mchnilB;zC(u% zwLnNqiW%(~{dJ=6i%{Rguffz<`@aN#Ob)3;aY5|A(K9wX2WPK6=FYD)OW+QGkxT77 zt_Hw)8}Hp7DL*<&w)^;rN2qWklRY0V81=tfg}jakA((9dR2&wx!)Xyf?mznJjsNJUhY@#w>!+(ME;-M39P12w zy~737#t<7T)TwF;gwv7tO3Y7?{tiJNpa{cWRDc7r;Rzo9q=u_fT%24jHvU zov5%zrVrooWx>-bz=9bn!b#cKe$QN^RyO$T$|JiSp&Y3qtmhTu{HEkJs?6%aCrqw4 z7&Jn6P;>0h2eHG$ga*y+=76eIe|BbaEXAG)oP+RJD8>=} zUr$#1|2$d3x!2crx2^uLqWkA_^qm-bofymPt_n7S4fx~M=HS2e8G?}ozB?Kbu(XznQXxmiB?JZG zU*0jl(pa`nm^@gf?J-q7zWMewzWdWsl0f6)>97oXR1P3cK3U1-sz)&DYleJ?J~cc5 zDQ_u)O7ZL1^TfQP_5q3ma7qWLTo|Now_DsQwUW>Qf3Ub#N+DEKO=h0PKXzebQ0k?5oq1)soL{ zm&m{yl%Wnwx0vt=b;%CS7ze;g+onycDFrSVgnPi&xoJUI>|!{*%I{pPUr*bNxFBFi ze|>aK_XcT3=Wfhywr9iLhNK2i?LDpADkyh#S@kW8193_0#AM3JlGKTO0itHtxd`;2 zhL4dM^NjSu!=IKyrmrTWpTgR64h>;IcQi1kDiJBg4ck}R*dj(JOwCO=G$cD*v|s>q_&j$YZL)C2Z?SkC5R3b@RLe@U=WdSJe5JWXE~`wIN7MIX zUfpovwh?TH7zpRk*{Pmf{Y{+rf0kvaK=^tzx;3?nd?*H+A_S~?;D^+?yB~Y%%|_J$ z+5Kp*RW4k1VFmgA=DDUGf5Ur@I4noV2}jem)E_JN&o2?lG5Wel-w3iRI#@gvIIKtd zD~Awl?{McoZa4-+B?zpr`PzX2n#{Eg#K2C~Ar6f6TWWQ6g}L;2u?eZW*7ED+UBmjB z;EGd&9=Bv>ixZR$ZQDKVz#V&3Op1l^h(Lo*^e5o3cJ{wP0#wnqCuhhWpIj)K0EM*_hj5=85B<{k8bA-}4eNC?E)ViC*wH$j z6wIf3`%6eaz^Q-vAi-8G^H8KmVz+d+gjU=Q#N1t8V486KA$ErVXtNG{KY;>^W8I*7H# z>?Gxn7_F_N!X}`SYPx){&2;`4rRvwQ%RMLP%@YvP3V$hm%|55w2<5BmombXhT5Epb zT!aGkzj7v_TZX&4@XSQ}dI)Pkl;e~pHhi;8J7=GfOE<5&Gac;vDNFj{faW)EM#M-bNw^Vw#+U@YfNFL%hZR-bF&j1P-Q9;T9%6J|(Ex z9?hjIstnF%z2X8RX@@f%vX{g_zAf@8IT#Bn@(c|^8Z|rrw+MZ&ZFWOdwB0gpeI<(j-OAZ$IhF7tzW&H$$Nm9<=ek1XFT+j z%(5|)TpmzVNK)MRHt=lLU zHl>sfFRRC+nIJ8tBm|Ta^2=|6h#VhF%CP*{upSj)9oKjJWHJ8Mm1A4|iRBS!KA4N0 zG?F^gN>}cV6W{3IZUygSfk|Mn8Y}Arpa!%IawrCH*-sQ(nf!dbaHv-LcWkf3vz2d2 z|6)QNyd0o;N3c!m*rYcE$R1a}JQ^!wMRJAdSCCzvd8UmSpy*;%8FOzquD+;T6S$0` zpT^3D%lvZD+OC!i5D5#VFAayTW>t$EtT;c24ir6KWM+A8_f&eyNGY*rnAO7e`2kY< zDi;d!cs?+GB_TIIC!GyMqrKc)I}8H+NcwZW6k9VseBR3FtTZ&KLeN%K^c1VDd|$`) zK5}+U1W)j}bQ63AB9}=8u5OKgLO~q6y@)!zAnD7wf`lfjK61-pL7P8Ix>rA!gqI+ct!7T5CUgHR;))kUjoU|6&AWvy#lLSnq!F1tO6PA3A&X zLI+ej;f7po?8o2W$9JX!M0vJ!@CMsQx@BPb zPKQj*Q2U*zk49qQr$nZz$WlRW2i{57IKzIgwfsaG#n=gZVDQ6pB)Z&s9Z&nfn0@Yf zQxmylDaYb*r?SXRYjY%r=QvlU%j1SyFd9~TY_j9w3OH3%6_r*vIlx#0Js;E-3j%^Hb3&lx?EdKYpp1qKgommRdxR*kIu|V7+@BJw704e zxJ*f1af$Wb@`a-tqy&_!mzeH;<+vlZ@HML6EQDv6FvNZ$YSd;hJuc&uWlEKd!OE`& zQpRhu)lYGOZL7JgW@+bP_T!B?Z{kxZ2owzDd;`RhvK0o%8(3))t`mkvIs3Eo5|%A_ z?~>5{k?aFlY<~0`C_)2(eMoN>+g%ZfW_{7bd*PfPc8+;B$&cmD1C5S-P)%b}s5seh zD3d&7(V0D0*WV%7p$e_IL`KWcGQ#)BhU9EjI)y&CJ@oIe-mB)bAG__aG0V}a+;HL> z(`nA-a{G~wt;+k8`0g59L7x35ER5v**1>**4KJ}CNm=25^v~V>$^-JmQw4N~V;Y<7 z^4o@5S5y#%nbTCiLSHm4>2fNwSsHM*Gz9B+DLfeNt<2t@ptt+FE#Y?arL^cd%V5%( z&V9Q`3XMA4PUp%hMR-5y+^+1y5k^o2{zOp7SrHRY zhk`4vtcCOE#O*K6iz6&=3-Gx%)Sy~)U+H0%yN_Z}3$<5B2gqkY-H;D%6qb0e=R)Kf zxWU4kAaVAwbFrO3vLtfU*;9(^c2=Kz!^$$}JmE0yyL;K2Dqp!vJXVTk;oyMD4;Yx$ zx3EndIx$klx$jOsRL&HXe$-qsw(WZ~5Z8cPz(G(o(hX9OH4Dd1Q_Y`xi+7i5YRnTw z!_jAd?d3aL?{ivo+D=S!Li;C}Yq2iX_Nq08FcX;KFW>->bhX4}LpyQHE#H%bWh=kXLu=Tl-)Om944U_dazV;*FN?P@8j zMXmmn#v9p5cT;EsJmO`i0(~S0HT+~Tnjw;TSDEu``J{^W9wIXZxvxn7Ua#mK~U`-3%O>c;5)3{8Td&o-ITNsV3as%I2^DYAL!zDN>3O5Z31Dzi!KrU|mL zxl3PDhSvEd^4-m&2G?Qvn!vWu9_@E8m%o~Dpnkq%Wx}Zq^5y|k4Dlnz06E&N2cg!# zWGI?>K9Gz)<9zpWcN2)$_&nj1tla=1FQ$3+m4$&T%n7;bx@72XA%g2BO9k9ZqR%pK zek>;1#SVjJoZD9T=bcw)$d!7a`v&28`^nkwGeq}I)f}cg7uzAYGp{GMDL6p~A7U1? z&s(+p#jUQIN|cdaq|cF_sikLWyYfL%Eo?NY4Xae#QS8rrcGC&jxxR0%nm+1W&VK-c8t2k zHqoDfX6%HMuI|){ZUfE5d)E6rdC%U$>8WpOJu@se>+*~c#clsg5ylwc?yS?4Ss*3! zHqz>x=37)RP^?|R20cQ;+$Ju=NbD$)9SX5SK2TEFwEVMLN0O7u;8L6Oh<0YMc{Wza_dYO-# z=7CA&*KAe~X)z8X-yD>b)9+v*526i(?Stks9)~7Uj$l`{ZCG!1<`5L(U}}kQlvhJ* zN8%mDnb}7_)=mfQ-j0HtBE%gXe&o(JY*Oa9OIm(3&P}O^&+L3vUnj$Ia~ArD|J9}J z*MR(eKj@f4F~Q5nwKv7MnS_-44N`rjpS8C68=EVY^r{wxO6Wi`Q=DjZ(|kWN8&|3F z+JuT;IHM@#yr)HSSzuPWNC&t4&%z_JBq&$nb5Y%Zx#^OdISP>?#1%Y9QmQNz<^iH#@I@Zf7u$ z5XFyF{7?UGLhAoz{|;ofTr=byuV%tnI$3)DIFV5T`{ZBu#O=#+>DWrUL?(su>JL|k z@~rgy`p>?q#Thy70xft$5`@90_rXdh>*xo^sFC3b`$UIV(%%KZ;9+nO;dgEoS$SZ0 z0*ICBvmCX}*9=Q{13J1(FA{KRUp%1ryiQpWK198*p;ytlwtntA&-u$alP}BVNa8CA z3sYG6=?>GFhs?+?lqWsXx=0{iVh@_2tjb*0R4eYD7`2EbqQ{9x#z z4Mc2uZ*Wf`7)=1UT9m{7>^pv2FiBFGCo4|r)wE@z^!zJ-Uso@ivkj>h;XqE+l4}~9*&JjksU%hlzrI^yc=dYRom@cY zJ}T43*?wb`Vn?szkG53hDlUw;gArBf1LX7fG58+7!uyB1Bxx2@VeEQSy!c~Q$~iTZ zt`ql7t&1*z8Gv`uVs+DG{I?WXxDip^T#u+aj$HQ$v(aaM5I`jIzU@ zsHikK$0V8Kv8ZcGmTC2e+*-o4Wd#BT=&*U&7U)@l#rI1rViMknTjjPnkfQjVwS}kZ zd^vF}a>wm`*9YOgXw8k{cZ;h9k&kqS+$sL(<-y zWM{(jN0c-l=-H)3$*YnORGEe*wmb_mA0~Uy&oO;$4*=b7=QsId8-I8aeFwWRzRTCe zN@KOJ&JW%j=Lq_i0_Y;ObX070VGX;eBpAc z>Z9(X)vB}l7WsVz%*2#MrkxbKWsv27kg@1l=eJ!F#8dg}jnzZcWFAdOLEnM*s`yiw zR5dqkuDcQJWYTqi@?dx7xoog+=cvE*GhO_q^&ZT^$Q3`RuA1&Yj&M}uEqW+6gPqG| zJ-|pE+cHsA%%0BlHq7XJGd74qng@SB9nlpFnhore7OtK+13Vb#?q=s!kX$S1H}z6L z9`5&uZ~esQ1Z~A)VQ|K2=g_TvDC;6`9%ZMY+XPP?s)ZinQ$o?oKAdY=P>0czRtkxc z^5bVN?YdVM-6Y(nfVFhI;2kI3TWp{A`QIWk;a)^_ zUi&J?9Hayl5pj=}0&ZQdqxvFFET7OSR1h2q*I5k3Qck2gnrSc&-5@jPVYb121Hquz zMmbjqTJE+w=igNoZco2PE)Z{RW7u+6n{nvtyQwhzPfcy%E4et5cHf|akqBR<1H_Xk zpHMa7A?k+1y9GA4b=(D$*400dKf0_@Iz@P;>Gi1ge_F7^i@=0FKxSTX<&jFyR(lN zr)zU4E!yHI(S7{Wp@0hveSdo{m|r^rvaxfIl+-D8v`psGq-o%tXIYR8)29~+;sC+K z#b-iUev%84MnaHVp%fz>F4!Z+J?S-Jci@`CmfAg4RO^}NC8%KuNpIjJel>VBRN$AK zU%As!?2^K+G!6!}hz&E%H3b5!0n)zG*s*4YFTW}yHGXeiT}9sgohX?ME|BDj*2P+} z8p3Tp0Joz+nJ~X4D7 z^!18yueI?oSLBp7K8ZCPX%%N^y_5~(%Nko2%)=zbx+hT)vNX1v+KEuI?bZA2Esv{J zcjn-j;-o9}QdKz8N$4N&Ha@#vVGG4=H+e$VGo_SIH8|rP=IpTx`?-cs{U4#VT4l(k zBqZ_JIf%@3DxgYnZJ?vz&!+2-)}!jnTjPmC`HA04Oe)IGDqWwF?;%2+1b7gH}-g=D7Y`jc?EJWy@-ZK>d{)JlGzNIg{vNC zcQOFtw{;ep^TLy| zrsU)I7F{Wa{G1Kze6N!TvZ2ShzRT@U^q}zv*LT(_UVU=MuIE;uewY)p?2(Td2A!_*in3WCPh z`d=yhOvN`U&BsmrFH@PNfGgL%5LYZ*($Mo@A-ITpE|%NArZGd~ioA;I1%m9ivnLL_w0@S^Z0F<`0RUL5JlcW@1Ro~8!)jZZ zgi%`Pmc|{)6W^^maNSqQX)bQ%@ismJ8gMGGBD$t;TU6TRHZk-xN4jA1ea5XP7cE9Y z506TNLq=_Gyrg4#lXqUG@@Aszu&(fii-Akzqtl(J*yM<8+V1|K``0Tk7^y4nHdfT! z2Di8y#|#Nv#{=r- z1dl)W$8-J<{qZt}WPgw37+)pyCw2ex%n&arS+sWE%Q6wF8uOtqLh5IBGy@}_FQj%# z4n;fXPAgnktjoLj#VTv|Z`^Bh+O<3FY7EY}_i277 z9@yUPA~`-LC)%s@1A2Bt18_WdpbmyVEXNgvK+RbuT=5f_@s}_COUvkct15xx0B_BP zmUtUjTzy!KHxD28vgVY$Nr0U9o>rWAJDQ)e!B}w%SXT2)(E;}jFSJ*WXKt1_mQ3R9 zL?$jXi1ItKPoA#7$t2hL%Lnvq@?uUmiV|C^%s>X^P3O4y31W*Gvs9%q_Au4v+Q29h zn$+p%k)-gOO4nN{1sh&KQ5+#%cDq(i5BJKCW$epffSXFpO``pbrn#nza%=Px>$Qgz z?=F))U=Z6_A3cB>VJ&MzRtNuLDcPo?l640O#-;;E=dK}M z`w;0{LOev@&1JIOz*=}=e0tJj?#?asG+Cld!5*mispK1SrLUj7d{o+MK;j;iFM7~D zAaUn+u(f2f=xB2V>;*F?mZ1CyKdSvMp#i0pZLDovcu#ie-3-pNul7d4Ie!35agEDu zM2t^o)~u+KzKR0;z)s*q7<7OAn?&EA4r0SjiPlFXOtK zF}!}vWB*Ii96^$C;C{A38lSbXzdRU(aArOEm#B_k)T*D|x2CckPVif;A(z5HIkB26 zc%61(fHprN{xUNimn_&mj&qdi58mGIh+j=&IJl89koS7<$0*<2w!BWJfDDtf zEG9@Ut~m=CKiu8ToUx0ih0q?%^LMm018ylk6niDth^`Y$l8f#=T45Zuc_C(C`Cy!n zes=Xik2>u%c zz@&xs$&`nSSx{muN#sE3IM_1E8N2Bob~*SZMr?;wezMt@{;ZR-1|Zb^1?x>b>J2AN z%>AchM5u!1E$x&7F+YI0?w^rkP;-VeSCDpVQU(s)TT@a%^+LV3l7~UKolH&rHh~7= zLn*lyJ8LSrJmw0mji)4sVAgAunUZi#*TXb@F><03R=5x=%-mQZTz@z;UY%457@|L9 z-VNHfi<>kY_k$pg5$UH$aDE3Xl!2R$f;268c9wA9<9q-oGlDGvMc?L~!)(s^)eD3y zCt;C2^T+!KTgO}*RE9y|_uoM8`*CDDvrXFsidt8*I{ zw6|Ojj}d92^fSWYG@CzR6$uShFA_MMOib^DIqcDjzBKVVMvv?&2O#+?l!AV0=~~3x zF&Q}NimdFX3m(2QLjC){HlX>lPVNHnH72*9Tu+RJIJ{VP`fM}53J7ojN0sss$b<1# zcpwWspC$#;i*5l-cJbC%3R^y=Z@I%kHyhFp48w+ME|=-$mIyb@?d=Bly0`VF>M|Hi zd2}d8;~315(pA0FbsB92q!X{Z#hG|9n@Vf6hQAKlq`{xE zHzqrtOzqmxgDh4l6vIXHdR2!i$JyCgrvyMc0ZdS4>};F) z|B>C0tX3AZz#1;7K+%>&iyLf_RefP+r-I|xBNqJ>bn-{mE5G4|(;Y$;{`XDvsCH*H z*D7N6Tn#WP-0HeFVY@L)x#_~8U`3;IM?qjPdg__R`}|7ZVEyXSTn+Q&4fp1$?hXRG3&0_N6oJ@YW(omyP0 ze5AMbgnNF1am#6BXJ7#sl?{VdWg{3qB_t$RvkJZ^_y7;90}7jQciRd>cjYzMZep3U z7H9g0>?;S+jwJgO$c_xmx$isT@_CAL9HqLJ$(k1Q7YU3#7h({0AB)Yy#crSGeDqWX zMq`$9!ESFM&zS*}RM`gtzKbh6NOCFM%fprJ8HoLlvouQVDpGa!DqN)-@`Ru3M?!e2 zUx=k|EZHI}9S`;&Px@;lg*~*nxDo8Wo=>oy9%roL{gy&k>*}!^+VF|dfpe4cXC#T( zO)b3r?6fiRS8LDM5_G@H1?VV7c!t1ZFwOU(Ci$u(N5yP6P&K-)2|0xa>7P*en#s72 zrgGeXu78l}2az2E#i6eJpdXaVyT>hJ)O^EKk^=wOw*B*55B`GHp!&6?wr!bmoS4|! zLP{14#8X~8rSi!7)&vN2k>nTuA`pMI$Xx>U>OFNTl)!C{j4~gWr#S`HSS%^u;C=39 z=+XxQ{){rFpPDk3&Dtr3M`F}RVri?~DUlxCok_kMGv*P{4$JU}vX=Pg1D;uGEpwR} zUPXcJ1%fka8D_ff{2!~$5i6;zkA{Lc(u=h7Lda1G&`XS=WuQVJ5DRlcS;2)ZKQpl} zeaPl35<3qC#F8>69qN#5sCP~--TI8SAr85dDVnT*tO@sE3f=wK%0yl?Ki5i&;tH1- z-YL?Wj9CpgaOP=wzV+-3{CrP?D+L?Fe+X9{+piQGN7 zbsA5su2japI>Xx5o|*KK$!9sWwDBVM4FrGCRJHj48^N8oFZOaS`Y^%fBVC>a#d?V7 z0-2JR2))7wnJ}-T9K$IckpU&aA$!-HsgIdhS@w!{)|b&6bY?N=VMFas3AT&XLJu85 z&QL`UR<&U5P4l+x_Yiv|NWWWrDanUBnMlDj*#`)vx8*h+zZ;9`1Hx0~1NTtLj*ST{+*|v`oZ9krk0%NQ&_IH7stEO5nsA$yDiwWYg*Cn84&;>|=eyq|2U4{bl5M_9!2I zx&EZ-{RF*c8iOKg0oa40ExyTF{5K0ATy(wANu2eT#NwzqHIalaJ0XkZf?G|2CL&f< z60Lz}xOpSbz5MAfjjd}XJF()h&4{oGW=cCPyPq}%7TWH_Zp5))3KnK-yj_A^6xV{m z_1cE6j3#{IR$%LX!v3udFuLp^y5rlB;=5T@>gSU|+t5m(96Nm;w%L7AU`A@IwnQr< zlAv(vXo!kC>U0P;O%SLrGNdV8Z4e9Rl70rO&l#pZO|m?J>o0qBOx!uRgf-j&A-hHP z@06?#?Ik!~9~7za->X*9%n0Jm%ZkDz^WzmA~$cR_Ao;BPSvBx ziNn3EIN6iU-#QG?w9(j~4spjFZ>{VJcDLmn*w+Ift*6oPC%%*9S0ogv!VCpq`(q!{ znY*?0FJ%zlIpgkMyZe@;(4hgwgSsX&`=AriWc<-o-{zo~kG0X9T$$SOo4|219ftoP zMtn>h5~stoD$kMyqYKtnw$9>2(H^7v0>uy=nbk8nb>~6f@Gx!Q_U_JeoIeb4w_{lo zqsA9Z6l}q)&fpBVzw;^cQTOUC|b(qeY341b#L>C|)TY_+fjNZKW5{umX}&C1gG zkBa5Hu4TU_-AKDhUOdaqueR3nEgRbD3PIYoUDg1q6WBE&)}5%VjN2*F*wPtb@|?P8 z+Met_sY#ui&6`I2ie#Kjbo+b2eG-`fgk_x)vQYG1cYw~qVxmL7z_f_{0ry+WbkPqd z6Uc6E*nc!?|`b5Va?=wNksJ0`4Pf1 z=L)}#g|ZOTZpJkz{f=KM+4vr>S%pIuv+_DGoYZZd*SC!{5vZl8WmURSpgLXu8~Z0B zzbc-G%c0G>qRjP9pTB|WjgtN1!~331U?XyrguT=KKCxvn8~I9m>Px$2oj3AVFvMX4(*yJS%bLJed-SK#e&`BPM){tYsh5OF>((-ON|6xDmY7 z#tdFqr>WAx)gAFS6LYaTX2E;UNwTn#sqkY%w{b33y<~6!9JgM}vwx(Z&`scr{v>Dlhx7 zYOT2@!DBn(R(ix%0zjJXf_syZ0cVfA9N{I}Mk+GDk5${Z%f z#$WxFtRE7I{?g+6M==#HNrYnz2>vhh&}o)iWjRski@q5-2t_l6Qbu{GHr@=zx3%5~ zS63d^`4nOF-p46A(`!AOWBd*djMHjc_y(BJsFFoSe)RVOJa%*>Wk-j))hOG~94?r{ z>Dd2zW`M~NP$DJEnDwjP9a8tyTEA${O2w_hjMn&nkJB;^ov@-5X$b>Q0#kV-FjvlB zVGQyi47Iv^Pnf@sKme=Z9~l_O{*GzzSvZ%LGbUQ`l1*ssT{!fv8O3y;e`LY}#KnF= z9ZpXu(40f={XXuqs-sxR;f$q9xOLR&c7$gmEJYONBj`8QM0CG*^p6|X43XC$5-$l# zOvO3NSw_>6GSMwz&gn5C)HBonnKJ~Xi{IlRy1yF1Ae@t|^KBeJ#I@SrWSpArJabdP z#P$KDMjcmv?s2iDXUR1faSW2>o-oD-*)3{|-F72N@N%V?WVt)9b?f@MT!nPp^4|jGu^Z#?X%Y7 z+;6S1S2CV#*6*`D)8mY2UJNNi^5A0G!4q}Y`K zd;I;MQ$r&LQEz+Dv)inC59iZ+3Yn(!rwU5OR_CGh|}7LQpOw^|?Nl;w77f^V2*?mC+bhXq|+; zYM$j0qU$TNg0us4-d`#s{~VTi6Ju-Wa1a$C%b>qr{eq6~+ zd2c#6rm61=7;Et$uvYj5|Dw3<<~!dyOC_778%C1B>UL&h>Ra*Uoj)QRp*!u|0N0H+ zTa~{g>m#FX()4-sM)<5);V^@q^7hIrfi9GnY27PaXosfJ^$=AU8Zczkyo2U6=;3B% zJ%Np%as}4c&ZwsxwrX|%FBFs*y|={PGvk%e7o@1cql!2v( z9`GF~P3`=-sh|X!X&x&Jal6X8$rp+%?cOII#~N8@lb!bjX6{`v zn7qcO1}CP%sHE@NPc|(kyHB}v>sk((RgV{(Emy{j+7#@8OTfIQ<(D{X70b2LgHKrX zda=udU4<)!35wZSw*5DPn^#2ip?keDD}(n?I+BDY z?$ZT^{yGvE5Nj!956`L=H+0TWpIr(|gcd#B78SC8e2kH$AL>dTcE5A>70!SG;^T3s zi~F|X4o~O?sUWMPAN~X5s9l4ej;*_IHh|2c(n#mpn0%XLS%Y>}SOlE=`qCk|W!Q|F zuJbC^lg1gsJnJV*^a6SU;VWGt6W<1=El5bv_Vdh)Uo7p%zKyd6G7fLLA67X=S);Xj ztiwnCE&D))2&X$AKta%Q`4!G0jurLUUHVdM5ZR^IbmKRNf1=tWA|#syV~f_gBMg+# zr5xuOudLmL#(L%*J4HY&O>SuWUQZu0BUitJN(zglMO%jPDjr{@&bP&`r0%mZrR5(2 z43n98!hQ#X*-9=xbUYK_83&926@H~F%XsARY6r1w5kr=3Mip6m0wkkFuO!n4BdksC zLkmOL&)cX9Hx7}}!G5qt2%E%{202~7+N8@5OhjF6VX(b8tO_%ScaFcRb92%2@N62# zcx#F#|CuPbFsvJK6s5{D+`-i&o^!grF=$-@9qkW)qz!?NHox2YXu#*KFp=q>zBKRY zKT^bQPv54y{wCuztdUna`#$+S1Kon^8WT~mCEWL39sY1lS5yGp`c&2AiJec|rCuUa z=07L|cxry$-Poxa=ku>3R28X6W?~b+;M@_iVl*Mi9b;eg&>h>AkqQSr>y`9@B*!@u?G`)Dy@hKs5A8@{_}vSs zngvEU%R-DSIkYBDMre#`3u0V50uqe_uL#eKpNC!4_DS){uN8U2Y>!X8=6w^I+sfoC zM2fveHU&2}dCl9&I_PsNASKBHgN3myuB|UI_KkpbE8P5Oe+zysjEVGNME7is_33VX z!D~?OK+#wM{6n25qf-vUSybkRn<}QfxI?08jD1jpgM%6soGP#ai2;oFTb-$jDfh|} zqDfz=1*wDiC|z8uW#d-Z@&2R;s>T&ZjQ_@tZ*mLetKWO-wYri?J*zdgFEaL3{XxE& z7=0#&QIU|vukZ$?fGu#ZG5EA-UhX8-)LaN*6P4n(iOzaLV|mRSdwYRx^I6vbLV*3*^^U z#`i~JqM7s82aIp1IpBW&Hz96kY{2+=zkxUQQ*P#P4yFE>hBmCoM8nT%fiu|ClcTGX zsiV)cE!XCT$la?J2#qH;j0P~X=q6GP@^IDj9GP@!Wdsi&zsr)Sr}#N!oCdvRT~aU( zkgT-XTmp>FdDoj?8|ZS)s;eIIkLVo_sUB-43JZi{DbSIf3${VPCXF=^7Ywc5 z>sL7&NsRl?@Jy*b%xNJ;TP2XusZGuc(@p$}d4(1E^WUZ7K%2IS7zxK?42ZEww(># zb<5z`NNSco3ccNtB-1_^q~Z)lZlz-^vWTFtrlg_ zWO#wse?iF;)g?Z2%@7HUfX^x)4~;ig*9MNKwdC@iH4kIvo{Nbv-uldx)5-+3j`r4z zLkDe`SR+l-W?91J__XW?lrrKXABTB_Hnoe^BJ2>d8?(>WeMK=fWYfOm*3E zhQojfzBqXQ8SsLrd=VeExFgUpa$ec)Ktsj`T`Xo|Bo~2USE&>UVpR&Hv*E{1d2d^%*p^KqxW8)Rr}4jB-5S^e~_*I z=|L=;I3s1*=Iz7GD(Tq* zf5<)0?CeBwEWk-_PM-GMYKOWt$zXv?8?BpLZ`P=}YsH)wdw8pUU55M!4$+!4Nvv~V(= zLrqo3^_5_&djNgAnkIq10Z&9P^O-VB#&jC2tvQZDqq=};$*J3)&l{J zuAyhjVa4}snyrjlC_@^4ra{*t=UT$;HmOG(56^x7{5N*V_2}yqEjzM95oS9>~T0b>|-8i=Ey$)9!BZjp*UyMUk4&WF|s@1R~GL|Knch zAA<{U;GAUd=UU=$uRCm$ONJ^aKff>1muV$PeaXUZntMHX*f+ zG@3GxUgee8`#8hEPH#o4SBm zS^+c%4SQ_nPxX3huxE~IFL0jIW(@NpN1G3(>8+|VKJ*0b)=;quS?gZ7uqVRgc#ah= zh84hcq|Bp!HSy9-_up0Aq99O7YFqlt{l+&;cbRrnm;GY<`NTV@NR)Ld#^=;nHQckgv@&#u9dwGw*;aaPeStD(J+` zccm@T>Xd#^KK5KupPX*5D7iW8-@bc(mB@b9{{Jz753WXZx;mr-U3Y2R2oj0Ap8jj( z-oM*=fyLLY|3dPeINE^WMeH_tu-q467Y(l)Z_FdkN0Aq?&~YFX5p$M#I*V9c?st)8 zv(bD~X-u;~EJq&5*B1(%AakW908dga{53|dMiC!@S84e4I zH6a%R$l>!YS^&5Fz;GybG@S1LV(q=d;e6M&(IFBf!RQiYv=F_8sG}QQ^lqX>jT!_q zdh{AST9icZy{G6zjUW*bj9y0_2H%tQeeYiD{oeK4YwdlkKh5F5al4=AI#}^pC2lK+;wz44=)7n#=&q|!@MQelgE`dWa|~~`WFe>C5Vv(7*7`?F~VegOiah) z>Zz9is@f=Rh_CE0JU?*PRBzq3Ua{Pa%Y$9cv80QRe!AdF)ApLPj@uYPWw)T!O+Lfy zm@F9H_=jq2o7DFE+Hnz`(>9EnZHebYs&e8S7u+CXs z5)Yey(>(A0*J;TWeQo#Iq;D&PUY@((SUfp+oBBFZ%Ze2tNy8FQIU&~Agt4-3*1CJ2 zW3x2v5qvwfG13}vZ?sw|&2#+CP9-m`7}&dPNbKoR5=Hts7jbsLq1hUHrmuUPQY=pT z`a(_8=zI&6sP%kwqy#FS>|w=~HTvY(sas_8tuV~CAly;G`mXe?NVJ=yvUxAF#d0WX z1i)X)PU=LDujm*y8tWEU+#5Ed)}{k85Tt$2_s{#yF6VS1t34AyOgG%l3Q`C~?pu${ z6;@$m1xMwGg|n7^bNj*KwzWf(t^mfbFG;t$=aMhG2cP|Ohs;+H1s9x#e=ec=H>|1u zi6a>Z4=i`Q_2cpJ?hk65#l@H75Ar>iENP#oywD>1?vQ}|a&NGgUAmPfU{!L`lD@A*=L!D_L_G)`9~jgpX(+tl;t13Dla6RO(oT(V$Btf8+z}@bb?xQqkH{wHP)m& z98L3}2iR+k0S_NvQLD#;Xcoi7+0SEdJRc@pi6^Z79zqWJiL?9D2sczq#ck%@Scah0 zC*RmDE*c%dcB-+*Y9npG5@%X#U+z z%YQqce+Fm%d;=(W0hl-})dJ5e6KI~;P%<(RJe%+H3Gmf`h4lw;TqVmSAQ?P_3w*6A zNdeDYh7$^{pLJ9Ly-9#=8gbsJBCk>`!^shE?Abw5gaDs^iF6z94rv5O#91Ai`&UIs zcr7mkJM@uHS1O0FdsI1obBVnvwtwa$#kghRmwe_&Jw{UszCet3)#sjulTYF_7k(7g z)J#hLD}pmILWYu_>MWNTcMKY-eb1jp>Pj|d3Za!#V6jWUe)i2*rd<4~?4*~++JQT| z?G*Rws%hd@rt%v7oD#$V$`HlpfrSAuNaPg2)^e17}|BmdtzrvGt#OiH&8e&It9 ziGZW68t5T6LDIOqWgD`ZVkAFm@{Q4|eO6H~b91bvrdcaw*o0(fxiH?bJlt_hy{EKz zlPoleg+<9=bXdGhgWjQQ$Y^!aLp$pw1NQzw@~{bz6*STt*1Bn*kc2!bDLmw;KI--M zXR%j}3(0sR*x�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

    0?2rd)HYCzabc>AQC9A4dKEtJD7=sarD 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�W>nCnR`5GfzDub zli8&_5|B^igm5i$uFV4uaMCy)ISb0xbk~FlFF7-UT3U5X#w8%Dc}@0x*y17�KZ$ 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

    klLz5Hx-SedS1bRWR^dra{vq6$26{U@QMY$@~I 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 Ihs)Lf0SyF$H~;_u literal 0 HcmV?d00001 From e06e341468202eebd928dee6a222ea118ef06331 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 28 Feb 2022 07:14:55 -0800 Subject: [PATCH 0102/1221] fix: explicitly set root as current directory to fix ignore files --- .github/workflows/deploy.yaml | 3 ++- .hugo_build.lock | 0 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 .hugo_build.lock diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 933261f9..8d4b137c 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -17,6 +17,7 @@ jobs: index: true input: content output: static + root: . - name: Setup Hugo uses: peaceiris/actions-hugo@v2 @@ -33,4 +34,4 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./public publish_branch: master # deploying branch - cname: quartz.jzhao.xyz \ No newline at end of file + cname: quartz.jzhao.xyz diff --git a/.hugo_build.lock b/.hugo_build.lock new file mode 100644 index 00000000..e69de29b From 0ee0855e1c1843a86a7bcd58aee520784c165dba Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 28 Feb 2022 07:30:59 -0800 Subject: [PATCH 0103/1221] bump hugo-obsidian to support root --- .github/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 8d4b137c..a492b9b0 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Build Link Index - uses: jackyzha0/hugo-obsidian@v2.8 + uses: jackyzha0/hugo-obsidian@v2.9 with: index: true input: content From 5234fae080f1d3dca4f105438e3e0151f12ca61c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 28 Feb 2022 08:24:29 -0800 Subject: [PATCH 0104/1221] fix backlinks not using baseurl --- layouts/partials/backlinks.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/backlinks.html b/layouts/partials/backlinks.html index 746ebbbc..d2143869 100644 --- a/layouts/partials/backlinks.html +++ b/layouts/partials/backlinks.html @@ -10,7 +10,7 @@

    Backlinks

    {{$cleanedInbound := apply (apply $inbound "index" "." "source") "replace" "." " " "-"}} {{- range $cleanedInbound | uniq -}}
    {{- end -}} {{else}} From 1313bd9779c638f09b8901f8432d6bc39910bce3 Mon Sep 17 00:00:00 2001 From: Claudio Yanes Date: Fri, 4 Mar 2022 02:07:51 +0000 Subject: [PATCH 0105/1221] Move css and js to appropriate files Having the CSS and JS in the html template produces pages larger than necessary, as each page need to contain all the js/css. Separating them in appropriate files allow the browser to just download them once and use them for all the pages. This is even more effective with an aggressive cache policy for the js and css, something that can be done without fear thanks to the implemented cache-busting. Also, having then in separate files allows us to use Hugo pipelines for minimizing the code. --- assets/{ => js}/darkmode.js | 0 assets/js/graph.js | 221 ++++++++++++++++++++++++++ assets/js/popover.js | 34 ++++ assets/js/search.js | 247 +++++++++++++++++++++++++++++ assets/{ => styles}/base.scss | 0 assets/{ => styles}/custom.scss | 0 assets/{ => styles}/darkmode.scss | 0 assets/{ => styles}/syntax.scss | 0 layouts/partials/graph.html | 238 ++-------------------------- layouts/partials/head.html | 23 ++- layouts/partials/popover.html | 34 +--- layouts/partials/search.html | 254 +----------------------------- 12 files changed, 529 insertions(+), 522 deletions(-) rename assets/{ => js}/darkmode.js (100%) create mode 100644 assets/js/graph.js create mode 100644 assets/js/popover.js create mode 100644 assets/js/search.js rename assets/{ => styles}/base.scss (100%) rename assets/{ => styles}/custom.scss (100%) rename assets/{ => styles}/darkmode.scss (100%) rename assets/{ => styles}/syntax.scss (100%) diff --git a/assets/darkmode.js b/assets/js/darkmode.js similarity index 100% rename from assets/darkmode.js rename to assets/js/darkmode.js diff --git a/assets/js/graph.js b/assets/js/graph.js new file mode 100644 index 00000000..f4fd4bb6 --- /dev/null +++ b/assets/js/graph.js @@ -0,0 +1,221 @@ +async function drawGraph(url, baseUrl, pathColors, depth, enableDrag, enableLegend, enableZoom) { + const { index, links, content } = await fetchData() + const curPage = url.replace(baseUrl, "") + + const parseIdsFromLinks = (links) => [...(new Set(links.flatMap(link => ([link.source, link.target]))))] + + const neighbours = new Set() + const wl = [curPage || "/", "__SENTINEL"] + if (depth >= 0) { + while (depth >= 0 && wl.length > 0) { + // compute neighbours + const cur = wl.shift() + if (cur === "__SENTINEL") { + depth-- + wl.push("__SENTINEL") + } else { + neighbours.add(cur) + const outgoing = index.links[cur] || [] + const incoming = index.backlinks[cur] || [] + wl.push(...outgoing.map(l => l.target), ...incoming.map(l => l.source)) + } + } + } else { + parseIdsFromLinks(links).forEach(id => neighbours.add(id)) + } + + const data = { + nodes: [...neighbours].map(id => ({id})), + links: links.filter(l => neighbours.has(l.source) && neighbours.has(l.target)), + } + + const color = (d) => { + if (d.id === curPage || (d.id === "/" && curPage === "")) { + return "var(--g-node-active)" + } + + for (const pathColor of pathColors) { + const path = Object.keys(pathColor)[0] + const colour = pathColor[path] + if (d.id.startsWith(path)) { + return colour + } + } + + return "var(--g-node)" + } + + const drag = simulation => { + function dragstarted(event, d) { + if (!event.active) simulation.alphaTarget(1).restart(); + d.fx = d.x; + d.fy = d.y; + } + + function dragged(event,d) { + d.fx = event.x; + d.fy = event.y; + } + + function dragended(event,d) { + if (!event.active) simulation.alphaTarget(0); + d.fx = null; + d.fy = null; + } + + const noop = () => {} + return d3.drag() + .on("start", enableDrag ? dragstarted : noop) + .on("drag", enableDrag ? dragged : noop) + .on("end", enableDrag ? dragended : noop); + } + + const height = 250 + const width = document.getElementById("graph-container").offsetWidth + + const simulation = d3.forceSimulation(data.nodes) + .force("charge", d3.forceManyBody().strength(-30)) + .force("link", d3.forceLink(data.links).id(d => d.id)) + .force("center", d3.forceCenter()); + + const svg = d3.select('#graph-container') + .append('svg') + .attr('width', width) + .attr('height', height) + .attr("viewBox", [-width / 2, -height / 2, width, height]); + + if (enableLegend) { + const legend = [ + {"Current": "var(--g-node-active)"}, + {"Note": "var(--g-node)"}, + ...pathColors + ] + legend.forEach((legendEntry, i) => { + const key = Object.keys(legendEntry)[0] + const colour = legendEntry[key] + svg.append("circle").attr("cx", -width/2 + 20).attr("cy", height/2 - 30 * (i+1)).attr("r", 6).style("fill", colour) + svg.append("text").attr("x", -width/2 + 40).attr("y", height/2 - 30 * (i+1)).text(key).style("font-size", "15px").attr("alignment-baseline","middle") + }) + } + + // draw links between nodes + const link = svg.append("g") + .selectAll("line") + .data(data.links) + .join("line") + .attr("class", "link") + .attr("stroke", "var(--g-link)") + .attr("stroke-width", 2) + .attr("data-source", d => d.source.id) + .attr("data-target", d => d.target.id) + + // svg groups + const graphNode = svg.append("g") + .selectAll("g") + .data(data.nodes) + .enter().append("g") + + // draw individual nodes + const node = graphNode.append("circle") + .attr("class", "node") + .attr("id", (d) => d.id) + .attr("r", (d) => { + const numOut = index.links[d.id]?.length || 0 + const numIn = index.backlinks[d.id]?.length || 0 + return 3 + (numOut + numIn) / 4 + }) + .attr("fill", color) + .style("cursor", "pointer") + .on("click", (_, d) => { + window.location.href = baseUrl + '/' + decodeURI(d.id).replace(/\s+/g, '-') + }) + .on("mouseover", function (_, d) { + d3.selectAll(".node") + .transition() + .duration(100) + .attr("fill", "var(--g-node-inactive)") + + const neighbours = parseIdsFromLinks([...(index.links[d.id] || []), ...(index.backlinks[d.id] || [])]) + const neighbourNodes = d3.selectAll(".node").filter(d => neighbours.includes(d.id)) + const currentId = d.id + const linkNodes = d3.selectAll(".link").filter(d => d.source.id === currentId || d.target.id === currentId) + + // highlight neighbour nodes + neighbourNodes + .transition() + .duration(200) + .attr("fill", color) + + // highlight links + linkNodes + .transition() + .duration(200) + .attr("stroke", "var(--g-link-active)") + + // show text for self + d3.select(this.parentNode) + .select("text") + .raise() + .transition() + .duration(200) + .style("opacity", 1) + }).on("mouseleave", function (_,d) { + d3.selectAll(".node") + .transition() + .duration(200) + .attr("fill", color) + + const currentId = d.id + const linkNodes = d3.selectAll(".link").filter(d => d.source.id === currentId || d.target.id === currentId) + + linkNodes + .transition() + .duration(200) + .attr("stroke", "var(--g-link)") + + d3.select(this.parentNode) + .select("text") + .transition() + .duration(200) + .style("opacity", 0) + }) + .call(drag(simulation)); + + // draw labels + const labels = graphNode.append("text") + .attr("dx", 12) + .attr("dy", ".35em") + .text((d) => content[decodeURI(d.id).replace(/\s+/g, '-')]?.title || "Untitled") + .style("opacity", 0) + .style("pointer-events", "none") + .call(drag(simulation)); + + // set panning + + if (enableZoom) { + svg.call(d3.zoom() + .extent([[0, 0], [width, height]]) + .scaleExtent([0.25, 4]) + .on("zoom", ({transform}) => { + link.attr("transform", transform); + node.attr("transform", transform); + labels.attr("transform", transform); + })); + } + + // progress the simulation + simulation.on("tick", () => { + link + .attr("x1", d => d.source.x) + .attr("y1", d => d.source.y) + .attr("x2", d => d.target.x) + .attr("y2", d => d.target.y) + node + .attr("cx", d => d.x) + .attr("cy", d => d.y) + labels + .attr("x", d => d.x) + .attr("y", d => d.y) + }); + } + \ No newline at end of file diff --git a/assets/js/popover.js b/assets/js/popover.js new file mode 100644 index 00000000..ef7bb615 --- /dev/null +++ b/assets/js/popover.js @@ -0,0 +1,34 @@ +function htmlToElement(html) { + const template = document.createElement('template') + html = html.trim() + template.innerHTML = html + return template.content.firstChild +} + +function initPopover(base) { + const baseUrl = base.replace(window.location.origin, "") // is this useless? + document.addEventListener("DOMContentLoaded", () => { + fetchData().then(({content}) => { + const links = [...document.getElementsByClassName("internal-link")] + links.forEach(li => { + const linkDest = content[li.dataset.src.replace(baseUrl, "")] + // const linkDest = content[li.dataset.src] + if (linkDest) { + const popoverElement = `
    +

    ${linkDest.title}

    +

    ${removeMarkdown(linkDest.content).split(" ", 20).join(" ")}...

    +

    ${new Date(linkDest.lastmodified).toLocaleDateString()}

    +
    ` + const el = htmlToElement(popoverElement) + li.appendChild(el) + li.addEventListener("mouseover", () => { + el.classList.add("visible") + }) + li.addEventListener("mouseout", () => { + el.classList.remove("visible") + }) + } + }) + }) + }) +} diff --git a/assets/js/search.js b/assets/js/search.js new file mode 100644 index 00000000..9733c048 --- /dev/null +++ b/assets/js/search.js @@ -0,0 +1,247 @@ +// code from https://github.com/danestves/markdown-to-text +const removeMarkdown = ( + markdown, + options = { + listUnicodeChar: false, + stripListLeaders: true, + gfm: true, + useImgAltText: false, + preserveLinks: false, + } +) => { + let output = markdown || ""; + output = output.replace(/^(-\s*?|\*\s*?|_\s*?){3,}\s*$/gm, ""); + + try { + if (options.stripListLeaders) { + if (options.listUnicodeChar) + output = output.replace( + /^([\s\t]*)([\*\-\+]|\d+\.)\s+/gm, + options.listUnicodeChar + " $1" + ); + else output = output.replace(/^([\s\t]*)([\*\-\+]|\d+\.)\s+/gm, "$1"); + } + if (options.gfm) { + output = output + .replace(/\n={2,}/g, "\n") + .replace(/~{3}.*\n/g, "") + .replace(/~~/g, "") + .replace(/`{3}.*\n/g, ""); + } + if (options.preserveLinks) { + output = output.replace(/\[(.*?)\][\[\(](.*?)[\]\)]/g, "$1 ($2)") + } + output = output + .replace(/<[^>]*>/g, "") + .replace(/^[=\-]{2,}\s*$/g, "") + .replace(/\[\^.+?\](\: .*?$)?/g, "") + .replace(/\s{0,2}\[.*?\]: .*?$/g, "") + .replace(/\!\[(.*?)\][\[\(].*?[\]\)]/g, options.useImgAltText ? "$1" : "") + .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, "$1") + .replace(/^\s{0,3}>\s?/g, "") + .replace(/(^|\n)\s{0,3}>\s?/g, "\n\n") + .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, "") + .replace( + /^(\n)?\s{0,}#{1,6}\s+| {0,}(\n)?\s{0,}#{0,} {0,}(\n)?\s{0,}$/gm, + "$1$2$3" + ) + .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, "$2") + .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, "$2") + .replace(/(`{3,})(.*?)\1/gm, "$2") + .replace(/`(.+?)`/g, "$1") + .replace(/\n{2,}/g, "\n\n"); + } catch (e) { + console.error(e); + return markdown; + } + return output; +}; +// ----- + +(async function() { + const contentIndex = new FlexSearch.Document({ + cache: true, + charset: "latin:extra", + optimize: true, + worker: true, + document: { + index: [{ + field: "content", + tokenize: "strict", + context: { + resolution: 5, + depth: 3, + bidirectional: true + }, + suggest: true, + }, { + field: "title", + tokenize: "forward", + }] + } + }) + + const { content } = await fetchData() + for (const [key, value] of Object.entries(content)) { + contentIndex.add({ + id: key, + title: value.title, + content: removeMarkdown(value.content), + }) + } + + const highlight = (content, term) => { + const highlightWindow = 20 + const tokenizedTerm = term.split(/\s+/).filter(t => t !== "") + const splitText = content.split(/\s+/).filter(t => t !== "") + const includesCheck = (token) => tokenizedTerm.some(term => token.toLowerCase().startsWith(term.toLowerCase())) + + const occurrencesIndices = splitText + .map(includesCheck) + + // calculate best index + let bestSum = 0 + let bestIndex = 0 + for (let i = 0; i < Math.max(occurrencesIndices.length - highlightWindow, 0); i++) { + const window = occurrencesIndices.slice(i, i + highlightWindow) + const windowSum = window.reduce((total, cur) => total + cur, 0) + if (windowSum >= bestSum) { + bestSum = windowSum + bestIndex = i + } + } + + const startIndex = Math.max(bestIndex - highlightWindow, 0) + const endIndex = Math.min(startIndex + 2 * highlightWindow, splitText.length) + const mappedText = splitText + .slice(startIndex, endIndex) + .map(token => { + if (includesCheck(token)) { + return `${token}` + } + return token + }) + .join(" ") + .replaceAll(' ', " ") + return `${startIndex === 0 ? "" : "..."}${mappedText}${endIndex === splitText.length ? "" : "..."}` + } + + const resultToHTML = ({url, title, content, term}) => { + const text = removeMarkdown(content) + const resultTitle = highlight(title, term) + const resultText = highlight(text, term) + return `` + } + + const redir = (id, term) => { + window.location.href = BASE_URL + `${id}#:~:text=${encodeURIComponent(term)}` + } + + const formatForDisplay = id => ({ + id, + url: id, + title: content[id].title, + content: content[id].content + }) + + const source = document.getElementById('search-bar') + const results = document.getElementById("results-container") + let term + source.addEventListener("keyup", (e) => { + if (e.key === "Enter") { + const anchor = document.getElementsByClassName("result-card")[0] + redir(anchor.id, term) + } + }) + source.addEventListener('input', (e) => { + term = e.target.value + contentIndex.search(term, [ + { + field: "content", + limit: 10, + suggest: true, + }, + { + field: "title", + limit: 5, + } + ]).then(searchResults => { + const getByField = field => { + const results = searchResults.filter(x => x.field === field) + if (results.length === 0) { + return [] + } else { + return [...results[0].result] + } + } + const allIds = new Set([...getByField('title'), ...getByField('content')]) + const finalResults = [...allIds].map(formatForDisplay) + + // display + if (finalResults.length === 0) { + results.innerHTML = `` + } else { + results.innerHTML = finalResults + .map(result => resultToHTML({ + ...result, + term, + })) + .join("\n") + const anchors = document.getElementsByClassName("result-card"); + [...anchors].forEach(anchor => { + anchor.onclick = () => redir(anchor.id, term) + }) + } + }) + }) + + + const searchContainer = document.getElementById("search-container") + + function openSearch() { + if (searchContainer.style.display === "none" || searchContainer.style.display === "") { + source.value = "" + results.innerHTML = "" + searchContainer.style.display = "block" + source.focus() + } else { + searchContainer.style.display = "none" + } + } + + function closeSearch() { + searchContainer.style.display = "none" + } + + document.addEventListener('keydown', (event) => { + if (event.key === "/") { + event.preventDefault() + openSearch() + } + if (event.key === "Escape") { + event.preventDefault() + closeSearch() + } + }) + + const searchButton = document.getElementById("search-icon") + searchButton.addEventListener('click', (evt) => { + openSearch() + }) + searchButton.addEventListener('keydown', (evt) => { + openSearch() + }) + searchContainer.addEventListener('click', (evt) => { + closeSearch() + }) + document.getElementById("search-space").addEventListener('click', (evt) => { + evt.stopPropagation() + }) +})() + diff --git a/assets/base.scss b/assets/styles/base.scss similarity index 100% rename from assets/base.scss rename to assets/styles/base.scss diff --git a/assets/custom.scss b/assets/styles/custom.scss similarity index 100% rename from assets/custom.scss rename to assets/styles/custom.scss diff --git a/assets/darkmode.scss b/assets/styles/darkmode.scss similarity index 100% rename from assets/darkmode.scss rename to assets/styles/darkmode.scss diff --git a/assets/syntax.scss b/assets/styles/syntax.scss similarity index 100% rename from assets/syntax.scss rename to assets/styles/syntax.scss diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index 14e1fdbe..31d008cd 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -10,232 +10,16 @@

    Interactive Graph

    --g-link-active: #5a7282; } +{{ $js := resources.Get "js/graph.js" | resources.Fingerprint "md5" }} + diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 1afa3c64..107f2403 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -8,24 +8,21 @@ - {{$css := slice "base.scss" "darkmode.scss" "syntax.scss" "custom.scss"}} - {{range $css}} - {{$sass := resources.Get . | resources.ToCSS }} - {{with $sass | minify}} - - {{end}} + {{$sass := resources.Match "styles/[!_]*.scss" }} + {{$css := slice }} + {{range $sass}} + {{$scss := . | resources.ToCSS (dict "outputStyle" "compressed") }} + {{$css = $css | append $scss}} {{end}} + {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | resources.Minify }} + - {{- with resources.Get "darkmode.js" | minify -}} - - {{- end -}} + {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | resources.Minify }} + {{end}} \ No newline at end of file diff --git a/layouts/partials/search.html b/layouts/partials/search.html index 6cc7e24f..7bc7ed0c 100644 --- a/layouts/partials/search.html +++ b/layouts/partials/search.html @@ -5,254 +5,6 @@
  • - {{index (index $contentTable .) "title"}} + {{index (index $contentTable .) "title"}}
  • - - - + +{{ $js := resources.Get "js/search.js" | resources.Fingerprint "md5" | resources.Minify }} + From 7e0f2e44497adeade4aa5a99da897be29cb49016 Mon Sep 17 00:00:00 2001 From: Claudio Yanes Date: Fri, 4 Mar 2022 02:25:30 +0000 Subject: [PATCH 0106/1221] Fix fetchData The fetchData function suffer from a race condition. If the function is called before the promise finishes, it will result in another pair of HTTP request. This does not only make the function useless but Actually, it makes it harmful as the data might be redownloaded twice. Now fetchData is not a function but rather the promise by itself. Previous callers are expected to await the variable instead, this should be not concern as awaiting a promise multiple time in JavaScript is completely safe. --- .github/workflows/deploy.yaml | 2 +- .gitignore | 4 ++-- assets/js/graph.js | 2 +- assets/js/popover.js | 2 +- assets/js/search.js | 2 +- layouts/partials/backlinks.html | 4 ++-- layouts/partials/head.html | 26 ++++++++------------------ 7 files changed, 16 insertions(+), 26 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index a492b9b0..656ef4a7 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -16,7 +16,7 @@ jobs: with: index: true input: content - output: static + output: assets/indices root: . - name: Setup Hugo diff --git a/.gitignore b/.gitignore index 54ae7a3f..a7ccdb59 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ public resources .idea content/.obsidian -static/linkIndex.json -static/contentIndex.json \ No newline at end of file +assets/indices/linkIndex.json +assets/indices/contentIndex.json diff --git a/assets/js/graph.js b/assets/js/graph.js index f4fd4bb6..d7e85343 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -1,5 +1,5 @@ async function drawGraph(url, baseUrl, pathColors, depth, enableDrag, enableLegend, enableZoom) { - const { index, links, content } = await fetchData() + const { index, links, content } = await fetchData const curPage = url.replace(baseUrl, "") const parseIdsFromLinks = (links) => [...(new Set(links.flatMap(link => ([link.source, link.target]))))] diff --git a/assets/js/popover.js b/assets/js/popover.js index ef7bb615..6dfd2d2d 100644 --- a/assets/js/popover.js +++ b/assets/js/popover.js @@ -8,7 +8,7 @@ function htmlToElement(html) { function initPopover(base) { const baseUrl = base.replace(window.location.origin, "") // is this useless? document.addEventListener("DOMContentLoaded", () => { - fetchData().then(({content}) => { + fetchData.then(({content}) => { const links = [...document.getElementsByClassName("internal-link")] links.forEach(li => { const linkDest = content[li.dataset.src.replace(baseUrl, "")] diff --git a/assets/js/search.js b/assets/js/search.js index 9733c048..592d8595 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -81,7 +81,7 @@ const removeMarkdown = ( } }) - const { content } = await fetchData() + const { content } = await fetchData for (const [key, value] of Object.entries(content)) { contentIndex.add({ id: key, diff --git a/layouts/partials/backlinks.html b/layouts/partials/backlinks.html index d2143869..166e1fde 100644 --- a/layouts/partials/backlinks.html +++ b/layouts/partials/backlinks.html @@ -3,9 +3,9 @@

    Backlinks

    {{$url := urls.Parse .Site.BaseURL }} {{$host := strings.TrimRight "/" $url.Path }} {{$curPage := strings.TrimPrefix $host (strings.TrimRight "/" .Page.RelPermalink) }} - {{$linkIndex := getJSON "/static/linkIndex.json"}} + {{$linkIndex := getJSON "/assets/indices/linkIndex.json"}} {{$inbound := index $linkIndex.index.backlinks $curPage}} - {{$contentTable := getJSON "/static/contentIndex.json"}} + {{$contentTable := getJSON "/assets/indices/contentIndex.json"}} {{if $inbound}} {{$cleanedInbound := apply (apply $inbound "index" "." "source") "replace" "." " " "-"}} {{- range $cleanedInbound | uniq -}} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 107f2403..4085dd52 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -21,35 +21,25 @@ + {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint "md5" | resources.Minify | }} + {{$contentIndex := resources.Get "indices/contentIndex.json" | resources.Fingerprint "md5" | resources.Minify }} {{ template "_internal/google_analytics.html" . }} From 7f6523337c96e631e80b18c888b2f237ea8a4482 Mon Sep 17 00:00:00 2001 From: Claudio Yanes Date: Fri, 4 Mar 2022 03:24:32 +0000 Subject: [PATCH 0107/1221] Move popover to the end of the page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The popover script doesn’t ever start in until the DOM has finished Loading, so wait for the script to be downloaded and parsed before Showing the content to the user makes no sense. --- layouts/_default/section.html | 1 + layouts/_default/single.html | 1 + layouts/_default/taxonomy.html | 1 + layouts/_default/term.html | 1 + layouts/index.html | 1 + layouts/partials/head.html | 1 - 6 files changed, 5 insertions(+), 1 deletion(-) diff --git a/layouts/_default/section.html b/layouts/_default/section.html index abdf0b05..1a4aae05 100644 --- a/layouts/_default/section.html +++ b/layouts/_default/section.html @@ -19,6 +19,7 @@

    All {{.Title}}

    {{partial "contact.html" .}} +{{partial "popover.html" .}} diff --git a/layouts/_default/single.html b/layouts/_default/single.html index ac8c216d..06892bdd 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -32,6 +32,7 @@

    Table of Contents

    {{partial "footer.html" .}} + {{partial "popover.html" .}} diff --git a/layouts/_default/taxonomy.html b/layouts/_default/taxonomy.html index e0a1e876..b7a45b10 100644 --- a/layouts/_default/taxonomy.html +++ b/layouts/_default/taxonomy.html @@ -28,6 +28,7 @@

    {{ .Page.Title }}

    {{partial "contact.html" .}} +{{partial "popover.html" .}} diff --git a/layouts/_default/term.html b/layouts/_default/term.html index 58f024bc..16ea85cf 100644 --- a/layouts/_default/term.html +++ b/layouts/_default/term.html @@ -19,6 +19,7 @@

    Tag: {{.Title | humanize}}

    {{partial "contact.html" .}} +{{partial "popover.html" .}} diff --git a/layouts/index.html b/layouts/index.html index 17b69173..f0cd68e7 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -22,6 +22,7 @@

    Table of Contents

    {{- .Content -}} {{partial "footer.html" .}} + {{partial "popover.html" .}} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 4085dd52..80893010 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -43,4 +43,3 @@ {{ template "_internal/google_analytics.html" . }} -{{ partial "popover.html" .}} From 8779e72c77c2e454d444b86d3d5ebda9bfab46d7 Mon Sep 17 00:00:00 2001 From: Claudio Yanes Date: Fri, 4 Mar 2022 03:34:45 +0000 Subject: [PATCH 0108/1221] Add attribute property to scripts from jsdelivr Adding the integrity attribute protects the website (by refusing to load the script) against malicious modifications of the script in the case of jsdelivr gets hacked --- layouts/partials/graph.html | 2 +- layouts/partials/search.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index 31d008cd..ca379689 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -1,4 +1,4 @@ - +

    Interactive Graph

    {{ $js := resources.Get "js/graph.js" | resources.Fingerprint "md5" }} - diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 195cade4..772153ad 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -1,46 +1,87 @@ - - - - {{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ end }} - - + + + + + {{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ + end }} + + + - - - {{$sass := resources.Match "styles/[!_]*.scss" }} - {{$css := slice }} - {{range $sass}} - {{$scss := . | resources.ToCSS (dict "outputStyle" "compressed") }} - {{$css = $css | append $scss}} - {{end}} - {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | resources.Minify }} - + + + {{$sass := resources.Match "styles/[!_]*.scss" }} {{$css := slice }} {{range + $sass}} {{$scss := . | resources.ToCSS (dict "outputStyle" "compressed") }} + {{$css = $css | append $scss}} {{end}} {{$finalCss := $css | resources.Concat + "styles.css" | resources.Fingerprint "md5" | resources.Minify }} + - {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | resources.Minify }} - - {{partial "katex.html" .}} + {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | + resources.Minify }} + + {{partial "katex.html" .}} - - {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint "md5" | resources.Minify | }} - {{$contentIndex := resources.Get "indices/contentIndex.json" | resources.Fingerprint "md5" | resources.Minify }} - + + {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint + "md5" | resources.Minify | }} {{$contentIndex := resources.Get + "indices/contentIndex.json" | resources.Fingerprint "md5" | resources.Minify + }} + + {{ template "_internal/google_analytics.html" . }} From a9523dd39bf931e491750bb832dd13678e0e0c0d Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Sun, 1 May 2022 22:08:14 -0700 Subject: [PATCH 0168/1221] Add prettier config --- .prettierrc | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..f1bc35a4 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 100, + "quoteProps": "as-needed", + "trailingComma": "all", + "tabWidth": 2 +} From 87144fca212b25093adbf743014d5c0d5b1d9c0d Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Mon, 2 May 2022 08:57:25 -0700 Subject: [PATCH 0169/1221] Use semi: false for prettier config --- .prettierrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierrc b/.prettierrc index f1bc35a4..5788b66f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,5 +2,6 @@ "printWidth": 100, "quoteProps": "as-needed", "trailingComma": "all", - "tabWidth": 2 + "tabWidth": 2, + "semi": false } From 5c602ab16f1f5e46bee5f44cec15860f785039ee Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Mon, 2 May 2022 09:04:36 -0700 Subject: [PATCH 0170/1221] Add clarification comments --- assets/js/graph.js | 6 +++--- assets/js/search.js | 1 + layouts/partials/head.html | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index 939fd99d..99ecf54e 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -16,9 +16,8 @@ async function drawGraph( ...new Set(links.flatMap((link) => [link.source, link.target])), ]; - // links is mutated by d3 - // we want to use links later on, so we make a copy and pass - // that one to d3 + // Links is mutated by d3. We want to use links later on, so we make a copy and pass that one to d3 + // Note: shallow cloning does not work because it copies over references from the original array const copyLinks = JSON.parse(JSON.stringify(links)); const neighbours = new Set(); @@ -176,6 +175,7 @@ async function drawGraph( .attr('fill', color) .style('cursor', 'pointer') .on('click', (_, d) => { + // SPA navigation window.navigate( new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, '-')}/`), '.singlePage' diff --git a/assets/js/search.js b/assets/js/search.js index 212b2c73..fcf79177 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -145,6 +145,7 @@ const removeMarkdown = ( }; const redir = (id, term) => { + // SPA navigation window.navigate( new URL( `${BASE_URL.slice(0, -1)}${id}#:~:text=${encodeURIComponent(term)}/` diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 772153ad..ea67a001 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -57,9 +57,12 @@ + diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 1dabaf66..37938a55 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -58,6 +58,7 @@ content, })) + {{if $.Site.Data.config.enableSPA}} + {{else}} + + {{end}} {{ template "_internal/google_analytics.html" . }} From 6e6dd4cb0b396ae7ec4f273bccd254bc0f9885d5 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 3 May 2022 10:57:20 -0400 Subject: [PATCH 0178/1221] fix: trim trailing slash when calculating popover --- assets/js/popover.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/popover.js b/assets/js/popover.js index a4b6852e..ee0477ef 100644 --- a/assets/js/popover.js +++ b/assets/js/popover.js @@ -13,7 +13,7 @@ function initPopover(baseURL) { links .filter(li => li.dataset.src) .forEach(li => { - const linkDest = content[li.dataset.src.replace(basePath, "")] + const linkDest = content[li.dataset.src.replace(/\/$/g, "").replace(basePath, "")] if (linkDest) { const popoverElement = `

    ${linkDest.title}

    From 77485b754dbb3d08e437b4157f3eafb5871624b9 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 08:47:42 -0700 Subject: [PATCH 0179/1221] Fix popover --- assets/js/popover.js | 40 +++++++++++++-------------- assets/js/router.js | 25 +++++++++++++++++ layouts/_default/section.html | 1 - layouts/_default/single.html | 3 +-- layouts/_default/taxonomy.html | 1 - layouts/_default/term.html | 1 - layouts/index.html | 4 +-- layouts/partials/head.html | 49 +++++++++++++++------------------- layouts/partials/popover.html | 7 ----- 9 files changed, 67 insertions(+), 64 deletions(-) create mode 100644 assets/js/router.js delete mode 100644 layouts/partials/popover.html diff --git a/assets/js/popover.js b/assets/js/popover.js index ee0477ef..460c245f 100644 --- a/assets/js/popover.js +++ b/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 htmlToElement(html) { 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 = `
    + 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 = `

    ${linkDest.title}

    ${removeMarkdown(linkDest.content).split(" ", 20).join(" ")}...

    ${new Date(linkDest.lastmodified).toLocaleDateString()}

    ` - 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") + }) + } + }) }) } diff --git a/assets/js/router.js b/assets/js/router.js new file mode 100644 index 00000000..5c874eee --- /dev/null +++ b/assets/js/router.js @@ -0,0 +1,25 @@ +import { router, navigate } from "https://unpkg.com/million/dist/router.mjs" + +export const init = (loader) => { + // 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 + window.addEventListener("million:navigate", () => callback(loader)) + window.addEventListener("DOMContentLoaded", () => callback(loader)) +} + +export const callback = (loader) => { + // 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 = "" + + loader() + } + requestAnimationFrame(draw) +} diff --git a/layouts/_default/section.html b/layouts/_default/section.html index 1a4aae05..abdf0b05 100644 --- a/layouts/_default/section.html +++ b/layouts/_default/section.html @@ -19,7 +19,6 @@

    All {{.Title}}

    {{partial "contact.html" .}}
    -{{partial "popover.html" .}} diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 88a859c3..91eda290 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -22,11 +22,10 @@

    {{ .Site.Data.config.page_titl
  • {{ .LinkTitle | humanize }}
  • {{ end }} - {{partial "toc.html" .}} + {{partial "toc.html" .}} {{partial "textprocessing.html" . }} {{partial "footer.html" .}} - {{partial "popover.html" .}}

    diff --git a/layouts/_default/taxonomy.html b/layouts/_default/taxonomy.html index b7a45b10..e0a1e876 100644 --- a/layouts/_default/taxonomy.html +++ b/layouts/_default/taxonomy.html @@ -28,7 +28,6 @@

    {{ .Page.Title }}

    {{partial "contact.html" .}} -{{partial "popover.html" .}} diff --git a/layouts/_default/term.html b/layouts/_default/term.html index 16ea85cf..58f024bc 100644 --- a/layouts/_default/term.html +++ b/layouts/_default/term.html @@ -19,7 +19,6 @@

    Tag: {{.Title | humanize}}

    {{partial "contact.html" .}} -{{partial "popover.html" .}} diff --git a/layouts/index.html b/layouts/index.html index ee33d7cc..224c9978 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -13,12 +13,10 @@

    {{if .Title}}{{ .Title }}{{else}}Untitled{{end}}

    {{partial "darkmode.html" .}}
    - {{partial "toc.html" .}} + {{partial "toc.html" .}} {{partial "textprocessing.html" . }}
    {{partial "footer.html" .}} - {{partial "popover.html" .}} - diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 37938a55..60ff7827 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -35,6 +35,10 @@ {{partial "katex.html" .}} + {{ $popover := resources.Get "js/popover.js" | resources.Fingerprint "md5" | + resources.Minify }} + + {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint "md5" | resources.Minify | }} {{$contentIndex := resources.Get @@ -59,36 +63,25 @@ })) {{if $.Site.Data.config.enableSPA}} + {{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" | + resources.Minify }} {{else}} diff --git a/layouts/partials/popover.html b/layouts/partials/popover.html deleted file mode 100644 index 1d166228..00000000 --- a/layouts/partials/popover.html +++ /dev/null @@ -1,7 +0,0 @@ -{{if $.Site.Data.config.enableLinkPreview}} -{{ $js := resources.Get "js/popover.js" | resources.Fingerprint "md5" | resources.Minify }} - - -{{end}} \ No newline at end of file From 9c71f07355d8e98478e755875e53596f66c58fa9 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 08:48:35 -0700 Subject: [PATCH 0180/1221] Enable config for testing --- data/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/config.yaml b/data/config.yaml index afa531c3..2676ac2a 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -3,7 +3,7 @@ enableToc: true openToc: false enableLinkPreview: true enableLatex: true -enableSPA: false +enableSPA: true description: Host your second brain and digital garden for free. Quartz features extremely fast full-text search, Wikilink support, backlinks, local graph, tags, and link previews. From 9d3bbd607687899d173e9087f2782d7460ebee82 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 08:53:18 -0700 Subject: [PATCH 0181/1221] Fix active node on graph --- assets/js/graph.js | 4 ++-- data/config.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index c5829e92..c32035d8 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -1,5 +1,5 @@ async function drawGraph( - url, + _url, baseUrl, pathColors, depth, @@ -10,7 +10,7 @@ async function drawGraph( const container = document.getElementById('graph-container') const { index, links, content } = await fetchData - const curPage = url.replace(baseUrl, '') + const curPage = window.location.href.replace(baseUrl, '').slice(0, -1) const parseIdsFromLinks = (links) => [ ...new Set(links.flatMap((link) => [link.source, link.target])), diff --git a/data/config.yaml b/data/config.yaml index afa531c3..2676ac2a 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -3,7 +3,7 @@ enableToc: true openToc: false enableLinkPreview: true enableLatex: true -enableSPA: false +enableSPA: true description: Host your second brain and digital garden for free. Quartz features extremely fast full-text search, Wikilink support, backlinks, local graph, tags, and link previews. From 4cca3c1f2df91ba7bb111346447279087e04069a Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 09:04:15 -0700 Subject: [PATCH 0182/1221] Peg router version --- assets/js/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/router.js b/assets/js/router.js index 5c874eee..bf7e3c85 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -1,4 +1,4 @@ -import { router, navigate } from "https://unpkg.com/million/dist/router.mjs" +import { router, navigate } from "https://unpkg.com/million@1.8.9-0/dist/router.mjs" export const init = (loader) => { // SPA navigation for access later From 3c660dd9b5f9e1133bc8a1228287508504b7c132 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 09:20:01 -0700 Subject: [PATCH 0183/1221] Remove unnecessary 'url' param in drawGraph --- assets/js/graph.js | 1 - layouts/partials/head.html | 1 - 2 files changed, 2 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index c32035d8..e92f7db6 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -1,5 +1,4 @@ async function drawGraph( - _url, baseUrl, pathColors, depth, diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 37938a55..93051cb9 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -75,7 +75,6 @@ container.textContent = ""; drawGraph( - {{strings.TrimRight "/" .Page.Permalink}}, {{strings.TrimRight "/" .Site.BaseURL}}, {{$.Site.Data.graphConfig.paths}}, {{$.Site.Data.graphConfig.depth}}, From 32c79a561fa82dbf6537b96e83ab3da2a848b211 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 09:21:44 -0700 Subject: [PATCH 0184/1221] Remove unnecessary 'url' argument in graph.html --- layouts/partials/graph.html | 1 - 1 file changed, 1 deletion(-) diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index b8b2f616..6bc77b64 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -18,7 +18,6 @@

    Interactive Graph

    {{else}} From 1a5d158fce648492c48644acfea039261ac1dffa Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 10:38:41 -0700 Subject: [PATCH 0189/1221] Support active node with other data at end of url --- assets/js/graph.js | 3 ++- assets/js/search.js | 2 +- layouts/partials/graph.html | 10 ---------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index db1cfe2a..5739acdc 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -9,7 +9,8 @@ async function drawGraph( const container = document.getElementById('graph-container') const { index, links, content } = await fetchData - const curPage = window.location.href.replace(baseUrl, "").replace(/\/$/g, "") + // Use .pathname to remove hashes / searchParams / text fragments + const curPage = window.location.pathname.replace(/\/$/g, "") const parseIdsFromLinks = (links) => [ ...new Set(links.flatMap((link) => [link.source, link.target])), diff --git a/assets/js/search.js b/assets/js/search.js index f124d582..26ea39ad 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -144,7 +144,7 @@ const removeMarkdown = ( // SPA navigation window.navigate( new URL( - `${BASE_URL}${id}#:~:text=${encodeURIComponent(term)}/` + `${BASE_URL.replace(/\/$/g, "")}${id}#:~:text=${encodeURIComponent(term)}/` ), '.singlePage' ) diff --git a/layouts/partials/graph.html b/layouts/partials/graph.html index 6bc77b64..b9f79763 100644 --- a/layouts/partials/graph.html +++ b/layouts/partials/graph.html @@ -16,13 +16,3 @@

    Interactive Graph

    {{ $js := resources.Get "js/graph.js" | resources.Fingerprint "md5" }} - From aaed5dc1f1849a54869743596a6133548e83392d Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 10:54:39 -0700 Subject: [PATCH 0190/1221] Support /path root sites --- assets/js/graph.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index 5739acdc..e1bbbebe 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -7,10 +7,13 @@ async function drawGraph( enableZoom ) { const container = document.getElementById('graph-container') - const { index, links, content } = await fetchData + + const rawUrl = new URL(window.location.href); // Use .pathname to remove hashes / searchParams / text fragments - const curPage = window.location.pathname.replace(/\/$/g, "") + const cleanUrl = rawUrl.origin + rawUrl.pathname + + const curPage = cleanUrl.replace(/\/$/g, "").replace(baseUrl, "") const parseIdsFromLinks = (links) => [ ...new Set(links.flatMap((link) => [link.source, link.target])), From 2b5c03c97286e06e94e8a27634678e64473a2ec8 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 3 May 2022 10:55:45 -0700 Subject: [PATCH 0191/1221] Remove redundant URL construction --- assets/js/graph.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index e1bbbebe..f71e44d3 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -9,9 +9,8 @@ async function drawGraph( const container = document.getElementById('graph-container') const { index, links, content } = await fetchData - const rawUrl = new URL(window.location.href); // Use .pathname to remove hashes / searchParams / text fragments - const cleanUrl = rawUrl.origin + rawUrl.pathname + const cleanUrl = window.location.origin + window.location.pathname const curPage = cleanUrl.replace(/\/$/g, "").replace(baseUrl, "") From b4ff12ca0b1b5179c20a1ea57f182caa703b0826 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Wed, 4 May 2022 08:10:59 -0700 Subject: [PATCH 0192/1221] Fix latex --- .pnpm-debug.log | 14 ++++++++++++++ layouts/partials/head.html | 9 +++++++++ layouts/partials/katex.html | 11 ----------- 3 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 .pnpm-debug.log diff --git a/.pnpm-debug.log b/.pnpm-debug.log new file mode 100644 index 00000000..ce5adc89 --- /dev/null +++ b/.pnpm-debug.log @@ -0,0 +1,14 @@ +{ + "0 debug pnpm:scope": { + "selected": 1 + }, + "1 error pnpm": { + "code": "ERR_PNPM_NO_SCRIPT", + "err": { + "name": "pnpm", + "message": "Missing script: dev", + "code": "ERR_PNPM_NO_SCRIPT", + "stack": "pnpm: Missing script: dev\n at Object.handler (/opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:170956:15)\n at async /opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175391:21\n at async run (/opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175365:34)\n at async runPnpm (/opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175583:5)\n at async /opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175575:7" + } + } +} \ No newline at end of file diff --git a/layouts/partials/head.html b/layouts/partials/head.html index b917afbc..097cae79 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -87,6 +87,15 @@ {{if $.Site.Data.config.enableLinkPreview}} initPopover({{strings.TrimRight "/" .Site.BaseURL }}) {{end}} + {{if $.Site.Data.config.enableLatex}} + renderMathInElement(document.body, { + delimiters: [ + {left: '$$', right: '$$', display: true}, + {left: '$', right: '$', display: false}, + ], + throwOnError : false + }); + {{end}} }; attachSPARouting(draw); diff --git a/layouts/partials/katex.html b/layouts/partials/katex.html index e11c4f14..756ef779 100644 --- a/layouts/partials/katex.html +++ b/layouts/partials/katex.html @@ -2,15 +2,4 @@ - {{end}} From 7b3696b877c33f8dc605be1f4f4a688fe0df5b84 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Wed, 4 May 2022 08:39:25 -0700 Subject: [PATCH 0193/1221] Remove pnpm debug log --- .pnpm-debug.log | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 .pnpm-debug.log diff --git a/.pnpm-debug.log b/.pnpm-debug.log deleted file mode 100644 index ce5adc89..00000000 --- a/.pnpm-debug.log +++ /dev/null @@ -1,14 +0,0 @@ -{ - "0 debug pnpm:scope": { - "selected": 1 - }, - "1 error pnpm": { - "code": "ERR_PNPM_NO_SCRIPT", - "err": { - "name": "pnpm", - "message": "Missing script: dev", - "code": "ERR_PNPM_NO_SCRIPT", - "stack": "pnpm: Missing script: dev\n at Object.handler (/opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:170956:15)\n at async /opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175391:21\n at async run (/opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175365:34)\n at async runPnpm (/opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175583:5)\n at async /opt/homebrew/lib/node_modules/pnpm/dist/pnpm.cjs:175575:7" - } - } -} \ No newline at end of file From cea0f3eb743b26db0d5297ab10e229617585fe0c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 5 May 2022 00:58:50 -0400 Subject: [PATCH 0194/1221] feat: contextual backlinks (closes #106) --- .github/workflows/deploy.yaml | 2 +- assets/js/popover.js | 28 +++++++-- assets/js/search.js | 104 +++++++++++++++++--------------- assets/styles/base.scss | 12 ++-- data/config.yaml | 1 + layouts/partials/backlinks.html | 15 +++-- layouts/partials/popover.html | 5 +- 7 files changed, 101 insertions(+), 66 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index ee51d3ee..8334ea2e 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -14,7 +14,7 @@ jobs: fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Build Link Index - uses: jackyzha0/hugo-obsidian@v2.12 + uses: jackyzha0/hugo-obsidian@v2.13 with: index: true input: content diff --git a/assets/js/popover.js b/assets/js/popover.js index ee0477ef..ea01156b 100644 --- a/assets/js/popover.js +++ b/assets/js/popover.js @@ -5,19 +5,20 @@ function htmlToElement(html) { return template.content.firstChild } -function initPopover(baseURL) { +function initPopover(baseURL, useContextualBacklinks) { 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) + .filter(li => li.dataset.src || (li.dataset.idx && useContextualBacklinks)) .forEach(li => { - const linkDest = content[li.dataset.src.replace(/\/$/g, "").replace(basePath, "")] - if (linkDest) { + if (li.dataset.ctx) { + console.log(li.dataset.ctx) + const linkDest = content[li.dataset.src] const popoverElement = `

    ${linkDest.title}

    -

    ${removeMarkdown(linkDest.content).split(" ", 20).join(" ")}...

    +

    ${highlight(removeMarkdown(linkDest.content), li.dataset.ctx)}...

    ${new Date(linkDest.lastmodified).toLocaleDateString()}

    ` const el = htmlToElement(popoverElement) @@ -28,6 +29,23 @@ function initPopover(baseURL) { li.addEventListener("mouseout", () => { el.classList.remove("visible") }) + } else { + const linkDest = content[li.dataset.src.replace(/\/$/g, "").replace(basePath, "")] + if (linkDest) { + const popoverElement = `
    +

    ${linkDest.title}

    +

    ${removeMarkdown(linkDest.content).split(" ", 20).join(" ")}...

    +

    ${new Date(linkDest.lastmodified).toLocaleDateString()}

    +
    ` + const el = htmlToElement(popoverElement) + li.appendChild(el) + li.addEventListener("mouseover", () => { + el.classList.add("visible") + }) + li.addEventListener("mouseout", () => { + el.classList.remove("visible") + }) + } } }) }) diff --git a/assets/js/search.js b/assets/js/search.js index f124d582..c5e293cc 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -52,9 +52,65 @@ const removeMarkdown = ( return markdown } return output -}; +} // ----- +const highlight = (content, term) => { + const highlightWindow = 20 + + // try to find direct match first + const directMatchIdx = content.indexOf(term) + if (directMatchIdx !== -1) { + const h = highlightWindow / 2 + const before = content.substring(0, directMatchIdx).split(" ").slice(-h) + const after = content.substring(directMatchIdx + term.length, content.length - 1).split(" ").slice(0, h) + return (before.length == h ? `...${before.join(" ")}` : before.join(" ")) + `${term}` + after.join(" ") + } + + const tokenizedTerm = term.split(/\s+/).filter((t) => t !== '') + const splitText = content.split(/\s+/).filter((t) => t !== '') + const includesCheck = (token) => + tokenizedTerm.some((term) => + token.toLowerCase().startsWith(term.toLowerCase()) + ) + + const occurrencesIndices = splitText.map(includesCheck) + + // calculate best index + let bestSum = 0 + let bestIndex = 0 + for ( + let i = 0; + i < Math.max(occurrencesIndices.length - highlightWindow, 0); + i++ + ) { + const window = occurrencesIndices.slice(i, i + highlightWindow) + const windowSum = window.reduce((total, cur) => total + cur, 0) + if (windowSum >= bestSum) { + bestSum = windowSum + bestIndex = i + } + } + + const startIndex = Math.max(bestIndex - highlightWindow, 0) + const endIndex = Math.min( + startIndex + 2 * highlightWindow, + splitText.length + ) + const mappedText = splitText + .slice(startIndex, endIndex) + .map((token) => { + if (includesCheck(token)) { + return `${token}` + } + return token + }) + .join(' ') + .replaceAll(' ', ' ') + return `${startIndex === 0 ? '' : '...'}${mappedText}${endIndex === splitText.length ? '' : '...' + }` +}; + (async function() { const encoder = (str) => str.toLowerCase().split(/([^a-z]|[^\x00-\x7F])+/) const contentIndex = new FlexSearch.Document({ @@ -84,52 +140,6 @@ const removeMarkdown = ( }) } - const highlight = (content, term) => { - const highlightWindow = 20 - const tokenizedTerm = term.split(/\s+/).filter((t) => t !== '') - const splitText = content.split(/\s+/).filter((t) => t !== '') - const includesCheck = (token) => - tokenizedTerm.some((term) => - token.toLowerCase().startsWith(term.toLowerCase()) - ) - - const occurrencesIndices = splitText.map(includesCheck) - - // calculate best index - let bestSum = 0 - let bestIndex = 0 - for ( - let i = 0; - i < Math.max(occurrencesIndices.length - highlightWindow, 0); - i++ - ) { - const window = occurrencesIndices.slice(i, i + highlightWindow) - const windowSum = window.reduce((total, cur) => total + cur, 0) - if (windowSum >= bestSum) { - bestSum = windowSum - bestIndex = i - } - } - - const startIndex = Math.max(bestIndex - highlightWindow, 0) - const endIndex = Math.min( - startIndex + 2 * highlightWindow, - splitText.length - ) - const mappedText = splitText - .slice(startIndex, endIndex) - .map((token) => { - if (includesCheck(token)) { - return `${token}` - } - return token - }) - .join(' ') - .replaceAll(' ', ' ') - return `${startIndex === 0 ? '' : '...'}${mappedText}${endIndex === splitText.length ? '' : '...' - }` - } - const resultToHTML = ({ url, title, content, term }) => { const text = removeMarkdown(content) const resultTitle = highlight(title, term) diff --git a/assets/styles/base.scss b/assets/styles/base.scss index 9bbd933a..07874709 100644 --- a/assets/styles/base.scss +++ b/assets/styles/base.scss @@ -478,17 +478,17 @@ header { & > h3, & > p { margin: 0; } - - & .search-highlight { - background-color: #afbfc966; - padding: 0.05em 0.2em; - border-radius: 3px; - } } } } } +.search-highlight { + background-color: #afbfc966; + padding: 0.05em 0.2em; + border-radius: 3px; +} + .section-ul { list-style: none; padding-left: 0; diff --git a/data/config.yaml b/data/config.yaml index afa531c3..ccf38eb7 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -4,6 +4,7 @@ openToc: false enableLinkPreview: true enableLatex: true enableSPA: false +enableContextualBacklinks: true description: Host your second brain and digital garden for free. Quartz features extremely fast full-text search, Wikilink support, backlinks, local graph, tags, and link previews. diff --git a/layouts/partials/backlinks.html b/layouts/partials/backlinks.html index e42351ad..23c9091a 100644 --- a/layouts/partials/backlinks.html +++ b/layouts/partials/backlinks.html @@ -7,13 +7,18 @@

    Backlinks

    {{$inbound := index $linkIndex.index.backlinks $curPage}} {{$contentTable := getJSON "/assets/indices/contentIndex.json"}} {{if $inbound}} - {{$cleanedInbound := apply (apply $inbound "index" "." "source") "replace" "." " " "-"}} - {{- range $cleanedInbound | uniq -}} - {{$l := printf "%s%s/" $host .}} + {{$backlinks := dict "SENTINEL" "SENTINEL"}} + {{range $k, $v := $inbound}} + {{$cleanedInbound := replace $v.source " " "-"}} + {{$ctx := $v.text}} + {{$backlinks = merge $backlinks (dict $cleanedInbound $ctx)}} + {{end}} + {{- range $lnk, $ctx := $backlinks -}} + {{$l := printf "%s%s/" $host $lnk}} {{$l = cond (eq $l "//") "/" $l}} - {{with (index $contentTable .)}} + {{with (index $contentTable $lnk)}}
  • - {{index (index . "title")}} + {{index (index . "title")}}
  • {{end}} {{- end -}} diff --git a/layouts/partials/popover.html b/layouts/partials/popover.html index 1d166228..ba1fd037 100644 --- a/layouts/partials/popover.html +++ b/layouts/partials/popover.html @@ -2,6 +2,7 @@ {{ $js := resources.Get "js/popover.js" | resources.Fingerprint "md5" | resources.Minify }} -{{end}} \ No newline at end of file +{{end}} From b21b27d1d3d68bfb4d285f39122a154fceefb9ab Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 5 May 2022 20:30:55 -0400 Subject: [PATCH 0195/1221] fix: clean wikilinks and render latex in popover --- assets/js/popover.js | 41 +++++++++++++++++++-------------- assets/js/search.js | 1 + layouts/partials/head.html | 6 ++++- layouts/partials/page-list.html | 2 +- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/assets/js/popover.js b/assets/js/popover.js index 9270b8ae..5fb2244a 100644 --- a/assets/js/popover.js +++ b/assets/js/popover.js @@ -5,13 +5,14 @@ function htmlToElement(html) { return template.content.firstChild } -function initPopover(baseURL, useContextualBacklinks) { +function initPopover(baseURL, useContextualBacklinks, renderLatex) { const basePath = baseURL.replace(window.location.origin, "") fetchData.then(({ content }) => { const links = [...document.getElementsByClassName("internal-link")] links .filter(li => li.dataset.src || (li.dataset.idx && useContextualBacklinks)) .forEach(li => { + var el if (li.dataset.ctx) { const linkDest = content[li.dataset.src] const popoverElement = `
    @@ -19,32 +20,38 @@ function initPopover(baseURL, useContextualBacklinks) {

    ${highlight(removeMarkdown(linkDest.content), li.dataset.ctx)}...

    ${new Date(linkDest.lastmodified).toLocaleDateString()}

    ` - const el = htmlToElement(popoverElement) - li.appendChild(el) - li.addEventListener("mouseover", () => { - el.classList.add("visible") - }) - li.addEventListener("mouseout", () => { - el.classList.remove("visible") - }) + el = htmlToElement(popoverElement) } else { const linkDest = content[li.dataset.src.replace(/\/$/g, "").replace(basePath, "")] + console.log(linkDest.content) if (linkDest) { const popoverElement = `

    ${linkDest.title}

    ${removeMarkdown(linkDest.content).split(" ", 20).join(" ")}...

    ${new Date(linkDest.lastmodified).toLocaleDateString()}

    ` - const el = htmlToElement(popoverElement) - li.appendChild(el) - li.addEventListener("mouseover", () => { - el.classList.add("visible") - }) - li.addEventListener("mouseout", () => { - el.classList.remove("visible") - }) + el = htmlToElement(popoverElement) } } + li.appendChild(el) + if (renderLatex) { + renderMathInElement(el, { + delimiters: [ + { left: '$$', right: '$$', display: false }, + { left: '$', right: '$', display: false }, + { left: '\\(', right: '\\)', display: false }, + { left: '\\[', right: '\\]', display: false } + ], + throwOnError: false + }) + } + li.addEventListener("mouseover", () => { + el.classList.add("visible") + }) + li.addEventListener("mouseout", () => { + el.classList.remove("visible") + }) + }) }) } diff --git a/assets/js/search.js b/assets/js/search.js index 975eaa65..195a40be 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -39,6 +39,7 @@ const removeMarkdown = ( .replace(/\s{0,2}\[.*?\]: .*?$/g, '') .replace(/\!\[(.*?)\][\[\(].*?[\]\)]/g, options.useImgAltText ? '$1' : '') .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') + .replace(/!?\[\[\S[^\[\]\|]*(?:\|([^\[\]]*))?\S\]\]/g, '$1') .replace(/^\s{0,3}>\s?/g, '') .replace(/(^|\n)\s{0,3}>\s?/g, '\n\n') .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, '') diff --git a/layouts/partials/head.html b/layouts/partials/head.html index a8d947e4..a5f23da3 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -85,7 +85,11 @@ ); {{if $.Site.Data.config.enableLinkPreview}} - initPopover({{strings.TrimRight "/" .Site.BaseURL }}, {{$.Site.Data.config.enableContextualBacklinks}}) + initPopover( + {{strings.TrimRight "/" .Site.BaseURL }}, + {{$.Site.Data.config.enableContextualBacklinks}}, + {{$.Site.Data.config.enableLatex}} + ) {{end}} {{if $.Site.Data.config.enableLatex}} renderMathInElement(document.body, { diff --git a/layouts/partials/page-list.html b/layouts/partials/page-list.html index bdfcd59c..6c2249ba 100644 --- a/layouts/partials/page-list.html +++ b/layouts/partials/page-list.html @@ -12,4 +12,4 @@

    {{- .Title -}}

    {{- end -}} - \ No newline at end of file + From e302f6c423136d1dbdfda48c2b241e62bb5654e7 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 5 May 2022 20:35:32 -0400 Subject: [PATCH 0196/1221] fix: more generic style to match bad nesting generated by popover interp --- assets/styles/base.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/styles/base.scss b/assets/styles/base.scss index 07874709..6378f900 100644 --- a/assets/styles/base.scss +++ b/assets/styles/base.scss @@ -441,7 +441,7 @@ header { } & > #results-container { - & > .result-card { + & .result-card { padding: 1em; cursor: pointer; transition: background 0.2s ease; From ed9a8efd1ff4ee569fa4256e044151670abaea82 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 5 May 2022 21:11:23 -0400 Subject: [PATCH 0197/1221] fix inline link highlighting, safer latex render --- assets/js/popover.js | 37 +++++++++++++++++++------------------ assets/js/search.js | 4 ++-- assets/styles/base.scss | 2 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/assets/js/popover.js b/assets/js/popover.js index 5fb2244a..494cd84e 100644 --- a/assets/js/popover.js +++ b/assets/js/popover.js @@ -23,7 +23,6 @@ function initPopover(baseURL, useContextualBacklinks, renderLatex) { el = htmlToElement(popoverElement) } else { const linkDest = content[li.dataset.src.replace(/\/$/g, "").replace(basePath, "")] - console.log(linkDest.content) if (linkDest) { const popoverElement = `

    ${linkDest.title}

    @@ -33,25 +32,27 @@ function initPopover(baseURL, useContextualBacklinks, renderLatex) { el = htmlToElement(popoverElement) } } - li.appendChild(el) - if (renderLatex) { - renderMathInElement(el, { - delimiters: [ - { left: '$$', right: '$$', display: false }, - { left: '$', right: '$', display: false }, - { left: '\\(', right: '\\)', display: false }, - { left: '\\[', right: '\\]', display: false } - ], - throwOnError: false + + if (el) { + li.appendChild(el) + if (renderLatex) { + renderMathInElement(el, { + delimiters: [ + { left: '$$', right: '$$', display: false }, + { left: '$', right: '$', display: false }, + { left: '\\(', right: '\\)', display: false }, + { left: '\\[', right: '\\]', display: false } + ], + throwOnError: false + }) + } + li.addEventListener("mouseover", () => { + el.classList.add("visible") + }) + li.addEventListener("mouseout", () => { + el.classList.remove("visible") }) } - li.addEventListener("mouseover", () => { - el.classList.add("visible") - }) - li.addEventListener("mouseout", () => { - el.classList.remove("visible") - }) - }) }) } diff --git a/assets/js/search.js b/assets/js/search.js index 195a40be..bb94cd30 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -38,8 +38,8 @@ const removeMarkdown = ( .replace(/(#{1,6})\s+(.+)\1?/g, '$2') .replace(/\s{0,2}\[.*?\]: .*?$/g, '') .replace(/\!\[(.*?)\][\[\(].*?[\]\)]/g, options.useImgAltText ? '$1' : '') - .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') - .replace(/!?\[\[\S[^\[\]\|]*(?:\|([^\[\]]*))?\S\]\]/g, '$1') + .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') + .replace(/!?\[\[\S[^\[\]\|]*(?:\|([^\[\]]*))?\S\]\]/g, '$1') .replace(/^\s{0,3}>\s?/g, '') .replace(/(^|\n)\s{0,3}>\s?/g, '\n\n') .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, '') diff --git a/assets/styles/base.scss b/assets/styles/base.scss index 6378f900..1b9b936e 100644 --- a/assets/styles/base.scss +++ b/assets/styles/base.scss @@ -569,7 +569,7 @@ header { font-size: 0.8rem; } - & > p { + & > p, & > a { margin: 0; font-weight: 400; user-select: none; From 0b6711c2185abbde7e95125b672ee8b5d827cb8b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 14 May 2022 16:47:50 -0400 Subject: [PATCH 0198/1221] fix: tag boxes overlapping for content with many tags (closes #130) --- assets/styles/base.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/styles/base.scss b/assets/styles/base.scss index 1b9b936e..de866fdb 100644 --- a/assets/styles/base.scss +++ b/assets/styles/base.scss @@ -186,6 +186,7 @@ article { & > li { display: inline-block; + margin: 0.4em 0; } & > li > a { border-radius: 8px; From 0439c163a03fc50487fbe1cbfc09dc38af7ed2f2 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 20 May 2022 16:50:56 -0400 Subject: [PATCH 0199/1221] fix: js not executing if spa disabled --- layouts/partials/head.html | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index a5f23da3..a49800be 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -61,13 +61,7 @@ links, content, })) - - {{if $.Site.Data.config.enableSPA}} - {{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" | - resources.Minify }} - + {{if $.Site.Data.config.enableSPA}} + {{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" | + resources.Minify }} + {{else}} - + {{end}} {{ template "_internal/google_analytics.html" . }} From 0293c122177bf8c595cda8b4dfb513d90b1e6b03 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 23 May 2022 22:25:13 -0700 Subject: [PATCH 0200/1221] feat: recent posts section/partial --- assets/styles/base.scss | 61 +++++++++++++++++---------------- data/config.yaml | 1 + layouts/index.html | 3 ++ layouts/partials/page-list.html | 6 ++++ layouts/partials/recent.html | 12 +++++++ 5 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 layouts/partials/recent.html diff --git a/assets/styles/base.scss b/assets/styles/base.scss index de866fdb..1c353f33 100644 --- a/assets/styles/base.scss +++ b/assets/styles/base.scss @@ -171,35 +171,6 @@ article { opacity: 0.7; } - & > .tags { - list-style: none; - padding-left: 0; - - & .meta { - & > h1 { - margin: 0; - } - & > p { - margin: 0; - } - } - - & > li { - display: inline-block; - margin: 0.4em 0; - } - & > li > a { - border-radius: 8px; - border: var(--outlinegray) 1px solid; - padding: 0.2em 0.5em; - &::before { - content: "#"; - margin-right: 0.3em; - color: var(--outlinegray); - } - } - } - & a { font-family: Source Sans Pro; font-weight: 600; @@ -223,6 +194,36 @@ article { } } +.tags { + list-style: none; + padding-left: 0; + + & .meta { + & > h1 { + margin: 0; + } + & > p { + margin: 0; + } + } + + & > li { + display: inline-block; + margin: 0.4em 0; + } + + & > li > a { + border-radius: 8px; + border: var(--outlinegray) 1px solid; + padding: 0.2em 0.5em; + &::before { + content: "#"; + margin-right: 0.3em; + color: var(--outlinegray); + } + } +} + .backlinks a { font-weight: 600; font-size: 0.9rem; @@ -590,3 +591,5 @@ header { padding: 0 1em; } } + + diff --git a/data/config.yaml b/data/config.yaml index 2b606e74..b79ad572 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -5,6 +5,7 @@ enableLinkPreview: true enableLatex: true enableSPA: true enableContextualBacklinks: true +enableRecentNotes: false description: Host your second brain and digital garden for free. Quartz features extremely fast full-text search, Wikilink support, backlinks, local graph, tags, and link previews. diff --git a/layouts/index.html b/layouts/index.html index 224c9978..8d1ffbd4 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -15,6 +15,9 @@

    {{if .Title}}{{ .Title }}{{else}}Untitled{{end}}

    {{partial "toc.html" .}} {{partial "textprocessing.html" . }} + {{if $.Site.Data.config.enableRecentNotes}} + {{partial "recent.html" . }} + {{end}}
    {{partial "footer.html" .}}
    diff --git a/layouts/partials/page-list.html b/layouts/partials/page-list.html index 6c2249ba..e51c5dda 100644 --- a/layouts/partials/page-list.html +++ b/layouts/partials/page-list.html @@ -4,11 +4,17 @@

    {{- .Title -}}

    +

    {{- .Summary -}}{{if .Truncated}}...{{end}}

    {{ .ReadingTime }} minute read. Last updated {{if ne .Date .Lastmod}}{{ .Lastmod.Format "January 2, 2006" }}{{else}}Unknown{{end}}

    +
    {{- end -}} diff --git a/layouts/partials/recent.html b/layouts/partials/recent.html new file mode 100644 index 00000000..e3926c24 --- /dev/null +++ b/layouts/partials/recent.html @@ -0,0 +1,12 @@ +
    +

    Recent Notes

    + + {{$notes := .Site.RegularPages}} + {{partial "page-list.html" (first 3 $notes)}} +
    + From bd316d8249f096c4d5616d682f142f49d4ca914f Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 08:39:44 -0700 Subject: [PATCH 0201/1221] Bump million to 1.9.2 --- assets/js/router.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/assets/js/router.js b/assets/js/router.js index 81c25ac1..b70aac2d 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -1,12 +1,16 @@ -import { router, navigate } from "https://unpkg.com/million@1.8.9-0/dist/router.mjs" +import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.2/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 + // Attach SPA functions to the global Million namespace + window.Million = { + router, + navigate, + reload, + prefetch, + }; 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)) + reload(draw) window.addEventListener("DOMContentLoaded", () => requestAnimationFrame(draw)) } From efb6c7845f0a2743dd07b81f1d03b03d058ede0d Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 08:40:00 -0700 Subject: [PATCH 0202/1221] Add prefetch to graph --- assets/js/graph.js | 205 +++++++++++++++---------------------- assets/js/search.js | 2 +- layouts/partials/head.html | 2 +- 3 files changed, 87 insertions(+), 122 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index f71e44d3..c7634cf3 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -1,12 +1,5 @@ -async function drawGraph( - baseUrl, - pathColors, - depth, - enableDrag, - enableLegend, - enableZoom -) { - const container = document.getElementById('graph-container') +async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, enableZoom) { + const container = document.getElementById("graph-container") const { index, links, content } = await fetchData // Use .pathname to remove hashes / searchParams / text fragments @@ -23,22 +16,19 @@ async function drawGraph( const copyLinks = JSON.parse(JSON.stringify(links)) const neighbours = new Set() - const wl = [curPage || '/', '__SENTINEL'] + const wl = [curPage || "/", "__SENTINEL"] if (depth >= 0) { while (depth >= 0 && wl.length > 0) { // compute neighbours const cur = wl.shift() - if (cur === '__SENTINEL') { + if (cur === "__SENTINEL") { depth-- - wl.push('__SENTINEL') + wl.push("__SENTINEL") } else { neighbours.add(cur) const outgoing = index.links[cur] || [] const incoming = index.backlinks[cur] || [] - wl.push( - ...outgoing.map((l) => l.target), - ...incoming.map((l) => l.source) - ) + wl.push(...outgoing.map((l) => l.target), ...incoming.map((l) => l.source)) } } } else { @@ -47,14 +37,12 @@ async function drawGraph( const data = { nodes: [...neighbours].map((id) => ({ id })), - links: copyLinks.filter( - (l) => neighbours.has(l.source) && neighbours.has(l.target) - ), + links: copyLinks.filter((l) => neighbours.has(l.source) && neighbours.has(l.target)), } const color = (d) => { - if (d.id === curPage || (d.id === '/' && curPage === '')) { - return 'var(--g-node-active)' + if (d.id === curPage || (d.id === "/" && curPage === "")) { + return "var(--g-node-active)" } for (const pathColor of pathColors) { @@ -65,7 +53,7 @@ async function drawGraph( } } - return 'var(--g-node)' + return "var(--g-node)" } const drag = (simulation) => { @@ -86,12 +74,12 @@ async function drawGraph( d.fy = null } - const noop = () => { } + const noop = () => {} return d3 .drag() - .on('start', enableDrag ? dragstarted : noop) - .on('drag', enableDrag ? dragged : noop) - .on('end', enableDrag ? dragended : noop) + .on("start", enableDrag ? dragstarted : noop) + .on("drag", enableDrag ? dragged : noop) + .on("end", enableDrag ? dragended : noop) } const height = Math.max(container.offsetHeight, 250) @@ -99,67 +87,58 @@ async function drawGraph( const simulation = d3 .forceSimulation(data.nodes) - .force('charge', d3.forceManyBody().strength(-30)) + .force("charge", d3.forceManyBody().strength(-30)) .force( - 'link', + "link", d3 .forceLink(data.links) .id((d) => d.id) - .distance(40) + .distance(40), ) - .force('center', d3.forceCenter()) + .force("center", d3.forceCenter()) const svg = d3 - .select('#graph-container') - .append('svg') - .attr('width', width) - .attr('height', height) - .attr('viewBox', [-width / 2, -height / 2, width, height]) + .select("#graph-container") + .append("svg") + .attr("width", width) + .attr("height", height) + .attr("viewBox", [-width / 2, -height / 2, width, height]) if (enableLegend) { - const legend = [ - { Current: 'var(--g-node-active)' }, - { Note: 'var(--g-node)' }, - ...pathColors, - ] + const legend = [{ Current: "var(--g-node-active)" }, { Note: "var(--g-node)" }, ...pathColors] legend.forEach((legendEntry, i) => { const key = Object.keys(legendEntry)[0] const colour = legendEntry[key] svg - .append('circle') - .attr('cx', -width / 2 + 20) - .attr('cy', height / 2 - 30 * (i + 1)) - .attr('r', 6) - .style('fill', colour) + .append("circle") + .attr("cx", -width / 2 + 20) + .attr("cy", height / 2 - 30 * (i + 1)) + .attr("r", 6) + .style("fill", colour) svg - .append('text') - .attr('x', -width / 2 + 40) - .attr('y', height / 2 - 30 * (i + 1)) + .append("text") + .attr("x", -width / 2 + 40) + .attr("y", height / 2 - 30 * (i + 1)) .text(key) - .style('font-size', '15px') - .attr('alignment-baseline', 'middle') + .style("font-size", "15px") + .attr("alignment-baseline", "middle") }) } // draw links between nodes const link = svg - .append('g') - .selectAll('line') + .append("g") + .selectAll("line") .data(data.links) - .join('line') - .attr('class', 'link') - .attr('stroke', 'var(--g-link)') - .attr('stroke-width', 2) - .attr('data-source', (d) => d.source.id) - .attr('data-target', (d) => d.target.id) + .join("line") + .attr("class", "link") + .attr("stroke", "var(--g-link)") + .attr("stroke-width", 2) + .attr("data-source", (d) => d.source.id) + .attr("data-target", (d) => d.target.id) // svg groups - const graphNode = svg - .append('g') - .selectAll('g') - .data(data.nodes) - .enter() - .append('g') + const graphNode = svg.append("g").selectAll("g").data(data.nodes).enter().append("g") // calculate radius const nodeRadius = (d) => { @@ -170,82 +149,68 @@ async function drawGraph( // draw individual nodes const node = graphNode - .append('circle') - .attr('class', 'node') - .attr('id', (d) => d.id) - .attr('r', nodeRadius) - .attr('fill', color) - .style('cursor', 'pointer') - .on('click', (_, d) => { + .append("circle") + .attr("class", "node") + .attr("id", (d) => d.id) + .attr("r", nodeRadius) + .attr("fill", color) + .style("cursor", "pointer") + .on("click", (_, d) => { // SPA navigation - window.navigate( - new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, '-')}/`), - '.singlePage' - ) + window.Million.navigate(new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`), ".singlePage") }) - .on('mouseover', function(_, d) { - d3.selectAll('.node') - .transition() - .duration(100) - .attr('fill', 'var(--g-node-inactive)') + .on("mouseover", function (_, d) { + d3.selectAll(".node").transition().duration(100).attr("fill", "var(--g-node-inactive)") const neighbours = parseIdsFromLinks([ ...(index.links[d.id] || []), ...(index.backlinks[d.id] || []), ]) - const neighbourNodes = d3 - .selectAll('.node') - .filter((d) => neighbours.includes(d.id)) + const neighbourNodes = d3.selectAll(".node").filter((d) => neighbours.includes(d.id)) const currentId = d.id + window.Million.prefetch(new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`)) const linkNodes = d3 - .selectAll('.link') + .selectAll(".link") .filter((d) => d.source.id === currentId || d.target.id === currentId) // highlight neighbour nodes - neighbourNodes.transition().duration(200).attr('fill', color) + neighbourNodes.transition().duration(200).attr("fill", color) // highlight links - linkNodes - .transition() - .duration(200) - .attr('stroke', 'var(--g-link-active)') + linkNodes.transition().duration(200).attr("stroke", "var(--g-link-active)") // show text for self d3.select(this.parentNode) .raise() - .select('text') + .select("text") .transition() .duration(200) - .style('opacity', 1) + .style("opacity", 1) }) - .on('mouseleave', function(_, d) { - d3.selectAll('.node').transition().duration(200).attr('fill', color) + .on("mouseleave", function (_, d) { + d3.selectAll(".node").transition().duration(200).attr("fill", color) const currentId = d.id const linkNodes = d3 - .selectAll('.link') + .selectAll(".link") .filter((d) => d.source.id === currentId || d.target.id === currentId) - linkNodes.transition().duration(200).attr('stroke', 'var(--g-link)') + linkNodes.transition().duration(200).attr("stroke", "var(--g-link)") - d3.select(this.parentNode) - .select('text') - .transition() - .duration(200) - .style('opacity', 0) + d3.select(this.parentNode).select("text").transition().duration(200).style("opacity", 0) }) .call(drag(simulation)) // draw labels const labels = graphNode - .append('text') - .attr('dx', 0) - .attr('dy', (d) => nodeRadius(d) + 8 + 'px') - .attr('text-anchor', 'middle') - .text((d) => content[d.id]?.title || d.id.replace('-', ' ')) - .style('opacity', 0) - .style('pointer-events', 'none') - .style('font-size', '0.4em') + .append("text") + .attr("dx", 0) + .attr("dy", (d) => nodeRadius(d) + 8 + "px") + .attr("text-anchor", "middle") + .text((d) => content[d.id]?.title || d.id.replace("-", " ")) + .style("opacity", 0) + .style("pointer-events", "none") + .style("font-size", "0.4em") .raise() .call(drag(simulation)) @@ -260,24 +225,24 @@ async function drawGraph( [width, height], ]) .scaleExtent([0.25, 4]) - .on('zoom', ({ transform }) => { - link.attr('transform', transform) - node.attr('transform', transform) + .on("zoom", ({ transform }) => { + link.attr("transform", transform) + node.attr("transform", transform) const scale = transform.k const scaledOpacity = Math.max((scale - 1) / 3.75, 0) - labels.attr('transform', transform).style('opacity', scaledOpacity) - }) + labels.attr("transform", transform).style("opacity", scaledOpacity) + }), ) } // progress the simulation - simulation.on('tick', () => { + simulation.on("tick", () => { link - .attr('x1', (d) => d.source.x) - .attr('y1', (d) => d.source.y) - .attr('x2', (d) => d.target.x) - .attr('y2', (d) => d.target.y) - node.attr('cx', (d) => d.x).attr('cy', (d) => d.y) - labels.attr('x', (d) => d.x).attr('y', (d) => d.y) + .attr("x1", (d) => d.source.x) + .attr("y1", (d) => d.source.y) + .attr("x2", (d) => d.target.x) + .attr("y2", (d) => d.target.y) + node.attr("cx", (d) => d.x).attr("cy", (d) => d.y) + labels.attr("x", (d) => d.x).attr("y", (d) => d.y) }) } diff --git a/assets/js/search.js b/assets/js/search.js index bb94cd30..ee006471 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -153,7 +153,7 @@ const highlight = (content, term) => { const redir = (id, term) => { // SPA navigation - window.navigate( + window.Million.navigate( new URL( `${BASE_URL.replace(/\/$/g, "")}${id}#:~:text=${encodeURIComponent(term)}/` ), diff --git a/layouts/partials/head.html b/layouts/partials/head.html index a49800be..b65bb843 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -107,7 +107,7 @@ {{else}} {{end}} From bc32bbeaed10eac3094fcaa899ca626dc8e56771 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 09:02:01 -0700 Subject: [PATCH 0203/1221] Bump milliomn to 1.9.3 --- assets/js/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/router.js b/assets/js/router.js index b70aac2d..dff17413 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -1,4 +1,4 @@ -import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.2/dist/router.mjs" +import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.3/dist/router.mjs" export const attachSPARouting = (draw) => { // Attach SPA functions to the global Million namespace From e0fd9570d746cb2aa270dbe64dae038fc02bdbac Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 09:49:28 -0700 Subject: [PATCH 0204/1221] Bump million to 1.9.4 --- assets/js/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/router.js b/assets/js/router.js index dff17413..3cd33500 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -1,4 +1,4 @@ -import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.3/dist/router.mjs" +import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.4/dist/router.mjs" export const attachSPARouting = (draw) => { // Attach SPA functions to the global Million namespace From 683cb53cbd4d581a061b64a26da54285ef479e19 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 13:19:19 -0700 Subject: [PATCH 0205/1221] Bump million to 1.9.5 --- assets/js/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/router.js b/assets/js/router.js index 3cd33500..278ed565 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -1,4 +1,4 @@ -import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.4/dist/router.mjs" +import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.5/dist/router.mjs" export const attachSPARouting = (draw) => { // Attach SPA functions to the global Million namespace From 44984cdaf4dfca8c25e9b73066ee22c775ed6d2e Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 13:27:13 -0700 Subject: [PATCH 0206/1221] Add support for progress bar --- assets/styles/custom.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assets/styles/custom.scss b/assets/styles/custom.scss index 612b80a6..0a23ffca 100644 --- a/assets/styles/custom.scss +++ b/assets/styles/custom.scss @@ -9,6 +9,7 @@ --gray: #4e4e4e; --lightgray: #f0f0f0; --outlinegray: #dadada; + --million-progress-bar-color: var(--secondary); } [saved-theme="dark"] { @@ -21,4 +22,5 @@ --gray: #d4d4d4 !important; --lightgray: #292633 !important; --outlinegray: #343434 !important; + --million-progress-bar-color: var(--secondary) !important; } \ No newline at end of file From 159deabfe160c7570679269873f18776cb586437 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 16:14:17 -0700 Subject: [PATCH 0207/1221] Bump to 1.9.6 --- assets/js/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/router.js b/assets/js/router.js index 278ed565..787cd765 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -1,4 +1,4 @@ -import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.5/dist/router.mjs" +import { router, navigate, reload, prefetch } from "https://unpkg.com/million@1.9.6/dist/router.mjs" export const attachSPARouting = (draw) => { // Attach SPA functions to the global Million namespace From ae240ff82cd8de66c28b1608e72db6ed397cab13 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 18:31:36 -0700 Subject: [PATCH 0208/1221] Remove redundant CSS rule --- assets/styles/custom.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/styles/custom.scss b/assets/styles/custom.scss index 0a23ffca..54dbacef 100644 --- a/assets/styles/custom.scss +++ b/assets/styles/custom.scss @@ -22,5 +22,4 @@ --gray: #d4d4d4 !important; --lightgray: #292633 !important; --outlinegray: #343434 !important; - --million-progress-bar-color: var(--secondary) !important; } \ No newline at end of file From 8aba612a0013e84f0b3f9d60863c02ad1b0bfd6e Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 18:42:01 -0700 Subject: [PATCH 0209/1221] Fix non-spa fallback --- layouts/partials/head.html | 58 +++++++++++++++----------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index b65bb843..2da259d4 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -5,45 +5,31 @@ name="description" content="{{if .IsHome}}{{$.Site.Data.config.description}}{{else}}{{.Summary}}{{end}}" /> - - {{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ - end }} - + {{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ end }} - + - {{$sass := resources.Match "styles/[!_]*.scss" }} - {{$css := slice }} - {{range $sass}} - {{$scss := . | resources.ToCSS (dict "outputStyle" "compressed") }} - {{$css = $css | append $scss}} - {{end}} - {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | resources.Minify }} + {{$sass := resources.Match "styles/[!_]*.scss" }} {{$css := slice }} {{range $sass}} {{$scss := . + | resources.ToCSS (dict "outputStyle" "compressed") }} {{$css = $css | append $scss}} {{end}} + {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | + resources.Minify }} - {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | - resources.Minify }} + {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | resources.Minify }} - {{partial "katex.html" .}} - - {{ $popover := resources.Get "js/popover.js" | resources.Fingerprint "md5" | - resources.Minify }} + {{partial "katex.html" .}} {{ $popover := resources.Get "js/popover.js" | resources.Fingerprint + "md5" | resources.Minify }} - {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint - "md5" | resources.Minify | }} {{$contentIndex := resources.Get - "indices/contentIndex.json" | resources.Fingerprint "md5" | resources.Minify - }} + {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint "md5" | + resources.Minify | }} {{$contentIndex := resources.Get "indices/contentIndex.json" | + resources.Fingerprint "md5" | resources.Minify }} - {{if $.Site.Data.config.enableSPA}} - {{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" | - resources.Minify }} + {{if $.Site.Data.config.enableSPA}} {{ $router := resources.Get "js/router.js" | + resources.Fingerprint "md5" | resources.Minify }} {{else}} {{end}} From 006b74ec6feed2d01099754c888bac4a9474a6b1 Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Fri, 27 May 2022 18:45:42 -0700 Subject: [PATCH 0210/1221] Fix formatting --- layouts/partials/head.html | 40 +++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 2da259d4..25120d51 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -5,31 +5,44 @@ name="description" content="{{if .IsHome}}{{$.Site.Data.config.description}}{{else}}{{.Summary}}{{end}}" /> - {{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ end }} + + {{ if .Title }}{{ .Title }}{{ else }}{{ $.Site.Data.config.page_title }}{{ + end }} + - + - {{$sass := resources.Match "styles/[!_]*.scss" }} {{$css := slice }} {{range $sass}} {{$scss := . - | resources.ToCSS (dict "outputStyle" "compressed") }} {{$css = $css | append $scss}} {{end}} - {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | - resources.Minify }} + {{$sass := resources.Match "styles/[!_]*.scss" }} + {{$css := slice }} + {{range $sass}} + {{$scss := . | resources.ToCSS (dict "outputStyle" "compressed") }} + {{$css = $css | append $scss}} + {{end}} + {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | resources.Minify }} {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | resources.Minify }} - {{partial "katex.html" .}} {{ $popover := resources.Get "js/popover.js" | resources.Fingerprint - "md5" | resources.Minify }} + {{partial "katex.html" .}} + + {{ $popover := resources.Get "js/popover.js" | resources.Fingerprint "md5" | + resources.Minify }} - {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint "md5" | - resources.Minify | }} {{$contentIndex := resources.Get "indices/contentIndex.json" | - resources.Fingerprint "md5" | resources.Minify }} + {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint + "md5" | resources.Minify | }} {{$contentIndex := resources.Get + "indices/contentIndex.json" | resources.Fingerprint "md5" | resources.Minify + }} - {{if $.Site.Data.config.enableSPA}} {{ $router := resources.Get "js/router.js" | - resources.Fingerprint "md5" | resources.Minify }} + {{if $.Site.Data.config.enableSPA}} + {{ $router := resources.Get "js/router.js" | resources.Fingerprint "md5" | + resources.Minify }} {{else}} {{end}} From 5a1fbc937470b4f43b318dd0fa9af01b4a47b188 Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Wed, 1 Jun 2022 13:49:27 +0100 Subject: [PATCH 0213/1221] Improve graph display, options and ability to have a global graph on the home page, local graphs on subpage. --- assets/js/graph.js | 43 +++++++++++++++++++++++------- data/graphConfig.yaml | 33 +++++++++++++++++++++-- layouts/index.html | 2 +- layouts/partials/footerIndex.html | 28 ++++++++++++++++++++ layouts/partials/head.html | 44 +++++++++++++++++++++++++------ 5 files changed, 129 insertions(+), 21 deletions(-) create mode 100644 layouts/partials/footerIndex.html diff --git a/assets/js/graph.js b/assets/js/graph.js index c7634cf3..48248eca 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -1,4 +1,16 @@ -async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, enableZoom) { +async function drawGraph( + baseUrl, + pathColors, + depth, + enableDrag, + enableLegend, + enableZoom, + isHome, + opacityScale, + scale, + repelForce, + fontSize +) { const container = document.getElementById("graph-container") const { index, links, content } = await fetchData @@ -82,12 +94,12 @@ async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, e .on("end", enableDrag ? dragended : noop) } - const height = Math.max(container.offsetHeight, 250) + const height = Math.max(container.offsetHeight, isHome ? 500 : 250) const width = container.offsetWidth const simulation = d3 .forceSimulation(data.nodes) - .force("charge", d3.forceManyBody().strength(-30)) + .force("charge", d3.forceManyBody().strength(-100 * repelForce)) .force( "link", d3 @@ -102,7 +114,7 @@ async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, e .append("svg") .attr("width", width) .attr("height", height) - .attr("viewBox", [-width / 2, -height / 2, width, height]) + .attr('viewBox', [-width / 2 * 1 / scale, -height / 2 * 1 / scale, width * 1 / scale, height * 1 / scale]) if (enableLegend) { const legend = [{ Current: "var(--g-node-active)" }, { Note: "var(--g-node)" }, ...pathColors] @@ -168,7 +180,7 @@ async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, e ]) const neighbourNodes = d3.selectAll(".node").filter((d) => neighbours.includes(d.id)) const currentId = d.id - window.Million.prefetch(new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`)) + // window.Million.prefetch(new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`)) const linkNodes = d3 .selectAll(".link") .filter((d) => d.source.id === currentId || d.target.id === currentId) @@ -179,13 +191,18 @@ async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, e // highlight links linkNodes.transition().duration(200).attr("stroke", "var(--g-link-active)") + const bigFont = fontSize+0.5 + // show text for self d3.select(this.parentNode) .raise() .select("text") .transition() .duration(200) - .style("opacity", 1) + .attr('opacityOld', d3.select(this.parentNode).select('text').style("opacity")) + .style('opacity', 1) + .style('font-size', bigFont+'em') + .attr('dy', d => nodeRadius(d) + 20 + 'px') // radius is in px }) .on("mouseleave", function (_, d) { d3.selectAll(".node").transition().duration(200).attr("fill", color) @@ -197,7 +214,13 @@ async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, e linkNodes.transition().duration(200).attr("stroke", "var(--g-link)") - d3.select(this.parentNode).select("text").transition().duration(200).style("opacity", 0) + d3.select(this.parentNode) + .select("text") + .transition() + .duration(200) + .style('opacity', d3.select(this.parentNode).select('text').attr("opacityOld")) + .style('font-size', fontSize+'em') + .attr('dy', d => nodeRadius(d) + 8 + 'px') // radius is in px }) .call(drag(simulation)) @@ -208,9 +231,9 @@ async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, e .attr("dy", (d) => nodeRadius(d) + 8 + "px") .attr("text-anchor", "middle") .text((d) => content[d.id]?.title || d.id.replace("-", " ")) - .style("opacity", 0) + .style('opacity', (opacityScale - 1) / 3.75) .style("pointer-events", "none") - .style("font-size", "0.4em") + .style('font-size', fontSize+'em') .raise() .call(drag(simulation)) @@ -228,7 +251,7 @@ async function drawGraph(baseUrl, pathColors, depth, enableDrag, enableLegend, e .on("zoom", ({ transform }) => { link.attr("transform", transform) node.attr("transform", transform) - const scale = transform.k + const scale = transform.k * opacityScale; const scaledOpacity = Math.max((scale - 1) / 3.75, 0) labels.attr("transform", transform).style("opacity", scaledOpacity) }), diff --git a/data/graphConfig.yaml b/data/graphConfig.yaml index 3f8d3fb6..7f08130d 100644 --- a/data/graphConfig.yaml +++ b/data/graphConfig.yaml @@ -1,6 +1,35 @@ +# if true, a Global Graph will be shown on home page with full width, no backlink. +# A different set of Local Graphs will be shown on sub pages. +# if false, Local Graph will be default on every page as usual +enableGlobalGraph: true + +### Local Graph ### + enableLegend: false enableDrag: true enableZoom: true -depth: -1 # set to -1 to show full graph +depth: 1 # set to -1 to show full graph +scale: 1 +repelForce: 2 +centerForce: 1 +linkDistance: 1 +fontSize: 0.6 +opacityScale: 3 + +### Global Graph ### + +enableLegendGG: false +enableDragGG: true +enableZoomGG: true +depthGG: -1 # set to -1 to show full graph +scaleGG: 1.2 +repelForceGG: 1 +centerForceGG: 1 +linkDistanceGG: 1 +fontSizeGG: 0.5 +opacityScaleGG: 3 + +### Graphs ### + paths: - - /moc: "#4388cc" \ No newline at end of file + - /moc: "#4388cc" diff --git a/layouts/index.html b/layouts/index.html index 8d1ffbd4..50536142 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -19,7 +19,7 @@

    {{if .Title}}{{ .Title }}{{else}}Untitled{{end}}

    {{partial "recent.html" . }} {{end}} - {{partial "footer.html" .}} + {{partial "footerIndex.html" .}} diff --git a/layouts/partials/footerIndex.html b/layouts/partials/footerIndex.html new file mode 100644 index 00000000..36c8a8ac --- /dev/null +++ b/layouts/partials/footerIndex.html @@ -0,0 +1,28 @@ + + +
    + +{{if $.Site.Data.config.enableFooter}} + {{if $.Site.Data.graphConfig.enableGlobalGraph}} +
    + +
    + {{partial "graph.html" .}} +
    + +
    + {{else}} +
    +
    + +
    + {{partial "graph.html" .}} +
    + +
    + {{end}} +{{end}} + +{{partial "contact.html" .}} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index f10ce145..01b8fe8a 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -62,6 +62,12 @@ })) const draw = () => { + + const siteBaseURL = new URL({{$.Site.BaseURL}}); + const pathBase = siteBaseURL.pathname; + const pathWindow = window.location.pathname; + const isHome = pathBase == pathWindow ? true : false; + // 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. {{if $.Site.Data.config.enableFooter}} const container = document.getElementById("graph-container") @@ -70,14 +76,36 @@ // 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}} - ); + if (isHome && {{$.Site.Data.graphConfig.enableGlobalGraph}}) { + drawGraph( + {{strings.TrimRight "/" .Site.BaseURL}}, + {{$.Site.Data.graphConfig.paths}}, + {{$.Site.Data.graphConfig.depthGG}}, + {{$.Site.Data.graphConfig.enableDragGG}}, + {{$.Site.Data.graphConfig.enableLegendGG}}, + {{$.Site.Data.graphConfig.enableZoomGG}}, + true, + {{$.Site.Data.graphConfig.opacityScaleGG}}, + {{$.Site.Data.graphConfig.scaleGG}}, + {{$.Site.Data.graphConfig.repelForceGG}}, + {{$.Site.Data.graphConfig.fontSizeGG}} + ); + } else { + 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}}, + false, + {{$.Site.Data.graphConfig.opacityScale}}, + {{$.Site.Data.graphConfig.scale}}, + {{$.Site.Data.graphConfig.repelForce}}, + {{$.Site.Data.graphConfig.fontSize}} + ); + } + {{end}} {{if $.Site.Data.config.enableLinkPreview}} initPopover( From 1e237ef677f3b958597460175269eed4b0638112 Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Wed, 1 Jun 2022 20:15:44 +0100 Subject: [PATCH 0214/1221] change baseURL --- config.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.toml b/config.toml index 5efa9f34..6a783812 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,4 @@ -baseURL = "https://quartz.jzhao.xyz/" +baseURL = "https://dhammacharts.org/quartz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true @@ -30,4 +30,4 @@ enableGitInfo = true tabWidth = 4 [frontmatter] lastmod = ["lastmod", ":git", "date", "publishDate"] - publishDate = ["publishDate", "date"] \ No newline at end of file + publishDate = ["publishDate", "date"] From 19606ba63d15edd1e4a98bf1ce5cd510a24880e0 Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Wed, 1 Jun 2022 21:19:03 +0100 Subject: [PATCH 0215/1221] add www. --- config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 6a783812..65ffb1f2 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,4 @@ -baseURL = "https://dhammacharts.org/quartz/" +baseURL = "https://www.dhammacharts.org/quartz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true From e809896338b51e65ca862809e79884469476f2de Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Wed, 1 Jun 2022 21:22:31 +0100 Subject: [PATCH 0216/1221] increase scale --- data/graphConfig.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/graphConfig.yaml b/data/graphConfig.yaml index 7f08130d..f8b9941d 100644 --- a/data/graphConfig.yaml +++ b/data/graphConfig.yaml @@ -9,7 +9,7 @@ enableLegend: false enableDrag: true enableZoom: true depth: 1 # set to -1 to show full graph -scale: 1 +scale: 1.2 repelForce: 2 centerForce: 1 linkDistance: 1 @@ -22,7 +22,7 @@ enableLegendGG: false enableDragGG: true enableZoomGG: true depthGG: -1 # set to -1 to show full graph -scaleGG: 1.2 +scaleGG: 1.4 repelForceGG: 1 centerForceGG: 1 linkDistanceGG: 1 From ac0dd50c048d68884b0ada42e3ab0476fb29ef65 Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Wed, 1 Jun 2022 21:30:40 +0100 Subject: [PATCH 0217/1221] uncomment window.Million --- assets/js/graph.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index 48248eca..87d8d586 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -180,7 +180,7 @@ async function drawGraph( ]) const neighbourNodes = d3.selectAll(".node").filter((d) => neighbours.includes(d.id)) const currentId = d.id - // window.Million.prefetch(new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`)) + window.Million.prefetch(new URL(`${baseUrl}${decodeURI(d.id).replace(/\s+/g, "-")}/`)) const linkNodes = d3 .selectAll(".link") .filter((d) => d.source.id === currentId || d.target.id === currentId) From c0800a874980ab0f24fc2e350d70792d9c7f2956 Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Thu, 2 Jun 2022 07:45:44 +0100 Subject: [PATCH 0218/1221] change baseURL back to original --- config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 65ffb1f2..803ef1ec 100644 --- a/config.toml +++ b/config.toml @@ -1,4 +1,4 @@ -baseURL = "https://www.dhammacharts.org/quartz/" +baseURL = "https://quartz.jzhao.xyz/" languageCode = "en-us" googleAnalytics = "G-XYFD95KB4J" pygmentsUseClasses = true From d261655d96f9ed084a176ed113b0d11f1351c6de Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Thu, 2 Jun 2022 07:49:09 +0100 Subject: [PATCH 0219/1221] remove unnecessary ternary --- layouts/partials/head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 01b8fe8a..b56c2913 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -66,7 +66,7 @@ const siteBaseURL = new URL({{$.Site.BaseURL}}); const pathBase = siteBaseURL.pathname; const pathWindow = window.location.pathname; - const isHome = pathBase == pathWindow ? true : false; + const isHome = pathBase == pathWindow; // 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. {{if $.Site.Data.config.enableFooter}} From c88f31c3645bb0002171bf21850c7ca6d217c73f Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Thu, 2 Jun 2022 08:16:02 +0100 Subject: [PATCH 0220/1221] change to object destructuring for drawGraph() arguments --- assets/js/graph.js | 11 +++++----- data/graphConfig.yaml | 44 ++++++++++++++++++++------------------ layouts/partials/head.html | 22 ++++--------------- 3 files changed, 32 insertions(+), 45 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index 87d8d586..9199bef8 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -1,16 +1,15 @@ -async function drawGraph( - baseUrl, - pathColors, +async function drawGraph(baseUrl,isHome,pathColors,graphConfig) { + + let { depth, enableDrag, enableLegend, enableZoom, - isHome, opacityScale, scale, repelForce, - fontSize -) { + fontSize} = graphConfig; + const container = document.getElementById("graph-container") const { index, links, content } = await fetchData diff --git a/data/graphConfig.yaml b/data/graphConfig.yaml index f8b9941d..06ce2b08 100644 --- a/data/graphConfig.yaml +++ b/data/graphConfig.yaml @@ -5,31 +5,33 @@ enableGlobalGraph: true ### Local Graph ### -enableLegend: false -enableDrag: true -enableZoom: true -depth: 1 # set to -1 to show full graph -scale: 1.2 -repelForce: 2 -centerForce: 1 -linkDistance: 1 -fontSize: 0.6 -opacityScale: 3 +localGraph: + enableLegend: false + enableDrag: true + enableZoom: true + depth: 1 # set to -1 to show full graph + scale: 1.2 + repelForce: 2 + centerForce: 1 + linkDistance: 1 + fontSize: 0.6 + opacityScale: 3 ### Global Graph ### -enableLegendGG: false -enableDragGG: true -enableZoomGG: true -depthGG: -1 # set to -1 to show full graph -scaleGG: 1.4 -repelForceGG: 1 -centerForceGG: 1 -linkDistanceGG: 1 -fontSizeGG: 0.5 -opacityScaleGG: 3 +globalGraph: + enableLegend: false + enableDrag: true + enableZoom: true + depth: -1 # set to -1 to show full graph + scale: 1.4 + repelForce: 1 + centerForce: 1 + linkDistance: 1 + fontSize: 0.5 + opacityScale: 3 -### Graphs ### +### For all graphs ### paths: - /moc: "#4388cc" diff --git a/layouts/partials/head.html b/layouts/partials/head.html index b56c2913..ba02260e 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -79,30 +79,16 @@ if (isHome && {{$.Site.Data.graphConfig.enableGlobalGraph}}) { drawGraph( {{strings.TrimRight "/" .Site.BaseURL}}, - {{$.Site.Data.graphConfig.paths}}, - {{$.Site.Data.graphConfig.depthGG}}, - {{$.Site.Data.graphConfig.enableDragGG}}, - {{$.Site.Data.graphConfig.enableLegendGG}}, - {{$.Site.Data.graphConfig.enableZoomGG}}, true, - {{$.Site.Data.graphConfig.opacityScaleGG}}, - {{$.Site.Data.graphConfig.scaleGG}}, - {{$.Site.Data.graphConfig.repelForceGG}}, - {{$.Site.Data.graphConfig.fontSizeGG}} + {{$.Site.Data.graphConfig.paths}}, + {{$.Site.Data.graphConfig.globalGraph}} ); } else { 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}}, false, - {{$.Site.Data.graphConfig.opacityScale}}, - {{$.Site.Data.graphConfig.scale}}, - {{$.Site.Data.graphConfig.repelForce}}, - {{$.Site.Data.graphConfig.fontSize}} + {{$.Site.Data.graphConfig.paths}}, + {{$.Site.Data.graphConfig.localGraph}} ); } From a275123be2b1d528dbde23beb9880933c4e22c3e Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Thu, 2 Jun 2022 08:35:28 +0100 Subject: [PATCH 0221/1221] better font behaviour --- assets/js/graph.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index 9199bef8..f79cb3fa 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -190,7 +190,7 @@ async function drawGraph(baseUrl,isHome,pathColors,graphConfig) { // highlight links linkNodes.transition().duration(200).attr("stroke", "var(--g-link-active)") - const bigFont = fontSize+0.5 + const bigFont = fontSize*1.5 // show text for self d3.select(this.parentNode) From ab809249c8f57c1980de2fa850eef66301619307 Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Mon, 6 Jun 2022 16:42:53 +0100 Subject: [PATCH 0222/1221] Update layouts/partials/head.html Co-authored-by: Jacky Zhao --- layouts/partials/head.html | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 6eb8eaf3..b3ad28d8 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -72,21 +72,13 @@ // clear the graph in case there is anything within it container.textContent = "" - if (isHome && {{$.Site.Data.graphConfig.enableGlobalGraph}}) { - drawGraph( + const drawGlobal = isHome && {{$.Site.Data.graphConfig.enableGlobalGraph}}; + drawGraph( {{strings.TrimRight "/" .Site.BaseURL}}, - true, + drawGlobal, {{$.Site.Data.graphConfig.paths}}, - {{$.Site.Data.graphConfig.globalGraph}} + drawGlobal ? {{$.Site.Data.graphConfig.globalGraph}} : {{$.Site.Data.graphConfig.localGraph}} ); - } else { - drawGraph( - {{strings.TrimRight "/" .Site.BaseURL}}, - false, - {{$.Site.Data.graphConfig.paths}}, - {{$.Site.Data.graphConfig.localGraph}} - ); - } {{end}} From 69c74ca6b5854cbb3e7dd895dca0539f51f49720 Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Mon, 6 Jun 2022 16:48:16 +0100 Subject: [PATCH 0223/1221] minor adjustment --- assets/js/graph.js | 2 +- layouts/partials/footerIndex.html | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/assets/js/graph.js b/assets/js/graph.js index f79cb3fa..174d4946 100644 --- a/assets/js/graph.js +++ b/assets/js/graph.js @@ -1,4 +1,4 @@ -async function drawGraph(baseUrl,isHome,pathColors,graphConfig) { +async function drawGraph(baseUrl, isHome, pathColors, graphConfig) { let { depth, diff --git a/layouts/partials/footerIndex.html b/layouts/partials/footerIndex.html index 36c8a8ac..5f190446 100644 --- a/layouts/partials/footerIndex.html +++ b/layouts/partials/footerIndex.html @@ -1,7 +1,3 @@ - - -
    - {{if $.Site.Data.config.enableFooter}} {{if $.Site.Data.graphConfig.enableGlobalGraph}}
    From 52a185f73b18d8e5a564c2144401de750b0e025a Mon Sep 17 00:00:00 2001 From: DhammaCharts <100090806+DhammaCharts@users.noreply.github.com> Date: Mon, 6 Jun 2022 16:49:01 +0100 Subject: [PATCH 0224/1221] change enableGlobalGraph to false --- data/graphConfig.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/graphConfig.yaml b/data/graphConfig.yaml index 06ce2b08..a6f916ac 100644 --- a/data/graphConfig.yaml +++ b/data/graphConfig.yaml @@ -1,7 +1,7 @@ # if true, a Global Graph will be shown on home page with full width, no backlink. # A different set of Local Graphs will be shown on sub pages. # if false, Local Graph will be default on every page as usual -enableGlobalGraph: true +enableGlobalGraph: false ### Local Graph ### From 473ea2c66f9122cec2647c281ca47cc073ca5fd0 Mon Sep 17 00:00:00 2001 From: Geoffrey Garrett Date: Mon, 27 Jun 2022 22:04:32 +0200 Subject: [PATCH 0225/1221] feat(layouts/partials/head.html): Adds general favicon support with dict and string input format --- layouts/partials/head.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index b3ad28d8..7b8bb4eb 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -10,7 +10,17 @@ end }} - + + + {{ $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 }} + + {{- end }} + {{ end }} Date: Mon, 27 Jun 2022 22:05:35 +0200 Subject: [PATCH 0226/1221] docs(content/notes/config.md): Adds documentation for the new favicon support --- content/notes/config.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/content/notes/config.md b/content/notes/config.md index d04b1528..691e1874 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -23,6 +23,40 @@ links: # Links to show in footer link: https://github.com/jackyzha0 ``` +### HTML Favicons + +If you would like to customize the favicons of your website, you can add them to the `data/config.yaml` file. The default without any set `favicon` key is: + +```html + +``` + +The default can be overridden by defining a value to the `favicon` key in your `data/config.yaml` file. Here is a `List[Dictionary]` example format, which is equivalent to the default: + +```yaml +favicon: + - { rel: "shortcut icon", href: "icon.png", type: "image/png" } +``` + +In this format, the following keys are available: +- `rel`: The `rel` attribute of the `` tag. +- `type`: The `type` attribute of the `` tag. +- `href` (optional): The `href` attribute of the `` tag. +- `sizes` (optional): The `sizes` attribute of the `` tag. + +If you plan to add multiple favicons generated by a website, it may be easier to define it as HTML: + +```yaml +favicon: | + +``` + +Some websites that **generate favicons** for you (ordered alphabetically) include: +- [`favicon.io`](https://favicon.io/) +- [`realfavicongenerator.net`](https://realfavicongenerator.net/) +- [`www.favicon.cc`](https://www.favicon.cc/) + + ### Graph View To customize the Interactive Graph view, you can poke around `data/graphConfig.yaml`. From 997937af5a6dc317da56ae294dce927ec5930a4b Mon Sep 17 00:00:00 2001 From: Geoffrey Garrett Date: Tue, 28 Jun 2022 00:45:48 +0200 Subject: [PATCH 0227/1221] docs(config.md): Added short explainer on favicons --- content/notes/config.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/content/notes/config.md b/content/notes/config.md index 691e1874..8c758edd 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -25,7 +25,13 @@ links: # Links to show in footer ### HTML Favicons -If you would like to customize the favicons of your website, you can add them to the `data/config.yaml` file. The default without any set `favicon` key is: +A Favicon is most commonly seen preceding the URL in a browser. Some +other examples include (but are not limited to) bookmarks, search history, and +app icons (i.e. "save page to homescreen" on mobile devices). [File format support](https://en.wikipedia.org/wiki/Favicon#File_format_support) +and the [use of favicons](https://en.wikipedia.org/wiki/Favicon#Use_of_favicon) differ +across the combination of platforms and browsers. + +If you would like to customize the favicons of your website, you can add them to the `data/config.yaml` file. The **default** without any set `favicon` key is: ```html From 7070a1992a6c9462d50afcc7139f8f97e1dce2b8 Mon Sep 17 00:00:00 2001 From: Geoffrey Garrett Date: Tue, 28 Jun 2022 01:15:33 +0200 Subject: [PATCH 0228/1221] docs(config.md): Fixed multi-favicon examples and general favicon explanation throughout --- content/notes/config.md | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/content/notes/config.md b/content/notes/config.md index 8c758edd..c9cbd0a4 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -25,23 +25,29 @@ links: # Links to show in footer ### HTML Favicons -A Favicon is most commonly seen preceding the URL in a browser. Some -other examples include (but are not limited to) bookmarks, search history, and -app icons (i.e. "save page to homescreen" on mobile devices). [File format support](https://en.wikipedia.org/wiki/Favicon#File_format_support) -and the [use of favicons](https://en.wikipedia.org/wiki/Favicon#Use_of_favicon) differ -across the combination of platforms and browsers. +A Favicon is most commonly seen as the **image preceding the URL in a browser**. +Some other examples include (but are not limited to) bookmarks, search history, +and app icons (i.e. "save page to home screen" on mobile devices). +[File format support](https://en.wikipedia.org/wiki/Favicon#File_format_support) +and the [use of favicons](https://en.wikipedia.org/wiki/Favicon#Use_of_favicon) +differ across the combination of platforms and browsers. -If you would like to customize the favicons of your website, you can add them to the `data/config.yaml` file. The **default** without any set `favicon` key is: +If you would like to customize the favicons of your quartz-based website, you +can add them to the `data/config.yaml` file. The **default** without any set +`favicon` key is: ```html ``` -The default can be overridden by defining a value to the `favicon` key in your `data/config.yaml` file. Here is a `List[Dictionary]` example format, which is equivalent to the default: +The default can be overridden by defining a value to the `favicon` key in your +`data/config.yaml` file. Here is a `List[Dictionary]` example format, which is +equivalent to the default: ```yaml favicon: - { rel: "shortcut icon", href: "icon.png", type: "image/png" } +# - { ... } # Repeat for each additional favicon you want to add ``` In this format, the following keys are available: @@ -50,18 +56,34 @@ In this format, the following keys are available: - `href` (optional): The `href` attribute of the `` tag. - `sizes` (optional): The `sizes` attribute of the `` tag. -If you plan to add multiple favicons generated by a website, it may be easier to define it as HTML: +If you plan to add multiple favicons generated by a website (see list below), it +may be easier to define it as HTML. Here is an example which appends the +**Apple touch icon** to quartz's default favicon: ```yaml favicon: | + ``` +This second favicon will now be used as a web page icon when someone adds your +webpage to the home screen of their Apple device. If you are interested in more +information about the current, and past, standards of favicons, you can read +[this article](https://www.emergeinteractive.com/insights/detail/the-essentials-of-favicons/). + Some websites that **generate favicons** for you (ordered alphabetically) include: - [`favicon.io`](https://favicon.io/) - [`realfavicongenerator.net`](https://realfavicongenerator.net/) - [`www.favicon.cc`](https://www.favicon.cc/) +These sites will take a base image and generate a set of favicons for you, +one of which will be, for example, the `apple-touch-icon` favicon. These sites +will often **also provide the HTML** for the favicon, which can be simply +added to the `data/config.yaml` using the HTML format of the `favicon` +argument. + +**Note** that all generated favicon paths, defined by the `href` +attribute, are relative to the `static/` directory. ### Graph View To customize the Interactive Graph view, you can poke around `data/graphConfig.yaml`. From b732293f65999e9a1d3a40a5ddeccf53a385b1f3 Mon Sep 17 00:00:00 2001 From: Geoffrey Garrett Date: Tue, 28 Jun 2022 01:21:22 +0200 Subject: [PATCH 0229/1221] fix(head.html): Adds robustness to `config.yaml` favicon definitions Initially assumed that `href` definitions should have `/...` as their pattern, and `baseURL` would always end with `/`, however the omission of `/` as the prefix of the former and suffix of the latter simultaneously, would result in broken favicon paths. Final comment: `..///...` is not breaking, which is worst case scenario with this fix. --- layouts/partials/head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 7b8bb4eb..d33a0c7b 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -18,7 +18,7 @@ {{ $favicon | safeHTML }} {{ else }} {{ range $favicon }} - + {{- end }} {{ end }} From 67a7ba37e899ca0555fa37e159af6d599cf468ee Mon Sep 17 00:00:00 2001 From: Aiden Bai Date: Tue, 28 Jun 2022 21:43:28 -0700 Subject: [PATCH 0230/1221] Bump million to 1.11.3 --- assets/js/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/router.js b/assets/js/router.js index 3bdc8102..b2b6d211 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -3,7 +3,7 @@ import { navigate, prefetch, router, -} from "https://unpkg.com/million@1.9.8-0/dist/router.mjs" +} from "https://unpkg.com/million@1.11.3/dist/router.mjs" export const attachSPARouting = (init, rerender) => { // Attach SPA functions to the global Million namespace From f2078ee621b7137c49b176156ff70ddb5359d5a8 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 29 Jun 2022 16:12:33 -0700 Subject: [PATCH 0231/1221] fix: prefix images with base url for non-root quartz --- layouts/_default/_markup/render-image.html | 2 +- layouts/partials/head.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html index ff4e8b39..8dda6a8c 100644 --- a/layouts/_default/_markup/render-image.html +++ b/layouts/_default/_markup/render-image.html @@ -4,5 +4,5 @@ {{ .Text }} {{- else -}} {{$fixedUrl := (cond (hasPrefix $src "/") $src (print "/" $src)) | urlize}} -{{ .Text }} +{{ .Text }} {{- end -}} diff --git a/layouts/partials/head.html b/layouts/partials/head.html index d33a0c7b..a364cca2 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -70,7 +70,7 @@ 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({{$.Site.BaseURL}}); + const siteBaseURL = new URL(BASE_URL); const pathBase = siteBaseURL.pathname; const pathWindow = window.location.pathname; const isHome = pathBase == pathWindow; From 200c60514207d7970968e31740797fad76f56ee7 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 29 Jun 2022 16:16:06 -0700 Subject: [PATCH 0232/1221] feat: enable raw html by default (fixes #143) --- config.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.toml b/config.toml index 803ef1ec..94c2f9b4 100644 --- a/config.toml +++ b/config.toml @@ -31,3 +31,5 @@ enableGitInfo = true [frontmatter] lastmod = ["lastmod", ":git", "date", "publishDate"] publishDate = ["publishDate", "date"] + [markup.goldmark.renderer] + unsafe = true From 8a100edeb81382dc838f600ee1b8dbd3e7560e37 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 29 Jun 2022 16:57:36 -0700 Subject: [PATCH 0233/1221] docs: polish and update --- content/_index.md | 11 ++- content/notes/config.md | 125 ++++++++++++++++++++++--------- content/notes/editing.md | 29 ++++--- content/notes/hosting.md | 12 ++- content/notes/obsidian.md | 3 + content/notes/preview changes.md | 11 +-- content/notes/setup.md | 30 +------- content/notes/updating.md | 34 +++++++++ 8 files changed, 159 insertions(+), 96 deletions(-) create mode 100644 content/notes/updating.md diff --git a/content/_index.md b/content/_index.md index bd742c4d..7d6d3f98 100644 --- a/content/_index.md +++ b/content/_index.md @@ -11,17 +11,16 @@ Host your second brain and [digital garden](https://jzhao.xyz/posts/networked-th 5. Support for both Markdown Links and Wikilinks ## Get Started -> 📚 [Setup your own digital garden using Quartz](notes/setup.md) +> 📚 Step 1: [Setup your own digital garden using Quartz](notes/setup.md) Not convinced yet? Look at some [community digital gardens](notes/showcase.md) built with Quartz, or read about [why I made Quartz](notes/philosophy.md) to begin with. -## Content Lists -If you prefer browsing the contents of this site through a list instead of a graph, you can find content lists here too: +Returning user? Figure out how to [[notes/updating|update]] your existing Quartz garden. -- [All Notes](/notes) -- [Setup-related Notes](/tags/setup) +### Content Lists +If you prefer browsing the contents of this site through a list instead of a graph, you see a list of all [setup-related notes](/tags/setup). -## Troubleshooting +### Troubleshooting - 🚧 [Troubleshooting and FAQ](notes/troubleshooting.md) - 🐛 [Submit an Issue](https://github.com/jackyzha0/quartz/issues) - 👀 [Discord Community](https://discord.gg/cRFFHYye7t) diff --git a/content/notes/config.md b/content/notes/config.md index c9cbd0a4..6e18073c 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -2,6 +2,7 @@ title: "Configuration" tags: - setup +weight: 5 --- ## Configuration @@ -10,13 +11,49 @@ Quartz is designed to be extremely configurable. You can find the bulk of the co The majority of configuration can be be found under `data/config.yaml`. An annotated example configuration is shown below. ```yaml -name: Your name here! # Shows in the footer -enableToc: true # Whether to show a Table of Contents -enableLinkPreview: true # whether to render card previews for links -description: Page description to show to search engines -page_title: Quartz Example Page # Default Page Title +# The name to display in the footer +name: Jacky Zhao -links: # Links to show in footer +# whether to globally show the table of contents on each page +# this can be turned off on a per-page basis by adding this to the +# front-matter of that note +enableToc: true + +# whether to by-default open or close the table of contents on each page +openToc: false + +# whether to display on-hover link preview cards +enableLinkPreview: true + +# whether to try to process Latex +enableLatex: true + +# whether to enable single-page-app style rendering +# this prevents flahses of unstyled content and overall improves +# smoothness of quartz. More info in issue #109 on GitHub +enableSPA: true + +# whether to render a footer +enableFooter: true + +# whether backlinks of pages should show the context in which +# they were mentioned +enableContextualBacklinks: true + +# whether to show a section of recent notes on the home page +enableRecentNotes: false + +# page description used for SEO +description: + Host your second brain and digital garden for free. Quartz features extremely fast full-text search, + Wikilink support, backlinks, local graph, tags, and link previews. + +# title of the home page (also for SEO) +page_title: + "🪴 Quartz 3.2" + +# links to show in the footer +links: - link_name: Twitter link: https://twitter.com/_jzhao - link_name: Github @@ -24,14 +61,6 @@ links: # Links to show in footer ``` ### HTML Favicons - -A Favicon is most commonly seen as the **image preceding the URL in a browser**. -Some other examples include (but are not limited to) bookmarks, search history, -and app icons (i.e. "save page to home screen" on mobile devices). -[File format support](https://en.wikipedia.org/wiki/Favicon#File_format_support) -and the [use of favicons](https://en.wikipedia.org/wiki/Favicon#Use_of_favicon) -differ across the combination of platforms and browsers. - If you would like to customize the favicons of your quartz-based website, you can add them to the `data/config.yaml` file. The **default** without any set `favicon` key is: @@ -50,11 +79,7 @@ favicon: # - { ... } # Repeat for each additional favicon you want to add ``` -In this format, the following keys are available: -- `rel`: The `rel` attribute of the `` tag. -- `type`: The `type` attribute of the `` tag. -- `href` (optional): The `href` attribute of the `` tag. -- `sizes` (optional): The `sizes` attribute of the `` tag. +In this format, the keys are identical to their HTML representations. If you plan to add multiple favicons generated by a website (see list below), it may be easier to define it as HTML. Here is an example which appends the @@ -71,17 +96,6 @@ webpage to the home screen of their Apple device. If you are interested in more information about the current, and past, standards of favicons, you can read [this article](https://www.emergeinteractive.com/insights/detail/the-essentials-of-favicons/). -Some websites that **generate favicons** for you (ordered alphabetically) include: -- [`favicon.io`](https://favicon.io/) -- [`realfavicongenerator.net`](https://realfavicongenerator.net/) -- [`www.favicon.cc`](https://www.favicon.cc/) - -These sites will take a base image and generate a set of favicons for you, -one of which will be, for example, the `apple-touch-icon` favicon. These sites -will often **also provide the HTML** for the favicon, which can be simply -added to the `data/config.yaml` using the HTML format of the `favicon` -argument. - **Note** that all generated favicon paths, defined by the `href` attribute, are relative to the `static/` directory. @@ -89,11 +103,50 @@ attribute, are relative to the `static/` directory. To customize the Interactive Graph view, you can poke around `data/graphConfig.yaml`. ```yaml -enableLegend: false # automatically generate a legend -enableDrag: true # allow dragging nodes in the graph -enableZoom: true # allow zooming and panning the graph -depth: -1 # how many neighbours of the current node to show (-1 is all nodes) -paths: # colour specific nodes path off of their path +# if true, a Global Graph will be shown on home page with full width, no backlink. +# A different set of Local Graphs will be shown on sub pages. +# if false, Local Graph will be default on every page as usual +enableGlobalGraph: false + +### Local Graph ### +localGraph: + # whether automatically generate a legend + enableLegend: false + + # whether to allow dragging nodes in the graph + enableDrag: true + + # whether to allow zooming and panning the graph + enableZoom: true + + # how many neighbours of the current node to show (-1 is all nodes) + depth: 1 + + # initial zoom factor of the graph + scale: 1.2 + + # how strongly nodes should repel each other + repelForce: 2 + + # how strongly should nodes be attracted to the center of gravity + centerForce: 1 + + # what the default link length should be + linkDistance: 1 + + # how big the node labels should be + fontSize: 0.6 + + # scale at which to start fading the labes on nodes + opacityScale: 3 + +### Global Graph ### +globalGraph: + # same settings as above + +### For all graphs ### +# colour specific nodes path off of their path +paths: - /moc: "#4388cc" ``` @@ -110,7 +163,7 @@ More info about partials on [Hugo's website.](https://gohugo.io/templates/partia Still having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md). -## Multilingual +## Language Support [CJK + Latex Support (测试)](notes/CJK%20+%20Latex%20Support%20(测试).md) comes out of the box with Quartz. Want to support languages that read from right-to-left (like Arabic)? Hugo (and by proxy, Quartz) supports this natively. diff --git a/content/notes/editing.md b/content/notes/editing.md index c8cefa0c..af7dd771 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -2,29 +2,18 @@ title: "Editing Content in Quartz" tags: - setup +weight: 1 --- ## Editing Quartz runs on top of [Hugo](https://gohugo.io/) so all notes are written in [Markdown](https://www.markdownguide.org/getting-started/). -### Obsidian -I recommend using [Obsidian](http://obsidian.md/) as a way to edit and grow your digital garden. It comes with a really nice editor and graphical interface to preview all of your local files. - -This step is **highly recommended**. - -🔗 [How to setup your Obsidian Vault to work with Quartz](notes/obsidian.md) - -### Ignoring Files -Only want to publish a subset of all of your notes? Don't worry, Quartz makes this a simple two-step process. - -❌ [Excluding pages from being published](notes/ignore%20notes.md) - ### Folder Structure Here's a rough overview of what's what. **All content in your garden can found in the `/content` folder.** To make edits, you can open any of the files and make changes directly and save it. You can organize content into any folder you'd like. -**To edit the main home page, open `/content/_index.md`.* +**To edit the main home page, open `/content/_index.md`.** To create a link between notes in your garden, just create a normal link using Markdown pointing to the document in question. Please note that **all links should be relative to the root `/content` path**. @@ -40,6 +29,8 @@ Example image (source is in content/notes/images/example.png) ![Example Image](/content/notes/images/example.png) ``` +You can also use wikilinks if that is what you are more comfortable with! + ### Front Matter Hugo is picky when it comes to metadata for files. Make sure that your title is double-quoted and that you have a title defined at the top of your file like so. You can also add tags here as well. @@ -48,22 +39,28 @@ Hugo is picky when it comes to metadata for files. Make sure that your title is title: "Example Title" tags: - example-tag -enableToc: false # do not show a table of contents on this page --- Rest of your content here... ``` +### Obsidian +I recommend using [Obsidian](http://obsidian.md/) as a way to edit and grow your digital garden. It comes with a really nice editor and graphical interface to preview all of your local files. + +This step is **highly recommended**. + +> 🔗 Step 3: [How to setup your Obsidian Vault to work with Quartz](notes/obsidian.md) + ## Previewing Changes This step is purely optional and mostly for those who want to see the published version of their digital garden locally before opening it up to the internet. This is *highly recommended* but not required. -👀 [Preview Quartz Changes](notes/preview%20changes.md) +> 👀 Step 4: [Preview Quartz Changes](notes/preview%20changes.md) For those who like to live life more on the edge, viewing the garden through Obsidian gets you pretty close to the real thing. ## Publishing Changes Now that you know the basics of managing your digital garden using Quartz, you can publish it to the internet! -🌍 [Hosting Quartz online!](notes/hosting.md) +> 🌍 Step 5: [Hosting Quartz online!](notes/hosting.md) Having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md). diff --git a/content/notes/hosting.md b/content/notes/hosting.md index bb1d912e..adda82d4 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -2,6 +2,7 @@ title: "Deploying Quartz to the Web" tags: - setup +weight: 4 --- ## GitHub Pages @@ -41,7 +42,7 @@ Note: we specifically push to the `hugo` branch here. Our GitHub action automati ### Setting up the Site Now let's get this site up and running. Never hosted a site before? No problem. Have a fancy custom domain you already own or want to subdomain your Quartz? That's easy too. -Here, we take advantage of GitHub's free page hosting to deploy our site. Change `baseURL` in `/config.toml`. +Here, we take advantage of GitHub's free page hosting to deploy our site. Change `baseURL` in `/config.toml`. Make sure that your `baseURL` has a trailing `/`! @@ -51,7 +52,7 @@ Make sure that your `baseURL` has a trailing `/`! baseURL = "https:///" ``` -If you are using this under a subdomain (e.g. `.github.io/quartz`), include the trailing `/`. +If you are using this under a subdomain (e.g. `.github.io/quartz`), include the trailing `/`. **You need to do this especially if you are using GitHub!** ```toml baseURL = "https://.github.io/quartz/" @@ -75,10 +76,15 @@ Please note that the `cname` field should *not* have any path `e.g. end with /qu Have a custom domain? [Learn how to set it up with Quartz ](notes/custom%20Domain.md). +### Ignoring Files +Only want to publish a subset of all of your notes? Don't worry, Quartz makes this a simple two-step process. + +❌ [Excluding pages from being published](notes/ignore%20notes.md) + --- Now that your Quartz is live, let's figure out how to make Quartz really *yours*! -🎨 [Customizing Quartz](notes/config.md) +> Step 6: 🎨 [Customizing Quartz](notes/config.md) Having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md). diff --git a/content/notes/obsidian.md b/content/notes/obsidian.md index 8e5fedd8..66cd78d9 100644 --- a/content/notes/obsidian.md +++ b/content/notes/obsidian.md @@ -2,6 +2,7 @@ title: "Obsidian Vault Integration" tags: - setup +weight: 2 --- ## Setup @@ -27,3 +28,5 @@ Inserting front matter everytime you want to create a new Note gets annoying rea **If you decide to overwrite the `/content` folder completely, don't remove the `/content/templates` folder!** Head over to Options > Core Plugins and enable the Templates plugin. Then go to Options > Hotkeys and set a hotkey for 'Insert Template' (I recommend `[cmd]+T`). That way, when you create a new note, you can just press the hotkey for a new template and be ready to go! + +> 👀 Step 4: [Preview Quartz Changes](notes/preview%20changes.md) \ No newline at end of file diff --git a/content/notes/preview changes.md b/content/notes/preview changes.md index 7f12f305..3130c58e 100644 --- a/content/notes/preview changes.md +++ b/content/notes/preview changes.md @@ -1,5 +1,6 @@ --- title: "Preview Changes" +weight: 3 --- If you'd like to preview what your Quartz site looks like before deploying it to the internet, here's exactly how to do that! @@ -12,12 +13,6 @@ This step will generate the list of backlinks for Hugo to parse. Ensure you have ```shell # Install and link `hugo-obsidian` locally $ go install github.com/jackyzha0/hugo-obsidian@latest - -# Navigate to your local Quartz folder -$ cd - -# Scrape all links in your Quartz folder and generate info for Quartz -$ hugo-obsidian -input=content -output=assets/indices -index -root=. ``` If you are running into an error saying that `command not found: hugo-obsidian`, make sure you set your `GOPATH` correctly! This will allow your terminal to correctly recognize hugo-obsidian as an executable. @@ -32,7 +27,9 @@ Hugo is the static site generator that powers Quartz. [Install Hugo with "extend $ cd # Start local server -$ hugo server +$ make serve # View your site in a browser at http://localhost:1313/ ``` + +> 🌍 Step 5: [Hosting Quartz online!](notes/hosting.md) \ No newline at end of file diff --git a/content/notes/setup.md b/content/notes/setup.md index 495a43b6..fffb0fb2 100644 --- a/content/notes/setup.md +++ b/content/notes/setup.md @@ -2,6 +2,7 @@ title: "Setup" tags: - setup +weight: 0 --- ## Making your own Quartz @@ -26,33 +27,6 @@ $ git clone https://github.com/YOUR-USERNAME/quartz ## Editing Great! Now you have everything you need to start editing and growing your digital garden. If you're ready to start writing content already, check out the recommended flow for editing notes in Quartz. -✏️ [Editing Notes in Quartz](notes/editing.md) +> ✏️ Step 2: [Editing Notes in Quartz](notes/editing.md) Having problems? Checkout our [FAQ and Troubleshooting guide](notes/troubleshooting.md). - -## Updating -Haven't updated Quartz in a while and want all the cool new optimizations? On Unix/Mac systems you can run the following command for a one-line update! This command will show you a log summary of all commits since you last updated, press `q` to acknowledge this. Then, it will show you each change in turn and press `y` to accept the patch or `n` to reject it. Usually you should press `y` for most of these unless it conflicts with existing changes you've made! - -```shell -make update - -# or, if you don't want the interactive parts and just want the update -make update-force -``` - -Or, manually checkout the changes yourself. - -> ⚠️ **WARNING** ⚠️ -> -> If you customized the files in `data/`, or anything inside `layouts/`, your customization may be overwritten! -> Make sure you have a copy of these changes if you don't want to lose them. - - -```shell -# add Quartz as a remote host -git remote add upstream git@github.com:jackyzha0/quartz.git - -# index and fetch changes -git fetch upstream -git checkout -p upstream/hugo -- layouts .github Makefile assets/js assets/styles/base.scss assets/styles/darkmode.scss config.toml data -``` diff --git a/content/notes/updating.md b/content/notes/updating.md new file mode 100644 index 00000000..290d6475 --- /dev/null +++ b/content/notes/updating.md @@ -0,0 +1,34 @@ +--- +title: "Updating" +aliases: +- update +--- + +Haven't updated Quartz in a while and want all the cool new optimizations? On Unix/Mac systems you can run the following command for a one-line update! This command will show you a log summary of all commits since you last updated, press `q` to acknowledge this. Then, it will show you each change in turn and press `y` to accept the patch or `n` to reject it. Usually you should press `y` for most of these unless it conflicts with existing changes you've made! + +```shell +make update +``` + +Or, if you don't want the interactive parts and just want to force update your local garden (this assumed that you are okay with some of your personalizations been overriden!) + +```shell +make update-force +``` + +Or, manually checkout the changes yourself. + +> ⚠️ **WARNING** ⚠️ +> +> If you customized the files in `data/`, or anything inside `layouts/`, your customization may be overwritten! +> Make sure you have a copy of these changes if you don't want to lose them. + + +```shell +# add Quartz as a remote host +git remote add upstream git@github.com:jackyzha0/quartz.git + +# index and fetch changes +git fetch upstream +git checkout -p upstream/hugo -- layouts .github Makefile assets/js assets/styles/base.scss assets/styles/darkmode.scss config.toml data +``` From 2b0482ae4c5ef7d5c7cc5d33419c1fb440c0238a Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 29 Jun 2022 17:03:41 -0700 Subject: [PATCH 0234/1221] docs: fix page weight --- content/notes/config.md | 4 +++- content/notes/editing.md | 2 +- content/notes/hosting.md | 2 +- content/notes/obsidian.md | 2 +- content/notes/preview changes.md | 4 +++- content/notes/setup.md | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/content/notes/config.md b/content/notes/config.md index 6e18073c..320a16d9 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -2,7 +2,7 @@ title: "Configuration" tags: - setup -weight: 5 +weight: 0 --- ## Configuration @@ -180,3 +180,5 @@ defaultContentLanguage = 'ar' title = 'مدونتي' weight = 1 ``` + +[[setup]] \ No newline at end of file diff --git a/content/notes/editing.md b/content/notes/editing.md index af7dd771..53f537c8 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -2,7 +2,7 @@ title: "Editing Content in Quartz" tags: - setup -weight: 1 +weight: -4 --- ## Editing diff --git a/content/notes/hosting.md b/content/notes/hosting.md index adda82d4..d46aff65 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -2,7 +2,7 @@ title: "Deploying Quartz to the Web" tags: - setup -weight: 4 +weight: -1 --- ## GitHub Pages diff --git a/content/notes/obsidian.md b/content/notes/obsidian.md index 66cd78d9..c709a70d 100644 --- a/content/notes/obsidian.md +++ b/content/notes/obsidian.md @@ -2,7 +2,7 @@ title: "Obsidian Vault Integration" tags: - setup -weight: 2 +weight: -3 --- ## Setup diff --git a/content/notes/preview changes.md b/content/notes/preview changes.md index 3130c58e..d7e2770e 100644 --- a/content/notes/preview changes.md +++ b/content/notes/preview changes.md @@ -1,6 +1,8 @@ --- title: "Preview Changes" -weight: 3 +tags: +- setup +weight: -2 --- If you'd like to preview what your Quartz site looks like before deploying it to the internet, here's exactly how to do that! diff --git a/content/notes/setup.md b/content/notes/setup.md index fffb0fb2..12df750e 100644 --- a/content/notes/setup.md +++ b/content/notes/setup.md @@ -2,7 +2,7 @@ title: "Setup" tags: - setup -weight: 0 +weight: -5 --- ## Making your own Quartz From e884f4927f3e48285ca6689507f5e0f61072de04 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 29 Jun 2022 17:17:53 -0700 Subject: [PATCH 0235/1221] fix: anchor formatting (closes #141) --- content/notes/config.md | 4 +--- content/notes/editing.md | 2 +- layouts/partials/textprocessing.html | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/content/notes/config.md b/content/notes/config.md index 320a16d9..2c1e352f 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -179,6 +179,4 @@ defaultContentLanguage = 'ar' languagedirection = 'rtl' title = 'مدونتي' weight = 1 -``` - -[[setup]] \ No newline at end of file +``` \ No newline at end of file diff --git a/content/notes/editing.md b/content/notes/editing.md index 53f537c8..4aaf5856 100644 --- a/content/notes/editing.md +++ b/content/notes/editing.md @@ -34,7 +34,7 @@ You can also use wikilinks if that is what you are more comfortable with! ### Front Matter Hugo is picky when it comes to metadata for files. Make sure that your title is double-quoted and that you have a title defined at the top of your file like so. You can also add tags here as well. -```markdown +```yaml --- title: "Example Title" tags: diff --git a/layouts/partials/textprocessing.html b/layouts/partials/textprocessing.html index 8e8c9991..56e2e8ba 100644 --- a/layouts/partials/textprocessing.html +++ b/layouts/partials/textprocessing.html @@ -39,7 +39,7 @@ {{$reference := split $path "#"}} {{$title := index $reference 0}} {{$block := default "" (index $reference 1)}} - {{$block = strings.TrimRight "/" (cond (eq $block "") $block (printf "#%s" $block))}} + {{$block = strings.TrimRight "/" (cond (eq $block "") $block (printf "#%s" $block)) | urlize | lower}} {{$href := strings.TrimRight "/" ($page.GetPage $title).RelPermalink}} {{$display := default $title (index $split 1)}} {{if not $href}} @@ -54,7 +54,7 @@ {{end}} {{end}} -{{/* Add copyable anchors */}} +{{/* Add jumpable anchors */}} {{ $content = $content | replaceRE "()(.+)()" `${1}# ${3}${4}` }} {{ $content | safeHTML }} From 8b2fba895aa804e895eaa02a622f318113a35663 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 29 Jun 2022 17:34:05 -0700 Subject: [PATCH 0236/1221] feat: image scaling (closes #131) --- assets/styles/base.scss | 2 +- content/notes/hosting.md | 6 +++++- layouts/partials/textprocessing.html | 6 ++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/assets/styles/base.scss b/assets/styles/base.scss index 1c353f33..776f32d7 100644 --- a/assets/styles/base.scss +++ b/assets/styles/base.scss @@ -85,7 +85,7 @@ table { } img { - width: 100%; + max-width: 100%; border-radius: 3px; margin: 1em 0; } diff --git a/content/notes/hosting.md b/content/notes/hosting.md index d46aff65..8db27466 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -3,9 +3,11 @@ title: "Deploying Quartz to the Web" tags: - setup weight: -1 +aliases: +- hosting --- -## GitHub Pages +## Hosting on GitHub Pages Quartz is designed to be effortless to deploy. If you forked and cloned Quartz directly from the repository, everything should already be good to go! Follow the steps below. ### Enable GitHub Actions @@ -13,6 +15,8 @@ By default, GitHub disables workflows from running automatically on Forked Repos ![Enable GitHub Actions](notes/images/github-actions.png)*Enable GitHub Actions* +![[notes/images/github-actions.png|200]] + ### Enable GitHub Pages Head to the 'Settings' tab of your forked repository and go to the 'Pages' tab. diff --git a/layouts/partials/textprocessing.html b/layouts/partials/textprocessing.html index 56e2e8ba..dfb0ff2e 100644 --- a/layouts/partials/textprocessing.html +++ b/layouts/partials/textprocessing.html @@ -27,10 +27,8 @@ {{$inner := . | strings.TrimPrefix "![[" | strings.TrimSuffix "]]" }} {{$split := split $inner "|"}} {{$path := index $split 0 | relURL}} - {{$reference := split $path "#"}} - {{$title := index $reference 0}} - {{$display := default $title (index $split 1)}} - {{$img := printf "" $path $display}} + {{$width := index $split 1}} + {{$img := printf "" $path (default "auto" $width)}} {{$content = replace $content . $img}} {{else}} {{$inner := . | strings.TrimPrefix "[[" | strings.TrimSuffix "]]" }} From 0896814959e912cabaf9ec83bc0a3eb77d152842 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 29 Jun 2022 17:35:29 -0700 Subject: [PATCH 0237/1221] docs: remove test image from hosting --- content/notes/hosting.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 8db27466..70f9d04c 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -15,8 +15,6 @@ By default, GitHub disables workflows from running automatically on Forked Repos ![Enable GitHub Actions](notes/images/github-actions.png)*Enable GitHub Actions* -![[notes/images/github-actions.png|200]] - ### Enable GitHub Pages Head to the 'Settings' tab of your forked repository and go to the 'Pages' tab. From 8d7a7b712f5a4ee49e3687de8fb00f76d7571368 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 1 Jul 2022 11:02:42 -0700 Subject: [PATCH 0238/1221] fix: non-SPA fn defs (closes #154) --- layouts/partials/head.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index a364cca2..d0630a20 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -127,8 +127,11 @@ navigate: (url) => (window.location.href = url), prefetch: () => {}, } - init() - render() + + window.addEventListener("DOMContentLoaded", () => { + init() + render() + }) {{end}} From d3e20b8b94c9229e94fccbe54c867efde6847c6e Mon Sep 17 00:00:00 2001 From: Geoffrey Garrett Date: Fri, 1 Jul 2022 20:03:52 +0200 Subject: [PATCH 0239/1221] Added optional rendering of code block titles (#148) --- assets/js/code-title.js | 13 +++ assets/js/darkmode.js | 12 ++- assets/styles/_dark_syntax.scss | 85 +++++++++++++++++++ assets/styles/_light_syntax.scss | 85 +++++++++++++++++++ assets/styles/code-title.scss | 20 +++++ assets/styles/syntax.scss | 139 +++++++++++-------------------- content/notes/config.md | 44 ++++++++-- data/config.yaml | 1 + layouts/partials/head.html | 24 +++++- 9 files changed, 321 insertions(+), 102 deletions(-) create mode 100644 assets/js/code-title.js create mode 100644 assets/styles/_dark_syntax.scss create mode 100644 assets/styles/_light_syntax.scss create mode 100644 assets/styles/code-title.scss diff --git a/assets/js/code-title.js b/assets/js/code-title.js new file mode 100644 index 00000000..698edc9b --- /dev/null +++ b/assets/js/code-title.js @@ -0,0 +1,13 @@ + +function addTitleToCodeBlocks() { + var els = document.getElementsByClassName("highlight"); + for (var i = 0; i < els.length; i++) { + if (els[i].title.length) { + let div = document.createElement("div"); + if (els[i].getElementsByClassName("code-title").length) continue; + div.textContent=els[i].title; + div.classList.add("code-title") + els[i].insertBefore(div, els[i].firstChild); + } + } +}; diff --git a/assets/js/darkmode.js b/assets/js/darkmode.js index d95a281a..11ce15f7 100644 --- a/assets/js/darkmode.js +++ b/assets/js/darkmode.js @@ -1,18 +1,26 @@ const userPref = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark' const currentTheme = localStorage.getItem('theme') ?? userPref +const syntaxTheme = document.querySelector("#theme-link"); + + +{{ $darkSyntax := resources.Get "styles/_dark_syntax.scss" | resources.ToCSS (dict "outputStyle" "compressed") | resources.Fingerprint "md5" | resources.Minify }} +{{ $lightSyntax := resources.Get "styles/_light_syntax.scss" | resources.ToCSS (dict "outputStyle" "compressed") | resources.Fingerprint "md5" | resources.Minify }} if (currentTheme) { document.documentElement.setAttribute('saved-theme', currentTheme); + (currentTheme === 'dark') ? syntaxTheme.href = '{{ $darkSyntax.Permalink }}' : syntaxTheme.href = '{{ $lightSyntax.Permalink }}'; } const switchTheme = (e) => { if (e.target.checked) { - document.documentElement.setAttribute('saved-theme', 'dark') - localStorage.setItem('theme', 'dark') + document.documentElement.setAttribute('saved-theme', 'dark'); + localStorage.setItem('theme', 'dark'); + syntaxTheme.href = '{{ $darkSyntax.Permalink }}'; } else { document.documentElement.setAttribute('saved-theme', 'light') localStorage.setItem('theme', 'light') + syntaxTheme.href = '{{ $lightSyntax.Permalink }}'; } } diff --git a/assets/styles/_dark_syntax.scss b/assets/styles/_dark_syntax.scss new file mode 100644 index 00000000..9d2019a8 --- /dev/null +++ b/assets/styles/_dark_syntax.scss @@ -0,0 +1,85 @@ +/* Background */ .bg { color: #f8f8f2; background-color: #282a36; } +/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #282a36; } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { } +/* CodeLine */ .chroma .cl { } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #ff79c6 } +/* KeywordConstant */ .chroma .kc { color: #ff79c6 } +/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic } +/* KeywordNamespace */ .chroma .kn { color: #ff79c6 } +/* KeywordPseudo */ .chroma .kp { color: #ff79c6 } +/* KeywordReserved */ .chroma .kr { color: #ff79c6 } +/* KeywordType */ .chroma .kt { color: #8be9fd } +/* Name */ .chroma .n { } +/* NameAttribute */ .chroma .na { color: #50fa7b } +/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic } +/* NameBuiltinPseudo */ .chroma .bp { } +/* NameClass */ .chroma .nc { color: #50fa7b } +/* NameConstant */ .chroma .no { } +/* NameDecorator */ .chroma .nd { } +/* NameEntity */ .chroma .ni { } +/* NameException */ .chroma .ne { } +/* NameFunction */ .chroma .nf { color: #50fa7b } +/* NameFunctionMagic */ .chroma .fm { } +/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic } +/* NameNamespace */ .chroma .nn { } +/* NameOther */ .chroma .nx { } +/* NameProperty */ .chroma .py { } +/* NameTag */ .chroma .nt { color: #ff79c6 } +/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic } +/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic } +/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic } +/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic } +/* NameVariableMagic */ .chroma .vm { } +/* Literal */ .chroma .l { } +/* LiteralDate */ .chroma .ld { } +/* LiteralString */ .chroma .s { color: #f1fa8c } +/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c } +/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c } +/* LiteralStringChar */ .chroma .sc { color: #f1fa8c } +/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c } +/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c } +/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c } +/* LiteralStringEscape */ .chroma .se { color: #f1fa8c } +/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c } +/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c } +/* LiteralStringOther */ .chroma .sx { color: #f1fa8c } +/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c } +/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c } +/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c } +/* LiteralNumber */ .chroma .m { color: #bd93f9 } +/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 } +/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 } +/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 } +/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 } +/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 } +/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 } +/* Operator */ .chroma .o { color: #ff79c6 } +/* OperatorWord */ .chroma .ow { color: #ff79c6 } +/* Punctuation */ .chroma .p { } +/* Comment */ .chroma .c { color: #6272a4 } +/* CommentHashbang */ .chroma .ch { color: #6272a4 } +/* CommentMultiline */ .chroma .cm { color: #6272a4 } +/* CommentSingle */ .chroma .c1 { color: #6272a4 } +/* CommentSpecial */ .chroma .cs { color: #6272a4 } +/* CommentPreproc */ .chroma .cp { color: #ff79c6 } +/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { color: #ff5555 } +/* GenericEmph */ .chroma .ge { text-decoration: underline } +/* GenericError */ .chroma .gr { } +/* GenericHeading */ .chroma .gh { font-weight: bold } +/* GenericInserted */ .chroma .gi { color: #50fa7b; font-weight: bold } +/* GenericOutput */ .chroma .go { color: #44475a } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { } +/* GenericSubheading */ .chroma .gu { font-weight: bold } +/* GenericTraceback */ .chroma .gt { } +/* GenericUnderline */ .chroma .gl { text-decoration: underline } +/* TextWhitespace */ .chroma .w { } diff --git a/assets/styles/_light_syntax.scss b/assets/styles/_light_syntax.scss new file mode 100644 index 00000000..1927b575 --- /dev/null +++ b/assets/styles/_light_syntax.scss @@ -0,0 +1,85 @@ +/* Background */ .bg { color: #272822; background-color: #fafafa; } +/* PreWrapper */ .chroma { color: #272822; background-color: #fafafa; } +/* Other */ .chroma .x { } +/* Error */ .chroma .err { color: #960050; background-color: #1e0010 } +/* CodeLine */ .chroma .cl { } +/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } +/* LineHighlight */ .chroma .hl { background-color: #ffffcc } +/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } +/* Line */ .chroma .line { display: flex; } +/* Keyword */ .chroma .k { color: #00a8c8 } +/* KeywordConstant */ .chroma .kc { color: #00a8c8 } +/* KeywordDeclaration */ .chroma .kd { color: #00a8c8 } +/* KeywordNamespace */ .chroma .kn { color: #f92672 } +/* KeywordPseudo */ .chroma .kp { color: #00a8c8 } +/* KeywordReserved */ .chroma .kr { color: #00a8c8 } +/* KeywordType */ .chroma .kt { color: #00a8c8 } +/* Name */ .chroma .n { color: #111111 } +/* NameAttribute */ .chroma .na { color: #75af00 } +/* NameBuiltin */ .chroma .nb { color: #111111 } +/* NameBuiltinPseudo */ .chroma .bp { color: #111111 } +/* NameClass */ .chroma .nc { color: #75af00 } +/* NameConstant */ .chroma .no { color: #00a8c8 } +/* NameDecorator */ .chroma .nd { color: #75af00 } +/* NameEntity */ .chroma .ni { color: #111111 } +/* NameException */ .chroma .ne { color: #75af00 } +/* NameFunction */ .chroma .nf { color: #75af00 } +/* NameFunctionMagic */ .chroma .fm { color: #111111 } +/* NameLabel */ .chroma .nl { color: #111111 } +/* NameNamespace */ .chroma .nn { color: #111111 } +/* NameOther */ .chroma .nx { color: #75af00 } +/* NameProperty */ .chroma .py { color: #111111 } +/* NameTag */ .chroma .nt { color: #f92672 } +/* NameVariable */ .chroma .nv { color: #111111 } +/* NameVariableClass */ .chroma .vc { color: #111111 } +/* NameVariableGlobal */ .chroma .vg { color: #111111 } +/* NameVariableInstance */ .chroma .vi { color: #111111 } +/* NameVariableMagic */ .chroma .vm { color: #111111 } +/* Literal */ .chroma .l { color: #ae81ff } +/* LiteralDate */ .chroma .ld { color: #d88200 } +/* LiteralString */ .chroma .s { color: #d88200 } +/* LiteralStringAffix */ .chroma .sa { color: #d88200 } +/* LiteralStringBacktick */ .chroma .sb { color: #d88200 } +/* LiteralStringChar */ .chroma .sc { color: #d88200 } +/* LiteralStringDelimiter */ .chroma .dl { color: #d88200 } +/* LiteralStringDoc */ .chroma .sd { color: #d88200 } +/* LiteralStringDouble */ .chroma .s2 { color: #d88200 } +/* LiteralStringEscape */ .chroma .se { color: #8045ff } +/* LiteralStringHeredoc */ .chroma .sh { color: #d88200 } +/* LiteralStringInterpol */ .chroma .si { color: #d88200 } +/* LiteralStringOther */ .chroma .sx { color: #d88200 } +/* LiteralStringRegex */ .chroma .sr { color: #d88200 } +/* LiteralStringSingle */ .chroma .s1 { color: #d88200 } +/* LiteralStringSymbol */ .chroma .ss { color: #d88200 } +/* LiteralNumber */ .chroma .m { color: #ae81ff } +/* LiteralNumberBin */ .chroma .mb { color: #ae81ff } +/* LiteralNumberFloat */ .chroma .mf { color: #ae81ff } +/* LiteralNumberHex */ .chroma .mh { color: #ae81ff } +/* LiteralNumberInteger */ .chroma .mi { color: #ae81ff } +/* LiteralNumberIntegerLong */ .chroma .il { color: #ae81ff } +/* LiteralNumberOct */ .chroma .mo { color: #ae81ff } +/* Operator */ .chroma .o { color: #f92672 } +/* OperatorWord */ .chroma .ow { color: #f92672 } +/* Punctuation */ .chroma .p { color: #111111 } +/* Comment */ .chroma .c { color: #75715e } +/* CommentHashbang */ .chroma .ch { color: #75715e } +/* CommentMultiline */ .chroma .cm { color: #75715e } +/* CommentSingle */ .chroma .c1 { color: #75715e } +/* CommentSpecial */ .chroma .cs { color: #75715e } +/* CommentPreproc */ .chroma .cp { color: #75715e } +/* CommentPreprocFile */ .chroma .cpf { color: #75715e } +/* Generic */ .chroma .g { } +/* GenericDeleted */ .chroma .gd { } +/* GenericEmph */ .chroma .ge { font-style: italic } +/* GenericError */ .chroma .gr { } +/* GenericHeading */ .chroma .gh { } +/* GenericInserted */ .chroma .gi { } +/* GenericOutput */ .chroma .go { } +/* GenericPrompt */ .chroma .gp { } +/* GenericStrong */ .chroma .gs { font-weight: bold } +/* GenericSubheading */ .chroma .gu { } +/* GenericTraceback */ .chroma .gt { } +/* GenericUnderline */ .chroma .gl { } +/* TextWhitespace */ .chroma .w { } diff --git a/assets/styles/code-title.scss b/assets/styles/code-title.scss new file mode 100644 index 00000000..11b088a7 --- /dev/null +++ b/assets/styles/code-title.scss @@ -0,0 +1,20 @@ +.code-title { + color: var(--primary) ; + font-family: monospace; + width: max-content; + overflow-x: auto; + display: inline-block; + vertical-align: middle; + font-weight: normal; + line-height: 1em; + position: relative; + padding: 0.5em 0.6em 0.6em; // + 1.2 em + max-width: calc(100% - 1.2em); // (-1.2 em) fits article width exactly + margin-bottom: -0.2em; + z-index: -1; + border-top-left-radius: 0.3em; + border-top-right-radius: 0.3em; + font-size: 0.9em; + background-color: var(--lightgray); + filter: hue-rotate(-30deg) contrast(1.0) opacity(0.8); +} \ No newline at end of file diff --git a/assets/styles/syntax.scss b/assets/styles/syntax.scss index bada47ab..fbea72a4 100644 --- a/assets/styles/syntax.scss +++ b/assets/styles/syntax.scss @@ -1,99 +1,58 @@ -/* Background */ .chroma { color: #f8f8f2; background-color: #282a36; overflow: hidden } -/* Other */ .chroma .x { } -/* Error */ .chroma .err { } -/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } -/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } -/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #ffffcc } -/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f } -/* Keyword */ .chroma .k { color: #ff79c6 } -/* KeywordConstant */ .chroma .kc { color: #ff79c6 } -/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic } -/* KeywordNamespace */ .chroma .kn { color: #ff79c6 } -/* KeywordPseudo */ .chroma .kp { color: #ff79c6 } -/* KeywordReserved */ .chroma .kr { color: #ff79c6 } -/* KeywordType */ .chroma .kt { color: #8be9fd } -/* Name */ .chroma .n { } -/* NameAttribute */ .chroma .na { color: #50fa7b } -/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic } -/* NameBuiltinPseudo */ .chroma .bp { } -/* NameClass */ .chroma .nc { color: #50fa7b } -/* NameConstant */ .chroma .no { } -/* NameDecorator */ .chroma .nd { } -/* NameEntity */ .chroma .ni { } -/* NameException */ .chroma .ne { } -/* NameFunction */ .chroma .nf { color: #50fa7b } -/* NameFunctionMagic */ .chroma .fm { } -/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic } -/* NameNamespace */ .chroma .nn { } -/* NameOther */ .chroma .nx { } -/* NameProperty */ .chroma .py { } -/* NameTag */ .chroma .nt { color: #ff79c6 } -/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic } -/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic } -/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic } -/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic } -/* NameVariableMagic */ .chroma .vm { } -/* Literal */ .chroma .l { } -/* LiteralDate */ .chroma .ld { } -/* LiteralString */ .chroma .s { color: #f1fa8c } -/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c } -/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c } -/* LiteralStringChar */ .chroma .sc { color: #f1fa8c } -/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c } -/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c } -/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c } -/* LiteralStringEscape */ .chroma .se { color: #f1fa8c } -/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c } -/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c } -/* LiteralStringOther */ .chroma .sx { color: #f1fa8c } -/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c } -/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c } -/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c } -/* LiteralNumber */ .chroma .m { color: #bd93f9 } -/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 } -/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 } -/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 } -/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 } -/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 } -/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 } -/* Operator */ .chroma .o { color: #ff79c6 } -/* OperatorWord */ .chroma .ow { color: #ff79c6 } -/* Punctuation */ .chroma .p { } -/* Comment */ .chroma .c { color: #6272a4 } -/* CommentHashbang */ .chroma .ch { color: #6272a4 } -/* CommentMultiline */ .chroma .cm { color: #6272a4 } -/* CommentSingle */ .chroma .c1 { color: #6272a4 } -/* CommentSpecial */ .chroma .cs { color: #6272a4 } -/* CommentPreproc */ .chroma .cp { color: #ff79c6 } -/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 } -/* Generic */ .chroma .g { } -/* GenericDeleted */ .chroma .gd { color: #8b080b } -/* GenericEmph */ .chroma .ge { text-decoration: underline } -/* GenericError */ .chroma .gr { } -/* GenericHeading */ .chroma .gh { font-weight: bold } -/* GenericInserted */ .chroma .gi { font-weight: bold } -/* GenericOutput */ .chroma .go { color: #44475a } -/* GenericPrompt */ .chroma .gp { } -/* GenericStrong */ .chroma .gs { } -/* GenericSubheading */ .chroma .gu { font-weight: bold } -/* GenericTraceback */ .chroma .gt { } -/* GenericUnderline */ .chroma .gl { text-decoration: underline } -/* TextWhitespace */ .chroma .w { } +// Overrides +/* Background */ +.chroma { + overflow: hidden !important; + background-color: var(--lightgray) !important; +} + +/* LineTable */ +.chroma .lntable { + width: auto !important; + overflow: auto !important; + display: block !important; +} + +/* LineHighlight */ +.chroma .hl { + display: block !important; + width: 100% !important; +} + +/* LineNumbersTable */ +.chroma .lnt { + margin-right: 0.0em !important; + padding: 0 0.0em 0 0.0em !important; +} + +/* LineNumbers */ +.chroma .ln { + margin-right: 0.0em !important; + padding: 0 0.0em 0 0.0em !important; +} + +/* GenericDeleted */ +.chroma .gd { + color: #8b080b !important; +} + +/* GenericInserted */ +.chroma .gi { + font-weight: bold !important; +} .lntd:first-of-type > .chroma { - padding-right: 0; + padding-right: 0 !important; } .chroma code { font-family: 'Fira Code' !important; - font-size: 0.85em; - line-height: 1em; - background: none; - padding: 0; + font-size: 0.85em !important; + line-height: 2em !important; + background: none !important; + padding: 0 !important; } .chroma { - border-radius: 3px; - margin: 0; -} \ No newline at end of file + border-radius: 3px !important; + margin: 0 !important; +} diff --git a/content/notes/config.md b/content/notes/config.md index 2c1e352f..076857ed 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -8,9 +8,9 @@ weight: 0 ## Configuration Quartz is designed to be extremely configurable. You can find the bulk of the configuration scattered throughout the repository depending on how in-depth you'd like to get. -The majority of configuration can be be found under `data/config.yaml`. An annotated example configuration is shown below. +The majority of configuration can be found under `data/config.yaml`. An annotated example configuration is shown below. -```yaml +```yaml {title="data/config.yaml"} # The name to display in the footer name: Jacky Zhao @@ -25,6 +25,9 @@ openToc: false # whether to display on-hover link preview cards enableLinkPreview: true +# whether to render titles for code blocks +enableCodeBlockTitle: true + # whether to try to process Latex enableLatex: true @@ -60,12 +63,34 @@ links: link: https://github.com/jackyzha0 ``` +### Code Block Titles + +To add code block titles with Quartz: + +1. Ensure that code block titles are enabled in Quartz's configuration: + + ```yaml {title="data/config.yaml", linenos=false} + enableCodeBlockTitle: true + ``` + +2. Add the `title` attribute to the desired [code block + fence](https://gohugo.io/content-management/syntax-highlighting/#highlighting-in-code-fences): + + ```markdown {linenos=false} + ```yaml {title="data/config.yaml"} + enableCodeBlockTitle: true # example from step 1 + ``` + ``` + +**Note** that if `{title=}` is included, and code block titles are not +enabled, no errors will occur and the title attribute will be ignored. + ### HTML Favicons If you would like to customize the favicons of your quartz-based website, you can add them to the `data/config.yaml` file. The **default** without any set `favicon` key is: -```html +```html {title="layouts/partials/head.html", linenostart=15} ``` @@ -73,7 +98,7 @@ The default can be overridden by defining a value to the `favicon` key in your `data/config.yaml` file. Here is a `List[Dictionary]` example format, which is equivalent to the default: -```yaml +```yaml {title="data/config.yaml", linenos=false} favicon: - { rel: "shortcut icon", href: "icon.png", type: "image/png" } # - { ... } # Repeat for each additional favicon you want to add @@ -85,7 +110,7 @@ If you plan to add multiple favicons generated by a website (see list below), it may be easier to define it as HTML. Here is an example which appends the **Apple touch icon** to quartz's default favicon: -```yaml +```yaml {title="data/config.yaml", linenos=false} favicon: | @@ -102,7 +127,8 @@ attribute, are relative to the `static/` directory. ### Graph View To customize the Interactive Graph view, you can poke around `data/graphConfig.yaml`. -```yaml + +```yaml {title="data/graphConfig.yaml"} # if true, a Global Graph will be shown on home page with full width, no backlink. # A different set of Local Graphs will be shown on sub pages. # if false, Local Graph will be default on every page as usual @@ -128,10 +154,10 @@ localGraph: # how strongly nodes should repel each other repelForce: 2 - # how strongly should nodes be attracted to the center of gravity + # how strongly should nodes be attracted to the center of gravity centerForce: 1 - # what the default link length should be + # what the default link length should be linkDistance: 1 # how big the node labels should be @@ -179,4 +205,4 @@ defaultContentLanguage = 'ar' languagedirection = 'rtl' title = 'مدونتي' weight = 1 -``` \ No newline at end of file +``` diff --git a/data/config.yaml b/data/config.yaml index cae94ef4..e55035a0 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -3,6 +3,7 @@ enableToc: true openToc: false enableLinkPreview: true enableLatex: true +enableCodeBlockTitle: true enableSPA: true enableFooter: true enableContextualBacklinks: true diff --git a/layouts/partials/head.html b/layouts/partials/head.html index d0630a20..e3eebbfe 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -36,7 +36,11 @@ {{$finalCss := $css | resources.Concat "styles.css" | resources.Fingerprint "md5" | resources.Minify }} - {{ $darkMode := resources.Get "js/darkmode.js" | resources.Fingerprint "md5" | resources.Minify }} + {{$lightSyntax := resources.Get "styles/_light_syntax.scss" | resources.ToCSS (dict "outputStyle" "compressed") | resources.Fingerprint "md5" | resources.Minify }} + + + + {{ $darkMode := resources.Get "js/darkmode.js" | resources.ExecuteAsTemplate "js/darkmode.js" . | resources.Fingerprint "md5" | resources.Minify }} {{partial "katex.html" .}} @@ -44,6 +48,12 @@ resources.Minify }} + + {{ if $.Site.Data.config.enableCodeBlockTitle }} + {{ $codeTitle := resources.Get "js/code-title.js" | resources.Fingerprint "md5" | resources.Minify }} + + {{end}} + {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint "md5" | resources.Minify | }} {{$contentIndex := resources.Get @@ -75,6 +85,10 @@ const pathWindow = window.location.pathname; const isHome = pathBase == pathWindow; + {{if $.Site.Data.config.enableSPA -}} + addTitleToCodeBlocks(); + {{ end }} + {{if $.Site.Data.config.enableFooter}} const container = document.getElementById("graph-container") // retry if the graph is not ready @@ -92,6 +106,7 @@ {{end}} + {{if $.Site.Data.config.enableLinkPreview}} initPopover( {{strings.TrimRight "/" .Site.BaseURL }}, @@ -103,6 +118,13 @@ 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.enableCodeBlockTitle -}} + {{if $.Site.Data.config.enableSPA -}} + addTitleToCodeBlocks(); + {{ else }} + window.addEventListener("DOMContentLoaded", addTitleToCodeBlocks); + {{- end -}} + {{- end -}} {{if $.Site.Data.config.enableLatex}} renderMathInElement(doc.body, { delimiters: [ From eda370334a3798070c2f79ec38021edb3b33a84f Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 1 Jul 2022 11:27:50 -0700 Subject: [PATCH 0240/1221] fix: image scaling for md-style links (closes #155) --- content/notes/hosting.md | 2 +- layouts/_default/_markup/render-image.html | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content/notes/hosting.md b/content/notes/hosting.md index 70f9d04c..fffcd653 100644 --- a/content/notes/hosting.md +++ b/content/notes/hosting.md @@ -66,7 +66,7 @@ Please note that the `cname` field should *not* have any path `e.g. end with /qu [Reference `deploy.yaml` here](https://github.com/jackyzha0/quartz/blob/hugo/.github/workflows/deploy.yaml) -```yaml +```yaml {title=".github/workflows/deploy.yaml"} - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: diff --git a/layouts/_default/_markup/render-image.html b/layouts/_default/_markup/render-image.html index 8dda6a8c..dbcf732f 100644 --- a/layouts/_default/_markup/render-image.html +++ b/layouts/_default/_markup/render-image.html @@ -1,8 +1,9 @@ {{$src := .Destination | safeURL }} +{{$width := index (split .Text "|") 1 | default "auto" }} {{$external := strings.HasPrefix $src "http" }} {{- if $external -}} -{{ .Text }} +{{ .Text }} {{- else -}} {{$fixedUrl := (cond (hasPrefix $src "/") $src (print "/" $src)) | urlize}} -{{ .Text }} +{{ .Text }} {{- end -}} From a8137edf247c46ef3a5af78c48bcd299a13c1a7d Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 2 Jul 2022 17:14:17 -0700 Subject: [PATCH 0241/1221] fix: adjust weird colours for err highlighting --- assets/styles/_light_syntax.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/styles/_light_syntax.scss b/assets/styles/_light_syntax.scss index 1927b575..d0f452e0 100644 --- a/assets/styles/_light_syntax.scss +++ b/assets/styles/_light_syntax.scss @@ -1,7 +1,7 @@ /* Background */ .bg { color: #272822; background-color: #fafafa; } /* PreWrapper */ .chroma { color: #272822; background-color: #fafafa; } /* Other */ .chroma .x { } -/* Error */ .chroma .err { color: #960050; background-color: #1e0010 } +/* Error */ .chroma .err { } /* CodeLine */ .chroma .cl { } /* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } /* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; } From 015ed4cfa2db4636e03debcda0d4201f24346098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aiden=20Bai=20=E7=99=BD=E5=AE=87=E5=BD=A4?= Date: Sat, 2 Jul 2022 19:40:18 -0700 Subject: [PATCH 0242/1221] Fix `width: auto` for SPA routing (#156) --- assets/js/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/router.js b/assets/js/router.js index b2b6d211..efaa10e8 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -3,7 +3,7 @@ import { navigate, prefetch, router, -} from "https://unpkg.com/million@1.11.3/dist/router.mjs" +} from "https://unpkg.com/million@1.11.5/dist/router.mjs" export const attachSPARouting = (init, rerender) => { // Attach SPA functions to the global Million namespace From f54df35767dcda9bc4853decff86d57323593685 Mon Sep 17 00:00:00 2001 From: Geoffrey Garrett Date: Sun, 3 Jul 2022 20:42:35 +0200 Subject: [PATCH 0243/1221] Copy to clipboard feature for code block (#152) Co-authored-by: Jacky Zhao --- assets/js/clipboard.js | 38 +++++++++++++++++++++++++++++ assets/js/darkmode.js | 2 +- assets/styles/clipboard.scss | 47 ++++++++++++++++++++++++++++++++++++ content/notes/config.md | 21 +++++++++------- data/config.yaml | 1 + layouts/partials/head.html | 19 ++++++++++++--- 6 files changed, 114 insertions(+), 14 deletions(-) create mode 100644 assets/js/clipboard.js create mode 100644 assets/styles/clipboard.scss diff --git a/assets/js/clipboard.js b/assets/js/clipboard.js new file mode 100644 index 00000000..6389330e --- /dev/null +++ b/assets/js/clipboard.js @@ -0,0 +1,38 @@ +const svgCopy = + ''; +const svgCheck = + ''; + + +const addCopyButtons = () => { + let els = document.getElementsByClassName("highlight"); + // for each highlight + for (let i = 0; i < els.length; i++) { + if (els[i].getElementsByClassName("clipboard-button").length) continue; + + // find pre > code inside els[i] + let codeBlocks = els[i].getElementsByTagName("code"); + + // line numbers are inside first code block + let lastCodeBlock = codeBlocks[codeBlocks.length - 1]; + const button = document.createElement("button"); + button.className = "clipboard-button"; + button.type = "button"; + button.innerHTML = svgCopy; + // remove every second newline from lastCodeBlock.innerText + button.addEventListener("click", () => { + navigator.clipboard.writeText(lastCodeBlock.innerText.replace(/\n\n/g, "\n")).then( + () => { + button.blur(); + button.innerHTML = svgCheck; + setTimeout(() => (button.innerHTML = svgCopy), 2000); + }, + (error) => (button.innerHTML = "Error") + ); + }); + // find chroma inside els[i] + let chroma = els[i].getElementsByClassName("chroma")[0]; + els[i].insertBefore(button, chroma); + console.log(els[i].lastChild) + } +} diff --git a/assets/js/darkmode.js b/assets/js/darkmode.js index 11ce15f7..8168d77e 100644 --- a/assets/js/darkmode.js +++ b/assets/js/darkmode.js @@ -8,7 +8,7 @@ const syntaxTheme = document.querySelector("#theme-link"); if (currentTheme) { document.documentElement.setAttribute('saved-theme', currentTheme); - (currentTheme === 'dark') ? syntaxTheme.href = '{{ $darkSyntax.Permalink }}' : syntaxTheme.href = '{{ $lightSyntax.Permalink }}'; + syntaxTheme.href = currentTheme === 'dark' ? '{{ $darkSyntax.Permalink }}' : '{{ $lightSyntax.Permalink }}'; } const switchTheme = (e) => { diff --git a/assets/styles/clipboard.scss b/assets/styles/clipboard.scss new file mode 100644 index 00000000..7989e248 --- /dev/null +++ b/assets/styles/clipboard.scss @@ -0,0 +1,47 @@ +.clipboard-button { + position: absolute; + display: flex; + float: right; + right: 0; + padding: 0.69em; + margin: 0.5em; + color: var(--outlinegray); + border-color: var(--dark); + background-color: var(--lightgray); + filter: contrast(1.1); + border: 2px solid; + border-radius: 6px; + font-size: 0.8em; + z-index: 1; + opacity: 0; + transition: 0.12s; + + & > svg { + fill: var(--light); + filter: contrast(0.3); + } + + &:hover { + cursor: pointer; + border-color: var(--primary); + + & > svg { + fill: var(--primary); + } + } + + &:focus { + outline: 0; + } +} + +.highlight { + position: relative; + + &:hover > .clipboard-button { + opacity: 1; + transition: 0.2s; + } +} + + diff --git a/content/notes/config.md b/content/notes/config.md index 076857ed..056ae36a 100644 --- a/content/notes/config.md +++ b/content/notes/config.md @@ -28,12 +28,15 @@ enableLinkPreview: true # whether to render titles for code blocks enableCodeBlockTitle: true +# whether to render copy buttons for code blocks +enableCodeBlockCopy: true + # whether to try to process Latex enableLatex: true # whether to enable single-page-app style rendering -# this prevents flahses of unstyled content and overall improves -# smoothness of quartz. More info in issue #109 on GitHub +# this prevents flashes of unstyled content and improves +# smoothness of Quartz. More info in issue #109 on GitHub enableSPA: true # whether to render a footer @@ -83,10 +86,10 @@ To add code block titles with Quartz: ``` **Note** that if `{title=}` is included, and code block titles are not -enabled, no errors will occur and the title attribute will be ignored. +enabled, no errors will occur, and the title attribute will be ignored. ### HTML Favicons -If you would like to customize the favicons of your quartz-based website, you +If you would like to customize the favicons of your Quartz-based website, you can add them to the `data/config.yaml` file. The **default** without any set `favicon` key is: @@ -95,7 +98,7 @@ can add them to the `data/config.yaml` file. The **default** without any set ``` The default can be overridden by defining a value to the `favicon` key in your -`data/config.yaml` file. Here is a `List[Dictionary]` example format, which is +`data/config.yaml` file. For example, here is a `List[Dictionary]` example format, which is equivalent to the default: ```yaml {title="data/config.yaml", linenos=false} @@ -108,7 +111,7 @@ In this format, the keys are identical to their HTML representations. If you plan to add multiple favicons generated by a website (see list below), it may be easier to define it as HTML. Here is an example which appends the -**Apple touch icon** to quartz's default favicon: +**Apple touch icon** to Quartz's default favicon: ```yaml {title="data/config.yaml", linenos=false} favicon: | @@ -118,7 +121,7 @@ favicon: | This second favicon will now be used as a web page icon when someone adds your webpage to the home screen of their Apple device. If you are interested in more -information about the current, and past, standards of favicons, you can read +information about the current and past standards of favicons, you can read [this article](https://www.emergeinteractive.com/insights/detail/the-essentials-of-favicons/). **Note** that all generated favicon paths, defined by the `href` @@ -136,7 +139,7 @@ enableGlobalGraph: false ### Local Graph ### localGraph: - # whether automatically generate a legend + # whether automatically generate a legend enableLegend: false # whether to allow dragging nodes in the graph @@ -181,7 +184,7 @@ paths: Want to go even more in-depth? You can add custom CSS styling and change existing colours through editing `assets/styles/custom.scss`. If you'd like to target specific parts of the site, you can add ids and classes to the HTML partials in `/layouts/partials`. ### Partials -Partials are what dictate what actually gets rendered to the page. Want to change how pages are styled and structured? You can edit the appropriate layout in `/layouts`. +Partials are what dictate what gets rendered to the page. Want to change how pages are styled and structured? You can edit the appropriate layout in `/layouts`. For example, the structure of the home page can be edited through `/layouts/index.html`. To customize the footer, you can edit `/layouts/partials/footer.html` diff --git a/data/config.yaml b/data/config.yaml index e55035a0..7ef35a54 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -4,6 +4,7 @@ openToc: false enableLinkPreview: true enableLatex: true enableCodeBlockTitle: true +enableCodeBlockCopy: true enableSPA: true enableFooter: true enableContextualBacklinks: true diff --git a/layouts/partials/head.html b/layouts/partials/head.html index e3eebbfe..7dfbd50c 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -54,6 +54,13 @@ {{end}} + {{ if $.Site.Data.config.enableCodeBlockCopy }} + {{ $clipboard := resources.Get "js/clipboard.js" | resources.Fingerprint "md5" | resources.Minify }} + {{ if (findRE " + {{ end }} + {{ end }} + {{$linkIndex := resources.Get "indices/linkIndex.json" | resources.Fingerprint "md5" | resources.Minify | }} {{$contentIndex := resources.Get @@ -85,6 +92,10 @@ const pathWindow = window.location.pathname; const isHome = pathBase == pathWindow; + {{if $.Site.Data.config.enableCodeBlockCopy -}} + addCopyButtons(); + {{ end }} + {{if $.Site.Data.config.enableSPA -}} addTitleToCodeBlocks(); {{ end }} @@ -118,12 +129,12 @@ 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.enableCodeBlockCopy -}} + addCopyButtons(); + {{ end }} + {{if $.Site.Data.config.enableCodeBlockTitle -}} - {{if $.Site.Data.config.enableSPA -}} addTitleToCodeBlocks(); - {{ else }} - window.addEventListener("DOMContentLoaded", addTitleToCodeBlocks); - {{- end -}} {{- end -}} {{if $.Site.Data.config.enableLatex}} renderMathInElement(doc.body, { From aaf31f419eb167dbb7582fb103be29f0bef95ba9 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 3 Jul 2022 11:50:13 -0700 Subject: [PATCH 0244/1221] fix: copy code block logic for non code pages --- layouts/partials/head.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 7dfbd50c..0890983b 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -56,9 +56,7 @@ {{ if $.Site.Data.config.enableCodeBlockCopy }} {{ $clipboard := resources.Get "js/clipboard.js" | resources.Fingerprint "md5" | resources.Minify }} - {{ if (findRE " - {{ end }} + {{ end }} From 25a4d3b6e17c2a5f6a935446ea97d06a323f71f6 Mon Sep 17 00:00:00 2001 From: rphla <101242699+rphla@users.noreply.github.com> Date: Wed, 6 Jul 2022 06:39:29 +0800 Subject: [PATCH 0245/1221] Add GitHub "edit" button (#157) --- data/config.yaml | 2 ++ layouts/_default/single.html | 3 ++- layouts/partials/github.html | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 layouts/partials/github.html diff --git a/data/config.yaml b/data/config.yaml index 7ef35a54..ce9ff0ab 100644 --- a/data/config.yaml +++ b/data/config.yaml @@ -9,6 +9,8 @@ enableSPA: true enableFooter: true enableContextualBacklinks: true enableRecentNotes: false +enableGitHubEdit: false +GHlink: https://github.com/jackyzha0/quartz/tree/hugo/content description: Host your second brain and digital garden for free. Quartz features extremely fast full-text search, Wikilink support, backlinks, local graph, tags, and link previews. diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 91eda290..06507a70 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -15,7 +15,8 @@

    {{ .Site.Data.config.page_titl
    {{if .Title}}

    {{ .Title }}

    {{end}}

    - Last updated {{if ne .Date .Lastmod}}{{ .Lastmod.Format "January 2, 2006" }}{{else}}Unknown{{end}} + Last updated {{if ne .Date .Lastmod}}{{ .Lastmod.Format "January 2, 2006" }}{{else}}Unknown{{end}}. + {{ partial "github.html" . }}

    } else { @@ -25,17 +25,18 @@ TagList.css = ` display: flex; padding-left: 0; gap: 0.4rem; +} + +.tags > li { + display: inline-block; + margin: 0; + overflow-wrap: normal; +} - & > li { - display: inline-block; - margin: 0; - - & > a { - border-radius: 8px; - border: var(--lightgray) 1px solid; - padding: 0.2rem 0.5rem; - } - } +.tags > li > a { + border-radius: 8px; + background-color: var(--highlight); + padding: 0.2rem 0.5rem; } ` diff --git a/quartz/components/pages/Content.tsx b/quartz/components/pages/Content.tsx index 7856d6ea..d233845a 100644 --- a/quartz/components/pages/Content.tsx +++ b/quartz/components/pages/Content.tsx @@ -5,7 +5,7 @@ import { toJsxRuntime } from "hast-util-to-jsx-runtime" function Content({ tree }: QuartzComponentProps) { // @ts-ignore (preact makes it angry) const content = toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: 'html' }) - return
    {content}
    + return
    {content}
    } -export default (() => Content) satisfies QuartzComponentConstructor \ No newline at end of file +export default (() => Content) satisfies QuartzComponentConstructor diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index 0e0f4c0c..c70f0925 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -17,10 +17,15 @@ interface RenderComponents { export function pageResources(slug: string, staticResources: StaticResources): StaticResources { const baseDir = resolveToRoot(slug) + + const contentIndexPath = baseDir + "/static/contentIndex.json" + const contentIndexScript = `const fetchData = fetch(\`${contentIndexPath}\`).then(data => data.json())` + return { css: [baseDir + "/index.css", ...staticResources.css], js: [ { src: baseDir + "/prescript.js", loadTime: "beforeDOMReady", contentType: "external" }, + { loadTime: "afterDOMReady", contentType: "inline", spaPreserve: true, script: contentIndexScript }, ...staticResources.js, { src: baseDir + "/postscript.js", loadTime: "afterDOMReady", moduleType: 'module', contentType: "external" } ] @@ -32,28 +37,40 @@ export function renderPage(slug: string, componentData: QuartzComponentProps, co const Header = HeaderConstructor() const Body = BodyConstructor() + const LeftComponent = +
    +
    + {left.map(BodyComponent => )} +
    +
    + + const RightComponent = +
    +
    + {right.map(BodyComponent => )} +
    +
    + const doc =
    -
    - {header.map(HeaderComponent => )} -
    -
    - {beforeBody.map(BodyComponent => )} + -
    - {left.map(BodyComponent => )} -
    -
    + {LeftComponent} +
    +
    -
    - {right.map(BodyComponent => )} -
    + {RightComponent} -
    {pageResources.js.filter(resource => resource.loadTime === "afterDOMReady").map(res => JSResourceToScriptElement(res))} diff --git a/quartz/components/scripts/darkmode.inline.ts b/quartz/components/scripts/darkmode.inline.ts index f00a8733..594bd3a9 100644 --- a/quartz/components/scripts/darkmode.inline.ts +++ b/quartz/components/scripts/darkmode.inline.ts @@ -2,7 +2,7 @@ const userPref = window.matchMedia('(prefers-color-scheme: light)').matches ? 'l const currentTheme = localStorage.getItem('theme') ?? userPref document.documentElement.setAttribute('saved-theme', currentTheme) -window.addEventListener('DOMContentLoaded', () => { +document.addEventListener("nav", () => { const switchTheme = (e: any) => { if (e.target.checked) { document.documentElement.setAttribute('saved-theme', 'dark') @@ -16,7 +16,8 @@ window.addEventListener('DOMContentLoaded', () => { // Darkmode toggle const toggleSwitch = document.querySelector('#darkmode-toggle') as HTMLInputElement - toggleSwitch.addEventListener('change', switchTheme, false) + toggleSwitch.removeEventListener('change', switchTheme) + toggleSwitch.addEventListener('change', switchTheme) if (currentTheme === 'dark') { toggleSwitch.checked = true } diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts index 27e9a817..169b8c45 100644 --- a/quartz/components/scripts/graph.inline.ts +++ b/quartz/components/scripts/graph.inline.ts @@ -266,9 +266,9 @@ async function renderGraph(container: string, slug: string) { }) } -function renderGlobalGraph() { +async function renderGlobalGraph() { const slug = document.body.dataset["slug"]! - renderGraph("global-graph-container", slug) + await renderGraph("global-graph-container", slug) const container = document.getElementById("global-graph-outer") container?.classList.add("active") @@ -293,7 +293,14 @@ document.addEventListener("nav", async (e: unknown) => { containerIcon?.addEventListener("click", renderGlobalGraph) }) -window.addEventListener('resize', async () => { - const slug = document.body.dataset["slug"]! - await renderGraph("graph-container", slug) +let resizeEventDebounce: number | undefined = undefined +window.addEventListener('resize', () => { + if (resizeEventDebounce) { + clearTimeout(resizeEventDebounce) + } + + resizeEventDebounce = window.setTimeout(async () => { + const slug = document.body.dataset["slug"]! + await renderGraph("graph-container", slug) + }, 50) }) diff --git a/quartz/components/scripts/plausible.inline.ts b/quartz/components/scripts/plausible.inline.ts new file mode 100644 index 00000000..60817c29 --- /dev/null +++ b/quartz/components/scripts/plausible.inline.ts @@ -0,0 +1,3 @@ +import Plausible from 'plausible-tracker' +const { trackPageview } = Plausible() +document.addEventListener("nav", () => trackPageview()) diff --git a/quartz/components/scripts/popover.inline.ts b/quartz/components/scripts/popover.inline.ts index 655831db..b3889955 100644 --- a/quartz/components/scripts/popover.inline.ts +++ b/quartz/components/scripts/popover.inline.ts @@ -1,5 +1,24 @@ import { computePosition, flip, inline, shift } from "@floating-ui/dom" +// from micromorph/src/utils.ts +// https://github.com/natemoo-re/micromorph/blob/main/src/utils.ts#L5 +export function normalizeRelativeURLs( + el: Element | Document, + base: string | URL +) { + const update = (el: Element, attr: string, base: string | URL) => { + el.setAttribute(attr, new URL(el.getAttribute(attr)!, base).pathname) + } + + el.querySelectorAll('[href^="./"], [href^="../"]').forEach((item) => + update(item, 'href', base) + ) + + el.querySelectorAll('[src^="./"], [src^="../"]').forEach((item) => + update(item, 'src', base) + ) +} + document.addEventListener("nav", () => { const links = [...document.getElementsByClassName("internal")] as HTMLLinkElement[] const p = new DOMParser() @@ -41,6 +60,7 @@ document.addEventListener("nav", () => { if (!contents) return const html = p.parseFromString(contents, "text/html") + normalizeRelativeURLs(html, targetUrl) const elts = [...html.getElementsByClassName("popover-hint")] if (elts.length === 0) return @@ -54,11 +74,13 @@ document.addEventListener("nav", () => { setPosition(popoverElement) link.appendChild(popoverElement) link.dataset.fetchedPopover = "true" - - const heading = popoverInner.querySelector(hash) as HTMLElement | null - if (heading) { - // leave ~12px of buffer when scrolling to a heading - popoverInner.scroll({ top: heading.offsetTop - 12, behavior: 'instant' }) + + if (hash !== "") { + const heading = popoverInner.querySelector(hash) as HTMLElement | null + if (heading) { + // leave ~12px of buffer when scrolling to a heading + popoverInner.scroll({ top: heading.offsetTop - 12, behavior: 'instant' }) + } } }) } diff --git a/quartz/components/styles/backlinks.scss b/quartz/components/styles/backlinks.scss index 3344a7b5..80baefc0 100644 --- a/quartz/components/styles/backlinks.scss +++ b/quartz/components/styles/backlinks.scss @@ -7,13 +7,9 @@ & > ul { list-style: none; padding: 0; - margin: 0; + margin: 0.5rem 0; & > li { - margin: 0.5rem 0; - padding: 0.25rem 1rem; - border: var(--lightgray) 1px solid; - border-radius: 5px; & > a { background-color: transparent; } diff --git a/quartz/components/styles/footer.scss b/quartz/components/styles/footer.scss index d104e508..16df545d 100644 --- a/quartz/components/styles/footer.scss +++ b/quartz/components/styles/footer.scss @@ -1,6 +1,8 @@ footer { text-align: left; opacity: 0.8; + margin-bottom: 4rem; + & ul { list-style: none; margin: 0; diff --git a/quartz/components/styles/graph.scss b/quartz/components/styles/graph.scss index 244f2e4e..4533a845 100644 --- a/quartz/components/styles/graph.scss +++ b/quartz/components/styles/graph.scss @@ -11,6 +11,7 @@ height: 250px; margin: 0.5em 0; position: relative; + overflow: hidden; & > #global-graph-icon { color: var(--dark); @@ -30,10 +31,6 @@ background-color: var(--lightgray); } } - - & > #graph-container > svg { - margin-bottom: -5px; - } } & > #global-graph-outer { diff --git a/quartz/components/styles/listPage.scss b/quartz/components/styles/listPage.scss index a5d0a915..18238150 100644 --- a/quartz/components/styles/listPage.scss +++ b/quartz/components/styles/listPage.scss @@ -8,29 +8,36 @@ li.section-li { margin-bottom: 1em; & > .section { - display: flex; - align-items: center; + display: grid; + grid-template-columns: 6em 3fr 1fr; @media all and (max-width: 600px) { - & .tags { + & > .tags { display: none; } } - & h3 > a { - font-weight: 700; - margin: 0; - background-color: transparent; + & > .tags { + justify-self: end; + margin-left: 1rem; + } + + & > .desc a { + background-color: transparent; } - & p { + & > .meta { margin: 0; - padding-right: 1em; flex-basis: 6em; + opacity: 0.6; } } +} - & .meta { - opacity: 0.6; +// modifications in popover context +.popover .section { + grid-template-columns: 6em 1fr !important; + & > .tags { + display: none; } } diff --git a/quartz/components/styles/popover.scss b/quartz/components/styles/popover.scss index 5ae09fe4..80bdfad4 100644 --- a/quartz/components/styles/popover.scss +++ b/quartz/components/styles/popover.scss @@ -24,7 +24,7 @@ height: 20rem; padding: 0 1rem 1rem 1rem; font-weight: initial; - line-height: initial; + line-height: normal; font-size: initial; font-family: var(--bodyFont); border: 1px solid var(--gray); diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss index 32d57443..cbf982a6 100644 --- a/quartz/components/styles/search.scss +++ b/quartz/components/styles/search.scss @@ -1,8 +1,7 @@ .search { min-width: 5rem; - max-width: 12rem; + max-width: 14rem; flex-grow: 0.3; - margin: 0 1.5rem; & > #search-icon { background-color: var(--lightgray); diff --git a/quartz/components/types.ts b/quartz/components/types.ts index c7584b6f..d1c153dd 100644 --- a/quartz/components/types.ts +++ b/quartz/components/types.ts @@ -8,7 +8,7 @@ export type QuartzComponentProps = { externalResources: StaticResources fileData: QuartzPluginData cfg: GlobalConfiguration - children: QuartzComponent[] | JSX.Element[] + children: (QuartzComponent | JSX.Element)[] tree: Node allFiles: QuartzPluginData[] } diff --git a/quartz/path.ts b/quartz/path.ts index 4755687e..81cdb3a3 100644 --- a/quartz/path.ts +++ b/quartz/path.ts @@ -5,7 +5,17 @@ function slugSegment(s: string): string { return s.replace(/\s/g, '-') } +// on the client, 'index' isn't ever rendered so we should clean it up +export function clientSideSlug(fp: string): string { + if (fp.endsWith("index")) { + fp = fp.slice(0, -"index".length) + } + + return fp +} + export function trimPathSuffix(fp: string): string { + fp = clientSideSlug(fp) let [cleanPath, anchor] = fp.split("#", 2) anchor = anchor === undefined ? "" : "#" + anchor @@ -27,9 +37,6 @@ export function slugify(s: string): string { // resolve /a/b/c to ../../ export function resolveToRoot(slug: string): string { let fp = trimPathSuffix(slug) - if (fp.endsWith("index")) { - fp = fp.slice(0, -"index".length) - } if (fp === "") { return "." diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts index f75334a4..cf427569 100644 --- a/quartz/plugins/emitters/contentIndex.ts +++ b/quartz/plugins/emitters/contentIndex.ts @@ -36,7 +36,6 @@ function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex): string { const base = cfg.canonicalUrl ?? "" const root = `https://${base}` - // TODO: ogimage const createURLEntry = (slug: string, content: ContentDetails): string => ` ${content.title} ${root}/${slug} diff --git a/quartz/plugins/index.ts b/quartz/plugins/index.ts index 88158113..c55e4dd7 100644 --- a/quartz/plugins/index.ts +++ b/quartz/plugins/index.ts @@ -1,29 +1,17 @@ import { GlobalConfiguration } from '../cfg' import { QuartzComponent } from '../components/types' import { StaticResources } from '../resources' -import { googleFontHref, joinStyles } from '../theme' +import { joinStyles } from '../theme' import { EmitCallback, PluginTypes } from './types' import styles from '../styles/base.scss' -// @ts-ignore -import spaRouterScript from '../components/scripts/spa.inline' -// @ts-ignore -import popoverScript from '../components/scripts/popover.inline' -import popoverStyle from '../components/styles/popover.scss' - export type ComponentResources = { css: string[], beforeDOMLoaded: string[], afterDOMLoaded: string[] } -function joinScripts(scripts: string[]): string { - // wrap with iife to prevent scope collision - return scripts.map(script => `(function () {${script}})();`).join("\n") -} - -export function emitComponentResources(cfg: GlobalConfiguration, resources: StaticResources, plugins: PluginTypes, emit: EmitCallback) { - const fps: string[] = [] +export function getComponentResources(plugins: PluginTypes): ComponentResources { const allComponents: Set = new Set() for (const emitter of plugins.emitters) { const components = emitter.getQuartzComponents() @@ -50,41 +38,35 @@ export function emitComponentResources(cfg: GlobalConfiguration, resources: Stat componentResources.afterDOMLoaded.push(afterDOMLoaded) } } - - if (cfg.enablePopovers) { - componentResources.afterDOMLoaded.push(popoverScript) - componentResources.css.push(popoverStyle) - } - if (cfg.enableSPA) { - componentResources.afterDOMLoaded.push(spaRouterScript) - } else { - componentResources.afterDOMLoaded.push(` - window.spaNavigate = (url, _) => window.location.assign(url) - const event = new CustomEvent("nav", { detail: { slug: document.body.dataset.slug } }) - document.dispatchEvent(event)` - ) - } + return componentResources +} - emit({ - slug: "index", - ext: ".css", - content: joinStyles(cfg.theme, styles, ...componentResources.css) - }) - emit({ - slug: "prescript", - ext: ".js", - content: joinScripts(componentResources.beforeDOMLoaded) - }) - emit({ - slug: "postscript", - ext: ".js", - content: joinScripts(componentResources.afterDOMLoaded) - }) +function joinScripts(scripts: string[]): string { + // wrap with iife to prevent scope collision + return scripts.map(script => `(function () {${script}})();`).join("\n") +} - fps.push("index.css", "prescript.js", "postscript.js") - resources.css.push(googleFontHref(cfg.theme)) +export async function emitComponentResources(cfg: GlobalConfiguration, res: ComponentResources, emit: EmitCallback): Promise { + const fps = await Promise.all([ + emit({ + slug: "index", + ext: ".css", + content: joinStyles(cfg.theme, styles, ...res.css) + }), + emit({ + slug: "prescript", + ext: ".js", + content: joinScripts(res.beforeDOMLoaded) + }), + emit({ + slug: "postscript", + ext: ".js", + content: joinScripts(res.afterDOMLoaded) + }) + ]) return fps + } export function getStaticResourcesFromPlugins(plugins: PluginTypes) { diff --git a/quartz/plugins/transformers/gfm.ts b/quartz/plugins/transformers/gfm.ts index 54f8ca67..f966e58b 100644 --- a/quartz/plugins/transformers/gfm.ts +++ b/quartz/plugins/transformers/gfm.ts @@ -1,4 +1,3 @@ -import { PluggableList } from "unified" import remarkGfm from "remark-gfm" import smartypants from 'remark-smartypants' import { QuartzTransformerPlugin } from "../types" @@ -20,14 +19,14 @@ export const GitHubFlavoredMarkdown: QuartzTransformerPlugin | return { name: "GitHubFlavoredMarkdown", markdownPlugins() { - return opts.enableSmartyPants ? [remarkGfm] : [remarkGfm, smartypants] + return opts.enableSmartyPants ? [remarkGfm, smartypants] : [remarkGfm] }, htmlPlugins() { if (opts.linkHeadings) { return [rehypeSlug, [rehypeAutolinkHeadings, { behavior: 'append', content: { type: 'text', - value: ' §' + value: ' §', } }]] } else { diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 13914523..b8a800a7 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -1,5 +1,5 @@ import { QuartzTransformerPlugin } from "../types" -import { relativeToRoot, slugify, trimPathSuffix } from "../../path" +import { clientSideSlug, relativeToRoot, slugify, trimPathSuffix } from "../../path" import path from "path" import { visit } from 'unist-util-visit' import isAbsoluteUrl from "is-absolute-url" @@ -27,7 +27,7 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = htmlPlugins() { return [() => { return (tree, file) => { - const curSlug = file.data.slug! + const curSlug = clientSideSlug(file.data.slug!) const transformLink = (target: string) => { const targetSlug = slugify(decodeURI(target).trim()) if (opts.markdownLinkResolution === 'relative' && !path.isAbsolute(targetSlug)) { @@ -49,7 +49,6 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = let dest = node.properties.href node.properties.className = isAbsoluteUrl(dest) ? "external" : "internal" - // don't process external links or intra-document anchors if (!(isAbsoluteUrl(dest) || dest.startsWith("#"))) { node.properties.href = transformLink(dest) diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts index e1438fae..7150f5ec 100644 --- a/quartz/processors/emit.ts +++ b/quartz/processors/emit.ts @@ -1,13 +1,69 @@ import path from "path" import fs from "fs" -import { QuartzConfig } from "../cfg" +import { GlobalConfiguration, QuartzConfig } from "../cfg" import { PerfTimer } from "../perf" -import { emitComponentResources, getStaticResourcesFromPlugins } from "../plugins" +import { ComponentResources, emitComponentResources, getComponentResources, getStaticResourcesFromPlugins } from "../plugins" import { EmitCallback } from "../plugins/types" import { ProcessedContent } from "../plugins/vfile" import { QUARTZ, slugify } from "../path" import { globbyStream } from "globby" import chalk from "chalk" +import { googleFontHref } from '../theme' + +// @ts-ignore +import spaRouterScript from '../components/scripts/spa.inline' +// @ts-ignore +import plausibleScript from '../components/scripts/plausible.inline' +// @ts-ignore +import popoverScript from '../components/scripts/popover.inline' +import popoverStyle from '../components/styles/popover.scss' +import { StaticResources } from "../resources" + +function addGlobalPageResources(cfg: GlobalConfiguration, staticResources: StaticResources, componentResources: ComponentResources) { + // font and other resources + staticResources.css.push(googleFontHref(cfg.theme)) + + // popovers + if (cfg.enablePopovers) { + componentResources.afterDOMLoaded.push(popoverScript) + componentResources.css.push(popoverStyle) + } + + if (cfg.analytics?.provider === "google") { + const tagId = cfg.analytics.tagId + staticResources.js.push({ + src: `https://www.googletagmanager.com/gtag/js?id=${tagId}`, + contentType: 'external', + loadTime: 'afterDOMReady', + }) + componentResources.afterDOMLoaded.push(` + window.dataLayer = window.dataLayer || []; + function gtag() { dataLayer.push(arguments); } + gtag(\`js\`, new Date()); + gtag(\`config\`, \`${tagId}\`, { send_page_view: false }); + + document.addEventListener(\`nav\`, () => { + gtag(\`event\`, \`page_view\`, { + page_title: document.title, + page_location: location.href, + }); + });` + ) + } else if (cfg.analytics?.provider === "plausible") { + componentResources.afterDOMLoaded.push(plausibleScript) + } + + // spa + if (cfg.enableSPA) { + componentResources.afterDOMLoaded.push(spaRouterScript) + } else { + componentResources.afterDOMLoaded.push(` + window.spaNavigate = (url, _) => window.location.assign(url) + const event = new CustomEvent("nav", { detail: { slug: document.body.dataset.slug } }) + document.dispatchEvent(event)` + ) + } +} export async function emitContent(contentFolder: string, output: string, cfg: QuartzConfig, content: ProcessedContent[], verbose: boolean) { const perf = new PerfTimer() @@ -19,9 +75,25 @@ export async function emitContent(contentFolder: string, output: string, cfg: Qu return pathToPage } + // initialize from plugins const staticResources = getStaticResourcesFromPlugins(cfg.plugins) - emitComponentResources(cfg.configuration, staticResources, cfg.plugins, emit) + // component specific scripts and styles + const componentResources = getComponentResources(cfg.plugins) + // important that this goes *after* component scripts + // as the "nav" event gets triggered here and we should make sure + // that everyone else had the chance to register a listener for it + addGlobalPageResources(cfg.configuration, staticResources, componentResources) + + // emit in one go + const emittedResources = await emitComponentResources(cfg.configuration, componentResources, emit) + if (verbose) { + for (const file of emittedResources) { + console.log(`[emit:Resources] ${file}`) + } + } + + // emitter plugins let emittedFiles = 0 for (const emitter of cfg.plugins.emitters) { try { diff --git a/quartz/resources.tsx b/quartz/resources.tsx index 78ae10b6..37807518 100644 --- a/quartz/resources.tsx +++ b/quartz/resources.tsx @@ -3,7 +3,8 @@ import { JSX } from "preact/jsx-runtime" export type JSResource = { loadTime: 'beforeDOMReady' | 'afterDOMReady' - moduleType?: 'module' + moduleType?: 'module', + spaPreserve?: boolean } & ({ src: string contentType: 'external' @@ -14,11 +15,12 @@ export type JSResource = { export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element { const scriptType = resource.moduleType ?? 'application/javascript' + const spaPreserve = preserve ?? resource.spaPreserve if (resource.contentType === 'external') { - return + return } } diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 45e6370c..db0299be 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -11,6 +11,9 @@ body { box-sizing: border-box; background-color: var(--light); font-family: var(--bodyFont); + --pageWidth: 800px; + --sidePanelWidth: 400px; + --topSpacing: 6rem; } .text-highlight { @@ -27,7 +30,7 @@ p, ul, text, a, tr, td, li, ol, ul, .katex { a { font-weight: 600; text-decoration: none; - transition: all 0.2s ease; + transition: color 0.2s ease; color: var(--secondary); &:hover { @@ -43,34 +46,48 @@ a { } .page { - margin: 6rem 35vw 6rem 20vw; - max-width: 1000px; - position: relative; + & > .page-header { + max-width: var(--pageWidth); + margin: var(--topSpacing) auto 0 auto; + } - & .left, & .right { - position: fixed; - height: 100vh; - overflow-y: scroll; - box-sizing: border-box; + & > #quartz-body { + width: 100%; display: flex; - flex-direction: column; - top: 0; - gap: 2rem; - padding: 6rem; - } - - & .left { - left: 0; - padding-left: 10vw; - width: 20vw; - } - & .right { - right: 0; - padding-right: 10vw; - width: 35vw; + & .left, & .right { + flex: 1; + width: calc(calc(100vw - var(--pageWidth)) / 2); + } + + & .left-inner, & .right-inner { + display: flex; + flex-direction: column; + gap: 2rem; + top: 0; + width: var(--sidePanelWidth); + margin-top: calc(var(--topSpacing)); + box-sizing: border-box; + padding: 0 4rem; + position: fixed; + } + + & .left-inner { + left: calc(calc(100vw - var(--pageWidth)) / 2 - var(--sidePanelWidth)); + } + + & .right-inner { + right: calc(calc(100vw - var(--pageWidth)) / 2 - var(--sidePanelWidth)); + } + + & .center { + width: var(--pageWidth); + margin: 0 auto; + } } +} +.page { @media all and (max-width: 1200px) { margin: 25px 5vw; & .left, & .right { @@ -89,9 +106,26 @@ a { & > h1 { font-size: 2rem; } + + // darkmode diagrams + & svg { + stroke: var(--dark); + } + + & ul:has(input[type='checkbox']) { + list-style-type: none; + padding-left: 0; + } } } +input[type="checkbox"] { + transform: translateY(2px); + color: var(--secondary); + border-color: var(--lightgray); + background-color: var(--light); +} + blockquote { margin: 1rem 0; border-left: 3px solid var(--secondary); @@ -120,7 +154,7 @@ thead { } h1, h2, h3, h4, h5, h6 { - &[id] > a { + &[id] > a[href^="#"] { margin: 0 0.5rem; opacity: 0; transition: opacity 0.2s ease; From ab9da02c60c962128820e6874e6f07c98bc3dda7 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 4 Jul 2023 10:08:32 -0700 Subject: [PATCH 0378/1221] fix indexing causing main thread freeze, various polish --- package-lock.json | 9 ++ package.json | 1 + quartz.config.ts | 4 +- quartz/components/DesktopOnly.tsx | 20 ++++ quartz/components/Graph.tsx | 18 +-- quartz/components/Head.tsx | 4 +- quartz/components/MobileOnly.tsx | 20 ++++ quartz/components/PageList.tsx | 2 +- quartz/components/ReadingTime.tsx | 3 +- quartz/components/TableOfContents.tsx | 2 +- quartz/components/TagList.tsx | 1 + quartz/components/index.ts | 6 +- quartz/components/pages/FolderContent.tsx | 10 +- quartz/components/pages/TagContent.tsx | 9 +- quartz/components/renderPage.tsx | 2 +- quartz/components/scripts/graph.inline.ts | 18 +-- quartz/components/scripts/popover.inline.ts | 118 ++++++++++---------- quartz/components/scripts/search.inline.ts | 8 +- quartz/components/styles/darkmode.scss | 1 + quartz/components/styles/graph.scss | 2 +- quartz/components/styles/listPage.scss | 6 +- quartz/components/styles/popover.scss | 4 +- quartz/components/styles/search.scss | 4 +- quartz/path.ts | 8 +- quartz/plugins/emitters/contentIndex.ts | 7 +- quartz/plugins/emitters/folderPage.tsx | 3 +- quartz/plugins/emitters/tagPage.tsx | 3 +- quartz/plugins/index.ts | 26 +++-- quartz/processors/emit.ts | 10 +- quartz/resources.tsx | 2 +- quartz/styles/base.scss | 40 ++++--- quartz/styles/variables.scss | 5 + quartz/theme.ts | 8 +- 33 files changed, 249 insertions(+), 135 deletions(-) create mode 100644 quartz/components/DesktopOnly.tsx create mode 100644 quartz/components/MobileOnly.tsx create mode 100644 quartz/styles/variables.scss diff --git a/package-lock.json b/package-lock.json index 92e22eb0..fb8f23c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "mdast-util-find-and-replace": "^2.2.2", "mdast-util-to-string": "^3.2.0", "micromorph": "^0.4.5", + "plausible-tracker": "^0.3.8", "preact": "^10.14.1", "preact-render-to-string": "^6.0.3", "pretty-time": "^1.1.0", @@ -3619,6 +3620,14 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/plausible-tracker": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/plausible-tracker/-/plausible-tracker-0.3.8.tgz", + "integrity": "sha512-lmOWYQ7s9KOUJ1R+YTOR3HrjdbxIS2Z4de0P/Jx2dQPteznJl2eX3tXxKClpvbfyGP59B5bbhW8ftN59HbbFSg==", + "engines": { + "node": ">=10" + } + }, "node_modules/preact": { "version": "10.15.1", "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", diff --git a/package.json b/package.json index 614bb761..689548d8 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "mdast-util-find-and-replace": "^2.2.2", "mdast-util-to-string": "^3.2.0", "micromorph": "^0.4.5", + "plausible-tracker": "^0.3.8", "preact": "^10.14.1", "preact-render-to-string": "^6.0.3", "pretty-time": "^1.1.0", diff --git a/quartz.config.ts b/quartz.config.ts index 58c1d9cd..18f2533e 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -23,8 +23,8 @@ const contentPageLayout: PageLayout = { left: [ Component.PageTitle(), Component.Search(), - Component.TableOfContents(), - Component.Darkmode() + Component.Darkmode(), + Component.DesktopOnly(Component.TableOfContents()), ], right: [ Component.Graph(), diff --git a/quartz/components/DesktopOnly.tsx b/quartz/components/DesktopOnly.tsx new file mode 100644 index 00000000..a1c5dae9 --- /dev/null +++ b/quartz/components/DesktopOnly.tsx @@ -0,0 +1,20 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +export default ((component?: QuartzComponent) => { + if (component) { + const Component = component + function DesktopOnly(props: QuartzComponentProps) { + return
    + +
    + } + + DesktopOnly.displayName = component.displayName + DesktopOnly.afterDOMLoaded = component?.afterDOMLoaded + DesktopOnly.beforeDOMLoaded = component?.beforeDOMLoaded + DesktopOnly.css = component?.css + return DesktopOnly + } else { + return () => <> + } +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Graph.tsx b/quartz/components/Graph.tsx index 01461882..e7f1df23 100644 --- a/quartz/components/Graph.tsx +++ b/quartz/components/Graph.tsx @@ -25,23 +25,23 @@ const defaultOptions: GraphOptions = { drag: true, zoom: true, depth: 1, - scale: 1.2, - repelForce: 2, - centerForce: 1, + scale: 1.1, + repelForce: 0.5, + centerForce: 0.3, linkDistance: 30, fontSize: 0.6, - opacityScale: 3 + opacityScale: 1 }, globalGraph: { drag: true, zoom: true, depth: -1, - scale: 1.2, - repelForce: 1, - centerForce: 1, + scale: 0.9, + repelForce: 0.5, + centerForce: 0.3, linkDistance: 30, - fontSize: 0.5, - opacityScale: 3 + fontSize: 0.6, + opacityScale: 1 } } diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index f8439a05..bfc7bae2 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -1,10 +1,10 @@ -import { resolveToRoot } from "../path" +import { clientSideSlug, resolveToRoot } from "../path" import { JSResourceToScriptElement } from "../resources" import { QuartzComponentConstructor, QuartzComponentProps } from "./types" export default (() => { function Head({ fileData, externalResources }: QuartzComponentProps) { - const slug = fileData.slug! + const slug = clientSideSlug(fileData.slug!) const title = fileData.frontmatter?.title ?? "Untitled" const description = fileData.description ?? "No description provided" const { css, js } = externalResources diff --git a/quartz/components/MobileOnly.tsx b/quartz/components/MobileOnly.tsx new file mode 100644 index 00000000..b75fd76a --- /dev/null +++ b/quartz/components/MobileOnly.tsx @@ -0,0 +1,20 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +export default ((component?: QuartzComponent) => { + if (component) { + const Component = component + function MobileOnly(props: QuartzComponentProps) { + return
    + +
    + } + + MobileOnly.displayName = component.displayName + MobileOnly.afterDOMLoaded = component?.afterDOMLoaded + MobileOnly.beforeDOMLoaded = component?.beforeDOMLoaded + MobileOnly.css = component?.css + return MobileOnly + } else { + return () => <> + } +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/PageList.tsx b/quartz/components/PageList.tsx index 3c39bee9..b92720de 100644 --- a/quartz/components/PageList.tsx +++ b/quartz/components/PageList.tsx @@ -23,7 +23,7 @@ function byDateAndAlphabetical(f1: QuartzPluginData, f2: QuartzPluginData): numb export function PageList({ fileData, allFiles }: QuartzComponentProps) { const slug = fileData.slug! - return

    -

    {pages.length} items with this tag. {pages.length > numPages && `Showing first ${numPages}.`}

    +

    + {pages.length} items with this tag.{" "} + {pages.length > numPages && `Showing first ${numPages}.`} +

    ) From 45f9087f03fde7e7d762e25a9f2966d1e6e907f3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 25 Jul 2023 22:27:59 -0700 Subject: [PATCH 0425/1221] fix checkbox/tasklist styling --- content/features/upcoming features.md | 1 - quartz/styles/base.scss | 39 ++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index dab75c6a..6d36de85 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -6,7 +6,6 @@ draft: true - images in same folder are broken on shortest path mode - watch mode for config/source code -- https://help.obsidian.md/Editing+and+formatting/Basic+formatting+syntax#Task+lists task list styling - publish metadata https://help.obsidian.md/Editing+and+formatting/Metadata#Metadata+for+Obsidian+Publish - metadata aliases: https://help.obsidian.md/Editing+and+formatting/Metadata#Predefined+metadata - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index fd94a1a1..ebdc2faf 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -92,11 +92,17 @@ a { & li:has(> input[type="checkbox"]) { list-style-type: none; padding-left: 0; - margin-left: -1.4rem; + } + + & li:has(> input[type="checkbox"]:checked) { + text-decoration: line-through; + text-decoration-color: var(--gray); + color: var(--gray); } & li > * { - margin: 0; + margin-top: 0; + margin-bottom: 0; } } @@ -175,8 +181,35 @@ a { input[type="checkbox"] { transform: translateY(2px); color: var(--secondary); - border-color: var(--lightgray); + border: 1px solid var(--lightgray); + border-radius: 3px; background-color: var(--light); + position: relative; + margin-inline-end: 0.2rem; + margin-inline-start: -1.4rem; + appearance: none; + width: 16px; + height: 16px; + + &:checked { + border-color: var(--secondary); + background-color: var(--secondary); + + &::after { + content: ""; + top: -1px; + left: -1px; + position: absolute; + left: 4px; + top: 1px; + width: 4px; + height: 8px; + display: block; + border: solid 1px var(--light); + border-width: 0 2px 2px 0; + transform: rotate(45deg); + } + } } blockquote { From cc7950267089648e4329531105fe5f8ba011b1b4 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 25 Jul 2023 23:37:24 -0700 Subject: [PATCH 0426/1221] make layouts simpler to think about --- content/advanced/making plugins.md | 12 +-- content/configuration.md | 4 +- content/features/upcoming features.md | 2 - quartz.config.ts | 127 ++++++++---------------- quartz.layout.ts | 39 ++++++++ quartz/plugins/emitters/contentPage.tsx | 17 ++-- quartz/plugins/emitters/folderPage.tsx | 15 ++- quartz/plugins/emitters/tagPage.tsx | 15 ++- 8 files changed, 113 insertions(+), 118 deletions(-) create mode 100644 quartz.layout.ts diff --git a/content/advanced/making plugins.md b/content/advanced/making plugins.md index 661b5162..a73069e6 100644 --- a/content/advanced/making plugins.md +++ b/content/advanced/making plugins.md @@ -4,17 +4,9 @@ title: Making your own plugins This part of the documentation will assume you have some basic coding knowledge and will include code snippets that describe the interface of what Quartz plugins should look like. -## Transformers +![[quartz-transform-pipeline.png]] -```ts -export type QuartzTransformerPluginInstance = { - name: string - textTransform?: (src: string | Buffer) => string | Buffer - markdownPlugins?: () => PluggableList - htmlPlugins?: () => PluggableList - externalResources?: () => Partial -} -``` +## Transformers ## Filters diff --git a/content/configuration.md b/content/configuration.md index 9f103f4a..1545d66b 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -75,8 +75,10 @@ transformers: [ ] ``` +If you'd like to make your own plugins, read the guide on [[making plugins]] for more information. + ### Layout -Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To make sure that +Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To enable easy customization, these emitters allow you to fully rearrange the layout of the page. ### Components diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 6d36de85..370e2cd4 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -6,8 +6,6 @@ draft: true - images in same folder are broken on shortest path mode - watch mode for config/source code -- publish metadata https://help.obsidian.md/Editing+and+formatting/Metadata#Metadata+for+Obsidian+Publish -- metadata aliases: https://help.obsidian.md/Editing+and+formatting/Metadata#Predefined+metadata - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note - note/header/block transcludes: https://help.obsidian.md/Linking+notes+and+files/Embedding+files diff --git a/quartz.config.ts b/quartz.config.ts index 211fa937..83b59e69 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -1,83 +1,46 @@ -import { GlobalConfiguration, PageLayout, QuartzConfig } from "./quartz/cfg" -import * as Component from "./quartz/components" +import { QuartzConfig } from "./quartz/cfg" import * as Plugin from "./quartz/plugins" -const generalConfiguration: GlobalConfiguration = { - pageTitle: "🪴 Quartz 4.0", - enableSPA: true, - enablePopovers: true, - analytics: { - provider: "plausible", - }, - baseUrl: "quartz.jzhao.xyz", - ignorePatterns: ["private", "templates"], - theme: { - typography: { - header: "Schibsted Grotesk", - body: "Source Sans Pro", - code: "IBM Plex Mono", +const config: QuartzConfig = { + configuration: { + pageTitle: "🪴 Quartz 4.0", + enableSPA: true, + enablePopovers: true, + analytics: { + provider: "plausible", }, - colors: { - lightMode: { - light: "#faf8f8", - lightgray: "#e5e5e5", - gray: "#b8b8b8", - darkgray: "#4e4e4e", - dark: "#2b2b2b", - secondary: "#284b63", - tertiary: "#84a59d", - highlight: "rgba(143, 159, 169, 0.15)", + baseUrl: "quartz.jzhao.xyz", + ignorePatterns: ["private", "templates"], + theme: { + typography: { + header: "Schibsted Grotesk", + body: "Source Sans Pro", + code: "IBM Plex Mono", }, - darkMode: { - light: "#161618", - lightgray: "#393639", - gray: "#646464", - darkgray: "#d4d4d4", - dark: "#ebebec", - secondary: "#7b97aa", - tertiary: "#84a59d", - highlight: "rgba(143, 159, 169, 0.15)", + colors: { + lightMode: { + light: "#faf8f8", + lightgray: "#e5e5e5", + gray: "#b8b8b8", + darkgray: "#4e4e4e", + dark: "#2b2b2b", + secondary: "#284b63", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + }, + darkMode: { + light: "#161618", + lightgray: "#393639", + gray: "#646464", + darkgray: "#d4d4d4", + dark: "#ebebec", + secondary: "#7b97aa", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + }, }, }, }, -} - -const sharedPageComponents = { - head: Component.Head(), - header: [], - footer: Component.Footer({ - links: { - GitHub: "https://github.com/jackyzha0/quartz", - "Discord Community": "https://discord.gg/cRFFHYye7t", - }, - }), -} - -const contentPageLayout: PageLayout = { - beforeBody: [Component.ArticleTitle(), Component.ReadingTime(), Component.TagList()], - left: [ - Component.PageTitle(), - Component.MobileOnly(Component.Spacer()), - Component.Search(), - Component.Darkmode(), - Component.DesktopOnly(Component.TableOfContents()), - ], - right: [Component.Graph(), Component.Backlinks()], -} - -const listPageLayout: PageLayout = { - beforeBody: [Component.ArticleTitle()], - left: [ - Component.PageTitle(), - Component.MobileOnly(Component.Spacer()), - Component.Search(), - Component.Darkmode(), - ], - right: [], -} - -const config: QuartzConfig = { - configuration: generalConfiguration, plugins: { transformers: [ Plugin.FrontMatter(), @@ -96,21 +59,9 @@ const config: QuartzConfig = { emitters: [ Plugin.AliasRedirects(), Plugin.ComponentResources({ fontOrigin: "googleFonts" }), - Plugin.ContentPage({ - ...sharedPageComponents, - ...contentPageLayout, - pageBody: Component.Content(), - }), - Plugin.FolderPage({ - ...sharedPageComponents, - ...listPageLayout, - pageBody: Component.FolderContent(), - }), - Plugin.TagPage({ - ...sharedPageComponents, - ...listPageLayout, - pageBody: Component.TagContent(), - }), + Plugin.ContentPage(), + Plugin.FolderPage(), + Plugin.TagPage(), Plugin.ContentIndex({ enableSiteMap: true, enableRSS: true, diff --git a/quartz.layout.ts b/quartz.layout.ts new file mode 100644 index 00000000..f47b2249 --- /dev/null +++ b/quartz.layout.ts @@ -0,0 +1,39 @@ +import { PageLayout } from "./quartz/cfg" +import * as Component from "./quartz/components" + +// components shared across all pages +export const sharedPageComponents = { + head: Component.Head(), + header: [], + footer: Component.Footer({ + links: { + GitHub: "https://github.com/jackyzha0/quartz", + "Discord Community": "https://discord.gg/cRFFHYye7t", + }, + }), +} + +// components for pages that display a single page (e.g. a single note) +export const defaultContentPageLayout: PageLayout = { + beforeBody: [Component.ArticleTitle(), Component.ReadingTime(), Component.TagList()], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Search(), + Component.Darkmode(), + Component.DesktopOnly(Component.TableOfContents()), + ], + right: [Component.Graph(), Component.Backlinks()], +} + +// components for pages that display lists of pages (e.g. tags or folders) +export const defaultListPageLayout: PageLayout = { + beforeBody: [Component.ArticleTitle()], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Search(), + Component.Darkmode(), + ], + right: [], +} diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx index 97198da6..25432532 100644 --- a/quartz/plugins/emitters/contentPage.tsx +++ b/quartz/plugins/emitters/contentPage.tsx @@ -5,22 +5,25 @@ import BodyConstructor from "../../components/Body" import { pageResources, renderPage } from "../../components/renderPage" import { FullPageLayout } from "../../cfg" import { FilePath, canonicalizeServer } from "../../path" +import { defaultContentPageLayout, sharedPageComponents } from "../../../quartz.layout" +import { Content } from "../../components" -export const ContentPage: QuartzEmitterPlugin = (opts) => { - if (!opts) { - throw new Error( - "ContentPage must be initialized with options specifiying the components to use", - ) +export const ContentPage: QuartzEmitterPlugin> = (userOpts) => { + const opts: FullPageLayout = { + ...sharedPageComponents, + ...defaultContentPageLayout, + pageBody: Content(), + ...userOpts, } - const { head: Head, header, beforeBody, pageBody: Content, left, right, footer: Footer } = opts + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts const Header = HeaderConstructor() const Body = BodyConstructor() return { name: "ContentPage", getQuartzComponents() { - return [Head, Header, Body, ...header, ...beforeBody, Content, ...left, ...right, Footer] + return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] }, async emit(ctx, content, resources, emit): Promise { const cfg = ctx.cfg.configuration diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index 8c6ae020..5de2e923 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -7,20 +7,25 @@ import { ProcessedContent, defaultProcessedContent } from "../vfile" import { FullPageLayout } from "../../cfg" import path from "path" import { CanonicalSlug, FilePath, ServerSlug, canonicalizeServer, joinSegments } from "../../path" +import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" +import { FolderContent } from "../../components" -export const FolderPage: QuartzEmitterPlugin = (opts) => { - if (!opts) { - throw new Error("ErrorPage must be initialized with options specifiying the components to use") +export const FolderPage: QuartzEmitterPlugin = (userOpts) => { + const opts: FullPageLayout = { + ...sharedPageComponents, + ...defaultListPageLayout, + pageBody: FolderContent(), + ...userOpts, } - const { head: Head, header, beforeBody, pageBody: Content, left, right, footer: Footer } = opts + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts const Header = HeaderConstructor() const Body = BodyConstructor() return { name: "FolderPage", getQuartzComponents() { - return [Head, Header, Body, ...header, ...beforeBody, Content, ...left, ...right, Footer] + return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] }, async emit(ctx, content, resources, emit): Promise { const fps: FilePath[] = [] diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index 2154851b..ae231d6e 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -12,20 +12,25 @@ import { getAllSegmentPrefixes, joinSegments, } from "../../path" +import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" +import { TagContent } from "../../components" -export const TagPage: QuartzEmitterPlugin = (opts) => { - if (!opts) { - throw new Error("TagPage must be initialized with options specifiying the components to use") +export const TagPage: QuartzEmitterPlugin = (userOpts) => { + const opts: FullPageLayout = { + ...sharedPageComponents, + ...defaultListPageLayout, + pageBody: TagContent(), + ...userOpts, } - const { head: Head, header, beforeBody, pageBody: Content, left, right, footer: Footer } = opts + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts const Header = HeaderConstructor() const Body = BodyConstructor() return { name: "TagPage", getQuartzComponents() { - return [Head, Header, Body, ...header, ...beforeBody, Content, ...left, ...right, Footer] + return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] }, async emit(ctx, content, resources, emit): Promise { const fps: FilePath[] = [] From cbae88fc4e9b98764cfccca2e85f265c4b894573 Mon Sep 17 00:00:00 2001 From: Adam Brangenberg Date: Mon, 31 Jul 2023 05:08:32 +0100 Subject: [PATCH 0427/1221] Removing redundant properties (#356) --- quartz/styles/base.scss | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index ebdc2faf..8253c5b8 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -136,7 +136,7 @@ a { & .sidebar.left { left: calc(calc(100vw - $pageWidth) / 2 - $sidePanelWidth); @media all and (max-width: $fullPageWidth) { - gap: 0rem; + gap: 0; align-items: center; } } @@ -197,15 +197,13 @@ input[type="checkbox"] { &::after { content: ""; - top: -1px; - left: -1px; position: absolute; left: 4px; top: 1px; width: 4px; height: 8px; display: block; - border: solid 1px var(--light); + border: solid var(--light); border-width: 0 2px 2px 0; transform: rotate(45deg); } From a70e846b0a14f3065bbf613221fee0e3b09c12ef Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 1 Aug 2023 22:47:16 -0700 Subject: [PATCH 0428/1221] flag to allow ofm replace in html embed --- content/advanced/architecture.md | 1 + content/advanced/paths.md | 0 content/configuration.md | 22 +++++++++- content/index.md | 2 +- package-lock.json | 63 ++++++++++++++++++++++++++-- package.json | 2 + quartz/plugins/transformers/links.ts | 1 + quartz/plugins/transformers/ofm.ts | 40 +++++++++++++++++- 8 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 content/advanced/architecture.md create mode 100644 content/advanced/paths.md diff --git a/content/advanced/architecture.md b/content/advanced/architecture.md new file mode 100644 index 00000000..688fd75f --- /dev/null +++ b/content/advanced/architecture.md @@ -0,0 +1 @@ +how does quartz work? great question lol diff --git a/content/advanced/paths.md b/content/advanced/paths.md new file mode 100644 index 00000000..e69de29b diff --git a/content/configuration.md b/content/configuration.md index 1545d66b..e31dbc2d 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -79,6 +79,26 @@ If you'd like to make your own plugins, read the guide on [[making plugins]] for ### Layout -Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To enable easy customization, these emitters allow you to fully rearrange the layout of the page. +Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To enable easy customization, these emitters allow you to fully rearrange the layout of the page. The default page layouts can be found in `quartz.layout.ts`. + +Ultimately, each page is composed of multiple different sections which contain `QuartzComponents`. The following code snippet lists all of the valid sections that you can add components to: + +```typescript title="quartz/cfg.ts" +export interface FullPageLayout { + head: QuartzComponent + header: QuartzComponent[] + beforeBody: QuartzComponent[] + pageBody: QuartzComponent + left: QuartzComponent[] + right: QuartzComponent[] + footer: QuartzComponent +} +``` + +These correspond to following parts of the page: ### Components + +See [a list of all the components](./tags/component) for all available components. + +### Style diff --git a/content/index.md b/content/index.md index 5c32c23d..050ce78a 100644 --- a/content/index.md +++ b/content/index.md @@ -6,7 +6,7 @@ Quartz is a fast, batteries-included static-site generator that transforms Markd ## 🪴 Get Started -Quartz requires **at least [Node](https://nodejs.org/) v16** to function correctly. In your terminal of choice, enter the following commands line by line: +Quartz requires **at least [Node](https://nodejs.org/) v18.14** to function correctly. In your terminal of choice, enter the following commands line by line: ```shell git clone https://github.com/jackyzha0/quartz.git diff --git a/package-lock.json b/package-lock.json index 7bb72bc2..3e106a65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,12 +21,14 @@ "github-slugger": "^2.0.0", "globby": "^13.1.4", "gray-matter": "^4.0.3", + "hast-util-to-html": "^8.0.4", "hast-util-to-jsx-runtime": "^1.2.0", "hast-util-to-string": "^2.0.0", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", "lightningcss": "^1.21.5", "mdast-util-find-and-replace": "^2.2.2", + "mdast-util-to-hast": "^12.3.0", "mdast-util-to-string": "^3.2.0", "micromorph": "^0.4.5", "plausible-tracker": "^0.3.8", @@ -1414,11 +1416,11 @@ "dev": true }, "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/js-yaml": { @@ -1736,6 +1738,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -2972,6 +2992,28 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "node_modules/hast-util-to-html": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", + "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^7.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-1.2.0.tgz", @@ -5404,6 +5446,19 @@ "node": ">=8" } }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", diff --git a/package.json b/package.json index cfd1d155..8a1d483c 100644 --- a/package.json +++ b/package.json @@ -40,12 +40,14 @@ "github-slugger": "^2.0.0", "globby": "^13.1.4", "gray-matter": "^4.0.3", + "hast-util-to-html": "^8.0.4", "hast-util-to-jsx-runtime": "^1.2.0", "hast-util-to-string": "^2.0.0", "is-absolute-url": "^4.0.1", "js-yaml": "^4.1.0", "lightningcss": "^1.21.5", "mdast-util-find-and-replace": "^2.2.2", + "mdast-util-to-hast": "^12.3.0", "mdast-util-to-string": "^3.2.0", "micromorph": "^0.4.5", "plausible-tracker": "^0.3.8", diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 7e8a2788..f5bfdfc6 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -47,6 +47,7 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = return targetCanonical === fileName }) + // only match, just use it if (matchingFileNames.length === 1) { const targetSlug = canonicalizeServer(matchingFileNames[0]) return (resolveRelative(curSlug, targetSlug) + targetAnchor) as RelativeURL diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 4a45b021..23b97d6f 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -1,7 +1,7 @@ import { PluggableList } from "unified" import { QuartzTransformerPlugin } from "../types" import { Root, HTML, BlockContent, DefinitionContent, Code } from "mdast" -import { findAndReplace } from "mdast-util-find-and-replace" +import { Replace, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace" import { slug as slugAnchor } from "github-slugger" import rehypeRaw from "rehype-raw" import { visit } from "unist-util-visit" @@ -10,6 +10,9 @@ import { JSResource } from "../../resources" // @ts-ignore import calloutScript from "../../components/scripts/callout.inline.ts" import { FilePath, canonicalizeServer, pathToRoot, slugTag, slugifyFilePath } from "../../path" +import { toHast } from "mdast-util-to-hast" +import { toHtml } from "hast-util-to-html" +import { PhrasingContent } from "mdast-util-find-and-replace/lib" export interface Options { comments: boolean @@ -18,6 +21,7 @@ export interface Options { callouts: boolean mermaid: boolean parseTags: boolean + enableInHtmlEmbed: boolean } const defaultOptions: Options = { @@ -27,6 +31,7 @@ const defaultOptions: Options = { callouts: true, mermaid: true, parseTags: true, + enableInHtmlEmbed: false, } const icons = { @@ -117,6 +122,39 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin userOpts, ) => { const opts = { ...defaultOptions, ...userOpts } + + const findAndReplace = opts.enableInHtmlEmbed + ? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => { + if (replace) { + const mdastToHtml = (ast: PhrasingContent) => { + const hast = toHast(ast, { allowDangerousHtml: true })! + return toHtml(hast, { allowDangerousHtml: true }) + } + + visit(tree, "html", (node: HTML) => { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace) + } else { + node.value = node.value.replaceAll(regex, (substring: string, ...args) => { + const replaceValue = replace(substring, ...args) + if (typeof replaceValue === "string") { + return replaceValue + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join("") + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue) + } else { + return substring + } + }) + } + }) + } + + mdastFindReplace(tree, regex, replace) + } + : mdastFindReplace + return { name: "ObsidianFlavoredMarkdown", textTransform(_ctx, src) { From c8c108c7f702ca3710733d6d455ca2661e13e8d3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 1 Aug 2023 23:29:58 -0700 Subject: [PATCH 0429/1221] change default strategy to be rebase --- quartz.config.ts | 2 +- quartz/bootstrap-cli.mjs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/quartz.config.ts b/quartz.config.ts index 83b59e69..bd7abfb6 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -49,7 +49,7 @@ const config: QuartzConfig = { priority: ["frontmatter", "filesystem"], // you can add 'git' here for last modified from Git but this makes the build slower }), Plugin.SyntaxHighlighting(), - Plugin.ObsidianFlavoredMarkdown(), + Plugin.ObsidianFlavoredMarkdown({ enableInHtmlEmbed: false }), Plugin.GitHubFlavoredMarkdown(), Plugin.CrawlLinks({ markdownLinkResolution: "shortest" }), Plugin.Latex({ renderEngine: "katex" }), diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index bc5df4e0..75f646bd 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -246,7 +246,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["pull", UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + spawnSync("git", ["rebase", UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") spawnSync("npm", ["i"], { stdio: "inherit" }) @@ -271,7 +271,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["pull", "origin", QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + spawnSync("git", ["rebase", "origin", QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) } await popContentFolder(contentFolder) From 9a0f20012a8f5051aa2faac62f91dc4f2a38151c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 00:07:41 -0700 Subject: [PATCH 0430/1221] windows patches --- quartz/build.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/quartz/build.ts b/quartz/build.ts index b96c462c..093025ae 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -10,7 +10,7 @@ import { parseMarkdown } from "./processors/parse" import { filterContent } from "./processors/filter" import { emitContent } from "./processors/emit" import cfg from "../quartz.config" -import { FilePath, slugifyFilePath } from "./path" +import { FilePath, joinSegments, slugifyFilePath } from "./path" import chokidar from "chokidar" import { ProcessedContent } from "./plugins/vfile" import WebSocket, { WebSocketServer } from "ws" @@ -42,16 +42,16 @@ async function buildQuartz(argv: Argv, version: string) { console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) perf.addEvent("glob") - const fps = await globby("**/*.md", { + const fps = (await globby("**/*.md", { cwd: argv.directory, ignore: cfg.configuration.ignorePatterns, gitignore: true, - }) + })).map(fp => fp.split(path.sep).join(path.posix.sep)) console.log( `Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, ) - const filePaths = fps.map((fp) => `${argv.directory}${path.sep}${fp}` as FilePath) + const filePaths = fps.map((fp) => joinSegments(argv.directory, fp) as FilePath) ctx.allSlugs = fps.map((fp) => slugifyFilePath(fp as FilePath)) const parsedFiles = await parseMarkdown(ctx, filePaths) @@ -81,8 +81,9 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { let toRebuild: Set = new Set() let toRemove: Set = new Set() async function rebuild(fp: string, action: "add" | "change" | "delete") { + fp = fp.split(path.sep).join(path.posix.sep) if (!ignored(fp)) { - const filePath = `${argv.directory}${path.sep}${fp}` as FilePath + const filePath = joinSegments(argv.directory, fp) as FilePath if (action === "add" || action === "change") { toRebuild.add(filePath) } else if (action === "delete") { From 429f331c212d598b0d7ff44f20f75cf007bcf32b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 20:53:13 -0700 Subject: [PATCH 0431/1221] make ci also run on windows, re-add css minification --- .github/workflows/ci.yaml | 2 +- quartz/bootstrap-cli.mjs | 11 ++++++++++- quartz/build.ts | 12 +++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 41c60231..89608659 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,7 +7,7 @@ on: jobs: build-and-test: - runs-on: ubuntu-22.04 + runs-on: [windows-latest, macos-13, ubuntu-22.04] permissions: contents: write steps: diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 75f646bd..0bf27aa4 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -11,7 +11,7 @@ import { intro, isCancel, outro, select, text } from "@clack/prompts" import { rimraf } from "rimraf" import prettyBytes from "pretty-bytes" import { spawnSync } from "child_process" -import { transform } from "lightningcss" +import { transform as cssTransform } from "lightningcss" const UPSTREAM_NAME = "upstream" const QUARTZ_SOURCE_BRANCH = "v4-alpha" @@ -115,6 +115,7 @@ async function stashContentFolder(contentFolder) { } async function popContentFolder(contentFolder) { + await fs.promises.rm(contentFolder, { force: true, recursive: true }) await fs.promises.cp(contentCacheFolder, contentFolder, { force: true, recursive: true, @@ -304,6 +305,14 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. sassPlugin({ type: "css-text", cssImports: true, + async transform(css) { + const { code } = cssTransform({ + filename: "style.css", + code: Buffer.from(css), + minify: true, + }) + return code.toString() + }, }), { name: "inline-script-loader", diff --git a/quartz/build.ts b/quartz/build.ts index 093025ae..9bd1e670 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -42,11 +42,13 @@ async function buildQuartz(argv: Argv, version: string) { console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) perf.addEvent("glob") - const fps = (await globby("**/*.md", { - cwd: argv.directory, - ignore: cfg.configuration.ignorePatterns, - gitignore: true, - })).map(fp => fp.split(path.sep).join(path.posix.sep)) + const fps = ( + await globby("**/*.md", { + cwd: argv.directory, + ignore: cfg.configuration.ignorePatterns, + gitignore: true, + }) + ).map((fp) => fp.split(path.sep).join(path.posix.sep)) console.log( `Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, ) From 0a33ff7a82658ecc6db3bb881db167f69893499c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 20:56:31 -0700 Subject: [PATCH 0432/1221] fix test matrix for ci --- .github/workflows/ci.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 89608659..4a7a9f7d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,7 +7,10 @@ on: jobs: build-and-test: - runs-on: [windows-latest, macos-13, ubuntu-22.04] + strategy: + matrix: + os: [windows-latest, macos-latest, ubuntu-latest] + runs-on: ${{ matrix.os }} permissions: contents: write steps: From 264ea3d54438b30bc7d9280e076e3f6e29d0ff8c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 20:59:56 -0700 Subject: [PATCH 0433/1221] add gitattributes for windows --- .gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..6313b56c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf From d7842e0ce713e338f21374cea407a46cace18cca Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 22:10:13 -0700 Subject: [PATCH 0434/1221] make path and globbing more platform invariant --- quartz.config.ts | 2 +- quartz/build.ts | 13 +++----- quartz/glob.ts | 18 +++++++++++ quartz/plugins/emitters/assets.ts | 48 ++++++++-------------------- quartz/plugins/emitters/static.ts | 12 +++---- quartz/plugins/transformers/links.ts | 2 +- quartz/processors/emit.ts | 4 +-- 7 files changed, 45 insertions(+), 54 deletions(-) create mode 100644 quartz/glob.ts diff --git a/quartz.config.ts b/quartz.config.ts index bd7abfb6..447039d6 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -66,7 +66,7 @@ const config: QuartzConfig = { enableSiteMap: true, enableRSS: true, }), - Plugin.Assets({ attachmentsFolder: "attachments" }), + Plugin.Assets(), Plugin.Static(), ], }, diff --git a/quartz/build.ts b/quartz/build.ts index 9bd1e670..688f735d 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -2,7 +2,7 @@ import "source-map-support/register.js" import path from "path" import { PerfTimer } from "./perf" import { rimraf } from "rimraf" -import { globby, isGitIgnored } from "globby" +import { isGitIgnored } from "globby" import chalk from "chalk" import http from "http" import serveHandler from "serve-handler" @@ -15,6 +15,7 @@ import chokidar from "chokidar" import { ProcessedContent } from "./plugins/vfile" import WebSocket, { WebSocketServer } from "ws" import { Argv, BuildCtx } from "./ctx" +import { glob, toPosixPath } from "./glob" async function buildQuartz(argv: Argv, version: string) { const ctx: BuildCtx = { @@ -42,13 +43,7 @@ async function buildQuartz(argv: Argv, version: string) { console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) perf.addEvent("glob") - const fps = ( - await globby("**/*.md", { - cwd: argv.directory, - ignore: cfg.configuration.ignorePatterns, - gitignore: true, - }) - ).map((fp) => fp.split(path.sep).join(path.posix.sep)) + const fps = await glob("**/*.md", argv.directory, cfg.configuration.ignorePatterns) console.log( `Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, ) @@ -83,7 +78,7 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { let toRebuild: Set = new Set() let toRemove: Set = new Set() async function rebuild(fp: string, action: "add" | "change" | "delete") { - fp = fp.split(path.sep).join(path.posix.sep) + fp = toPosixPath(fp) if (!ignored(fp)) { const filePath = joinSegments(argv.directory, fp) as FilePath if (action === "add" || action === "change") { diff --git a/quartz/glob.ts b/quartz/glob.ts new file mode 100644 index 00000000..dcfa61b3 --- /dev/null +++ b/quartz/glob.ts @@ -0,0 +1,18 @@ +import path from "path"; +import { FilePath } from "./path"; +import { globby } from "globby"; + +export function toPosixPath(fp: string): string { + return fp.split(path.sep).join("/") +} + +export async function glob(pattern: string, cwd: string, ignorePatterns: string[]): Promise { + const fps = ( + await globby(pattern, { + cwd, + ignore: ignorePatterns, + gitignore: true, + }) + ).map(toPosixPath) + return fps as FilePath[] +} diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts index d231d1d2..8ea3055d 100644 --- a/quartz/plugins/emitters/assets.ts +++ b/quartz/plugins/emitters/assets.ts @@ -1,55 +1,33 @@ -import { globbyStream } from "globby" -import { FilePath, slugifyFilePath } from "../../path" +import { FilePath, joinSegments, slugifyFilePath } from "../../path" import { QuartzEmitterPlugin } from "../types" import path from "path" import fs from "fs" +import { glob } from "../../glob" -interface Options { - attachmentsFolder: string | null -} - -const defaultOptions: Options = { - attachmentsFolder: null, -} - -export const Assets: QuartzEmitterPlugin = (userOpts?: Options) => { - const { attachmentsFolder } = { ...defaultOptions, ...userOpts } - +export const Assets: QuartzEmitterPlugin = () => { return { name: "Assets", getQuartzComponents() { return [] }, - async emit({ argv }, _content, _resources, _emit): Promise { + async emit({ argv, cfg }, _content, _resources, _emit): Promise { // glob all non MD/MDX/HTML files in content folder and copy it over - const assetsPath = path.join(argv.output, "assets") - - const fps: FilePath[] = [] - for await (const rawFp of globbyStream("**", { - ignore: ["**/*.md"], - cwd: argv.directory, - })) { - const fp = rawFp as FilePath + const assetsPath = joinSegments(argv.output, "assets") + const fps = await glob("**", argv.directory, ["**/*.md", ...cfg.configuration.ignorePatterns]) + const res: FilePath[] = [] + for (const fp of fps) { const ext = path.extname(fp) - const src = path.join(argv.directory, fp) as FilePath - let name = (slugifyFilePath(fp as FilePath) + ext) as FilePath - - if (attachmentsFolder) { - const segments = name.split("/") - if (segments.at(-2) === attachmentsFolder) { - segments.splice(-2, 1) - name = segments.join("/") as FilePath - } - } + const src = joinSegments(argv.directory, fp) as FilePath + const name = (slugifyFilePath(fp as FilePath) + ext) as FilePath - const dest = path.join(assetsPath, name) as FilePath + const dest = joinSegments(assetsPath, name) as FilePath const dir = path.dirname(dest) as FilePath await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists await fs.promises.copyFile(src, dest) - fps.push(path.join("assets", fp) as FilePath) + res.push(joinSegments("assets", fp) as FilePath) } - return fps + return res }, } } diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts index fa30327f..043a4619 100644 --- a/quartz/plugins/emitters/static.ts +++ b/quartz/plugins/emitters/static.ts @@ -1,18 +1,18 @@ -import { globby } from "globby" -import { FilePath, QUARTZ } from "../../path" +import { FilePath, QUARTZ, joinSegments } from "../../path" import { QuartzEmitterPlugin } from "../types" import path from "path" import fs from "fs" +import { glob } from "../../glob" export const Static: QuartzEmitterPlugin = () => ({ name: "Static", getQuartzComponents() { return [] }, - async emit({ argv }, _content, _resources, _emit): Promise { + async emit({ argv, cfg }, _content, _resources, _emit): Promise { const staticPath = path.join(QUARTZ, "static") - const fps = await globby("*", { cwd: staticPath }) - await fs.promises.cp(staticPath, path.join(argv.output, "static"), { recursive: true }) - return fps.map((fp) => path.join("static", fp)) as FilePath[] + const fps = await glob("**", staticPath, cfg.configuration.ignorePatterns) + await fs.promises.cp(staticPath, joinSegments(argv.output, "static"), { recursive: true }) + return fps.map((fp) => joinSegments("static", fp)) as FilePath[] }, }) diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index f5bfdfc6..aecb58f8 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -100,7 +100,7 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = if (!isAbsoluteUrl(node.properties.src)) { const ext = path.extname(node.properties.src) node.properties.src = - transformLink(path.join("assets", node.properties.src)) + ext + transformLink(joinSegments("assets", node.properties.src)) + ext } } }) diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts index 72d6085a..960f1e43 100644 --- a/quartz/processors/emit.ts +++ b/quartz/processors/emit.ts @@ -4,7 +4,7 @@ import { PerfTimer } from "../perf" import { getStaticResourcesFromPlugins } from "../plugins" import { EmitCallback } from "../plugins/types" import { ProcessedContent } from "../plugins/vfile" -import { FilePath } from "../path" +import { FilePath, joinSegments } from "../path" import { QuartzLogger } from "../log" import { trace } from "../trace" import { BuildCtx } from "../ctx" @@ -16,7 +16,7 @@ export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) { log.start(`Emitting output files`) const emit: EmitCallback = async ({ slug, ext, content }) => { - const pathToPage = path.join(argv.output, slug + ext) as FilePath + const pathToPage = joinSegments(argv.output, slug + ext) as FilePath const dir = path.dirname(pathToPage) await fs.promises.mkdir(dir, { recursive: true }) await fs.promises.writeFile(pathToPage, content) From 558a50916446746768fa43bbdfc8e229d8ec7759 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 22:11:46 -0700 Subject: [PATCH 0435/1221] format --- quartz/build.ts | 2 +- quartz/glob.ts | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/quartz/build.ts b/quartz/build.ts index 688f735d..07b51fb1 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -78,7 +78,7 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { let toRebuild: Set = new Set() let toRemove: Set = new Set() async function rebuild(fp: string, action: "add" | "change" | "delete") { - fp = toPosixPath(fp) + fp = toPosixPath(fp) if (!ignored(fp)) { const filePath = joinSegments(argv.directory, fp) as FilePath if (action === "add" || action === "change") { diff --git a/quartz/glob.ts b/quartz/glob.ts index dcfa61b3..7a711600 100644 --- a/quartz/glob.ts +++ b/quartz/glob.ts @@ -1,12 +1,16 @@ -import path from "path"; -import { FilePath } from "./path"; -import { globby } from "globby"; +import path from "path" +import { FilePath } from "./path" +import { globby } from "globby" export function toPosixPath(fp: string): string { return fp.split(path.sep).join("/") } -export async function glob(pattern: string, cwd: string, ignorePatterns: string[]): Promise { +export async function glob( + pattern: string, + cwd: string, + ignorePatterns: string[], +): Promise { const fps = ( await globby(pattern, { cwd, From 5537ca41e0069725e98ef9ad59a2d4dbaa0bd8ae Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 22:16:32 -0700 Subject: [PATCH 0436/1221] use autostash and pull --- quartz/bootstrap-cli.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 0bf27aa4..81715add 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -247,7 +247,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["rebase", UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + spawnSync("git", ["pull", "--rebase", "--autostash", UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") spawnSync("npm", ["i"], { stdio: "inherit" }) @@ -272,7 +272,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["rebase", "origin", QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + spawnSync("git", ["pull", "--rebase", "--autostash", "origin", QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) } await popContentFolder(contentFolder) From de72dd4e4af550cd72847d7cc0924a5859edb9e1 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 22:16:46 -0700 Subject: [PATCH 0437/1221] format --- quartz/bootstrap-cli.mjs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 81715add..0fbc6960 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -247,7 +247,9 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["pull", "--rebase", "--autostash", UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + spawnSync("git", ["pull", "--rebase", "--autostash", UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { + stdio: "inherit", + }) await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") spawnSync("npm", ["i"], { stdio: "inherit" }) @@ -272,7 +274,9 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["pull", "--rebase", "--autostash", "origin", QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + spawnSync("git", ["pull", "--rebase", "--autostash", "origin", QUARTZ_SOURCE_BRANCH], { + stdio: "inherit", + }) } await popContentFolder(contentFolder) From 663c41fa41faad1528335a18c73a197ed5c6ea11 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 23:04:26 -0700 Subject: [PATCH 0438/1221] use posix style paths for all path ops --- quartz/bootstrap-cli.mjs | 6 ------ quartz/build.ts | 2 +- quartz/plugins/emitters/aliases.ts | 2 +- quartz/plugins/emitters/static.ts | 3 +-- quartz/plugins/transformers/lastmod.ts | 2 +- quartz/plugins/transformers/links.ts | 2 +- quartz/processors/parse.ts | 2 +- 7 files changed, 6 insertions(+), 13 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 0fbc6960..21449f5b 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -49,12 +49,6 @@ const SyncArgv = { default: true, describe: "push updates to your Quartz fork", }, - force: { - boolean: true, - alias: ["f"], - default: true, - describe: "whether to apply the --force flag to git commands", - }, pull: { boolean: true, default: true, diff --git a/quartz/build.ts b/quartz/build.ts index 07b51fb1..c8b5b02d 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -99,7 +99,7 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { ctx.allSlugs = [...new Set([...contentMap.keys(), ...toRebuild])] .filter((fp) => !toRemove.has(fp)) - .map((fp) => slugifyFilePath(path.relative(argv.directory, fp) as FilePath)) + .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) const parsedContent = await parseMarkdown(ctx, filesToRebuild) for (const content of parsedContent) { diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts index 7d2c08ad..818b1d7d 100644 --- a/quartz/plugins/emitters/aliases.ts +++ b/quartz/plugins/emitters/aliases.ts @@ -18,7 +18,7 @@ export const AliasRedirects: QuartzEmitterPlugin = () => ({ for (const [_tree, file] of content) { const ogSlug = canonicalizeServer(file.data.slug!) - const dir = path.relative(argv.directory, file.dirname ?? argv.directory) + const dir = path.posix.relative(argv.directory, file.dirname ?? argv.directory) let aliases: CanonicalSlug[] = [] if (file.data.frontmatter?.aliases) { diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts index 043a4619..75bcc746 100644 --- a/quartz/plugins/emitters/static.ts +++ b/quartz/plugins/emitters/static.ts @@ -1,6 +1,5 @@ import { FilePath, QUARTZ, joinSegments } from "../../path" import { QuartzEmitterPlugin } from "../types" -import path from "path" import fs from "fs" import { glob } from "../../glob" @@ -10,7 +9,7 @@ export const Static: QuartzEmitterPlugin = () => ({ return [] }, async emit({ argv, cfg }, _content, _resources, _emit): Promise { - const staticPath = path.join(QUARTZ, "static") + const staticPath = joinSegments(QUARTZ, "static") const fps = await glob("**", staticPath, cfg.configuration.ignorePatterns) await fs.promises.cp(staticPath, joinSegments(argv.output, "static"), { recursive: true }) return fps.map((fp) => joinSegments("static", fp)) as FilePath[] diff --git a/quartz/plugins/transformers/lastmod.ts b/quartz/plugins/transformers/lastmod.ts index ecdcc413..15dd89e3 100644 --- a/quartz/plugins/transformers/lastmod.ts +++ b/quartz/plugins/transformers/lastmod.ts @@ -27,7 +27,7 @@ export const CreatedModifiedDate: QuartzTransformerPlugin | und let modified: MaybeDate = undefined let published: MaybeDate = undefined - const fp = path.join(file.cwd, file.data.filePath as string) + const fp = path.posix.join(file.cwd, file.data.filePath as string) for (const source of opts.priority) { if (source === "filesystem") { const st = await fs.promises.stat(fp) diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index aecb58f8..07650621 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -76,7 +76,7 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = // don't process external links or intra-document anchors if (!(isAbsoluteUrl(dest) || dest.startsWith("#"))) { dest = node.properties.href = transformLink(dest) - const canonicalDest = path.normalize(joinSegments(curSlug, dest)) + const canonicalDest = path.posix.normalize(joinSegments(curSlug, dest)) const [destCanonical, _destAnchor] = splitAnchor(canonicalDest) outgoing.add(destCanonical as CanonicalSlug) } diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 23af762a..289ca946 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -91,7 +91,7 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { } // base data properties that plugins may use - file.data.slug = slugifyFilePath(path.relative(argv.directory, file.path) as FilePath) + file.data.slug = slugifyFilePath(path.posix.relative(argv.directory, file.path) as FilePath) file.data.filePath = fp const ast = processor.parse(file) From fdf1e2a41d079c4f2d1f3df7c297fa0d92a18cc9 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 23:29:28 -0700 Subject: [PATCH 0439/1221] use checkout for pulling updates --- quartz/bootstrap-cli.mjs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 21449f5b..63875359 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -13,6 +13,7 @@ import prettyBytes from "pretty-bytes" import { spawnSync } from "child_process" import { transform as cssTransform } from "lightningcss" +const ORIGIN_NAME = "origin" const UPSTREAM_NAME = "upstream" const QUARTZ_SOURCE_BRANCH = "v4-alpha" const cwd = process.cwd() @@ -119,6 +120,13 @@ async function popContentFolder(contentFolder) { await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) } +function gitPull(origin, branch) { + spawnSync("git", ["fetch", origin, branch], { stdio: "inherit" }) + spawnSync("git", ["checkout", `${origin}/${branch}`, "--", ":(exclude)content"], { + stdio: "inherit", + }).error +} + yargs(hideBin(process.argv)) .scriptName("quartz") .version(version) @@ -241,9 +249,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["pull", "--rebase", "--autostash", UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { - stdio: "inherit", - }) + gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH) await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") spawnSync("npm", ["i"], { stdio: "inherit" }) @@ -268,18 +274,13 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - spawnSync("git", ["pull", "--rebase", "--autostash", "origin", QUARTZ_SOURCE_BRANCH], { - stdio: "inherit", - }) + gitPull(ORIGIN_NAME, QUARTZ_SOURCE_BRANCH) } await popContentFolder(contentFolder) if (argv.push) { console.log("Pushing your changes") - const args = argv.force - ? ["push", "-f", "origin", QUARTZ_SOURCE_BRANCH] - : ["push", "origin", QUARTZ_SOURCE_BRANCH] - spawnSync("git", args, { stdio: "inherit" }) + spawnSync("git", ["push", ORIGIN_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) } console.log(chalk.green("Done!")) From 6457496b4b8222d95d9b5ab47e8eda62d7241739 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 2 Aug 2023 23:42:49 -0700 Subject: [PATCH 0440/1221] readme fixes, force --- README.md | 2 +- quartz/bootstrap-cli.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f8b10408..a9f1e78e 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,6 @@ Please note that v4 is still beta software and will probably contain bugs. Use w **If you are looking for Quartz v3, you can find it on the [`hugo` branch](https://github.com/jackyzha0/quartz/tree/hugo).** -🔗 Read the documentation and setup instructions: https://quartz.jzhao.xyz/ +🔗 Read the documentation and setup instructions: https://four.quartz.jzhao.xyz/ [Join the Discord Community](https://discord.gg/cRFFHYye7t) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 63875359..4013a20c 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -280,7 +280,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. await popContentFolder(contentFolder) if (argv.push) { console.log("Pushing your changes") - spawnSync("git", ["push", ORIGIN_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + spawnSync("git", ["push", "-f", ORIGIN_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) } console.log(chalk.green("Done!")) From 4877a9c934201e8f0e4e83821efe2dc3f9299d9a Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 3 Aug 2023 00:08:13 -0700 Subject: [PATCH 0441/1221] fix callout aliases not being used properly --- content/features/callouts.md | 4 + quartz/plugins/transformers/ofm.ts | 127 ++++++++++++++--------------- 2 files changed, 67 insertions(+), 64 deletions(-) diff --git a/content/features/callouts.md b/content/features/callouts.md index cb5feb9d..15b689c2 100644 --- a/content/features/callouts.md +++ b/content/features/callouts.md @@ -50,6 +50,10 @@ title: Callouts > > Aliases: failure, fail, missing +> [!fail] Failure +> +> Aliases: failure, fail, missing + > [!danger] Error > > Aliases: danger, error diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 23b97d6f..57a9b7f6 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -50,40 +50,6 @@ const icons = { quoteIcon: ``, } -function canonicalizeCallout(calloutName: string): keyof typeof callouts { - let callout = calloutName.toLowerCase() as keyof typeof calloutMapping - - const calloutMapping: Record = { - note: "note", - abstract: "abstract", - info: "info", - todo: "todo", - tip: "tip", - hint: "tip", - important: "tip", - success: "success", - check: "success", - done: "success", - question: "question", - help: "question", - faq: "question", - warning: "warning", - attention: "warning", - caution: "warning", - failure: "failure", - missing: "failure", - fail: "failure", - danger: "danger", - error: "danger", - bug: "bug", - example: "example", - quote: "quote", - cite: "quote", - } - - return calloutMapping[callout] -} - const callouts = { note: icons.pencilIcon, abstract: icons.clipboardListIcon, @@ -100,6 +66,40 @@ const callouts = { quote: icons.quoteIcon, } +const calloutMapping: Record = { + note: "note", + abstract: "abstract", + info: "info", + todo: "todo", + tip: "tip", + hint: "tip", + important: "tip", + success: "success", + check: "success", + done: "success", + question: "question", + help: "question", + faq: "question", + warning: "warning", + attention: "warning", + caution: "warning", + failure: "failure", + missing: "failure", + fail: "failure", + danger: "danger", + error: "danger", + bug: "bug", + example: "example", + quote: "quote", + cite: "quote", +} + +function canonicalizeCallout(calloutName: string): keyof typeof callouts { + let callout = calloutName.toLowerCase() as keyof typeof calloutMapping + return calloutMapping[callout] +} + + const capitalize = (s: string): string => { return s.substring(0, 1).toUpperCase() + s.substring(1) } @@ -125,34 +125,34 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin const findAndReplace = opts.enableInHtmlEmbed ? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => { - if (replace) { - const mdastToHtml = (ast: PhrasingContent) => { - const hast = toHast(ast, { allowDangerousHtml: true })! - return toHtml(hast, { allowDangerousHtml: true }) - } - - visit(tree, "html", (node: HTML) => { - if (typeof replace === "string") { - node.value = node.value.replace(regex, replace) - } else { - node.value = node.value.replaceAll(regex, (substring: string, ...args) => { - const replaceValue = replace(substring, ...args) - if (typeof replaceValue === "string") { - return replaceValue - } else if (Array.isArray(replaceValue)) { - return replaceValue.map(mdastToHtml).join("") - } else if (typeof replaceValue === "object" && replaceValue !== null) { - return mdastToHtml(replaceValue) - } else { - return substring - } - }) - } - }) + if (replace) { + const mdastToHtml = (ast: PhrasingContent) => { + const hast = toHast(ast, { allowDangerousHtml: true })! + return toHtml(hast, { allowDangerousHtml: true }) } - mdastFindReplace(tree, regex, replace) + visit(tree, "html", (node: HTML) => { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace) + } else { + node.value = node.value.replaceAll(regex, (substring: string, ...args) => { + const replaceValue = replace(substring, ...args) + if (typeof replaceValue === "string") { + return replaceValue + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join("") + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue) + } else { + return substring + } + }) + } + }) } + + mdastFindReplace(tree, regex, replace) + } : mdastFindReplace return { @@ -292,7 +292,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin const match = firstLine.match(calloutRegex) if (match && match.input) { const [calloutDirective, typeString, collapseChar] = match - const calloutType = typeString.toLowerCase() as keyof typeof callouts + const calloutType = canonicalizeCallout(typeString.toLowerCase() as keyof typeof calloutMapping) const collapse = collapseChar === "+" || collapseChar === "-" const defaultState = collapseChar === "-" ? "collapsed" : "expanded" const title = @@ -307,7 +307,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin value: `
    -
    ${callouts[canonicalizeCallout(calloutType)]}
    +
    ${callouts[calloutType]}
    ${title}
    ${collapse ? toggleIcon : ""}
    `, @@ -334,9 +334,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin node.data = { hProperties: { ...(node.data?.hProperties ?? {}), - className: `callout ${collapse ? "is-collapsible" : ""} ${ - defaultState === "collapsed" ? "is-collapsed" : "" - }`, + className: `callout ${collapse ? "is-collapsible" : ""} ${defaultState === "collapsed" ? "is-collapsed" : "" + }`, "data-callout": calloutType, "data-callout-fold": collapse, }, From 93986c6e7c8893ae3068bb3ea2ba187e5e1d6f43 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 3 Aug 2023 22:29:46 -0700 Subject: [PATCH 0442/1221] update pull strategy --- content/features/callouts.md | 4 ---- quartz/bootstrap-cli.mjs | 6 ++---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/content/features/callouts.md b/content/features/callouts.md index 15b689c2..cb5feb9d 100644 --- a/content/features/callouts.md +++ b/content/features/callouts.md @@ -50,10 +50,6 @@ title: Callouts > > Aliases: failure, fail, missing -> [!fail] Failure -> -> Aliases: failure, fail, missing - > [!danger] Error > > Aliases: danger, error diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 4013a20c..04ed3a2d 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -121,10 +121,8 @@ async function popContentFolder(contentFolder) { } function gitPull(origin, branch) { - spawnSync("git", ["fetch", origin, branch], { stdio: "inherit" }) - spawnSync("git", ["checkout", `${origin}/${branch}`, "--", ":(exclude)content"], { - stdio: "inherit", - }).error + const flags = ["-s", "recursive", "-X", "ours"] + spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" }) } yargs(hideBin(process.argv)) From 2acfb9e8701d2b001a82a6af75969a1df7d97b67 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 3 Aug 2023 23:08:04 -0700 Subject: [PATCH 0443/1221] format, add upstream --- quartz/bootstrap-cli.mjs | 5 ++- quartz/build.ts | 1 + quartz/plugins/transformers/ofm.ts | 60 +++++++++++++++--------------- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 04ed3a2d..0bb078a9 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -10,7 +10,7 @@ import fs from "fs" import { intro, isCancel, outro, select, text } from "@clack/prompts" import { rimraf } from "rimraf" import prettyBytes from "pretty-bytes" -import { spawnSync } from "child_process" +import { execSync, spawnSync } from "child_process" import { transform as cssTransform } from "lightningcss" const ORIGIN_NAME = "origin" @@ -247,6 +247,9 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) + execSync( + `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`, + ) gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH) await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") diff --git a/quartz/build.ts b/quartz/build.ts index c8b5b02d..a2932777 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -91,6 +91,7 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { clearTimeout(timeoutId) } + // debounce rebuilds every 250ms timeoutId = setTimeout(async () => { const perf = new PerfTimer() console.log(chalk.yellow("Detected change, rebuilding...")) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 57a9b7f6..70155e0d 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -99,7 +99,6 @@ function canonicalizeCallout(calloutName: string): keyof typeof callouts { return calloutMapping[callout] } - const capitalize = (s: string): string => { return s.substring(0, 1).toUpperCase() + s.substring(1) } @@ -125,34 +124,34 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin const findAndReplace = opts.enableInHtmlEmbed ? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => { - if (replace) { - const mdastToHtml = (ast: PhrasingContent) => { - const hast = toHast(ast, { allowDangerousHtml: true })! - return toHtml(hast, { allowDangerousHtml: true }) + if (replace) { + const mdastToHtml = (ast: PhrasingContent) => { + const hast = toHast(ast, { allowDangerousHtml: true })! + return toHtml(hast, { allowDangerousHtml: true }) + } + + visit(tree, "html", (node: HTML) => { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace) + } else { + node.value = node.value.replaceAll(regex, (substring: string, ...args) => { + const replaceValue = replace(substring, ...args) + if (typeof replaceValue === "string") { + return replaceValue + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join("") + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue) + } else { + return substring + } + }) + } + }) } - visit(tree, "html", (node: HTML) => { - if (typeof replace === "string") { - node.value = node.value.replace(regex, replace) - } else { - node.value = node.value.replaceAll(regex, (substring: string, ...args) => { - const replaceValue = replace(substring, ...args) - if (typeof replaceValue === "string") { - return replaceValue - } else if (Array.isArray(replaceValue)) { - return replaceValue.map(mdastToHtml).join("") - } else if (typeof replaceValue === "object" && replaceValue !== null) { - return mdastToHtml(replaceValue) - } else { - return substring - } - }) - } - }) + mdastFindReplace(tree, regex, replace) } - - mdastFindReplace(tree, regex, replace) - } : mdastFindReplace return { @@ -292,7 +291,9 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin const match = firstLine.match(calloutRegex) if (match && match.input) { const [calloutDirective, typeString, collapseChar] = match - const calloutType = canonicalizeCallout(typeString.toLowerCase() as keyof typeof calloutMapping) + const calloutType = canonicalizeCallout( + typeString.toLowerCase() as keyof typeof calloutMapping, + ) const collapse = collapseChar === "+" || collapseChar === "-" const defaultState = collapseChar === "-" ? "collapsed" : "expanded" const title = @@ -334,8 +335,9 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin node.data = { hProperties: { ...(node.data?.hProperties ?? {}), - className: `callout ${collapse ? "is-collapsible" : ""} ${defaultState === "collapsed" ? "is-collapsed" : "" - }`, + className: `callout ${collapse ? "is-collapsible" : ""} ${ + defaultState === "collapsed" ? "is-collapsed" : "" + }`, "data-callout": calloutType, "data-callout-fold": collapse, }, From 3a2eae0a16cfc275182f8a26af0a77f0e9bd07c1 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 3 Aug 2023 23:24:34 -0700 Subject: [PATCH 0444/1221] fix fetch flags --- quartz/bootstrap-cli.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 0bb078a9..dd102325 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -247,9 +247,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - execSync( - `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`, - ) + execSync(`git remote add upstream https://github.com/jackyzha0/quartz.git`, { stdio: "ignore" }) gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH) await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") From 6423f85614dc87a320625d2efe2088d648c127ff Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 3 Aug 2023 23:28:34 -0700 Subject: [PATCH 0445/1221] fix execsync --- quartz/bootstrap-cli.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index dd102325..0bb078a9 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -247,7 +247,9 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log( "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", ) - execSync(`git remote add upstream https://github.com/jackyzha0/quartz.git`, { stdio: "ignore" }) + execSync( + `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`, + ) gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH) await popContentFolder(contentFolder) console.log("Ensuring dependencies are up to date") From 21a7ec23078c04601acc4741ee141d7560e0d6f2 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 3 Aug 2023 23:36:00 -0700 Subject: [PATCH 0446/1221] bump mathjax version --- package-lock.json | 131 +++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 42 insertions(+), 91 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e106a65..3399f646 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "reading-time": "^1.5.0", "rehype-autolink-headings": "^6.1.1", "rehype-katex": "^6.0.3", - "rehype-mathjax": "^4.0.2", + "rehype-mathjax": "^4.0.3", "rehype-pretty-code": "^0.10.0", "rehype-raw": "^6.1.1", "rehype-slug": "^5.1.0", @@ -1491,11 +1491,6 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, - "node_modules/@types/web": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.46.tgz", - "integrity": "sha512-ki0OmbjSdAEfvmy5AYWFpMkRsPW+6h4ibQ4tzk8SJsS9dkrrD3B/U1eVvdNNWxAzntjq6o2sjSia6UBCoPH+Yg==" - }, "node_modules/@types/workerpool": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@types/workerpool/-/workerpool-6.4.0.tgz", @@ -1546,29 +1541,18 @@ } }, "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" } }, "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "engines": { "node": ">=0.4.0" } @@ -1687,11 +1671,6 @@ "node": ">=8" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2330,18 +2309,6 @@ "node": ">=12" } }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3344,40 +3311,39 @@ } }, "node_modules/jsdom": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-18.1.1.tgz", - "integrity": "sha512-NmJQbjQ/gpS/1at/ce3nCx89HbXL/f5OcenBe8wU1Eik0ROhyUc3LtmG3567dEHAGXkN8rmILW/qtCOPxPHQJw==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", "cssom": "^0.5.0", "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", "domexception": "^4.0.0", "escodegen": "^2.0.0", "form-data": "^4.0.0", "html-encoding-sniffer": "^3.0.0", "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { "canvas": "^2.5.0" @@ -3388,11 +3354,6 @@ } } }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", @@ -4832,16 +4793,15 @@ } }, "node_modules/rehype-mathjax": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-4.0.2.tgz", - "integrity": "sha512-9q4Q4icTIbM5RtvQ4XquvEApGV2oDMaSVa5G3DwXomWU4fAPWYcOOt+iQRNaIH3RBMbFF239QbE5K7hm7rxMPQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-4.0.3.tgz", + "integrity": "sha512-QIwWH9U+r54nMQklVkT1qluxhKyzdPWz9dFwgel3BrseQsWZafRTDTUj8VR8/14nFuRIV2ChuCMz4zpACPoYvg==", "dependencies": { "@types/hast": "^2.0.0", "@types/mathjax": "^0.0.37", - "@types/web": "^0.0.46", "hast-util-from-dom": "^4.0.0", "hast-util-to-text": "^3.1.0", - "jsdom": "^18.0.0", + "jsdom": "^20.0.0", "mathjax-full": "^3.0.0", "unified": "^10.0.0", "unist-util-visit": "^4.0.0" @@ -5203,14 +5163,14 @@ } }, "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dependencies": { "xmlchars": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=v12.22.7" } }, "node_modules/section-matter": { @@ -5897,24 +5857,15 @@ "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", "peer": true }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dependencies": { "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/web-namespaces": { @@ -5954,9 +5905,9 @@ } }, "node_modules/whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" diff --git a/package.json b/package.json index 8a1d483c..73a080a5 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "reading-time": "^1.5.0", "rehype-autolink-headings": "^6.1.1", "rehype-katex": "^6.0.3", - "rehype-mathjax": "^4.0.2", + "rehype-mathjax": "^4.0.3", "rehype-pretty-code": "^0.10.0", "rehype-raw": "^6.1.1", "rehype-slug": "^5.1.0", From 9e76b257d4be4b9e6ea7b514074ef74d8d125f4b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 4 Aug 2023 22:35:21 -0700 Subject: [PATCH 0447/1221] fix mermaid initialization --- quartz/bootstrap-cli.mjs | 3 +-- quartz/plugins/transformers/ofm.ts | 8 +++++++- quartz/styles/base.scss | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 0bb078a9..0094a4fe 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -121,7 +121,7 @@ async function popContentFolder(contentFolder) { } function gitPull(origin, branch) { - const flags = ["-s", "recursive", "-X", "ours"] + const flags = ["-s", "recursive", "-X", "ours", "--no-edit"] spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" }) } @@ -334,7 +334,6 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. sourcefile, }, write: false, - minify: true, bundle: true, platform: "browser", format: "esm", diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 70155e0d..a9beda4d 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -414,7 +414,13 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin js.push({ script: ` import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; - mermaid.initialize({ startOnLoad: true }); + document.addEventListener('nav', async () => { + const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' + mermaid.initialize({ + securityLevel: 'loose', + theme: darkMode ? 'dark' : 'default' + }); + }); `, loadTime: "afterDOMReady", moduleType: "module", diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 8253c5b8..72919396 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -310,6 +310,7 @@ pre { &:has(> code.mermaid) { border: none; + position: relative; } & > code { From c402f0c3857a75cc101c3459866c94e646fd2957 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 5 Aug 2023 11:28:09 -0700 Subject: [PATCH 0448/1221] more robust error handling, config hotreload --- content/features/upcoming features.md | 4 - package-lock.json | 4 +- package.json | 2 +- quartz/bootstrap-cli.mjs | 188 ++++++++++++++++---------- quartz/build.ts | 55 +++----- quartz/path.ts | 27 ---- quartz/plugins/transformers/ofm.ts | 6 +- quartz/processors/emit.ts | 1 - quartz/processors/parse.ts | 1 - quartz/trace.ts | 2 + 10 files changed, 148 insertions(+), 142 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 370e2cd4..b5676fdc 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,8 +4,6 @@ draft: true ## high priority -- images in same folder are broken on shortest path mode -- watch mode for config/source code - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note - note/header/block transcludes: https://help.obsidian.md/Linking+notes+and+files/Embedding+files @@ -22,7 +20,5 @@ draft: true - https://help.obsidian.md/Advanced+topics/Using+Obsidian+URI - audio/video embed styling - Canvas -- mermaid styling: https://mermaid.js.org/config/theming.html#theme-variables-reference-table - - https://github.com/jackyzha0/quartz/issues/331 - parse all images in page: use this for page lists if applicable? - CV mode? with print stylesheet diff --git a/package-lock.json b/package-lock.json index 3399f646..e1122ddc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jackyzha0/quartz", - "version": "4.0.6", + "version": "4.0.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jackyzha0/quartz", - "version": "4.0.6", + "version": "4.0.7", "license": "MIT", "dependencies": { "@clack/prompts": "^0.6.3", diff --git a/package.json b/package.json index 73a080a5..f5e3ab87 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@jackyzha0/quartz", "description": "🌱 publish your digital garden and notes as a website", "private": true, - "version": "4.0.6", + "version": "4.0.7", "type": "module", "author": "jackyzha0 ", "license": "MIT", diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 0094a4fe..40ef34ee 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -9,9 +9,13 @@ import { sassPlugin } from "esbuild-sass-plugin" import fs from "fs" import { intro, isCancel, outro, select, text } from "@clack/prompts" import { rimraf } from "rimraf" +import chokidar from "chokidar" import prettyBytes from "pretty-bytes" import { execSync, spawnSync } from "child_process" import { transform as cssTransform } from "lightningcss" +import http from "http" +import serveHandler from "serve-handler" +import { WebSocketServer } from "ws" const ORIGIN_NAME = "origin" const UPSTREAM_NAME = "upstream" @@ -287,86 +291,132 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log(chalk.green("Done!")) }) .command("build", "Build Quartz into a bundle of static HTML files", BuildArgv, async (argv) => { - const result = await esbuild - .build({ - entryPoints: [fp], - outfile: path.join("quartz", cacheFile), - bundle: true, - keepNames: true, - minify: true, - platform: "node", - format: "esm", - jsx: "automatic", - jsxImportSource: "preact", - packages: "external", - metafile: true, - sourcemap: true, - plugins: [ - sassPlugin({ - type: "css-text", - cssImports: true, - async transform(css) { - const { code } = cssTransform({ - filename: "style.css", - code: Buffer.from(css), - minify: true, - }) - return code.toString() - }, - }), - { - name: "inline-script-loader", - setup(build) { - build.onLoad({ filter: /\.inline\.(ts|js)$/ }, async (args) => { - let text = await promises.readFile(args.path, "utf8") + console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) + const ctx = await esbuild.context({ + entryPoints: [fp], + outfile: path.join("quartz", cacheFile), + bundle: true, + keepNames: true, + minify: true, + platform: "node", + format: "esm", + jsx: "automatic", + jsxImportSource: "preact", + packages: "external", + metafile: true, + sourcemap: true, + plugins: [ + sassPlugin({ + type: "css-text", + cssImports: true, + async transform(css) { + const { code } = cssTransform({ + filename: "style.css", + code: Buffer.from(css), + minify: true, + }) + return code.toString() + }, + }), + { + name: "inline-script-loader", + setup(build) { + build.onLoad({ filter: /\.inline\.(ts|js)$/ }, async (args) => { + let text = await promises.readFile(args.path, "utf8") - // remove default exports that we manually inserted - text = text.replace("export default", "") - text = text.replace("export", "") + // remove default exports that we manually inserted + text = text.replace("export default", "") + text = text.replace("export", "") - const sourcefile = path.relative(path.resolve("."), args.path) - const resolveDir = path.dirname(sourcefile) - const transpiled = await esbuild.build({ - stdin: { - contents: text, - loader: "ts", - resolveDir, - sourcefile, - }, - write: false, - bundle: true, - platform: "browser", - format: "esm", - }) - const rawMod = transpiled.outputFiles[0].text - return { - contents: rawMod, - loader: "text", - } + const sourcefile = path.relative(path.resolve("."), args.path) + const resolveDir = path.dirname(sourcefile) + const transpiled = await esbuild.build({ + stdin: { + contents: text, + loader: "ts", + resolveDir, + sourcefile, + }, + write: false, + bundle: true, + platform: "browser", + format: "esm", }) - }, + const rawMod = transpiled.outputFiles[0].text + return { + contents: rawMod, + loader: "text", + } + }) }, - ], - }) - .catch((err) => { + }, + ], + }) + + let clientRefresh = () => {} + let closeHandler = null + const build = async () => { + const result = await ctx.rebuild().catch((err) => { console.error(`${chalk.red("Couldn't parse Quartz configuration:")} ${fp}`) console.log(`Reason: ${chalk.grey(err)}`) process.exit(1) }) - if (argv.bundleInfo) { - const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs" - const meta = result.metafile.outputs[outputFileName] - console.log( - `Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes( - meta.bytes, - )})`, - ) - console.log(await esbuild.analyzeMetafile(result.metafile, { color: true })) + if (argv.bundleInfo) { + const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs" + const meta = result.metafile.outputs[outputFileName] + console.log( + `Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes( + meta.bytes, + )})`, + ) + console.log(await esbuild.analyzeMetafile(result.metafile, { color: true })) + } + + // bypass module cache + const { default: buildQuartz } = await import(cacheFile + `?update=${new Date()}`) + if (closeHandler) { + await closeHandler() + } + + closeHandler = await buildQuartz(argv, clientRefresh) + clientRefresh() } - const { default: buildQuartz } = await import(cacheFile) - buildQuartz(argv, version) + await build() + if (argv.serve) { + const wss = new WebSocketServer({ port: 3001 }) + const connections = [] + wss.on("connection", (ws) => connections.push(ws)) + clientRefresh = () => connections.forEach((conn) => conn.send("rebuild")) + const server = http.createServer(async (req, res) => { + await serveHandler(req, res, { + public: argv.output, + directoryListing: false, + }) + const status = res.statusCode + const statusString = + status >= 200 && status < 300 + ? chalk.green(`[${status}]`) + : status >= 300 && status < 400 + ? chalk.yellow(`[${status}]`) + : chalk.red(`[${status}]`) + console.log(statusString + chalk.grey(` ${req.url}`)) + }) + server.listen(argv.port) + console.log(chalk.cyan(`Started a Quartz server listening at http://localhost:${argv.port}`)) + console.log("hint: exit with ctrl+c") + chokidar + .watch(["**/*.ts", "**/*.tsx", "**/*.scss", "package.json"], { + ignoreInitial: true, + }) + .on("all", async () => { + console.log(chalk.yellow("Detected a source code change, doing a hard rebuild...")) + await build() + }) + } else { + ctx.dispose() + } }) .showHelpOnFail(false) .help() diff --git a/quartz/build.ts b/quartz/build.ts index a2932777..b395f738 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -4,8 +4,6 @@ import { PerfTimer } from "./perf" import { rimraf } from "rimraf" import { isGitIgnored } from "globby" import chalk from "chalk" -import http from "http" -import serveHandler from "serve-handler" import { parseMarkdown } from "./processors/parse" import { filterContent } from "./processors/filter" import { emitContent } from "./processors/emit" @@ -13,18 +11,17 @@ import cfg from "../quartz.config" import { FilePath, joinSegments, slugifyFilePath } from "./path" import chokidar from "chokidar" import { ProcessedContent } from "./plugins/vfile" -import WebSocket, { WebSocketServer } from "ws" import { Argv, BuildCtx } from "./ctx" import { glob, toPosixPath } from "./glob" +import { trace } from "./trace" -async function buildQuartz(argv: Argv, version: string) { +async function buildQuartz(argv: Argv, clientRefresh: () => void) { const ctx: BuildCtx = { argv, cfg, allSlugs: [], } - console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) const perf = new PerfTimer() const output = argv.output @@ -57,15 +54,17 @@ async function buildQuartz(argv: Argv, version: string) { console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`)) if (argv.serve) { - await startServing(ctx, parsedFiles) + return startServing(ctx, parsedFiles, clientRefresh) } } -async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { +// setup watcher for rebuilds +async function startServing( + ctx: BuildCtx, + initialContent: ProcessedContent[], + clientRefresh: () => void, +) { const { argv } = ctx - const wss = new WebSocketServer({ port: 3001 }) - const connections: WebSocket[] = [] - wss.on("connection", (ws) => connections.push(ws)) const ignored = await isGitIgnored() const contentMap = new Map() @@ -78,6 +77,12 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { let toRebuild: Set = new Set() let toRemove: Set = new Set() async function rebuild(fp: string, action: "add" | "change" | "delete") { + if (path.extname(fp) !== ".md") { + // dont bother rebuilding for non-content files, just refresh + clientRefresh() + return + } + fp = toPosixPath(fp) if (!ignored(fp)) { const filePath = joinSegments(argv.directory, fp) as FilePath @@ -120,7 +125,8 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { } catch { console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`)) } - connections.forEach((conn) => conn.send("rebuild")) + + clientRefresh() toRebuild.clear() toRemove.clear() }, 250) @@ -137,31 +143,12 @@ async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) { .on("add", (fp) => rebuild(fp, "add")) .on("change", (fp) => rebuild(fp, "change")) .on("unlink", (fp) => rebuild(fp, "delete")) - - const server = http.createServer(async (req, res) => { - await serveHandler(req, res, { - public: argv.output, - directoryListing: false, - }) - const status = res.statusCode - const statusString = - status >= 200 && status < 300 - ? chalk.green(`[${status}]`) - : status >= 300 && status < 400 - ? chalk.yellow(`[${status}]`) - : chalk.red(`[${status}]`) - console.log(statusString + chalk.grey(` ${req.url}`)) - }) - server.listen(argv.port) - console.log(chalk.cyan(`Started a Quartz server listening at http://localhost:${argv.port}`)) - console.log("hint: exit with ctrl+c") } -export default async (argv: Argv, version: string) => { +export default async (argv: Argv, clientRefresh: () => void) => { try { - await buildQuartz(argv, version) - } catch { - console.log(chalk.red("\nExiting Quartz due to a fatal error")) - process.exit(1) + return await buildQuartz(argv, clientRefresh) + } catch (err) { + trace("\nExiting Quartz due to a fatal error", err as Error) } } diff --git a/quartz/path.ts b/quartz/path.ts index fca2c058..494d3c5d 100644 --- a/quartz/path.ts +++ b/quartz/path.ts @@ -1,5 +1,4 @@ import { slug } from "github-slugger" -import { trace } from "./trace" // Quartz Paths // Things in boxes are not actual types but rather sources which these types can be acquired from @@ -43,18 +42,6 @@ import { trace } from "./trace" // └────────────┤ MD File ├─────┴─────────────────┘ // └─────────┘ -const STRICT_TYPE_CHECKS = false -const HARD_EXIT_ON_FAIL = false - -function conditionCheck(name: string, label: "pre" | "post", s: T, chk: (x: any) => x is T) { - if (STRICT_TYPE_CHECKS && !chk(s)) { - trace(`${name} failed ${label}-condition check: ${s} does not pass ${chk.name}`, new Error()) - if (HARD_EXIT_ON_FAIL) { - process.exit(1) - } - } -} - /// Utility type to simulate nominal types in TypeScript type SlugLike = string & { __brand: T } @@ -102,36 +89,29 @@ export function isFilePath(s: string): s is FilePath { export function getClientSlug(window: Window): ClientSlug { const res = window.location.href as ClientSlug - conditionCheck(getClientSlug.name, "post", res, isClientSlug) return res } export function getCanonicalSlug(window: Window): CanonicalSlug { const res = window.document.body.dataset.slug! as CanonicalSlug - conditionCheck(getCanonicalSlug.name, "post", res, isCanonicalSlug) return res } export function canonicalizeClient(slug: ClientSlug): CanonicalSlug { - conditionCheck(canonicalizeClient.name, "pre", slug, isClientSlug) const { pathname } = new URL(slug) let fp = pathname.slice(1) fp = fp.replace(new RegExp(_getFileExtension(fp) + "$"), "") const res = _canonicalize(fp) as CanonicalSlug - conditionCheck(canonicalizeClient.name, "post", res, isCanonicalSlug) return res } export function canonicalizeServer(slug: ServerSlug): CanonicalSlug { - conditionCheck(canonicalizeServer.name, "pre", slug, isServerSlug) let fp = slug as string const res = _canonicalize(fp) as CanonicalSlug - conditionCheck(canonicalizeServer.name, "post", res, isCanonicalSlug) return res } export function slugifyFilePath(fp: FilePath): ServerSlug { - conditionCheck(slugifyFilePath.name, "pre", fp, isFilePath) fp = _stripSlashes(fp) as FilePath const withoutFileExt = fp.replace(new RegExp(_getFileExtension(fp) + "$"), "") let slug = withoutFileExt @@ -145,7 +125,6 @@ export function slugifyFilePath(fp: FilePath): ServerSlug { slug = slug.replace(/_index$/, "index") } - conditionCheck(slugifyFilePath.name, "post", slug, isServerSlug) return slug as ServerSlug } @@ -165,13 +144,11 @@ export function transformInternalLink(link: string): RelativeURL { let joined = joinSegments(_stripSlashes(prefix), _stripSlashes(fp)) const res = (_addRelativeToStart(joined) + anchor) as RelativeURL - conditionCheck(transformInternalLink.name, "post", res, isRelativeURL) return res } // resolve /a/b/c to ../../ export function pathToRoot(slug: CanonicalSlug): RelativeURL { - conditionCheck(pathToRoot.name, "pre", slug, isCanonicalSlug) let rootPath = slug .split("/") .filter((x) => x !== "") @@ -179,15 +156,11 @@ export function pathToRoot(slug: CanonicalSlug): RelativeURL { .join("/") const res = _addRelativeToStart(rootPath) as RelativeURL - conditionCheck(pathToRoot.name, "post", res, isRelativeURL) return res } export function resolveRelative(current: CanonicalSlug, target: CanonicalSlug): RelativeURL { - conditionCheck(resolveRelative.name, "pre", current, isCanonicalSlug) - conditionCheck(resolveRelative.name, "pre", target, isCanonicalSlug) const res = joinSegments(pathToRoot(current), target) as RelativeURL - conditionCheck(resolveRelative.name, "post", res, isRelativeURL) return res } diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index a9beda4d..13a32cac 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -184,7 +184,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin // embed cases if (value.startsWith("!")) { - const ext: string | undefined = path.extname(fp).toLowerCase() + const ext: string = path.extname(fp).toLowerCase() const url = slugifyFilePath(fp as FilePath) + ext if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) { const dims = alias ?? "" @@ -218,8 +218,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin type: "html", value: ``, } - } else { - // TODO: this is the node embed case + } else if (ext === "") { + // TODO: note embed } // otherwise, fall through to regular link } diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts index 960f1e43..fd326856 100644 --- a/quartz/processors/emit.ts +++ b/quartz/processors/emit.ts @@ -37,7 +37,6 @@ export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) { } } catch (err) { trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error) - throw err } } diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 289ca946..52dc519d 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -103,7 +103,6 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { } } catch (err) { trace(`\nFailed to process \`${fp}\``, err as Error) - throw err } } diff --git a/quartz/trace.ts b/quartz/trace.ts index 803fd2f8..337ffe01 100644 --- a/quartz/trace.ts +++ b/quartz/trace.ts @@ -1,4 +1,5 @@ import chalk from "chalk" +import process from "process" const rootFile = /.*at file:/ export function trace(msg: string, err: Error) { @@ -28,4 +29,5 @@ export function trace(msg: string, err: Error) { } } } + process.exit(1) } From 7c09627df4bd61e3b4fbd6fd84a1971b40ff72b3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 5 Aug 2023 15:34:10 -0700 Subject: [PATCH 0449/1221] improve hot reload robustness --- content/features/upcoming features.md | 2 +- content/index.md | 7 ++++++- content/migrating from Quartz 3.md | 0 quartz/bootstrap-cli.mjs | 18 +++++++----------- 4 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 content/migrating from Quartz 3.md diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index b5676fdc..46390bd8 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -6,6 +6,7 @@ draft: true - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note - note/header/block transcludes: https://help.obsidian.md/Linking+notes+and+files/Embedding+files +- static dead link detection ## misc @@ -14,7 +15,6 @@ draft: true - recent notes component - cursor chat extension - https://giscus.app/ extension -- custom md blocks (e.g. for poetry) - sidenotes? https://github.com/capnfabs/paperesque - direct match in search using double quotes - https://help.obsidian.md/Advanced+topics/Using+Obsidian+URI diff --git a/content/index.md b/content/index.md index 050ce78a..77f14e1a 100644 --- a/content/index.md +++ b/content/index.md @@ -6,7 +6,9 @@ Quartz is a fast, batteries-included static-site generator that transforms Markd ## 🪴 Get Started -Quartz requires **at least [Node](https://nodejs.org/) v18.14** to function correctly. In your terminal of choice, enter the following commands line by line: +Quartz requires **at least [Node](https://nodejs.org/) v18.14** to function correctly. Ensure you have this installed on your machine before continuing. + +Then, in your terminal of choice, enter the following commands line by line: ```shell git clone https://github.com/jackyzha0/quartz.git @@ -22,6 +24,9 @@ When you're ready, you can edit `quartz.config.ts` to customize and configure Qu Then, when you're ready, see how to [[build]] and [[hosting|host]] Quartz. +> [!info] +> Coming from Quartz 3? See the [[migrating from Quartz 3|migration guide]] for the differences between Quartz 3 and Quartz 4 and how to migrate. + ## 🔧 Features - [[full-text search|Full-text search]], [[graph view]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box diff --git a/content/migrating from Quartz 3.md b/content/migrating from Quartz 3.md new file mode 100644 index 00000000..e69de29b diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 40ef34ee..68b9f571 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -353,9 +353,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. ], }) - let clientRefresh = () => {} - let closeHandler = null - const build = async () => { + const build = async (clientRefresh) => { const result = await ctx.rebuild().catch((err) => { console.error(`${chalk.red("Couldn't parse Quartz configuration:")} ${fp}`) console.log(`Reason: ${chalk.grey(err)}`) @@ -375,20 +373,17 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. // bypass module cache const { default: buildQuartz } = await import(cacheFile + `?update=${new Date()}`) - if (closeHandler) { - await closeHandler() - } - - closeHandler = await buildQuartz(argv, clientRefresh) + await buildQuartz(argv, clientRefresh) clientRefresh() } - await build() if (argv.serve) { const wss = new WebSocketServer({ port: 3001 }) const connections = [] wss.on("connection", (ws) => connections.push(ws)) - clientRefresh = () => connections.forEach((conn) => conn.send("rebuild")) + const clientRefresh = () => connections.forEach((conn) => conn.send("rebuild")) + + await build(clientRefresh) const server = http.createServer(async (req, res) => { await serveHandler(req, res, { public: argv.output, @@ -412,9 +407,10 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. }) .on("all", async () => { console.log(chalk.yellow("Detected a source code change, doing a hard rebuild...")) - await build() + await build(clientRefresh) }) } else { + await build(() => {}) ctx.dispose() } }) From 1da467d2143a260af8e5b7d2d2f68f0fcaa0260c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 5 Aug 2023 16:43:50 -0700 Subject: [PATCH 0450/1221] non-admonition callout fix --- quartz/bootstrap-cli.mjs | 6 ++++-- quartz/plugins/transformers/ofm.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 68b9f571..d550aea7 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -16,6 +16,7 @@ import { transform as cssTransform } from "lightningcss" import http from "http" import serveHandler from "serve-handler" import { WebSocketServer } from "ws" +import { randomUUID } from "crypto" const ORIGIN_NAME = "origin" const UPSTREAM_NAME = "upstream" @@ -304,7 +305,8 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. jsxImportSource: "preact", packages: "external", metafile: true, - sourcemap: true, + sourcemap: "inline", + sourcesContent: false, plugins: [ sassPlugin({ type: "css-text", @@ -372,7 +374,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. } // bypass module cache - const { default: buildQuartz } = await import(cacheFile + `?update=${new Date()}`) + const { default: buildQuartz } = await import(cacheFile + `?update=${randomUUID()}`) await buildQuartz(argv, clientRefresh) clientRefresh() } diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 13a32cac..8d8d4573 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -96,7 +96,7 @@ const calloutMapping: Record = { function canonicalizeCallout(calloutName: string): keyof typeof callouts { let callout = calloutName.toLowerCase() as keyof typeof calloutMapping - return calloutMapping[callout] + return calloutMapping[callout] ?? calloutName } const capitalize = (s: string): string => { From a0d651d64dfd766157324fd86791da2168028cf2 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 5 Aug 2023 17:53:29 -0700 Subject: [PATCH 0451/1221] reverse query param hack to re-add sourcemap support --- package-lock.json | 10 ++++++++++ package.json | 1 + quartz/bootstrap-cli.mjs | 6 ++++-- quartz/build.ts | 19 ++++++++++++++++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1122ddc..f8eb5a42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,6 +73,7 @@ "@types/node": "^20.1.2", "@types/pretty-time": "^1.1.2", "@types/serve-handler": "^6.1.1", + "@types/source-map-support": "^0.5.6", "@types/workerpool": "^6.4.0", "@types/ws": "^8.5.5", "@types/yargs": "^17.0.24", @@ -1486,6 +1487,15 @@ "@types/node": "*" } }, + "node_modules/@types/source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.0" + } + }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", diff --git a/package.json b/package.json index f5e3ab87..0d5e7a03 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "@types/node": "^20.1.2", "@types/pretty-time": "^1.1.2", "@types/serve-handler": "^6.1.1", + "@types/source-map-support": "^0.5.6", "@types/workerpool": "^6.4.0", "@types/ws": "^8.5.5", "@types/yargs": "^17.0.24", diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index d550aea7..8b9bea90 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -298,14 +298,15 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. outfile: path.join("quartz", cacheFile), bundle: true, keepNames: true, - minify: true, + minifyWhitespace: true, + minifySyntax: true, platform: "node", format: "esm", jsx: "automatic", jsxImportSource: "preact", packages: "external", metafile: true, - sourcemap: "inline", + sourcemap: true, sourcesContent: false, plugins: [ sassPlugin({ @@ -374,6 +375,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. } // bypass module cache + // https://github.com/nodejs/modules/issues/307 const { default: buildQuartz } = await import(cacheFile + `?update=${randomUUID()}`) await buildQuartz(argv, clientRefresh) clientRefresh() diff --git a/quartz/build.ts b/quartz/build.ts index b395f738..9f38882b 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -1,4 +1,19 @@ -import "source-map-support/register.js" +import sourceMapSupport from "source-map-support" +sourceMapSupport.install({ + retrieveSourceMap(source) { + // source map hack to get around query param + // import cache busting + if (source.includes(".quartz-cache")) { + let realSource = fileURLToPath(source.split("?", 2)[0] + '.map') + return { + map: fs.readFileSync(realSource, 'utf8') + } + } else { + return null + } + } +}) + import path from "path" import { PerfTimer } from "./perf" import { rimraf } from "rimraf" @@ -14,6 +29,8 @@ import { ProcessedContent } from "./plugins/vfile" import { Argv, BuildCtx } from "./ctx" import { glob, toPosixPath } from "./glob" import { trace } from "./trace" +import { fileURLToPath } from "url" +import fs from "fs" async function buildQuartz(argv: Argv, clientRefresh: () => void) { const ctx: BuildCtx = { From db6054a8c19703345cfdd6dd4a08f35986c14acc Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 5 Aug 2023 18:00:52 -0700 Subject: [PATCH 0452/1221] format, remove markdown from being procesed --- .prettierignore | 1 + quartz/build.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.prettierignore b/.prettierignore index 3c0687a5..2da3adff 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ public node_modules .quartz-cache +**/*.md diff --git a/quartz/build.ts b/quartz/build.ts index 9f38882b..ffa863c2 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -4,14 +4,14 @@ sourceMapSupport.install({ // source map hack to get around query param // import cache busting if (source.includes(".quartz-cache")) { - let realSource = fileURLToPath(source.split("?", 2)[0] + '.map') + let realSource = fileURLToPath(source.split("?", 2)[0] + ".map") return { - map: fs.readFileSync(realSource, 'utf8') + map: fs.readFileSync(realSource, "utf8"), } } else { return null } - } + }, }) import path from "path" From 028bcec62c3ca019a96783f17eaee1ecce6e092b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 6 Aug 2023 17:09:29 -0700 Subject: [PATCH 0453/1221] mobile fixes, fix bug when linking to anchor on home, docs --- content/build.md | 22 +++++++++++++ content/configuration.md | 42 ++++++++++++++++++------- content/features/popover previews.md | 2 +- content/features/upcoming features.md | 1 + content/hosting.md | 43 ++++++++++++++++++++++++++ content/index.md | 7 ++--- content/migrating from Quartz 3.md | 26 ++++++++++++++++ content/quartz-layout.png | Bin 0 -> 63222 bytes quartz.layout.ts | 4 +-- quartz/cfg.ts | 1 + quartz/path.ts | 2 +- quartz/plugins/transformers/links.ts | 3 +- quartz/plugins/transformers/ofm.ts | 1 - quartz/styles/base.scss | 4 ++- 14 files changed, 134 insertions(+), 24 deletions(-) create mode 100644 content/quartz-layout.png diff --git a/content/build.md b/content/build.md index 28570571..ac6a410e 100644 --- a/content/build.md +++ b/content/build.md @@ -1,3 +1,25 @@ --- title: "Building your Quartz" --- + +Once you've [[index#🪴 Get Started|initialized]] Quartz, let's see what it looks like locally. + +```bash +npx quartz build --serve +``` + +Then, open a web browser and visit `http://localhost:8080/` to view it! + +Want to change how Quartz looks? You can edit `quartz.config.ts` to customize and configure your Quartz, including styles, layout, and more. Read the [[configuration]] page for more information on what each field in the configuration does. + +Once you're happy with it, let's see how to [[hosting|deploy Quartz to the web]]. + +> [!hint] Flags and options +> For full help options, you can run `npx quartz build --help`. +> +> Most of these have sensible defaults but you can override them if you have a custom setup: +> - `-d` or `--directory`: the content folder. This is normally just `content` +> - `-v` or `--verbose`: print out extra logging information +> - `-o` or `--output`: the output folder. This is normally just `public` +> - `--serve`: run a local hot-reloading server to preview your Quartz +> - `--port`: what port to run the local preview server on \ No newline at end of file diff --git a/content/configuration.md b/content/configuration.md index e31dbc2d..ef0bf9b2 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -4,11 +4,12 @@ title: Configuration Quartz is meant to be extremely configurable, even if you don't know any coding. Most of the configuration you should need can be done by just editing `quartz.config.ts`. -If you edit this file using a text-editor that has TypeScript language support like VSCode, it will warn you when you you've made an error in your configuration. +> [!tip] +> If you edit this file using a text-editor that has TypeScript language support like VSCode, it will warn you when you you've made an error in your configuration, helping you avoid configuration mistakes! This configuration can be broken down into two main parts: -```ts +```ts title="quartz.config.ts" const config: QuartzConfig = { configuration: { ... }, plugins: { ... }, @@ -81,24 +82,41 @@ If you'd like to make your own plugins, read the guide on [[making plugins]] for Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To enable easy customization, these emitters allow you to fully rearrange the layout of the page. The default page layouts can be found in `quartz.layout.ts`. -Ultimately, each page is composed of multiple different sections which contain `QuartzComponents`. The following code snippet lists all of the valid sections that you can add components to: +Each page is composed of multiple different sections which contain `QuartzComponents`. The following code snippet lists all of the valid sections that you can add components to: ```typescript title="quartz/cfg.ts" export interface FullPageLayout { - head: QuartzComponent - header: QuartzComponent[] - beforeBody: QuartzComponent[] - pageBody: QuartzComponent - left: QuartzComponent[] - right: QuartzComponent[] - footer: QuartzComponent + head: QuartzComponent // single component + header: QuartzComponent[] // laid out horizontally + beforeBody: QuartzComponent[] // laid out vertically + pageBody: QuartzComponent // single component + left: QuartzComponent[] // vertical on desktop, horizontal on mobile + right: QuartzComponent[] // vertical on desktop, horizontal on mobile + footer: QuartzComponent // single component } ``` These correspond to following parts of the page: -### Components +![[quartz-layout.png|800]] + +> [!note] +> There are two additional layout fields that are *not* shown in the above diagram. +> 1. `head` is a single component that renders the `` [tag](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head) in the HTML. This doesn't appear visually on the page and is only is responsible for metadata about the document like the tab title, scripts, and styles. +> 2. `header` is a set of components that are laid out horizontally and appears *before* the `beforeBody` section. This enables you to replicate the old Quartz 3 header bar where the title, search bar, and dark mode toggle. By default, Quartz 4 doesn't place any components in the `header`. -See [a list of all the components](./tags/component) for all available components. +Quartz **components**, like plugins, can take in additional properties as configuration options. If you're familiar with React terminology, you can think of them as Higher-order Components. + +See [a list of all the components](./tags/component) for all available components along with their configuration options. ### Style +Most meaningful style changes like colour scheme and font can be done simply through the [[#General Configuration|general configuration]] options above. + +However, if you'd like to make more involved style changes, you can do this by writing your own styles. Quartz 4, like Quartz 3, uses [Sass](https://sass-lang.com/guide/) for styling. + +You can see the base style sheet in `quartz/styles/base.scss` and write your own in `quartz/styles/custom.scss`. + +> [!note] +> Some components may provide their own styling as well! For example, `quartz/components/Darkmode.tsx` imports its styles from `quartz/components/styles/darkmode.scss`. If you'd like to customize styling for a specific component, double check the component definition to see how its styles are defined. + +When you're ready, see how [[build|build and preview]] Quartz locally. \ No newline at end of file diff --git a/content/features/popover previews.md b/content/features/popover previews.md index 7bf608e0..f8822240 100644 --- a/content/features/popover previews.md +++ b/content/features/popover previews.md @@ -2,7 +2,7 @@ title: Popover Previews --- -Like Wikipedia, when you hover over a link in Quartz, there is a popup of a page preview that you can scroll to see the entire content. +Like Wikipedia, when you hover over a link in Quartz, there is a popup of a page preview that you can scroll to see the entire content. Links to headers will also scroll the popup to show that specific header in view. By default, Quartz only fetches previews for pages inside your vault due to [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). It does this by selecting all HTML elements with the `popover-hint` class. For most pages, this includes the page title, page metadata like words and time to read, tags, and the actual page content. diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 46390bd8..8ab75202 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -7,6 +7,7 @@ draft: true - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note - note/header/block transcludes: https://help.obsidian.md/Linking+notes+and+files/Embedding+files - static dead link detection +- docker support ## misc diff --git a/content/hosting.md b/content/hosting.md index a7043137..f644e4d6 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -2,6 +2,49 @@ title: Hosting --- +Quartz effectively turns your Markdown files and other resources into a bundle of HTML, JS, and CSS files (a website!). + +However, if you'd like to publish your site to the world, you need a way to host it online. This guide will detail how to deploy with either GitHub Pages or Cloudflare pages but any service that allows you to deploy static HTML should work as well (e.g. Netlify, Replit, etc.) ## GitHub Pages +Like Quartz 3, you can deploy the site generated by Quartz 4 via GitHub Pages. + +In your local Quartz, create a new file `quartz/.github/workflows/deploy.yaml`: + +```yaml title="quartz/.github/workflows/deploy.yaml" +name: Deploy to GitHub Pages + +on: + push: + branches: + - v4-alpha + +jobs: + deploy: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Fetch all history for git info + + - uses: actions/setup-node@v3 + with: + node-version: 18.14 + + - name: Install Dependencies + run: npm ci + + - name: Build Quartz + run: npx quartz build + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./public + publish_branch: master # deploying branch + cname: quartz.jzhao.xyz +``` + +Then, the next time you ## Cloudflare Pages diff --git a/content/index.md b/content/index.md index 77f14e1a..0659e881 100644 --- a/content/index.md +++ b/content/index.md @@ -18,11 +18,7 @@ npm i npx quartz create ``` -This will guide you through initializing your Quartz with content. - -When you're ready, you can edit `quartz.config.ts` to customize and configure Quartz more. Read the [[configuration]] page for more information on what each field in the configuration does. - -Then, when you're ready, see how to [[build]] and [[hosting|host]] Quartz. +This will guide you through initializing your Quartz with content. Once you've done so, see how to [[build]] and [[hosting|host]] Quartz. > [!info] > Coming from Quartz 3? See the [[migrating from Quartz 3|migration guide]] for the differences between Quartz 3 and Quartz 4 and how to migrate. @@ -30,6 +26,7 @@ Then, when you're ready, see how to [[build]] and [[hosting|host]] Quartz. ## 🔧 Features - [[full-text search|Full-text search]], [[graph view]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box +- Hot-reload for both configuration and content - Simple JSX [[creating components|layouts and page components]] - [[SPA Routing|Ridiculously fast page loads]] and tiny bundle sizes - Fully-customizable parsing, filtering, and page generation through [[making plugins|plugins]] diff --git a/content/migrating from Quartz 3.md b/content/migrating from Quartz 3.md index e69de29b..c2e4c4eb 100644 --- a/content/migrating from Quartz 3.md +++ b/content/migrating from Quartz 3.md @@ -0,0 +1,26 @@ +--- +title: "Migrating from Quartz 3" +--- + +As you already have Quartz locally, you don't need to fork or clone it again. Simply just checkout the alpha branch, install the dependencies, and import your old vault. + +```bash +git checkout v4-alpha +npm i +npx quartz create +``` + +When running `npx quartz create`, you will be prompted as to how to initialize your content folder. Here, you can choose to import or link your previous content folder and Quartz should work just as you expect it to. + +## Key changes + +1. **Removing Hugo and `hugo-obsidian`**: Hugo worked well for earlier versions of Quartz but it also made it hard for people outside of the Golang and Hugo communities to fully understand what Quartz was doing under the hood and be able to properly customize it to their needs. Quartz 4 now uses a Node-based static-site generation process which should lead to a much more helpful error messages and an overall smoother user experience. +2. **Full-hot reload**: The many rough edges of how `hugo-obsidian` integrated with Hugo meant that watch mode didn't re-trigger `hugo-obsidian` to update the content index. This lead to a lot of weird cases where the watch mode output wasn't accurate. Quartz 4 now uses a cohesive parse, filter, and emit pipeline which gets run on every change so hot-reloads are always accurate. +3. **Replacing Go template syntax with JSX**: Quartz 3 used [Go templates](https://pkg.go.dev/text/template) to create layouts for pages. However, the syntax isn't great for doing any sort of complex rendering (like [text processing](https://github.com/jackyzha0/quartz/blob/hugo/layouts/partials/textprocessing.html)) and it got very difficult to make any meaningful layout changes to Quartz 3. Quartz 4 uses an extension of JavaScript syntax called JSX which allows you to write layout code that looks like HTML in JavaScript which is significantly easier to understand and maintain. +4. **A new extensible [[configuration]] and [[configuration#Plugins|plugin]] system**: Quartz 3 was hard to configure without technical knowledge of how Hugo's partials worked. Extensions were even hard to make. Quartz 4's configuration and plugin system is designed to be extended by users while making updating to new versions of Quartz easy. + +## Things to update + +- Some HTML layout may not be the same between Quartz 3 and Quartz 4. If you depended on a particular HTML hierarchy or class names, you may need to update your custom CSS to reflect these changes. +- If you customized the layout of Quartz 3, you may need to translate these changes from Go templates back to JSX as Quartz 4 no longer uses Hugo. For components, check out the guide on [[creating components]] for more details on this. +- You will also need to update your deploy scripts. See the [[hosting]] guide for more details. \ No newline at end of file diff --git a/content/quartz-layout.png b/content/quartz-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..4767b549c2469c65482dde2fc69dfea67c0e781b GIT binary patch literal 63222 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�oFQF7lI>fxZupq*R(>;lRsuhPjwrs_ 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 literal 0 HcmV?d00001 diff --git a/quartz.layout.ts b/quartz.layout.ts index f47b2249..1a3f99fa 100644 --- a/quartz.layout.ts +++ b/quartz.layout.ts @@ -1,8 +1,8 @@ -import { PageLayout } from "./quartz/cfg" +import { PageLayout, SharedLayout } from "./quartz/cfg" import * as Component from "./quartz/components" // components shared across all pages -export const sharedPageComponents = { +export const sharedPageComponents: SharedLayout = { head: Component.Head(), header: [], footer: Component.Footer({ diff --git a/quartz/cfg.ts b/quartz/cfg.ts index d8a14a32..3c9613b7 100644 --- a/quartz/cfg.ts +++ b/quartz/cfg.ts @@ -45,3 +45,4 @@ export interface FullPageLayout { } export type PageLayout = Pick +export type SharedLayout = Pick diff --git a/quartz/path.ts b/quartz/path.ts index 494d3c5d..9af5c7bf 100644 --- a/quartz/path.ts +++ b/quartz/path.ts @@ -228,7 +228,7 @@ function _isRelativeSegment(s: string): boolean { return /^\.{0,2}$/.test(s) } -function _stripSlashes(s: string): string { +export function _stripSlashes(s: string): string { if (s.startsWith("/")) { s = s.substring(1) } diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 07650621..9a9195bb 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -2,6 +2,7 @@ import { QuartzTransformerPlugin } from "../types" import { CanonicalSlug, RelativeURL, + _stripSlashes, canonicalizeServer, joinSegments, pathToRoot, @@ -35,7 +36,7 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = return (tree, file) => { const curSlug = canonicalizeServer(file.data.slug!) const transformLink = (target: string): RelativeURL => { - const targetSlug = transformInternalLink(target).slice("./".length) + const targetSlug = _stripSlashes(transformInternalLink(target).slice(".".length)) let [targetCanonical, targetAnchor] = splitAnchor(targetSlug) if (opts.markdownLinkResolution === "relative") { return targetSlug as RelativeURL diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 8d8d4573..0904ed12 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -225,7 +225,6 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin } // internal link - // const url = transformInternalLink(fp + anchor) const url = fp + anchor return { type: "link", diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 72919396..6bed7ca2 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -81,7 +81,9 @@ a { .page { @media all and (max-width: $fullPageWidth) { - margin: 0 5vw; + margin: 0 auto; + padding: 0 1rem; + max-width: 800px; } & article { From 3adc73a703142b3c0475570e4de16701b2797524 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 6 Aug 2023 19:52:30 -0700 Subject: [PATCH 0454/1221] docs upgrade, ci changes --- .github/workflows/ci.yaml | 1 + content/build.md | 2 +- content/hosting.md | 85 ++++++++++++++---- content/images/dns-records.png | Bin 0 -> 77842 bytes content/{ => images}/quartz-layout.png | Bin .../quartz-transform-pipeline.png | Bin content/upgrading.md | 6 ++ quartz/styles/base.scss | 21 ++++- 8 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 content/images/dns-records.png rename content/{ => images}/quartz-layout.png (100%) rename content/{ => images}/quartz-transform-pipeline.png (100%) create mode 100644 content/upgrading.md diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4a7a9f7d..a5441563 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,6 +7,7 @@ on: jobs: build-and-test: + if: ${{ github.repository == 'jackyzha0/quartz' }} strategy: matrix: os: [windows-latest, macos-latest, ubuntu-latest] diff --git a/content/build.md b/content/build.md index ac6a410e..cce9b224 100644 --- a/content/build.md +++ b/content/build.md @@ -8,7 +8,7 @@ Once you've [[index#🪴 Get Started|initialized]] Quartz, let's see what it loo npx quartz build --serve ``` -Then, open a web browser and visit `http://localhost:8080/` to view it! +Then, open a web browser and visit `http://localhost:8080/` to view it. Want to change how Quartz looks? You can edit `quartz.config.ts` to customize and configure your Quartz, including styles, layout, and more. Read the [[configuration]] page for more information on what each field in the configuration does. diff --git a/content/hosting.md b/content/hosting.md index f644e4d6..23c43ece 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -5,46 +5,101 @@ title: Hosting Quartz effectively turns your Markdown files and other resources into a bundle of HTML, JS, and CSS files (a website!). However, if you'd like to publish your site to the world, you need a way to host it online. This guide will detail how to deploy with either GitHub Pages or Cloudflare pages but any service that allows you to deploy static HTML should work as well (e.g. Netlify, Replit, etc.) + +## Cloudflare Pages + +1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/) and select your account. +2. In Account Home, select **Workers & Pages** > **Create application** > **Pages** > **Connect to Git**. +3. Select the new GitHub repository that you created and, in the **Set up builds and deployments** section, provide the following information: + +|Configuration option|Value| +|---|---| +|Production branch|`v4-alpha`| +|Framework preset|`None`| +|Build command|`npx quartz build`| +|Build output directory|`public`| + +Press "Save and deploy" and Cloudflare should have a deployed version of your site in about a minute. Then, every time you sync your Quartz changes to GitHub, your site should be updated. + +To add a custom domain, check our [Cloudflare's documentation](https://developers.cloudflare.com/pages/platform/custom-domains/). + ## GitHub Pages Like Quartz 3, you can deploy the site generated by Quartz 4 via GitHub Pages. -In your local Quartz, create a new file `quartz/.github/workflows/deploy.yaml`: +In your local Quartz, create a new file `quartz/.github/workflows/deploy.yaml`. ```yaml title="quartz/.github/workflows/deploy.yaml" -name: Deploy to GitHub Pages +name: Deploy Quartz site to GitHub Pages on: push: branches: - v4-alpha +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + jobs: - deploy: + build: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch all history for git info - - uses: actions/setup-node@v3 with: node-version: 18.14 - - name: Install Dependencies run: npm ci - - name: Build Quartz run: npx quartz build - - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./public - publish_branch: master # deploying branch - cname: quartz.jzhao.xyz + path: public + + deploy: + needs: build + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 ``` -Then, the next time you -## Cloudflare Pages +Then, commit these changes by doing `npx quartz sync`. This should deploy your site to `.github.io/`. + +### Custom Domain +Here's how to add a custom domain to your GitHub pages deployment. + +1. Head to the "Settings" tab of your forked repository. +2. In the "Code and automation" section of the sidebar, click "Pages". +3. Under "Custom Domain", type your custom domain and click "Save". +4. This next step depends on whether you are using an apex domain (`example.com`) or a subdomain (`subdomain.example.com`). + - If you are using an apex domain, navigate to your DNS provider and create an `A` record that points your apex domain to GitHub's name servers which have the following IP addresses: + - `185.199.108.153` + - `185.199.109.153` + - `185.199.110.153` + - `185.199.111.153` + - If you are using a subdomain, navigate to your DNS provider and create a `CNAME` record that points your subdomain to the default domain for your site. For example, if you want to use the subdomain `quartz.example.com` for your user site, create a `CNAME` record that points `quartz.example.com` to `.github.io`. + + +![[dns-records.png]]*The above shows a screenshot of Google Domains configured for both `jzhao.xyz` (an apex domain) and `quartz.jzhao.xyz` (a subdomain).* + +See the [GitHub documentation](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain) for more detail about how to setup your own custom domain with GitHub Pages. + + +> [!question] Why aren't my changes showing up? +> There could be many different reasons why your changes aren't showing up but the most likely reason is that you forgot to push your changes to GitHub. +> +> Make sure you save your changes to Git and sync it to GitHub by doing `npx quartz sync`. This will also make sure to pull any updates you may have made from other devices so you have them locally. diff --git a/content/images/dns-records.png b/content/images/dns-records.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9f854bdd4b10ffcf43f1d5193559fbea70e147 GIT binary patch literal 77842 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 a3O{<1f78MIRqYe-OH4>wu!R5pm;VPzscn`3 literal 0 HcmV?d00001 diff --git a/content/quartz-layout.png b/content/images/quartz-layout.png similarity index 100% rename from content/quartz-layout.png rename to content/images/quartz-layout.png diff --git a/content/quartz-transform-pipeline.png b/content/images/quartz-transform-pipeline.png similarity index 100% rename from content/quartz-transform-pipeline.png rename to content/images/quartz-transform-pipeline.png diff --git a/content/upgrading.md b/content/upgrading.md new file mode 100644 index 00000000..5a265aa2 --- /dev/null +++ b/content/upgrading.md @@ -0,0 +1,6 @@ +--- +title: "Upgrading Quartz" +--- + +> [!note] +> This is specifically a guide for upgrading Quartz 4 version to a more recent update. If you are coming from Quartz 3, check out the [[migrating from Quartz 3|migration guide]] for more info. \ No newline at end of file diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 6bed7ca2..2f064c53 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -375,16 +375,29 @@ p { } table { - margin: 1rem 0; - border: 1px solid var(--gray); + margin: 1rem; padding: 1.5rem; border-collapse: collapse; + & > * { + line-height: 2rem; + } } -td, th { + text-align: left; + padding: 0.4rem 1rem; + border-bottom: 2px solid var(--gray); +} + +td { padding: 0.2rem 1rem; - border: 1px solid var(--gray); +} + +tr { + border-bottom: 1px solid var(--lightgray); + &:last-child { + border-bottom: none; + } } img { From 075ac33474d5d439b01daf5392738a3ea810b86d Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 6 Aug 2023 19:54:11 -0700 Subject: [PATCH 0455/1221] note formatting --- content/build.md | 5 +++-- content/configuration.md | 24 ++++++++++---------- content/hosting.md | 35 +++++++++++++++--------------- content/migrating from Quartz 3.md | 2 +- content/upgrading.md | 2 +- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/content/build.md b/content/build.md index cce9b224..1c7b00e8 100644 --- a/content/build.md +++ b/content/build.md @@ -16,10 +16,11 @@ Once you're happy with it, let's see how to [[hosting|deploy Quartz to the web]] > [!hint] Flags and options > For full help options, you can run `npx quartz build --help`. -> +> > Most of these have sensible defaults but you can override them if you have a custom setup: +> > - `-d` or `--directory`: the content folder. This is normally just `content` > - `-v` or `--verbose`: print out extra logging information > - `-o` or `--output`: the output folder. This is normally just `public` > - `--serve`: run a local hot-reloading server to preview your Quartz -> - `--port`: what port to run the local preview server on \ No newline at end of file +> - `--port`: what port to run the local preview server on diff --git a/content/configuration.md b/content/configuration.md index ef0bf9b2..54878522 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -86,13 +86,13 @@ Each page is composed of multiple different sections which contain `QuartzCompon ```typescript title="quartz/cfg.ts" export interface FullPageLayout { - head: QuartzComponent // single component - header: QuartzComponent[] // laid out horizontally + head: QuartzComponent // single component + header: QuartzComponent[] // laid out horizontally beforeBody: QuartzComponent[] // laid out vertically - pageBody: QuartzComponent // single component - left: QuartzComponent[] // vertical on desktop, horizontal on mobile - right: QuartzComponent[] // vertical on desktop, horizontal on mobile - footer: QuartzComponent // single component + pageBody: QuartzComponent // single component + left: QuartzComponent[] // vertical on desktop, horizontal on mobile + right: QuartzComponent[] // vertical on desktop, horizontal on mobile + footer: QuartzComponent // single component } ``` @@ -101,22 +101,24 @@ These correspond to following parts of the page: ![[quartz-layout.png|800]] > [!note] -> There are two additional layout fields that are *not* shown in the above diagram. +> There are two additional layout fields that are _not_ shown in the above diagram. +> > 1. `head` is a single component that renders the `` [tag](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head) in the HTML. This doesn't appear visually on the page and is only is responsible for metadata about the document like the tab title, scripts, and styles. -> 2. `header` is a set of components that are laid out horizontally and appears *before* the `beforeBody` section. This enables you to replicate the old Quartz 3 header bar where the title, search bar, and dark mode toggle. By default, Quartz 4 doesn't place any components in the `header`. +> 2. `header` is a set of components that are laid out horizontally and appears _before_ the `beforeBody` section. This enables you to replicate the old Quartz 3 header bar where the title, search bar, and dark mode toggle. By default, Quartz 4 doesn't place any components in the `header`. Quartz **components**, like plugins, can take in additional properties as configuration options. If you're familiar with React terminology, you can think of them as Higher-order Components. See [a list of all the components](./tags/component) for all available components along with their configuration options. ### Style -Most meaningful style changes like colour scheme and font can be done simply through the [[#General Configuration|general configuration]] options above. + +Most meaningful style changes like colour scheme and font can be done simply through the [[#General Configuration|general configuration]] options above. However, if you'd like to make more involved style changes, you can do this by writing your own styles. Quartz 4, like Quartz 3, uses [Sass](https://sass-lang.com/guide/) for styling. -You can see the base style sheet in `quartz/styles/base.scss` and write your own in `quartz/styles/custom.scss`. +You can see the base style sheet in `quartz/styles/base.scss` and write your own in `quartz/styles/custom.scss`. > [!note] > Some components may provide their own styling as well! For example, `quartz/components/Darkmode.tsx` imports its styles from `quartz/components/styles/darkmode.scss`. If you'd like to customize styling for a specific component, double check the component definition to see how its styles are defined. -When you're ready, see how [[build|build and preview]] Quartz locally. \ No newline at end of file +When you're ready, see how [[build|build and preview]] Quartz locally. diff --git a/content/hosting.md b/content/hosting.md index 23c43ece..cf2f2567 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -12,12 +12,12 @@ However, if you'd like to publish your site to the world, you need a way to host 2. In Account Home, select **Workers & Pages** > **Create application** > **Pages** > **Connect to Git**. 3. Select the new GitHub repository that you created and, in the **Set up builds and deployments** section, provide the following information: -|Configuration option|Value| -|---|---| -|Production branch|`v4-alpha`| -|Framework preset|`None`| -|Build command|`npx quartz build`| -|Build output directory|`public`| +| Configuration option | Value | +| ---------------------- | ------------------ | +| Production branch | `v4-alpha` | +| Framework preset | `None` | +| Build command | `npx quartz build` | +| Build output directory | `public` | Press "Save and deploy" and Cloudflare should have a deployed version of your site in about a minute. Then, every time you sync your Quartz changes to GitHub, your site should be updated. @@ -80,26 +80,25 @@ jobs: Then, commit these changes by doing `npx quartz sync`. This should deploy your site to `.github.io/`. ### Custom Domain + Here's how to add a custom domain to your GitHub pages deployment. -1. Head to the "Settings" tab of your forked repository. +1. Head to the "Settings" tab of your forked repository. 2. In the "Code and automation" section of the sidebar, click "Pages". 3. Under "Custom Domain", type your custom domain and click "Save". 4. This next step depends on whether you are using an apex domain (`example.com`) or a subdomain (`subdomain.example.com`). - - If you are using an apex domain, navigate to your DNS provider and create an `A` record that points your apex domain to GitHub's name servers which have the following IP addresses: - - `185.199.108.153` - - `185.199.109.153` - - `185.199.110.153` - - `185.199.111.153` - - If you are using a subdomain, navigate to your DNS provider and create a `CNAME` record that points your subdomain to the default domain for your site. For example, if you want to use the subdomain `quartz.example.com` for your user site, create a `CNAME` record that points `quartz.example.com` to `.github.io`. - - -![[dns-records.png]]*The above shows a screenshot of Google Domains configured for both `jzhao.xyz` (an apex domain) and `quartz.jzhao.xyz` (a subdomain).* + - If you are using an apex domain, navigate to your DNS provider and create an `A` record that points your apex domain to GitHub's name servers which have the following IP addresses: + - `185.199.108.153` + - `185.199.109.153` + - `185.199.110.153` + - `185.199.111.153` + - If you are using a subdomain, navigate to your DNS provider and create a `CNAME` record that points your subdomain to the default domain for your site. For example, if you want to use the subdomain `quartz.example.com` for your user site, create a `CNAME` record that points `quartz.example.com` to `.github.io`. -See the [GitHub documentation](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain) for more detail about how to setup your own custom domain with GitHub Pages. +![[dns-records.png]]_The above shows a screenshot of Google Domains configured for both `jzhao.xyz` (an apex domain) and `quartz.jzhao.xyz` (a subdomain)._ +See the [GitHub documentation](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain) for more detail about how to setup your own custom domain with GitHub Pages. > [!question] Why aren't my changes showing up? > There could be many different reasons why your changes aren't showing up but the most likely reason is that you forgot to push your changes to GitHub. -> +> > Make sure you save your changes to Git and sync it to GitHub by doing `npx quartz sync`. This will also make sure to pull any updates you may have made from other devices so you have them locally. diff --git a/content/migrating from Quartz 3.md b/content/migrating from Quartz 3.md index c2e4c4eb..98a5b9a5 100644 --- a/content/migrating from Quartz 3.md +++ b/content/migrating from Quartz 3.md @@ -23,4 +23,4 @@ When running `npx quartz create`, you will be prompted as to how to initialize y - Some HTML layout may not be the same between Quartz 3 and Quartz 4. If you depended on a particular HTML hierarchy or class names, you may need to update your custom CSS to reflect these changes. - If you customized the layout of Quartz 3, you may need to translate these changes from Go templates back to JSX as Quartz 4 no longer uses Hugo. For components, check out the guide on [[creating components]] for more details on this. -- You will also need to update your deploy scripts. See the [[hosting]] guide for more details. \ No newline at end of file +- You will also need to update your deploy scripts. See the [[hosting]] guide for more details. diff --git a/content/upgrading.md b/content/upgrading.md index 5a265aa2..425438df 100644 --- a/content/upgrading.md +++ b/content/upgrading.md @@ -3,4 +3,4 @@ title: "Upgrading Quartz" --- > [!note] -> This is specifically a guide for upgrading Quartz 4 version to a more recent update. If you are coming from Quartz 3, check out the [[migrating from Quartz 3|migration guide]] for more info. \ No newline at end of file +> This is specifically a guide for upgrading Quartz 4 version to a more recent update. If you are coming from Quartz 3, check out the [[migrating from Quartz 3|migration guide]] for more info. From d8d9dd22c9e81f344f3ab56f7262d804c2720fcd Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 6 Aug 2023 20:52:17 -0700 Subject: [PATCH 0456/1221] fix shortest path for non-md files, mobile fix --- quartz/build.ts | 102 +++++++++++++++------------ quartz/plugins/emitters/assets.ts | 4 +- quartz/plugins/transformers/links.ts | 5 +- quartz/styles/base.scss | 2 +- 4 files changed, 63 insertions(+), 50 deletions(-) diff --git a/quartz/build.ts b/quartz/build.ts index ffa863c2..ae5fd409 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -57,13 +57,14 @@ async function buildQuartz(argv: Argv, clientRefresh: () => void) { console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) perf.addEvent("glob") - const fps = await glob("**/*.md", argv.directory, cfg.configuration.ignorePatterns) + const allFiles = await glob("**/*.*", argv.directory, cfg.configuration.ignorePatterns) + const fps = allFiles.filter((fp) => fp.endsWith(".md")) console.log( `Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, ) const filePaths = fps.map((fp) => joinSegments(argv.directory, fp) as FilePath) - ctx.allSlugs = fps.map((fp) => slugifyFilePath(fp as FilePath)) + ctx.allSlugs = allFiles.map((fp) => slugifyFilePath(fp as FilePath)) const parsedFiles = await parseMarkdown(ctx, filePaths) const filteredContent = filterContent(ctx, parsedFiles) @@ -93,61 +94,72 @@ async function startServing( let timeoutId: ReturnType | null = null let toRebuild: Set = new Set() let toRemove: Set = new Set() + let trackedAssets: Set = new Set() async function rebuild(fp: string, action: "add" | "change" | "delete") { - if (path.extname(fp) !== ".md") { - // dont bother rebuilding for non-content files, just refresh - clientRefresh() + // don't do anything for gitignored files + if (ignored(fp)) { return } - fp = toPosixPath(fp) - if (!ignored(fp)) { + // dont bother rebuilding for non-content files, just track and refresh + if (path.extname(fp) !== ".md") { + fp = toPosixPath(fp) const filePath = joinSegments(argv.directory, fp) as FilePath if (action === "add" || action === "change") { - toRebuild.add(filePath) + trackedAssets.add(filePath) } else if (action === "delete") { - toRemove.add(filePath) + trackedAssets.add(filePath) } + clientRefresh() + return + } - if (timeoutId) { - clearTimeout(timeoutId) - } + fp = toPosixPath(fp) + const filePath = joinSegments(argv.directory, fp) as FilePath + if (action === "add" || action === "change") { + toRebuild.add(filePath) + } else if (action === "delete") { + toRemove.add(filePath) + } + + if (timeoutId) { + clearTimeout(timeoutId) + } - // debounce rebuilds every 250ms - timeoutId = setTimeout(async () => { - const perf = new PerfTimer() - console.log(chalk.yellow("Detected change, rebuilding...")) - try { - const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) - - ctx.allSlugs = [...new Set([...contentMap.keys(), ...toRebuild])] - .filter((fp) => !toRemove.has(fp)) - .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) - - const parsedContent = await parseMarkdown(ctx, filesToRebuild) - for (const content of parsedContent) { - const [_tree, vfile] = content - contentMap.set(vfile.data.filePath!, content) - } - - for (const fp of toRemove) { - contentMap.delete(fp) - } - - await rimraf(argv.output) - const parsedFiles = [...contentMap.values()] - const filteredContent = filterContent(ctx, parsedFiles) - await emitContent(ctx, filteredContent) - console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`)) - } catch { - console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`)) + // debounce rebuilds every 250ms + timeoutId = setTimeout(async () => { + const perf = new PerfTimer() + console.log(chalk.yellow("Detected change, rebuilding...")) + try { + const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) + + ctx.allSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] + .filter((fp) => !toRemove.has(fp)) + .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) + + const parsedContent = await parseMarkdown(ctx, filesToRebuild) + for (const content of parsedContent) { + const [_tree, vfile] = content + contentMap.set(vfile.data.filePath!, content) } - clientRefresh() - toRebuild.clear() - toRemove.clear() - }, 250) - } + for (const fp of toRemove) { + contentMap.delete(fp) + } + + await rimraf(argv.output) + const parsedFiles = [...contentMap.values()] + const filteredContent = filterContent(ctx, parsedFiles) + await emitContent(ctx, filteredContent) + console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`)) + } catch { + console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`)) + } + + clientRefresh() + toRebuild.clear() + toRemove.clear() + }, 250) } const watcher = chokidar.watch(".", { diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts index 8ea3055d..400c39da 100644 --- a/quartz/plugins/emitters/assets.ts +++ b/quartz/plugins/emitters/assets.ts @@ -12,7 +12,7 @@ export const Assets: QuartzEmitterPlugin = () => { }, async emit({ argv, cfg }, _content, _resources, _emit): Promise { // glob all non MD/MDX/HTML files in content folder and copy it over - const assetsPath = joinSegments(argv.output, "assets") + const assetsPath = argv.output const fps = await glob("**", argv.directory, ["**/*.md", ...cfg.configuration.ignorePatterns]) const res: FilePath[] = [] for (const fp of fps) { @@ -24,7 +24,7 @@ export const Assets: QuartzEmitterPlugin = () => { const dir = path.dirname(dest) as FilePath await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists await fs.promises.copyFile(src, dest) - res.push(joinSegments("assets", fp) as FilePath) + res.push(fp) } return res diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 9a9195bb..54bcce9e 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -99,9 +99,10 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = typeof node.properties.src === "string" ) { if (!isAbsoluteUrl(node.properties.src)) { + let dest = node.properties.src as RelativeURL const ext = path.extname(node.properties.src) - node.properties.src = - transformLink(joinSegments("assets", node.properties.src)) + ext + dest = node.properties.src = transformLink(dest) + node.properties.src = dest + ext } } }) diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 2f064c53..2c54527e 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -83,7 +83,7 @@ a { @media all and (max-width: $fullPageWidth) { margin: 0 auto; padding: 0 1rem; - max-width: 800px; + // max-width: 800px; } & article { From cd9dc6ecb570c08291e73d9db001e6068df4d88a Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 6 Aug 2023 22:07:08 -0700 Subject: [PATCH 0457/1221] fix css transforms for mobile --- content/configuration.md | 2 +- quartz/bootstrap-cli.mjs | 9 --------- quartz/components/styles/graph.scss | 1 + quartz/components/styles/search.scss | 1 + quartz/plugins/emitters/componentResources.ts | 3 ++- quartz/styles/base.scss | 8 +++++--- 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/content/configuration.md b/content/configuration.md index 54878522..aa262137 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -119,6 +119,6 @@ However, if you'd like to make more involved style changes, you can do this by w You can see the base style sheet in `quartz/styles/base.scss` and write your own in `quartz/styles/custom.scss`. > [!note] -> Some components may provide their own styling as well! For example, `quartz/components/Darkmode.tsx` imports its styles from `quartz/components/styles/darkmode.scss`. If you'd like to customize styling for a specific component, double check the component definition to see how its styles are defined. +> Some components may provide their own styling as well! For example, `quartz/components/Darkmode.tsx` imports styles from `quartz/components/styles/darkmode.scss`. If you'd like to customize styling for a specific component, double check the component definition to see how its styles are defined. When you're ready, see how [[build|build and preview]] Quartz locally. diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 8b9bea90..71d69574 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -12,7 +12,6 @@ import { rimraf } from "rimraf" import chokidar from "chokidar" import prettyBytes from "pretty-bytes" import { execSync, spawnSync } from "child_process" -import { transform as cssTransform } from "lightningcss" import http from "http" import serveHandler from "serve-handler" import { WebSocketServer } from "ws" @@ -312,14 +311,6 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. sassPlugin({ type: "css-text", cssImports: true, - async transform(css) { - const { code } = cssTransform({ - filename: "style.css", - code: Buffer.from(css), - minify: true, - }) - return code.toString() - }, }), { name: "inline-script-loader", diff --git a/quartz/components/styles/graph.scss b/quartz/components/styles/graph.scss index 3deaa1fe..6e8c5033 100644 --- a/quartz/components/styles/graph.scss +++ b/quartz/components/styles/graph.scss @@ -43,6 +43,7 @@ width: 100vw; height: 100%; backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); display: none; overflow: hidden; diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss index 4d5ad95c..6fada546 100644 --- a/quartz/components/styles/search.scss +++ b/quartz/components/styles/search.scss @@ -48,6 +48,7 @@ overflow-y: auto; display: none; backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); &.active { display: inline-block; diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index 69c9dd5d..5dc72748 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -13,7 +13,7 @@ import { BuildCtx } from "../../ctx" import { StaticResources } from "../../resources" import { QuartzComponent } from "../../components/types" import { googleFontHref, joinStyles } from "../../theme" -import { transform } from "lightningcss" +import { Features, transform } from "lightningcss" type ComponentResources = { css: string[] @@ -161,6 +161,7 @@ export const ComponentResources: QuartzEmitterPlugin = (opts?: Partial< filename: "index.css", code: Buffer.from(stylesheet), minify: true, + include: Features.MediaQueries }).code.toString(), }), emit({ diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 2c54527e..e219cc57 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -7,6 +7,8 @@ html { scroll-behavior: smooth; -webkit-text-size-adjust: none; text-size-adjust: none; + overflow-x: none; + width: 100vw; } body { @@ -83,7 +85,7 @@ a { @media all and (max-width: $fullPageWidth) { margin: 0 auto; padding: 0 1rem; - // max-width: 800px; + max-width: $pageWidth; } & article { @@ -164,9 +166,9 @@ a { & .center, & footer { - width: $pageWidth; margin-left: auto; margin-right: auto; + width: $pageWidth; @media all and (max-width: $fullPageWidth) { width: initial; margin-left: 0; @@ -431,7 +433,7 @@ video { ul.overflow, ol.overflow { - height: 400px; + height: 300px; overflow-y: scroll; // clearfix From b4cacd59569c066c52bbe163165c2a30d6ce3ad0 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 6 Aug 2023 22:07:33 -0700 Subject: [PATCH 0458/1221] format --- quartz/plugins/emitters/componentResources.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index 5dc72748..d44750f2 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -161,7 +161,7 @@ export const ComponentResources: QuartzEmitterPlugin = (opts?: Partial< filename: "index.css", code: Buffer.from(stylesheet), minify: true, - include: Features.MediaQueries + include: Features.MediaQueries, }).code.toString(), }), emit({ From d02af6a8ae4c3bea4c94ad63c118d517318146fe Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 7 Aug 2023 17:34:38 -0700 Subject: [PATCH 0459/1221] architecture, fix vendor prefixing --- content/advanced/architecture.md | 53 ++++++++++++++++++- content/advanced/creating components.md | 5 ++ content/build.md | 2 +- .../wikilinks.md} | 0 content/hosting.md | 2 +- content/index.md | 4 +- content/upgrading.md | 10 ++++ quartz/components/styles/graph.scss | 1 - quartz/components/styles/search.scss | 1 - quartz/plugins/emitters/componentResources.ts | 6 +++ 10 files changed, 77 insertions(+), 7 deletions(-) rename content/{custom domain.md => features/wikilinks.md} (100%) diff --git a/content/advanced/architecture.md b/content/advanced/architecture.md index 688fd75f..31a9d7fb 100644 --- a/content/advanced/architecture.md +++ b/content/advanced/architecture.md @@ -1 +1,52 @@ -how does quartz work? great question lol +--- +title: Architecture +--- + +Quartz is a static site generator. How does it work? + +This question is best answered by tracing what happens when a user (you!) runs `npx quartz build` in the command line: + +## On the server + +1. After running `npx quartz build`, npm will look at `package.json` to find the `bin.quartz` entry which points at `./quartz/bootstrap-cli.mjs`. +2. This file has a [shebang]() line at the top which tells npm to execute it using Node. +3. `bootstrap-cli.mjs` is responsible for a few things: + 1. Parsing the command-line arguments using [yargs](http://yargs.js.org/). + 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' scripts (any `.inline.ts` file) that components can run client-side using a custom plugin that runs another instance of `esbuild` that bundles for browser instead of `node`. Both of these are imported as plain text. + 3. Running the local preview server if `--serve` is set. This starts two servers: + 1. A WebSocket server on port 3001 to handle hot-reload signals. This tracks all inbound connections and sends a 'rebuild' message a server-side change is detected (either content or configuration). + 2. An HTTP file-server on a user defined port (normally 8080) to serve the actual website files. + 4. Again, if the local preview server is running, it also starts a file watcher to detect source-code changes (e.g. anything that is `.ts`, `.tsx`, `.scss`, or packager files). On a change, we _rebuild_ the module (step 2 above) using esbuild's [rebuild API](https://esbuild.github.io/api/#rebuild) which drastically reduces the build times. + 5. After transpiling the main Quartz build module (`quartz/build.ts`), we write it to a cache file `.quartz-cache/transpiled-build.mjs` and then dynamically import this using `await import(cacheFile)`. However, we need to be pretty smart about how to bust Node's [import cache](https://github.com/nodejs/modules/issues/307) so we add a random query string to fake Node into thinking it's a new module. This does, however, cause memory leaks so we just hope that the user doesn't hot-reload their configuration too many times in a single session :)) (it leaks about ~350kB memory on each reload). After importing the module, we then invoke it, passing in the command line arguments we parsed earlier along with a callback function to signal the client to refresh. +4. In `build.ts`, we start by installing source map support manually to account for the query string cache busting hack we introduced earlier. Then, we start processing content: + 1. Clean the output directory. + 2. Recursively glob all files in the `content` folder, respecting the `.gitignore`. + 3. Parse the Markdown files. + 1. Quartz detects the number of threads available and chooses to spawn worker threads if there are >128 pieces of content to parse (rough heuristic). If it needs to spawn workers, it will do another esbuild transpile of the worker script `quartz/worker.ts`. Then, a work-stealing [workerpool](https://www.npmjs.com/package/workerpool) is then created and 'chunks' of 128 files are assigned to workers. + 2. Each worker (or just the main thread if there is no concurrency) creates a [unified](https://github.com/unifiedjs/unified) parser based off of the plugins defined in the [[configuration]]. + 3. Parsing has three steps: + 1. Read the file into a [vfile](https://github.com/vfile/vfile). + 2. Applied plugin-defined text transformations over the content. + 3. Slugify the file path and store it in the data for the file. See the page on [[paths]] for more details about how path logic works in Quartz (spoiler: its complicated). + 4. Markdown parsing using [remark-parse](https://www.npmjs.com/package/remark-parse) (text to [mdast](https://github.com/syntax-tree/mdast)). + 5. Apply plugin-defined Markdown-to-Markdown transformations. + 6. Convert Markdown into HTML using [remark-rehype](https://github.com/remarkjs/remark-rehype) ([mdast](https://github.com/syntax-tree/mdast) to [hast](https://github.com/syntax-tree/hast)). + 7. Apply plugin-defined HTML-to-HTML transformations. + 4. Filter out unwanted content using plugins. + 5. Emit files using plugins. + 1. Gather all the static resources (e.g. external CSS, JS modules, etc.) each emitter plugin declares. + 2. Emitters that emit HTML files do a bit of extra work here as they need to transform the [hast](https://github.com/syntax-tree/hast) produced in the parse step to JSX. This is done using [hast-util-to-jsx-runtime](https://github.com/syntax-tree/hast-util-to-jsx-runtime) with the [Preact](https://preactjs.com/) runtime. Finally, the JSX is rendered to HTML using [preact-render-to-string](https://github.com/preactjs/preact-render-to-string) which statically renders the JSX to HTML (i.e. doesn't care about `useState`, `useEffect`, or any other React/Preact interactive bits). Here, we also do a bunch of fun stuff like assemble the page layout from `quartz.layout.ts`, assemble all the inline scripts that actually get shipped to the client, and all the transpiled styles. The bulk of this logic can be found in `quartz/components/renderPage.tsx`. Other fun things of note: + 1. CSS is minified and transformed using [Lightning CSS](https://github.com/parcel-bundler/lightningcss) to add vendor prefixes and do syntax lowering. + 2. Scripts are split into `beforeDOMLoaded` and `afterDOMLoaded` and are inserted in the `` and `` respectively. + 3. Finally, each emitter plugin is responsible for emitting and writing it's own emitted files to disk. + 6. If the `--serve` flag was detected, we also set up another file watcher to detect content changes (only `.md` files). We keep a content map that tracks the parsed AST and plugin data for each slug and update this on file changes. Newly added or modified paths are rebuilt and added to the content map. Then, all the filters and emitters are run over the resulting content map. This file watcher is debounced with a threshold of 250ms. On success, we send a client refresh signal using the passed in callback function. + +## On the client + +1. The browser opens a Quartz page and loads the HTML. The `` also links to page styles (emitted to `public/index.css`) and page-critical JS (emitted to `public/prescript.js`) +2. Then, once the body is loaded, the browser loads the non-critical JS (emitted to `public/postscript.js`) +3. Once the page is done loading, the page will then dispatch a custom synthetic browser event `"nav"`. This is used so client-side scripts declared by components can 'setup' anything that requires access to the page DOM. + 1. If the [[SPA Routing|enableSPA option]] is enabled in the [[configuration]], this `"nav"` event is also fired on any client-navigation to allow for components to unregister and reregister any event handlers and state. + 2. If it's not, we wire up the `"nav"` event to just be fired a single time after page load to allow for consistency across how state is setup across both SPA and non-SPA contexts. + +The architecture and design of the plugin system was intentionally left pretty vague here as this is described in much more depth in the guide on [[making plugins|making your own plugin]]. diff --git a/content/advanced/creating components.md b/content/advanced/creating components.md index 9467ef8a..0944eedd 100644 --- a/content/advanced/creating components.md +++ b/content/advanced/creating components.md @@ -3,3 +3,8 @@ title: Creating your own Quartz components --- See the [component listing](/tags/component) for a full-list of the Quartz built-in components. + +- css +- scripts + - listening for the nav event + - best practice: anything here should unmount any existing event handlers to prevent memory leaks diff --git a/content/build.md b/content/build.md index 1c7b00e8..541c9d2e 100644 --- a/content/build.md +++ b/content/build.md @@ -12,7 +12,7 @@ Then, open a web browser and visit `http://localhost:8080/` to view it. Want to change how Quartz looks? You can edit `quartz.config.ts` to customize and configure your Quartz, including styles, layout, and more. Read the [[configuration]] page for more information on what each field in the configuration does. -Once you're happy with it, let's see how to [[hosting|deploy Quartz to the web]]. +Once you're happy with it, let's see how to [[hosting|deploy Quartz to the web]]! > [!hint] Flags and options > For full help options, you can run `npx quartz build --help`. diff --git a/content/custom domain.md b/content/features/wikilinks.md similarity index 100% rename from content/custom domain.md rename to content/features/wikilinks.md diff --git a/content/hosting.md b/content/hosting.md index cf2f2567..5d09500c 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -21,7 +21,7 @@ However, if you'd like to publish your site to the world, you need a way to host Press "Save and deploy" and Cloudflare should have a deployed version of your site in about a minute. Then, every time you sync your Quartz changes to GitHub, your site should be updated. -To add a custom domain, check our [Cloudflare's documentation](https://developers.cloudflare.com/pages/platform/custom-domains/). +To add a custom domain, check out [Cloudflare's documentation](https://developers.cloudflare.com/pages/platform/custom-domains/). ## GitHub Pages diff --git a/content/index.md b/content/index.md index 0659e881..32425852 100644 --- a/content/index.md +++ b/content/index.md @@ -25,13 +25,13 @@ This will guide you through initializing your Quartz with content. Once you've d ## 🔧 Features -- [[full-text search|Full-text search]], [[graph view]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box +- [[full-text search|Full-text search]], [[graph view]], [[wikilinks]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box - Hot-reload for both configuration and content - Simple JSX [[creating components|layouts and page components]] - [[SPA Routing|Ridiculously fast page loads]] and tiny bundle sizes - Fully-customizable parsing, filtering, and page generation through [[making plugins|plugins]] -For a comprehensive list of features, visit the [features page](/features). You can read more the _why_ behind these features on the [[philosophy]] page. +For a comprehensive list of features, visit the [features page](/features). You can read more the _why_ behind these features on the [[philosophy]] page and a technical overview on the [[architecture]] page. ### 🚧 Troubleshooting diff --git a/content/upgrading.md b/content/upgrading.md index 425438df..f9f0c399 100644 --- a/content/upgrading.md +++ b/content/upgrading.md @@ -4,3 +4,13 @@ title: "Upgrading Quartz" > [!note] > This is specifically a guide for upgrading Quartz 4 version to a more recent update. If you are coming from Quartz 3, check out the [[migrating from Quartz 3|migration guide]] for more info. + +To fetch the latest Quartz updates, simply do + +``` +npx quartz upgrade +``` + +As Quartz uses [git](https://git-scm.com/) under the hood for versioning, updating effectively 'pulls' in the updates from the official Quartz GitHub repository. If you have local changes that might conflict with the updates, you may need to resolve these manually yourself. + +If you have the [GitHub desktop app](https://desktop.github.com/), this will automatically open to help you resolve the conflicts. Otherwise, you will need to resolve this in a text editor like VSCode. For more help on resolving conflicts manually, check out the [GitHub guide on resolving merge conflicts](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line#competing-line-change-merge-conflicts). diff --git a/quartz/components/styles/graph.scss b/quartz/components/styles/graph.scss index 6e8c5033..3deaa1fe 100644 --- a/quartz/components/styles/graph.scss +++ b/quartz/components/styles/graph.scss @@ -43,7 +43,6 @@ width: 100vw; height: 100%; backdrop-filter: blur(4px); - -webkit-backdrop-filter: blur(4px); display: none; overflow: hidden; diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss index 6fada546..4d5ad95c 100644 --- a/quartz/components/styles/search.scss +++ b/quartz/components/styles/search.scss @@ -48,7 +48,6 @@ overflow-y: auto; display: none; backdrop-filter: blur(4px); - -webkit-backdrop-filter: blur(4px); &.active { display: inline-block; diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index d44750f2..45f26bc9 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -161,6 +161,12 @@ export const ComponentResources: QuartzEmitterPlugin = (opts?: Partial< filename: "index.css", code: Buffer.from(stylesheet), minify: true, + targets: { + safari: (15 << 16) | (6 << 8), // 15.6 + edge: 115 << 16, + firefox: 102 << 16, + chrome: 109 << 16, + }, include: Features.MediaQueries, }).code.toString(), }), From 527ce6546e7ec50e7720ff7b9b6ff79a89c3b7fc Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 7 Aug 2023 21:41:18 -0700 Subject: [PATCH 0460/1221] various css fixes, fix new image loading bug when previewing, path docs --- content/advanced/architecture.md | 6 ++-- content/advanced/paths.md | 45 +++++++++++++++++++++++++++++ content/images/quartz-layout.png | Bin 63222 -> 56729 bytes content/migrating from Quartz 3.md | 1 + quartz/build.ts | 20 +++++++------ quartz/plugins/transformers/ofm.ts | 14 +++++---- quartz/styles/base.scss | 4 +-- 7 files changed, 71 insertions(+), 19 deletions(-) diff --git a/content/advanced/architecture.md b/content/advanced/architecture.md index 31a9d7fb..f30331c1 100644 --- a/content/advanced/architecture.md +++ b/content/advanced/architecture.md @@ -12,17 +12,17 @@ This question is best answered by tracing what happens when a user (you!) runs ` 2. This file has a [shebang]() line at the top which tells npm to execute it using Node. 3. `bootstrap-cli.mjs` is responsible for a few things: 1. Parsing the command-line arguments using [yargs](http://yargs.js.org/). - 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' scripts (any `.inline.ts` file) that components can run client-side using a custom plugin that runs another instance of `esbuild` that bundles for browser instead of `node`. Both of these are imported as plain text. + 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' client-side scripts (any `.inline.ts` file) that components declare usiong a custom `esbuild` plugin that runs another instance of `esbuild` that bundles for the browser instead of `node`. Modules of both types are imported as plain text. 3. Running the local preview server if `--serve` is set. This starts two servers: 1. A WebSocket server on port 3001 to handle hot-reload signals. This tracks all inbound connections and sends a 'rebuild' message a server-side change is detected (either content or configuration). 2. An HTTP file-server on a user defined port (normally 8080) to serve the actual website files. - 4. Again, if the local preview server is running, it also starts a file watcher to detect source-code changes (e.g. anything that is `.ts`, `.tsx`, `.scss`, or packager files). On a change, we _rebuild_ the module (step 2 above) using esbuild's [rebuild API](https://esbuild.github.io/api/#rebuild) which drastically reduces the build times. + 4. If the `--serve` flag is set, it also starts a file watcher to detect source-code changes (e.g. anything that is `.ts`, `.tsx`, `.scss`, or packager files). On a change, we rebuild the module (step 2 above) using esbuild's [rebuild API](https://esbuild.github.io/api/#rebuild) which drastically reduces the build times. 5. After transpiling the main Quartz build module (`quartz/build.ts`), we write it to a cache file `.quartz-cache/transpiled-build.mjs` and then dynamically import this using `await import(cacheFile)`. However, we need to be pretty smart about how to bust Node's [import cache](https://github.com/nodejs/modules/issues/307) so we add a random query string to fake Node into thinking it's a new module. This does, however, cause memory leaks so we just hope that the user doesn't hot-reload their configuration too many times in a single session :)) (it leaks about ~350kB memory on each reload). After importing the module, we then invoke it, passing in the command line arguments we parsed earlier along with a callback function to signal the client to refresh. 4. In `build.ts`, we start by installing source map support manually to account for the query string cache busting hack we introduced earlier. Then, we start processing content: 1. Clean the output directory. 2. Recursively glob all files in the `content` folder, respecting the `.gitignore`. 3. Parse the Markdown files. - 1. Quartz detects the number of threads available and chooses to spawn worker threads if there are >128 pieces of content to parse (rough heuristic). If it needs to spawn workers, it will do another esbuild transpile of the worker script `quartz/worker.ts`. Then, a work-stealing [workerpool](https://www.npmjs.com/package/workerpool) is then created and 'chunks' of 128 files are assigned to workers. + 1. Quartz detects the number of threads available and chooses to spawn worker threads if there are >128 pieces of content to parse (rough heuristic). If it needs to spawn workers, it will invoke esbuild again to transpile the worker script `quartz/worker.ts`. Then, a work-stealing [workerpool](https://www.npmjs.com/package/workerpool) is then created and batches of 128 files are assigned to workers. 2. Each worker (or just the main thread if there is no concurrency) creates a [unified](https://github.com/unifiedjs/unified) parser based off of the plugins defined in the [[configuration]]. 3. Parsing has three steps: 1. Read the file into a [vfile](https://github.com/vfile/vfile). diff --git a/content/advanced/paths.md b/content/advanced/paths.md index e69de29b..2a5e09fb 100644 --- a/content/advanced/paths.md +++ b/content/advanced/paths.md @@ -0,0 +1,45 @@ +--- +title: Paths in Quartz +--- + +Paths are pretty complex to reason about because, especially for a static site generator, they can come from so many places. + +The current browser URL? Technically a path. A full file path to a piece of content? Also a path. What about a slug for a piece of content? Yet another path. + +It would be silly to type these all as `string` and call it a day as it's pretty common to accidentally mistake one type of path for another. Unfortunately, TypeScript does not have [nominal types](https://en.wikipedia.org/wiki/Nominal_type_system) for type aliases meaning even if you made custom types of a server-side slug or a client-slug slug, you can still accidentally assign one to another and TypeScript wouldn't catch it. + +Luckily, we can mimic nominal typing using [brands](https://www.typescriptlang.org/play#example/nominal-typing). + +```typescript +// instead of +type ClientSlug = string + +// we do +type ClientSlug = string & { __brand: "client" } + +// that way, the following will fail typechecking +const slug: ClientSlug = "some random slug" +``` + +While this prevents most typing mistakes *within* our nominal typing system (e.g. mistaking a server slug for a client slug), it doesn't prevent us from *accidentally* mistaking a string for a client slug when we forcibly cast it. + +Thus, we still need to be careful when casting from a string to one of these nominal types in the 'entrypoints', illustrated with hexagon shapes in the diagram below. + +The following diagram draws the relationships between all the path sources, nominal path types, and what functions in `quartz/path.ts` convert between them. + +```mermaid +graph LR + Browser{{Browser}} --> Window{{Window}} & LinkElement{{Link Element}} + Window --"getCanonicalSlug()"--> Canonical[Canonical Slug] + Window --"getClientSlug()"--> Client[Client Slug] + LinkElement --".href"--> Relative[Relative URL] + Client --"canonicalizeClient()"--> Canonical + Canonical --"pathToRoot()"--> Relative + Canonical --"resolveRelative()" --> Relative + MD{{Markdown File}} --> FilePath{{File Path}} & Links[Markdown links] + Links --"transformLink()"--> Relative + FilePath --"slugifyFilePath()"--> Server[Server Slug] + Server --> HTML["HTML File"] + Server --"canonicalizeServer()"--> Canonical + style Canonical stroke-width:4px +``` diff --git a/content/images/quartz-layout.png b/content/images/quartz-layout.png index 4767b549c2469c65482dde2fc69dfea67c0e781b..03435f7d57874b5c7c438dd0866318fe3c8d61dd 100644 GIT binary patch literal 56729 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≧itPg6L@|j0))h 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�oFQF7lI>fxZupq*R(>;lRsuhPjwrs_ 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 diff --git a/content/migrating from Quartz 3.md b/content/migrating from Quartz 3.md index 98a5b9a5..d3feb3fb 100644 --- a/content/migrating from Quartz 3.md +++ b/content/migrating from Quartz 3.md @@ -6,6 +6,7 @@ As you already have Quartz locally, you don't need to fork or clone it again. Si ```bash git checkout v4-alpha +git pull upstream v4-alpha npm i npx quartz create ``` diff --git a/quartz/build.ts b/quartz/build.ts index ae5fd409..05edf865 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -23,7 +23,7 @@ import { parseMarkdown } from "./processors/parse" import { filterContent } from "./processors/filter" import { emitContent } from "./processors/emit" import cfg from "../quartz.config" -import { FilePath, joinSegments, slugifyFilePath } from "./path" +import { FilePath, ServerSlug, joinSegments, slugifyFilePath } from "./path" import chokidar from "chokidar" import { ProcessedContent } from "./plugins/vfile" import { Argv, BuildCtx } from "./ctx" @@ -91,6 +91,7 @@ async function startServing( contentMap.set(vfile.data.filePath!, content) } + const initialSlugs = ctx.allSlugs let timeoutId: ReturnType | null = null let toRebuild: Set = new Set() let toRemove: Set = new Set() @@ -102,20 +103,19 @@ async function startServing( } // dont bother rebuilding for non-content files, just track and refresh + fp = toPosixPath(fp) + const filePath = joinSegments(argv.directory, fp) as FilePath if (path.extname(fp) !== ".md") { - fp = toPosixPath(fp) - const filePath = joinSegments(argv.directory, fp) as FilePath if (action === "add" || action === "change") { trackedAssets.add(filePath) } else if (action === "delete") { - trackedAssets.add(filePath) + trackedAssets.delete(filePath) } clientRefresh() return } - fp = toPosixPath(fp) - const filePath = joinSegments(argv.directory, fp) as FilePath + if (action === "add" || action === "change") { toRebuild.add(filePath) } else if (action === "delete") { @@ -133,10 +133,12 @@ async function startServing( try { const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) - ctx.allSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] - .filter((fp) => !toRemove.has(fp)) - .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) + const trackedSlugs = + [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] + .filter((fp) => !toRemove.has(fp)) + .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) + ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] const parsedContent = await parseMarkdown(ctx, filesToRebuild) for (const content of parsedContent) { const [_tree, vfile] = content diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 0904ed12..e7438aa9 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -413,12 +413,16 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin js.push({ script: ` import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; + const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' + mermaid.initialize({ + startOnLoad: false, + securityLevel: 'loose', + theme: darkMode ? 'dark' : 'default' + }); document.addEventListener('nav', async () => { - const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' - mermaid.initialize({ - securityLevel: 'loose', - theme: darkMode ? 'dark' : 'default' - }); + await mermaid.run({ + querySelector: '.mermaid' + }) }); `, loadTime: "afterDOMReady", diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index e219cc57..185582e8 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -7,7 +7,7 @@ html { scroll-behavior: smooth; -webkit-text-size-adjust: none; text-size-adjust: none; - overflow-x: none; + overflow-x: hidden; width: 100vw; } @@ -311,10 +311,10 @@ pre { border-radius: 5px; overflow-x: auto; border: 1px solid var(--lightgray); + position: relative; &:has(> code.mermaid) { border: none; - position: relative; } & > code { From 2ac5dd49da34d33e4086630d371cbaf1ed294153 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 7 Aug 2023 21:51:06 -0700 Subject: [PATCH 0461/1221] fix regression in code block font-size boosting on safari mobile --- quartz/plugins/emitters/componentResources.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index 45f26bc9..68a24cf8 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -163,6 +163,7 @@ export const ComponentResources: QuartzEmitterPlugin = (opts?: Partial< minify: true, targets: { safari: (15 << 16) | (6 << 8), // 15.6 + ios_saf: (15 << 16) | (6 << 8), // 15.6 edge: 115 << 16, firefox: 102 << 16, chrome: 109 << 16, From 774a162850883468052fd5c5a79cf8786bd96989 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 7 Aug 2023 21:51:23 -0700 Subject: [PATCH 0462/1221] format --- quartz/build.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/quartz/build.ts b/quartz/build.ts index 05edf865..e6dc96aa 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -115,7 +115,6 @@ async function startServing( return } - if (action === "add" || action === "change") { toRebuild.add(filePath) } else if (action === "delete") { @@ -133,10 +132,9 @@ async function startServing( try { const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) - const trackedSlugs = - [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] - .filter((fp) => !toRemove.has(fp)) - .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) + const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] + .filter((fp) => !toRemove.has(fp)) + .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] const parsedContent = await parseMarkdown(ctx, filesToRebuild) From 533d68e642ca82b540d57a449d0e2c98ed921d6e Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 7 Aug 2023 23:56:50 -0700 Subject: [PATCH 0463/1221] most of creating components, increase legibility of bold in article and callouts --- content/advanced/creating components.md | 126 +++++++++++++++++++++++- quartz/styles/base.scss | 5 + quartz/styles/callouts.scss | 36 +++---- 3 files changed, 146 insertions(+), 21 deletions(-) diff --git a/content/advanced/creating components.md b/content/advanced/creating components.md index 0944eedd..6cdaed19 100644 --- a/content/advanced/creating components.md +++ b/content/advanced/creating components.md @@ -2,9 +2,129 @@ title: Creating your own Quartz components --- -See the [component listing](/tags/component) for a full-list of the Quartz built-in components. +> [!warning] +> This guide assumes you have experience writing JavaScript and are familiar with TypeScript. -- css -- scripts +Normally on the web, we write layout code using HTML which looks something like the following: + +```html +

    +

    An article header

    +

    Some content

    +
    +``` + +This piece of HTML represents an article with a leading header that says "An article header" and a paragraph that contains the text "Some content". This is normally combined with CSS to style the page and JavaScript to add interactivity. + +However, HTML doesn't let you create reusable templates. If you wanted to create a new page, you would need to copy and paste the above snippet and edit the header and content yourself. This isn't great if we have a lot of content on our site that shares a lot of similar layout. The smart people who created React also had similar thoughts, inventing the concept of JSX Components to solve the code duplication problem. + +In effect, components allow you to write a JavaScript function that takes some data and produces HTML as an output. **While Quartz doesn't use React, it uses the same component concept to allow you to easily express layout templates in your Quartz site.** + +> [!hint] +> For those coming from React, Quartz components are different from React components in that it only uses JSX for templating and layout. Hooks like `useEffect`, `useState`, etc. are not rendered. +## An Example Component + +### Constructor +Component files are written in `.tsx` files that live in the `quartz/components` folder. These are re-exported in `quartz/components/index.ts` so you can use them in layouts and other components more easily. + +Each component file should have a default export that satisfies the `QuartzComponentConstructor` function signature. It is a function that takes in a single optional parameter `opts` and returns a Quartz Component. The type of the parameters `ops` is defined by the interface `Options` which you as the component creator also decide. + +In your component, you can use the values from the configuration option to change the rendering behaviour inside of your component. For example, the component in the code snippet below will not render if the `favouriteNumber` option is below 0. + +```tsx {11-17} +interface Options { + favouriteNumber: number +} + +const defaultOptions: Options = { + favouriteNumber: 42 +} + +export default ((userOpts?: Options) => { + const opts = { ...userOpts, ...defaultOpts } + function YourComponent(props: QuartzComponentProps) { + if (opts.favouriteNumber < 0) { + return null + } + + return

    My favourite number is {opts.favouriteNumber}

    + } + + return YourComponent +}) satisfies QuartzComponentConstructor +``` + +### Props +The Quartz component itself (lines 11-17 highlighted above) looks like a React component. It takes in properties (sometimes called [props](https://react.dev/learn/passing-props-to-a-component)) and returns JSX. + +All Quartz components accept the same set of props which are defined in `QuartzComponentProps`: + +```tsx title="quartz/components/types.ts" +// simplified for sake of demonstration +export type QuartzComponentProps = { + fileData: QuartzPluginData + cfg: GlobalConfiguration + tree: Node + allFiles: QuartzPluginData[] + displayClass?: "mobile-only" | "desktop-only" +} +``` + +- `fileData`: Any metadata [[making plugins|plugins]] may have added to the current page. + - `fileData.slug`: slug of the current page. + - `fileData.frontmatter`: any frontmatter parsed. +- `cfg`: The `configuration` field in `quartz.config.ts`. +- `tree`: the resulting [HTML AST](https://github.com/syntax-tree/hast) after processing and transforming the file. This is useful if you'd like to render the content using [hast-util-to-jsx-runtime](https://github.com/syntax-tree/hast-util-to-jsx-runtime) (you can find an example of this in `quartz/components/pages/Content.tsx`). +- `allFiles`: Metadata for all files that have been parsed. Useful for doing page listings or figuring out the overall site structure. +- `displayClass`: a utility class that indicates a preference from the user about how to render it in a mobile or desktop setting. Helpful if you want to conditionally hide a component on mobile or desktop. + +### Styling +Quartz components can also define a `.css` property on the actual function component which will get picked up by Quartz. This is expected to be a CSS string which can either be inlined or imported from a `.scss` file. + +Note that inlined styles **must** be plain vanilla CSS. + +```tsx {6-10} title="quartz/components/YourComponent.tsx" +export default (() => { + function YourComponent() { + return

    Example Component

    + } + + YourComponent.css = ` + p { + color: red; + } + ` + + return YourComponent +}) satisfies QuartzComponentConstructor +``` + +Imported styles, however, can be from SCSS files. + +```tsx {1-2,9} title="quartz/components/YourComponent.tsx" +// assuming your stylesheet is in quartz/components/styles/YourComponent.scss +import styles from "./styles/YourComponent.scss" + +export default (() => { + function YourComponent() { + return

    Example Component

    + } + + YourComponent.css = styles + return YourComponent +}) satisfies QuartzComponentConstructor +``` + +> [!warning] +> Quartz does not use CSS modules so any styles you declare here apply *globally*. If you only want it to apply to your component, make sure you use specific class names and selectors. +### Scripts and Interactivity - listening for the nav event - best practice: anything here should unmount any existing event handlers to prevent memory leaks + +### Using a Component +#### In a layout +#### In the configuration + + +> [!hint] +> Look in `quartz/components` for more examples of components in Quartz as reference for your own components! diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 185582e8..5a6b5dbc 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -42,6 +42,7 @@ ul, hyphens: auto; } + .math { font-size: 1.1rem; &.math-display { @@ -108,6 +109,10 @@ a { margin-top: 0; margin-bottom: 0; } + + p > strong { + color: var(--dark); + } } & > #quartz-body { diff --git a/quartz/styles/callouts.scss b/quartz/styles/callouts.scss index d49443e8..f26f2cce 100644 --- a/quartz/styles/callouts.scss +++ b/quartz/styles/callouts.scss @@ -14,59 +14,59 @@ &[data-callout="note"] { --color: #448aff; - --border: #448aff22; - --bg: #448aff09; + --border: #448aff44; + --bg: #448aff10; } &[data-callout="abstract"] { --color: #00b0ff; - --border: #00b0ff22; - --bg: #00b0ff09; + --border: #00b0ff44; + --bg: #00b0ff10; } &[data-callout="info"], &[data-callout="todo"] { --color: #00b8d4; - --border: #00b8d422; - --bg: #00b8d409; + --border: #00b8d444; + --bg: #00b8d410; } &[data-callout="tip"] { --color: #00bfa5; - --border: #00bfa522; - --bg: #00bfa509; + --border: #00bfa544; + --bg: #00bfa510; } &[data-callout="success"] { --color: #09ad7a; - --border: #09ad7122; - --bg: #09ad7109; + --border: #09ad7144; + --bg: #09ad7110; } &[data-callout="question"] { --color: #dba642; - --border: #dba64222; - --bg: #dba64209; + --border: #dba64244; + --bg: #dba64210; } &[data-callout="warning"] { --color: #db8942; - --border: #db894222; - --bg: #db894209; + --border: #db894244; + --bg: #db894210; } &[data-callout="failure"], &[data-callout="danger"], &[data-callout="bug"] { --color: #db4242; - --border: #db424222; - --bg: #db424209; + --border: #db424244; + --bg: #db424210; } &[data-callout="example"] { --color: #7a43b5; - --border: #7a43b522; - --bg: #7a43b509; + --border: #7a43b544; + --bg: #7a43b510; } &[data-callout="quote"] { From 09d4eb0684eac96747778656fc4a8f8085c41388 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 7 Aug 2023 23:57:24 -0700 Subject: [PATCH 0464/1221] fix notes --- .prettierignore | 1 - content/advanced/creating components.md | 31 +++++++++++++++---------- content/advanced/paths.md | 4 ++-- quartz/styles/base.scss | 1 - 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/.prettierignore b/.prettierignore index 2da3adff..3c0687a5 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,3 @@ public node_modules .quartz-cache -**/*.md diff --git a/content/advanced/creating components.md b/content/advanced/creating components.md index 6cdaed19..95c71fd6 100644 --- a/content/advanced/creating components.md +++ b/content/advanced/creating components.md @@ -16,15 +16,17 @@ Normally on the web, we write layout code using HTML which looks something like This piece of HTML represents an article with a leading header that says "An article header" and a paragraph that contains the text "Some content". This is normally combined with CSS to style the page and JavaScript to add interactivity. -However, HTML doesn't let you create reusable templates. If you wanted to create a new page, you would need to copy and paste the above snippet and edit the header and content yourself. This isn't great if we have a lot of content on our site that shares a lot of similar layout. The smart people who created React also had similar thoughts, inventing the concept of JSX Components to solve the code duplication problem. +However, HTML doesn't let you create reusable templates. If you wanted to create a new page, you would need to copy and paste the above snippet and edit the header and content yourself. This isn't great if we have a lot of content on our site that shares a lot of similar layout. The smart people who created React also had similar thoughts, inventing the concept of JSX Components to solve the code duplication problem. In effect, components allow you to write a JavaScript function that takes some data and produces HTML as an output. **While Quartz doesn't use React, it uses the same component concept to allow you to easily express layout templates in your Quartz site.** > [!hint] > For those coming from React, Quartz components are different from React components in that it only uses JSX for templating and layout. Hooks like `useEffect`, `useState`, etc. are not rendered. + ## An Example Component ### Constructor + Component files are written in `.tsx` files that live in the `quartz/components` folder. These are re-exported in `quartz/components/index.ts` so you can use them in layouts and other components more easily. Each component file should have a default export that satisfies the `QuartzComponentConstructor` function signature. It is a function that takes in a single optional parameter `opts` and returns a Quartz Component. The type of the parameters `ops` is defined by the interface `Options` which you as the component creator also decide. @@ -37,16 +39,16 @@ interface Options { } const defaultOptions: Options = { - favouriteNumber: 42 + favouriteNumber: 42, } export default ((userOpts?: Options) => { const opts = { ...userOpts, ...defaultOpts } function YourComponent(props: QuartzComponentProps) { - if (opts.favouriteNumber < 0) { - return null - } - + if (opts.favouriteNumber < 0) { + return null + } + return

    My favourite number is {opts.favouriteNumber}

    } @@ -55,6 +57,7 @@ export default ((userOpts?: Options) => { ``` ### Props + The Quartz component itself (lines 11-17 highlighted above) looks like a React component. It takes in properties (sometimes called [props](https://react.dev/learn/passing-props-to-a-component)) and returns JSX. All Quartz components accept the same set of props which are defined in `QuartzComponentProps`: @@ -71,14 +74,15 @@ export type QuartzComponentProps = { ``` - `fileData`: Any metadata [[making plugins|plugins]] may have added to the current page. - - `fileData.slug`: slug of the current page. - - `fileData.frontmatter`: any frontmatter parsed. + - `fileData.slug`: slug of the current page. + - `fileData.frontmatter`: any frontmatter parsed. - `cfg`: The `configuration` field in `quartz.config.ts`. - `tree`: the resulting [HTML AST](https://github.com/syntax-tree/hast) after processing and transforming the file. This is useful if you'd like to render the content using [hast-util-to-jsx-runtime](https://github.com/syntax-tree/hast-util-to-jsx-runtime) (you can find an example of this in `quartz/components/pages/Content.tsx`). - `allFiles`: Metadata for all files that have been parsed. Useful for doing page listings or figuring out the overall site structure. - `displayClass`: a utility class that indicates a preference from the user about how to render it in a mobile or desktop setting. Helpful if you want to conditionally hide a component on mobile or desktop. ### Styling + Quartz components can also define a `.css` property on the actual function component which will get picked up by Quartz. This is expected to be a CSS string which can either be inlined or imported from a `.scss` file. Note that inlined styles **must** be plain vanilla CSS. @@ -116,15 +120,18 @@ export default (() => { ``` > [!warning] -> Quartz does not use CSS modules so any styles you declare here apply *globally*. If you only want it to apply to your component, make sure you use specific class names and selectors. +> Quartz does not use CSS modules so any styles you declare here apply _globally_. If you only want it to apply to your component, make sure you use specific class names and selectors. + ### Scripts and Interactivity - - listening for the nav event - - best practice: anything here should unmount any existing event handlers to prevent memory leaks + +- listening for the nav event + - best practice: anything here should unmount any existing event handlers to prevent memory leaks ### Using a Component + #### In a layout -#### In the configuration +#### In the configuration > [!hint] > Look in `quartz/components` for more examples of components in Quartz as reference for your own components! diff --git a/content/advanced/paths.md b/content/advanced/paths.md index 2a5e09fb..49651194 100644 --- a/content/advanced/paths.md +++ b/content/advanced/paths.md @@ -11,7 +11,7 @@ It would be silly to type these all as `string` and call it a day as it's pretty Luckily, we can mimic nominal typing using [brands](https://www.typescriptlang.org/play#example/nominal-typing). ```typescript -// instead of +// instead of type ClientSlug = string // we do @@ -21,7 +21,7 @@ type ClientSlug = string & { __brand: "client" } const slug: ClientSlug = "some random slug" ``` -While this prevents most typing mistakes *within* our nominal typing system (e.g. mistaking a server slug for a client slug), it doesn't prevent us from *accidentally* mistaking a string for a client slug when we forcibly cast it. +While this prevents most typing mistakes _within_ our nominal typing system (e.g. mistaking a server slug for a client slug), it doesn't prevent us from _accidentally_ mistaking a string for a client slug when we forcibly cast it. Thus, we still need to be careful when casting from a string to one of these nominal types in the 'entrypoints', illustrated with hexagon shapes in the diagram below. diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 5a6b5dbc..bd072d70 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -42,7 +42,6 @@ ul, hyphens: auto; } - .math { font-size: 1.1rem; &.math-display { From 2706a137a042b4bf932b0ace9934914f290605f3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 8 Aug 2023 20:18:31 -0700 Subject: [PATCH 0465/1221] guide to creating components --- content/advanced/architecture.md | 2 +- content/advanced/creating components.md | 117 ++++++++++++++++++++++-- 2 files changed, 108 insertions(+), 11 deletions(-) diff --git a/content/advanced/architecture.md b/content/advanced/architecture.md index f30331c1..06a670b6 100644 --- a/content/advanced/architecture.md +++ b/content/advanced/architecture.md @@ -12,7 +12,7 @@ This question is best answered by tracing what happens when a user (you!) runs ` 2. This file has a [shebang]() line at the top which tells npm to execute it using Node. 3. `bootstrap-cli.mjs` is responsible for a few things: 1. Parsing the command-line arguments using [yargs](http://yargs.js.org/). - 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' client-side scripts (any `.inline.ts` file) that components declare usiong a custom `esbuild` plugin that runs another instance of `esbuild` that bundles for the browser instead of `node`. Modules of both types are imported as plain text. + 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' client-side scripts (any `.inline.ts` file) that components declare using a custom `esbuild` plugin that runs another instance of `esbuild` that bundles for the browser instead of `node`. Modules of both types are imported as plain text. 3. Running the local preview server if `--serve` is set. This starts two servers: 1. A WebSocket server on port 3001 to handle hot-reload signals. This tracks all inbound connections and sends a 'rebuild' message a server-side change is detected (either content or configuration). 2. An HTTP file-server on a user defined port (normally 8080) to serve the actual website files. diff --git a/content/advanced/creating components.md b/content/advanced/creating components.md index 95c71fd6..a9070138 100644 --- a/content/advanced/creating components.md +++ b/content/advanced/creating components.md @@ -20,9 +20,6 @@ However, HTML doesn't let you create reusable templates. If you wanted to create In effect, components allow you to write a JavaScript function that takes some data and produces HTML as an output. **While Quartz doesn't use React, it uses the same component concept to allow you to easily express layout templates in your Quartz site.** -> [!hint] -> For those coming from React, Quartz components are different from React components in that it only uses JSX for templating and layout. Hooks like `useEffect`, `useState`, etc. are not rendered. - ## An Example Component ### Constructor @@ -90,11 +87,11 @@ Note that inlined styles **must** be plain vanilla CSS. ```tsx {6-10} title="quartz/components/YourComponent.tsx" export default (() => { function YourComponent() { - return

    Example Component

    + return

    Example Component

    } YourComponent.css = ` - p { + p.red-text { color: red; } ` @@ -124,14 +121,114 @@ export default (() => { ### Scripts and Interactivity -- listening for the nav event - - best practice: anything here should unmount any existing event handlers to prevent memory leaks +What about interactivity? Suppose you want to add an-click handler for example. Like the `.css` property on the component, you can also declare `.beforeDOMLoaded` and `.afterDOMLoaded` properties that are strings that contain the script. + +```tsx title="quartz/components/YourComponent.tsx" +export default (() => { + function YourComponent() { + return + } + + YourComponent.beforeDOM = ` + console.log("hello from before the page loads!") + ` + + YourComponent.afterDOM = ` + document.getElementById('btn').onclick = () => { + alert('button clicked!') + } + ` + return YourComponent +}) satisfies QuartzComponentConstructor + +``` + +> [!hint] +> For those coming from React, Quartz components are different from React components in that it only uses JSX for templating and layout. Hooks like `useEffect`, `useState`, etc. are not rendered and other properties that accept functions like `onClick` handlers will not work. Instead, do it using a regular JS script that modifies the DOM element directly. + +As the names suggest, the `.beforeDOMLoaded` scripts are executed *before* the page is done loading so it doesn't have access to any elements on the page. This is mostly used to prefetch any critical data. + +The `.afterDOMLoaded` script executes once the page has been completely loaded. This is a good place to setup anything that should last for the duration of a site visit (e.g. getting something saved from local storage). + +If you need to create an `afterDOMLoaded` script that depends on *page specific* elements that may change when navigating to a new page, you can listen for the `"nav"` event that gets fired whenever a page loads (which may happen on navigation if [[SPA Routing]] is enabled). + +```ts +document.addEventListener("nav", () => { + // do page specific logic here + // e.g. attach event listeners + const toggleSwitch = document.querySelector("#switch") as HTMLInputElement + toggleSwitch.removeEventListener("change", switchTheme) + toggleSwitch.addEventListener("change", switchTheme) +}) +``` + +It is best practice to also unmount any existing event handlers to prevent memory leaks. +#### Importing Code +Of course, it isn't always practical (nor desired!) to write your code as a string literal in the component. -### Using a Component +Quartz supports importing component code through `.inline.ts` files. -#### In a layout +```tsx title="quartz/components/YourComponent.tsx" +// @ts-ignore: typescript doesn't know about our inline bundling system +// so we need to silence the error +import script from "./scripts/graph.inline" -#### In the configuration +export default (() => { + function YourComponent() { + return + } + + YourComponent.afterDOM = script + return YourComponent +}) satisfies QuartzComponentConstructor + +``` + +```ts title="quartz/components/scripts/graph.inline.ts" +// any imports here are bundled for the browser +import * as d3 from "d3" + +document.getElementById('btn').onclick = () => { + alert('button clicked!') +} +``` + +Additionally, like what is shown in the example above, you can import packages in `.inline.ts` files. This will be bundled by Quartz and included in the actual script. +### Using a Component +After creating your custom component, re-export it in `quartz/components/index.ts`: + +```ts title="quartz/components/index.ts" {4,10} +import ArticleTitle from "./ArticleTitle" +import Content from "./pages/Content" +import Darkmode from "./Darkmode" +import YourComponent from "./YourComponent" + +export { + ArticleTitle, + Content, + Darkmode, + YourComponent +} +``` + +Then, you can use it like any other component in `quartz.layout.ts` via `Component.YourComponent()`. See the [[configuration#Layout|layout]] section for more details. + +As Quartz components are just functions that return React components, you can compositionally use them in other Quartz components. + +```tsx title="quartz/components/AnotherComponent.tsx" +import YourComponent from "./YourComponent" + +export default (() => { + function AnotherComponent(props: QuartzComponentProps) { + return
    +

    It's nested!

    + +
    + } + + return AnotherComponent +}) satisfies QuartzComponentConstructor +``` > [!hint] > Look in `quartz/components` for more examples of components in Quartz as reference for your own components! From ee9ed4f2877bff1a64104b6d97ed0d51b1bb6fa3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 8 Aug 2023 20:36:24 -0700 Subject: [PATCH 0466/1221] fix head.tsx --- content/advanced/creating components.md | 33 ++++++++++++------------ quartz/components/Head.tsx | 10 +++---- quartz/static/og-image.png | Bin 0 -> 39281 bytes quartz/styles/base.scss | 12 ++++++--- 4 files changed, 29 insertions(+), 26 deletions(-) create mode 100644 quartz/static/og-image.png diff --git a/content/advanced/creating components.md b/content/advanced/creating components.md index a9070138..e9f13853 100644 --- a/content/advanced/creating components.md +++ b/content/advanced/creating components.md @@ -140,17 +140,16 @@ export default (() => { ` return YourComponent }) satisfies QuartzComponentConstructor - ``` > [!hint] > For those coming from React, Quartz components are different from React components in that it only uses JSX for templating and layout. Hooks like `useEffect`, `useState`, etc. are not rendered and other properties that accept functions like `onClick` handlers will not work. Instead, do it using a regular JS script that modifies the DOM element directly. -As the names suggest, the `.beforeDOMLoaded` scripts are executed *before* the page is done loading so it doesn't have access to any elements on the page. This is mostly used to prefetch any critical data. +As the names suggest, the `.beforeDOMLoaded` scripts are executed _before_ the page is done loading so it doesn't have access to any elements on the page. This is mostly used to prefetch any critical data. The `.afterDOMLoaded` script executes once the page has been completely loaded. This is a good place to setup anything that should last for the duration of a site visit (e.g. getting something saved from local storage). -If you need to create an `afterDOMLoaded` script that depends on *page specific* elements that may change when navigating to a new page, you can listen for the `"nav"` event that gets fired whenever a page loads (which may happen on navigation if [[SPA Routing]] is enabled). +If you need to create an `afterDOMLoaded` script that depends on _page specific_ elements that may change when navigating to a new page, you can listen for the `"nav"` event that gets fired whenever a page loads (which may happen on navigation if [[SPA Routing]] is enabled). ```ts document.addEventListener("nav", () => { @@ -163,7 +162,9 @@ document.addEventListener("nav", () => { ``` It is best practice to also unmount any existing event handlers to prevent memory leaks. + #### Importing Code + Of course, it isn't always practical (nor desired!) to write your code as a string literal in the component. Quartz supports importing component code through `.inline.ts` files. @@ -181,20 +182,21 @@ export default (() => { YourComponent.afterDOM = script return YourComponent }) satisfies QuartzComponentConstructor - ``` ```ts title="quartz/components/scripts/graph.inline.ts" // any imports here are bundled for the browser import * as d3 from "d3" -document.getElementById('btn').onclick = () => { - alert('button clicked!') +document.getElementById("btn").onclick = () => { + alert("button clicked!") } ``` Additionally, like what is shown in the example above, you can import packages in `.inline.ts` files. This will be bundled by Quartz and included in the actual script. -### Using a Component + +### Using a Component + After creating your custom component, re-export it in `quartz/components/index.ts`: ```ts title="quartz/components/index.ts" {4,10} @@ -203,12 +205,7 @@ import Content from "./pages/Content" import Darkmode from "./Darkmode" import YourComponent from "./YourComponent" -export { - ArticleTitle, - Content, - Darkmode, - YourComponent -} +export { ArticleTitle, Content, Darkmode, YourComponent } ``` Then, you can use it like any other component in `quartz.layout.ts` via `Component.YourComponent()`. See the [[configuration#Layout|layout]] section for more details. @@ -220,10 +217,12 @@ import YourComponent from "./YourComponent" export default (() => { function AnotherComponent(props: QuartzComponentProps) { - return
    -

    It's nested!

    - -
    + return ( +
    +

    It's nested!

    + +
    + ) } return AnotherComponent diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index 44decac8..0651b95b 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -3,14 +3,14 @@ import { JSResourceToScriptElement } from "../resources" import { QuartzComponentConstructor, QuartzComponentProps } from "./types" export default (() => { - function Head({ fileData, externalResources }: QuartzComponentProps) { + function Head({ cfg, fileData, externalResources }: QuartzComponentProps) { const slug = canonicalizeServer(fileData.slug!) const title = fileData.frontmatter?.title ?? "Untitled" - const description = fileData.description ?? "No description provided" + const description = fileData.description?.trim() ?? "No description provided" const { css, js } = externalResources const baseDir = pathToRoot(slug) const iconPath = baseDir + "/static/icon.png" - const ogImagePath = baseDir + "/static/og-image.png" + const ogImagePath = `https://${cfg.baseUrl}/static/og-image.png` return ( @@ -18,8 +18,8 @@ export default (() => { - - + + {cfg.baseUrl && } diff --git a/quartz/static/og-image.png b/quartz/static/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..f1321455b370d6ac9c89fa26b678a84972092c05 GIT binary patch literal 39281 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 literal 0 HcmV?d00001 diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index bd072d70..3fbbf87e 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -269,24 +269,28 @@ h6 { // typography improvements h1 { font-size: 1.75rem; - margin-top: 2.75rem; + margin-top: 2.25rem; + margin-bottom: 1rem; } h2 { font-size: 1.4rem; - margin-top: 2.4rem; + margin-top: 1.9rem; + margin-bottom: 1rem; } h3 { font-size: 1.12rem; - margin-top: 2.12rem; + margin-top: 1.62rem; + margin-bottom: 1rem; } h4, h5, h6 { font-size: 1rem; - margin-top: 2rem; + margin-top: 1.5rem; + margin-bottom: 1rem; } div[data-rehype-pretty-code-fragment] { From e21f0f9bb97cbc4bd59f6bce0e0fce451b6d2b01 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 8 Aug 2023 21:28:09 -0700 Subject: [PATCH 0467/1221] change reading time to content meta --- quartz.layout.ts | 2 +- quartz/components/ContentMeta.tsx | 31 +++++++++++++++++++++++++++++++ quartz/components/Date.tsx | 9 ++++++--- quartz/components/ReadingTime.tsx | 25 ------------------------- quartz/components/index.ts | 4 ++-- 5 files changed, 40 insertions(+), 31 deletions(-) create mode 100644 quartz/components/ContentMeta.tsx delete mode 100644 quartz/components/ReadingTime.tsx diff --git a/quartz.layout.ts b/quartz.layout.ts index 1a3f99fa..482aba6e 100644 --- a/quartz.layout.ts +++ b/quartz.layout.ts @@ -15,7 +15,7 @@ export const sharedPageComponents: SharedLayout = { // components for pages that display a single page (e.g. a single note) export const defaultContentPageLayout: PageLayout = { - beforeBody: [Component.ArticleTitle(), Component.ReadingTime(), Component.TagList()], + beforeBody: [Component.ArticleTitle(), Component.ContentMeta(), Component.TagList()], left: [ Component.PageTitle(), Component.MobileOnly(Component.Spacer()), diff --git a/quartz/components/ContentMeta.tsx b/quartz/components/ContentMeta.tsx new file mode 100644 index 00000000..007ce3e6 --- /dev/null +++ b/quartz/components/ContentMeta.tsx @@ -0,0 +1,31 @@ +import { formatDate } from "./Date" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import readingTime from "reading-time" + +export default (() => { + function ContentMetadata({ fileData }: QuartzComponentProps) { + const text = fileData.text + if (text) { + const segments: string[] = [] + const { text: timeTaken, words: _words } = readingTime(text) + if (fileData.dates?.modified) { + segments.push(formatDate(fileData.dates.modified)) + } + + segments.push(timeTaken) + return ( + + ) + } else { + return null + } + } + + ContentMetadata.css = ` + .content-meta { + margin-top: 0; + color: var(--gray); + } + ` + return ContentMetadata +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Date.tsx b/quartz/components/Date.tsx index 16c45440..f4b284af 100644 --- a/quartz/components/Date.tsx +++ b/quartz/components/Date.tsx @@ -2,11 +2,14 @@ interface Props { date: Date } -export function Date({ date }: Props) { - const formattedDate = date.toLocaleDateString("en-US", { +export function formatDate(d: Date): string { + return d.toLocaleDateString("en-US", { year: "numeric", month: "short", day: "2-digit", }) - return <>{formattedDate} +} + +export function Date({ date }: Props) { + return <>{formatDate(date)} } diff --git a/quartz/components/ReadingTime.tsx b/quartz/components/ReadingTime.tsx deleted file mode 100644 index f802c876..00000000 --- a/quartz/components/ReadingTime.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" -import readingTime from "reading-time" - -function ReadingTime({ fileData }: QuartzComponentProps) { - const text = fileData.text - if (text) { - const { text: timeTaken, words } = readingTime(text) - return ( -

    - {words} words, {timeTaken} -

    - ) - } else { - return null - } -} - -ReadingTime.css = ` -.reading-time { - margin-top: 0; - color: var(--gray); -} -` - -export default (() => ReadingTime) satisfies QuartzComponentConstructor diff --git a/quartz/components/index.ts b/quartz/components/index.ts index c0fe1ec1..caaf4161 100644 --- a/quartz/components/index.ts +++ b/quartz/components/index.ts @@ -5,7 +5,7 @@ import FolderContent from "./pages/FolderContent" import Darkmode from "./Darkmode" import Head from "./Head" import PageTitle from "./PageTitle" -import ReadingTime from "./ReadingTime" +import ContentMeta from "./ContentMeta" import Spacer from "./Spacer" import TableOfContents from "./TableOfContents" import TagList from "./TagList" @@ -24,7 +24,7 @@ export { Darkmode, Head, PageTitle, - ReadingTime, + ContentMeta, Spacer, TableOfContents, TagList, From e4950e06a15e34134b9feb064749748080bd59a1 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 8 Aug 2023 21:31:36 -0700 Subject: [PATCH 0468/1221] fix getFileExtension missing numeric extensions (e.g. mp4) --- quartz/components/ContentMeta.tsx | 4 +--- quartz/path.test.ts | 1 + quartz/path.ts | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/quartz/components/ContentMeta.tsx b/quartz/components/ContentMeta.tsx index 007ce3e6..715c0f46 100644 --- a/quartz/components/ContentMeta.tsx +++ b/quartz/components/ContentMeta.tsx @@ -13,9 +13,7 @@ export default (() => { } segments.push(timeTaken) - return ( - - ) + return } else { return null } diff --git a/quartz/path.test.ts b/quartz/path.test.ts index 614273f8..480493ef 100644 --- a/quartz/path.test.ts +++ b/quartz/path.test.ts @@ -145,6 +145,7 @@ describe("transforms", () => { ["/content/index.md", "content/index"], ["content/cool.png", "content/cool"], ["index.md", "index"], + ["test.mp4", "test"], ["note with spaces.md", "note-with-spaces"], ], path.slugifyFilePath, diff --git a/quartz/path.ts b/quartz/path.ts index 9af5c7bf..e410771a 100644 --- a/quartz/path.ts +++ b/quartz/path.ts @@ -221,7 +221,7 @@ function _hasFileExtension(s: string): boolean { } function _getFileExtension(s: string): string | undefined { - return s.match(/\.[A-Za-z]+$/)?.[0] + return s.match(/\.[A-Za-z0-9]+$/)?.[0] } function _isRelativeSegment(s: string): boolean { From 49bd6bc3ffe1d3507e00bae62c12d9b045363090 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 8 Aug 2023 22:52:49 -0700 Subject: [PATCH 0469/1221] better concurrency debugging, --concurrency flag for npx quartz build --- .gitignore | 1 + content/build.md | 1 + quartz/bootstrap-cli.mjs | 4 ++++ quartz/build.ts | 21 +++------------------ quartz/ctx.ts | 1 + quartz/processors/parse.ts | 10 ++++++++-- quartz/sourcemap.ts | 19 +++++++++++++++++++ quartz/trace.ts | 30 ++++++++++++++++++++++-------- quartz/worker.ts | 3 +++ 9 files changed, 62 insertions(+), 28 deletions(-) create mode 100644 quartz/sourcemap.ts diff --git a/.gitignore b/.gitignore index 9be70c68..5177d663 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ public tsconfig.tsbuildinfo .obsidian .quartz-cache +private/ diff --git a/content/build.md b/content/build.md index 541c9d2e..bce9d546 100644 --- a/content/build.md +++ b/content/build.md @@ -24,3 +24,4 @@ Once you're happy with it, let's see how to [[hosting|deploy Quartz to the web]] > - `-o` or `--output`: the output folder. This is normally just `public` > - `--serve`: run a local hot-reloading server to preview your Quartz > - `--port`: what port to run the local preview server on +> - `--concurrency`: how many threads to use to parse notes diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 71d69574..adcdb9fc 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -84,6 +84,10 @@ const BuildArgv = { default: false, describe: "show detailed bundle information", }, + concurrency: { + number: true, + describe: "how many threads to use to parse notes" + } } function escapePath(fp) { diff --git a/quartz/build.ts b/quartz/build.ts index e6dc96aa..c25efbf4 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -1,19 +1,5 @@ import sourceMapSupport from "source-map-support" -sourceMapSupport.install({ - retrieveSourceMap(source) { - // source map hack to get around query param - // import cache busting - if (source.includes(".quartz-cache")) { - let realSource = fileURLToPath(source.split("?", 2)[0] + ".map") - return { - map: fs.readFileSync(realSource, "utf8"), - } - } else { - return null - } - }, -}) - +sourceMapSupport.install(options) import path from "path" import { PerfTimer } from "./perf" import { rimraf } from "rimraf" @@ -23,14 +9,13 @@ import { parseMarkdown } from "./processors/parse" import { filterContent } from "./processors/filter" import { emitContent } from "./processors/emit" import cfg from "../quartz.config" -import { FilePath, ServerSlug, joinSegments, slugifyFilePath } from "./path" +import { FilePath, joinSegments, slugifyFilePath } from "./path" import chokidar from "chokidar" import { ProcessedContent } from "./plugins/vfile" import { Argv, BuildCtx } from "./ctx" import { glob, toPosixPath } from "./glob" import { trace } from "./trace" -import { fileURLToPath } from "url" -import fs from "fs" +import { options } from "./sourcemap" async function buildQuartz(argv: Argv, clientRefresh: () => void) { const ctx: BuildCtx = { diff --git a/quartz/ctx.ts b/quartz/ctx.ts index 8a7b8032..dad5cef5 100644 --- a/quartz/ctx.ts +++ b/quartz/ctx.ts @@ -7,6 +7,7 @@ export interface Argv { output: string serve: boolean port: number + concurrency?: number } export interface BuildCtx { diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 52dc519d..13400204 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -56,6 +56,8 @@ async function transpileWorkerScript() { platform: "node", format: "esm", packages: "external", + sourcemap: true, + sourcesContent: false, plugins: [ { name: "css-and-scripts-as-text", @@ -116,7 +118,7 @@ export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise { + const errString = err.toString().slice("Error:".length) + console.error(errString) + process.exit(1) + }) res = results.flat() await pool.terminate() } diff --git a/quartz/sourcemap.ts b/quartz/sourcemap.ts new file mode 100644 index 00000000..8b05c8bb --- /dev/null +++ b/quartz/sourcemap.ts @@ -0,0 +1,19 @@ +import fs from "fs" +import sourceMapSupport from "source-map-support" +import { fileURLToPath } from "url" + +export const options: sourceMapSupport.Options = { + // source map hack to get around query param + // import cache busting + retrieveSourceMap(source) { + if (source.includes(".quartz-cache")) { + let realSource = fileURLToPath(source.split("?", 2)[0] + ".map") + return { + map: fs.readFileSync(realSource, "utf8"), + } + } else { + return null + } + }, +} + diff --git a/quartz/trace.ts b/quartz/trace.ts index 337ffe01..ca3a5a08 100644 --- a/quartz/trace.ts +++ b/quartz/trace.ts @@ -1,17 +1,22 @@ import chalk from "chalk" import process from "process" +import { isMainThread } from "workerpool" const rootFile = /.*at file:/ export function trace(msg: string, err: Error) { const stack = err.stack - console.log() - console.log( + + const lines: string[] = [] + + lines.push("") + lines.push( + "\n" + + chalk.bgRed.black.bold(" ERROR ") + "\n" + - chalk.bgRed.black.bold(" ERROR ") + - "\n" + - chalk.red(` ${msg}`) + - (err.message.length > 0 ? `: ${err.message}` : ""), + chalk.red(` ${msg}`) + + (err.message.length > 0 ? `: ${err.message}` : ""), ) + if (!stack) { return } @@ -23,11 +28,20 @@ export function trace(msg: string, err: Error) { } if (!line.includes("node_modules")) { - console.log(` ${line}`) + lines.push(` ${line}`) if (rootFile.test(line)) { reachedEndOfLegibleTrace = true } } } - process.exit(1) + + const traceMsg = lines.join("\n") + if (!isMainThread) { + // gather lines and throw + throw new Error(traceMsg) + } else { + // print and exit + console.error(traceMsg) + process.exit(1) + } } diff --git a/quartz/worker.ts b/quartz/worker.ts index d97c483e..db11cbbc 100644 --- a/quartz/worker.ts +++ b/quartz/worker.ts @@ -1,7 +1,10 @@ +import sourceMapSupport from "source-map-support" +sourceMapSupport.install(options) import cfg from "../quartz.config" import { Argv, BuildCtx } from "./ctx" import { FilePath, ServerSlug } from "./path" import { createFileParser, createProcessor } from "./processors/parse" +import { options } from "./sourcemap" // only called from worker thread export async function parseFiles(argv: Argv, fps: FilePath[], allSlugs: ServerSlug[]) { From 68ccd1d79de7cef275605e238238c1a80bbb074f Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Tue, 8 Aug 2023 22:53:01 -0700 Subject: [PATCH 0470/1221] format --- quartz/bootstrap-cli.mjs | 4 ++-- quartz/processors/parse.ts | 3 ++- quartz/sourcemap.ts | 1 - quartz/trace.ts | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index adcdb9fc..cfb01f15 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -86,8 +86,8 @@ const BuildArgv = { }, concurrency: { number: true, - describe: "how many threads to use to parse notes" - } + describe: "how many threads to use to parse notes", + }, } function escapePath(fp) { diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 13400204..69df69b3 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -118,7 +118,8 @@ export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise 0 ? `: ${err.message}` : ""), + chalk.bgRed.black.bold(" ERROR ") + + "\n" + + chalk.red(` ${msg}`) + + (err.message.length > 0 ? `: ${err.message}` : ""), ) if (!stack) { From cea6834fef54da59fc1692d1db0221b93793238f Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 9 Aug 2023 00:26:33 -0700 Subject: [PATCH 0471/1221] profiling, better concurrency heuristics --- .gitignore | 1 + content/advanced/making plugins.md | 2 +- package.json | 3 ++- quartz/processors/parse.ts | 9 +++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 5177d663..fd96fec9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .gitignore node_modules public +prof tsconfig.tsbuildinfo .obsidian .quartz-cache diff --git a/content/advanced/making plugins.md b/content/advanced/making plugins.md index a73069e6..d2db67e4 100644 --- a/content/advanced/making plugins.md +++ b/content/advanced/making plugins.md @@ -2,7 +2,7 @@ title: Making your own plugins --- -This part of the documentation will assume you have some basic coding knowledge and will include code snippets that describe the interface of what Quartz plugins should look like. +This part of the documentation will assume you have some basic coding knowledge in TypeScript and will include code snippets that describe the interface of what Quartz plugins should look like. ![[quartz-transform-pipeline.png]] diff --git a/package.json b/package.json index 0d5e7a03..29b46f20 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "scripts": { "check": "tsc --noEmit && npx prettier . --check", "format": "npx prettier . --write", - "test": "tsx ./quartz/path.test.ts" + "test": "tsx ./quartz/path.test.ts", + "profile": "0x -D prof ./quartz/bootstrap-cli.mjs build --concurrency=1" }, "keywords": [ "site generator", diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 69df69b3..299d59af 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -9,7 +9,6 @@ import { PerfTimer } from "../perf" import { read } from "to-vfile" import { FilePath, QUARTZ, slugifyFilePath } from "../path" import path from "path" -import os from "os" import workerpool, { Promise as WorkerPromise } from "workerpool" import { QuartzLogger } from "../log" import { trace } from "../trace" @@ -82,6 +81,7 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { const res: ProcessedContent[] = [] for (const fp of fps) { try { + const perf = new PerfTimer() const file = await read(fp) // strip leading and trailing whitespace @@ -101,7 +101,7 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { res.push([newAst, file]) if (argv.verbose) { - console.log(`[process] ${fp} -> ${file.data.slug}`) + console.log(`[process] ${fp} -> ${file.data.slug} (${perf.timeSince()})`) } } catch (err) { trace(`\nFailed to process \`${fp}\``, err as Error) @@ -112,14 +112,15 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { } } +const clamp = (num: number, min: number, max: number) => Math.min(Math.max(Math.round(num), min), max); export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise { const { argv } = ctx const perf = new PerfTimer() const log = new QuartzLogger(argv.verbose) + // rough heuristics: 128 gives enough time for v8 to JIT and optimize parsing code paths const CHUNK_SIZE = 128 - let concurrency = - ctx.argv.concurrency ?? (fps.length < CHUNK_SIZE ? 1 : os.availableParallelism()) + const concurrency = ctx.argv.concurrency ?? clamp(fps.length / CHUNK_SIZE, 1, 4) let res: ProcessedContent[] = [] log.start(`Parsing input files using ${concurrency} threads`) From ebf3263b7efacc9ac499f3f1f1bbc91451899ae0 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 9 Aug 2023 09:10:40 -0700 Subject: [PATCH 0472/1221] update npx quartz update script --- .../features/no-code layout configuration.md | 0 content/features/upcoming features.md | 24 +++++++++++++++++-- quartz/bootstrap-cli.mjs | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) delete mode 100644 content/features/no-code layout configuration.md diff --git a/content/features/no-code layout configuration.md b/content/features/no-code layout configuration.md deleted file mode 100644 index e69de29b..00000000 diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 8ab75202..40b97cf1 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -2,14 +2,34 @@ draft: true --- -## high priority +## todo +- docs for making plugins +- nested tags showing duplicate +- back button with anchors / popovers + spa is broken +- search should be fast for large repos +- debounce cfg rebuild on large repos + - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock +- dereference symlink for npx quartz sync +- test/fix with subpath +- fix docs with deploy from github +- write feature docs + - callouts + - folder and tag listings + - mermaid diagrams + - rss + - spa-routing + - table of contents + - darkmode + - frontmatter parsing + +## high priority backlog - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note - note/header/block transcludes: https://help.obsidian.md/Linking+notes+and+files/Embedding+files - static dead link detection - docker support -## misc +## misc backlog - breadcrumbs component - filetree component diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index cfb01f15..d00a2423 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -129,7 +129,7 @@ async function popContentFolder(contentFolder) { } function gitPull(origin, branch) { - const flags = ["-s", "recursive", "-X", "ours", "--no-edit"] + const flags = ["--no-rebase", "--autostash", "-s", "recursive", "-X", "ours", "--no-edit"] spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" }) } From ad3f7b2d5fe15af2626250463994f5a9e9ba6d0a Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 9 Aug 2023 09:18:44 -0700 Subject: [PATCH 0473/1221] format --- content/features/upcoming features.md | 19 ++++++++++--------- quartz/processors/parse.ts | 3 ++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 40b97cf1..d1a3d306 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -3,24 +3,25 @@ draft: true --- ## todo + - docs for making plugins - nested tags showing duplicate - back button with anchors / popovers + spa is broken - search should be fast for large repos - debounce cfg rebuild on large repos - - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock + - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock - dereference symlink for npx quartz sync - test/fix with subpath - fix docs with deploy from github - write feature docs - - callouts - - folder and tag listings - - mermaid diagrams - - rss - - spa-routing - - table of contents - - darkmode - - frontmatter parsing + - callouts + - folder and tag listings + - mermaid diagrams + - rss + - spa-routing + - table of contents + - darkmode + - frontmatter parsing ## high priority backlog diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 299d59af..00155279 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -112,7 +112,8 @@ export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { } } -const clamp = (num: number, min: number, max: number) => Math.min(Math.max(Math.round(num), min), max); +const clamp = (num: number, min: number, max: number) => + Math.min(Math.max(Math.round(num), min), max) export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise { const { argv } = ctx const perf = new PerfTimer() From cefbca4753a7d98f93f57a6452a09f6308e2fe27 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 10 Aug 2023 21:16:07 -0700 Subject: [PATCH 0474/1221] docs on making plugins --- content/advanced/making plugins.md | 285 +++++++++++++++++- content/advanced/paths.md | 8 + content/configuration.md | 6 +- content/features/upcoming features.md | 1 + quartz/plugins/emitters/aliases.ts | 3 +- quartz/plugins/emitters/componentResources.ts | 1 - quartz/plugins/emitters/contentIndex.ts | 15 +- quartz/plugins/emitters/contentPage.tsx | 4 +- quartz/plugins/emitters/folderPage.tsx | 4 +- quartz/plugins/emitters/tagPage.tsx | 4 +- quartz/plugins/transformers/latex.ts | 40 +-- 11 files changed, 329 insertions(+), 42 deletions(-) diff --git a/content/advanced/making plugins.md b/content/advanced/making plugins.md index d2db67e4..377814e9 100644 --- a/content/advanced/making plugins.md +++ b/content/advanced/making plugins.md @@ -2,12 +2,295 @@ title: Making your own plugins --- -This part of the documentation will assume you have some basic coding knowledge in TypeScript and will include code snippets that describe the interface of what Quartz plugins should look like. +> [!warning] +> This part of the documentation will assume you have working knowledge in TypeScript and will include code snippets that describe the interface of what Quartz plugins should look like. + +Quartz's plugins are a series of transformations over content. This is illustrated in the diagram of the processing pipeline below: ![[quartz-transform-pipeline.png]] +All plugins are defined as a function that takes in a single parameter for options `type OptionType = object | undefined` and return an object that corresponds to the type of plugin it is. + +```ts +type OptionType = object | undefined +type QuartzPlugin = (opts?: Options) => QuartzPluginInstance +type QuartzPluginInstance = + | QuartzTransformerPluginInstance + | QuartzFilterPluginInstance + | QuartzEmitterPluginInstance +``` + +The following sections will go into detail for what methods can be implemented for each plugin type. Before we do that, let's clarify a few more ambiguous types: + +- `BuildCtx` is defined in `quartz/ctx.ts`. It consists of + - `argv`: The command line arguments passed to the Quartz [[build]] command + - `cfg`: The full Quartz [[configuration]] + - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is) +- `StaticResources` is defined in `quartz/resources.tsx`. It consists of + - `css`: a list of URLs for stylesheets that should be loaded + - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script. ## Transformers +Transformers **map** over content, taking a Markdown file and outputting modified content or adding metadata to the file itself. + +```ts +export type QuartzTransformerPluginInstance = { + name: string + textTransform?: (ctx: BuildCtx, src: string | Buffer) => string | Buffer + markdownPlugins?: (ctx: BuildCtx) => PluggableList + htmlPlugins?: (ctx: BuildCtx) => PluggableList + externalResources?: (ctx: BuildCtx) => Partial +} +``` + +All transformer plugins must define at least a `name` field to register the plugin and a few optional functions that allow you to hook into various parts of transforming a single Markdown file. + +- `textTransform` performs a text-to-text transformation *before* a file is parsed into the [Markdown AST](https://github.com/syntax-tree/mdast). +- `markdownPlugins` defines a list of [remark plugins](https://github.com/remarkjs/remark/blob/main/doc/plugins.md). `remark` is a tool that transforms Markdown to Markdown in a structured way. +- `htmlPlugins` defines a list of [rehype plugins](https://github.com/rehypejs/rehype/blob/main/doc/plugins.md). Similar to how `remark` works, `rehype` is a tool that transforms HTML to HTML in a structured way. +- `externalResources` defines any external resources the plugin may need to load on the client-side for it to work properly. + +Normally for both `remark` and `rehype`, you can find existing plugins that you can use to . If you'd like to create your own `remark` or `rehype` plugin, checkout the [guide to creating a plugin](https://unifiedjs.com/learn/guide/create-a-plugin/) using `unified` (the underlying AST parser and transformer library). + +A good example of a transformer plugin that borrows from the `remark` and `rehype` ecosystems is the [[Latex]] plugin: + +```ts title="quartz/plugins/transformers/latex.ts" +import remarkMath from "remark-math" +import rehypeKatex from "rehype-katex" +import rehypeMathjax from "rehype-mathjax/svg.js" +import { QuartzTransformerPlugin } from "../types" + +interface Options { + renderEngine: "katex" | "mathjax" +} + +export const Latex: QuartzTransformerPlugin = (opts?: Options) => { + const engine = opts?.renderEngine ?? "katex" + return { + name: "Latex", + markdownPlugins() { + return [remarkMath] + }, + htmlPlugins() { + if (engine === "katex") { + // if you need to pass options into a plugin, you + // can use a tuple of [plugin, options] + return [[rehypeKatex, { output: "html" }]] + } else { + return [rehypeMathjax] + } + }, + externalResources() { + if (engine === "katex") { + return { + css: [ + "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css", + ], + js: [ + { + src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", + loadTime: "afterDOMReady", + contentType: "external", + }, + ], + } + } else { + return {} + } + }, + } +} +``` + +Another common thing that transformer plugins will do is parse a file and add extra data for that file: + +```ts +export const AddWordCount: QuartzTransformerPlugin = () => { + return { + name: "AddWordCount", + markdownPlugins() { + return [() => { + return (tree, file) => { + // tree is an `mdast` root element + // file is a `vfile` + const text = file.value + const words = text.split(" ").length + file.data.wordcount = words + } + }] + } + } +} + +// tell typescript about our custom data fields we are adding +// other plugins will then also be aware of this data field +declare module "vfile" { + interface DataMap { + wordcount: number + } +} +``` + +Finally, you can also perform transformations over Markdown or HTML ASTs using the `visit` function from the `unist-util-visit` package or the `findAndReplace` function from the `mdast-util-find-and-replace` package. + +```ts +export const TextTransforms: QuartzTransformerPlugin = () => { + return { + name: "TextTransforms", + markdownPlugins() { + return [() => { + return (tree, file) => { + // replace _text_ with the italics version + findAndReplace(tree, /_(.+)_/, (_value: string, ...capture: string[]) => { + // inner is the text inside of the () of the regex + const [inner] = capture + // return an mdast node + // https://github.com/syntax-tree/mdast + return { + type: "emphasis", + children: [{ type: 'text', value: inner }] + } + }) + + // remove all links (replace with just the link content) + // match by 'type' field on an mdast node + // https://github.com/syntax-tree/mdast#link in this example + visit(tree, "link", (link: Link) => { + return { + type: "paragraph" + children: [{ type: 'text', value: link.title }] + } + }) + } + }] + } + } +} +``` + +All transformer plugins can be found under `quartz/plugins/transformers`. If you decide to write your own transformer plugin, don't forget to re-export it under `quartz/plugins/transformers/index.ts` +A parting word: transformer plugins are quite complex so don't worry if you don't get them right away. Take a look at the built in transformers and see how they operate over content to get a better sense for how to accomplish what you are trying to do. ## Filters +Filters **filter** content, taking the output of all the transformers and determining what files to actually keep and what to discard. + +```ts +export type QuartzFilterPlugin = ( + opts?: Options, +) => QuartzFilterPluginInstance + +export type QuartzFilterPluginInstance = { + name: string + shouldPublish(ctx: BuildCtx, content: ProcessedContent): boolean +} +``` + +A filter plugin must define a `name` field and a `shouldPublish` function that takes in a piece of content that has been processed by all the transformers and returns a `true` or `false` depending on whether it should be passed to the emitter plugins or not. + +For example, here is the built-in plugin for removing drafts: + +```ts title="quartz/plugins/filters/draft.ts" +import { QuartzFilterPlugin } from "../types" + +export const RemoveDrafts: QuartzFilterPlugin<{}> = () => ({ + name: "RemoveDrafts", + shouldPublish(_ctx, [_tree, vfile]) { + // uses frontmatter parsed from transformers + const draftFlag: boolean = vfile.data?.frontmatter?.draft ?? false + return !draftFlag + }, +}) +``` ## Emitters +Emitters **reduce** over content, taking in a list of all the transformed and filtered content and creating output files. + +```ts +export type QuartzEmitterPlugin = ( + opts?: Options, +) => QuartzEmitterPluginInstance + +export type QuartzEmitterPluginInstance = { + name: string + emit( + ctx: BuildCtx, + content: ProcessedContent[], + resources: StaticResources, + emitCallback: EmitCallback, + ): Promise + getQuartzComponents(ctx: BuildCtx): QuartzComponent[] +} +``` + +An emitter plugin must define a `name` field an `emit` function and a `getQuartzComponents` function. `emit` is responsible for looking at all the parsed and filtered content and then appropriately creating files and returning a list of paths to files the plugin created. + +Creating new files can be done via regular Node [fs module](https://nodejs.org/api/fs.html) (i.e. `fs.cp` or `fs.writeFile`) or via the `emitCallback` if you are creating files that contain text. The `emitCallback` function is the 4th argument of the emit function. It's interface looks something like this: + +```ts +export type EmitCallback = (data: { + // the name of the file to emit (not including the file extension) + slug: ServerSlug + // the file extension + ext: `.${string}` | "" + // the file content to add + content: string +}) => Promise +``` + +This is a thin wrapper around writing to the appropriate output folder and ensuring that intermediate directories exist. If you choose to use the native Node `fs` APIs, ensure you emit to the `argv.output` folder as well. + +If you are creating an emitter plugin that needs to render components, there are three more things to be aware of: +- Your component should use `getQuartzComponents` to declare a list of `QuartzComponents` that it uses to construct the page. See the page on [[creating components]] for more information. +- You can use the `renderPage` function defined in `quartz/components/renderPage.tsx` to render Quartz components into HTML. +- If you need to render an HTML AST to JSX, you can use the `toJsxRuntime` function from `hast-util-to-jsx-runtime` library. An example of this can be found in `quartz/components/pages/Content.tsx`. + +For example, the following is a simplified version of the content page plugin that renders every single page. + +```tsx title="quartz/plugins/emitters/contentPage.tsx" +export const ContentPage: QuartzEmitterPlugin = () => { + // construct the layout + const layout: FullPageLayout = { + ...sharedPageComponents, + ...defaultContentPageLayout, + pageBody: Content(), + } + const { head, header, beforeBody, pageBody, left, right, footer} = layout + return { + name: "ContentPage", + getQuartzComponents() { + return [head, ...header, ...beforeBody, pageBody, ...left, ...right, footer] + }, + async emit(ctx, content, resources, emit): Promise { + const cfg = ctx.cfg.configuration + const fps: FilePath[] = [] + const allFiles = content.map((c) => c[1].data) + for (const [tree, file] of content) { + const slug = canonicalizeServer(file.data.slug!) + const externalResources = pageResources(slug, resources) + const componentData: QuartzComponentProps = { + fileData: file.data, + externalResources, + cfg, + children: [], + tree, + allFiles, + } + + const content = renderPage(slug, componentData, opts, externalResources) + const fp = await emit({ + content, + slug: file.data.slug!, + ext: ".html", + }) + + fps.push(fp) + } + return fps + }, + } +} +``` + +Note that it takes in a `FullPageLayout` as the options. It's made by combining a `SharedLayout` and a `PageLayout` both of which are provided through the `quartz.layout.ts` file. + +> [!hint] +> Look in `quartz/plugins` for more examples of plugins in Quartz as reference for your own plugins! \ No newline at end of file diff --git a/content/advanced/paths.md b/content/advanced/paths.md index 49651194..8e2ac967 100644 --- a/content/advanced/paths.md +++ b/content/advanced/paths.md @@ -43,3 +43,11 @@ graph LR Server --"canonicalizeServer()"--> Canonical style Canonical stroke-width:4px ``` +Here are the main types of slugs with a rough description of each type of path: +- `ClientSlug`: client-side slug, usually obtained through `window.location`. Contains the protocol (i.e. starts with `https://`) +- `CanonicalSlug`: should be used whenever you need to refer to the location of a file/note. Shouldn't be a relative path and shouldn't have leading or trailing slashes `/` either. Also shouldn't have `/index` as an ending or a file extension. +- `RelativeURL`: must start with `.` or `..` to indicate it's a relative URL. Shouldn't have `/index` as an ending or a file extension. +- `ServerSlug`: cannot be relative and may not have leading or trailing slashes. +- `FilePath`: a real file path to a file on disk. Cannot be relative and must have a file extension. + +To get a clearer picture of how these relate to each other, take a look at the path tests in `quartz/path.test.ts`. \ No newline at end of file diff --git a/content/configuration.md b/content/configuration.md index aa262137..cdf4459e 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -58,9 +58,9 @@ plugins: { } ``` -- [[making plugins#Transformers|Transformers]] **map** over content, taking a Markdown file and outputting modified content or adding metadata to the file itself (e.g. parsing frontmatter, generating a description) -- [[making plugins#Filters|Filters]] **filter** content, taking the output of all the transformers and determining what files to actually keep and what to discord (e.g. filtering out drafts) -- [[making plugins#Emitters|Emitters]] **reduce** over content, taking in a list of all the transformed and filtered content and creating output files (e.g. creating an RSS feed or pages that list all files with a specific tag) +- [[making plugins#Transformers|Transformers]] **map** over content (e.g. parsing frontmatter, generating a description) +- [[making plugins#Filters|Filters]] **filter** content (e.g. filtering out drafts) +- [[making plugins#Emitters|Emitters]] **reduce** over content (e.g. creating an RSS feed or pages that list all files with a specific tag) By adding, removing, and reordering plugins from the `tranformers`, `filters`, and `emitters` fields, you can customize the behaviour of Quartz. diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index d1a3d306..fb8551cc 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -6,6 +6,7 @@ draft: true - docs for making plugins - nested tags showing duplicate + - tag page markdown file for description not being rendered - back button with anchors / popovers + spa is broken - search should be fast for large repos - debounce cfg rebuild on large repos diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts index 818b1d7d..cf99d29d 100644 --- a/quartz/plugins/emitters/aliases.ts +++ b/quartz/plugins/emitters/aliases.ts @@ -30,9 +30,8 @@ export const AliasRedirects: QuartzEmitterPlugin = () => ({ for (const alias of aliases) { const slug = path.posix.join(dir, alias) as ServerSlug - const fp = (slug + ".html") as FilePath const redirUrl = resolveRelative(canonicalizeServer(slug), ogSlug) - await emit({ + const fp = await emit({ content: ` diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index 68a24cf8..859109fc 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -98,7 +98,6 @@ function addGlobalPageResources( componentResources.afterDOMLoaded.push(plausibleScript) } - // spa if (cfg.enableSPA) { componentResources.afterDOMLoaded.push(spaRouterScript) } else { diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts index 66cf1378..a94b552e 100644 --- a/quartz/plugins/emitters/contentIndex.ts +++ b/quartz/plugins/emitters/contentIndex.ts @@ -88,21 +88,19 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => { } if (opts?.enableSiteMap) { - await emit({ + emitted.push(await emit({ content: generateSiteMap(cfg, linkIndex), slug: "sitemap" as ServerSlug, ext: ".xml", - }) - emitted.push("sitemap.xml" as FilePath) + })) } if (opts?.enableRSS) { - await emit({ + emitted.push(await emit({ content: generateRSSFeed(cfg, linkIndex), slug: "index" as ServerSlug, ext: ".xml", - }) - emitted.push("index.xml" as FilePath) + })) } const fp = path.join("static", "contentIndex") as ServerSlug @@ -117,12 +115,11 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => { }), ) - await emit({ + emitted.push(await emit({ content: JSON.stringify(simplifiedIndex), slug: fp, ext: ".json", - }) - emitted.push(`${fp}.json` as FilePath) + })) return emitted }, diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx index 25432532..dcf28290 100644 --- a/quartz/plugins/emitters/contentPage.tsx +++ b/quartz/plugins/emitters/contentPage.tsx @@ -42,9 +42,7 @@ export const ContentPage: QuartzEmitterPlugin> = (userOp } const content = renderPage(slug, componentData, opts, externalResources) - - const fp = (file.data.slug + ".html") as FilePath - await emit({ + const fp = await emit({ content, slug: file.data.slug!, ext: ".html", diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index 5de2e923..f5bc7a6a 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -74,9 +74,7 @@ export const FolderPage: QuartzEmitterPlugin = (userOpts) => { } const content = renderPage(slug, componentData, opts, externalResources) - - const fp = (file.data.slug! + ".html") as FilePath - await emit({ + const fp = await emit({ content, slug: file.data.slug!, ext: ".html", diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index ae231d6e..19e2906b 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -80,9 +80,7 @@ export const TagPage: QuartzEmitterPlugin = (userOpts) => { } const content = renderPage(slug, componentData, opts, externalResources) - - const fp = (file.data.slug + ".html") as FilePath - await emit({ + const fp = await emit({ content, slug: file.data.slug!, ext: ".html", diff --git a/quartz/plugins/transformers/latex.ts b/quartz/plugins/transformers/latex.ts index 7a98bde4..5c6f7678 100644 --- a/quartz/plugins/transformers/latex.ts +++ b/quartz/plugins/transformers/latex.ts @@ -15,25 +15,31 @@ export const Latex: QuartzTransformerPlugin = (opts?: Options) => { return [remarkMath] }, htmlPlugins() { - return [engine === "katex" ? [rehypeKatex, { output: "html" }] : [rehypeMathjax]] + if (engine === "katex") { + return [[rehypeKatex, { output: "html" }]] + } else { + return [rehypeMathjax] + } }, externalResources() { - return engine === "katex" - ? { - css: [ - // base css - "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css", - ], - js: [ - { - // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md - src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", - loadTime: "afterDOMReady", - contentType: "external", - }, - ], - } - : {} + if (engine === "katex") { + return { + css: [ + // base css + "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css", + ], + js: [ + { + // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md + src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", + loadTime: "afterDOMReady", + contentType: "external", + }, + ], + } + } else { + return {} + } }, } } From 21cc6a5da9edefd199c0b2158b85b8cd10dd901c Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 10 Aug 2023 21:29:11 -0700 Subject: [PATCH 0475/1221] run prettier --- content/advanced/making plugins.md | 56 ++++++++++++++----------- content/advanced/paths.md | 6 ++- content/features/upcoming features.md | 2 +- quartz/plugins/emitters/contentIndex.ts | 36 +++++++++------- 4 files changed, 57 insertions(+), 43 deletions(-) diff --git a/content/advanced/making plugins.md b/content/advanced/making plugins.md index 377814e9..c041d34a 100644 --- a/content/advanced/making plugins.md +++ b/content/advanced/making plugins.md @@ -14,7 +14,7 @@ All plugins are defined as a function that takes in a single parameter for optio ```ts type OptionType = object | undefined type QuartzPlugin = (opts?: Options) => QuartzPluginInstance -type QuartzPluginInstance = +type QuartzPluginInstance = | QuartzTransformerPluginInstance | QuartzFilterPluginInstance | QuartzEmitterPluginInstance @@ -22,14 +22,16 @@ type QuartzPluginInstance = The following sections will go into detail for what methods can be implemented for each plugin type. Before we do that, let's clarify a few more ambiguous types: -- `BuildCtx` is defined in `quartz/ctx.ts`. It consists of - - `argv`: The command line arguments passed to the Quartz [[build]] command - - `cfg`: The full Quartz [[configuration]] - - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is) +- `BuildCtx` is defined in `quartz/ctx.ts`. It consists of + - `argv`: The command line arguments passed to the Quartz [[build]] command + - `cfg`: The full Quartz [[configuration]] + - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is) - `StaticResources` is defined in `quartz/resources.tsx`. It consists of - - `css`: a list of URLs for stylesheets that should be loaded - - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script. + - `css`: a list of URLs for stylesheets that should be loaded + - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script. + ## Transformers + Transformers **map** over content, taking a Markdown file and outputting modified content or adding metadata to the file itself. ```ts @@ -44,7 +46,7 @@ export type QuartzTransformerPluginInstance = { All transformer plugins must define at least a `name` field to register the plugin and a few optional functions that allow you to hook into various parts of transforming a single Markdown file. -- `textTransform` performs a text-to-text transformation *before* a file is parsed into the [Markdown AST](https://github.com/syntax-tree/mdast). +- `textTransform` performs a text-to-text transformation _before_ a file is parsed into the [Markdown AST](https://github.com/syntax-tree/mdast). - `markdownPlugins` defines a list of [remark plugins](https://github.com/remarkjs/remark/blob/main/doc/plugins.md). `remark` is a tool that transforms Markdown to Markdown in a structured way. - `htmlPlugins` defines a list of [rehype plugins](https://github.com/rehypejs/rehype/blob/main/doc/plugins.md). Similar to how `remark` works, `rehype` is a tool that transforms HTML to HTML in a structured way. - `externalResources` defines any external resources the plugin may need to load on the client-side for it to work properly. @@ -72,8 +74,8 @@ export const Latex: QuartzTransformerPlugin = (opts?: Options) => { }, htmlPlugins() { if (engine === "katex") { - // if you need to pass options into a plugin, you - // can use a tuple of [plugin, options] + // if you need to pass options into a plugin, you + // can use a tuple of [plugin, options] return [[rehypeKatex, { output: "html" }]] } else { return [rehypeMathjax] @@ -82,9 +84,7 @@ export const Latex: QuartzTransformerPlugin = (opts?: Options) => { externalResources() { if (engine === "katex") { return { - css: [ - "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css", - ], + css: ["https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"], js: [ { src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", @@ -108,16 +108,18 @@ export const AddWordCount: QuartzTransformerPlugin = () => { return { name: "AddWordCount", markdownPlugins() { - return [() => { - return (tree, file) => { - // tree is an `mdast` root element - // file is a `vfile` - const text = file.value - const words = text.split(" ").length - file.data.wordcount = words - } - }] - } + return [ + () => { + return (tree, file) => { + // tree is an `mdast` root element + // file is a `vfile` + const text = file.value + const words = text.split(" ").length + file.data.wordcount = words + } + }, + ] + }, } } @@ -170,7 +172,9 @@ export const TextTransforms: QuartzTransformerPlugin = () => { All transformer plugins can be found under `quartz/plugins/transformers`. If you decide to write your own transformer plugin, don't forget to re-export it under `quartz/plugins/transformers/index.ts` A parting word: transformer plugins are quite complex so don't worry if you don't get them right away. Take a look at the built in transformers and see how they operate over content to get a better sense for how to accomplish what you are trying to do. + ## Filters + Filters **filter** content, taking the output of all the transformers and determining what files to actually keep and what to discard. ```ts @@ -202,6 +206,7 @@ export const RemoveDrafts: QuartzFilterPlugin<{}> = () => ({ ``` ## Emitters + Emitters **reduce** over content, taking in a list of all the transformed and filtered content and creating output files. ```ts @@ -239,6 +244,7 @@ export type EmitCallback = (data: { This is a thin wrapper around writing to the appropriate output folder and ensuring that intermediate directories exist. If you choose to use the native Node `fs` APIs, ensure you emit to the `argv.output` folder as well. If you are creating an emitter plugin that needs to render components, there are three more things to be aware of: + - Your component should use `getQuartzComponents` to declare a list of `QuartzComponents` that it uses to construct the page. See the page on [[creating components]] for more information. - You can use the `renderPage` function defined in `quartz/components/renderPage.tsx` to render Quartz components into HTML. - If you need to render an HTML AST to JSX, you can use the `toJsxRuntime` function from `hast-util-to-jsx-runtime` library. An example of this can be found in `quartz/components/pages/Content.tsx`. @@ -253,7 +259,7 @@ export const ContentPage: QuartzEmitterPlugin = () => { ...defaultContentPageLayout, pageBody: Content(), } - const { head, header, beforeBody, pageBody, left, right, footer} = layout + const { head, header, beforeBody, pageBody, left, right, footer } = layout return { name: "ContentPage", getQuartzComponents() { @@ -293,4 +299,4 @@ export const ContentPage: QuartzEmitterPlugin = () => { Note that it takes in a `FullPageLayout` as the options. It's made by combining a `SharedLayout` and a `PageLayout` both of which are provided through the `quartz.layout.ts` file. > [!hint] -> Look in `quartz/plugins` for more examples of plugins in Quartz as reference for your own plugins! \ No newline at end of file +> Look in `quartz/plugins` for more examples of plugins in Quartz as reference for your own plugins! diff --git a/content/advanced/paths.md b/content/advanced/paths.md index 8e2ac967..68fc181b 100644 --- a/content/advanced/paths.md +++ b/content/advanced/paths.md @@ -43,11 +43,13 @@ graph LR Server --"canonicalizeServer()"--> Canonical style Canonical stroke-width:4px ``` + Here are the main types of slugs with a rough description of each type of path: + - `ClientSlug`: client-side slug, usually obtained through `window.location`. Contains the protocol (i.e. starts with `https://`) - `CanonicalSlug`: should be used whenever you need to refer to the location of a file/note. Shouldn't be a relative path and shouldn't have leading or trailing slashes `/` either. Also shouldn't have `/index` as an ending or a file extension. - `RelativeURL`: must start with `.` or `..` to indicate it's a relative URL. Shouldn't have `/index` as an ending or a file extension. -- `ServerSlug`: cannot be relative and may not have leading or trailing slashes. +- `ServerSlug`: cannot be relative and may not have leading or trailing slashes. - `FilePath`: a real file path to a file on disk. Cannot be relative and must have a file extension. -To get a clearer picture of how these relate to each other, take a look at the path tests in `quartz/path.test.ts`. \ No newline at end of file +To get a clearer picture of how these relate to each other, take a look at the path tests in `quartz/path.test.ts`. diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index fb8551cc..2a80012d 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -6,7 +6,7 @@ draft: true - docs for making plugins - nested tags showing duplicate - - tag page markdown file for description not being rendered + - tag page markdown file for description not being rendered - back button with anchors / popovers + spa is broken - search should be fast for large repos - debounce cfg rebuild on large repos diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts index a94b552e..f3a0281e 100644 --- a/quartz/plugins/emitters/contentIndex.ts +++ b/quartz/plugins/emitters/contentIndex.ts @@ -88,19 +88,23 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => { } if (opts?.enableSiteMap) { - emitted.push(await emit({ - content: generateSiteMap(cfg, linkIndex), - slug: "sitemap" as ServerSlug, - ext: ".xml", - })) + emitted.push( + await emit({ + content: generateSiteMap(cfg, linkIndex), + slug: "sitemap" as ServerSlug, + ext: ".xml", + }), + ) } if (opts?.enableRSS) { - emitted.push(await emit({ - content: generateRSSFeed(cfg, linkIndex), - slug: "index" as ServerSlug, - ext: ".xml", - })) + emitted.push( + await emit({ + content: generateRSSFeed(cfg, linkIndex), + slug: "index" as ServerSlug, + ext: ".xml", + }), + ) } const fp = path.join("static", "contentIndex") as ServerSlug @@ -115,11 +119,13 @@ export const ContentIndex: QuartzEmitterPlugin> = (opts) => { }), ) - emitted.push(await emit({ - content: JSON.stringify(simplifiedIndex), - slug: fp, - ext: ".json", - })) + emitted.push( + await emit({ + content: JSON.stringify(simplifiedIndex), + slug: fp, + ext: ".json", + }), + ) return emitted }, From df02ea20d7e12e8b9ffdd2968afaf5893c433488 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 10 Aug 2023 21:32:11 -0700 Subject: [PATCH 0476/1221] spacing fix --- content/advanced/making plugins.md | 6 +++--- content/features/upcoming features.md | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/content/advanced/making plugins.md b/content/advanced/making plugins.md index c041d34a..2de32008 100644 --- a/content/advanced/making plugins.md +++ b/content/advanced/making plugins.md @@ -153,9 +153,9 @@ export const TextTransforms: QuartzTransformerPlugin = () => { } }) - // remove all links (replace with just the link content) - // match by 'type' field on an mdast node - // https://github.com/syntax-tree/mdast#link in this example + // remove all links (replace with just the link content) + // match by 'type' field on an mdast node + // https://github.com/syntax-tree/mdast#link in this example visit(tree, "link", (link: Link) => { return { type: "paragraph" diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 2a80012d..27d8bd94 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,7 +4,6 @@ draft: true ## todo -- docs for making plugins - nested tags showing duplicate - tag page markdown file for description not being rendered - back button with anchors / popovers + spa is broken From 259d0a6d9ac5a02f0281e3fc061861b23481348f Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 11 Aug 2023 00:31:44 -0700 Subject: [PATCH 0477/1221] more documentation --- content/authoring content.md | 33 +++++++++++++++++++++ content/features/Latex.md | 13 ++++++++ content/features/Mermaid diagrams.md | 18 +++++++++++ content/features/Obsidian compatibility.md | 31 +++++++++++++++++++ content/features/callouts.md | 23 ++++++++++++++ content/features/folder and tag listings.md | 28 +++++++++++++++++ content/features/private pages.md | 25 ++++++++++++++++ content/features/upcoming features.md | 3 -- content/index.md | 4 +-- quartz/plugins/transformers/frontmatter.ts | 2 -- 10 files changed, 173 insertions(+), 7 deletions(-) create mode 100644 content/authoring content.md create mode 100644 content/features/Obsidian compatibility.md create mode 100644 content/features/private pages.md diff --git a/content/authoring content.md b/content/authoring content.md new file mode 100644 index 00000000..b5b154c0 --- /dev/null +++ b/content/authoring content.md @@ -0,0 +1,33 @@ +--- +title: Authoring Content +--- + +All of the content in your Quartz should go in the `/content` folder. The content for the home page of your Quartz lives in `content/index.md`. If you've [[index#🪴 Get Started|setup Quartz]] already, this folder should already be initailized. Any Markdown in this folder will get processed by Quartz. + +It is recommended that you use [Obsidian](https://obsidian.md/) as a way to edit and maintain your Quartz. It comes with a nice editor and graphical interface to preview all of your local files and allow you to easily edit and link across files. + +Got everything setup? Let's [[build]] and preview your Quartz locally! + +## Syntax + +As Quartz uses Markdown files as the main way of writing content, it fully supports Markdown syntax along with a few extensions like [Github Flavored Markdown](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) (footnotes, strikethrough, tables, tasklists) and [Obsidian Flavored Markdown](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown) ([[callouts]], [[wikilinks]]). + +Additionally, Quartz also allows you to specify additional metadata in your notes called **frontmatter** using YAML. + +```md title="content/note.md" +--- +title: Example Title +draft: false +tags: + - example-tag +--- + +The rest of your content lives here. You can use **Markdown** here :) +``` + +Some common frontmatter fields that are natively supported by Quartz: + +- `title`: Quartz will use the name of the file as the title if this isn't provided. If it is provided, it should be a string. +- `draft`: Whether to publish the page or not. This is one way to make [[private pages|pages private]] in Quartz. +- `aliases`: Other names for this note. This is a list of strings. +- `date`: A string representing the day the note was published. Normally uses `YYYY-MM-DD` format but other formats _may_ work. diff --git a/content/features/Latex.md b/content/features/Latex.md index 0dbc1133..91cc952e 100644 --- a/content/features/Latex.md +++ b/content/features/Latex.md @@ -25,6 +25,19 @@ f(x) = \int_{-\infty}^\infty \,d\xi $$ +$$ +\begin{aligned} +a &= b + c \\ &= e + f \\ +\end{aligned} +$$ + +$$ +\begin{bmatrix} +1 & 2 & 3 \\ +a & b & c +\end{bmatrix} +$$ + ### Inline Math Similarly, inline math can be rendered by delimiting math expression with a single `$`. For example, `$e^{i\pi} = -1$` produces $e^{i\pi} = -1$ diff --git a/content/features/Mermaid diagrams.md b/content/features/Mermaid diagrams.md index 91d0988b..f14a5589 100644 --- a/content/features/Mermaid diagrams.md +++ b/content/features/Mermaid diagrams.md @@ -1,6 +1,24 @@ +Quartz supports Mermaid which allows you to add diagrams and charts to your notes. Mermaid supports a range of diagrams, such as [flow charts](https://mermaid.js.org/syntax/flowchart.html), [sequence diagrams](https://mermaid.js.org/syntax/sequenceDiagram.html), and [timelines](https://mermaid.js.org/syntax/timeline.html). This is enabled as a part of [[Obsidian compatibility]] and can be configured and enabled/disabled from that plugin. + +By default, Quartz will render Mermaid diagrams to match the site theme. + > [!warning] > Wondering why Mermaid diagrams may not be showing up even if you have them enabled? You may need to reorder your plugins so that `Plugin.ObsidianFlavoredMarkdown()` is _after_ `Plugin.SyntaxHighlighting()`. +## Syntax + +To add a Mermaid diagram, create a mermaid code block. + +```` +```mermaid +sequenceDiagram + Alice->>+John: Hello John, how are you? + Alice->>+John: John, can you hear me? + John-->>-Alice: Hi Alice, I can hear you! + John-->>-Alice: I feel great! +``` +```` + ```mermaid sequenceDiagram Alice->>+John: Hello John, how are you? diff --git a/content/features/Obsidian compatibility.md b/content/features/Obsidian compatibility.md new file mode 100644 index 00000000..61fcc060 --- /dev/null +++ b/content/features/Obsidian compatibility.md @@ -0,0 +1,31 @@ +--- +tags: + - plugin/transformer +--- + +Quartz was originally designed as a tool to publish Obsidian vaults as websites. Even as the scope of Quartz has widened over time, it hasn't lost the ability to seamlessly interoperate with Obsidian. + +By default, Quartz ships with `Plugin.ObsidianFlavoredMarkdown` which is a transformer plugin that adds support for [Obsidian Flavored Markdown](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown). This includes support for features like [[wikilinks]] and [[Mermaid diagrams]]. + +It also ships with support for [frontmatter parsing](https://help.obsidian.md/Editing+and+formatting/Properties) with the same fields that Obsidian uses through the `Plugin.FrontMatter` transformer plugin. + +Finally, Quartz also provides `Plugin.CrawlLinks` which allows you to customize Quartz's link resolution behaviour to match Obsidian. + +## Configuration + +- Frontmatter parsing: + - Disabling: remove all instances of `Plugin.FrontMatter()` from `quartz.config.ts`. + - Customize default values for frontmatter: edit `quartz/plugins/transformers/frontmatter.ts` +- Obsidian Flavored Markdown: + - Disabling: remove all instances of `Plugin.ObsidianFlavoredMarkdown()` from `quartz.config.ts` + - Customizing features: `Plugin.ObsidianFlavoredMarkdown` has several other options to toggle on and off: + - `comments`: whether to enable `%%` style Obsidian comments. Defaults to `true` + - `highlight`: whether to enable `==` style highlights. Defaults to `true` + - `wikilinks`: whether to enable turning [[wikilinks]] into regular links. Defaults to `true` + - `callouts`: whether to enable [[callouts]]. Defaults to `true` + - `mermaid`: whether to enable [[Mermaid diagrams]]. Defaults to `true` + - `parseTags`: whether to try and parse tags in the content body. Defaults to `true` + - `enableInHtmlEmbed`: whether to try and parse Obsidian flavoured markdown in raw HTML. Defaults to `false` +- Link resolution behaviour: + - Disabling: remove all instances of `Plugin.CrawlLinks()` from `quartz.config.ts` + - Changing link resolution preference: set `markdownLinkResolution` to one of `absolute`, `relative` or `shortest` diff --git a/content/features/callouts.md b/content/features/callouts.md index cb5feb9d..63051ad9 100644 --- a/content/features/callouts.md +++ b/content/features/callouts.md @@ -1,10 +1,33 @@ --- title: Callouts +tags: + - plugin/transformer --- +Quartz supports the same Admonition-callout syntax as Obsidian. + +This includes + +- 12 Distinct callout types (each with several aliases) +- Collapsable callouts + +``` +> [!info] Title +> This is a callout! +``` + +See [documentation on supported types and syntax here](https://help.obsidian.md/Editing+and+formatting/Callouts). + > [!warning] > Wondering why callouts may not be showing up even if you have them enabled? You may need to reorder your plugins so that `Plugin.ObsidianFlavoredMarkdown()` is _after_ `Plugin.SyntaxHighlighting()`. +## Customization + +- Disable callouts: simply pass `callouts: false` to the plugin: `Plugin.ObsidianFlavoredMarkdown({ callouts: false })` +- Editing icons: `quartz/plugins/transformers/ofm.ts` + +## Showcase + > [!info] > Default title diff --git a/content/features/folder and tag listings.md b/content/features/folder and tag listings.md index e69de29b..caad796b 100644 --- a/content/features/folder and tag listings.md +++ b/content/features/folder and tag listings.md @@ -0,0 +1,28 @@ +--- +title: Folder and Tag Listings +tags: + - plugin/emitter +--- + +Quartz creates listing pages for any folders and tags you have. + +## Folder Listings + +Quartz will generate an index page for all the pages under that folder. This includes any content that is multiple levels deep. + +Additionally, Quartz will also generate pages for subfolders. Say you have a note in a nested folder `content/abc/def/note.md`. Then, Quartz would generate a page for all the notes under `abc` _and_ a page for all the notes under `abc/def`. + +By default, Quartz will title the page `Folder: ` and no description. You can override this by creating an `index.md` file in the folder with the `title` [[authoring content#Syntax|frontmatter]] field. Any content you write in this file will also be used in the description of the folder. + +## Tag Listings + +Quartz will also create an index page for each unique tag in your vault and render a list of all notes with that tag. + +Quartz also supports tag hierarchies as well (e.g. `plugin/emitter`) and will also render a separate tag page for each layer of the tag hierarchy. It will also create a default global tag index page at `/tags` that displays a list of all the tags in your Quartz. + +## Customization + +The layout for both the folder and content pages can be customized. By default, they use the `defaultListPageLayout` in `quartz.layouts.ts`. If you'd like to make more involved changes to the layout and don't mind editing some [[creating components|Quartz components]], you can take a look at `quartz/components/pages/FolderContent.tsx` and `quartz/components/pages/TagContent.tsx` respectively. + +- Removing folder listings: remove `Plugin.FolderPage()` from `emitters` in `quartz.config.ts` +- Removing tag listings: remove `Plugin.TagPage()` from `emitters` in `quartz.config.ts` diff --git a/content/features/private pages.md b/content/features/private pages.md new file mode 100644 index 00000000..e225e8c3 --- /dev/null +++ b/content/features/private pages.md @@ -0,0 +1,25 @@ +--- +title: Private Pages +--- + +There may be some notes you want to avoid publishing as a website. Quartz supports this through two mechanisms which can be used in conjunction: + +## Filter Plugins + +[[making plugins#Filters|Filter plugins]] are plugins that filter out content based off of certain criteria. By default, Quartz uses the `Plugin.RemoveDrafts` plugin which filters out any note that has `drafts: true` in the frontmatter. + +If you'd like to only publish a select number of notes, you can instead use `Plugin.ExplicitPublish` which will filter out all notes except for any that have `publish: true` in the frontmatter. + +## `ignoreFiles` + +This is a field in `quartz.config.ts` under the main [[configuration]] which allows you to specify a list of patterns to effectively exclude from parsing all together. Any valid [glob](https://github.com/mrmlnc/fast-glob#pattern-syntax) pattern works here. + +Common examples include: + +- `some/folder`: exclude the entire of `some/folder` +- `*.md`: exclude all files with a `.md` extension +- `!*.md` exclude all files that _don't_ have a `.md` extension +- `**/private`: exclude any files or folders named `private` at any level of nesting + +> [!warning] +> Marking something as private via either a plugin or through the `ignoreFiles` pattern will only prevent a page from being included in the final built site. If your GitHub repository is public, also be sure to include an ignore for those in the `.gitignore` of your Quartz. See the `git` [documentation](https://git-scm.com/docs/gitignore#_pattern_format) for more information. diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 27d8bd94..ebfd6257 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -14,9 +14,6 @@ draft: true - test/fix with subpath - fix docs with deploy from github - write feature docs - - callouts - - folder and tag listings - - mermaid diagrams - rss - spa-routing - table of contents diff --git a/content/index.md b/content/index.md index 32425852..32f012c2 100644 --- a/content/index.md +++ b/content/index.md @@ -18,14 +18,14 @@ npm i npx quartz create ``` -This will guide you through initializing your Quartz with content. Once you've done so, see how to [[build]] and [[hosting|host]] Quartz. +This will guide you through initializing your Quartz with content. Once you've done so, see how to [[authoring content|author content]] or how to [[build]] and [[hosting|host]] Quartz. > [!info] > Coming from Quartz 3? See the [[migrating from Quartz 3|migration guide]] for the differences between Quartz 3 and Quartz 4 and how to migrate. ## 🔧 Features -- [[full-text search|Full-text search]], [[graph view]], [[wikilinks]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box +- [[Obsidian compatibility]], [[full-text search]], [[graph view]], [[wikilinks]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box - Hot-reload for both configuration and content - Simple JSX [[creating components|layouts and page components]] - [[SPA Routing|Ridiculously fast page loads]] and tiny bundle sizes diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts index 58ae7c79..e09d20f7 100644 --- a/quartz/plugins/transformers/frontmatter.ts +++ b/quartz/plugins/transformers/frontmatter.ts @@ -5,12 +5,10 @@ import yaml from "js-yaml" import { slugTag } from "../../path" export interface Options { - language: "yaml" | "toml" delims: string | string[] } const defaultOptions: Options = { - language: "yaml", delims: "---", } From 79e828696a9e53357f61bd89c36e41555575c2c2 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 11 Aug 2023 22:47:50 -0700 Subject: [PATCH 0478/1221] feature docs --- content/advanced/architecture.md | 6 +-- content/advanced/creating components.md | 12 ++--- content/authoring content.md | 12 ++--- content/build.md | 8 +--- content/configuration.md | 59 ++++--------------------- content/features/Latex.md | 2 +- content/features/RSS Feed.md | 5 +++ content/features/SPA Routing.md | 8 +++- content/features/backlinks.md | 2 +- content/features/darkmode.md | 14 ++++++ content/features/full-text search.md | 2 +- content/features/graph view.md | 4 +- content/features/table of contents.md | 19 ++++++++ content/features/upcoming features.md | 9 ++-- content/features/wikilinks.md | 18 ++++++++ content/hosting.md | 3 ++ content/index.md | 18 +++++--- content/layout.md | 42 ++++++++++++++++++ content/philosophy.md | 5 ++- content/upgrading.md | 6 +-- 20 files changed, 160 insertions(+), 94 deletions(-) create mode 100644 content/features/darkmode.md create mode 100644 content/layout.md diff --git a/content/advanced/architecture.md b/content/advanced/architecture.md index 06a670b6..33da89d9 100644 --- a/content/advanced/architecture.md +++ b/content/advanced/architecture.md @@ -8,11 +8,11 @@ This question is best answered by tracing what happens when a user (you!) runs ` ## On the server -1. After running `npx quartz build`, npm will look at `package.json` to find the `bin.quartz` entry which points at `./quartz/bootstrap-cli.mjs`. +1. After running `npx quartz build`, npm will look at `package.json` to find the `bin` entry for `quartz` which points at `./quartz/bootstrap-cli.mjs`. 2. This file has a [shebang]() line at the top which tells npm to execute it using Node. 3. `bootstrap-cli.mjs` is responsible for a few things: 1. Parsing the command-line arguments using [yargs](http://yargs.js.org/). - 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' client-side scripts (any `.inline.ts` file) that components declare using a custom `esbuild` plugin that runs another instance of `esbuild` that bundles for the browser instead of `node`. Modules of both types are imported as plain text. + 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' client-side scripts (any `.inline.ts` file) that components declare using a custom `esbuild` plugin that runs another instance of `esbuild` which bundles for the browser instead of `node`. Modules of both types are imported as plain text. 3. Running the local preview server if `--serve` is set. This starts two servers: 1. A WebSocket server on port 3001 to handle hot-reload signals. This tracks all inbound connections and sends a 'rebuild' message a server-side change is detected (either content or configuration). 2. An HTTP file-server on a user defined port (normally 8080) to serve the actual website files. @@ -35,7 +35,7 @@ This question is best answered by tracing what happens when a user (you!) runs ` 4. Filter out unwanted content using plugins. 5. Emit files using plugins. 1. Gather all the static resources (e.g. external CSS, JS modules, etc.) each emitter plugin declares. - 2. Emitters that emit HTML files do a bit of extra work here as they need to transform the [hast](https://github.com/syntax-tree/hast) produced in the parse step to JSX. This is done using [hast-util-to-jsx-runtime](https://github.com/syntax-tree/hast-util-to-jsx-runtime) with the [Preact](https://preactjs.com/) runtime. Finally, the JSX is rendered to HTML using [preact-render-to-string](https://github.com/preactjs/preact-render-to-string) which statically renders the JSX to HTML (i.e. doesn't care about `useState`, `useEffect`, or any other React/Preact interactive bits). Here, we also do a bunch of fun stuff like assemble the page layout from `quartz.layout.ts`, assemble all the inline scripts that actually get shipped to the client, and all the transpiled styles. The bulk of this logic can be found in `quartz/components/renderPage.tsx`. Other fun things of note: + 2. Emitters that emit HTML files do a bit of extra work here as they need to transform the [hast](https://github.com/syntax-tree/hast) produced in the parse step to JSX. This is done using [hast-util-to-jsx-runtime](https://github.com/syntax-tree/hast-util-to-jsx-runtime) with the [Preact](https://preactjs.com/) runtime. Finally, the JSX is rendered to HTML using [preact-render-to-string](https://github.com/preactjs/preact-render-to-string) which statically renders the JSX to HTML (i.e. doesn't care about `useState`, `useEffect`, or any other React/Preact interactive bits). Here, we also do a bunch of fun stuff like assemble the page [[layout]] from `quartz.layout.ts`, assemble all the inline scripts that actually get shipped to the client, and all the transpiled styles. The bulk of this logic can be found in `quartz/components/renderPage.tsx`. Other fun things of note: 1. CSS is minified and transformed using [Lightning CSS](https://github.com/parcel-bundler/lightningcss) to add vendor prefixes and do syntax lowering. 2. Scripts are split into `beforeDOMLoaded` and `afterDOMLoaded` and are inserted in the `` and `` respectively. 3. Finally, each emitter plugin is responsible for emitting and writing it's own emitted files to disk. diff --git a/content/advanced/creating components.md b/content/advanced/creating components.md index e9f13853..1496b15b 100644 --- a/content/advanced/creating components.md +++ b/content/advanced/creating components.md @@ -14,9 +14,9 @@ Normally on the web, we write layout code using HTML which looks something like ``` -This piece of HTML represents an article with a leading header that says "An article header" and a paragraph that contains the text "Some content". This is normally combined with CSS to style the page and JavaScript to add interactivity. +This piece of HTML represents an article with a leading header that says "An article header" and a paragraph that contains the text "Some content". This is combined with CSS to style the page and JavaScript to add interactivity. -However, HTML doesn't let you create reusable templates. If you wanted to create a new page, you would need to copy and paste the above snippet and edit the header and content yourself. This isn't great if we have a lot of content on our site that shares a lot of similar layout. The smart people who created React also had similar thoughts, inventing the concept of JSX Components to solve the code duplication problem. +However, HTML doesn't let you create reusable templates. If you wanted to create a new page, you would need to copy and paste the above snippet and edit the header and content yourself. This isn't great if we have a lot of content on our site that shares a lot of similar layout. The smart people who created React also had similar complaints and invented the concept of Components -- JavaScript functions that return JSX -- to solve the code duplication problem. In effect, components allow you to write a JavaScript function that takes some data and produces HTML as an output. **While Quartz doesn't use React, it uses the same component concept to allow you to easily express layout templates in your Quartz site.** @@ -26,7 +26,7 @@ In effect, components allow you to write a JavaScript function that takes some d Component files are written in `.tsx` files that live in the `quartz/components` folder. These are re-exported in `quartz/components/index.ts` so you can use them in layouts and other components more easily. -Each component file should have a default export that satisfies the `QuartzComponentConstructor` function signature. It is a function that takes in a single optional parameter `opts` and returns a Quartz Component. The type of the parameters `ops` is defined by the interface `Options` which you as the component creator also decide. +Each component file should have a default export that satisfies the `QuartzComponentConstructor` function signature. It's a function that takes in a single optional parameter `opts` and returns a Quartz Component. The type of the parameters `opts` is defined by the interface `Options` which you as the component creator also decide. In your component, you can use the values from the configuration option to change the rendering behaviour inside of your component. For example, the component in the code snippet below will not render if the `favouriteNumber` option is below 0. @@ -57,7 +57,7 @@ export default ((userOpts?: Options) => { The Quartz component itself (lines 11-17 highlighted above) looks like a React component. It takes in properties (sometimes called [props](https://react.dev/learn/passing-props-to-a-component)) and returns JSX. -All Quartz components accept the same set of props which are defined in `QuartzComponentProps`: +All Quartz components accept the same set of props: ```tsx title="quartz/components/types.ts" // simplified for sake of demonstration @@ -82,7 +82,7 @@ export type QuartzComponentProps = { Quartz components can also define a `.css` property on the actual function component which will get picked up by Quartz. This is expected to be a CSS string which can either be inlined or imported from a `.scss` file. -Note that inlined styles **must** be plain vanilla CSS. +Note that inlined styles **must** be plain vanilla CSS: ```tsx {6-10} title="quartz/components/YourComponent.tsx" export default (() => { @@ -100,7 +100,7 @@ export default (() => { }) satisfies QuartzComponentConstructor ``` -Imported styles, however, can be from SCSS files. +Imported styles, however, can be from SCSS files: ```tsx {1-2,9} title="quartz/components/YourComponent.tsx" // assuming your stylesheet is in quartz/components/styles/YourComponent.scss diff --git a/content/authoring content.md b/content/authoring content.md index b5b154c0..4e3c3c83 100644 --- a/content/authoring content.md +++ b/content/authoring content.md @@ -4,15 +4,15 @@ title: Authoring Content All of the content in your Quartz should go in the `/content` folder. The content for the home page of your Quartz lives in `content/index.md`. If you've [[index#🪴 Get Started|setup Quartz]] already, this folder should already be initailized. Any Markdown in this folder will get processed by Quartz. -It is recommended that you use [Obsidian](https://obsidian.md/) as a way to edit and maintain your Quartz. It comes with a nice editor and graphical interface to preview all of your local files and allow you to easily edit and link across files. +It is recommended that you use [Obsidian](https://obsidian.md/) as a way to edit and maintain your Quartz. It comes with a nice editor and graphical interface to preview, edit, and link your local files and attachments. Got everything setup? Let's [[build]] and preview your Quartz locally! ## Syntax -As Quartz uses Markdown files as the main way of writing content, it fully supports Markdown syntax along with a few extensions like [Github Flavored Markdown](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) (footnotes, strikethrough, tables, tasklists) and [Obsidian Flavored Markdown](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown) ([[callouts]], [[wikilinks]]). +As Quartz uses Markdown files as the main way of writing content, it fully supports Markdown syntax. By default, Quartz also ships with a few syntax extensions like [Github Flavored Markdown](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) (footnotes, strikethrough, tables, tasklists) and [Obsidian Flavored Markdown](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown) ([[callouts]], [[wikilinks]]). -Additionally, Quartz also allows you to specify additional metadata in your notes called **frontmatter** using YAML. +Additionally, Quartz also allows you to specify additional metadata in your notes called **frontmatter**. ```md title="content/note.md" --- @@ -27,7 +27,7 @@ The rest of your content lives here. You can use **Markdown** here :) Some common frontmatter fields that are natively supported by Quartz: -- `title`: Quartz will use the name of the file as the title if this isn't provided. If it is provided, it should be a string. -- `draft`: Whether to publish the page or not. This is one way to make [[private pages|pages private]] in Quartz. +- `title`: Title of the page. If it isn't provided, Quartz will use the name of the file as the title. - `aliases`: Other names for this note. This is a list of strings. -- `date`: A string representing the day the note was published. Normally uses `YYYY-MM-DD` format but other formats _may_ work. +- `draft`: Whether to publish the page or not. This is one way to make [[private pages|pages private]] in Quartz. +- `date`: A string representing the day the note was published. Normally uses `YYYY-MM-DD` format. diff --git a/content/build.md b/content/build.md index bce9d546..14476875 100644 --- a/content/build.md +++ b/content/build.md @@ -2,17 +2,13 @@ title: "Building your Quartz" --- -Once you've [[index#🪴 Get Started|initialized]] Quartz, let's see what it looks like locally. +Once you've [[index#🪴 Get Started|initialized]] Quartz, let's see what it looks like locally: ```bash npx quartz build --serve ``` -Then, open a web browser and visit `http://localhost:8080/` to view it. - -Want to change how Quartz looks? You can edit `quartz.config.ts` to customize and configure your Quartz, including styles, layout, and more. Read the [[configuration]] page for more information on what each field in the configuration does. - -Once you're happy with it, let's see how to [[hosting|deploy Quartz to the web]]! +This will start a local web server to run your Quartz on your computer. Open a web browser and visit `http://localhost:8080/` to view it. > [!hint] Flags and options > For full help options, you can run `npx quartz build --help`. diff --git a/content/configuration.md b/content/configuration.md index cdf4459e..182a87b2 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -2,12 +2,12 @@ title: Configuration --- -Quartz is meant to be extremely configurable, even if you don't know any coding. Most of the configuration you should need can be done by just editing `quartz.config.ts`. +Quartz is meant to be extremely configurable, even if you don't know any coding. Most of the configuration you should need can be done by just editing `quartz.config.ts` or changing [[layout|the layout]] in `quartz.layout.ts`. > [!tip] -> If you edit this file using a text-editor that has TypeScript language support like VSCode, it will warn you when you you've made an error in your configuration, helping you avoid configuration mistakes! +> If you edit Quartz configuration using a text-editor that has TypeScript language support like VSCode, it will warn you when you you've made an error in your configuration, helping you avoid configuration mistakes! -This configuration can be broken down into two main parts: +The configuration of Quartz can be broken down into two main parts: ```ts title="quartz.config.ts" const config: QuartzConfig = { @@ -20,15 +20,17 @@ const config: QuartzConfig = { This part of the configuration concerns anything that can affect the whole site. The following is a list breaking down all the things you can configure: -- `pageTitle`: used as an anchor to return to the home page. This is also used when generating the [[RSS Feed]] for your site. +- `pageTitle`: title of the site. This is also used when generating the [[RSS Feed]] for your site. - `enableSPA`: whether to enable [[SPA Routing]] on your site. - `enablePopovers`: whether to enable [[popover previews]] on your site. - `analytics`: what to use for analytics on your site. Values can be - `null`: don't use analytics; - `{ provider: 'plausible' }`: use [Plausible](https://plausible.io/), a privacy-friendly alternative to Google Analytics; or - `{ provider: 'google', tagId: }`: use Google Analytics -- `caononicalUrl`: sometimes called `baseURL` in other site generators. This is used for sitemaps and RSS feeds that require an absolute URL to know where the canonical 'home' of your site lives. This is normally the deployed URL of your site (e.g. `https://quartz.jzhao.xyz/` for this site). Note that Quartz 4 will avoid using this as much as possible and use relative URLs whenever it can to make sure your site works no matter _where_ you end up actually deploying it. -- `ignorePatterns`: a list of [glob]() patterns that Quartz should ignore and not search through when looking for files inside the `content` folder. +- `baseUrl`: this is used for sitemaps and RSS feeds that require an absolute URL to know where the canonical 'home' of your site lives. This is normally the deployed URL of your site (e.g. `quartz.jzhao.xyz` for this site). Do not include the protocol (i.e. `https://`) or any leading or trailing slashes. + - This should also include the subpath if you are [[hosting]] on GitHub pages without a custom domain. For example, if my repository is `jackyzha0/quartz`, GitHub pages would deploy to `https://jackyzha0.github.io/quartz` and the `baseUrl` would be `jackyzha0.github.io/quartz` + - Note that Quartz 4 will avoid using this as much as possible and use relative URLs whenever it can to make sure your site works no matter _where_ you end up actually deploying it. +- `ignorePatterns`: a list of [glob]() patterns that Quartz should ignore and not search through when looking for files inside the `content` folder. See [[private pages]] for more details. - `theme`: configure how the site looks. - `typography`: what fonts to use. Any font available on [Google Fonts](https://fonts.google.com/) works here. - `header`: Font to use for headers @@ -77,48 +79,3 @@ transformers: [ ``` If you'd like to make your own plugins, read the guide on [[making plugins]] for more information. - -### Layout - -Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To enable easy customization, these emitters allow you to fully rearrange the layout of the page. The default page layouts can be found in `quartz.layout.ts`. - -Each page is composed of multiple different sections which contain `QuartzComponents`. The following code snippet lists all of the valid sections that you can add components to: - -```typescript title="quartz/cfg.ts" -export interface FullPageLayout { - head: QuartzComponent // single component - header: QuartzComponent[] // laid out horizontally - beforeBody: QuartzComponent[] // laid out vertically - pageBody: QuartzComponent // single component - left: QuartzComponent[] // vertical on desktop, horizontal on mobile - right: QuartzComponent[] // vertical on desktop, horizontal on mobile - footer: QuartzComponent // single component -} -``` - -These correspond to following parts of the page: - -![[quartz-layout.png|800]] - -> [!note] -> There are two additional layout fields that are _not_ shown in the above diagram. -> -> 1. `head` is a single component that renders the `` [tag](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head) in the HTML. This doesn't appear visually on the page and is only is responsible for metadata about the document like the tab title, scripts, and styles. -> 2. `header` is a set of components that are laid out horizontally and appears _before_ the `beforeBody` section. This enables you to replicate the old Quartz 3 header bar where the title, search bar, and dark mode toggle. By default, Quartz 4 doesn't place any components in the `header`. - -Quartz **components**, like plugins, can take in additional properties as configuration options. If you're familiar with React terminology, you can think of them as Higher-order Components. - -See [a list of all the components](./tags/component) for all available components along with their configuration options. - -### Style - -Most meaningful style changes like colour scheme and font can be done simply through the [[#General Configuration|general configuration]] options above. - -However, if you'd like to make more involved style changes, you can do this by writing your own styles. Quartz 4, like Quartz 3, uses [Sass](https://sass-lang.com/guide/) for styling. - -You can see the base style sheet in `quartz/styles/base.scss` and write your own in `quartz/styles/custom.scss`. - -> [!note] -> Some components may provide their own styling as well! For example, `quartz/components/Darkmode.tsx` imports styles from `quartz/components/styles/darkmode.scss`. If you'd like to customize styling for a specific component, double check the component definition to see how its styles are defined. - -When you're ready, see how [[build|build and preview]] Quartz locally. diff --git a/content/features/Latex.md b/content/features/Latex.md index 91cc952e..3c8f6ff1 100644 --- a/content/features/Latex.md +++ b/content/features/Latex.md @@ -5,7 +5,7 @@ tags: Quartz uses [Katex](https://katex.org/) by default to typeset both inline and block math expressions at build time. -## Formatting +## Syntax ### Block Math diff --git a/content/features/RSS Feed.md b/content/features/RSS Feed.md index e69de29b..c519f877 100644 --- a/content/features/RSS Feed.md +++ b/content/features/RSS Feed.md @@ -0,0 +1,5 @@ +Quartz creates an RSS feed for all the content on your site by generating an `index.xml` file that RSS readers can subscribe to. Because of the RSS spec, this requires the `baseUrl` property in your [[configuration]] to be set properly for RSS readers to pick it up properly. + +## Configuration + +- Remove RSS feed: set the `enableRSS` field of `Plugin.ContentIndex` in `quartz.config.ts` to be `false`. diff --git a/content/features/SPA Routing.md b/content/features/SPA Routing.md index 91249939..3004af97 100644 --- a/content/features/SPA Routing.md +++ b/content/features/SPA Routing.md @@ -1 +1,7 @@ -Single-page-app style rendering. This prevents flashes of unstyled content and improves smoothness of Quartz +Single-page-app style rendering. This prevents flashes of unstyled content and improves the smoothness of Quartz. + +Under the hood, this is done by hijacking page navigations and instead fetching the HTML via a `GET` request and then diffing and selectively replacing parts of the page using [micromorph](https://github.com/natemoo-re/micromorph). This allows us to change the content of the page without fully refreshing the page, reducing the amount of content that the browser needs to load. + +## Configuration + +- Disable SPA Routing: set the `enableSPA` field of the [[configuration]] in `quartz.config.ts` to be `false`. diff --git a/content/features/backlinks.md b/content/features/backlinks.md index 4df7fd17..f558f4a5 100644 --- a/content/features/backlinks.md +++ b/content/features/backlinks.md @@ -8,7 +8,7 @@ A backlink for a note is a link from another note to that note. Links in the bac ## Customization -- Removing backlinks: delete all usages of `Component.Backlinks()` from `quartz.config.ts`. +- Removing backlinks: delete all usages of `Component.Backlinks()` from `quartz.layout.ts`. - Component: `quartz/components/Backlinks.tsx` - Style: `quartz/components/styles/backlinks.scss` - Script: `quartz/components/scripts/search.inline.ts` diff --git a/content/features/darkmode.md b/content/features/darkmode.md new file mode 100644 index 00000000..dfa23140 --- /dev/null +++ b/content/features/darkmode.md @@ -0,0 +1,14 @@ +--- +title: "Darkmode" +tags: + - component +--- + +Quartz supports darkmode out of the box that respects the user's theme preference. Any future manual toggles of the darkmode switch will be saved in the browser's local storage so it can be persisted across future page loads. + +## Customization + +- Removing darkmode: delete all usages of `Component.Darkmode()` from `quartz.layout.ts`. +- Component: `quartz/components/Darkmode.tsx` +- Style: `quartz/components/styles/darkmode.scss` +- Script: `quartz/components/scripts/darkmode.inline.ts` diff --git a/content/features/full-text search.md b/content/features/full-text search.md index cb0567f3..ce3d88f9 100644 --- a/content/features/full-text search.md +++ b/content/features/full-text search.md @@ -21,7 +21,7 @@ It properly tokenizes Chinese, Korean, and Japenese characters and constructs se ## Customization -- Removing search: delete all usages of `Component.Search()` from `quartz.config.ts`. +- Removing search: delete all usages of `Component.Search()` from `quartz.layout.ts`. - Component: `quartz/components/Search.tsx` - Style: `quartz/components/styles/search.scss` - Script: `quartz/components/scripts/search.inline.ts` diff --git a/content/features/graph view.md b/content/features/graph view.md index 9fb31be7..c7ddb03e 100644 --- a/content/features/graph view.md +++ b/content/features/graph view.md @@ -22,7 +22,7 @@ Most configuration can be done by passing in options to `Component.Graph()`. For example, here's what the default configuration looks like: -```typescript title="quartz.config.ts" +```typescript title="quartz.layout.ts" Component.Graph({ localGraph: { drag: true, // whether to allow panning the view around @@ -53,7 +53,7 @@ When passing in your own options, you can omit any or all of these fields if you Want to customize it even more? -- Removing graph view: delete all usages of `Component.Graph()` from `quartz.config.ts`. +- Removing graph view: delete all usages of `Component.Graph()` from `quartz.layout.ts`. - Component: `quartz/components/Graph.tsx` - Style: `quartz/components/styles/graph.scss` - Script: `quartz/components/scripts/graph.inline.ts` diff --git a/content/features/table of contents.md b/content/features/table of contents.md index 70191157..ecc36fdc 100644 --- a/content/features/table of contents.md +++ b/content/features/table of contents.md @@ -2,4 +2,23 @@ title: "Table of Contents" tags: - component + - plugins/transformer --- + +Quartz can automatically generate a table of contents from a list of headings on each page. It will also show you your current scroll position on the site by marking headings you've scrolled through with a different colour. + +By default, it will show all headers from H1 (`# Title`) all the way to H3 (`### Title`) and will only show the table of contents if there is more than 1 header on the page. + +> [!info] +> This feature requires both `Plugin.TableOfContents` in your `quartz.config.ts` and `Component.TableOfContents` in your `quartz.layout.ts` to function correctly. + +## Customization + +- Removing table of contents: remove all instances of `Plugin.TableOfContents()` from `quartz.config.ts`. and `Component.TableOfContents()` from `quartz.layout.ts` +- Changing the max depth: pass in a parameter to `Plugin.TableOfContents({ maxDepth: 4 })` +- Changing the minimum number of entries in the Table of Contents before it renders: pass in a parameter to `Plugin.TableOfContents({ minEntries: 3 })` +- Component: `quartz/components/TableOfContents.tsx` +- Style: + - Modern (default): `quartz/components/styles/toc.scss` + - Legacy Quartz 3 style: `quartz/components/styles/legacyToc.scss` +- Script: `quartz/components/scripts/toc.inline.ts` diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index ebfd6257..424f0281 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,6 +4,9 @@ draft: true ## todo +- wikilink to anchors in the same document +- folders, tags, and content emit overlapping (e.g. for tags/component) +- 404 using base url - nested tags showing duplicate - tag page markdown file for description not being rendered - back button with anchors / popovers + spa is broken @@ -13,12 +16,6 @@ draft: true - dereference symlink for npx quartz sync - test/fix with subpath - fix docs with deploy from github -- write feature docs - - rss - - spa-routing - - table of contents - - darkmode - - frontmatter parsing ## high priority backlog diff --git a/content/features/wikilinks.md b/content/features/wikilinks.md index e69de29b..4d197157 100644 --- a/content/features/wikilinks.md +++ b/content/features/wikilinks.md @@ -0,0 +1,18 @@ +--- +title: Wikilinks +--- + +Wikilinks were pioneered by earlier internet wikis to make it easier to write links across pages without needing to write Markdown or HTML links each time. + +Quartz supports Wikilinks by default and these links are resolved by Quartz using `Plugin.CrawlLinks`. See the [Obsidian Help page on Internal Links](https://help.obsidian.md/Linking+notes+and+files/Internal+links) for more information on Wikilink syntax. + +This is enabled as a part of [[Obsidian compatibility]] and can be configured and enabled/disabled from that plugin. + +## Syntax + +- `[[Path to file]]`: produces a link to `Path to file` with the text `Path to file` +- `[[Path to file | Here's the title override]]`: produces a link to `Path to file` with the text `Here's the title override` +- `[[Path to file#Anchor]]`: produces a link to the anchor `Anchor` in the file `Path to file` + +> [!warning] +> Currently, Quartz does not support block references or note embed syntax. diff --git a/content/hosting.md b/content/hosting.md index 5d09500c..0ed2335d 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -6,6 +6,9 @@ Quartz effectively turns your Markdown files and other resources into a bundle o However, if you'd like to publish your site to the world, you need a way to host it online. This guide will detail how to deploy with either GitHub Pages or Cloudflare pages but any service that allows you to deploy static HTML should work as well (e.g. Netlify, Replit, etc.) +> [!hint] +> Some Quartz features (like [[RSS Feed]] and sitemap generation) require `baseUrl` to be configured properly in your [[configuration]] to work properly. Make sure you set this before deploying! + ## Cloudflare Pages 1. Log in to the [Cloudflare dashboard](https://dash.cloudflare.com/) and select your account. diff --git a/content/index.md b/content/index.md index 32f012c2..cf97d31f 100644 --- a/content/index.md +++ b/content/index.md @@ -18,21 +18,29 @@ npm i npx quartz create ``` -This will guide you through initializing your Quartz with content. Once you've done so, see how to [[authoring content|author content]] or how to [[build]] and [[hosting|host]] Quartz. +This will guide you through initializing your Quartz with content. Once you've done so, see how to: + +1. [[authoring content|Author content]] in Quartz +2. [[configuration|Configure]] Quartz's behaviour +3. Change Quartz's [[layout]] +4. [[build|Build and preview]] Quartz +5. [[hosting|Host]] Quartz online > [!info] > Coming from Quartz 3? See the [[migrating from Quartz 3|migration guide]] for the differences between Quartz 3 and Quartz 4 and how to migrate. ## 🔧 Features -- [[Obsidian compatibility]], [[full-text search]], [[graph view]], [[wikilinks]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box +- [[Obsidian compatibility]], [[full-text search]], [[graph view]], [[wikilinks]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and [many more](./features) right out of the box - Hot-reload for both configuration and content -- Simple JSX [[creating components|layouts and page components]] +- Simple JSX layouts and [[creating components|page components]] - [[SPA Routing|Ridiculously fast page loads]] and tiny bundle sizes - Fully-customizable parsing, filtering, and page generation through [[making plugins|plugins]] For a comprehensive list of features, visit the [features page](/features). You can read more the _why_ behind these features on the [[philosophy]] page and a technical overview on the [[architecture]] page. -### 🚧 Troubleshooting +### 🚧 Troubleshooting + Updating + +Having trouble with Quartz? Try searching for your issue using the search feature. If you haven't already, [[upgrading|upgrade]] to the newest version of Quartz to see if this fixes your issue. -Having trouble with Quartz? Try searching for your issue using the search feature. If you're still having trouble, feel free to [submit an issue](https://github.com/jackyzha0/quartz/issues) if you feel you found a bug or ask for help in our [Discord Community](https://discord.gg/cRFFHYye7t). +If you're still having trouble, feel free to [submit an issue](https://github.com/jackyzha0/quartz/issues) if you feel you found a bug or ask for help in our [Discord Community](https://discord.gg/cRFFHYye7t). diff --git a/content/layout.md b/content/layout.md new file mode 100644 index 00000000..80171007 --- /dev/null +++ b/content/layout.md @@ -0,0 +1,42 @@ +--- +title: Layout +--- + +Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To enable easy customization, these emitters allow you to fully rearrange the layout of the page. The default page layouts can be found in `quartz.layout.ts`. + +Each page is composed of multiple different sections which contain `QuartzComponents`. The following code snippet lists all of the valid sections that you can add components to: + +```typescript title="quartz/cfg.ts" +export interface FullPageLayout { + head: QuartzComponent // single component + header: QuartzComponent[] // laid out horizontally + beforeBody: QuartzComponent[] // laid out vertically + pageBody: QuartzComponent // single component + left: QuartzComponent[] // vertical on desktop, horizontal on mobile + right: QuartzComponent[] // vertical on desktop, horizontal on mobile + footer: QuartzComponent // single component +} +``` + +These correspond to following parts of the page: + +![[quartz-layout.png|800]] + +> [!note] +> There are two additional layout fields that are _not_ shown in the above diagram. +> +> 1. `head` is a single component that renders the `` [tag](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head) in the HTML. This doesn't appear visually on the page and is only is responsible for metadata about the document like the tab title, scripts, and styles. +> 2. `header` is a set of components that are laid out horizontally and appears _before_ the `beforeBody` section. This enables you to replicate the old Quartz 3 header bar where the title, search bar, and dark mode toggle. By default, Quartz 4 doesn't place any components in the `header`. + +Quartz **components**, like plugins, can take in additional properties as configuration options. If you're familiar with React terminology, you can think of them as Higher-order Components. + +See [a list of all the components](./tags/component) for all available components along with their configuration options. You can also checkout the guide on [[creating components]] if you're interested in further customizing the behaviour of Quartz. + +### Style + +Most meaningful style changes like colour scheme and font can be done simply through the [[configuration#General Configuration|general configuration]] options. However, if you'd like to make more involved style changes, you can do this by writing your own styles. Quartz 4, like Quartz 3, uses [Sass](https://sass-lang.com/guide/) for styling. + +You can see the base style sheet in `quartz/styles/base.scss` and write your own in `quartz/styles/custom.scss`. + +> [!note] +> Some components may provide their own styling as well! For example, `quartz/components/Darkmode.tsx` imports styles from `quartz/components/styles/darkmode.scss`. If you'd like to customize styling for a specific component, double check the component definition to see how its styles are defined. diff --git a/content/philosophy.md b/content/philosophy.md index ecd856b9..ad9a14f7 100644 --- a/content/philosophy.md +++ b/content/philosophy.md @@ -6,7 +6,7 @@ title: Philosophy of Quartz > The garden is the web as topology. Every walk through the garden creates new paths, new meanings, and when we add things to the garden we add them in a way that allows many future, unpredicted relationships. > -> (The Garden and the Stream) +> _(The Garden and the Stream)_ The problem with the file cabinet is that it focuses on efficiency of access and interoperability rather than generativity and creativity. Thinking is not linear, nor is it hierarchical. In fact, not many things are linear or hierarchical at all. Then why is it that most tools and thinking strategies assume a nice chronological or hierarchical order for my thought processes? The ideal tool for thought for me would embrace the messiness of my mind, and organically help insights emerge from chaos instead of forcing an artificial order. A rhizomatic, not arboresecent, form of note taking. @@ -22,6 +22,7 @@ The goal of digital gardening should be to tap into your network’s collective Quartz is designed first and foremost as a tool for publishing [digital gardens](https://jzhao.xyz/posts/networked-thought/) to the web. To me, digital gardening is not just passive knowledge collection. It’s a form of expression and sharing. -> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming +> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” +> — Richard Hamming **The goal of Quartz is to make sharing your digital garden free and simple.** At its core, Quartz is designed to be easy to use enough for non-technical people to get going but also powerful enough that senior developers can tweak it to work how they'd like it to work. diff --git a/content/upgrading.md b/content/upgrading.md index f9f0c399..abe916c6 100644 --- a/content/upgrading.md +++ b/content/upgrading.md @@ -5,12 +5,12 @@ title: "Upgrading Quartz" > [!note] > This is specifically a guide for upgrading Quartz 4 version to a more recent update. If you are coming from Quartz 3, check out the [[migrating from Quartz 3|migration guide]] for more info. -To fetch the latest Quartz updates, simply do +To fetch the latest Quartz updates, simply run -``` +```bash npx quartz upgrade ``` -As Quartz uses [git](https://git-scm.com/) under the hood for versioning, updating effectively 'pulls' in the updates from the official Quartz GitHub repository. If you have local changes that might conflict with the updates, you may need to resolve these manually yourself. +As Quartz uses [git](https://git-scm.com/) under the hood for versioning, updating effectively 'pulls' in the updates from the official Quartz GitHub repository. If you have local changes that might conflict with the updates, you may need to resolve these manually yourself (or, pull manually using `git pull origin upstream`). If you have the [GitHub desktop app](https://desktop.github.com/), this will automatically open to help you resolve the conflicts. Otherwise, you will need to resolve this in a text editor like VSCode. For more help on resolving conflicts manually, check out the [GitHub guide on resolving merge conflicts](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line#competing-line-change-merge-conflicts). From 736c3981c4affff8dea1eb908ff760ee740ec4a3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 11 Aug 2023 23:25:44 -0700 Subject: [PATCH 0479/1221] fix emit filepaths, tag emit being overriden by content --- content/features/private pages.md | 2 ++ content/features/table of contents.md | 2 +- quartz.config.ts | 2 +- quartz/components/pages/TagContent.tsx | 6 +++--- quartz/plugins/emitters/assets.ts | 2 +- quartz/plugins/emitters/static.ts | 2 +- quartz/plugins/emitters/tagPage.tsx | 4 ++-- 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/content/features/private pages.md b/content/features/private pages.md index e225e8c3..9be591b8 100644 --- a/content/features/private pages.md +++ b/content/features/private pages.md @@ -1,5 +1,7 @@ --- title: Private Pages +tags: +- plugin/filter --- There may be some notes you want to avoid publishing as a website. Quartz supports this through two mechanisms which can be used in conjunction: diff --git a/content/features/table of contents.md b/content/features/table of contents.md index ecc36fdc..f0585736 100644 --- a/content/features/table of contents.md +++ b/content/features/table of contents.md @@ -2,7 +2,7 @@ title: "Table of Contents" tags: - component - - plugins/transformer + - plugin/transformer --- Quartz can automatically generate a table of contents from a list of headings on each page. It will also show you your current scroll position on the site by marking headings you've scrolled through with a different colour. diff --git a/quartz.config.ts b/quartz.config.ts index 447039d6..dc9b7d5e 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -9,7 +9,7 @@ const config: QuartzConfig = { analytics: { provider: "plausible", }, - baseUrl: "quartz.jzhao.xyz", + baseUrl: "four.quartz.jzhao.xyz", ignorePatterns: ["private", "templates"], theme: { typography: { diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx index 5300cce4..05aaade1 100644 --- a/quartz/components/pages/TagContent.tsx +++ b/quartz/components/pages/TagContent.tsx @@ -3,7 +3,7 @@ import { Fragment, jsx, jsxs } from "preact/jsx-runtime" import { toJsxRuntime } from "hast-util-to-jsx-runtime" import style from "../styles/listPage.scss" import { PageList } from "../PageList" -import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes } from "../../path" +import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes, joinSegments } from "../../path" import { QuartzPluginData } from "../../plugins/vfile" const numPages = 10 @@ -11,7 +11,7 @@ function TagContent(props: QuartzComponentProps) { const { tree, fileData, allFiles } = props const slug = fileData.slug - if (!slug?.startsWith("tags/")) { + if (!(slug?.startsWith("tags/") || slug === "tags")) { throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`) } @@ -44,7 +44,7 @@ function TagContent(props: QuartzComponentProps) { return (

    - + #{tag}

    diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts index 400c39da..0f7f3e41 100644 --- a/quartz/plugins/emitters/assets.ts +++ b/quartz/plugins/emitters/assets.ts @@ -24,7 +24,7 @@ export const Assets: QuartzEmitterPlugin = () => { const dir = path.dirname(dest) as FilePath await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists await fs.promises.copyFile(src, dest) - res.push(fp) + res.push(dest) } return res diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts index 75bcc746..794cbac6 100644 --- a/quartz/plugins/emitters/static.ts +++ b/quartz/plugins/emitters/static.ts @@ -12,6 +12,6 @@ export const Static: QuartzEmitterPlugin = () => ({ const staticPath = joinSegments(QUARTZ, "static") const fps = await glob("**", staticPath, cfg.configuration.ignorePatterns) await fs.promises.cp(staticPath, joinSegments(argv.output, "static"), { recursive: true }) - return fps.map((fp) => joinSegments("static", fp)) as FilePath[] + return fps.map((fp) => joinSegments(argv.output, "static", fp)) as FilePath[] }, }) diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index 19e2906b..fd00d9c9 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -49,7 +49,7 @@ export const TagPage: QuartzEmitterPlugin = (userOpts) => { return [ tag, defaultProcessedContent({ - slug: joinSegments("tags", tag, "index") as ServerSlug, + slug: joinSegments("tags", tag) as ServerSlug, frontmatter: { title, tags: [] }, }), ] @@ -59,7 +59,7 @@ export const TagPage: QuartzEmitterPlugin = (userOpts) => { for (const [tree, file] of content) { const slug = file.data.slug! if (slug.startsWith("tags/")) { - const tag = joinSegments(slug.slice("tags/".length), "index") + const tag = slug.slice("tags/".length) if (tags.has(tag)) { tagDescriptions[tag] = [tree, file] } From ed62ece491310e75d336db844d8ce56d3d26be31 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 11 Aug 2023 23:27:59 -0700 Subject: [PATCH 0480/1221] fix broken tag listing links to tags --- content/features/private pages.md | 2 +- quartz/components/pages/TagContent.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/features/private pages.md b/content/features/private pages.md index 9be591b8..402e52c2 100644 --- a/content/features/private pages.md +++ b/content/features/private pages.md @@ -1,7 +1,7 @@ --- title: Private Pages tags: -- plugin/filter + - plugin/filter --- There may be some notes you want to avoid publishing as a website. Quartz supports this through two mechanisms which can be used in conjunction: diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx index 05aaade1..5d30240b 100644 --- a/quartz/components/pages/TagContent.tsx +++ b/quartz/components/pages/TagContent.tsx @@ -3,7 +3,7 @@ import { Fragment, jsx, jsxs } from "preact/jsx-runtime" import { toJsxRuntime } from "hast-util-to-jsx-runtime" import style from "../styles/listPage.scss" import { PageList } from "../PageList" -import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes, joinSegments } from "../../path" +import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes } from "../../path" import { QuartzPluginData } from "../../plugins/vfile" const numPages = 10 @@ -44,7 +44,7 @@ function TagContent(props: QuartzComponentProps) { return (

    - + #{tag}

    From 83269ac26e41f8e81b56e000b4347ee60d4ff84b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 11 Aug 2023 23:40:06 -0700 Subject: [PATCH 0481/1221] fix scanning for tags in content --- content/features/upcoming features.md | 4 +--- quartz/plugins/transformers/links.ts | 3 ++- quartz/plugins/transformers/ofm.ts | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 424f0281..718ae170 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -5,10 +5,8 @@ draft: true ## todo - wikilink to anchors in the same document -- folders, tags, and content emit overlapping (e.g. for tags/component) +- blockquote with link in first child broken - 404 using base url -- nested tags showing duplicate - - tag page markdown file for description not being rendered - back button with anchors / popovers + spa is broken - search should be fast for large repos - debounce cfg rebuild on large repos diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 54bcce9e..5b15725a 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -86,7 +86,8 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = if ( opts.prettyLinks && node.children.length === 1 && - node.children[0].type === "text" + node.children[0].type === "text" && + !node.children[0].value.startsWith("#") ) { node.children[0].value = path.basename(node.children[0].value) } diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index e7438aa9..a371efb6 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -115,7 +115,7 @@ const commentRegex = new RegExp(/%%(.+)%%/, "g") const calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/) // (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line // #(\w+) -> tag itself is # followed by a string of alpha-numeric characters -const tagRegex = new RegExp(/(?:^| )#(\w+)/, "g") +const tagRegex = new RegExp(/(?:^| )#([\w-_\/]+)/, "g") export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin | undefined> = ( userOpts, From e1dd6aee863878a02f51200b3878d619220c22f3 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 11 Aug 2023 23:55:17 -0700 Subject: [PATCH 0482/1221] fix wikilinks to anchors in the same document --- content/features/upcoming features.md | 1 - quartz/plugins/transformers/ofm.ts | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 718ae170..728d16a3 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,7 +4,6 @@ draft: true ## todo -- wikilink to anchors in the same document - blockquote with link in first child broken - 404 using base url - back button with anchors / popovers + spa is broken diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index a371efb6..794b554c 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -108,7 +108,7 @@ const capitalize = (s: string): string => { // ([^\[\]\|\#]+) -> one or more non-special characters ([,],|, or #) (name) // (#[^\[\]\|\#]+)? -> # then one or more non-special characters (heading link) // (|[^\[\]\|\#]+)? -> | then one or more non-special characters (alias) -const wikilinkRegex = new RegExp(/!?\[\[([^\[\]\|\#]+)(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/, "g") +const wikilinkRegex = new RegExp(/!?\[\[([^\[\]\|\#]+)?(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/, "g") const highlightRegex = new RegExp(/==(.+)==/, "g") const commentRegex = new RegExp(/%%(.+)%%/, "g") // from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts @@ -161,10 +161,11 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin if (opts.wikilinks) { src = src.toString() return src.replaceAll(wikilinkRegex, (value, ...capture) => { - const [fp, rawHeader, rawAlias] = capture + const [rawFp, rawHeader, rawAlias] = capture + const fp = rawFp ?? "" const anchor = rawHeader?.trim().slice(1) const displayAnchor = anchor ? `#${slugAnchor(anchor)}` : "" - const displayAlias = rawAlias ?? "" + const displayAlias = rawAlias ?? rawHeader?.replace("#", "|") ?? "" const embedDisplay = value.startsWith("!") ? "!" : "" return `${embedDisplay}[[${fp}${displayAnchor}${displayAlias}]]` }) @@ -177,8 +178,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin plugins.push(() => { return (tree: Root, _file) => { findAndReplace(tree, wikilinkRegex, (value: string, ...capture: string[]) => { - let [fp, rawHeader, rawAlias] = capture - fp = fp.trim() + let [rawFp, rawHeader, rawAlias] = capture + const fp = rawFp?.trim() ?? "" const anchor = rawHeader?.trim() ?? "" const alias = rawAlias?.slice(1).trim() From 827dd918476e225238d8412551df2866e4f9e616 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 00:03:11 -0700 Subject: [PATCH 0483/1221] format, make search async --- quartz/components/scripts/search.inline.ts | 4 ++-- quartz/plugins/transformers/ofm.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts index 40d0bc20..9fc0c0e9 100644 --- a/quartz/components/scripts/search.inline.ts +++ b/quartz/components/scripts/search.inline.ts @@ -139,9 +139,9 @@ document.addEventListener("nav", async (e: unknown) => { } } - function onType(e: HTMLElementEventMap["input"]) { + async function onType(e: HTMLElementEventMap["input"]) { const term = (e.target as HTMLInputElement).value - const searchResults = index?.search(term, numSearchResults) ?? [] + const searchResults = (await index?.searchAsync(term, numSearchResults)) ?? [] const getByField = (field: string): CanonicalSlug[] => { const results = searchResults.filter((x) => x.field === field) return results.length === 0 ? [] : ([...results[0].result] as CanonicalSlug[]) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 794b554c..6083a610 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -165,7 +165,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin const fp = rawFp ?? "" const anchor = rawHeader?.trim().slice(1) const displayAnchor = anchor ? `#${slugAnchor(anchor)}` : "" - const displayAlias = rawAlias ?? rawHeader?.replace("#", "|") ?? "" + const displayAlias = rawAlias ?? rawHeader?.replace("#", "|") ?? "" const embedDisplay = value.startsWith("!") ? "!" : "" return `${embedDisplay}[[${fp}${displayAnchor}${displayAlias}]]` }) From 7bffc2183ece33e2d84909a5677dac0ae2563ddd Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 00:24:30 -0700 Subject: [PATCH 0484/1221] include home page in search --- quartz/components/scripts/search.inline.ts | 32 ++++++++++++++-------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts index 9fc0c0e9..a607fe22 100644 --- a/quartz/components/scripts/search.inline.ts +++ b/quartz/components/scripts/search.inline.ts @@ -4,6 +4,7 @@ import { registerEscapeHandler, removeAllChildren } from "./util" import { CanonicalSlug, getClientSlug, resolveRelative } from "../../path" interface Item { + id: number slug: CanonicalSlug title: string content: string @@ -72,6 +73,7 @@ document.addEventListener("nav", async (e: unknown) => { const searchIcon = document.getElementById("search-icon") const searchBar = document.getElementById("search-bar") as HTMLInputElement | null const results = document.getElementById("results-container") + const idDataMap = Object.keys(data) as CanonicalSlug[] function hideSearch() { container?.classList.remove("active") @@ -107,11 +109,15 @@ document.addEventListener("nav", async (e: unknown) => { } } - const formatForDisplay = (term: string, slug: CanonicalSlug) => ({ - slug, - title: highlight(term, data[slug].title ?? ""), - content: highlight(term, data[slug].content ?? "", true), - }) + const formatForDisplay = (term: string, id: number) => { + const slug = idDataMap[id] + return { + id, + slug, + title: highlight(term, data[slug].title ?? ""), + content: highlight(term, data[slug].content ?? "", true), + } + } const resultToHTML = ({ slug, title, content }: Item) => { const button = document.createElement("button") @@ -142,13 +148,14 @@ document.addEventListener("nav", async (e: unknown) => { async function onType(e: HTMLElementEventMap["input"]) { const term = (e.target as HTMLInputElement).value const searchResults = (await index?.searchAsync(term, numSearchResults)) ?? [] - const getByField = (field: string): CanonicalSlug[] => { + console.log(searchResults) + const getByField = (field: string): number[] => { const results = searchResults.filter((x) => x.field === field) - return results.length === 0 ? [] : ([...results[0].result] as CanonicalSlug[]) + return results.length === 0 ? [] : ([...results[0].result] as number[]) } // order titles ahead of content - const allIds: Set = new Set([...getByField("title"), ...getByField("content")]) + const allIds: Set = new Set([...getByField("title"), ...getByField("content")]) const finalResults = [...allIds].map((id) => formatForDisplay(term, id)) displayResults(finalResults) } @@ -168,11 +175,11 @@ document.addEventListener("nav", async (e: unknown) => { optimize: true, encode: encoder, document: { - id: "slug", + id: "id", index: [ { field: "title", - tokenize: "forward", + tokenize: "reverse", }, { field: "content", @@ -182,12 +189,15 @@ document.addEventListener("nav", async (e: unknown) => { }, }) + let id = 0 for (const [slug, fileData] of Object.entries(data)) { - await index.addAsync(slug, { + await index.addAsync(id, { + id, slug: slug as CanonicalSlug, title: fileData.title, content: fileData.content, }) + id++ } } From c55d54f068a102d85dc16c5c0e63db413bc56145 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 10:16:55 -0700 Subject: [PATCH 0485/1221] enable rich text in callout title --- quartz/plugins/transformers/ofm.ts | 86 ++++++++++++++++++------------ quartz/styles/callouts.scss | 5 ++ 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 6083a610..fc56f3f9 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -1,6 +1,6 @@ import { PluggableList } from "unified" import { QuartzTransformerPlugin } from "../types" -import { Root, HTML, BlockContent, DefinitionContent, Code } from "mdast" +import { Root, HTML, BlockContent, DefinitionContent, Code, Paragraph } from "mdast" import { Replace, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace" import { slug as slugAnchor } from "github-slugger" import rehypeRaw from "rehype-raw" @@ -113,6 +113,7 @@ const highlightRegex = new RegExp(/==(.+)==/, "g") const commentRegex = new RegExp(/%%(.+)%%/, "g") // from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts const calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/) +const calloutLineRegex = new RegExp(/^> *\[\!\w+\][+-]?.*$/, "gm") // (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line // #(\w+) -> tag itself is # followed by a string of alpha-numeric characters const tagRegex = new RegExp(/(?:^| )#([\w-_\/]+)/, "g") @@ -122,45 +123,53 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin ) => { const opts = { ...defaultOptions, ...userOpts } + const mdastToHtml = (ast: PhrasingContent | Paragraph) => { + const hast = toHast(ast, { allowDangerousHtml: true })! + return toHtml(hast, { allowDangerousHtml: true }) + } const findAndReplace = opts.enableInHtmlEmbed ? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => { - if (replace) { - const mdastToHtml = (ast: PhrasingContent) => { - const hast = toHast(ast, { allowDangerousHtml: true })! - return toHtml(hast, { allowDangerousHtml: true }) + if (replace) { + visit(tree, "html", (node: HTML) => { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace) + } else { + node.value = node.value.replaceAll(regex, (substring: string, ...args) => { + const replaceValue = replace(substring, ...args) + if (typeof replaceValue === "string") { + return replaceValue + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join("") + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue) + } else { + return substring + } + }) } - - visit(tree, "html", (node: HTML) => { - if (typeof replace === "string") { - node.value = node.value.replace(regex, replace) - } else { - node.value = node.value.replaceAll(regex, (substring: string, ...args) => { - const replaceValue = replace(substring, ...args) - if (typeof replaceValue === "string") { - return replaceValue - } else if (Array.isArray(replaceValue)) { - return replaceValue.map(mdastToHtml).join("") - } else if (typeof replaceValue === "object" && replaceValue !== null) { - return mdastToHtml(replaceValue) - } else { - return substring - } - }) - } - }) - } - - mdastFindReplace(tree, regex, replace) + }) } + + mdastFindReplace(tree, regex, replace) + } : mdastFindReplace return { name: "ObsidianFlavoredMarkdown", textTransform(_ctx, src) { + // pre-transform blockquotes + if (opts.callouts) { + src = src.toString() + src = src.replaceAll(calloutLineRegex, (value) => { + // force newline after title of callout + return value + "\n> " + }) + } + // pre-transform wikilinks (fix anchors to things that may contain illegal syntax e.g. codeblocks, latex) if (opts.wikilinks) { src = src.toString() - return src.replaceAll(wikilinkRegex, (value, ...capture) => { + src = src.replaceAll(wikilinkRegex, (value, ...capture) => { const [rawFp, rawHeader, rawAlias] = capture const fp = rawFp ?? "" const anchor = rawHeader?.trim().slice(1) @@ -170,6 +179,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin return `${embedDisplay}[[${fp}${displayAnchor}${displayAlias}]]` }) } + return src }, markdownPlugins() { @@ -296,14 +306,22 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin ) const collapse = collapseChar === "+" || collapseChar === "-" const defaultState = collapseChar === "-" ? "collapsed" : "expanded" - const title = + const titleContent = match.input.slice(calloutDirective.length).trim() || capitalize(calloutType) + const titleNode: Paragraph = { + type: 'paragraph', + children: [ + {type: 'text', value: titleContent + " "}, + ...restChildren + ] + } + const title = mdastToHtml(titleNode) const toggleIcon = ` ` - const titleNode: HTML = { + const titleHtml: HTML = { type: "html", value: `
    `, } - const blockquoteContent: (BlockContent | DefinitionContent)[] = [titleNode] + const blockquoteContent: (BlockContent | DefinitionContent)[] = [titleHtml] if (remainingText.length > 0) { blockquoteContent.push({ type: "paragraph", @@ -323,7 +341,6 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin type: "text", value: remainingText, }, - ...restChildren, ], }) } @@ -335,9 +352,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin node.data = { hProperties: { ...(node.data?.hProperties ?? {}), - className: `callout ${collapse ? "is-collapsible" : ""} ${ - defaultState === "collapsed" ? "is-collapsed" : "" - }`, + className: `callout ${collapse ? "is-collapsible" : ""} ${defaultState === "collapsed" ? "is-collapsed" : "" + }`, "data-callout": calloutType, "data-callout-fold": collapse, }, diff --git a/quartz/styles/callouts.scss b/quartz/styles/callouts.scss index f26f2cce..149321c8 100644 --- a/quartz/styles/callouts.scss +++ b/quartz/styles/callouts.scss @@ -92,6 +92,11 @@ opacity: 0.8; cursor: pointer; } + + & > .callout-title-inner > p { + color: var(--color); + margin: 0; + } } .callout-icon { From aed3f5fccbe6a70186b339af4716980a5950b989 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 10:17:07 -0700 Subject: [PATCH 0486/1221] fmt --- quartz/plugins/transformers/ofm.ts | 56 ++++++++++++++---------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index fc56f3f9..ba3fb9e5 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -129,29 +129,29 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin } const findAndReplace = opts.enableInHtmlEmbed ? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => { - if (replace) { - visit(tree, "html", (node: HTML) => { - if (typeof replace === "string") { - node.value = node.value.replace(regex, replace) - } else { - node.value = node.value.replaceAll(regex, (substring: string, ...args) => { - const replaceValue = replace(substring, ...args) - if (typeof replaceValue === "string") { - return replaceValue - } else if (Array.isArray(replaceValue)) { - return replaceValue.map(mdastToHtml).join("") - } else if (typeof replaceValue === "object" && replaceValue !== null) { - return mdastToHtml(replaceValue) - } else { - return substring - } - }) - } - }) - } + if (replace) { + visit(tree, "html", (node: HTML) => { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace) + } else { + node.value = node.value.replaceAll(regex, (substring: string, ...args) => { + const replaceValue = replace(substring, ...args) + if (typeof replaceValue === "string") { + return replaceValue + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join("") + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue) + } else { + return substring + } + }) + } + }) + } - mdastFindReplace(tree, regex, replace) - } + mdastFindReplace(tree, regex, replace) + } : mdastFindReplace return { @@ -309,11 +309,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin const titleContent = match.input.slice(calloutDirective.length).trim() || capitalize(calloutType) const titleNode: Paragraph = { - type: 'paragraph', - children: [ - {type: 'text', value: titleContent + " "}, - ...restChildren - ] + type: "paragraph", + children: [{ type: "text", value: titleContent + " " }, ...restChildren], } const title = mdastToHtml(titleNode) @@ -352,8 +349,9 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin node.data = { hProperties: { ...(node.data?.hProperties ?? {}), - className: `callout ${collapse ? "is-collapsible" : ""} ${defaultState === "collapsed" ? "is-collapsed" : "" - }`, + className: `callout ${collapse ? "is-collapsible" : ""} ${ + defaultState === "collapsed" ? "is-collapsed" : "" + }`, "data-callout": calloutType, "data-callout-fold": collapse, }, From 8fd496bbef4bc62315f3a0893177da730d8c4262 Mon Sep 17 00:00:00 2001 From: Sohaib <98542228+sohaibology@users.noreply.github.com> Date: Sat, 12 Aug 2023 16:52:16 -0400 Subject: [PATCH 0487/1221] Update hosting.md (#368) --- content/hosting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/hosting.md b/content/hosting.md index 0ed2335d..0b45764a 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -56,7 +56,7 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch all history for git info - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v3 with: node-version: 18.14 - name: Install Dependencies From c89f8b1a9a20becd982ed0b4bc88b1685a15832d Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 10:33:57 -0700 Subject: [PATCH 0488/1221] fix nested callout folding --- content/features/upcoming features.md | 1 - quartz/components/scripts/callout.inline.ts | 16 ++++++++++++++++ quartz/styles/callouts.scss | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 728d16a3..d2a7617d 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,7 +4,6 @@ draft: true ## todo -- blockquote with link in first child broken - 404 using base url - back button with anchors / popovers + spa is broken - search should be fast for large repos diff --git a/quartz/components/scripts/callout.inline.ts b/quartz/components/scripts/callout.inline.ts index 556ef3cd..d8cf5180 100644 --- a/quartz/components/scripts/callout.inline.ts +++ b/quartz/components/scripts/callout.inline.ts @@ -4,6 +4,22 @@ function toggleCallout(this: HTMLElement) { const collapsed = outerBlock.classList.contains(`is-collapsed`) const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight outerBlock.style.maxHeight = height + `px` + + // walk and adjust height of all parents + let current = outerBlock + let parent = outerBlock.parentElement + while (parent) { + if (!parent.classList.contains(`callout`)) { + return + } + + const collapsed = parent.classList.contains(`is-collapsed`) + const height = collapsed ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight + parent.style.maxHeight = height + `px` + + current = parent + parent = parent.parentElement + } } function setupCallout() { diff --git a/quartz/styles/callouts.scss b/quartz/styles/callouts.scss index 149321c8..ad991658 100644 --- a/quartz/styles/callouts.scss +++ b/quartz/styles/callouts.scss @@ -7,6 +7,7 @@ padding: 0 1rem; overflow-y: hidden; transition: max-height 0.3s ease; + box-sizing: border-box; & > *:nth-child(2) { margin-top: 0; From 6d9ffd6da508743407b3b88a89ed831b53321d59 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 17:44:35 -0700 Subject: [PATCH 0489/1221] 404 page styling on local --- content/features/upcoming features.md | 3 +-- quartz/styles/base.scss | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index d2a7617d..28cb59db 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,9 +4,8 @@ draft: true ## todo -- 404 using base url +- relative links broken - back button with anchors / popovers + spa is broken -- search should be fast for large repos - debounce cfg rebuild on large repos - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock - dereference symlink for npx quartz sync diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index 3fbbf87e..fc23b3a0 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -11,12 +11,13 @@ html { width: 100vw; } -body { +body, section { margin: 0; max-width: 100%; box-sizing: border-box; background-color: var(--light); font-family: var(--bodyFont); + color: var(--darkgray); } .text-highlight { From d6e73f221c3e52ce6591cbd01621530e5f6fd703 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 21:16:34 -0700 Subject: [PATCH 0490/1221] fix relative path resolution logic, add more path tests --- quartz/path.test.ts | 105 ++++++++++++++++++++++++++- quartz/path.ts | 40 +++++++++- quartz/plugins/transformers/links.ts | 40 +++------- quartz/styles/base.scss | 3 +- 4 files changed, 152 insertions(+), 36 deletions(-) diff --git a/quartz/path.test.ts b/quartz/path.test.ts index 480493ef..d86bca5f 100644 --- a/quartz/path.test.ts +++ b/quartz/path.test.ts @@ -1,6 +1,7 @@ import test, { describe } from "node:test" import * as path from "./path" import assert from "node:assert" +import { CanonicalSlug, ServerSlug, TransformOptions } from "./path" describe("typeguards", () => { test("isClientSlug", () => { @@ -137,7 +138,7 @@ describe("transforms", () => { ) }) - describe("slugifyFilePath", () => { + test("slugifyFilePath", () => { asserts( [ ["content/index.md", "content/index"], @@ -154,7 +155,7 @@ describe("transforms", () => { ) }) - describe("transformInternalLink", () => { + test("transformInternalLink", () => { asserts( [ ["", "."], @@ -178,7 +179,7 @@ describe("transforms", () => { ) }) - describe("pathToRoot", () => { + test("pathToRoot", () => { asserts( [ ["", "."], @@ -191,3 +192,101 @@ describe("transforms", () => { ) }) }) + +describe("link strategies", () => { + const allSlugs = ["a/b/c", "a/b/d", "a/b/index", "e/f", "e/g/h", "index"] as ServerSlug[] + + describe("absolute", () => { + const opts: TransformOptions = { + strategy: "absolute", + allSlugs, + } + + test("from a/b/c", () => { + const cur = "a/b/c" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../../a/b/d") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../../a/b") + assert.strictEqual(path.transformLink(cur, "e/f", opts), "../../../e/f") + assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "../../../e/g/h") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../..") + assert.strictEqual(path.transformLink(cur, "index#abc", opts), "../../../#abc") + assert.strictEqual(path.transformLink(cur, "tag/test", opts), "../../../tag/test") + assert.strictEqual(path.transformLink(cur, "a/b/c#test", opts), "../../../a/b/c#test") + }) + + test("from a/b/index", () => { + const cur = "a/b" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../a/b/d") + assert.strictEqual(path.transformLink(cur, "a/b", opts), "../../a/b") + assert.strictEqual(path.transformLink(cur, "index", opts), "../..") + }) + + test("from index", () => { + const cur = "" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "index", opts), ".") + assert.strictEqual(path.transformLink(cur, "a/b/c", opts), "./a/b/c") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b") + }) + }) + + describe("shortest", () => { + const opts: TransformOptions = { + strategy: "shortest", + allSlugs, + } + + test("from a/b/c", () => { + const cur = "a/b/c" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "../../../a/b/d") + assert.strictEqual(path.transformLink(cur, "h", opts), "../../../e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../../a/b") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../..") + }) + + test("from a/b/index", () => { + const cur = "a/b" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "../../a/b/d") + assert.strictEqual(path.transformLink(cur, "h", opts), "../../e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b") + assert.strictEqual(path.transformLink(cur, "index", opts), "../..") + }) + + test("from index", () => { + const cur = "" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "./a/b/d") + assert.strictEqual(path.transformLink(cur, "h", opts), "./e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b") + assert.strictEqual(path.transformLink(cur, "index", opts), ".") + }) + }) + + describe("relative", () => { + const opts: TransformOptions = { + strategy: "relative", + allSlugs, + } + + test("from a/b/c", () => { + const cur = "a/b/c" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "./d") + assert.strictEqual(path.transformLink(cur, "index", opts), ".") + assert.strictEqual(path.transformLink(cur, "../../index", opts), "../..") + assert.strictEqual(path.transformLink(cur, "../../", opts), "../..") + assert.strictEqual(path.transformLink(cur, "../../e/g/h", opts), "../../e/g/h") + }) + + test("from a/b/index", () => { + const cur = "a/b" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "../../index", opts), "../..") + assert.strictEqual(path.transformLink(cur, "../../", opts), "../..") + assert.strictEqual(path.transformLink(cur, "../../e/g/h", opts), "../../e/g/h") + assert.strictEqual(path.transformLink(cur, "c", opts), "./c") + }) + + test("from index", () => { + const cur = "" as CanonicalSlug + assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "./e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b") + }) + }) +}) diff --git a/quartz/path.ts b/quartz/path.ts index e410771a..e5bd0d6d 100644 --- a/quartz/path.ts +++ b/quartz/path.ts @@ -42,6 +42,8 @@ import { slug } from "github-slugger" // └────────────┤ MD File ├─────┴─────────────────┘ // └─────────┘ +export const QUARTZ = "quartz" + /// Utility type to simulate nominal types in TypeScript type SlugLike = string & { __brand: T } @@ -194,7 +196,43 @@ export function getAllSegmentPrefixes(tags: string): string[] { return results } -export const QUARTZ = "quartz" +export interface TransformOptions { + strategy: "absolute" | "relative" | "shortest" + allSlugs: ServerSlug[] +} + +export function transformLink( + src: CanonicalSlug, + target: string, + opts: TransformOptions, +): RelativeURL { + let targetSlug: string = transformInternalLink(target) + + if (opts.strategy === "relative") { + return _addRelativeToStart(targetSlug) as RelativeURL + } else { + targetSlug = _stripSlashes(targetSlug.slice(".".length)) + let [targetCanonical, targetAnchor] = splitAnchor(targetSlug) + + if (opts.strategy === "shortest") { + // if the file name is unique, then it's just the filename + const matchingFileNames = opts.allSlugs.filter((slug) => { + const parts = slug.split("/") + const fileName = parts.at(-1) + return targetCanonical === fileName + }) + + // only match, just use it + if (matchingFileNames.length === 1) { + const targetSlug = canonicalizeServer(matchingFileNames[0]) + return (resolveRelative(src, targetSlug) + targetAnchor) as RelativeURL + } + } + + // if it's not unique, then it's the absolute path from the vault root + return joinSegments(pathToRoot(src), targetSlug) as RelativeURL + } +} function _canonicalize(fp: string): string { fp = _trimSuffix(fp, "index") diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 5b15725a..10b527c9 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -2,13 +2,12 @@ import { QuartzTransformerPlugin } from "../types" import { CanonicalSlug, RelativeURL, + TransformOptions, _stripSlashes, canonicalizeServer, joinSegments, - pathToRoot, - resolveRelative, splitAnchor, - transformInternalLink, + transformLink, } from "../../path" import path from "path" import { visit } from "unist-util-visit" @@ -16,7 +15,7 @@ import isAbsoluteUrl from "is-absolute-url" interface Options { /** How to resolve Markdown paths */ - markdownLinkResolution: "absolute" | "relative" | "shortest" + markdownLinkResolution: TransformOptions["strategy"] /** Strips folders from a link so that it looks nice */ prettyLinks: boolean } @@ -35,34 +34,13 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = () => { return (tree, file) => { const curSlug = canonicalizeServer(file.data.slug!) - const transformLink = (target: string): RelativeURL => { - const targetSlug = _stripSlashes(transformInternalLink(target).slice(".".length)) - let [targetCanonical, targetAnchor] = splitAnchor(targetSlug) - if (opts.markdownLinkResolution === "relative") { - return targetSlug as RelativeURL - } else if (opts.markdownLinkResolution === "shortest") { - // if the file name is unique, then it's just the filename - const matchingFileNames = ctx.allSlugs.filter((slug) => { - const parts = slug.split(path.posix.sep) - const fileName = parts.at(-1) - return targetCanonical === fileName - }) - - // only match, just use it - if (matchingFileNames.length === 1) { - const targetSlug = canonicalizeServer(matchingFileNames[0]) - return (resolveRelative(curSlug, targetSlug) + targetAnchor) as RelativeURL - } - - // if it's not unique, then it's the absolute path from the vault root - // (fall-through case) - } + const outgoing: Set = new Set() - // treat as absolute - return joinSegments(pathToRoot(curSlug), targetSlug) as RelativeURL + const transformOptions: TransformOptions = { + strategy: opts.markdownLinkResolution, + allSlugs: ctx.allSlugs, } - const outgoing: Set = new Set() visit(tree, "element", (node, _index, _parent) => { // rewrite all links if ( @@ -76,7 +54,7 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = // don't process external links or intra-document anchors if (!(isAbsoluteUrl(dest) || dest.startsWith("#"))) { - dest = node.properties.href = transformLink(dest) + dest = node.properties.href = transformLink(curSlug, dest, transformOptions) const canonicalDest = path.posix.normalize(joinSegments(curSlug, dest)) const [destCanonical, _destAnchor] = splitAnchor(canonicalDest) outgoing.add(destCanonical as CanonicalSlug) @@ -102,7 +80,7 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = if (!isAbsoluteUrl(node.properties.src)) { let dest = node.properties.src as RelativeURL const ext = path.extname(node.properties.src) - dest = node.properties.src = transformLink(dest) + dest = node.properties.src = transformLink(curSlug, dest, transformOptions) node.properties.src = dest + ext } } diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss index fc23b3a0..b5e6b273 100644 --- a/quartz/styles/base.scss +++ b/quartz/styles/base.scss @@ -11,7 +11,8 @@ html { width: 100vw; } -body, section { +body, +section { margin: 0; max-width: 100%; box-sizing: border-box; From 4f4b04eeb4f41067e4759bec5c2f5db181150520 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 12 Aug 2023 21:18:51 -0700 Subject: [PATCH 0491/1221] format docs --- content/features/upcoming features.md | 1 - content/hosting.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 28cb59db..6c64f18b 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,7 +4,6 @@ draft: true ## todo -- relative links broken - back button with anchors / popovers + spa is broken - debounce cfg rebuild on large repos - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock diff --git a/content/hosting.md b/content/hosting.md index 0b45764a..c4cc61cf 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -55,7 +55,7 @@ jobs: steps: - uses: actions/checkout@v2 with: - fetch-depth: 0 # Fetch all history for git info + fetch-depth: 0 # Fetch all history for git info - uses: actions/setup-node@v3 with: node-version: 18.14 From f1c9ca495e450ecb62dade70c4b60d86e106f79c Mon Sep 17 00:00:00 2001 From: vintro <77507980+vintrocode@users.noreply.github.com> Date: Sun, 13 Aug 2023 20:19:50 -0400 Subject: [PATCH 0492/1221] docs: note about existing content at same path on different branches --- content/index.md | 2 +- content/migrating from Quartz 3.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/content/index.md b/content/index.md index cf97d31f..45681516 100644 --- a/content/index.md +++ b/content/index.md @@ -37,7 +37,7 @@ This will guide you through initializing your Quartz with content. Once you've d - [[SPA Routing|Ridiculously fast page loads]] and tiny bundle sizes - Fully-customizable parsing, filtering, and page generation through [[making plugins|plugins]] -For a comprehensive list of features, visit the [features page](/features). You can read more the _why_ behind these features on the [[philosophy]] page and a technical overview on the [[architecture]] page. +For a comprehensive list of features, visit the [features page](/features). You can read more about the _why_ behind these features on the [[philosophy]] page and a technical overview on the [[architecture]] page. ### 🚧 Troubleshooting + Updating diff --git a/content/migrating from Quartz 3.md b/content/migrating from Quartz 3.md index d3feb3fb..f322e86f 100644 --- a/content/migrating from Quartz 3.md +++ b/content/migrating from Quartz 3.md @@ -13,6 +13,9 @@ npx quartz create When running `npx quartz create`, you will be prompted as to how to initialize your content folder. Here, you can choose to import or link your previous content folder and Quartz should work just as you expect it to. +> [!note] +> If the existing content folder you'd like to use is at the _same_ path on a different branch, clone the repo again somewhere at a _different_ path in order to use it. + ## Key changes 1. **Removing Hugo and `hugo-obsidian`**: Hugo worked well for earlier versions of Quartz but it also made it hard for people outside of the Golang and Hugo communities to fully understand what Quartz was doing under the hood and be able to properly customize it to their needs. Quartz 4 now uses a Node-based static-site generation process which should lead to a much more helpful error messages and an overall smoother user experience. From 7bde99b4e2d49e30dad1e0d58ccc34c2e7482005 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 13 Aug 2023 17:47:07 -0700 Subject: [PATCH 0493/1221] fix: add trailing slash to local serving --- quartz/bootstrap-cli.mjs | 1 + quartz/path.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index d00a2423..0730f907 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -387,6 +387,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. await serveHandler(req, res, { public: argv.output, directoryListing: false, + trailingSlash: true, }) const status = res.statusCode const statusString = diff --git a/quartz/path.ts b/quartz/path.ts index e5bd0d6d..8588c21f 100644 --- a/quartz/path.ts +++ b/quartz/path.ts @@ -1,4 +1,5 @@ import { slug } from "github-slugger" +// this file must be isomorphic so it can't use node libs (e.g. path) // Quartz Paths // Things in boxes are not actual types but rather sources which these types can be acquired from From 232652149a287054df7e7c5136dafd3f55a79bf0 Mon Sep 17 00:00:00 2001 From: Sohaib <98542228+sohaibology@users.noreply.github.com> Date: Mon, 14 Aug 2023 20:59:47 -0400 Subject: [PATCH 0494/1221] Update hosting.md (#371) --- content/hosting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/hosting.md b/content/hosting.md index c4cc61cf..5cab7601 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -30,9 +30,9 @@ To add a custom domain, check out [Cloudflare's documentation](https://developer Like Quartz 3, you can deploy the site generated by Quartz 4 via GitHub Pages. -In your local Quartz, create a new file `quartz/.github/workflows/deploy.yaml`. +In your local Quartz, create a new file `quartz/.github/workflows/deploy.yml`. -```yaml title="quartz/.github/workflows/deploy.yaml" +```yaml title="quartz/.github/workflows/deploy.yml" name: Deploy Quartz site to GitHub Pages on: From 2f6747b1666316e579c6e7238092ac6a65d00925 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 16 Aug 2023 22:04:15 -0700 Subject: [PATCH 0495/1221] fix relative path resolution in router and link crawling --- content/features/upcoming features.md | 2 - content/hosting.md | 5 +- package-lock.json | 10 --- package.json | 3 +- quartz/bootstrap-cli.mjs | 74 +++++++++++++++---- quartz/build.ts | 12 +-- quartz/components/Backlinks.tsx | 2 +- quartz/components/Head.tsx | 4 +- quartz/components/PageList.tsx | 2 +- quartz/components/PageTitle.tsx | 2 +- quartz/components/TagList.tsx | 2 +- quartz/components/pages/FolderContent.tsx | 2 +- quartz/components/pages/TagContent.tsx | 2 +- quartz/components/renderPage.tsx | 4 +- quartz/components/scripts/graph.inline.ts | 2 +- quartz/components/scripts/search.inline.ts | 2 +- quartz/components/scripts/spa.inline.ts | 2 +- quartz/plugins/emitters/aliases.ts | 2 +- quartz/plugins/emitters/assets.ts | 4 +- quartz/plugins/emitters/componentResources.ts | 8 +- quartz/plugins/emitters/contentIndex.ts | 8 +- quartz/plugins/emitters/contentPage.tsx | 2 +- quartz/plugins/emitters/folderPage.tsx | 8 +- quartz/plugins/emitters/static.ts | 4 +- quartz/plugins/emitters/tagPage.tsx | 4 +- quartz/plugins/index.ts | 6 +- quartz/plugins/transformers/frontmatter.ts | 2 +- quartz/plugins/transformers/links.ts | 2 +- quartz/plugins/transformers/ofm.ts | 6 +- quartz/plugins/types.ts | 6 +- quartz/processors/emit.ts | 10 +-- quartz/processors/filter.ts | 4 +- quartz/processors/parse.ts | 10 +-- quartz/{ => util}/ctx.ts | 2 +- quartz/{ => util}/glob.ts | 0 quartz/{ => util}/log.ts | 0 quartz/{ => util}/path.test.ts | 27 ++++--- quartz/{ => util}/path.ts | 17 +++-- quartz/{ => util}/perf.ts | 0 quartz/{ => util}/resources.tsx | 0 quartz/{ => util}/sourcemap.ts | 0 quartz/{ => util}/theme.ts | 0 quartz/{ => util}/trace.ts | 0 quartz/worker.ts | 2 +- 44 files changed, 160 insertions(+), 106 deletions(-) rename quartz/{ => util}/ctx.ts (87%) rename quartz/{ => util}/glob.ts (100%) rename quartz/{ => util}/log.ts (100%) rename quartz/{ => util}/path.test.ts (96%) rename quartz/{ => util}/path.ts (96%) rename quartz/{ => util}/perf.ts (100%) rename quartz/{ => util}/resources.tsx (100%) rename quartz/{ => util}/sourcemap.ts (100%) rename quartz/{ => util}/theme.ts (100%) rename quartz/{ => util}/trace.ts (100%) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 6c64f18b..8d6c657b 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -8,8 +8,6 @@ draft: true - debounce cfg rebuild on large repos - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock - dereference symlink for npx quartz sync -- test/fix with subpath -- fix docs with deploy from github ## high priority backlog diff --git a/content/hosting.md b/content/hosting.md index 5cab7601..11dff182 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -80,7 +80,10 @@ jobs: uses: actions/deploy-pages@v2 ``` -Then, commit these changes by doing `npx quartz sync`. This should deploy your site to `.github.io/`. +Then: + +1. Head to "Settings" tab of your forked repository and in the sidebar, click "Pages". Under "Source", select "GitHub Actions". +2. Commit these changes by doing `npx quartz sync`. This should deploy your site to `.github.io/`. ### Custom Domain diff --git a/package-lock.json b/package-lock.json index f8eb5a42..4245d618 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,6 @@ "@types/js-yaml": "^4.0.5", "@types/node": "^20.1.2", "@types/pretty-time": "^1.1.2", - "@types/serve-handler": "^6.1.1", "@types/source-map-support": "^0.5.6", "@types/workerpool": "^6.4.0", "@types/ws": "^8.5.5", @@ -1478,15 +1477,6 @@ "integrity": "sha512-4i+Y+O5H80Rh01lY/3Z0hB/UWc4R64ReE83joEpVsIG3iQWpYx66k6pQh1amJNZquKtJQyu/RcfkTtvL0KwssA==", "dev": true }, - "node_modules/@types/serve-handler": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/serve-handler/-/serve-handler-6.1.1.tgz", - "integrity": "sha512-bIwSmD+OV8w0t2e7EWsuQYlGoS1o5aEdVktgkXaa43Zm0qVWi21xaSRb3DQA1UXD+DJ5bRq1Rgu14ZczB+CjIQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/source-map-support": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", diff --git a/package.json b/package.json index 29b46f20..17e46b06 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "scripts": { "check": "tsc --noEmit && npx prettier . --check", "format": "npx prettier . --write", - "test": "tsx ./quartz/path.test.ts", + "test": "tsx ./quartz/util/path.test.ts", "profile": "0x -D prof ./quartz/bootstrap-cli.mjs build --concurrency=1" }, "keywords": [ @@ -89,7 +89,6 @@ "@types/js-yaml": "^4.0.5", "@types/node": "^20.1.2", "@types/pretty-time": "^1.1.2", - "@types/serve-handler": "^6.1.1", "@types/source-map-support": "^0.5.6", "@types/workerpool": "^6.4.0", "@types/ws": "^8.5.5", diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 0730f907..077e31b1 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -74,6 +74,10 @@ const BuildArgv = { default: false, describe: "run a local server to live-preview your Quartz", }, + baseDir: { + string: true, + describe: "base path to serve your local server on", + }, port: { number: true, default: 8080, @@ -384,19 +388,63 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. await build(clientRefresh) const server = http.createServer(async (req, res) => { - await serveHandler(req, res, { - public: argv.output, - directoryListing: false, - trailingSlash: true, - }) - const status = res.statusCode - const statusString = - status >= 200 && status < 300 - ? chalk.green(`[${status}]`) - : status >= 300 && status < 400 - ? chalk.yellow(`[${status}]`) - : chalk.red(`[${status}]`) - console.log(statusString + chalk.grey(` ${req.url}`)) + const serve = async (fp) => { + await serveHandler(req, res, { + public: argv.output, + directoryListing: false, + }) + const status = res.statusCode + const statusString = + status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`) + console.log(statusString + chalk.grey(` ${req.url}`)) + } + + const redirect = (newFp) => { + res.writeHead(301, { + Location: newFp, + }) + console.log(chalk.yellow("[301]") + chalk.grey(` ${req.url} -> ${newFp}`)) + return res.end() + } + + let fp = req.url?.split("?")[0] ?? "/" + + // handle redirects + if (fp.endsWith("/")) { + // /trailing/ + // does /trailing/index.html exist? if so, serve it + const indexFp = path.posix.join(fp, "index.html") + if (fs.existsSync(path.posix.join(argv.output, indexFp))) { + return serve(indexFp) + } + + // does /trailing.html exist? if so, redirect to /trailing + let base = fp.slice(0, -1) + if (path.extname(base) === "") { + base += ".html" + } + if (fs.existsSync(path.posix.join(argv.output, base))) { + return redirect(base) + } + } else { + // /regular + // does /regular.html exist? if so, serve it + let base = fp + if (path.extname(base) === "") { + base += ".html" + } + if (fs.existsSync(path.posix.join(argv.output, base))) { + return serve(base) + } + + // does /regular/index.html exist? if so, redirect to /regular/ + let indexFp = path.posix.join(fp, "index.html") + if (fs.existsSync(path.posix.join(argv.output, indexFp))) { + return redirect(fp + "/") + } + } + + return serve(fp) }) server.listen(argv.port) console.log(chalk.cyan(`Started a Quartz server listening at http://localhost:${argv.port}`)) diff --git a/quartz/build.ts b/quartz/build.ts index c25efbf4..779ab35e 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -1,7 +1,7 @@ import sourceMapSupport from "source-map-support" sourceMapSupport.install(options) import path from "path" -import { PerfTimer } from "./perf" +import { PerfTimer } from "./util/perf" import { rimraf } from "rimraf" import { isGitIgnored } from "globby" import chalk from "chalk" @@ -9,13 +9,13 @@ import { parseMarkdown } from "./processors/parse" import { filterContent } from "./processors/filter" import { emitContent } from "./processors/emit" import cfg from "../quartz.config" -import { FilePath, joinSegments, slugifyFilePath } from "./path" +import { FilePath, joinSegments, slugifyFilePath } from "./util/path" import chokidar from "chokidar" import { ProcessedContent } from "./plugins/vfile" -import { Argv, BuildCtx } from "./ctx" -import { glob, toPosixPath } from "./glob" -import { trace } from "./trace" -import { options } from "./sourcemap" +import { Argv, BuildCtx } from "./util/ctx" +import { glob, toPosixPath } from "./util/glob" +import { trace } from "./util/trace" +import { options } from "./util/sourcemap" async function buildQuartz(argv: Argv, clientRefresh: () => void) { const ctx: BuildCtx = { diff --git a/quartz/components/Backlinks.tsx b/quartz/components/Backlinks.tsx index 575e6133..8cf3afa2 100644 --- a/quartz/components/Backlinks.tsx +++ b/quartz/components/Backlinks.tsx @@ -1,6 +1,6 @@ import { QuartzComponentConstructor, QuartzComponentProps } from "./types" import style from "./styles/backlinks.scss" -import { canonicalizeServer, resolveRelative } from "../path" +import { canonicalizeServer, resolveRelative } from "../util/path" function Backlinks({ fileData, allFiles }: QuartzComponentProps) { const slug = canonicalizeServer(fileData.slug!) diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx index 0651b95b..bfeb3f13 100644 --- a/quartz/components/Head.tsx +++ b/quartz/components/Head.tsx @@ -1,5 +1,5 @@ -import { canonicalizeServer, pathToRoot } from "../path" -import { JSResourceToScriptElement } from "../resources" +import { canonicalizeServer, pathToRoot } from "../util/path" +import { JSResourceToScriptElement } from "../util/resources" import { QuartzComponentConstructor, QuartzComponentProps } from "./types" export default (() => { diff --git a/quartz/components/PageList.tsx b/quartz/components/PageList.tsx index 7183acb8..83b1b070 100644 --- a/quartz/components/PageList.tsx +++ b/quartz/components/PageList.tsx @@ -1,4 +1,4 @@ -import { CanonicalSlug, canonicalizeServer, resolveRelative } from "../path" +import { CanonicalSlug, canonicalizeServer, resolveRelative } from "../util/path" import { QuartzPluginData } from "../plugins/vfile" import { Date } from "./Date" import { QuartzComponentProps } from "./types" diff --git a/quartz/components/PageTitle.tsx b/quartz/components/PageTitle.tsx index f6319ef9..c1e74f38 100644 --- a/quartz/components/PageTitle.tsx +++ b/quartz/components/PageTitle.tsx @@ -1,4 +1,4 @@ -import { canonicalizeServer, pathToRoot } from "../path" +import { canonicalizeServer, pathToRoot } from "../util/path" import { QuartzComponentConstructor, QuartzComponentProps } from "./types" function PageTitle({ fileData, cfg }: QuartzComponentProps) { diff --git a/quartz/components/TagList.tsx b/quartz/components/TagList.tsx index 65600350..bf5badd8 100644 --- a/quartz/components/TagList.tsx +++ b/quartz/components/TagList.tsx @@ -1,4 +1,4 @@ -import { canonicalizeServer, pathToRoot, slugTag } from "../path" +import { canonicalizeServer, pathToRoot, slugTag } from "../util/path" import { QuartzComponentConstructor, QuartzComponentProps } from "./types" function TagList({ fileData }: QuartzComponentProps) { diff --git a/quartz/components/pages/FolderContent.tsx b/quartz/components/pages/FolderContent.tsx index ea7ab5e5..60379308 100644 --- a/quartz/components/pages/FolderContent.tsx +++ b/quartz/components/pages/FolderContent.tsx @@ -5,7 +5,7 @@ import path from "path" import style from "../styles/listPage.scss" import { PageList } from "../PageList" -import { canonicalizeServer } from "../../path" +import { canonicalizeServer } from "../../util/path" function FolderContent(props: QuartzComponentProps) { const { tree, fileData, allFiles } = props diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx index 5d30240b..2cae40de 100644 --- a/quartz/components/pages/TagContent.tsx +++ b/quartz/components/pages/TagContent.tsx @@ -3,7 +3,7 @@ import { Fragment, jsx, jsxs } from "preact/jsx-runtime" import { toJsxRuntime } from "hast-util-to-jsx-runtime" import style from "../styles/listPage.scss" import { PageList } from "../PageList" -import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes } from "../../path" +import { ServerSlug, canonicalizeServer, getAllSegmentPrefixes } from "../../util/path" import { QuartzPluginData } from "../../plugins/vfile" const numPages = 10 diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index ab93709c..171c4146 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -2,8 +2,8 @@ import { render } from "preact-render-to-string" import { QuartzComponent, QuartzComponentProps } from "./types" import HeaderConstructor from "./Header" import BodyConstructor from "./Body" -import { JSResourceToScriptElement, StaticResources } from "../resources" -import { CanonicalSlug, pathToRoot } from "../path" +import { JSResourceToScriptElement, StaticResources } from "../util/resources" +import { CanonicalSlug, pathToRoot } from "../util/path" interface RenderComponents { head: QuartzComponent diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts index f3f5cbd0..0a7c19ee 100644 --- a/quartz/components/scripts/graph.inline.ts +++ b/quartz/components/scripts/graph.inline.ts @@ -1,7 +1,7 @@ import type { ContentDetails } from "../../plugins/emitters/contentIndex" import * as d3 from "d3" import { registerEscapeHandler, removeAllChildren } from "./util" -import { CanonicalSlug, getCanonicalSlug, getClientSlug, resolveRelative } from "../../path" +import { CanonicalSlug, getCanonicalSlug, getClientSlug, resolveRelative } from "../../util/path" type NodeData = { id: CanonicalSlug diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts index a607fe22..5c7dae01 100644 --- a/quartz/components/scripts/search.inline.ts +++ b/quartz/components/scripts/search.inline.ts @@ -1,7 +1,7 @@ import { Document } from "flexsearch" import { ContentDetails } from "../../plugins/emitters/contentIndex" import { registerEscapeHandler, removeAllChildren } from "./util" -import { CanonicalSlug, getClientSlug, resolveRelative } from "../../path" +import { CanonicalSlug, getClientSlug, resolveRelative } from "../../util/path" interface Item { id: number diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts index 4d31b5e2..7e450b76 100644 --- a/quartz/components/scripts/spa.inline.ts +++ b/quartz/components/scripts/spa.inline.ts @@ -1,5 +1,5 @@ import micromorph from "micromorph" -import { CanonicalSlug, RelativeURL, getCanonicalSlug } from "../../path" +import { CanonicalSlug, RelativeURL, getCanonicalSlug } from "../../util/path" // adapted from `micromorph` // https://github.com/natemoo-re/micromorph diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts index cf99d29d..1fbea769 100644 --- a/quartz/plugins/emitters/aliases.ts +++ b/quartz/plugins/emitters/aliases.ts @@ -4,7 +4,7 @@ import { ServerSlug, canonicalizeServer, resolveRelative, -} from "../../path" +} from "../../util/path" import { QuartzEmitterPlugin } from "../types" import path from "path" diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts index 0f7f3e41..44bb7185 100644 --- a/quartz/plugins/emitters/assets.ts +++ b/quartz/plugins/emitters/assets.ts @@ -1,8 +1,8 @@ -import { FilePath, joinSegments, slugifyFilePath } from "../../path" +import { FilePath, joinSegments, slugifyFilePath } from "../../util/path" import { QuartzEmitterPlugin } from "../types" import path from "path" import fs from "fs" -import { glob } from "../../glob" +import { glob } from "../../util/glob" export const Assets: QuartzEmitterPlugin = () => { return { diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index 859109fc..19eddc64 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -1,4 +1,4 @@ -import { FilePath, ServerSlug } from "../../path" +import { FilePath, ServerSlug } from "../../util/path" import { QuartzEmitterPlugin } from "../types" // @ts-ignore @@ -9,10 +9,10 @@ import plausibleScript from "../../components/scripts/plausible.inline" import popoverScript from "../../components/scripts/popover.inline" import styles from "../../styles/base.scss" import popoverStyle from "../../components/styles/popover.scss" -import { BuildCtx } from "../../ctx" -import { StaticResources } from "../../resources" +import { BuildCtx } from "../../util/ctx" +import { StaticResources } from "../../util/resources" import { QuartzComponent } from "../../components/types" -import { googleFontHref, joinStyles } from "../../theme" +import { googleFontHref, joinStyles } from "../../util/theme" import { Features, transform } from "lightningcss" type ComponentResources = { diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts index f3a0281e..85cdfe71 100644 --- a/quartz/plugins/emitters/contentIndex.ts +++ b/quartz/plugins/emitters/contentIndex.ts @@ -1,5 +1,11 @@ import { GlobalConfiguration } from "../../cfg" -import { CanonicalSlug, ClientSlug, FilePath, ServerSlug, canonicalizeServer } from "../../path" +import { + CanonicalSlug, + ClientSlug, + FilePath, + ServerSlug, + canonicalizeServer, +} from "../../util/path" import { QuartzEmitterPlugin } from "../types" import path from "path" diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx index dcf28290..b7e347aa 100644 --- a/quartz/plugins/emitters/contentPage.tsx +++ b/quartz/plugins/emitters/contentPage.tsx @@ -4,7 +4,7 @@ import HeaderConstructor from "../../components/Header" import BodyConstructor from "../../components/Body" import { pageResources, renderPage } from "../../components/renderPage" import { FullPageLayout } from "../../cfg" -import { FilePath, canonicalizeServer } from "../../path" +import { FilePath, canonicalizeServer } from "../../util/path" import { defaultContentPageLayout, sharedPageComponents } from "../../../quartz.layout" import { Content } from "../../components" diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index f5bc7a6a..724717a2 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -6,7 +6,13 @@ import { pageResources, renderPage } from "../../components/renderPage" import { ProcessedContent, defaultProcessedContent } from "../vfile" import { FullPageLayout } from "../../cfg" import path from "path" -import { CanonicalSlug, FilePath, ServerSlug, canonicalizeServer, joinSegments } from "../../path" +import { + CanonicalSlug, + FilePath, + ServerSlug, + canonicalizeServer, + joinSegments, +} from "../../util/path" import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" import { FolderContent } from "../../components" diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts index 794cbac6..6f5d19d4 100644 --- a/quartz/plugins/emitters/static.ts +++ b/quartz/plugins/emitters/static.ts @@ -1,7 +1,7 @@ -import { FilePath, QUARTZ, joinSegments } from "../../path" +import { FilePath, QUARTZ, joinSegments } from "../../util/path" import { QuartzEmitterPlugin } from "../types" import fs from "fs" -import { glob } from "../../glob" +import { glob } from "../../util/glob" export const Static: QuartzEmitterPlugin = () => ({ name: "Static", diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index fd00d9c9..de076233 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -11,7 +11,7 @@ import { ServerSlug, getAllSegmentPrefixes, joinSegments, -} from "../../path" +} from "../../util/path" import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" import { TagContent } from "../../components" @@ -41,7 +41,7 @@ export const TagPage: QuartzEmitterPlugin = (userOpts) => { allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes), ) // add base tag - tags.add("") + tags.add("index") const tagDescriptions: Record = Object.fromEntries( [...tags].map((tag) => { diff --git a/quartz/plugins/index.ts b/quartz/plugins/index.ts index 23440fbe..c83455e4 100644 --- a/quartz/plugins/index.ts +++ b/quartz/plugins/index.ts @@ -1,6 +1,6 @@ -import { StaticResources } from "../resources" -import { FilePath, ServerSlug } from "../path" -import { BuildCtx } from "../ctx" +import { StaticResources } from "../util/resources" +import { FilePath, ServerSlug } from "../util/path" +import { BuildCtx } from "../util/ctx" export function getStaticResourcesFromPlugins(ctx: BuildCtx) { const staticResources: StaticResources = { diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts index e09d20f7..5b067f63 100644 --- a/quartz/plugins/transformers/frontmatter.ts +++ b/quartz/plugins/transformers/frontmatter.ts @@ -2,7 +2,7 @@ import matter from "gray-matter" import remarkFrontmatter from "remark-frontmatter" import { QuartzTransformerPlugin } from "../types" import yaml from "js-yaml" -import { slugTag } from "../../path" +import { slugTag } from "../../util/path" export interface Options { delims: string | string[] diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index 10b527c9..a2607196 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -8,7 +8,7 @@ import { joinSegments, splitAnchor, transformLink, -} from "../../path" +} from "../../util/path" import path from "path" import { visit } from "unist-util-visit" import isAbsoluteUrl from "is-absolute-url" diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index ba3fb9e5..97054b1f 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -6,10 +6,10 @@ import { slug as slugAnchor } from "github-slugger" import rehypeRaw from "rehype-raw" import { visit } from "unist-util-visit" import path from "path" -import { JSResource } from "../../resources" +import { JSResource } from "../../util/resources" // @ts-ignore import calloutScript from "../../components/scripts/callout.inline.ts" -import { FilePath, canonicalizeServer, pathToRoot, slugTag, slugifyFilePath } from "../../path" +import { FilePath, canonicalizeServer, pathToRoot, slugTag, slugifyFilePath } from "../../util/path" import { toHast } from "mdast-util-to-hast" import { toHtml } from "hast-util-to-html" import { PhrasingContent } from "mdast-util-find-and-replace/lib" @@ -294,7 +294,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin } const text = firstChild.children[0].value - const restChildren = firstChild.children.splice(1) + const restChildren = firstChild.children.slice(1) const [firstLine, ...remainingLines] = text.split("\n") const remainingText = remainingLines.join("\n") diff --git a/quartz/plugins/types.ts b/quartz/plugins/types.ts index 2662aeda..ad1881b8 100644 --- a/quartz/plugins/types.ts +++ b/quartz/plugins/types.ts @@ -1,9 +1,9 @@ import { PluggableList } from "unified" -import { StaticResources } from "../resources" +import { StaticResources } from "../util/resources" import { ProcessedContent } from "./vfile" import { QuartzComponent } from "../components/types" -import { FilePath, ServerSlug } from "../path" -import { BuildCtx } from "../ctx" +import { FilePath, ServerSlug } from "../util/path" +import { BuildCtx } from "../util/ctx" export interface PluginTypes { transformers: QuartzTransformerPluginInstance[] diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts index fd326856..3b357aa9 100644 --- a/quartz/processors/emit.ts +++ b/quartz/processors/emit.ts @@ -1,13 +1,13 @@ import path from "path" import fs from "fs" -import { PerfTimer } from "../perf" +import { PerfTimer } from "../util/perf" import { getStaticResourcesFromPlugins } from "../plugins" import { EmitCallback } from "../plugins/types" import { ProcessedContent } from "../plugins/vfile" -import { FilePath, joinSegments } from "../path" -import { QuartzLogger } from "../log" -import { trace } from "../trace" -import { BuildCtx } from "../ctx" +import { FilePath, joinSegments } from "../util/path" +import { QuartzLogger } from "../util/log" +import { trace } from "../util/trace" +import { BuildCtx } from "../util/ctx" export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) { const { argv, cfg } = ctx diff --git a/quartz/processors/filter.ts b/quartz/processors/filter.ts index dae6a3d2..b269fb31 100644 --- a/quartz/processors/filter.ts +++ b/quartz/processors/filter.ts @@ -1,5 +1,5 @@ -import { BuildCtx } from "../ctx" -import { PerfTimer } from "../perf" +import { BuildCtx } from "../util/ctx" +import { PerfTimer } from "../util/perf" import { ProcessedContent } from "../plugins/vfile" export function filterContent(ctx: BuildCtx, content: ProcessedContent[]): ProcessedContent[] { diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index 00155279..29f92fc4 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -5,14 +5,14 @@ import { Processor, unified } from "unified" import { Root as MDRoot } from "remark-parse/lib" import { Root as HTMLRoot } from "hast" import { ProcessedContent } from "../plugins/vfile" -import { PerfTimer } from "../perf" +import { PerfTimer } from "../util/perf" import { read } from "to-vfile" -import { FilePath, QUARTZ, slugifyFilePath } from "../path" +import { FilePath, QUARTZ, slugifyFilePath } from "../util/path" import path from "path" import workerpool, { Promise as WorkerPromise } from "workerpool" -import { QuartzLogger } from "../log" -import { trace } from "../trace" -import { BuildCtx } from "../ctx" +import { QuartzLogger } from "../util/log" +import { trace } from "../util/trace" +import { BuildCtx } from "../util/ctx" export type QuartzProcessor = Processor export function createProcessor(ctx: BuildCtx): QuartzProcessor { diff --git a/quartz/ctx.ts b/quartz/util/ctx.ts similarity index 87% rename from quartz/ctx.ts rename to quartz/util/ctx.ts index dad5cef5..b1278398 100644 --- a/quartz/ctx.ts +++ b/quartz/util/ctx.ts @@ -1,4 +1,4 @@ -import { QuartzConfig } from "./cfg" +import { QuartzConfig } from "../cfg" import { ServerSlug } from "./path" export interface Argv { diff --git a/quartz/glob.ts b/quartz/util/glob.ts similarity index 100% rename from quartz/glob.ts rename to quartz/util/glob.ts diff --git a/quartz/log.ts b/quartz/util/log.ts similarity index 100% rename from quartz/log.ts rename to quartz/util/log.ts diff --git a/quartz/path.test.ts b/quartz/util/path.test.ts similarity index 96% rename from quartz/path.test.ts rename to quartz/util/path.test.ts index d86bca5f..5655585d 100644 --- a/quartz/path.test.ts +++ b/quartz/util/path.test.ts @@ -53,8 +53,6 @@ describe("typeguards", () => { assert(!path.isRelativeURL("abc")) assert(!path.isRelativeURL("/abc/def")) assert(!path.isRelativeURL("")) - assert(!path.isRelativeURL("../")) - assert(!path.isRelativeURL("./")) assert(!path.isRelativeURL("./abc/def.html")) assert(!path.isRelativeURL("./abc/def.md")) }) @@ -160,17 +158,18 @@ describe("transforms", () => { [ ["", "."], [".", "."], - ["./", "."], - ["./index", "."], - ["./index.html", "."], - ["./index.md", "."], + ["./", "./"], + ["./index", "./"], + ["./index.html", "./"], + ["./index.md", "./"], ["content", "./content"], ["content/test.md", "./content/test"], ["./content/test.md", "./content/test"], ["../content/test.md", "../content/test"], - ["tags/", "./tags"], - ["/tags/", "./tags"], + ["tags/", "./tags/"], + ["/tags/", "./tags/"], ["content/with spaces", "./content/with-spaces"], + ["content/with spaces/index", "./content/with-spaces/"], ["content/with spaces#and Anchor!", "./content/with-spaces#and-anchor"], ], path.transformInternalLink, @@ -269,16 +268,16 @@ describe("link strategies", () => { test("from a/b/c", () => { const cur = "a/b/c" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "d", opts), "./d") - assert.strictEqual(path.transformLink(cur, "index", opts), ".") - assert.strictEqual(path.transformLink(cur, "../../index", opts), "../..") - assert.strictEqual(path.transformLink(cur, "../../", opts), "../..") + assert.strictEqual(path.transformLink(cur, "index", opts), "./") + assert.strictEqual(path.transformLink(cur, "../../index", opts), "../../") + assert.strictEqual(path.transformLink(cur, "../../", opts), "../../") assert.strictEqual(path.transformLink(cur, "../../e/g/h", opts), "../../e/g/h") }) test("from a/b/index", () => { const cur = "a/b" as CanonicalSlug - assert.strictEqual(path.transformLink(cur, "../../index", opts), "../..") - assert.strictEqual(path.transformLink(cur, "../../", opts), "../..") + assert.strictEqual(path.transformLink(cur, "../../index", opts), "../../") + assert.strictEqual(path.transformLink(cur, "../../", opts), "../../") assert.strictEqual(path.transformLink(cur, "../../e/g/h", opts), "../../e/g/h") assert.strictEqual(path.transformLink(cur, "c", opts), "./c") }) @@ -286,7 +285,7 @@ describe("link strategies", () => { test("from index", () => { const cur = "" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "./e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") }) }) }) diff --git a/quartz/path.ts b/quartz/util/path.ts similarity index 96% rename from quartz/path.ts rename to quartz/util/path.ts index 8588c21f..c1016af5 100644 --- a/quartz/path.ts +++ b/quartz/util/path.ts @@ -71,7 +71,7 @@ export function isCanonicalSlug(s: string): s is CanonicalSlug { export type RelativeURL = SlugLike<"relative"> export function isRelativeURL(s: string): s is RelativeURL { const validStart = /^\.{1,2}/.test(s) - const validEnding = !(s.endsWith("/") || s.endsWith("/index") || s === "index") + const validEnding = !(s.endsWith("/index") || s === "index") return validStart && validEnding && !_hasFileExtension(s) } @@ -133,6 +133,12 @@ export function slugifyFilePath(fp: FilePath): ServerSlug { export function transformInternalLink(link: string): RelativeURL { let [fplike, anchor] = splitAnchor(decodeURI(link)) + + const folderPath = + fplike.endsWith("index") || + fplike.endsWith("index.md") || + fplike.endsWith("index.html") || + fplike.endsWith("/") let segments = fplike.split("/").filter((x) => x.length > 0) let prefix = segments.filter(_isRelativeSegment).join("/") let fp = segments.filter((seg) => !_isRelativeSegment(seg)).join("/") @@ -143,14 +149,13 @@ export function transformInternalLink(link: string): RelativeURL { } fp = canonicalizeServer(slugifyFilePath(fp as FilePath)) - fp = _trimSuffix(fp, "index") - - let joined = joinSegments(_stripSlashes(prefix), _stripSlashes(fp)) - const res = (_addRelativeToStart(joined) + anchor) as RelativeURL + const joined = joinSegments(_stripSlashes(prefix), _stripSlashes(fp)) + const trail = folderPath ? "/" : "" + const res = (_addRelativeToStart(joined) + anchor + trail) as RelativeURL return res } -// resolve /a/b/c to ../../ +// resolve /a/b/c to ../../.. export function pathToRoot(slug: CanonicalSlug): RelativeURL { let rootPath = slug .split("/") diff --git a/quartz/perf.ts b/quartz/util/perf.ts similarity index 100% rename from quartz/perf.ts rename to quartz/util/perf.ts diff --git a/quartz/resources.tsx b/quartz/util/resources.tsx similarity index 100% rename from quartz/resources.tsx rename to quartz/util/resources.tsx diff --git a/quartz/sourcemap.ts b/quartz/util/sourcemap.ts similarity index 100% rename from quartz/sourcemap.ts rename to quartz/util/sourcemap.ts diff --git a/quartz/theme.ts b/quartz/util/theme.ts similarity index 100% rename from quartz/theme.ts rename to quartz/util/theme.ts diff --git a/quartz/trace.ts b/quartz/util/trace.ts similarity index 100% rename from quartz/trace.ts rename to quartz/util/trace.ts diff --git a/quartz/worker.ts b/quartz/worker.ts index db11cbbc..d42bc251 100644 --- a/quartz/worker.ts +++ b/quartz/worker.ts @@ -1,7 +1,7 @@ import sourceMapSupport from "source-map-support" sourceMapSupport.install(options) import cfg from "../quartz.config" -import { Argv, BuildCtx } from "./ctx" +import { Argv, BuildCtx } from "./util/ctx" import { FilePath, ServerSlug } from "./path" import { createFileParser, createProcessor } from "./processors/parse" import { options } from "./sourcemap" From 2dc0ae279cae87e37c94c42d4ad87107f2a5b5d2 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Wed, 16 Aug 2023 22:09:11 -0700 Subject: [PATCH 0496/1221] fix import paths --- quartz/cfg.ts | 2 +- quartz/components/types.ts | 2 +- quartz/worker.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/quartz/cfg.ts b/quartz/cfg.ts index 3c9613b7..e3fee360 100644 --- a/quartz/cfg.ts +++ b/quartz/cfg.ts @@ -1,6 +1,6 @@ import { QuartzComponent } from "./components/types" import { PluginTypes } from "./plugins/types" -import { Theme } from "./theme" +import { Theme } from "./util/theme" export type Analytics = | null diff --git a/quartz/components/types.ts b/quartz/components/types.ts index 803ada91..fd9574f5 100644 --- a/quartz/components/types.ts +++ b/quartz/components/types.ts @@ -1,5 +1,5 @@ import { ComponentType, JSX } from "preact" -import { StaticResources } from "../resources" +import { StaticResources } from "../util/resources" import { QuartzPluginData } from "../plugins/vfile" import { GlobalConfiguration } from "../cfg" import { Node } from "hast" diff --git a/quartz/worker.ts b/quartz/worker.ts index d42bc251..3bd7ea79 100644 --- a/quartz/worker.ts +++ b/quartz/worker.ts @@ -2,9 +2,9 @@ import sourceMapSupport from "source-map-support" sourceMapSupport.install(options) import cfg from "../quartz.config" import { Argv, BuildCtx } from "./util/ctx" -import { FilePath, ServerSlug } from "./path" +import { FilePath, ServerSlug } from "./util/path" import { createFileParser, createProcessor } from "./processors/parse" -import { options } from "./sourcemap" +import { options } from "./util/sourcemap" // only called from worker thread export async function parseFiles(argv: Argv, fps: FilePath[], allSlugs: ServerSlug[]) { From 0c199975f2d469ecdfd7efcf2ddd16ffa1dc492b Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 00:55:28 -0700 Subject: [PATCH 0497/1221] various path fixes for links to extensions, fix relative paths in links --- content/advanced/making plugins.md | 2 +- content/configuration.md | 2 +- content/features/upcoming features.md | 2 + content/hosting.md | 2 +- .../{dns-records.png => dns records.png} | Bin .../{quartz-layout.png => quartz layout.png} | Bin ...line.png => quartz transform pipeline.png} | Bin content/layout.md | 2 +- quartz/bootstrap-cli.mjs | 20 ++++--- quartz/components/scripts/spa.inline.ts | 3 +- quartz/plugins/emitters/assets.ts | 2 +- quartz/plugins/transformers/lastmod.ts | 1 + quartz/plugins/transformers/links.ts | 3 +- quartz/plugins/transformers/ofm.ts | 2 +- quartz/util/path.test.ts | 55 ++++++++++++------ quartz/util/path.ts | 33 ++++++----- 16 files changed, 77 insertions(+), 52 deletions(-) rename content/images/{dns-records.png => dns records.png} (100%) rename content/images/{quartz-layout.png => quartz layout.png} (100%) rename content/images/{quartz-transform-pipeline.png => quartz transform pipeline.png} (100%) diff --git a/content/advanced/making plugins.md b/content/advanced/making plugins.md index 2de32008..1f1616f4 100644 --- a/content/advanced/making plugins.md +++ b/content/advanced/making plugins.md @@ -7,7 +7,7 @@ title: Making your own plugins Quartz's plugins are a series of transformations over content. This is illustrated in the diagram of the processing pipeline below: -![[quartz-transform-pipeline.png]] +![[quartz transform pipeline.png]] All plugins are defined as a function that takes in a single parameter for options `type OptionType = object | undefined` and return an object that corresponds to the type of plugin it is. diff --git a/content/configuration.md b/content/configuration.md index 182a87b2..763a27a9 100644 --- a/content/configuration.md +++ b/content/configuration.md @@ -50,7 +50,7 @@ This part of the configuration concerns anything that can affect the whole site. You can think of Quartz plugins as a series of transformations over content. -![[quartz-transform-pipeline.png]] +![[quartz transform pipeline.png]] ```ts plugins: { diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 8d6c657b..bbf962bc 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,6 +4,8 @@ draft: true ## todo +- static icon path (in head) never gets updated + - do we update relative links on spa? - back button with anchors / popovers + spa is broken - debounce cfg rebuild on large repos - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock diff --git a/content/hosting.md b/content/hosting.md index 11dff182..1e900a5b 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -100,7 +100,7 @@ Here's how to add a custom domain to your GitHub pages deployment. - `185.199.111.153` - If you are using a subdomain, navigate to your DNS provider and create a `CNAME` record that points your subdomain to the default domain for your site. For example, if you want to use the subdomain `quartz.example.com` for your user site, create a `CNAME` record that points `quartz.example.com` to `.github.io`. -![[dns-records.png]]_The above shows a screenshot of Google Domains configured for both `jzhao.xyz` (an apex domain) and `quartz.jzhao.xyz` (a subdomain)._ +![[dns records.png]]_The above shows a screenshot of Google Domains configured for both `jzhao.xyz` (an apex domain) and `quartz.jzhao.xyz` (a subdomain)._ See the [GitHub documentation](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain) for more detail about how to setup your own custom domain with GitHub Pages. diff --git a/content/images/dns-records.png b/content/images/dns records.png similarity index 100% rename from content/images/dns-records.png rename to content/images/dns records.png diff --git a/content/images/quartz-layout.png b/content/images/quartz layout.png similarity index 100% rename from content/images/quartz-layout.png rename to content/images/quartz layout.png diff --git a/content/images/quartz-transform-pipeline.png b/content/images/quartz transform pipeline.png similarity index 100% rename from content/images/quartz-transform-pipeline.png rename to content/images/quartz transform pipeline.png diff --git a/content/layout.md b/content/layout.md index 80171007..8a74b911 100644 --- a/content/layout.md +++ b/content/layout.md @@ -20,7 +20,7 @@ export interface FullPageLayout { These correspond to following parts of the page: -![[quartz-layout.png|800]] +![[quartz layout.png|800]] > [!note] > There are two additional layout fields that are _not_ shown in the above diagram. diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 077e31b1..8551e764 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -388,7 +388,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. await build(clientRefresh) const server = http.createServer(async (req, res) => { - const serve = async (fp) => { + const serve = async () => { await serveHandler(req, res, { public: argv.output, directoryListing: false, @@ -400,11 +400,11 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. } const redirect = (newFp) => { - res.writeHead(301, { + res.writeHead(302, { Location: newFp, }) - console.log(chalk.yellow("[301]") + chalk.grey(` ${req.url} -> ${newFp}`)) - return res.end() + console.log(chalk.yellow("[302]") + chalk.grey(` ${req.url} -> ${newFp}`)) + res.end() } let fp = req.url?.split("?")[0] ?? "/" @@ -415,7 +415,8 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. // does /trailing/index.html exist? if so, serve it const indexFp = path.posix.join(fp, "index.html") if (fs.existsSync(path.posix.join(argv.output, indexFp))) { - return serve(indexFp) + req.url = fp + return serve() } // does /trailing.html exist? if so, redirect to /trailing @@ -424,7 +425,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. base += ".html" } if (fs.existsSync(path.posix.join(argv.output, base))) { - return redirect(base) + return redirect(fp.slice(0, -1)) } } else { // /regular @@ -434,7 +435,8 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. base += ".html" } if (fs.existsSync(path.posix.join(argv.output, base))) { - return serve(base) + req.url = fp + return serve() } // does /regular/index.html exist? if so, redirect to /regular/ @@ -444,7 +446,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. } } - return serve(fp) + return serve() }) server.listen(argv.port) console.log(chalk.cyan(`Started a Quartz server listening at http://localhost:${argv.port}`)) @@ -458,7 +460,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. await build(clientRefresh) }) } else { - await build(() => {}) + await build(() => { }) ctx.dispose() } }) diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts index 7e450b76..c28da28c 100644 --- a/quartz/components/scripts/spa.inline.ts +++ b/quartz/components/scripts/spa.inline.ts @@ -17,7 +17,7 @@ const isLocalUrl = (href: string) => { } return true } - } catch (e) {} + } catch (e) { } return false } @@ -50,6 +50,7 @@ async function navigate(url: URL, isBack: boolean = false) { history.pushState({}, "", url) window.scrollTo({ top: 0 }) } + const html = p.parseFromString(contents, "text/html") let title = html.querySelector("title")?.textContent if (title) { diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts index 44bb7185..edc22d9e 100644 --- a/quartz/plugins/emitters/assets.ts +++ b/quartz/plugins/emitters/assets.ts @@ -18,7 +18,7 @@ export const Assets: QuartzEmitterPlugin = () => { for (const fp of fps) { const ext = path.extname(fp) const src = joinSegments(argv.directory, fp) as FilePath - const name = (slugifyFilePath(fp as FilePath) + ext) as FilePath + const name = (slugifyFilePath(fp as FilePath, true) + ext) as FilePath const dest = joinSegments(assetsPath, name) as FilePath const dir = path.dirname(dest) as FilePath diff --git a/quartz/plugins/transformers/lastmod.ts b/quartz/plugins/transformers/lastmod.ts index 15dd89e3..507b5852 100644 --- a/quartz/plugins/transformers/lastmod.ts +++ b/quartz/plugins/transformers/lastmod.ts @@ -36,6 +36,7 @@ export const CreatedModifiedDate: QuartzTransformerPlugin | und } else if (source === "frontmatter" && file.data.frontmatter) { created ||= file.data.frontmatter.date modified ||= file.data.frontmatter.lastmod + modified ||= file.data.frontmatter.updated modified ||= file.data.frontmatter["last-modified"] published ||= file.data.frontmatter.publishDate } else if (source === "git") { diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts index a2607196..d867039d 100644 --- a/quartz/plugins/transformers/links.ts +++ b/quartz/plugins/transformers/links.ts @@ -79,9 +79,8 @@ export const CrawlLinks: QuartzTransformerPlugin | undefined> = ) { if (!isAbsoluteUrl(node.properties.src)) { let dest = node.properties.src as RelativeURL - const ext = path.extname(node.properties.src) dest = node.properties.src = transformLink(curSlug, dest, transformOptions) - node.properties.src = dest + ext + node.properties.src = dest } } }) diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index 97054b1f..b324daca 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -196,7 +196,7 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin // embed cases if (value.startsWith("!")) { const ext: string = path.extname(fp).toLowerCase() - const url = slugifyFilePath(fp as FilePath) + ext + const url = slugifyFilePath(fp as FilePath) if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) { const dims = alias ?? "" let [width, height] = dims.split("x", 2) diff --git a/quartz/util/path.test.ts b/quartz/util/path.test.ts index 5655585d..ddbb0ee9 100644 --- a/quartz/util/path.test.ts +++ b/quartz/util/path.test.ts @@ -49,6 +49,7 @@ describe("typeguards", () => { assert(path.isRelativeURL("./abc/def#an-anchor")) assert(path.isRelativeURL("./abc/def?query=1#an-anchor")) assert(path.isRelativeURL("../abc/def")) + assert(path.isRelativeURL("./abc/def.pdf")) assert(!path.isRelativeURL("abc")) assert(!path.isRelativeURL("/abc/def")) @@ -60,12 +61,12 @@ describe("typeguards", () => { test("isServerSlug", () => { assert(path.isServerSlug("index")) assert(path.isServerSlug("abc/def")) + assert(path.isServerSlug("html.energy")) + assert(path.isServerSlug("test.pdf")) assert(!path.isServerSlug(".")) assert(!path.isServerSlug("./abc/def")) assert(!path.isServerSlug("../abc/def")) - assert(!path.isServerSlug("index.html")) - assert(!path.isServerSlug("abc/def.html")) assert(!path.isServerSlug("abc/def#anchor")) assert(!path.isServerSlug("abc/def?query=1")) assert(!path.isServerSlug("note with spaces")) @@ -140,11 +141,12 @@ describe("transforms", () => { asserts( [ ["content/index.md", "content/index"], + ["content/index.html", "content/index"], ["content/_index.md", "content/index"], ["/content/index.md", "content/index"], - ["content/cool.png", "content/cool"], + ["content/cool.png", "content/cool.png"], ["index.md", "index"], - ["test.mp4", "test"], + ["test.mp4", "test.mp4"], ["note with spaces.md", "note-with-spaces"], ], path.slugifyFilePath, @@ -160,10 +162,13 @@ describe("transforms", () => { [".", "."], ["./", "./"], ["./index", "./"], + ["./index#abc", "./#abc"], ["./index.html", "./"], ["./index.md", "./"], + ["./index.css", "./index.css"], ["content", "./content"], ["content/test.md", "./content/test"], + ["content/test.pdf", "./content/test.pdf"], ["./content/test.md", "./content/test"], ["../content/test.md", "../content/test"], ["tags/", "./tags/"], @@ -193,7 +198,7 @@ describe("transforms", () => { }) describe("link strategies", () => { - const allSlugs = ["a/b/c", "a/b/d", "a/b/index", "e/f", "e/g/h", "index"] as ServerSlug[] + const allSlugs = ["a/b/c", "a/b/d", "a/b/index", "e/f", "e/g/h", "index", "a/test.png"] as ServerSlug[] describe("absolute", () => { const opts: TransformOptions = { @@ -204,27 +209,29 @@ describe("link strategies", () => { test("from a/b/c", () => { const cur = "a/b/c" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../../a/b/d") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../../a/b") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../../a/b/") assert.strictEqual(path.transformLink(cur, "e/f", opts), "../../../e/f") assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "../../../e/g/h") - assert.strictEqual(path.transformLink(cur, "index", opts), "../../..") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../../") + assert.strictEqual(path.transformLink(cur, "index.png", opts), "../../../index.png") assert.strictEqual(path.transformLink(cur, "index#abc", opts), "../../../#abc") assert.strictEqual(path.transformLink(cur, "tag/test", opts), "../../../tag/test") assert.strictEqual(path.transformLink(cur, "a/b/c#test", opts), "../../../a/b/c#test") + assert.strictEqual(path.transformLink(cur, "a/test.png", opts), "../../../a/test.png") }) test("from a/b/index", () => { const cur = "a/b" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../a/b/d") assert.strictEqual(path.transformLink(cur, "a/b", opts), "../../a/b") - assert.strictEqual(path.transformLink(cur, "index", opts), "../..") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../") }) test("from index", () => { const cur = "" as CanonicalSlug - assert.strictEqual(path.transformLink(cur, "index", opts), ".") + assert.strictEqual(path.transformLink(cur, "index", opts), "./") assert.strictEqual(path.transformLink(cur, "a/b/c", opts), "./a/b/c") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") }) }) @@ -238,24 +245,29 @@ describe("link strategies", () => { const cur = "a/b/c" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "d", opts), "../../../a/b/d") assert.strictEqual(path.transformLink(cur, "h", opts), "../../../e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../../a/b") - assert.strictEqual(path.transformLink(cur, "index", opts), "../../..") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../../a/b/") + assert.strictEqual(path.transformLink(cur, "a/b/index.png", opts), "../../../a/b/index.png") + assert.strictEqual(path.transformLink(cur, "a/b/index#abc", opts), "../../../a/b/#abc") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../../") + assert.strictEqual(path.transformLink(cur, "index.png", opts), "../../../index.png") + assert.strictEqual(path.transformLink(cur, "test.png", opts), "../../../a/test.png") + assert.strictEqual(path.transformLink(cur, "index#abc", opts), "../../../#abc") }) test("from a/b/index", () => { const cur = "a/b" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "d", opts), "../../a/b/d") assert.strictEqual(path.transformLink(cur, "h", opts), "../../e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b") - assert.strictEqual(path.transformLink(cur, "index", opts), "../..") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b/") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../") }) test("from index", () => { const cur = "" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "d", opts), "./a/b/d") assert.strictEqual(path.transformLink(cur, "h", opts), "./e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b") - assert.strictEqual(path.transformLink(cur, "index", opts), ".") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") + assert.strictEqual(path.transformLink(cur, "index", opts), "./") }) }) @@ -269,9 +281,14 @@ describe("link strategies", () => { const cur = "a/b/c" as CanonicalSlug assert.strictEqual(path.transformLink(cur, "d", opts), "./d") assert.strictEqual(path.transformLink(cur, "index", opts), "./") - assert.strictEqual(path.transformLink(cur, "../../index", opts), "../../") - assert.strictEqual(path.transformLink(cur, "../../", opts), "../../") - assert.strictEqual(path.transformLink(cur, "../../e/g/h", opts), "../../e/g/h") + assert.strictEqual(path.transformLink(cur, "../../../index", opts), "../../../") + assert.strictEqual(path.transformLink(cur, "../../../index.png", opts), "../../../index.png") + assert.strictEqual(path.transformLink(cur, "../../../index#abc", opts), "../../../#abc") + assert.strictEqual(path.transformLink(cur, "../../../", opts), "../../../") + assert.strictEqual(path.transformLink(cur, "../../../a/test.png", opts), "../../../a/test.png") + assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") + assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") + assert.strictEqual(path.transformLink(cur, "../../../e/g/h#abc", opts), "../../../e/g/h#abc") }) test("from a/b/index", () => { diff --git a/quartz/util/path.ts b/quartz/util/path.ts index c1016af5..c949474f 100644 --- a/quartz/util/path.ts +++ b/quartz/util/path.ts @@ -72,7 +72,7 @@ export type RelativeURL = SlugLike<"relative"> export function isRelativeURL(s: string): s is RelativeURL { const validStart = /^\.{1,2}/.test(s) const validEnding = !(s.endsWith("/index") || s === "index") - return validStart && validEnding && !_hasFileExtension(s) + return validStart && validEnding && ![".md", ".html"].includes(_getFileExtension(s) ?? "") } /** A server side slug. This is what Quartz uses to emit files so uses index suffixes */ @@ -80,7 +80,7 @@ export type ServerSlug = SlugLike<"server"> export function isServerSlug(s: string): s is ServerSlug { const validStart = !(s.startsWith(".") || s.startsWith("/")) const validEnding = !s.endsWith("/") - return validStart && validEnding && !_containsForbiddenCharacters(s) && !_hasFileExtension(s) + return validStart && validEnding && !_containsForbiddenCharacters(s) } /** The real file path to a file on disk */ @@ -114,9 +114,14 @@ export function canonicalizeServer(slug: ServerSlug): CanonicalSlug { return res } -export function slugifyFilePath(fp: FilePath): ServerSlug { +export function slugifyFilePath(fp: FilePath, excludeExt?: boolean): ServerSlug { fp = _stripSlashes(fp) as FilePath - const withoutFileExt = fp.replace(new RegExp(_getFileExtension(fp) + "$"), "") + let ext = _getFileExtension(fp) + const withoutFileExt = fp.replace(new RegExp(ext + "$"), "") + if (excludeExt || [".md", ".html", undefined].includes(ext)) { + ext = "" + } + let slug = withoutFileExt .split("/") .map((segment) => segment.replace(/\s/g, "-")) // slugify all segments @@ -128,7 +133,7 @@ export function slugifyFilePath(fp: FilePath): ServerSlug { slug = slug.replace(/_index$/, "index") } - return slug as ServerSlug + return slug + ext as ServerSlug } export function transformInternalLink(link: string): RelativeURL { @@ -139,19 +144,16 @@ export function transformInternalLink(link: string): RelativeURL { fplike.endsWith("index.md") || fplike.endsWith("index.html") || fplike.endsWith("/") + let segments = fplike.split("/").filter((x) => x.length > 0) let prefix = segments.filter(_isRelativeSegment).join("/") let fp = segments.filter((seg) => !_isRelativeSegment(seg)).join("/") - // implicit markdown - if (!_hasFileExtension(fp)) { - fp += ".md" - } - - fp = canonicalizeServer(slugifyFilePath(fp as FilePath)) + // manually add ext here as we want to not strip 'index' if it has an extension + fp = canonicalizeServer(slugifyFilePath(fp as FilePath) as ServerSlug) const joined = joinSegments(_stripSlashes(prefix), _stripSlashes(fp)) const trail = folderPath ? "/" : "" - const res = (_addRelativeToStart(joined) + anchor + trail) as RelativeURL + const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL return res } @@ -217,8 +219,9 @@ export function transformLink( if (opts.strategy === "relative") { return _addRelativeToStart(targetSlug) as RelativeURL } else { - targetSlug = _stripSlashes(targetSlug.slice(".".length)) - let [targetCanonical, targetAnchor] = splitAnchor(targetSlug) + const folderTail = targetSlug.endsWith("/") ? "/" : "" + const canonicalSlug = _stripSlashes(targetSlug.slice(".".length)) + let [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug) if (opts.strategy === "shortest") { // if the file name is unique, then it's just the filename @@ -236,7 +239,7 @@ export function transformLink( } // if it's not unique, then it's the absolute path from the vault root - return joinSegments(pathToRoot(src), targetSlug) as RelativeURL + return joinSegments(pathToRoot(src), canonicalSlug) + folderTail as RelativeURL } } From 58d9dc0528cc5d7232ac7a237c98213ff1075f39 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 00:55:52 -0700 Subject: [PATCH 0498/1221] format --- content/features/upcoming features.md | 2 +- quartz/bootstrap-cli.mjs | 2 +- quartz/components/scripts/spa.inline.ts | 2 +- quartz/util/path.test.ts | 15 +++++++++++++-- quartz/util/path.ts | 6 +++--- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index bbf962bc..2045be7b 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -5,7 +5,7 @@ draft: true ## todo - static icon path (in head) never gets updated - - do we update relative links on spa? + - do we update relative links on spa? - back button with anchors / popovers + spa is broken - debounce cfg rebuild on large repos - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 8551e764..c1c13085 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -460,7 +460,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. await build(clientRefresh) }) } else { - await build(() => { }) + await build(() => {}) ctx.dispose() } }) diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts index c28da28c..1b44ade0 100644 --- a/quartz/components/scripts/spa.inline.ts +++ b/quartz/components/scripts/spa.inline.ts @@ -17,7 +17,7 @@ const isLocalUrl = (href: string) => { } return true } - } catch (e) { } + } catch (e) {} return false } diff --git a/quartz/util/path.test.ts b/quartz/util/path.test.ts index ddbb0ee9..cbfd86b5 100644 --- a/quartz/util/path.test.ts +++ b/quartz/util/path.test.ts @@ -198,7 +198,15 @@ describe("transforms", () => { }) describe("link strategies", () => { - const allSlugs = ["a/b/c", "a/b/d", "a/b/index", "e/f", "e/g/h", "index", "a/test.png"] as ServerSlug[] + const allSlugs = [ + "a/b/c", + "a/b/d", + "a/b/index", + "e/f", + "e/g/h", + "index", + "a/test.png", + ] as ServerSlug[] describe("absolute", () => { const opts: TransformOptions = { @@ -285,7 +293,10 @@ describe("link strategies", () => { assert.strictEqual(path.transformLink(cur, "../../../index.png", opts), "../../../index.png") assert.strictEqual(path.transformLink(cur, "../../../index#abc", opts), "../../../#abc") assert.strictEqual(path.transformLink(cur, "../../../", opts), "../../../") - assert.strictEqual(path.transformLink(cur, "../../../a/test.png", opts), "../../../a/test.png") + assert.strictEqual( + path.transformLink(cur, "../../../a/test.png", opts), + "../../../a/test.png", + ) assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") assert.strictEqual(path.transformLink(cur, "../../../e/g/h#abc", opts), "../../../e/g/h#abc") diff --git a/quartz/util/path.ts b/quartz/util/path.ts index c949474f..7394a431 100644 --- a/quartz/util/path.ts +++ b/quartz/util/path.ts @@ -72,7 +72,7 @@ export type RelativeURL = SlugLike<"relative"> export function isRelativeURL(s: string): s is RelativeURL { const validStart = /^\.{1,2}/.test(s) const validEnding = !(s.endsWith("/index") || s === "index") - return validStart && validEnding && ![".md", ".html"].includes(_getFileExtension(s) ?? "") + return validStart && validEnding && ![".md", ".html"].includes(_getFileExtension(s) ?? "") } /** A server side slug. This is what Quartz uses to emit files so uses index suffixes */ @@ -133,7 +133,7 @@ export function slugifyFilePath(fp: FilePath, excludeExt?: boolean): ServerSlug slug = slug.replace(/_index$/, "index") } - return slug + ext as ServerSlug + return (slug + ext) as ServerSlug } export function transformInternalLink(link: string): RelativeURL { @@ -239,7 +239,7 @@ export function transformLink( } // if it's not unique, then it's the absolute path from the vault root - return joinSegments(pathToRoot(src), canonicalSlug) + folderTail as RelativeURL + return (joinSegments(pathToRoot(src), canonicalSlug) + folderTail) as RelativeURL } } From 07a327e05aa2a48aa11faf9aa0e049201d622f8f Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 01:34:50 -0700 Subject: [PATCH 0499/1221] fix back button in spa not working between two pages that both have hash fragments --- content/features/upcoming features.md | 3 --- quartz/components/scripts/graph.inline.ts | 1 - quartz/components/scripts/search.inline.ts | 1 - quartz/components/scripts/spa.inline.ts | 21 +++++++++++++++------ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 2045be7b..7093a5bf 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,9 +4,6 @@ draft: true ## todo -- static icon path (in head) never gets updated - - do we update relative links on spa? -- back button with anchors / popovers + spa is broken - debounce cfg rebuild on large repos - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock - dereference symlink for npx quartz sync diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts index 0a7c19ee..bea32eb3 100644 --- a/quartz/components/scripts/graph.inline.ts +++ b/quartz/components/scripts/graph.inline.ts @@ -179,7 +179,6 @@ async function renderGraph(container: string, slug: CanonicalSlug) { const neighbourNodes = d3 .selectAll(".node") .filter((d) => neighbours.includes(d.id)) - console.log(neighbourNodes) const currentId = d.id const linkNodes = d3 .selectAll(".link") diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts index 5c7dae01..b94cdfbc 100644 --- a/quartz/components/scripts/search.inline.ts +++ b/quartz/components/scripts/search.inline.ts @@ -148,7 +148,6 @@ document.addEventListener("nav", async (e: unknown) => { async function onType(e: HTMLElementEventMap["input"]) { const term = (e.target as HTMLInputElement).value const searchResults = (await index?.searchAsync(term, numSearchResults)) ?? [] - console.log(searchResults) const getByField = (field: string): number[] => { const results = searchResults.filter((x) => x.field === field) return results.length === 0 ? [] : ([...results[0].result] as number[]) diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts index 1b44ade0..e0a83731 100644 --- a/quartz/components/scripts/spa.inline.ts +++ b/quartz/components/scripts/spa.inline.ts @@ -46,10 +46,6 @@ async function navigate(url: URL, isBack: boolean = false) { }) if (!contents) return - if (!isBack) { - history.pushState({}, "", url) - window.scrollTo({ top: 0 }) - } const html = p.parseFromString(contents, "text/html") let title = html.querySelector("title")?.textContent @@ -65,8 +61,20 @@ async function navigate(url: URL, isBack: boolean = false) { announcer.dataset.persist = "" html.body.appendChild(announcer) + // morph body micromorph(document.body, html.body) + // scroll into place and add history + if (!isBack) { + history.pushState({}, "", url) + if (url.hash) { + const el = document.getElementById(url.hash.substring(1)) + el?.scrollIntoView() + } else { + window.scrollTo({ top: 0 }) + } + } + // now, patch head const elementsToRemove = document.head.querySelectorAll(":not([spa-preserve])") elementsToRemove.forEach((el) => el.remove()) @@ -92,8 +100,9 @@ function createRouter() { } }) - window.addEventListener("popstate", () => { - if (window.location.hash) return + window.addEventListener("popstate", (event) => { + const { url } = getOpts(event) ?? {} + if (window.location.hash && window.location.pathname === url?.pathname) return try { navigate(new URL(window.location.toString()), true) } catch (e) { From 0998bc355e6425e6b2bdf3d2da7124aa7b63b2a2 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 01:58:11 -0700 Subject: [PATCH 0500/1221] fix rebuild debouncing --- content/features/upcoming features.md | 3 +- quartz/bootstrap-cli.mjs | 8 ++- quartz/build.ts | 72 +++++++++++++-------------- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 7093a5bf..28ee48a4 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -4,9 +4,8 @@ draft: true ## todo -- debounce cfg rebuild on large repos - - investigate content rebuild triggering multiple times even when debounced, causing an esbuild deadlock - dereference symlink for npx quartz sync + - prompt user as to whether to do it (it's expensive for large vaults) ## high priority backlog diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index c1c13085..8efa7b04 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -355,6 +355,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. ], }) + const timeoutIds = new Set() const build = async (clientRefresh) => { const result = await ctx.rebuild().catch((err) => { console.error(`${chalk.red("Couldn't parse Quartz configuration:")} ${fp}`) @@ -380,6 +381,11 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. clientRefresh() } + const rebuild = (clientRefresh) => { + timeoutIds.forEach((id) => clearTimeout(id)) + timeoutIds.add(setTimeout(() => build(clientRefresh), 250)) + } + if (argv.serve) { const wss = new WebSocketServer({ port: 3001 }) const connections = [] @@ -457,7 +463,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. }) .on("all", async () => { console.log(chalk.yellow("Detected a source code change, doing a hard rebuild...")) - await build(clientRefresh) + rebuild(clientRefresh) }) } else { await build(() => {}) diff --git a/quartz/build.ts b/quartz/build.ts index 779ab35e..b5b1f9ee 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -77,7 +77,7 @@ async function startServing( } const initialSlugs = ctx.allSlugs - let timeoutId: ReturnType | null = null + let timeoutIds: Set> = new Set() let toRebuild: Set = new Set() let toRemove: Set = new Set() let trackedAssets: Set = new Set() @@ -106,45 +106,45 @@ async function startServing( toRemove.add(filePath) } - if (timeoutId) { - clearTimeout(timeoutId) - } + timeoutIds.forEach((id) => clearTimeout(id)) // debounce rebuilds every 250ms - timeoutId = setTimeout(async () => { - const perf = new PerfTimer() - console.log(chalk.yellow("Detected change, rebuilding...")) - try { - const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) - - const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] - .filter((fp) => !toRemove.has(fp)) - .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) - - ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] - const parsedContent = await parseMarkdown(ctx, filesToRebuild) - for (const content of parsedContent) { - const [_tree, vfile] = content - contentMap.set(vfile.data.filePath!, content) - } - - for (const fp of toRemove) { - contentMap.delete(fp) + timeoutIds.add( + setTimeout(async () => { + const perf = new PerfTimer() + console.log(chalk.yellow("Detected change, rebuilding...")) + try { + const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) + + const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] + .filter((fp) => !toRemove.has(fp)) + .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) + + ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] + const parsedContent = await parseMarkdown(ctx, filesToRebuild) + for (const content of parsedContent) { + const [_tree, vfile] = content + contentMap.set(vfile.data.filePath!, content) + } + + for (const fp of toRemove) { + contentMap.delete(fp) + } + + await rimraf(argv.output) + const parsedFiles = [...contentMap.values()] + const filteredContent = filterContent(ctx, parsedFiles) + await emitContent(ctx, filteredContent) + console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`)) + } catch { + console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`)) } - await rimraf(argv.output) - const parsedFiles = [...contentMap.values()] - const filteredContent = filterContent(ctx, parsedFiles) - await emitContent(ctx, filteredContent) - console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`)) - } catch { - console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`)) - } - - clientRefresh() - toRebuild.clear() - toRemove.clear() - }, 250) + clientRefresh() + toRebuild.clear() + toRemove.clear() + }, 250), + ) } const watcher = chokidar.watch(".", { From a7cca3242ad7adc5163d70aa2cc8ee23c92211e5 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 21:07:40 -0700 Subject: [PATCH 0501/1221] deref symlink on quartz sync --- content/features/upcoming features.md | 6 ----- quartz/bootstrap-cli.mjs | 36 +++++++++++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 28ee48a4..48acf605 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -1,12 +1,6 @@ --- draft: true --- - -## todo - -- dereference symlink for npx quartz sync - - prompt user as to whether to do it (it's expensive for large vaults) - ## high priority backlog - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 8efa7b04..f7c7bee4 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -112,6 +112,7 @@ function exitIfCancel(val) { } async function stashContentFolder(contentFolder) { + await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) await fs.promises.cp(contentFolder, contentCacheFolder, { force: true, recursive: true, @@ -150,7 +151,7 @@ yargs(hideBin(process.argv)) message: `Choose how to initialize the content in \`${contentFolder}\``, options: [ { value: "new", label: "Empty Quartz" }, - { value: "copy", label: "Replace with an existing folder", hint: "overwrites `content`" }, + { value: "copy", label: "Copy an existing folder", hint: "overwrites `content`" }, { value: "symlink", label: "Symlink an existing folder", @@ -163,12 +164,10 @@ yargs(hideBin(process.argv)) async function rmContentFolder() { const contentStat = await fs.promises.lstat(contentFolder) - if (contentStat) { - if (contentStat.isSymbolicLink()) { - await fs.promises.unlink(contentFolder) - } else { - await rimraf(contentFolder) - } + if (contentStat.isSymbolicLink()) { + await fs.promises.unlink(contentFolder) + } else { + await rimraf(contentFolder) } } @@ -274,11 +273,32 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. console.log("Backing up your content") if (argv.commit) { + const contentStat = await fs.promises.lstat(contentFolder) + if (contentStat.isSymbolicLink()) { + console.log(chalk.yellow("Detected symlink, trying to dereference before committing")) + + // stash symlink file + await stashContentFolder(contentFolder) + + // follow symlink and copy content + const linkTarg = await fs.promises.readlink(contentFolder) + await fs.promises.cp(linkTarg, contentFolder, { + force: true, + recursive: true, + preserveTimestamps: true, + }) + } + const currentTimestamp = new Date().toLocaleString("en-US", { dateStyle: "medium", timeStyle: "short", }) spawnSync("git", ["commit", "-am", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" }) + + if (contentStat.isSymbolicLink()) { + // put symlink back + await popContentFolder() + } } await stashContentFolder(contentFolder) @@ -466,7 +486,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. rebuild(clientRefresh) }) } else { - await build(() => {}) + await build(() => { }) ctx.dispose() } }) From e10f6da01140f483162fe33cc77b2255b0683ac7 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 21:08:26 -0700 Subject: [PATCH 0502/1221] format --- content/features/upcoming features.md | 1 + quartz/bootstrap-cli.mjs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 48acf605..a3f44be1 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -1,6 +1,7 @@ --- draft: true --- + ## high priority backlog - block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index f7c7bee4..02855514 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -486,7 +486,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. rebuild(clientRefresh) }) } else { - await build(() => { }) + await build(() => {}) ctx.dispose() } }) From a13094544318b06902b54a24ea61691fe598a2fc Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 21:20:15 -0700 Subject: [PATCH 0503/1221] fix when symlink targ is calculated and added npx quartz restore --- quartz/bootstrap-cli.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 02855514..990022e3 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -267,6 +267,9 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. spawnSync("npm", ["i"], { stdio: "inherit" }) console.log(chalk.green("Done!")) }) + .command("restore", "Try to restore your content folder from the cache", async () => { + await popContentFolder() + }) .command("sync", "Sync your Quartz to and from GitHub.", SyncArgv, async (argv) => { const contentFolder = path.join(cwd, argv.directory) console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) @@ -275,13 +278,13 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. if (argv.commit) { const contentStat = await fs.promises.lstat(contentFolder) if (contentStat.isSymbolicLink()) { + const linkTarg = await fs.promises.readlink(contentFolder) console.log(chalk.yellow("Detected symlink, trying to dereference before committing")) // stash symlink file await stashContentFolder(contentFolder) // follow symlink and copy content - const linkTarg = await fs.promises.readlink(contentFolder) await fs.promises.cp(linkTarg, contentFolder, { force: true, recursive: true, From 5713d30670fc9ca1f9d86e6f0698bd011a68f674 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 21:24:41 -0700 Subject: [PATCH 0504/1221] ensure contentfolder is passed to popContentFolder --- quartz/bootstrap-cli.mjs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 990022e3..11783035 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -267,9 +267,15 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. spawnSync("npm", ["i"], { stdio: "inherit" }) console.log(chalk.green("Done!")) }) - .command("restore", "Try to restore your content folder from the cache", async () => { - await popContentFolder() - }) + .command( + "restore", + "Try to restore your content folder from the cache", + CommonArgv, + async (argv) => { + const contentFolder = path.join(cwd, argv.directory) + await popContentFolder(contentFolder) + }, + ) .command("sync", "Sync your Quartz to and from GitHub.", SyncArgv, async (argv) => { const contentFolder = path.join(cwd, argv.directory) console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) @@ -300,7 +306,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. if (contentStat.isSymbolicLink()) { // put symlink back - await popContentFolder() + await popContentFolder(contentFolder) } } From 569beb410b967b8511a5d18cdee74280df681d15 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 21:49:58 -0700 Subject: [PATCH 0505/1221] ensure sync includes untracked files --- quartz/bootstrap-cli.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 11783035..a39e2915 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -192,7 +192,7 @@ yargs(hideBin(process.argv)) await rmContentFolder() if (setupStrategy === "copy") { - await fs.promises.cp(originalFolder, contentFolder, { recursive: true }) + await fs.promises.cp(originalFolder, contentFolder, { recursive: true, preserveTimestamps: true }) } else if (setupStrategy === "symlink") { await fs.promises.symlink(originalFolder, contentFolder, "dir") } @@ -292,7 +292,6 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. // follow symlink and copy content await fs.promises.cp(linkTarg, contentFolder, { - force: true, recursive: true, preserveTimestamps: true, }) @@ -302,7 +301,8 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. dateStyle: "medium", timeStyle: "short", }) - spawnSync("git", ["commit", "-am", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" }) + spawnSync("git", ["add", "."], { stdio: "inherit" }) + spawnSync("git", ["commit", "-m", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" }) if (contentStat.isSymbolicLink()) { // put symlink back From 8bc7a50dfa91dd7ba6b657aca6dbc437fa6df6b7 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 21:54:42 -0700 Subject: [PATCH 0506/1221] format --- quartz/bootstrap-cli.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index a39e2915..ee62a567 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -192,7 +192,10 @@ yargs(hideBin(process.argv)) await rmContentFolder() if (setupStrategy === "copy") { - await fs.promises.cp(originalFolder, contentFolder, { recursive: true, preserveTimestamps: true }) + await fs.promises.cp(originalFolder, contentFolder, { + recursive: true, + preserveTimestamps: true, + }) } else if (setupStrategy === "symlink") { await fs.promises.symlink(originalFolder, contentFolder, "dir") } From 6f1f820289ce37d328c4bc8cceba1f702df52e15 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Thu, 17 Aug 2023 23:39:15 -0700 Subject: [PATCH 0507/1221] fix typo in docs --- content/upgrading.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/upgrading.md b/content/upgrading.md index abe916c6..a4c2d4a9 100644 --- a/content/upgrading.md +++ b/content/upgrading.md @@ -8,7 +8,7 @@ title: "Upgrading Quartz" To fetch the latest Quartz updates, simply run ```bash -npx quartz upgrade +npx quartz update ``` As Quartz uses [git](https://git-scm.com/) under the hood for versioning, updating effectively 'pulls' in the updates from the official Quartz GitHub repository. If you have local changes that might conflict with the updates, you may need to resolve these manually yourself (or, pull manually using `git pull origin upstream`). From d8bec631b6dee8f5b9c42f75d154252e53e81b77 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 18 Aug 2023 18:22:38 -0700 Subject: [PATCH 0508/1221] update docs on github pages and syncing --- content/authoring content.md | 15 +++++++++++++++ content/hosting.md | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/content/authoring content.md b/content/authoring content.md index 4e3c3c83..7aa8d629 100644 --- a/content/authoring content.md +++ b/content/authoring content.md @@ -31,3 +31,18 @@ Some common frontmatter fields that are natively supported by Quartz: - `aliases`: Other names for this note. This is a list of strings. - `draft`: Whether to publish the page or not. This is one way to make [[private pages|pages private]] in Quartz. - `date`: A string representing the day the note was published. Normally uses `YYYY-MM-DD` format. + +## Syncing your Content + +When you're Quartz is at a point you're happy with, you can save your changes to GitHub by doing `npx quartz sync`. + +> [!hint] Flags and options +> For full help options, you can run `npx quartz sync --help`. +> +> Most of these have sensible defaults but you can override them if you have a custom setup: +> +> - `-d` or `--directory`: the content folder. This is normally just `content` +> - `-v` or `--verbose`: print out extra logging information +> - `--commit` or `--no-commit`: whether to make a `git` commit for your changes +> - `--push` or `--no-push`: whether to push updates to your GitHub fork of Quartz +> - `--pull` or `--no-pull`: whether to try and pull in any updates from your GitHub fork (i.e. from other devices) before pushing diff --git a/content/hosting.md b/content/hosting.md index 1e900a5b..2251f918 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -53,7 +53,7 @@ jobs: build: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 # Fetch all history for git info - uses: actions/setup-node@v3 @@ -85,6 +85,11 @@ Then: 1. Head to "Settings" tab of your forked repository and in the sidebar, click "Pages". Under "Source", select "GitHub Actions". 2. Commit these changes by doing `npx quartz sync`. This should deploy your site to `.github.io/`. +> [!hint] +> If you get an error about not being allowed to deploy to `github-pages` due to environment protection rules, make sure you remove any existing GitHub pages environments. +> +> You can do this by going to your Settings page on your GitHub fork and going to the Environments tab and pressing the trash icon. The GitHub action will recreate the environment for you correctly the next time you sync your Quartz. + ### Custom Domain Here's how to add a custom domain to your GitHub pages deployment. From 3201f83b70bb2ee1d1daeb585a26e8cd6b8ce95f Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Fri, 18 Aug 2023 18:24:09 -0700 Subject: [PATCH 0509/1221] v4-alpha -> v4 --- content/hosting.md | 4 ++-- content/index.md | 2 +- content/migrating from Quartz 3.md | 4 ++-- content/showcase.md | 2 +- quartz/bootstrap-cli.mjs | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/content/hosting.md b/content/hosting.md index 2251f918..b2476270 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -17,7 +17,7 @@ However, if you'd like to publish your site to the world, you need a way to host | Configuration option | Value | | ---------------------- | ------------------ | -| Production branch | `v4-alpha` | +| Production branch | `v4` | | Framework preset | `None` | | Build command | `npx quartz build` | | Build output directory | `public` | @@ -38,7 +38,7 @@ name: Deploy Quartz site to GitHub Pages on: push: branches: - - v4-alpha + - v4 permissions: contents: read diff --git a/content/index.md b/content/index.md index 45681516..2e643f22 100644 --- a/content/index.md +++ b/content/index.md @@ -13,7 +13,7 @@ Then, in your terminal of choice, enter the following commands line by line: ```shell git clone https://github.com/jackyzha0/quartz.git cd quartz -git checkout v4-alpha +git checkout v4 npm i npx quartz create ``` diff --git a/content/migrating from Quartz 3.md b/content/migrating from Quartz 3.md index f322e86f..4af4868d 100644 --- a/content/migrating from Quartz 3.md +++ b/content/migrating from Quartz 3.md @@ -5,8 +5,8 @@ title: "Migrating from Quartz 3" As you already have Quartz locally, you don't need to fork or clone it again. Simply just checkout the alpha branch, install the dependencies, and import your old vault. ```bash -git checkout v4-alpha -git pull upstream v4-alpha +git checkout v4 +git pull upstream v4 npm i npx quartz create ``` diff --git a/content/showcase.md b/content/showcase.md index e7748ba1..e87dc604 100644 --- a/content/showcase.md +++ b/content/showcase.md @@ -16,4 +16,4 @@ Want to see what Quartz can do? Here are some cool community gardens: - [Abhijeet's Math Wiki](https://abhmul.github.io/quartz/Math-Wiki/) - [Mike's AI Garden 🤖🪴](https://mwalton.me/) -If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/v4-alpha/content/showcase.md)! +If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/v4/content/showcase.md)! diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index ee62a567..643733f9 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -19,7 +19,7 @@ import { randomUUID } from "crypto" const ORIGIN_NAME = "origin" const UPSTREAM_NAME = "upstream" -const QUARTZ_SOURCE_BRANCH = "v4-alpha" +const QUARTZ_SOURCE_BRANCH = "v4" const cwd = process.cwd() const cacheDir = path.join(cwd, ".quartz-cache") const cacheFile = "./.quartz-cache/transpiled-build.mjs" From c874e7e9378a5ba895870e9680484fb4af5c6e93 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 19 Aug 2023 15:52:25 -0700 Subject: [PATCH 0510/1221] base path refactor to better support subpath hosting --- content/advanced/paths.md | 32 ++-- content/hosting.md | 2 +- index.d.ts | 2 +- package.json | 2 +- quartz/components/Backlinks.tsx | 6 +- quartz/components/Head.tsx | 5 +- quartz/components/PageList.tsx | 8 +- quartz/components/PageTitle.tsx | 5 +- quartz/components/TagList.tsx | 5 +- quartz/components/pages/FolderContent.tsx | 6 +- quartz/components/pages/TagContent.tsx | 4 +- quartz/components/renderPage.tsx | 19 +- quartz/components/scripts/graph.inline.ts | 34 ++-- quartz/components/scripts/search.inline.ts | 10 +- quartz/components/scripts/spa.inline.ts | 8 +- quartz/plugins/emitters/aliases.ts | 17 +- quartz/plugins/emitters/componentResources.ts | 8 +- quartz/plugins/emitters/contentIndex.ts | 30 ++- quartz/plugins/emitters/contentPage.tsx | 6 +- quartz/plugins/emitters/folderPage.tsx | 20 +- quartz/plugins/emitters/tagPage.tsx | 12 +- quartz/plugins/index.ts | 4 +- quartz/plugins/transformers/links.ts | 26 ++- quartz/plugins/transformers/ofm.ts | 5 +- quartz/plugins/types.ts | 4 +- quartz/util/ctx.ts | 4 +- quartz/util/path.test.ts | 179 +++++++----------- quartz/util/path.ts | 179 ++++++------------ quartz/worker.ts | 4 +- 29 files changed, 257 insertions(+), 389 deletions(-) diff --git a/content/advanced/paths.md b/content/advanced/paths.md index 68fc181b..9455b981 100644 --- a/content/advanced/paths.md +++ b/content/advanced/paths.md @@ -4,7 +4,7 @@ title: Paths in Quartz Paths are pretty complex to reason about because, especially for a static site generator, they can come from so many places. -The current browser URL? Technically a path. A full file path to a piece of content? Also a path. What about a slug for a piece of content? Yet another path. +A full file path to a piece of content? Also a path. What about a slug for a piece of content? Yet another path. It would be silly to type these all as `string` and call it a day as it's pretty common to accidentally mistake one type of path for another. Unfortunately, TypeScript does not have [nominal types](https://en.wikipedia.org/wiki/Nominal_type_system) for type aliases meaning even if you made custom types of a server-side slug or a client-slug slug, you can still accidentally assign one to another and TypeScript wouldn't catch it. @@ -12,13 +12,13 @@ Luckily, we can mimic nominal typing using [brands](https://www.typescriptlang.o ```typescript // instead of -type ClientSlug = string +type FullSlug = string // we do -type ClientSlug = string & { __brand: "client" } +type FullSlug = string & { __brand: "full" } // that way, the following will fail typechecking -const slug: ClientSlug = "some random slug" +const slug: FullSlug = "some random string" ``` While this prevents most typing mistakes _within_ our nominal typing system (e.g. mistaking a server slug for a client slug), it doesn't prevent us from _accidentally_ mistaking a string for a client slug when we forcibly cast it. @@ -29,27 +29,23 @@ The following diagram draws the relationships between all the path sources, nomi ```mermaid graph LR - Browser{{Browser}} --> Window{{Window}} & LinkElement{{Link Element}} - Window --"getCanonicalSlug()"--> Canonical[Canonical Slug] - Window --"getClientSlug()"--> Client[Client Slug] + Browser{{Browser}} --> Window{{Body}} & LinkElement{{Link Element}} + Window --"getFullSlug()"--> FullSlug[Full Slug] LinkElement --".href"--> Relative[Relative URL] - Client --"canonicalizeClient()"--> Canonical - Canonical --"pathToRoot()"--> Relative - Canonical --"resolveRelative()" --> Relative + FullSlug --"simplifySlug()" --> SimpleSlug[Simple Slug] + SimpleSlug --"pathToRoot()"--> Relative + SimpleSlug --"resolveRelative()" --> Relative MD{{Markdown File}} --> FilePath{{File Path}} & Links[Markdown links] Links --"transformLink()"--> Relative - FilePath --"slugifyFilePath()"--> Server[Server Slug] - Server --> HTML["HTML File"] - Server --"canonicalizeServer()"--> Canonical - style Canonical stroke-width:4px + FilePath --"slugifyFilePath()"--> FullSlug[Full Slug] + style FullSlug stroke-width:4px ``` Here are the main types of slugs with a rough description of each type of path: -- `ClientSlug`: client-side slug, usually obtained through `window.location`. Contains the protocol (i.e. starts with `https://`) -- `CanonicalSlug`: should be used whenever you need to refer to the location of a file/note. Shouldn't be a relative path and shouldn't have leading or trailing slashes `/` either. Also shouldn't have `/index` as an ending or a file extension. -- `RelativeURL`: must start with `.` or `..` to indicate it's a relative URL. Shouldn't have `/index` as an ending or a file extension. -- `ServerSlug`: cannot be relative and may not have leading or trailing slashes. - `FilePath`: a real file path to a file on disk. Cannot be relative and must have a file extension. +- `FullSlug`: cannot be relative and may not have leading or trailing slashes. It can have `index` as it's last segment. Use this wherever possible is it's the most 'general' interpretation of a slug. +- `SimpleSlug`: cannot be relative and shouldn't have `/index` as an ending or a file extension. It _can_ however have a trailing slash to indicate a folder path. +- `RelativeURL`: must start with `.` or `..` to indicate it's a relative URL. Shouldn't have `/index` as an ending or a file extension but can contain a trailing slash. To get a clearer picture of how these relate to each other, take a look at the path tests in `quartz/path.test.ts`. diff --git a/content/hosting.md b/content/hosting.md index b2476270..d6ccd0bd 100644 --- a/content/hosting.md +++ b/content/hosting.md @@ -17,7 +17,7 @@ However, if you'd like to publish your site to the world, you need a way to host | Configuration option | Value | | ---------------------- | ------------------ | -| Production branch | `v4` | +| Production branch | `v4` | | Framework preset | `None` | | Build command | `npx quartz build` | | Build output directory | `public` | diff --git a/index.d.ts b/index.d.ts index 4a93f164..aec536d2 100644 --- a/index.d.ts +++ b/index.d.ts @@ -5,7 +5,7 @@ declare module "*.scss" { // dom custom event interface CustomEventMap { - nav: CustomEvent<{ url: CanonicalSlug }> + nav: CustomEvent<{ url: FullSlug }> } declare const fetchData: Promise diff --git a/package.json b/package.json index 17e46b06..08ab2d60 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@jackyzha0/quartz", "description": "🌱 publish your digital garden and notes as a website", "private": true, - "version": "4.0.7", + "version": "4.0.8", "type": "module", "author": "jackyzha0 ", "license": "MIT", diff --git a/quartz/components/Backlinks.tsx b/quartz/components/Backlinks.tsx index 8cf3afa2..e88966b1 100644 --- a/quartz/components/Backlinks.tsx +++ b/quartz/components/Backlinks.tsx @@ -1,9 +1,9 @@ import { QuartzComponentConstructor, QuartzComponentProps } from "./types" import style from "./styles/backlinks.scss" -import { canonicalizeServer, resolveRelative } from "../util/path" +import { resolveRelative, simplifySlug } from "../util/path" function Backlinks({ fileData, allFiles }: QuartzComponentProps) { - const slug = canonicalizeServer(fileData.slug!) + const slug = simplifySlug(fileData.slug!) const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)) return ( diff --git a/quartz/components/ExplorerNode.tsx b/quartz/components/ExplorerNode.tsx index fd0c0823..c55a7a0a 100644 --- a/quartz/components/ExplorerNode.tsx +++ b/quartz/components/ExplorerNode.tsx @@ -145,7 +145,7 @@ export function ExplorerNode({ node, opts, fullPath, fileData }: ExplorerNodePro } return ( -
    +
  • {node.file ? ( // Single file node
  • @@ -174,17 +174,17 @@ export function ExplorerNode({ node, opts, fullPath, fileData }: ExplorerNodePro {/* render tag if folderBehavior is "link", otherwise render )} -
  • +
    )} {/* Recursively render children of folder */} @@ -210,6 +210,6 @@ export function ExplorerNode({ node, opts, fullPath, fileData }: ExplorerNodePro
    )} - + ) } diff --git a/quartz/components/scripts/explorer.inline.ts b/quartz/components/scripts/explorer.inline.ts index 2b7df7d3..9fe18654 100644 --- a/quartz/components/scripts/explorer.inline.ts +++ b/quartz/components/scripts/explorer.inline.ts @@ -113,9 +113,11 @@ function setupExplorer() { ) as HTMLElement // Get corresponding content