rumdl 0.0.106__tar.gz → 0.0.107__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 (371) hide show
  1. {rumdl-0.0.106 → rumdl-0.0.107}/CHANGELOG.md +4 -1
  2. {rumdl-0.0.106 → rumdl-0.0.107}/Cargo.lock +11 -11
  3. {rumdl-0.0.106 → rumdl-0.0.107}/Cargo.toml +1 -1
  4. {rumdl-0.0.106 → rumdl-0.0.107}/PKG-INFO +1 -1
  5. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md036.md +16 -13
  6. {rumdl-0.0.106 → rumdl-0.0.107}/src/config.rs +40 -0
  7. {rumdl-0.0.106 → rumdl-0.0.107}/src/lib.rs +11 -2
  8. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md011_no_reversed_links.rs +53 -6
  9. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md029_ordered_list_prefix.rs +125 -147
  10. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md036_no_emphasis_only_first.rs +64 -99
  11. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md046_code_block_style.rs +130 -1
  12. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md052_reference_links_images.rs +77 -0
  13. {rumdl-0.0.106 → rumdl-0.0.107}/src/vscode.rs +31 -6
  14. rumdl-0.0.107/tests/cli_duplication_test.rs +58 -0
  15. {rumdl-0.0.106 → rumdl-0.0.107}/tests/init_tests.rs +27 -50
  16. rumdl-0.0.107/tests/integration_tests.rs +29 -0
  17. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/emphasis_edge_cases_test.rs +2 -5
  18. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md029_test.rs +71 -3
  19. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md036_test.rs +19 -23
  20. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md046_test.rs +123 -0
  21. rumdl-0.0.107/tests/vscode_windows_comprehensive_test.rs +263 -0
  22. rumdl-0.0.107/tests/vscode_windows_test.rs +113 -0
  23. rumdl-0.0.106/src/init.rs +0 -337
  24. rumdl-0.0.106/tests/cli_duplication_test.rs +0 -39
  25. rumdl-0.0.106/tests/integration_tests.rs +0 -18
  26. {rumdl-0.0.106 → rumdl-0.0.107}/.config/nextest.toml +0 -0
  27. {rumdl-0.0.106 → rumdl-0.0.107}/.mise.toml +0 -0
  28. {rumdl-0.0.106 → rumdl-0.0.107}/.pre-commit-config.yaml +0 -0
  29. {rumdl-0.0.106 → rumdl-0.0.107}/.rumdl.toml +0 -0
  30. {rumdl-0.0.106 → rumdl-0.0.107}/.rustfmt.toml +0 -0
  31. {rumdl-0.0.106 → rumdl-0.0.107}/LICENSE +0 -0
  32. {rumdl-0.0.106 → rumdl-0.0.107}/MANIFEST.in +0 -0
  33. {rumdl-0.0.106 → rumdl-0.0.107}/Makefile +0 -0
  34. {rumdl-0.0.106 → rumdl-0.0.107}/README.md +0 -0
  35. {rumdl-0.0.106 → rumdl-0.0.107}/assets/logo.png +0 -0
  36. {rumdl-0.0.106 → rumdl-0.0.107}/benches/fix_performance.rs +0 -0
  37. {rumdl-0.0.106 → rumdl-0.0.107}/benches/range_performance.rs +0 -0
  38. {rumdl-0.0.106 → rumdl-0.0.107}/benches/range_utils_benchmark.rs +0 -0
  39. {rumdl-0.0.106 → rumdl-0.0.107}/benches/rule_performance.rs +0 -0
  40. {rumdl-0.0.106 → rumdl-0.0.107}/benches/simple_fix_bench.rs +0 -0
  41. {rumdl-0.0.106 → rumdl-0.0.107}/benchmark/bin/bench_lint_context.rs +0 -0
  42. {rumdl-0.0.106 → rumdl-0.0.107}/benchmark/bin/benchmark.rs +0 -0
  43. {rumdl-0.0.106 → rumdl-0.0.107}/benchmark/bin/benchmark_rule.rs +0 -0
  44. {rumdl-0.0.106 → rumdl-0.0.107}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  45. {rumdl-0.0.106 → rumdl-0.0.107}/benchmark/bin/measure_code_span_performance.rs +0 -0
  46. {rumdl-0.0.106 → rumdl-0.0.107}/docs/RULES.md +0 -0
  47. {rumdl-0.0.106 → rumdl-0.0.107}/docs/global-settings.md +0 -0
  48. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md001.md +0 -0
  49. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md002.md +0 -0
  50. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md003.md +0 -0
  51. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md004.md +0 -0
  52. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md005.md +0 -0
  53. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md006.md +0 -0
  54. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md007.md +0 -0
  55. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md009.md +0 -0
  56. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md010.md +0 -0
  57. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md011.md +0 -0
  58. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md012.md +0 -0
  59. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md013.md +0 -0
  60. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md014.md +0 -0
  61. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md018.md +0 -0
  62. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md019.md +0 -0
  63. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md020.md +0 -0
  64. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md021.md +0 -0
  65. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md022.md +0 -0
  66. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md023.md +0 -0
  67. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md024.md +0 -0
  68. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md025.md +0 -0
  69. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md026.md +0 -0
  70. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md027.md +0 -0
  71. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md028.md +0 -0
  72. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md029.md +0 -0
  73. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md030.md +0 -0
  74. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md031.md +0 -0
  75. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md032.md +0 -0
  76. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md033.md +0 -0
  77. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md034.md +0 -0
  78. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md035.md +0 -0
  79. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md037.md +0 -0
  80. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md038.md +0 -0
  81. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md039.md +0 -0
  82. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md040.md +0 -0
  83. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md041.md +0 -0
  84. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md042.md +0 -0
  85. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md043.md +0 -0
  86. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md044.md +0 -0
  87. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md045.md +0 -0
  88. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md046.md +0 -0
  89. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md047.md +0 -0
  90. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md048.md +0 -0
  91. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md049.md +0 -0
  92. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md050.md +0 -0
  93. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md051.md +0 -0
  94. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md052.md +0 -0
  95. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md053.md +0 -0
  96. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md054.md +0 -0
  97. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md055.md +0 -0
  98. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md056.md +0 -0
  99. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md057.md +0 -0
  100. {rumdl-0.0.106 → rumdl-0.0.107}/docs/md058.md +0 -0
  101. {rumdl-0.0.106 → rumdl-0.0.107}/docs/vscode-extension.md +0 -0
  102. {rumdl-0.0.106 → rumdl-0.0.107}/parity_check.py +0 -0
  103. {rumdl-0.0.106 → rumdl-0.0.107}/pyproject.toml +0 -0
  104. {rumdl-0.0.106 → rumdl-0.0.107}/python/MANIFEST.in +0 -0
  105. {rumdl-0.0.106 → rumdl-0.0.107}/python/PYTHON-README.md +0 -0
  106. {rumdl-0.0.106 → rumdl-0.0.107}/python/rumdl/__init__.py +0 -0
  107. {rumdl-0.0.106 → rumdl-0.0.107}/python/rumdl/__main__.py +0 -0
  108. {rumdl-0.0.106 → rumdl-0.0.107}/python/rumdl/py.typed +0 -0
  109. {rumdl-0.0.106 → rumdl-0.0.107}/rumdl.toml.example +0 -0
  110. {rumdl-0.0.106 → rumdl-0.0.107}/rust-toolchain.toml +0 -0
  111. {rumdl-0.0.106 → rumdl-0.0.107}/scripts/extract-changelog.sh +0 -0
  112. {rumdl-0.0.106 → rumdl-0.0.107}/scripts/prepare-release.sh +0 -0
  113. {rumdl-0.0.106 → rumdl-0.0.107}/scripts/setup-pre-commit.sh +0 -0
  114. {rumdl-0.0.106 → rumdl-0.0.107}/scripts/update-pre-commit-docs.sh +0 -0
  115. {rumdl-0.0.106 → rumdl-0.0.107}/src/exit_codes.rs +0 -0
  116. {rumdl-0.0.106 → rumdl-0.0.107}/src/inline_config.rs +0 -0
  117. {rumdl-0.0.106 → rumdl-0.0.107}/src/lint_context.rs +0 -0
  118. {rumdl-0.0.106 → rumdl-0.0.107}/src/lsp/mod.rs +0 -0
  119. {rumdl-0.0.106 → rumdl-0.0.107}/src/lsp/server.rs +0 -0
  120. {rumdl-0.0.106 → rumdl-0.0.107}/src/lsp/types.rs +0 -0
  121. {rumdl-0.0.106 → rumdl-0.0.107}/src/main.rs +0 -0
  122. {rumdl-0.0.106 → rumdl-0.0.107}/src/markdownlint_config.rs +0 -0
  123. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/azure.rs +0 -0
  124. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/concise.rs +0 -0
  125. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/github.rs +0 -0
  126. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/gitlab.rs +0 -0
  127. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/grouped.rs +0 -0
  128. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/json.rs +0 -0
  129. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/json_lines.rs +0 -0
  130. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/junit.rs +0 -0
  131. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/mod.rs +0 -0
  132. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/pylint.rs +0 -0
  133. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/sarif.rs +0 -0
  134. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/formatters/text.rs +0 -0
  135. {rumdl-0.0.106 → rumdl-0.0.107}/src/output/mod.rs +0 -0
  136. {rumdl-0.0.106 → rumdl-0.0.107}/src/parallel.rs +0 -0
  137. {rumdl-0.0.106 → rumdl-0.0.107}/src/performance.rs +0 -0
  138. {rumdl-0.0.106 → rumdl-0.0.107}/src/profiling.rs +0 -0
  139. {rumdl-0.0.106 → rumdl-0.0.107}/src/python.rs +0 -0
  140. {rumdl-0.0.106 → rumdl-0.0.107}/src/rule.rs +0 -0
  141. {rumdl-0.0.106 → rumdl-0.0.107}/src/rule_config.rs +0 -0
  142. {rumdl-0.0.106 → rumdl-0.0.107}/src/rule_config_serde.rs +0 -0
  143. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/blockquote_utils.rs +0 -0
  144. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/code_block_utils.rs +0 -0
  145. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/code_fence_utils.rs +0 -0
  146. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/emphasis_style.rs +0 -0
  147. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/front_matter_utils.rs +0 -0
  148. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/heading_utils.rs +0 -0
  149. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/list_utils.rs +0 -0
  150. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md001_heading_increment.rs +0 -0
  151. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  152. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md002_first_heading_h1.rs +0 -0
  153. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md003_heading_style/md003_config.rs +0 -0
  154. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md003_heading_style.rs +0 -0
  155. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  156. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md004_unordered_list_style.rs +0 -0
  157. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md005_list_indent.rs +0 -0
  158. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md006_start_bullets.rs +0 -0
  159. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  160. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md007_ul_indent.rs +0 -0
  161. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  162. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md009_trailing_spaces.rs +0 -0
  163. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  164. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md010_no_hard_tabs.rs +0 -0
  165. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  166. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md012_no_multiple_blanks.rs +0 -0
  167. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md013_line_length/md013_config.rs +0 -0
  168. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md013_line_length.rs +0 -0
  169. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  170. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md014_commands_show_output.rs +0 -0
  171. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md018_no_missing_space_atx.rs +0 -0
  172. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  173. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  174. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  175. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  176. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md022_blanks_around_headings.rs +0 -0
  177. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md023_heading_start_left.rs +0 -0
  178. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  179. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md024_no_duplicate_heading.rs +0 -0
  180. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md025_single_title/md025_config.rs +0 -0
  181. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md025_single_title.rs +0 -0
  182. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  183. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  184. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  185. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  186. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  187. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  188. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md030_list_marker_space.rs +0 -0
  189. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md031_blanks_around_fences.rs +0 -0
  190. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md032_blanks_around_lists.rs +0 -0
  191. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  192. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md033_no_inline_html.rs +0 -0
  193. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md034_no_bare_urls.rs +0 -0
  194. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md035_hr_style/md035_config.rs +0 -0
  195. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md035_hr_style.rs +0 -0
  196. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  197. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  198. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md038_no_space_in_code.rs +0 -0
  199. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md039_no_space_in_links.rs +0 -0
  200. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md040_fenced_code_language.rs +0 -0
  201. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md041_first_line_heading.rs +0 -0
  202. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md042_no_empty_links.rs +0 -0
  203. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md043_required_headings.rs +0 -0
  204. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md044_proper_names/md044_config.rs +0 -0
  205. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md044_proper_names.rs +0 -0
  206. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  207. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md045_no_alt_text.rs +0 -0
  208. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  209. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md047_single_trailing_newline.rs +0 -0
  210. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  211. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md048_code_fence_style.rs +0 -0
  212. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  213. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md049_emphasis_style.rs +0 -0
  214. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md050_strong_style/md050_config.rs +0 -0
  215. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md050_strong_style.rs +0 -0
  216. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md051_link_fragments.rs +0 -0
  217. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  218. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  219. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md054_link_image_style.rs +0 -0
  220. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  221. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md055_table_pipe_style.rs +0 -0
  222. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md056_table_column_count.rs +0 -0
  223. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  224. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md057_existing_relative_links.rs +0 -0
  225. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/md058_blanks_around_tables.rs +0 -0
  226. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/mod.rs +0 -0
  227. {rumdl-0.0.106 → rumdl-0.0.107}/src/rules/strong_style.rs +0 -0
  228. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/ast_utils.rs +0 -0
  229. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/code_block_utils.rs +0 -0
  230. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/document_structure.rs +0 -0
  231. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/early_returns.rs +0 -0
  232. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/element_cache.rs +0 -0
  233. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/emphasis_utils.rs +0 -0
  234. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/fix_utils.rs +0 -0
  235. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/markdown_elements.rs +0 -0
  236. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/mod.rs +0 -0
  237. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/range_utils.rs +0 -0
  238. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/regex_cache.rs +0 -0
  239. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/string_interner.rs +0 -0
  240. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/table_utils.rs +0 -0
  241. {rumdl-0.0.106 → rumdl-0.0.107}/src/utils/text_reflow.rs +0 -0
  242. {rumdl-0.0.106 → rumdl-0.0.107}/tests/advanced_integration_tests.rs +0 -0
  243. {rumdl-0.0.106 → rumdl-0.0.107}/tests/character_ranges/additional_tests.rs +0 -0
  244. {rumdl-0.0.106 → rumdl-0.0.107}/tests/character_ranges/basic_tests.rs +0 -0
  245. {rumdl-0.0.106 → rumdl-0.0.107}/tests/character_ranges/comprehensive_tests.rs +0 -0
  246. {rumdl-0.0.106 → rumdl-0.0.107}/tests/character_ranges/extended_tests.rs +0 -0
  247. {rumdl-0.0.106 → rumdl-0.0.107}/tests/character_ranges/mod.rs +0 -0
  248. {rumdl-0.0.106 → rumdl-0.0.107}/tests/character_ranges/unicode_utils.rs +0 -0
  249. {rumdl-0.0.106 → rumdl-0.0.107}/tests/cli_explain_test.rs +0 -0
  250. {rumdl-0.0.106 → rumdl-0.0.107}/tests/cli_flag_precedence_test.rs +0 -0
  251. {rumdl-0.0.106 → rumdl-0.0.107}/tests/cli_integration_tests.rs +0 -0
  252. {rumdl-0.0.106 → rumdl-0.0.107}/tests/cli_lsp_fix_consistency.rs +0 -0
  253. {rumdl-0.0.106 → rumdl-0.0.107}/tests/cli_statistics_test.rs +0 -0
  254. {rumdl-0.0.106 → rumdl-0.0.107}/tests/commonmark_compliance_tests.rs +0 -0
  255. {rumdl-0.0.106 → rumdl-0.0.107}/tests/comprehensive_integration_tests.rs +0 -0
  256. {rumdl-0.0.106 → rumdl-0.0.107}/tests/comprehensive_output_format_tests.rs +0 -0
  257. {rumdl-0.0.106 → rumdl-0.0.107}/tests/config_application_tests.rs +0 -0
  258. {rumdl-0.0.106 → rumdl-0.0.107}/tests/config_file_command_test.rs +0 -0
  259. {rumdl-0.0.106 → rumdl-0.0.107}/tests/config_tests.rs +0 -0
  260. {rumdl-0.0.106 → rumdl-0.0.107}/tests/configuration_inheritance_tests.rs +0 -0
  261. {rumdl-0.0.106 → rumdl-0.0.107}/tests/consistency_regression_tests.rs +0 -0
  262. {rumdl-0.0.106 → rumdl-0.0.107}/tests/cross_platform_compatibility_tests.rs +0 -0
  263. {rumdl-0.0.106 → rumdl-0.0.107}/tests/deeply_nested_lists_performance_test.rs +0 -0
  264. {rumdl-0.0.106 → rumdl-0.0.107}/tests/escaped_brackets_test.rs +0 -0
  265. {rumdl-0.0.106 → rumdl-0.0.107}/tests/final_confidence_assessment.rs +0 -0
  266. {rumdl-0.0.106 → rumdl-0.0.107}/tests/init_command_test.rs +0 -0
  267. {rumdl-0.0.106 → rumdl-0.0.107}/tests/inline_config_blocks_test.rs +0 -0
  268. {rumdl-0.0.106 → rumdl-0.0.107}/tests/inline_config_test.rs +0 -0
  269. {rumdl-0.0.106 → rumdl-0.0.107}/tests/json_output_test.rs +0 -0
  270. {rumdl-0.0.106 → rumdl-0.0.107}/tests/lib.rs +0 -0
  271. {rumdl-0.0.106 → rumdl-0.0.107}/tests/lsp_editor_integration_tests.rs +0 -0
  272. {rumdl-0.0.106 → rumdl-0.0.107}/tests/lsp_integration_tests.rs +0 -0
  273. {rumdl-0.0.106 → rumdl-0.0.107}/tests/lsp_memory_leak_tests.rs +0 -0
  274. {rumdl-0.0.106 → rumdl-0.0.107}/tests/lsp_tests.rs +0 -0
  275. {rumdl-0.0.106 → rumdl-0.0.107}/tests/malformed_markdown_stress_tests.rs +0 -0
  276. {rumdl-0.0.106 → rumdl-0.0.107}/tests/markdownlint_cli_integration.rs +0 -0
  277. {rumdl-0.0.106 → rumdl-0.0.107}/tests/markdownlint_config_test.rs +0 -0
  278. {rumdl-0.0.106 → rumdl-0.0.107}/tests/markdownlintignore_test.rs +0 -0
  279. {rumdl-0.0.106 → rumdl-0.0.107}/tests/md013_reflow_integration_test.rs +0 -0
  280. {rumdl-0.0.106 → rumdl-0.0.107}/tests/nested_code_block_test.rs +0 -0
  281. {rumdl-0.0.106 → rumdl-0.0.107}/tests/output_format_integration_tests.rs +0 -0
  282. {rumdl-0.0.106 → rumdl-0.0.107}/tests/output_format_tests.rs +0 -0
  283. {rumdl-0.0.106 → rumdl-0.0.107}/tests/perf_check.rs +0 -0
  284. {rumdl-0.0.106 → rumdl-0.0.107}/tests/performance_validation_tests.rs +0 -0
  285. {rumdl-0.0.106 → rumdl-0.0.107}/tests/pyproject_config_tests.rs +0 -0
  286. {rumdl-0.0.106 → rumdl-0.0.107}/tests/python_bindings_test.rs +0 -0
  287. {rumdl-0.0.106 → rumdl-0.0.107}/tests/real_world_repository_tests.rs +0 -0
  288. {rumdl-0.0.106 → rumdl-0.0.107}/tests/regression_prevention_tests.rs +0 -0
  289. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/heading_edge_cases_test.rs +0 -0
  290. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  291. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/link_edge_cases_test.rs +0 -0
  292. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/list_rules_integration_test.rs +0 -0
  293. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md001_test.rs +0 -0
  294. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md001_unicode_test.rs +0 -0
  295. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md002_test.rs +0 -0
  296. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md003_test.rs +0 -0
  297. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md004_test.rs +0 -0
  298. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md005_test.rs +0 -0
  299. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md005_unicode_test.rs +0 -0
  300. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md006_test.rs +0 -0
  301. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md006_unicode_test.rs +0 -0
  302. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md007_test.rs +0 -0
  303. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md009_test.rs +0 -0
  304. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md010_test.rs +0 -0
  305. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md011_test.rs +0 -0
  306. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md012_test.rs +0 -0
  307. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md013_test.rs +0 -0
  308. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md014_test.rs +0 -0
  309. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md018_test.rs +0 -0
  310. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md019_test.rs +0 -0
  311. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md020_test.rs +0 -0
  312. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md021_test.rs +0 -0
  313. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md022_test.rs +0 -0
  314. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md023_extended_test.rs +0 -0
  315. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md023_test.rs +0 -0
  316. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md024_test.rs +0 -0
  317. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md025_test.rs +0 -0
  318. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md026_test.rs +0 -0
  319. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md027_test.rs +0 -0
  320. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md028_test.rs +0 -0
  321. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md029_unicode_test.rs +0 -0
  322. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md030_test.rs +0 -0
  323. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md031_test.rs +0 -0
  324. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md032_test.rs +0 -0
  325. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md033_extended_test.rs +0 -0
  326. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md033_test.rs +0 -0
  327. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md034_ipv6_test.rs +0 -0
  328. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md034_test.rs +0 -0
  329. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md035_test.rs +0 -0
  330. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md037_test.rs +0 -0
  331. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md038_nested_backticks_test.rs +0 -0
  332. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md038_test.rs +0 -0
  333. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md039_test.rs +0 -0
  334. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md040_test.rs +0 -0
  335. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md041_test.rs +0 -0
  336. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md042_test.rs +0 -0
  337. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md043_test.rs +0 -0
  338. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md044_test.rs +0 -0
  339. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md045_test.rs +0 -0
  340. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md047_test.rs +0 -0
  341. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md048_test.rs +0 -0
  342. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md049_test.rs +0 -0
  343. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md050_test.rs +0 -0
  344. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md051_test.rs +0 -0
  345. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md051_unicode_test.rs +0 -0
  346. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md052_test.rs +0 -0
  347. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md053_additional_test.rs +0 -0
  348. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md053_proptest.rs +0 -0
  349. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md053_test.rs +0 -0
  350. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md054_test.rs +0 -0
  351. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md054_unicode_test.rs +0 -0
  352. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md055_test.rs +0 -0
  353. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md056_test.rs +0 -0
  354. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md057_test.rs +0 -0
  355. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/md058_test.rs +0 -0
  356. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules/mod.rs +0 -0
  357. {rumdl-0.0.106 → rumdl-0.0.107}/tests/rules_mod_test.rs +0 -0
  358. {rumdl-0.0.106 → rumdl-0.0.107}/tests/thread_safety_tests.rs +0 -0
  359. {rumdl-0.0.106 → rumdl-0.0.107}/tests/unicode_edge_case_tests.rs +0 -0
  360. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils/blockquote_utils_test.rs +0 -0
  361. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils/code_block_utils_extended_test.rs +0 -0
  362. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils/code_block_utils_test.rs +0 -0
  363. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils/core_utils_test.rs +0 -0
  364. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils/front_matter_utils_test.rs +0 -0
  365. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils/line_index_test.rs +0 -0
  366. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils/mod.rs +0 -0
  367. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils_markdown_edge_cases.rs +0 -0
  368. {rumdl-0.0.106 → rumdl-0.0.107}/tests/utils_tests.rs +0 -0
  369. {rumdl-0.0.106 → rumdl-0.0.107}/tests/vscode_extension_fixes.rs +0 -0
  370. {rumdl-0.0.106 → rumdl-0.0.107}/tests/vscode_test.rs +0 -0
  371. {rumdl-0.0.106 → rumdl-0.0.107}/tests/vscode_tests.rs +0 -0
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.107] - 2025-08-06
11
+
10
12
  ## [0.0.106] - 2025-08-05
11
13
 
12
14
  ### Changed
@@ -289,7 +291,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
289
291
 
290
292
  - Initial implementation of remaining rules for markdownlint parity
291
293
 
292
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.105...HEAD
294
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.107...HEAD
295
+ [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
293
296
  [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
294
297
  [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
295
298
  [0.0.104]: https://github.com/rvben/rumdl/compare/v0.0.103...v0.0.104
@@ -49,9 +49,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
49
49
 
50
50
  [[package]]
51
51
  name = "anstream"
52
- version = "0.6.19"
52
+ version = "0.6.20"
53
53
  source = "registry+https://github.com/rust-lang/crates.io-index"
54
- checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
54
+ checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192"
55
55
  dependencies = [
56
56
  "anstyle",
57
57
  "anstyle-parse",
@@ -79,22 +79,22 @@ dependencies = [
79
79
 
80
80
  [[package]]
81
81
  name = "anstyle-query"
82
- version = "1.1.3"
82
+ version = "1.1.4"
83
83
  source = "registry+https://github.com/rust-lang/crates.io-index"
84
- checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
84
+ checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2"
85
85
  dependencies = [
86
- "windows-sys 0.59.0",
86
+ "windows-sys 0.60.2",
87
87
  ]
88
88
 
89
89
  [[package]]
90
90
  name = "anstyle-wincon"
91
- version = "3.0.9"
91
+ version = "3.0.10"
92
92
  source = "registry+https://github.com/rust-lang/crates.io-index"
93
- checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
93
+ checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a"
94
94
  dependencies = [
95
95
  "anstyle",
96
96
  "once_cell_polyfill",
97
- "windows-sys 0.59.0",
97
+ "windows-sys 0.60.2",
98
98
  ]
99
99
 
100
100
  [[package]]
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1493
1493
 
1494
1494
  [[package]]
1495
1495
  name = "rumdl"
1496
- version = "0.0.106"
1496
+ version = "0.0.107"
1497
1497
  dependencies = [
1498
1498
  "anyhow",
1499
1499
  "assert_cmd",
@@ -2527,9 +2527,9 @@ dependencies = [
2527
2527
 
2528
2528
  [[package]]
2529
2529
  name = "zerovec"
2530
- version = "0.11.3"
2530
+ version = "0.11.4"
2531
2531
  source = "registry+https://github.com/rust-lang/crates.io-index"
2532
- checksum = "bdbb9122ea75b11bf96e7492afb723e8a7fbe12c67417aa95e7e3d18144d37cd"
2532
+ checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
2533
2533
  dependencies = [
2534
2534
  "yoke",
2535
2535
  "zerofrom",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.106"
3
+ version = "0.0.107"
4
4
  edition = "2024"
5
5
  rust-version = "1.88.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.106
3
+ Version: 0.0.107
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -1,8 +1,10 @@
1
1
  # MD036 - Use real headings, not just bold text
2
2
 
3
+ > **Note:** This rule does not provide automatic fixes because it cannot reliably determine user intent. Bold text on its own line has many legitimate uses (image captions, labels, warnings, etc.).
4
+
3
5
  ## What this rule does
4
6
 
5
- Detects when bold or italic text is used as a standalone heading and converts it to proper heading syntax.
7
+ Detects when bold or italic text is used as a standalone heading.
6
8
 
7
9
  ## Why this matters
8
10
 
@@ -43,9 +45,9 @@ Using emphasis as headings:
43
45
  **Configuration:**
44
46
  ```
45
47
 
46
- ### 🔧 Fixed
48
+ ### 🔧 Manual Fix Required
47
49
 
48
- Converted to proper headings:
50
+ These should be manually converted to proper headings:
49
51
 
50
52
  ```markdown
51
53
  ## This looks like a heading
@@ -57,28 +59,29 @@ Converted to proper headings:
57
59
  ## Configuration
58
60
  ```
59
61
 
62
+ **Note:** rumdl will detect these issues but won't automatically fix them. You need to manually decide if the emphasized text should be a heading.
63
+
60
64
  <!-- rumdl-enable MD036 -->
61
65
 
62
66
  ## Configuration
63
67
 
64
- ```yaml
65
- MD036:
66
- punctuation: ".,;:!?" # Characters to remove from heading ends
68
+ ```toml
69
+ # .rumdl.toml
70
+ [MD036]
71
+ punctuation = ".,;:!?" # Configure punctuation checking
67
72
  ```
68
73
 
69
74
  ### Options
70
75
 
71
- - `punctuation`: String of punctuation marks to remove when converting (default: `".,;:!?"`)
72
- - Set to `""` to keep all punctuation
76
+ - `punctuation`: String of punctuation marks that, when found at the end of emphasized text, prevent it from being flagged (default: `".,;:!?"`)
77
+ - Set to `""` to flag all emphasized lines regardless of punctuation
73
78
  - Customize to remove only specific marks
74
79
 
75
80
  ## Automatic fixes
76
81
 
77
- This rule will:
78
- - Convert standalone bold/italic lines to proper headings
79
- - Remove trailing punctuation based on your configuration
80
- - Choose appropriate heading level (## for bold, # for italic)
81
- - Preserve common labels like "Table of Contents" as-is
82
+ This rule does **not** provide automatic fixes. Converting bold or italic text to headings is too risky as it can corrupt documents. For example, bold text is often used for image captions, labels, or other legitimate emphasis that should not be converted to headings.
83
+
84
+ Users should manually review each warning and decide whether the emphasized text should be converted to a heading.
82
85
 
83
86
  ## Learn more
84
87
 
@@ -862,6 +862,46 @@ local_time = 07:32:00
862
862
  // Note: local_date and local_time might not be parsed by the current implementation
863
863
  }
864
864
  }
865
+
866
+ #[test]
867
+ fn test_default_config_passes_validation() {
868
+ use crate::rules;
869
+
870
+ let temp_dir = tempdir().unwrap();
871
+ let config_path = temp_dir.path().join(".rumdl.toml");
872
+ let config_path_str = config_path.to_str().unwrap();
873
+
874
+ // Create the default config using the same function that `rumdl init` uses
875
+ create_default_config(config_path_str).unwrap();
876
+
877
+ // Load it back as a SourcedConfig
878
+ let sourced =
879
+ SourcedConfig::load(Some(config_path_str), None).expect("Default config should load successfully");
880
+
881
+ // Create the rule registry
882
+ let all_rules = rules::all_rules(&Config::default());
883
+ let registry = RuleRegistry::from_rules(&all_rules);
884
+
885
+ // Validate the config
886
+ let warnings = validate_config_sourced(&sourced, &registry);
887
+
888
+ // The default config should have no warnings
889
+ if !warnings.is_empty() {
890
+ for warning in &warnings {
891
+ eprintln!("Config validation warning: {}", warning.message);
892
+ if let Some(rule) = &warning.rule {
893
+ eprintln!(" Rule: {rule}");
894
+ }
895
+ if let Some(key) = &warning.key {
896
+ eprintln!(" Key: {key}");
897
+ }
898
+ }
899
+ }
900
+ assert!(
901
+ warnings.is_empty(),
902
+ "Default config from rumdl init should pass validation without warnings"
903
+ );
904
+ }
865
905
  }
866
906
 
867
907
  #[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -1,6 +1,5 @@
1
1
  pub mod config;
2
2
  pub mod exit_codes;
3
- pub mod init;
4
3
  pub mod inline_config;
5
4
  pub mod lint_context;
6
5
  pub mod lsp;
@@ -190,8 +189,18 @@ pub fn lint(content: &str, rules: &[Box<dyn Rule>], _verbose: bool) -> LintResul
190
189
  let filtered_warnings: Vec<_> = rule_warnings
191
190
  .into_iter()
192
191
  .filter(|warning| {
192
+ // Use the warning's rule_name if available, otherwise use the rule's name
193
+ let rule_name_to_check = warning.rule_name.unwrap_or(rule.name());
194
+
195
+ // Extract the base rule name for sub-rules like "MD029-style" -> "MD029"
196
+ let base_rule_name = if let Some(dash_pos) = rule_name_to_check.find('-') {
197
+ &rule_name_to_check[..dash_pos]
198
+ } else {
199
+ rule_name_to_check
200
+ };
201
+
193
202
  !inline_config.is_rule_disabled(
194
- rule.name(),
203
+ base_rule_name,
195
204
  warning.line, // Already 1-indexed
196
205
  )
197
206
  })
@@ -204,18 +204,18 @@ impl Rule for MD011NoReversedLinks {
204
204
  let mut byte_pos = 0;
205
205
 
206
206
  for (line_num, line) in content.lines().enumerate() {
207
- // Skip if this line is in a code block
208
- if ctx.is_in_code_block_or_span(byte_pos) {
209
- byte_pos += line.len() + 1;
210
- continue;
211
- }
212
-
213
207
  // Part 1: Check for existing perfectly formed reversed links
214
208
  for cap in REVERSED_LINK_CHECK_REGEX.captures_iter(line) {
215
209
  let match_obj = cap.get(0).unwrap();
216
210
  let match_start = match_obj.start();
217
211
  let match_end = match_obj.end();
218
212
 
213
+ // Check if this specific match is within a code block or inline code span
214
+ let match_byte_pos = byte_pos + match_start;
215
+ if ctx.is_in_code_block_or_span(match_byte_pos) {
216
+ continue;
217
+ }
218
+
219
219
  // Check if the match contains escaped brackets or parentheses
220
220
  let match_text = match_obj.as_str();
221
221
 
@@ -277,6 +277,12 @@ impl Rule for MD011NoReversedLinks {
277
277
  // Part 2: Check for malformed link attempts where user intent is clear
278
278
  let malformed_attempts = self.detect_malformed_link_attempts(line);
279
279
  for (start, len, url, text) in malformed_attempts {
280
+ // Check if this specific match is within a code block or inline code span
281
+ let match_byte_pos = byte_pos + start;
282
+ if ctx.is_in_code_block_or_span(match_byte_pos) {
283
+ continue;
284
+ }
285
+
280
286
  // Calculate precise character range for the malformed syntax
281
287
  let (start_line, start_col, end_line, end_col) = calculate_match_range(line_num + 1, line, start, len);
282
288
 
@@ -593,4 +599,45 @@ But this (https://example.com)[reversed link] should be flagged."#;
593
599
  let result = rule.check(&ctx).unwrap();
594
600
  assert_eq!(result.len(), 1, "Should still flag URLs with nested parentheses");
595
601
  }
602
+
603
+ #[test]
604
+ fn test_inline_code_patterns() {
605
+ // Test for issue #19 - MD011 should not flag patterns inside inline code
606
+ let rule = MD011NoReversedLinks;
607
+
608
+ // Test the exact case from issue #19
609
+ let content = "I find `inspect.stack()[1].frame` a lot easier to understand (or at least guess about) at a glance than `inspect.stack()[1][0]`.";
610
+ let ctx = LintContext::new(content);
611
+ let result = rule.check(&ctx).unwrap();
612
+ assert_eq!(result.len(), 0, "Should not flag ()[1] patterns inside inline code");
613
+
614
+ // Test other patterns that might look like reversed links in code
615
+ let content = "Use `array()[0]` or `func()[1]` to access elements.";
616
+ let ctx = LintContext::new(content);
617
+ let result = rule.check(&ctx).unwrap();
618
+ assert_eq!(result.len(), 0, "Should not flag array access patterns in inline code");
619
+
620
+ // Test that actual reversed links outside code are still caught
621
+ let content = "Check out (https://example.com)[this link] and use `array()[1]`.";
622
+ let ctx = LintContext::new(content);
623
+ let result = rule.check(&ctx).unwrap();
624
+ assert_eq!(result.len(), 1, "Should flag actual reversed link but not code pattern");
625
+ assert!(result[0].message.contains("Reversed link syntax"));
626
+
627
+ // Test mixed scenario with code blocks
628
+ let content = r#"
629
+ Here's some code: `func()[1]` and `other()[2]`.
630
+
631
+ But this is wrong: (https://example.com)[Click here]
632
+
633
+ ```python
634
+ # This should not be flagged
635
+ result = inspect.stack()[1]
636
+ ```
637
+ "#;
638
+ let ctx = LintContext::new(content);
639
+ let result = rule.check(&ctx).unwrap();
640
+ assert_eq!(result.len(), 1, "Should only flag the actual reversed link");
641
+ assert_eq!(result[0].line, 4, "Should flag the reversed link on line 4");
642
+ }
596
643
  }
@@ -4,7 +4,6 @@
4
4
  use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
5
5
  use crate::rule_config_serde::RuleConfig;
6
6
  use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
7
- use crate::utils::range_utils::LineIndex;
8
7
  use crate::utils::regex_cache::ORDERED_LIST_MARKER_REGEX;
9
8
  use lazy_static::lazy_static;
10
9
  use regex::Regex;
@@ -136,10 +135,22 @@ impl Rule for MD029OrderedListPrefix {
136
135
  let mut indent_stack: Vec<(usize, usize)> = Vec::new(); // (indent, index)
137
136
  let lines: Vec<&str> = content.lines().collect();
138
137
  let mut byte_pos = 0;
138
+ let mut in_code_fence = false;
139
139
 
140
140
  for line in lines.iter() {
141
- // Skip if in code block
142
- if ctx.is_in_code_block_or_span(byte_pos) {
141
+ let trimmed = line.trim();
142
+
143
+ // Track code fences
144
+ if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
145
+ in_code_fence = !in_code_fence;
146
+ result.push_str(line);
147
+ result.push('\n');
148
+ byte_pos += line.len() + 1;
149
+ continue;
150
+ }
151
+
152
+ // Skip if in code block or fence
153
+ if in_code_fence || ctx.is_in_code_block_or_span(byte_pos) {
143
154
  result.push_str(line);
144
155
  result.push('\n');
145
156
  byte_pos += line.len() + 1;
@@ -177,30 +188,50 @@ impl Rule for MD029OrderedListPrefix {
177
188
  *idx += 1;
178
189
  }
179
190
  } else if !line.trim().is_empty() {
180
- // Check if this is a code fence line - don't break the list for these
181
- let trimmed = line.trim();
182
- if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
183
- // Code fence lines don't break the list
184
- result.push_str(line);
185
- result.push('\n');
186
- } else {
187
- // Check if the line is indented enough to be part of a list item
188
- let line_indent = line.chars().take_while(|c| c.is_whitespace()).count();
189
- let is_continuation = indent_stack
190
- .last()
191
- .map(|&(list_indent, _)| line_indent >= list_indent + 3)
192
- .unwrap_or(false);
193
-
194
- if is_continuation {
195
- // This line is part of the list item (indented continuation)
196
- result.push_str(line);
197
- result.push('\n');
191
+ // Check if the line is indented enough to be part of a list item
192
+ let line_indent = line.chars().take_while(|c| c.is_whitespace()).count();
193
+ let is_continuation = indent_stack
194
+ .last()
195
+ .map(|&(list_indent, _)| {
196
+ // Allow lazy continuation (0-2 spaces) or proper continuation (3+ spaces)
197
+ line_indent <= 2 || line_indent >= list_indent + 3
198
+ })
199
+ .unwrap_or(false);
200
+
201
+ if is_continuation {
202
+ if line_indent <= 2 && !indent_stack.is_empty() {
203
+ // Check if this line is itself a list item
204
+ let trimmed = line.trim();
205
+ let is_list_item = trimmed.starts_with("* ")
206
+ || trimmed.starts_with("- ")
207
+ || trimmed.starts_with("+ ")
208
+ || (trimmed.len() > 2
209
+ && trimmed.chars().next().unwrap().is_ascii_digit()
210
+ && trimmed.contains(". "));
211
+
212
+ if !is_list_item {
213
+ // This is a lazy continuation - fix it by adding proper indentation
214
+ let (list_indent, _) = indent_stack.last().unwrap();
215
+ let proper_indent = " ".repeat(list_indent + 3);
216
+ result.push_str(&proper_indent);
217
+ result.push_str(line.trim_start());
218
+ result.push('\n');
219
+ } else {
220
+ // This is a list item, not a continuation - it breaks the list
221
+ indent_stack.clear();
222
+ result.push_str(line);
223
+ result.push('\n');
224
+ }
198
225
  } else {
199
- // Non-list, non-blank line breaks the list
200
- indent_stack.clear();
226
+ // This line is properly indented
201
227
  result.push_str(line);
202
228
  result.push('\n');
203
229
  }
230
+ } else {
231
+ // Non-list, non-blank line breaks the list
232
+ indent_stack.clear();
233
+ result.push_str(line);
234
+ result.push('\n');
204
235
  }
205
236
  } else {
206
237
  // Blank line - don't clear the stack, as lists can have blank lines within them
@@ -221,74 +252,11 @@ impl Rule for MD029OrderedListPrefix {
221
252
  fn check_with_structure(
222
253
  &self,
223
254
  ctx: &crate::lint_context::LintContext,
224
- structure: &crate::utils::document_structure::DocumentStructure,
255
+ _structure: &crate::utils::document_structure::DocumentStructure,
225
256
  ) -> LintResult {
226
- let content = ctx.content;
227
-
228
- // Early return if no lists
229
- if structure.list_lines.is_empty() {
230
- return Ok(Vec::new());
231
- }
232
-
233
- // Quick check if there are no ordered lists
234
- if !content.contains('1') || (!content.contains("1.") && !content.contains("2.") && !content.contains("0.")) {
235
- return Ok(Vec::new());
236
- }
237
-
238
- let mut warnings = Vec::new();
239
- let mut list_items = Vec::new();
240
- let lines: Vec<&str> = content.lines().collect();
241
-
242
- // Create a set of list line indices for faster lookup
243
- let mut list_line_set = std::collections::HashSet::new();
244
- for &line_num in &structure.list_lines {
245
- list_line_set.insert(line_num); // Keep as 1-indexed for easier comparison
246
- }
247
-
248
- // Group ordered list items into sections
249
- let mut in_list = false;
250
-
251
- for (line_idx, line) in lines.iter().enumerate() {
252
- let line_num = line_idx + 1; // Convert to 1-indexed
253
-
254
- // Skip lines in code blocks
255
- if structure.is_in_code_block(line_num) {
256
- // Code blocks don't break the list - just skip them
257
- continue;
258
- }
259
-
260
- if list_line_set.contains(&line_num) {
261
- if Self::get_list_number(line).is_some() {
262
- // If this is the first item of a new list, record the list start
263
- if !in_list {
264
- in_list = true;
265
- }
266
-
267
- list_items.push((line_idx, line.to_string()));
268
- }
269
- } else if !line.trim().is_empty() {
270
- // Check if this is a code fence line - don't break the list for these
271
- let trimmed = line.trim();
272
- if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
273
- // Code fence lines don't break the list - just skip them
274
- continue;
275
- }
276
-
277
- // Non-empty, non-list line breaks the list
278
- if in_list && !list_items.is_empty() {
279
- self.check_list_section(&list_items, &mut warnings, content);
280
- list_items.clear();
281
- in_list = false;
282
- }
283
- }
284
- }
285
-
286
- // Check last section if it exists
287
- if !list_items.is_empty() {
288
- self.check_list_section(&list_items, &mut warnings, content);
289
- }
290
-
291
- Ok(warnings)
257
+ // For MD029, we need to use the regular check method to get lazy continuation detection
258
+ // The document structure optimization doesn't provide enough context for proper lazy continuation checking
259
+ self.check(ctx)
292
260
  }
293
261
 
294
262
  /// Get the category of this rule for selective processing
@@ -337,15 +305,74 @@ impl Rule for MD029OrderedListPrefix {
337
305
  }
338
306
 
339
307
  impl DocumentStructureExtensions for MD029OrderedListPrefix {
340
- fn has_relevant_elements(&self, ctx: &crate::lint_context::LintContext, doc_structure: &DocumentStructure) -> bool {
341
- let content = ctx.content;
342
- // This rule is only relevant if there are list items AND they might be ordered lists
343
- !doc_structure.list_lines.is_empty()
344
- && (content.contains("1.") || content.contains("2.") || content.contains("0."))
308
+ fn has_relevant_elements(
309
+ &self,
310
+ ctx: &crate::lint_context::LintContext,
311
+ _doc_structure: &DocumentStructure,
312
+ ) -> bool {
313
+ // This rule is relevant if there are any ordered list items
314
+ // We need to check even lists with all "1." items for:
315
+ // 1. Incorrect numbering according to configured style
316
+ // 2. Lazy continuation issues
317
+ ctx.list_blocks.iter().any(|block| block.is_ordered)
345
318
  }
346
319
  }
347
320
 
348
321
  impl MD029OrderedListPrefix {
322
+ /// Check for lazy continuation lines in a list block
323
+ fn check_for_lazy_continuation(
324
+ &self,
325
+ ctx: &crate::lint_context::LintContext,
326
+ list_block: &crate::lint_context::ListBlock,
327
+ warnings: &mut Vec<LintWarning>,
328
+ ) {
329
+ // Check all lines in the block for lazy continuation
330
+ for line_num in list_block.start_line..=list_block.end_line {
331
+ if let Some(line_info) = ctx.line_info(line_num) {
332
+ // Skip list item lines themselves
333
+ if list_block.item_lines.contains(&line_num) {
334
+ continue;
335
+ }
336
+
337
+ // Skip blank lines
338
+ if line_info.is_blank {
339
+ continue;
340
+ }
341
+
342
+ // Skip lines that are in code blocks
343
+ if line_info.in_code_block {
344
+ continue;
345
+ }
346
+
347
+ // Skip code fence lines
348
+ let trimmed = line_info.content.trim();
349
+ if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
350
+ continue;
351
+ }
352
+
353
+ // Check if this is a lazy continuation (0-2 spaces)
354
+ if line_info.indent <= 2 && !line_info.content.trim().is_empty() {
355
+ // This is a lazy continuation - add a style warning
356
+ let col = line_info.indent + 1;
357
+
358
+ warnings.push(LintWarning {
359
+ rule_name: Some("MD029-style"),
360
+ message: "List continuation should be indented (lazy continuation detected)".to_string(),
361
+ line: line_num,
362
+ column: col,
363
+ end_line: line_num,
364
+ end_column: col,
365
+ severity: Severity::Warning,
366
+ fix: Some(Fix {
367
+ range: line_info.byte_offset..line_info.byte_offset,
368
+ replacement: " ".to_string(), // Add 3 spaces
369
+ }),
370
+ });
371
+ }
372
+ }
373
+ }
374
+ }
375
+
349
376
  /// Check if there's only code blocks/fences between two list blocks
350
377
  fn is_only_code_between_blocks(
351
378
  &self,
@@ -395,6 +422,9 @@ impl MD029OrderedListPrefix {
395
422
  let mut all_items = Vec::new();
396
423
 
397
424
  for list_block in group {
425
+ // First, check for lazy continuation in this block
426
+ self.check_for_lazy_continuation(ctx, list_block, warnings);
427
+
398
428
  for &item_line in &list_block.item_lines {
399
429
  if let Some(line_info) = ctx.line_info(item_line) {
400
430
  if let Some(list_item) = &line_info.list_item {
@@ -465,58 +495,6 @@ impl MD029OrderedListPrefix {
465
495
  }
466
496
  }
467
497
  }
468
-
469
- fn check_list_section(&self, items: &[(usize, String)], warnings: &mut Vec<LintWarning>, content: &str) {
470
- // Group items by indentation level and process each level independently
471
- let mut level_groups: std::collections::HashMap<usize, Vec<(usize, String)>> = std::collections::HashMap::new();
472
-
473
- for (line_num, line) in items {
474
- let indent = line.chars().take_while(|c| c.is_whitespace()).count();
475
- level_groups.entry(indent).or_default().push((*line_num, line.clone()));
476
- }
477
-
478
- // Process each indentation level separately
479
- for (_indent, mut group) in level_groups {
480
- // Sort by line number to ensure correct order
481
- group.sort_by_key(|(line_num, _)| *line_num);
482
-
483
- // Check each item in the group for correct sequence
484
- for (idx, (line_num, line)) in group.iter().enumerate() {
485
- if let Some(actual_num) = Self::get_list_number(line) {
486
- let expected_num = self.get_expected_number(idx);
487
-
488
- if actual_num != expected_num {
489
- // Create a LineIndex for the actual content
490
- let line_index = LineIndex::new(content.to_string());
491
-
492
- // Find the number position in the line for precise replacement
493
- let number_start = line.find(char::is_numeric).unwrap_or(0);
494
- let number_len = actual_num.to_string().len();
495
-
496
- warnings.push(LintWarning {
497
- rule_name: Some(self.name()),
498
- message: format!(
499
- "Ordered list item number {actual_num} does not match style (expected {expected_num})"
500
- ),
501
- line: line_num + 1,
502
- column: number_start + 1,
503
- end_line: line_num + 1,
504
- end_column: number_start + number_len + 1,
505
- severity: Severity::Warning,
506
- fix: Some(Fix {
507
- range: line_index.line_col_to_byte_range_with_length(
508
- line_num + 1,
509
- number_start + 1,
510
- number_len,
511
- ),
512
- replacement: expected_num.to_string(),
513
- }),
514
- });
515
- }
516
- }
517
- }
518
- }
519
- }
520
498
  }
521
499
 
522
500
  #[cfg(test)]