rumdl 0.0.89__tar.gz → 0.0.91__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 (341) hide show
  1. {rumdl-0.0.89 → rumdl-0.0.91}/.mise.toml +5 -5
  2. {rumdl-0.0.89 → rumdl-0.0.91}/CHANGELOG.md +7 -1
  3. {rumdl-0.0.89 → rumdl-0.0.91}/Cargo.lock +1 -1
  4. {rumdl-0.0.89 → rumdl-0.0.91}/Cargo.toml +2 -2
  5. {rumdl-0.0.89 → rumdl-0.0.91}/Makefile +62 -1
  6. {rumdl-0.0.89 → rumdl-0.0.91}/PKG-INFO +11 -2
  7. {rumdl-0.0.89 → rumdl-0.0.91}/README.md +10 -1
  8. {rumdl-0.0.89 → rumdl-0.0.91}/benches/fix_performance.rs +35 -37
  9. {rumdl-0.0.89 → rumdl-0.0.91}/benches/range_performance.rs +9 -9
  10. {rumdl-0.0.89 → rumdl-0.0.91}/benches/range_utils_benchmark.rs +3 -3
  11. {rumdl-0.0.89 → rumdl-0.0.91}/benches/rule_performance.rs +11 -12
  12. {rumdl-0.0.89 → rumdl-0.0.91}/benches/simple_fix_bench.rs +6 -6
  13. {rumdl-0.0.89 → rumdl-0.0.91}/rust-toolchain.toml +1 -1
  14. {rumdl-0.0.89 → rumdl-0.0.91}/src/bin/benchmark.rs +4 -4
  15. {rumdl-0.0.89 → rumdl-0.0.91}/src/bin/file_parallel_benchmark.rs +9 -10
  16. {rumdl-0.0.89 → rumdl-0.0.91}/src/bin/measure_code_span_performance.rs +13 -13
  17. {rumdl-0.0.89 → rumdl-0.0.91}/src/config.rs +100 -109
  18. {rumdl-0.0.89 → rumdl-0.0.91}/src/init.rs +37 -35
  19. {rumdl-0.0.89 → rumdl-0.0.91}/src/lib.rs +62 -72
  20. {rumdl-0.0.89 → rumdl-0.0.91}/src/lint_context.rs +44 -384
  21. {rumdl-0.0.89 → rumdl-0.0.91}/src/lsp/mod.rs +47 -48
  22. {rumdl-0.0.89 → rumdl-0.0.91}/src/lsp/server.rs +58 -58
  23. {rumdl-0.0.89 → rumdl-0.0.91}/src/lsp/types.rs +14 -20
  24. {rumdl-0.0.89 → rumdl-0.0.91}/src/main.rs +112 -105
  25. {rumdl-0.0.89 → rumdl-0.0.91}/src/markdownlint_config.rs +141 -106
  26. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/azure.rs +18 -18
  27. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/concise.rs +19 -28
  28. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/github.rs +16 -16
  29. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/gitlab.rs +52 -43
  30. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/grouped.rs +19 -18
  31. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/json.rs +44 -41
  32. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/json_lines.rs +36 -30
  33. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/junit.rs +41 -40
  34. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/pylint.rs +25 -41
  35. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/sarif.rs +89 -64
  36. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/text.rs +7 -12
  37. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/mod.rs +36 -31
  38. {rumdl-0.0.89 → rumdl-0.0.91}/src/parallel.rs +42 -30
  39. {rumdl-0.0.89 → rumdl-0.0.91}/src/performance.rs +28 -32
  40. {rumdl-0.0.89 → rumdl-0.0.91}/src/profiling.rs +36 -33
  41. {rumdl-0.0.89 → rumdl-0.0.91}/src/python.rs +26 -18
  42. {rumdl-0.0.89 → rumdl-0.0.91}/src/rule.rs +63 -60
  43. {rumdl-0.0.89 → rumdl-0.0.91}/src/rule_config.rs +13 -13
  44. {rumdl-0.0.89 → rumdl-0.0.91}/src/rule_config_serde.rs +55 -43
  45. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/blockquote_utils.rs +93 -48
  46. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/code_block_utils.rs +45 -30
  47. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/code_fence_utils.rs +21 -22
  48. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/front_matter_utils.rs +123 -68
  49. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/heading_utils.rs +67 -46
  50. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/list_utils.rs +52 -47
  51. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md001_heading_increment.rs +2 -2
  52. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md002_first_heading_h1.rs +51 -31
  53. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md003_heading_style/md003_config.rs +1 -1
  54. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md003_heading_style.rs +3 -6
  55. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md004_unordered_list_style.rs +26 -10
  56. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md005_list_indent.rs +17 -16
  57. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md006_start_bullets.rs +4 -7
  58. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md007_ul_indent.rs +39 -42
  59. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md009_trailing_spaces.rs +23 -16
  60. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md010_no_hard_tabs.rs +13 -13
  61. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md011_no_reversed_links.rs +4 -4
  62. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md012_no_multiple_blanks.rs +8 -6
  63. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md013_line_length.rs +11 -11
  64. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md014_commands_show_output.rs +27 -19
  65. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md019_no_multiple_space_atx.rs +1 -1
  66. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md020_no_missing_space_closed_atx.rs +4 -6
  67. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md021_no_multiple_space_closed_atx.rs +1 -1
  68. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md022_blanks_around_headings.rs +1 -1
  69. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md023_heading_start_left.rs +3 -3
  70. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md024_no_duplicate_heading.rs +11 -9
  71. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md025_single_title.rs +14 -10
  72. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md026_no_trailing_punctuation.rs +16 -8
  73. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md027_multiple_spaces_blockquote.rs +9 -9
  74. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md028_no_blanks_blockquote.rs +5 -5
  75. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md029_ordered_list_prefix.rs +1 -2
  76. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md030_list_marker_space.rs +3 -4
  77. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md031_blanks_around_fences.rs +2 -2
  78. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md032_blanks_around_lists.rs +15 -23
  79. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md034_no_bare_urls.rs +17 -20
  80. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md035_hr_style.rs +27 -27
  81. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md036_no_emphasis_only_first.rs +44 -28
  82. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md037_spaces_around_emphasis.rs +8 -253
  83. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md038_no_space_in_code.rs +4 -4
  84. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md039_no_space_in_links.rs +16 -21
  85. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md040_fenced_code_language.rs +27 -15
  86. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md041_first_line_heading.rs +68 -40
  87. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md042_no_empty_links.rs +22 -10
  88. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md043_required_headings.rs +1 -1
  89. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md044_proper_names.rs +84 -95
  90. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md045_no_alt_text.rs +31 -25
  91. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md046_code_block_style/md046_config.rs +1 -1
  92. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md046_code_block_style.rs +26 -26
  93. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md048_code_fence_style/md048_config.rs +1 -1
  94. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md048_code_fence_style.rs +21 -21
  95. rumdl-0.0.91/src/rules/md049_emphasis_style.rs +265 -0
  96. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md050_strong_style/md050_config.rs +1 -1
  97. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md050_strong_style.rs +44 -30
  98. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md051_link_fragments.rs +61 -45
  99. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md052_reference_links_images.rs +38 -38
  100. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md053_link_image_reference_definitions.rs +26 -32
  101. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md054_link_image_style.rs +25 -26
  102. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md055_table_pipe_style/md055_config.rs +1 -1
  103. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md055_table_pipe_style.rs +3 -7
  104. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md056_table_column_count.rs +25 -25
  105. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md057_existing_relative_links.rs +1 -3
  106. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md058_blanks_around_tables.rs +21 -21
  107. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/strong_style.rs +2 -2
  108. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/ast_utils.rs +55 -59
  109. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/code_block_utils.rs +15 -14
  110. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/document_structure.rs +16 -12
  111. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/early_returns.rs +52 -52
  112. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/element_cache.rs +0 -8
  113. rumdl-0.0.91/src/utils/emphasis_utils.rs +374 -0
  114. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/fix_utils.rs +15 -16
  115. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/mod.rs +2 -5
  116. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/regex_cache.rs +33 -37
  117. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/table_utils.rs +48 -48
  118. {rumdl-0.0.89 → rumdl-0.0.91}/src/vscode.rs +33 -32
  119. {rumdl-0.0.89 → rumdl-0.0.91}/tests/advanced_integration_tests.rs +4 -6
  120. {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/additional_tests.rs +1 -1
  121. {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/basic_tests.rs +1 -1
  122. {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/comprehensive_tests.rs +1 -1
  123. {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/extended_tests.rs +1 -1
  124. {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_integration_tests.rs +30 -39
  125. {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_lsp_fix_consistency.rs +46 -54
  126. {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_statistics_test.rs +8 -17
  127. {rumdl-0.0.89 → rumdl-0.0.91}/tests/commonmark_compliance_tests.rs +5 -8
  128. {rumdl-0.0.89 → rumdl-0.0.91}/tests/comprehensive_integration_tests.rs +11 -11
  129. {rumdl-0.0.89 → rumdl-0.0.91}/tests/config_application_tests.rs +1 -1
  130. {rumdl-0.0.89 → rumdl-0.0.91}/tests/config_tests.rs +16 -30
  131. {rumdl-0.0.89 → rumdl-0.0.91}/tests/configuration_inheritance_tests.rs +4 -4
  132. {rumdl-0.0.89 → rumdl-0.0.91}/tests/cross_platform_compatibility_tests.rs +22 -25
  133. {rumdl-0.0.89 → rumdl-0.0.91}/tests/final_confidence_assessment.rs +5 -8
  134. {rumdl-0.0.89 → rumdl-0.0.91}/tests/init_tests.rs +1 -1
  135. {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_editor_integration_tests.rs +2 -2
  136. {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_integration_tests.rs +6 -10
  137. {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_memory_leak_tests.rs +28 -32
  138. {rumdl-0.0.89 → rumdl-0.0.91}/tests/lsp_tests.rs +1 -1
  139. {rumdl-0.0.89 → rumdl-0.0.91}/tests/malformed_markdown_stress_tests.rs +2 -7
  140. {rumdl-0.0.89 → rumdl-0.0.91}/tests/markdownlint_cli_integration.rs +6 -9
  141. {rumdl-0.0.89 → rumdl-0.0.91}/tests/markdownlint_config_test.rs +3 -5
  142. {rumdl-0.0.89 → rumdl-0.0.91}/tests/output_format_tests.rs +29 -38
  143. {rumdl-0.0.89 → rumdl-0.0.91}/tests/perf_check.rs +5 -5
  144. {rumdl-0.0.89 → rumdl-0.0.91}/tests/performance_validation_tests.rs +5 -8
  145. {rumdl-0.0.89 → rumdl-0.0.91}/tests/pyproject_config_tests.rs +9 -12
  146. {rumdl-0.0.89 → rumdl-0.0.91}/tests/real_world_repository_tests.rs +4 -4
  147. {rumdl-0.0.89 → rumdl-0.0.91}/tests/regression_prevention_tests.rs +8 -6
  148. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md002_test.rs +73 -58
  149. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md004_test.rs +27 -18
  150. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md006_test.rs +2 -4
  151. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md007_test.rs +50 -53
  152. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md009_test.rs +2 -1
  153. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md010_test.rs +60 -36
  154. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md012_test.rs +9 -9
  155. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md013_test.rs +43 -25
  156. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md014_test.rs +33 -13
  157. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md022_test.rs +2 -2
  158. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md023_extended_test.rs +1 -1
  159. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md024_test.rs +2 -2
  160. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md025_test.rs +1 -1
  161. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md026_test.rs +75 -44
  162. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md029_test.rs +1 -1
  163. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md030_test.rs +5 -5
  164. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md032_test.rs +6 -8
  165. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md034_test.rs +26 -32
  166. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md037_test.rs +6 -7
  167. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md041_test.rs +2 -2
  168. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md044_test.rs +3 -3
  169. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md045_test.rs +8 -2
  170. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md046_test.rs +6 -4
  171. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md051_test.rs +23 -12
  172. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md052_test.rs +1 -1
  173. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md053_additional_test.rs +10 -12
  174. {rumdl-0.0.89 → rumdl-0.0.91}/tests/thread_safety_tests.rs +8 -10
  175. {rumdl-0.0.89 → rumdl-0.0.91}/tests/unicode_edge_case_tests.rs +2 -6
  176. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/code_block_utils_extended_test.rs +5 -5
  177. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/code_block_utils_test.rs +3 -3
  178. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/line_index_test.rs +2 -2
  179. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils_markdown_edge_cases.rs +13 -14
  180. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils_tests.rs +1 -1
  181. {rumdl-0.0.89 → rumdl-0.0.91}/tests/vscode_extension_fixes.rs +22 -46
  182. {rumdl-0.0.89 → rumdl-0.0.91}/tests/vscode_test.rs +2 -2
  183. rumdl-0.0.89/src/rules/md049_emphasis_style.rs +0 -278
  184. {rumdl-0.0.89 → rumdl-0.0.91}/.config/nextest.toml +0 -0
  185. {rumdl-0.0.89 → rumdl-0.0.91}/.rumdl.toml +0 -0
  186. {rumdl-0.0.89 → rumdl-0.0.91}/.rustfmt.toml +0 -0
  187. {rumdl-0.0.89 → rumdl-0.0.91}/LICENSE +0 -0
  188. {rumdl-0.0.89 → rumdl-0.0.91}/MANIFEST.in +0 -0
  189. {rumdl-0.0.89 → rumdl-0.0.91}/assets/logo.png +0 -0
  190. {rumdl-0.0.89 → rumdl-0.0.91}/docs/RULES.md +0 -0
  191. {rumdl-0.0.89 → rumdl-0.0.91}/docs/global-settings.md +0 -0
  192. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md001.md +0 -0
  193. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md002.md +0 -0
  194. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md003.md +0 -0
  195. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md004.md +0 -0
  196. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md005.md +0 -0
  197. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md006.md +0 -0
  198. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md007.md +0 -0
  199. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md009.md +0 -0
  200. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md010.md +0 -0
  201. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md011.md +0 -0
  202. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md012.md +0 -0
  203. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md013.md +0 -0
  204. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md014.md +0 -0
  205. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md018.md +0 -0
  206. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md019.md +0 -0
  207. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md020.md +0 -0
  208. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md021.md +0 -0
  209. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md022.md +0 -0
  210. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md023.md +0 -0
  211. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md024.md +0 -0
  212. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md025.md +0 -0
  213. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md026.md +0 -0
  214. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md027.md +0 -0
  215. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md028.md +0 -0
  216. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md029.md +0 -0
  217. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md030.md +0 -0
  218. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md031.md +0 -0
  219. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md032.md +0 -0
  220. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md033.md +0 -0
  221. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md034.md +0 -0
  222. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md035.md +0 -0
  223. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md036.md +0 -0
  224. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md037.md +0 -0
  225. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md038.md +0 -0
  226. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md039.md +0 -0
  227. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md040.md +0 -0
  228. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md041.md +0 -0
  229. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md042.md +0 -0
  230. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md043.md +0 -0
  231. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md044.md +0 -0
  232. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md045.md +0 -0
  233. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md046.md +0 -0
  234. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md047.md +0 -0
  235. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md048.md +0 -0
  236. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md049.md +0 -0
  237. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md050.md +0 -0
  238. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md051.md +0 -0
  239. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md052.md +0 -0
  240. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md053.md +0 -0
  241. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md054.md +0 -0
  242. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md055.md +0 -0
  243. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md056.md +0 -0
  244. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md057.md +0 -0
  245. {rumdl-0.0.89 → rumdl-0.0.91}/docs/md058.md +0 -0
  246. {rumdl-0.0.89 → rumdl-0.0.91}/docs/vscode-extension.md +0 -0
  247. {rumdl-0.0.89 → rumdl-0.0.91}/issues/plan-rule-parity-with-markdownlint.md +0 -0
  248. {rumdl-0.0.89 → rumdl-0.0.91}/parity_check.py +0 -0
  249. {rumdl-0.0.89 → rumdl-0.0.91}/pyproject.toml +0 -0
  250. {rumdl-0.0.89 → rumdl-0.0.91}/python/MANIFEST.in +0 -0
  251. {rumdl-0.0.89 → rumdl-0.0.91}/python/PYTHON-README.md +0 -0
  252. {rumdl-0.0.89 → rumdl-0.0.91}/python/rumdl/__init__.py +0 -0
  253. {rumdl-0.0.89 → rumdl-0.0.91}/python/rumdl/__main__.py +0 -0
  254. {rumdl-0.0.89 → rumdl-0.0.91}/python/rumdl/py.typed +0 -0
  255. {rumdl-0.0.89 → rumdl-0.0.91}/rumdl.toml.example +0 -0
  256. {rumdl-0.0.89 → rumdl-0.0.91}/scripts/extract-changelog.sh +0 -0
  257. {rumdl-0.0.89 → rumdl-0.0.91}/scripts/prepare-release.sh +0 -0
  258. {rumdl-0.0.89 → rumdl-0.0.91}/src/inline_config.rs +0 -0
  259. {rumdl-0.0.89 → rumdl-0.0.91}/src/output/formatters/mod.rs +0 -0
  260. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/emphasis_style.rs +0 -0
  261. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  262. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  263. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  264. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  265. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  266. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  267. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md013_line_length/md013_config.rs +0 -0
  268. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  269. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md018_no_missing_space_atx.rs +0 -0
  270. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  271. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  272. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md025_single_title/md025_config.rs +0 -0
  273. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  274. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  275. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  276. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md033_no_inline_html.rs +0 -0
  277. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md035_hr_style/md035_config.rs +0 -0
  278. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  279. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md044_proper_names/md044_config.rs +0 -0
  280. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md047_single_trailing_newline.rs +0 -0
  281. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  282. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  283. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  284. {rumdl-0.0.89 → rumdl-0.0.91}/src/rules/mod.rs +0 -0
  285. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/markdown_elements.rs +0 -0
  286. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/range_utils.rs +0 -0
  287. {rumdl-0.0.89 → rumdl-0.0.91}/src/utils/string_interner.rs +0 -0
  288. {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/mod.rs +0 -0
  289. {rumdl-0.0.89 → rumdl-0.0.91}/tests/character_ranges/unicode_utils.rs +0 -0
  290. {rumdl-0.0.89 → rumdl-0.0.91}/tests/cli_duplication_test.rs +0 -0
  291. {rumdl-0.0.89 → rumdl-0.0.91}/tests/comprehensive_output_format_tests.rs +0 -0
  292. {rumdl-0.0.89 → rumdl-0.0.91}/tests/config_file_command_test.rs +0 -0
  293. {rumdl-0.0.89 → rumdl-0.0.91}/tests/consistency_regression_tests.rs +0 -0
  294. {rumdl-0.0.89 → rumdl-0.0.91}/tests/init_command_test.rs +0 -0
  295. {rumdl-0.0.89 → rumdl-0.0.91}/tests/inline_config_test.rs +0 -0
  296. {rumdl-0.0.89 → rumdl-0.0.91}/tests/integration_tests.rs +0 -0
  297. {rumdl-0.0.89 → rumdl-0.0.91}/tests/json_output_test.rs +0 -0
  298. {rumdl-0.0.89 → rumdl-0.0.91}/tests/lib.rs +0 -0
  299. {rumdl-0.0.89 → rumdl-0.0.91}/tests/markdownlintignore_test.rs +0 -0
  300. {rumdl-0.0.89 → rumdl-0.0.91}/tests/md030_edge_cases.md +0 -0
  301. {rumdl-0.0.89 → rumdl-0.0.91}/tests/output_format_integration_tests.rs +0 -0
  302. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md001_test.rs +0 -0
  303. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md001_unicode_test.rs +0 -0
  304. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md003_test.rs +1 -1
  305. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md005_test.rs +0 -0
  306. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md006_unicode_test.rs +0 -0
  307. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md011_test.rs +0 -0
  308. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md018_test.rs +0 -0
  309. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md019_test.rs +0 -0
  310. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md020_test.rs +0 -0
  311. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md021_test.rs +0 -0
  312. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md023_test.rs +0 -0
  313. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md027_test.rs +0 -0
  314. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md028_test.rs +0 -0
  315. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md031_test.rs +0 -0
  316. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md033_extended_test.rs +0 -0
  317. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md033_test.rs +0 -0
  318. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md035_test.rs +0 -0
  319. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md036_test.rs +0 -0
  320. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md038_test.rs +0 -0
  321. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md039_test.rs +0 -0
  322. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md040_test.rs +0 -0
  323. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md042_test.rs +0 -0
  324. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md043_test.rs +0 -0
  325. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md047_test.rs +0 -0
  326. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md048_test.rs +1 -1
  327. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md049_test.rs +1 -1
  328. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md050_test.rs +1 -1
  329. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md053_proptest.rs +0 -0
  330. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md053_test.rs +0 -0
  331. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md054_test.rs +0 -0
  332. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md054_unicode_test.rs +0 -0
  333. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md055_test.rs +0 -0
  334. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md056_test.rs +0 -0
  335. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md057_test.rs +0 -0
  336. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/md058_test.rs +0 -0
  337. {rumdl-0.0.89 → rumdl-0.0.91}/tests/rules/mod.rs +0 -0
  338. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/blockquote_utils_test.rs +0 -0
  339. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/core_utils_test.rs +1 -1
  340. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/front_matter_utils_test.rs +0 -0
  341. {rumdl-0.0.89 → rumdl-0.0.91}/tests/utils/mod.rs +0 -0
@@ -7,7 +7,7 @@ RUST_BACKTRACE = "1"
7
7
 
8
8
  [tools]
9
9
  # Rust toolchain - version matches rust-toolchain.toml
10
- rust = "1.87.0"
10
+ rust = "1.88.0"
11
11
 
12
12
  # Python for maturin/python bindings
13
13
  python = "3.12"
@@ -24,10 +24,10 @@ uv = "latest"
24
24
  # Zig for cross-compilation (used by maturin)
25
25
  zig = "0.13"
26
26
 
27
- # Optional: Additional useful Rust development tools
28
- # Uncomment to enable
29
- # "cargo:cargo-edit" = "latest" # For cargo add/rm/upgrade commands
30
- # "cargo:cargo-outdated" = "latest" # Check for outdated dependencies
27
+ # Additional Rust development tools for dependency management
28
+ "cargo:cargo-edit" = "latest" # For cargo add/rm/upgrade commands
29
+ "cargo:cargo-outdated" = "latest" # Check for outdated dependencies
30
+ # Optional: Security and dependency tools
31
31
  # "cargo:cargo-audit" = "latest" # Security audit dependencies
32
32
  # "cargo:cargo-deny" = "latest" # Lint dependencies
33
33
 
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.91] - 2025-07-02
11
+
12
+ ## [0.0.90] - 2025-07-01
13
+
10
14
  ## [0.0.89] - 2025-07-01
11
15
 
12
16
  ### Added
@@ -107,7 +111,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
107
111
  ### Added
108
112
  - Initial implementation of remaining rules for markdownlint parity
109
113
 
110
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.89...HEAD
114
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.91...HEAD
115
+ [0.0.91]: https://github.com/rvben/rumdl/compare/v0.0.90...v0.0.91
116
+ [0.0.90]: https://github.com/rvben/rumdl/compare/v0.0.89...v0.0.90
111
117
  [0.0.89]: https://github.com/rvben/rumdl/compare/v0.0.88...v0.0.89
112
118
  [0.0.88]: https://github.com/rvben/rumdl/compare/v0.0.87...v0.0.88
113
119
  [0.0.87]: https://github.com/rvben/rumdl/compare/v0.0.86...v0.0.87
@@ -1454,7 +1454,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1454
1454
 
1455
1455
  [[package]]
1456
1456
  name = "rumdl"
1457
- version = "0.0.89"
1457
+ version = "0.0.91"
1458
1458
  dependencies = [
1459
1459
  "anyhow",
1460
1460
  "assert_cmd",
@@ -1,8 +1,8 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.89"
3
+ version = "0.0.91"
4
4
  edition = "2024"
5
- rust-version = "1.87.0"
5
+ rust-version = "1.88.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
7
7
  authors = ["Ruben J. Jongejan <ruben.jongejan@gmail.com>"]
8
8
  license = "MIT"
@@ -1,4 +1,4 @@
1
- .PHONY: build test clean fmt check doc version-major version-minor version-patch build-python build-wheel dev-install setup-mise dev-setup dev-verify
1
+ .PHONY: build test clean fmt check doc version-major version-minor version-patch build-python build-wheel dev-install setup-mise dev-setup dev-verify update-dependencies update-rust-version pre-release
2
2
 
3
3
  # Development environment setup
4
4
  setup-mise:
@@ -248,3 +248,64 @@ trigger-pre-commit:
248
248
  -H "Authorization: Bearer $(PRECOMMIT_DISPATCH_TOKEN)" \
249
249
  https://api.github.com/repos/rvben/rumdl-pre-commit/dispatches \
250
250
  -d '{"event_type": "pypi_release"}'
251
+
252
+ # Dependency and version update targets
253
+ update-dependencies:
254
+ @echo "Updating Cargo dependencies to latest compatible versions..."
255
+ @cargo update
256
+ @echo "Dependencies updated in Cargo.lock"
257
+ @echo ""
258
+ @if command -v cargo-outdated >/dev/null 2>&1; then \
259
+ echo "Checking for available updates beyond current constraints:"; \
260
+ cargo outdated; \
261
+ else \
262
+ echo "Install cargo-outdated for more detailed update information:"; \
263
+ echo " cargo install cargo-outdated"; \
264
+ fi
265
+
266
+ update-rust-version:
267
+ @echo "Checking for latest stable Rust version..."
268
+ $(eval LATEST_RUST := $(shell curl -s https://api.github.com/repos/rust-lang/rust/releases/latest | grep '"tag_name":' | sed -E 's/.*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/' | head -1))
269
+ $(eval CURRENT_RUST := $(shell grep '^rust-version' Cargo.toml | sed -E 's/rust-version = "([0-9]+\.[0-9]+\.[0-9]+)"/\1/'))
270
+ @if [ -z "$(LATEST_RUST)" ]; then \
271
+ echo "Failed to fetch latest Rust version"; \
272
+ exit 1; \
273
+ fi
274
+ @echo "Current Rust version: $(CURRENT_RUST)"
275
+ @echo "Latest Rust version: $(LATEST_RUST)"
276
+ @if [ "$(CURRENT_RUST)" = "$(LATEST_RUST)" ]; then \
277
+ echo "Already using the latest Rust version"; \
278
+ else \
279
+ echo "Updating Rust version to $(LATEST_RUST)..."; \
280
+ sed -i.bak -E 's/^rust-version = "[0-9]+\.[0-9]+\.[0-9]+"/rust-version = "$(LATEST_RUST)"/' Cargo.toml; \
281
+ sed -i.bak -E 's/^rust = "[0-9]+\.[0-9]+\.[0-9]+"/rust = "$(LATEST_RUST)"/' .mise.toml; \
282
+ sed -i.bak -E 's/^channel = "[0-9]+\.[0-9]+\.[0-9]+"/channel = "$(LATEST_RUST)"/' rust-toolchain.toml; \
283
+ rm -f Cargo.toml.bak .mise.toml.bak rust-toolchain.toml.bak; \
284
+ echo "Updated Rust version in Cargo.toml, .mise.toml, and rust-toolchain.toml"; \
285
+ echo "Running 'cargo check' to verify compatibility..."; \
286
+ cargo check || (echo "Warning: cargo check failed. You may need to fix compatibility issues."; exit 1); \
287
+ fi
288
+
289
+ pre-release:
290
+ @echo "Preparing for release..."
291
+ @echo "===================="
292
+ @$(MAKE) update-rust-version
293
+ @echo ""
294
+ @$(MAKE) update-dependencies
295
+ @echo ""
296
+ @echo "Running tests to verify everything works..."
297
+ @$(MAKE) test-quick
298
+ @echo ""
299
+ @echo "Pre-release preparation complete!"
300
+ @echo "===================="
301
+ @echo ""
302
+ @echo "Summary of changes:"
303
+ @echo "- Rust version: $$(grep '^rust-version' Cargo.toml | sed -E 's/rust-version = "([0-9]+\.[0-9]+\.[0-9]+)"/\1/')"
304
+ @echo "- Dependencies: Updated to latest compatible versions"
305
+ @echo ""
306
+ @echo "Please review changes and commit if satisfied."
307
+
308
+ # Full release targets that include pre-release preparation
309
+ release-major-full: pre-release version-major version-push
310
+ release-minor-full: pre-release version-minor version-push
311
+ release-patch-full: pre-release version-patch version-push
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.89
3
+ Version: 0.0.91
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -55,6 +55,7 @@ Project-URL: Repository, https://github.com/rvben/rumdl.git
55
55
  - [Table of Contents](#table-of-contents)
56
56
  - [Quick Start](#quick-start)
57
57
  - [Overview](#overview)
58
+ - [Performance](#performance)
58
59
  - [Installation](#installation)
59
60
  - [Using Cargo (Rust)](#using-cargo-rust)
60
61
  - [Using pip (Python)](#using-pip-python)
@@ -102,7 +103,7 @@ rumdl init
102
103
 
103
104
  rumdl is a high-performance Markdown linter and fixer that helps ensure consistency and best practices in your Markdown files. It offers:
104
105
 
105
- - ⚡️ **Built for speed** with Rust
106
+ - ⚡️ **Built for speed** with Rust - significantly faster than alternatives
106
107
  - 🔍 **54 lint rules** covering common Markdown issues
107
108
  - 🛠️ **Automatic fixing** with `--fix` for most rules
108
109
  - 📦 **Zero dependencies** - single binary with no runtime requirements
@@ -112,6 +113,14 @@ rumdl is a high-performance Markdown linter and fixer that helps ensure consiste
112
113
  - 📏 **Modern CLI** with detailed error reporting
113
114
  - 🔄 **CI/CD friendly** with non-zero exit code on errors
114
115
 
116
+ ## Performance
117
+
118
+ rumdl is designed for speed and efficiency:
119
+
120
+ ![Performance Comparison](assets/performance_overview.png)
121
+
122
+ rumdl is **4.3x faster** on average than markdownlint for typical markdown files, with performance improvements ranging from 3.4x to 5.4x depending on project size.
123
+
115
124
  ## Installation
116
125
 
117
126
  Choose the installation method that works best for you:
@@ -24,6 +24,7 @@
24
24
  - [Table of Contents](#table-of-contents)
25
25
  - [Quick Start](#quick-start)
26
26
  - [Overview](#overview)
27
+ - [Performance](#performance)
27
28
  - [Installation](#installation)
28
29
  - [Using Cargo (Rust)](#using-cargo-rust)
29
30
  - [Using pip (Python)](#using-pip-python)
@@ -71,7 +72,7 @@ rumdl init
71
72
 
72
73
  rumdl is a high-performance Markdown linter and fixer that helps ensure consistency and best practices in your Markdown files. It offers:
73
74
 
74
- - ⚡️ **Built for speed** with Rust
75
+ - ⚡️ **Built for speed** with Rust - significantly faster than alternatives
75
76
  - 🔍 **54 lint rules** covering common Markdown issues
76
77
  - 🛠️ **Automatic fixing** with `--fix` for most rules
77
78
  - 📦 **Zero dependencies** - single binary with no runtime requirements
@@ -81,6 +82,14 @@ rumdl is a high-performance Markdown linter and fixer that helps ensure consiste
81
82
  - 📏 **Modern CLI** with detailed error reporting
82
83
  - 🔄 **CI/CD friendly** with non-zero exit code on errors
83
84
 
85
+ ## Performance
86
+
87
+ rumdl is designed for speed and efficiency:
88
+
89
+ ![Performance Comparison](assets/performance_overview.png)
90
+
91
+ rumdl is **4.3x faster** on average than markdownlint for typical markdown files, with performance improvements ranging from 3.4x to 5.4x depending on project size.
92
+
84
93
  ## Installation
85
94
 
86
95
  Choose the installation method that works best for you:
@@ -1,4 +1,4 @@
1
- use criterion::{black_box, criterion_group, criterion_main, Criterion};
1
+ use criterion::{Criterion, black_box, criterion_group, criterion_main};
2
2
  use rumdl::lint_context::LintContext;
3
3
  use rumdl::rule::Rule;
4
4
  use rumdl::rules::*;
@@ -10,7 +10,7 @@ fn generate_problematic_content(size: usize) -> String {
10
10
  for i in 0..size {
11
11
  // MD001 - Heading increment issues
12
12
  if i % 10 == 0 {
13
- content.push_str(&format!("### Heading {} (should be H1)\n\n", i));
13
+ content.push_str(&format!("### Heading {i} (should be H1)\n\n"));
14
14
  }
15
15
 
16
16
  // MD002 - First heading should be H1
@@ -20,40 +20,40 @@ fn generate_problematic_content(size: usize) -> String {
20
20
 
21
21
  // MD003 - Heading style inconsistency
22
22
  if i % 15 == 0 {
23
- content.push_str(&format!("Heading {}\n", i));
23
+ content.push_str(&format!("Heading {i}\n"));
24
24
  content.push_str("=============\n\n");
25
25
  }
26
26
 
27
27
  // MD004 - Unordered list style inconsistency
28
28
  if i % 8 == 0 {
29
- content.push_str(&format!("* Item {}\n", i));
29
+ content.push_str(&format!("* Item {i}\n"));
30
30
  content.push_str(&format!("- Item {}\n", i + 1));
31
31
  content.push_str(&format!("+ Item {}\n\n", i + 2));
32
32
  }
33
33
 
34
34
  // MD005 - List indentation issues
35
35
  if i % 12 == 0 {
36
- content.push_str(&format!("* Item {}\n", i));
37
- content.push_str(&format!(" * Badly indented item {}\n\n", i));
36
+ content.push_str(&format!("* Item {i}\n"));
37
+ content.push_str(&format!(" * Badly indented item {i}\n\n"));
38
38
  }
39
39
 
40
40
  // MD006 - Start bullets at beginning
41
41
  if i % 20 == 0 {
42
- content.push_str(&format!(" * Indented bullet {}\n\n", i));
42
+ content.push_str(&format!(" * Indented bullet {i}\n\n"));
43
43
  }
44
44
 
45
45
  // MD007 - Unordered list indentation
46
46
  if i % 18 == 0 {
47
- content.push_str(&format!("* Item {}\n", i));
48
- content.push_str(&format!(" * Wrong indent {}\n\n", i));
47
+ content.push_str(&format!("* Item {i}\n"));
48
+ content.push_str(&format!(" * Wrong indent {i}\n\n"));
49
49
  }
50
50
 
51
51
  // MD009 - Trailing spaces
52
- content.push_str(&format!("Line {} with trailing spaces \n", i));
52
+ content.push_str(&format!("Line {i} with trailing spaces \n"));
53
53
 
54
54
  // MD010 - Hard tabs
55
55
  if i % 25 == 0 {
56
- content.push_str(&format!("Line {}\twith\ttabs\n", i));
56
+ content.push_str(&format!("Line {i}\twith\ttabs\n"));
57
57
  }
58
58
 
59
59
  // MD012 - Multiple blank lines
@@ -63,72 +63,72 @@ fn generate_problematic_content(size: usize) -> String {
63
63
 
64
64
  // MD013 - Line length (create long lines)
65
65
  if i % 7 == 0 {
66
- content.push_str(&format!("This is a very long line {} that exceeds the default line length limit of 80 characters and should be flagged by MD013 rule for being too long.\n", i));
66
+ content.push_str(&format!("This is a very long line {i} that exceeds the default line length limit of 80 characters and should be flagged by MD013 rule for being too long.\n"));
67
67
  }
68
68
 
69
69
  // MD018 - No space after hash on atx heading
70
70
  if i % 22 == 0 {
71
- content.push_str(&format!("#Heading without space {}\n\n", i));
71
+ content.push_str(&format!("#Heading without space {i}\n\n"));
72
72
  }
73
73
 
74
74
  // MD019 - Multiple spaces after hash on atx heading
75
75
  if i % 24 == 0 {
76
- content.push_str(&format!("## Heading with extra spaces {}\n\n", i));
76
+ content.push_str(&format!("## Heading with extra spaces {i}\n\n"));
77
77
  }
78
78
 
79
79
  // MD020 - No space inside hashes on closed atx heading
80
80
  if i % 26 == 0 {
81
- content.push_str(&format!("#Closed heading{}#\n\n", i));
81
+ content.push_str(&format!("#Closed heading{i}#\n\n"));
82
82
  }
83
83
 
84
84
  // MD021 - Multiple spaces inside hashes on closed atx heading
85
85
  if i % 28 == 0 {
86
- content.push_str(&format!("# Closed heading {} #\n\n", i));
86
+ content.push_str(&format!("# Closed heading {i} #\n\n"));
87
87
  }
88
88
 
89
89
  // MD022 - Headings should be surrounded by blank lines
90
90
  if i % 35 == 0 {
91
- content.push_str(&format!("Text before heading\n# Heading {}\nText after heading\n\n", i));
91
+ content.push_str(&format!("Text before heading\n# Heading {i}\nText after heading\n\n"));
92
92
  }
93
93
 
94
94
  // MD023 - Headings must start at beginning of line
95
95
  if i % 40 == 0 {
96
- content.push_str(&format!(" # Indented heading {}\n\n", i));
96
+ content.push_str(&format!(" # Indented heading {i}\n\n"));
97
97
  }
98
98
 
99
99
  // MD026 - Trailing punctuation in headings
100
100
  if i % 16 == 0 {
101
- content.push_str(&format!("# Heading with punctuation {}!\n\n", i));
101
+ content.push_str(&format!("# Heading with punctuation {i}!\n\n"));
102
102
  }
103
103
 
104
104
  // MD027 - Multiple spaces after blockquote symbol
105
105
  if i % 45 == 0 {
106
- content.push_str(&format!("> Blockquote with extra spaces {}\n\n", i));
106
+ content.push_str(&format!("> Blockquote with extra spaces {i}\n\n"));
107
107
  }
108
108
 
109
109
  // MD030 - Spaces after list markers
110
110
  if i % 14 == 0 {
111
- content.push_str(&format!("- Item with extra space {}\n\n", i));
111
+ content.push_str(&format!("- Item with extra space {i}\n\n"));
112
112
  }
113
113
 
114
114
  // MD031 - Fenced code blocks should be surrounded by blank lines
115
115
  if i % 50 == 0 {
116
- content.push_str(&format!("Text before\n```\ncode {}\n```\nText after\n\n", i));
116
+ content.push_str(&format!("Text before\n```\ncode {i}\n```\nText after\n\n"));
117
117
  }
118
118
 
119
119
  // MD032 - Lists should be surrounded by blank lines
120
120
  if i % 55 == 0 {
121
- content.push_str(&format!("Text before\n* List item {}\nText after\n\n", i));
121
+ content.push_str(&format!("Text before\n* List item {i}\nText after\n\n"));
122
122
  }
123
123
 
124
124
  // MD033 - Inline HTML
125
125
  if i % 17 == 0 {
126
- content.push_str(&format!("Text with <b>HTML tags</b> number {}\n", i));
126
+ content.push_str(&format!("Text with <b>HTML tags</b> number {i}\n"));
127
127
  }
128
128
 
129
129
  // MD034 - Bare URL used
130
130
  if i % 19 == 0 {
131
- content.push_str(&format!("Visit http://example{}.com for more info\n", i));
131
+ content.push_str(&format!("Visit http://example{i}.com for more info\n"));
132
132
  }
133
133
 
134
134
  // MD035 - Horizontal rule style
@@ -138,17 +138,17 @@ fn generate_problematic_content(size: usize) -> String {
138
138
 
139
139
  // MD037 - Spaces inside emphasis markers
140
140
  if i % 13 == 0 {
141
- content.push_str(&format!("Text with * bad emphasis * number {}\n", i));
141
+ content.push_str(&format!("Text with * bad emphasis * number {i}\n"));
142
142
  }
143
143
 
144
144
  // MD038 - Spaces inside code span elements
145
145
  if i % 21 == 0 {
146
- content.push_str(&format!("Text with ` bad code ` number {}\n", i));
146
+ content.push_str(&format!("Text with ` bad code ` number {i}\n"));
147
147
  }
148
148
 
149
149
  // MD039 - Spaces inside link text
150
150
  if i % 32 == 0 {
151
- content.push_str(&format!("[ Link text ](http://example{}.com)\n", i));
151
+ content.push_str(&format!("[ Link text ](http://example{i}.com)\n"));
152
152
  }
153
153
 
154
154
  // MD040 - Fenced code language
@@ -158,17 +158,17 @@ fn generate_problematic_content(size: usize) -> String {
158
158
 
159
159
  // MD042 - No empty links
160
160
  if i % 70 == 0 {
161
- content.push_str(&format!("[empty link {}]()\n", i));
161
+ content.push_str(&format!("[empty link {i}]()\n"));
162
162
  }
163
163
 
164
164
  // MD044 - Proper names
165
165
  if i % 11 == 0 {
166
- content.push_str(&format!("Text mentioning javascript and github number {}\n", i));
166
+ content.push_str(&format!("Text mentioning javascript and github number {i}\n"));
167
167
  }
168
168
 
169
169
  // MD045 - Images should have alternate text
170
170
  if i % 75 == 0 {
171
- content.push_str(&format!("![](image{}.png)\n", i));
171
+ content.push_str(&format!("![](image{i}.png)\n"));
172
172
  }
173
173
 
174
174
  // MD047 - Files should end with a single newline (we'll handle this separately)
@@ -176,26 +176,24 @@ fn generate_problematic_content(size: usize) -> String {
176
176
  // MD049 - Emphasis style
177
177
  if i % 23 == 0 {
178
178
  content.push_str(&format!(
179
- "Text with _underscore emphasis_ and *asterisk emphasis* {}\n",
180
- i
179
+ "Text with _underscore emphasis_ and *asterisk emphasis* {i}\n"
181
180
  ));
182
181
  }
183
182
 
184
183
  // MD050 - Strong style
185
184
  if i % 27 == 0 {
186
185
  content.push_str(&format!(
187
- "Text with __underscore strong__ and **asterisk strong** {}\n",
188
- i
186
+ "Text with __underscore strong__ and **asterisk strong** {i}\n"
189
187
  ));
190
188
  }
191
189
 
192
190
  // MD053 - Link and image reference definitions should be needed
193
191
  if i % 80 == 0 {
194
- content.push_str(&format!("[unused{}]: http://example{}.com\n", i, i));
192
+ content.push_str(&format!("[unused{i}]: http://example{i}.com\n"));
195
193
  }
196
194
 
197
195
  // Regular content
198
- content.push_str(&format!("Regular paragraph {} with some content.\n\n", i));
196
+ content.push_str(&format!("Regular paragraph {i} with some content.\n\n"));
199
197
  }
200
198
 
201
199
  content
@@ -1,9 +1,9 @@
1
- use criterion::{black_box, criterion_group, criterion_main, Criterion};
2
- use rand::rng;
1
+ use criterion::{Criterion, black_box, criterion_group, criterion_main};
3
2
  use rand::Rng;
4
- use rumdl::rule::Rule;
3
+ use rand::rng;
5
4
  use rumdl::LintContext;
6
5
  use rumdl::MD053LinkImageReferenceDefinitions;
6
+ use rumdl::rule::Rule;
7
7
 
8
8
  fn create_test_content(size: usize, ratio: f64) -> String {
9
9
  let mut content = String::with_capacity(size);
@@ -20,9 +20,9 @@ fn create_test_content(size: usize, ratio: f64) -> String {
20
20
  // 50% chance to add a reference
21
21
  if rng.random::<f64>() < 0.7 {
22
22
  // 70% chance to be a link, 30% to be an image
23
- content.push_str(&format!("[Link {}][ref-{}]\n", i, i));
23
+ content.push_str(&format!("[Link {i}][ref-{i}]\n"));
24
24
  } else {
25
- content.push_str(&format!("![Image {}][ref-{}]\n", i, i));
25
+ content.push_str(&format!("![Image {i}][ref-{i}]\n"));
26
26
  }
27
27
  }
28
28
  }
@@ -51,7 +51,7 @@ fn create_test_content(size: usize, ratio: f64) -> String {
51
51
  for i in 0..100 {
52
52
  if rng.random::<f64>() < ratio {
53
53
  // Only add a portion based on ratio
54
- content.push_str(&format!("[ref-{}]: https://example.com/ref-{}\n", i, i));
54
+ content.push_str(&format!("[ref-{i}]: https://example.com/ref-{i}\n"));
55
55
  }
56
56
  }
57
57
 
@@ -66,17 +66,17 @@ fn create_test_content_legacy() -> String {
66
66
  for i in 0..200 {
67
67
  if i < 100 {
68
68
  // Used references
69
- content.push_str(&format!("[ref{}]: https://example.com/ref{}\n", i, i));
69
+ content.push_str(&format!("[ref{i}]: https://example.com/ref{i}\n"));
70
70
  } else {
71
71
  // Unused references
72
- content.push_str(&format!("[unused{}]: https://example.com/unused{}\n", i, i));
72
+ content.push_str(&format!("[unused{i}]: https://example.com/unused{i}\n"));
73
73
  }
74
74
  }
75
75
 
76
76
  // Add reference usages
77
77
  content.push_str("\n## Content with References\n\n");
78
78
  for i in 0..100 {
79
- content.push_str(&format!("This is a paragraph with a [link][ref{}] reference.\n", i));
79
+ content.push_str(&format!("This is a paragraph with a [link][ref{i}] reference.\n"));
80
80
  }
81
81
 
82
82
  content
@@ -1,6 +1,6 @@
1
- use criterion::{black_box, criterion_group, criterion_main, Criterion};
2
- use rand::rng;
1
+ use criterion::{Criterion, black_box, criterion_group, criterion_main};
3
2
  use rand::Rng;
3
+ use rand::rng;
4
4
  use rumdl::utils::range_utils::LineIndex;
5
5
 
6
6
  // Naive implementation that doesn't use the optimized function
@@ -38,7 +38,7 @@ fn naive_line_col_to_byte_range(content: &str, line: usize, column: usize) -> st
38
38
 
39
39
  fn generate_test_content(line_count: usize) -> String {
40
40
  (0..line_count)
41
- .map(|i| format!("Line {}: This is a test line with some content.", i))
41
+ .map(|i| format!("Line {i}: This is a test line with some content."))
42
42
  .collect::<Vec<String>>()
43
43
  .join("\n")
44
44
  }
@@ -1,4 +1,4 @@
1
- use criterion::{criterion_group, criterion_main, Criterion};
1
+ use criterion::{Criterion, criterion_group, criterion_main};
2
2
  use rumdl::rule::Rule;
3
3
  use rumdl::rules::{
4
4
  MD013LineLength, MD033NoInlineHtml, MD037NoSpaceInEmphasis, MD044ProperNames, MD051LinkFragments,
@@ -30,8 +30,7 @@ fn bench_md033(c: &mut Criterion) {
30
30
  // Generate 500 lines with HTML tags
31
31
  for i in 0..500 {
32
32
  content.push_str(&format!(
33
- "Line {} with <span class=\"highlight\">HTML</span> and <div>nested <em>tags</em></div>\n",
34
- i
33
+ "Line {i} with <span class=\"highlight\">HTML</span> and <div>nested <em>tags</em></div>\n"
35
34
  ));
36
35
  }
37
36
 
@@ -49,13 +48,13 @@ fn bench_md037(c: &mut Criterion) {
49
48
  for i in 0..500 {
50
49
  if i % 3 == 0 {
51
50
  // Incorrect: no spaces around emphasis
52
- content.push_str(&format!("Line {} with*incorrect emphasis*markers\n", i));
51
+ content.push_str(&format!("Line {i} with*incorrect emphasis*markers\n"));
53
52
  } else if i % 3 == 1 {
54
53
  // Incorrect: spaces inside emphasis
55
- content.push_str(&format!("Line {} with *incorrect emphasis *markers\n", i));
54
+ content.push_str(&format!("Line {i} with *incorrect emphasis *markers\n"));
56
55
  } else {
57
56
  // Correct: proper spaces around emphasis
58
- content.push_str(&format!("Line {} with *correct emphasis* markers\n", i));
57
+ content.push_str(&format!("Line {i} with *correct emphasis* markers\n"));
59
58
  }
60
59
  }
61
60
 
@@ -115,7 +114,7 @@ fn bench_md051(c: &mut Criterion) {
115
114
 
116
115
  // Add 100 headings
117
116
  for i in 1..101 {
118
- content.push_str(&format!("## Heading {}\n\n", i));
117
+ content.push_str(&format!("## Heading {i}\n\n"));
119
118
  }
120
119
 
121
120
  // Add 500 links, some with valid and some with invalid fragments
@@ -123,10 +122,10 @@ fn bench_md051(c: &mut Criterion) {
123
122
  if i % 3 == 0 {
124
123
  // Valid link
125
124
  let heading_number = (i % 100) + 1;
126
- content.push_str(&format!("This is a [valid link](#heading-{})\n", heading_number));
125
+ content.push_str(&format!("This is a [valid link](#heading-{heading_number})\n"));
127
126
  } else {
128
127
  // Invalid link
129
- content.push_str(&format!("This is an [invalid link](#non-existent-heading-{})\n", i));
128
+ content.push_str(&format!("This is an [invalid link](#non-existent-heading-{i})\n"));
130
129
  }
131
130
  }
132
131
 
@@ -146,17 +145,17 @@ fn bench_md053(c: &mut Criterion) {
146
145
  for i in 0..200 {
147
146
  if i < 100 {
148
147
  // Used references
149
- content.push_str(&format!("[ref{}]: https://example.com/ref{}\n", i, i));
148
+ content.push_str(&format!("[ref{i}]: https://example.com/ref{i}\n"));
150
149
  } else {
151
150
  // Unused references
152
- content.push_str(&format!("[unused{}]: https://example.com/unused{}\n", i, i));
151
+ content.push_str(&format!("[unused{i}]: https://example.com/unused{i}\n"));
153
152
  }
154
153
  }
155
154
 
156
155
  // Add reference usages
157
156
  content.push_str("\n## Content with References\n\n");
158
157
  for i in 0..100 {
159
- content.push_str(&format!("This is a paragraph with a [link][ref{}] reference.\n", i));
158
+ content.push_str(&format!("This is a paragraph with a [link][ref{i}] reference.\n"));
160
159
  }
161
160
 
162
161
  let rule = MD053LinkImageReferenceDefinitions::default();
@@ -1,4 +1,4 @@
1
- use criterion::{black_box, criterion_group, criterion_main, Criterion};
1
+ use criterion::{Criterion, black_box, criterion_group, criterion_main};
2
2
  use rumdl::lint_context::LintContext;
3
3
  use rumdl::rule::Rule;
4
4
  use rumdl::rules::*;
@@ -9,7 +9,7 @@ fn generate_test_content() -> String {
9
9
 
10
10
  for i in 0..500 {
11
11
  // MD009 - Trailing spaces (very common)
12
- content.push_str(&format!("Line {} with trailing spaces \n", i));
12
+ content.push_str(&format!("Line {i} with trailing spaces \n"));
13
13
 
14
14
  // MD012 - Multiple blank lines
15
15
  if i % 10 == 0 {
@@ -18,21 +18,21 @@ fn generate_test_content() -> String {
18
18
 
19
19
  // MD018 - No space after hash
20
20
  if i % 15 == 0 {
21
- content.push_str(&format!("#Heading without space {}\n\n", i));
21
+ content.push_str(&format!("#Heading without space {i}\n\n"));
22
22
  }
23
23
 
24
24
  // MD026 - Trailing punctuation
25
25
  if i % 20 == 0 {
26
- content.push_str(&format!("# Heading with punctuation {}!\n\n", i));
26
+ content.push_str(&format!("# Heading with punctuation {i}!\n\n"));
27
27
  }
28
28
 
29
29
  // MD037 - Spaces inside emphasis
30
30
  if i % 8 == 0 {
31
- content.push_str(&format!("Text with * bad emphasis * number {}\n", i));
31
+ content.push_str(&format!("Text with * bad emphasis * number {i}\n"));
32
32
  }
33
33
 
34
34
  // Regular content
35
- content.push_str(&format!("Regular paragraph {} with some content.\n\n", i));
35
+ content.push_str(&format!("Regular paragraph {i} with some content.\n\n"));
36
36
  }
37
37
 
38
38
  content
@@ -1,5 +1,5 @@
1
1
  [toolchain]
2
- channel = "1.87.0"
2
+ channel = "1.88.0"
3
3
  components = ["rustfmt", "clippy"]
4
4
  targets = [
5
5
  "x86_64-unknown-linux-gnu",