rumdl 0.0.166__tar.gz → 0.0.167__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.

Potentially problematic release.


This version of rumdl might be problematic. Click here for more details.

Files changed (466) hide show
  1. {rumdl-0.0.166 → rumdl-0.0.167}/.config/nextest.toml +10 -7
  2. {rumdl-0.0.166 → rumdl-0.0.167}/.pre-commit-config.yaml +2 -0
  3. {rumdl-0.0.166 → rumdl-0.0.167}/.rumdl.toml +3 -3
  4. {rumdl-0.0.166 → rumdl-0.0.167}/CHANGELOG.md +77 -0
  5. {rumdl-0.0.166 → rumdl-0.0.167}/Cargo.lock +1 -1
  6. {rumdl-0.0.166 → rumdl-0.0.167}/Cargo.toml +1 -1
  7. {rumdl-0.0.166 → rumdl-0.0.167}/Makefile +2 -2
  8. {rumdl-0.0.166 → rumdl-0.0.167}/PKG-INFO +1 -1
  9. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md013.md +20 -1
  10. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md033.md +18 -0
  11. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md053.md +59 -0
  12. {rumdl-0.0.166 → rumdl-0.0.167}/src/config.rs +171 -19
  13. {rumdl-0.0.166 → rumdl-0.0.167}/src/lsp/mod.rs +2 -2
  14. {rumdl-0.0.166 → rumdl-0.0.167}/src/lsp/server.rs +659 -40
  15. {rumdl-0.0.166 → rumdl-0.0.167}/src/lsp/types.rs +377 -13
  16. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md013_line_length.rs +145 -6
  17. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md022_blanks_around_headings.rs +32 -31
  18. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md033_no_inline_html.rs +18 -66
  19. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md035_hr_style.rs +6 -1
  20. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md051_link_fragments.rs +6 -0
  21. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md053_link_image_reference_definitions.rs +158 -0
  22. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md054_link_image_style.rs +0 -11
  23. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md055_table_pipe_style.rs +6 -1
  24. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/github.rs +9 -0
  25. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/text_reflow.rs +184 -0
  26. {rumdl-0.0.166 → rumdl-0.0.167}/tests/advanced_integration_tests.rs +1 -1
  27. {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_tests.rs +16 -7
  28. {rumdl-0.0.166 → rumdl-0.0.167}/tests/init_tests.rs +2 -2
  29. {rumdl-0.0.166 → rumdl-0.0.167}/tests/real_world_repository_tests.rs +19 -2
  30. {rumdl-0.0.166 → rumdl-0.0.167}/.mise.toml +0 -0
  31. {rumdl-0.0.166 → rumdl-0.0.167}/.rustfmt.toml +0 -0
  32. {rumdl-0.0.166 → rumdl-0.0.167}/CONTRIBUTING.md +0 -0
  33. {rumdl-0.0.166 → rumdl-0.0.167}/LICENSE +0 -0
  34. {rumdl-0.0.166 → rumdl-0.0.167}/MANIFEST.in +0 -0
  35. {rumdl-0.0.166 → rumdl-0.0.167}/README.md +0 -0
  36. {rumdl-0.0.166 → rumdl-0.0.167}/assets/logo.png +0 -0
  37. {rumdl-0.0.166 → rumdl-0.0.167}/benches/fix_performance.rs +0 -0
  38. {rumdl-0.0.166 → rumdl-0.0.167}/benches/range_performance.rs +0 -0
  39. {rumdl-0.0.166 → rumdl-0.0.167}/benches/range_utils_benchmark.rs +0 -0
  40. {rumdl-0.0.166 → rumdl-0.0.167}/benches/rule_performance.rs +0 -0
  41. {rumdl-0.0.166 → rumdl-0.0.167}/benches/simple_fix_bench.rs +0 -0
  42. {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/bench_lint_context.rs +0 -0
  43. {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/benchmark.rs +0 -0
  44. {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/benchmark_rule.rs +0 -0
  45. {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  46. {rumdl-0.0.166 → rumdl-0.0.167}/benchmark/bin/measure_code_span_performance.rs +0 -0
  47. {rumdl-0.0.166 → rumdl-0.0.167}/cliff.toml +0 -0
  48. {rumdl-0.0.166 → rumdl-0.0.167}/docs/RULES.md +0 -0
  49. {rumdl-0.0.166 → rumdl-0.0.167}/docs/global-settings.md +0 -0
  50. {rumdl-0.0.166 → rumdl-0.0.167}/docs/inline-configuration.md +0 -0
  51. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md001.md +0 -0
  52. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md002.md +0 -0
  53. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md003.md +0 -0
  54. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md004.md +0 -0
  55. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md005.md +0 -0
  56. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md006.md +0 -0
  57. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md007.md +0 -0
  58. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md009.md +0 -0
  59. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md010.md +0 -0
  60. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md011.md +0 -0
  61. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md012.md +0 -0
  62. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md014.md +0 -0
  63. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md018.md +0 -0
  64. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md019.md +0 -0
  65. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md020.md +0 -0
  66. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md021.md +0 -0
  67. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md022.md +0 -0
  68. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md023.md +0 -0
  69. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md024.md +0 -0
  70. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md025.md +0 -0
  71. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md026.md +0 -0
  72. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md027.md +0 -0
  73. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md028.md +0 -0
  74. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md029.md +0 -0
  75. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md030.md +0 -0
  76. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md031.md +0 -0
  77. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md032.md +0 -0
  78. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md034.md +0 -0
  79. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md035.md +0 -0
  80. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md036.md +0 -0
  81. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md037.md +0 -0
  82. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md038.md +0 -0
  83. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md039.md +0 -0
  84. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md040.md +0 -0
  85. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md041.md +0 -0
  86. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md042.md +0 -0
  87. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md043.md +0 -0
  88. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md044.md +0 -0
  89. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md045.md +0 -0
  90. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md046.md +0 -0
  91. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md047.md +0 -0
  92. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md048.md +0 -0
  93. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md049.md +0 -0
  94. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md050.md +0 -0
  95. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md051.md +0 -0
  96. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md052.md +0 -0
  97. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md054.md +0 -0
  98. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md055.md +0 -0
  99. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md056.md +0 -0
  100. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md057.md +0 -0
  101. {rumdl-0.0.166 → rumdl-0.0.167}/docs/md058.md +0 -0
  102. {rumdl-0.0.166 → rumdl-0.0.167}/docs/vscode-extension.md +0 -0
  103. {rumdl-0.0.166 → rumdl-0.0.167}/pyproject.toml +0 -0
  104. {rumdl-0.0.166 → rumdl-0.0.167}/rumdl/__init__.py +0 -0
  105. {rumdl-0.0.166 → rumdl-0.0.167}/rumdl/__main__.py +0 -0
  106. {rumdl-0.0.166 → rumdl-0.0.167}/rumdl/py.typed +0 -0
  107. {rumdl-0.0.166 → rumdl-0.0.167}/rumdl.schema.json +0 -0
  108. {rumdl-0.0.166 → rumdl-0.0.167}/rumdl.toml.example +0 -0
  109. {rumdl-0.0.166 → rumdl-0.0.167}/rust-toolchain.toml +0 -0
  110. {rumdl-0.0.166 → rumdl-0.0.167}/scripts/extract-changelog.sh +0 -0
  111. {rumdl-0.0.166 → rumdl-0.0.167}/scripts/generate-downloads-table.sh +0 -0
  112. {rumdl-0.0.166 → rumdl-0.0.167}/scripts/pre-release.sh +0 -0
  113. {rumdl-0.0.166 → rumdl-0.0.167}/scripts/prepare-release.sh +0 -0
  114. {rumdl-0.0.166 → rumdl-0.0.167}/scripts/setup-pre-commit.sh +0 -0
  115. {rumdl-0.0.166 → rumdl-0.0.167}/scripts/update-pre-commit-docs.sh +0 -0
  116. {rumdl-0.0.166 → rumdl-0.0.167}/src/cache.rs +0 -0
  117. {rumdl-0.0.166 → rumdl-0.0.167}/src/exit_codes.rs +0 -0
  118. {rumdl-0.0.166 → rumdl-0.0.167}/src/file_processor.rs +0 -0
  119. {rumdl-0.0.166 → rumdl-0.0.167}/src/filtered_lines.rs +0 -0
  120. {rumdl-0.0.166 → rumdl-0.0.167}/src/fix_coordinator.rs +0 -0
  121. {rumdl-0.0.166 → rumdl-0.0.167}/src/formatter.rs +0 -0
  122. {rumdl-0.0.166 → rumdl-0.0.167}/src/inline_config.rs +0 -0
  123. {rumdl-0.0.166 → rumdl-0.0.167}/src/lib.rs +0 -0
  124. {rumdl-0.0.166 → rumdl-0.0.167}/src/lint_context.rs +0 -0
  125. {rumdl-0.0.166 → rumdl-0.0.167}/src/main.rs +0 -0
  126. {rumdl-0.0.166 → rumdl-0.0.167}/src/markdownlint_config.rs +0 -0
  127. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/azure.rs +0 -0
  128. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/concise.rs +0 -0
  129. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/github.rs +0 -0
  130. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/gitlab.rs +0 -0
  131. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/grouped.rs +0 -0
  132. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/json.rs +0 -0
  133. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/json_lines.rs +0 -0
  134. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/junit.rs +0 -0
  135. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/mod.rs +0 -0
  136. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/pylint.rs +0 -0
  137. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/sarif.rs +0 -0
  138. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/formatters/text.rs +0 -0
  139. {rumdl-0.0.166 → rumdl-0.0.167}/src/output/mod.rs +0 -0
  140. {rumdl-0.0.166 → rumdl-0.0.167}/src/parallel.rs +0 -0
  141. {rumdl-0.0.166 → rumdl-0.0.167}/src/performance.rs +0 -0
  142. {rumdl-0.0.166 → rumdl-0.0.167}/src/profiling.rs +0 -0
  143. {rumdl-0.0.166 → rumdl-0.0.167}/src/rule.rs +0 -0
  144. {rumdl-0.0.166 → rumdl-0.0.167}/src/rule_config.rs +0 -0
  145. {rumdl-0.0.166 → rumdl-0.0.167}/src/rule_config_serde.rs +0 -0
  146. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/blockquote_utils.rs +0 -0
  147. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/code_block_utils.rs +0 -0
  148. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/code_fence_utils.rs +0 -0
  149. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/emphasis_style.rs +0 -0
  150. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/front_matter_utils.rs +0 -0
  151. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/heading_utils.rs +0 -0
  152. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/list_utils.rs +0 -0
  153. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md001_heading_increment.rs +0 -0
  154. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  155. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md002_first_heading_h1.rs +0 -0
  156. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md003_heading_style/md003_config.rs +0 -0
  157. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md003_heading_style.rs +0 -0
  158. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  159. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md004_unordered_list_style.rs +0 -0
  160. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md005_list_indent.rs +0 -0
  161. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md006_start_bullets.rs +0 -0
  162. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  163. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md007_ul_indent.rs +0 -0
  164. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  165. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md009_trailing_spaces.rs +0 -0
  166. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  167. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md010_no_hard_tabs.rs +0 -0
  168. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md011_no_reversed_links.rs +0 -0
  169. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  170. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md012_no_multiple_blanks.rs +0 -0
  171. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md013_line_length/md013_config.rs +0 -0
  172. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  173. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md014_commands_show_output.rs +0 -0
  174. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md018_no_missing_space_atx.rs +0 -0
  175. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  176. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  177. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  178. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  179. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md023_heading_start_left.rs +0 -0
  180. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  181. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md024_no_duplicate_heading.rs +0 -0
  182. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md025_single_title/md025_config.rs +0 -0
  183. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md025_single_title.rs +0 -0
  184. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  185. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  186. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  187. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  188. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  189. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md029_ordered_list_prefix.rs +0 -0
  190. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  191. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md030_list_marker_space.rs +0 -0
  192. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md031_blanks_around_fences.rs +0 -0
  193. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md032_blanks_around_lists.rs +0 -0
  194. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  195. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md034_no_bare_urls.rs +0 -0
  196. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md035_hr_style/md035_config.rs +0 -0
  197. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  198. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  199. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  200. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md038_no_space_in_code.rs +0 -0
  201. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md039_no_space_in_links.rs +0 -0
  202. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md040_fenced_code_language.rs +0 -0
  203. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md041_first_line_heading.rs +0 -0
  204. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md042_no_empty_links.rs +0 -0
  205. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md043_required_headings.rs +0 -0
  206. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md044_proper_names/md044_config.rs +0 -0
  207. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md044_proper_names.rs +0 -0
  208. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  209. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md045_no_alt_text.rs +0 -0
  210. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  211. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md046_code_block_style.rs +0 -0
  212. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md047_single_trailing_newline.rs +0 -0
  213. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  214. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md048_code_fence_style.rs +0 -0
  215. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  216. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md049_emphasis_style.rs +0 -0
  217. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md050_strong_style/md050_config.rs +0 -0
  218. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md050_strong_style.rs +0 -0
  219. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md052_reference_links_images.rs +0 -0
  220. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  221. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  222. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md056_table_column_count.rs +0 -0
  223. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  224. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md057_existing_relative_links.rs +0 -0
  225. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/md058_blanks_around_tables.rs +0 -0
  226. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/mod.rs +0 -0
  227. {rumdl-0.0.166 → rumdl-0.0.167}/src/rules/strong_style.rs +0 -0
  228. {rumdl-0.0.166 → rumdl-0.0.167}/src/stdin_processor.rs +0 -0
  229. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/jekyll.rs +0 -0
  230. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/kramdown.rs +0 -0
  231. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
  232. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/anchor_styles/mod.rs +0 -0
  233. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/ast_utils.rs +0 -0
  234. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/code_block_utils.rs +0 -0
  235. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/document_structure.rs +0 -0
  236. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/early_returns.rs +0 -0
  237. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/element_cache.rs +0 -0
  238. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/emphasis_utils.rs +0 -0
  239. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/fix_utils.rs +0 -0
  240. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/header_id_utils.rs +0 -0
  241. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/jinja_utils.rs +0 -0
  242. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/kramdown_utils.rs +0 -0
  243. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/line_ending.rs +0 -0
  244. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/markdown_elements.rs +0 -0
  245. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_admonitions.rs +0 -0
  246. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_common.rs +0 -0
  247. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_critic.rs +0 -0
  248. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_footnotes.rs +0 -0
  249. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_patterns.rs +0 -0
  250. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_snippets.rs +0 -0
  251. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_tabs.rs +0 -0
  252. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocs_test_utils.rs +0 -0
  253. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mkdocstrings_refs.rs +0 -0
  254. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/mod.rs +0 -0
  255. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/range_utils.rs +0 -0
  256. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/regex_cache.rs +0 -0
  257. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/skip_context.rs +0 -0
  258. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/string_interner.rs +0 -0
  259. {rumdl-0.0.166 → rumdl-0.0.167}/src/utils/table_utils.rs +0 -0
  260. {rumdl-0.0.166 → rumdl-0.0.167}/src/vscode.rs +0 -0
  261. {rumdl-0.0.166 → rumdl-0.0.167}/src/watch.rs +0 -0
  262. {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/additional_tests.rs +0 -0
  263. {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/basic_tests.rs +0 -0
  264. {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/comprehensive_tests.rs +0 -0
  265. {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/extended_tests.rs +0 -0
  266. {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/mod.rs +0 -0
  267. {rumdl-0.0.166 → rumdl-0.0.167}/tests/character_ranges/unicode_utils.rs +0 -0
  268. {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_duplication_test.rs +0 -0
  269. {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_explain_test.rs +0 -0
  270. {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_flag_precedence_test.rs +0 -0
  271. {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_integration_tests.rs +0 -0
  272. {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_lsp_fix_consistency.rs +0 -0
  273. {rumdl-0.0.166 → rumdl-0.0.167}/tests/cli_statistics_test.rs +0 -0
  274. {rumdl-0.0.166 → rumdl-0.0.167}/tests/code_block_blockquote_edge_cases.rs +0 -0
  275. {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/cli_test_utils.rs +0 -0
  276. {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/fixtures.rs +0 -0
  277. {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/mod.rs +0 -0
  278. {rumdl-0.0.166 → rumdl-0.0.167}/tests/common/test_utils.rs +0 -0
  279. {rumdl-0.0.166 → rumdl-0.0.167}/tests/commonmark_compliance_tests.rs +0 -0
  280. {rumdl-0.0.166 → rumdl-0.0.167}/tests/comprehensive_integration_tests.rs +0 -0
  281. {rumdl-0.0.166 → rumdl-0.0.167}/tests/comprehensive_output_format_tests.rs +0 -0
  282. {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_application_tests.rs +0 -0
  283. {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_file_command_test.rs +0 -0
  284. {rumdl-0.0.166 → rumdl-0.0.167}/tests/config_upward_traversal_test.rs +0 -0
  285. {rumdl-0.0.166 → rumdl-0.0.167}/tests/configuration_inheritance_tests.rs +0 -0
  286. {rumdl-0.0.166 → rumdl-0.0.167}/tests/consistency_regression_tests.rs +0 -0
  287. {rumdl-0.0.166 → rumdl-0.0.167}/tests/crlf_line_endings_test.rs +0 -0
  288. {rumdl-0.0.166 → rumdl-0.0.167}/tests/cross_platform_compatibility_tests.rs +0 -0
  289. {rumdl-0.0.166 → rumdl-0.0.167}/tests/deeply_nested_lists_performance_test.rs +0 -0
  290. {rumdl-0.0.166 → rumdl-0.0.167}/tests/escaped_brackets_test.rs +0 -0
  291. {rumdl-0.0.166 → rumdl-0.0.167}/tests/exclude_with_explicit_paths_test.rs +0 -0
  292. {rumdl-0.0.166 → rumdl-0.0.167}/tests/final_confidence_assessment.rs +0 -0
  293. {rumdl-0.0.166 → rumdl-0.0.167}/tests/fix_counting_test.rs +0 -0
  294. {rumdl-0.0.166 → rumdl-0.0.167}/tests/fix_performance_baseline_test.rs +0 -0
  295. {rumdl-0.0.166 → rumdl-0.0.167}/tests/fixable_unfixable_config_test.rs +0 -0
  296. {rumdl-0.0.166 → rumdl-0.0.167}/tests/html_comments_test.rs +0 -0
  297. {rumdl-0.0.166 → rumdl-0.0.167}/tests/init_command_test.rs +0 -0
  298. {rumdl-0.0.166 → rumdl-0.0.167}/tests/inline_config_blocks_test.rs +0 -0
  299. {rumdl-0.0.166 → rumdl-0.0.167}/tests/inline_config_test.rs +0 -0
  300. {rumdl-0.0.166 → rumdl-0.0.167}/tests/integration_tests.rs +0 -0
  301. {rumdl-0.0.166 → rumdl-0.0.167}/tests/json_output_test.rs +0 -0
  302. {rumdl-0.0.166 → rumdl-0.0.167}/tests/kramdown_integration_test.rs +0 -0
  303. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lib.rs +0 -0
  304. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_editor_integration_tests.rs +0 -0
  305. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_formatting_tests.rs +0 -0
  306. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_initialization_options_test.rs +0 -0
  307. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_integration_tests.rs +0 -0
  308. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_memory_leak_tests.rs +0 -0
  309. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_mkdocs_flavor_test.rs +0 -0
  310. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_tests.rs +0 -0
  311. {rumdl-0.0.166 → rumdl-0.0.167}/tests/lsp_unopened_document_test.rs +0 -0
  312. {rumdl-0.0.166 → rumdl-0.0.167}/tests/malformed_markdown_stress_tests.rs +0 -0
  313. {rumdl-0.0.166 → rumdl-0.0.167}/tests/markdownlint_cli_integration.rs +0 -0
  314. {rumdl-0.0.166 → rumdl-0.0.167}/tests/markdownlint_config_test.rs +0 -0
  315. {rumdl-0.0.166 → rumdl-0.0.167}/tests/markdownlintignore_test.rs +0 -0
  316. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md009_md013_integration_test.rs +0 -0
  317. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md009_md013_order_test.rs +0 -0
  318. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md013_hard_breaks_test.rs +0 -0
  319. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md013_reflow_integration_test.rs +0 -0
  320. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md013_reflow_nested_lists_test.rs +0 -0
  321. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md032_edge_cases_test.rs +0 -0
  322. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md032_ordered_list_bug_test.rs +0 -0
  323. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md033_edge_cases_test.rs +0 -0
  324. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md037_xxxx_regression_test.rs +0 -0
  325. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md038_false_positive_test.rs +0 -0
  326. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md051_issue_39_regression_test.rs +0 -0
  327. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md051_readme_bug_test.rs +0 -0
  328. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md051_toc_bug_test.rs +0 -0
  329. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md052_literal_brackets_test.rs +0 -0
  330. {rumdl-0.0.166 → rumdl-0.0.167}/tests/md054_code_span_test.rs +0 -0
  331. {rumdl-0.0.166 → rumdl-0.0.167}/tests/mkdocs_anchor_edge_cases_test.rs +0 -0
  332. {rumdl-0.0.166 → rumdl-0.0.167}/tests/mkdocs_anchor_test.rs +0 -0
  333. {rumdl-0.0.166 → rumdl-0.0.167}/tests/nested_code_block_test.rs +0 -0
  334. {rumdl-0.0.166 → rumdl-0.0.167}/tests/output_format_integration_tests.rs +0 -0
  335. {rumdl-0.0.166 → rumdl-0.0.167}/tests/output_format_tests.rs +0 -0
  336. {rumdl-0.0.166 → rumdl-0.0.167}/tests/per_file_ignores_integration_test.rs +0 -0
  337. {rumdl-0.0.166 → rumdl-0.0.167}/tests/perf_check.rs +0 -0
  338. {rumdl-0.0.166 → rumdl-0.0.167}/tests/performance_validation_tests.rs +0 -0
  339. {rumdl-0.0.166 → rumdl-0.0.167}/tests/pyproject_config_tests.rs +0 -0
  340. {rumdl-0.0.166 → rumdl-0.0.167}/tests/regression_prevention_tests.rs +0 -0
  341. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  342. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/heading_edge_cases_test.rs +0 -0
  343. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  344. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/link_edge_cases_test.rs +0 -0
  345. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/list_rules_integration_test.rs +0 -0
  346. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md001_test.rs +0 -0
  347. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md001_unicode_test.rs +0 -0
  348. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md002_test.rs +0 -0
  349. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md003_test.rs +0 -0
  350. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md004_test.rs +0 -0
  351. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md005_dynamic_indent_test.rs +0 -0
  352. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md005_test.rs +0 -0
  353. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md005_unicode_test.rs +0 -0
  354. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md006_test.rs +0 -0
  355. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md006_unicode_test.rs +0 -0
  356. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md007_test.rs +0 -0
  357. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md009_test.rs +0 -0
  358. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md010_test.rs +0 -0
  359. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md011_test.rs +0 -0
  360. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md012_test.rs +0 -0
  361. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md013_test.rs +0 -0
  362. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md014_test.rs +0 -0
  363. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md018_test.rs +0 -0
  364. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md019_test.rs +0 -0
  365. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md020_test.rs +0 -0
  366. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md021_test.rs +0 -0
  367. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md022_test.rs +0 -0
  368. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md023_extended_test.rs +0 -0
  369. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md023_test.rs +0 -0
  370. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md024_test.rs +0 -0
  371. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md025_test.rs +0 -0
  372. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md026_kramdown_test.rs +0 -0
  373. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md026_test.rs +0 -0
  374. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md027_test.rs +0 -0
  375. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md028_md009_interaction_test.rs +0 -0
  376. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md028_test.rs +0 -0
  377. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_code_block_separation_test.rs +0 -0
  378. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_fix_test.rs +0 -0
  379. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_issue42_test.rs +0 -0
  380. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
  381. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_nested_list_continuation_test.rs +0 -0
  382. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
  383. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_test.rs +0 -0
  384. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md029_unicode_test.rs +0 -0
  385. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md030_test.rs +0 -0
  386. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md031_kramdown_test.rs +0 -0
  387. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md031_test.rs +0 -0
  388. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md032_test.rs +0 -0
  389. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_blockquote_test.rs +0 -0
  390. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_extended_test.rs +0 -0
  391. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_kramdown_test.rs +0 -0
  392. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md033_test.rs +0 -0
  393. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md034_ipv6_test.rs +0 -0
  394. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md034_test.rs +0 -0
  395. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md035_test.rs +0 -0
  396. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md036_test.rs +0 -0
  397. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md037_kramdown_test.rs +0 -0
  398. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md037_test.rs +0 -0
  399. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md038_nested_backticks_test.rs +0 -0
  400. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md038_test.rs +0 -0
  401. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md039_test.rs +0 -0
  402. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md040_test.rs +0 -0
  403. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md041_test.rs +0 -0
  404. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md042_test.rs +0 -0
  405. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md043_test.rs +0 -0
  406. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md044_test.rs +0 -0
  407. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md045_test.rs +0 -0
  408. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md046_test.rs +0 -0
  409. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md047_test.rs +0 -0
  410. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md048_test.rs +0 -0
  411. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md049_test.rs +0 -0
  412. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md050_test.rs +0 -0
  413. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_comprehensive_test.rs +0 -0
  414. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
  415. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_edge_cases_test.rs +0 -0
  416. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_issue_39_regression_test.rs +0 -0
  417. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
  418. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_property_based_test.rs +0 -0
  419. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_regression_prevention_test.rs +0 -0
  420. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_test.rs +0 -0
  421. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md051_unicode_security_test.rs +0 -0
  422. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md052_test.rs +0 -0
  423. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md053_additional_test.rs +0 -0
  424. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md053_proptest.rs +0 -0
  425. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md053_test.rs +0 -0
  426. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md054_test.rs +0 -0
  427. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md054_unicode_test.rs +0 -0
  428. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md055_test.rs +0 -0
  429. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md056_test.rs +0 -0
  430. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md057_test.rs +0 -0
  431. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md058_kramdown_test.rs +0 -0
  432. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/md058_test.rs +0 -0
  433. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_admonitions_test.rs +0 -0
  434. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
  435. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_extensions_test.rs +0 -0
  436. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mkdocs_snippets_test.rs +0 -0
  437. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/mod.rs +0 -0
  438. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules/rule_interaction_test.rs +0 -0
  439. {rumdl-0.0.166 → rumdl-0.0.167}/tests/rules_mod_test.rs +0 -0
  440. {rumdl-0.0.166 → rumdl-0.0.167}/tests/schema_validation_test.rs +0 -0
  441. {rumdl-0.0.166 → rumdl-0.0.167}/tests/sentence_per_line_test.rs +0 -0
  442. {rumdl-0.0.166 → rumdl-0.0.167}/tests/skip_context_tests.rs +0 -0
  443. {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_ast_code_block_issue.rs +0 -0
  444. {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_gfm_vs_default_parsing.rs +0 -0
  445. {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_lint_context_flow.rs +0 -0
  446. {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_list_ast_structure.rs +0 -0
  447. {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_multiline_ast.rs +0 -0
  448. {rumdl-0.0.166 → rumdl-0.0.167}/tests/test_underscore_edge_cases.rs +0 -0
  449. {rumdl-0.0.166 → rumdl-0.0.167}/tests/thread_safety_tests.rs +0 -0
  450. {rumdl-0.0.166 → rumdl-0.0.167}/tests/unfixable_rules_test.rs +0 -0
  451. {rumdl-0.0.166 → rumdl-0.0.167}/tests/unicode_edge_case_tests.rs +0 -0
  452. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utf8_boundary_tests.rs +0 -0
  453. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/blockquote_utils_test.rs +0 -0
  454. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/code_block_utils_extended_test.rs +0 -0
  455. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/code_block_utils_test.rs +0 -0
  456. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/core_utils_test.rs +0 -0
  457. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/front_matter_utils_test.rs +0 -0
  458. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/line_index_test.rs +0 -0
  459. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils/mod.rs +0 -0
  460. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils_markdown_edge_cases.rs +0 -0
  461. {rumdl-0.0.166 → rumdl-0.0.167}/tests/utils_tests.rs +0 -0
  462. {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_extension_fixes.rs +0 -0
  463. {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_test.rs +0 -0
  464. {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_tests.rs +0 -0
  465. {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_windows_comprehensive_test.rs +0 -0
  466. {rumdl-0.0.166 → rumdl-0.0.167}/tests/vscode_windows_test.rs +0 -0
@@ -22,21 +22,24 @@ status-level = "pass"
22
22
 
23
23
  [profile.ci]
24
24
 
25
- # Skip performance tests in CI (they're flaky due to resource variability)
25
+ # Skip performance and memory tests in CI (they're flaky due to resource variability)
26
26
  # Exclude specific integration test binaries and performance-related test functions
27
- default-filter = 'not (package(rumdl) and binary(deeply_nested_lists_performance_test)) and not (package(rumdl) and binary(performance_validation_tests)) and not (package(rumdl) and binary(perf_check)) and not test(/performance|benchmark/)'
27
+ default-filter = 'not (package(rumdl) and binary(deeply_nested_lists_performance_test)) and not (package(rumdl) and binary(performance_validation_tests)) and not (package(rumdl) and binary(perf_check)) and not test(/performance|benchmark|memory/)'
28
28
 
29
29
  # More conservative in CI
30
30
  test-threads = "num-cpus"
31
31
 
32
- # Always show all output in CI
32
+ # Show failures immediately, but minimize successful test output for speed
33
33
  failure-output = "immediate"
34
- success-output = "immediate"
35
- status-level = "all"
34
+ success-output = "final"
35
+ status-level = "pass"
36
36
 
37
37
  # No retries in CI to catch flaky tests
38
38
  retries = 0
39
39
 
40
+ # Fail fast on first failure to save CI time
41
+ fail-fast = true
42
+
40
43
  # Quick profile for development
41
44
  [profile.quick]
42
45
 
@@ -88,8 +91,8 @@ fail-fast = true
88
91
  # Performance testing profile - for scheduled/manual runs
89
92
  [profile.performance]
90
93
 
91
- # Only run performance and benchmark tests
92
- default-filter = 'test(performance) or test(benchmark) or test(deeply_nested)'
94
+ # Only run performance, benchmark, and memory tests
95
+ default-filter = 'test(performance) or test(benchmark) or test(deeply_nested) or test(memory)'
93
96
 
94
97
  # Run tests serially to reduce noise
95
98
  test-threads = 1
@@ -8,6 +8,8 @@
8
8
  # pre-commit run --hook-stage push --all-files # Run push hooks
9
9
  # pre-commit run --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG
10
10
 
11
+ fail_fast: true
12
+
11
13
  repos:
12
14
  # Conventional Commits validation
13
15
  - repo: https://github.com/compilerla/conventional-pre-commit
@@ -8,11 +8,11 @@ include = [
8
8
  ]
9
9
  # Globally disable specific rules
10
10
  disable = ["MD033"]
11
- respect_gitignore = true
11
+ respect-gitignore = true
12
12
 
13
13
  [MD013]
14
- line_length = 200
15
- code_blocks = true
14
+ line-length = 200
15
+ code-blocks = true
16
16
  tables = false
17
17
  headings = true
18
18
  reflow = true
@@ -7,6 +7,83 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.167] - 2025-10-24
11
+
12
+ ### Added
13
+
14
+ - **Configuration validation with fuzzy-match suggestions**
15
+ - Comprehensive unknown key detection for `.rumdl.toml` and `pyproject.toml`
16
+ - Intelligent "did you mean?" suggestions using Levenshtein distance algorithm
17
+ - File path context in validation warnings for easy debugging
18
+ - Catches typos in global options, rule names, and rule options
19
+ - Example: `line-lenght` → suggests `line-length`, `reflw` → suggests `reflow`
20
+ - Zero-dependency implementation with configurable similarity threshold
21
+ - Helps users catch configuration mistakes before they cause confusion
22
+
23
+ - **MD053: Support for community comment-style references**
24
+ - Recognizes and ignores reference-style link syntax used as comments
25
+ - Supports widely-used patterns: `[//]: # (comment)`, `[comment]: #`, `[note]: #`, `[todo]: #`, `[fixme]: #`, `[hack]: #`
26
+ - Any reference with just `#` as URL is treated as a comment
27
+ - While not in CommonMark/GFM specs, used across 23+ markdown implementations
28
+ - Complements HTML comments with a less HTML-like syntax option
29
+ - Improves compatibility with existing markdown practices
30
+
31
+ - **MD013: `line-length = 0` to disable all line length checks**
32
+ - Setting `line-length = 0` now completely disables MD013 rule
33
+ - Provides explicit way to turn off line length validation entirely
34
+ - More intuitive than previous workarounds
35
+ - Useful when line length management is handled by other tools or not desired
36
+
37
+ - **MD051: mdbook template support**
38
+ - Added detection and slug generation for mdbook templates
39
+ - Recognizes `{{#template path/to/file.md}}` syntax
40
+ - Properly generates GitHub-compatible slugs for template-included headings
41
+ - Improves compatibility with mdbook documentation projects
42
+
43
+ - **LSP: Manual "Reflow paragraph" code action for MD013 warnings**
44
+ - New code action available for MD013 line length warnings when auto-reflow is disabled
45
+ - Allows users to manually reflow specific paragraphs without enabling global reflow in config
46
+ - Appears as "Reflow paragraph" in Quick Fix menu (not marked as preferred, so won't trigger on save)
47
+ - Intelligently detects paragraph boundaries and reflows entire paragraph, not just the flagged line
48
+ - Respects line length limit from warning message or defaults to 80 characters
49
+ - Provides a way to try paragraph reflow before committing to enabling it globally
50
+ - Gives users fine-grained control over which paragraphs to reflow
51
+
52
+ ### Fixed
53
+
54
+ - **LSP: Preserve trailing newline in reflow action**
55
+ - Manual reflow code action now correctly preserves trailing newlines
56
+ - Prevents unwanted file modifications from reflow operations
57
+ - Maintains document structure integrity
58
+
59
+ - **LSP: Improve logging and resolve auto-fix issues**
60
+ - Enhanced LSP server logging for better debugging
61
+ - Resolved various auto-fix edge cases and reliability issues
62
+
63
+ - **MD051: Correct GitHub slug generation for angle brackets**
64
+ - Fixed incorrect slug generation for headings containing angle brackets
65
+ - Now properly handles special characters in anchor generation
66
+ - Improves accuracy of link validation for complex headings
67
+
68
+ ### Changed
69
+
70
+ - **MD033: Remove unhelpful message suffix**
71
+ - Simplified warning messages for inline HTML detection
72
+ - Removed redundant information to reduce noise
73
+ - Cleaner, more focused error messages
74
+
75
+ - **Code cleanup: Remove dead code**
76
+ - Removed unused `LinkImageStyle` enum from MD054
77
+ - General refactoring to improve maintainability
78
+ - Fixed clippy warnings
79
+
80
+ ### Documentation
81
+
82
+ - **MD033: Document mdbook use case for semantic HTML**
83
+ - Added documentation about using semantic HTML in mdbook projects
84
+ - Clarifies when and why inline HTML might be intentionally used
85
+ - Helps users understand legitimate use cases for HTML in markdown
86
+
10
87
  ## [0.0.166] - 2025-10-22
11
88
 
12
89
  ### Added
@@ -1983,7 +1983,7 @@ dependencies = [
1983
1983
 
1984
1984
  [[package]]
1985
1985
  name = "rumdl"
1986
- version = "0.0.166"
1986
+ version = "0.0.167"
1987
1987
  dependencies = [
1988
1988
  "anyhow",
1989
1989
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.166"
3
+ version = "0.0.167"
4
4
  edition = "2024"
5
5
  rust-version = "1.89.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
@@ -95,8 +95,8 @@ test-pre-commit:
95
95
  cargo nextest run --profile pre-commit
96
96
 
97
97
  test-push:
98
- @echo "Running comprehensive test suite (~30s, excludes slow/performance tests)..."
99
- cargo nextest run --profile dev
98
+ @echo "Running CI test suite (excludes performance tests)..."
99
+ cargo nextest run --profile ci
100
100
 
101
101
  test-ci:
102
102
  cargo nextest run --profile ci
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.166
3
+ Version: 0.0.167
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -62,7 +62,7 @@ MD013:
62
62
 
63
63
  ### Configuration options explained
64
64
 
65
- - `line_length`: The maximum number of characters allowed per line
65
+ - `line_length`: The maximum number of characters allowed per line (set to `0` to disable all line length checks)
66
66
  - `code_blocks`: Whether to check line length in code blocks
67
67
  - `tables`: Whether to check line length in tables
68
68
  - `headings`: Whether to check line length in headings
@@ -195,6 +195,25 @@ This configuration is useful when:
195
195
  - You care about line length in code blocks and tables but not in regular text
196
196
  - You're using semantic line breaks where sentence length is determined by content, not arbitrary limits
197
197
 
198
+ #### Disabling all line length checks
199
+
200
+ If you want to completely disable all line length checking (for paragraphs, headings, code blocks, and tables), set `line-length` to `0`:
201
+
202
+ ```yaml
203
+ MD013:
204
+ line-length: 0 # Disable all line length checks
205
+ reflow: true
206
+ reflow-mode: "sentence-per-line"
207
+ ```
208
+
209
+ When `line-length` is set to `0`, no line length warnings will be reported for any content type. This is particularly useful for:
210
+
211
+ - Projects using semantic line breaks where lines break at logical boundaries regardless of length
212
+ - Sentence-per-line workflows where line length is not a concern
213
+ - Documentation where long lines (e.g., URLs, technical terms) are unavoidable and acceptable
214
+
215
+ **Note**: With `line-length: 0`, reflow still works (using a very large effective line length), so you can still use `sentence-per-line` mode for automatic formatting without any line length warnings.
216
+
198
217
  ### Example with automatic reflow
199
218
 
200
219
  ```yaml
@@ -89,6 +89,24 @@ MD033:
89
89
 
90
90
  This would allow line breaks, horizontal rules, and collapsible sections while blocking other HTML.
91
91
 
92
+ ### mdbook projects with semantic HTML
93
+
94
+ mdbook documentation often uses HTML with CSS classes to add semantic meaning that pure Markdown cannot express (e.g., marking text as filenames, captions, or warnings). For mdbook projects, you can
95
+ allow semantic containers:
96
+
97
+ ```toml
98
+ [tool.rumdl.MD033]
99
+ allowed-elements = ["div", "span"]
100
+ ```
101
+
102
+ This permits semantic HTML like:
103
+
104
+ - `<span class="filename">src/main.rs</span>` - Filename styling
105
+ - `<div class="warning">Important note</div>` - Warning boxes
106
+ - `<span class="caption">Figure 1: Architecture</span>` - Figure captions
107
+
108
+ While still catching potentially problematic HTML like `<em>`, `<strong>`, or `<script>` tags that have Markdown equivalents or security concerns.
109
+
92
110
  ## Automatic fixes
93
111
 
94
112
  This rule can automatically remove HTML tags when no allowed elements are configured. When specific tags are allowed via `allowed_elements`, those tags will be preserved while others are removed.
@@ -64,6 +64,65 @@ MD053:
64
64
 
65
65
  This keeps reference definitions with names like "todo", "draft", or "template" even if they're not currently used.
66
66
 
67
+ ## Comment-Style References
68
+
69
+ rumdl automatically recognizes and ignores common community patterns for adding comments using reference-style syntax. These patterns are **not part of any official Markdown specification**
70
+ (CommonMark, GFM), but are widely used across 23+ Markdown implementations.
71
+
72
+ ### Recognized Comment Patterns
73
+
74
+ The following patterns are automatically ignored and won't be flagged as unused:
75
+
76
+ ```markdown
77
+ [//]: # (This is a comment - most popular pattern)
78
+ [comment]: # (This is a semantic comment)
79
+ [note]: # (This is a note for documentation)
80
+ [todo]: # (Add more examples here)
81
+ [fixme]: # (This needs to be fixed)
82
+ [hack]: # (Temporary workaround)
83
+ ```
84
+
85
+ Any reference definition with just `#` as the URL is also treated as a comment:
86
+
87
+ ```markdown
88
+ [anything]: # (This will be treated as a comment)
89
+ [ref]: # "Also a comment"
90
+ ```
91
+
92
+ ### Why These Work
93
+
94
+ These patterns exploit valid Markdown link reference syntax:
95
+
96
+ - The label (e.g., `[//]`) is technically valid
97
+ - The `#` is a valid URL (just a fragment/anchor)
98
+ - Since the reference is never used, it doesn't render
99
+
100
+ ### When to Use
101
+
102
+ **Use HTML comments for standard commenting:**
103
+
104
+ ```markdown
105
+ <!-- This is the recommended way to add comments -->
106
+ ```
107
+
108
+ **Use reference-style comments when:**
109
+
110
+ - Your documentation tool strips HTML comments
111
+ - You prefer a less HTML-like syntax
112
+ - You're following project conventions that use this pattern
113
+ - You need comments that won't appear in page source
114
+
115
+ ### Real vs. Comment References
116
+
117
+ rumdl distinguishes between comment patterns and real references:
118
+
119
+ ```markdown
120
+ [//]: # (This is ignored - it's a comment)
121
+ [real-link]: https://example.com <!-- This WILL be flagged if unused -->
122
+ ```
123
+
124
+ Only the real reference definition will trigger MD053 if it's not used in the document.
125
+
67
126
  ## Automatic fixes
68
127
 
69
128
  This rule can automatically fix issues by:
@@ -88,7 +88,7 @@ pub fn normalize_key(key: &str) -> String {
88
88
  }
89
89
 
90
90
  /// Represents a rule-specific configuration
91
- #[derive(Debug, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
91
+ #[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
92
92
  pub struct RuleConfig {
93
93
  /// Configuration values for the rule
94
94
  #[serde(flatten)]
@@ -110,7 +110,7 @@ fn arbitrary_value_schema(_gen: &mut schemars::r#gen::SchemaGenerator) -> schema
110
110
  }
111
111
 
112
112
  /// Represents the complete configuration loaded from rumdl.toml
113
- #[derive(Debug, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
113
+ #[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, schemars::JsonSchema)]
114
114
  #[schemars(
115
115
  description = "rumdl configuration for linting Markdown files. Rules can be configured individually using [MD###] sections with rule-specific options."
116
116
  )]
@@ -205,7 +205,7 @@ impl Config {
205
205
  }
206
206
 
207
207
  /// Global configuration options
208
- #[derive(Debug, Serialize, Deserialize, PartialEq, schemars::JsonSchema)]
208
+ #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, schemars::JsonSchema)]
209
209
  #[serde(default)]
210
210
  pub struct GlobalConfig {
211
211
  /// Enabled rules
@@ -340,7 +340,7 @@ exclude = [
340
340
  ]
341
341
 
342
342
  # Respect .gitignore files when scanning directories (default: true)
343
- respect_gitignore = true
343
+ respect-gitignore = true
344
344
 
345
345
  # Markdown flavor/dialect (uncomment to enable)
346
346
  # Options: mkdocs, gfm, commonmark
@@ -358,8 +358,8 @@ respect_gitignore = true
358
358
  # indent = 4 # Unordered list indentation
359
359
 
360
360
  # [MD013]
361
- # line_length = 100 # Line length
362
- # code_blocks = false # Exclude code blocks from line length check
361
+ # line-length = 100 # Line length
362
+ # code-blocks = false # Exclude code blocks from line length check
363
363
  # tables = false # Exclude tables from line length check
364
364
  # headings = true # Include headings in line length check
365
365
 
@@ -452,8 +452,8 @@ respect-gitignore = true
452
452
  # indent = 4 # Unordered list indentation
453
453
 
454
454
  # [tool.rumdl.MD013]
455
- # line_length = 100 # Line length
456
- # code_blocks = false # Exclude code blocks from line length check
455
+ # line-length = 100 # Line length
456
+ # code-blocks = false # Exclude code blocks from line length check
457
457
  # tables = false # Exclude tables from line length check
458
458
  # headings = true # Include headings in line length check
459
459
 
@@ -1468,7 +1468,8 @@ pub struct SourcedConfigFragment {
1468
1468
  pub global: SourcedGlobalConfig,
1469
1469
  pub per_file_ignores: SourcedValue<HashMap<String, Vec<String>>>,
1470
1470
  pub rules: BTreeMap<String, SourcedRuleConfig>,
1471
- // Note: Does not include loaded_files or unknown_keys, as those are tracked globally.
1471
+ pub unknown_keys: Vec<(String, String, Option<String>)>, // (section, key, file_path)
1472
+ // Note: loaded_files is tracked globally in SourcedConfig.
1472
1473
  }
1473
1474
 
1474
1475
  impl Default for SourcedConfigFragment {
@@ -1477,6 +1478,7 @@ impl Default for SourcedConfigFragment {
1477
1478
  global: SourcedGlobalConfig::default(),
1478
1479
  per_file_ignores: SourcedValue::new(HashMap::new(), ConfigSource::Default),
1479
1480
  rules: BTreeMap::new(),
1481
+ unknown_keys: Vec::new(),
1480
1482
  }
1481
1483
  }
1482
1484
  }
@@ -1487,7 +1489,7 @@ pub struct SourcedConfig {
1487
1489
  pub per_file_ignores: SourcedValue<HashMap<String, Vec<String>>>,
1488
1490
  pub rules: BTreeMap<String, SourcedRuleConfig>,
1489
1491
  pub loaded_files: Vec<String>,
1490
- pub unknown_keys: Vec<(String, String)>, // (section, key)
1492
+ pub unknown_keys: Vec<(String, String, Option<String>)>, // (section, key, file_path)
1491
1493
  }
1492
1494
 
1493
1495
  impl Default for SourcedConfig {
@@ -1628,6 +1630,14 @@ impl SourcedConfig {
1628
1630
  );
1629
1631
  }
1630
1632
  }
1633
+
1634
+ // Merge unknown_keys from fragment
1635
+ for (section, key, file_path) in fragment.unknown_keys {
1636
+ // Deduplicate: only add if not already present
1637
+ if !self.unknown_keys.iter().any(|(s, k, _)| s == &section && k == &key) {
1638
+ self.unknown_keys.push((section, key, file_path));
1639
+ }
1640
+ }
1631
1641
  }
1632
1642
 
1633
1643
  /// Load and merge configurations from files and CLI overrides.
@@ -1956,7 +1966,7 @@ impl SourcedConfig {
1956
1966
  // No rule-specific CLI overrides implemented yet
1957
1967
  }
1958
1968
 
1959
- // TODO: Handle unknown keys collected during parsing/merging
1969
+ // Unknown keys are now collected during parsing and validated via validate_config_sourced()
1960
1970
 
1961
1971
  Ok(sourced_config)
1962
1972
  }
@@ -2145,8 +2155,14 @@ pub fn validate_config_sourced(sourced: &SourcedConfig, registry: &RuleRegistry)
2145
2155
  if let Some(valid_keys) = registry.config_keys_for(rule) {
2146
2156
  for key in rule_cfg.values.keys() {
2147
2157
  if !valid_keys.contains(key) {
2158
+ let valid_keys_vec: Vec<String> = valid_keys.iter().cloned().collect();
2159
+ let message = if let Some(suggestion) = suggest_similar_key(key, &valid_keys_vec) {
2160
+ format!("Unknown option for rule {rule}: {key} (did you mean: {suggestion}?)")
2161
+ } else {
2162
+ format!("Unknown option for rule {rule}: {key}")
2163
+ };
2148
2164
  warnings.push(ConfigValidationWarning {
2149
- message: format!("Unknown option for rule {rule}: {key}"),
2165
+ message,
2150
2166
  rule: Some(rule.clone()),
2151
2167
  key: Some(key.clone()),
2152
2168
  });
@@ -2173,13 +2189,60 @@ pub fn validate_config_sourced(sourced: &SourcedConfig, registry: &RuleRegistry)
2173
2189
  }
2174
2190
  }
2175
2191
  // 3. Unknown global options (from unknown_keys)
2176
- for (section, key) in &sourced.unknown_keys {
2177
- if section.contains("[global]") {
2192
+ let known_global_keys = vec![
2193
+ "enable".to_string(),
2194
+ "disable".to_string(),
2195
+ "include".to_string(),
2196
+ "exclude".to_string(),
2197
+ "respect-gitignore".to_string(),
2198
+ "line-length".to_string(),
2199
+ "fixable".to_string(),
2200
+ "unfixable".to_string(),
2201
+ "flavor".to_string(),
2202
+ "force-exclude".to_string(),
2203
+ "output-format".to_string(),
2204
+ ];
2205
+
2206
+ for (section, key, file_path) in &sourced.unknown_keys {
2207
+ if section.contains("[global]") || section.contains("[tool.rumdl]") {
2208
+ let message = if let Some(suggestion) = suggest_similar_key(key, &known_global_keys) {
2209
+ if let Some(path) = file_path {
2210
+ format!("Unknown global option in {path}: {key} (did you mean: {suggestion}?)")
2211
+ } else {
2212
+ format!("Unknown global option: {key} (did you mean: {suggestion}?)")
2213
+ }
2214
+ } else if let Some(path) = file_path {
2215
+ format!("Unknown global option in {path}: {key}")
2216
+ } else {
2217
+ format!("Unknown global option: {key}")
2218
+ };
2178
2219
  warnings.push(ConfigValidationWarning {
2179
- message: format!("Unknown global option: {key}"),
2220
+ message,
2180
2221
  rule: None,
2181
2222
  key: Some(key.clone()),
2182
2223
  });
2224
+ } else if !key.is_empty() {
2225
+ // This is an unknown rule section (key is empty means it's a section header)
2226
+ // No suggestions for rule names - just warn
2227
+ continue;
2228
+ } else {
2229
+ // Unknown rule section
2230
+ let message = if let Some(path) = file_path {
2231
+ format!(
2232
+ "Unknown rule in {path}: {}",
2233
+ section.trim_matches(|c| c == '[' || c == ']')
2234
+ )
2235
+ } else {
2236
+ format!(
2237
+ "Unknown rule in config: {}",
2238
+ section.trim_matches(|c| c == '[' || c == ']')
2239
+ )
2240
+ };
2241
+ warnings.push(ConfigValidationWarning {
2242
+ message,
2243
+ rule: None,
2244
+ key: None,
2245
+ });
2183
2246
  }
2184
2247
  }
2185
2248
  warnings
@@ -2197,6 +2260,63 @@ fn toml_type_name(val: &toml::Value) -> &'static str {
2197
2260
  }
2198
2261
  }
2199
2262
 
2263
+ /// Calculate Levenshtein distance between two strings (simple implementation)
2264
+ fn levenshtein_distance(s1: &str, s2: &str) -> usize {
2265
+ let len1 = s1.len();
2266
+ let len2 = s2.len();
2267
+
2268
+ if len1 == 0 {
2269
+ return len2;
2270
+ }
2271
+ if len2 == 0 {
2272
+ return len1;
2273
+ }
2274
+
2275
+ let s1_chars: Vec<char> = s1.chars().collect();
2276
+ let s2_chars: Vec<char> = s2.chars().collect();
2277
+
2278
+ let mut prev_row: Vec<usize> = (0..=len2).collect();
2279
+ let mut curr_row = vec![0; len2 + 1];
2280
+
2281
+ for i in 1..=len1 {
2282
+ curr_row[0] = i;
2283
+ for j in 1..=len2 {
2284
+ let cost = if s1_chars[i - 1] == s2_chars[j - 1] { 0 } else { 1 };
2285
+ curr_row[j] = (prev_row[j] + 1) // deletion
2286
+ .min(curr_row[j - 1] + 1) // insertion
2287
+ .min(prev_row[j - 1] + cost); // substitution
2288
+ }
2289
+ std::mem::swap(&mut prev_row, &mut curr_row);
2290
+ }
2291
+
2292
+ prev_row[len2]
2293
+ }
2294
+
2295
+ /// Suggest a similar key from a list of valid keys using fuzzy matching
2296
+ fn suggest_similar_key(unknown: &str, valid_keys: &[String]) -> Option<String> {
2297
+ let unknown_lower = unknown.to_lowercase();
2298
+ let max_distance = 2.max(unknown.len() / 3); // Allow up to 2 edits or 30% of string length
2299
+
2300
+ let mut best_match: Option<(String, usize)> = None;
2301
+
2302
+ for valid in valid_keys {
2303
+ let valid_lower = valid.to_lowercase();
2304
+ let distance = levenshtein_distance(&unknown_lower, &valid_lower);
2305
+
2306
+ if distance <= max_distance {
2307
+ if let Some((_, best_dist)) = &best_match {
2308
+ if distance < *best_dist {
2309
+ best_match = Some((valid.clone(), distance));
2310
+ }
2311
+ } else {
2312
+ best_match = Some((valid.clone(), distance));
2313
+ }
2314
+ }
2315
+ }
2316
+
2317
+ best_match.map(|(key, _)| key)
2318
+ }
2319
+
2200
2320
  fn toml_value_type_matches(expected: &toml::Value, actual: &toml::Value) -> bool {
2201
2321
  use toml::Value::*;
2202
2322
  match (expected, actual) {
@@ -2438,8 +2558,10 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
2438
2558
  }
2439
2559
  } else {
2440
2560
  // Key is not a global/special key, doesn't start with 'md', or isn't a table.
2441
- // TODO: Track unknown keys/sections if necessary for validation later.
2442
- // eprintln!("[DEBUG parse_pyproject] Skipping key '{}' as it's not a recognized rule table.", key);
2561
+ // Track unknown keys under [tool.rumdl] for validation
2562
+ fragment
2563
+ .unknown_keys
2564
+ .push(("[tool.rumdl]".to_string(), key.to_string(), Some(path.to_string())));
2443
2565
  }
2444
2566
  }
2445
2567
  }
@@ -2464,6 +2586,13 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
2464
2586
  .or_insert_with(|| SourcedValue::new(toml_val.clone(), source));
2465
2587
  sv.push_override(toml_val, source, file.clone(), None);
2466
2588
  }
2589
+ } else if rule_name.to_ascii_uppercase().starts_with("MD") {
2590
+ // Track unknown rule sections like [tool.rumdl.MD999]
2591
+ fragment.unknown_keys.push((
2592
+ format!("[tool.rumdl.{rule_name}]"),
2593
+ String::new(),
2594
+ Some(path.to_string()),
2595
+ ));
2467
2596
  }
2468
2597
  }
2469
2598
  }
@@ -2489,6 +2618,13 @@ fn parse_pyproject_toml(content: &str, path: &str) -> Result<Option<SourcedConfi
2489
2618
  .or_insert_with(|| SourcedValue::new(toml_val.clone(), source));
2490
2619
  sv.push_override(toml_val, source, file.clone(), None);
2491
2620
  }
2621
+ } else if rule_name.to_ascii_uppercase().starts_with("MD") {
2622
+ // Track unknown rule sections like [tool.rumdl.MD999]
2623
+ fragment.unknown_keys.push((
2624
+ format!("[tool.rumdl.{rule_name}]"),
2625
+ String::new(),
2626
+ Some(path.to_string()),
2627
+ ));
2492
2628
  }
2493
2629
  }
2494
2630
  }
@@ -2715,8 +2851,10 @@ fn parse_rumdl_toml(content: &str, path: &str) -> Result<SourcedConfigFragment,
2715
2851
  }
2716
2852
  }
2717
2853
  _ => {
2718
- // Add to unknown_keys for potential validation later
2719
- // fragment.unknown_keys.push(("[global]".to_string(), key.to_string()));
2854
+ // Track unknown global keys for validation
2855
+ fragment
2856
+ .unknown_keys
2857
+ .push(("[global]".to_string(), key.to_string(), Some(path.to_string())));
2720
2858
  log::warn!("[WARN] Unknown key in [global] section of {path}: {key}");
2721
2859
  }
2722
2860
  }
@@ -2751,9 +2889,23 @@ fn parse_rumdl_toml(content: &str, path: &str) -> Result<SourcedConfigFragment,
2751
2889
  // Rule-specific: all other top-level tables
2752
2890
  for (key, item) in doc.iter() {
2753
2891
  let norm_rule_name = key.to_ascii_uppercase();
2892
+
2893
+ // Skip known special sections
2894
+ if key == "global" || key == "per-file-ignores" {
2895
+ continue;
2896
+ }
2897
+
2898
+ // Track unknown rule sections (like [MD999])
2754
2899
  if !known_rule_names.contains(&norm_rule_name) {
2900
+ // Only track if it looks like a rule section (starts with MD or is uppercase)
2901
+ if norm_rule_name.starts_with("MD") || key.chars().all(|c| c.is_uppercase() || c.is_numeric()) {
2902
+ fragment
2903
+ .unknown_keys
2904
+ .push((format!("[{key}]"), String::new(), Some(path.to_string())));
2905
+ }
2755
2906
  continue;
2756
2907
  }
2908
+
2757
2909
  if let Some(tbl) = item.as_table() {
2758
2910
  let rule_entry = fragment.rules.entry(norm_rule_name.clone()).or_default();
2759
2911
  for (rk, rv_item) in tbl.iter() {
@@ -10,7 +10,7 @@ pub mod server;
10
10
  pub mod types;
11
11
 
12
12
  pub use server::RumdlLanguageServer;
13
- pub use types::{RumdlLspConfig, warning_to_code_action, warning_to_diagnostic};
13
+ pub use types::{RumdlLspConfig, warning_to_code_actions, warning_to_diagnostic};
14
14
 
15
15
  use anyhow::Result;
16
16
  use tokio::net::TcpListener;
@@ -64,7 +64,7 @@ mod tests {
64
64
  &crate::rule::LintWarning,
65
65
  &tower_lsp::lsp_types::Url,
66
66
  &str,
67
- ) -> Option<tower_lsp::lsp_types::CodeAction> = warning_to_code_action;
67
+ ) -> Vec<tower_lsp::lsp_types::CodeAction> = warning_to_code_actions;
68
68
  }
69
69
  }
70
70