rumdl 0.0.104__tar.gz → 0.0.105__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 (368) hide show
  1. {rumdl-0.0.104 → rumdl-0.0.105}/.pre-commit-config.yaml +1 -1
  2. {rumdl-0.0.104 → rumdl-0.0.105}/CHANGELOG.md +4 -1
  3. {rumdl-0.0.104 → rumdl-0.0.105}/Cargo.lock +7 -7
  4. {rumdl-0.0.104 → rumdl-0.0.105}/Cargo.toml +1 -1
  5. {rumdl-0.0.104 → rumdl-0.0.105}/PKG-INFO +1 -1
  6. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md013.md +21 -1
  7. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md033.md +17 -2
  8. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md044.md +2 -0
  9. {rumdl-0.0.104 → rumdl-0.0.105}/src/lint_context.rs +93 -11
  10. {rumdl-0.0.104 → rumdl-0.0.105}/src/main.rs +6 -3
  11. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md027_multiple_spaces_blockquote.rs +106 -30
  12. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/range_utils.rs +51 -1
  13. rumdl-0.0.105/src/vscode.rs +613 -0
  14. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/list_rules_integration_test.rs +6 -2
  15. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md029_test.rs +256 -0
  16. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md044_test.rs +24 -0
  17. {rumdl-0.0.104 → rumdl-0.0.105}/tests/vscode_test.rs +1 -1
  18. {rumdl-0.0.104 → rumdl-0.0.105}/tests/vscode_tests.rs +8 -3
  19. rumdl-0.0.104/src/vscode.rs +0 -349
  20. {rumdl-0.0.104 → rumdl-0.0.105}/.config/nextest.toml +0 -0
  21. {rumdl-0.0.104 → rumdl-0.0.105}/.mise.toml +0 -0
  22. {rumdl-0.0.104 → rumdl-0.0.105}/.rumdl.toml +0 -0
  23. {rumdl-0.0.104 → rumdl-0.0.105}/.rustfmt.toml +0 -0
  24. {rumdl-0.0.104 → rumdl-0.0.105}/LICENSE +0 -0
  25. {rumdl-0.0.104 → rumdl-0.0.105}/MANIFEST.in +0 -0
  26. {rumdl-0.0.104 → rumdl-0.0.105}/Makefile +0 -0
  27. {rumdl-0.0.104 → rumdl-0.0.105}/README.md +0 -0
  28. {rumdl-0.0.104 → rumdl-0.0.105}/assets/logo.png +0 -0
  29. {rumdl-0.0.104 → rumdl-0.0.105}/benches/fix_performance.rs +0 -0
  30. {rumdl-0.0.104 → rumdl-0.0.105}/benches/range_performance.rs +0 -0
  31. {rumdl-0.0.104 → rumdl-0.0.105}/benches/range_utils_benchmark.rs +0 -0
  32. {rumdl-0.0.104 → rumdl-0.0.105}/benches/rule_performance.rs +0 -0
  33. {rumdl-0.0.104 → rumdl-0.0.105}/benches/simple_fix_bench.rs +0 -0
  34. {rumdl-0.0.104 → rumdl-0.0.105}/docs/RULES.md +0 -0
  35. {rumdl-0.0.104 → rumdl-0.0.105}/docs/global-settings.md +0 -0
  36. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md001.md +0 -0
  37. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md002.md +0 -0
  38. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md003.md +0 -0
  39. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md004.md +0 -0
  40. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md005.md +0 -0
  41. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md006.md +0 -0
  42. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md007.md +0 -0
  43. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md009.md +0 -0
  44. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md010.md +0 -0
  45. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md011.md +0 -0
  46. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md012.md +0 -0
  47. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md014.md +0 -0
  48. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md018.md +0 -0
  49. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md019.md +0 -0
  50. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md020.md +0 -0
  51. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md021.md +0 -0
  52. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md022.md +0 -0
  53. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md023.md +0 -0
  54. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md024.md +0 -0
  55. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md025.md +0 -0
  56. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md026.md +0 -0
  57. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md027.md +0 -0
  58. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md028.md +0 -0
  59. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md029.md +0 -0
  60. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md030.md +0 -0
  61. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md031.md +0 -0
  62. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md032.md +0 -0
  63. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md034.md +0 -0
  64. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md035.md +0 -0
  65. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md036.md +0 -0
  66. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md037.md +0 -0
  67. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md038.md +0 -0
  68. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md039.md +0 -0
  69. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md040.md +0 -0
  70. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md041.md +0 -0
  71. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md042.md +0 -0
  72. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md043.md +0 -0
  73. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md045.md +0 -0
  74. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md046.md +0 -0
  75. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md047.md +0 -0
  76. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md048.md +0 -0
  77. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md049.md +0 -0
  78. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md050.md +0 -0
  79. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md051.md +0 -0
  80. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md052.md +0 -0
  81. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md053.md +0 -0
  82. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md054.md +0 -0
  83. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md055.md +0 -0
  84. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md056.md +0 -0
  85. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md057.md +0 -0
  86. {rumdl-0.0.104 → rumdl-0.0.105}/docs/md058.md +0 -0
  87. {rumdl-0.0.104 → rumdl-0.0.105}/docs/vscode-extension.md +0 -0
  88. {rumdl-0.0.104 → rumdl-0.0.105}/parity_check.py +0 -0
  89. {rumdl-0.0.104 → rumdl-0.0.105}/pyproject.toml +0 -0
  90. {rumdl-0.0.104 → rumdl-0.0.105}/python/MANIFEST.in +0 -0
  91. {rumdl-0.0.104 → rumdl-0.0.105}/python/PYTHON-README.md +0 -0
  92. {rumdl-0.0.104 → rumdl-0.0.105}/python/rumdl/__init__.py +0 -0
  93. {rumdl-0.0.104 → rumdl-0.0.105}/python/rumdl/__main__.py +0 -0
  94. {rumdl-0.0.104 → rumdl-0.0.105}/python/rumdl/py.typed +0 -0
  95. {rumdl-0.0.104 → rumdl-0.0.105}/rumdl.toml.example +0 -0
  96. {rumdl-0.0.104 → rumdl-0.0.105}/rust-toolchain.toml +0 -0
  97. {rumdl-0.0.104 → rumdl-0.0.105}/scripts/extract-changelog.sh +0 -0
  98. {rumdl-0.0.104 → rumdl-0.0.105}/scripts/prepare-release.sh +0 -0
  99. {rumdl-0.0.104 → rumdl-0.0.105}/scripts/setup-pre-commit.sh +0 -0
  100. {rumdl-0.0.104 → rumdl-0.0.105}/scripts/update-pre-commit-docs.sh +0 -0
  101. {rumdl-0.0.104 → rumdl-0.0.105}/src/bin/bench_lint_context.rs +0 -0
  102. {rumdl-0.0.104 → rumdl-0.0.105}/src/bin/benchmark.rs +0 -0
  103. {rumdl-0.0.104 → rumdl-0.0.105}/src/bin/benchmark_rule.rs +0 -0
  104. {rumdl-0.0.104 → rumdl-0.0.105}/src/bin/file_parallel_benchmark.rs +0 -0
  105. {rumdl-0.0.104 → rumdl-0.0.105}/src/bin/measure_code_span_performance.rs +0 -0
  106. {rumdl-0.0.104 → rumdl-0.0.105}/src/config.rs +0 -0
  107. {rumdl-0.0.104 → rumdl-0.0.105}/src/exit_codes.rs +0 -0
  108. {rumdl-0.0.104 → rumdl-0.0.105}/src/init.rs +0 -0
  109. {rumdl-0.0.104 → rumdl-0.0.105}/src/inline_config.rs +0 -0
  110. {rumdl-0.0.104 → rumdl-0.0.105}/src/lib.rs +0 -0
  111. {rumdl-0.0.104 → rumdl-0.0.105}/src/lsp/mod.rs +0 -0
  112. {rumdl-0.0.104 → rumdl-0.0.105}/src/lsp/server.rs +0 -0
  113. {rumdl-0.0.104 → rumdl-0.0.105}/src/lsp/types.rs +0 -0
  114. {rumdl-0.0.104 → rumdl-0.0.105}/src/markdownlint_config.rs +0 -0
  115. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/azure.rs +0 -0
  116. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/concise.rs +0 -0
  117. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/github.rs +0 -0
  118. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/gitlab.rs +0 -0
  119. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/grouped.rs +0 -0
  120. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/json.rs +0 -0
  121. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/json_lines.rs +0 -0
  122. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/junit.rs +0 -0
  123. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/mod.rs +0 -0
  124. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/pylint.rs +0 -0
  125. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/sarif.rs +0 -0
  126. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/formatters/text.rs +0 -0
  127. {rumdl-0.0.104 → rumdl-0.0.105}/src/output/mod.rs +0 -0
  128. {rumdl-0.0.104 → rumdl-0.0.105}/src/parallel.rs +0 -0
  129. {rumdl-0.0.104 → rumdl-0.0.105}/src/performance.rs +0 -0
  130. {rumdl-0.0.104 → rumdl-0.0.105}/src/profiling.rs +0 -0
  131. {rumdl-0.0.104 → rumdl-0.0.105}/src/python.rs +0 -0
  132. {rumdl-0.0.104 → rumdl-0.0.105}/src/rule.rs +0 -0
  133. {rumdl-0.0.104 → rumdl-0.0.105}/src/rule_config.rs +0 -0
  134. {rumdl-0.0.104 → rumdl-0.0.105}/src/rule_config_serde.rs +0 -0
  135. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/blockquote_utils.rs +0 -0
  136. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/code_block_utils.rs +0 -0
  137. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/code_fence_utils.rs +0 -0
  138. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/emphasis_style.rs +0 -0
  139. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/front_matter_utils.rs +0 -0
  140. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/heading_utils.rs +0 -0
  141. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/list_utils.rs +0 -0
  142. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md001_heading_increment.rs +0 -0
  143. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  144. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md002_first_heading_h1.rs +0 -0
  145. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md003_heading_style/md003_config.rs +0 -0
  146. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md003_heading_style.rs +0 -0
  147. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  148. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md004_unordered_list_style.rs +0 -0
  149. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md005_list_indent.rs +0 -0
  150. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md006_start_bullets.rs +0 -0
  151. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  152. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md007_ul_indent.rs +0 -0
  153. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  154. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md009_trailing_spaces.rs +0 -0
  155. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  156. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md010_no_hard_tabs.rs +0 -0
  157. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md011_no_reversed_links.rs +0 -0
  158. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  159. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md012_no_multiple_blanks.rs +0 -0
  160. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md013_line_length/md013_config.rs +0 -0
  161. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md013_line_length.rs +0 -0
  162. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  163. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md014_commands_show_output.rs +0 -0
  164. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md018_no_missing_space_atx.rs +0 -0
  165. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  166. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  167. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  168. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  169. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md022_blanks_around_headings.rs +0 -0
  170. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md023_heading_start_left.rs +0 -0
  171. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  172. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md024_no_duplicate_heading.rs +0 -0
  173. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md025_single_title/md025_config.rs +0 -0
  174. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md025_single_title.rs +0 -0
  175. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  176. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  177. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  178. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  179. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md029_ordered_list_prefix.rs +0 -0
  180. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  181. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md030_list_marker_space.rs +0 -0
  182. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md031_blanks_around_fences.rs +0 -0
  183. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md032_blanks_around_lists.rs +0 -0
  184. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  185. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md033_no_inline_html.rs +0 -0
  186. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md034_no_bare_urls.rs +0 -0
  187. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md035_hr_style/md035_config.rs +0 -0
  188. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md035_hr_style.rs +0 -0
  189. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  190. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  191. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  192. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md038_no_space_in_code.rs +0 -0
  193. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md039_no_space_in_links.rs +0 -0
  194. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md040_fenced_code_language.rs +0 -0
  195. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md041_first_line_heading.rs +0 -0
  196. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md042_no_empty_links.rs +0 -0
  197. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md043_required_headings.rs +0 -0
  198. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md044_proper_names/md044_config.rs +0 -0
  199. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md044_proper_names.rs +0 -0
  200. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  201. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md045_no_alt_text.rs +0 -0
  202. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  203. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md046_code_block_style.rs +0 -0
  204. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md047_single_trailing_newline.rs +0 -0
  205. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  206. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md048_code_fence_style.rs +0 -0
  207. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  208. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md049_emphasis_style.rs +0 -0
  209. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md050_strong_style/md050_config.rs +0 -0
  210. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md050_strong_style.rs +0 -0
  211. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md051_link_fragments.rs +0 -0
  212. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md052_reference_links_images.rs +0 -0
  213. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  214. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  215. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md054_link_image_style.rs +0 -0
  216. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  217. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md055_table_pipe_style.rs +0 -0
  218. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md056_table_column_count.rs +0 -0
  219. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  220. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md057_existing_relative_links.rs +0 -0
  221. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/md058_blanks_around_tables.rs +0 -0
  222. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/mod.rs +0 -0
  223. {rumdl-0.0.104 → rumdl-0.0.105}/src/rules/strong_style.rs +0 -0
  224. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/ast_utils.rs +0 -0
  225. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/code_block_utils.rs +0 -0
  226. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/document_structure.rs +0 -0
  227. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/early_returns.rs +0 -0
  228. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/element_cache.rs +0 -0
  229. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/emphasis_utils.rs +0 -0
  230. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/fix_utils.rs +0 -0
  231. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/markdown_elements.rs +0 -0
  232. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/mod.rs +0 -0
  233. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/regex_cache.rs +0 -0
  234. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/string_interner.rs +0 -0
  235. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/table_utils.rs +0 -0
  236. {rumdl-0.0.104 → rumdl-0.0.105}/src/utils/text_reflow.rs +0 -0
  237. {rumdl-0.0.104 → rumdl-0.0.105}/tests/advanced_integration_tests.rs +0 -0
  238. {rumdl-0.0.104 → rumdl-0.0.105}/tests/character_ranges/additional_tests.rs +0 -0
  239. {rumdl-0.0.104 → rumdl-0.0.105}/tests/character_ranges/basic_tests.rs +0 -0
  240. {rumdl-0.0.104 → rumdl-0.0.105}/tests/character_ranges/comprehensive_tests.rs +0 -0
  241. {rumdl-0.0.104 → rumdl-0.0.105}/tests/character_ranges/extended_tests.rs +0 -0
  242. {rumdl-0.0.104 → rumdl-0.0.105}/tests/character_ranges/mod.rs +0 -0
  243. {rumdl-0.0.104 → rumdl-0.0.105}/tests/character_ranges/unicode_utils.rs +0 -0
  244. {rumdl-0.0.104 → rumdl-0.0.105}/tests/cli_duplication_test.rs +0 -0
  245. {rumdl-0.0.104 → rumdl-0.0.105}/tests/cli_explain_test.rs +0 -0
  246. {rumdl-0.0.104 → rumdl-0.0.105}/tests/cli_flag_precedence_test.rs +0 -0
  247. {rumdl-0.0.104 → rumdl-0.0.105}/tests/cli_integration_tests.rs +0 -0
  248. {rumdl-0.0.104 → rumdl-0.0.105}/tests/cli_lsp_fix_consistency.rs +0 -0
  249. {rumdl-0.0.104 → rumdl-0.0.105}/tests/cli_statistics_test.rs +0 -0
  250. {rumdl-0.0.104 → rumdl-0.0.105}/tests/commonmark_compliance_tests.rs +0 -0
  251. {rumdl-0.0.104 → rumdl-0.0.105}/tests/comprehensive_integration_tests.rs +0 -0
  252. {rumdl-0.0.104 → rumdl-0.0.105}/tests/comprehensive_output_format_tests.rs +0 -0
  253. {rumdl-0.0.104 → rumdl-0.0.105}/tests/config_application_tests.rs +0 -0
  254. {rumdl-0.0.104 → rumdl-0.0.105}/tests/config_file_command_test.rs +0 -0
  255. {rumdl-0.0.104 → rumdl-0.0.105}/tests/config_tests.rs +0 -0
  256. {rumdl-0.0.104 → rumdl-0.0.105}/tests/configuration_inheritance_tests.rs +0 -0
  257. {rumdl-0.0.104 → rumdl-0.0.105}/tests/consistency_regression_tests.rs +0 -0
  258. {rumdl-0.0.104 → rumdl-0.0.105}/tests/cross_platform_compatibility_tests.rs +0 -0
  259. {rumdl-0.0.104 → rumdl-0.0.105}/tests/deeply_nested_lists_performance_test.rs +0 -0
  260. {rumdl-0.0.104 → rumdl-0.0.105}/tests/escaped_brackets_test.rs +0 -0
  261. {rumdl-0.0.104 → rumdl-0.0.105}/tests/final_confidence_assessment.rs +0 -0
  262. {rumdl-0.0.104 → rumdl-0.0.105}/tests/init_command_test.rs +0 -0
  263. {rumdl-0.0.104 → rumdl-0.0.105}/tests/init_tests.rs +0 -0
  264. {rumdl-0.0.104 → rumdl-0.0.105}/tests/inline_config_blocks_test.rs +0 -0
  265. {rumdl-0.0.104 → rumdl-0.0.105}/tests/inline_config_test.rs +0 -0
  266. {rumdl-0.0.104 → rumdl-0.0.105}/tests/integration_tests.rs +0 -0
  267. {rumdl-0.0.104 → rumdl-0.0.105}/tests/json_output_test.rs +0 -0
  268. {rumdl-0.0.104 → rumdl-0.0.105}/tests/lib.rs +0 -0
  269. {rumdl-0.0.104 → rumdl-0.0.105}/tests/lsp_editor_integration_tests.rs +0 -0
  270. {rumdl-0.0.104 → rumdl-0.0.105}/tests/lsp_integration_tests.rs +0 -0
  271. {rumdl-0.0.104 → rumdl-0.0.105}/tests/lsp_memory_leak_tests.rs +0 -0
  272. {rumdl-0.0.104 → rumdl-0.0.105}/tests/lsp_tests.rs +0 -0
  273. {rumdl-0.0.104 → rumdl-0.0.105}/tests/malformed_markdown_stress_tests.rs +0 -0
  274. {rumdl-0.0.104 → rumdl-0.0.105}/tests/markdownlint_cli_integration.rs +0 -0
  275. {rumdl-0.0.104 → rumdl-0.0.105}/tests/markdownlint_config_test.rs +0 -0
  276. {rumdl-0.0.104 → rumdl-0.0.105}/tests/markdownlintignore_test.rs +0 -0
  277. {rumdl-0.0.104 → rumdl-0.0.105}/tests/md013_reflow_integration_test.rs +0 -0
  278. {rumdl-0.0.104 → rumdl-0.0.105}/tests/nested_code_block_test.rs +0 -0
  279. {rumdl-0.0.104 → rumdl-0.0.105}/tests/output_format_integration_tests.rs +0 -0
  280. {rumdl-0.0.104 → rumdl-0.0.105}/tests/output_format_tests.rs +0 -0
  281. {rumdl-0.0.104 → rumdl-0.0.105}/tests/perf_check.rs +0 -0
  282. {rumdl-0.0.104 → rumdl-0.0.105}/tests/performance_validation_tests.rs +0 -0
  283. {rumdl-0.0.104 → rumdl-0.0.105}/tests/pyproject_config_tests.rs +0 -0
  284. {rumdl-0.0.104 → rumdl-0.0.105}/tests/python_bindings_test.rs +0 -0
  285. {rumdl-0.0.104 → rumdl-0.0.105}/tests/real_world_repository_tests.rs +0 -0
  286. {rumdl-0.0.104 → rumdl-0.0.105}/tests/regression_prevention_tests.rs +0 -0
  287. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  288. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/heading_edge_cases_test.rs +0 -0
  289. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  290. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/link_edge_cases_test.rs +0 -0
  291. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md001_test.rs +0 -0
  292. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md001_unicode_test.rs +0 -0
  293. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md002_test.rs +0 -0
  294. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md003_test.rs +0 -0
  295. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md004_test.rs +0 -0
  296. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md005_test.rs +0 -0
  297. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md005_unicode_test.rs +0 -0
  298. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md006_test.rs +0 -0
  299. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md006_unicode_test.rs +0 -0
  300. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md007_test.rs +0 -0
  301. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md009_test.rs +0 -0
  302. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md010_test.rs +0 -0
  303. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md011_test.rs +0 -0
  304. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md012_test.rs +0 -0
  305. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md013_test.rs +0 -0
  306. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md014_test.rs +0 -0
  307. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md018_test.rs +0 -0
  308. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md019_test.rs +0 -0
  309. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md020_test.rs +0 -0
  310. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md021_test.rs +0 -0
  311. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md022_test.rs +0 -0
  312. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md023_extended_test.rs +0 -0
  313. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md023_test.rs +0 -0
  314. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md024_test.rs +0 -0
  315. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md025_test.rs +0 -0
  316. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md026_test.rs +0 -0
  317. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md027_test.rs +0 -0
  318. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md028_test.rs +0 -0
  319. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md029_unicode_test.rs +0 -0
  320. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md030_test.rs +0 -0
  321. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md031_test.rs +0 -0
  322. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md032_test.rs +0 -0
  323. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md033_extended_test.rs +0 -0
  324. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md033_test.rs +0 -0
  325. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md034_ipv6_test.rs +0 -0
  326. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md034_test.rs +0 -0
  327. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md035_test.rs +0 -0
  328. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md036_test.rs +0 -0
  329. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md037_test.rs +0 -0
  330. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md038_nested_backticks_test.rs +0 -0
  331. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md038_test.rs +0 -0
  332. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md039_test.rs +0 -0
  333. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md040_test.rs +0 -0
  334. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md041_test.rs +0 -0
  335. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md042_test.rs +0 -0
  336. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md043_test.rs +0 -0
  337. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md045_test.rs +0 -0
  338. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md046_test.rs +0 -0
  339. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md047_test.rs +0 -0
  340. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md048_test.rs +0 -0
  341. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md049_test.rs +0 -0
  342. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md050_test.rs +0 -0
  343. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md051_test.rs +0 -0
  344. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md051_unicode_test.rs +0 -0
  345. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md052_test.rs +0 -0
  346. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md053_additional_test.rs +0 -0
  347. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md053_proptest.rs +0 -0
  348. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md053_test.rs +0 -0
  349. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md054_test.rs +0 -0
  350. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md054_unicode_test.rs +0 -0
  351. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md055_test.rs +0 -0
  352. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md056_test.rs +0 -0
  353. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md057_test.rs +0 -0
  354. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/md058_test.rs +0 -0
  355. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules/mod.rs +0 -0
  356. {rumdl-0.0.104 → rumdl-0.0.105}/tests/rules_mod_test.rs +0 -0
  357. {rumdl-0.0.104 → rumdl-0.0.105}/tests/thread_safety_tests.rs +0 -0
  358. {rumdl-0.0.104 → rumdl-0.0.105}/tests/unicode_edge_case_tests.rs +0 -0
  359. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils/blockquote_utils_test.rs +0 -0
  360. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils/code_block_utils_extended_test.rs +0 -0
  361. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils/code_block_utils_test.rs +0 -0
  362. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils/core_utils_test.rs +0 -0
  363. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils/front_matter_utils_test.rs +0 -0
  364. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils/line_index_test.rs +0 -0
  365. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils/mod.rs +0 -0
  366. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils_markdown_edge_cases.rs +0 -0
  367. {rumdl-0.0.104 → rumdl-0.0.105}/tests/utils_tests.rs +0 -0
  368. {rumdl-0.0.104 → rumdl-0.0.105}/tests/vscode_extension_fixes.rs +0 -0
@@ -40,7 +40,7 @@ repos:
40
40
  rev: v4.6.0
41
41
  hooks:
42
42
  - id: trailing-whitespace
43
- exclude: \.md$
43
+ exclude: \.md$|tests/inline_config_test\.rs$
44
44
  - id: end-of-file-fixer
45
45
  exclude: \.md$
46
46
  - id: check-yaml
@@ -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.105] - 2025-08-05
11
+
10
12
  ## [0.0.104] - 2025-08-02
11
13
 
12
14
  ### Added
@@ -259,7 +261,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
259
261
 
260
262
  - Initial implementation of remaining rules for markdownlint parity
261
263
 
262
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.104...HEAD
264
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.105...HEAD
265
+ [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
263
266
  [0.0.104]: https://github.com/rvben/rumdl/compare/v0.0.103...v0.0.104
264
267
  [0.0.102]: https://github.com/rvben/rumdl/compare/v0.0.101...v0.0.102
265
268
  [0.0.101]: https://github.com/rvben/rumdl/compare/v0.0.100...v0.0.101
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1493
1493
 
1494
1494
  [[package]]
1495
1495
  name = "rumdl"
1496
- version = "0.0.104"
1496
+ version = "0.0.105"
1497
1497
  dependencies = [
1498
1498
  "anyhow",
1499
1499
  "assert_cmd",
@@ -1680,9 +1680,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1680
1680
 
1681
1681
  [[package]]
1682
1682
  name = "signal-hook-registry"
1683
- version = "1.4.5"
1683
+ version = "1.4.6"
1684
1684
  source = "registry+https://github.com/rust-lang/crates.io-index"
1685
- checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
1685
+ checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
1686
1686
  dependencies = [
1687
1687
  "libc",
1688
1688
  ]
@@ -1856,9 +1856,9 @@ dependencies = [
1856
1856
 
1857
1857
  [[package]]
1858
1858
  name = "tokio-util"
1859
- version = "0.7.15"
1859
+ version = "0.7.16"
1860
1860
  source = "registry+https://github.com/rust-lang/crates.io-index"
1861
- checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
1861
+ checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
1862
1862
  dependencies = [
1863
1863
  "bytes",
1864
1864
  "futures-core",
@@ -2527,9 +2527,9 @@ dependencies = [
2527
2527
 
2528
2528
  [[package]]
2529
2529
  name = "zerovec"
2530
- version = "0.11.2"
2530
+ version = "0.11.3"
2531
2531
  source = "registry+https://github.com/rust-lang/crates.io-index"
2532
- checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428"
2532
+ checksum = "bdbb9122ea75b11bf96e7492afb723e8a7fbe12c67417aa95e7e3d18144d37cd"
2533
2533
  dependencies = [
2534
2534
  "yoke",
2535
2535
  "zerofrom",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.104"
3
+ version = "0.0.105"
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.104
3
+ Version: 0.0.105
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -55,6 +55,7 @@ MD013:
55
55
  code_block_line_length: 150 # Different limit for code blocks (default: uses line_length)
56
56
  stern: false # Stricter checking without exceptions (default: false)
57
57
  strict: false # Disables exceptions for URLs, etc. (default: false)
58
+ enable_reflow: false # Enable automatic text reflow/wrapping (default: false)
58
59
  ```
59
60
 
60
61
  ### Configuration options explained
@@ -67,6 +68,7 @@ MD013:
67
68
  - `code_block_line_length`: Optional separate limit for code blocks
68
69
  - `stern`: When true, applies stricter checking without common exceptions
69
70
  - `strict`: When true, disables exceptions for URLs and other special content
71
+ - `enable_reflow`: When true, enables automatic text reflow to wrap long lines intelligently
70
72
 
71
73
  ### Example with different limits
72
74
 
@@ -98,7 +100,25 @@ def very_long_function_name_that_demonstrates_the_code_block_line_length_configu
98
100
 
99
101
  ## Automatic fixes
100
102
 
101
- This rule doesn't automatically fix long lines because breaking them requires understanding the content's meaning. You'll need to manually wrap lines at appropriate points.
103
+ When `enable_reflow` is set to `true`, this rule can automatically wrap long lines while preserving Markdown formatting:
104
+
105
+ - Intelligently breaks lines at appropriate points
106
+ - Preserves bold, italic, links, code spans, and other Markdown elements
107
+ - Maintains proper list continuation indentation
108
+ - Preserves hard line breaks (two trailing spaces)
109
+ - Does not wrap code blocks, tables, headings, or reference definitions
110
+
111
+ ### Example with automatic reflow
112
+
113
+ ```yaml
114
+ MD013:
115
+ line_length: 80
116
+ enable_reflow: true
117
+ ```
118
+
119
+ With this configuration, long lines will be automatically wrapped to fit within 80 characters while maintaining proper Markdown formatting.
120
+
121
+ **Note**: When `enable_reflow` is `false` (default), automatic fixes are not available and you'll need to manually wrap long lines.
102
122
 
103
123
  ## Learn more
104
124
 
@@ -58,7 +58,20 @@ This is a paragraph with <strong>bold</strong> and <em>italic</em> text.
58
58
 
59
59
  ### 🔧 Fixed
60
60
 
61
- This rule cannot automatically fix HTML tags because it can't always determine the equivalent Markdown syntax. You need to manually replace HTML with Markdown.
61
+ ```markdown
62
+ # Heading
63
+
64
+ This is a paragraph with **bold** and *italic* text.
65
+
66
+ > This is a quote
67
+
68
+ - List item 1
69
+ - List item 2
70
+
71
+ [Link text](https://example.com)
72
+
73
+ ![Image description](image.png)
74
+ ```
62
75
 
63
76
  ## Configuration
64
77
 
@@ -78,7 +91,9 @@ This would allow line breaks, horizontal rules, and collapsible sections while b
78
91
 
79
92
  ## Automatic fixes
80
93
 
81
- This rule does not provide automatic fixes. HTML must be manually converted to Markdown syntax.
94
+ This rule can automatically remove HTML tags when no allowed elements are configured. When specific tags are allowed via `allowed_elements`, those tags will be preserved while others are removed.
95
+
96
+ **Note**: The automatic fix removes HTML tags but does not convert them to Markdown equivalents. You may need to manually add appropriate Markdown formatting after the fix.
82
97
 
83
98
  ## What's allowed
84
99
 
@@ -62,6 +62,7 @@ MD044:
62
62
  - "npm" # Yes, npm is lowercase!
63
63
  code_blocks: false # Check inside code blocks (default: true)
64
64
  html_elements: true # Check inside HTML elements (default: true)
65
+ html_comments: true # Check inside HTML comments (default: true)
65
66
  ```
66
67
 
67
68
  ## Automatic fixes
@@ -76,6 +77,7 @@ When enabled, this rule will:
76
77
  - Only checks names you've configured
77
78
  - Won't check inside URLs or file paths
78
79
  - Respects `code_blocks` setting for technical documentation
80
+ - Respects `html_comments` setting for HTML comment content
79
81
  - Some names are intentionally lowercase (like "npm")
80
82
 
81
83
  ## Learn more
@@ -241,6 +241,8 @@ pub struct ListBlock {
241
241
  pub item_lines: Vec<usize>,
242
242
  /// Nesting level (0 for top-level lists)
243
243
  pub nesting_level: usize,
244
+ /// Maximum marker width seen in this block (e.g., 3 for "1. ", 4 for "10. ")
245
+ pub max_marker_width: usize,
244
246
  }
245
247
 
246
248
  use std::sync::{Arc, Mutex};
@@ -1072,7 +1074,8 @@ impl<'a> LintContext<'a> {
1072
1074
 
1073
1075
  // Check for various blockquote issues
1074
1076
  let has_no_space = spaces_after.is_empty() && !content.is_empty();
1075
- let has_multiple_spaces = spaces_after.len() > 1;
1077
+ // Consider tabs as multiple spaces, or actual multiple spaces
1078
+ let has_multiple_spaces = spaces_after.len() > 1 || spaces_after.contains('\t');
1076
1079
 
1077
1080
  // Check if needs MD028 fix (empty blockquote without proper spacing)
1078
1081
  let needs_md028_fix = content.trim().is_empty() && spaces_after.is_empty();
@@ -1293,6 +1296,7 @@ impl<'a> LintContext<'a> {
1293
1296
  let mut current_block: Option<ListBlock> = None;
1294
1297
  let mut last_list_item_line = 0;
1295
1298
  let mut current_indent_level = 0;
1299
+ let mut last_marker_width = 0;
1296
1300
 
1297
1301
  for (line_idx, line_info) in lines.iter().enumerate() {
1298
1302
  let line_num = line_idx + 1;
@@ -1302,7 +1306,16 @@ impl<'a> LintContext<'a> {
1302
1306
  if let Some(ref mut block) = current_block {
1303
1307
  // For code blocks to continue a list, they need to be indented
1304
1308
  // at least 2 spaces beyond the list marker
1305
- if line_info.indent >= current_indent_level + 2 {
1309
+ // Calculate minimum indentation for list continuation
1310
+ // For ordered lists, use the last marker width (e.g., 3 for "1. ", 4 for "10. ")
1311
+ // For unordered lists like "- ", content starts at column 2, so continuations need at least 2 spaces
1312
+ let min_continuation_indent = if block.is_ordered {
1313
+ current_indent_level + last_marker_width
1314
+ } else {
1315
+ current_indent_level + 2 // Unordered lists need at least 2 spaces (e.g., "- " = 2 chars)
1316
+ };
1317
+
1318
+ if line_info.indent >= min_continuation_indent {
1306
1319
  // Code blocks at list continuation level should continue the list
1307
1320
  block.end_line = line_num;
1308
1321
  continue;
@@ -1348,8 +1361,28 @@ impl<'a> LintContext<'a> {
1348
1361
  let check_info = &lines[check_idx];
1349
1362
  if !check_info.is_blank && !check_info.in_code_block && check_info.list_item.is_none() {
1350
1363
  // Found non-blank, non-list content
1351
- if check_info.indent < 2 {
1352
- // Not indented, so it's not list continuation
1364
+ // Check if it's indented enough to be a continuation
1365
+ // Get the marker width of the last list item
1366
+ let last_item_marker_width =
1367
+ if last_list_item_line > 0 && last_list_item_line <= lines.len() {
1368
+ lines[last_list_item_line - 1]
1369
+ .list_item
1370
+ .as_ref()
1371
+ .map(|li| {
1372
+ if li.is_ordered {
1373
+ li.marker.len() + 1 // Add 1 for the space after ordered list markers
1374
+ } else {
1375
+ li.marker.len()
1376
+ }
1377
+ })
1378
+ .unwrap_or(3) // fallback to 3 if no list item found
1379
+ } else {
1380
+ 3 // fallback
1381
+ };
1382
+
1383
+ let min_continuation = if block.is_ordered { last_item_marker_width } else { 2 };
1384
+ if check_info.indent < min_continuation {
1385
+ // Not indented enough, so it breaks the list
1353
1386
  found_non_list = true;
1354
1387
  break;
1355
1388
  }
@@ -1364,6 +1397,13 @@ impl<'a> LintContext<'a> {
1364
1397
  block.end_line = line_num;
1365
1398
  block.item_lines.push(line_num);
1366
1399
 
1400
+ // Update max marker width
1401
+ block.max_marker_width = block.max_marker_width.max(if list_item.is_ordered {
1402
+ list_item.marker.len() + 1
1403
+ } else {
1404
+ list_item.marker.len()
1405
+ });
1406
+
1367
1407
  // Update marker consistency for unordered lists
1368
1408
  if !block.is_ordered
1369
1409
  && block.marker.is_some()
@@ -1388,6 +1428,11 @@ impl<'a> LintContext<'a> {
1388
1428
  blockquote_prefix: blockquote_prefix.clone(),
1389
1429
  item_lines: vec![line_num],
1390
1430
  nesting_level: nesting,
1431
+ max_marker_width: if list_item.is_ordered {
1432
+ list_item.marker.len() + 1
1433
+ } else {
1434
+ list_item.marker.len()
1435
+ },
1391
1436
  };
1392
1437
  }
1393
1438
  } else {
@@ -1404,11 +1449,17 @@ impl<'a> LintContext<'a> {
1404
1449
  blockquote_prefix,
1405
1450
  item_lines: vec![line_num],
1406
1451
  nesting_level: nesting,
1452
+ max_marker_width: list_item.marker.len(),
1407
1453
  });
1408
1454
  }
1409
1455
 
1410
1456
  last_list_item_line = line_num;
1411
1457
  current_indent_level = item_indent;
1458
+ last_marker_width = if list_item.is_ordered {
1459
+ list_item.marker.len() + 1 // Add 1 for the space after ordered list markers
1460
+ } else {
1461
+ list_item.marker.len()
1462
+ };
1412
1463
  } else if let Some(ref mut block) = current_block {
1413
1464
  // Not a list item - check if it continues the current block
1414
1465
 
@@ -1417,7 +1468,16 @@ impl<'a> LintContext<'a> {
1417
1468
  // - Blank lines followed by indented content continue the list
1418
1469
  // - Everything else ends the list
1419
1470
 
1420
- if line_info.indent >= current_indent_level + 2 {
1471
+ // Calculate minimum indentation for list continuation
1472
+ // For ordered lists, use the last marker width (e.g., 3 for "1. ", 4 for "10. ")
1473
+ // For unordered lists like "- ", content starts at column 2, so continuations need at least 2 spaces
1474
+ let min_continuation_indent = if block.is_ordered {
1475
+ current_indent_level + last_marker_width
1476
+ } else {
1477
+ current_indent_level + 2 // Unordered lists need at least 2 spaces (e.g., "- " = 2 chars)
1478
+ };
1479
+
1480
+ if line_info.indent >= min_continuation_indent {
1421
1481
  // Indented line continues the list
1422
1482
  block.end_line = line_num;
1423
1483
  } else if line_info.is_blank {
@@ -1434,7 +1494,7 @@ impl<'a> LintContext<'a> {
1434
1494
  if check_idx < lines.len() {
1435
1495
  let next_line = &lines[check_idx];
1436
1496
  // Check if followed by indented content (list continuation)
1437
- if !next_line.in_code_block && next_line.indent >= current_indent_level + 2 {
1497
+ if !next_line.in_code_block && next_line.indent >= min_continuation_indent {
1438
1498
  found_continuation = true;
1439
1499
  }
1440
1500
  // Check if followed by another list item at the same level
@@ -1461,7 +1521,7 @@ impl<'a> LintContext<'a> {
1461
1521
  // Code fences or properly indented content
1462
1522
  trimmed.starts_with("```")
1463
1523
  || trimmed.starts_with("~~~")
1464
- || line_indent >= current_indent_level + 2
1524
+ || line_indent >= min_continuation_indent
1465
1525
  } else {
1466
1526
  false
1467
1527
  }
@@ -1489,8 +1549,20 @@ impl<'a> LintContext<'a> {
1489
1549
  }
1490
1550
  } else {
1491
1551
  // Check for lazy continuation - non-indented line immediately after a list item
1492
- let is_lazy_continuation =
1493
- last_list_item_line == line_num - 1 && line_info.heading.is_none() && !line_info.is_blank;
1552
+ // But only if the line has sufficient indentation for the list type
1553
+ let min_required_indent = if block.is_ordered {
1554
+ current_indent_level + last_marker_width
1555
+ } else {
1556
+ current_indent_level + 2
1557
+ };
1558
+
1559
+ // For lazy continuation to apply, the line must either:
1560
+ // 1. Have no indentation (true lazy continuation)
1561
+ // 2. Have sufficient indentation for the list type
1562
+ let is_lazy_continuation = last_list_item_line == line_num - 1
1563
+ && line_info.heading.is_none()
1564
+ && !line_info.is_blank
1565
+ && (line_info.indent == 0 || line_info.indent >= min_required_indent);
1494
1566
 
1495
1567
  if is_lazy_continuation {
1496
1568
  // Additional check: if the line starts with uppercase and looks like a new sentence,
@@ -1964,6 +2036,9 @@ impl<'a> ListBlockMerger<'a> {
1964
2036
  current.end_line = next.end_line;
1965
2037
  current.item_lines.extend_from_slice(&next.item_lines);
1966
2038
 
2039
+ // Update max marker width
2040
+ current.max_marker_width = current.max_marker_width.max(next.max_marker_width);
2041
+
1967
2042
  // Handle marker consistency for unordered lists
1968
2043
  if !current.is_ordered && self.markers_differ(&current, next) {
1969
2044
  current.marker = None; // Mixed markers
@@ -2004,8 +2079,15 @@ fn has_meaningful_content_between(current: &ListBlock, next: &ListBlock, lines:
2004
2079
  let line_indent = line_info.content.len() - line_info.content.trim_start().len();
2005
2080
 
2006
2081
  // If the line is indented enough to be list continuation content, it's meaningful
2007
- // List content should be indented at least 2 spaces beyond the marker
2008
- if line_indent >= current.nesting_level + 2 {
2082
+ // For ordered lists, use actual marker width; for unordered, 2 spaces
2083
+ let min_indent = if current.is_ordered {
2084
+ current.nesting_level + current.max_marker_width
2085
+ } else {
2086
+ current.nesting_level + 2
2087
+ };
2088
+
2089
+ // Check if the line has sufficient indentation to be a continuation
2090
+ if line_indent >= min_indent {
2009
2091
  return true;
2010
2092
  }
2011
2093
 
@@ -219,9 +219,12 @@ enum Commands {
219
219
  },
220
220
  /// Install the rumdl VS Code extension
221
221
  Vscode {
222
- /// Force reinstall even if already installed
222
+ /// Force reinstall the current version even if already installed
223
223
  #[arg(long)]
224
224
  force: bool,
225
+ /// Update to the latest version (only if newer version available)
226
+ #[arg(long)]
227
+ update: bool,
225
228
  /// Show installation status without installing
226
229
  #[arg(long)]
227
230
  status: bool,
@@ -1782,9 +1785,9 @@ build-backend = \"setuptools.build_meta\"
1782
1785
  }
1783
1786
  }
1784
1787
  }
1785
- Some(Commands::Vscode { force, status }) => {
1788
+ Some(Commands::Vscode { force, update, status }) => {
1786
1789
  // Handle VS Code extension installation
1787
- match rumdl::vscode::handle_vscode_command(*force, *status) {
1790
+ match rumdl::vscode::handle_vscode_command(*force, *update, *status) {
1788
1791
  Ok(_) => {}
1789
1792
  Err(e) => {
1790
1793
  eprintln!("{}: {}", "Error".red().bold(), e);
@@ -55,37 +55,56 @@ impl Rule for MD027MultipleSpacesBlockquote {
55
55
  if let Some(blockquote) = &line_info.blockquote {
56
56
  // Part 1: Check for multiple spaces after the blockquote marker
57
57
  if blockquote.has_multiple_spaces_after_marker {
58
- // Calculate the position of the extra spaces
59
- let extra_spaces_start = blockquote.marker_column + blockquote.nesting_level + 1; // Position after all '>' markers + 1 for the first space
60
- let spaces_in_prefix = blockquote
61
- .prefix
62
- .chars()
63
- .skip(blockquote.indent.len() + blockquote.nesting_level)
64
- .take_while(|&c| c == ' ')
65
- .count();
66
- let extra_spaces_len = spaces_in_prefix - 1; // All spaces except the first one
67
-
68
- let (start_line, start_col, end_line, end_col) =
69
- calculate_match_range(line_num, &line_info.content, extra_spaces_start, extra_spaces_len);
58
+ // Find where the extra spaces start in the line
59
+ // We need to find the position after the markers and first space/tab
60
+ let mut byte_pos = 0;
61
+ let mut found_markers = 0;
62
+ let mut found_first_space = false;
63
+
64
+ for (i, ch) in line_info.content.char_indices() {
65
+ if found_markers < blockquote.nesting_level {
66
+ if ch == '>' {
67
+ found_markers += 1;
68
+ }
69
+ } else if !found_first_space && (ch == ' ' || ch == '\t') {
70
+ // This is the first space/tab after markers
71
+ found_first_space = true;
72
+ } else if found_first_space && (ch == ' ' || ch == '\t') {
73
+ // This is where extra spaces start
74
+ byte_pos = i;
75
+ break;
76
+ }
77
+ }
70
78
 
71
- warnings.push(LintWarning {
72
- rule_name: Some(self.name()),
73
- line: start_line,
74
- column: start_col,
75
- end_line,
76
- end_column: end_col,
77
- message: "Multiple spaces after quote marker (>)".to_string(),
78
- severity: Severity::Warning,
79
- fix: Some(Fix {
80
- range: {
81
- let line_index = LineIndex::new(ctx.content.to_string());
82
- let start_byte = line_index.line_col_to_byte_range(line_num, start_col).start;
83
- let end_byte = line_index.line_col_to_byte_range(line_num, end_col).start;
84
- start_byte..end_byte
85
- },
86
- replacement: "".to_string(), // Remove the extra spaces
87
- }),
88
- });
79
+ // Count how many extra spaces/tabs there are
80
+ let extra_spaces_bytes = line_info.content[byte_pos..]
81
+ .chars()
82
+ .take_while(|&c| c == ' ' || c == '\t')
83
+ .fold(0, |acc, ch| acc + ch.len_utf8());
84
+
85
+ if extra_spaces_bytes > 0 {
86
+ let (start_line, start_col, end_line, end_col) =
87
+ calculate_match_range(line_num, &line_info.content, byte_pos, extra_spaces_bytes);
88
+
89
+ warnings.push(LintWarning {
90
+ rule_name: Some(self.name()),
91
+ line: start_line,
92
+ column: start_col,
93
+ end_line,
94
+ end_column: end_col,
95
+ message: "Multiple spaces after quote marker (>)".to_string(),
96
+ severity: Severity::Warning,
97
+ fix: Some(Fix {
98
+ range: {
99
+ let line_index = LineIndex::new(ctx.content.to_string());
100
+ let start_byte = line_index.line_col_to_byte_range(line_num, start_col).start;
101
+ let end_byte = line_index.line_col_to_byte_range(line_num, end_col).start;
102
+ start_byte..end_byte
103
+ },
104
+ replacement: "".to_string(), // Remove the extra spaces
105
+ }),
106
+ });
107
+ }
89
108
  }
90
109
  } else {
91
110
  // Part 2: Check for malformed blockquote attempts on non-blockquote lines
@@ -515,4 +534,61 @@ mod tests {
515
534
  let fixed = rule.fix(&ctx).unwrap();
516
535
  assert_eq!(fixed, " > Indented with multiple spaces");
517
536
  }
537
+
538
+ #[test]
539
+ fn test_tabs_after_marker() {
540
+ let rule = MD027MultipleSpacesBlockquote;
541
+ // Tab after marker - should be flagged as multiple spaces
542
+ let content = ">\tTab after marker";
543
+ let ctx = LintContext::new(content);
544
+ let result = rule.check(&ctx).unwrap();
545
+ assert_eq!(result.len(), 1, "Tab after marker should be flagged");
546
+ assert_eq!(result[0].message, "Multiple spaces after quote marker (>)");
547
+
548
+ // Tab and space after marker
549
+ let content2 = ">\t Space then tab";
550
+ let ctx2 = LintContext::new(content2);
551
+ let result2 = rule.check(&ctx2).unwrap();
552
+ assert_eq!(result2.len(), 1, "Tab and space should be flagged");
553
+
554
+ // Two tabs after marker
555
+ let content3 = ">\t\tTwo tabs";
556
+ let ctx3 = LintContext::new(content3);
557
+ let result3 = rule.check(&ctx3).unwrap();
558
+ assert_eq!(result3.len(), 1, "Two tabs should be flagged");
559
+ }
560
+
561
+ #[test]
562
+ fn test_mixed_spaces_and_tabs() {
563
+ let rule = MD027MultipleSpacesBlockquote;
564
+ // Space then tab
565
+ let content = "> \tSpace then tab";
566
+ let ctx = LintContext::new(content);
567
+ let result = rule.check(&ctx).unwrap();
568
+ assert_eq!(result.len(), 1);
569
+ assert_eq!(result[0].column, 3); // Points to the tab
570
+
571
+ // Tab then space
572
+ let content2 = ">\t Tab then space";
573
+ let ctx2 = LintContext::new(content2);
574
+ let result2 = rule.check(&ctx2).unwrap();
575
+ assert_eq!(result2.len(), 1);
576
+ assert_eq!(result2[0].column, 3); // Points to the space after tab
577
+ }
578
+
579
+ #[test]
580
+ fn test_fix_tabs() {
581
+ let rule = MD027MultipleSpacesBlockquote;
582
+ // Fix should remove extra tabs
583
+ let content = ">\t\tTwo tabs";
584
+ let ctx = LintContext::new(content);
585
+ let fixed = rule.fix(&ctx).unwrap();
586
+ assert_eq!(fixed, "> Two tabs");
587
+
588
+ // Fix mixed spaces and tabs
589
+ let content2 = "> \t Mixed";
590
+ let ctx2 = LintContext::new(content2);
591
+ let fixed2 = rule.fix(&ctx2).unwrap();
592
+ assert_eq!(fixed2, "> Mixed");
593
+ }
518
594
  }
@@ -267,9 +267,24 @@ pub fn calculate_match_range(
267
267
  match_start: usize,
268
268
  match_len: usize,
269
269
  ) -> (usize, usize, usize, usize) {
270
+ // Bounds check to prevent panic
271
+ let line_len = line_content.len();
272
+ if match_start > line_len {
273
+ // If match_start is beyond line bounds, return a safe range at end of line
274
+ let char_count = line_content.chars().count();
275
+ return (line, char_count + 1, line, char_count + 1);
276
+ }
277
+
278
+ let safe_match_end = (match_start + match_len).min(line_len);
279
+ let safe_match_len = safe_match_end.saturating_sub(match_start);
280
+
270
281
  // Convert byte positions to character positions
271
282
  let char_start = line_content[..match_start].chars().count() + 1; // 1-indexed
272
- let char_len = line_content[match_start..match_start + match_len].chars().count();
283
+ let char_len = if safe_match_len > 0 {
284
+ line_content[match_start..safe_match_end].chars().count()
285
+ } else {
286
+ 0
287
+ };
273
288
  (line, char_start, line, char_start + char_len)
274
289
  }
275
290
 
@@ -444,4 +459,39 @@ mod tests {
444
459
  let range = line_index.line_text_range(1, 1, 100); // Should clamp to line end
445
460
  assert_eq!(range, 0..11); // "Hello world"
446
461
  }
462
+
463
+ #[test]
464
+ fn test_calculate_match_range_bounds_checking() {
465
+ // Test case 1: match_start beyond line bounds
466
+ let line_content = "] not a link [";
467
+ let (line, start_col, end_line, end_col) = calculate_match_range(121, line_content, 57, 10);
468
+ assert_eq!(line, 121);
469
+ assert_eq!(start_col, 15); // line length + 1
470
+ assert_eq!(end_line, 121);
471
+ assert_eq!(end_col, 15); // same as start when out of bounds
472
+
473
+ // Test case 2: match extends beyond line end
474
+ let line_content = "short";
475
+ let (line, start_col, end_line, end_col) = calculate_match_range(1, line_content, 2, 10);
476
+ assert_eq!(line, 1);
477
+ assert_eq!(start_col, 3); // position 2 + 1
478
+ assert_eq!(end_line, 1);
479
+ assert_eq!(end_col, 6); // clamped to line length + 1
480
+
481
+ // Test case 3: normal case within bounds
482
+ let line_content = "normal text here";
483
+ let (line, start_col, end_line, end_col) = calculate_match_range(5, line_content, 7, 4);
484
+ assert_eq!(line, 5);
485
+ assert_eq!(start_col, 8); // position 7 + 1
486
+ assert_eq!(end_line, 5);
487
+ assert_eq!(end_col, 12); // position 7 + 4 + 1
488
+
489
+ // Test case 4: zero length match
490
+ let line_content = "test line";
491
+ let (line, start_col, end_line, end_col) = calculate_match_range(10, line_content, 5, 0);
492
+ assert_eq!(line, 10);
493
+ assert_eq!(start_col, 6); // position 5 + 1
494
+ assert_eq!(end_line, 10);
495
+ assert_eq!(end_col, 6); // same as start for zero length
496
+ }
447
497
  }