diff --git a/docs/plugins/ObsidianFlavoredMarkdown.md b/docs/plugins/ObsidianFlavoredMarkdown.md index 414f743b86d30..b860c40fe2887 100644 --- a/docs/plugins/ObsidianFlavoredMarkdown.md +++ b/docs/plugins/ObsidianFlavoredMarkdown.md @@ -16,7 +16,7 @@ This plugin accepts the following configuration options: - `wikilinks`:If `true` (default), turns [[wikilinks]] into regular links. - `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. -- `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. - `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`. diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index 9913e7d822254..5d3d9e9165d39 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -17,11 +17,17 @@ import { TagContent } from "../../components" import { write } from "./helpers" import { i18n } from "../../i18n" import DepGraph from "../../depgraph" +import { Data } from "vfile" interface TagPageOptions extends FullPageLayout { sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number } +const getTags = ({ frontmatter, tagLinks }: Data) => [ + ...(frontmatter?.tags ?? []), + ...(tagLinks ?? []), +] + export const TagPage: QuartzEmitterPlugin> = (userOpts) => { const opts: FullPageLayout = { ...sharedPageComponents, @@ -55,7 +61,7 @@ export const TagPage: QuartzEmitterPlugin> = (userOpts) for (const [_tree, file] of content) { 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 (tags.length > 0) { tags.push("index") @@ -76,9 +82,7 @@ export const TagPage: QuartzEmitterPlugin> = (userOpts) const allFiles = content.map((c) => c[1].data) const cfg = ctx.cfg.configuration - const tags: Set = new Set( - allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes), - ) + const tags: Set = new Set(allFiles.flatMap(getTags).flatMap(getAllSegmentPrefixes)) // add base tag tags.add("index") diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts index d49b8e6700f84..601a89d1784f8 100644 --- a/quartz/plugins/transformers/ofm.ts +++ b/quartz/plugins/transformers/ofm.ts @@ -24,7 +24,7 @@ export interface Options { wikilinks: boolean callouts: boolean mermaid: boolean - parseTags: boolean + parseTags: boolean | "link-only" parseArrows: boolean parseBlockReferences: boolean enableInHtmlEmbed: boolean @@ -331,9 +331,13 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin> } tag = slugTag(tag) - if (file.data.frontmatter) { + if (opts.parseTags != "link-only" && file.data.frontmatter) { const noteTags = file.data.frontmatter.tags ?? [] 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 { @@ -821,5 +825,6 @@ declare module "vfile" { blocks: Record htmlAst: HtmlRoot hasMermaidDiagram: boolean | undefined + tagLinks: Set } }