rumdl 0.0.118__tar.gz → 0.0.120__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 (388) hide show
  1. {rumdl-0.0.118 → rumdl-0.0.120}/CHANGELOG.md +21 -3
  2. {rumdl-0.0.118 → rumdl-0.0.120}/Cargo.lock +13 -13
  3. {rumdl-0.0.118 → rumdl-0.0.120}/Cargo.toml +2 -1
  4. {rumdl-0.0.118 → rumdl-0.0.120}/PKG-INFO +1 -1
  5. {rumdl-0.0.118 → rumdl-0.0.120}/src/lint_context.rs +270 -58
  6. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md007_ul_indent.rs +1 -25
  7. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md029_ordered_list_prefix.rs +81 -48
  8. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md051_link_fragments.rs +194 -150
  9. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md057_existing_relative_links.rs +0 -13
  10. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/code_block_utils.rs +113 -0
  11. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/document_structure.rs +0 -8
  12. rumdl-0.0.120/src/utils/header_id_utils.rs +349 -0
  13. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/kramdown_utils.rs +73 -156
  14. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/mod.rs +1 -0
  15. rumdl-0.0.120/tests/rules/md029_code_block_separation_test.rs +304 -0
  16. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md029_issue42_test.rs +21 -20
  17. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md029_test.rs +317 -12
  18. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md029_unicode_test.rs +2 -2
  19. rumdl-0.0.120/tests/rules/md051_issue_39_regression_test.rs +232 -0
  20. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md051_test.rs +382 -25
  21. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md051_unicode_test.rs +13 -14
  22. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/mod.rs +3 -0
  23. {rumdl-0.0.118 → rumdl-0.0.120}/.config/nextest.toml +0 -0
  24. {rumdl-0.0.118 → rumdl-0.0.120}/.mise.toml +0 -0
  25. {rumdl-0.0.118 → rumdl-0.0.120}/.pre-commit-config.yaml +0 -0
  26. {rumdl-0.0.118 → rumdl-0.0.120}/.rumdl.toml +0 -0
  27. {rumdl-0.0.118 → rumdl-0.0.120}/.rustfmt.toml +0 -0
  28. {rumdl-0.0.118 → rumdl-0.0.120}/LICENSE +0 -0
  29. {rumdl-0.0.118 → rumdl-0.0.120}/MANIFEST.in +0 -0
  30. {rumdl-0.0.118 → rumdl-0.0.120}/Makefile +0 -0
  31. {rumdl-0.0.118 → rumdl-0.0.120}/README.md +0 -0
  32. {rumdl-0.0.118 → rumdl-0.0.120}/assets/logo.png +0 -0
  33. {rumdl-0.0.118 → rumdl-0.0.120}/benches/fix_performance.rs +0 -0
  34. {rumdl-0.0.118 → rumdl-0.0.120}/benches/range_performance.rs +0 -0
  35. {rumdl-0.0.118 → rumdl-0.0.120}/benches/range_utils_benchmark.rs +0 -0
  36. {rumdl-0.0.118 → rumdl-0.0.120}/benches/rule_performance.rs +0 -0
  37. {rumdl-0.0.118 → rumdl-0.0.120}/benches/simple_fix_bench.rs +0 -0
  38. {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/bench_lint_context.rs +0 -0
  39. {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/benchmark.rs +0 -0
  40. {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/benchmark_rule.rs +0 -0
  41. {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  42. {rumdl-0.0.118 → rumdl-0.0.120}/benchmark/bin/measure_code_span_performance.rs +0 -0
  43. {rumdl-0.0.118 → rumdl-0.0.120}/docs/RULES.md +0 -0
  44. {rumdl-0.0.118 → rumdl-0.0.120}/docs/global-settings.md +0 -0
  45. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md001.md +0 -0
  46. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md002.md +0 -0
  47. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md003.md +0 -0
  48. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md004.md +0 -0
  49. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md005.md +0 -0
  50. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md006.md +0 -0
  51. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md007.md +0 -0
  52. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md009.md +0 -0
  53. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md010.md +0 -0
  54. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md011.md +0 -0
  55. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md012.md +0 -0
  56. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md013.md +0 -0
  57. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md014.md +0 -0
  58. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md018.md +0 -0
  59. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md019.md +0 -0
  60. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md020.md +0 -0
  61. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md021.md +0 -0
  62. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md022.md +0 -0
  63. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md023.md +0 -0
  64. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md024.md +0 -0
  65. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md025.md +0 -0
  66. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md026.md +0 -0
  67. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md027.md +0 -0
  68. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md028.md +0 -0
  69. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md029.md +0 -0
  70. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md030.md +0 -0
  71. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md031.md +0 -0
  72. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md032.md +0 -0
  73. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md033.md +0 -0
  74. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md034.md +0 -0
  75. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md035.md +0 -0
  76. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md036.md +0 -0
  77. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md037.md +0 -0
  78. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md038.md +0 -0
  79. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md039.md +0 -0
  80. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md040.md +0 -0
  81. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md041.md +0 -0
  82. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md042.md +0 -0
  83. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md043.md +0 -0
  84. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md044.md +0 -0
  85. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md045.md +0 -0
  86. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md046.md +0 -0
  87. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md047.md +0 -0
  88. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md048.md +0 -0
  89. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md049.md +0 -0
  90. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md050.md +0 -0
  91. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md051.md +0 -0
  92. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md052.md +0 -0
  93. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md053.md +0 -0
  94. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md054.md +0 -0
  95. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md055.md +0 -0
  96. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md056.md +0 -0
  97. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md057.md +0 -0
  98. {rumdl-0.0.118 → rumdl-0.0.120}/docs/md058.md +0 -0
  99. {rumdl-0.0.118 → rumdl-0.0.120}/docs/vscode-extension.md +0 -0
  100. {rumdl-0.0.118 → rumdl-0.0.120}/parity_check.py +0 -0
  101. {rumdl-0.0.118 → rumdl-0.0.120}/pyproject.toml +0 -0
  102. {rumdl-0.0.118 → rumdl-0.0.120}/python/MANIFEST.in +0 -0
  103. {rumdl-0.0.118 → rumdl-0.0.120}/python/PYTHON-README.md +0 -0
  104. {rumdl-0.0.118 → rumdl-0.0.120}/python/rumdl/__init__.py +0 -0
  105. {rumdl-0.0.118 → rumdl-0.0.120}/python/rumdl/__main__.py +0 -0
  106. {rumdl-0.0.118 → rumdl-0.0.120}/python/rumdl/py.typed +0 -0
  107. {rumdl-0.0.118 → rumdl-0.0.120}/rumdl.toml.example +0 -0
  108. {rumdl-0.0.118 → rumdl-0.0.120}/rust-toolchain.toml +0 -0
  109. {rumdl-0.0.118 → rumdl-0.0.120}/scripts/extract-changelog.sh +0 -0
  110. {rumdl-0.0.118 → rumdl-0.0.120}/scripts/generate-downloads-table.sh +0 -0
  111. {rumdl-0.0.118 → rumdl-0.0.120}/scripts/pre-release.sh +0 -0
  112. {rumdl-0.0.118 → rumdl-0.0.120}/scripts/prepare-release.sh +0 -0
  113. {rumdl-0.0.118 → rumdl-0.0.120}/scripts/setup-pre-commit.sh +0 -0
  114. {rumdl-0.0.118 → rumdl-0.0.120}/scripts/update-pre-commit-docs.sh +0 -0
  115. {rumdl-0.0.118 → rumdl-0.0.120}/src/config.rs +0 -0
  116. {rumdl-0.0.118 → rumdl-0.0.120}/src/exit_codes.rs +0 -0
  117. {rumdl-0.0.118 → rumdl-0.0.120}/src/inline_config.rs +0 -0
  118. {rumdl-0.0.118 → rumdl-0.0.120}/src/lib.rs +0 -0
  119. {rumdl-0.0.118 → rumdl-0.0.120}/src/lsp/mod.rs +0 -0
  120. {rumdl-0.0.118 → rumdl-0.0.120}/src/lsp/server.rs +0 -0
  121. {rumdl-0.0.118 → rumdl-0.0.120}/src/lsp/types.rs +0 -0
  122. {rumdl-0.0.118 → rumdl-0.0.120}/src/main.rs +0 -0
  123. {rumdl-0.0.118 → rumdl-0.0.120}/src/markdownlint_config.rs +0 -0
  124. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/azure.rs +0 -0
  125. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/concise.rs +0 -0
  126. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/github.rs +0 -0
  127. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/gitlab.rs +0 -0
  128. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/grouped.rs +0 -0
  129. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/json.rs +0 -0
  130. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/json_lines.rs +0 -0
  131. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/junit.rs +0 -0
  132. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/mod.rs +0 -0
  133. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/pylint.rs +0 -0
  134. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/sarif.rs +0 -0
  135. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/formatters/text.rs +0 -0
  136. {rumdl-0.0.118 → rumdl-0.0.120}/src/output/mod.rs +0 -0
  137. {rumdl-0.0.118 → rumdl-0.0.120}/src/parallel.rs +0 -0
  138. {rumdl-0.0.118 → rumdl-0.0.120}/src/performance.rs +0 -0
  139. {rumdl-0.0.118 → rumdl-0.0.120}/src/profiling.rs +0 -0
  140. {rumdl-0.0.118 → rumdl-0.0.120}/src/python.rs +0 -0
  141. {rumdl-0.0.118 → rumdl-0.0.120}/src/rule.rs +0 -0
  142. {rumdl-0.0.118 → rumdl-0.0.120}/src/rule_config.rs +0 -0
  143. {rumdl-0.0.118 → rumdl-0.0.120}/src/rule_config_serde.rs +0 -0
  144. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/blockquote_utils.rs +0 -0
  145. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/code_block_utils.rs +0 -0
  146. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/code_fence_utils.rs +0 -0
  147. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/emphasis_style.rs +0 -0
  148. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/front_matter_utils.rs +0 -0
  149. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/heading_utils.rs +0 -0
  150. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/list_utils.rs +0 -0
  151. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md001_heading_increment.rs +0 -0
  152. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  153. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md002_first_heading_h1.rs +0 -0
  154. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md003_heading_style/md003_config.rs +0 -0
  155. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md003_heading_style.rs +0 -0
  156. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  157. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md004_unordered_list_style.rs +0 -0
  158. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md005_list_indent.rs +0 -0
  159. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md006_start_bullets.rs +0 -0
  160. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  161. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  162. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md009_trailing_spaces.rs +0 -0
  163. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  164. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md010_no_hard_tabs.rs +0 -0
  165. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md011_no_reversed_links.rs +0 -0
  166. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  167. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md012_no_multiple_blanks.rs +0 -0
  168. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md013_line_length/md013_config.rs +0 -0
  169. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md013_line_length.rs +0 -0
  170. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  171. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md014_commands_show_output.rs +0 -0
  172. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md018_no_missing_space_atx.rs +0 -0
  173. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  174. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  175. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  176. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  177. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md022_blanks_around_headings.rs +0 -0
  178. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md023_heading_start_left.rs +0 -0
  179. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  180. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md024_no_duplicate_heading.rs +0 -0
  181. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md025_single_title/md025_config.rs +0 -0
  182. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md025_single_title.rs +0 -0
  183. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  184. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  185. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  186. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  187. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  188. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  189. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md030_list_marker_space.rs +0 -0
  190. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md031_blanks_around_fences.rs +0 -0
  191. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md032_blanks_around_lists.rs +0 -0
  192. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  193. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md033_no_inline_html.rs +0 -0
  194. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md034_no_bare_urls.rs +0 -0
  195. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md035_hr_style/md035_config.rs +0 -0
  196. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md035_hr_style.rs +0 -0
  197. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  198. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  199. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  200. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md038_no_space_in_code.rs +0 -0
  201. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md039_no_space_in_links.rs +0 -0
  202. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md040_fenced_code_language.rs +0 -0
  203. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md041_first_line_heading.rs +0 -0
  204. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md042_no_empty_links.rs +0 -0
  205. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md043_required_headings.rs +0 -0
  206. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md044_proper_names/md044_config.rs +0 -0
  207. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md044_proper_names.rs +0 -0
  208. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  209. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md045_no_alt_text.rs +0 -0
  210. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  211. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md046_code_block_style.rs +0 -0
  212. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md047_single_trailing_newline.rs +0 -0
  213. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  214. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md048_code_fence_style.rs +0 -0
  215. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  216. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md049_emphasis_style.rs +0 -0
  217. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md050_strong_style/md050_config.rs +0 -0
  218. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md050_strong_style.rs +0 -0
  219. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md052_reference_links_images.rs +0 -0
  220. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  221. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  222. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md054_link_image_style.rs +0 -0
  223. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  224. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md055_table_pipe_style.rs +0 -0
  225. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md056_table_column_count.rs +0 -0
  226. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  227. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/md058_blanks_around_tables.rs +0 -0
  228. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/mod.rs +0 -0
  229. {rumdl-0.0.118 → rumdl-0.0.120}/src/rules/strong_style.rs +0 -0
  230. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/ast_utils.rs +0 -0
  231. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/early_returns.rs +0 -0
  232. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/element_cache.rs +0 -0
  233. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/emphasis_utils.rs +0 -0
  234. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/fix_utils.rs +0 -0
  235. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/markdown_elements.rs +0 -0
  236. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/range_utils.rs +0 -0
  237. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/regex_cache.rs +0 -0
  238. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/skip_context.rs +0 -0
  239. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/string_interner.rs +0 -0
  240. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/table_utils.rs +0 -0
  241. {rumdl-0.0.118 → rumdl-0.0.120}/src/utils/text_reflow.rs +0 -0
  242. {rumdl-0.0.118 → rumdl-0.0.120}/src/vscode.rs +0 -0
  243. {rumdl-0.0.118 → rumdl-0.0.120}/tests/advanced_integration_tests.rs +0 -0
  244. {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/additional_tests.rs +0 -0
  245. {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/basic_tests.rs +0 -0
  246. {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/comprehensive_tests.rs +0 -0
  247. {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/extended_tests.rs +0 -0
  248. {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/mod.rs +0 -0
  249. {rumdl-0.0.118 → rumdl-0.0.120}/tests/character_ranges/unicode_utils.rs +0 -0
  250. {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_duplication_test.rs +0 -0
  251. {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_explain_test.rs +0 -0
  252. {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_flag_precedence_test.rs +0 -0
  253. {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_integration_tests.rs +0 -0
  254. {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_lsp_fix_consistency.rs +0 -0
  255. {rumdl-0.0.118 → rumdl-0.0.120}/tests/cli_statistics_test.rs +0 -0
  256. {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/cli_test_utils.rs +0 -0
  257. {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/fixtures.rs +0 -0
  258. {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/mod.rs +0 -0
  259. {rumdl-0.0.118 → rumdl-0.0.120}/tests/common/test_utils.rs +0 -0
  260. {rumdl-0.0.118 → rumdl-0.0.120}/tests/commonmark_compliance_tests.rs +0 -0
  261. {rumdl-0.0.118 → rumdl-0.0.120}/tests/comprehensive_integration_tests.rs +0 -0
  262. {rumdl-0.0.118 → rumdl-0.0.120}/tests/comprehensive_output_format_tests.rs +0 -0
  263. {rumdl-0.0.118 → rumdl-0.0.120}/tests/config_application_tests.rs +0 -0
  264. {rumdl-0.0.118 → rumdl-0.0.120}/tests/config_file_command_test.rs +0 -0
  265. {rumdl-0.0.118 → rumdl-0.0.120}/tests/config_tests.rs +0 -0
  266. {rumdl-0.0.118 → rumdl-0.0.120}/tests/configuration_inheritance_tests.rs +0 -0
  267. {rumdl-0.0.118 → rumdl-0.0.120}/tests/consistency_regression_tests.rs +0 -0
  268. {rumdl-0.0.118 → rumdl-0.0.120}/tests/cross_platform_compatibility_tests.rs +0 -0
  269. {rumdl-0.0.118 → rumdl-0.0.120}/tests/deeply_nested_lists_performance_test.rs +0 -0
  270. {rumdl-0.0.118 → rumdl-0.0.120}/tests/escaped_brackets_test.rs +0 -0
  271. {rumdl-0.0.118 → rumdl-0.0.120}/tests/final_confidence_assessment.rs +0 -0
  272. {rumdl-0.0.118 → rumdl-0.0.120}/tests/fixable_unfixable_config_test.rs +0 -0
  273. {rumdl-0.0.118 → rumdl-0.0.120}/tests/init_command_test.rs +0 -0
  274. {rumdl-0.0.118 → rumdl-0.0.120}/tests/init_tests.rs +0 -0
  275. {rumdl-0.0.118 → rumdl-0.0.120}/tests/inline_config_blocks_test.rs +0 -0
  276. {rumdl-0.0.118 → rumdl-0.0.120}/tests/inline_config_test.rs +0 -0
  277. {rumdl-0.0.118 → rumdl-0.0.120}/tests/integration_tests.rs +0 -0
  278. {rumdl-0.0.118 → rumdl-0.0.120}/tests/json_output_test.rs +0 -0
  279. {rumdl-0.0.118 → rumdl-0.0.120}/tests/kramdown_integration_test.rs +0 -0
  280. {rumdl-0.0.118 → rumdl-0.0.120}/tests/lib.rs +0 -0
  281. {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_editor_integration_tests.rs +0 -0
  282. {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_integration_tests.rs +0 -0
  283. {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_memory_leak_tests.rs +0 -0
  284. {rumdl-0.0.118 → rumdl-0.0.120}/tests/lsp_tests.rs +0 -0
  285. {rumdl-0.0.118 → rumdl-0.0.120}/tests/malformed_markdown_stress_tests.rs +0 -0
  286. {rumdl-0.0.118 → rumdl-0.0.120}/tests/markdownlint_cli_integration.rs +0 -0
  287. {rumdl-0.0.118 → rumdl-0.0.120}/tests/markdownlint_config_test.rs +0 -0
  288. {rumdl-0.0.118 → rumdl-0.0.120}/tests/markdownlintignore_test.rs +0 -0
  289. {rumdl-0.0.118 → rumdl-0.0.120}/tests/md013_reflow_integration_test.rs +0 -0
  290. {rumdl-0.0.118 → rumdl-0.0.120}/tests/nested_code_block_test.rs +0 -0
  291. {rumdl-0.0.118 → rumdl-0.0.120}/tests/output_format_integration_tests.rs +0 -0
  292. {rumdl-0.0.118 → rumdl-0.0.120}/tests/output_format_tests.rs +0 -0
  293. {rumdl-0.0.118 → rumdl-0.0.120}/tests/perf_check.rs +0 -0
  294. {rumdl-0.0.118 → rumdl-0.0.120}/tests/performance_validation_tests.rs +0 -0
  295. {rumdl-0.0.118 → rumdl-0.0.120}/tests/pyproject_config_tests.rs +0 -0
  296. {rumdl-0.0.118 → rumdl-0.0.120}/tests/python_bindings_test.rs +0 -0
  297. {rumdl-0.0.118 → rumdl-0.0.120}/tests/real_world_repository_tests.rs +0 -0
  298. {rumdl-0.0.118 → rumdl-0.0.120}/tests/regression_prevention_tests.rs +0 -0
  299. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  300. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/heading_edge_cases_test.rs +0 -0
  301. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  302. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/link_edge_cases_test.rs +0 -0
  303. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/list_rules_integration_test.rs +0 -0
  304. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md001_test.rs +0 -0
  305. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md001_unicode_test.rs +0 -0
  306. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md002_test.rs +0 -0
  307. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md003_test.rs +0 -0
  308. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md004_test.rs +0 -0
  309. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md005_test.rs +0 -0
  310. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md005_unicode_test.rs +0 -0
  311. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md006_test.rs +0 -0
  312. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md006_unicode_test.rs +0 -0
  313. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md007_test.rs +0 -0
  314. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md009_test.rs +0 -0
  315. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md010_test.rs +0 -0
  316. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md011_test.rs +0 -0
  317. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md012_test.rs +0 -0
  318. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md013_test.rs +0 -0
  319. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md014_test.rs +0 -0
  320. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md018_test.rs +0 -0
  321. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md019_test.rs +0 -0
  322. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md020_test.rs +0 -0
  323. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md021_test.rs +0 -0
  324. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md022_test.rs +0 -0
  325. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md023_extended_test.rs +0 -0
  326. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md023_test.rs +0 -0
  327. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md024_test.rs +0 -0
  328. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md025_test.rs +0 -0
  329. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md026_kramdown_test.rs +0 -0
  330. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md026_test.rs +0 -0
  331. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md027_test.rs +0 -0
  332. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md028_test.rs +0 -0
  333. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md030_test.rs +0 -0
  334. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md031_kramdown_test.rs +0 -0
  335. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md031_test.rs +0 -0
  336. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md032_test.rs +0 -0
  337. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md033_extended_test.rs +0 -0
  338. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md033_kramdown_test.rs +0 -0
  339. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md033_test.rs +0 -0
  340. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md034_ipv6_test.rs +0 -0
  341. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md034_test.rs +0 -0
  342. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md035_test.rs +0 -0
  343. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md036_test.rs +0 -0
  344. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md037_kramdown_test.rs +0 -0
  345. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md037_test.rs +0 -0
  346. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md038_nested_backticks_test.rs +0 -0
  347. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md038_test.rs +0 -0
  348. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md039_test.rs +0 -0
  349. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md040_test.rs +0 -0
  350. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md041_test.rs +0 -0
  351. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md042_test.rs +0 -0
  352. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md043_test.rs +0 -0
  353. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md044_test.rs +0 -0
  354. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md045_test.rs +0 -0
  355. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md046_test.rs +0 -0
  356. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md047_test.rs +0 -0
  357. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md048_test.rs +0 -0
  358. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md049_test.rs +0 -0
  359. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md050_test.rs +0 -0
  360. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md052_test.rs +0 -0
  361. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md053_additional_test.rs +0 -0
  362. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md053_proptest.rs +0 -0
  363. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md053_test.rs +0 -0
  364. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md054_test.rs +0 -0
  365. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md054_unicode_test.rs +0 -0
  366. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md055_test.rs +0 -0
  367. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md056_test.rs +0 -0
  368. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md057_test.rs +0 -0
  369. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md058_kramdown_test.rs +0 -0
  370. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules/md058_test.rs +0 -0
  371. {rumdl-0.0.118 → rumdl-0.0.120}/tests/rules_mod_test.rs +0 -0
  372. {rumdl-0.0.118 → rumdl-0.0.120}/tests/skip_context_tests.rs +0 -0
  373. {rumdl-0.0.118 → rumdl-0.0.120}/tests/thread_safety_tests.rs +0 -0
  374. {rumdl-0.0.118 → rumdl-0.0.120}/tests/unicode_edge_case_tests.rs +0 -0
  375. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/blockquote_utils_test.rs +0 -0
  376. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/code_block_utils_extended_test.rs +0 -0
  377. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/code_block_utils_test.rs +0 -0
  378. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/core_utils_test.rs +0 -0
  379. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/front_matter_utils_test.rs +0 -0
  380. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/line_index_test.rs +0 -0
  381. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils/mod.rs +0 -0
  382. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils_markdown_edge_cases.rs +0 -0
  383. {rumdl-0.0.118 → rumdl-0.0.120}/tests/utils_tests.rs +0 -0
  384. {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_extension_fixes.rs +0 -0
  385. {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_test.rs +0 -0
  386. {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_tests.rs +0 -0
  387. {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_windows_comprehensive_test.rs +0 -0
  388. {rumdl-0.0.118 → rumdl-0.0.120}/tests/vscode_windows_test.rs +0 -0
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.120] - 2025-08-16
11
+
12
+ ## [0.0.119] - 2025-08-15
13
+
14
+ ### Fixed
15
+ - **MD051**: Fixed GitHub anchor generation algorithm to correctly handle consecutive spaces
16
+ - "Test & Heading!" now correctly generates "test--heading" instead of "test-heading"
17
+ - Improved compliance with GitHub's official anchor generation behavior
18
+ - Fixed whitespace normalization bug that was collapsing multiple spaces to single spaces
19
+
20
+ ### Improved
21
+ - **Code Quality**: Removed all `#[allow(dead_code)]` violations in codebase
22
+ - Removed unused `InternalCodeBlockState` enum from document_structure.rs
23
+ - Removed unused `extract_url_from_link` function from md057_existing_relative_links.rs
24
+ - Removed unused `is_in_code_block` function from md007_ul_indent.rs
25
+
10
26
  ## [0.0.118] - 2025-08-14
11
27
 
12
28
  ## [0.0.117] - 2025-08-14
@@ -124,7 +140,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
124
140
  ## [0.0.99] - 2025-07-22
125
141
 
126
142
  ### Fixed
127
- - MD034: Added support for `ftps://` URLs
143
+ - MD034: Added support for `ftps://` URLs
128
144
  - MD034: Fixed detection of URLs in HTML comments (now properly ignored)
129
145
  - MD039: Fixed escaped character handling in link text
130
146
  - MD044: Fixed clippy warnings and improved pattern matching for proper names
@@ -202,7 +218,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
202
218
  ### Performance Improvements
203
219
  - Implemented lazy code span loading - 3.8x speedup for 94% of rules that don't use code spans
204
220
  - MD013: 34.5% faster check operations through aggressive early returns
205
- - MD038: 14% faster by leveraging lazy code span loading
221
+ - MD038: 14% faster by leveraging lazy code span loading
206
222
  - MD044: 93.5% faster with global regex caching
207
223
  - MD047: 8.3% faster using pre-computed line data
208
224
  - MD053: 39.7% faster by leveraging pre-parsed reference definitions
@@ -337,7 +353,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
337
353
 
338
354
  - Initial implementation of remaining rules for markdownlint parity
339
355
 
340
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.118...HEAD
356
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.120...HEAD
357
+ [0.0.120]: https://github.com/rvben/rumdl/compare/v0.0.119...v0.0.120
358
+ [0.0.119]: https://github.com/rvben/rumdl/compare/v0.0.118...v0.0.119
341
359
  [0.0.118]: https://github.com/rvben/rumdl/compare/v0.0.117...v0.0.118
342
360
  [0.0.117]: https://github.com/rvben/rumdl/compare/v0.0.116...v0.0.117
343
361
  [0.0.116]: https://github.com/rvben/rumdl/compare/v0.0.115...v0.0.116
@@ -185,9 +185,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
185
185
 
186
186
  [[package]]
187
187
  name = "bitflags"
188
- version = "2.9.1"
188
+ version = "2.9.2"
189
189
  source = "registry+https://github.com/rust-lang/crates.io-index"
190
- checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
190
+ checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29"
191
191
 
192
192
  [[package]]
193
193
  name = "bstr"
@@ -220,9 +220,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
220
220
 
221
221
  [[package]]
222
222
  name = "cc"
223
- version = "1.2.32"
223
+ version = "1.2.33"
224
224
  source = "registry+https://github.com/rust-lang/crates.io-index"
225
- checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e"
225
+ checksum = "3ee0f8803222ba5a7e2777dd72ca451868909b1ac410621b676adf07280e9b5f"
226
226
  dependencies = [
227
227
  "shlex",
228
228
  ]
@@ -863,7 +863,7 @@ version = "0.7.9"
863
863
  source = "registry+https://github.com/rust-lang/crates.io-index"
864
864
  checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
865
865
  dependencies = [
866
- "bitflags 2.9.1",
866
+ "bitflags 2.9.2",
867
867
  "cfg-if",
868
868
  "libc",
869
869
  ]
@@ -1280,7 +1280,7 @@ checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f"
1280
1280
  dependencies = [
1281
1281
  "bit-set",
1282
1282
  "bit-vec",
1283
- "bitflags 2.9.1",
1283
+ "bitflags 2.9.2",
1284
1284
  "lazy_static",
1285
1285
  "num-traits",
1286
1286
  "rand",
@@ -1298,7 +1298,7 @@ version = "0.12.2"
1298
1298
  source = "registry+https://github.com/rust-lang/crates.io-index"
1299
1299
  checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14"
1300
1300
  dependencies = [
1301
- "bitflags 2.9.1",
1301
+ "bitflags 2.9.2",
1302
1302
  "getopts",
1303
1303
  "memchr",
1304
1304
  "pulldown-cmark-escape",
@@ -1459,7 +1459,7 @@ version = "0.5.17"
1459
1459
  source = "registry+https://github.com/rust-lang/crates.io-index"
1460
1460
  checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
1461
1461
  dependencies = [
1462
- "bitflags 2.9.1",
1462
+ "bitflags 2.9.2",
1463
1463
  ]
1464
1464
 
1465
1465
  [[package]]
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1493
1493
 
1494
1494
  [[package]]
1495
1495
  name = "rumdl"
1496
- version = "0.0.118"
1496
+ version = "0.0.120"
1497
1497
  dependencies = [
1498
1498
  "anyhow",
1499
1499
  "assert_cmd",
@@ -1555,7 +1555,7 @@ version = "1.0.8"
1555
1555
  source = "registry+https://github.com/rust-lang/crates.io-index"
1556
1556
  checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
1557
1557
  dependencies = [
1558
- "bitflags 2.9.1",
1558
+ "bitflags 2.9.2",
1559
1559
  "errno",
1560
1560
  "libc",
1561
1561
  "linux-raw-sys",
@@ -1723,9 +1723,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
1723
1723
 
1724
1724
  [[package]]
1725
1725
  name = "syn"
1726
- version = "2.0.105"
1726
+ version = "2.0.106"
1727
1727
  source = "registry+https://github.com/rust-lang/crates.io-index"
1728
- checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619"
1728
+ checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6"
1729
1729
  dependencies = [
1730
1730
  "proc-macro2",
1731
1731
  "quote",
@@ -2434,7 +2434,7 @@ version = "0.39.0"
2434
2434
  source = "registry+https://github.com/rust-lang/crates.io-index"
2435
2435
  checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
2436
2436
  dependencies = [
2437
- "bitflags 2.9.1",
2437
+ "bitflags 2.9.2",
2438
2438
  ]
2439
2439
 
2440
2440
  [[package]]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.118"
3
+ version = "0.0.120"
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)"
@@ -24,6 +24,7 @@ crate-type = ["cdylib", "rlib"]
24
24
  name = "rumdl"
25
25
  path = "src/main.rs"
26
26
 
27
+
27
28
  # Benchmark binaries - only built when explicitly requested
28
29
  [[bin]]
29
30
  name = "benchmark"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.118
3
+ Version: 0.0.120
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -1,4 +1,4 @@
1
- use crate::utils::code_block_utils::CodeBlockUtils;
1
+ use crate::utils::code_block_utils::{CodeBlockContext, CodeBlockUtils};
2
2
  use lazy_static::lazy_static;
3
3
  use regex::Regex;
4
4
 
@@ -1154,7 +1154,19 @@ impl<'a> LintContext<'a> {
1154
1154
 
1155
1155
  // Extract custom header ID if present
1156
1156
  let raw_text = text.trim().to_string();
1157
- let (clean_text, custom_id) = crate::utils::kramdown_utils::extract_header_id(&raw_text);
1157
+ let (clean_text, mut custom_id) = crate::utils::header_id_utils::extract_header_id(&raw_text);
1158
+
1159
+ // If no custom ID was found on the header line, check the next line for standalone attr-list
1160
+ if custom_id.is_none() && i + 1 < content_lines.len() && i + 1 < lines.len() {
1161
+ let next_line = content_lines[i + 1];
1162
+ if !lines[i + 1].in_code_block
1163
+ && crate::utils::header_id_utils::is_standalone_attr_list(next_line)
1164
+ && let Some(next_line_id) =
1165
+ crate::utils::header_id_utils::extract_standalone_attr_list_id(next_line)
1166
+ {
1167
+ custom_id = Some(next_line_id);
1168
+ }
1169
+ }
1158
1170
 
1159
1171
  lines[i].heading = Some(HeadingInfo {
1160
1172
  level,
@@ -1188,7 +1200,19 @@ impl<'a> LintContext<'a> {
1188
1200
 
1189
1201
  // Extract custom header ID if present
1190
1202
  let raw_text = line.trim().to_string();
1191
- let (clean_text, custom_id) = crate::utils::kramdown_utils::extract_header_id(&raw_text);
1203
+ let (clean_text, mut custom_id) = crate::utils::header_id_utils::extract_header_id(&raw_text);
1204
+
1205
+ // If no custom ID was found on the header line, check the line after underline for standalone attr-list
1206
+ if custom_id.is_none() && i + 2 < content_lines.len() && i + 2 < lines.len() {
1207
+ let attr_line = content_lines[i + 2];
1208
+ if !lines[i + 2].in_code_block
1209
+ && crate::utils::header_id_utils::is_standalone_attr_list(attr_line)
1210
+ && let Some(attr_line_id) =
1211
+ crate::utils::header_id_utils::extract_standalone_attr_list_id(attr_line)
1212
+ {
1213
+ custom_id = Some(attr_line_id);
1214
+ }
1215
+ }
1192
1216
 
1193
1217
  lines[i].heading = Some(HeadingInfo {
1194
1218
  level,
@@ -1328,31 +1352,37 @@ impl<'a> LintContext<'a> {
1328
1352
  for (line_idx, line_info) in lines.iter().enumerate() {
1329
1353
  let line_num = line_idx + 1;
1330
1354
 
1331
- // Handle code blocks - they should continue the list if properly indented
1355
+ // Enhanced code block handling using Design #3's context analysis
1332
1356
  if line_info.in_code_block {
1333
1357
  if let Some(ref mut block) = current_block {
1334
- // For code blocks to continue a list, they need to be indented
1335
- // at least 2 spaces beyond the list marker
1336
1358
  // Calculate minimum indentation for list continuation
1337
- // For ordered lists, use the last marker width (e.g., 3 for "1. ", 4 for "10. ")
1338
- // For unordered lists like "- ", content starts at column 2, so continuations need at least 2 spaces
1339
- let min_continuation_indent = if block.is_ordered {
1340
- current_indent_level + last_marker_width
1341
- } else {
1342
- current_indent_level + 2 // Unordered lists need at least 2 spaces (e.g., "- " = 2 chars)
1343
- };
1359
+ let min_continuation_indent = CodeBlockUtils::calculate_min_continuation_indent(lines, line_idx);
1344
1360
 
1345
- if line_info.indent >= min_continuation_indent {
1346
- // Code blocks at list continuation level should continue the list
1347
- block.end_line = line_num;
1348
- continue;
1361
+ // Analyze code block context using the three-tier classification
1362
+ let context = CodeBlockUtils::analyze_code_block_context(lines, line_idx, min_continuation_indent);
1363
+
1364
+ match context {
1365
+ CodeBlockContext::Indented => {
1366
+ // Code block is properly indented - continues the list
1367
+ block.end_line = line_num;
1368
+ continue;
1369
+ }
1370
+ CodeBlockContext::Standalone => {
1371
+ // Code block separates lists - end current block
1372
+ let completed_block = current_block.take().unwrap();
1373
+ list_blocks.push(completed_block);
1374
+ continue;
1375
+ }
1376
+ CodeBlockContext::Adjacent => {
1377
+ // Edge case - use conservative behavior (continue list)
1378
+ block.end_line = line_num;
1379
+ continue;
1380
+ }
1349
1381
  }
1382
+ } else {
1383
+ // No current list block - skip code block lines
1384
+ continue;
1350
1385
  }
1351
- // If we have a current block and hit a non-indented code block, end it
1352
- if let Some(block) = current_block.take() {
1353
- list_blocks.push(block);
1354
- }
1355
- continue;
1356
1386
  }
1357
1387
 
1358
1388
  // Extract blockquote prefix if any
@@ -1385,17 +1415,18 @@ impl<'a> LintContext<'a> {
1385
1415
  // Check if there's non-list content between the last item and this one
1386
1416
  let has_non_list_content = {
1387
1417
  let mut found_non_list = false;
1388
- for check_line in (last_list_item_line + 1)..line_num {
1418
+ // Use the last item from the current block, not the global last_list_item_line
1419
+ let block_last_item_line = block.item_lines.last().copied().unwrap_or(block.end_line);
1420
+ for check_line in (block_last_item_line + 1)..line_num {
1389
1421
  let check_idx = check_line - 1;
1390
1422
  if check_idx < lines.len() {
1391
1423
  let check_info = &lines[check_idx];
1392
- if !check_info.is_blank && !check_info.in_code_block && check_info.list_item.is_none() {
1393
- // Found non-blank, non-list content
1394
- // Check if it's indented enough to be a continuation
1395
- // Get the marker width of the last list item
1424
+ // Check for content that breaks the list
1425
+ let is_list_breaking_content = if check_info.in_code_block {
1426
+ // Use enhanced code block classification for list separation
1396
1427
  let last_item_marker_width =
1397
- if last_list_item_line > 0 && last_list_item_line <= lines.len() {
1398
- lines[last_list_item_line - 1]
1428
+ if block_last_item_line > 0 && block_last_item_line <= lines.len() {
1429
+ lines[block_last_item_line - 1]
1399
1430
  .list_item
1400
1431
  .as_ref()
1401
1432
  .map(|li| {
@@ -1411,11 +1442,61 @@ impl<'a> LintContext<'a> {
1411
1442
  };
1412
1443
 
1413
1444
  let min_continuation = if block.is_ordered { last_item_marker_width } else { 2 };
1414
- if check_info.indent < min_continuation {
1415
- // Not indented enough, so it breaks the list
1416
- found_non_list = true;
1417
- break;
1445
+
1446
+ // Analyze code block context using our enhanced classification
1447
+ let context = CodeBlockUtils::analyze_code_block_context(
1448
+ lines,
1449
+ check_line - 1,
1450
+ min_continuation,
1451
+ );
1452
+
1453
+ // Standalone code blocks break lists, indented ones continue them
1454
+ matches!(context, CodeBlockContext::Standalone)
1455
+ } else if !check_info.is_blank && check_info.list_item.is_none() {
1456
+ // Check for structural separators that should break lists (from issue #42)
1457
+ let line_content = check_info.content.trim();
1458
+
1459
+ // Any of these structural separators break lists
1460
+ if check_info.heading.is_some()
1461
+ || line_content.starts_with("---")
1462
+ || line_content.starts_with("***")
1463
+ || line_content.starts_with("___")
1464
+ || line_content.contains('|')
1465
+ || line_content.starts_with(">")
1466
+ {
1467
+ true
1468
+ }
1469
+ // Other non-list content - check if properly indented
1470
+ else {
1471
+ let last_item_marker_width =
1472
+ if block_last_item_line > 0 && block_last_item_line <= lines.len() {
1473
+ lines[block_last_item_line - 1]
1474
+ .list_item
1475
+ .as_ref()
1476
+ .map(|li| {
1477
+ if li.is_ordered {
1478
+ li.marker.len() + 1 // Add 1 for the space after ordered list markers
1479
+ } else {
1480
+ li.marker.len()
1481
+ }
1482
+ })
1483
+ .unwrap_or(3) // fallback to 3 if no list item found
1484
+ } else {
1485
+ 3 // fallback
1486
+ };
1487
+
1488
+ let min_continuation =
1489
+ if block.is_ordered { last_item_marker_width } else { 2 };
1490
+ check_info.indent < min_continuation
1418
1491
  }
1492
+ } else {
1493
+ false
1494
+ };
1495
+
1496
+ if is_list_breaking_content {
1497
+ // Not indented enough, so it breaks the list
1498
+ found_non_list = true;
1499
+ break;
1419
1500
  }
1420
1501
  }
1421
1502
  }
@@ -1550,8 +1631,9 @@ impl<'a> LintContext<'a> {
1550
1631
  && item.is_ordered == block.is_ordered
1551
1632
  && block.blockquote_prefix.trim() == next_blockquote_prefix.trim()
1552
1633
  {
1553
- // Check if there was meaningful content between the list items
1554
- let has_meaningful_content = (line_idx + 1..check_idx).any(|idx| {
1634
+ // Check if there was meaningful content between the list items (unused now)
1635
+ // This variable is kept for potential future use but is currently replaced by has_structural_separators
1636
+ let _has_meaningful_content = (line_idx + 1..check_idx).any(|idx| {
1555
1637
  if let Some(between_line) = lines.get(idx) {
1556
1638
  let trimmed = between_line.content.trim();
1557
1639
  // Skip empty lines
@@ -1561,21 +1643,72 @@ impl<'a> LintContext<'a> {
1561
1643
  // Check for meaningful content
1562
1644
  let line_indent =
1563
1645
  between_line.content.len() - between_line.content.trim_start().len();
1564
- // Code fences or properly indented content
1565
- trimmed.starts_with("```")
1646
+
1647
+ // Structural separators (code fences, headings, etc.) are meaningful and should BREAK lists
1648
+ if trimmed.starts_with("```")
1566
1649
  || trimmed.starts_with("~~~")
1567
- || line_indent >= min_continuation_indent
1650
+ || trimmed.starts_with("---")
1651
+ || trimmed.starts_with("***")
1652
+ || trimmed.starts_with("___")
1653
+ || trimmed.starts_with(">")
1654
+ || trimmed.contains('|') // Tables
1655
+ || between_line.heading.is_some()
1656
+ {
1657
+ return true; // These are structural separators - meaningful content that breaks lists
1658
+ }
1659
+
1660
+ // Only properly indented content continues the list
1661
+ line_indent >= min_continuation_indent
1568
1662
  } else {
1569
1663
  false
1570
1664
  }
1571
1665
  });
1572
1666
 
1573
1667
  if block.is_ordered {
1574
- // For ordered lists: only continue if there's meaningful content
1575
- found_continuation = has_meaningful_content;
1668
+ // For ordered lists: don't continue if there are structural separators
1669
+ // Check if there are structural separators between the list items
1670
+ let has_structural_separators = (line_idx + 1..check_idx).any(|idx| {
1671
+ if let Some(between_line) = lines.get(idx) {
1672
+ let trimmed = between_line.content.trim();
1673
+ if trimmed.is_empty() {
1674
+ return false;
1675
+ }
1676
+ // Check for structural separators that break lists
1677
+ trimmed.starts_with("```")
1678
+ || trimmed.starts_with("~~~")
1679
+ || trimmed.starts_with("---")
1680
+ || trimmed.starts_with("***")
1681
+ || trimmed.starts_with("___")
1682
+ || trimmed.starts_with(">")
1683
+ || trimmed.contains('|') // Tables
1684
+ || between_line.heading.is_some()
1685
+ } else {
1686
+ false
1687
+ }
1688
+ });
1689
+ found_continuation = !has_structural_separators;
1576
1690
  } else {
1577
- // For unordered lists: continue regardless
1578
- found_continuation = true;
1691
+ // For unordered lists: also check for structural separators
1692
+ let has_structural_separators = (line_idx + 1..check_idx).any(|idx| {
1693
+ if let Some(between_line) = lines.get(idx) {
1694
+ let trimmed = between_line.content.trim();
1695
+ if trimmed.is_empty() {
1696
+ return false;
1697
+ }
1698
+ // Check for structural separators that break lists
1699
+ trimmed.starts_with("```")
1700
+ || trimmed.starts_with("~~~")
1701
+ || trimmed.starts_with("---")
1702
+ || trimmed.starts_with("***")
1703
+ || trimmed.starts_with("___")
1704
+ || trimmed.starts_with(">")
1705
+ || trimmed.contains('|') // Tables
1706
+ || between_line.heading.is_some()
1707
+ } else {
1708
+ false
1709
+ }
1710
+ });
1711
+ found_continuation = !has_structural_separators;
1579
1712
  }
1580
1713
  }
1581
1714
  }
@@ -1601,8 +1734,19 @@ impl<'a> LintContext<'a> {
1601
1734
  // For lazy continuation to apply, the line must either:
1602
1735
  // 1. Have no indentation (true lazy continuation)
1603
1736
  // 2. Have sufficient indentation for the list type
1737
+ // BUT structural separators (headings, code blocks, etc.) should never be lazy continuations
1738
+ let line_content = line_info.content.trim();
1739
+ let is_structural_separator = line_info.heading.is_some()
1740
+ || line_content.starts_with("```")
1741
+ || line_content.starts_with("~~~")
1742
+ || line_content.starts_with("---")
1743
+ || line_content.starts_with("***")
1744
+ || line_content.starts_with("___")
1745
+ || line_content.starts_with(">")
1746
+ || line_content.contains('|'); // Tables
1747
+
1604
1748
  let is_lazy_continuation = last_list_item_line == line_num - 1
1605
- && line_info.heading.is_none()
1749
+ && !is_structural_separator
1606
1750
  && !line_info.is_blank
1607
1751
  && (line_info.indent == 0 || line_info.indent >= min_required_indent);
1608
1752
 
@@ -2051,14 +2195,25 @@ impl<'a> ListBlockMerger<'a> {
2051
2195
 
2052
2196
  /// Check if unordered lists can be merged with a single blank line between
2053
2197
  fn can_merge_with_blank_between(&self, current: &ListBlock, next: &ListBlock) -> bool {
2198
+ // Check if there are structural separators between the blocks
2199
+ // If has_meaningful_content_between returns true, it means there are structural separators
2200
+ if has_meaningful_content_between(current, next, self.lines) {
2201
+ return false; // Structural separators prevent merging
2202
+ }
2203
+
2054
2204
  // Only merge unordered lists with same marker across single blank
2055
2205
  !current.is_ordered && current.marker == next.marker
2056
2206
  }
2057
2207
 
2058
2208
  /// Check if ordered lists can be merged when there's content between them
2059
2209
  fn can_merge_with_content_between(&self, current: &ListBlock, next: &ListBlock) -> bool {
2060
- // Only consider merging ordered lists with meaningful content between
2061
- current.is_ordered && next.is_ordered && has_meaningful_content_between(current, next, self.lines)
2210
+ // Do not merge lists if there are structural separators between them
2211
+ if has_meaningful_content_between(current, next, self.lines) {
2212
+ return false; // Structural separators prevent merging
2213
+ }
2214
+
2215
+ // Only consider merging ordered lists if there's no structural content between
2216
+ current.is_ordered && next.is_ordered
2062
2217
  }
2063
2218
 
2064
2219
  /// Check if there are only blank lines between blocks
@@ -2117,33 +2272,90 @@ fn has_meaningful_content_between(current: &ListBlock, next: &ListBlock, lines:
2117
2272
  continue;
2118
2273
  }
2119
2274
 
2275
+ // Check for structural separators that should separate lists (CommonMark compliant)
2276
+
2277
+ // Headings separate lists
2278
+ if line_info.heading.is_some() {
2279
+ return true; // Has meaningful content - headings separate lists
2280
+ }
2281
+
2282
+ // Horizontal rules separate lists (---, ***, ___)
2283
+ if is_horizontal_rule(trimmed) {
2284
+ return true; // Has meaningful content - horizontal rules separate lists
2285
+ }
2286
+
2287
+ // Tables separate lists (lines containing |)
2288
+ if trimmed.contains('|') && trimmed.len() > 1 {
2289
+ return true; // Has meaningful content - tables separate lists
2290
+ }
2291
+
2292
+ // Blockquotes separate lists
2293
+ if trimmed.starts_with('>') {
2294
+ return true; // Has meaningful content - blockquotes separate lists
2295
+ }
2296
+
2297
+ // Code block fences separate lists (unless properly indented as list content)
2298
+ if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
2299
+ let line_indent = line_info.content.len() - line_info.content.trim_start().len();
2300
+
2301
+ // Check if this code block is properly indented as list continuation
2302
+ let min_continuation_indent = if current.is_ordered {
2303
+ current.nesting_level + current.max_marker_width
2304
+ } else {
2305
+ current.nesting_level + 2
2306
+ };
2307
+
2308
+ if line_indent < min_continuation_indent {
2309
+ // This is a standalone code block that separates lists
2310
+ return true; // Has meaningful content - standalone code blocks separate lists
2311
+ }
2312
+ }
2313
+
2120
2314
  // Check if this line has proper indentation for list continuation
2121
2315
  let line_indent = line_info.content.len() - line_info.content.trim_start().len();
2122
2316
 
2123
- // If the line is indented enough to be list continuation content, it's meaningful
2124
- // For ordered lists, use actual marker width; for unordered, 2 spaces
2317
+ // Calculate minimum indentation needed to be list continuation
2125
2318
  let min_indent = if current.is_ordered {
2126
2319
  current.nesting_level + current.max_marker_width
2127
2320
  } else {
2128
2321
  current.nesting_level + 2
2129
2322
  };
2130
2323
 
2131
- // Check if the line has sufficient indentation to be a continuation
2132
- if line_indent >= min_indent {
2133
- return true;
2324
+ // If the line is not indented enough to be list continuation, it's meaningful content
2325
+ if line_indent < min_indent {
2326
+ return true; // Has meaningful content - content not indented as list continuation
2134
2327
  }
2135
2328
 
2136
- // Code fences are meaningful content
2137
- if trimmed.starts_with("```") || trimmed.starts_with("~~~") {
2138
- return true;
2139
- }
2140
-
2141
- // Any other non-blank content at this level breaks the sequence
2142
- return false;
2329
+ // If we reach here, the line is properly indented as list continuation
2330
+ // Continue checking other lines
2143
2331
  }
2144
2332
  }
2145
2333
 
2146
- // Only blank lines between blocks - should not merge
2334
+ // Only blank lines or properly indented list continuation content between blocks
2335
+ false
2336
+ }
2337
+
2338
+ /// Check if a line is a horizontal rule (---, ***, ___)
2339
+ fn is_horizontal_rule(trimmed: &str) -> bool {
2340
+ if trimmed.len() < 3 {
2341
+ return false;
2342
+ }
2343
+
2344
+ // Check for three or more consecutive -, *, or _ characters (with optional spaces)
2345
+ let chars: Vec<char> = trimmed.chars().collect();
2346
+ if let Some(&first_char) = chars.first()
2347
+ && (first_char == '-' || first_char == '*' || first_char == '_')
2348
+ {
2349
+ let mut count = 0;
2350
+ for &ch in &chars {
2351
+ if ch == first_char {
2352
+ count += 1;
2353
+ } else if ch != ' ' && ch != '\t' {
2354
+ return false; // Non-matching, non-whitespace character
2355
+ }
2356
+ }
2357
+ return count >= 3;
2358
+ }
2147
2359
  false
2148
2360
  }
2149
2361
 
@@ -5,7 +5,7 @@ use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severi
5
5
  use crate::rule_config_serde::RuleConfig;
6
6
  use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
7
7
  use crate::utils::element_cache::{ElementCache, ListMarkerType};
8
- use crate::utils::regex_cache::{CODE_FENCE_REGEX, UNORDERED_LIST_MARKER_REGEX};
8
+ use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
9
9
  use toml;
10
10
 
11
11
  mod md007_config;
@@ -69,30 +69,6 @@ impl MD007ULIndent {
69
69
  }
70
70
  (false, None)
71
71
  }
72
-
73
- #[allow(dead_code)]
74
- fn is_in_code_block(content: &str, line_idx: usize) -> bool {
75
- // Use centralized code fence pattern
76
-
77
- let lines: Vec<&str> = content.lines().collect();
78
- let mut in_code_block = false;
79
-
80
- for (i, line) in lines.iter().enumerate() {
81
- if i > line_idx {
82
- break;
83
- }
84
-
85
- if CODE_FENCE_REGEX.is_match(line.trim_start()) {
86
- in_code_block = !in_code_block;
87
- }
88
-
89
- if i == line_idx {
90
- return in_code_block;
91
- }
92
- }
93
-
94
- false
95
- }
96
72
  }
97
73
 
98
74
  impl Rule for MD007ULIndent {