diff --git a/docs/features/wikilinks.md b/docs/features/wikilinks.md index ad4f2d7..bc1ce6b 100644 --- a/docs/features/wikilinks.md +++ b/docs/features/wikilinks.md @@ -8,6 +8,8 @@ Quartz supports Wikilinks by default and these links are resolved by Quartz usin This is enabled as a part of [[Obsidian compatibility]] and can be configured and enabled/disabled from that plugin. +Wikilink matching is case-insensitive to mirror Obsidian: `[[My Note]]`, `[[my note]]`, and `[[MY NOTE]]` all resolve to the same file. The generated URL is lowercased (e.g. `my-note`). + ## Syntax - `[[Path to file]]`: produces a link to `Path to file.md` (or `Path-to-file.md`) with the text `Path to file` diff --git a/docs/plugins/CrawlLinks.md b/docs/plugins/CrawlLinks.md index badf1d4..b0717ec 100644 --- a/docs/plugins/CrawlLinks.md +++ b/docs/plugins/CrawlLinks.md @@ -20,6 +20,7 @@ This plugin accepts the following configuration options: - `openLinksInNewTab`: If `true`, configures external links to open in a new tab. Defaults to `false`. - `lazyLoad`: If `true`, adds lazy loading to resource elements (`img`, `video`, etc.) to improve page load performance. Defaults to `false`. - `externalLinkIcon`: Adds an icon next to external links when `true` (default) to visually distinguishing them from internal links. +- `disableBrokenWikilinks`: If `true`, internal links whose resolved slug is not present in the site (i.e. no matching file under `markdownLinkResolution`) gain an additional `broken` CSS class alongside `internal`, so they can be styled distinctly. Defaults to `false`. Applies to both wikilinks and regular Markdown links, since both are indistinguishable `` elements by the time this plugin runs. > [!warning] > Removing this plugin is _not_ recommended and will likely break the page. diff --git a/docs/plugins/Frontmatter.md b/docs/plugins/Frontmatter.md index 3c2e429..c8292a6 100644 --- a/docs/plugins/Frontmatter.md +++ b/docs/plugins/Frontmatter.md @@ -52,7 +52,7 @@ This plugin accepts the following configuration options: When enabled, this plugin renders a collapsible "Properties" panel before the page body. The panel displays selected frontmatter fields in a table with automatic type rendering: -- **Strings** are shown as plain text. [[Wikilinks]] and [markdown links](https://example.com) within strings are rendered as clickable links. +- **Strings** are shown as plain text. [[Wikilinks]] and [markdown links](https://example.com) within strings are rendered as clickable links. Wikilink targets are slugified the same way as body-content links (e.g. `[[My Note]]` resolves to `my-note`) and matching is case-insensitive to mirror Obsidian's behavior, so `[[MyNote]]`, `[[mynote]]`, and `[[MYNOTE]]` all point to the same page. - **Arrays** are rendered as comma-separated lists. - **Booleans** are rendered as disabled checkboxes. - **Numbers** are rendered in a monospace font. @@ -81,24 +81,24 @@ quartz-properties-collapse: false Quartz supports the following frontmatter fields. Where multiple keys are listed, they are aliases — the first matching key is used. -| Field | Keys | Description | -| ------------------ | ------------------------------------------------- | ------------------------------------------------------------------ | -| Title | `title` | Page title. Falls back to filename if empty. | -| Description | `description` | Page description for metadata and search. | -| Tags | `tags`, `tag` | Categorization tags. Automatically slugified. | -| Aliases | `aliases`, `alias` | Alternative names for the page, used for link resolution. | -| Permalink | `permalink` | Custom URL slug. Also added to aliases. | -| CSS classes | `cssclasses`, `cssclass` | CSS classes applied to the page body. | -| Social image | `socialImage`, `image`, `cover` | Image used for social media previews. | -| Social description | `socialDescription` | Description used specifically for social media previews. | -| Created date | `created`, `date` | When the note was created. | -| Modified date | `modified`, `lastmod`, `updated`, `last-modified` | When the note was last modified. Falls back to `created` if unset. | -| Published date | `published`, `publishDate`, `date` | When the note was published. | -| Publish | `publish` | Whether the note should be published. | -| Draft | `draft` | Whether the note is a draft. | -| Comments | `comments` | Whether comments are enabled for the note. | -| Language | `lang` | Language code for the note. | -| Enable TOC | `enableToc` | Whether to show the table of contents. | +| Field | Keys | Description | +| ------------------ | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Title | `title` | Page title. Falls back to filename if empty. | +| Description | `description` | Page description for metadata and search. | +| Tags | `tags`, `tag` | Categorization tags. Slugified the same way as file paths: spaces become `-`, `&` becomes `-and-`, `%` becomes `-percent`, and tags are lowercased so that `#MyTag` and `#mytag` resolve to the same tag page (matching Obsidian). | +| Aliases | `aliases`, `alias` | Alternative names for the page, used for link resolution. | +| Permalink | `permalink` | Custom URL slug. Also added to aliases. | +| CSS classes | `cssclasses`, `cssclass` | CSS classes applied to the page body. | +| Social image | `socialImage`, `image`, `cover` | Image used for social media previews. | +| Social description | `socialDescription` | Description used specifically for social media previews. | +| Created date | `created`, `date` | When the note was created. | +| Modified date | `modified`, `lastmod`, `updated`, `last-modified` | When the note was last modified. Falls back to `created` if unset. | +| Published date | `published`, `publishDate`, `date` | When the note was published. | +| Publish | `publish` | Whether the note should be published. | +| Draft | `draft` | Whether the note is a draft. | +| Comments | `comments` | Whether comments are enabled for the note. | +| Language | `lang` | Language code for the note. | +| Enable TOC | `enableToc` | Whether to show the table of contents. | ## API diff --git a/docs/plugins/ObsidianFlavoredMarkdown.md b/docs/plugins/ObsidianFlavoredMarkdown.md index d0e1ab8..d5fafba 100644 --- a/docs/plugins/ObsidianFlavoredMarkdown.md +++ b/docs/plugins/ObsidianFlavoredMarkdown.md @@ -25,7 +25,9 @@ This plugin accepts the following configuration options: - `enableVideoEmbed`: If `true` (default), enables the embedding of video files. - `enableCheckbox`: If `true`, adds support for interactive checkboxes in content, including custom task characters (e.g. `- [?]`, `- [!]`, `- [/]`). Defaults to `false`. - `enableObsidianUri`: If `true` (default), marks `obsidian://` protocol links with a CSS class and data attribute for custom styling. -- `disableBrokenWikilinks`: If `true`, replaces links to non-existent notes with a dimmed, disabled link. Defaults to `false`. + +> [!note] +> The `disableBrokenWikilinks` option previously lived on this plugin. It has moved to [[CrawlLinks]], which owns link resolution and can honor the configured `markdownLinkResolution` strategy when deciding whether a link is broken. Users upgrading from earlier Quartz v5 betas should move the option from `ObsidianFlavoredMarkdown` to `CrawlLinks`. > [!warning] > Don't remove this plugin if you're using [[Obsidian compatibility|Obsidian]] to author the content! diff --git a/quartz.lock.json b/quartz.lock.json index d45bc70..8dc0b50 100644 --- a/quartz.lock.json +++ b/quartz.lock.json @@ -4,38 +4,38 @@ "alias-redirects": { "source": "github:quartz-community/alias-redirects", "resolved": "https://github.com/quartz-community/alias-redirects.git", - "commit": "d707e5b43fbcdc0ec16ff3a2b6f808c7886eabdf", - "installedAt": "2026-04-16T14:09:24.650Z" + "commit": "22a515af41060416b7fd22ec48111f7bfa199042", + "installedAt": "2026-04-16T21:20:18.209Z" }, "article-title": { "source": "github:quartz-community/article-title", "resolved": "https://github.com/quartz-community/article-title.git", - "commit": "7d81b49e7ec53c27a78d63375fdd84dd120bb5df", - "installedAt": "2026-04-16T14:09:24.670Z" + "commit": "f0780b0471c769b29ed79a80cff271791c70face", + "installedAt": "2026-04-16T21:20:18.204Z" }, "backlinks": { "source": "github:quartz-community/backlinks", "resolved": "https://github.com/quartz-community/backlinks.git", - "commit": "36c16a3b3db1766418bc215ba0376111b7094d4b", - "installedAt": "2026-04-16T14:09:24.758Z" + "commit": "0e6c9ddd36edeeedbac1d5075a0c16739ec99cac", + "installedAt": "2026-04-16T21:20:18.262Z" }, "bases-page": { "source": "github:quartz-community/bases-page", "resolved": "https://github.com/quartz-community/bases-page.git", - "commit": "08657527bc32b9df78181cc5d5f34b359ca74128", - "installedAt": "2026-04-16T14:09:24.824Z" + "commit": "0499d4b19e83908276e7983ad079592039c4aee8", + "installedAt": "2026-04-16T21:20:18.287Z" }, "breadcrumbs": { "source": "github:quartz-community/breadcrumbs", "resolved": "https://github.com/quartz-community/breadcrumbs.git", - "commit": "e85ef37971d2f4569661438aac1a21a52159e529", - "installedAt": "2026-04-16T14:09:24.810Z" + "commit": "ac782d9bd6d6b2c6aabeef2ae692885c616b924b", + "installedAt": "2026-04-16T21:20:18.169Z" }, "canvas-page": { "source": "github:quartz-community/canvas-page", "resolved": "https://github.com/quartz-community/canvas-page.git", - "commit": "8f9ad9d63472050328a6e199f0f2d59166d335cc", - "installedAt": "2026-04-16T14:09:24.893Z" + "commit": "e73e37a93184b5590221da84df658a354545d620", + "installedAt": "2026-04-16T21:20:18.340Z" }, "citations": { "source": "github:quartz-community/citations", @@ -52,32 +52,32 @@ "comments": { "source": "github:quartz-community/comments", "resolved": "https://github.com/quartz-community/comments.git", - "commit": "d79ee3c4a0adb63f6bffeae70bb38c21e7025110", - "installedAt": "2026-04-16T14:09:24.818Z" + "commit": "5e1168def4f00fbdbac2e129f89bad237944a194", + "installedAt": "2026-04-16T21:20:18.472Z" }, "content-index": { "source": "github:quartz-community/content-index", "resolved": "https://github.com/quartz-community/content-index.git", - "commit": "3d11ada374295497a337f890c541e0bfa82369f2", - "installedAt": "2026-04-16T14:09:24.658Z" + "commit": "9c5d4da3dee814544173bd0d744d0da77c00a64c", + "installedAt": "2026-04-16T21:20:18.351Z" }, "content-meta": { "source": "github:quartz-community/content-meta", "resolved": "https://github.com/quartz-community/content-meta.git", - "commit": "ffc51208cf0ba95ee4cb86f7bf818cd9531f80e5", - "installedAt": "2026-04-16T14:09:24.621Z" + "commit": "762ed0960d46f27ce170e677f6aa0c9a946c8cc3", + "installedAt": "2026-04-16T21:20:18.167Z" }, "content-page": { "source": "github:quartz-community/content-page", "resolved": "https://github.com/quartz-community/content-page.git", - "commit": "ecf8d1678e50fa031a841831151bdd736ea62f7e", - "installedAt": "2026-04-16T14:09:24.663Z" + "commit": "f269afa4d96144719dd99be81e586922fe4acd97", + "installedAt": "2026-04-16T21:20:18.192Z" }, "crawl-links": { "source": "github:quartz-community/crawl-links", "resolved": "https://github.com/quartz-community/crawl-links.git", - "commit": "09bd6a7dfde6d84e0b582425ac7d0ea378338679", - "installedAt": "2026-04-16T14:09:24.680Z" + "commit": "4f174719038f9854af6a0b345c5e55161d8a4444", + "installedAt": "2026-04-16T21:20:18.183Z" }, "created-modified-date": { "source": "github:quartz-community/created-modified-date", @@ -88,20 +88,20 @@ "darkmode": { "source": "github:quartz-community/darkmode", "resolved": "https://github.com/quartz-community/darkmode.git", - "commit": "ae5bfdf4f663cd417775a1587de84cebcb061867", - "installedAt": "2026-04-16T14:09:24.634Z" + "commit": "f654f06250777cb3d240cce7b1be1aa2a8cc267d", + "installedAt": "2026-04-16T21:20:18.225Z" }, "description": { "source": "github:quartz-community/description", "resolved": "https://github.com/quartz-community/description.git", - "commit": "acea29fa23d42a286aae8fb8b1b3a1e85229bd68", - "installedAt": "2026-04-16T14:09:24.644Z" + "commit": "afab1bc4a38f26659ceec63e22f9ad94a2e58479", + "installedAt": "2026-04-16T21:20:18.185Z" }, "encrypted-pages": { "source": "github:quartz-community/encrypted-pages", "resolved": "https://github.com/quartz-community/encrypted-pages.git", - "commit": "f3a1ce4ea7f45894f2b52bf2350f3ac1fe35f852", - "installedAt": "2026-04-16T14:09:25.204Z" + "commit": "5e951415cc1a09d7ae1e9981b600caab73bf2082", + "installedAt": "2026-04-16T21:20:18.789Z" }, "explicit-publish": { "source": "github:quartz-community/explicit-publish", @@ -112,8 +112,8 @@ "explorer": { "source": "github:quartz-community/explorer", "resolved": "https://github.com/quartz-community/explorer.git", - "commit": "1d323e05cd1a8cdbfde13c4ee95ecc4cec62d4c9", - "installedAt": "2026-04-16T14:09:25.351Z" + "commit": "525418b3974a194e8ce03dadf526e834890b16d0", + "installedAt": "2026-04-16T21:20:18.623Z" }, "favicon": { "source": "github:quartz-community/favicon", @@ -124,14 +124,14 @@ "folder-page": { "source": "github:quartz-community/folder-page", "resolved": "https://github.com/quartz-community/folder-page.git", - "commit": "d9fec1c6f781b5ca2f8447619489ed5602396ccb", - "installedAt": "2026-04-16T14:09:25.212Z" + "commit": "13092691e4dc848d890748f8fbdcc562b82fa7fc", + "installedAt": "2026-04-16T21:20:18.700Z" }, "footer": { "source": "github:quartz-community/footer", "resolved": "https://github.com/quartz-community/footer.git", - "commit": "6b4a54ecc756faf72fdc5699df398dd2aa239da5", - "installedAt": "2026-04-16T14:09:25.187Z" + "commit": "f4b7f403ff8771ea8ecc0fbf0fa1f01e40d5a96a", + "installedAt": "2026-04-16T21:20:18.745Z" }, "github-flavored-markdown": { "source": "github:quartz-community/github-flavored-markdown", @@ -142,8 +142,8 @@ "graph": { "source": "github:quartz-community/graph", "resolved": "https://github.com/quartz-community/graph.git", - "commit": "59129c0b4e09843af4bdfbf80798c3e1b1025061", - "installedAt": "2026-04-16T14:09:25.222Z" + "commit": "0e7a3cd8882270f9d804a574e0f17beab702eade", + "installedAt": "2026-04-16T21:20:18.692Z" }, "hard-line-breaks": { "source": "github:quartz-community/hard-line-breaks", @@ -160,26 +160,26 @@ "note-properties": { "source": "github:quartz-community/note-properties", "resolved": "https://github.com/quartz-community/note-properties.git", - "commit": "f0ca77840208272dcd3fb9fc2f1ae2dc81eca8c5", - "installedAt": "2026-04-16T14:09:25.313Z" + "commit": "3539cf1e6a476ac2bbf8ca37343a603a2792f53a", + "installedAt": "2026-04-16T21:20:19.058Z" }, "obsidian-flavored-markdown": { "source": "github:quartz-community/obsidian-flavored-markdown", "resolved": "https://github.com/quartz-community/obsidian-flavored-markdown.git", - "commit": "0f6f1323eef6ac5edce42f2206d6ae1cff042243", - "installedAt": "2026-04-16T14:09:25.461Z" + "commit": "00cc9bd84b4bd70eef0c9ef53a194ee0c0690a29", + "installedAt": "2026-04-16T21:20:18.824Z" }, "obsidian-plugin-ttrpg-tools-maps": { "source": "github:quartz-community/obsidian-plugin-ttrpg-tools-maps", "resolved": "https://github.com/quartz-community/obsidian-plugin-ttrpg-tools-maps.git", - "commit": "f886af1785fd7e90d041233dbc6174bfe725802e", - "installedAt": "2026-04-11T20:18:25.285Z" + "commit": "f1aa127e04dfe3f45afd8560f4b4e6961c0f81ab", + "installedAt": "2026-04-16T21:20:19.735Z" }, "og-image": { "source": "github:quartz-community/og-image", "resolved": "https://github.com/quartz-community/og-image.git", - "commit": "d81079740c4f5630e8a648e9770805aa0f599c14", - "installedAt": "2026-04-16T14:09:25.294Z" + "commit": "e11671dd75ec7556ce6d48b895714a884ced0b7c", + "installedAt": "2026-04-16T21:20:18.830Z" }, "ox-hugo": { "source": "github:quartz-community/ox-hugo", @@ -190,8 +190,8 @@ "page-title": { "source": "github:quartz-community/page-title", "resolved": "https://github.com/quartz-community/page-title.git", - "commit": "8f3623b2d125bf55ce11f37977adba827ce6e7e9", - "installedAt": "2026-04-16T14:09:25.519Z" + "commit": "af41c084b0f7bd50bf43e628be60f6935f80ef47", + "installedAt": "2026-04-16T21:20:19.134Z" }, "quartz-themes": { "source": { @@ -207,14 +207,14 @@ "reader-mode": { "source": "github:quartz-community/reader-mode", "resolved": "https://github.com/quartz-community/reader-mode.git", - "commit": "7521781df4259ca694e4ca3db9f6491421fa0d42", - "installedAt": "2026-04-16T14:09:25.607Z" + "commit": "7290881687d5285d29ebc9c2ac538b04d2cab57e", + "installedAt": "2026-04-16T21:20:19.185Z" }, "recent-notes": { "source": "github:quartz-community/recent-notes", "resolved": "https://github.com/quartz-community/recent-notes.git", - "commit": "92538d734649221635c67737c27e1ab6702c5763", - "installedAt": "2026-04-16T17:15:04.567Z" + "commit": "ef2390762f3f5c56a73bcbacb492a1e3155b35a3", + "installedAt": "2026-04-16T21:20:19.329Z" }, "remove-draft": { "source": "github:quartz-community/remove-draft", @@ -231,8 +231,8 @@ "search": { "source": "github:quartz-community/search", "resolved": "https://github.com/quartz-community/search.git", - "commit": "8fc4cf210a23efdab5c211518987b0be00273462", - "installedAt": "2026-04-16T14:09:25.712Z" + "commit": "df4528099fe0a210fd4790c81717a2cfd7a8f483", + "installedAt": "2026-04-16T21:20:19.377Z" }, "spacer": { "source": "github:quartz-community/spacer", @@ -243,8 +243,8 @@ "stacked-pages": { "source": "github:quartz-community/stacked-pages", "resolved": "https://github.com/quartz-community/stacked-pages.git", - "commit": "89410d13473d76a4b8b509623809d282958e8d75", - "installedAt": "2026-04-16T14:09:26.076Z" + "commit": "bdaab67563ce49fd4b9171aa82938f6b0b2973ed", + "installedAt": "2026-04-16T21:20:19.353Z" }, "syntax-highlighting": { "source": "github:quartz-community/syntax-highlighting", @@ -255,26 +255,26 @@ "table-of-contents": { "source": "github:quartz-community/table-of-contents", "resolved": "https://github.com/quartz-community/table-of-contents.git", - "commit": "9ba89085fa963e2f79bed0ca9de2f71f2adab549", - "installedAt": "2026-04-16T14:09:25.839Z" + "commit": "49f768d3dd92bba81743f8e7cad13ac65a4638f6", + "installedAt": "2026-04-16T21:20:19.586Z" }, "tag-list": { "source": "github:quartz-community/tag-list", "resolved": "https://github.com/quartz-community/tag-list.git", - "commit": "22222327c13fbac8cac8cb7540c80a1c56bdba9b", - "installedAt": "2026-04-16T14:09:25.885Z" + "commit": "26b4c8076f2e07a4af97214f0ab2a3b0a49f69f2", + "installedAt": "2026-04-16T21:20:19.312Z" }, "tag-page": { "source": "github:quartz-community/tag-page", "resolved": "https://github.com/quartz-community/tag-page.git", - "commit": "e067fe76f2c15e4e5172f6ed494066ddf267fc73", - "installedAt": "2026-04-16T14:09:25.845Z" + "commit": "2171bbe3b281a6b13da733e524d3518b53c1826a", + "installedAt": "2026-04-16T21:20:19.370Z" }, "unlisted-pages": { "source": "github:quartz-community/unlisted-pages", "resolved": "https://github.com/quartz-community/unlisted-pages.git", - "commit": "44a999583e28ac382360aec2e50eaed826b2e17e", - "installedAt": "2026-04-16T14:09:26.142Z" + "commit": "978030c4bbf9e51bedac860db438bd1acf84087c", + "installedAt": "2026-04-16T21:20:19.647Z" } } } diff --git a/quartz/cli/templates/obsidian.yaml b/quartz/cli/templates/obsidian.yaml index 8f81ab9..33c6fab 100644 --- a/quartz/cli/templates/obsidian.yaml +++ b/quartz/cli/templates/obsidian.yaml @@ -86,6 +86,7 @@ plugins: enabled: true options: markdownLinkResolution: shortest + # disableBrokenWikilinks: false # Set true to add a "broken" CSS class to internal links whose target is not in ctx.allSlugs. order: 60 - source: github:quartz-community/description enabled: true diff --git a/quartz/cli/templates/ttrpg.yaml b/quartz/cli/templates/ttrpg.yaml index 039ea3f..8cdcc4a 100644 --- a/quartz/cli/templates/ttrpg.yaml +++ b/quartz/cli/templates/ttrpg.yaml @@ -86,6 +86,7 @@ plugins: enabled: true options: markdownLinkResolution: shortest + # disableBrokenWikilinks: false # Set true to add a "broken" CSS class to internal links whose target is not in ctx.allSlugs. order: 60 - source: github:quartz-community/description enabled: true