395 Commits

Author SHA1 Message Date
Martin Donath b229bac9ad fix: zensical serve returns 404 after suspend (#574)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
Co-authored-by: takeshiD <goriponikeike55@gmail.com>
2026-05-01 20:08:37 +02:00
Martin Donath b5492cef2e fix: shim for mkdocs-glightbox fails when only defaults are set (#611)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 19:32:54 +02:00
Martin Donath 0291ad5360 chore: release v0.0.39
## Summary

This version fixes several bugs related to link validation and lightbox configuration.

Signed-off-by: squidfunk <martin.donath@squidfunk.com>
v0.0.39
2026-05-01 18:24:15 +02:00
Martin Donath fe42fc4dde fix: shim for MkDocs validation syntax overrides Zensical's (#607)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 18:18:35 +02:00
Martin Donath 89d99bafaf Merge pull request #597 from zensical/fix/validation-text-fragment
fix: anchor not extracted from combined anchor-text-fragment
2026-05-01 18:02:52 +02:00
Martin Donath 273dd2313a fix: auto-themed gallery takes precedence over explicit grouping
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 17:37:02 +02:00
Martin Donath b693a2fe4b Fix glightbox captions (#605)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 13:46:55 +02:00
squidfunk dfc74bf921 chore: fix ty warning
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 13:39:22 +02:00
squidfunk 3e27d6954b refactor: move glightbox config options to dataclass
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 13:36:14 +02:00
squidfunk 8ed39039ce chore: disable ruff's N802 globally
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 13:27:06 +02:00
squidfunk c050add8a0 fix: error when setting caption_position on glightbox extension (#604)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 13:12:13 +02:00
squidfunk 699d3be0f6 fix: add Python backtrace on Markdown rendering error
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-05-01 13:09:24 +02:00
squidfunk acc2620a57 fix: validation doesn't correctly map percent-encoded links (#598)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-30 17:33:54 +02:00
squidfunk da317bf201 fix: add $...$ and $$...$$ blocks to exclusions for link validation (#599)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-30 17:20:41 +02:00
squidfunk 94f0d29756 fix: anchor not extracted from combined anchor-text-fragment
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-30 15:31:21 +02:00
Martin Donath 2f6ce8c5aa chore: upgrade Docker image to latest Alpine
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-30 14:54:25 +02:00
Martin Donath 0e7f1d8cf8 chore: release v0.0.38
## Summary

This version adds [link and footnote validation] and [strict mode] – two of the most frequently requested features. Zensical now checks all internal references at build time and reports issues with precise source locations, so broken links don't make it into your published documentation. Unlike MkDocs, which only validates final rendered links, Zensical also checks for unresolved references,  as well as unused and shadowed definitions – covering the full lifecycle of a reference from definition to use.

[link and footnote validation]: https://zensical.org/docs/setup/validation/
[strict mode]: https://zensical.org/docs/setup/validation/#strict-mode

### Validation

Zensical scans every Markdown file in your project and resolves all internal references against each other: inline links, reference-style links, footnotes, link definitions, and anchor targets. Every check is individually configurable and enabled by default.

``` console
$ zensical build
...
Warning: page does not exist
   ╭─[ index.md:3:14 ]
   │
 3 │ [this page]: non-existent.md
   │              ───────┬───────
   │                     ╰───────── page does not exist
───╯
```

The following checks for links and footnotes are now available:

- [`unresolved_references`](https://zensical.org/docs/setup/validation/#unresolved_references)
- [`unresolved_footnotes`](https://zensical.org/docs/setup/validation/#unresolved_footnotes)
- [`unused_definitions`](https://zensical.org/docs/setup/validation/#unused_definitions)
- [`unused_footnotes`](https://zensical.org/docs/setup/validation/#unused_footnotes)
- [`shadowed_definitions`](https://zensical.org/docs/setup/validation/#shadowed_definitions)
- [`shadowed_footnotes`](https://zensical.org/docs/setup/validation/#shadowed_footnotes)
- [`invalid_links`](https://zensical.org/docs/setup/validation/#invalid_links)
- [`invalid_link_anchors`](https://zensical.org/docs/setup/validation/#invalid_link_anchors)

### Strict mode

The new `--strict` command line flag causes the build to fail when any enabled validation check triggers, turning warnings into errors. This is useful for CI pipelines where you want to enforce link integrity and prevent broken documentation from being published:

``` console
$ zensical build --strict
...
Warning: unresolved link reference
   ╭─[ index.md:1:35 ]
   │
 1 │ This is an [unresolved reference][id].
   │                                   ─┬
   │                                    ╰── unresolved link reference
───╯
1 issue found
Aborted because --strict flag is set
```

## Upgrading

No changes to your configuration are required – all checks are enabled by default. It's quite likely that you'll run into at least some warnings – [as we did] – when upgrading, since before, it was easy to miss unused link definitions or unresolved references. If you want to [disable validation entirely](https://zensical.org/docs/setup/validation/), you can use:

``` toml
[project]
validation = false
```

As always, if you run into any problems, please [open an issue](https://github.com/zensical/zensical/issues).

[as we did]: https://github.com/zensical/docs/commit/facabcce36977468ef6465f2ac19ff68b692ada2
[disable validation entirely]: https://zensical.org/docs/setup/validation/#configuration-zensicaltoml_1

Signed-off-by: squidfunk <martin.donath@squidfunk.com>
v0.0.38
2026-04-30 13:56:34 +02:00
Martin Donath 201c615cd0 feature: add link and footnote validation and --strict mode (#175)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-30 13:17:23 +02:00
Timothée Mazzucotelli b3c1d91ed8 refactor: use our markdown subclasses
Signed-off-by: Timothée Mazzucotelli <dev@pawamoy.fr>
2026-04-28 12:34:15 +00:00
Martin Donath ce8cbf817c refactor: simplify function definitions after zrx upgrade
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-27 16:56:48 +02:00
Martin Donath 55c9d26e91 chore: release v0.0.37
## Summary

This version adds support for installable themes. You can now bundle your theme overrides and package them into a custom theme which can be installed via `pip`.

As of now, we closely mirror the process used by MkDocs, where themes just need to register themselves in the `mkdocs.themes` entrypoint, to allow users that already have derivations of Material for MkDocs to run them on Zensical. In the coming months, with the advent of the [component system], we'll make this process much more flexible and foster reuse at the component level. For now, this is a first step to allow sharing of theme overrides and default configurations inside organizations with dozens or even thousands of projects.

> [!TIP]
>
> If your organization has been a happy user of Material for MkDocs and is considering switching to Zensical, please support our work through [Zensical Spark]. Your financial contribution helps us achieve full compatibility with MkDocs much faster, gives you access to hands-on support by the core team, and allows you to shape Zensical together with us.

[component system]: https://zensical.org/about/roadmap/#component-system
[Zensical Spark]: https://zensical.org/spark/

Signed-off-by: squidfunk <martin.donath@squidfunk.com>
v0.0.37
2026-04-27 09:54:04 +02:00
Martin Donath 5178689c7a chore: fix ty warning
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-27 09:35:01 +02:00
Martin Donath 5fd8871c6a fix: revert change in search processor (regression)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-26 17:01:37 +02:00
Martin Donath 99d53f68c2 feature: add collectors to extract references for link validation
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-25 15:13:54 +02:00
Martin Donath 98720928cc refactor: subclass Markdown processors to extend functionality
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
Co-authored-by: Timothée Mazzucotelli <dev@pawamoy.fr>
2026-04-25 13:42:39 +02:00
Timothée Mazzucotelli 72ba12236b fix: sanitize nested metadata (#582)
Signed-off-by: Timothée Mazzucotelli <dev@pawamoy.fr>
2026-04-25 11:26:28 +00:00
Timothée Mazzucotelli dfb73ff1f3 chore: switch to ty
Signed-off-by: Timothée Mazzucotelli <dev@pawamoy.fr>
2026-04-24 17:14:04 +00:00
Martin Donath c937ed3c4d Merge pull request #577 from zensical/fix/glightbox-title
fix: attributes not applied to lightbox images
2026-04-24 16:17:38 +02:00
squidfunk 2fb663e1fd fix: text adjacent to image included in link to open image in lightbox (#579)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-24 16:04:53 +02:00
squidfunk dc32baf98f fix: anchor links preserved in table of content section titles (#578)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-24 14:16:11 +02:00
squidfunk fdeb0616cd refactor: use identical name for tree- and postprocessor
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-24 13:58:01 +02:00
squidfunk 127648e743 fix: attributes not applied to lightbox images
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-24 13:55:20 +02:00
Timothée Mazzucotelli 76945357dc feature: installable theme extensions (#511)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
Signed-off-by: Timothée Mazzucotelli <dev@pawamoy.fr>
Co-authored-by: squidfunk <martin.donath@squidfunk.com>
2026-04-24 13:37:59 +02:00
Timothée Mazzucotelli 46b03e5d7c chore: add spacing in markdown example
This also makes the markup for lists compliant with Python-Markdown (required blank line before).

Signed-off-by: Timothée Mazzucotelli <dev@pawamoy.fr>
2026-04-24 09:25:59 +00:00
Martin Donath 5081de243f chore: release v0.0.36 (#576)
This version adds the missing update of the user interface that should've been included with 0.0.35.

Signed-off-by: squidfunk <martin.donath@squidfunk.com>
v0.0.36
2026-04-23 17:29:36 +02:00
Martin Donath d4d88f8571 fix: update ui to v0.0.15
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 17:26:26 +02:00
Martin Donath ca9743add9 chore: release v0.0.35
## Summary

This version adds native support for [GLightbox], a JavaScript lightbox library to add zoom and gallery features to images. Images can be automatically annotated with the new `glightbox` Markdown extension. Add the following to `zensical.toml`:

``` toml
[project.markdown_extensions.zensical.extensions.glightbox]
```

> [!NOTE]
>
> In order to integrate with configuration in `mkdocs.yml`, where [GLightbox] is implemented as a plugin, a compatibility shim is included, so no re-configuration is necessary if you're already using the plugin. Note that our extension is more efficient and faster than the plugin, as it does not re-parse the entire HTML of each page, but instead uses Python Markdown's native extension API.

### HTML in the table of contents

Additionally, __section titles in the table of contents will now render with HTML markup__, so you can use emojis and other inline features in section titles and have them render correctly in the table of contents. In Material for MkDocs, this functionality was implemented with the `typeset` plugin. Zensical now supports this natively.

### Relative links in raw HTML

Relative links in raw HTML are now correctly resolved. Initially, we carried over the link processing and resolution logic from MkDocs, which does not support relative links in raw HTML to this day. We implemented a Python Markdown postprocessor, to ensure that relative links in raw HTML are handled as well.

[GLightbox]: https://biati-digital.github.io/glightbox/

Signed-off-by: squidfunk <martin.donath@squidfunk.com>
v0.0.35
2026-04-23 17:03:57 +02:00
Martin Donath 676bfe2041 chore: fix mypy linter error
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 16:35:17 +02:00
Martin Donath 64f3f33b72 fix: relative links in raw HTML not correctly resolved (#258)
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 15:16:41 +02:00
Martin Donath 87abb2abef fix: remove img attributes moved to parent in GLightboxExtension
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 14:00:36 +02:00
Martin Donath 5795fc8fe4 Merge pull request #569 from zensical/fix/lightbox-extension
fix: images in raw HTML are double-processed by `GLightboxExtension`
2026-04-23 13:38:24 +02:00
squidfunk f7531afbf6 fix: images in raw HTML are double-processed by GLightboxExtension
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 13:36:05 +02:00
squidfunk 1d8dc83135 fix: ensure None attributes are not added by GlightboxExtension
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 13:35:34 +02:00
squidfunk 7c977a855a refactor: move GLightbox extension to regular Postprocessor
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 13:19:46 +02:00
Martin Donath 5519730eea feature: render section title with markup in table of contents
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 12:14:42 +02:00
Martin Donath 63f02b292e Merge pull request #566 from zensical/feature/glightbox
feature: add support for glightbox
2026-04-23 12:00:54 +02:00
squidfunk db8518dc3a feature: add plugin compatibility shim for glightbox
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 11:58:00 +02:00
squidfunk 5c1f3817df chore: fix import order
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 11:41:00 +02:00
squidfunk 057da7c2c7 feature: add support for image galleries using glightbox (#290)
Co-authored-by: Timothée Mazzucotelli <dev@pawamoy.fr>
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 11:36:13 +02:00
squidfunk 98a8e73833 docs: unify wording in comments
Signed-off-by: squidfunk <martin.donath@squidfunk.com>
2026-04-23 11:29:47 +02:00