forked from jackyzha0/quartz
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
152 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
--- | ||
title: Comments | ||
tags: | ||
- component | ||
--- | ||
|
||
Quartz also has the ability to hook into various providers to enable readers to leave comments on your site. | ||
|
||
![[giscus-example.png]] | ||
|
||
As of today, only [Giscus](https://giscus.app/) is supported out of the box but PRs to support other providers are welcome! | ||
|
||
## Providers | ||
|
||
### Giscus | ||
|
||
First, make sure that the [[setting up your GitHub repository|GitHub]] repository you are using for your Quartz meets the following requirements: | ||
|
||
1. The **repository is [public](https://docs.github.com/en/github/administering-a-repository/managing-repository-settings/setting-repository-visibility#making-a-repository-public)**, otherwise visitors will not be able to view the discussion. | ||
2. The **[giscus](https://github.com/apps/giscus) app is installed**, otherwise visitors will not be able to comment and react. | ||
3. The **Discussions feature is turned on** by [enabling it for your repository](https://docs.github.com/en/github/administering-a-repository/managing-repository-settings/enabling-or-disabling-github-discussions-for-a-repository). | ||
|
||
Then, use the [Giscus site](https://giscus.app/#repository) to figure out what your `repoId` and `categoryId` should be. Make sure you select `Announcements` for the Discussion category. | ||
|
||
![[giscus-repo.png]] | ||
|
||
![[giscus-discussion.png]] | ||
|
||
After entering both your repository and selecting the discussion category, Giscus will compute some IDs that you'll need to provide back to Quartz. You won't need to manually add the script yourself as Quartz will handle that part for you but will need these values in the next step! | ||
|
||
![[giscus-results.png]] | ||
|
||
Finally, in `quartz.layout.ts`, edit the `afterBody` field of `sharedPageComponents` to include the following options but with the values you got from above: | ||
|
||
```ts title="quartz.layout.ts" | ||
afterBody: [ | ||
Component.Comments({ | ||
provider: 'giscus', | ||
options: { | ||
// from data-repo | ||
repo: 'jackyzha0/quartz', | ||
// from data-repo-id | ||
repoId: 'MDEwOlJlcG9zaXRvcnkzODcyMTMyMDg', | ||
// from data-category | ||
category: 'Announcements', | ||
// from data-category-id | ||
categoryId: 'DIC_kwDOFxRnmM4B-Xg6', | ||
} | ||
}), | ||
], | ||
``` | ||
|
||
### Customization | ||
|
||
Quartz also exposes a few of the other Giscus options as well and you can provide them the same way `repo`, `repoId`, `category`, and `categoryId` are provided. | ||
|
||
```ts | ||
type Options = { | ||
provider: "giscus" | ||
options: { | ||
repo: `${string}/${string}` | ||
repoId: string | ||
category: string | ||
categoryId: string | ||
|
||
// how to map pages -> discussions | ||
// defaults to 'url' | ||
mapping?: "url" | "title" | "og:title" | "specific" | "number" | "pathname" | ||
|
||
// use strict title matching | ||
// defaults to true | ||
strict?: boolean | ||
|
||
// whether to enable reactions for the main post | ||
// defaults to true | ||
reactionsEnabled?: boolean | ||
|
||
// where to put the comment input box relative to the comments | ||
// defaults to 'bottom' | ||
inputPosition?: "top" | "bottom" | ||
} | ||
} | ||
``` |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" | ||
|
||
type Options = { | ||
provider: "giscus" | ||
options: { | ||
repo: `${string}/${string}` | ||
repoId: string | ||
category: string | ||
categoryId: string | ||
mapping?: "url" | "title" | "og:title" | "specific" | "number" | "pathname" | ||
strict?: boolean | ||
reactionsEnabled?: boolean | ||
inputPosition?: "top" | "bottom" | ||
} | ||
} | ||
|
||
function boolToStringBool(b: boolean): string { | ||
return b ? "1" : "0" | ||
} | ||
|
||
export default ((opts: Options) => { | ||
const Comments: QuartzComponent = (_props: QuartzComponentProps) => <div class="giscus"></div> | ||
Comments.afterDOMLoaded = ` | ||
const giscusScript = document.createElement("script") | ||
giscusScript.src = "https://giscus.app/client.js" | ||
giscusScript.async = true | ||
giscusScript.crossOrigin = "anonymous" | ||
giscusScript.setAttribute("data-loading", "lazy") | ||
giscusScript.setAttribute("data-emit-metadata", "0") | ||
giscusScript.setAttribute("data-repo", "${opts.options.repo}") | ||
giscusScript.setAttribute("data-repo-id", "${opts.options.repoId}") | ||
giscusScript.setAttribute("data-category", "${opts.options.category}") | ||
giscusScript.setAttribute("data-category-id", "${opts.options.categoryId}") | ||
giscusScript.setAttribute("data-mapping", "${opts.options.mapping ?? "url"}") | ||
giscusScript.setAttribute("data-strict", "${boolToStringBool(opts.options.strict ?? true)}") | ||
giscusScript.setAttribute("data-reactions-enabled", "${boolToStringBool(opts.options.reactionsEnabled ?? true)}") | ||
giscusScript.setAttribute("data-input-position", "${opts.options.inputPosition ?? "bottom"}") | ||
const theme = document.documentElement.getAttribute("saved-theme") | ||
giscusScript.setAttribute("data-theme", theme) | ||
document.head.appendChild(giscusScript) | ||
const changeTheme = (e) => { | ||
const theme = e.detail.theme | ||
const iframe = document.querySelector('iframe.giscus-frame') | ||
if (!iframe) { | ||
return | ||
} | ||
iframe.contentWindow.postMessage({ | ||
giscus: { | ||
setConfig: { | ||
theme: theme | ||
} | ||
} | ||
}, 'https://giscus.app') | ||
} | ||
document.addEventListener("nav", () => { | ||
document.addEventListener("themechange", changeTheme) | ||
window.addCleanup(() => document.removeEventListener("themechange", changeTheme)) | ||
}) | ||
` | ||
|
||
return Comments | ||
}) satisfies QuartzComponentConstructor<Options> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters