rumdl 0.0.130__tar.gz → 0.0.131__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 (420) hide show
  1. {rumdl-0.0.130 → rumdl-0.0.131}/CHANGELOG.md +8 -1
  2. {rumdl-0.0.130 → rumdl-0.0.131}/Cargo.lock +1 -1
  3. {rumdl-0.0.130 → rumdl-0.0.131}/Cargo.toml +1 -1
  4. {rumdl-0.0.130 → rumdl-0.0.131}/PKG-INFO +1 -1
  5. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md002_first_heading_h1.rs +183 -90
  6. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md034_no_bare_urls.rs +2 -2
  7. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_snippets.rs +160 -15
  8. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/skip_context.rs +8 -3
  9. {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/basic_tests.rs +4 -2
  10. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md002_test.rs +69 -83
  11. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_edge_cases_test.rs +3 -3
  12. {rumdl-0.0.130 → rumdl-0.0.131}/.config/nextest.toml +0 -0
  13. {rumdl-0.0.130 → rumdl-0.0.131}/.mise.toml +0 -0
  14. {rumdl-0.0.130 → rumdl-0.0.131}/.pre-commit-config.yaml +0 -0
  15. {rumdl-0.0.130 → rumdl-0.0.131}/.rumdl.toml +0 -0
  16. {rumdl-0.0.130 → rumdl-0.0.131}/.rustfmt.toml +0 -0
  17. {rumdl-0.0.130 → rumdl-0.0.131}/LICENSE +0 -0
  18. {rumdl-0.0.130 → rumdl-0.0.131}/MANIFEST.in +0 -0
  19. {rumdl-0.0.130 → rumdl-0.0.131}/Makefile +0 -0
  20. {rumdl-0.0.130 → rumdl-0.0.131}/README.md +0 -0
  21. {rumdl-0.0.130 → rumdl-0.0.131}/assets/logo.png +0 -0
  22. {rumdl-0.0.130 → rumdl-0.0.131}/benches/fix_performance.rs +0 -0
  23. {rumdl-0.0.130 → rumdl-0.0.131}/benches/range_performance.rs +0 -0
  24. {rumdl-0.0.130 → rumdl-0.0.131}/benches/range_utils_benchmark.rs +0 -0
  25. {rumdl-0.0.130 → rumdl-0.0.131}/benches/rule_performance.rs +0 -0
  26. {rumdl-0.0.130 → rumdl-0.0.131}/benches/simple_fix_bench.rs +0 -0
  27. {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/bench_lint_context.rs +0 -0
  28. {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/benchmark.rs +0 -0
  29. {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/benchmark_rule.rs +0 -0
  30. {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  31. {rumdl-0.0.130 → rumdl-0.0.131}/benchmark/bin/measure_code_span_performance.rs +0 -0
  32. {rumdl-0.0.130 → rumdl-0.0.131}/docs/RULES.md +0 -0
  33. {rumdl-0.0.130 → rumdl-0.0.131}/docs/global-settings.md +0 -0
  34. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md001.md +0 -0
  35. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md002.md +0 -0
  36. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md003.md +0 -0
  37. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md004.md +0 -0
  38. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md005.md +0 -0
  39. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md006.md +0 -0
  40. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md007.md +0 -0
  41. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md009.md +0 -0
  42. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md010.md +0 -0
  43. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md011.md +0 -0
  44. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md012.md +0 -0
  45. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md013.md +0 -0
  46. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md014.md +0 -0
  47. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md018.md +0 -0
  48. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md019.md +0 -0
  49. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md020.md +0 -0
  50. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md021.md +0 -0
  51. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md022.md +0 -0
  52. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md023.md +0 -0
  53. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md024.md +0 -0
  54. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md025.md +0 -0
  55. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md026.md +0 -0
  56. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md027.md +0 -0
  57. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md028.md +0 -0
  58. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md029.md +0 -0
  59. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md030.md +0 -0
  60. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md031.md +0 -0
  61. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md032.md +0 -0
  62. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md033.md +0 -0
  63. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md034.md +0 -0
  64. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md035.md +0 -0
  65. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md036.md +0 -0
  66. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md037.md +0 -0
  67. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md038.md +0 -0
  68. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md039.md +0 -0
  69. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md040.md +0 -0
  70. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md041.md +0 -0
  71. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md042.md +0 -0
  72. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md043.md +0 -0
  73. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md044.md +0 -0
  74. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md045.md +0 -0
  75. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md046.md +0 -0
  76. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md047.md +0 -0
  77. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md048.md +0 -0
  78. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md049.md +0 -0
  79. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md050.md +0 -0
  80. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md051.md +0 -0
  81. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md052.md +0 -0
  82. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md053.md +0 -0
  83. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md054.md +0 -0
  84. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md055.md +0 -0
  85. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md056.md +0 -0
  86. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md057.md +0 -0
  87. {rumdl-0.0.130 → rumdl-0.0.131}/docs/md058.md +0 -0
  88. {rumdl-0.0.130 → rumdl-0.0.131}/docs/vscode-extension.md +0 -0
  89. {rumdl-0.0.130 → rumdl-0.0.131}/parity_check.py +0 -0
  90. {rumdl-0.0.130 → rumdl-0.0.131}/pyproject.toml +0 -0
  91. {rumdl-0.0.130 → rumdl-0.0.131}/python/MANIFEST.in +0 -0
  92. {rumdl-0.0.130 → rumdl-0.0.131}/python/PYTHON-README.md +0 -0
  93. {rumdl-0.0.130 → rumdl-0.0.131}/python/rumdl/__init__.py +0 -0
  94. {rumdl-0.0.130 → rumdl-0.0.131}/python/rumdl/__main__.py +0 -0
  95. {rumdl-0.0.130 → rumdl-0.0.131}/python/rumdl/py.typed +0 -0
  96. {rumdl-0.0.130 → rumdl-0.0.131}/rumdl.toml.example +0 -0
  97. {rumdl-0.0.130 → rumdl-0.0.131}/rust-toolchain.toml +0 -0
  98. {rumdl-0.0.130 → rumdl-0.0.131}/scripts/extract-changelog.sh +0 -0
  99. {rumdl-0.0.130 → rumdl-0.0.131}/scripts/generate-downloads-table.sh +0 -0
  100. {rumdl-0.0.130 → rumdl-0.0.131}/scripts/pre-release.sh +0 -0
  101. {rumdl-0.0.130 → rumdl-0.0.131}/scripts/prepare-release.sh +0 -0
  102. {rumdl-0.0.130 → rumdl-0.0.131}/scripts/setup-pre-commit.sh +0 -0
  103. {rumdl-0.0.130 → rumdl-0.0.131}/scripts/update-pre-commit-docs.sh +0 -0
  104. {rumdl-0.0.130 → rumdl-0.0.131}/src/config.rs +0 -0
  105. {rumdl-0.0.130 → rumdl-0.0.131}/src/exit_codes.rs +0 -0
  106. {rumdl-0.0.130 → rumdl-0.0.131}/src/inline_config.rs +0 -0
  107. {rumdl-0.0.130 → rumdl-0.0.131}/src/lib.rs +0 -0
  108. {rumdl-0.0.130 → rumdl-0.0.131}/src/lint_context.rs +0 -0
  109. {rumdl-0.0.130 → rumdl-0.0.131}/src/lsp/mod.rs +0 -0
  110. {rumdl-0.0.130 → rumdl-0.0.131}/src/lsp/server.rs +0 -0
  111. {rumdl-0.0.130 → rumdl-0.0.131}/src/lsp/types.rs +0 -0
  112. {rumdl-0.0.130 → rumdl-0.0.131}/src/main.rs +0 -0
  113. {rumdl-0.0.130 → rumdl-0.0.131}/src/markdownlint_config.rs +0 -0
  114. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/azure.rs +0 -0
  115. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/concise.rs +0 -0
  116. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/github.rs +0 -0
  117. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/gitlab.rs +0 -0
  118. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/grouped.rs +0 -0
  119. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/json.rs +0 -0
  120. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/json_lines.rs +0 -0
  121. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/junit.rs +0 -0
  122. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/mod.rs +0 -0
  123. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/pylint.rs +0 -0
  124. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/sarif.rs +0 -0
  125. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/formatters/text.rs +0 -0
  126. {rumdl-0.0.130 → rumdl-0.0.131}/src/output/mod.rs +0 -0
  127. {rumdl-0.0.130 → rumdl-0.0.131}/src/parallel.rs +0 -0
  128. {rumdl-0.0.130 → rumdl-0.0.131}/src/performance.rs +0 -0
  129. {rumdl-0.0.130 → rumdl-0.0.131}/src/profiling.rs +0 -0
  130. {rumdl-0.0.130 → rumdl-0.0.131}/src/python.rs +0 -0
  131. {rumdl-0.0.130 → rumdl-0.0.131}/src/rule.rs +0 -0
  132. {rumdl-0.0.130 → rumdl-0.0.131}/src/rule_config.rs +0 -0
  133. {rumdl-0.0.130 → rumdl-0.0.131}/src/rule_config_serde.rs +0 -0
  134. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/blockquote_utils.rs +0 -0
  135. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/code_block_utils.rs +0 -0
  136. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/code_fence_utils.rs +0 -0
  137. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/emphasis_style.rs +0 -0
  138. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/front_matter_utils.rs +0 -0
  139. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/heading_utils.rs +0 -0
  140. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/list_utils.rs +0 -0
  141. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md001_heading_increment.rs +0 -0
  142. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  143. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md003_heading_style/md003_config.rs +0 -0
  144. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md003_heading_style.rs +0 -0
  145. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  146. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md004_unordered_list_style.rs +0 -0
  147. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md005_list_indent.rs +0 -0
  148. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md006_start_bullets.rs +0 -0
  149. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  150. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md007_ul_indent.rs +0 -0
  151. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  152. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md009_trailing_spaces.rs +0 -0
  153. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  154. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md010_no_hard_tabs.rs +0 -0
  155. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md011_no_reversed_links.rs +0 -0
  156. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  157. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md012_no_multiple_blanks.rs +0 -0
  158. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md013_line_length/md013_config.rs +0 -0
  159. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md013_line_length.rs +0 -0
  160. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  161. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md014_commands_show_output.rs +0 -0
  162. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md018_no_missing_space_atx.rs +0 -0
  163. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  164. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  165. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  166. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  167. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md022_blanks_around_headings.rs +0 -0
  168. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md023_heading_start_left.rs +0 -0
  169. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  170. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md024_no_duplicate_heading.rs +0 -0
  171. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md025_single_title/md025_config.rs +0 -0
  172. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md025_single_title.rs +0 -0
  173. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  174. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  175. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  176. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  177. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  178. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md029_ordered_list_prefix.rs +0 -0
  179. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  180. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md030_list_marker_space.rs +0 -0
  181. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md031_blanks_around_fences.rs +0 -0
  182. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md032_blanks_around_lists.rs +0 -0
  183. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  184. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md033_no_inline_html.rs +0 -0
  185. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md035_hr_style/md035_config.rs +0 -0
  186. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md035_hr_style.rs +0 -0
  187. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  188. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  189. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  190. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md038_no_space_in_code.rs +0 -0
  191. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md039_no_space_in_links.rs +0 -0
  192. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md040_fenced_code_language.rs +0 -0
  193. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md041_first_line_heading.rs +0 -0
  194. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md042_no_empty_links.rs +0 -0
  195. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md043_required_headings.rs +0 -0
  196. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md044_proper_names/md044_config.rs +0 -0
  197. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md044_proper_names.rs +0 -0
  198. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  199. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md045_no_alt_text.rs +0 -0
  200. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  201. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md046_code_block_style.rs +0 -0
  202. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md047_single_trailing_newline.rs +0 -0
  203. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  204. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md048_code_fence_style.rs +0 -0
  205. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  206. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md049_emphasis_style.rs +0 -0
  207. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md050_strong_style/md050_config.rs +0 -0
  208. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md050_strong_style.rs +0 -0
  209. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md051_link_fragments.rs +0 -0
  210. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md052_reference_links_images.rs +0 -0
  211. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  212. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  213. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md054_link_image_style.rs +0 -0
  214. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  215. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md055_table_pipe_style.rs +0 -0
  216. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md056_table_column_count.rs +0 -0
  217. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  218. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md057_existing_relative_links.rs +0 -0
  219. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/md058_blanks_around_tables.rs +0 -0
  220. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/mod.rs +0 -0
  221. {rumdl-0.0.130 → rumdl-0.0.131}/src/rules/strong_style.rs +0 -0
  222. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/github.rs +0 -0
  223. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/jekyll.rs +0 -0
  224. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/kramdown.rs +0 -0
  225. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
  226. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/anchor_styles/mod.rs +0 -0
  227. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/ast_utils.rs +0 -0
  228. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/code_block_utils.rs +0 -0
  229. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/document_structure.rs +0 -0
  230. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/early_returns.rs +0 -0
  231. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/element_cache.rs +0 -0
  232. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/emphasis_utils.rs +0 -0
  233. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/fix_utils.rs +0 -0
  234. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/header_id_utils.rs +0 -0
  235. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/kramdown_utils.rs +0 -0
  236. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/markdown_elements.rs +0 -0
  237. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_admonitions.rs +0 -0
  238. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_common.rs +0 -0
  239. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_critic.rs +0 -0
  240. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_footnotes.rs +0 -0
  241. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_patterns.rs +0 -0
  242. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_tabs.rs +0 -0
  243. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocs_test_utils.rs +0 -0
  244. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mkdocstrings_refs.rs +0 -0
  245. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/mod.rs +0 -0
  246. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/range_utils.rs +0 -0
  247. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/regex_cache.rs +0 -0
  248. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/string_interner.rs +0 -0
  249. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/table_utils.rs +0 -0
  250. {rumdl-0.0.130 → rumdl-0.0.131}/src/utils/text_reflow.rs +0 -0
  251. {rumdl-0.0.130 → rumdl-0.0.131}/src/vscode.rs +0 -0
  252. {rumdl-0.0.130 → rumdl-0.0.131}/tests/advanced_integration_tests.rs +0 -0
  253. {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/additional_tests.rs +0 -0
  254. {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/comprehensive_tests.rs +0 -0
  255. {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/extended_tests.rs +0 -0
  256. {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/mod.rs +0 -0
  257. {rumdl-0.0.130 → rumdl-0.0.131}/tests/character_ranges/unicode_utils.rs +0 -0
  258. {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_duplication_test.rs +0 -0
  259. {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_explain_test.rs +0 -0
  260. {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_flag_precedence_test.rs +0 -0
  261. {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_integration_tests.rs +0 -0
  262. {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_lsp_fix_consistency.rs +0 -0
  263. {rumdl-0.0.130 → rumdl-0.0.131}/tests/cli_statistics_test.rs +0 -0
  264. {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/cli_test_utils.rs +0 -0
  265. {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/fixtures.rs +0 -0
  266. {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/mod.rs +0 -0
  267. {rumdl-0.0.130 → rumdl-0.0.131}/tests/common/test_utils.rs +0 -0
  268. {rumdl-0.0.130 → rumdl-0.0.131}/tests/commonmark_compliance_tests.rs +0 -0
  269. {rumdl-0.0.130 → rumdl-0.0.131}/tests/comprehensive_integration_tests.rs +0 -0
  270. {rumdl-0.0.130 → rumdl-0.0.131}/tests/comprehensive_output_format_tests.rs +0 -0
  271. {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_application_tests.rs +0 -0
  272. {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_file_command_test.rs +0 -0
  273. {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_tests.rs +0 -0
  274. {rumdl-0.0.130 → rumdl-0.0.131}/tests/config_upward_traversal_test.rs +0 -0
  275. {rumdl-0.0.130 → rumdl-0.0.131}/tests/configuration_inheritance_tests.rs +0 -0
  276. {rumdl-0.0.130 → rumdl-0.0.131}/tests/consistency_regression_tests.rs +0 -0
  277. {rumdl-0.0.130 → rumdl-0.0.131}/tests/cross_platform_compatibility_tests.rs +0 -0
  278. {rumdl-0.0.130 → rumdl-0.0.131}/tests/deeply_nested_lists_performance_test.rs +0 -0
  279. {rumdl-0.0.130 → rumdl-0.0.131}/tests/escaped_brackets_test.rs +0 -0
  280. {rumdl-0.0.130 → rumdl-0.0.131}/tests/final_confidence_assessment.rs +0 -0
  281. {rumdl-0.0.130 → rumdl-0.0.131}/tests/fixable_unfixable_config_test.rs +0 -0
  282. {rumdl-0.0.130 → rumdl-0.0.131}/tests/init_command_test.rs +0 -0
  283. {rumdl-0.0.130 → rumdl-0.0.131}/tests/init_tests.rs +0 -0
  284. {rumdl-0.0.130 → rumdl-0.0.131}/tests/inline_config_blocks_test.rs +0 -0
  285. {rumdl-0.0.130 → rumdl-0.0.131}/tests/inline_config_test.rs +0 -0
  286. {rumdl-0.0.130 → rumdl-0.0.131}/tests/integration_tests.rs +0 -0
  287. {rumdl-0.0.130 → rumdl-0.0.131}/tests/json_output_test.rs +0 -0
  288. {rumdl-0.0.130 → rumdl-0.0.131}/tests/kramdown_integration_test.rs +0 -0
  289. {rumdl-0.0.130 → rumdl-0.0.131}/tests/lib.rs +0 -0
  290. {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_editor_integration_tests.rs +0 -0
  291. {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_integration_tests.rs +0 -0
  292. {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_memory_leak_tests.rs +0 -0
  293. {rumdl-0.0.130 → rumdl-0.0.131}/tests/lsp_tests.rs +0 -0
  294. {rumdl-0.0.130 → rumdl-0.0.131}/tests/malformed_markdown_stress_tests.rs +0 -0
  295. {rumdl-0.0.130 → rumdl-0.0.131}/tests/markdownlint_cli_integration.rs +0 -0
  296. {rumdl-0.0.130 → rumdl-0.0.131}/tests/markdownlint_config_test.rs +0 -0
  297. {rumdl-0.0.130 → rumdl-0.0.131}/tests/markdownlintignore_test.rs +0 -0
  298. {rumdl-0.0.130 → rumdl-0.0.131}/tests/md013_reflow_integration_test.rs +0 -0
  299. {rumdl-0.0.130 → rumdl-0.0.131}/tests/md051_issue_39_regression_test.rs +0 -0
  300. {rumdl-0.0.130 → rumdl-0.0.131}/tests/nested_code_block_test.rs +0 -0
  301. {rumdl-0.0.130 → rumdl-0.0.131}/tests/output_format_integration_tests.rs +0 -0
  302. {rumdl-0.0.130 → rumdl-0.0.131}/tests/output_format_tests.rs +0 -0
  303. {rumdl-0.0.130 → rumdl-0.0.131}/tests/perf_check.rs +0 -0
  304. {rumdl-0.0.130 → rumdl-0.0.131}/tests/performance_validation_tests.rs +0 -0
  305. {rumdl-0.0.130 → rumdl-0.0.131}/tests/pyproject_config_tests.rs +0 -0
  306. {rumdl-0.0.130 → rumdl-0.0.131}/tests/python_bindings_test.rs +0 -0
  307. {rumdl-0.0.130 → rumdl-0.0.131}/tests/real_world_repository_tests.rs +0 -0
  308. {rumdl-0.0.130 → rumdl-0.0.131}/tests/regression_prevention_tests.rs +0 -0
  309. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  310. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/heading_edge_cases_test.rs +0 -0
  311. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  312. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/link_edge_cases_test.rs +0 -0
  313. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/list_rules_integration_test.rs +0 -0
  314. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md001_test.rs +0 -0
  315. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md001_unicode_test.rs +0 -0
  316. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md003_test.rs +0 -0
  317. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md004_test.rs +0 -0
  318. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md005_dynamic_indent_test.rs +0 -0
  319. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md005_test.rs +0 -0
  320. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md005_unicode_test.rs +0 -0
  321. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md006_test.rs +0 -0
  322. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md006_unicode_test.rs +0 -0
  323. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md007_test.rs +0 -0
  324. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md009_test.rs +0 -0
  325. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md010_test.rs +0 -0
  326. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md011_test.rs +0 -0
  327. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md012_test.rs +0 -0
  328. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md013_test.rs +0 -0
  329. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md014_test.rs +0 -0
  330. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md018_test.rs +0 -0
  331. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md019_test.rs +0 -0
  332. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md020_test.rs +0 -0
  333. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md021_test.rs +0 -0
  334. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md022_test.rs +0 -0
  335. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md023_extended_test.rs +0 -0
  336. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md023_test.rs +0 -0
  337. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md024_test.rs +0 -0
  338. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md025_test.rs +0 -0
  339. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md026_kramdown_test.rs +0 -0
  340. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md026_test.rs +0 -0
  341. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md027_test.rs +0 -0
  342. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md028_test.rs +0 -0
  343. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_code_block_separation_test.rs +0 -0
  344. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_fix_test.rs +0 -0
  345. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_issue42_test.rs +0 -0
  346. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
  347. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
  348. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_test.rs +0 -0
  349. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md029_unicode_test.rs +0 -0
  350. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md030_test.rs +0 -0
  351. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md031_kramdown_test.rs +0 -0
  352. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md031_test.rs +0 -0
  353. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md032_test.rs +0 -0
  354. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md033_extended_test.rs +0 -0
  355. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md033_kramdown_test.rs +0 -0
  356. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md033_test.rs +0 -0
  357. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md034_ipv6_test.rs +0 -0
  358. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md034_test.rs +0 -0
  359. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md035_test.rs +0 -0
  360. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md036_test.rs +0 -0
  361. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md037_kramdown_test.rs +0 -0
  362. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md037_test.rs +0 -0
  363. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md038_nested_backticks_test.rs +0 -0
  364. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md038_test.rs +0 -0
  365. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md039_test.rs +0 -0
  366. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md040_test.rs +0 -0
  367. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md041_test.rs +0 -0
  368. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md042_test.rs +0 -0
  369. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md043_test.rs +0 -0
  370. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md044_test.rs +0 -0
  371. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md045_test.rs +0 -0
  372. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md046_test.rs +0 -0
  373. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md047_test.rs +0 -0
  374. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md048_test.rs +0 -0
  375. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md049_test.rs +0 -0
  376. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md050_test.rs +0 -0
  377. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_comprehensive_test.rs +0 -0
  378. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
  379. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_edge_cases_test.rs +0 -0
  380. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_issue_39_regression_test.rs +0 -0
  381. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
  382. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_property_based_test.rs +0 -0
  383. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_regression_prevention_test.rs +0 -0
  384. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_test.rs +0 -0
  385. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md051_unicode_security_test.rs +0 -0
  386. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md052_test.rs +0 -0
  387. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md053_additional_test.rs +0 -0
  388. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md053_proptest.rs +0 -0
  389. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md053_test.rs +0 -0
  390. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md054_test.rs +0 -0
  391. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md054_unicode_test.rs +0 -0
  392. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md055_test.rs +0 -0
  393. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md056_test.rs +0 -0
  394. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md057_test.rs +0 -0
  395. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md058_kramdown_test.rs +0 -0
  396. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/md058_test.rs +0 -0
  397. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_admonitions_test.rs +0 -0
  398. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_extensions_test.rs +0 -0
  399. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mkdocs_snippets_test.rs +0 -0
  400. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules/mod.rs +0 -0
  401. {rumdl-0.0.130 → rumdl-0.0.131}/tests/rules_mod_test.rs +0 -0
  402. {rumdl-0.0.130 → rumdl-0.0.131}/tests/skip_context_tests.rs +0 -0
  403. {rumdl-0.0.130 → rumdl-0.0.131}/tests/test_underscore_edge_cases.rs +0 -0
  404. {rumdl-0.0.130 → rumdl-0.0.131}/tests/thread_safety_tests.rs +0 -0
  405. {rumdl-0.0.130 → rumdl-0.0.131}/tests/unfixable_rules_test.rs +0 -0
  406. {rumdl-0.0.130 → rumdl-0.0.131}/tests/unicode_edge_case_tests.rs +0 -0
  407. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/blockquote_utils_test.rs +0 -0
  408. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/code_block_utils_extended_test.rs +0 -0
  409. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/code_block_utils_test.rs +0 -0
  410. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/core_utils_test.rs +0 -0
  411. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/front_matter_utils_test.rs +0 -0
  412. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/line_index_test.rs +0 -0
  413. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils/mod.rs +0 -0
  414. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils_markdown_edge_cases.rs +0 -0
  415. {rumdl-0.0.130 → rumdl-0.0.131}/tests/utils_tests.rs +0 -0
  416. {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_extension_fixes.rs +0 -0
  417. {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_test.rs +0 -0
  418. {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_tests.rs +0 -0
  419. {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_windows_comprehensive_test.rs +0 -0
  420. {rumdl-0.0.130 → rumdl-0.0.131}/tests/vscode_windows_test.rs +0 -0
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.131] - 2025-08-28
11
+
12
+ ### Fixed
13
+ - **MD002**: Implemented markdownlint compatibility - MD002 no longer triggers when first heading is on the first line, regardless of level (fixes #65)
14
+ - **MD034**: Added support for multi-line MkDocs snippet blocks where markers appear on separate lines (fixes #70)
15
+
10
16
  ## [0.0.130] - 2025-08-27
11
17
 
12
18
  ### Fixed
@@ -508,7 +514,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
508
514
 
509
515
  - Initial implementation of remaining rules for markdownlint parity
510
516
 
511
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.130...HEAD
517
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.131...HEAD
518
+ [0.0.131]: https://github.com/rvben/rumdl/compare/v0.0.130...v0.0.131
512
519
  [0.0.130]: https://github.com/rvben/rumdl/compare/v0.0.129...v0.0.130
513
520
  [0.0.129]: https://github.com/rvben/rumdl/compare/v0.0.128...v0.0.129
514
521
  [0.0.128]: https://github.com/rvben/rumdl/compare/v0.0.127...v0.0.128
@@ -1605,7 +1605,7 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1605
1605
 
1606
1606
  [[package]]
1607
1607
  name = "rumdl"
1608
- version = "0.0.130"
1608
+ version = "0.0.131"
1609
1609
  dependencies = [
1610
1610
  "anyhow",
1611
1611
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.130"
3
+ version = "0.0.131"
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)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.130
3
+ Version: 0.0.131
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -122,53 +122,74 @@ impl Rule for MD002FirstHeadingH1 {
122
122
  .enumerate()
123
123
  .find_map(|(line_num, line_info)| line_info.heading.as_ref().map(|h| (line_num, line_info, h)));
124
124
 
125
- if let Some((line_num, line_info, heading)) = first_heading
126
- && heading.level != self.config.level as u8
127
- {
128
- let message = format!(
129
- "First heading should be level {}, found level {}",
130
- self.config.level, heading.level
131
- );
132
-
133
- // Calculate the fix
134
- let fix = {
135
- let replacement = crate::rules::heading_utils::HeadingUtils::convert_heading_style(
136
- &heading.text,
137
- self.config.level,
138
- match heading.style {
139
- crate::lint_context::HeadingStyle::ATX => {
140
- if heading.has_closing_sequence {
141
- HeadingStyle::AtxClosed
142
- } else {
143
- HeadingStyle::Atx
144
- }
145
- }
146
- crate::lint_context::HeadingStyle::Setext1 => HeadingStyle::Setext1,
147
- crate::lint_context::HeadingStyle::Setext2 => HeadingStyle::Setext2,
148
- },
125
+ if let Some((line_num, line_info, heading)) = first_heading {
126
+ // Check if the first heading is on the first non-empty line after front matter.
127
+ // If it is AND it's already H1, MD002 should not trigger (already correct).
128
+ // If it is but NOT H1, MD002 still should not trigger for markdownlint compatibility
129
+ // (MD002 is implicitly disabled when MD041 would be satisfied).
130
+ let first_content_line = ctx
131
+ .lines
132
+ .iter()
133
+ .enumerate()
134
+ .find(|(_, line_info)| !line_info.in_front_matter && !line_info.content.trim().is_empty())
135
+ .map(|(idx, _)| idx);
136
+
137
+ // If the first heading is on the first content line, don't trigger MD002
138
+ // This matches markdownlint behavior where MD002 doesn't apply to first-line headings
139
+ if let Some(first_line_idx) = first_content_line
140
+ && line_num == first_line_idx
141
+ {
142
+ return Ok(vec![]);
143
+ }
144
+
145
+ // Otherwise check if the heading level is correct
146
+ if heading.level != self.config.level as u8 {
147
+ let message = format!(
148
+ "First heading should be level {}, found level {}",
149
+ self.config.level, heading.level
149
150
  );
150
151
 
151
- // Use line content range to replace the entire heading line
152
- let line_index = crate::utils::range_utils::LineIndex::new(content.to_string());
153
- Some(Fix {
154
- range: line_index.line_content_range(line_num + 1), // Convert to 1-indexed
155
- replacement,
156
- })
157
- };
158
-
159
- // Calculate precise range: highlight the entire first heading
160
- let (start_line, start_col, end_line, end_col) = calculate_heading_range(line_num + 1, &line_info.content);
161
-
162
- return Ok(vec![LintWarning {
163
- message,
164
- line: start_line,
165
- column: start_col,
166
- end_line,
167
- end_column: end_col,
168
- severity: Severity::Warning,
169
- fix,
170
- rule_name: Some(self.name()),
171
- }]);
152
+ // Calculate the fix
153
+ let fix = {
154
+ let replacement = crate::rules::heading_utils::HeadingUtils::convert_heading_style(
155
+ &heading.text,
156
+ self.config.level,
157
+ match heading.style {
158
+ crate::lint_context::HeadingStyle::ATX => {
159
+ if heading.has_closing_sequence {
160
+ HeadingStyle::AtxClosed
161
+ } else {
162
+ HeadingStyle::Atx
163
+ }
164
+ }
165
+ crate::lint_context::HeadingStyle::Setext1 => HeadingStyle::Setext1,
166
+ crate::lint_context::HeadingStyle::Setext2 => HeadingStyle::Setext2,
167
+ },
168
+ );
169
+
170
+ // Use line content range to replace the entire heading line
171
+ let line_index = crate::utils::range_utils::LineIndex::new(content.to_string());
172
+ Some(Fix {
173
+ range: line_index.line_content_range(line_num + 1), // Convert to 1-indexed
174
+ replacement,
175
+ })
176
+ };
177
+
178
+ // Calculate precise range: highlight the entire first heading
179
+ let (start_line, start_col, end_line, end_col) =
180
+ calculate_heading_range(line_num + 1, &line_info.content);
181
+
182
+ return Ok(vec![LintWarning {
183
+ message,
184
+ line: start_line,
185
+ column: start_col,
186
+ end_line,
187
+ end_column: end_col,
188
+ severity: Severity::Warning,
189
+ fix,
190
+ rule_name: Some(self.name()),
191
+ }]);
192
+ }
172
193
  }
173
194
 
174
195
  Ok(vec![])
@@ -185,6 +206,22 @@ impl Rule for MD002FirstHeadingH1 {
185
206
  .find_map(|(line_num, line_info)| line_info.heading.as_ref().map(|h| (line_num, line_info, h)));
186
207
 
187
208
  if let Some((line_num, line_info, heading)) = first_heading {
209
+ // Check if the first heading is on the first non-empty line after front matter.
210
+ // If it is, MD002 should not apply (markdownlint compatibility).
211
+ let first_content_line = ctx
212
+ .lines
213
+ .iter()
214
+ .enumerate()
215
+ .find(|(_, line_info)| !line_info.in_front_matter && !line_info.content.trim().is_empty())
216
+ .map(|(idx, _)| idx);
217
+
218
+ if let Some(first_line_idx) = first_content_line
219
+ && line_num == first_line_idx
220
+ {
221
+ return Ok(content.to_string());
222
+ }
223
+
224
+ // If we're here, the heading is not on the first line, so check if it needs fixing
188
225
  if heading.level == self.config.level as u8 {
189
226
  return Ok(content.to_string());
190
227
  }
@@ -310,18 +347,13 @@ mod tests {
310
347
 
311
348
  #[test]
312
349
  fn test_incorrect_h2_first_heading() {
350
+ // When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
313
351
  let rule = MD002FirstHeadingH1::new(1);
314
352
  let content = "## Introduction\n\nContent here\n\n# Main Title";
315
353
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
316
354
  let result = rule.check(&ctx).unwrap();
317
355
 
318
- assert_eq!(result.len(), 1);
319
- assert!(
320
- result[0]
321
- .message
322
- .contains("First heading should be level 1, found level 2")
323
- );
324
- assert_eq!(result[0].line, 1);
356
+ assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
325
357
  }
326
358
 
327
359
  #[test]
@@ -345,17 +377,13 @@ mod tests {
345
377
 
346
378
  #[test]
347
379
  fn test_setext_style_heading() {
380
+ // When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
348
381
  let rule = MD002FirstHeadingH1::new(1);
349
382
  let content = "Introduction\n------------\n\nContent here";
350
383
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
351
384
  let result = rule.check(&ctx).unwrap();
352
385
 
353
- assert_eq!(result.len(), 1);
354
- assert!(
355
- result[0]
356
- .message
357
- .contains("First heading should be level 1, found level 2")
358
- );
386
+ assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
359
387
  }
360
388
 
361
389
  #[test]
@@ -370,99 +398,90 @@ mod tests {
370
398
 
371
399
  #[test]
372
400
  fn test_with_front_matter() {
401
+ // When heading is immediately after front matter, MD002 doesn't trigger (markdownlint compatibility)
373
402
  let rule = MD002FirstHeadingH1::new(1);
374
- let content = "---\ntitle: Test Document\nauthor: Test Author\n---\n\n## Introduction\n\nContent";
403
+ let content = "---\ntitle: Test Document\nauthor: Test Author\n---\n## Introduction\n\nContent";
375
404
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
376
405
  let result = rule.check(&ctx).unwrap();
377
406
 
378
- assert_eq!(result.len(), 1);
379
- assert!(
380
- result[0]
381
- .message
382
- .contains("First heading should be level 1, found level 2")
383
- );
407
+ assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings after front matter
384
408
  }
385
409
 
386
410
  #[test]
387
411
  fn test_fix_atx_heading() {
412
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
388
413
  let rule = MD002FirstHeadingH1::new(1);
389
414
  let content = "## Introduction\n\nContent here";
390
415
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
391
416
 
392
417
  let fixed = rule.fix(&ctx).unwrap();
393
- assert_eq!(fixed, "# Introduction\n\nContent here");
418
+ assert_eq!(fixed, content); // No fix applied for first-line headings
394
419
  }
395
420
 
396
421
  #[test]
397
422
  fn test_fix_closed_atx_heading() {
423
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
398
424
  let rule = MD002FirstHeadingH1::new(1);
399
425
  let content = "## Introduction ##\n\nContent here";
400
426
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
401
427
 
402
428
  let fixed = rule.fix(&ctx).unwrap();
403
- assert_eq!(fixed, "# Introduction #\n\nContent here");
429
+ assert_eq!(fixed, content); // No fix applied for first-line headings
404
430
  }
405
431
 
406
432
  #[test]
407
433
  fn test_fix_setext_heading() {
434
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
408
435
  let rule = MD002FirstHeadingH1::new(1);
409
436
  let content = "Introduction\n------------\n\nContent here";
410
437
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
411
438
 
412
439
  let fixed = rule.fix(&ctx).unwrap();
413
- assert_eq!(fixed, "Introduction\n=======\n\nContent here");
440
+ assert_eq!(fixed, content); // No fix applied for first-line headings
414
441
  }
415
442
 
416
443
  #[test]
417
444
  fn test_fix_with_indented_heading() {
445
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
418
446
  let rule = MD002FirstHeadingH1::new(1);
419
447
  let content = " ## Introduction\n\nContent here";
420
448
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
421
449
 
422
450
  let fixed = rule.fix(&ctx).unwrap();
423
- assert_eq!(fixed, " # Introduction\n\nContent here");
451
+ assert_eq!(fixed, content); // No fix applied for first-line headings
424
452
  }
425
453
 
426
454
  #[test]
427
455
  fn test_custom_level_requirement() {
456
+ // When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
428
457
  let rule = MD002FirstHeadingH1::new(2);
429
458
  let content = "# Main Title\n\n## Subsection";
430
459
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
431
460
  let result = rule.check(&ctx).unwrap();
432
461
 
433
- assert_eq!(result.len(), 1);
434
- assert!(
435
- result[0]
436
- .message
437
- .contains("First heading should be level 2, found level 1")
438
- );
462
+ assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
439
463
  }
440
464
 
441
465
  #[test]
442
466
  fn test_fix_to_custom_level() {
467
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
443
468
  let rule = MD002FirstHeadingH1::new(2);
444
469
  let content = "# Main Title\n\nContent";
445
470
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
446
471
 
447
472
  let fixed = rule.fix(&ctx).unwrap();
448
- assert_eq!(fixed, "## Main Title\n\nContent");
473
+ assert_eq!(fixed, content); // No fix applied for first-line headings
449
474
  }
450
475
 
451
476
  #[test]
452
477
  fn test_multiple_headings() {
478
+ // When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
453
479
  let rule = MD002FirstHeadingH1::new(1);
454
480
  let content = "### Introduction\n\n# Main Title\n\n## Section\n\n#### Subsection";
455
481
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
456
482
  let result = rule.check(&ctx).unwrap();
457
483
 
458
- // Only the first heading matters
459
- assert_eq!(result.len(), 1);
460
- assert!(
461
- result[0]
462
- .message
463
- .contains("First heading should be level 1, found level 3")
464
- );
465
- assert_eq!(result[0].line, 1);
484
+ assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
466
485
  }
467
486
 
468
487
  #[test]
@@ -506,23 +525,24 @@ mod tests {
506
525
 
507
526
  #[test]
508
527
  fn test_fix_preserves_content_structure() {
528
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
509
529
  let rule = MD002FirstHeadingH1::new(1);
510
530
  let content = "### Heading\n\nParagraph 1\n\n## Section\n\nParagraph 2";
511
531
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
512
532
 
513
533
  let fixed = rule.fix(&ctx).unwrap();
514
- assert_eq!(fixed, "# Heading\n\nParagraph 1\n\n## Section\n\nParagraph 2");
534
+ assert_eq!(fixed, content); // No fix applied for first-line headings
515
535
  }
516
536
 
517
537
  #[test]
518
538
  fn test_long_setext_underline() {
539
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
519
540
  let rule = MD002FirstHeadingH1::new(1);
520
541
  let content = "Short Title\n----------------------------------------\n\nContent";
521
542
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
522
543
 
523
544
  let fixed = rule.fix(&ctx).unwrap();
524
- // The fix should use a reasonable length underline, not preserve the exact length
525
- assert!(fixed.starts_with("Short Title\n======="));
545
+ assert_eq!(fixed, content); // No fix applied for first-line headings
526
546
  }
527
547
 
528
548
  #[test]
@@ -537,24 +557,97 @@ mod tests {
537
557
 
538
558
  #[test]
539
559
  fn test_heading_with_special_characters() {
560
+ // When heading is on first line, MD002 doesn't trigger (markdownlint compatibility)
540
561
  let rule = MD002FirstHeadingH1::new(1);
541
562
  let content = "## Heading with **bold** and _italic_ text\n\nContent";
542
563
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
543
564
  let result = rule.check(&ctx).unwrap();
544
565
 
545
- assert_eq!(result.len(), 1);
566
+ assert_eq!(result.len(), 0); // MD002 doesn't trigger for first-line headings
546
567
 
547
568
  let fixed = rule.fix(&ctx).unwrap();
548
- assert_eq!(fixed, "# Heading with **bold** and _italic_ text\n\nContent");
569
+ assert_eq!(fixed, content); // No fix applied for first-line headings
549
570
  }
550
571
 
551
572
  #[test]
552
573
  fn test_atx_heading_with_extra_spaces() {
574
+ // When heading is on first line, MD002 doesn't fix (markdownlint compatibility)
553
575
  let rule = MD002FirstHeadingH1::new(1);
554
576
  let content = "## Introduction \n\nContent";
555
577
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
556
578
 
557
579
  let fixed = rule.fix(&ctx).unwrap();
558
- assert_eq!(fixed, "# Introduction\n\nContent");
580
+ assert_eq!(fixed, content); // No fix applied for first-line headings
581
+ }
582
+
583
+ #[test]
584
+ fn test_md002_does_not_trigger_when_first_line_is_heading() {
585
+ // This tests markdownlint compatibility: MD002 should not trigger
586
+ // when the first line is a heading (even if it's not level 1)
587
+ // because MD041 would handle this case
588
+ let rule = MD002FirstHeadingH1::new(1);
589
+ let content = "## Introduction\n\nContent here";
590
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
591
+ let result = rule.check(&ctx).unwrap();
592
+
593
+ // MD002 should NOT trigger because the heading is on the first line
594
+ assert_eq!(result.len(), 0, "MD002 should not trigger when first line is a heading");
595
+ }
596
+
597
+ #[test]
598
+ fn test_md002_triggers_when_heading_is_not_first_line() {
599
+ // MD002 should still trigger when the heading is NOT on the first line
600
+ let rule = MD002FirstHeadingH1::new(1);
601
+ let content = "Some text before heading\n\n## Introduction\n\nContent";
602
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
603
+ let result = rule.check(&ctx).unwrap();
604
+
605
+ assert_eq!(
606
+ result.len(),
607
+ 1,
608
+ "MD002 should trigger when heading is not on first line"
609
+ );
610
+ assert!(result[0].message.contains("First heading should be level 1"));
611
+ }
612
+
613
+ #[test]
614
+ fn test_md002_with_front_matter_and_first_line_heading() {
615
+ // MD002 should not trigger when the first line after front matter is a heading
616
+ let rule = MD002FirstHeadingH1::new(1);
617
+ let content = "---\ntitle: Test\n---\n## Introduction\n\nContent";
618
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
619
+ let result = rule.check(&ctx).unwrap();
620
+
621
+ assert_eq!(
622
+ result.len(),
623
+ 0,
624
+ "MD002 should not trigger when first line after front matter is a heading"
625
+ );
626
+ }
627
+
628
+ #[test]
629
+ fn test_md002_with_front_matter_and_delayed_heading() {
630
+ // MD002 should trigger when the heading is not immediately after front matter
631
+ let rule = MD002FirstHeadingH1::new(1);
632
+ let content = "---\ntitle: Test\n---\nSome text\n\n## Introduction\n\nContent";
633
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
634
+ let result = rule.check(&ctx).unwrap();
635
+
636
+ assert_eq!(
637
+ result.len(),
638
+ 1,
639
+ "MD002 should trigger when heading is not immediately after front matter"
640
+ );
641
+ }
642
+
643
+ #[test]
644
+ fn test_md002_fix_does_not_change_first_line_heading() {
645
+ // Fix should not change a heading that's on the first line
646
+ let rule = MD002FirstHeadingH1::new(1);
647
+ let content = "### Third Level Heading\n\nContent";
648
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
649
+ let fixed = rule.fix(&ctx).unwrap();
650
+
651
+ assert_eq!(fixed, content, "Fix should not change heading on first line");
559
652
  }
560
653
  }
@@ -270,8 +270,8 @@ impl MD034NoBareUrls {
270
270
  continue;
271
271
  }
272
272
 
273
- // Skip if this is within a code span (code blocks already checked)
274
- if ctx.is_in_code_block_or_span(match_start) {
273
+ // Skip if this is within any skip context (code blocks, MkDocs snippets, etc.)
274
+ if crate::utils::skip_context::is_in_skip_context(ctx, match_start) {
275
275
  continue;
276
276
  }
277
277