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.
- {panache_cli-2.60.0 → panache_cli-2.61.0}/Cargo.lock +26 -40
- {panache_cli-2.60.0 → panache_cli-2.61.0}/Cargo.toml +3 -3
- {panache_cli-2.60.0 → panache_cli-2.61.0}/PKG-INFO +1 -1
- {panache_cli-2.60.0 → panache_cli-2.61.0}/build.rs +1 -1
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/CHANGELOG.md +11 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/Cargo.toml +2 -2
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/core.rs +21 -15
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/inline.rs +68 -64
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math.rs +49 -37
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/CHANGELOG.md +17 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/Cargo.toml +1 -1
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/pandoc_ast.rs +47 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/block_dispatcher.rs +13 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/html_blocks.rs +444 -48
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tables.rs +48 -7
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/math.rs +157 -156
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/kind.rs +1 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/links.rs +14 -0
- panache_cli-2.61.0/crates/panache-parser/src/syntax/math.rs +601 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config/formatter_presets.rs +21 -0
- panache_cli-2.61.0/src/linter/rules/math_content.rs +199 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/unused_definitions.rs +74 -3
- panache_cli-2.60.0/crates/panache-parser/src/syntax/math.rs +0 -175
- panache_cli-2.60.0/src/linter/rules/math_content.rs +0 -283
- {panache_cli-2.60.0 → panache_cli-2.61.0}/LICENSE +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/README.md +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/assets/quarto-schema/schema.json +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/README.md +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/config.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/directives.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/blockquotes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/code_blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/fenced_divs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/hashpipe.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/headings.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/indent_utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/inline_layout.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/lists.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/STYLE.md +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/linebreak.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/operators.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/math/render.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/metadata.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/paragraphs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/sentence_wrap.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/shortcodes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/smart.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/tables.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/STYLE.md +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/block_map.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/block_sequence.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/document.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/flow.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/options.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml/scalar.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter/yaml.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/formatter.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/lib.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/parser.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/syntax.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-formatter/src/yaml_engine.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/README.md +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/build.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/grid_layout.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/lib.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/options.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/admonitions.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/blockquotes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/code_blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/container_prefix.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/definition_lists.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/fenced_divs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/figures.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/headings.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/horizontal_rules.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/indented_code.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/latex_envs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/line_blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/lists.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/metadata.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/myst_directives.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/myst_targets.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/paragraphs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/raw_blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/reference_links.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/blanklines.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/blockquotes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/code_blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/definition_lists.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/headings.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/helpers.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/lists.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/losslessness.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks/tests/metadata_guards.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/core.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/diagnostics.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/bookdown.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/bracketed_spans.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/citations.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/code_spans.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/core.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/emoji.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/escapes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_executable.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_footnotes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_html.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/inline_ir.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/latex.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/links.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/mark.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/math.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/myst_roles.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/myst_substitutions.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/native_spans.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/raw_inline.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/refdef_map.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/shortcodes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/sink.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/strikeout.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/subscript.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/superscript.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/svelte.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/tests.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/uri-schemes.csv +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines/wikilinks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/inlines.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/attributes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/chunk_options.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/container_stack.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/continuation.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/helpers.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/inline_emission.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/list_item_buffer.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/marker_utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/text_buffer.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/tree_copy.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils/yaml_regions.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/cooking.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/events.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/model.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/parser.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/profile.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/scanner.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml/validator.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser/yaml.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/parser.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/range_utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/alerts.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/ast.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/attributes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/block_quotes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/chunk_options.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/citations.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/code_blocks.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/crossrefs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/definitions.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/fenced_divs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/headings.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/inlines.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/lists.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/myst.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/raw_tex.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/references.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/shortcodes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/tables.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/yaml.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax/yaml_ast.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/crates/panache-parser/src/syntax.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/pyproject.toml +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/bibtex.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/csl_json.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/csl_yaml.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/index.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/preview.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib/ris.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bib.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/bin/distill_quarto_schema.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/cache.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/cli.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config/types/schema_helpers.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config/types.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/config.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/diagnostic_renderer.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/directives.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/external_formatters_common.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/external_formatters_sync.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/external_tools_common.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/formatter.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/includes.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lib.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/code_block_collector.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/diagnostics.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/clippy.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/eslint.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/jarl.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/ruff.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/shellcheck.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters/staticcheck.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/external_linters_sync.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/fuzzy.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/index.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/metadata_diagnostics.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/offsets.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/distill.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/interp.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/model.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/report.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema/value.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/quarto_schema.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/adjacent_footnote_refs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/chunk_label_spaces.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/citation_keys.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/consumer_divergence.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/crossref_as_link_target.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/duplicate_references.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/emoji_aliases.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/empty_list_item.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/empty_values.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/figure_crossref_captions.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/footnote_ref_in_footnote_def.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/heading_eaten_attrs.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/heading_hierarchy.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/heading_strip_comments_residue.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/html_entities.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/link_text_is_url.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/missing_chunk_labels.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/quarto_schema.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/stray_fenced_div_markers.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/undefined_anchor.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules/undefined_references.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/rules.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/runner.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter/yaml_resolve.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/linter.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/config.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/context.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/conversions.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/dispatch.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/documents.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/global_state.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/code_actions.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/completion.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/configuration.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/diagnostics.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/document_highlight.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/document_links.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/document_symbols.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/file_operations.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/file_rename.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/file_watcher.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/folding_ranges.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/footnote_conversion.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/formatting.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/goto_definition.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/heading_link_conversion.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/hover.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/link_conversion.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/linked_editing_range.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/list_conversion.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/prepare_rename.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/references.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/rename.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/semantic_tokens.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/shortcode_args.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/workspace_folders.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers/workspace_symbols.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/handlers.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/helpers.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/navigation.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/symbols.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/task_pool.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/testing.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp/uri_ext.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/lsp.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/main.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/bibliography.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/citations.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/project.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/references.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata/yaml.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/metadata.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/parser.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/range_utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/salsa.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/syntax.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/utils.rs +0 -0
- {panache_cli-2.60.0 → panache_cli-2.61.0}/src/yaml_engine.rs +0 -0
- {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.
|
|
375
|
+
version = "1.1.1"
|
|
376
376
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
377
|
-
checksum = "
|
|
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.
|
|
385
|
+
version = "1.1.1"
|
|
386
386
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
387
|
-
checksum = "
|
|
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.
|
|
933
|
+
version = "0.46.9"
|
|
935
934
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
936
|
-
checksum = "
|
|
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.
|
|
1094
|
+
version = "0.4.7"
|
|
1087
1095
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1088
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1504
|
+
version = "0.46.9"
|
|
1519
1505
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1520
|
-
checksum = "
|
|
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.
|
|
1574
|
+
version = "2.1.3"
|
|
1589
1575
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1590
|
-
checksum = "
|
|
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.
|
|
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.
|
|
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.
|
|
52
|
-
panache-parser = { path = "crates/panache-parser", version = "0.
|
|
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
|
] }
|
|
@@ -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,\
|
|
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.
|
|
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.
|
|
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
|
-
|
|
2684
|
-
|
|
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
|
-
|
|
2708
|
-
|
|
2709
|
-
|
|
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
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
format!("{}\n{}\n{}", open,
|
|
538
|
-
|
|
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
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
format!("{}{}{}", open,
|
|
548
|
-
|
|
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
|
-
|
|
593
|
-
|
|
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
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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
|
-
|
|
638
|
-
//
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
//
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
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
|
-
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
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,
|
|
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
|
-
///
|
|
80
|
+
/// Reflow clean math content (delimiters excluded, both in and out).
|
|
81
81
|
///
|
|
82
|
-
/// Returns
|
|
83
|
-
///
|
|
84
|
-
///
|
|
85
|
-
///
|
|
86
|
-
///
|
|
87
|
-
|
|
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
|
|
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
|
|
96
|
+
return None;
|
|
95
97
|
}
|
|
96
|
-
let
|
|
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
|
|
104
|
-
if !
|
|
105
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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),
|
|
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
|
|
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!(
|
|
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
|
|
207
|
+
fn lone_dollar_bails() {
|
|
196
208
|
let input = "a $ b";
|
|
197
|
-
assert_eq!(
|
|
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!(
|
|
375
|
+
assert_eq!(fmt_with(input, &narrow), expected);
|
|
364
376
|
// Re-feeding the broken (multi-line) form recomputes the same layout.
|
|
365
|
-
let once =
|
|
366
|
-
assert_eq!(
|
|
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
|
-
|
|
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!(
|
|
391
|
-
let once =
|
|
392
|
-
assert_eq!(
|
|
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!(
|
|
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!(
|
|
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 =
|
|
432
|
+
let once = fmt_with(paren, &narrow);
|
|
421
433
|
assert!(!once.contains('\n'), "should not break: {once:?}");
|
|
422
|
-
assert_eq!(
|
|
434
|
+
assert_eq!(fmt_with(&once, &narrow), once);
|
|
423
435
|
}
|
|
424
436
|
}
|