panache-cli 3.17.1__tar.gz → 3.17.2__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 (396) hide show
  1. {panache_cli-3.17.1 → panache_cli-3.17.2}/Cargo.lock +18 -17
  2. {panache_cli-3.17.1 → panache_cli-3.17.2}/Cargo.toml +5 -5
  3. {panache_cli-3.17.1 → panache_cli-3.17.2}/PKG-INFO +11 -1
  4. {panache_cli-3.17.1 → panache_cli-3.17.2}/README.md +10 -0
  5. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/CHANGELOG.md +6 -0
  6. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/Cargo.toml +3 -3
  7. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/CHANGELOG.md +7 -0
  8. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/Cargo.toml +2 -2
  9. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/pandoc_ast.rs +38 -85
  10. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/citations.rs +73 -4
  11. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/core.rs +103 -6
  12. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/inline_ir.rs +65 -6
  13. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/kind.rs +2 -0
  14. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/code_block_collector.rs +82 -0
  15. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/execution_context.rs +45 -0
  16. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters/jarl.rs +24 -17
  17. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters.rs +48 -6
  18. panache_cli-3.17.2/src/linter/rules/docs/swallowed-list-marker.md +15 -0
  19. panache_cli-3.17.2/src/linter/rules/docs/undefined-references.md +15 -0
  20. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/swallowed_list_marker.rs +143 -5
  21. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/undefined_references.rs +48 -26
  22. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/utils.rs +13 -8
  23. panache_cli-3.17.1/src/linter/rules/docs/swallowed-list-marker.md +0 -8
  24. panache_cli-3.17.1/src/linter/rules/docs/undefined-references.md +0 -6
  25. {panache_cli-3.17.1 → panache_cli-3.17.2}/LICENSE +0 -0
  26. {panache_cli-3.17.1 → panache_cli-3.17.2}/assets/quarto-schema/schema.json +0 -0
  27. {panache_cli-3.17.1 → panache_cli-3.17.2}/build.rs +0 -0
  28. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/README.md +0 -0
  29. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/config.rs +0 -0
  30. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/directives.rs +0 -0
  31. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/blockquotes.rs +0 -0
  32. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/blocks.rs +0 -0
  33. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/code_blocks.rs +0 -0
  34. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/containers.rs +0 -0
  35. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/core.rs +0 -0
  36. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/document.rs +0 -0
  37. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/fenced_divs.rs +0 -0
  38. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/hashpipe.rs +0 -0
  39. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/headings.rs +0 -0
  40. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/indent_utils.rs +0 -0
  41. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/inline.rs +0 -0
  42. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/inline_layout.rs +0 -0
  43. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/lists.rs +0 -0
  44. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/math/STYLE.md +0 -0
  45. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/math/ir.rs +0 -0
  46. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/math/lower.rs +0 -0
  47. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/math/printer.rs +0 -0
  48. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/math/render.rs +0 -0
  49. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/math.rs +0 -0
  50. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/metadata.rs +0 -0
  51. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/paragraphs.rs +0 -0
  52. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/preserve.rs +0 -0
  53. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/raw.rs +0 -0
  54. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/sentence_wrap.rs +0 -0
  55. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/shortcodes.rs +0 -0
  56. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/smart.rs +0 -0
  57. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/table_conversion.rs +0 -0
  58. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/tables.rs +0 -0
  59. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/utils.rs +0 -0
  60. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml/STYLE.md +0 -0
  61. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml/block_map.rs +0 -0
  62. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml/block_sequence.rs +0 -0
  63. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml/document.rs +0 -0
  64. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml/flow.rs +0 -0
  65. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml/options.rs +0 -0
  66. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml/scalar.rs +0 -0
  67. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter/yaml.rs +0 -0
  68. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/formatter.rs +0 -0
  69. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/lib.rs +0 -0
  70. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/parser.rs +0 -0
  71. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/syntax.rs +0 -0
  72. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/utils.rs +0 -0
  73. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-formatter/src/yaml_engine.rs +0 -0
  74. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/README.md +0 -0
  75. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/build.rs +0 -0
  76. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/data/math_symbols.json +0 -0
  77. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/data/unicode-math.LICENSE +0 -0
  78. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/data/unicode-math.NOTICE +0 -0
  79. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/grid_layout.rs +0 -0
  80. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/lib.rs +0 -0
  81. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/options.rs +0 -0
  82. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/block_dispatcher.rs +0 -0
  83. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/admonitions.rs +0 -0
  84. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/blockquotes.rs +0 -0
  85. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/code_blocks.rs +0 -0
  86. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/container_prefix.rs +0 -0
  87. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/definition_lists.rs +0 -0
  88. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/fenced_divs.rs +0 -0
  89. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/figures.rs +0 -0
  90. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/headings.rs +0 -0
  91. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/horizontal_rules.rs +0 -0
  92. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/html_blocks.rs +0 -0
  93. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/hugo.rs +0 -0
  94. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/indented_code.rs +0 -0
  95. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/latex_envs.rs +0 -0
  96. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/line_blocks.rs +0 -0
  97. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/lists.rs +0 -0
  98. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/metadata.rs +0 -0
  99. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/myst_directives.rs +0 -0
  100. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/myst_targets.rs +0 -0
  101. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/paragraphs.rs +0 -0
  102. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/raw_blocks.rs +0 -0
  103. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/reference_links.rs +0 -0
  104. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tables.rs +0 -0
  105. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/blanklines.rs +0 -0
  106. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/blockquotes.rs +0 -0
  107. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/code_blocks.rs +0 -0
  108. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/content_containers.rs +0 -0
  109. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/definition_lists.rs +0 -0
  110. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/figures.rs +0 -0
  111. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/footnote_marker_line.rs +0 -0
  112. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/fragment_context.rs +0 -0
  113. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/frame_pinning.rs +0 -0
  114. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/headings.rs +0 -0
  115. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/helpers.rs +0 -0
  116. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/lists.rs +0 -0
  117. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/losslessness.rs +0 -0
  118. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/metadata_guards.rs +0 -0
  119. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks/tests/tables.rs +0 -0
  120. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/blocks.rs +0 -0
  121. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/core/blockquotes.rs +0 -0
  122. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/core/definition_lists.rs +0 -0
  123. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/core/html_interruptions.rs +0 -0
  124. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/core/list_items.rs +0 -0
  125. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/core.rs +0 -0
  126. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/diagnostics.rs +0 -0
  127. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/bookdown.rs +0 -0
  128. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/bracketed_spans.rs +0 -0
  129. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/code_spans.rs +0 -0
  130. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/emoji.rs +0 -0
  131. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/escapes.rs +0 -0
  132. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/hard_breaks.rs +0 -0
  133. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/hugo.rs +0 -0
  134. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/inline_executable.rs +0 -0
  135. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/inline_footnotes.rs +0 -0
  136. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/inline_html.rs +0 -0
  137. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/latex.rs +0 -0
  138. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/links.rs +0 -0
  139. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/mark.rs +0 -0
  140. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/math.rs +0 -0
  141. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/myst_roles.rs +0 -0
  142. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/myst_substitutions.rs +0 -0
  143. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/native_spans.rs +0 -0
  144. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/raw_inline.rs +0 -0
  145. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/refdef_map.rs +0 -0
  146. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/shortcodes.rs +0 -0
  147. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/sink.rs +0 -0
  148. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/strikeout.rs +0 -0
  149. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/subscript.rs +0 -0
  150. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/superscript.rs +0 -0
  151. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/svelte.rs +0 -0
  152. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/tests.rs +0 -0
  153. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/uri-schemes.csv +0 -0
  154. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines/wikilinks.rs +0 -0
  155. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/inlines.rs +0 -0
  156. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/math.rs +0 -0
  157. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/reparse.rs +0 -0
  158. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/attributes.rs +0 -0
  159. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/chunk_options.rs +0 -0
  160. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/container_stack.rs +0 -0
  161. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/continuation.rs +0 -0
  162. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/helpers.rs +0 -0
  163. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/inline_emission.rs +0 -0
  164. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/list_item_buffer.rs +0 -0
  165. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/marker_utils.rs +0 -0
  166. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/raw_html.rs +0 -0
  167. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/text_buffer.rs +0 -0
  168. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/tree_copy.rs +0 -0
  169. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils/yaml_regions.rs +0 -0
  170. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/utils.rs +0 -0
  171. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/verify.rs +0 -0
  172. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml/cooking.rs +0 -0
  173. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml/events.rs +0 -0
  174. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml/model.rs +0 -0
  175. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml/parser.rs +0 -0
  176. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml/profile.rs +0 -0
  177. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml/scanner.rs +0 -0
  178. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml/validator.rs +0 -0
  179. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser/yaml.rs +0 -0
  180. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/parser.rs +0 -0
  181. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/range_utils.rs +0 -0
  182. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/semantic/math.rs +0 -0
  183. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/semantic.rs +0 -0
  184. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/alerts.rs +0 -0
  185. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/ast.rs +0 -0
  186. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/attributes.rs +0 -0
  187. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/block_quotes.rs +0 -0
  188. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/blocks.rs +0 -0
  189. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/chunk_options.rs +0 -0
  190. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/citations.rs +0 -0
  191. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/code_blocks.rs +0 -0
  192. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/code_span.rs +0 -0
  193. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/consumer.rs +0 -0
  194. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/crossrefs.rs +0 -0
  195. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/definitions.rs +0 -0
  196. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/fenced_divs.rs +0 -0
  197. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/headings.rs +0 -0
  198. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/html.rs +0 -0
  199. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/hugo.rs +0 -0
  200. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/inlines.rs +0 -0
  201. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/links.rs +0 -0
  202. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/lists.rs +0 -0
  203. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/math.rs +0 -0
  204. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/myst.rs +0 -0
  205. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/raw_tex.rs +0 -0
  206. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/references.rs +0 -0
  207. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/shortcodes.rs +0 -0
  208. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/tables.rs +0 -0
  209. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/yaml.rs +0 -0
  210. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax/yaml_ast.rs +0 -0
  211. {panache_cli-3.17.1 → panache_cli-3.17.2}/crates/panache-parser/src/syntax.rs +0 -0
  212. {panache_cli-3.17.1 → panache_cli-3.17.2}/pyproject.toml +0 -0
  213. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bib/bibtex.rs +0 -0
  214. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bib/csl_json.rs +0 -0
  215. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bib/csl_yaml.rs +0 -0
  216. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bib/index.rs +0 -0
  217. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bib/preview.rs +0 -0
  218. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bib/ris.rs +0 -0
  219. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bib.rs +0 -0
  220. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/bin/distill_quarto_schema.rs +0 -0
  221. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/cache.rs +0 -0
  222. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/cli.rs +0 -0
  223. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/config/formatter_presets.rs +0 -0
  224. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/config/types/schema_helpers.rs +0 -0
  225. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/config/types.rs +0 -0
  226. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/config.rs +0 -0
  227. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/diagnostic_renderer.rs +0 -0
  228. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/directives.rs +0 -0
  229. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/external_formatters_common.rs +0 -0
  230. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/external_formatters_sync.rs +0 -0
  231. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/external_tools_common.rs +0 -0
  232. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/formatter.rs +0 -0
  233. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/includes.rs +0 -0
  234. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/incremental.rs +0 -0
  235. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/io_context.rs +0 -0
  236. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lib.rs +0 -0
  237. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/diagnostics.rs +0 -0
  238. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/docs.rs +0 -0
  239. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters/clippy.rs +0 -0
  240. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters/eslint.rs +0 -0
  241. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters/jolars.rs +0 -0
  242. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters/ruff.rs +0 -0
  243. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters/shellcheck.rs +0 -0
  244. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters/staticcheck.rs +0 -0
  245. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/external_linters_sync.rs +0 -0
  246. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/fix.rs +0 -0
  247. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/fuzzy.rs +0 -0
  248. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/index.rs +0 -0
  249. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/metadata_diagnostics.rs +0 -0
  250. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/offsets.rs +0 -0
  251. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/project_index.rs +0 -0
  252. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/quarto_schema/distill.rs +0 -0
  253. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/quarto_schema/interp.rs +0 -0
  254. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/quarto_schema/model.rs +0 -0
  255. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/quarto_schema/report.rs +0 -0
  256. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/quarto_schema/value.rs +0 -0
  257. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/quarto_schema.rs +0 -0
  258. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/render.rs +0 -0
  259. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/adjacent_footnote_refs.rs +0 -0
  260. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/blank_line_in_display_math.rs +0 -0
  261. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/blank_line_in_inline_footnote.rs +0 -0
  262. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/chunk_label_spaces.rs +0 -0
  263. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/citation_keys.rs +0 -0
  264. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/citation_nonbreaking_space.rs +0 -0
  265. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/consumer_divergence.rs +0 -0
  266. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/crossref_as_link_target.rs +0 -0
  267. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/adjacent-footnote-refs.md +0 -0
  268. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/blank-line-in-display-math.md +0 -0
  269. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/blank-line-in-inline-footnote.md +0 -0
  270. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/chunk-label-spaces.md +0 -0
  271. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/citation-keys.md +0 -0
  272. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/citation-nonbreaking-space.md +0 -0
  273. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/consumer-divergence.md +0 -0
  274. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/crossref-as-link-target.md +0 -0
  275. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/duplicate-reference-labels.md +0 -0
  276. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/duplicate-yaml-anchor.md +0 -0
  277. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/empty-list-item.md +0 -0
  278. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/empty-values.md +0 -0
  279. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/figure-crossref-captions.md +0 -0
  280. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/footnote-after-image.md +0 -0
  281. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/footnote-ref-in-footnote-def.md +0 -0
  282. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/footnote-swallowed-by-bracket.md +0 -0
  283. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/heading-eaten-attrs.md +0 -0
  284. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/heading-hierarchy.md +0 -0
  285. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/heading-strip-comments-residue.md +0 -0
  286. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/html-entities.md +0 -0
  287. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/html-unclosed-attribute.md +0 -0
  288. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/inline-math-line-break.md +0 -0
  289. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/link-text-is-url.md +0 -0
  290. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/malformed-citation.md +0 -0
  291. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/math-syntax.md +0 -0
  292. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/missing-chunk-labels.md +0 -0
  293. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/quarto-schema-unknown-key.md +0 -0
  294. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/quarto-schema.md +0 -0
  295. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/reversed-footnote-marker.md +0 -0
  296. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/space-before-punctuation.md +0 -0
  297. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/stray-fenced-div-markers.md +0 -0
  298. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/table-column-count.md +0 -0
  299. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/undefined-anchor.md +0 -0
  300. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/unknown-emoji-alias.md +0 -0
  301. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/unspaced-citation.md +0 -0
  302. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/unspaced-list-marker.md +0 -0
  303. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/unsupported-metadata-key.md +0 -0
  304. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/unused-definitions.md +0 -0
  305. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/docs/unused-yaml-anchor.md +0 -0
  306. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/duplicate_references.rs +0 -0
  307. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/duplicate_yaml_anchor.rs +0 -0
  308. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/emoji_aliases.rs +0 -0
  309. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/empty_list_item.rs +0 -0
  310. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/empty_values.rs +0 -0
  311. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/figure_crossref_captions.rs +0 -0
  312. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/footnote_after_image.rs +0 -0
  313. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/footnote_ref_in_footnote_def.rs +0 -0
  314. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/footnote_swallowed_by_bracket.rs +0 -0
  315. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/heading_eaten_attrs.rs +0 -0
  316. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/heading_hierarchy.rs +0 -0
  317. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/heading_strip_comments_residue.rs +0 -0
  318. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/html_entities.rs +0 -0
  319. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/html_unclosed_attribute.rs +0 -0
  320. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/inline_math_line_break.rs +0 -0
  321. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/link_text_is_url.rs +0 -0
  322. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/malformed_citation.rs +0 -0
  323. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/math_content.rs +0 -0
  324. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/missing_chunk_labels.rs +0 -0
  325. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/quarto_schema.rs +0 -0
  326. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/reversed_footnote_marker.rs +0 -0
  327. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/space_before_punctuation.rs +0 -0
  328. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/stray_fenced_div_markers.rs +0 -0
  329. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/table_column_count.rs +0 -0
  330. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/undefined_anchor.rs +0 -0
  331. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/unspaced_citation.rs +0 -0
  332. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/unspaced_list_marker.rs +0 -0
  333. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/unsupported_metadata_key.rs +0 -0
  334. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/unused_definitions.rs +0 -0
  335. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules/unused_yaml_anchor.rs +0 -0
  336. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/rules.rs +0 -0
  337. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/runner.rs +0 -0
  338. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/yaml_anchors.rs +0 -0
  339. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter/yaml_resolve.rs +0 -0
  340. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/linter.rs +0 -0
  341. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/config.rs +0 -0
  342. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/context.rs +0 -0
  343. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/conversions.rs +0 -0
  344. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/dispatch.rs +0 -0
  345. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/documents.rs +0 -0
  346. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/global_state.rs +0 -0
  347. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/code_actions.rs +0 -0
  348. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/completion.rs +0 -0
  349. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/configuration.rs +0 -0
  350. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/diagnostics.rs +0 -0
  351. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/document_highlight.rs +0 -0
  352. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/document_links.rs +0 -0
  353. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/document_symbols.rs +0 -0
  354. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/file_operations.rs +0 -0
  355. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/file_rename.rs +0 -0
  356. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/file_watcher.rs +0 -0
  357. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/folding_ranges.rs +0 -0
  358. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/footnote_conversion.rs +0 -0
  359. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/formatting.rs +0 -0
  360. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/goto_definition.rs +0 -0
  361. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/heading_link_conversion.rs +0 -0
  362. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/hover.rs +0 -0
  363. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/link_conversion.rs +0 -0
  364. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/linked_editing_range.rs +0 -0
  365. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/list_conversion.rs +0 -0
  366. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/prepare_rename.rs +0 -0
  367. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/references.rs +0 -0
  368. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/rename.rs +0 -0
  369. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/semantic_tokens.rs +0 -0
  370. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/shortcode_args.rs +0 -0
  371. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/table_conversion.rs +0 -0
  372. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/workspace_folders.rs +0 -0
  373. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers/workspace_symbols.rs +0 -0
  374. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/handlers.rs +0 -0
  375. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/helpers.rs +0 -0
  376. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/line_index.rs +0 -0
  377. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/navigation.rs +0 -0
  378. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/symbols.rs +0 -0
  379. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/task_pool.rs +0 -0
  380. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/testing.rs +0 -0
  381. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp/uri_ext.rs +0 -0
  382. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/lsp.rs +0 -0
  383. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/main.rs +0 -0
  384. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/metadata/bibliography.rs +0 -0
  385. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/metadata/citations.rs +0 -0
  386. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/metadata/project.rs +0 -0
  387. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/metadata/references.rs +0 -0
  388. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/metadata/yaml.rs +0 -0
  389. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/metadata.rs +0 -0
  390. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/parser.rs +0 -0
  391. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/range_utils.rs +0 -0
  392. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/salsa.rs +0 -0
  393. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/syntax.rs +0 -0
  394. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/vfs.rs +0 -0
  395. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/yaml_engine.rs +0 -0
  396. {panache_cli-3.17.1 → panache_cli-3.17.2}/src/yaml_regions.rs +0 -0
@@ -121,9 +121,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
121
121
 
122
122
  [[package]]
123
123
  name = "badness-formatter"
124
- version = "0.10.2"
124
+ version = "0.11.0"
125
125
  source = "registry+https://github.com/rust-lang/crates.io-index"
126
- checksum = "b174164ae9bb3abaa0115a64ecb11a54cdee5c93c9104c1cdf2c5da282039d76"
126
+ checksum = "0165f729bcb3de3e5b19936829abb6e32204d5762ed93a2c131e65c3c9495810"
127
127
  dependencies = [
128
128
  "badness-parser",
129
129
  "rowan 0.17.0",
@@ -131,9 +131,9 @@ dependencies = [
131
131
 
132
132
  [[package]]
133
133
  name = "badness-parser"
134
- version = "0.11.1"
134
+ version = "0.11.2"
135
135
  source = "registry+https://github.com/rust-lang/crates.io-index"
136
- checksum = "32b45795e07c88249e867c1f2dd84ca0d5d78062753fb5fa75c8eb1ece8e202b"
136
+ checksum = "75b997df78399ddfa09f747bbe52f8e1c8afc374e3fc95540cd312632b939744"
137
137
  dependencies = [
138
138
  "phf 0.14.0",
139
139
  "phf_codegen",
@@ -294,9 +294,9 @@ dependencies = [
294
294
 
295
295
  [[package]]
296
296
  name = "clapdown"
297
- version = "0.2.0"
297
+ version = "0.3.0"
298
298
  source = "registry+https://github.com/rust-lang/crates.io-index"
299
- checksum = "68bcefa13c36a119d957224c65214f792139033a34f8157297ac2a7fff5a343a"
299
+ checksum = "d8f2a42d22b905f09c7e696e2f46a17e4aa956c8d8b8cd09806137fd99c8544c"
300
300
  dependencies = [
301
301
  "clap",
302
302
  ]
@@ -850,9 +850,9 @@ dependencies = [
850
850
 
851
851
  [[package]]
852
852
  name = "jsonschema"
853
- version = "0.59.0"
853
+ version = "0.60.1"
854
854
  source = "registry+https://github.com/rust-lang/crates.io-index"
855
- checksum = "1b320ad34c177093d21622edc9215bb608294c2333ff296672c0c8265a5ee60c"
855
+ checksum = "65de752665c4a06528af6759955eecf60ba73ae7442d35349963a09c8031cd71"
856
856
  dependencies = [
857
857
  "ahash",
858
858
  "bytecount",
@@ -878,23 +878,24 @@ dependencies = [
878
878
 
879
879
  [[package]]
880
880
  name = "jsonschema-regex"
881
- version = "0.59.0"
881
+ version = "0.60.2"
882
882
  source = "registry+https://github.com/rust-lang/crates.io-index"
883
- checksum = "1472f7be79026f79e01a9b172263311e829d7c210d57b39cb57037abc0ce0500"
883
+ checksum = "107aeb6ff14b8deb5610096a8ce5c554ec89806b521147eaeb3cae05b07edb7a"
884
884
  dependencies = [
885
885
  "regex-syntax",
886
886
  ]
887
887
 
888
888
  [[package]]
889
889
  name = "jsonschema-value"
890
- version = "0.59.0"
890
+ version = "0.60.2"
891
891
  source = "registry+https://github.com/rust-lang/crates.io-index"
892
- checksum = "e5a7550a7a84787e715ead0b47e01fa8c6bb7c3413630f91a8f2094c06c2078a"
892
+ checksum = "e281d6b177bb4834f2ffd6f92aa0443cffe29c996b251c8d94eb6f456186feba"
893
893
  dependencies = [
894
894
  "ahash",
895
895
  "bytecount",
896
896
  "fraction",
897
897
  "getrandom 0.3.4",
898
+ "memchr",
898
899
  "num-cmp",
899
900
  "num-traits",
900
901
  "serde_json",
@@ -1114,7 +1115,7 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
1114
1115
 
1115
1116
  [[package]]
1116
1117
  name = "panache"
1117
- version = "3.17.1"
1118
+ version = "3.17.2"
1118
1119
  dependencies = [
1119
1120
  "annotate-snippets",
1120
1121
  "assert_cmd",
@@ -1159,7 +1160,7 @@ dependencies = [
1159
1160
 
1160
1161
  [[package]]
1161
1162
  name = "panache-formatter"
1162
- version = "0.28.1"
1163
+ version = "0.28.2"
1163
1164
  dependencies = [
1164
1165
  "badness-formatter",
1165
1166
  "insta",
@@ -1179,7 +1180,7 @@ dependencies = [
1179
1180
 
1180
1181
  [[package]]
1181
1182
  name = "panache-parser"
1182
- version = "0.34.1"
1183
+ version = "0.34.2"
1183
1184
  dependencies = [
1184
1185
  "badness-parser",
1185
1186
  "entities",
@@ -1461,9 +1462,9 @@ dependencies = [
1461
1462
 
1462
1463
  [[package]]
1463
1464
  name = "referencing"
1464
- version = "0.59.0"
1465
+ version = "0.60.2"
1465
1466
  source = "registry+https://github.com/rust-lang/crates.io-index"
1466
- checksum = "473f4dcca28ead7ee0f8e5b5d0bbae2549f4fc4c958fb20af328961b6c174be3"
1467
+ checksum = "f42818036d3b37cda6bd4c494543158a36e431cb717015ef7c93acc6ba214d3b"
1467
1468
  dependencies = [
1468
1469
  "ahash",
1469
1470
  "fluent-uri 0.4.1",
@@ -9,7 +9,7 @@ authors = ["Johan Larsson <johan@jolars.co>"]
9
9
 
10
10
  [package]
11
11
  name = "panache"
12
- version = "3.17.1"
12
+ version = "3.17.2"
13
13
  edition.workspace = true
14
14
  rust-version.workspace = true
15
15
  # `distill_quarto_schema` is a dev-only vendoring bin (src/bin/); keep bare
@@ -55,11 +55,11 @@ path = "src/main.rs"
55
55
  required-features = ["cli"]
56
56
 
57
57
  [dependencies]
58
- panache-formatter = { path = "crates/panache-formatter", version = "0.28.1", features = [
58
+ panache-formatter = { path = "crates/panache-formatter", version = "0.28.2", features = [
59
59
  "serde",
60
60
  "schema",
61
61
  ] }
62
- panache-parser = { path = "crates/panache-parser", version = "0.34.1", features = [
62
+ panache-parser = { path = "crates/panache-parser", version = "0.34.2", features = [
63
63
  "serde",
64
64
  "schema",
65
65
  ] }
@@ -95,7 +95,7 @@ similar-asserts = "2.0.0"
95
95
  insta = { version = "1.47.2", features = ["json"] }
96
96
  assert_cmd = "2.2.2"
97
97
  predicates = "3.1.4"
98
- jsonschema = { version = "0.59.0", default-features = false }
98
+ jsonschema = { version = "0.60.1", default-features = false }
99
99
 
100
100
  [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
101
101
  rayon = "1.10.0"
@@ -117,7 +117,7 @@ lsp = [
117
117
  clap = { version = "4.6.1", features = ["derive", "env"] }
118
118
  clap_complete = "4.6.0"
119
119
  clap_mangen = "0.3.0"
120
- clapdown = "0.2.0"
120
+ clapdown = "0.3.0"
121
121
  flate2 = "1.1.9"
122
122
 
123
123
  [package.metadata.deb]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: panache-cli
3
- Version: 3.17.1
3
+ Version: 3.17.2
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -37,6 +37,7 @@ Code](https://vsmarketplacebadges.dev/version-short/jolars.panache.svg?logo=vsix
37
37
  version](https://badge.fury.io/py/panache-cli.svg?icon=si%3Apython)](https://badge.fury.io/py/panache-cli)
38
38
  [![npm
39
39
  version](https://badge.fury.io/js/@panache-cli%2Fpanache.svg?icon=si%3Anpm)](https://badge.fury.io/js/@panache-cli%2Fpanache)
40
+ [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.18608442-blue)](https://doi.org/10.5281/zenodo.18608442)
40
41
 
41
42
  Panache is a language server, formatter, and linter for Quarto and other
42
43
  Markdown flavors, built in Rust with a lossless CST parser and support for
@@ -337,3 +338,12 @@ documentation, well-structured code, and testing infrastructure provided by
337
338
  Pandoc. We also owe significant debt to the rust-analyzer project, on which
338
339
  Panache is heavily inspired.
339
340
 
341
+ ## Citation
342
+
343
+ If you use Panache in your research, please cite the release you used. Select
344
+ that release in the [Zenodo archive](https://doi.org/10.5281/zenodo.18608442)
345
+ and export its citation. To cite Panache generally, use the concept DOI
346
+ `10.5281/zenodo.18608442`.
347
+
348
+ Machine-readable metadata is available in [CITATION.cff](CITATION.cff).
349
+
@@ -11,6 +11,7 @@ Code](https://vsmarketplacebadges.dev/version-short/jolars.panache.svg?logo=vsix
11
11
  version](https://badge.fury.io/py/panache-cli.svg?icon=si%3Apython)](https://badge.fury.io/py/panache-cli)
12
12
  [![npm
13
13
  version](https://badge.fury.io/js/@panache-cli%2Fpanache.svg?icon=si%3Anpm)](https://badge.fury.io/js/@panache-cli%2Fpanache)
14
+ [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.18608442-blue)](https://doi.org/10.5281/zenodo.18608442)
14
15
 
15
16
  Panache is a language server, formatter, and linter for Quarto and other
16
17
  Markdown flavors, built in Rust with a lossless CST parser and support for
@@ -310,3 +311,12 @@ The development of Panache has simplified considerably thanks to the extensive
310
311
  documentation, well-structured code, and testing infrastructure provided by
311
312
  Pandoc. We also owe significant debt to the rust-analyzer project, on which
312
313
  Panache is heavily inspired.
314
+
315
+ ## Citation
316
+
317
+ If you use Panache in your research, please cite the release you used. Select
318
+ that release in the [Zenodo archive](https://doi.org/10.5281/zenodo.18608442)
319
+ and export its citation. To cite Panache generally, use the concept DOI
320
+ `10.5281/zenodo.18608442`.
321
+
322
+ Machine-readable metadata is available in [CITATION.cff](CITATION.cff).
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.28.2](https://github.com/jolars/panache/compare/panache-formatter-v0.28.1...panache-formatter-v0.28.2) (2026-10-30)
4
+
5
+ ### Dependencies
6
+
7
+ - updated crates/panache-parser to v0.34.2
8
+
3
9
  ## [0.28.1](https://github.com/jolars/panache/compare/panache-formatter-v0.28.0...panache-formatter-v0.28.1) (2026-10-26)
4
10
 
5
11
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "panache-formatter"
3
- version = "0.28.1"
3
+ version = "0.28.2"
4
4
  edition.workspace = true
5
5
  rust-version.workspace = true
6
6
  include = [
@@ -19,7 +19,7 @@ keywords = ["quarto", "pandoc", "markdown", "formatter"]
19
19
  categories = ["text-processing"]
20
20
 
21
21
  [dependencies]
22
- panache-parser = { path = "../panache-parser", version = "0.34.1" }
22
+ panache-parser = { path = "../panache-parser", version = "0.34.2" }
23
23
  log = { version = "0.4.31", features = ["release_max_level_debug"] }
24
24
  rowan = "0.17.0"
25
25
  serde = { version = "1.0.228", features = ["derive"], optional = true }
@@ -32,7 +32,7 @@ serde = ["dep:serde", "panache-parser/serde"]
32
32
  schema = ["serde", "dep:schemars", "panache-parser/schema"]
33
33
 
34
34
  [dev-dependencies]
35
- badness-formatter = "=0.10.2"
35
+ badness-formatter = "=0.11.0"
36
36
  serde_json = "1.0.150"
37
37
  insta = { version = "1.47.2", features = ["json"] }
38
38
  # TEMPORARY: cross-validation oracle only (tests/yaml_cross_validation.rs).
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.34.2](https://github.com/jolars/panache/compare/panache-parser-v0.34.1...panache-parser-v0.34.2) (2026-10-30)
4
+
5
+ ### Bug Fixes
6
+
7
+ - **lint:** validate custom cross-reference targets ([`f4f3a1d`](https://github.com/jolars/panache/commit/f4f3a1db60ec5ee2d537c72c60668426d696ecd9)), closes [#591](https://github.com/jolars/panache/issues/591)
8
+ - **parser:** capture narrative citation suffixes ([`3b50e47`](https://github.com/jolars/panache/commit/3b50e47a2ccbae75974ab1926a24825b4c4f1c18)), fixes [#590](https://github.com/jolars/panache/issues/590)
9
+
3
10
  ## [0.34.1](https://github.com/jolars/panache/compare/panache-parser-v0.34.0...panache-parser-v0.34.1) (2026-10-26)
4
11
 
5
12
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "panache-parser"
3
- version = "0.34.1"
3
+ version = "0.34.2"
4
4
  edition.workspace = true
5
5
  rust-version.workspace = true
6
6
  readme = "README.md"
@@ -44,6 +44,6 @@ serde = { version = "1.0.228", features = ["derive"] }
44
44
  serde_json = "1.0.150"
45
45
 
46
46
  [dev-dependencies]
47
- badness-parser = "=0.11.1"
47
+ badness-parser = "=0.11.2"
48
48
  insta = "1.47.2"
49
49
  toml = "1.1.2"
@@ -3542,9 +3542,6 @@ fn inlines_from(parent: &SyntaxNode) -> Vec<Inline> {
3542
3542
  NodeOrToken::Node(n) if n.kind() == SyntaxKind::LATEX_COMMAND => {
3543
3543
  emit_latex_command_with_absorb(&n, &mut iter, &mut out);
3544
3544
  }
3545
- NodeOrToken::Node(n) if n.kind() == SyntaxKind::CITATION => {
3546
- emit_citation_with_absorb(&n, &mut iter, &mut out);
3547
- }
3548
3545
  NodeOrToken::Node(n) => push_inline_node(&n, &mut out),
3549
3546
  }
3550
3547
  }
@@ -3554,62 +3551,6 @@ fn inlines_from(parent: &SyntaxNode) -> Vec<Inline> {
3554
3551
  out
3555
3552
  }
3556
3553
 
3557
- /// Pandoc absorbs `@key [locator]` into a single AuthorInText `Cite` with
3558
- /// the bracketed text becoming the citation's suffix. The parser emits two
3559
- /// separate nodes: `CITATION` (bare `@key`, no surrounding brackets) and an
3560
- /// adjacent `LINK` whose bracketed text has no destination. When the
3561
- /// CITATION is bare and we can verify both the next siblings (a single
3562
- /// `TEXT` whitespace token followed by a `LINK` node lacking
3563
- /// `LINK_DEST_START`), consume both and absorb the link's text as suffix.
3564
- fn emit_citation_with_absorb<I>(
3565
- node: &SyntaxNode,
3566
- iter: &mut std::iter::Peekable<I>,
3567
- out: &mut Vec<Inline>,
3568
- ) where
3569
- I: Iterator<Item = rowan::SyntaxElement<crate::syntax::PanacheLanguage>>,
3570
- {
3571
- let bracketed = node
3572
- .children_with_tokens()
3573
- .filter_map(|el| el.into_token())
3574
- .any(|t| t.kind() == SyntaxKind::LINK_START);
3575
- if bracketed {
3576
- render_citation_inline(node, out, None);
3577
- return;
3578
- }
3579
- let next_sibling_pair = node.next_sibling_or_token().and_then(|el1| {
3580
- let t = el1.as_token().cloned()?;
3581
- if t.kind() != SyntaxKind::TEXT || !t.text().starts_with(' ') {
3582
- return None;
3583
- }
3584
- let space_text = t.text().to_string();
3585
- let link_el = t.next_sibling_or_token()?;
3586
- let link = link_el.as_node().cloned()?;
3587
- if link.kind() != SyntaxKind::LINK && link.kind() != SyntaxKind::UNRESOLVED_REFERENCE {
3588
- return None;
3589
- }
3590
- let has_dest = link
3591
- .children_with_tokens()
3592
- .filter_map(|el| el.into_token())
3593
- .any(|tok| tok.kind() == SyntaxKind::LINK_DEST_START);
3594
- if has_dest {
3595
- return None;
3596
- }
3597
- let link_text = link
3598
- .children()
3599
- .find(|c| c.kind() == SyntaxKind::LINK_TEXT)
3600
- .map(|tt| tt.text().to_string())
3601
- .unwrap_or_default();
3602
- Some((space_text, link_text))
3603
- });
3604
- if let Some((_space_text, locator_text)) = next_sibling_pair {
3605
- iter.next();
3606
- iter.next();
3607
- render_citation_inline(node, out, Some(&locator_text));
3608
- } else {
3609
- render_citation_inline(node, out, None);
3610
- }
3611
- }
3612
-
3613
3554
  /// Pandoc's tex inline reader absorbs trailing horizontal whitespace into the
3614
3555
  /// raw command when (and only when) the command is `\letters` with no brace
3615
3556
  /// arguments — `\foo bar` becomes `RawInline tex "\\foo "` + `Str "bar"`,
@@ -3656,7 +3597,7 @@ fn push_inline_node(node: &SyntaxNode, out: &mut Vec<Inline>) {
3656
3597
  match node.kind() {
3657
3598
  SyntaxKind::LINK => render_link_inline(node, out),
3658
3599
  SyntaxKind::IMAGE_LINK => render_image_inline(node, out),
3659
- SyntaxKind::CITATION => render_citation_inline(node, out, None),
3600
+ SyntaxKind::CITATION => render_citation_inline(node, out),
3660
3601
  SyntaxKind::UNRESOLVED_REFERENCE => render_unresolved_reference_inline(node, out),
3661
3602
  _ => out.push(inline_from_node(node)),
3662
3603
  }
@@ -3755,14 +3696,9 @@ fn render_unresolved_reference_inline(node: &SyntaxNode, out: &mut Vec<Inline>)
3755
3696
  /// `Str "N"` (just the digits — surrounding parens come from adjacent
3756
3697
  /// source bytes which our coalesce pass merges back in). Otherwise we
3757
3698
  /// project the CITATION node as a proper `Cite [Citation, ...] [Inline,
3758
- /// ...]` per pandoc's citation reader. `extra_suffix_text` carries an
3759
- /// absorbed `[locator]` (pandoc absorbs `@key [locator]` into the Cite as
3760
- /// the citation's suffix); the literal text reflects the absorbed bytes.
3761
- fn render_citation_inline(
3762
- node: &SyntaxNode,
3763
- out: &mut Vec<Inline>,
3764
- extra_suffix_text: Option<&str>,
3765
- ) {
3699
+ /// ...]` per pandoc's citation reader, including any narrative suffix
3700
+ /// captured in the citation node.
3701
+ fn render_citation_inline(node: &SyntaxNode, out: &mut Vec<Inline>) {
3766
3702
  let first_key = node
3767
3703
  .children_with_tokens()
3768
3704
  .filter_map(|el| el.into_token())
@@ -3784,13 +3720,15 @@ fn render_citation_inline(
3784
3720
  let mut builders: Vec<CitationBuilder> = Vec::new();
3785
3721
  let mut current: Option<CitationBuilder> = None;
3786
3722
  let mut pending_prefix = String::new();
3723
+ let mut in_brackets = bracketed;
3787
3724
  for el in node.children_with_tokens() {
3788
3725
  let token = match el {
3789
3726
  NodeOrToken::Token(t) => t,
3790
3727
  _ => continue,
3791
3728
  };
3792
3729
  match token.kind() {
3793
- SyntaxKind::LINK_START | SyntaxKind::LINK_DEST => {}
3730
+ SyntaxKind::LINK_START | SyntaxKind::LINK_DEST | SyntaxKind::CITATION_SUFFIX_END => {}
3731
+ SyntaxKind::CITATION_SUFFIX_START => in_brackets = true,
3794
3732
  SyntaxKind::CITATION_BRACE_OPEN | SyntaxKind::CITATION_BRACE_CLOSE => {}
3795
3733
  SyntaxKind::CITATION_MARKER => {
3796
3734
  if let Some(c) = current.take() {
@@ -3798,7 +3736,7 @@ fn render_citation_inline(
3798
3736
  }
3799
3737
  let mode = if token.text() == "-@" {
3800
3738
  CitationMode::SuppressAuthor
3801
- } else if bracketed {
3739
+ } else if in_brackets {
3802
3740
  CitationMode::NormalCitation
3803
3741
  } else {
3804
3742
  CitationMode::AuthorInText
@@ -3832,15 +3770,6 @@ fn render_citation_inline(
3832
3770
  builders.push(c);
3833
3771
  }
3834
3772
 
3835
- if let Some(extra) = extra_suffix_text
3836
- && let Some(last) = builders.last_mut()
3837
- {
3838
- if !last.suffix_raw.is_empty() && !extra.starts_with(' ') {
3839
- last.suffix_raw.push(' ');
3840
- }
3841
- last.suffix_raw.push_str(extra);
3842
- }
3843
-
3844
3773
  let note_offset: u32 = node.text_range().start().into();
3845
3774
  let note_num = REFS_CTX
3846
3775
  .with(|c| {
@@ -3856,12 +3785,19 @@ fn render_citation_inline(
3856
3785
  .map(|b| b.into_citation(note_num))
3857
3786
  .collect();
3858
3787
 
3859
- let mut literal = node.text().to_string();
3860
- if let Some(extra) = extra_suffix_text {
3861
- literal.push(' ');
3862
- literal.push('[');
3863
- literal.push_str(extra);
3864
- literal.push(']');
3788
+ let mut literal = String::new();
3789
+ for token in node.children_with_tokens().filter_map(|el| el.into_token()) {
3790
+ match token.kind() {
3791
+ SyntaxKind::LINE_PREFIX => {}
3792
+ SyntaxKind::CITATION_SUFFIX_START => {
3793
+ if !literal.ends_with(char::is_whitespace) {
3794
+ literal.push(' ');
3795
+ }
3796
+ literal.push('[');
3797
+ }
3798
+ SyntaxKind::CITATION_MARKER if !bracketed && literal.is_empty() => literal.push('@'),
3799
+ _ => literal.push_str(token.text()),
3800
+ }
3865
3801
  }
3866
3802
  let text_inlines = literal_inlines(&literal);
3867
3803
 
@@ -5492,6 +5428,23 @@ mod tests {
5492
5428
  serde_json::from_str(&s).expect("to_pandoc_json must emit valid JSON")
5493
5429
  }
5494
5430
 
5431
+ #[test]
5432
+ fn narrative_citation_projects_suffix_and_preserves_the_following_reference() {
5433
+ let output = parse_to_json("@a\n[p. 4; @b] and [missing]");
5434
+ let inlines = &output["blocks"][0]["c"];
5435
+ let citations = &inlines[0]["c"][0];
5436
+ assert_eq!(citations[0]["citationId"], "a");
5437
+ assert_eq!(citations[0]["citationMode"]["t"], "AuthorInText");
5438
+ assert_eq!(
5439
+ citations[0]["citationSuffix"],
5440
+ json!([{"t": "Str", "c": "p.\u{a0}4"}])
5441
+ );
5442
+ assert_eq!(citations[1]["citationId"], "b");
5443
+ assert_eq!(citations[1]["citationMode"]["t"], "NormalCitation");
5444
+ assert_eq!(inlines[0]["c"][1][1]["t"], "SoftBreak");
5445
+ assert_eq!(inlines[4], json!({"t": "Str", "c": "[missing]"}));
5446
+ }
5447
+
5495
5448
  fn pandoc_options() -> crate::options::ParserOptions {
5496
5449
  flavor_options(crate::options::Flavor::Pandoc)
5497
5450
  }
@@ -7,7 +7,52 @@
7
7
  //! - Author-in-text: `@doe99` (bare, without brackets)
8
8
 
9
9
  use super::sink::InlineSink;
10
- use crate::syntax::SyntaxKind;
10
+ use crate::{options::ParserOptions, syntax::SyntaxKind};
11
+
12
+ /// Narrative suffixes yield to links, reference shapes, and bracketed spans.
13
+ /// Their closing bracket must be found by parsing inlines, since emphasis and
14
+ /// raw TeX can contain otherwise unmatched closing brackets.
15
+ pub(super) fn narrative_suffix_end(
16
+ text: &str,
17
+ key_end: usize,
18
+ end: usize,
19
+ config: &ParserOptions,
20
+ ) -> Option<usize> {
21
+ let tail = &text[key_end..end];
22
+ let rest = tail.trim_start_matches([' ', '\t', '\r', '\n']);
23
+ if !rest.starts_with('[') {
24
+ return None;
25
+ }
26
+ let open = end - rest.len();
27
+ let ctx = super::links::LinkScanContext::from_options(config);
28
+ if config.extensions.inline_links
29
+ && super::links::try_parse_inline_link_parts(rest, false, ctx).is_some()
30
+ {
31
+ return None;
32
+ }
33
+ if config.extensions.bracketed_spans
34
+ && super::bracketed_spans::try_parse_bracketed_span(rest).is_some()
35
+ {
36
+ return None;
37
+ }
38
+ if config.extensions.reference_links
39
+ && let Some((_, _, label, _, shortcut)) = super::links::try_parse_reference_link(
40
+ rest,
41
+ config.extensions.shortcut_reference_links,
42
+ config.extensions.inline_links,
43
+ config.extensions.spaced_reference_links,
44
+ ctx,
45
+ )
46
+ && (!shortcut
47
+ || config
48
+ .refdef_labels
49
+ .as_ref()
50
+ .is_some_and(|labels| labels.contains(&super::refdef_map::normalize_label(&label))))
51
+ {
52
+ return None;
53
+ }
54
+ super::core::inline_bracket_end(text, open + 1, end, config).map(|close| close + 1)
55
+ }
11
56
 
12
57
  /// Try to parse a bracketed citation starting at the current position.
13
58
  /// Returns Some((length, content)) if successful, None otherwise.
@@ -253,9 +298,7 @@ pub fn is_crossref_key(key: &str, custom_prefixes: &[String]) -> bool {
253
298
 
254
299
  /// Whether `key`'s prefix (the segment before the first `-`) appears in
255
300
  /// `custom_prefixes`. Unlike [`is_quarto_crossref_key`], this matches *only*
256
- /// the configured extension prefixes, so callers can tell an extension-injected
257
- /// cross-reference (whose target panache can't resolve) apart from a built-in
258
- /// one (whose target it can and should validate).
301
+ /// the configured prefixes. Matching is case-insensitive.
259
302
  pub fn has_custom_crossref_prefix(key: &str, custom_prefixes: &[String]) -> bool {
260
303
  if custom_prefixes.is_empty() {
261
304
  return false;
@@ -584,6 +627,15 @@ fn emit_bracketed_citation_content(builder: &mut impl InlineSink, content: &str)
584
627
 
585
628
  /// Emit a bare citation node to the builder.
586
629
  pub(crate) fn emit_bare_citation(builder: &mut impl InlineSink, key: &str, has_suppress: bool) {
630
+ emit_narrative_citation(builder, key, has_suppress, "");
631
+ }
632
+
633
+ pub(super) fn emit_narrative_citation(
634
+ builder: &mut impl InlineSink,
635
+ key: &str,
636
+ has_suppress: bool,
637
+ suffix: &str,
638
+ ) {
587
639
  builder.start_node(SyntaxKind::CITATION.into());
588
640
 
589
641
  if has_suppress {
@@ -600,6 +652,23 @@ pub(crate) fn emit_bare_citation(builder: &mut impl InlineSink, key: &str, has_s
600
652
  builder.token(SyntaxKind::CITATION_KEY.into(), key);
601
653
  }
602
654
 
655
+ if !suffix.is_empty() {
656
+ let content = suffix.trim_start_matches([' ', '\t', '\r', '\n']);
657
+ let gap = &suffix[..suffix.len() - content.len()];
658
+ for part in gap.split_inclusive('\n') {
659
+ let horizontal = part.trim_end_matches(['\r', '\n']);
660
+ if !horizontal.is_empty() {
661
+ builder.token(SyntaxKind::WHITESPACE.into(), horizontal);
662
+ }
663
+ if horizontal.len() < part.len() {
664
+ builder.token(SyntaxKind::NEWLINE.into(), &part[horizontal.len()..]);
665
+ }
666
+ }
667
+ builder.token(SyntaxKind::CITATION_SUFFIX_START.into(), "[");
668
+ emit_bracketed_citation_content(builder, &content[1..content.len() - 1]);
669
+ builder.token(SyntaxKind::CITATION_SUFFIX_END.into(), "]");
670
+ }
671
+
603
672
  builder.finish_node();
604
673
  }
605
674