rumdl 0.0.93__tar.gz → 0.0.95__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 (347) hide show
  1. {rumdl-0.0.93 → rumdl-0.0.95}/CHANGELOG.md +19 -1
  2. {rumdl-0.0.93 → rumdl-0.0.95}/Cargo.lock +18 -18
  3. {rumdl-0.0.93 → rumdl-0.0.95}/Cargo.toml +1 -1
  4. {rumdl-0.0.93 → rumdl-0.0.95}/PKG-INFO +11 -1
  5. {rumdl-0.0.93 → rumdl-0.0.95}/README.md +10 -0
  6. rumdl-0.0.95/src/bin/benchmark_rule.rs +156 -0
  7. {rumdl-0.0.93 → rumdl-0.0.95}/src/bin/measure_code_span_performance.rs +1 -1
  8. rumdl-0.0.95/src/exit_codes.rs +34 -0
  9. {rumdl-0.0.93 → rumdl-0.0.95}/src/lib.rs +1 -0
  10. {rumdl-0.0.93 → rumdl-0.0.95}/src/lint_context.rs +22 -6
  11. {rumdl-0.0.93 → rumdl-0.0.95}/src/main.rs +31 -31
  12. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md009_trailing_spaces.rs +10 -12
  13. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md013_line_length.rs +121 -36
  14. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md034_no_bare_urls.rs +98 -119
  15. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md038_no_space_in_code.rs +32 -11
  16. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md044_proper_names.rs +93 -89
  17. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md047_single_trailing_newline.rs +36 -21
  18. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md052_reference_links_images.rs +7 -3
  19. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md053_link_image_reference_definitions.rs +62 -48
  20. {rumdl-0.0.93 → rumdl-0.0.95}/.config/nextest.toml +0 -0
  21. {rumdl-0.0.93 → rumdl-0.0.95}/.mise.toml +0 -0
  22. {rumdl-0.0.93 → rumdl-0.0.95}/.rumdl.toml +0 -0
  23. {rumdl-0.0.93 → rumdl-0.0.95}/.rustfmt.toml +0 -0
  24. {rumdl-0.0.93 → rumdl-0.0.95}/LICENSE +0 -0
  25. {rumdl-0.0.93 → rumdl-0.0.95}/MANIFEST.in +0 -0
  26. {rumdl-0.0.93 → rumdl-0.0.95}/Makefile +0 -0
  27. {rumdl-0.0.93 → rumdl-0.0.95}/assets/logo.png +0 -0
  28. {rumdl-0.0.93 → rumdl-0.0.95}/benches/fix_performance.rs +0 -0
  29. {rumdl-0.0.93 → rumdl-0.0.95}/benches/range_performance.rs +0 -0
  30. {rumdl-0.0.93 → rumdl-0.0.95}/benches/range_utils_benchmark.rs +0 -0
  31. {rumdl-0.0.93 → rumdl-0.0.95}/benches/rule_performance.rs +0 -0
  32. {rumdl-0.0.93 → rumdl-0.0.95}/benches/simple_fix_bench.rs +0 -0
  33. {rumdl-0.0.93 → rumdl-0.0.95}/docs/RULES.md +0 -0
  34. {rumdl-0.0.93 → rumdl-0.0.95}/docs/global-settings.md +0 -0
  35. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md001.md +0 -0
  36. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md002.md +0 -0
  37. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md003.md +0 -0
  38. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md004.md +0 -0
  39. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md005.md +0 -0
  40. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md006.md +0 -0
  41. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md007.md +0 -0
  42. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md009.md +0 -0
  43. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md010.md +0 -0
  44. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md011.md +0 -0
  45. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md012.md +0 -0
  46. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md013.md +0 -0
  47. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md014.md +0 -0
  48. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md018.md +0 -0
  49. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md019.md +0 -0
  50. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md020.md +0 -0
  51. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md021.md +0 -0
  52. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md022.md +0 -0
  53. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md023.md +0 -0
  54. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md024.md +0 -0
  55. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md025.md +0 -0
  56. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md026.md +0 -0
  57. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md027.md +0 -0
  58. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md028.md +0 -0
  59. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md029.md +0 -0
  60. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md030.md +0 -0
  61. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md031.md +0 -0
  62. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md032.md +0 -0
  63. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md033.md +0 -0
  64. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md034.md +0 -0
  65. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md035.md +0 -0
  66. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md036.md +0 -0
  67. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md037.md +0 -0
  68. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md038.md +0 -0
  69. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md039.md +0 -0
  70. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md040.md +0 -0
  71. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md041.md +0 -0
  72. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md042.md +0 -0
  73. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md043.md +0 -0
  74. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md044.md +0 -0
  75. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md045.md +0 -0
  76. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md046.md +0 -0
  77. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md047.md +0 -0
  78. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md048.md +0 -0
  79. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md049.md +0 -0
  80. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md050.md +0 -0
  81. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md051.md +0 -0
  82. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md052.md +0 -0
  83. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md053.md +0 -0
  84. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md054.md +0 -0
  85. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md055.md +0 -0
  86. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md056.md +0 -0
  87. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md057.md +0 -0
  88. {rumdl-0.0.93 → rumdl-0.0.95}/docs/md058.md +0 -0
  89. {rumdl-0.0.93 → rumdl-0.0.95}/docs/vscode-extension.md +0 -0
  90. {rumdl-0.0.93 → rumdl-0.0.95}/parity_check.py +0 -0
  91. {rumdl-0.0.93 → rumdl-0.0.95}/pyproject.toml +0 -0
  92. {rumdl-0.0.93 → rumdl-0.0.95}/python/MANIFEST.in +0 -0
  93. {rumdl-0.0.93 → rumdl-0.0.95}/python/PYTHON-README.md +0 -0
  94. {rumdl-0.0.93 → rumdl-0.0.95}/python/rumdl/__init__.py +0 -0
  95. {rumdl-0.0.93 → rumdl-0.0.95}/python/rumdl/__main__.py +0 -0
  96. {rumdl-0.0.93 → rumdl-0.0.95}/python/rumdl/py.typed +0 -0
  97. {rumdl-0.0.93 → rumdl-0.0.95}/rumdl.toml.example +0 -0
  98. {rumdl-0.0.93 → rumdl-0.0.95}/rust-toolchain.toml +0 -0
  99. {rumdl-0.0.93 → rumdl-0.0.95}/scripts/extract-changelog.sh +0 -0
  100. {rumdl-0.0.93 → rumdl-0.0.95}/scripts/prepare-release.sh +0 -0
  101. {rumdl-0.0.93 → rumdl-0.0.95}/src/bin/benchmark.rs +0 -0
  102. {rumdl-0.0.93 → rumdl-0.0.95}/src/bin/file_parallel_benchmark.rs +0 -0
  103. {rumdl-0.0.93 → rumdl-0.0.95}/src/config.rs +0 -0
  104. {rumdl-0.0.93 → rumdl-0.0.95}/src/init.rs +0 -0
  105. {rumdl-0.0.93 → rumdl-0.0.95}/src/inline_config.rs +0 -0
  106. {rumdl-0.0.93 → rumdl-0.0.95}/src/lsp/mod.rs +0 -0
  107. {rumdl-0.0.93 → rumdl-0.0.95}/src/lsp/server.rs +0 -0
  108. {rumdl-0.0.93 → rumdl-0.0.95}/src/lsp/types.rs +0 -0
  109. {rumdl-0.0.93 → rumdl-0.0.95}/src/markdownlint_config.rs +0 -0
  110. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/azure.rs +0 -0
  111. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/concise.rs +0 -0
  112. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/github.rs +0 -0
  113. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/gitlab.rs +0 -0
  114. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/grouped.rs +0 -0
  115. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/json.rs +0 -0
  116. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/json_lines.rs +0 -0
  117. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/junit.rs +0 -0
  118. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/mod.rs +0 -0
  119. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/pylint.rs +0 -0
  120. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/sarif.rs +0 -0
  121. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/formatters/text.rs +0 -0
  122. {rumdl-0.0.93 → rumdl-0.0.95}/src/output/mod.rs +0 -0
  123. {rumdl-0.0.93 → rumdl-0.0.95}/src/parallel.rs +0 -0
  124. {rumdl-0.0.93 → rumdl-0.0.95}/src/performance.rs +0 -0
  125. {rumdl-0.0.93 → rumdl-0.0.95}/src/profiling.rs +0 -0
  126. {rumdl-0.0.93 → rumdl-0.0.95}/src/python.rs +0 -0
  127. {rumdl-0.0.93 → rumdl-0.0.95}/src/rule.rs +0 -0
  128. {rumdl-0.0.93 → rumdl-0.0.95}/src/rule_config.rs +0 -0
  129. {rumdl-0.0.93 → rumdl-0.0.95}/src/rule_config_serde.rs +0 -0
  130. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/blockquote_utils.rs +0 -0
  131. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/code_block_utils.rs +0 -0
  132. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/code_fence_utils.rs +0 -0
  133. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/emphasis_style.rs +0 -0
  134. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/front_matter_utils.rs +0 -0
  135. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/heading_utils.rs +0 -0
  136. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/list_utils.rs +0 -0
  137. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md001_heading_increment.rs +0 -0
  138. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  139. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md002_first_heading_h1.rs +0 -0
  140. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md003_heading_style/md003_config.rs +0 -0
  141. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md003_heading_style.rs +0 -0
  142. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  143. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md004_unordered_list_style.rs +0 -0
  144. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md005_list_indent.rs +0 -0
  145. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md006_start_bullets.rs +0 -0
  146. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  147. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md007_ul_indent.rs +0 -0
  148. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  149. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  150. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md010_no_hard_tabs.rs +0 -0
  151. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md011_no_reversed_links.rs +0 -0
  152. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  153. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md012_no_multiple_blanks.rs +0 -0
  154. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md013_line_length/md013_config.rs +0 -0
  155. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  156. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md014_commands_show_output.rs +0 -0
  157. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md018_no_missing_space_atx.rs +0 -0
  158. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  159. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  160. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  161. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  162. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md022_blanks_around_headings.rs +0 -0
  163. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md023_heading_start_left.rs +0 -0
  164. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  165. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md024_no_duplicate_heading.rs +0 -0
  166. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md025_single_title/md025_config.rs +0 -0
  167. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md025_single_title.rs +0 -0
  168. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  169. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  170. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  171. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  172. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md029_ordered_list_prefix.rs +0 -0
  173. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  174. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md030_list_marker_space.rs +0 -0
  175. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md031_blanks_around_fences.rs +0 -0
  176. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md032_blanks_around_lists.rs +0 -0
  177. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  178. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md033_no_inline_html.rs +0 -0
  179. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md035_hr_style/md035_config.rs +0 -0
  180. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md035_hr_style.rs +0 -0
  181. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  182. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  183. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  184. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md039_no_space_in_links.rs +0 -0
  185. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md040_fenced_code_language.rs +0 -0
  186. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md041_first_line_heading.rs +0 -0
  187. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md042_no_empty_links.rs +0 -0
  188. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md043_required_headings.rs +0 -0
  189. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md044_proper_names/md044_config.rs +0 -0
  190. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  191. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md045_no_alt_text.rs +0 -0
  192. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  193. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md046_code_block_style.rs +0 -0
  194. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  195. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md048_code_fence_style.rs +0 -0
  196. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  197. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md049_emphasis_style.rs +0 -0
  198. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md050_strong_style/md050_config.rs +0 -0
  199. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md050_strong_style.rs +0 -0
  200. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md051_link_fragments.rs +0 -0
  201. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  202. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md054_link_image_style.rs +0 -0
  203. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  204. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md055_table_pipe_style.rs +0 -0
  205. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md056_table_column_count.rs +0 -0
  206. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  207. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md057_existing_relative_links.rs +0 -0
  208. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/md058_blanks_around_tables.rs +0 -0
  209. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/mod.rs +0 -0
  210. {rumdl-0.0.93 → rumdl-0.0.95}/src/rules/strong_style.rs +0 -0
  211. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/ast_utils.rs +0 -0
  212. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/code_block_utils.rs +0 -0
  213. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/document_structure.rs +0 -0
  214. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/early_returns.rs +0 -0
  215. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/element_cache.rs +0 -0
  216. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/emphasis_utils.rs +0 -0
  217. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/fix_utils.rs +0 -0
  218. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/markdown_elements.rs +0 -0
  219. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/mod.rs +0 -0
  220. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/range_utils.rs +0 -0
  221. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/regex_cache.rs +0 -0
  222. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/string_interner.rs +0 -0
  223. {rumdl-0.0.93 → rumdl-0.0.95}/src/utils/table_utils.rs +0 -0
  224. {rumdl-0.0.93 → rumdl-0.0.95}/src/vscode.rs +0 -0
  225. {rumdl-0.0.93 → rumdl-0.0.95}/tests/advanced_integration_tests.rs +0 -0
  226. {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/additional_tests.rs +0 -0
  227. {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/basic_tests.rs +0 -0
  228. {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/comprehensive_tests.rs +0 -0
  229. {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/extended_tests.rs +0 -0
  230. {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/mod.rs +0 -0
  231. {rumdl-0.0.93 → rumdl-0.0.95}/tests/character_ranges/unicode_utils.rs +0 -0
  232. {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_duplication_test.rs +0 -0
  233. {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_integration_tests.rs +0 -0
  234. {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_lsp_fix_consistency.rs +0 -0
  235. {rumdl-0.0.93 → rumdl-0.0.95}/tests/cli_statistics_test.rs +0 -0
  236. {rumdl-0.0.93 → rumdl-0.0.95}/tests/commonmark_compliance_tests.rs +0 -0
  237. {rumdl-0.0.93 → rumdl-0.0.95}/tests/comprehensive_integration_tests.rs +0 -0
  238. {rumdl-0.0.93 → rumdl-0.0.95}/tests/comprehensive_output_format_tests.rs +0 -0
  239. {rumdl-0.0.93 → rumdl-0.0.95}/tests/config_application_tests.rs +0 -0
  240. {rumdl-0.0.93 → rumdl-0.0.95}/tests/config_file_command_test.rs +0 -0
  241. {rumdl-0.0.93 → rumdl-0.0.95}/tests/config_tests.rs +0 -0
  242. {rumdl-0.0.93 → rumdl-0.0.95}/tests/configuration_inheritance_tests.rs +0 -0
  243. {rumdl-0.0.93 → rumdl-0.0.95}/tests/consistency_regression_tests.rs +0 -0
  244. {rumdl-0.0.93 → rumdl-0.0.95}/tests/cross_platform_compatibility_tests.rs +0 -0
  245. {rumdl-0.0.93 → rumdl-0.0.95}/tests/final_confidence_assessment.rs +0 -0
  246. {rumdl-0.0.93 → rumdl-0.0.95}/tests/init_command_test.rs +0 -0
  247. {rumdl-0.0.93 → rumdl-0.0.95}/tests/init_tests.rs +0 -0
  248. {rumdl-0.0.93 → rumdl-0.0.95}/tests/inline_config_test.rs +0 -0
  249. {rumdl-0.0.93 → rumdl-0.0.95}/tests/integration_tests.rs +0 -0
  250. {rumdl-0.0.93 → rumdl-0.0.95}/tests/json_output_test.rs +0 -0
  251. {rumdl-0.0.93 → rumdl-0.0.95}/tests/lib.rs +0 -0
  252. {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_editor_integration_tests.rs +0 -0
  253. {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_integration_tests.rs +0 -0
  254. {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_memory_leak_tests.rs +0 -0
  255. {rumdl-0.0.93 → rumdl-0.0.95}/tests/lsp_tests.rs +0 -0
  256. {rumdl-0.0.93 → rumdl-0.0.95}/tests/malformed_markdown_stress_tests.rs +0 -0
  257. {rumdl-0.0.93 → rumdl-0.0.95}/tests/markdownlint_cli_integration.rs +0 -0
  258. {rumdl-0.0.93 → rumdl-0.0.95}/tests/markdownlint_config_test.rs +0 -0
  259. {rumdl-0.0.93 → rumdl-0.0.95}/tests/markdownlintignore_test.rs +0 -0
  260. {rumdl-0.0.93 → rumdl-0.0.95}/tests/nested_code_block_test.rs +0 -0
  261. {rumdl-0.0.93 → rumdl-0.0.95}/tests/output_format_integration_tests.rs +0 -0
  262. {rumdl-0.0.93 → rumdl-0.0.95}/tests/output_format_tests.rs +0 -0
  263. {rumdl-0.0.93 → rumdl-0.0.95}/tests/perf_check.rs +0 -0
  264. {rumdl-0.0.93 → rumdl-0.0.95}/tests/performance_validation_tests.rs +0 -0
  265. {rumdl-0.0.93 → rumdl-0.0.95}/tests/pyproject_config_tests.rs +0 -0
  266. {rumdl-0.0.93 → rumdl-0.0.95}/tests/real_world_repository_tests.rs +0 -0
  267. {rumdl-0.0.93 → rumdl-0.0.95}/tests/regression_prevention_tests.rs +0 -0
  268. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md001_test.rs +0 -0
  269. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md001_unicode_test.rs +0 -0
  270. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md002_test.rs +0 -0
  271. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md003_test.rs +0 -0
  272. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md004_test.rs +0 -0
  273. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md005_test.rs +0 -0
  274. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md006_test.rs +0 -0
  275. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md006_unicode_test.rs +0 -0
  276. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md007_test.rs +0 -0
  277. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md009_test.rs +0 -0
  278. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md010_test.rs +0 -0
  279. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md011_test.rs +0 -0
  280. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md012_test.rs +0 -0
  281. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md013_test.rs +0 -0
  282. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md014_test.rs +0 -0
  283. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md018_test.rs +0 -0
  284. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md019_test.rs +0 -0
  285. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md020_test.rs +0 -0
  286. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md021_test.rs +0 -0
  287. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md022_test.rs +0 -0
  288. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md023_extended_test.rs +0 -0
  289. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md023_test.rs +0 -0
  290. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md024_test.rs +0 -0
  291. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md025_test.rs +0 -0
  292. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md026_test.rs +0 -0
  293. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md027_test.rs +0 -0
  294. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md028_test.rs +0 -0
  295. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md029_test.rs +0 -0
  296. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md030_test.rs +0 -0
  297. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md031_test.rs +0 -0
  298. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md032_test.rs +0 -0
  299. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md033_extended_test.rs +0 -0
  300. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md033_test.rs +0 -0
  301. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md034_ipv6_test.rs +0 -0
  302. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md034_test.rs +0 -0
  303. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md035_test.rs +0 -0
  304. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md036_test.rs +0 -0
  305. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md037_test.rs +0 -0
  306. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md038_nested_backticks_test.rs +0 -0
  307. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md038_test.rs +0 -0
  308. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md039_test.rs +0 -0
  309. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md040_test.rs +0 -0
  310. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md041_test.rs +0 -0
  311. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md042_test.rs +0 -0
  312. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md043_test.rs +0 -0
  313. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md044_test.rs +0 -0
  314. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md045_test.rs +0 -0
  315. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md046_test.rs +0 -0
  316. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md047_test.rs +0 -0
  317. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md048_test.rs +0 -0
  318. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md049_test.rs +0 -0
  319. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md050_test.rs +0 -0
  320. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md051_test.rs +0 -0
  321. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md051_unicode_test.rs +0 -0
  322. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md052_test.rs +0 -0
  323. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md053_additional_test.rs +0 -0
  324. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md053_proptest.rs +0 -0
  325. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md053_test.rs +0 -0
  326. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md054_test.rs +0 -0
  327. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md054_unicode_test.rs +0 -0
  328. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md055_test.rs +0 -0
  329. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md056_test.rs +0 -0
  330. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md057_test.rs +0 -0
  331. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/md058_test.rs +0 -0
  332. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules/mod.rs +0 -0
  333. {rumdl-0.0.93 → rumdl-0.0.95}/tests/rules_mod_test.rs +0 -0
  334. {rumdl-0.0.93 → rumdl-0.0.95}/tests/thread_safety_tests.rs +0 -0
  335. {rumdl-0.0.93 → rumdl-0.0.95}/tests/unicode_edge_case_tests.rs +0 -0
  336. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/blockquote_utils_test.rs +0 -0
  337. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/code_block_utils_extended_test.rs +0 -0
  338. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/code_block_utils_test.rs +0 -0
  339. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/core_utils_test.rs +0 -0
  340. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/front_matter_utils_test.rs +0 -0
  341. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/line_index_test.rs +0 -0
  342. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils/mod.rs +0 -0
  343. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils_markdown_edge_cases.rs +0 -0
  344. {rumdl-0.0.93 → rumdl-0.0.95}/tests/utils_tests.rs +0 -0
  345. {rumdl-0.0.93 → rumdl-0.0.95}/tests/vscode_extension_fixes.rs +0 -0
  346. {rumdl-0.0.93 → rumdl-0.0.95}/tests/vscode_test.rs +0 -0
  347. {rumdl-0.0.93 → rumdl-0.0.95}/tests/vscode_tests.rs +0 -0
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.95] - 2025-07-15
11
+
12
+ ## [0.0.94] - 2025-07-04
13
+
14
+ ### Performance Improvements
15
+ - Implemented lazy code span loading - 3.8x speedup for 94% of rules that don't use code spans
16
+ - MD013: 34.5% faster check operations through aggressive early returns
17
+ - MD038: 14% faster by leveraging lazy code span loading
18
+ - MD044: 93.5% faster with global regex caching
19
+ - MD047: 8.3% faster using pre-computed line data
20
+ - MD053: 39.7% faster by leveraging pre-parsed reference definitions
21
+ - Overall LintContext creation improved by 11.7%
22
+
23
+ ### Fixed
24
+ - MD053: Fixed escaped character handling in reference definitions
25
+
10
26
  ## [0.0.93] - 2025-07-03
11
27
 
12
28
  ## [0.0.92] - 2025-07-02
@@ -133,7 +149,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
133
149
 
134
150
  - Initial implementation of remaining rules for markdownlint parity
135
151
 
136
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.93...HEAD
152
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.95...HEAD
153
+ [0.0.95]: https://github.com/rvben/rumdl/compare/v0.0.94...v0.0.95
154
+ [0.0.94]: https://github.com/rvben/rumdl/compare/v0.0.93...v0.0.94
137
155
  [0.0.93]: https://github.com/rvben/rumdl/compare/v0.0.92...v0.0.93
138
156
  [0.0.92]: https://github.com/rvben/rumdl/compare/v0.0.91...v0.0.92
139
157
  [0.0.91]: https://github.com/rvben/rumdl/compare/v0.0.90...v0.0.91
@@ -220,9 +220,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
220
220
 
221
221
  [[package]]
222
222
  name = "cc"
223
- version = "1.2.27"
223
+ version = "1.2.29"
224
224
  source = "registry+https://github.com/rust-lang/crates.io-index"
225
- checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
225
+ checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362"
226
226
  dependencies = [
227
227
  "shlex",
228
228
  ]
@@ -277,9 +277,9 @@ dependencies = [
277
277
 
278
278
  [[package]]
279
279
  name = "clap"
280
- version = "4.5.40"
280
+ version = "4.5.41"
281
281
  source = "registry+https://github.com/rust-lang/crates.io-index"
282
- checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
282
+ checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9"
283
283
  dependencies = [
284
284
  "clap_builder",
285
285
  "clap_derive",
@@ -287,9 +287,9 @@ dependencies = [
287
287
 
288
288
  [[package]]
289
289
  name = "clap_builder"
290
- version = "4.5.40"
290
+ version = "4.5.41"
291
291
  source = "registry+https://github.com/rust-lang/crates.io-index"
292
- checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
292
+ checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d"
293
293
  dependencies = [
294
294
  "anstream",
295
295
  "anstyle",
@@ -299,9 +299,9 @@ dependencies = [
299
299
 
300
300
  [[package]]
301
301
  name = "clap_derive"
302
- version = "4.5.40"
302
+ version = "4.5.41"
303
303
  source = "registry+https://github.com/rust-lang/crates.io-index"
304
- checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
304
+ checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491"
305
305
  dependencies = [
306
306
  "heck",
307
307
  "proc-macro2",
@@ -1004,9 +1004,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
1004
1004
 
1005
1005
  [[package]]
1006
1006
  name = "memmap2"
1007
- version = "0.9.5"
1007
+ version = "0.9.7"
1008
1008
  source = "registry+https://github.com/rust-lang/crates.io-index"
1009
- checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
1009
+ checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28"
1010
1010
  dependencies = [
1011
1011
  "libc",
1012
1012
  ]
@@ -1465,7 +1465,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1465
1465
 
1466
1466
  [[package]]
1467
1467
  name = "rumdl"
1468
- version = "0.0.93"
1468
+ version = "0.0.95"
1469
1469
  dependencies = [
1470
1470
  "anyhow",
1471
1471
  "assert_cmd",
@@ -1522,15 +1522,15 @@ checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
1522
1522
 
1523
1523
  [[package]]
1524
1524
  name = "rustix"
1525
- version = "1.0.7"
1525
+ version = "1.0.8"
1526
1526
  source = "registry+https://github.com/rust-lang/crates.io-index"
1527
- checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
1527
+ checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
1528
1528
  dependencies = [
1529
1529
  "bitflags 2.9.1",
1530
1530
  "errno",
1531
1531
  "libc",
1532
1532
  "linux-raw-sys",
1533
- "windows-sys 0.59.0",
1533
+ "windows-sys 0.60.2",
1534
1534
  ]
1535
1535
 
1536
1536
  [[package]]
@@ -1796,9 +1796,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1796
1796
 
1797
1797
  [[package]]
1798
1798
  name = "tokio"
1799
- version = "1.46.0"
1799
+ version = "1.46.1"
1800
1800
  source = "registry+https://github.com/rust-lang/crates.io-index"
1801
- checksum = "1140bb80481756a8cbe10541f37433b459c5aa1e727b4c020fbfebdc25bf3ec4"
1801
+ checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
1802
1802
  dependencies = [
1803
1803
  "backtrace",
1804
1804
  "bytes",
@@ -2394,9 +2394,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
2394
2394
 
2395
2395
  [[package]]
2396
2396
  name = "winnow"
2397
- version = "0.7.11"
2397
+ version = "0.7.12"
2398
2398
  source = "registry+https://github.com/rust-lang/crates.io-index"
2399
- checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd"
2399
+ checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95"
2400
2400
  dependencies = [
2401
2401
  "memchr",
2402
2402
  ]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.93"
3
+ version = "0.0.95"
4
4
  edition = "2024"
5
5
  rust-version = "1.88.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.93
3
+ Version: 0.0.95
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -375,6 +375,16 @@ These options are available for all commands:
375
375
  - `--config <file>`: Path to configuration file
376
376
  - `--no-config`: Ignore all configuration files and use built-in defaults
377
377
 
378
+ ### Exit Codes
379
+
380
+ rumdl uses exit codes following Ruff's convention for easy CI/CD integration:
381
+
382
+ - `0`: Success - no issues found
383
+ - `1`: Linting violations found
384
+ - `2`: Tool error (configuration error, file access error, invalid arguments, etc.)
385
+
386
+ This allows scripts and CI/CD systems to distinguish between "the tool found problems in your files" (exit 1) and "the tool couldn't run properly" (exit 2).
387
+
378
388
  ### Usage Examples
379
389
 
380
390
  ```bash
@@ -344,6 +344,16 @@ These options are available for all commands:
344
344
  - `--config <file>`: Path to configuration file
345
345
  - `--no-config`: Ignore all configuration files and use built-in defaults
346
346
 
347
+ ### Exit Codes
348
+
349
+ rumdl uses exit codes following Ruff's convention for easy CI/CD integration:
350
+
351
+ - `0`: Success - no issues found
352
+ - `1`: Linting violations found
353
+ - `2`: Tool error (configuration error, file access error, invalid arguments, etc.)
354
+
355
+ This allows scripts and CI/CD systems to distinguish between "the tool found problems in your files" (exit 1) and "the tool couldn't run properly" (exit 2).
356
+
347
357
  ### Usage Examples
348
358
 
349
359
  ```bash
@@ -0,0 +1,156 @@
1
+ use rumdl::config::Config;
2
+ use rumdl::lint_context::LintContext;
3
+ use rumdl::rule::Rule;
4
+ use rumdl::rules::all_rules;
5
+ use std::env;
6
+ use std::time::Instant;
7
+
8
+ fn benchmark_rule(rule: &dyn Rule, test_cases: &[(&str, &str)], iterations: u32) -> Vec<(String, u64, u64)> {
9
+ let mut results = Vec::new();
10
+
11
+ for (name, content) in test_cases {
12
+ // Warm up
13
+ for _ in 0..10 {
14
+ let ctx = LintContext::new(content);
15
+ let _ = rule.check(&ctx);
16
+ let _ = rule.fix(&ctx);
17
+ }
18
+
19
+ // Benchmark check
20
+ let start = Instant::now();
21
+ for _ in 0..iterations {
22
+ let ctx = LintContext::new(content);
23
+ let _ = rule.check(&ctx);
24
+ }
25
+ let check_time = start.elapsed().as_micros() as u64 / iterations as u64;
26
+
27
+ // Benchmark fix
28
+ let start = Instant::now();
29
+ for _ in 0..iterations {
30
+ let ctx = LintContext::new(content);
31
+ let _ = rule.fix(&ctx);
32
+ }
33
+ let fix_time = start.elapsed().as_micros() as u64 / iterations as u64;
34
+
35
+ results.push((name.to_string(), check_time, fix_time));
36
+ }
37
+
38
+ results
39
+ }
40
+
41
+ fn generate_test_content(rule_name: &str) -> Vec<(&'static str, String)> {
42
+ match rule_name {
43
+ "MD009" => vec![
44
+ ("No trailing spaces", "Line without trailing spaces\n".repeat(100)),
45
+ ("With trailing spaces", "Line with trailing spaces \n".repeat(100)),
46
+ ("Mixed content", "Normal line\nLine with spaces \nAnother normal\n".repeat(50)),
47
+ ("Empty lines", "\n\n\n".repeat(100)),
48
+ ],
49
+ "MD013" => vec![
50
+ ("Short lines", "Short line\n".repeat(1000)),
51
+ ("Long lines", "This is a very long line that exceeds the default line length limit of 80 characters and should trigger MD013\n".repeat(500)),
52
+ ("Mixed lengths", "Short\nThis is a very long line that exceeds the limit\nShort again\n".repeat(300)),
53
+ ("Code blocks", "```\nThis is a very long line in a code block that should be ignored by MD013\n```\n".repeat(100)),
54
+ ],
55
+ "MD047" => vec![
56
+ ("Correct ending", "Content with proper ending\n".to_string()),
57
+ ("Missing newline", "Content without newline at end".to_string()),
58
+ ("Multiple newlines", "Content with multiple newlines\n\n\n".to_string()),
59
+ ("Empty file", "".to_string()),
60
+ ("Large file correct", "Line\n".repeat(1000)),
61
+ ("Large file incorrect", format!("{}\n\n", "Line\n".repeat(1000))),
62
+ ],
63
+ "MD038" => vec![
64
+ ("No code spans", "Regular text without code\n".repeat(100)),
65
+ ("Correct code spans", "Text with `correct code` spans\n".repeat(100)),
66
+ ("Spaces in code", "Text with ` spaced code ` spans\n".repeat(100)),
67
+ ("Multiple backticks", "Text with ``code with ` backtick`` spans\n".repeat(100)),
68
+ ("Mixed content", "Normal text\n`good code`\n` bad code `\n".repeat(100)),
69
+ ],
70
+ "MD044" => vec![
71
+ ("No proper names", "regular text without any proper names\n".repeat(100)),
72
+ ("Correct names", "Using JavaScript and Python correctly\n".repeat(100)),
73
+ ("Incorrect names", "Using javascript and python incorrectly\n".repeat(100)),
74
+ ("Mixed case", "JavaScript is good, but javascript is bad\n".repeat(100)),
75
+ ("Many names", "JavaScript Python TypeScript Ruby Go Rust Java\n".repeat(100)),
76
+ ],
77
+ "MD034" => vec![
78
+ ("No URLs", "Simple text without any URLs or links\n".repeat(100)),
79
+ ("Markdown links", "[link](http://example.com) and [another](https://test.com)\n".repeat(100)),
80
+ ("Bare URLs", "Check out http://example.com and https://test.com for more\n".repeat(100)),
81
+ ("Mixed URLs", "Visit [site](http://a.com) or just go to http://b.com directly\n".repeat(100)),
82
+ ("Complex URLs", "IPv6: http://[2001:db8::1]/path and port: http://example.com:8080/path?query=1\n".repeat(50)),
83
+ ("Many URLs", {
84
+ let mut content = String::new();
85
+ for i in 0..200 {
86
+ content.push_str(&format!("URL {}: http://example{}.com/path/{}/file?id={}\n", i, i, i, i));
87
+ }
88
+ content
89
+ }),
90
+ ],
91
+ "MD053" => vec![
92
+ ("No references", "Simple text without any links or references\n".repeat(100)),
93
+ ("Used references", "[link1][ref1] and [link2][ref2]\n\n[ref1]: http://example1.com\n[ref2]: http://example2.com\n".repeat(50)),
94
+ ("Unused references", "Some text here\n\n[unused1]: http://unused1.com\n[unused2]: http://unused2.com\n".repeat(50)),
95
+ ("Mixed references", "[used][ref1]\n\n[ref1]: http://used.com\n[unused]: http://unused.com\n".repeat(100)),
96
+ ("Many references", {
97
+ let mut content = String::new();
98
+ for i in 0..100 {
99
+ content.push_str(&format!("[link{}][ref{}]\n", i, i));
100
+ }
101
+ content.push_str("\n");
102
+ for i in 0..200 {
103
+ content.push_str(&format!("[ref{}]: http://example{}.com\n", i, i));
104
+ }
105
+ content
106
+ }),
107
+ ],
108
+ _ => vec![
109
+ ("Default test", "Default test content\n".repeat(100)),
110
+ ],
111
+ }
112
+ }
113
+
114
+ fn main() {
115
+ let args: Vec<String> = env::args().collect();
116
+ if args.len() != 2 {
117
+ eprintln!("Usage: {} <rule_name>", args[0]);
118
+ std::process::exit(1);
119
+ }
120
+
121
+ let rule_name = &args[1];
122
+ let config = Config::default();
123
+ let rules = all_rules(&config);
124
+
125
+ let rule = rules.into_iter()
126
+ .find(|r| r.name() == rule_name)
127
+ .unwrap_or_else(|| {
128
+ eprintln!("Rule {} not found", rule_name);
129
+ std::process::exit(1);
130
+ });
131
+
132
+ let test_cases_vec = generate_test_content(rule_name);
133
+ let test_cases: Vec<(&str, &str)> = test_cases_vec.iter()
134
+ .map(|(name, content)| (*name, content.as_str()))
135
+ .collect();
136
+
137
+ println!("Benchmarking {} Rule", rule_name);
138
+ println!("{}", "=".repeat(50));
139
+ println!();
140
+
141
+ let results = benchmark_rule(rule.as_ref(), &test_cases, 100);
142
+
143
+ let mut total_check = 0u64;
144
+ let mut total_fix = 0u64;
145
+
146
+ for (test_name, check_time, fix_time) in &results {
147
+ println!("{:<30} Check: {:>6} μs Fix: {:>6} μs", test_name, check_time, fix_time);
148
+ total_check += check_time;
149
+ total_fix += fix_time;
150
+ }
151
+
152
+ println!();
153
+ println!("Average times:");
154
+ println!(" Check: {} μs", total_check / results.len() as u64);
155
+ println!(" Fix: {} μs", total_fix / results.len() as u64);
156
+ }
@@ -28,7 +28,7 @@ fn main() {
28
28
  times.push(elapsed.as_micros());
29
29
 
30
30
  if times.len() == 1 {
31
- println!(" Code spans detected: {}", ctx.code_spans.len());
31
+ println!(" Code spans detected: {}", ctx.code_spans().len());
32
32
  }
33
33
  }
34
34
 
@@ -0,0 +1,34 @@
1
+ /// Exit codes for rumdl, following Ruff's convention
2
+ ///
3
+ /// These exit codes allow users and CI/CD systems to distinguish between
4
+ /// different types of failures.
5
+ pub mod exit_codes {
6
+ /// Success - No issues found or all issues were fixed
7
+ pub const SUCCESS: i32 = 0;
8
+
9
+ /// Linting issues found - One or more Markdown violations detected
10
+ pub const VIOLATIONS_FOUND: i32 = 1;
11
+
12
+ /// Tool error - Configuration error, file access error, or internal error
13
+ pub const TOOL_ERROR: i32 = 2;
14
+ }
15
+
16
+ /// Helper functions for consistent exit behavior
17
+ pub mod exit {
18
+ use super::exit_codes;
19
+
20
+ /// Exit with success code (0)
21
+ pub fn success() -> ! {
22
+ std::process::exit(exit_codes::SUCCESS);
23
+ }
24
+
25
+ /// Exit with violations found code (1)
26
+ pub fn violations_found() -> ! {
27
+ std::process::exit(exit_codes::VIOLATIONS_FOUND);
28
+ }
29
+
30
+ /// Exit with tool error code (2)
31
+ pub fn tool_error() -> ! {
32
+ std::process::exit(exit_codes::TOOL_ERROR);
33
+ }
34
+ }
@@ -1,4 +1,5 @@
1
1
  pub mod config;
2
+ pub mod exit_codes;
2
3
  pub mod init;
3
4
  pub mod inline_config;
4
5
  pub mod lint_context;
@@ -243,6 +243,8 @@ pub struct ListBlock {
243
243
  pub nesting_level: usize,
244
244
  }
245
245
 
246
+ use std::sync::{Arc, Mutex};
247
+
246
248
  pub struct LintContext<'a> {
247
249
  pub content: &'a str,
248
250
  pub line_offsets: Vec<usize>,
@@ -251,7 +253,7 @@ pub struct LintContext<'a> {
251
253
  pub links: Vec<ParsedLink>, // Pre-parsed links
252
254
  pub images: Vec<ParsedImage>, // Pre-parsed images
253
255
  pub reference_defs: Vec<ReferenceDef>, // Reference definitions
254
- pub code_spans: Vec<CodeSpan>, // Pre-parsed inline code spans
256
+ code_spans_cache: Mutex<Option<Arc<Vec<CodeSpan>>>>, // Lazy-loaded inline code spans
255
257
  pub list_blocks: Vec<ListBlock>, // Pre-parsed list blocks
256
258
  }
257
259
 
@@ -270,11 +272,11 @@ impl<'a> LintContext<'a> {
270
272
  // Pre-compute line information
271
273
  let lines = Self::compute_line_info(content, &line_offsets, &code_blocks);
272
274
 
273
- // Parse links, images, references, code spans, and list blocks
275
+ // Parse links, images, references, and list blocks
276
+ // Skip code spans - they'll be computed lazily
274
277
  let links = Self::parse_links(content, &lines, &code_blocks);
275
278
  let images = Self::parse_images(content, &lines, &code_blocks);
276
279
  let reference_defs = Self::parse_reference_defs(content, &lines);
277
- let code_spans = Self::parse_code_spans(content, &lines);
278
280
  let list_blocks = Self::parse_list_blocks(&lines);
279
281
 
280
282
  Self {
@@ -285,11 +287,25 @@ impl<'a> LintContext<'a> {
285
287
  links,
286
288
  images,
287
289
  reference_defs,
288
- code_spans,
290
+ code_spans_cache: Mutex::new(None),
289
291
  list_blocks,
290
292
  }
291
293
  }
292
294
 
295
+ /// Get code spans - computed lazily on first access
296
+ pub fn code_spans(&self) -> Arc<Vec<CodeSpan>> {
297
+ let mut cache = self.code_spans_cache.lock().unwrap();
298
+
299
+ // Check if we need to compute code spans
300
+ if cache.is_none() {
301
+ let code_spans = Self::parse_code_spans(self.content, &self.lines);
302
+ *cache = Some(Arc::new(code_spans));
303
+ }
304
+
305
+ // Return a reference to the cached code spans
306
+ cache.as_ref().unwrap().clone()
307
+ }
308
+
293
309
  /// Map a byte offset to (line, column)
294
310
  pub fn offset_to_line_col(&self, offset: usize) -> (usize, usize) {
295
311
  match self.line_offsets.binary_search(&offset) {
@@ -308,8 +324,8 @@ impl<'a> LintContext<'a> {
308
324
  return true;
309
325
  }
310
326
 
311
- // Check inline code spans
312
- self.code_spans
327
+ // Check inline code spans (lazy load if needed)
328
+ self.code_spans()
313
329
  .iter()
314
330
  .any(|span| pos >= span.byte_offset && pos < span.byte_end)
315
331
  }