rumdl 0.0.142__tar.gz → 0.0.143__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 (437) hide show
  1. {rumdl-0.0.142 → rumdl-0.0.143}/Cargo.lock +42 -1
  2. {rumdl-0.0.142 → rumdl-0.0.143}/Cargo.toml +7 -1
  3. {rumdl-0.0.142 → rumdl-0.0.143}/PKG-INFO +1 -1
  4. {rumdl-0.0.142 → rumdl-0.0.143}/src/main.rs +70 -4
  5. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md013_line_length.rs +44 -54
  6. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md028_no_blanks_blockquote.rs +70 -32
  7. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md030_list_marker_space.rs +48 -20
  8. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md034_no_bare_urls.rs +36 -32
  9. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md051_link_fragments.rs +52 -19
  10. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md052_reference_links_images.rs +27 -0
  11. rumdl-0.0.143/tests/fix_performance_baseline_test.rs +282 -0
  12. {rumdl-0.0.142 → rumdl-0.0.143}/.config/nextest.toml +0 -0
  13. {rumdl-0.0.142 → rumdl-0.0.143}/.mise.toml +0 -0
  14. {rumdl-0.0.142 → rumdl-0.0.143}/.pre-commit-config.yaml +0 -0
  15. {rumdl-0.0.142 → rumdl-0.0.143}/.rumdl.toml +0 -0
  16. {rumdl-0.0.142 → rumdl-0.0.143}/.rustfmt.toml +0 -0
  17. {rumdl-0.0.142 → rumdl-0.0.143}/CHANGELOG.md +0 -0
  18. {rumdl-0.0.142 → rumdl-0.0.143}/LICENSE +0 -0
  19. {rumdl-0.0.142 → rumdl-0.0.143}/MANIFEST.in +0 -0
  20. {rumdl-0.0.142 → rumdl-0.0.143}/Makefile +0 -0
  21. {rumdl-0.0.142 → rumdl-0.0.143}/README.md +0 -0
  22. {rumdl-0.0.142 → rumdl-0.0.143}/assets/logo.png +0 -0
  23. {rumdl-0.0.142 → rumdl-0.0.143}/benches/fix_performance.rs +0 -0
  24. {rumdl-0.0.142 → rumdl-0.0.143}/benches/range_performance.rs +0 -0
  25. {rumdl-0.0.142 → rumdl-0.0.143}/benches/range_utils_benchmark.rs +0 -0
  26. {rumdl-0.0.142 → rumdl-0.0.143}/benches/rule_performance.rs +0 -0
  27. {rumdl-0.0.142 → rumdl-0.0.143}/benches/simple_fix_bench.rs +0 -0
  28. {rumdl-0.0.142 → rumdl-0.0.143}/benchmark/bin/bench_lint_context.rs +0 -0
  29. {rumdl-0.0.142 → rumdl-0.0.143}/benchmark/bin/benchmark.rs +0 -0
  30. {rumdl-0.0.142 → rumdl-0.0.143}/benchmark/bin/benchmark_rule.rs +0 -0
  31. {rumdl-0.0.142 → rumdl-0.0.143}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  32. {rumdl-0.0.142 → rumdl-0.0.143}/benchmark/bin/measure_code_span_performance.rs +0 -0
  33. {rumdl-0.0.142 → rumdl-0.0.143}/docs/RULES.md +0 -0
  34. {rumdl-0.0.142 → rumdl-0.0.143}/docs/global-settings.md +0 -0
  35. {rumdl-0.0.142 → rumdl-0.0.143}/docs/inline-configuration.md +0 -0
  36. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md001.md +0 -0
  37. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md002.md +0 -0
  38. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md003.md +0 -0
  39. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md004.md +0 -0
  40. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md005.md +0 -0
  41. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md006.md +0 -0
  42. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md007.md +0 -0
  43. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md009.md +0 -0
  44. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md010.md +0 -0
  45. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md011.md +0 -0
  46. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md012.md +0 -0
  47. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md013.md +0 -0
  48. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md014.md +0 -0
  49. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md018.md +0 -0
  50. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md019.md +0 -0
  51. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md020.md +0 -0
  52. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md021.md +0 -0
  53. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md022.md +0 -0
  54. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md023.md +0 -0
  55. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md024.md +0 -0
  56. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md025.md +0 -0
  57. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md026.md +0 -0
  58. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md027.md +0 -0
  59. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md028.md +0 -0
  60. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md029.md +0 -0
  61. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md030.md +0 -0
  62. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md031.md +0 -0
  63. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md032.md +0 -0
  64. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md033.md +0 -0
  65. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md034.md +0 -0
  66. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md035.md +0 -0
  67. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md036.md +0 -0
  68. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md037.md +0 -0
  69. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md038.md +0 -0
  70. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md039.md +0 -0
  71. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md040.md +0 -0
  72. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md041.md +0 -0
  73. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md042.md +0 -0
  74. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md043.md +0 -0
  75. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md044.md +0 -0
  76. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md045.md +0 -0
  77. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md046.md +0 -0
  78. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md047.md +0 -0
  79. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md048.md +0 -0
  80. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md049.md +0 -0
  81. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md050.md +0 -0
  82. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md051.md +0 -0
  83. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md052.md +0 -0
  84. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md053.md +0 -0
  85. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md054.md +0 -0
  86. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md055.md +0 -0
  87. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md056.md +0 -0
  88. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md057.md +0 -0
  89. {rumdl-0.0.142 → rumdl-0.0.143}/docs/md058.md +0 -0
  90. {rumdl-0.0.142 → rumdl-0.0.143}/docs/vscode-extension.md +0 -0
  91. {rumdl-0.0.142 → rumdl-0.0.143}/parity_check.py +0 -0
  92. {rumdl-0.0.142 → rumdl-0.0.143}/pyproject.toml +0 -0
  93. {rumdl-0.0.142 → rumdl-0.0.143}/python/MANIFEST.in +0 -0
  94. {rumdl-0.0.142 → rumdl-0.0.143}/python/PYTHON-README.md +0 -0
  95. {rumdl-0.0.142 → rumdl-0.0.143}/python/rumdl/__init__.py +0 -0
  96. {rumdl-0.0.142 → rumdl-0.0.143}/python/rumdl/__main__.py +0 -0
  97. {rumdl-0.0.142 → rumdl-0.0.143}/python/rumdl/py.typed +0 -0
  98. {rumdl-0.0.142 → rumdl-0.0.143}/rumdl.toml.example +0 -0
  99. {rumdl-0.0.142 → rumdl-0.0.143}/rust-toolchain.toml +0 -0
  100. {rumdl-0.0.142 → rumdl-0.0.143}/scripts/extract-changelog.sh +0 -0
  101. {rumdl-0.0.142 → rumdl-0.0.143}/scripts/generate-downloads-table.sh +0 -0
  102. {rumdl-0.0.142 → rumdl-0.0.143}/scripts/pre-release.sh +0 -0
  103. {rumdl-0.0.142 → rumdl-0.0.143}/scripts/prepare-release.sh +0 -0
  104. {rumdl-0.0.142 → rumdl-0.0.143}/scripts/setup-pre-commit.sh +0 -0
  105. {rumdl-0.0.142 → rumdl-0.0.143}/scripts/update-pre-commit-docs.sh +0 -0
  106. {rumdl-0.0.142 → rumdl-0.0.143}/src/config.rs +0 -0
  107. {rumdl-0.0.142 → rumdl-0.0.143}/src/exit_codes.rs +0 -0
  108. {rumdl-0.0.142 → rumdl-0.0.143}/src/inline_config.rs +0 -0
  109. {rumdl-0.0.142 → rumdl-0.0.143}/src/lib.rs +0 -0
  110. {rumdl-0.0.142 → rumdl-0.0.143}/src/lint_context.rs +0 -0
  111. {rumdl-0.0.142 → rumdl-0.0.143}/src/lsp/mod.rs +0 -0
  112. {rumdl-0.0.142 → rumdl-0.0.143}/src/lsp/server.rs +0 -0
  113. {rumdl-0.0.142 → rumdl-0.0.143}/src/lsp/types.rs +0 -0
  114. {rumdl-0.0.142 → rumdl-0.0.143}/src/markdownlint_config.rs +0 -0
  115. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/azure.rs +0 -0
  116. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/concise.rs +0 -0
  117. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/github.rs +0 -0
  118. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/gitlab.rs +0 -0
  119. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/grouped.rs +0 -0
  120. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/json.rs +0 -0
  121. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/json_lines.rs +0 -0
  122. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/junit.rs +0 -0
  123. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/mod.rs +0 -0
  124. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/pylint.rs +0 -0
  125. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/sarif.rs +0 -0
  126. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/formatters/text.rs +0 -0
  127. {rumdl-0.0.142 → rumdl-0.0.143}/src/output/mod.rs +0 -0
  128. {rumdl-0.0.142 → rumdl-0.0.143}/src/parallel.rs +0 -0
  129. {rumdl-0.0.142 → rumdl-0.0.143}/src/performance.rs +0 -0
  130. {rumdl-0.0.142 → rumdl-0.0.143}/src/profiling.rs +0 -0
  131. {rumdl-0.0.142 → rumdl-0.0.143}/src/python.rs +0 -0
  132. {rumdl-0.0.142 → rumdl-0.0.143}/src/rule.rs +0 -0
  133. {rumdl-0.0.142 → rumdl-0.0.143}/src/rule_config.rs +0 -0
  134. {rumdl-0.0.142 → rumdl-0.0.143}/src/rule_config_serde.rs +0 -0
  135. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/blockquote_utils.rs +0 -0
  136. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/code_block_utils.rs +0 -0
  137. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/code_fence_utils.rs +0 -0
  138. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/emphasis_style.rs +0 -0
  139. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/front_matter_utils.rs +0 -0
  140. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/heading_utils.rs +0 -0
  141. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/list_utils.rs +0 -0
  142. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md001_heading_increment.rs +0 -0
  143. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  144. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md002_first_heading_h1.rs +0 -0
  145. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md003_heading_style/md003_config.rs +0 -0
  146. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md003_heading_style.rs +0 -0
  147. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  148. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md004_unordered_list_style.rs +0 -0
  149. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md005_list_indent.rs +0 -0
  150. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md006_start_bullets.rs +0 -0
  151. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  152. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md007_ul_indent.rs +0 -0
  153. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  154. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md009_trailing_spaces.rs +0 -0
  155. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  156. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md010_no_hard_tabs.rs +0 -0
  157. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md011_no_reversed_links.rs +0 -0
  158. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  159. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md012_no_multiple_blanks.rs +0 -0
  160. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md013_line_length/md013_config.rs +0 -0
  161. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  162. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md014_commands_show_output.rs +0 -0
  163. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md018_no_missing_space_atx.rs +0 -0
  164. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  165. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  166. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  167. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  168. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md022_blanks_around_headings.rs +0 -0
  169. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md023_heading_start_left.rs +0 -0
  170. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  171. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md024_no_duplicate_heading.rs +0 -0
  172. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md025_single_title/md025_config.rs +0 -0
  173. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md025_single_title.rs +0 -0
  174. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  175. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  176. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  177. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  178. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md029_ordered_list_prefix.rs +0 -0
  179. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  180. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md031_blanks_around_fences.rs +0 -0
  181. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md032_blanks_around_lists.rs +0 -0
  182. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  183. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md033_no_inline_html.rs +0 -0
  184. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md035_hr_style/md035_config.rs +0 -0
  185. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md035_hr_style.rs +0 -0
  186. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  187. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  188. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  189. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md038_no_space_in_code.rs +0 -0
  190. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md039_no_space_in_links.rs +0 -0
  191. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md040_fenced_code_language.rs +0 -0
  192. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md041_first_line_heading.rs +0 -0
  193. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md042_no_empty_links.rs +0 -0
  194. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md043_required_headings.rs +0 -0
  195. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md044_proper_names/md044_config.rs +0 -0
  196. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md044_proper_names.rs +0 -0
  197. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  198. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md045_no_alt_text.rs +0 -0
  199. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  200. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md046_code_block_style.rs +0 -0
  201. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md047_single_trailing_newline.rs +0 -0
  202. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  203. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md048_code_fence_style.rs +0 -0
  204. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  205. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md049_emphasis_style.rs +0 -0
  206. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md050_strong_style/md050_config.rs +0 -0
  207. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md050_strong_style.rs +0 -0
  208. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  209. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  210. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md054_link_image_style.rs +0 -0
  211. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  212. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md055_table_pipe_style.rs +0 -0
  213. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md056_table_column_count.rs +0 -0
  214. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  215. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md057_existing_relative_links.rs +0 -0
  216. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/md058_blanks_around_tables.rs +0 -0
  217. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/mod.rs +0 -0
  218. {rumdl-0.0.142 → rumdl-0.0.143}/src/rules/strong_style.rs +0 -0
  219. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/anchor_styles/github.rs +0 -0
  220. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/anchor_styles/jekyll.rs +0 -0
  221. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/anchor_styles/kramdown.rs +0 -0
  222. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/anchor_styles/kramdown_gfm.rs +0 -0
  223. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/anchor_styles/mod.rs +0 -0
  224. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/ast_utils.rs +0 -0
  225. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/code_block_utils.rs +0 -0
  226. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/document_structure.rs +0 -0
  227. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/early_returns.rs +0 -0
  228. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/element_cache.rs +0 -0
  229. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/emphasis_utils.rs +0 -0
  230. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/fix_utils.rs +0 -0
  231. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/header_id_utils.rs +0 -0
  232. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/kramdown_utils.rs +0 -0
  233. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/line_ending.rs +0 -0
  234. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/markdown_elements.rs +0 -0
  235. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_admonitions.rs +0 -0
  236. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_common.rs +0 -0
  237. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_critic.rs +0 -0
  238. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_footnotes.rs +0 -0
  239. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_patterns.rs +0 -0
  240. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_snippets.rs +0 -0
  241. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_tabs.rs +0 -0
  242. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocs_test_utils.rs +0 -0
  243. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mkdocstrings_refs.rs +0 -0
  244. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/mod.rs +0 -0
  245. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/range_utils.rs +0 -0
  246. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/regex_cache.rs +0 -0
  247. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/skip_context.rs +0 -0
  248. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/string_interner.rs +0 -0
  249. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/table_utils.rs +0 -0
  250. {rumdl-0.0.142 → rumdl-0.0.143}/src/utils/text_reflow.rs +0 -0
  251. {rumdl-0.0.142 → rumdl-0.0.143}/src/vscode.rs +0 -0
  252. {rumdl-0.0.142 → rumdl-0.0.143}/tests/advanced_integration_tests.rs +0 -0
  253. {rumdl-0.0.142 → rumdl-0.0.143}/tests/character_ranges/additional_tests.rs +0 -0
  254. {rumdl-0.0.142 → rumdl-0.0.143}/tests/character_ranges/basic_tests.rs +0 -0
  255. {rumdl-0.0.142 → rumdl-0.0.143}/tests/character_ranges/comprehensive_tests.rs +0 -0
  256. {rumdl-0.0.142 → rumdl-0.0.143}/tests/character_ranges/extended_tests.rs +0 -0
  257. {rumdl-0.0.142 → rumdl-0.0.143}/tests/character_ranges/mod.rs +0 -0
  258. {rumdl-0.0.142 → rumdl-0.0.143}/tests/character_ranges/unicode_utils.rs +0 -0
  259. {rumdl-0.0.142 → rumdl-0.0.143}/tests/cli_duplication_test.rs +0 -0
  260. {rumdl-0.0.142 → rumdl-0.0.143}/tests/cli_explain_test.rs +0 -0
  261. {rumdl-0.0.142 → rumdl-0.0.143}/tests/cli_flag_precedence_test.rs +0 -0
  262. {rumdl-0.0.142 → rumdl-0.0.143}/tests/cli_integration_tests.rs +0 -0
  263. {rumdl-0.0.142 → rumdl-0.0.143}/tests/cli_lsp_fix_consistency.rs +0 -0
  264. {rumdl-0.0.142 → rumdl-0.0.143}/tests/cli_statistics_test.rs +0 -0
  265. {rumdl-0.0.142 → rumdl-0.0.143}/tests/common/cli_test_utils.rs +0 -0
  266. {rumdl-0.0.142 → rumdl-0.0.143}/tests/common/fixtures.rs +0 -0
  267. {rumdl-0.0.142 → rumdl-0.0.143}/tests/common/mod.rs +0 -0
  268. {rumdl-0.0.142 → rumdl-0.0.143}/tests/common/test_utils.rs +0 -0
  269. {rumdl-0.0.142 → rumdl-0.0.143}/tests/commonmark_compliance_tests.rs +0 -0
  270. {rumdl-0.0.142 → rumdl-0.0.143}/tests/comprehensive_integration_tests.rs +0 -0
  271. {rumdl-0.0.142 → rumdl-0.0.143}/tests/comprehensive_output_format_tests.rs +0 -0
  272. {rumdl-0.0.142 → rumdl-0.0.143}/tests/config_application_tests.rs +0 -0
  273. {rumdl-0.0.142 → rumdl-0.0.143}/tests/config_file_command_test.rs +0 -0
  274. {rumdl-0.0.142 → rumdl-0.0.143}/tests/config_tests.rs +0 -0
  275. {rumdl-0.0.142 → rumdl-0.0.143}/tests/config_upward_traversal_test.rs +0 -0
  276. {rumdl-0.0.142 → rumdl-0.0.143}/tests/configuration_inheritance_tests.rs +0 -0
  277. {rumdl-0.0.142 → rumdl-0.0.143}/tests/consistency_regression_tests.rs +0 -0
  278. {rumdl-0.0.142 → rumdl-0.0.143}/tests/cross_platform_compatibility_tests.rs +0 -0
  279. {rumdl-0.0.142 → rumdl-0.0.143}/tests/deeply_nested_lists_performance_test.rs +0 -0
  280. {rumdl-0.0.142 → rumdl-0.0.143}/tests/escaped_brackets_test.rs +0 -0
  281. {rumdl-0.0.142 → rumdl-0.0.143}/tests/final_confidence_assessment.rs +0 -0
  282. {rumdl-0.0.142 → rumdl-0.0.143}/tests/fix_counting_test.rs +0 -0
  283. {rumdl-0.0.142 → rumdl-0.0.143}/tests/fixable_unfixable_config_test.rs +0 -0
  284. {rumdl-0.0.142 → rumdl-0.0.143}/tests/init_command_test.rs +0 -0
  285. {rumdl-0.0.142 → rumdl-0.0.143}/tests/init_tests.rs +0 -0
  286. {rumdl-0.0.142 → rumdl-0.0.143}/tests/inline_config_blocks_test.rs +0 -0
  287. {rumdl-0.0.142 → rumdl-0.0.143}/tests/inline_config_test.rs +0 -0
  288. {rumdl-0.0.142 → rumdl-0.0.143}/tests/integration_tests.rs +0 -0
  289. {rumdl-0.0.142 → rumdl-0.0.143}/tests/json_output_test.rs +0 -0
  290. {rumdl-0.0.142 → rumdl-0.0.143}/tests/kramdown_integration_test.rs +0 -0
  291. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lib.rs +0 -0
  292. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_editor_integration_tests.rs +0 -0
  293. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_formatting_tests.rs +0 -0
  294. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_initialization_options_test.rs +0 -0
  295. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_integration_tests.rs +0 -0
  296. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_memory_leak_tests.rs +0 -0
  297. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_mkdocs_flavor_test.rs +0 -0
  298. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_tests.rs +0 -0
  299. {rumdl-0.0.142 → rumdl-0.0.143}/tests/lsp_unopened_document_test.rs +0 -0
  300. {rumdl-0.0.142 → rumdl-0.0.143}/tests/malformed_markdown_stress_tests.rs +0 -0
  301. {rumdl-0.0.142 → rumdl-0.0.143}/tests/markdownlint_cli_integration.rs +0 -0
  302. {rumdl-0.0.142 → rumdl-0.0.143}/tests/markdownlint_config_test.rs +0 -0
  303. {rumdl-0.0.142 → rumdl-0.0.143}/tests/markdownlintignore_test.rs +0 -0
  304. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md013_reflow_integration_test.rs +0 -0
  305. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md032_ordered_list_bug_test.rs +0 -0
  306. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md037_xxxx_regression_test.rs +0 -0
  307. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md038_false_positive_test.rs +0 -0
  308. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md051_issue_39_regression_test.rs +0 -0
  309. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md051_readme_bug_test.rs +0 -0
  310. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md051_toc_bug_test.rs +0 -0
  311. {rumdl-0.0.142 → rumdl-0.0.143}/tests/md052_literal_brackets_test.rs +0 -0
  312. {rumdl-0.0.142 → rumdl-0.0.143}/tests/nested_code_block_test.rs +0 -0
  313. {rumdl-0.0.142 → rumdl-0.0.143}/tests/output_format_integration_tests.rs +0 -0
  314. {rumdl-0.0.142 → rumdl-0.0.143}/tests/output_format_tests.rs +0 -0
  315. {rumdl-0.0.142 → rumdl-0.0.143}/tests/perf_check.rs +0 -0
  316. {rumdl-0.0.142 → rumdl-0.0.143}/tests/performance_validation_tests.rs +0 -0
  317. {rumdl-0.0.142 → rumdl-0.0.143}/tests/pyproject_config_tests.rs +0 -0
  318. {rumdl-0.0.142 → rumdl-0.0.143}/tests/python_bindings_test.rs +0 -0
  319. {rumdl-0.0.142 → rumdl-0.0.143}/tests/real_world_repository_tests.rs +0 -0
  320. {rumdl-0.0.142 → rumdl-0.0.143}/tests/regression_prevention_tests.rs +0 -0
  321. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  322. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/heading_edge_cases_test.rs +0 -0
  323. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  324. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/link_edge_cases_test.rs +0 -0
  325. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/list_rules_integration_test.rs +0 -0
  326. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md001_test.rs +0 -0
  327. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md001_unicode_test.rs +0 -0
  328. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md002_test.rs +0 -0
  329. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md003_test.rs +0 -0
  330. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md004_test.rs +0 -0
  331. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md005_dynamic_indent_test.rs +0 -0
  332. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md005_test.rs +0 -0
  333. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md005_unicode_test.rs +0 -0
  334. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md006_test.rs +0 -0
  335. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md006_unicode_test.rs +0 -0
  336. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md007_test.rs +0 -0
  337. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md009_test.rs +0 -0
  338. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md010_test.rs +0 -0
  339. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md011_test.rs +0 -0
  340. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md012_test.rs +0 -0
  341. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md013_test.rs +0 -0
  342. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md014_test.rs +0 -0
  343. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md018_test.rs +0 -0
  344. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md019_test.rs +0 -0
  345. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md020_test.rs +0 -0
  346. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md021_test.rs +0 -0
  347. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md022_test.rs +0 -0
  348. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md023_extended_test.rs +0 -0
  349. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md023_test.rs +0 -0
  350. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md024_test.rs +0 -0
  351. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md025_test.rs +0 -0
  352. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md026_kramdown_test.rs +0 -0
  353. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md026_test.rs +0 -0
  354. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md027_test.rs +0 -0
  355. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md028_md009_interaction_test.rs +0 -0
  356. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md028_test.rs +0 -0
  357. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md029_code_block_separation_test.rs +0 -0
  358. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md029_fix_test.rs +0 -0
  359. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md029_issue42_test.rs +0 -0
  360. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md029_markdownlint_parity_test.rs +0 -0
  361. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md029_pathological_edge_cases_test.rs +0 -0
  362. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md029_test.rs +0 -0
  363. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md029_unicode_test.rs +0 -0
  364. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md030_test.rs +0 -0
  365. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md031_kramdown_test.rs +0 -0
  366. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md031_test.rs +0 -0
  367. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md032_test.rs +0 -0
  368. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md033_extended_test.rs +0 -0
  369. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md033_kramdown_test.rs +0 -0
  370. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md033_test.rs +0 -0
  371. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md034_ipv6_test.rs +0 -0
  372. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md034_test.rs +0 -0
  373. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md035_test.rs +0 -0
  374. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md036_test.rs +0 -0
  375. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md037_kramdown_test.rs +0 -0
  376. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md037_test.rs +0 -0
  377. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md038_nested_backticks_test.rs +0 -0
  378. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md038_test.rs +0 -0
  379. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md039_test.rs +0 -0
  380. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md040_test.rs +0 -0
  381. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md041_test.rs +0 -0
  382. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md042_test.rs +0 -0
  383. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md043_test.rs +0 -0
  384. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md044_test.rs +0 -0
  385. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md045_test.rs +0 -0
  386. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md046_test.rs +0 -0
  387. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md047_test.rs +0 -0
  388. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md048_test.rs +0 -0
  389. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md049_test.rs +0 -0
  390. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md050_test.rs +0 -0
  391. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_comprehensive_test.rs +0 -0
  392. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_critical_edge_cases_test.rs +0 -0
  393. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_edge_cases_test.rs +0 -0
  394. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_issue_39_regression_test.rs +0 -0
  395. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_performance_edge_cases_test.rs +0 -0
  396. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_property_based_test.rs +0 -0
  397. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_regression_prevention_test.rs +0 -0
  398. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_test.rs +0 -0
  399. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md051_unicode_security_test.rs +0 -0
  400. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md052_test.rs +0 -0
  401. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md053_additional_test.rs +0 -0
  402. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md053_proptest.rs +0 -0
  403. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md053_test.rs +0 -0
  404. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md054_test.rs +0 -0
  405. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md054_unicode_test.rs +0 -0
  406. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md055_test.rs +0 -0
  407. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md056_test.rs +0 -0
  408. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md057_test.rs +0 -0
  409. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md058_kramdown_test.rs +0 -0
  410. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/md058_test.rs +0 -0
  411. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/mkdocs_admonitions_test.rs +0 -0
  412. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/mkdocs_edge_cases_test.rs +0 -0
  413. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/mkdocs_extensions_test.rs +0 -0
  414. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/mkdocs_snippets_test.rs +0 -0
  415. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/mod.rs +0 -0
  416. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules/rule_interaction_test.rs +0 -0
  417. {rumdl-0.0.142 → rumdl-0.0.143}/tests/rules_mod_test.rs +0 -0
  418. {rumdl-0.0.142 → rumdl-0.0.143}/tests/skip_context_tests.rs +0 -0
  419. {rumdl-0.0.142 → rumdl-0.0.143}/tests/test_underscore_edge_cases.rs +0 -0
  420. {rumdl-0.0.142 → rumdl-0.0.143}/tests/thread_safety_tests.rs +0 -0
  421. {rumdl-0.0.142 → rumdl-0.0.143}/tests/unfixable_rules_test.rs +0 -0
  422. {rumdl-0.0.142 → rumdl-0.0.143}/tests/unicode_edge_case_tests.rs +0 -0
  423. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utf8_boundary_tests.rs +0 -0
  424. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils/blockquote_utils_test.rs +0 -0
  425. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils/code_block_utils_extended_test.rs +0 -0
  426. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils/code_block_utils_test.rs +0 -0
  427. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils/core_utils_test.rs +0 -0
  428. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils/front_matter_utils_test.rs +0 -0
  429. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils/line_index_test.rs +0 -0
  430. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils/mod.rs +0 -0
  431. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils_markdown_edge_cases.rs +0 -0
  432. {rumdl-0.0.142 → rumdl-0.0.143}/tests/utils_tests.rs +0 -0
  433. {rumdl-0.0.142 → rumdl-0.0.143}/tests/vscode_extension_fixes.rs +0 -0
  434. {rumdl-0.0.142 → rumdl-0.0.143}/tests/vscode_test.rs +0 -0
  435. {rumdl-0.0.142 → rumdl-0.0.143}/tests/vscode_tests.rs +0 -0
  436. {rumdl-0.0.142 → rumdl-0.0.143}/tests/vscode_windows_comprehensive_test.rs +0 -0
  437. {rumdl-0.0.142 → rumdl-0.0.143}/tests/vscode_windows_test.rs +0 -0
@@ -1045,6 +1045,16 @@ version = "0.2.175"
1045
1045
  source = "registry+https://github.com/rust-lang/crates.io-index"
1046
1046
  checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
1047
1047
 
1048
+ [[package]]
1049
+ name = "libmimalloc-sys"
1050
+ version = "0.1.44"
1051
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1052
+ checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870"
1053
+ dependencies = [
1054
+ "cc",
1055
+ "libc",
1056
+ ]
1057
+
1048
1058
  [[package]]
1049
1059
  name = "libredox"
1050
1060
  version = "0.1.10"
@@ -1130,6 +1140,15 @@ dependencies = [
1130
1140
  "autocfg",
1131
1141
  ]
1132
1142
 
1143
+ [[package]]
1144
+ name = "mimalloc"
1145
+ version = "0.1.48"
1146
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1147
+ checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8"
1148
+ dependencies = [
1149
+ "libmimalloc-sys",
1150
+ ]
1151
+
1133
1152
  [[package]]
1134
1153
  name = "miniz_oxide"
1135
1154
  version = "0.8.9"
@@ -1625,7 +1644,7 @@ checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1625
1644
 
1626
1645
  [[package]]
1627
1646
  name = "rumdl"
1628
- version = "0.0.142"
1647
+ version = "0.0.143"
1629
1648
  dependencies = [
1630
1649
  "anyhow",
1631
1650
  "assert_cmd",
@@ -1644,6 +1663,7 @@ dependencies = [
1644
1663
  "log",
1645
1664
  "markdown",
1646
1665
  "memmap2",
1666
+ "mimalloc",
1647
1667
  "notify",
1648
1668
  "num_cpus",
1649
1669
  "once_cell",
@@ -1662,6 +1682,7 @@ dependencies = [
1662
1682
  "strsim",
1663
1683
  "tempfile",
1664
1684
  "thiserror",
1685
+ "tikv-jemallocator",
1665
1686
  "tokio",
1666
1687
  "tokio-util",
1667
1688
  "toml",
@@ -1933,6 +1954,26 @@ dependencies = [
1933
1954
  "syn",
1934
1955
  ]
1935
1956
 
1957
+ [[package]]
1958
+ name = "tikv-jemalloc-sys"
1959
+ version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7"
1960
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1961
+ checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d"
1962
+ dependencies = [
1963
+ "cc",
1964
+ "libc",
1965
+ ]
1966
+
1967
+ [[package]]
1968
+ name = "tikv-jemallocator"
1969
+ version = "0.6.0"
1970
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1971
+ checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865"
1972
+ dependencies = [
1973
+ "libc",
1974
+ "tikv-jemalloc-sys",
1975
+ ]
1976
+
1936
1977
  [[package]]
1937
1978
  name = "tinystr"
1938
1979
  version = "0.8.1"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.142"
3
+ version = "0.0.143"
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)"
@@ -139,3 +139,9 @@ unicode-segmentation = "1.12"
139
139
  unicode-width = "0.2"
140
140
  unicode-blocks = "0.1"
141
141
  unicode-bidi = "0.3"
142
+
143
+ [target.'cfg(not(target_env = "msvc"))'.dependencies]
144
+ tikv-jemallocator = "0.6"
145
+
146
+ [target.'cfg(target_env = "msvc")'.dependencies]
147
+ mimalloc = { version = "0.1", default-features = false }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.142
3
+ Version: 0.0.143
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -1,3 +1,13 @@
1
+ // Use jemalloc for better memory allocation performance on Unix-like systems
2
+ #[cfg(not(target_env = "msvc"))]
3
+ #[global_allocator]
4
+ static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc;
5
+
6
+ // Use mimalloc on Windows for better performance
7
+ #[cfg(target_env = "msvc")]
8
+ #[global_allocator]
9
+ static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
10
+
1
11
  use chrono::Local;
2
12
  use clap::{Args, Parser, Subcommand};
3
13
  use colored::*;
@@ -3083,6 +3093,7 @@ fn apply_fixes(
3083
3093
  quiet: bool,
3084
3094
  config: &rumdl_config::Config,
3085
3095
  ) -> usize {
3096
+ use std::time::Instant;
3086
3097
  // Store the original warning count by rule
3087
3098
  let mut original_counts: std::collections::HashMap<&str, usize> = std::collections::HashMap::new();
3088
3099
  for warning in all_warnings {
@@ -3091,6 +3102,13 @@ fn apply_fixes(
3091
3102
  }
3092
3103
  }
3093
3104
 
3105
+ // Track which rules actually fixed content
3106
+ let mut rules_that_fixed = Vec::new();
3107
+
3108
+ let mut total_ctx_time = std::time::Duration::ZERO;
3109
+ let mut total_fix_time = std::time::Duration::ZERO;
3110
+ let mut ctx_creations = 0;
3111
+
3094
3112
  // Apply fixes for rules that have warnings, regardless of whether individual warnings have fixes
3095
3113
  for rule in rules {
3096
3114
  let rule_warnings: Vec<_> = all_warnings
@@ -3129,14 +3147,23 @@ fn apply_fixes(
3129
3147
  continue;
3130
3148
  }
3131
3149
 
3150
+ let ctx_start = Instant::now();
3132
3151
  let ctx = LintContext::new(content, config.markdown_flavor());
3152
+ total_ctx_time += ctx_start.elapsed();
3153
+ ctx_creations += 1;
3154
+
3155
+ let fix_start = Instant::now();
3133
3156
  match rule.fix(&ctx) {
3134
3157
  Ok(fixed_content) => {
3158
+ total_fix_time += fix_start.elapsed();
3135
3159
  if fixed_content != *content {
3136
3160
  *content = fixed_content;
3161
+ // Track that this rule made changes
3162
+ rules_that_fixed.push(rule_name);
3137
3163
  }
3138
3164
  }
3139
3165
  Err(err) => {
3166
+ total_fix_time += fix_start.elapsed();
3140
3167
  if !quiet {
3141
3168
  eprintln!(
3142
3169
  "{} Failed to apply fix for rule {}: {}",
@@ -3151,12 +3178,16 @@ fn apply_fixes(
3151
3178
  }
3152
3179
  }
3153
3180
 
3154
- // Now re-check all rules to see what warnings remain
3181
+ // OPTIMIZATION: Only re-check rules that actually applied fixes or had warnings
3155
3182
  let ctx_after_fixes = LintContext::new(content, config.markdown_flavor());
3156
3183
  let mut remaining_counts: std::collections::HashMap<&str, usize> = std::collections::HashMap::new();
3157
3184
 
3158
3185
  for rule in rules {
3159
- if let Ok(remaining_warnings) = rule.check(&ctx_after_fixes) {
3186
+ let rule_name = rule.name();
3187
+ // Only re-check if this rule made changes OR if we have original warnings for it
3188
+ if (rules_that_fixed.contains(&rule_name) || original_counts.contains_key(rule_name))
3189
+ && let Ok(remaining_warnings) = rule.check(&ctx_after_fixes)
3190
+ {
3160
3191
  for warning in remaining_warnings {
3161
3192
  if let Some(rule_name) = warning.rule_name {
3162
3193
  *remaining_counts.entry(rule_name).or_insert(0) += 1;
@@ -3172,6 +3203,13 @@ fn apply_fixes(
3172
3203
  warnings_fixed += original_count.saturating_sub(remaining);
3173
3204
  }
3174
3205
 
3206
+ if std::env::var("RUMDL_DEBUG_FIX_PERF").is_ok() {
3207
+ eprintln!("DEBUG: LintContext creations: {ctx_creations}");
3208
+ eprintln!("DEBUG: Total LintContext time: {total_ctx_time:?}");
3209
+ eprintln!("DEBUG: Total fix() time: {total_fix_time:?}");
3210
+ eprintln!("DEBUG: Total time: {:?}", total_ctx_time + total_fix_time);
3211
+ }
3212
+
3175
3213
  warnings_fixed
3176
3214
  }
3177
3215
 
@@ -3183,6 +3221,7 @@ fn apply_fixes_stdin(
3183
3221
  quiet: bool,
3184
3222
  config: &rumdl_config::Config,
3185
3223
  ) -> usize {
3224
+ use std::time::Instant;
3186
3225
  // Store the original warning count by rule
3187
3226
  let mut original_counts: std::collections::HashMap<&str, usize> = std::collections::HashMap::new();
3188
3227
  for warning in all_warnings {
@@ -3191,6 +3230,13 @@ fn apply_fixes_stdin(
3191
3230
  }
3192
3231
  }
3193
3232
 
3233
+ // Track which rules actually fixed content
3234
+ let mut rules_that_fixed = Vec::new();
3235
+
3236
+ let mut total_ctx_time = std::time::Duration::ZERO;
3237
+ let mut total_fix_time = std::time::Duration::ZERO;
3238
+ let mut ctx_creations = 0;
3239
+
3194
3240
  // Apply fixes for rules that have warnings, regardless of whether individual warnings have fixes
3195
3241
  for rule in rules {
3196
3242
  let rule_warnings: Vec<_> = all_warnings
@@ -3229,14 +3275,23 @@ fn apply_fixes_stdin(
3229
3275
  continue;
3230
3276
  }
3231
3277
 
3278
+ let ctx_start = Instant::now();
3232
3279
  let ctx = LintContext::new(content, config.markdown_flavor());
3280
+ total_ctx_time += ctx_start.elapsed();
3281
+ ctx_creations += 1;
3282
+
3283
+ let fix_start = Instant::now();
3233
3284
  match rule.fix(&ctx) {
3234
3285
  Ok(fixed_content) => {
3286
+ total_fix_time += fix_start.elapsed();
3235
3287
  if fixed_content != *content {
3236
3288
  *content = fixed_content;
3289
+ // Track that this rule made changes
3290
+ rules_that_fixed.push(rule_name);
3237
3291
  }
3238
3292
  }
3239
3293
  Err(err) => {
3294
+ total_fix_time += fix_start.elapsed();
3240
3295
  if !quiet {
3241
3296
  eprintln!(
3242
3297
  "{} Failed to apply fix for rule {}: {}",
@@ -3251,12 +3306,16 @@ fn apply_fixes_stdin(
3251
3306
  }
3252
3307
  }
3253
3308
 
3254
- // Now re-check all rules to see what warnings remain
3309
+ // OPTIMIZATION: Only re-check rules that actually applied fixes or had warnings
3255
3310
  let ctx_after_fixes = LintContext::new(content, config.markdown_flavor());
3256
3311
  let mut remaining_counts: std::collections::HashMap<&str, usize> = std::collections::HashMap::new();
3257
3312
 
3258
3313
  for rule in rules {
3259
- if let Ok(remaining_warnings) = rule.check(&ctx_after_fixes) {
3314
+ let rule_name = rule.name();
3315
+ // Only re-check if this rule made changes OR if we have original warnings for it
3316
+ if (rules_that_fixed.contains(&rule_name) || original_counts.contains_key(rule_name))
3317
+ && let Ok(remaining_warnings) = rule.check(&ctx_after_fixes)
3318
+ {
3260
3319
  for warning in remaining_warnings {
3261
3320
  if let Some(rule_name) = warning.rule_name {
3262
3321
  *remaining_counts.entry(rule_name).or_insert(0) += 1;
@@ -3272,6 +3331,13 @@ fn apply_fixes_stdin(
3272
3331
  warnings_fixed += original_count.saturating_sub(remaining);
3273
3332
  }
3274
3333
 
3334
+ if std::env::var("RUMDL_DEBUG_FIX_PERF").is_ok() {
3335
+ eprintln!("DEBUG: LintContext creations: {ctx_creations}");
3336
+ eprintln!("DEBUG: Total LintContext time: {total_ctx_time:?}");
3337
+ eprintln!("DEBUG: Total fix() time: {total_fix_time:?}");
3338
+ eprintln!("DEBUG: Total time: {:?}", total_ctx_time + total_fix_time);
3339
+ }
3340
+
3275
3341
  warnings_fixed
3276
3342
  }
3277
3343
 
@@ -93,42 +93,8 @@ impl Rule for MD013LineLength {
93
93
  fn check(&self, ctx: &crate::lint_context::LintContext) -> LintResult {
94
94
  let content = ctx.content;
95
95
 
96
- // Early return for empty content
97
- if content.is_empty() {
98
- return Ok(Vec::new());
99
- }
100
-
101
- // Quick check: if total content is shorter than line limit, definitely no violations
102
- // BUT: in normalize mode with reflow, we still want to check for multi-line paragraphs
103
- if content.len() <= self.config.line_length
104
- && !(self.config.reflow && self.config.reflow_mode == ReflowMode::Normalize)
105
- {
106
- return Ok(Vec::new());
107
- }
108
-
109
- // More aggressive early return - check if any line could possibly be long
110
- let has_long_lines = if !ctx.lines.is_empty() {
111
- ctx.lines
112
- .iter()
113
- .any(|line| line.content.len() > self.config.line_length)
114
- } else {
115
- // Fallback: do a quick scan for newlines to estimate max line length
116
- let mut max_line_len = 0;
117
- let mut current_line_len = 0;
118
- for ch in content.chars() {
119
- if ch == '\n' {
120
- max_line_len = max_line_len.max(current_line_len);
121
- current_line_len = 0;
122
- } else {
123
- current_line_len += 1;
124
- }
125
- }
126
- max_line_len = max_line_len.max(current_line_len);
127
- max_line_len > self.config.line_length
128
- };
129
-
130
- // In normalize mode, we want to continue even if no long lines
131
- if !(has_long_lines || self.config.reflow && self.config.reflow_mode == ReflowMode::Normalize) {
96
+ // Fast early return using should_skip
97
+ if self.should_skip(ctx) && !(self.config.reflow && self.config.reflow_mode == ReflowMode::Normalize) {
132
98
  return Ok(Vec::new());
133
99
  }
134
100
 
@@ -189,6 +155,22 @@ impl Rule for MD013LineLength {
189
155
  self.config.clone()
190
156
  };
191
157
 
158
+ // Pre-filter lines that could be problematic to avoid processing all lines
159
+ let mut candidate_lines = Vec::new();
160
+ for (line_idx, line_info) in ctx.lines.iter().enumerate() {
161
+ // Quick length check first
162
+ if line_info.content.len() > effective_config.line_length {
163
+ candidate_lines.push(line_idx);
164
+ }
165
+ }
166
+
167
+ // If no candidate lines and not in normalize mode, early return
168
+ if candidate_lines.is_empty()
169
+ && !(effective_config.reflow && effective_config.reflow_mode == ReflowMode::Normalize)
170
+ {
171
+ return Ok(warnings);
172
+ }
173
+
192
174
  // Use ctx.lines if available for better performance
193
175
  let lines: Vec<&str> = if !ctx.lines.is_empty() {
194
176
  ctx.lines.iter().map(|l| l.content.as_str()).collect()
@@ -196,31 +178,33 @@ impl Rule for MD013LineLength {
196
178
  content.lines().collect()
197
179
  };
198
180
 
199
- // Create a quick lookup set for heading lines
200
- let heading_lines_set: std::collections::HashSet<usize> = structure.heading_lines.iter().cloned().collect();
201
-
202
- // Use TableUtils to find all table blocks in the document
203
- let table_blocks = TableUtils::find_table_blocks(content, ctx);
181
+ // Create a quick lookup set for heading lines (only if needed)
182
+ let heading_lines_set: std::collections::HashSet<usize> = if !effective_config.headings {
183
+ structure.heading_lines.iter().cloned().collect()
184
+ } else {
185
+ std::collections::HashSet::new()
186
+ };
204
187
 
205
- // Pre-compute table lines from the table blocks
206
- let table_lines_set: std::collections::HashSet<usize> = {
188
+ // Use TableUtils to find all table blocks (only if needed)
189
+ let table_lines_set: std::collections::HashSet<usize> = if !effective_config.tables {
190
+ let table_blocks = TableUtils::find_table_blocks(content, ctx);
207
191
  let mut table_lines = std::collections::HashSet::new();
208
-
209
192
  for table in &table_blocks {
210
- // Add header line
211
- table_lines.insert(table.header_line + 1); // Convert 0-indexed to 1-indexed
212
- // Add delimiter line
193
+ table_lines.insert(table.header_line + 1);
213
194
  table_lines.insert(table.delimiter_line + 1);
214
- // Add all content lines
215
195
  for &line in &table.content_lines {
216
- table_lines.insert(line + 1); // Convert 0-indexed to 1-indexed
196
+ table_lines.insert(line + 1);
217
197
  }
218
198
  }
219
199
  table_lines
200
+ } else {
201
+ std::collections::HashSet::new()
220
202
  };
221
203
 
222
- for (line_num, line) in lines.iter().enumerate() {
223
- let line_number = line_num + 1;
204
+ // Only process candidate lines that were pre-filtered
205
+ for &line_idx in &candidate_lines {
206
+ let line_number = line_idx + 1;
207
+ let line = lines[line_idx];
224
208
 
225
209
  // Calculate effective length excluding unbreakable URLs
226
210
  let effective_length = self.calculate_effective_length(line);
@@ -228,7 +212,7 @@ impl Rule for MD013LineLength {
228
212
  // Use single line length limit for all content
229
213
  let line_limit = effective_config.line_length;
230
214
 
231
- // Skip short lines immediately
215
+ // Skip short lines immediately (double-check after effective length calculation)
232
216
  if effective_length <= line_limit {
233
217
  continue;
234
218
  }
@@ -253,7 +237,7 @@ impl Rule for MD013LineLength {
253
237
  }
254
238
 
255
239
  // Skip lines that are only a URL, image ref, or link ref
256
- if self.should_ignore_line(line, &lines, line_num, structure) {
240
+ if self.should_ignore_line(line, &lines, line_idx, structure) {
257
241
  continue;
258
242
  }
259
243
  }
@@ -647,7 +631,13 @@ impl MD013LineLength {
647
631
  return line.chars().count();
648
632
  }
649
633
 
650
- // Quick check: if line doesn't contain "http" or "[", it can't have URLs or markdown links
634
+ // Quick byte-level check: if line doesn't contain "http" or "[", it can't have URLs or markdown links
635
+ let bytes = line.as_bytes();
636
+ if !bytes.contains(&b'h') && !bytes.contains(&b'[') {
637
+ return line.chars().count();
638
+ }
639
+
640
+ // More precise check for URLs and links
651
641
  if !line.contains("http") && !line.contains('[') {
652
642
  return line.chars().count();
653
643
  }
@@ -13,32 +13,42 @@ pub struct MD028NoBlanksBlockquote;
13
13
 
14
14
  impl MD028NoBlanksBlockquote {
15
15
  /// Check if a line is a blockquote line (has > markers)
16
+ #[inline]
16
17
  fn is_blockquote_line(line: &str) -> bool {
18
+ // Fast path: check for '>' character before doing any string operations
19
+ if !line.as_bytes().contains(&b'>') {
20
+ return false;
21
+ }
17
22
  line.trim_start().starts_with('>')
18
23
  }
19
24
 
20
- /// Get the blockquote level (number of > markers)
21
- fn get_blockquote_level(line: &str) -> usize {
22
- let trimmed = line.trim_start();
25
+ /// Get the blockquote level (number of > markers) and leading whitespace
26
+ /// Returns (level, whitespace_end_idx)
27
+ fn get_blockquote_info(line: &str) -> (usize, usize) {
28
+ let bytes = line.as_bytes();
29
+ let mut i = 0;
30
+
31
+ // Skip leading whitespace
32
+ while i < bytes.len() && (bytes[i] == b' ' || bytes[i] == b'\t') {
33
+ i += 1;
34
+ }
35
+
36
+ let whitespace_end = i;
23
37
  let mut level = 0;
24
- let chars = trimmed.chars();
25
38
 
26
- for ch in chars {
27
- if ch == '>' {
39
+ // Count '>' markers
40
+ while i < bytes.len() {
41
+ if bytes[i] == b'>' {
28
42
  level += 1;
29
- } else if ch != ' ' && ch != '\t' {
43
+ i += 1;
44
+ } else if bytes[i] == b' ' || bytes[i] == b'\t' {
45
+ i += 1;
46
+ } else {
30
47
  break;
31
48
  }
32
49
  }
33
50
 
34
- level
35
- }
36
-
37
- /// Get the leading whitespace before the first >
38
- fn get_leading_whitespace(line: &str) -> &str {
39
- let trimmed_len = line.trim_start().len();
40
- let total_len = line.len();
41
- &line[..total_len - trimmed_len]
51
+ (level, whitespace_end)
42
52
  }
43
53
 
44
54
  /// Check if there's substantive content between two blockquote sections
@@ -66,19 +76,24 @@ impl MD028NoBlanksBlockquote {
66
76
  // Even multiple consecutive blank lines are flagged as they can be ambiguous
67
77
  // (some parsers treat them as one blockquote, others as separate blockquotes).
68
78
 
69
- // Find previous and next blockquote lines
79
+ // Find previous and next blockquote lines using fast byte scanning
70
80
  let mut prev_quote_idx = None;
71
81
  let mut next_quote_idx = None;
72
82
 
83
+ // Scan backwards for previous blockquote
73
84
  for i in (0..blank_idx).rev() {
74
- if Self::is_blockquote_line(lines[i]) {
85
+ let line = lines[i];
86
+ // Fast check: if no '>' character, skip
87
+ if line.as_bytes().contains(&b'>') && Self::is_blockquote_line(line) {
75
88
  prev_quote_idx = Some(i);
76
89
  break;
77
90
  }
78
91
  }
79
92
 
93
+ // Scan forwards for next blockquote
80
94
  for (i, line) in lines.iter().enumerate().skip(blank_idx + 1) {
81
- if Self::is_blockquote_line(line) {
95
+ // Fast check: if no '>' character, skip
96
+ if line.as_bytes().contains(&b'>') && Self::is_blockquote_line(line) {
82
97
  next_quote_idx = Some(i);
83
98
  break;
84
99
  }
@@ -94,9 +109,9 @@ impl MD028NoBlanksBlockquote {
94
109
  return false;
95
110
  }
96
111
 
97
- // Check if levels match
98
- let prev_level = Self::get_blockquote_level(lines[prev_idx]);
99
- let next_level = Self::get_blockquote_level(lines[next_idx]);
112
+ // Get blockquote info once per line to avoid repeated parsing
113
+ let (prev_level, prev_whitespace_end) = Self::get_blockquote_info(lines[prev_idx]);
114
+ let (next_level, next_whitespace_end) = Self::get_blockquote_info(lines[next_idx]);
100
115
 
101
116
  // Different levels suggest different contexts
102
117
  // But next_level > prev_level could be nested continuation
@@ -104,9 +119,11 @@ impl MD028NoBlanksBlockquote {
104
119
  return false;
105
120
  }
106
121
 
107
- // Check indentation consistency
108
- let prev_indent = Self::get_leading_whitespace(lines[prev_idx]);
109
- let next_indent = Self::get_leading_whitespace(lines[next_idx]);
122
+ // Check indentation consistency using byte indices
123
+ let prev_line = lines[prev_idx];
124
+ let next_line = lines[next_idx];
125
+ let prev_indent = &prev_line[..prev_whitespace_end];
126
+ let next_indent = &next_line[..next_whitespace_end];
110
127
 
111
128
  // Different indentation indicates separate blockquote contexts
112
129
  // Same indentation with no content between = same blockquote (blank line inside)
@@ -129,12 +146,15 @@ impl MD028NoBlanksBlockquote {
129
146
  }
130
147
 
131
148
  // This blank line appears to be inside a blockquote
132
- // Find the appropriate fix
149
+ // Find the appropriate fix using optimized parsing
133
150
  for i in (0..index).rev() {
134
- if Self::is_blockquote_line(lines[i]) {
135
- let level = Self::get_blockquote_level(lines[i]);
136
- let indent = Self::get_leading_whitespace(lines[i]);
137
- let mut fix = indent.to_string();
151
+ let line = lines[i];
152
+ // Fast check: if no '>' character, skip
153
+ if line.as_bytes().contains(&b'>') && Self::is_blockquote_line(line) {
154
+ let (level, whitespace_end) = Self::get_blockquote_info(line);
155
+ let indent = &line[..whitespace_end];
156
+ let mut fix = String::with_capacity(indent.len() + level);
157
+ fix.push_str(indent);
138
158
  for _ in 0..level {
139
159
  fix.push('>');
140
160
  }
@@ -177,17 +197,35 @@ impl Rule for MD028NoBlanksBlockquote {
177
197
  // Get all lines
178
198
  let lines: Vec<&str> = ctx.content.lines().collect();
179
199
 
180
- // Check each line
181
- for (line_idx, line) in lines.iter().enumerate() {
182
- let line_num = line_idx + 1;
200
+ // Pre-scan to find blank lines and blockquote lines for faster processing
201
+ let mut blank_line_indices = Vec::new();
202
+ let mut has_blockquotes = false;
183
203
 
204
+ for (line_idx, line) in lines.iter().enumerate() {
184
205
  // Skip lines in code blocks
185
206
  if line_idx < ctx.lines.len() && ctx.lines[line_idx].in_code_block {
186
207
  continue;
187
208
  }
188
209
 
210
+ if line.trim().is_empty() {
211
+ blank_line_indices.push(line_idx);
212
+ } else if Self::is_blockquote_line(line) {
213
+ has_blockquotes = true;
214
+ }
215
+ }
216
+
217
+ // If no blockquotes found, no need to check blank lines
218
+ if !has_blockquotes {
219
+ return Ok(Vec::new());
220
+ }
221
+
222
+ // Only check blank lines that could be problematic
223
+ for &line_idx in &blank_line_indices {
224
+ let line_num = line_idx + 1;
225
+
189
226
  // Check if this is a problematic blank line inside a blockquote
190
227
  if let Some((level, fix_content)) = Self::is_problematic_blank_line(&lines, line_idx) {
228
+ let line = lines[line_idx];
191
229
  let (start_line, start_col, end_line, end_col) = calculate_line_range(line_num, line);
192
230
 
193
231
  warnings.push(LintWarning {