panache-cli 2.60.0__tar.gz → 2.61.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. {panache_cli-2.60.0 → panache_cli-2.61.0}/Cargo.lock +26 -40
  2. {panache_cli-2.60.0 → panache_cli-2.61.0}/Cargo.toml +3 -3
  3. {panache_cli-2.60.0 → panache_cli-2.61.0}/PKG-INFO +1 -1
  4. {panache_cli-2.60.0 → panache_cli-2.61.0}/build.rs +1 -1
  5. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/CHANGELOG.md +11 -0
  6. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/Cargo.toml +2 -2
  7. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/core.rs +21 -15
  8. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/inline.rs +68 -64
  9. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math.rs +49 -37
  10. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/CHANGELOG.md +17 -0
  11. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/Cargo.toml +1 -1
  12. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/pandoc_ast.rs +47 -0
  13. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/block_dispatcher.rs +13 -0
  14. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/html_blocks.rs +444 -48
  15. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tables.rs +48 -7
  16. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/math.rs +157 -156
  17. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/kind.rs +1 -0
  18. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/links.rs +14 -0
  19. panache_cli-2.61.0/crates/panache-parser/src/syntax/math.rs +601 -0
  20. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config/formatter_presets.rs +21 -0
  21. panache_cli-2.61.0/src/linter/rules/math_content.rs +199 -0
  22. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/unused_definitions.rs +74 -3
  23. panache_cli-2.60.0/crates/panache-parser/src/syntax/math.rs +0 -175
  24. panache_cli-2.60.0/src/linter/rules/math_content.rs +0 -283
  25. {panache_cli-2.60.0 → panache_cli-2.61.0}/LICENSE +0 -0
  26. {panache_cli-2.60.0 → panache_cli-2.61.0}/README.md +0 -0
  27. {panache_cli-2.60.0 → panache_cli-2.61.0}/assets/quarto-schema/schema.json +0 -0
  28. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/README.md +0 -0
  29. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/config.rs +0 -0
  30. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/directives.rs +0 -0
  31. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/blockquotes.rs +0 -0
  32. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/code_blocks.rs +0 -0
  33. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/fenced_divs.rs +0 -0
  34. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/hashpipe.rs +0 -0
  35. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/headings.rs +0 -0
  36. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/indent_utils.rs +0 -0
  37. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/inline_layout.rs +0 -0
  38. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/lists.rs +0 -0
  39. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/STYLE.md +0 -0
  40. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/linebreak.rs +0 -0
  41. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/operators.rs +0 -0
  42. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/render.rs +0 -0
  43. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/metadata.rs +0 -0
  44. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/paragraphs.rs +0 -0
  45. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/sentence_wrap.rs +0 -0
  46. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/shortcodes.rs +0 -0
  47. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/smart.rs +0 -0
  48. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/tables.rs +0 -0
  49. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/utils.rs +0 -0
  50. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/STYLE.md +0 -0
  51. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/block_map.rs +0 -0
  52. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/block_sequence.rs +0 -0
  53. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/document.rs +0 -0
  54. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/flow.rs +0 -0
  55. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/options.rs +0 -0
  56. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/scalar.rs +0 -0
  57. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml.rs +0 -0
  58. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter.rs +0 -0
  59. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/lib.rs +0 -0
  60. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/parser.rs +0 -0
  61. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/syntax.rs +0 -0
  62. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/utils.rs +0 -0
  63. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/yaml_engine.rs +0 -0
  64. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/README.md +0 -0
  65. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/build.rs +0 -0
  66. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/grid_layout.rs +0 -0
  67. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/lib.rs +0 -0
  68. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/options.rs +0 -0
  69. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/admonitions.rs +0 -0
  70. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/blockquotes.rs +0 -0
  71. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/code_blocks.rs +0 -0
  72. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/container_prefix.rs +0 -0
  73. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/definition_lists.rs +0 -0
  74. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/fenced_divs.rs +0 -0
  75. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/figures.rs +0 -0
  76. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/headings.rs +0 -0
  77. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/horizontal_rules.rs +0 -0
  78. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/indented_code.rs +0 -0
  79. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/latex_envs.rs +0 -0
  80. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/line_blocks.rs +0 -0
  81. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/lists.rs +0 -0
  82. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/metadata.rs +0 -0
  83. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/myst_directives.rs +0 -0
  84. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/myst_targets.rs +0 -0
  85. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/paragraphs.rs +0 -0
  86. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/raw_blocks.rs +0 -0
  87. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/reference_links.rs +0 -0
  88. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/blanklines.rs +0 -0
  89. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/blockquotes.rs +0 -0
  90. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/code_blocks.rs +0 -0
  91. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/definition_lists.rs +0 -0
  92. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/headings.rs +0 -0
  93. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/helpers.rs +0 -0
  94. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/lists.rs +0 -0
  95. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/losslessness.rs +0 -0
  96. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/metadata_guards.rs +0 -0
  97. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks.rs +0 -0
  98. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/core.rs +0 -0
  99. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/diagnostics.rs +0 -0
  100. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/bookdown.rs +0 -0
  101. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/bracketed_spans.rs +0 -0
  102. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/citations.rs +0 -0
  103. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/code_spans.rs +0 -0
  104. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/core.rs +0 -0
  105. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/emoji.rs +0 -0
  106. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/escapes.rs +0 -0
  107. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_executable.rs +0 -0
  108. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_footnotes.rs +0 -0
  109. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_html.rs +0 -0
  110. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_ir.rs +0 -0
  111. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/latex.rs +0 -0
  112. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/links.rs +0 -0
  113. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/mark.rs +0 -0
  114. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/math.rs +0 -0
  115. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/myst_roles.rs +0 -0
  116. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/myst_substitutions.rs +0 -0
  117. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/native_spans.rs +0 -0
  118. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/raw_inline.rs +0 -0
  119. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/refdef_map.rs +0 -0
  120. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/shortcodes.rs +0 -0
  121. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/sink.rs +0 -0
  122. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/strikeout.rs +0 -0
  123. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/subscript.rs +0 -0
  124. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/superscript.rs +0 -0
  125. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/svelte.rs +0 -0
  126. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/tests.rs +0 -0
  127. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/uri-schemes.csv +0 -0
  128. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/wikilinks.rs +0 -0
  129. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines.rs +0 -0
  130. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/attributes.rs +0 -0
  131. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/chunk_options.rs +0 -0
  132. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/container_stack.rs +0 -0
  133. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/continuation.rs +0 -0
  134. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/helpers.rs +0 -0
  135. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/inline_emission.rs +0 -0
  136. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/list_item_buffer.rs +0 -0
  137. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/marker_utils.rs +0 -0
  138. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/text_buffer.rs +0 -0
  139. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/tree_copy.rs +0 -0
  140. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/yaml_regions.rs +0 -0
  141. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils.rs +0 -0
  142. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/cooking.rs +0 -0
  143. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/events.rs +0 -0
  144. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/model.rs +0 -0
  145. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/parser.rs +0 -0
  146. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/profile.rs +0 -0
  147. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/scanner.rs +0 -0
  148. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/validator.rs +0 -0
  149. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml.rs +0 -0
  150. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser.rs +0 -0
  151. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/range_utils.rs +0 -0
  152. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/alerts.rs +0 -0
  153. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/ast.rs +0 -0
  154. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/attributes.rs +0 -0
  155. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/block_quotes.rs +0 -0
  156. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/blocks.rs +0 -0
  157. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/chunk_options.rs +0 -0
  158. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/citations.rs +0 -0
  159. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/code_blocks.rs +0 -0
  160. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/crossrefs.rs +0 -0
  161. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/definitions.rs +0 -0
  162. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/fenced_divs.rs +0 -0
  163. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/headings.rs +0 -0
  164. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/inlines.rs +0 -0
  165. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/lists.rs +0 -0
  166. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/myst.rs +0 -0
  167. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/raw_tex.rs +0 -0
  168. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/references.rs +0 -0
  169. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/shortcodes.rs +0 -0
  170. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/tables.rs +0 -0
  171. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/yaml.rs +0 -0
  172. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/yaml_ast.rs +0 -0
  173. {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax.rs +0 -0
  174. {panache_cli-2.60.0 → panache_cli-2.61.0}/pyproject.toml +0 -0
  175. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/bibtex.rs +0 -0
  176. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/csl_json.rs +0 -0
  177. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/csl_yaml.rs +0 -0
  178. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/index.rs +0 -0
  179. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/preview.rs +0 -0
  180. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/ris.rs +0 -0
  181. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib.rs +0 -0
  182. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bin/distill_quarto_schema.rs +0 -0
  183. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/cache.rs +0 -0
  184. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/cli.rs +0 -0
  185. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config/types/schema_helpers.rs +0 -0
  186. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config/types.rs +0 -0
  187. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config.rs +0 -0
  188. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/diagnostic_renderer.rs +0 -0
  189. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/directives.rs +0 -0
  190. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/external_formatters_common.rs +0 -0
  191. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/external_formatters_sync.rs +0 -0
  192. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/external_tools_common.rs +0 -0
  193. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/formatter.rs +0 -0
  194. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/includes.rs +0 -0
  195. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lib.rs +0 -0
  196. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/code_block_collector.rs +0 -0
  197. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/diagnostics.rs +0 -0
  198. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/clippy.rs +0 -0
  199. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/eslint.rs +0 -0
  200. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/jarl.rs +0 -0
  201. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/ruff.rs +0 -0
  202. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/shellcheck.rs +0 -0
  203. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/staticcheck.rs +0 -0
  204. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters.rs +0 -0
  205. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters_sync.rs +0 -0
  206. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/fuzzy.rs +0 -0
  207. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/index.rs +0 -0
  208. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/metadata_diagnostics.rs +0 -0
  209. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/offsets.rs +0 -0
  210. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/distill.rs +0 -0
  211. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/interp.rs +0 -0
  212. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/model.rs +0 -0
  213. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/report.rs +0 -0
  214. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/value.rs +0 -0
  215. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema.rs +0 -0
  216. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/adjacent_footnote_refs.rs +0 -0
  217. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/chunk_label_spaces.rs +0 -0
  218. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/citation_keys.rs +0 -0
  219. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/consumer_divergence.rs +0 -0
  220. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/crossref_as_link_target.rs +0 -0
  221. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/duplicate_references.rs +0 -0
  222. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/emoji_aliases.rs +0 -0
  223. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/empty_list_item.rs +0 -0
  224. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/empty_values.rs +0 -0
  225. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/figure_crossref_captions.rs +0 -0
  226. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/footnote_ref_in_footnote_def.rs +0 -0
  227. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/heading_eaten_attrs.rs +0 -0
  228. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/heading_hierarchy.rs +0 -0
  229. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/heading_strip_comments_residue.rs +0 -0
  230. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/html_entities.rs +0 -0
  231. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/link_text_is_url.rs +0 -0
  232. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/missing_chunk_labels.rs +0 -0
  233. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/quarto_schema.rs +0 -0
  234. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/stray_fenced_div_markers.rs +0 -0
  235. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/undefined_anchor.rs +0 -0
  236. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/undefined_references.rs +0 -0
  237. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules.rs +0 -0
  238. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/runner.rs +0 -0
  239. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/yaml_resolve.rs +0 -0
  240. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter.rs +0 -0
  241. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/config.rs +0 -0
  242. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/context.rs +0 -0
  243. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/conversions.rs +0 -0
  244. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/dispatch.rs +0 -0
  245. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/documents.rs +0 -0
  246. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/global_state.rs +0 -0
  247. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/code_actions.rs +0 -0
  248. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/completion.rs +0 -0
  249. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/configuration.rs +0 -0
  250. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/diagnostics.rs +0 -0
  251. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/document_highlight.rs +0 -0
  252. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/document_links.rs +0 -0
  253. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/document_symbols.rs +0 -0
  254. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/file_operations.rs +0 -0
  255. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/file_rename.rs +0 -0
  256. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/file_watcher.rs +0 -0
  257. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/folding_ranges.rs +0 -0
  258. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/footnote_conversion.rs +0 -0
  259. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/formatting.rs +0 -0
  260. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/goto_definition.rs +0 -0
  261. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/heading_link_conversion.rs +0 -0
  262. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/hover.rs +0 -0
  263. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/link_conversion.rs +0 -0
  264. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/linked_editing_range.rs +0 -0
  265. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/list_conversion.rs +0 -0
  266. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/prepare_rename.rs +0 -0
  267. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/references.rs +0 -0
  268. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/rename.rs +0 -0
  269. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/semantic_tokens.rs +0 -0
  270. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/shortcode_args.rs +0 -0
  271. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/workspace_folders.rs +0 -0
  272. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/workspace_symbols.rs +0 -0
  273. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers.rs +0 -0
  274. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/helpers.rs +0 -0
  275. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/navigation.rs +0 -0
  276. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/symbols.rs +0 -0
  277. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/task_pool.rs +0 -0
  278. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/testing.rs +0 -0
  279. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/uri_ext.rs +0 -0
  280. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp.rs +0 -0
  281. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/main.rs +0 -0
  282. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/bibliography.rs +0 -0
  283. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/citations.rs +0 -0
  284. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/project.rs +0 -0
  285. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/references.rs +0 -0
  286. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/yaml.rs +0 -0
  287. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata.rs +0 -0
  288. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/parser.rs +0 -0
  289. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/range_utils.rs +0 -0
  290. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/salsa.rs +0 -0
  291. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/syntax.rs +0 -0
  292. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/utils.rs +0 -0
  293. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/yaml_engine.rs +0 -0
  294. {panache_cli-2.60.0 → panache_cli-2.61.0}/src/yaml_regions.rs +0 -0
@@ -372,9 +372,9 @@ checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
372
372
 
373
373
  [[package]]
374
374
  name = "defmt"
375
- version = "1.1.0"
375
+ version = "1.1.1"
376
376
  source = "registry+https://github.com/rust-lang/crates.io-index"
377
- checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f"
377
+ checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1"
378
378
  dependencies = [
379
379
  "bitflags 1.3.2",
380
380
  "defmt-macros",
@@ -382,12 +382,11 @@ dependencies = [
382
382
 
383
383
  [[package]]
384
384
  name = "defmt-macros"
385
- version = "1.1.0"
385
+ version = "1.1.1"
386
386
  source = "registry+https://github.com/rust-lang/crates.io-index"
387
- checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b"
387
+ checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8"
388
388
  dependencies = [
389
389
  "defmt-parser",
390
- "proc-macro-error2",
391
390
  "proc-macro2",
392
391
  "quote",
393
392
  "syn",
@@ -931,9 +930,9 @@ dependencies = [
931
930
 
932
931
  [[package]]
933
932
  name = "jsonschema"
934
- version = "0.46.8"
933
+ version = "0.46.9"
935
934
  source = "registry+https://github.com/rust-lang/crates.io-index"
936
- checksum = "24fc8535da347b994f6d2fab0a84b74e3b31ad08ebe4204d95f3e755db7af49b"
935
+ checksum = "1d865ca7ca04445fcaa1d751fda3dc43b0113ba2fcddc65d5a0fcb474a7c3bba"
937
936
  dependencies = [
938
937
  "ahash",
939
938
  "bytecount",
@@ -944,18 +943,27 @@ dependencies = [
944
943
  "getrandom 0.3.4",
945
944
  "idna",
946
945
  "itoa",
946
+ "jsonschema-regex",
947
947
  "num-cmp",
948
948
  "num-traits",
949
949
  "percent-encoding",
950
950
  "referencing",
951
951
  "regex",
952
- "regex-syntax",
953
952
  "serde",
954
953
  "serde_json",
955
954
  "unicode-general-category",
956
955
  "uuid-simd",
957
956
  ]
958
957
 
958
+ [[package]]
959
+ name = "jsonschema-regex"
960
+ version = "0.46.9"
961
+ source = "registry+https://github.com/rust-lang/crates.io-index"
962
+ checksum = "4b7fc96cd6677cc81b00607d43477327d719419937ef1c44b3556a40f517d54c"
963
+ dependencies = [
964
+ "regex-syntax",
965
+ ]
966
+
959
967
  [[package]]
960
968
  name = "lazy_static"
961
969
  version = "1.5.0"
@@ -1083,9 +1091,9 @@ dependencies = [
1083
1091
 
1084
1092
  [[package]]
1085
1093
  name = "num-bigint"
1086
- version = "0.4.6"
1094
+ version = "0.4.7"
1087
1095
  source = "registry+https://github.com/rust-lang/crates.io-index"
1088
- checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
1096
+ checksum = "c863e9ab5e7bf9c99ba75e1050f1e4d624ae87ed3532d6238ffbdc7b585dbbe6"
1089
1097
  dependencies = [
1090
1098
  "num-integer",
1091
1099
  "num-traits",
@@ -1182,7 +1190,7 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
1182
1190
 
1183
1191
  [[package]]
1184
1192
  name = "panache"
1185
- version = "2.60.0"
1193
+ version = "2.61.0"
1186
1194
  dependencies = [
1187
1195
  "annotate-snippets",
1188
1196
  "assert_cmd",
@@ -1226,7 +1234,7 @@ dependencies = [
1226
1234
 
1227
1235
  [[package]]
1228
1236
  name = "panache-formatter"
1229
- version = "0.18.0"
1237
+ version = "0.19.0"
1230
1238
  dependencies = [
1231
1239
  "insta",
1232
1240
  "log",
@@ -1244,7 +1252,7 @@ dependencies = [
1244
1252
 
1245
1253
  [[package]]
1246
1254
  name = "panache-parser"
1247
- version = "0.20.0"
1255
+ version = "0.21.0"
1248
1256
  dependencies = [
1249
1257
  "entities",
1250
1258
  "insta",
@@ -1392,28 +1400,6 @@ dependencies = [
1392
1400
  "yaml_parser",
1393
1401
  ]
1394
1402
 
1395
- [[package]]
1396
- name = "proc-macro-error-attr2"
1397
- version = "2.0.0"
1398
- source = "registry+https://github.com/rust-lang/crates.io-index"
1399
- checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
1400
- dependencies = [
1401
- "proc-macro2",
1402
- "quote",
1403
- ]
1404
-
1405
- [[package]]
1406
- name = "proc-macro-error2"
1407
- version = "2.0.1"
1408
- source = "registry+https://github.com/rust-lang/crates.io-index"
1409
- checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
1410
- dependencies = [
1411
- "proc-macro-error-attr2",
1412
- "proc-macro2",
1413
- "quote",
1414
- "syn",
1415
- ]
1416
-
1417
1403
  [[package]]
1418
1404
  name = "proc-macro2"
1419
1405
  version = "1.0.106"
@@ -1515,9 +1501,9 @@ dependencies = [
1515
1501
 
1516
1502
  [[package]]
1517
1503
  name = "referencing"
1518
- version = "0.46.8"
1504
+ version = "0.46.9"
1519
1505
  source = "registry+https://github.com/rust-lang/crates.io-index"
1520
- checksum = "1c8dceb372b46fecd006be48ca335468b49ad887a7f0150cabd6098fa4fc500f"
1506
+ checksum = "77954d81b2e1c5e8ab889f9f597a92f852ab073255de9e37ee3fb443efd57051"
1521
1507
  dependencies = [
1522
1508
  "ahash",
1523
1509
  "fluent-uri 0.4.1",
@@ -1585,9 +1571,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
1585
1571
 
1586
1572
  [[package]]
1587
1573
  name = "rustc-hash"
1588
- version = "2.1.2"
1574
+ version = "2.1.3"
1589
1575
  source = "registry+https://github.com/rust-lang/crates.io-index"
1590
- checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
1576
+ checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
1591
1577
 
1592
1578
  [[package]]
1593
1579
  name = "rustix"
@@ -1625,7 +1611,7 @@ dependencies = [
1625
1611
  "parking_lot",
1626
1612
  "portable-atomic",
1627
1613
  "rayon",
1628
- "rustc-hash 2.1.2",
1614
+ "rustc-hash 2.1.3",
1629
1615
  "salsa-macro-rules",
1630
1616
  "salsa-macros",
1631
1617
  "smallvec",
@@ -7,7 +7,7 @@ authors = ["Johan Larsson <johan@jolars.co>"]
7
7
 
8
8
  [package]
9
9
  name = "panache"
10
- version = "2.60.0"
10
+ version = "2.61.0"
11
11
  edition.workspace = true
12
12
  # `distill_quarto_schema` is a dev-only vendoring bin (src/bin/); keep bare
13
13
  # `cargo run` resolving to the CLI for tooling like the pre-commit format hook.
@@ -48,8 +48,8 @@ path = "src/main.rs"
48
48
  required-features = ["cli"]
49
49
 
50
50
  [dependencies]
51
- panache-formatter = { path = "crates/panache-formatter", version = "0.18.0" }
52
- panache-parser = { path = "crates/panache-parser", version = "0.20.0", features = [
51
+ panache-formatter = { path = "crates/panache-formatter", version = "0.19.0" }
52
+ panache-parser = { path = "crates/panache-parser", version = "0.21.0", features = [
53
53
  "serde",
54
54
  "schema",
55
55
  ] }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: panache-cli
3
- Version: 2.60.0
3
+ Version: 2.61.0
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -80,7 +80,7 @@ fn generate_cli_markdown() -> Result<()> {
80
80
  let mut document = String::new();
81
81
  document.push_str("---\n");
82
82
  document.push_str("title: CLI Reference\n");
83
- document.push_str("description: >\n Comprehensive reference for the Panache CLI, including all commands, options,\nand usage examples.\n");
83
+ document.push_str("description: >\n Comprehensive reference for the Panache CLI, including all commands, options,\n and usage examples.\n");
84
84
  document.push_str("---\n\n");
85
85
  document.push_str(&markdown);
86
86
 
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.19.0](https://github.com/jolars/panache/compare/panache-formatter-v0.18.0...panache-formatter-v0.19.0) (2026-07-04)
4
+
5
+ ### Features
6
+ - **parser:** flag unbalanced `\left`/`\right` in math ([`73750c9`](https://github.com/jolars/panache/commit/73750c9b854e8899fcd2b7180c21f9b2eb7af892))
7
+
8
+ ### Bug Fixes
9
+ - **formatter:** route non-reflowable math verbatim ([`bd577dc`](https://github.com/jolars/panache/commit/bd577dcd7884428b83ea9034a048863c97368c28))
10
+
11
+ ### Dependencies
12
+ - updated crates/panache-parser to v0.21.0
13
+
3
14
  ## [0.18.0](https://github.com/jolars/panache/compare/panache-formatter-v0.17.0...panache-formatter-v0.18.0) (2026-07-01)
4
15
 
5
16
  ### Features
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "panache-formatter"
3
- version = "0.18.0"
3
+ version = "0.19.0"
4
4
  edition.workspace = true
5
5
  include = [
6
6
  "/src/**/*",
@@ -18,7 +18,7 @@ keywords = ["quarto", "pandoc", "markdown", "formatter"]
18
18
  categories = ["text-processing"]
19
19
 
20
20
  [dependencies]
21
- panache-parser = { path = "../panache-parser", version = "0.20.0" }
21
+ panache-parser = { path = "../panache-parser", version = "0.21.0" }
22
22
  log = { version = "0.4.31", features = ["release_max_level_debug"] }
23
23
  rowan = "0.16.1"
24
24
  serde = { version = "1.0", features = ["derive"], optional = true }
@@ -2680,14 +2680,17 @@ impl Formatter {
2680
2680
  &self.config,
2681
2681
  MathContext::EnvironmentBody,
2682
2682
  );
2683
- if opts.enabled {
2684
- self.output.push('\n');
2685
- self.output.push_str(&math::format_math(&content, &opts));
2686
- self.output.push('\n');
2687
- } else {
2688
- self.output.push_str(&content);
2689
- if !content.ends_with('\n') {
2683
+ match math::format_math(&content, &opts) {
2684
+ Some(body) => {
2690
2685
  self.output.push('\n');
2686
+ self.output.push_str(&body);
2687
+ self.output.push('\n');
2688
+ }
2689
+ None => {
2690
+ self.output.push_str(&content);
2691
+ if !content.ends_with('\n') {
2692
+ self.output.push('\n');
2693
+ }
2691
2694
  }
2692
2695
  }
2693
2696
  }
@@ -2704,16 +2707,19 @@ impl Formatter {
2704
2707
  // Math content
2705
2708
  if let Some(content) = math_content {
2706
2709
  let opts = MathFormatOptions::from_config(&self.config, MathContext::Display);
2707
- if opts.enabled {
2708
- self.output.push_str(&math::format_math(&content, &opts));
2709
- self.output.push('\n');
2710
- } else {
2711
- let math_indent = self.config.math_indent;
2712
- for line in content.trim().lines() {
2713
- self.output.push_str(&" ".repeat(math_indent));
2714
- self.output.push_str(line.trim_end());
2710
+ match math::format_math(&content, &opts) {
2711
+ Some(body) => {
2712
+ self.output.push_str(&body);
2715
2713
  self.output.push('\n');
2716
2714
  }
2715
+ None => {
2716
+ let math_indent = self.config.math_indent;
2717
+ for line in content.trim().lines() {
2718
+ self.output.push_str(&" ".repeat(math_indent));
2719
+ self.output.push_str(line.trim_end());
2720
+ self.output.push('\n');
2721
+ }
2722
+ }
2717
2723
  }
2718
2724
  }
2719
2725
 
@@ -530,23 +530,21 @@ pub(super) fn format_inline_node(node: &SyntaxNode, config: &Config) -> String {
530
530
  // verbatim (byte-identical to before).
531
531
  if is_display_math {
532
532
  let opts = MathFormatOptions::from_config(config, MathContext::Display);
533
- if opts.enabled {
534
- let clean = InlineMath::cast(node.clone())
535
- .map(|m| m.content())
536
- .unwrap_or_else(|| content.clone());
537
- format!("{}\n{}\n{}", open, math::format_math(&clean, &opts), close)
538
- } else {
539
- format!("{}\n{}\n{}", open, content.trim(), close)
533
+ let clean = InlineMath::cast(node.clone())
534
+ .map(|m| m.content())
535
+ .unwrap_or_else(|| content.clone());
536
+ match math::format_math(&clean, &opts) {
537
+ Some(body) => format!("{}\n{}\n{}", open, body, close),
538
+ None => format!("{}\n{}\n{}", open, content.trim(), close),
540
539
  }
541
540
  } else {
542
541
  let opts = MathFormatOptions::from_config(config, MathContext::Inline);
543
- if opts.enabled {
544
- let clean = InlineMath::cast(node.clone())
545
- .map(|m| m.content())
546
- .unwrap_or_else(|| content.clone());
547
- format!("{}{}{}", open, math::format_math(&clean, &opts), close)
548
- } else {
549
- format!("{}{}{}", open, content, close)
542
+ let clean = InlineMath::cast(node.clone())
543
+ .map(|m| m.content())
544
+ .unwrap_or_else(|| content.clone());
545
+ match math::format_math(&clean, &opts) {
546
+ Some(body) => format!("{}{}{}", open, body, close),
547
+ None => format!("{}{}{}", open, content, close),
550
548
  }
551
549
  }
552
550
  }
@@ -589,14 +587,17 @@ pub(super) fn format_inline_node(node: &SyntaxNode, config: &Config) -> String {
589
587
  if is_environment {
590
588
  let opts = MathFormatOptions::from_config(config, MathContext::EnvironmentBody);
591
589
  result.push_str(open);
592
- if opts.enabled {
593
- result.push('\n');
594
- result.push_str(&math::format_math(&content, &opts));
595
- result.push('\n');
596
- } else {
597
- result.push_str(&content);
598
- if !content.ends_with('\n') {
590
+ match math::format_math(&content, &opts) {
591
+ Some(body) => {
599
592
  result.push('\n');
593
+ result.push_str(&body);
594
+ result.push('\n');
595
+ }
596
+ None => {
597
+ result.push_str(&content);
598
+ if !content.ends_with('\n') {
599
+ result.push('\n');
600
+ }
600
601
  }
601
602
  }
602
603
  result.push_str(close);
@@ -611,52 +612,55 @@ pub(super) fn format_inline_node(node: &SyntaxNode, config: &Config) -> String {
611
612
  result.push('\n');
612
613
 
613
614
  let opts = MathFormatOptions::from_config(config, MathContext::Display);
614
- if opts.enabled {
615
- result.push_str(&math::format_math(&content, &opts));
616
- result.push('\n');
617
- } else {
618
- // Process content: drop leading blank (whitespace-only) lines and
619
- // trailing whitespace, strip common leading indentation, then
620
- // re-indent every line by `math_indent`. Leading whitespace-only
621
- // lines must be dropped rather than emitted: a blank line directly
622
- // after the opening `$$` reparses as a paragraph break that splits
623
- // the display math (pandoc ends `$$…$$` on any blank line), so
624
- // emitting one is not lossless across passes. The opening marker's
625
- // own trailing whitespace (`$$ `) surfaces here as exactly such a
626
- // leading line. Stripping only full blank lines (not leading spaces
627
- // of a content line) keeps each real line's indent visible to
628
- // `min_indent`, so the re-indent stays idempotent.
629
- let mut trimmed_content = content.trim_end();
630
- while let Some((first, rest)) = trimmed_content.split_once('\n') {
631
- if first.trim().is_empty() {
632
- trimmed_content = rest;
633
- } else {
634
- break;
635
- }
615
+ match math::format_math(&content, &opts) {
616
+ Some(body) => {
617
+ result.push_str(&body);
618
+ result.push('\n');
636
619
  }
637
- if !trimmed_content.is_empty() {
638
- // Find minimum indentation across all non-empty lines
639
- let min_indent = trimmed_content
640
- .lines()
641
- .filter(|line| !line.trim().is_empty())
642
- .map(|line| line.len() - line.trim_start().len())
643
- .min()
644
- .unwrap_or(0);
645
-
646
- let pad = " ".repeat(config.math_indent);
647
- // Strip common indentation, then re-indent each line.
648
- for line in trimmed_content.lines() {
649
- let stripped = if line.len() >= min_indent {
650
- &line[min_indent..]
620
+ None => {
621
+ // Process content: drop leading blank (whitespace-only) lines and
622
+ // trailing whitespace, strip common leading indentation, then
623
+ // re-indent every line by `math_indent`. Leading whitespace-only
624
+ // lines must be dropped rather than emitted: a blank line directly
625
+ // after the opening `$$` reparses as a paragraph break that splits
626
+ // the display math (pandoc ends `$$…$$` on any blank line), so
627
+ // emitting one is not lossless across passes. The opening marker's
628
+ // own trailing whitespace (`$$ `) surfaces here as exactly such a
629
+ // leading line. Stripping only full blank lines (not leading spaces
630
+ // of a content line) keeps each real line's indent visible to
631
+ // `min_indent`, so the re-indent stays idempotent.
632
+ let mut trimmed_content = content.trim_end();
633
+ while let Some((first, rest)) = trimmed_content.split_once('\n') {
634
+ if first.trim().is_empty() {
635
+ trimmed_content = rest;
651
636
  } else {
652
- line
653
- };
654
- // Skip padding blank lines to avoid trailing whitespace.
655
- if !stripped.is_empty() {
656
- result.push_str(&pad);
657
- result.push_str(stripped);
637
+ break;
638
+ }
639
+ }
640
+ if !trimmed_content.is_empty() {
641
+ // Find minimum indentation across all non-empty lines
642
+ let min_indent = trimmed_content
643
+ .lines()
644
+ .filter(|line| !line.trim().is_empty())
645
+ .map(|line| line.len() - line.trim_start().len())
646
+ .min()
647
+ .unwrap_or(0);
648
+
649
+ let pad = " ".repeat(config.math_indent);
650
+ // Strip common indentation, then re-indent each line.
651
+ for line in trimmed_content.lines() {
652
+ let stripped = if line.len() >= min_indent {
653
+ &line[min_indent..]
654
+ } else {
655
+ line
656
+ };
657
+ // Skip padding blank lines to avoid trailing whitespace.
658
+ if !stripped.is_empty() {
659
+ result.push_str(&pad);
660
+ result.push_str(stripped);
661
+ }
662
+ result.push('\n');
658
663
  }
659
- result.push('\n');
660
664
  }
661
665
  }
662
666
  }
@@ -23,8 +23,8 @@
23
23
  //! default) callers emit math verbatim and never reach this module; on, they
24
24
  //! route content through [`format_math`].
25
25
 
26
- use panache_parser::parser::math::{MathParseOptions, parse_math_report};
27
- use panache_parser::syntax::SyntaxNode;
26
+ use panache_parser::parser::math::{MathParseOptions, parse_math_content};
27
+ use panache_parser::syntax::{SyntaxNode, math_diagnostics};
28
28
 
29
29
  mod linebreak;
30
30
  pub mod operators;
@@ -77,35 +77,36 @@ impl MathFormatOptions {
77
77
  }
78
78
  }
79
79
 
80
- /// Format clean math content (delimiters excluded, both in and out).
80
+ /// Reflow clean math content (delimiters excluded, both in and out).
81
81
  ///
82
- /// Returns the input unchanged — never panicking, never erroring — on any bail
83
- /// condition: the gate is off, the content has an unescaped lone `$` (a
84
- /// preservation guard against cross-pass drift), or the structural parse
85
- /// reports a diagnostic (malformed math is never reflowed). Otherwise it
86
- /// re-emits the content per `STYLE.md`.
87
- pub fn format_math(input: &str, opts: &MathFormatOptions) -> String {
82
+ /// Returns `None` — never panicking, never erroring — on any bail condition: the
83
+ /// gate is off, the content has an unescaped lone `$` (a preservation guard
84
+ /// against cross-pass drift), or the structural parse reports a diagnostic
85
+ /// (malformed math is never reflowed). The caller then emits the content through
86
+ /// its own verbatim path, so gate-off and malformed-gate-on stay byte-identical
87
+ /// and no fence-padding normalization is duplicated here. On success it returns
88
+ /// the reflowed content per `STYLE.md`.
89
+ pub fn format_math(input: &str, opts: &MathFormatOptions) -> Option<String> {
88
90
  if !opts.enabled {
89
- return input.to_string();
91
+ return None;
90
92
  }
91
93
  // Lone unescaped `$` inside content confuses delimiter handling downstream;
92
94
  // mirror the existing `has_unescaped_single_dollar_in_content` guard.
93
95
  if has_unescaped_single_dollar(input) {
94
- return input.to_string();
96
+ return None;
95
97
  }
96
- let report = parse_math_report(
98
+ let tree = SyntaxNode::new_root(parse_math_content(
97
99
  input,
98
100
  MathParseOptions {
99
101
  bookdown_equation_labels: opts.bookdown_equation_labels,
100
102
  },
101
- );
103
+ ));
102
104
  // Malformed math (unclosed/mismatched braces or environments) has an
103
- // untrustworthy row/column structure — leave it exactly as written.
104
- if !report.diagnostics.is_empty() {
105
- return input.to_string();
105
+ // untrustworthy row/column structure — leave it to the caller's verbatim path.
106
+ if !math_diagnostics(&tree).is_empty() {
107
+ return None;
106
108
  }
107
- let tree = SyntaxNode::new_root(report.green);
108
- render::render(&tree, opts)
109
+ Some(render::render(&tree, opts))
109
110
  }
110
111
 
111
112
  /// String-level twin of `DisplayMath::has_unescaped_single_dollar_in_content`
@@ -151,7 +152,13 @@ mod tests {
151
152
  }
152
153
 
153
154
  fn fmt(input: &str, context: MathContext) -> String {
154
- format_math(input, &opts(context))
155
+ fmt_with(input, &opts(context))
156
+ }
157
+
158
+ /// Reflow with explicit options; unwraps because these cases are well-formed
159
+ /// (`format_math` only returns `None` for gate-off / lone-`$` / malformed).
160
+ fn fmt_with(input: &str, o: &MathFormatOptions) -> String {
161
+ format_math(input, o).expect("expected reflowable math")
155
162
  }
156
163
 
157
164
  /// Every well-formed case must be a fixed point of itself.
@@ -162,13 +169,14 @@ mod tests {
162
169
  }
163
170
 
164
171
  #[test]
165
- fn gate_off_is_verbatim() {
172
+ fn gate_off_returns_none() {
173
+ // Gate off ⇒ the caller emits verbatim through its own path.
166
174
  let off = MathFormatOptions {
167
175
  enabled: false,
168
176
  ..opts(MathContext::Display)
169
177
  };
170
178
  let input = "\\begin{aligned}\nx&=1\\\\\ny &= 22\n\\end{aligned}";
171
- assert_eq!(format_math(input, &off), input);
179
+ assert_eq!(format_math(input, &off), None);
172
180
  }
173
181
 
174
182
  #[test]
@@ -185,16 +193,20 @@ mod tests {
185
193
  }
186
194
 
187
195
  #[test]
188
- fn malformed_math_is_verbatim() {
189
- // Unclosed group → diagnostic → bail.
196
+ fn malformed_math_bails() {
197
+ // Unclosed group → diagnostic → bail; the caller emits it verbatim. The
198
+ // end-to-end verbatim shape (no doubled fence newlines) is covered by the
199
+ // `math_malformed_delimiter_experimental` golden case.
190
200
  let input = "\\frac{1}{2";
191
- assert_eq!(fmt(input, MathContext::Inline), input);
201
+ assert_eq!(format_math(input, &opts(MathContext::Inline)), None);
202
+ // An unclosed `\left` (a `MATH_DELIMITED` lacking `\right`) also bails.
203
+ assert_eq!(format_math("\\left( x", &opts(MathContext::Display)), None);
192
204
  }
193
205
 
194
206
  #[test]
195
- fn lone_dollar_is_verbatim() {
207
+ fn lone_dollar_bails() {
196
208
  let input = "a $ b";
197
- assert_eq!(fmt(input, MathContext::Inline), input);
209
+ assert_eq!(format_math(input, &opts(MathContext::Inline)), None);
198
210
  }
199
211
 
200
212
  #[test]
@@ -360,10 +372,10 @@ mod tests {
360
372
  // First `=` stays; the second starts a continuation aligned under it
361
373
  // (equality chain ⇒ relations stack under the first relation).
362
374
  let expected = "A = bbbbbbbbbb\n = cccccccccc";
363
- assert_eq!(format_math(input, &narrow), expected);
375
+ assert_eq!(fmt_with(input, &narrow), expected);
364
376
  // Re-feeding the broken (multi-line) form recomputes the same layout.
365
- let once = format_math(input, &narrow);
366
- assert_eq!(format_math(&once, &narrow), once);
377
+ let once = fmt_with(input, &narrow);
378
+ assert_eq!(fmt_with(&once, &narrow), once);
367
379
  }
368
380
 
369
381
  #[test]
@@ -372,7 +384,7 @@ mod tests {
372
384
  // to the pre-line-breaking behavior).
373
385
  let wide = opts(MathContext::Display); // line_width 80
374
386
  assert_eq!(
375
- format_math("A = bbbbbbbbbb = cccccccccc", &wide),
387
+ fmt_with("A = bbbbbbbbbb = cccccccccc", &wide),
376
388
  "A = bbbbbbbbbb = cccccccccc"
377
389
  );
378
390
  }
@@ -387,9 +399,9 @@ mod tests {
387
399
  // Relations break first; each over-width segment nests its `+` term one
388
400
  // indent level deeper, under the relation's right-hand side.
389
401
  let expected = "A = aaaaaaaaaa\n + bbbbbbbbbb\n = cccccccccc\n + dddddddddd";
390
- assert_eq!(format_math(input, &narrow), expected);
391
- let once = format_math(input, &narrow);
392
- assert_eq!(format_math(&once, &narrow), once);
402
+ assert_eq!(fmt_with(input, &narrow), expected);
403
+ let once = fmt_with(input, &narrow);
404
+ assert_eq!(fmt_with(&once, &narrow), once);
393
405
  }
394
406
 
395
407
  #[test]
@@ -399,7 +411,7 @@ mod tests {
399
411
  // the rendered math). Regression for the logical-row re-join.
400
412
  let wide = opts(MathContext::Display);
401
413
  let input = "% leading comment\nx = 1";
402
- assert_eq!(format_math(input, &wide), "% leading comment\nx = 1");
414
+ assert_eq!(fmt_with(input, &wide), "% leading comment\nx = 1");
403
415
  assert_idempotent(input, MathContext::Display);
404
416
  }
405
417
 
@@ -411,14 +423,14 @@ mod tests {
411
423
  };
412
424
  // A single over-width fraction with no top-level operator stays one line.
413
425
  let frac = "\\frac{aaaaaaaa}{bbbbbbbb}";
414
- assert_eq!(format_math(frac, &narrow), frac);
426
+ assert_eq!(fmt_with(frac, &narrow), frac);
415
427
  // Relation *and* binary operators buried inside `\left(…\right)` are not
416
428
  // depth-0 break points, so this over-width row has no break candidate and
417
429
  // stays on one line (the broader binary-breaking scope must still respect
418
430
  // delimiter opacity).
419
431
  let paren = "\\left( xxxx = yyyy + wwww \\right)";
420
- let once = format_math(paren, &narrow);
432
+ let once = fmt_with(paren, &narrow);
421
433
  assert!(!once.contains('\n'), "should not break: {once:?}");
422
- assert_eq!(format_math(&once, &narrow), once);
434
+ assert_eq!(fmt_with(&once, &narrow), once);
423
435
  }
424
436
  }