mirror of
https://github.com/jackyzha0/quartz.git
synced 2025-05-18 14:34:23 +02:00
feat(tags): Allow separating page tags from frontmatter tags
I feel like tags in note content are just links to the tag page, and shouldn't mark the page with that tag. Also the way it was done - adding content tags to frontmatter - interferes with my WIP page properties component, I want to only show "explicitly put in the frontmatter" tags. Added an option to have those "outgoing" tags that don't tag the page, yet get a tag page generated (so that the popover is not 404 if there are no pages with this tag).
This commit is contained in:
parent
8cf3e3001f
commit
1038d1bac7
@ -16,7 +16,7 @@ This plugin accepts the following configuration options:
|
|||||||
- `wikilinks`:If `true` (default), turns [[wikilinks]] into regular links.
|
- `wikilinks`:If `true` (default), turns [[wikilinks]] into regular links.
|
||||||
- `callouts`: If `true` (default), adds support for [[callouts|callout]] blocks for emphasizing content.
|
- `callouts`: If `true` (default), adds support for [[callouts|callout]] blocks for emphasizing content.
|
||||||
- `mermaid`: If `true` (default), enables [[Mermaid diagrams|Mermaid diagram]] rendering within Markdown files.
|
- `mermaid`: If `true` (default), enables [[Mermaid diagrams|Mermaid diagram]] rendering within Markdown files.
|
||||||
- `parseTags`: If `true` (default), parses and links tags within the content.
|
- `parseTags`: If `true` (default), parses and links tags within the content. This marks the page as tagged with those tags, you can set `parseTags` to `"link-only"` to only turn content tags into links.
|
||||||
- `parseArrows`: If `true` (default), transforms arrow symbols into their HTML character equivalents.
|
- `parseArrows`: If `true` (default), transforms arrow symbols into their HTML character equivalents.
|
||||||
- `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks.
|
- `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks.
|
||||||
- `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`.
|
- `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`.
|
||||||
|
@ -17,11 +17,17 @@ import { TagContent } from "../../components"
|
|||||||
import { write } from "./helpers"
|
import { write } from "./helpers"
|
||||||
import { i18n } from "../../i18n"
|
import { i18n } from "../../i18n"
|
||||||
import DepGraph from "../../depgraph"
|
import DepGraph from "../../depgraph"
|
||||||
|
import { Data } from "vfile"
|
||||||
|
|
||||||
interface TagPageOptions extends FullPageLayout {
|
interface TagPageOptions extends FullPageLayout {
|
||||||
sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number
|
sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getTags = ({ frontmatter, tagLinks }: Data) => [
|
||||||
|
...(frontmatter?.tags ?? []),
|
||||||
|
...(tagLinks ?? []),
|
||||||
|
]
|
||||||
|
|
||||||
export const TagPage: QuartzEmitterPlugin<Partial<TagPageOptions>> = (userOpts) => {
|
export const TagPage: QuartzEmitterPlugin<Partial<TagPageOptions>> = (userOpts) => {
|
||||||
const opts: FullPageLayout = {
|
const opts: FullPageLayout = {
|
||||||
...sharedPageComponents,
|
...sharedPageComponents,
|
||||||
@ -55,7 +61,7 @@ export const TagPage: QuartzEmitterPlugin<Partial<TagPageOptions>> = (userOpts)
|
|||||||
|
|
||||||
for (const [_tree, file] of content) {
|
for (const [_tree, file] of content) {
|
||||||
const sourcePath = file.data.filePath!
|
const sourcePath = file.data.filePath!
|
||||||
const tags = (file.data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes)
|
const tags = getTags(file.data).flatMap(getAllSegmentPrefixes)
|
||||||
// if the file has at least one tag, it is used in the tag index page
|
// if the file has at least one tag, it is used in the tag index page
|
||||||
if (tags.length > 0) {
|
if (tags.length > 0) {
|
||||||
tags.push("index")
|
tags.push("index")
|
||||||
@ -76,9 +82,7 @@ export const TagPage: QuartzEmitterPlugin<Partial<TagPageOptions>> = (userOpts)
|
|||||||
const allFiles = content.map((c) => c[1].data)
|
const allFiles = content.map((c) => c[1].data)
|
||||||
const cfg = ctx.cfg.configuration
|
const cfg = ctx.cfg.configuration
|
||||||
|
|
||||||
const tags: Set<string> = new Set(
|
const tags: Set<string> = new Set(allFiles.flatMap(getTags).flatMap(getAllSegmentPrefixes))
|
||||||
allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes),
|
|
||||||
)
|
|
||||||
|
|
||||||
// add base tag
|
// add base tag
|
||||||
tags.add("index")
|
tags.add("index")
|
||||||
|
@ -31,7 +31,7 @@ export interface Options {
|
|||||||
wikilinks: boolean
|
wikilinks: boolean
|
||||||
callouts: boolean
|
callouts: boolean
|
||||||
mermaid: boolean
|
mermaid: boolean
|
||||||
parseTags: boolean
|
parseTags: boolean | "link-only"
|
||||||
parseArrows: boolean
|
parseArrows: boolean
|
||||||
parseBlockReferences: boolean
|
parseBlockReferences: boolean
|
||||||
enableInHtmlEmbed: boolean
|
enableInHtmlEmbed: boolean
|
||||||
@ -338,9 +338,13 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options>>
|
|||||||
}
|
}
|
||||||
|
|
||||||
tag = slugTag(tag)
|
tag = slugTag(tag)
|
||||||
if (file.data.frontmatter) {
|
if (opts.parseTags != "link-only" && file.data.frontmatter) {
|
||||||
const noteTags = file.data.frontmatter.tags ?? []
|
const noteTags = file.data.frontmatter.tags ?? []
|
||||||
file.data.frontmatter.tags = [...new Set([...noteTags, tag])]
|
file.data.frontmatter.tags = [...new Set([...noteTags, tag])]
|
||||||
|
} else {
|
||||||
|
// We store the content tags so that the tagPage can be generated even
|
||||||
|
// if there's no pages tagged with them through the frontmatter
|
||||||
|
file.data.tagLinks = (file.data.tagLinks ?? new Set()).add(tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -828,5 +832,6 @@ declare module "vfile" {
|
|||||||
blocks: Record<string, Element>
|
blocks: Record<string, Element>
|
||||||
htmlAst: HtmlRoot
|
htmlAst: HtmlRoot
|
||||||
hasMermaidDiagram: boolean | undefined
|
hasMermaidDiagram: boolean | undefined
|
||||||
|
tagLinks: Set<string>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user