Changelog

Release history and notable changes for Panache, the formatter, linter, and language server for Quarto, Pandoc, and Markdown.

2.57.0 (2026-06-21)

Features

  • lsp: on-type continuation indent for lists (3c9bc3a)
  • linter: make rule metadata the source of truth (f0c1c74)
  • lsp: add did-create/rename/delete file operations (e1b1648)
  • lsp: extend file rename to more shortcodes and frontmatter (255978e)
  • lsp: add semanticTokens/full highlighting (0c7d247)
  • lsp: populate diagnostic related_documents (33b743d)
  • lsp: add pull diagnostics with push mode-switch (822a2ed)
  • parser: retag comment/PI/verbatim as HTML_BLOCK_RAW (447d537)
  • parser: tokenize table separator rows in the CST (3de91a6)

Bug Fixes

  • parser: stop caption theft across simple/multiline tables (89610d4)
  • linter: dedup citation keys before reporting (8ce3a15)
  • lsp: stop losing diagnostics to lint cancellation races (f72fd78)
  • parser: detect setext heading level via underline node (ff43f66), closes #377
  • formatter: keep indent on YAML value below its key (52d578a)
  • parser: skip code spans in citation detection (859a3db)

Performance Improvements

  • parser: replay table subtree instead of re-parsing (4a050dc)
  • parser: use memchr for refdef newline scan (0e64ba7)
  • salsa: raise lint-query lru to 512 (4f1615f)

Dependencies

  • updated crates/panache-formatter to v0.15.0
  • updated crates/panache-parser to v0.18.0

2.56.0 (2026-06-17)

Features

  • formatter: expose config-enum JsonSchema behind schema feature (5062bb5)
  • formatter: add table-indent config option (1365b80), resolves #344 and #352
  • formatter: hang math binary continuations flush under the RHS (0fae430)
  • formatter: align assignment-led math chains under the RHS (e20d0d6)
  • break out dprint plugin into its own repo (014ab7c)
  • config: add cache = <bool> option to toggle caching (aa20278)

Bug Fixes

  • parser: conform ordered marker on pipe-table line to pandoc (bf02d16)
  • formatter: collapse line breaks inside split citations (148f69f)

Dependencies

  • updated crates/panache-formatter to v0.14.0
  • updated crates/panache-parser to v0.17.2

2.55.0 (2026-06-15)

Features

  • formatter: nest broken binary math continuations by math-indent (5948ca1)
  • formatter: default math-indent to 2 (3d0422b)

Bug Fixes

  • editors: revert to use latest_github_release (dabe00d)
  • formatter: fix(formatter): charge math-indent against display line-break budget (754faaa)
  • parser: claim trailing caption for table-first list item (a09f066)
  • formatter: re-emit list marker for table-first item (9633b86)

Dependencies

  • updated crates/panache-formatter to v0.13.0
  • updated crates/panache-parser to v0.17.1

2.54.0 (2026-06-13)

Features

  • formatter: treat vignette yaml field as verbatim (f9d7c5a), closes #366
  • lsp: flag broken project manifests on their own URI (af5c288)
  • formatter: break math binary chains outside relations (dde4511)
  • formatter: nest binary breaks under math relation chains (0128da4)
  • formatter: break over-width display math at relations (9d7c2e5)
  • parser: tokenize math delimiters and punctuation (7249710)
  • formatter: space math command operators (1e43f25)
  • formatter: precedence-aware math operator spacing (adbebe0)
  • formatter: don’t escape | in commonmark (0092e6c), ref #367

Bug Fixes

  • parser: claim caption-led table as list item’s first line (ac1f18b)
  • formatter: keep blockquote prefix on quoted tables (b9f7d2a)
  • formatter: dedent indented code in list items (bf14ecc)
  • formatter: wrap task-item text at content column (42ecf70)
  • formatter: nest task-list children at content column (d6fb32b)
  • formatter: drop stray blank line after hashpipe block scalar (c56f60f)
  • parser: keep table captions lossless inside containers (b04f65a)
  • parser: treat deep list marker as lazy continuation (3fe17e0)

Performance Improvements

  • parser: make giant-blockquote parsing O(n) not O(n²) (4ec2cc0)
  • lsp: fold symbol-usage index into a single CST walk (e5f4498)

Dependencies

  • updated crates/panache-formatter to v0.12.0
  • updated crates/panache-parser to v0.17.0

2.53.0 (2026-06-10)

Features

  • formatter: enable wrap modes for folded yaml scalars (327f12c)
  • formatter: wrap folded YAML scalars (b8dc1c0)
  • parser: condition YAML validation on consumer profiles (f77f153)

Bug Fixes

  • formatter: add span-aware grid table formatting (75e5b2e), closes #359
  • parser: report YAML required-simple-key errors (f8f804c)
  • lsp: answer panicking request handlers with InternalError (c4dc85d)
  • formatter: don’t indent multi-line YAML scalar (b9927fa)
  • lsp: adopt LogOutputChannel for vscode-languageclient 10 (ffd61cc)

Performance Improvements

  • lsp: avoid reparse on formatting (95330af)
  • lsp: address cross-file leak and project_graph invalidation (bdf45f9)
  • cache external formatter blocks (d6b81f9)
  • cli: use shared thread budget for format/lint of multiple files (83aa8ec)
  • cli: share one external-tool thread budget (91a61e0)
  • linter: run external linters across languages concurrently (02c1e38)

Dependencies

  • updated crates/panache-formatter to v0.11.0
  • updated crates/panache-parser to v0.16.0

2.52.0 (2026-06-07)

This release comes with two major changes:

  • There is now an experimental math parser and formatter in Panache! The formatter can be enabled via the following setting:

    [experimental]
    format-math = true

    The formatter is very basic at the moment, only supporting alignment and whitespace normalization, but the intent is for it to eventually support operator-precedence-aware line breaking and other features.

  • Panache now has its own YAML parser and formatter! We have previously relied on the external yaml_parser and pretty_yaml crates. But with this release, we have now shifted over to our own hand-crafted YAML parser and formatter, fully compatible with the YAML 1.2 spec. YAML syntax is now also a first-class citizen in the Panache CST, with all markers and trivia preserved, even in the hashpipe YAML syntax for Quarto/R Markdown documents. The changes won’t be immediately visible to users, but will pave the way for better linting and LSP features in the future.

Features

  • parser: tokenize math operators into MATH_OPERATOR (303e05b)
  • formatter: add experimental math content formatter (a0e5f51)
  • linter: surface math diagnostics via math-syntax rule (20c0b5b)
  • parser: parse math content into a structural CST (cfb0c45)
  • lsp: source YAML parse-error diagnostics from the parser channel (ad2ec30)
  • parser: prefix-aware YAML scanner and builder (66a8e99)
  • parser: swap YAML parser to our built-in parser (4ed243a)
  • formatter: swap YAML formatting over to our own formatter (9e722e5)
  • extensions: add space_reference_links extension (309739d)
  • extensions: add wikilinks_title_after/before_pipe (49500f1)
  • parser: add syntax-error channel for embedded YAML (523fb62)
  • parser: embed prefix-aware YAML under HASHPIPE_YAML_CONTENT (d515896)
  • parser: drop host envelope from standalone YAML parse (5fecc99)
  • inline YAML parser CST into Panache’s CST (d240130)

Bug Fixes

  • formatter: preserve full code fence info string (e9638be), closes #356
  • linter: raise math-syntax diagnostics to error (238a3de)
  • linter: catch stray ::: inside tight list items (d88856d), closes #333
  • parser: don’t strip blockquote markers in <details> (4579dd8), closes #350
  • formatter: align nested pipe tables to container indent (#346) (1095aee)
  • parser: reject bare multi-word fence info in Pandoc (395b000)
  • parser: peel line prefix after a hashpipe block scalar (e246d30)
  • parser: don’t start list at continuation for footnote def (9494b14), closes #348
  • parser: detect grid borders on dispatch line inside list items (e7fa051)
  • parser: lift tables and fenced divs from list-item content (6f3821c)

Performance Improvements

  • lsp: run heavy lint reads on cloned salsa handle (111f6cc)
  • linter: share one CST walk across built-in rules (8569bbf)
  • lsp: debounce diagnostics, lint externally on save (99310a5)
  • parser: gate table detection before whole-buffer strip (f27fc80)

Dependencies

  • updated crates/panache-formatter to v0.10.0
  • updated crates/panache-parser to v0.15.0

2.51.0 (2026-06-02)

Features

  • config: abort on unknown extensions, add exts to schema (397e1e5)
  • config: abort on unknown config fields (d8ec90c)
  • lsp: allow folding of HTML blocks (eb97109), closes #342
  • linter: add empty_list_item rule (d033968), closes #341
  • cli: allow -o extensions.<name>=<bool> overrides (2df73ab)
  • formatter: add east_asian_line_breaks extension (4f28716), in #339, closes #339

Bug Fixes

  • formatter: preserve layout when paragraph swallows a fence shape (6458e96), closes #340
  • parser: restrict bare-URI autolinks to known schemes (#337) (930db45), closes #336
  • formatter: fix panic when formatting <!---> (b580bb9)
  • parser: keep .class/#id on executable fence info (4c8f396), fixes #334
  • formatter: keep list marker off reflowed line start (68bc1fc)
  • formatter: keep escaped pipe in table-cell code span (0b94ca2)
  • parser: reject deeply-indented empty bullets as nested lists (15691ff), ref #341

Dependencies

  • updated crates/panache-formatter to v0.9.0
  • updated crates/panache-parser to v0.14.0

2.50.0 (2026-05-29)

Features

  • lsp: honor config excludes in full doc format (bbc1407)
  • linter: increase the reach of stray-fenced-div-markers (a334951), closes #333
  • lsp: code actions to convert links inline to reference (e958a37), closes #331
  • linter: add link-text-is-url rule with autolink autofix (1249e16), closes #331
  • formatter: reflow grid table cells (721b110), closes #323
  • formatter: reflow multiline table cells (5682db7), ref #323
  • parser: reject yaml node property under parent key indent (db371fd)
  • parser: reject yaml %YAML directive with malformed version (557b116)
  • parser: reject invalid yaml block-scalar indent + tab-in-quoted (e577390)
  • parser: detect tab-in-indent-slot in yaml check_tab_as_indent (8b2ece9)
  • parser: reject yaml anchor in invalid positions (c8b8d6d)
  • parser: reject yaml tag with c-flow-indicator char (d83dca9)
  • parser: reject yaml anchor decorating alias node (53289ca)
  • parser: dispatch yaml !tag tokens in scanner (378a380)
  • parser: wrap indentless yaml seq when anchor decorates value (a7ca3c1)
  • parser: propagate yaml anchors and aliases through flow projection (5874f78)
  • parser: dispatch yaml &anchor / *alias in scanner (3959305)
  • parser: support flow collections as complex yaml keys (f1799d2)
  • parser: reject yaml doc markers in flow and seq-item quoted dedent (8eddfdc)
  • parser: reject doc-level comment-split plain scalar (BS4K) (641313a)

Bug Fixes

  • lsp: expose table reference to find-references (a194b21)
  • linter: fix false positive on bookdown table reference (773fcc1)
  • parser: don’t swallow space after inline code in emph (adf92fa), closes #332
  • linter: count reference images as definition uses (56964e6), closes #325
  • formatter: preserve grid table column widths (c4d011b)
  • keep grid tables at column 0 to match pandoc (73016e3)
  • add inline-images to gfm flavor (8ade630)
  • parser: preserve \<ws> escape arg and tab-as-content in yaml fold (c99c6a5)
  • parser: emit yaml anchor before tag in event projection (26c0b5f)
  • parser: allow column-0 block scalar body at doc root (a0f358c)
  • parser: reject YAML comment not preceded by space (a6125c3)
  • parser: reject unterminated and over-indented YAML scalars (23f855e)

Dependencies

  • updated crates/panache-formatter to v0.8.0
  • updated crates/panache-parser to v0.13.0

2.49.0 (2026-05-26)

The largest change in this release is likely a new wrap mode, semantic, which is a hybrid between sentence and preserve modes based on Semantic Line Breaks. You configure it by setting

[format]
wrap = "semantic"

in the config. It will break lines at sentence boundaries, like the sentence mode, but also preserve existing break points. In the future, I expect to tailor some lint rules to the mode according to the sembr spec, but for now it is just a new wrap mode. Thanks to @BoltonBailey for the suggestion (#313).

This release also comes with support for a new extension, four-space-rule, which is a standard Pandoc extension (off by default) that enforces a four-space indent for continuation lines. This helps Panache play nicely with systems based on Python-Markdown, where this rule is enforced. Thanks to @DamonBayer for the suggestion in #308.

Finally, there are a number of smaller bug fixes and improvements to the parser and formatter, as well as new presets for external formatters (ormolu, biome, csharpier, mix, rustfmt, isort, runic, and stylua).

Features

  • formatter: add semantic wrap mode (41f7025), closes #313
  • extensions: support four-space-rule extension (77768ba), closes #308
  • formatter: add presets for csharpier, mix, ormulu, runic (d6da0e0)
  • formatter: add presets for biome, isort, rustfmt, stylua (f477d46)
  • formatter: add language-aware and configurable abbrevations (ca9b514), closes #307

Bug Fixes

  • parser: parse blockquotes flush against div fences (faf7ad1), closes #310 and #309
  • formatter: normalize smart dashes in headings, guard rule (82c9a31)
  • parser: parse multiline tables in list+blockquote (74896c6)
  • parser: recognize nested grid/simple tables (feb5693)
  • parser: detect pipe tables in list+blockquote (75a3157)
  • formatter: keep code spans and autolinks literal under smart (7114c5d)
  • parser: walk chars in advance_columns (c0f983b), closes #314, #315, #316, #317, #318, #319, #320, #321, and #322
  • parser: enable reference links in GFM defaults (581ebfb)

Dependencies

  • updated crates/panache-formatter to v0.7.0
  • updated crates/panache-parser to v0.12.0

2.48.0 (2026-05-20)

Features

  • config: add anchor_dir and GlobMatcher (4410951)
  • config: discover .config/panache.toml (0d9a44f), closes #294
  • add JSON schema for configuration (5ae80bf), closes #295
  • editors: toggle symbol publication via settings (fdf5a94), closes #297

Bug Fixes

  • ci: pin linux-gnu binaries to a glibc 2.17 floor (a1dfa9e), fixes #300
  • cli: anchor exclude/include at the config’s directory (24b948d)
  • config: anchor flavor-overrides at the unified project dir (38f1a21)
  • lsp: floor citation completion window to char boundary (8b79812), fixes #298
  • parser: strip list+bq prefix on line-block lookahead (280c6c1)
  • parser: use stripped content in def-list emit (a8ba276)
  • parser: strip list+bq prefix on fenced-code lookahead (bc0efc3)
  • linter: resolve #ref-<citekey> anchors for cited keys (a0c0afd), closes #296
  • parser: dispatch bq-in-listitem first-line HTML blocks (bc32e49)
  • parser: dispatch bq-in-listitem first-line content (c1c0db5)
  • parser: emit BLOCK_QUOTE_MARKER for bq continuations in footnotes (f24b787)
  • interpret a-j alphabetical list as one list (bed78dd)

Dependencies

  • updated crates/panache-formatter to v0.6.1
  • updated crates/panache-parser to v0.11.0

2.47.0 (2026-05-17)

Features

  • linter: add footnote-ref-in-footnote-def rule (5976e68), closes #290
  • linter: add heading-eaten-attrs + heading-strip-comments-residue (966135d), closes #288
  • formatter: trim trailing blanklines in fenced divs (6d2fe6c)
  • formatter: add {lang} and {ext} placeholders (b00c479)
  • formatter: add "" as configurable external formatter (31c0bcb), closes #287
  • linter: add crossref-as-link-target rule (c2e649c), closes #285
  • cli: revert --line-width etc, add --option/-o (cd49506)
  • remove unused blank-lines option (c23da16)
  • cli: add line width, wrap, and blankline to format (2f3e593)
  • cli: add and honor PANACHE_CACHE_HOME env variable (96d3cd6)

Bug Fixes

  • parser: treat footnote refs inside footnote-def bodies as text (1f37425), ref #290
  • formatter: reflow BRACKETED_SPAN content (0aac341), closes #291
  • parser: lift bq + multi-line <div> open + same-line close (259241a)
  • parser: lift multi-line <div> open + same-line close (61e1df1)
  • parser: widen <div> lift for depth-aware and unclosed shapes (c7e4830)
  • parser: lift same-line HTML block with trailing text (add805e)
  • formatter: collapse blank lines inside fenced divs (eb52b1e), fixes #286
  • parser: lift list-item Comment/PI trailing-text split (50b4b45)
  • parser: demote indented isInlineTag to RawInline (c0cf92b)
  • projector: strip RawBlock first-line indent (926096e)
  • parser: bq-wrapped HTML comment/PI trailing split (af26bdd)
  • parser: split Pandoc HTML comment / PI trailing-text (3171eae)
  • parser: strip list-item indent for HTML-block lift (f19ec57)
  • parser: lift multi-line HTML blocks as list-item (faf5c85)
  • parser: lift same-line HTML block as sole list-item content (cb0a2c1)
  • parser: route indented HTML close-tag bytes (82bc43d)
  • parser: keep HTML_BLOCK on standalone </div> close form (fe1cd9c)
  • parser: lift mutliline html tags with trailing bytes (ea463f3)
  • parser: structurally lift multi-line HTML opens (5d65a02)
  • parser: avoid HTML_BLOCK_DIV panic on multi-line div (5613174)
  • parser: let blockquotes close lists properly (88ca2c2), closes #292
  • parser: handle :-captions directly before ::: (2f6a3ca)

Dependencies

  • updated crates/panache-formatter to v0.6.0
  • updated crates/panache-parser to v0.10.0

2.46.0 (2026-05-12)

Features

  • stop project root discovery walk on .git (b370865)
  • lsp: initiate root-dir walk from current file (52f52b7)
  • lsp: add completion for shortcodes (42280e5)
  • lsp: add file path completion in ![]() and []() (1081475)
  • parser: handle multi-line div tag blocks (5f350b4)

Bug Fixes

  • cli+windows: cleanly handle tmp file removal (d3aed21)
  • formatter: don’t strip !expr in hashpipe yaml (f03ca70), closes #280
  • parser: lift bq messy-shape HTML bodies into CST (e923d7c)
  • parser: lift bq same-line HTML body into CST (1ba1b1e)
  • parser: expose HTML_ATTRS for non-div strict-block tags in bq (2bd4542)
  • parser: extend bq HTML lift to non-div and inline-block (8b88578)
  • parser: lift bq-wrapped clean <div> body into CST (4bc4612)
  • parser: lift matched-pair inline-block HTML bodies into CST (f335b42), fix #4
  • parser: lift multi-line non-div strict-block HTML opens into CST (59a5f91)
  • parser: lift non-div strict-block butted-close shapes into CST (98767ab), fix #4
  • parser: lift inner strict-block HTML elements into CST (3f6f644)
  • projector: lift empty <div> into structural CST walk (179a681), fix #4
  • projector: strip blockquote markers from HTML block bodies (47e6c38)
  • parser: lift same-line <div> shapes into CST (33b6297)
  • parser: lift messy <div> shapes into CST (4c03405)
  • parser: lift inner <div> elements into CST (1b37801)
  • parser: mirror Pandoc’s isInlineTag for <script> (ba9c96f)
  • parser,formatter: don’t escape [, ] (26bbb1c)
  • parser: capture citation inside reference (c6685f4), closes #278
  • parser: correctly merge unevenly indented lists (b661b61), fixes #277
  • parser: closer cannot interrupt under pandoc (74d333a)
  • parser: don’t let <style> tags interrupt under pandoc (b77db95)
  • parser: fix plain/paragraph handling for html in parser (d7745dd)
  • parser: accept correct tags for Pandoc’s closing-forms (7ab94d1)
  • parser: match Pandoc on closing forms of inline blocks (525cdf4)
  • parser: handle multi-line void open tag (05b369d)
  • parser: handle infinite recursion in incomplete tags (95c95bf)
  • parser: handle Pandoc’s void block tags (a327162)
  • parser: handle context-aware block/inline dispatcher (1b8330d)
  • parser: don’t hardcode <div into CST (7c6515e)
  • parser: fix dialect-divergence in pandoc/commonmark (3a81ac2)
  • formatter: don’t skip PLAIN in second pass (a693f40), closes #279

Dependencies

  • updated crates/panache-formatter to v0.5.1
  • updated crates/panache-parser to v0.9.0

2.45.0 (2026-05-09)

Features

  • cli: add --verbose flag and use it in clean (a92d441), closes #272
  • cli: add a --to pandoc-json argument (b3f3785), closes #269
  • parser: gate html declarations on dialect (9e0b645)
  • parser: parser inline spans granularly (03333d2)
  • parser: add depth-aware html block parsing (2a5dcac)

Bug Fixes

  • parser: add commonmark-ascii fix (4cfcd1c)
  • parser,linter: introduce HTML_DIV_BLOCK parsing (3962e03), closes #263
  • linter: fix undefined-anchor false positive on brackspans (0b1a15a), ref #263
  • correctly parser trailing attributes in equations (492306f)
  • parser: parse references in captions (eb29a9d)

Dependencies

  • updated crates/panache-formatter to v0.5.0
  • updated crates/panache-parser to v0.8.0

2.44.0 (2026-05-07)

Features

  • linter: add undefined-achor rule (729d6be), closes #263
  • cli: report if no autofix is available with --fix (fb8e20b)
  • add dprint plugin crate (d4b5fc5)
  • cli: add --flavor argument to set flavor (7d84561), closes #262
  • cli: allow - as argument for stdin (c720c2e)

Bug Fixes

  • cli,linter: only report and write if there are fixes (b8255b7)
  • don’t overwrite flavor (84364a4)

2.43.1 (2026-05-06)

Bug Fixes

  • editors: vsix publishing step (a0d602c)

2.43.0 (2026-05-06)

Features

  • linter: add rule for stray fenced div markers (3b6ebe9), closes #255
  • linter: flag near-misses too in html entity rule (ce47752), closes #251
  • editors: bundle binaries in VSIX extension (8a98d01)

Bug Fixes

Dependencies

  • updated crates/panache-parser to v0.7.1

2.42.1 (2026-05-05)

Bug Fixes

  • editors: remove links in docs to pass vs code check (f9240fb)

2.42.0 (2026-05-05)

Features

  • linter: add linting rule for bad HTML entities (93aa280), closes #251
  • wire new reference impl into salsa and CST (3ba22c1)
  • add parse_with_refdefs and UNRESOLVED_REFERENCE (e6c17fb)
  • cli: add panache parse --to pandoc-ast output mode (f0f9ace)
  • parser: expose pandoc-native projector as public API (5b79b92)
  • editors: add executableStrategy, deprecate old options (884a3c4)
  • editors: add log-level setting (a6cf4c7)
  • editors: add restart server command (ab5cfb0)
  • editors: register as default formatter for rmd & qmd (889d640)

Bug Fixes

  • parser: degrade unresolved bracket if inner emph leaks (e1c291b), closes #250
  • handle ambiguous markers and indented code block (8d3db6d)
  • parser: allow drift tolerance for list parsing (1836a7b), closes #246
  • formatter: handle nexted list with same line marker (8d0653a), closes #247
  • parser: handle tilde-fences dispatch correctly (519abd1), closes #248
  • cli: link to correct reference page for rules (c807d70), closes #245
  • recursive into linst/blockquote/list (175d78e)
  • handle lazy-continuation for blockquote + list (4a490ff)
  • allow continuation list without blank line in definition (daed645)
  • peek-ahead in blankline in blockquote (74adea6)
  • handle pandoc-commonmark divergence on html comments (ca301f9)
  • handle same-line block quote marker (3c6c3dd)
  • parser: handle direct list-in-lis correctly (5c6a4ae)
  • correctly handle definition inside footnote (3a30b05)
  • correctly parse and format definition with bare list (72c9a2b)
  • parse and format headings inside lists (d7e714e)
  • parser: fix early-bail to not fire incor for strikeout (f486309)
  • parser: require two spaces after roman marker (8d7255f)
  • parser: allow unindented block to follow atx heading (bf84aa1)
  • parser: fix byte-order breakage in tilde-fenced code (18ca6c2), closes #249
  • editors: update package lock file and get rid off uuid (b02ef2c)

Performance Improvements

  • lsp: share salsa-cached refdef set across LSP keystroke parses (e1e2927)

Dependencies

  • updated crates/panache-formatter to v0.4.2
  • updated crates/panache-parser to v0.7.0

2.41.1 (2026-05-01)

Bug Fixes

  • formatter: extend block-token list (d087729), closes #238
  • parser: suppress nested links in Pandoc link text (b8e1c9a), bugs #1 and #2
  • parser: handle Pandoc emphasis on the IR path (afa0ef5)
  • parser: finish milestone - full commonmark compliance (33a88e8)
  • parser: implement IR algorithm (bb91c85)
  • formatter,parser: handle setext in list (86494b5)
  • parser: fix emphasis parsing for cmark (de1b406)
  • parser: handle empty maker followed by indented content (6a9b188)
  • parser: open inline blockquote for commonmark (a2ad903)
  • parser: handle rule of 5 cols for commonmark (dcb36e6)
  • parser: honor source-column tab stops (15ebe05)
  • parser: make fenced code openers interrupt paragraphs (f9a3b50)
  • parser: handle two tab cases in commonmark tests (3bf2140)
  • parser: don’t allow links to contain links in cmark (52eb5f2)
  • parser: handle last HTML block edge case (3a13337)
  • parser: handle dialect-specific list item closing (c61f93b)
  • parser: handle last refdef dialect mismatch (245543b)
  • parser: handle last block quote discrepancy in cmark (0fce82a)
  • parser: correctly handle non-uniform list indents (f7750dd)
  • parser: handle continuation in block quote better (2f209e5)
  • parser: implement better link scanning (eaca3a1)
  • parser: don’t skip code spans in closer scan (687e908)
  • parser: allow partial emphasis matching for commonmark (e172b52)
  • parser: recurse inte same-line nested lists markers (ac05e88)
  • parser: handle emphasis edge case (1b13a73)
  • parser: improve cmark emphasis parsing (95b2811)
  • parser: handle edge-cases for cmark emphasis (be57d7d)
  • maintain list markers for commonmark (084fc87)
  • parser: relax indented-code opener (c0dcfb7)
  • parser: support multiline setext headings (4b4e1a3)
  • parser: handle parser losslessnes from emphasis (0104a7c)
  • parser: don’t let ] terminate a link inside code span (18e028d)
  • parser: fix parenthesis tracking (d37ba7d)
  • parser: properly handle multilevel ref def (50f28f4)

Performance Improvements

  • parser: add IR-driven dispatch for Pandoc links/images (1e4227e)
  • parser: add IR-driven dispatch for [text]{attrs} (cf50ec5)
  • parser: add IR-driven dispatch for citations (9e826db)
  • parser: add IR-driven dispatch for [^id] footnote refs (614221e)
  • parser: add IR-driven dispatch for^[note] and <span> (1b9e618)
  • parser: early-exit + scratch reuse (c2c0387)
  • parser: add leading-byte gate (c851afe)
  • parser: add byte-level blank-line check (7530c25)
  • parser: add byte-level link-suffix whitespace skips (89b31e4)
  • parser: skip exclusion-mask pass when no brackets (92ec5db)
  • parser: byte-level is_blank_line on blank-check paths (fab385e)
  • parser: leading-byte gate in collect_refdef_labels (7058785)
  • parser: zero-alloc Roman numeral check (ff4d3eb)
  • parser: leading-byte gates on hot block parsers (57f9f69)
  • parser: memchr-based code-span scan + zero-alloc (490d593)
  • parser: byte-level trim helpers on hot per-line paths (a63a02a)
  • improve performance on the IR path (44d6d5b)

Dependencies

  • updated crates/panache-formatter to v0.4.1
  • updated crates/panache-parser to v0.6.1

2.41.0 (2026-04-29)

Features

  • parser: handle inline HTML (5fb7272)
  • add Dialect to untangle CommonMark from Pandoc (a1cb7df)
  • add npm package (a8e86b2)

Bug Fixes

  • parser: respect escapes inside reference definitions (2ec4025)
  • parser: allow fancy lists in core cmark, improve logic (191f636)
  • parser: don’t allow ref defs to break paragraphs (b05e3f3)
  • parser: allow breaks in reference links (7da4875)
  • parser: for cmark, cap digits for lists at 1-9 (39ba64b)
  • parser: correctly handle empty list items (1143607)
  • parser: properly handle fenced code inside list items (6b6ccdd)
  • parser: make blanklines inside list item a loose list (23d7a90)
  • parser: handle ruler as only list item (a1004e6)
  • parser: handle thematic breaks and setext headings (a02c3d5)
  • parser: handle autolinks and blockquotes for cmark (b1cedd4)
  • parser: handle HTML blocks for pandoc/commonmark (227648e)
  • parser: handle pandoc/cmark difference in fenced code (b370edd)
  • parser: handle backslash escapes, autolinks, empty code (317b150)
  • parser: allow space after atx and any length setext (647d274)
  • parser: enable all_symbols_escapable for commonmark (04c52d7)
  • formatter: ensure blankline before header in commonmark (fd96f2a)
  • handle thematic breaks in commonmark correctly (f98fca0)
  • parser: fix image link handling in commonmark (cac6004)
  • parser: preserve entity references in cmark (0ae7579)
  • parser: handle ATX headings in commonmark correctly (8c09c19)
  • parser: add extensions to commonmark flavor (59166ab)
  • parser: don’t emit synthethic token (a137fc4), closes #235

Dependencies

  • updated crates/panache-formatter to v0.4.0
  • updated crates/panache-parser to v0.6.0

2.40.0 (2026-04-27)

Features

  • linter: add adjacents footnote lint (9729418), closes #229

Bug Fixes

  • parser: include ~ in set of escapables (cfc0bfc), closes #231
  • parser: handle consecutive footnote definitions (e694627)
  • linter: gate lints by extensions (1a03e9b)
  • linter: de-duplicate linter diagnostics (9c63e7e)
  • linter: de-duplicate parsing calls, avoid extra parses (45407fe)

Dependencies

  • updated crates/panache-parser to v0.5.1

2.39.0 (2026-04-27)

Features

  • cli: make --debug actually useful in release builds (92a54ec)
  • cli: add --quiet command to suppress output (78818a1), closes #221
  • cli: lint and format in parallel (c7560a0)

Bug Fixes

  • formatter: avoid quote character collisions (3c04c34), closes #225
  • cli: disable color mode when TERM=dumb (eb8f12a), fixes #222
  • parser: emit empty cells for degenerate cells (095ada7), fixes #224

Dependencies

  • updated crates/panache-formatter to v0.3.0
  • updated crates/panache-parser to v0.5.0

2.38.0 (2026-04-24)

Features

  • cli: default to global cache dir (52ed047), closes #207

Bug Fixes

  • formatter: don’t break display math inside emphasis (d2eee34), closes #214
  • formatter: handle nested lists with continuation (185fa02), closes #212
  • parser: don’t let definition list adopt trailing list (b2fba48)
  • properly parse and format blockquote markers in deflist (b27eeb7), closes #209
  • lsp: only complete real @-type references (0419b45)
  • formatter: strip whitespace from code in list (b1b60c0)
  • parser: allow Rcpp as known language in hahspipe parse (0fd5979)
  • lsp: don’t lowercase bib entries (2ee14d9)
  • formatter: allow Rcpp as language for clang-format (521e087)
  • linter: correctly normalize bookdown equation label (dd7b736)
  • lsp: harden go-to-definition/reference triggers (16a9364)
  • linter: don’t mix references with chunk labels (077db86)
  • handle UTF-8 boundary bug in table parsing (2c4e20f), closes #211
  • parser: correctly emit blanklines in tables/captions (0465f45), closes #210

2.37.0 (2026-04-22)

Features

  • formatter: place table captions after the table (7d38d60)
  • formatter: use hanging indent for table captions (1234626)
  • formatter: use : as table caption prefix (618326a)
  • formatter: force one blankline after hashpipe options (68bba1b), closes #115

Bug Fixes

  • parser: don’t parse caption as definition (e542c1f)
  • greedily consume table captions (58afc1c)
  • parser: handle empty lines in hashpipe normalizer (51e6146), closes #201
  • parser: don’t drop adjacent table caption (9144d63), closes #200
  • lsp: handle nagivation URI correctly on windows (63f317e)
  • formatter: correctly handle blanklines in blockquote (834757c), fixes #199
  • formatter: handle blank line before fenced code (e7337fd), closes #198
  • formatter: strip trailing whitespace in hashpipe flow (9757c2f), fixes #194
  • parser: correctly parse deep list in blockquote (51484ac), closes #195
  • formatter: quote ambiguous labels in hashpipe conversion (e473944), closes #192
  • avoid wrapping on fancy markers in unsafe contexts (4de13dd), closes #193
  • formatter: handle citation spacing correctly (543aa46), ref #193
  • formatter: don’t collapse whitespace in hashpipe yaml (5d4b5d2), closes #185
  • parser: handle varying indentation for blockquotes (cdd3eec), closes #186
  • formatter: add list markers to unsafe wrappers (a7f1ed5), closes #187
  • formatter: normalize scalars to avoid idempotency issue (da9e3a0), closes #189
  • parser: accept empty headings (d081dd7)
  • parser: properly handle adjacent tables (6206623)
  • parser: don’t treat : table caption as def list (a287631)
  • parser: handle bare URI in gfm flavor properly (2559a99), closes #197
  • parser: fix logic around blank_before_header (c8f48c9)
  • parser: handle bare #| comments (1a7d009), fixes #188 and #190

2.36.0 (2026-04-19)

Features

  • support smart punctuation (926a4c8), closes #182
  • fallback to latest available release (008fe36)

Bug Fixes

  • avoid special normalization of yaml and hashpipe items (d8bfb76)
  • formatter: handle list-in-blockquote idempotency issue (3d20ce4), closes #177
  • handle idempotency in hashpipe yaml reconstruction (b28d675), closes #172
  • parser: parse display math over paragraph boundary (b5c9be2), closes #176
  • parser: handle utf-8 slicing in inline spans (8ccfe5c), closes #175
  • parser: flush list-item inline buffer (a49179b), closes #174
  • parser: enable inline_link for GFM flavor (8059792), closes #171
  • update cargo lock file (3fc4d9b)

2.35.0 (2026-04-16)

Features

  • add info-level debugging logs for external formatters (6228b55)

Bug Fixes

  • switch back to v* tagging for main program (9adc923)
  • parser: handle utf-8 properly (92da1cd), closes #164
  • lsp: remove extra space in tasklist-bullet list action (6cc80b3)
  • lsp: convert to actual task list (233f47c)
  • parser: handle utf-8 properly (92da1cd), closes #164
  • switch back to v* tagging for main program (9adc923)
  • switch back to v* tagging for main program (9adc923)

2.34.0 (2026-04-14)

Features

  • allow auto-flavor for .{R,r}markdown (27f3877)
  • linter: add rule for unused labels (a9d88d1)
  • linter: consider references across project (2b687dc)
  • lsp: support go-to-references for footnote definition (3d6e9f8)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • panache-parser bumped from 0.2.1 to 0.3.0

2.33.1 (2026-04-14)

Bug Fixes

  • formatter: avoid reflow-induced reparsing (388b288), closes #134
  • formatter: prevent reinterpreting parse avoiding wrap (fbf7733)
  • parser: handle deep indentation and roman nos in list (04b80f5), closes #143
  • parser: handle deep roman list and quotation (b7aac81), closes #137
  • scripts: correctly resolve tag in installation scripts (5b474fc)

Reverts

  • “chore: don’t include component in tag for root release” (eb9e15f)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • panache-parser bumped from 0.2.0 to 0.2.1

2.33.0 (2026-04-13)

Features

  • cli: add --report argument for debug command (55f3489)
  • formatter: normalize non-breaking spaces to \ (8c1756b)

Bug Fixes

  • cli: change RUFF_CACHE_DIR to PANACHE_CACHE_DIR (644480b)
  • formatter: don’t allow ([@sec](https://github.com/sec)) to wrap to new line (215a9c1), closes #138
  • formatter: fix block quote marker leakage into emphasis (b5deeb3)
  • formatter: improve citation and hashpipe handling (768c741)
  • formatters: use proper extensions for external format (9fd9ab9)
  • parser: fix continuation detection in indented context (4f1e51d), closes #139
  • parser: fix losslessness bug in grid table parsing (28f47dd), closes #132
  • parser: fix missing whitespace in nested fenced code (426aa87)
  • parser: mitigate infinite recursion in line block (612dc80)
  • parser: mitigate UTF-8 panic in hashpipe path (26c702d), closes #135
  • parser: preserve nonbreaking spaces in parser (8c1756b)
  • parser: properly handle blandlines inside display math (1e37724), closes #130

Performance Improvements

  • parser: move inline math tracking into container stack (5df8308)

Reverts

  • “chore(release): release 2.33.0 [skip ci]” (01ac037)
  • “ci: update smoke test” (93c2ae9)

Dependencies

  • The following workspace dependencies were updated
    • dependencies
      • panache-parser bumped from 0.1.0 to 0.2.0

2.32.0 (2026-04-09)

Features

  • config: more presets and add metadata (8623393)
  • editors: add Zed extension (c87e45d), closes #102
  • formatter: contextual abbreviaton rules for wrapping (1cf1a57)
  • formatter: indent tables by two spaces (864cc25), closes #89
  • formatter: presets for sqlfmt, alejandra, etc (75f3df3)
  • formatter: reinstate wrapping in footnotes (6bc8be1)
  • formatter: wrap table captions (84a7fd1)
  • implement caching for linting and formatting (db37713)

Bug Fixes

  • cli: unify missing linters/formatters (20c06c7)
  • formatter: fix idempotency issue with lists and images (9a4c5ae)
  • formatter: handle idempotency issues in YAML, divs (100f94c)
  • formatter: handle inline footnote newline wrapping (b65a1f2)
  • formatter: setup proper rules for sentence wrapping (4227f3a), closes #113
  • formatter: treat code as non-breakable in sentence wrap (482fe61)
  • formatter: use pandoc blankline normalization in divs (8491e97)
  • formatting: slacken non-breaking code logic (131bc56)
  • linter: pass explicit shell dialect for shellsheck (2d8c065)
  • parser: handle complex fenced div case (34e6e8c)
  • workaround ambiguous fenced div idempotency (19409ce)

2.31.0 (2026-04-02)

Features

  • linter: add ruff as external linter (a0506b6)
  • linter: add support for eslint external linter (4d51e97)
  • linter: attach notes to external lints (954dbd9)
  • linter: restrict external linters by language (92a812c)
  • linters: support shellsheck as external linter (6875102)
  • linter: support clippy as external linter (db3340f)
  • linter: support shellsheck as external linter (e84c323)
  • linter: support staticcheck as external linter (d665b04)
  • lsp: add source action for linting (01722b3)
  • lsp: use exact mappings for code action on ext linter (5b905ef)

Bug Fixes

  • formatter: honor wrapping mode in lists (7fbba26), closes #103
  • linter: gate notes on linter path (external/internal) (498ec8a)

2.30.0 (2026-04-01)

Features

  • lsp: add hover preview for equations (ea5f8b0)
  • parser,lsp: support bookdown equation references (bb1946b)

Bug Fixes

  • formatter: preserve non-breaking spaces (e0861db)
  • linter: canonicalize absolute path to project root (8362c9e)
  • parser,formatter: handle inline executable code (a2ba2f9)
  • parser: catch headings after yaml with no blankline (ba61c32)
  • unify cross-reference resolution (c324753)

2.29.0 (2026-03-28)

Features

  • formatter: separate top-level lists with blankline (777e090)
  • lsp,config: add suppor for gfm-auto-identifiers (31736da)
  • lsp: add file renaming for linked documents (8a7d08a)
  • lsp: add hover support for for heading references (3ca2b24)
  • lsp: add hover support for linked markdown files (4d88705)
  • lsp: add hover support for reference definitions (16bdd6f)
  • lsp: add rename handler for footnote ids (42be81d)
  • lsp: code action for converting bullet/ordered lists (d620006)
  • lsp: code action for converting list to task list (f04e91e)
  • lsp: extend file rename to shortcodes and nav elements (492877f)
  • lsp: support go-to-definition for example lists (b7fbc19)
  • lsp: support renaming for example references (15f6267)
  • parser: parse yaml comments (8b8e731)
  • support mmd-header-identifiers extension (ffe7834)
  • support mmd-link-attributes extension (5b44f9e)
  • support mmd-title-block extension (276e31c)

Bug Fixes

  • formatter: handle idempotency failure with AUTO_LINK (94c6c95)
  • formatter: mitigate idempotency growth in hashpipe yaml (82a3da1)
  • lsp,linter: correctly resolve cross-reference to header (c3a42cd)
  • parser: actually enable hard-line-breaks extension (70c9201)
  • parser: add missing code block extensions for gfm flavor (1058df6)

2.28.0 (2026-03-25)

Features

  • config: gate executable code behind extension (27a7e7e)
  • lsp: add code action for converting to explicit link (0b4a86c)
  • parser: emit CROSSREF_* markers for crossrefs (99d1174)
  • parser: introduce bookdown-specific syntax tokens (8a63e79)
  • wasm: update the WASM library (d004f73)

Bug Fixes

  • formatter: wrap and space blockquote in deflist (22409e9)
  • lsp: don’t allow slugs in implicit links (e7926fa)
  • lsp: resolve go-to-headin for implicit links (13fb0c4)
  • parser: emit list item buffer in nested def list (9342463)
  • parser: handle nested lazy lists in definition lists (7b32604)
  • wasm: clean up and fix some warnings (1261e92)

2.27.0 (2026-03-24)

Features

  • cli: don’t error when running on glob or dir (99e0440)
  • formatter: format definition lists like pandoc (8d96a40)
  • formatter: format nested headings (75a74b3)
  • formatter: normalize loose and compact definitions (21b3c87)
  • lsp: filter headings in document symbols (c6af6bb)
  • lsp: introduce incremental parsing as experimental opt (5be6df6)

Bug Fixes

  • check LINK_REF first (91ee195)
  • config: match includes/excludes relative to config root (db2f95d)
  • parser: encapsulate multiple definition list items (e28fda6)
  • parser: handle list as first lement in definition (5871252)
  • parser: parse headings in definition list items (3aa9686)
  • parser: parse headings in list items (55e5632)
  • pre-commit: remove pandoc submodule (5baed02), closes #92

Performance Improvements

  • lsp: add section-based window incremental parsing (99f7a0f)
  • lsp: improve and document salsa durability policies (7400e6e)
  • lsp: improve fallbacks in incremental parsing (c13fcb4)
  • lsp: rollback non-working incremental parsing (4dd29d4)

2.26.0 (2026-03-21)

Features

  • formatter: escape ] (f846ffc)
  • formatter: standardize checkboxes to [x] (59312ba)
  • introduce pandoc-compat field (58d9e54)
  • lsp: implement document links (eb590e0)

Bug Fixes

  • parser: don’t accept [] as tasklist check box (8700911)
  • parser: emit LINK_REF nodes for reference images (127946d)

2.25.0 (2026-03-20)

Features

  • cli: add --dump-passes to panache debug format (f54549e)
  • editors: provide qmd and rmd languages in vscode (da9bc5a)
  • formatter: compress simple table columns to content (98c4e8a)

Bug Fixes

  • formatter: don’t interpret ````markdown as fenced code (9e17ebc)
  • formatter: preserve markers in headerless table (62ec59a)
  • formatter: recover lost indentation in code block (2f94707)
  • formatter: restrict yaml frontmatter replacement (7e9bf72)
  • lsp: correctly handle renaiming (b5c0b5b)
  • lsp: limit highlight of definition to actual label (e377024)
  • parser,formatter: fix regression in definition list (10a2cd7)
  • parser: don’t treat continuation as code block (927efeb)
  • parser: fix losslessness bug in empty definition (4ede2f8)
  • parser: match pandoc’s rules for list item identation (c15688d)

2.24.1 (2026-03-19)

Bug Fixes

  • formatter: account for prefix when formatting hashpipe (b3471c2)
  • formatters: don’t hide warnings behind log flag (59b5dc0)
  • lsp: handle hyphenated references when renaming (2d507b8)

2.24.0 (2026-03-19)

Features

  • formatter: report missing external formatters jointly (1e5cd25)
  • lsp: add workspace heading symbols (ac6a8d9)

2.23.0 (2026-03-18)

Features

  • config: exclude LICENSE.md files by default (8cdad49), closes #80
  • linter,lsp: unify bookdown chunk label resolution (a71301f)
  • linter: warn on uncaptioned bookdown figure crossrefs (2de688a)
  • lsp,linter: support bookdown-style divs (d6f08af)
  • lsp: add support for Pandoc heading links (9690922)

Bug Fixes

  • cli: fix exit code with --force-exclude (f140a7b), closes #82
  • formatter: enforce wrapping in list item (c9266cb), closes #81
  • lsp: correctly report heading symbols (97d8bdb), closes #84
  • lsp: handle bookdown crossrefs with dashes (101e546)

2.22.0 (2026-03-17)

Features

  • add automatic installer scripts (1f20e76)
  • add suppor for tex_math_gfm extension (70e74cb)
  • config: add extensions.<flavor> (2accb02)
  • config: add flavor-overrides config option (6f54ff4)
  • formatter: format horizontal rules to line-width (4910606)

Bug Fixes

  • formatter: handle hashpipe YAML correct (27b3df6)
  • formatter: mitigate indentation infinite growth (264e49c), closes #78
  • parser,formatter: handle multiline exec options (e19c8ed)
  • parser: don’t parse horizontal rules as metadata/table (b695b3d)

2.21.0 (2026-03-16)

Features

  • build binaries for linux musl too (d6ada87)
  • build binaries for windows arm too (05f8c46)
  • cli: add --message-format <fmt> for linter (2eafc8c)
  • config: add [format] as replacement for [style] (c86ef90)
  • config: add include, exclude, extend-include/exclude (0d3a05e), closes #71
  • config: expose auto-identifiers extension (bdf0081)
  • config: move rules to [lint.rules] category (6fc9ade)
  • formatter: drop blanklines at start of document (e784c3d)
  • formatter: remove code block config options (3dd5846)
  • linter: add contextual hint for heading hierarchy lint (1ce7a18)
  • linter: improve lint display (bd74591)
  • lsp: adapt project graphs to project.render settings (be63ee9)
  • parser,linter: add support for github emojis :smile: (116fad2)

Bug Fixes

  • config: correctly align GFM flavor with Pandoc (7f151f8)
  • exclude release-assets from crate package to prevent crates.io 413 error (#77) (34d8196)
  • fix problem with --force-exclude (f77b670)
  • fix relative path from root issue on macos (22470ab)
  • parser: add multiple missing extensions guards (b8e2e37)

Performance Improvements

  • editors: bundle vsix extension and use esbuild (815635c)

2.20.0 (2026-03-13)

Features

  • linter: add linting rule for missing code chunk labels (a8f4709), closes #68
  • linter: add rule for duplicate chunk labels (50806ba)
  • lsp: add find-references support for crossrefs (475bd94)
  • lsp: add go-to-def, rename for exec chunk labels (5f4367d)
  • lsp: extend find-references to citations (ec2d328)
  • parser: parse in-comment execution options (35c772d)

Bug Fixes

  • parser: handle unicode properly (5886d05)

2.19.0 (2026-03-12)

Features

  • add support for github alerts (31d8055)
  • linter: add linting rule for spaces in labels (d8e522e)
  • linter: add missing link references rule (2232449)

Bug Fixes

  • formatter: handle labels with spaces in them (be100ae), closes #66
  • lsp: handle umlauts properly (a8227fb), closes #65
  • parser: handle --- without blankline before (746d827)

2.18.0 (2026-03-12)

Features

  • cli: add --no-color and --isolated (f19b7f5)
  • cli: add --stdin-filename (a574782)

Bug Fixes

  • formatter: maintain idempotency with and \\n (b22e91e)
  • formatter: remove space in code block fences (0a81b0f)
  • parser: parse \cmd{\n<content>\n} as TEX_BLOCK (8373ffb)

2.17.0 (2026-03-11)

Features

  • editors: add VS code and Open VSX extensions (#57) (0570c84), closes #55

Performance Improvements

  • formatter: use built-in greedy wrapper (ac73a3a)

2.16.0 (2026-03-11)

Features

  • cli: add panache debug format for debugging (1319489)
  • formatter: use first-fit word wrapping (66957be)

Bug Fixes

  • build: gate warnings behind debug_assertions (71c1b24)
  • build: use InitializeResult defaults, update lockfile (e1b045e), closes #53
  • formatter: fix idempotency in emphasis formatting (5e492a5)
  • formatter: fix idempotency issue in definition list (04b2b7f)

2.15.0 (2026-03-10)

Features

  • formatter: normalize indented tables (c4b394f)

Bug Fixes

  • formatter: fix idempotency around table caption (aad08f6)
  • formatter: fix idempotency failure with display math (d7e2b47)
  • formatter: fix idempotency issue in hard break in list (1b46852)
  • formatter: fix idempotency issue with display math (f47edc9)
  • formatter: handle footer and multirow grid tables (821e54f)
  • formatter: handle idempotency in code span formatting (188d10f)
  • formatter: handle idempotency with blockquote marker (854b5fe)
  • formatter: handle tex blocks properly in formatter (04ad902)
  • formatter: preserve malformed display math with dollars (78e2907)
  • formatter: protect inline math spaces (d6470b6)
  • parser,formatter: handle consecutive tables (f1a4c08)
  • parser,formatter: harden grid table parsing (05bdab9)
  • parser: don’t hardcode emphasis markers (ce7125e)
  • parser: parse whitespace after code block starter (3d28e74)

2.14.1 (2026-03-10)

Bug Fixes

  • formatter: correct list idempotency (3b0db0e)
  • formatter: fix idempotency failure in atx headings (6a61caf)
  • formatter: handle div in loose list (6514e58)
  • formatter: handle escaped char inside table (130df6f)
  • formatter: handle horizontal before setext heading (225d7b2)
  • formatter: handle non-ASCI able content (4ea70f4)
  • formatter: handle underscore emphasis with nested asterisks (71f41b0)
  • formatter: subdue blockquote marker after hard break (e3b53c9)
  • parser,formatter: tighten code fence logic (9c1ffcc)
  • parser: allow fenced blocks to interrupt paragraphs (0e521b5)
  • parser: allow references with leading spaces (9051331)
  • parser: avoid stealing captions as definition items (22855d0)
  • parser: cater to spanning-style rows (57e3ab3)
  • parser: don’t interpret continuation line as list (af73bd4)
  • parser: emit leading spaces before rule (8d58381)
  • parser: emit original line block marker (0866449)
  • parser: fix backtick-parsing in attributes (5f82e22)
  • parser: handle table with complex layout (47fd1a3)
  • parser: honor blank-before-header extension (c1f3571)
  • parser: preserve leading whitespace before fences (7f12c62)
  • parser: relax fence block detection (6cc356d)

2.14.0 (2026-03-09)

Features

  • cli: add --quiet flag (47ee630)
  • cli: add --verify for format and parser (f8fd6e6)
  • cli: make --verify a pure smoke-test screen (3619207)
  • formatter: don’t treat semicolons as sentence break (ade76a9), closes #48

Bug Fixes

  • formatter: apply block code formatting inline (5d76bea)
  • formatter: don’t line break after initials (3030451)
  • formatter: fix idempotency in fancy list formatting (f5c6509)
  • formatter: handle crossref in blockquote (2b4e729)
  • formatter: handle empty cells in grid tables (ecc7515)
  • formatter: harden external formatting (2946761)
  • formatter: require blankline before line block (0589776)
  • parser: correctly parse trailing # (942c1fa)
  • parser: don’t drop trailing whitespace in fenced div (7bd2d31)
  • parser: don’t require blankline before fenced div (f17c3aa)
  • parser: don’t trim trailing space in definition (edeae6f)
  • parser: handle line block inside grid table (100ebed)
  • parser: handle list inside blockquote (e20e756)
  • parser: handle rows exceeding separator width (4a42c63)
  • parser: handle shortcode in heading (200bfd8)
  • parser: handle spaces in indented code block (cdbf952)
  • parser: handle table after div close (a4c2940)
  • parser: handle trailing whitespace in grid table (0677abb)
  • parser: handle unicode in shortcode (7f603dc)
  • parser: parse indented block in block quote losslessly (bbd2f86)
  • paser: don’t trim trailing whitespace after marker (32e9734)

Performance Improvements

  • lsp: add lazy definition and hover handling (69f7cce)
  • lsp: add LRU tuning (7a5d439)
  • lsp: derive lint and metadata diagnostics through salsa (4ede8cb)
  • lsp: introduce durability macros into graph (b74248e)
  • lsp: unify lint pipeline to avoid duplicate parse (070e7f5)
  • lsp: use salsa::interned for project graph intternally (996be36)

2.13.0 (2026-03-07)

Features

  • formatter: add tab-width setting (3e02336)
  • formatter: normalize spacing inside fenced div (6aa73d0)
  • formatter: wrap multiline footnote refs as Pandoc (722c76a)
  • lsp: add --debug flag (ad5d81a)
  • parser: add support for raw tex blocks (841a663)

Bug Fixes

  • formatter: fix wrapping for definition lists (4dd084b)
  • formatter: omit quarto/knitr comments from formatting (36ceccb)
  • formatter: use correct ruff args (408d330), closes #46
  • linter: mitigate spurious warning for quarto crossrefs (a0e0769)
  • lsp,linter: correct bib file found range, deduplicate (9d5dfbb)
  • parser,formatter: align with pandoc’s fenced div parse (1982972)
  • parser: fix infinite recursiong bug in tex cmd parse (1f71833)
  • parser: handle tab stops gracefully (9f8aa96)
  • parser: only accept four spaces-indented def lists (11fb109)

Performance Improvements

  • lsp: build graph lazily (0efcc0d)
  • lsp: cache bibliography data (edecc10)

2.12.0 (2026-03-05)

Features

  • add RIS bibliography support (128eaf0)
  • formatter,linter: support ignore directives (17a3df2)
  • formatter: add blanklines between definitions if loose (c6a3d14)
  • improve hover preview for citations (45e0f11)
  • support JSON bibliographies (3a9ee26)

Bug Fixes

  • fix compilation error (194858a)
  • formatter: handle indentation in indented code blocks (9112856)
  • handle code block on first line of definition item (4bb42f5)
  • lsp: expand selection for edit range to top-level block (0a39399)
  • lsp: improve expansion handling for range formatting (11c4d51)
  • lsp: replace correct segment when using range format (5968b6a)
  • parser, formatter: correctly handle blocks in deflist (4ffc8bc)
  • parser,formatter: handle loose/compact definitions (063f9f3), closes #45
  • parser: don’t treat indented lists and code blocks (7b14077)
  • parser: require blankline before list in definition (ac971c0)
  • resolve bibliography paths relative to metadata files (3a878bc), closes #44

2.11.0 (2026-03-04)

Features

  • add support for implicit header references (d9fe4a3)
  • formatter: add preset for clang-format (d3f2a60)
  • formatter: add preset for shfmt (83143a2)
  • formatter: add preset for taplo TOML formatter (d5b83e5)
  • lsp,linter: add support for inline YAML references (08c141d)
  • lsp,linter: enable bookdown project integration (315bc50)
  • lsp,linter: support diagnostics and more for includes (15b61fc)
  • lsp,linter: use project and metadata files (3ed27fb)
  • lsp: add go-to-def handler for crossrefs (35c2a06)
  • lsp: add renaming support for bibliography entries (7bb30d0)
  • lsp: handle quarto cross-references separately (086e6ed)
  • lsp: maintain project-wide state (6ea5356)
  • parser: support bookdown crossref syntax (45ef2eb)

Bug Fixes

  • formatter: handle equation attributes with line after (eecf1a5)
  • lsp,linter: deduplicate bibliography entries (6602569)
  • lsp: fix duplicate bibliography issue (7f85ff7)
  • lsp: show correct lines for bib diagnostics (30177ae)
  • lsp: use platform-independent file Uris (658c3a4)
  • lsp: use platform-independent URIs (2aecf8e)
  • parser, formatter: don’t wrap latex commands (619dea5)

2.10.0 (2026-03-03)

Features

  • formatter: add sentence-wrapping mode (4048f55)
  • linter,lsp: add auto-fixing for external linters (f73e3be)

Bug Fixes

  • lsp,linter: return correct range for bibliography lint (313ca32)
  • lsp: add external lint fixing code action (1e5a847)
  • lsp: fix go-to-definition and hover handlers for citations (ef7d5e7)
  • lsp: handle go-to-definition for references (7a0bc17)

2.9.0 (2026-03-02)

Features

  • formatter: normalize links to match pandoc (3b5fdce)

Bug Fixes

  • handle list inside fenced div (6f1014c)
  • lsp: correctly extract text in AST wrappers (9bacf4d)
  • lsp: correctly map external lints to buffer (4bef1b3)

2.8.0 (2026-03-02)

Features

  • cli: add --json option to parse (c84ce49)
  • config: consistently use kebab-case (b01b5b1)
  • lsp: add support for external bibliographies (47d5177)
  • parser: handle CLRF line endings in bibtex parser (0d8a2c8)

Bug Fixes

  • correctly parse and format inline code spans with `s (7a6336b)
  • parser: correctly parse CRLF newline at end (af31e51)
  • parser: handle UTF-8 correctly in citation parsing (4678265)
  • parser: handle whitespace after heading and before attr (ee230ef)

2.8.0 (2026-03-02)

Features

  • cli: add --json option to parse (c84ce49)
  • config: consistently use kebab-case (b01b5b1)
  • lsp: add support for external bibliographies (47d5177)
  • parser: handle CLRF line endings in bibtex parser (0d8a2c8)

Bug Fixes

  • correctly parse and format inline code spans with `s (7a6336b)
  • parser: correctly parse CRLF newline at end (af31e51)
  • parser: handle UTF-8 correctly in citation parsing (4678265)
  • parser: handle whitespace after heading and before attr (ee230ef)

2.7.0 (2026-03-01)

Features

  • add pre-commit hook configuration (b31ecdb), closes #37

Bug Fixes

  • handle complex blocks in blockquotes (ec69e51)
  • parser: fix bug in losing blockquote marker (403165b)

Performance Improvements

  • lsp: add incremental parsing (b804ee9)

2.6.3 (2026-02-27)

Performance Improvements

  • refactor parser into block dispatcher approach (#36) (4804f80)

2.6.2 (2026-02-27)

Bug Fixes

  • parser: handle multilines in blockquotes (02d7c20)
  • reimplement support for setext headings (12c9182)

2.6.1 (2026-02-25)

Bug Fixes

  • parser: handle complex emphasis cases (f7fe514)

2.6.0 (2026-02-20)

Features

  • config: add [style] section, deprecate old version (2b83231)
  • config: add append_args and prepend_args (56cb4c1)
  • config: allow partial overrides (d53e1d0)
  • config: flavor-independent code block styling (5c14f2f)
  • config: remove pointless min_fence_length (4204ed5)
  • config: remove unused normalize_indented (da087e4)
  • config: use [formatters.<formatter] style (7d91023)
  • formatter: don’t assume #| for unknown language (b50f3ab)
  • formatter: format simple tables (5d048c6)
  • formatter: support ojs, mermaid, dot in hashpipe conversion (8695ae2)
  • formatter: trim trailing blanklines (6e7cd61)
  • linter: add rule for duplicate references (97fbc8a)
  • lsp: add convert to loose/compact list code action (a63c104)
  • lsp: convert between footnote styles (2fe5030)
  • lsp: enable footnote preview on hover (d25c74a)
  • parser: drop ROOT node from AST tree (6c9bd8f)
  • parser: parse ]( in links and images (73a8da0)
  • update wasm build (ff6acd9)

Bug Fixes

  • config: override code block flavor defaults (4023e29)
  • formatter: concatenate successive blanklines (5e1c06a)
  • formatter: correct alignment in multline tables (04c9ad6)
  • formatter: fix idempotency issue in table formatting (fe4af95)
  • formatter: handle attributes correctly in code blocks (6228182)
  • parser: avoid parsing expressions (69bea2b)
  • parser: correctly parse multiline captions before table (c8389d4)
  • parser: don’t parse links in CODE_INFO (2f10b8b)
  • wasm: guard yaml formatter behind wasm flag (063143c)

2.5.1 (2026-02-18)

Bug Fixes

  • formatter: properly handle grid table alignments (56c5bba)
  • parser: fix issues with CRLF parsing (6ec62f0)

2.5.0 (2026-02-17)

Features

  • parser: parse compact and loose lists and use Plain (3258724)
  • parser: parse quarto equation references (0ce1f7d)
  • parser: parse shortcodes (c6abc24)
  • parser: rename BlockMathMarker to DisplayMathMarker (68c9c32)
  • parser: standalone figures as Figure node (59d74e7)

Bug Fixes

  • config: override flavor defaults (8fe291b)
  • formatter: strip newline for external yaml format (3d54b3e)
  • parser: correctly parse lists with different markers (273ba39)
  • parser: handle lazy lists with blanklines (9d82a92)
  • parser: parse blanklines away from plain nodes (e7972ee)
  • parser: parse display math if begin/ends on delim line (ef16594)

2.4.0 (2026-02-15)

Features

  • formatter: format YAML metadata with ext formatters (eb89f06)
  • lsp: emit warnings for missing bibliographies (14fa9c9)

Bug Fixes

  • formatter: wrap first lines in definition lists (3ad7576)

2.3.0 (2026-02-14)

Features

  • cli: add support for external linters (c1937de), closes #23
  • formatter: add support for formatting grid tables (ef47bac)
  • lsp: add go to definition for links, images, footnotes (d749424)
  • lsp: add support for external linters (just jarl for r now) (5162096)
  • lsp: implement textDocment/foldingRange (7ce6ce2)
  • parser: parse code block language as token (c29016e)
  • parser: preseve LF and CRLF line endings (a470713)

Bug Fixes

  • formatter: handle unicode in table formatting (44f4bcf)
  • formatter: honor “line-ending” configuration option (248e2f2)
  • lsp: correctly detect flavor in document symbols (60af5b4)
  • parser: consistently handly CRLF line endings (6b43c9c)
  • parser: correctly parse captions before tables (2cb9e2d)
  • wasm: fix wasm build by fixing command invocation (a9a29a7)

2.2.0 (2026-02-13)

Features

  • cli: format and lint multiple files, or by globbing (f53a8fd)
  • formatter: initial formatting of execution options (879b291)
  • formatter: normalize hard line breaks to escaped (ada9f0f)

Bug Fixes

  • correctly parse and handle escaped line breaks (49154ff)
  • formatter: handle content after opening math delim (ef8c220)
  • lsp: auto-detect flavor from file extension (84dc96f)
  • make parser lossless (4add809)
  • parser: check for blank line in math after delim (f65858e)

2.1.0 (2026-02-12)

Features

  • lsp: add initial support for document symbols (81a7ef9)

Bug Fixes

  • don’t wrap quarto/rmd code chunk args in quotes (48ebd68), closes #22

2.0.0 (2026-02-12)

⚠ BREAKING CHANGES

  • change external formatting to be opt-in

Features

  • add presets for external formatters (70b297a)
  • add range formatting (902cb95)
  • change external formatting to be opt-in (8d91753)
  • formatter: standardize unordered lists to - marker (33ae608)
  • implement a linter (4af0d5e)
  • implement wrapping for links and images (929f993)
  • lsp: integrate linter with LSP server (f0ae3e9)

Bug Fixes

  • correctly deal with nested lists in definitions (5f00893)
  • correctly delegate non-stdin formatters (869d473)
  • correctly praser backslash-escaped math (c28cdc5)
  • don’t use defunct --write flag (bbe3291)
  • fix bug in flavor deserialization (3e40177)
  • fix clippy problems (5996d90)
  • fix erroneous handling of blanklines in indented code (d058b61)
  • fix some linting issues (11fc9a7)
  • handle code blocks nested in lists (761737d)
  • lsp: correctly compute range to replace (056f5cc)
  • properly emit table blanklines into AST (c48fc9e)
  • properly handle code blocks in lists (42930e0)
  • refactor parser to capture lossless tree (9bbfd9f)
  • use async formatter in LSP formatting (8efbb1a)

1.0.0 (2026-02-11)

⚠ BREAKING CHANGES

  • force subcommand use, add config to parse
  • use block parser in formatter
  • rename WrapMode options
  • change second argument in format() to Config

Features

  • add blank_lines option (c1080a4)
  • add CodeSpan to syntax (4e63609)
  • add parse() function (18b85ac)
  • add a block parser (200965d)
  • add a LSP (5befe3d)
  • add automatic flavor detection and configuration settings (bf96aee)
  • add basic formatter (de69b6c)
  • add blank line after headings (ee6f3e9)
  • add completion (7b74ed3)
  • add emphasis (c348dd2)
  • add formatter playground (2cd7148)
  • add line ending normalization and detection (2e06143)
  • add parse subcommand (f220fb3)
  • add placeholder for inline parser (891883d)
  • add support for footnote references (cdbd4f8)
  • add support for link attributes (8ee3d98)
  • add support for using remporary files with extformat (b7f68a1)
  • break math blocks onto separate lines (7727bba)
  • change second argument in format() to Config (3f993e8)
  • corectly parse inline math (085081c)
  • create custom paragraph wrapper (15a1203)
  • enable bracketed spans and native spans by default (788009c)
  • enable configurable backlash math support (a207b1f)
  • force subcommand use, add config to parse (0fe779f)
  • handle headerless simple tables (e346cf1)
  • handle labels after equations (826b61b)
  • implement backslash escape sequences (8140e7f)
  • implement code fences in block parser (0c04bce)
  • implement config system for extensions (8b3c02b)
  • implement inline code span parsing (00ed086)
  • implement inline math parsing (3fa4ca0)
  • implement line blocks (56e285d)
  • improve handling of frontmatter in lexer and parser (a4f0821)
  • make block parser recursive (60b0438)
  • normalize emphasis (6ba2061)
  • package as flake (b24730b)
  • parse BlankLine in lexer (d727494)
  • parse and format headings (cc4f95c)
  • parse div blocks (df2e717)
  • parse horizontal rules (9b48280)
  • parse inline math as part of syntax (d8ce545)
  • partially implement reference links (93fa82d)
  • properly format code blocks (9e8e256)
  • rename package to panache (e64efb4)
  • rename WrapMode options (f6a6b55)
  • show nice diffs with --check argument (807428c)
  • suppor bracketed spans (55668d3)
  • support citations (4d30e28)
  • support definition lists (3c64756)
  • support display math (88a2d4a)
  • support example lists (84a5ed6)
  • support external formatting (10aed07)
  • support fancy lists (4b41828)
  • support fenced divs (cf2bafa)
  • support formatting for pipe tables (ce4378f)
  • support grid tables (642a8a3)
  • support header attributes (daa3fca)
  • support horizontal rules (362357a)
  • support image attributes (f67f682)
  • support images (3b76a50)
  • support indented code blocks (097239b)
  • support inline code attributes (0feac47)
  • support inline footnotes (c54bd3b)
  • support inline footnotes (e379f65)
  • support inline latex (81d7ee0)
  • support inline links (9d052dd)
  • support inline raw attributes (189ded7)
  • support latex blocks (e211119)
  • support lazy block quotes (6fa9e53)
  • support lists (e650b12)
  • support metadata blocks (7e4d320)
  • support multiline tables (0ecdf67)
  • support native spans (f57bdf2)
  • support pipe tables (a9730cc)
  • support raw blocks (c17761e)
  • support raw html (1839481)
  • support reference images and links (0a5389d)
  • support simple tables (7f808ca)
  • support simple tables (dba5cbf)
  • support single and double backslash math (9a72c6a)
  • support strikethrough (5e4cb3b)
  • support sub- and superscript (e313a81)
  • support table captions (22240c5)
  • use rmarkdown not r-markdown (235363f)
  • use block parser in formatter (60cb5b4)

Bug Fixes

  • add basic handling of comments (578f72f)
  • add missing stdin field (4e27a82)
  • add support for tex commands (21c2f9b)
  • allow multiple frontmatter blocks (6e81a0d)
  • config: avoid panic when unwrapping non-existent config (752a72f)
  • correctly align and format right-aligned lists (d15e8d8)
  • correctly catch horizontal rule with * (7ae1e37)
  • correctly extract language from blocks (548d7c3)
  • correctly handle lazy continuation in definition lists (47cbcc6)
  • correctly parse bracketed spans in headings (772656e)
  • correctly parse commend end (88a612c)
  • correctly parse headerless simple tables (325b2c4)
  • correctly parse html comments without preceding space (e7180fd)
  • correctly parse hyphens in text as non-list markers (3eaa872)
  • correctly sparse task list checkboxes (037db65)
  • correctly wrap flat lists (afed9e3)
  • correctly wrap in lists (c06a73c)
  • correctly wrap list items (038b57a)
  • don’t wrap math (4e876c1)
  • enforce Pandoc spec rules for inline math parsing (2612ae5)
  • fix clippy lints (a5c646f)
  • fix continuation bug (9e24a23)
  • fix failing test due to formatting (96b4ec4)
  • fix handling of block quotes (7a421af)
  • fix handling of fenced code blocks (7a45752)
  • fix infinite loops (62365e9)
  • fix lint errors (1326251)
  • fix linter warning (9ad69a9)
  • fix list indentation issue (674c0b0)
  • fix missing quote markers (0685219)
  • fix pandoc defaults (62f6eb7)
  • fix some clippy issues (c36caa7)
  • fix word wrapping (5cf939d)
  • format syntax (f00cc8a)
  • handle headerless simple tables (202858d)
  • handle lazy block quotes (d92a732)
  • handle links and images as children of a paragraph (5f13634)
  • handle links properly (50b8475)
  • handle nested block quotes (7b92701)
  • handle nested lists (198a811)
  • handle tex environments (f952861)
  • handle wrapping around punctuation correctly (ed79abc)
  • improve list continuation parsing (2f5bc99)
  • initalize logger conditionally inside format() (15b9be3)
  • lexer: correctly parse $$$ as block math (59446d7)
  • make block quote parsing more robust (c361bcf)
  • normalize line endings to unix style (88c000f)
  • omit block quote markers from wrapped paragraph (d067268)
  • pandoc has raw_tex by default (3e83ccb)
  • parse dollar signs as text (2503bed)
  • parse inline math as part of paragraph (2e42843)
  • properly handle attributes (75f5d43)
  • properly handle fenced divs (eed54f8)
  • properly handle lazy continuation (5bd232b)
  • remove clippy warnings (d8819c3)
  • remove unchanged variable (199b77a)
  • support numbered lists (5435b5f)
  • use a for loop instead of while (8c99913)

Performance Improvements

  • add byte_offset to avoid recomputing each time (bc97d3b)
  • disable debug! and trace! in release builds (b40d27c)
  • move assertion into debug profile (fa73acd)
  • preallocate string size (d989e26)
  • reduce allocations in wrap_text (3ccda66)
  • simplify paragraph wrapper (8235242)
  • switch to trace logging (e4a0beb)