rumdl 0.0.66__tar.gz → 0.0.67__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 (252) hide show
  1. {rumdl-0.0.66 → rumdl-0.0.67}/Cargo.lock +1 -1
  2. {rumdl-0.0.66 → rumdl-0.0.67}/Cargo.toml +1 -1
  3. {rumdl-0.0.66 → rumdl-0.0.67}/PKG-INFO +1 -1
  4. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md003_heading_style.rs +76 -134
  5. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md007_ul_indent.rs +50 -72
  6. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md013_line_length.rs +204 -40
  7. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md030_list_marker_space.rs +167 -4
  8. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md034_no_bare_urls.rs +40 -2
  9. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md046_code_block_style.rs +9 -3
  10. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md049_emphasis_style.rs +58 -53
  11. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md053_link_image_reference_definitions.rs +52 -35
  12. rumdl-0.0.67/tests/rules/md030_test.rs +468 -0
  13. rumdl-0.0.66/tests/rules/md030_test.rs +0 -194
  14. {rumdl-0.0.66 → rumdl-0.0.67}/.rumdl.toml +0 -0
  15. {rumdl-0.0.66 → rumdl-0.0.67}/MANIFEST.in +0 -0
  16. {rumdl-0.0.66 → rumdl-0.0.67}/Makefile +0 -0
  17. {rumdl-0.0.66 → rumdl-0.0.67}/README.md +0 -0
  18. {rumdl-0.0.66 → rumdl-0.0.67}/assets/logo.png +0 -0
  19. {rumdl-0.0.66 → rumdl-0.0.67}/benches/range_performance.rs +0 -0
  20. {rumdl-0.0.66 → rumdl-0.0.67}/benches/range_utils_benchmark.rs +0 -0
  21. {rumdl-0.0.66 → rumdl-0.0.67}/benches/rule_performance.rs +0 -0
  22. {rumdl-0.0.66 → rumdl-0.0.67}/docs/RULES.md +0 -0
  23. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md001.md +0 -0
  24. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md002.md +0 -0
  25. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md003.md +0 -0
  26. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md004.md +0 -0
  27. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md005.md +0 -0
  28. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md006.md +0 -0
  29. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md007.md +0 -0
  30. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md009.md +0 -0
  31. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md010.md +0 -0
  32. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md011.md +0 -0
  33. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md012.md +0 -0
  34. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md013.md +0 -0
  35. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md014.md +0 -0
  36. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md018.md +0 -0
  37. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md019.md +0 -0
  38. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md020.md +0 -0
  39. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md021.md +0 -0
  40. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md022.md +0 -0
  41. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md023.md +0 -0
  42. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md024.md +0 -0
  43. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md025.md +0 -0
  44. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md026.md +0 -0
  45. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md027.md +0 -0
  46. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md028.md +0 -0
  47. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md029.md +0 -0
  48. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md030.md +0 -0
  49. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md031.md +0 -0
  50. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md032.md +0 -0
  51. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md033.md +0 -0
  52. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md034.md +0 -0
  53. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md035.md +0 -0
  54. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md036.md +0 -0
  55. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md037.md +0 -0
  56. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md038.md +0 -0
  57. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md039.md +0 -0
  58. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md040.md +0 -0
  59. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md041.md +0 -0
  60. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md042.md +0 -0
  61. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md043.md +0 -0
  62. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md044.md +0 -0
  63. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md045.md +0 -0
  64. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md046.md +0 -0
  65. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md047.md +0 -0
  66. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md048.md +0 -0
  67. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md049.md +0 -0
  68. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md050.md +0 -0
  69. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md051.md +0 -0
  70. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md052.md +0 -0
  71. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md053.md +0 -0
  72. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md054.md +0 -0
  73. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md055.md +0 -0
  74. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md056.md +0 -0
  75. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md057.md +0 -0
  76. {rumdl-0.0.66 → rumdl-0.0.67}/docs/md058.md +0 -0
  77. {rumdl-0.0.66 → rumdl-0.0.67}/issues/plan-rule-parity-with-markdownlint.md +0 -0
  78. {rumdl-0.0.66 → rumdl-0.0.67}/parity_check.py +0 -0
  79. {rumdl-0.0.66 → rumdl-0.0.67}/pyproject.toml +0 -0
  80. {rumdl-0.0.66 → rumdl-0.0.67}/python/MANIFEST.in +0 -0
  81. {rumdl-0.0.66 → rumdl-0.0.67}/python/PYTHON-README.md +0 -0
  82. {rumdl-0.0.66 → rumdl-0.0.67}/python/rumdl/__init__.py +0 -0
  83. {rumdl-0.0.66 → rumdl-0.0.67}/python/rumdl/__main__.py +0 -0
  84. {rumdl-0.0.66 → rumdl-0.0.67}/python/rumdl/py.typed +0 -0
  85. {rumdl-0.0.66 → rumdl-0.0.67}/rumdl.toml.example +0 -0
  86. {rumdl-0.0.66 → rumdl-0.0.67}/src/config.rs +0 -0
  87. {rumdl-0.0.66 → rumdl-0.0.67}/src/init.rs +0 -0
  88. {rumdl-0.0.66 → rumdl-0.0.67}/src/lib.rs +0 -0
  89. {rumdl-0.0.66 → rumdl-0.0.67}/src/lint_context.rs +0 -0
  90. {rumdl-0.0.66 → rumdl-0.0.67}/src/lsp/mod.rs +0 -0
  91. {rumdl-0.0.66 → rumdl-0.0.67}/src/lsp/server.rs +0 -0
  92. {rumdl-0.0.66 → rumdl-0.0.67}/src/lsp/types.rs +0 -0
  93. {rumdl-0.0.66 → rumdl-0.0.67}/src/main.rs +0 -0
  94. {rumdl-0.0.66 → rumdl-0.0.67}/src/markdownlint_config.rs +0 -0
  95. {rumdl-0.0.66 → rumdl-0.0.67}/src/profiling.rs +0 -0
  96. {rumdl-0.0.66 → rumdl-0.0.67}/src/python.rs +0 -0
  97. {rumdl-0.0.66 → rumdl-0.0.67}/src/rule.rs +0 -0
  98. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/blockquote_utils.rs +0 -0
  99. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/code_block_utils.rs +0 -0
  100. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/code_fence_utils.rs +0 -0
  101. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/emphasis_style.rs +0 -0
  102. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/front_matter_utils.rs +0 -0
  103. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/heading_utils.rs +0 -0
  104. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/list_utils.rs +0 -0
  105. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md001_heading_increment.rs +0 -0
  106. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md002_first_heading_h1.rs +0 -0
  107. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md004_unordered_list_style.rs +0 -0
  108. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md005_list_indent.rs +0 -0
  109. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md006_start_bullets.rs +0 -0
  110. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md009_trailing_spaces.rs +0 -0
  111. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md010_no_hard_tabs.rs +0 -0
  112. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md011_no_reversed_links.rs +0 -0
  113. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md012_no_multiple_blanks.rs +0 -0
  114. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md014_commands_show_output.rs +0 -0
  115. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md018_no_missing_space_atx.rs +0 -0
  116. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  117. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  118. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  119. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md022_blanks_around_headings.rs +0 -0
  120. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md023_heading_start_left.rs +0 -0
  121. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md024_no_duplicate_heading.rs +0 -0
  122. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md025_single_title.rs +0 -0
  123. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  124. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  125. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  126. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md029_ordered_list_prefix.rs +0 -0
  127. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md031_blanks_around_fences.rs +0 -0
  128. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md032_blanks_around_lists.rs +0 -0
  129. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md033_no_inline_html.rs +0 -0
  130. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md035_hr_style.rs +0 -0
  131. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  132. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  133. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md038_no_space_in_code.rs +0 -0
  134. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md039_no_space_in_links.rs +0 -0
  135. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md040_fenced_code_language.rs +0 -0
  136. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md041_first_line_heading.rs +0 -0
  137. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md042_no_empty_links.rs +0 -0
  138. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md043_required_headings.rs +0 -0
  139. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md044_proper_names.rs +0 -0
  140. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md045_no_alt_text.rs +0 -0
  141. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md047_single_trailing_newline.rs +0 -0
  142. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md048_code_fence_style.rs +0 -0
  143. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md050_strong_style.rs +0 -0
  144. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md051_link_fragments.rs +0 -0
  145. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md052_reference_links_images.rs +0 -0
  146. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md054_link_image_style.rs +0 -0
  147. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md055_table_pipe_style.rs +0 -0
  148. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md056_table_column_count.rs +0 -0
  149. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md057_existing_relative_links.rs +0 -0
  150. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/md058_blanks_around_tables.rs +0 -0
  151. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/mod.rs +0 -0
  152. {rumdl-0.0.66 → rumdl-0.0.67}/src/rules/strong_style.rs +0 -0
  153. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/ast_utils.rs +0 -0
  154. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/code_block_utils.rs +0 -0
  155. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/document_structure.rs +0 -0
  156. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/early_returns.rs +0 -0
  157. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/element_cache.rs +0 -0
  158. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/markdown_elements.rs +0 -0
  159. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/mod.rs +0 -0
  160. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/range_utils.rs +0 -0
  161. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/regex_cache.rs +0 -0
  162. {rumdl-0.0.66 → rumdl-0.0.67}/src/utils/string_interner.rs +0 -0
  163. {rumdl-0.0.66 → rumdl-0.0.67}/tests/advanced_integration_tests.rs +0 -0
  164. {rumdl-0.0.66 → rumdl-0.0.67}/tests/cli_duplication_test.rs +0 -0
  165. {rumdl-0.0.66 → rumdl-0.0.67}/tests/cli_integration_tests.rs +0 -0
  166. {rumdl-0.0.66 → rumdl-0.0.67}/tests/commonmark_compliance_tests.rs +0 -0
  167. {rumdl-0.0.66 → rumdl-0.0.67}/tests/comprehensive_integration_tests.rs +0 -0
  168. {rumdl-0.0.66 → rumdl-0.0.67}/tests/config_application_tests.rs +0 -0
  169. {rumdl-0.0.66 → rumdl-0.0.67}/tests/config_tests.rs +0 -0
  170. {rumdl-0.0.66 → rumdl-0.0.67}/tests/init_command_test.rs +0 -0
  171. {rumdl-0.0.66 → rumdl-0.0.67}/tests/init_tests.rs +0 -0
  172. {rumdl-0.0.66 → rumdl-0.0.67}/tests/integration_tests.rs +0 -0
  173. {rumdl-0.0.66 → rumdl-0.0.67}/tests/json_output_test.rs +0 -0
  174. {rumdl-0.0.66 → rumdl-0.0.67}/tests/lib.rs +0 -0
  175. {rumdl-0.0.66 → rumdl-0.0.67}/tests/lsp_integration_tests.rs +0 -0
  176. {rumdl-0.0.66 → rumdl-0.0.67}/tests/lsp_tests.rs +0 -0
  177. {rumdl-0.0.66 → rumdl-0.0.67}/tests/markdownlint_cli_integration.rs +0 -0
  178. {rumdl-0.0.66 → rumdl-0.0.67}/tests/markdownlint_config_test.rs +0 -0
  179. {rumdl-0.0.66 → rumdl-0.0.67}/tests/md030_edge_cases.md +0 -0
  180. {rumdl-0.0.66 → rumdl-0.0.67}/tests/output_format_tests.rs +0 -0
  181. {rumdl-0.0.66 → rumdl-0.0.67}/tests/perf_check.rs +0 -0
  182. {rumdl-0.0.66 → rumdl-0.0.67}/tests/pyproject_config_tests.rs +0 -0
  183. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md001_test.rs +0 -0
  184. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md001_unicode_test.rs +0 -0
  185. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md002_test.rs +0 -0
  186. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md003_test.rs +0 -0
  187. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md004_test.rs +0 -0
  188. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md005_test.rs +0 -0
  189. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md006_test.rs +0 -0
  190. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md006_unicode_test.rs +0 -0
  191. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md007_test.rs +0 -0
  192. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md009_test.rs +0 -0
  193. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md010_test.rs +0 -0
  194. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md011_test.rs +0 -0
  195. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md012_test.rs +0 -0
  196. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md013_test.rs +0 -0
  197. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md014_test.rs +0 -0
  198. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md018_test.rs +0 -0
  199. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md019_test.rs +0 -0
  200. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md020_test.rs +0 -0
  201. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md021_test.rs +0 -0
  202. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md022_test.rs +0 -0
  203. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md023_extended_test.rs +0 -0
  204. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md023_test.rs +0 -0
  205. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md024_test.rs +0 -0
  206. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md025_test.rs +0 -0
  207. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md026_test.rs +0 -0
  208. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md027_test.rs +0 -0
  209. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md028_test.rs +0 -0
  210. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md029_test.rs +0 -0
  211. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md031_test.rs +0 -0
  212. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md032_test.rs +0 -0
  213. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md033_extended_test.rs +0 -0
  214. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md033_test.rs +0 -0
  215. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md034_test.rs +0 -0
  216. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md035_test.rs +0 -0
  217. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md036_test.rs +0 -0
  218. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md037_test.rs +0 -0
  219. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md038_test.rs +0 -0
  220. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md039_test.rs +0 -0
  221. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md040_test.rs +0 -0
  222. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md041_test.rs +0 -0
  223. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md042_test.rs +0 -0
  224. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md043_test.rs +0 -0
  225. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md044_test.rs +0 -0
  226. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md045_test.rs +0 -0
  227. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md046_test.rs +0 -0
  228. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md047_test.rs +0 -0
  229. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md048_test.rs +0 -0
  230. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md049_test.rs +0 -0
  231. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md050_test.rs +0 -0
  232. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md051_test.rs +0 -0
  233. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md052_test.rs +0 -0
  234. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md053_additional_test.rs +0 -0
  235. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md053_proptest.rs +0 -0
  236. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md053_test.rs +0 -0
  237. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md054_test.rs +0 -0
  238. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md054_unicode_test.rs +0 -0
  239. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md055_test.rs +0 -0
  240. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md056_test.rs +0 -0
  241. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md057_test.rs +0 -0
  242. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/md058_test.rs +0 -0
  243. {rumdl-0.0.66 → rumdl-0.0.67}/tests/rules/mod.rs +0 -0
  244. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/blockquote_utils_test.rs +0 -0
  245. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/code_block_utils_extended_test.rs +0 -0
  246. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/code_block_utils_test.rs +0 -0
  247. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/core_utils_test.rs +0 -0
  248. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/front_matter_utils_test.rs +0 -0
  249. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/line_index_test.rs +0 -0
  250. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils/mod.rs +0 -0
  251. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils_markdown_edge_cases.rs +0 -0
  252. {rumdl-0.0.66 → rumdl-0.0.67}/tests/utils_tests.rs +0 -0
@@ -1704,7 +1704,7 @@ dependencies = [
1704
1704
 
1705
1705
  [[package]]
1706
1706
  name = "rumdl"
1707
- version = "0.0.66"
1707
+ version = "0.0.67"
1708
1708
  dependencies = [
1709
1709
  "anyhow",
1710
1710
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.66"
3
+ version = "0.0.67"
4
4
  edition = "2021"
5
5
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
6
6
  authors = ["Ruben J. Jongejan <ruben.jongejan@gmail.com>"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.66
3
+ Version: 0.0.67
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -4,9 +4,8 @@
4
4
  //! See [docs/md003.md](../../docs/md003.md) for full documentation, configuration, and examples.
5
5
 
6
6
  use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
7
- use crate::rules::heading_utils::{HeadingStyle, HeadingUtils};
7
+ use crate::rules::heading_utils::HeadingStyle;
8
8
  use crate::utils::document_structure::DocumentStructure;
9
- use crate::utils::markdown_elements::{ElementQuality, ElementType, MarkdownElements};
10
9
  use lazy_static::lazy_static;
11
10
  use regex::Regex;
12
11
  use std::str::FromStr;
@@ -166,143 +165,29 @@ impl Rule for MD003HeadingStyle {
166
165
  }
167
166
 
168
167
  fn fix(&self, ctx: &crate::lint_context::LintContext) -> Result<String, LintError> {
169
- let content = ctx.content;
170
- // Early return for empty content
171
- if content.is_empty() {
172
- return Ok(String::new());
173
- }
168
+ // Get all warnings with their fixes
169
+ let warnings = self.check(ctx)?;
174
170
 
175
- // Quick check if there are any headings at all
176
- if !QUICK_HEADING_CHECK.is_match(content) {
177
- return Ok(content.to_string());
171
+ // If no warnings, return original content
172
+ if warnings.is_empty() {
173
+ return Ok(ctx.content.to_string());
178
174
  }
179
175
 
180
- let mut fixed_content = String::new();
181
- let mut last_processed_line = 0;
182
- let lines: Vec<&str> = content.lines().collect();
183
-
184
- // Get the target style - use the fallback method since no structure is available
185
- let target_style = self.get_target_style(content, None);
186
-
187
- // Get all headings using the MarkdownElements utility
188
- let headings = MarkdownElements::detect_headings(content);
189
-
190
- for heading in headings {
191
- if heading.element_type != ElementType::Heading
192
- || heading.quality != ElementQuality::Valid
193
- {
194
- continue; // Skip non-headings or invalid headings
195
- }
196
-
197
- // Add any lines before this heading
198
- for i in last_processed_line..heading.start_line {
199
- if !fixed_content.is_empty() {
200
- fixed_content.push('\n');
201
- }
202
- fixed_content.push_str(lines.get(i).unwrap_or(&""));
176
+ // Collect all fixes and sort by range start (descending) to apply from end to beginning
177
+ let mut fixes: Vec<_> = warnings.iter()
178
+ .filter_map(|w| w.fix.as_ref().map(|f| (f.range.start, f.range.end, &f.replacement)))
179
+ .collect();
180
+ fixes.sort_by(|a, b| b.0.cmp(&a.0));
181
+
182
+ // Apply fixes from end to beginning to preserve byte offsets
183
+ let mut result = ctx.content.to_string();
184
+ for (start, end, replacement) in fixes {
185
+ if start < result.len() && end <= result.len() && start <= end {
186
+ result.replace_range(start..end, replacement);
203
187
  }
204
-
205
- // Get the heading level
206
- if let Some(level_str) = &heading.metadata {
207
- if let Ok(level) = level_str.parse::<u32>() {
208
- // Determine the current style of the heading
209
- let style = if heading.end_line > heading.start_line {
210
- // Setext heading (has an underline)
211
- if level == 1 {
212
- HeadingStyle::Setext1
213
- } else {
214
- HeadingStyle::Setext2
215
- }
216
- } else {
217
- // ATX heading
218
- let line = lines.get(heading.start_line).map_or("", |v| *v);
219
- if line.trim().ends_with('#') {
220
- HeadingStyle::AtxClosed
221
- } else {
222
- HeadingStyle::Atx
223
- }
224
- };
225
-
226
- // For markdownlint parity: when target style is Setext, all headings are expected to be Setext
227
- // For level 3+, we can't actually convert to Setext, so leave as ATX but flag as violation
228
- let expected_style = if target_style == HeadingStyle::Setext1
229
- || target_style == HeadingStyle::Setext2
230
- {
231
- if level > 2 {
232
- // Level 3+ can't be Setext, so keep as ATX but this will be flagged as violation
233
- HeadingStyle::Atx
234
- } else if level == 1 {
235
- HeadingStyle::Setext1
236
- } else {
237
- HeadingStyle::Setext2
238
- }
239
- } else {
240
- target_style
241
- };
242
-
243
- // If this heading's style doesn't match the target, convert it
244
- if style != expected_style {
245
- // Get the text content from the heading
246
- let text_content = if heading.end_line > heading.start_line {
247
- // Setext heading
248
- lines.get(heading.start_line).unwrap_or(&"").to_string()
249
- } else {
250
- // ATX heading
251
- let line = lines.get(heading.start_line).map_or("", |v| *v);
252
- HeadingUtils::get_heading_text(line).unwrap_or_default()
253
- };
254
-
255
- // Get indentation
256
- let indentation = if let Some(line) = lines.get(heading.start_line) {
257
- line.chars()
258
- .take_while(|c| c.is_whitespace())
259
- .collect::<String>()
260
- } else {
261
- String::new()
262
- };
263
-
264
- // Convert heading to target style
265
- let converted_heading = HeadingUtils::convert_heading_style(
266
- &format!("{}{}", indentation, text_content),
267
- level,
268
- expected_style,
269
- );
270
-
271
- // Add converted heading
272
- if !fixed_content.is_empty() {
273
- fixed_content.push('\n');
274
- }
275
- fixed_content.push_str(&converted_heading);
276
- } else {
277
- // Add original heading lines
278
- for i in heading.start_line..=heading.end_line {
279
- if !fixed_content.is_empty() {
280
- fixed_content.push('\n');
281
- }
282
- fixed_content.push_str(lines.get(i).unwrap_or(&""));
283
- }
284
- }
285
-
286
- // Update last processed line
287
- last_processed_line = heading.end_line + 1;
288
- }
289
- }
290
- }
291
-
292
- // Add any remaining lines
293
- for i in last_processed_line..lines.len() {
294
- if !fixed_content.is_empty() {
295
- fixed_content.push('\n');
296
- }
297
- fixed_content.push_str(lines.get(i).unwrap_or(&""));
298
188
  }
299
189
 
300
- // Preserve trailing newline
301
- if content.ends_with('\n') && !fixed_content.ends_with('\n') {
302
- fixed_content.push('\n');
303
- }
304
-
305
- Ok(fixed_content)
190
+ Ok(result)
306
191
  }
307
192
 
308
193
  fn check_with_structure(
@@ -383,6 +268,63 @@ impl Rule for MD003HeadingStyle {
383
268
  };
384
269
 
385
270
  if style != expected_style {
271
+ // Generate fix for this heading
272
+ let fix = {
273
+ use crate::rules::heading_utils::HeadingUtils;
274
+
275
+ // Get the text content from the heading
276
+ let text_content = if next_line_idx < lines.len() &&
277
+ (lines[next_line_idx].trim_start().starts_with('=') ||
278
+ lines[next_line_idx].trim_start().starts_with('-')) {
279
+ // Setext heading
280
+ current_line.to_string()
281
+ } else {
282
+ // ATX heading
283
+ HeadingUtils::get_heading_text(current_line).unwrap_or_default()
284
+ };
285
+
286
+ // Get indentation
287
+ let indentation = current_line.chars()
288
+ .take_while(|c| c.is_whitespace())
289
+ .collect::<String>();
290
+
291
+ // Convert heading to target style
292
+ let converted_heading = HeadingUtils::convert_heading_style(
293
+ &format!("{}{}", indentation, text_content.trim()),
294
+ level as u32,
295
+ expected_style,
296
+ );
297
+
298
+ // Calculate the correct range for the heading
299
+ let line_index = crate::utils::range_utils::LineIndex::new(ctx.content.to_string());
300
+ let range = if next_line_idx < lines.len() &&
301
+ (lines[next_line_idx].trim_start().starts_with('=') ||
302
+ lines[next_line_idx].trim_start().starts_with('-')) {
303
+ // Setext heading spans two lines
304
+ let start_byte = line_index.line_col_to_byte_range(line_num, 1).start;
305
+ let end_byte = if line_num + 1 < lines.len() {
306
+ line_index.line_col_to_byte_range(line_num + 2, 1).start - 1
307
+ } else {
308
+ ctx.content.len()
309
+ };
310
+ start_byte..end_byte
311
+ } else {
312
+ // ATX heading is single line
313
+ let start_byte = line_index.line_col_to_byte_range(line_num, 1).start;
314
+ let end_byte = if line_num < lines.len() {
315
+ line_index.line_col_to_byte_range(line_num + 1, 1).start - 1
316
+ } else {
317
+ ctx.content.len()
318
+ };
319
+ start_byte..end_byte
320
+ };
321
+
322
+ Some(crate::rule::Fix {
323
+ range,
324
+ replacement: converted_heading,
325
+ })
326
+ };
327
+
386
328
  result.push(LintWarning {
387
329
  rule_name: Some(self.name()),
388
330
  line: line_num, // Already 1-indexed
@@ -392,7 +334,7 @@ impl Rule for MD003HeadingStyle {
392
334
  expected_style, style
393
335
  ),
394
336
  severity: Severity::Warning,
395
- fix: None,
337
+ fix,
396
338
  });
397
339
  }
398
340
  }
@@ -73,6 +73,38 @@ impl Rule for MD007ULIndent {
73
73
  if matches!(item.marker_type, ListMarkerType::Asterisk | ListMarkerType::Plus | ListMarkerType::Minus) {
74
74
  let expected_indent = item.nesting_level * self.indent;
75
75
  if item.indentation != expected_indent {
76
+ // Generate fix for this list item
77
+ let fix = {
78
+ let lines: Vec<&str> = content.lines().collect();
79
+ if let Some(line) = lines.get(item.line_number - 1) {
80
+ // Extract the marker and content
81
+ let re = regex::Regex::new(r"^(\s*)([*+-])(\s+)(.*)$").unwrap();
82
+ if let Some(caps) = re.captures(line) {
83
+ let content_part = caps.get(4).map_or("", |m| m.as_str());
84
+ let space_after_marker = caps.get(3).map_or(" ", |m| m.as_str());
85
+ let marker_char = caps.get(2).map_or("*", |m| m.as_str());
86
+ let correct_indent = " ".repeat(expected_indent);
87
+ let fixed_line = format!("{}{}{}{}{}", item.blockquote_prefix, correct_indent, marker_char, space_after_marker, content_part);
88
+
89
+ let line_index = crate::utils::range_utils::LineIndex::new(content.to_string());
90
+ let line_start = line_index.line_col_to_byte_range(item.line_number, 1).start;
91
+ let line_end = if item.line_number < lines.len() {
92
+ line_index.line_col_to_byte_range(item.line_number + 1, 1).start - 1
93
+ } else {
94
+ content.len()
95
+ };
96
+ Some(crate::rule::Fix {
97
+ range: line_start..line_end,
98
+ replacement: fixed_line,
99
+ })
100
+ } else {
101
+ None
102
+ }
103
+ } else {
104
+ None
105
+ }
106
+ };
107
+
76
108
  warnings.push(LintWarning {
77
109
  rule_name: Some(self.name()),
78
110
  message: format!(
@@ -82,7 +114,7 @@ impl Rule for MD007ULIndent {
82
114
  line: item.line_number,
83
115
  column: item.blockquote_prefix.len() + item.indentation + 1, // correct column for marker
84
116
  severity: Severity::Warning,
85
- fix: None,
117
+ fix,
86
118
  });
87
119
  }
88
120
  }
@@ -99,84 +131,30 @@ impl Rule for MD007ULIndent {
99
131
  self.check(ctx)
100
132
  }
101
133
 
102
- fn fix(&self, ctx: &crate::lint_context::LintContext) -> Result<String, LintError> {
103
- let content = ctx.content;
104
-
105
- // Get the warnings to know which lines need indentation fixing
134
+ fn fix(&self, ctx: &crate::lint_context::LintContext) -> Result<String, LintError> {
135
+ // Get all warnings with their fixes
106
136
  let warnings = self.check(ctx)?;
107
- let mut lines_to_fix: std::collections::HashSet<usize> = std::collections::HashSet::new();
108
- for warning in &warnings {
109
- lines_to_fix.insert(warning.line);
110
- }
111
-
112
- let element_cache = ElementCache::new(content);
113
- let lines: Vec<&str> = content.lines().collect();
114
- let mut result_lines: Vec<String> = Vec::new();
115
137
 
116
- // Check if any list items have tabs that need normalization
117
- let mut has_tabs = false;
118
- for &line in &lines {
119
- if line.contains('\t') && element_cache.get_list_items().iter().any(|item| item.line_number == lines.iter().position(|&l| l == line).unwrap_or(0) + 1) {
120
- has_tabs = true;
121
- break;
122
- }
123
- }
124
-
125
- // If no warnings and no tabs to normalize, return original content
126
- if warnings.is_empty() && !has_tabs {
127
- return Ok(content.to_string());
138
+ // If no warnings, return original content
139
+ if warnings.is_empty() {
140
+ return Ok(ctx.content.to_string());
128
141
  }
129
142
 
130
- for (line_idx, &line) in lines.iter().enumerate() {
131
- let line_number = line_idx + 1;
132
-
133
- // Check if this line is a list item
134
- if let Some(item) = element_cache.get_list_items().iter().find(|item| item.line_number == line_number) {
135
- if matches!(item.marker_type, ListMarkerType::Asterisk | ListMarkerType::Plus | ListMarkerType::Minus) {
136
- // Determine if we need to fix this line
137
- let needs_indentation_fix = lines_to_fix.contains(&line_number);
138
- let needs_tab_normalization = line.contains('\t');
139
-
140
- if needs_indentation_fix || needs_tab_normalization {
141
- let expected_indent = item.nesting_level * self.indent;
142
-
143
- // Reconstruct the line with correct indentation
144
- let marker_char = match item.marker_type {
145
- ListMarkerType::Asterisk => '*',
146
- ListMarkerType::Plus => '+',
147
- ListMarkerType::Minus => '-',
148
- _ => unreachable!(),
149
- };
150
-
151
- // Extract the content after the marker and space
152
- let re = regex::Regex::new(r"^(\s*)([*+-])(\s+)(.*)$").unwrap();
153
- if let Some(caps) = re.captures(line) {
154
- let content_part = caps.get(4).map_or("", |m| m.as_str());
155
- let space_after_marker = caps.get(3).map_or(" ", |m| m.as_str());
156
- let correct_indent = " ".repeat(expected_indent);
157
- let fixed_line = format!("{}{}{}{}{}", item.blockquote_prefix, correct_indent, marker_char, space_after_marker, content_part);
158
- result_lines.push(fixed_line);
159
- } else {
160
- // Fallback: just use the original line
161
- result_lines.push(line.to_string());
162
- }
163
- } else {
164
- result_lines.push(line.to_string());
165
- }
166
- } else {
167
- result_lines.push(line.to_string());
168
- }
169
- } else {
170
- result_lines.push(line.to_string());
143
+ // Collect all fixes and sort by range start (descending) to apply from end to beginning
144
+ let mut fixes: Vec<_> = warnings.iter()
145
+ .filter_map(|w| w.fix.as_ref().map(|f| (f.range.start, f.range.end, &f.replacement)))
146
+ .collect();
147
+ fixes.sort_by(|a, b| b.0.cmp(&a.0));
148
+
149
+ // Apply fixes from end to beginning to preserve byte offsets
150
+ let mut result = ctx.content.to_string();
151
+ for (start, end, replacement) in fixes {
152
+ if start < result.len() && end <= result.len() && start <= end {
153
+ result.replace_range(start..end, replacement);
171
154
  }
172
155
  }
173
156
 
174
- let result = result_lines.join("\n");
175
- if content.ends_with('\n') {
176
- Ok(result + "\n")
177
- } else {
178
- Ok(result)
179
- }
157
+ Ok(result)
180
158
  }
181
159
 
182
160
  /// Get the category of this rule for selective processing