rumdl 0.0.95__tar.gz → 0.0.96__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 (349) hide show
  1. {rumdl-0.0.95 → rumdl-0.0.96}/CHANGELOG.md +38 -1
  2. {rumdl-0.0.95 → rumdl-0.0.96}/Cargo.lock +36 -1
  3. {rumdl-0.0.95 → rumdl-0.0.96}/Cargo.toml +2 -1
  4. {rumdl-0.0.95 → rumdl-0.0.96}/PKG-INFO +1 -1
  5. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md013_line_length/md013_config.rs +5 -0
  6. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md013_line_length.rs +141 -0
  7. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/mod.rs +1 -0
  8. rumdl-0.0.96/src/utils/text_reflow.rs +513 -0
  9. rumdl-0.0.96/tests/md013_reflow_integration_test.rs +270 -0
  10. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md013_test.rs +464 -0
  11. {rumdl-0.0.95 → rumdl-0.0.96}/.config/nextest.toml +0 -0
  12. {rumdl-0.0.95 → rumdl-0.0.96}/.mise.toml +0 -0
  13. {rumdl-0.0.95 → rumdl-0.0.96}/.rumdl.toml +0 -0
  14. {rumdl-0.0.95 → rumdl-0.0.96}/.rustfmt.toml +0 -0
  15. {rumdl-0.0.95 → rumdl-0.0.96}/LICENSE +0 -0
  16. {rumdl-0.0.95 → rumdl-0.0.96}/MANIFEST.in +0 -0
  17. {rumdl-0.0.95 → rumdl-0.0.96}/Makefile +0 -0
  18. {rumdl-0.0.95 → rumdl-0.0.96}/README.md +0 -0
  19. {rumdl-0.0.95 → rumdl-0.0.96}/assets/logo.png +0 -0
  20. {rumdl-0.0.95 → rumdl-0.0.96}/benches/fix_performance.rs +0 -0
  21. {rumdl-0.0.95 → rumdl-0.0.96}/benches/range_performance.rs +0 -0
  22. {rumdl-0.0.95 → rumdl-0.0.96}/benches/range_utils_benchmark.rs +0 -0
  23. {rumdl-0.0.95 → rumdl-0.0.96}/benches/rule_performance.rs +0 -0
  24. {rumdl-0.0.95 → rumdl-0.0.96}/benches/simple_fix_bench.rs +0 -0
  25. {rumdl-0.0.95 → rumdl-0.0.96}/docs/RULES.md +0 -0
  26. {rumdl-0.0.95 → rumdl-0.0.96}/docs/global-settings.md +0 -0
  27. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md001.md +0 -0
  28. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md002.md +0 -0
  29. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md003.md +0 -0
  30. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md004.md +0 -0
  31. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md005.md +0 -0
  32. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md006.md +0 -0
  33. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md007.md +0 -0
  34. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md009.md +0 -0
  35. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md010.md +0 -0
  36. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md011.md +0 -0
  37. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md012.md +0 -0
  38. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md013.md +0 -0
  39. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md014.md +0 -0
  40. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md018.md +0 -0
  41. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md019.md +0 -0
  42. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md020.md +0 -0
  43. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md021.md +0 -0
  44. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md022.md +0 -0
  45. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md023.md +0 -0
  46. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md024.md +0 -0
  47. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md025.md +0 -0
  48. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md026.md +0 -0
  49. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md027.md +0 -0
  50. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md028.md +0 -0
  51. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md029.md +0 -0
  52. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md030.md +0 -0
  53. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md031.md +0 -0
  54. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md032.md +0 -0
  55. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md033.md +0 -0
  56. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md034.md +0 -0
  57. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md035.md +0 -0
  58. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md036.md +0 -0
  59. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md037.md +0 -0
  60. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md038.md +0 -0
  61. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md039.md +0 -0
  62. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md040.md +0 -0
  63. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md041.md +0 -0
  64. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md042.md +0 -0
  65. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md043.md +0 -0
  66. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md044.md +0 -0
  67. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md045.md +0 -0
  68. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md046.md +0 -0
  69. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md047.md +0 -0
  70. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md048.md +0 -0
  71. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md049.md +0 -0
  72. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md050.md +0 -0
  73. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md051.md +0 -0
  74. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md052.md +0 -0
  75. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md053.md +0 -0
  76. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md054.md +0 -0
  77. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md055.md +0 -0
  78. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md056.md +0 -0
  79. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md057.md +0 -0
  80. {rumdl-0.0.95 → rumdl-0.0.96}/docs/md058.md +0 -0
  81. {rumdl-0.0.95 → rumdl-0.0.96}/docs/vscode-extension.md +0 -0
  82. {rumdl-0.0.95 → rumdl-0.0.96}/parity_check.py +0 -0
  83. {rumdl-0.0.95 → rumdl-0.0.96}/pyproject.toml +0 -0
  84. {rumdl-0.0.95 → rumdl-0.0.96}/python/MANIFEST.in +0 -0
  85. {rumdl-0.0.95 → rumdl-0.0.96}/python/PYTHON-README.md +0 -0
  86. {rumdl-0.0.95 → rumdl-0.0.96}/python/rumdl/__init__.py +0 -0
  87. {rumdl-0.0.95 → rumdl-0.0.96}/python/rumdl/__main__.py +0 -0
  88. {rumdl-0.0.95 → rumdl-0.0.96}/python/rumdl/py.typed +0 -0
  89. {rumdl-0.0.95 → rumdl-0.0.96}/rumdl.toml.example +0 -0
  90. {rumdl-0.0.95 → rumdl-0.0.96}/rust-toolchain.toml +0 -0
  91. {rumdl-0.0.95 → rumdl-0.0.96}/scripts/extract-changelog.sh +0 -0
  92. {rumdl-0.0.95 → rumdl-0.0.96}/scripts/prepare-release.sh +0 -0
  93. {rumdl-0.0.95 → rumdl-0.0.96}/src/bin/benchmark.rs +0 -0
  94. {rumdl-0.0.95 → rumdl-0.0.96}/src/bin/benchmark_rule.rs +0 -0
  95. {rumdl-0.0.95 → rumdl-0.0.96}/src/bin/file_parallel_benchmark.rs +0 -0
  96. {rumdl-0.0.95 → rumdl-0.0.96}/src/bin/measure_code_span_performance.rs +0 -0
  97. {rumdl-0.0.95 → rumdl-0.0.96}/src/config.rs +0 -0
  98. {rumdl-0.0.95 → rumdl-0.0.96}/src/exit_codes.rs +0 -0
  99. {rumdl-0.0.95 → rumdl-0.0.96}/src/init.rs +0 -0
  100. {rumdl-0.0.95 → rumdl-0.0.96}/src/inline_config.rs +0 -0
  101. {rumdl-0.0.95 → rumdl-0.0.96}/src/lib.rs +0 -0
  102. {rumdl-0.0.95 → rumdl-0.0.96}/src/lint_context.rs +0 -0
  103. {rumdl-0.0.95 → rumdl-0.0.96}/src/lsp/mod.rs +0 -0
  104. {rumdl-0.0.95 → rumdl-0.0.96}/src/lsp/server.rs +0 -0
  105. {rumdl-0.0.95 → rumdl-0.0.96}/src/lsp/types.rs +0 -0
  106. {rumdl-0.0.95 → rumdl-0.0.96}/src/main.rs +0 -0
  107. {rumdl-0.0.95 → rumdl-0.0.96}/src/markdownlint_config.rs +0 -0
  108. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/azure.rs +0 -0
  109. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/concise.rs +0 -0
  110. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/github.rs +0 -0
  111. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/gitlab.rs +0 -0
  112. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/grouped.rs +0 -0
  113. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/json.rs +0 -0
  114. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/json_lines.rs +0 -0
  115. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/junit.rs +0 -0
  116. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/mod.rs +0 -0
  117. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/pylint.rs +0 -0
  118. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/sarif.rs +0 -0
  119. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/formatters/text.rs +0 -0
  120. {rumdl-0.0.95 → rumdl-0.0.96}/src/output/mod.rs +0 -0
  121. {rumdl-0.0.95 → rumdl-0.0.96}/src/parallel.rs +0 -0
  122. {rumdl-0.0.95 → rumdl-0.0.96}/src/performance.rs +0 -0
  123. {rumdl-0.0.95 → rumdl-0.0.96}/src/profiling.rs +0 -0
  124. {rumdl-0.0.95 → rumdl-0.0.96}/src/python.rs +0 -0
  125. {rumdl-0.0.95 → rumdl-0.0.96}/src/rule.rs +0 -0
  126. {rumdl-0.0.95 → rumdl-0.0.96}/src/rule_config.rs +0 -0
  127. {rumdl-0.0.95 → rumdl-0.0.96}/src/rule_config_serde.rs +0 -0
  128. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/blockquote_utils.rs +0 -0
  129. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/code_block_utils.rs +0 -0
  130. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/code_fence_utils.rs +0 -0
  131. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/emphasis_style.rs +0 -0
  132. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/front_matter_utils.rs +0 -0
  133. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/heading_utils.rs +0 -0
  134. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/list_utils.rs +0 -0
  135. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md001_heading_increment.rs +0 -0
  136. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  137. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md002_first_heading_h1.rs +0 -0
  138. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md003_heading_style/md003_config.rs +0 -0
  139. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md003_heading_style.rs +0 -0
  140. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  141. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md004_unordered_list_style.rs +0 -0
  142. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md005_list_indent.rs +0 -0
  143. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md006_start_bullets.rs +0 -0
  144. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  145. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md007_ul_indent.rs +0 -0
  146. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  147. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md009_trailing_spaces.rs +0 -0
  148. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  149. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md010_no_hard_tabs.rs +0 -0
  150. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md011_no_reversed_links.rs +0 -0
  151. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  152. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md012_no_multiple_blanks.rs +0 -0
  153. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  154. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md014_commands_show_output.rs +0 -0
  155. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md018_no_missing_space_atx.rs +0 -0
  156. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  157. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  158. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  159. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  160. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md022_blanks_around_headings.rs +0 -0
  161. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md023_heading_start_left.rs +0 -0
  162. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  163. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md024_no_duplicate_heading.rs +0 -0
  164. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md025_single_title/md025_config.rs +0 -0
  165. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md025_single_title.rs +0 -0
  166. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  167. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  168. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  169. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  170. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md029_ordered_list_prefix.rs +0 -0
  171. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  172. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md030_list_marker_space.rs +0 -0
  173. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md031_blanks_around_fences.rs +0 -0
  174. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md032_blanks_around_lists.rs +0 -0
  175. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  176. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md033_no_inline_html.rs +0 -0
  177. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md034_no_bare_urls.rs +0 -0
  178. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md035_hr_style/md035_config.rs +0 -0
  179. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md035_hr_style.rs +0 -0
  180. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  181. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  182. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  183. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md038_no_space_in_code.rs +0 -0
  184. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md039_no_space_in_links.rs +0 -0
  185. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md040_fenced_code_language.rs +0 -0
  186. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md041_first_line_heading.rs +0 -0
  187. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md042_no_empty_links.rs +0 -0
  188. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md043_required_headings.rs +0 -0
  189. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md044_proper_names/md044_config.rs +0 -0
  190. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md044_proper_names.rs +0 -0
  191. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  192. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md045_no_alt_text.rs +0 -0
  193. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  194. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md046_code_block_style.rs +0 -0
  195. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md047_single_trailing_newline.rs +0 -0
  196. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  197. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md048_code_fence_style.rs +0 -0
  198. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  199. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md049_emphasis_style.rs +0 -0
  200. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md050_strong_style/md050_config.rs +0 -0
  201. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md050_strong_style.rs +0 -0
  202. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md051_link_fragments.rs +0 -0
  203. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md052_reference_links_images.rs +0 -0
  204. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  205. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  206. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md054_link_image_style.rs +0 -0
  207. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  208. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md055_table_pipe_style.rs +0 -0
  209. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md056_table_column_count.rs +0 -0
  210. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  211. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md057_existing_relative_links.rs +0 -0
  212. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/md058_blanks_around_tables.rs +0 -0
  213. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/mod.rs +0 -0
  214. {rumdl-0.0.95 → rumdl-0.0.96}/src/rules/strong_style.rs +0 -0
  215. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/ast_utils.rs +0 -0
  216. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/code_block_utils.rs +0 -0
  217. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/document_structure.rs +0 -0
  218. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/early_returns.rs +0 -0
  219. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/element_cache.rs +0 -0
  220. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/emphasis_utils.rs +0 -0
  221. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/fix_utils.rs +0 -0
  222. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/markdown_elements.rs +0 -0
  223. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/range_utils.rs +0 -0
  224. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/regex_cache.rs +0 -0
  225. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/string_interner.rs +0 -0
  226. {rumdl-0.0.95 → rumdl-0.0.96}/src/utils/table_utils.rs +0 -0
  227. {rumdl-0.0.95 → rumdl-0.0.96}/src/vscode.rs +0 -0
  228. {rumdl-0.0.95 → rumdl-0.0.96}/tests/advanced_integration_tests.rs +0 -0
  229. {rumdl-0.0.95 → rumdl-0.0.96}/tests/character_ranges/additional_tests.rs +0 -0
  230. {rumdl-0.0.95 → rumdl-0.0.96}/tests/character_ranges/basic_tests.rs +0 -0
  231. {rumdl-0.0.95 → rumdl-0.0.96}/tests/character_ranges/comprehensive_tests.rs +0 -0
  232. {rumdl-0.0.95 → rumdl-0.0.96}/tests/character_ranges/extended_tests.rs +0 -0
  233. {rumdl-0.0.95 → rumdl-0.0.96}/tests/character_ranges/mod.rs +0 -0
  234. {rumdl-0.0.95 → rumdl-0.0.96}/tests/character_ranges/unicode_utils.rs +0 -0
  235. {rumdl-0.0.95 → rumdl-0.0.96}/tests/cli_duplication_test.rs +0 -0
  236. {rumdl-0.0.95 → rumdl-0.0.96}/tests/cli_integration_tests.rs +0 -0
  237. {rumdl-0.0.95 → rumdl-0.0.96}/tests/cli_lsp_fix_consistency.rs +0 -0
  238. {rumdl-0.0.95 → rumdl-0.0.96}/tests/cli_statistics_test.rs +0 -0
  239. {rumdl-0.0.95 → rumdl-0.0.96}/tests/commonmark_compliance_tests.rs +0 -0
  240. {rumdl-0.0.95 → rumdl-0.0.96}/tests/comprehensive_integration_tests.rs +0 -0
  241. {rumdl-0.0.95 → rumdl-0.0.96}/tests/comprehensive_output_format_tests.rs +0 -0
  242. {rumdl-0.0.95 → rumdl-0.0.96}/tests/config_application_tests.rs +0 -0
  243. {rumdl-0.0.95 → rumdl-0.0.96}/tests/config_file_command_test.rs +0 -0
  244. {rumdl-0.0.95 → rumdl-0.0.96}/tests/config_tests.rs +0 -0
  245. {rumdl-0.0.95 → rumdl-0.0.96}/tests/configuration_inheritance_tests.rs +0 -0
  246. {rumdl-0.0.95 → rumdl-0.0.96}/tests/consistency_regression_tests.rs +0 -0
  247. {rumdl-0.0.95 → rumdl-0.0.96}/tests/cross_platform_compatibility_tests.rs +0 -0
  248. {rumdl-0.0.95 → rumdl-0.0.96}/tests/final_confidence_assessment.rs +0 -0
  249. {rumdl-0.0.95 → rumdl-0.0.96}/tests/init_command_test.rs +0 -0
  250. {rumdl-0.0.95 → rumdl-0.0.96}/tests/init_tests.rs +0 -0
  251. {rumdl-0.0.95 → rumdl-0.0.96}/tests/inline_config_test.rs +0 -0
  252. {rumdl-0.0.95 → rumdl-0.0.96}/tests/integration_tests.rs +0 -0
  253. {rumdl-0.0.95 → rumdl-0.0.96}/tests/json_output_test.rs +0 -0
  254. {rumdl-0.0.95 → rumdl-0.0.96}/tests/lib.rs +0 -0
  255. {rumdl-0.0.95 → rumdl-0.0.96}/tests/lsp_editor_integration_tests.rs +0 -0
  256. {rumdl-0.0.95 → rumdl-0.0.96}/tests/lsp_integration_tests.rs +0 -0
  257. {rumdl-0.0.95 → rumdl-0.0.96}/tests/lsp_memory_leak_tests.rs +0 -0
  258. {rumdl-0.0.95 → rumdl-0.0.96}/tests/lsp_tests.rs +0 -0
  259. {rumdl-0.0.95 → rumdl-0.0.96}/tests/malformed_markdown_stress_tests.rs +0 -0
  260. {rumdl-0.0.95 → rumdl-0.0.96}/tests/markdownlint_cli_integration.rs +0 -0
  261. {rumdl-0.0.95 → rumdl-0.0.96}/tests/markdownlint_config_test.rs +0 -0
  262. {rumdl-0.0.95 → rumdl-0.0.96}/tests/markdownlintignore_test.rs +0 -0
  263. {rumdl-0.0.95 → rumdl-0.0.96}/tests/nested_code_block_test.rs +0 -0
  264. {rumdl-0.0.95 → rumdl-0.0.96}/tests/output_format_integration_tests.rs +0 -0
  265. {rumdl-0.0.95 → rumdl-0.0.96}/tests/output_format_tests.rs +0 -0
  266. {rumdl-0.0.95 → rumdl-0.0.96}/tests/perf_check.rs +0 -0
  267. {rumdl-0.0.95 → rumdl-0.0.96}/tests/performance_validation_tests.rs +0 -0
  268. {rumdl-0.0.95 → rumdl-0.0.96}/tests/pyproject_config_tests.rs +0 -0
  269. {rumdl-0.0.95 → rumdl-0.0.96}/tests/real_world_repository_tests.rs +0 -0
  270. {rumdl-0.0.95 → rumdl-0.0.96}/tests/regression_prevention_tests.rs +0 -0
  271. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md001_test.rs +0 -0
  272. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md001_unicode_test.rs +0 -0
  273. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md002_test.rs +0 -0
  274. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md003_test.rs +0 -0
  275. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md004_test.rs +0 -0
  276. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md005_test.rs +0 -0
  277. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md006_test.rs +0 -0
  278. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md006_unicode_test.rs +0 -0
  279. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md007_test.rs +0 -0
  280. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md009_test.rs +0 -0
  281. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md010_test.rs +0 -0
  282. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md011_test.rs +0 -0
  283. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md012_test.rs +0 -0
  284. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md014_test.rs +0 -0
  285. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md018_test.rs +0 -0
  286. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md019_test.rs +0 -0
  287. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md020_test.rs +0 -0
  288. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md021_test.rs +0 -0
  289. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md022_test.rs +0 -0
  290. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md023_extended_test.rs +0 -0
  291. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md023_test.rs +0 -0
  292. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md024_test.rs +0 -0
  293. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md025_test.rs +0 -0
  294. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md026_test.rs +0 -0
  295. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md027_test.rs +0 -0
  296. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md028_test.rs +0 -0
  297. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md029_test.rs +0 -0
  298. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md030_test.rs +0 -0
  299. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md031_test.rs +0 -0
  300. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md032_test.rs +0 -0
  301. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md033_extended_test.rs +0 -0
  302. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md033_test.rs +0 -0
  303. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md034_ipv6_test.rs +0 -0
  304. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md034_test.rs +0 -0
  305. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md035_test.rs +0 -0
  306. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md036_test.rs +0 -0
  307. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md037_test.rs +0 -0
  308. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md038_nested_backticks_test.rs +0 -0
  309. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md038_test.rs +0 -0
  310. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md039_test.rs +0 -0
  311. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md040_test.rs +0 -0
  312. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md041_test.rs +0 -0
  313. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md042_test.rs +0 -0
  314. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md043_test.rs +0 -0
  315. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md044_test.rs +0 -0
  316. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md045_test.rs +0 -0
  317. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md046_test.rs +0 -0
  318. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md047_test.rs +0 -0
  319. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md048_test.rs +0 -0
  320. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md049_test.rs +0 -0
  321. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md050_test.rs +0 -0
  322. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md051_test.rs +0 -0
  323. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md051_unicode_test.rs +0 -0
  324. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md052_test.rs +0 -0
  325. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md053_additional_test.rs +0 -0
  326. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md053_proptest.rs +0 -0
  327. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md053_test.rs +0 -0
  328. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md054_test.rs +0 -0
  329. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md054_unicode_test.rs +0 -0
  330. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md055_test.rs +0 -0
  331. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md056_test.rs +0 -0
  332. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md057_test.rs +0 -0
  333. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/md058_test.rs +0 -0
  334. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules/mod.rs +0 -0
  335. {rumdl-0.0.95 → rumdl-0.0.96}/tests/rules_mod_test.rs +0 -0
  336. {rumdl-0.0.95 → rumdl-0.0.96}/tests/thread_safety_tests.rs +0 -0
  337. {rumdl-0.0.95 → rumdl-0.0.96}/tests/unicode_edge_case_tests.rs +0 -0
  338. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils/blockquote_utils_test.rs +0 -0
  339. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils/code_block_utils_extended_test.rs +0 -0
  340. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils/code_block_utils_test.rs +0 -0
  341. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils/core_utils_test.rs +0 -0
  342. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils/front_matter_utils_test.rs +0 -0
  343. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils/line_index_test.rs +0 -0
  344. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils/mod.rs +0 -0
  345. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils_markdown_edge_cases.rs +0 -0
  346. {rumdl-0.0.95 → rumdl-0.0.96}/tests/utils_tests.rs +0 -0
  347. {rumdl-0.0.95 → rumdl-0.0.96}/tests/vscode_extension_fixes.rs +0 -0
  348. {rumdl-0.0.95 → rumdl-0.0.96}/tests/vscode_test.rs +0 -0
  349. {rumdl-0.0.95 → rumdl-0.0.96}/tests/vscode_tests.rs +0 -0
@@ -7,8 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.96] - 2025-07-16
11
+
12
+ ## [0.0.96] - 2025-07-16
13
+
14
+ ### Added
15
+ - MD013: Text reflow/wrapping functionality for automatic line breaking (fixes #13)
16
+ - New `enable_reflow` configuration option (disabled by default)
17
+ - Intelligently wraps long lines while preserving Markdown formatting
18
+ - Preserves bold, italic, links, code spans, and other Markdown elements
19
+ - Proper list continuation indentation that aligns with the text after markers
20
+ - Preserves hard line breaks (two trailing spaces)
21
+ - Does not wrap code blocks, tables, headings, or reference definitions
22
+ - Added `pulldown-cmark` dependency (v0.12.2) for improved Markdown parsing
23
+ - Comprehensive test coverage for text reflow functionality
24
+
25
+ ### Changed
26
+ - MD013: Enhanced fix functionality with optional text reflow (opt-in feature)
27
+
28
+ ### Fixed
29
+ - MD013: Fixed list indentation to properly align continuation lines with the text content
30
+
10
31
  ## [0.0.95] - 2025-07-15
11
32
 
33
+ ### Added
34
+ - Implemented 3-tier exit code system following Ruff's convention:
35
+ - Exit code 0: Success (no issues found)
36
+ - Exit code 1: Linting violations found
37
+ - Exit code 2: Tool error (config error, file access error, etc.)
38
+ - Added exit_codes module for cleaner exit code management
39
+
40
+ ### Changed
41
+ - Updated all error handlers to use appropriate exit codes
42
+ - CI/CD systems can now distinguish between markdown issues (exit 1) and tool failures (exit 2)
43
+
44
+ ### Documentation
45
+ - Updated README with exit code documentation
46
+ - Added exit codes section to CLI reference
47
+
12
48
  ## [0.0.94] - 2025-07-04
13
49
 
14
50
  ### Performance Improvements
@@ -149,7 +185,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
149
185
 
150
186
  - Initial implementation of remaining rules for markdownlint parity
151
187
 
152
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.95...HEAD
188
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.96...HEAD
189
+ [0.0.96]: https://github.com/rvben/rumdl/compare/v0.0.95...v0.0.96
153
190
  [0.0.95]: https://github.com/rvben/rumdl/compare/v0.0.94...v0.0.95
154
191
  [0.0.94]: https://github.com/rvben/rumdl/compare/v0.0.93...v0.0.94
155
192
  [0.0.93]: https://github.com/rvben/rumdl/compare/v0.0.92...v0.0.93
@@ -614,6 +614,15 @@ dependencies = [
614
614
  "slab",
615
615
  ]
616
616
 
617
+ [[package]]
618
+ name = "getopts"
619
+ version = "0.2.23"
620
+ source = "registry+https://github.com/rust-lang/crates.io-index"
621
+ checksum = "cba6ae63eb948698e300f645f87c70f76630d505f23b8907cf1e193ee85048c1"
622
+ dependencies = [
623
+ "unicode-width",
624
+ ]
625
+
617
626
  [[package]]
618
627
  name = "getrandom"
619
628
  version = "0.3.3"
@@ -1283,6 +1292,25 @@ dependencies = [
1283
1292
  "unarray",
1284
1293
  ]
1285
1294
 
1295
+ [[package]]
1296
+ name = "pulldown-cmark"
1297
+ version = "0.12.2"
1298
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1299
+ checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14"
1300
+ dependencies = [
1301
+ "bitflags 2.9.1",
1302
+ "getopts",
1303
+ "memchr",
1304
+ "pulldown-cmark-escape",
1305
+ "unicase",
1306
+ ]
1307
+
1308
+ [[package]]
1309
+ name = "pulldown-cmark-escape"
1310
+ version = "0.11.0"
1311
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1312
+ checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae"
1313
+
1286
1314
  [[package]]
1287
1315
  name = "pyo3"
1288
1316
  version = "0.24.2"
@@ -1465,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1465
1493
 
1466
1494
  [[package]]
1467
1495
  name = "rumdl"
1468
- version = "0.0.95"
1496
+ version = "0.0.96"
1469
1497
  dependencies = [
1470
1498
  "anyhow",
1471
1499
  "assert_cmd",
@@ -1488,6 +1516,7 @@ dependencies = [
1488
1516
  "predicates",
1489
1517
  "pretty_assertions",
1490
1518
  "proptest",
1519
+ "pulldown-cmark",
1491
1520
  "pyo3",
1492
1521
  "rand",
1493
1522
  "rayon",
@@ -1986,6 +2015,12 @@ version = "0.1.4"
1986
2015
  source = "registry+https://github.com/rust-lang/crates.io-index"
1987
2016
  checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94"
1988
2017
 
2018
+ [[package]]
2019
+ name = "unicase"
2020
+ version = "2.8.1"
2021
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2022
+ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539"
2023
+
1989
2024
  [[package]]
1990
2025
  name = "unicode-bidi"
1991
2026
  version = "0.3.18"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.95"
3
+ version = "0.0.96"
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)"
@@ -68,6 +68,7 @@ globset = "0.4.16"
68
68
  anyhow = "1.0"
69
69
  log = "0.4.27"
70
70
  markdown = "1.0"
71
+ pulldown-cmark = "0.12.2"
71
72
  regex = "1.11"
72
73
  toml_edit = "0.22"
73
74
  dyn-clone = "1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.95
3
+ Version: 0.0.96
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -36,6 +36,10 @@ pub struct MD013Config {
36
36
  /// Stern mode - stricter checking without exceptions (default: false)
37
37
  #[serde(default)]
38
38
  pub stern: bool,
39
+
40
+ /// Enable text reflow to wrap long lines (default: false)
41
+ #[serde(default)]
42
+ pub enable_reflow: bool,
39
43
  }
40
44
 
41
45
  fn default_line_length() -> usize {
@@ -65,6 +69,7 @@ impl Default for MD013Config {
65
69
  heading_line_length: None,
66
70
  code_block_line_length: None,
67
71
  stern: false,
72
+ enable_reflow: false,
68
73
  }
69
74
  }
70
75
  }
@@ -51,6 +51,7 @@ impl MD013LineLength {
51
51
  heading_line_length: None,
52
52
  code_block_line_length: None,
53
53
  stern: false,
54
+ enable_reflow: false,
54
55
  },
55
56
  }
56
57
  }
@@ -333,6 +334,18 @@ impl Rule for MD013LineLength {
333
334
  }
334
335
 
335
336
  fn fix(&self, ctx: &crate::lint_context::LintContext) -> Result<String, LintError> {
337
+ // If reflow is enabled, use the new text reflow functionality
338
+ if self.config.enable_reflow {
339
+ let reflow_options = crate::utils::text_reflow::ReflowOptions {
340
+ line_length: self.config.line_length,
341
+ break_on_sentences: true,
342
+ preserve_breaks: false,
343
+ };
344
+
345
+ return Ok(crate::utils::text_reflow::reflow_markdown(ctx.content, &reflow_options));
346
+ }
347
+
348
+ // Otherwise, use the existing fix logic (trimming whitespace)
336
349
  // Get all warnings with their fixes
337
350
  let warnings = self.check(ctx)?;
338
351
 
@@ -907,4 +920,132 @@ Another long line that should trigger a warning."#;
907
920
  // Should not flag because the URL is in a markdown link
908
921
  assert_eq!(result.len(), 0);
909
922
  }
923
+
924
+ #[test]
925
+ fn test_text_reflow_simple() {
926
+ let mut config = MD013Config::default();
927
+ config.line_length = 30;
928
+ config.enable_reflow = true;
929
+ let rule = MD013LineLength::from_config_struct(config);
930
+
931
+ let content = "This is a very long line that definitely exceeds thirty characters and needs to be wrapped.";
932
+ let ctx = LintContext::new(content);
933
+
934
+ let fixed = rule.fix(&ctx).unwrap();
935
+
936
+ // Verify all lines are under 30 chars
937
+ for line in fixed.lines() {
938
+ assert!(line.chars().count() <= 30, "Line too long: {} (len={})", line, line.chars().count());
939
+ }
940
+
941
+ // Verify content is preserved
942
+ let fixed_words: Vec<&str> = fixed.split_whitespace().collect();
943
+ let original_words: Vec<&str> = content.split_whitespace().collect();
944
+ assert_eq!(fixed_words, original_words);
945
+ }
946
+
947
+ #[test]
948
+ fn test_text_reflow_preserves_markdown_elements() {
949
+ let mut config = MD013Config::default();
950
+ config.line_length = 40;
951
+ config.enable_reflow = true;
952
+ let rule = MD013LineLength::from_config_struct(config);
953
+
954
+ let content = "This paragraph has **bold text** and *italic text* and [a link](https://example.com) that should be preserved.";
955
+ let ctx = LintContext::new(content);
956
+
957
+ let fixed = rule.fix(&ctx).unwrap();
958
+
959
+ // Verify markdown elements are preserved
960
+ assert!(fixed.contains("**bold text**"), "Bold text not preserved in: {}", fixed);
961
+ assert!(fixed.contains("*italic text*"), "Italic text not preserved in: {}", fixed);
962
+ assert!(fixed.contains("[a link](https://example.com)"), "Link not preserved in: {}", fixed);
963
+
964
+ // Verify all lines are under 40 chars
965
+ for line in fixed.lines() {
966
+ assert!(line.len() <= 40, "Line too long: {}", line);
967
+ }
968
+ }
969
+
970
+ #[test]
971
+ fn test_text_reflow_preserves_code_blocks() {
972
+ let mut config = MD013Config::default();
973
+ config.line_length = 30;
974
+ config.enable_reflow = true;
975
+ let rule = MD013LineLength::from_config_struct(config);
976
+
977
+ let content = r#"Here is some text.
978
+
979
+ ```python
980
+ def very_long_function_name_that_exceeds_limit():
981
+ return "This should not be wrapped"
982
+ ```
983
+
984
+ More text after code block."#;
985
+ let ctx = LintContext::new(content);
986
+
987
+ let fixed = rule.fix(&ctx).unwrap();
988
+
989
+ // Verify code block is preserved
990
+ assert!(fixed.contains("def very_long_function_name_that_exceeds_limit():"));
991
+ assert!(fixed.contains("```python"));
992
+ assert!(fixed.contains("```"));
993
+ }
994
+
995
+ #[test]
996
+ fn test_text_reflow_preserves_lists() {
997
+ let mut config = MD013Config::default();
998
+ config.line_length = 30;
999
+ config.enable_reflow = true;
1000
+ let rule = MD013LineLength::from_config_struct(config);
1001
+
1002
+ let content = r#"Here is a list:
1003
+
1004
+ 1. First item with a very long line that needs wrapping
1005
+ 2. Second item is short
1006
+ 3. Third item also has a long line that exceeds the limit
1007
+
1008
+ And a bullet list:
1009
+
1010
+ - Bullet item with very long content that needs wrapping
1011
+ - Short bullet"#;
1012
+ let ctx = LintContext::new(content);
1013
+
1014
+ let fixed = rule.fix(&ctx).unwrap();
1015
+
1016
+ // Verify list structure is preserved
1017
+ assert!(fixed.contains("1. "));
1018
+ assert!(fixed.contains("2. "));
1019
+ assert!(fixed.contains("3. "));
1020
+ assert!(fixed.contains("- "));
1021
+
1022
+ // Verify proper indentation for wrapped lines
1023
+ let lines: Vec<&str> = fixed.lines().collect();
1024
+ for (i, line) in lines.iter().enumerate() {
1025
+ if line.trim().starts_with("1.") || line.trim().starts_with("2.") ||
1026
+ line.trim().starts_with("3.") || line.trim().starts_with("-") {
1027
+ // Check if next line is a continuation (should be indented)
1028
+ if i + 1 < lines.len() && !lines[i + 1].trim().is_empty() &&
1029
+ !lines[i + 1].trim().starts_with(char::is_numeric) &&
1030
+ !lines[i + 1].trim().starts_with("-") {
1031
+ // Continuation lines should have proper indentation
1032
+ assert!(lines[i + 1].starts_with(" ") || lines[i + 1].trim().is_empty());
1033
+ }
1034
+ }
1035
+ }
1036
+ }
1037
+
1038
+ #[test]
1039
+ fn test_text_reflow_disabled_by_default() {
1040
+ let rule = MD013LineLength::new(30, false, false, false, false);
1041
+
1042
+ let content = "This is a very long line that definitely exceeds thirty characters.";
1043
+ let ctx = LintContext::new(content);
1044
+
1045
+ let fixed = rule.fix(&ctx).unwrap();
1046
+
1047
+ // Without reflow enabled, it should only trim whitespace (if any)
1048
+ // Since there's no trailing whitespace, content should be unchanged
1049
+ assert_eq!(fixed, content);
1050
+ }
910
1051
  }
@@ -14,6 +14,7 @@ pub mod range_utils;
14
14
  pub mod regex_cache;
15
15
  pub mod string_interner;
16
16
  pub mod table_utils;
17
+ pub mod text_reflow;
17
18
 
18
19
  pub use ast_utils::AstCache;
19
20
  pub use code_block_utils::CodeBlockUtils;