v3.18.0 is the largest expansion of Vale's format support since v3.0.0.
MDX is now parsed natively — mdx2vast is no longer required. This release also adds support for four new markup formats: Typst (through the new typst2vast program), Quarto, MyST, and QDoc. R Markdown now works out of the box, and comment extraction now covers Lua, PHP, Haskell, R, Perl, and SCSS.
Beyond formats, there's a new meta scope for a document's machine-readable content, a --plain-progress flag, and per-package logging for vale sync in CI — plus a long list of fixes that make alert positions and scoping more accurate across every format.
✨ Sponsor Spotlight
Special thanks to Promptless — Vale's newest sponsor and the latest to receive a Spotlight page. Promptless suggests doc updates when your product changes; you review, edit, and ship.
Changelog
- 6c382ec fix: stop element-scoped rules from matching sentence fragments (#1150)
- 9b9594d fix: don't treat a word before a code span as inline markup (#1147)
- 2b159ab fix: stop corrupting suggestions containing 'PIPE'
- 390dda6 fix: compile glob patterns once at construction (#1145)
- fcf0740 fix(ls-metrics): prevent panic on empty directory (#1144)
- dd09d42 fix(core): resolve Lang and Transform in section order, not map order (#1143)
- 85ee608 fix(dita): report dita's own error output instead of just the exit status (#1141)
- fd8c2e0 refactor: satisfy revive's empty-block
- 2f65b83 fix: close display math on any line ending with
$$(#1148) - e587329 fix(lint): treat an HTML comment as a text boundary outside inline elements (#1140)
- 4691bd3 docs: add new spotlight
- 37cb109 feat: add
--plain-progress - 12fbbd7 feat: log each package when sync isn't writing to a terminal
- 9a1a16c fix: mark a QDoc image that has no alt text, and publish inline ones
- c154ac2 Keep the extracted text one line per source line (#1135)
- 8fe9804 refactor: CLI clean up and subcommand help
- ae6d749 feat: add
vale test - e5a0286 fix: read a shebang as a POSIX path
- eec2f59 fix: read a .qdocinc as the include it is, and keep meta out of prose
- 7618d04 fix: only hand the Docutils source to a Python interpreter
- b596b0d fix: stop a string run's helper processes the way a file run does
- f3f3402 fix: keep
vale offworking when QDoc prose is escaped - 54efd3b fix: escape QDoc markup
- 5666297 fix: treat a snippet marker inside a QDoc comment as markup
- c2d1a55 feat: add a meta scope for a document's machine-readable content
- 33e4012 fix: close QDoc's code blocks on the right command, and scope its divs
- 5ae4867 fix: read only
/*!as QDoc, and cover commands - e60b5bc fix: keep a rule's level in the section that set it
- c1e2fa0 fix: honor IgnoredScopes when a markup format is mapped onto source
- 85c1343 fix: place a match inside a block that inline markup rewrote
- b47ccb0 fix: don't mask an autolink's URL twice
- 65f5687 fix: skip
$…$inline math - b3bade4 fix: lint a tight list item's own text as its own block
- 4a6b7cf Don't lint a shebang as a comment (#1134)
- 77179c0 fix: report spans against the file's actual bytes
- 7f429e3 test: pin issue 1007's frontmatter and blockquote scenarios
- b049e35 feat: support the .scss extension
- b678b8d test: add QML case
- e82432d feat: extract Lua, PHP, Haskell, R, and Perl comments with tree-sitter
- 0e2f8bf eat: support QML sources via qml = qdoc
- cc710aa fix: treat only block comments as QDoc documentation
- bd1f33a ci: install typst2vast, drop mdx2vast
- 9708be6 feat: support Typst
- 15115bf fix: place a rewritten block by its longest word, not its last
- 5c91639 fix: skip a repeated match's prior occurrences by count, not by masking
- db8c83c feat: support QDoc
- fca7b79 feat: support Quarto
- 286fc59 feat: parse MDX natively, dropping mdx2vast
- fedaf20 feat: support MyST
- eec788d fix: read the character actually beside a match for inline code
- 590278e feat: lint R Markdown out of the box
- 4d8e228 fix: strip tab indentation from block comments (#1131)
- 02fb654 fix: switch on what every term of a chained scope needs
- f011cb0 fix: keep 'scope: paragraph' out of headings, tables, lists, and blockquotes