rumdl 0.0.135__tar.gz → 0.0.137__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 (427) hide show
  1. {rumdl-0.0.135 → rumdl-0.0.137}/CHANGELOG.md +12 -1
  2. {rumdl-0.0.135 → rumdl-0.0.137}/Cargo.lock +3 -3
  3. {rumdl-0.0.135 → rumdl-0.0.137}/Cargo.toml +1 -1
  4. {rumdl-0.0.135 → rumdl-0.0.137}/PKG-INFO +1 -1
  5. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md009_trailing_spaces.rs +85 -12
  6. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md013_line_length.rs +109 -47
  7. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md034_no_bare_urls.rs +5 -2
  8. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/github.rs +54 -9
  9. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/text_reflow.rs +97 -9
  10. {rumdl-0.0.135 → rumdl-0.0.137}/tests/comprehensive_output_format_tests.rs +3 -5
  11. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md009_test.rs +15 -5
  12. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md013_test.rs +4 -2
  13. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_regression_prevention_test.rs +4 -4
  14. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_test.rs +35 -0
  15. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md052_test.rs +25 -0
  16. {rumdl-0.0.135 → rumdl-0.0.137}/.config/nextest.toml +0 -0
  17. {rumdl-0.0.135 → rumdl-0.0.137}/.mise.toml +0 -0
  18. {rumdl-0.0.135 → rumdl-0.0.137}/.pre-commit-config.yaml +0 -0
  19. {rumdl-0.0.135 → rumdl-0.0.137}/.rumdl.toml +0 -0
  20. {rumdl-0.0.135 → rumdl-0.0.137}/.rustfmt.toml +0 -0
  21. {rumdl-0.0.135 → rumdl-0.0.137}/LICENSE +0 -0
  22. {rumdl-0.0.135 → rumdl-0.0.137}/MANIFEST.in +0 -0
  23. {rumdl-0.0.135 → rumdl-0.0.137}/Makefile +0 -0
  24. {rumdl-0.0.135 → rumdl-0.0.137}/README.md +0 -0
  25. {rumdl-0.0.135 → rumdl-0.0.137}/assets/logo.png +0 -0
  26. {rumdl-0.0.135 → rumdl-0.0.137}/benches/fix_performance.rs +0 -0
  27. {rumdl-0.0.135 → rumdl-0.0.137}/benches/range_performance.rs +0 -0
  28. {rumdl-0.0.135 → rumdl-0.0.137}/benches/range_utils_benchmark.rs +0 -0
  29. {rumdl-0.0.135 → rumdl-0.0.137}/benches/rule_performance.rs +0 -0
  30. {rumdl-0.0.135 → rumdl-0.0.137}/benches/simple_fix_bench.rs +0 -0
  31. {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/bench_lint_context.rs +0 -0
  32. {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/benchmark.rs +0 -0
  33. {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/benchmark_rule.rs +0 -0
  34. {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  35. {rumdl-0.0.135 → rumdl-0.0.137}/benchmark/bin/measure_code_span_performance.rs +0 -0
  36. {rumdl-0.0.135 → rumdl-0.0.137}/docs/RULES.md +0 -0
  37. {rumdl-0.0.135 → rumdl-0.0.137}/docs/global-settings.md +0 -0
  38. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md001.md +0 -0
  39. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md002.md +0 -0
  40. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md003.md +0 -0
  41. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md004.md +0 -0
  42. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md005.md +0 -0
  43. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md006.md +0 -0
  44. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md007.md +0 -0
  45. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md009.md +0 -0
  46. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md010.md +0 -0
  47. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md011.md +0 -0
  48. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md012.md +0 -0
  49. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md013.md +0 -0
  50. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md014.md +0 -0
  51. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md018.md +0 -0
  52. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md019.md +0 -0
  53. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md020.md +0 -0
  54. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md021.md +0 -0
  55. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md022.md +0 -0
  56. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md023.md +0 -0
  57. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md024.md +0 -0
  58. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md025.md +0 -0
  59. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md026.md +0 -0
  60. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md027.md +0 -0
  61. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md028.md +0 -0
  62. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md029.md +0 -0
  63. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md030.md +0 -0
  64. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md031.md +0 -0
  65. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md032.md +0 -0
  66. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md033.md +0 -0
  67. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md034.md +0 -0
  68. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md035.md +0 -0
  69. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md036.md +0 -0
  70. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md037.md +0 -0
  71. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md038.md +0 -0
  72. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md039.md +0 -0
  73. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md040.md +0 -0
  74. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md041.md +0 -0
  75. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md042.md +0 -0
  76. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md043.md +0 -0
  77. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md044.md +0 -0
  78. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md045.md +0 -0
  79. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md046.md +0 -0
  80. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md047.md +0 -0
  81. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md048.md +0 -0
  82. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md049.md +0 -0
  83. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md050.md +0 -0
  84. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md051.md +0 -0
  85. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md052.md +0 -0
  86. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md053.md +0 -0
  87. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md054.md +0 -0
  88. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md055.md +0 -0
  89. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md056.md +0 -0
  90. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md057.md +0 -0
  91. {rumdl-0.0.135 → rumdl-0.0.137}/docs/md058.md +0 -0
  92. {rumdl-0.0.135 → rumdl-0.0.137}/docs/vscode-extension.md +0 -0
  93. {rumdl-0.0.135 → rumdl-0.0.137}/parity_check.py +0 -0
  94. {rumdl-0.0.135 → rumdl-0.0.137}/pyproject.toml +0 -0
  95. {rumdl-0.0.135 → rumdl-0.0.137}/python/MANIFEST.in +0 -0
  96. {rumdl-0.0.135 → rumdl-0.0.137}/python/PYTHON-README.md +0 -0
  97. {rumdl-0.0.135 → rumdl-0.0.137}/python/rumdl/__init__.py +0 -0
  98. {rumdl-0.0.135 → rumdl-0.0.137}/python/rumdl/__main__.py +0 -0
  99. {rumdl-0.0.135 → rumdl-0.0.137}/python/rumdl/py.typed +0 -0
  100. {rumdl-0.0.135 → rumdl-0.0.137}/rumdl.toml.example +0 -0
  101. {rumdl-0.0.135 → rumdl-0.0.137}/rust-toolchain.toml +0 -0
  102. {rumdl-0.0.135 → rumdl-0.0.137}/scripts/extract-changelog.sh +0 -0
  103. {rumdl-0.0.135 → rumdl-0.0.137}/scripts/generate-downloads-table.sh +0 -0
  104. {rumdl-0.0.135 → rumdl-0.0.137}/scripts/pre-release.sh +0 -0
  105. {rumdl-0.0.135 → rumdl-0.0.137}/scripts/prepare-release.sh +0 -0
  106. {rumdl-0.0.135 → rumdl-0.0.137}/scripts/setup-pre-commit.sh +0 -0
  107. {rumdl-0.0.135 → rumdl-0.0.137}/scripts/update-pre-commit-docs.sh +0 -0
  108. {rumdl-0.0.135 → rumdl-0.0.137}/src/config.rs +0 -0
  109. {rumdl-0.0.135 → rumdl-0.0.137}/src/exit_codes.rs +0 -0
  110. {rumdl-0.0.135 → rumdl-0.0.137}/src/inline_config.rs +0 -0
  111. {rumdl-0.0.135 → rumdl-0.0.137}/src/lib.rs +0 -0
  112. {rumdl-0.0.135 → rumdl-0.0.137}/src/lint_context.rs +0 -0
  113. {rumdl-0.0.135 → rumdl-0.0.137}/src/lsp/mod.rs +0 -0
  114. {rumdl-0.0.135 → rumdl-0.0.137}/src/lsp/server.rs +0 -0
  115. {rumdl-0.0.135 → rumdl-0.0.137}/src/lsp/types.rs +0 -0
  116. {rumdl-0.0.135 → rumdl-0.0.137}/src/main.rs +0 -0
  117. {rumdl-0.0.135 → rumdl-0.0.137}/src/markdownlint_config.rs +0 -0
  118. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/azure.rs +0 -0
  119. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/concise.rs +0 -0
  120. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/github.rs +0 -0
  121. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/gitlab.rs +0 -0
  122. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/grouped.rs +0 -0
  123. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/json.rs +0 -0
  124. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/json_lines.rs +0 -0
  125. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/junit.rs +0 -0
  126. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/mod.rs +0 -0
  127. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/pylint.rs +0 -0
  128. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/sarif.rs +0 -0
  129. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/formatters/text.rs +0 -0
  130. {rumdl-0.0.135 → rumdl-0.0.137}/src/output/mod.rs +0 -0
  131. {rumdl-0.0.135 → rumdl-0.0.137}/src/parallel.rs +0 -0
  132. {rumdl-0.0.135 → rumdl-0.0.137}/src/performance.rs +0 -0
  133. {rumdl-0.0.135 → rumdl-0.0.137}/src/profiling.rs +0 -0
  134. {rumdl-0.0.135 → rumdl-0.0.137}/src/python.rs +0 -0
  135. {rumdl-0.0.135 → rumdl-0.0.137}/src/rule.rs +0 -0
  136. {rumdl-0.0.135 → rumdl-0.0.137}/src/rule_config.rs +0 -0
  137. {rumdl-0.0.135 → rumdl-0.0.137}/src/rule_config_serde.rs +0 -0
  138. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/blockquote_utils.rs +0 -0
  139. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/code_block_utils.rs +0 -0
  140. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/code_fence_utils.rs +0 -0
  141. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/emphasis_style.rs +0 -0
  142. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/front_matter_utils.rs +0 -0
  143. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/heading_utils.rs +0 -0
  144. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/list_utils.rs +0 -0
  145. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md001_heading_increment.rs +0 -0
  146. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  147. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md002_first_heading_h1.rs +0 -0
  148. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md003_heading_style/md003_config.rs +0 -0
  149. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md003_heading_style.rs +0 -0
  150. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  151. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md004_unordered_list_style.rs +0 -0
  152. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md005_list_indent.rs +0 -0
  153. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md006_start_bullets.rs +0 -0
  154. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  155. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md007_ul_indent.rs +0 -0
  156. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  157. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  158. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md010_no_hard_tabs.rs +0 -0
  159. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md011_no_reversed_links.rs +0 -0
  160. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  161. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md012_no_multiple_blanks.rs +0 -0
  162. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md013_line_length/md013_config.rs +0 -0
  163. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  164. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md014_commands_show_output.rs +0 -0
  165. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md018_no_missing_space_atx.rs +0 -0
  166. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  167. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  168. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  169. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  170. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md022_blanks_around_headings.rs +0 -0
  171. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md023_heading_start_left.rs +0 -0
  172. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  173. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md024_no_duplicate_heading.rs +0 -0
  174. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md025_single_title/md025_config.rs +0 -0
  175. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md025_single_title.rs +0 -0
  176. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  177. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  178. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  179. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  180. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  181. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md029_ordered_list_prefix.rs +0 -0
  182. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  183. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md030_list_marker_space.rs +0 -0
  184. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md031_blanks_around_fences.rs +0 -0
  185. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md032_blanks_around_lists.rs +0 -0
  186. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  187. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md033_no_inline_html.rs +0 -0
  188. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md035_hr_style/md035_config.rs +0 -0
  189. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md035_hr_style.rs +0 -0
  190. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  191. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  192. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  193. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md038_no_space_in_code.rs +0 -0
  194. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md039_no_space_in_links.rs +0 -0
  195. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md040_fenced_code_language.rs +0 -0
  196. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md041_first_line_heading.rs +0 -0
  197. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md042_no_empty_links.rs +0 -0
  198. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md043_required_headings.rs +0 -0
  199. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md044_proper_names/md044_config.rs +0 -0
  200. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md044_proper_names.rs +0 -0
  201. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  202. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md045_no_alt_text.rs +0 -0
  203. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  204. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md046_code_block_style.rs +0 -0
  205. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md047_single_trailing_newline.rs +0 -0
  206. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  207. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md048_code_fence_style.rs +0 -0
  208. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  209. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md049_emphasis_style.rs +0 -0
  210. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md050_strong_style/md050_config.rs +0 -0
  211. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md050_strong_style.rs +0 -0
  212. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md051_link_fragments.rs +0 -0
  213. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md052_reference_links_images.rs +0 -0
  214. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  215. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  216. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md054_link_image_style.rs +0 -0
  217. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  218. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md055_table_pipe_style.rs +0 -0
  219. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md056_table_column_count.rs +0 -0
  220. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  221. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md057_existing_relative_links.rs +0 -0
  222. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/md058_blanks_around_tables.rs +0 -0
  223. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/mod.rs +0 -0
  224. {rumdl-0.0.135 → rumdl-0.0.137}/src/rules/strong_style.rs +0 -0
  225. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/jekyll.rs +0 -0
  226. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/kramdown.rs +0 -0
  227. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
  228. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/anchor_styles/mod.rs +0 -0
  229. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/ast_utils.rs +0 -0
  230. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/code_block_utils.rs +0 -0
  231. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/document_structure.rs +0 -0
  232. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/early_returns.rs +0 -0
  233. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/element_cache.rs +0 -0
  234. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/emphasis_utils.rs +0 -0
  235. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/fix_utils.rs +0 -0
  236. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/header_id_utils.rs +0 -0
  237. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/kramdown_utils.rs +0 -0
  238. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/line_ending.rs +0 -0
  239. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/markdown_elements.rs +0 -0
  240. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_admonitions.rs +0 -0
  241. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_common.rs +0 -0
  242. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_critic.rs +0 -0
  243. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_footnotes.rs +0 -0
  244. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_patterns.rs +0 -0
  245. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_snippets.rs +0 -0
  246. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_tabs.rs +0 -0
  247. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocs_test_utils.rs +0 -0
  248. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mkdocstrings_refs.rs +0 -0
  249. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/mod.rs +0 -0
  250. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/range_utils.rs +0 -0
  251. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/regex_cache.rs +0 -0
  252. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/skip_context.rs +0 -0
  253. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/string_interner.rs +0 -0
  254. {rumdl-0.0.135 → rumdl-0.0.137}/src/utils/table_utils.rs +0 -0
  255. {rumdl-0.0.135 → rumdl-0.0.137}/src/vscode.rs +0 -0
  256. {rumdl-0.0.135 → rumdl-0.0.137}/tests/advanced_integration_tests.rs +0 -0
  257. {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/additional_tests.rs +0 -0
  258. {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/basic_tests.rs +0 -0
  259. {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/comprehensive_tests.rs +0 -0
  260. {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/extended_tests.rs +0 -0
  261. {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/mod.rs +0 -0
  262. {rumdl-0.0.135 → rumdl-0.0.137}/tests/character_ranges/unicode_utils.rs +0 -0
  263. {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_duplication_test.rs +0 -0
  264. {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_explain_test.rs +0 -0
  265. {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_flag_precedence_test.rs +0 -0
  266. {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_integration_tests.rs +0 -0
  267. {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_lsp_fix_consistency.rs +0 -0
  268. {rumdl-0.0.135 → rumdl-0.0.137}/tests/cli_statistics_test.rs +0 -0
  269. {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/cli_test_utils.rs +0 -0
  270. {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/fixtures.rs +0 -0
  271. {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/mod.rs +0 -0
  272. {rumdl-0.0.135 → rumdl-0.0.137}/tests/common/test_utils.rs +0 -0
  273. {rumdl-0.0.135 → rumdl-0.0.137}/tests/commonmark_compliance_tests.rs +0 -0
  274. {rumdl-0.0.135 → rumdl-0.0.137}/tests/comprehensive_integration_tests.rs +0 -0
  275. {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_application_tests.rs +0 -0
  276. {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_file_command_test.rs +0 -0
  277. {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_tests.rs +0 -0
  278. {rumdl-0.0.135 → rumdl-0.0.137}/tests/config_upward_traversal_test.rs +0 -0
  279. {rumdl-0.0.135 → rumdl-0.0.137}/tests/configuration_inheritance_tests.rs +0 -0
  280. {rumdl-0.0.135 → rumdl-0.0.137}/tests/consistency_regression_tests.rs +0 -0
  281. {rumdl-0.0.135 → rumdl-0.0.137}/tests/cross_platform_compatibility_tests.rs +0 -0
  282. {rumdl-0.0.135 → rumdl-0.0.137}/tests/deeply_nested_lists_performance_test.rs +0 -0
  283. {rumdl-0.0.135 → rumdl-0.0.137}/tests/escaped_brackets_test.rs +0 -0
  284. {rumdl-0.0.135 → rumdl-0.0.137}/tests/final_confidence_assessment.rs +0 -0
  285. {rumdl-0.0.135 → rumdl-0.0.137}/tests/fixable_unfixable_config_test.rs +0 -0
  286. {rumdl-0.0.135 → rumdl-0.0.137}/tests/init_command_test.rs +0 -0
  287. {rumdl-0.0.135 → rumdl-0.0.137}/tests/init_tests.rs +0 -0
  288. {rumdl-0.0.135 → rumdl-0.0.137}/tests/inline_config_blocks_test.rs +0 -0
  289. {rumdl-0.0.135 → rumdl-0.0.137}/tests/inline_config_test.rs +0 -0
  290. {rumdl-0.0.135 → rumdl-0.0.137}/tests/integration_tests.rs +0 -0
  291. {rumdl-0.0.135 → rumdl-0.0.137}/tests/json_output_test.rs +0 -0
  292. {rumdl-0.0.135 → rumdl-0.0.137}/tests/kramdown_integration_test.rs +0 -0
  293. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lib.rs +0 -0
  294. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_editor_integration_tests.rs +0 -0
  295. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_formatting_tests.rs +0 -0
  296. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_initialization_options_test.rs +0 -0
  297. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_integration_tests.rs +0 -0
  298. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_memory_leak_tests.rs +0 -0
  299. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_mkdocs_flavor_test.rs +0 -0
  300. {rumdl-0.0.135 → rumdl-0.0.137}/tests/lsp_tests.rs +0 -0
  301. {rumdl-0.0.135 → rumdl-0.0.137}/tests/malformed_markdown_stress_tests.rs +0 -0
  302. {rumdl-0.0.135 → rumdl-0.0.137}/tests/markdownlint_cli_integration.rs +0 -0
  303. {rumdl-0.0.135 → rumdl-0.0.137}/tests/markdownlint_config_test.rs +0 -0
  304. {rumdl-0.0.135 → rumdl-0.0.137}/tests/markdownlintignore_test.rs +0 -0
  305. {rumdl-0.0.135 → rumdl-0.0.137}/tests/md013_reflow_integration_test.rs +0 -0
  306. {rumdl-0.0.135 → rumdl-0.0.137}/tests/md037_xxxx_regression_test.rs +0 -0
  307. {rumdl-0.0.135 → rumdl-0.0.137}/tests/md051_issue_39_regression_test.rs +0 -0
  308. {rumdl-0.0.135 → rumdl-0.0.137}/tests/nested_code_block_test.rs +0 -0
  309. {rumdl-0.0.135 → rumdl-0.0.137}/tests/output_format_integration_tests.rs +0 -0
  310. {rumdl-0.0.135 → rumdl-0.0.137}/tests/output_format_tests.rs +0 -0
  311. {rumdl-0.0.135 → rumdl-0.0.137}/tests/perf_check.rs +0 -0
  312. {rumdl-0.0.135 → rumdl-0.0.137}/tests/performance_validation_tests.rs +0 -0
  313. {rumdl-0.0.135 → rumdl-0.0.137}/tests/pyproject_config_tests.rs +0 -0
  314. {rumdl-0.0.135 → rumdl-0.0.137}/tests/python_bindings_test.rs +0 -0
  315. {rumdl-0.0.135 → rumdl-0.0.137}/tests/real_world_repository_tests.rs +0 -0
  316. {rumdl-0.0.135 → rumdl-0.0.137}/tests/regression_prevention_tests.rs +0 -0
  317. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  318. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/heading_edge_cases_test.rs +0 -0
  319. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  320. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/link_edge_cases_test.rs +0 -0
  321. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/list_rules_integration_test.rs +0 -0
  322. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md001_test.rs +0 -0
  323. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md001_unicode_test.rs +0 -0
  324. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md002_test.rs +0 -0
  325. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md003_test.rs +0 -0
  326. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md004_test.rs +0 -0
  327. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md005_dynamic_indent_test.rs +0 -0
  328. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md005_test.rs +0 -0
  329. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md005_unicode_test.rs +0 -0
  330. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md006_test.rs +0 -0
  331. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md006_unicode_test.rs +0 -0
  332. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md007_test.rs +0 -0
  333. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md010_test.rs +0 -0
  334. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md011_test.rs +0 -0
  335. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md012_test.rs +0 -0
  336. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md014_test.rs +0 -0
  337. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md018_test.rs +0 -0
  338. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md019_test.rs +0 -0
  339. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md020_test.rs +0 -0
  340. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md021_test.rs +0 -0
  341. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md022_test.rs +0 -0
  342. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md023_extended_test.rs +0 -0
  343. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md023_test.rs +0 -0
  344. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md024_test.rs +0 -0
  345. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md025_test.rs +0 -0
  346. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md026_kramdown_test.rs +0 -0
  347. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md026_test.rs +0 -0
  348. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md027_test.rs +0 -0
  349. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md028_md009_interaction_test.rs +0 -0
  350. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md028_test.rs +0 -0
  351. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_code_block_separation_test.rs +0 -0
  352. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_fix_test.rs +0 -0
  353. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_issue42_test.rs +0 -0
  354. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
  355. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
  356. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_test.rs +0 -0
  357. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md029_unicode_test.rs +0 -0
  358. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md030_test.rs +0 -0
  359. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md031_kramdown_test.rs +0 -0
  360. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md031_test.rs +0 -0
  361. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md032_test.rs +0 -0
  362. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md033_extended_test.rs +0 -0
  363. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md033_kramdown_test.rs +0 -0
  364. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md033_test.rs +0 -0
  365. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md034_ipv6_test.rs +0 -0
  366. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md034_test.rs +0 -0
  367. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md035_test.rs +0 -0
  368. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md036_test.rs +0 -0
  369. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md037_kramdown_test.rs +0 -0
  370. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md037_test.rs +0 -0
  371. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md038_nested_backticks_test.rs +0 -0
  372. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md038_test.rs +0 -0
  373. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md039_test.rs +0 -0
  374. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md040_test.rs +0 -0
  375. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md041_test.rs +0 -0
  376. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md042_test.rs +0 -0
  377. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md043_test.rs +0 -0
  378. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md044_test.rs +0 -0
  379. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md045_test.rs +0 -0
  380. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md046_test.rs +0 -0
  381. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md047_test.rs +0 -0
  382. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md048_test.rs +0 -0
  383. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md049_test.rs +0 -0
  384. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md050_test.rs +0 -0
  385. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_comprehensive_test.rs +0 -0
  386. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
  387. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_edge_cases_test.rs +0 -0
  388. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_issue_39_regression_test.rs +0 -0
  389. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
  390. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_property_based_test.rs +0 -0
  391. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md051_unicode_security_test.rs +0 -0
  392. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md053_additional_test.rs +0 -0
  393. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md053_proptest.rs +0 -0
  394. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md053_test.rs +0 -0
  395. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md054_test.rs +0 -0
  396. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md054_unicode_test.rs +0 -0
  397. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md055_test.rs +0 -0
  398. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md056_test.rs +0 -0
  399. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md057_test.rs +0 -0
  400. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md058_kramdown_test.rs +0 -0
  401. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/md058_test.rs +0 -0
  402. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_admonitions_test.rs +0 -0
  403. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
  404. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_extensions_test.rs +0 -0
  405. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mkdocs_snippets_test.rs +0 -0
  406. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/mod.rs +0 -0
  407. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules/rule_interaction_test.rs +0 -0
  408. {rumdl-0.0.135 → rumdl-0.0.137}/tests/rules_mod_test.rs +0 -0
  409. {rumdl-0.0.135 → rumdl-0.0.137}/tests/skip_context_tests.rs +0 -0
  410. {rumdl-0.0.135 → rumdl-0.0.137}/tests/test_underscore_edge_cases.rs +0 -0
  411. {rumdl-0.0.135 → rumdl-0.0.137}/tests/thread_safety_tests.rs +0 -0
  412. {rumdl-0.0.135 → rumdl-0.0.137}/tests/unfixable_rules_test.rs +0 -0
  413. {rumdl-0.0.135 → rumdl-0.0.137}/tests/unicode_edge_case_tests.rs +0 -0
  414. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/blockquote_utils_test.rs +0 -0
  415. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/code_block_utils_extended_test.rs +0 -0
  416. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/code_block_utils_test.rs +0 -0
  417. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/core_utils_test.rs +0 -0
  418. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/front_matter_utils_test.rs +0 -0
  419. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/line_index_test.rs +0 -0
  420. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils/mod.rs +0 -0
  421. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils_markdown_edge_cases.rs +0 -0
  422. {rumdl-0.0.135 → rumdl-0.0.137}/tests/utils_tests.rs +0 -0
  423. {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_extension_fixes.rs +0 -0
  424. {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_test.rs +0 -0
  425. {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_tests.rs +0 -0
  426. {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_windows_comprehensive_test.rs +0 -0
  427. {rumdl-0.0.135 → rumdl-0.0.137}/tests/vscode_windows_test.rs +0 -0
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.137] - 2025-09-04
11
+
12
+ ### Fixed
13
+ - **MD051**: Fixed GitHub anchor generation for headers with arrow patterns (fixes #82)
14
+ - Headers like `WAL->L0 Compaction` now correctly generate `#wal-l0-compaction` anchors
15
+ - Arrow patterns (`->`, `-->`) now convert to the correct number of hyphens based on surrounding spaces
16
+
17
+ ## [0.0.136] - 2025-09-03
18
+
10
19
  ## [0.0.135] - 2025-09-03
11
20
 
12
21
  ## [0.0.134] - 2025-09-02
@@ -560,7 +569,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
560
569
 
561
570
  - Initial implementation of remaining rules for markdownlint parity
562
571
 
563
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.135...HEAD
572
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.137...HEAD
573
+ [0.0.137]: https://github.com/rvben/rumdl/compare/v0.0.136...v0.0.137
574
+ [0.0.136]: https://github.com/rvben/rumdl/compare/v0.0.135...v0.0.136
564
575
  [0.0.135]: https://github.com/rvben/rumdl/compare/v0.0.134...v0.0.135
565
576
  [0.0.134]: https://github.com/rvben/rumdl/compare/v0.0.133...v0.0.134
566
577
  [0.0.133]: https://github.com/rvben/rumdl/compare/v0.0.132...v0.0.133
@@ -1087,9 +1087,9 @@ dependencies = [
1087
1087
 
1088
1088
  [[package]]
1089
1089
  name = "log"
1090
- version = "0.4.27"
1090
+ version = "0.4.28"
1091
1091
  source = "registry+https://github.com/rust-lang/crates.io-index"
1092
- checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
1092
+ checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
1093
1093
 
1094
1094
  [[package]]
1095
1095
  name = "lsp-types"
@@ -1632,7 +1632,7 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1632
1632
 
1633
1633
  [[package]]
1634
1634
  name = "rumdl"
1635
- version = "0.0.135"
1635
+ version = "0.0.137"
1636
1636
  dependencies = [
1637
1637
  "anyhow",
1638
1638
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.135"
3
+ version = "0.0.137"
4
4
  edition = "2024"
5
5
  rust-version = "1.89.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.135
3
+ Version: 0.0.137
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -153,7 +153,10 @@ impl Rule for MD009TrailingSpaces {
153
153
  trimmed.len() + 1,
154
154
  trailing_spaces,
155
155
  ),
156
- replacement: if !self.config.strict && !is_truly_last_line && trailing_spaces > 0 {
156
+ replacement: if !self.config.strict
157
+ && !is_truly_last_line
158
+ && trailing_spaces == self.config.br_spaces
159
+ {
157
160
  " ".repeat(self.config.br_spaces)
158
161
  } else {
159
162
  String::new()
@@ -236,11 +239,15 @@ impl Rule for MD009TrailingSpaces {
236
239
  false
237
240
  };
238
241
 
239
- // In non-strict mode, preserve line breaks by normalizing to br_spaces
242
+ // In non-strict mode, preserve line breaks ONLY if they have exactly br_spaces
240
243
  // BUT: Never preserve trailing spaces in headings or empty blockquotes as they serve no purpose
241
- if !self.config.strict && !is_truly_last_line && trailing_spaces > 0 && !is_heading && !is_empty_blockquote
244
+ if !self.config.strict
245
+ && !is_truly_last_line
246
+ && trailing_spaces == self.config.br_spaces
247
+ && !is_heading
248
+ && !is_empty_blockquote
242
249
  {
243
- // Optimize for common case of 2 spaces
250
+ // Preserve the exact number of spaces for hard line breaks
244
251
  match self.config.br_spaces {
245
252
  0 => {}
246
253
  1 => result.push(' '),
@@ -330,7 +337,10 @@ mod tests {
330
337
  let content = "Line with spaces \nAnother line \nClean line";
331
338
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
332
339
  let fixed = rule.fix(&ctx).unwrap();
333
- assert_eq!(fixed, "Line with spaces \nAnother line \nClean line");
340
+ // Line 1: 3 spaces -> removed (doesn't match br_spaces=2)
341
+ // Line 2: 2 spaces -> kept (matches br_spaces=2)
342
+ // Line 3: no spaces -> unchanged
343
+ assert_eq!(fixed, "Line with spaces\nAnother line \nClean line");
334
344
  }
335
345
 
336
346
  #[test]
@@ -366,19 +376,19 @@ mod tests {
366
376
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
367
377
  let result = rule.check(&ctx).unwrap();
368
378
  // br_spaces=2, so lines with exactly 2 spaces are OK
369
- // Line 2 has 3 spaces (will be normalized to 2)
379
+ // Line 2 has 3 spaces (should be removed, not normalized)
370
380
  // Line 3 has 1 space and is last line without newline (will be removed)
371
381
  assert_eq!(result.len(), 2);
372
382
  assert_eq!(result[0].line, 2);
373
383
  assert_eq!(result[1].line, 3);
374
384
 
375
385
  let fixed = rule.fix(&ctx).unwrap();
376
- // Line 1: keeps 2 spaces
377
- // Line 2: normalized from 3 to 2 spaces
386
+ // Line 1: keeps 2 spaces (exact match with br_spaces)
387
+ // Line 2: removes all 3 spaces (doesn't match br_spaces)
378
388
  // Line 3: last line without newline, spaces removed
379
389
  assert_eq!(
380
390
  fixed,
381
- "Line with two spaces \nLine with three spaces \nLine with one space"
391
+ "Line with two spaces \nLine with three spaces\nLine with one space"
382
392
  );
383
393
  }
384
394
 
@@ -586,14 +596,16 @@ mod tests {
586
596
  let content = "> > Nested \n> > \n> Normal ";
587
597
  let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
588
598
  let result = rule.check(&ctx).unwrap();
589
- // Line 2 has empty blockquote, line 3 is last line without newline
599
+ // Line 2 has empty blockquote with 3 spaces, line 3 is last line without newline
590
600
  assert_eq!(result.len(), 2);
591
601
  assert_eq!(result[0].line, 2);
592
602
  assert_eq!(result[1].line, 3);
593
603
 
594
604
  let fixed = rule.fix(&ctx).unwrap();
595
- // The fix adds a single space after empty blockquote markers
596
- assert_eq!(fixed, "> > Nested \n> > \n> Normal");
605
+ // Line 1: Keeps 2 spaces (exact match with br_spaces)
606
+ // Line 2: Empty blockquote with 3 spaces -> removes all (doesn't match br_spaces)
607
+ // Line 3: Last line without newline -> removes all spaces
608
+ assert_eq!(fixed, "> > Nested \n> >\n> Normal");
597
609
  }
598
610
 
599
611
  #[test]
@@ -608,4 +620,65 @@ mod tests {
608
620
  assert_eq!(result.len(), 1);
609
621
  assert_eq!(result[0].line, 2);
610
622
  }
623
+
624
+ #[test]
625
+ fn test_issue_80_no_space_normalization() {
626
+ // Test for GitHub issue #80 - MD009 should not add spaces when removing trailing spaces
627
+ let rule = MD009TrailingSpaces::new(2, false); // br_spaces=2
628
+
629
+ // Test that 1 trailing space is removed, not normalized to 2
630
+ let content = "Line with one space \nNext line";
631
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
632
+ let result = rule.check(&ctx).unwrap();
633
+ assert_eq!(result.len(), 1);
634
+ assert_eq!(result[0].line, 1);
635
+ assert_eq!(result[0].message, "Trailing space found");
636
+
637
+ let fixed = rule.fix(&ctx).unwrap();
638
+ assert_eq!(fixed, "Line with one space\nNext line");
639
+
640
+ // Test that 3 trailing spaces are removed, not normalized to 2
641
+ let content = "Line with three spaces \nNext line";
642
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
643
+ let result = rule.check(&ctx).unwrap();
644
+ assert_eq!(result.len(), 1);
645
+ assert_eq!(result[0].line, 1);
646
+ assert_eq!(result[0].message, "3 trailing spaces found");
647
+
648
+ let fixed = rule.fix(&ctx).unwrap();
649
+ assert_eq!(fixed, "Line with three spaces\nNext line");
650
+
651
+ // Test that exactly 2 trailing spaces are preserved
652
+ let content = "Line with two spaces \nNext line";
653
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
654
+ let result = rule.check(&ctx).unwrap();
655
+ assert_eq!(result.len(), 0); // Should not flag lines with exact br_spaces
656
+
657
+ let fixed = rule.fix(&ctx).unwrap();
658
+ assert_eq!(fixed, "Line with two spaces \nNext line");
659
+ }
660
+
661
+ #[test]
662
+ fn test_different_br_spaces_values() {
663
+ // Test with br_spaces=0 (no trailing spaces allowed)
664
+ let rule = MD009TrailingSpaces::new(0, false);
665
+ let content = "Line with one space \nLine with two spaces ";
666
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
667
+ let result = rule.check(&ctx).unwrap();
668
+ assert_eq!(result.len(), 2); // Both lines should be flagged
669
+
670
+ let fixed = rule.fix(&ctx).unwrap();
671
+ assert_eq!(fixed, "Line with one space\nLine with two spaces");
672
+
673
+ // Test with br_spaces=1 (exactly 1 trailing space for line breaks)
674
+ let rule = MD009TrailingSpaces::new(1, false);
675
+ let content = "Line with one space \nLine with two spaces ";
676
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
677
+ let result = rule.check(&ctx).unwrap();
678
+ assert_eq!(result.len(), 1); // Only line 2 should be flagged
679
+ assert_eq!(result[0].line, 2);
680
+
681
+ let fixed = rule.fix(&ctx).unwrap();
682
+ assert_eq!(fixed, "Line with one space \nLine with two spaces");
683
+ }
611
684
  }
@@ -8,6 +8,7 @@ use crate::utils::range_utils::calculate_excess_range;
8
8
  use crate::utils::regex_cache::{
9
9
  IMAGE_REF_PATTERN, INLINE_LINK_REGEX as MARKDOWN_LINK_PATTERN, LINK_REF_PATTERN, URL_IN_TEXT, URL_PATTERN,
10
10
  };
11
+ use crate::utils::table_utils::TableUtils;
11
12
  use toml;
12
13
 
13
14
  pub mod md013_config;
@@ -36,24 +37,6 @@ impl MD013LineLength {
36
37
  Self { config }
37
38
  }
38
39
 
39
- fn is_in_table(lines: &[&str], current_line: usize) -> bool {
40
- // Check if current line is part of a table
41
- let current = lines[current_line].trim();
42
- if current.starts_with('|') || current.starts_with("|-") {
43
- return true;
44
- }
45
-
46
- // Check if line is between table markers
47
- if current_line > 0 && current_line + 1 < lines.len() {
48
- let prev = lines[current_line - 1].trim();
49
- let next = lines[current_line + 1].trim();
50
- if (prev.starts_with('|') || prev.starts_with("|-")) && (next.starts_with('|') || next.starts_with("|-")) {
51
- return true;
52
- }
53
- }
54
- false
55
- }
56
-
57
40
  fn should_ignore_line(
58
41
  &self,
59
42
  line: &str,
@@ -203,24 +186,21 @@ impl Rule for MD013LineLength {
203
186
  // Create a quick lookup set for heading lines
204
187
  let heading_lines_set: std::collections::HashSet<usize> = structure.heading_lines.iter().cloned().collect();
205
188
 
206
- // Pre-compute table lines using the same logic as is_in_table function
189
+ // Use TableUtils to find all table blocks in the document
190
+ let table_blocks = TableUtils::find_table_blocks(content, ctx);
191
+
192
+ // Pre-compute table lines from the table blocks
207
193
  let table_lines_set: std::collections::HashSet<usize> = {
208
194
  let mut table_lines = std::collections::HashSet::new();
209
195
 
210
- for (i, _line) in lines.iter().enumerate() {
211
- let line_number = i + 1;
212
-
213
- // Quick check if in code block using pre-computed blocks from context or structure
214
- let in_code = if !ctx.code_blocks.is_empty() {
215
- ctx.code_blocks
216
- .iter()
217
- .any(|(start, end)| *start <= line_number && line_number <= *end)
218
- } else {
219
- structure.is_in_code_block(line_number)
220
- };
221
-
222
- if !in_code && Self::is_in_table(&lines, i) {
223
- table_lines.insert(line_number);
196
+ for table in &table_blocks {
197
+ // Add header line
198
+ table_lines.insert(table.header_line + 1); // Convert 0-indexed to 1-indexed
199
+ // Add delimiter line
200
+ table_lines.insert(table.delimiter_line + 1);
201
+ // Add all content lines
202
+ for &line in &table.content_lines {
203
+ table_lines.insert(line + 1); // Convert 0-indexed to 1-indexed
224
204
  }
225
205
  }
226
206
  table_lines
@@ -393,7 +373,8 @@ impl MD013LineLength {
393
373
  }
394
374
 
395
375
  // Skip tables (they have complex formatting)
396
- if Self::is_in_table(&[line], 0) {
376
+ // Check if line looks like a table row
377
+ if TableUtils::is_potential_table_row(line) {
397
378
  return true;
398
379
  }
399
380
 
@@ -568,19 +549,6 @@ mod tests {
568
549
  assert_eq!(result.len(), 0);
569
550
  }
570
551
 
571
- #[test]
572
- fn test_table_detection() {
573
- let lines = vec![
574
- "| Column 1 | Column 2 |",
575
- "|----------|----------|",
576
- "| Value 1 | Value 2 |",
577
- ];
578
-
579
- assert!(MD013LineLength::is_in_table(&lines, 0));
580
- assert!(MD013LineLength::is_in_table(&lines, 1));
581
- assert!(MD013LineLength::is_in_table(&lines, 2));
582
- }
583
-
584
552
  #[test]
585
553
  fn test_table_checked_when_enabled() {
586
554
  let rule = MD013LineLength::new(30, false, true, false, false);
@@ -591,6 +559,74 @@ mod tests {
591
559
  assert_eq!(result.len(), 2); // Both table lines exceed limit
592
560
  }
593
561
 
562
+ #[test]
563
+ fn test_issue_78_tables_after_fenced_code_blocks() {
564
+ // Test for GitHub issue #78 - tables with tables=false after fenced code blocks
565
+ let rule = MD013LineLength::new(20, false, false, false, false); // tables=false
566
+ let content = r#"# heading
567
+
568
+ ```plain
569
+ some code block longer than 20 chars length
570
+ ```
571
+
572
+ this is a very long line
573
+
574
+ | column A | column B |
575
+ | -------- | -------- |
576
+ | `var` | `val` |
577
+ | value 1 | value 2 |
578
+
579
+ correct length line"#;
580
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
581
+ let result = rule.check(&ctx).unwrap();
582
+
583
+ // Should only flag line 7 ("this is a very long line"), not the table lines
584
+ assert_eq!(result.len(), 1, "Should only flag 1 line (the non-table long line)");
585
+ assert_eq!(result[0].line, 7, "Should flag line 7");
586
+ assert!(result[0].message.contains("24 exceeds 20"));
587
+ }
588
+
589
+ #[test]
590
+ fn test_issue_78_tables_with_inline_code() {
591
+ // Test that tables with inline code (backticks) are properly detected as tables
592
+ let rule = MD013LineLength::new(20, false, false, false, false); // tables=false
593
+ let content = r#"| column A | column B |
594
+ | -------- | -------- |
595
+ | `var with very long name` | `val exceeding limit` |
596
+ | value 1 | value 2 |
597
+
598
+ This line exceeds limit"#;
599
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
600
+ let result = rule.check(&ctx).unwrap();
601
+
602
+ // Should only flag the last line, not the table lines
603
+ assert_eq!(result.len(), 1, "Should only flag the non-table line");
604
+ assert_eq!(result[0].line, 6, "Should flag line 6");
605
+ }
606
+
607
+ #[test]
608
+ fn test_issue_78_indented_code_blocks() {
609
+ // Test with indented code blocks instead of fenced
610
+ let rule = MD013LineLength::new(20, false, false, false, false); // tables=false
611
+ let content = r#"# heading
612
+
613
+ some code block longer than 20 chars length
614
+
615
+ this is a very long line
616
+
617
+ | column A | column B |
618
+ | -------- | -------- |
619
+ | value 1 | value 2 |
620
+
621
+ correct length line"#;
622
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
623
+ let result = rule.check(&ctx).unwrap();
624
+
625
+ // Should only flag line 5 ("this is a very long line"), not the table lines
626
+ assert_eq!(result.len(), 1, "Should only flag 1 line (the non-table long line)");
627
+ assert_eq!(result[0].line, 5, "Should flag line 5");
628
+ }
629
+
594
630
  #[test]
595
631
  fn test_url_exemption() {
596
632
  let rule = MD013LineLength::new(30, false, false, false, false);
@@ -991,6 +1027,32 @@ And a bullet list:
991
1027
  }
992
1028
  }
993
1029
 
1030
+ #[test]
1031
+ fn test_issue_83_numbered_list_with_backticks() {
1032
+ // Test for issue #83: enable_reflow was incorrectly handling numbered lists
1033
+ let config = MD013Config {
1034
+ line_length: 100,
1035
+ reflow: true,
1036
+ ..Default::default()
1037
+ };
1038
+ let rule = MD013LineLength::from_config_struct(config);
1039
+
1040
+ // The exact case from issue #83
1041
+ let content = "1. List `manifest` to find the manifest with the largest ID. Say it's `00000000000000000002.manifest` in this example.";
1042
+ let ctx = LintContext::new(content, crate::config::MarkdownFlavor::Standard);
1043
+
1044
+ let fixed = rule.fix(&ctx).unwrap();
1045
+
1046
+ // The expected output: properly wrapped at 100 chars with correct list formatting
1047
+ // After the fix, it correctly accounts for "1. " (3 chars) leaving 97 for content
1048
+ let expected = "1. List `manifest` to find the manifest with the largest ID. Say it's\n `00000000000000000002.manifest` in this example.";
1049
+
1050
+ assert_eq!(
1051
+ fixed, expected,
1052
+ "List should be properly reflowed with correct marker and indentation.\nExpected:\n{expected}\nGot:\n{fixed}"
1053
+ );
1054
+ }
1055
+
994
1056
  #[test]
995
1057
  fn test_text_reflow_disabled_by_default() {
996
1058
  let rule = MD013LineLength::new(30, false, false, false, false);
@@ -769,9 +769,12 @@ mod tests {
769
769
  );
770
770
 
771
771
  // Performance assertion - should complete reasonably fast
772
+ // Note: In debug builds this may take longer, so we use a higher threshold
773
+ let max_duration_ms = if cfg!(debug_assertions) { 1000 } else { 100 };
772
774
  assert!(
773
- avg_check_duration.as_millis() < 100,
774
- "MD034 check should complete in under 100ms, took {}ms",
775
+ avg_check_duration.as_millis() < max_duration_ms,
776
+ "MD034 check should complete in under {}ms, took {}ms",
777
+ max_duration_ms,
775
778
  avg_check_duration.as_millis()
776
779
  );
777
780
 
@@ -157,15 +157,33 @@ fn heading_to_fragment_internal(heading: &str) -> String {
157
157
 
158
158
  // Step 6: Multi-character arrow patterns (order matters!)
159
159
  // GitHub.com converts these patterns to specific hyphen sequences
160
- // Handle patterns with spaces to avoid double-processing spaces
161
- text = text.replace(" --> ", "----"); // space + arrow + space = 4 hyphens total
162
- text = text.replace("-->", "----"); // 4 hyphens when no surrounding spaces
163
- text = text.replace(" <-> ", "---"); // space + arrow + space = 3 hyphens total
164
- text = text.replace("<->", "---"); // 3 hyphens when no surrounding spaces
165
- text = text.replace(" ==> ", "--"); // space + arrow + space = 2 hyphens total
166
- text = text.replace("==>", "--"); // 2 hyphens when no surrounding spaces
167
- text = text.replace(" -> ", "---"); // space + arrow + space = 3 hyphens total
168
- text = text.replace("->", "---"); // 3 hyphens when no surrounding spaces
160
+ // Verified against GitHub.com actual behavior (issue #82)
161
+ // Pattern: arrow itself becomes N hyphens, each adjacent space adds 1 more
162
+ // Must handle patterns with most spaces first to avoid partial replacements
163
+
164
+ // --> patterns (arrow = 2 hyphens base)
165
+ text = text.replace(" --> ", "----"); // 2 + 1 + 1 = 4 hyphens
166
+ text = text.replace(" -->", "---"); // 2 + 1 = 3 hyphens
167
+ text = text.replace("--> ", "---"); // 2 + 1 = 3 hyphens
168
+ text = text.replace("-->", "--"); // 2 hyphens
169
+
170
+ // <-> patterns (assuming similar pattern, needs verification)
171
+ text = text.replace(" <-> ", "---"); // estimated: 1 + 1 + 1 = 3 hyphens
172
+ text = text.replace(" <->", "--"); // estimated: 1 + 1 = 2 hyphens
173
+ text = text.replace("<-> ", "--"); // estimated: 1 + 1 = 2 hyphens
174
+ text = text.replace("<->", "-"); // estimated: 1 hyphen
175
+
176
+ // ==> patterns (assuming similar pattern, needs verification)
177
+ text = text.replace(" ==> ", "--"); // estimated pattern
178
+ text = text.replace(" ==>", "-"); // estimated pattern
179
+ text = text.replace("==> ", "-"); // estimated pattern
180
+ text = text.replace("==>", ""); // estimated: might be removed entirely
181
+
182
+ // -> patterns (arrow = 1 hyphen base)
183
+ text = text.replace(" -> ", "---"); // 1 + 1 + 1 = 3 hyphens
184
+ text = text.replace(" ->", "--"); // 1 + 1 = 2 hyphens
185
+ text = text.replace("-> ", "--"); // 1 + 1 = 2 hyphens
186
+ text = text.replace("->", "-"); // 1 hyphen
169
187
 
170
188
  // Step 7: Remove problematic characters before symbol replacement
171
189
  // First remove em-dashes and en-dashes entirely
@@ -899,6 +917,33 @@ mod tests {
899
917
  assert_eq!(result, "cbrown----sbrown---unsafe-paths");
900
918
  }
901
919
 
920
+ #[test]
921
+ fn test_github_arrow_patterns_issue_82() {
922
+ // Test cases for issue #82 - verified against GitHub.com actual behavior
923
+ // Pattern: arrow itself becomes N hyphens, each adjacent space adds 1 more
924
+
925
+ // Single arrow (->) patterns
926
+ assert_eq!(heading_to_fragment("WAL->L0 Compaction"), "wal-l0-compaction");
927
+ assert_eq!(heading_to_fragment("foo->bar->baz"), "foo-bar-baz");
928
+ assert_eq!(heading_to_fragment("a->b"), "a-b");
929
+ assert_eq!(heading_to_fragment("a ->b"), "a--b");
930
+ assert_eq!(heading_to_fragment("a-> b"), "a--b");
931
+ assert_eq!(heading_to_fragment("a -> b"), "a---b");
932
+
933
+ // Double arrow (-->) patterns
934
+ assert_eq!(heading_to_fragment("a-->b"), "a--b");
935
+ assert_eq!(heading_to_fragment("a -->b"), "a---b");
936
+ assert_eq!(heading_to_fragment("a--> b"), "a---b");
937
+ assert_eq!(heading_to_fragment("a --> b"), "a----b");
938
+
939
+ // Mixed patterns
940
+ assert_eq!(heading_to_fragment("cbrown -> sbrown"), "cbrown---sbrown");
941
+ assert_eq!(
942
+ heading_to_fragment("cbrown --> sbrown: --unsafe-paths"),
943
+ "cbrown----sbrown---unsafe-paths"
944
+ );
945
+ }
946
+
902
947
  #[test]
903
948
  fn test_security_performance_edge_cases() {
904
949
  // Test performance with edge cases that could cause issues
@@ -629,20 +629,52 @@ pub fn reflow_markdown(content: &str, options: &ReflowOptions) -> String {
629
629
  let indent = line.len() - line.trim_start().len();
630
630
  let indent_str = " ".repeat(indent);
631
631
 
632
- // Find where the content starts after the marker
633
- let content_start = line
634
- .find(|c: char| !(c.is_whitespace() || c == '-' || c == '*' || c == '+' || c == '.' || c.is_numeric()))
635
- .unwrap_or(line.len());
632
+ // For numbered lists, find the period and the space after it
633
+ // For bullet lists, find the marker and the space after it
634
+ let mut marker_end = indent;
635
+ let mut content_start = indent;
636
+
637
+ if trimmed.chars().next().is_some_and(|c| c.is_numeric()) {
638
+ // Numbered list: find the period
639
+ if let Some(period_pos) = line[indent..].find('.') {
640
+ marker_end = indent + period_pos + 1; // Include the period
641
+ content_start = marker_end;
642
+ // Skip any spaces after the period to find content start
643
+ while content_start < line.len() && line.chars().nth(content_start) == Some(' ') {
644
+ content_start += 1;
645
+ }
646
+ }
647
+ } else {
648
+ // Bullet list: marker is single character
649
+ marker_end = indent + 1; // Just the marker character
650
+ content_start = marker_end;
651
+ // Skip any spaces after the marker
652
+ while content_start < line.len() && line.chars().nth(content_start) == Some(' ') {
653
+ content_start += 1;
654
+ }
655
+ }
636
656
 
637
- let marker = &line[indent..content_start];
638
- let content = &line[content_start..].trim_start();
657
+ let marker = &line[indent..marker_end];
658
+ let content = &line[content_start..];
639
659
 
640
660
  // Calculate the proper indentation for continuation lines
641
661
  // We need to align with the text after the marker
642
- let trimmed_marker = marker.trim_end();
643
- let continuation_spaces = indent + trimmed_marker.len() + 1; // +1 for the space after marker
662
+ let trimmed_marker = marker;
663
+ let continuation_spaces = content_start; // Use the actual content start position
664
+
665
+ // CRITICAL: Adjust line length to account for list marker and space
666
+ // For the first line, we need to account for: indent + marker + space
667
+ // The format is: "{indent_str}{trimmed_marker} {content}"
668
+ // So available width = line_length - indent - marker_length - 1 (for space)
669
+ let prefix_length = indent + trimmed_marker.len() + 1; // +1 for space after marker
670
+
671
+ // Create adjusted options with reduced line length
672
+ let adjusted_options = ReflowOptions {
673
+ line_length: options.line_length.saturating_sub(prefix_length),
674
+ ..options.clone()
675
+ };
644
676
 
645
- let reflowed = reflow_line(content, options);
677
+ let reflowed = reflow_line(content, &adjusted_options);
646
678
  for (j, reflowed_line) in reflowed.iter().enumerate() {
647
679
  if j == 0 {
648
680
  result.push(format!("{indent_str}{trimmed_marker} {reflowed_line}"));
@@ -1063,4 +1095,60 @@ mod tests {
1063
1095
  }
1064
1096
  }
1065
1097
  }
1098
+
1099
+ #[test]
1100
+ fn test_reflow_markdown_numbered_lists() {
1101
+ // Test for issue #83: numbered lists with proper formatting
1102
+ let options = ReflowOptions {
1103
+ line_length: 50,
1104
+ ..Default::default()
1105
+ };
1106
+
1107
+ let content = r#"1. List `manifest` to find the manifest with the largest ID. Say it's `00000000000000000002.manifest` in this example.
1108
+ 2. Short item
1109
+ 3. Another long item that definitely exceeds the fifty character limit and needs wrapping"#;
1110
+
1111
+ let result = reflow_markdown(content, &options);
1112
+
1113
+ // Define exact expected output
1114
+ let expected = r#"1. List `manifest` to find the manifest with the
1115
+ largest ID. Say it's
1116
+ `00000000000000000002.manifest` in this
1117
+ example.
1118
+ 2. Short item
1119
+ 3. Another long item that definitely exceeds the
1120
+ fifty character limit and needs wrapping"#;
1121
+
1122
+ assert_eq!(
1123
+ result, expected,
1124
+ "Numbered lists should be reflowed with proper markers and indentation.\nExpected:\n{expected}\nGot:\n{result}"
1125
+ );
1126
+ }
1127
+
1128
+ #[test]
1129
+ fn test_reflow_markdown_bullet_lists() {
1130
+ let options = ReflowOptions {
1131
+ line_length: 40,
1132
+ ..Default::default()
1133
+ };
1134
+
1135
+ let content = r#"- First bullet point with a very long line that needs wrapping
1136
+ * Second bullet using asterisk
1137
+ + Third bullet using plus sign
1138
+ - Short one"#;
1139
+
1140
+ let result = reflow_markdown(content, &options);
1141
+
1142
+ // Define exact expected output - each bullet type preserved with proper indentation
1143
+ let expected = r#"- First bullet point with a very long
1144
+ line that needs wrapping
1145
+ * Second bullet using asterisk
1146
+ + Third bullet using plus sign
1147
+ - Short one"#;
1148
+
1149
+ assert_eq!(
1150
+ result, expected,
1151
+ "Bullet lists should preserve markers and indent continuations with 2 spaces.\nExpected:\n{expected}\nGot:\n{result}"
1152
+ );
1153
+ }
1066
1154
  }
@@ -250,11 +250,9 @@ fn test_output_format_with_fix_mode() {
250
250
 
251
251
  // Verify the file was actually fixed
252
252
  let fixed_content = fs::read_to_string(&test_file).unwrap();
253
- // In non-strict mode, MD009 normalizes trailing spaces to 2 spaces (for line breaks)
254
- assert!(
255
- fixed_content.contains(" \n"),
256
- "Trailing spaces should be normalized to 2 spaces"
257
- );
253
+ // MD009 removes trailing spaces that don't match br_spaces (default 2)
254
+ // Since the content had 3 spaces, they should be removed
255
+ assert!(!fixed_content.contains(" "), "Trailing spaces (3) should be removed");
258
256
  assert!(
259
257
  fixed_content.contains("\n\n"),
260
258
  "Blank line should be added after heading"