rumdl 0.0.107__tar.gz → 0.0.108__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 (369) hide show
  1. {rumdl-0.0.107 → rumdl-0.0.108}/.config/nextest.toml +21 -1
  2. {rumdl-0.0.107 → rumdl-0.0.108}/.pre-commit-config.yaml +38 -11
  3. {rumdl-0.0.107 → rumdl-0.0.108}/CHANGELOG.md +8 -0
  4. {rumdl-0.0.107 → rumdl-0.0.108}/Cargo.lock +5 -5
  5. {rumdl-0.0.107 → rumdl-0.0.108}/Cargo.toml +1 -1
  6. {rumdl-0.0.107 → rumdl-0.0.108}/Makefile +11 -1
  7. {rumdl-0.0.107 → rumdl-0.0.108}/PKG-INFO +1 -1
  8. rumdl-0.0.108/src/bin/debug_frontmatter.rs +42 -0
  9. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md037_spaces_around_emphasis.rs +100 -1
  10. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md044_proper_names.rs +107 -0
  11. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md049_emphasis_style.rs +74 -0
  12. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md050_strong_style.rs +83 -6
  13. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md052_reference_links_images.rs +81 -3
  14. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md058_blanks_around_tables.rs +30 -0
  15. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/table_utils.rs +36 -11
  16. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/emphasis_edge_cases_test.rs +7 -2
  17. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/inline_content_edge_cases_test.rs +4 -2
  18. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md044_test.rs +2 -1
  19. {rumdl-0.0.107 → rumdl-0.0.108}/.mise.toml +0 -0
  20. {rumdl-0.0.107 → rumdl-0.0.108}/.rumdl.toml +0 -0
  21. {rumdl-0.0.107 → rumdl-0.0.108}/.rustfmt.toml +0 -0
  22. {rumdl-0.0.107 → rumdl-0.0.108}/LICENSE +0 -0
  23. {rumdl-0.0.107 → rumdl-0.0.108}/MANIFEST.in +0 -0
  24. {rumdl-0.0.107 → rumdl-0.0.108}/README.md +0 -0
  25. {rumdl-0.0.107 → rumdl-0.0.108}/assets/logo.png +0 -0
  26. {rumdl-0.0.107 → rumdl-0.0.108}/benches/fix_performance.rs +0 -0
  27. {rumdl-0.0.107 → rumdl-0.0.108}/benches/range_performance.rs +0 -0
  28. {rumdl-0.0.107 → rumdl-0.0.108}/benches/range_utils_benchmark.rs +0 -0
  29. {rumdl-0.0.107 → rumdl-0.0.108}/benches/rule_performance.rs +0 -0
  30. {rumdl-0.0.107 → rumdl-0.0.108}/benches/simple_fix_bench.rs +0 -0
  31. {rumdl-0.0.107 → rumdl-0.0.108}/benchmark/bin/bench_lint_context.rs +0 -0
  32. {rumdl-0.0.107 → rumdl-0.0.108}/benchmark/bin/benchmark.rs +0 -0
  33. {rumdl-0.0.107 → rumdl-0.0.108}/benchmark/bin/benchmark_rule.rs +0 -0
  34. {rumdl-0.0.107 → rumdl-0.0.108}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  35. {rumdl-0.0.107 → rumdl-0.0.108}/benchmark/bin/measure_code_span_performance.rs +0 -0
  36. {rumdl-0.0.107 → rumdl-0.0.108}/docs/RULES.md +0 -0
  37. {rumdl-0.0.107 → rumdl-0.0.108}/docs/global-settings.md +0 -0
  38. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md001.md +0 -0
  39. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md002.md +0 -0
  40. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md003.md +0 -0
  41. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md004.md +0 -0
  42. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md005.md +0 -0
  43. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md006.md +0 -0
  44. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md007.md +0 -0
  45. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md009.md +0 -0
  46. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md010.md +0 -0
  47. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md011.md +0 -0
  48. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md012.md +0 -0
  49. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md013.md +0 -0
  50. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md014.md +0 -0
  51. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md018.md +0 -0
  52. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md019.md +0 -0
  53. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md020.md +0 -0
  54. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md021.md +0 -0
  55. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md022.md +0 -0
  56. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md023.md +0 -0
  57. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md024.md +0 -0
  58. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md025.md +0 -0
  59. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md026.md +0 -0
  60. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md027.md +0 -0
  61. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md028.md +0 -0
  62. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md029.md +0 -0
  63. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md030.md +0 -0
  64. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md031.md +0 -0
  65. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md032.md +0 -0
  66. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md033.md +0 -0
  67. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md034.md +0 -0
  68. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md035.md +0 -0
  69. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md036.md +0 -0
  70. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md037.md +0 -0
  71. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md038.md +0 -0
  72. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md039.md +0 -0
  73. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md040.md +0 -0
  74. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md041.md +0 -0
  75. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md042.md +0 -0
  76. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md043.md +0 -0
  77. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md044.md +0 -0
  78. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md045.md +0 -0
  79. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md046.md +0 -0
  80. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md047.md +0 -0
  81. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md048.md +0 -0
  82. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md049.md +0 -0
  83. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md050.md +0 -0
  84. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md051.md +0 -0
  85. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md052.md +0 -0
  86. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md053.md +0 -0
  87. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md054.md +0 -0
  88. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md055.md +0 -0
  89. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md056.md +0 -0
  90. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md057.md +0 -0
  91. {rumdl-0.0.107 → rumdl-0.0.108}/docs/md058.md +0 -0
  92. {rumdl-0.0.107 → rumdl-0.0.108}/docs/vscode-extension.md +0 -0
  93. {rumdl-0.0.107 → rumdl-0.0.108}/parity_check.py +0 -0
  94. {rumdl-0.0.107 → rumdl-0.0.108}/pyproject.toml +0 -0
  95. {rumdl-0.0.107 → rumdl-0.0.108}/python/MANIFEST.in +0 -0
  96. {rumdl-0.0.107 → rumdl-0.0.108}/python/PYTHON-README.md +0 -0
  97. {rumdl-0.0.107 → rumdl-0.0.108}/python/rumdl/__init__.py +0 -0
  98. {rumdl-0.0.107 → rumdl-0.0.108}/python/rumdl/__main__.py +0 -0
  99. {rumdl-0.0.107 → rumdl-0.0.108}/python/rumdl/py.typed +0 -0
  100. {rumdl-0.0.107 → rumdl-0.0.108}/rumdl.toml.example +0 -0
  101. {rumdl-0.0.107 → rumdl-0.0.108}/rust-toolchain.toml +0 -0
  102. {rumdl-0.0.107 → rumdl-0.0.108}/scripts/extract-changelog.sh +0 -0
  103. {rumdl-0.0.107 → rumdl-0.0.108}/scripts/prepare-release.sh +0 -0
  104. {rumdl-0.0.107 → rumdl-0.0.108}/scripts/setup-pre-commit.sh +0 -0
  105. {rumdl-0.0.107 → rumdl-0.0.108}/scripts/update-pre-commit-docs.sh +0 -0
  106. {rumdl-0.0.107 → rumdl-0.0.108}/src/config.rs +0 -0
  107. {rumdl-0.0.107 → rumdl-0.0.108}/src/exit_codes.rs +0 -0
  108. {rumdl-0.0.107 → rumdl-0.0.108}/src/inline_config.rs +0 -0
  109. {rumdl-0.0.107 → rumdl-0.0.108}/src/lib.rs +0 -0
  110. {rumdl-0.0.107 → rumdl-0.0.108}/src/lint_context.rs +0 -0
  111. {rumdl-0.0.107 → rumdl-0.0.108}/src/lsp/mod.rs +0 -0
  112. {rumdl-0.0.107 → rumdl-0.0.108}/src/lsp/server.rs +0 -0
  113. {rumdl-0.0.107 → rumdl-0.0.108}/src/lsp/types.rs +0 -0
  114. {rumdl-0.0.107 → rumdl-0.0.108}/src/main.rs +0 -0
  115. {rumdl-0.0.107 → rumdl-0.0.108}/src/markdownlint_config.rs +0 -0
  116. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/azure.rs +0 -0
  117. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/concise.rs +0 -0
  118. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/github.rs +0 -0
  119. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/gitlab.rs +0 -0
  120. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/grouped.rs +0 -0
  121. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/json.rs +0 -0
  122. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/json_lines.rs +0 -0
  123. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/junit.rs +0 -0
  124. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/mod.rs +0 -0
  125. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/pylint.rs +0 -0
  126. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/sarif.rs +0 -0
  127. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/formatters/text.rs +0 -0
  128. {rumdl-0.0.107 → rumdl-0.0.108}/src/output/mod.rs +0 -0
  129. {rumdl-0.0.107 → rumdl-0.0.108}/src/parallel.rs +0 -0
  130. {rumdl-0.0.107 → rumdl-0.0.108}/src/performance.rs +0 -0
  131. {rumdl-0.0.107 → rumdl-0.0.108}/src/profiling.rs +0 -0
  132. {rumdl-0.0.107 → rumdl-0.0.108}/src/python.rs +0 -0
  133. {rumdl-0.0.107 → rumdl-0.0.108}/src/rule.rs +0 -0
  134. {rumdl-0.0.107 → rumdl-0.0.108}/src/rule_config.rs +0 -0
  135. {rumdl-0.0.107 → rumdl-0.0.108}/src/rule_config_serde.rs +0 -0
  136. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/blockquote_utils.rs +0 -0
  137. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/code_block_utils.rs +0 -0
  138. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/code_fence_utils.rs +0 -0
  139. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/emphasis_style.rs +0 -0
  140. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/front_matter_utils.rs +0 -0
  141. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/heading_utils.rs +0 -0
  142. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/list_utils.rs +0 -0
  143. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md001_heading_increment.rs +0 -0
  144. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  145. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md002_first_heading_h1.rs +0 -0
  146. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md003_heading_style/md003_config.rs +0 -0
  147. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md003_heading_style.rs +0 -0
  148. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  149. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md004_unordered_list_style.rs +0 -0
  150. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md005_list_indent.rs +0 -0
  151. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md006_start_bullets.rs +0 -0
  152. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  153. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md007_ul_indent.rs +0 -0
  154. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  155. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md009_trailing_spaces.rs +0 -0
  156. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  157. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md010_no_hard_tabs.rs +0 -0
  158. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md011_no_reversed_links.rs +0 -0
  159. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  160. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md012_no_multiple_blanks.rs +0 -0
  161. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md013_line_length/md013_config.rs +0 -0
  162. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md013_line_length.rs +0 -0
  163. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  164. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md014_commands_show_output.rs +0 -0
  165. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md018_no_missing_space_atx.rs +0 -0
  166. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  167. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  168. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  169. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  170. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md022_blanks_around_headings.rs +0 -0
  171. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md023_heading_start_left.rs +0 -0
  172. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  173. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md024_no_duplicate_heading.rs +0 -0
  174. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md025_single_title/md025_config.rs +0 -0
  175. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md025_single_title.rs +0 -0
  176. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  177. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  178. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  179. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  180. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  181. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md029_ordered_list_prefix.rs +0 -0
  182. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  183. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md030_list_marker_space.rs +0 -0
  184. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md031_blanks_around_fences.rs +0 -0
  185. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md032_blanks_around_lists.rs +0 -0
  186. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  187. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md033_no_inline_html.rs +0 -0
  188. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md034_no_bare_urls.rs +0 -0
  189. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md035_hr_style/md035_config.rs +0 -0
  190. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md035_hr_style.rs +0 -0
  191. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  192. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  193. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md038_no_space_in_code.rs +0 -0
  194. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md039_no_space_in_links.rs +0 -0
  195. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md040_fenced_code_language.rs +0 -0
  196. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md041_first_line_heading.rs +0 -0
  197. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md042_no_empty_links.rs +0 -0
  198. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md043_required_headings.rs +0 -0
  199. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md044_proper_names/md044_config.rs +0 -0
  200. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  201. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md045_no_alt_text.rs +0 -0
  202. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  203. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md046_code_block_style.rs +0 -0
  204. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md047_single_trailing_newline.rs +0 -0
  205. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  206. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md048_code_fence_style.rs +0 -0
  207. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  208. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md050_strong_style/md050_config.rs +0 -0
  209. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md051_link_fragments.rs +0 -0
  210. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  211. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  212. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md054_link_image_style.rs +0 -0
  213. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  214. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md055_table_pipe_style.rs +0 -0
  215. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md056_table_column_count.rs +0 -0
  216. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  217. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/md057_existing_relative_links.rs +0 -0
  218. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/mod.rs +0 -0
  219. {rumdl-0.0.107 → rumdl-0.0.108}/src/rules/strong_style.rs +0 -0
  220. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/ast_utils.rs +0 -0
  221. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/code_block_utils.rs +0 -0
  222. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/document_structure.rs +0 -0
  223. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/early_returns.rs +0 -0
  224. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/element_cache.rs +0 -0
  225. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/emphasis_utils.rs +0 -0
  226. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/fix_utils.rs +0 -0
  227. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/markdown_elements.rs +0 -0
  228. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/mod.rs +0 -0
  229. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/range_utils.rs +0 -0
  230. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/regex_cache.rs +0 -0
  231. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/string_interner.rs +0 -0
  232. {rumdl-0.0.107 → rumdl-0.0.108}/src/utils/text_reflow.rs +0 -0
  233. {rumdl-0.0.107 → rumdl-0.0.108}/src/vscode.rs +0 -0
  234. {rumdl-0.0.107 → rumdl-0.0.108}/tests/advanced_integration_tests.rs +0 -0
  235. {rumdl-0.0.107 → rumdl-0.0.108}/tests/character_ranges/additional_tests.rs +0 -0
  236. {rumdl-0.0.107 → rumdl-0.0.108}/tests/character_ranges/basic_tests.rs +0 -0
  237. {rumdl-0.0.107 → rumdl-0.0.108}/tests/character_ranges/comprehensive_tests.rs +0 -0
  238. {rumdl-0.0.107 → rumdl-0.0.108}/tests/character_ranges/extended_tests.rs +0 -0
  239. {rumdl-0.0.107 → rumdl-0.0.108}/tests/character_ranges/mod.rs +0 -0
  240. {rumdl-0.0.107 → rumdl-0.0.108}/tests/character_ranges/unicode_utils.rs +0 -0
  241. {rumdl-0.0.107 → rumdl-0.0.108}/tests/cli_duplication_test.rs +0 -0
  242. {rumdl-0.0.107 → rumdl-0.0.108}/tests/cli_explain_test.rs +0 -0
  243. {rumdl-0.0.107 → rumdl-0.0.108}/tests/cli_flag_precedence_test.rs +0 -0
  244. {rumdl-0.0.107 → rumdl-0.0.108}/tests/cli_integration_tests.rs +0 -0
  245. {rumdl-0.0.107 → rumdl-0.0.108}/tests/cli_lsp_fix_consistency.rs +0 -0
  246. {rumdl-0.0.107 → rumdl-0.0.108}/tests/cli_statistics_test.rs +0 -0
  247. {rumdl-0.0.107 → rumdl-0.0.108}/tests/commonmark_compliance_tests.rs +0 -0
  248. {rumdl-0.0.107 → rumdl-0.0.108}/tests/comprehensive_integration_tests.rs +0 -0
  249. {rumdl-0.0.107 → rumdl-0.0.108}/tests/comprehensive_output_format_tests.rs +0 -0
  250. {rumdl-0.0.107 → rumdl-0.0.108}/tests/config_application_tests.rs +0 -0
  251. {rumdl-0.0.107 → rumdl-0.0.108}/tests/config_file_command_test.rs +0 -0
  252. {rumdl-0.0.107 → rumdl-0.0.108}/tests/config_tests.rs +0 -0
  253. {rumdl-0.0.107 → rumdl-0.0.108}/tests/configuration_inheritance_tests.rs +0 -0
  254. {rumdl-0.0.107 → rumdl-0.0.108}/tests/consistency_regression_tests.rs +0 -0
  255. {rumdl-0.0.107 → rumdl-0.0.108}/tests/cross_platform_compatibility_tests.rs +0 -0
  256. {rumdl-0.0.107 → rumdl-0.0.108}/tests/deeply_nested_lists_performance_test.rs +0 -0
  257. {rumdl-0.0.107 → rumdl-0.0.108}/tests/escaped_brackets_test.rs +0 -0
  258. {rumdl-0.0.107 → rumdl-0.0.108}/tests/final_confidence_assessment.rs +0 -0
  259. {rumdl-0.0.107 → rumdl-0.0.108}/tests/init_command_test.rs +0 -0
  260. {rumdl-0.0.107 → rumdl-0.0.108}/tests/init_tests.rs +0 -0
  261. {rumdl-0.0.107 → rumdl-0.0.108}/tests/inline_config_blocks_test.rs +0 -0
  262. {rumdl-0.0.107 → rumdl-0.0.108}/tests/inline_config_test.rs +0 -0
  263. {rumdl-0.0.107 → rumdl-0.0.108}/tests/integration_tests.rs +0 -0
  264. {rumdl-0.0.107 → rumdl-0.0.108}/tests/json_output_test.rs +0 -0
  265. {rumdl-0.0.107 → rumdl-0.0.108}/tests/lib.rs +0 -0
  266. {rumdl-0.0.107 → rumdl-0.0.108}/tests/lsp_editor_integration_tests.rs +0 -0
  267. {rumdl-0.0.107 → rumdl-0.0.108}/tests/lsp_integration_tests.rs +0 -0
  268. {rumdl-0.0.107 → rumdl-0.0.108}/tests/lsp_memory_leak_tests.rs +0 -0
  269. {rumdl-0.0.107 → rumdl-0.0.108}/tests/lsp_tests.rs +0 -0
  270. {rumdl-0.0.107 → rumdl-0.0.108}/tests/malformed_markdown_stress_tests.rs +0 -0
  271. {rumdl-0.0.107 → rumdl-0.0.108}/tests/markdownlint_cli_integration.rs +0 -0
  272. {rumdl-0.0.107 → rumdl-0.0.108}/tests/markdownlint_config_test.rs +0 -0
  273. {rumdl-0.0.107 → rumdl-0.0.108}/tests/markdownlintignore_test.rs +0 -0
  274. {rumdl-0.0.107 → rumdl-0.0.108}/tests/md013_reflow_integration_test.rs +0 -0
  275. {rumdl-0.0.107 → rumdl-0.0.108}/tests/nested_code_block_test.rs +0 -0
  276. {rumdl-0.0.107 → rumdl-0.0.108}/tests/output_format_integration_tests.rs +0 -0
  277. {rumdl-0.0.107 → rumdl-0.0.108}/tests/output_format_tests.rs +0 -0
  278. {rumdl-0.0.107 → rumdl-0.0.108}/tests/perf_check.rs +0 -0
  279. {rumdl-0.0.107 → rumdl-0.0.108}/tests/performance_validation_tests.rs +0 -0
  280. {rumdl-0.0.107 → rumdl-0.0.108}/tests/pyproject_config_tests.rs +0 -0
  281. {rumdl-0.0.107 → rumdl-0.0.108}/tests/python_bindings_test.rs +0 -0
  282. {rumdl-0.0.107 → rumdl-0.0.108}/tests/real_world_repository_tests.rs +0 -0
  283. {rumdl-0.0.107 → rumdl-0.0.108}/tests/regression_prevention_tests.rs +0 -0
  284. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/heading_edge_cases_test.rs +0 -0
  285. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/link_edge_cases_test.rs +0 -0
  286. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/list_rules_integration_test.rs +0 -0
  287. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md001_test.rs +0 -0
  288. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md001_unicode_test.rs +0 -0
  289. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md002_test.rs +0 -0
  290. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md003_test.rs +0 -0
  291. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md004_test.rs +0 -0
  292. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md005_test.rs +0 -0
  293. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md005_unicode_test.rs +0 -0
  294. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md006_test.rs +0 -0
  295. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md006_unicode_test.rs +0 -0
  296. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md007_test.rs +0 -0
  297. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md009_test.rs +0 -0
  298. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md010_test.rs +0 -0
  299. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md011_test.rs +0 -0
  300. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md012_test.rs +0 -0
  301. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md013_test.rs +0 -0
  302. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md014_test.rs +0 -0
  303. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md018_test.rs +0 -0
  304. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md019_test.rs +0 -0
  305. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md020_test.rs +0 -0
  306. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md021_test.rs +0 -0
  307. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md022_test.rs +0 -0
  308. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md023_extended_test.rs +0 -0
  309. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md023_test.rs +0 -0
  310. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md024_test.rs +0 -0
  311. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md025_test.rs +0 -0
  312. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md026_test.rs +0 -0
  313. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md027_test.rs +0 -0
  314. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md028_test.rs +0 -0
  315. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md029_test.rs +0 -0
  316. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md029_unicode_test.rs +0 -0
  317. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md030_test.rs +0 -0
  318. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md031_test.rs +0 -0
  319. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md032_test.rs +0 -0
  320. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md033_extended_test.rs +0 -0
  321. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md033_test.rs +0 -0
  322. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md034_ipv6_test.rs +0 -0
  323. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md034_test.rs +0 -0
  324. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md035_test.rs +0 -0
  325. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md036_test.rs +0 -0
  326. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md037_test.rs +0 -0
  327. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md038_nested_backticks_test.rs +0 -0
  328. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md038_test.rs +0 -0
  329. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md039_test.rs +0 -0
  330. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md040_test.rs +0 -0
  331. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md041_test.rs +0 -0
  332. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md042_test.rs +0 -0
  333. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md043_test.rs +0 -0
  334. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md045_test.rs +0 -0
  335. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md046_test.rs +0 -0
  336. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md047_test.rs +0 -0
  337. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md048_test.rs +0 -0
  338. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md049_test.rs +0 -0
  339. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md050_test.rs +0 -0
  340. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md051_test.rs +0 -0
  341. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md051_unicode_test.rs +0 -0
  342. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md052_test.rs +0 -0
  343. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md053_additional_test.rs +0 -0
  344. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md053_proptest.rs +0 -0
  345. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md053_test.rs +0 -0
  346. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md054_test.rs +0 -0
  347. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md054_unicode_test.rs +0 -0
  348. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md055_test.rs +0 -0
  349. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md056_test.rs +0 -0
  350. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md057_test.rs +0 -0
  351. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/md058_test.rs +0 -0
  352. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules/mod.rs +0 -0
  353. {rumdl-0.0.107 → rumdl-0.0.108}/tests/rules_mod_test.rs +0 -0
  354. {rumdl-0.0.107 → rumdl-0.0.108}/tests/thread_safety_tests.rs +0 -0
  355. {rumdl-0.0.107 → rumdl-0.0.108}/tests/unicode_edge_case_tests.rs +0 -0
  356. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils/blockquote_utils_test.rs +0 -0
  357. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils/code_block_utils_extended_test.rs +0 -0
  358. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils/code_block_utils_test.rs +0 -0
  359. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils/core_utils_test.rs +0 -0
  360. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils/front_matter_utils_test.rs +0 -0
  361. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils/line_index_test.rs +0 -0
  362. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils/mod.rs +0 -0
  363. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils_markdown_edge_cases.rs +0 -0
  364. {rumdl-0.0.107 → rumdl-0.0.108}/tests/utils_tests.rs +0 -0
  365. {rumdl-0.0.107 → rumdl-0.0.108}/tests/vscode_extension_fixes.rs +0 -0
  366. {rumdl-0.0.107 → rumdl-0.0.108}/tests/vscode_test.rs +0 -0
  367. {rumdl-0.0.107 → rumdl-0.0.108}/tests/vscode_tests.rs +0 -0
  368. {rumdl-0.0.107 → rumdl-0.0.108}/tests/vscode_windows_comprehensive_test.rs +0 -0
  369. {rumdl-0.0.107 → rumdl-0.0.108}/tests/vscode_windows_test.rs +0 -0
@@ -43,4 +43,24 @@ default-filter = 'not test(/memory/) and not test(/stress/) and not test(/large/
43
43
  test-threads = "num-cpus"
44
44
 
45
45
  # Less verbose output
46
- status-level = "fail"
46
+ status-level = "fail"
47
+
48
+ # Ultra-fast profile for pre-commit hooks
49
+ [profile.pre-commit]
50
+
51
+ # Only run unit tests in lib, skip all integration tests and binaries
52
+ default-filter = 'package(rumdl) and kind(lib) and not test(/slow|stress|large|integration|comprehensive|cli|config|advanced|commonmark|consistency|performance|benchmark|parity/)'
53
+
54
+ # Maximum parallelism for speed
55
+ test-threads = "num-cpus"
56
+
57
+ # Minimal output for speed
58
+ status-level = "fail"
59
+ failure-output = "immediate"
60
+ success-output = "never"
61
+
62
+ # No retries to save time
63
+ retries = 0
64
+
65
+ # Fail fast on first failure
66
+ fail-fast = true
@@ -1,6 +1,10 @@
1
1
  # Pre-commit hooks for rumdl
2
- # Install with: pre-commit install
3
- # Run manually: pre-commit run --all-files
2
+ # Install with:
3
+ # pre-commit install # Install commit hooks
4
+ # pre-commit install --hook-type pre-push # Install push hooks
5
+ # Run manually:
6
+ # pre-commit run --all-files # Run commit hooks
7
+ # pre-commit run --hook-stage push --all-files # Run push hooks
4
8
 
5
9
  repos:
6
10
  # Rust formatting and linting
@@ -15,26 +19,19 @@ repos:
15
19
 
16
20
  - id: cargo-clippy
17
21
  name: cargo clippy
18
- entry: make lint
22
+ entry: make lint-fast
19
23
  language: system
20
24
  types: [rust]
21
25
  pass_filenames: false
22
26
 
23
27
  - id: cargo-test-quick
24
28
  name: cargo test (quick)
25
- entry: make test-quick
29
+ entry: make test-pre-commit
26
30
  language: system
27
31
  types: [rust]
28
32
  pass_filenames: false
29
33
  stages: [pre-commit]
30
34
 
31
- - id: cargo-check
32
- name: cargo check
33
- entry: cargo check --all-targets --all-features
34
- language: system
35
- types: [rust]
36
- pass_filenames: false
37
-
38
35
  # General file quality checks
39
36
  - repo: https://github.com/pre-commit/pre-commit-hooks
40
37
  rev: v4.6.0
@@ -57,3 +54,33 @@ repos:
57
54
  hooks:
58
55
  - id: rumdl
59
56
  exclude: ^(test_tmp|benchmark/test-data|docs/temp|CHANGELOG\.md)
57
+
58
+ # Pre-push hooks for comprehensive validation
59
+ - repo: local
60
+ hooks:
61
+ - id: cargo-test-full
62
+ name: cargo test (full suite)
63
+ entry: make test-push
64
+ language: system
65
+ types: [rust]
66
+ pass_filenames: false
67
+ stages: [push]
68
+ verbose: true
69
+
70
+ - id: cargo-lint-full
71
+ name: cargo clippy (all targets)
72
+ entry: make lint
73
+ language: system
74
+ types: [rust]
75
+ pass_filenames: false
76
+ stages: [push]
77
+ verbose: true
78
+
79
+ - id: cargo-doc-check
80
+ name: cargo doc (check)
81
+ entry: cargo doc --no-deps --all-features
82
+ language: system
83
+ types: [rust]
84
+ pass_filenames: false
85
+ stages: [push]
86
+ verbose: true
@@ -9,6 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ## [0.0.107] - 2025-08-06
11
11
 
12
+ ## [0.0.107] - 2025-08-06
13
+
14
+ ### Fixed
15
+ - MD036: Remove automatic fix to prevent document corruption when bold/italic text is used as image captions, labels, or warnings (#23)
16
+ - MD011: No longer flags patterns like `()[1]` inside inline code as reversed links (#19)
17
+ - MD052: No longer flags reference patterns inside HTML comments as undefined references (#20)
18
+
12
19
  ## [0.0.106] - 2025-08-05
13
20
 
14
21
  ### Changed
@@ -293,6 +300,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
293
300
 
294
301
  [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.107...HEAD
295
302
  [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
303
+ [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
296
304
  [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
297
305
  [0.0.105]: https://github.com/rvben/rumdl/compare/v0.0.104...v0.0.105
298
306
  [0.0.104]: https://github.com/rvben/rumdl/compare/v0.0.103...v0.0.104
@@ -277,9 +277,9 @@ dependencies = [
277
277
 
278
278
  [[package]]
279
279
  name = "clap"
280
- version = "4.5.42"
280
+ version = "4.5.43"
281
281
  source = "registry+https://github.com/rust-lang/crates.io-index"
282
- checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882"
282
+ checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f"
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.42"
290
+ version = "4.5.43"
291
291
  source = "registry+https://github.com/rust-lang/crates.io-index"
292
- checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966"
292
+ checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65"
293
293
  dependencies = [
294
294
  "anstream",
295
295
  "anstyle",
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1493
1493
 
1494
1494
  [[package]]
1495
1495
  name = "rumdl"
1496
- version = "0.0.107"
1496
+ version = "0.0.108"
1497
1497
  dependencies = [
1498
1498
  "anyhow",
1499
1499
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.107"
3
+ version = "0.0.108"
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)"
@@ -69,6 +69,13 @@ test-nextest:
69
69
  test-quick:
70
70
  cargo nextest run --profile quick
71
71
 
72
+ test-pre-commit:
73
+ cargo nextest run --profile pre-commit
74
+
75
+ test-push:
76
+ @echo "Running full test suite (this may take a few minutes)..."
77
+ cargo nextest run
78
+
72
79
  test-ci:
73
80
  cargo nextest run --profile ci
74
81
 
@@ -81,7 +88,10 @@ fmt:
81
88
  cargo fix --allow-dirty --allow-staged
82
89
 
83
90
  lint:
84
- cargo clippy --all-targets --all-features -- -D warnings
91
+ CARGO_INCREMENTAL=1 cargo clippy --all-targets --all-features -- -D warnings
92
+
93
+ lint-fast:
94
+ CARGO_INCREMENTAL=1 cargo clippy --workspace --lib --bins -- -D warnings
85
95
 
86
96
  check:
87
97
  cargo check --all-targets --all-features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.107
3
+ Version: 0.0.108
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -0,0 +1,42 @@
1
+ use rumdl::rules::front_matter_utils::FrontMatterUtils;
2
+ use std::env;
3
+ use std::fs;
4
+
5
+ fn main() {
6
+ let args: Vec<String> = env::args().collect();
7
+ let content = if args.len() > 1 {
8
+ fs::read_to_string(&args[1]).expect("Failed to read file")
9
+ } else {
10
+ r#"+++
11
+ title = "My Post"
12
+ tags = ["example", "test"]
13
+ +++
14
+
15
+ # Content
16
+
17
+ [missing] reference should be flagged."#
18
+ .to_string()
19
+ };
20
+
21
+ println!("Content:");
22
+ for (i, line) in content.lines().enumerate() {
23
+ println!("Line {}: {}", i + 1, line);
24
+ }
25
+ println!();
26
+
27
+ let line_count = content.lines().count();
28
+
29
+ // Test with 0-based indexing (what the function actually uses)
30
+ println!("Testing is_in_front_matter with 0-based indexing:");
31
+ for i in 0..line_count {
32
+ let in_frontmatter = FrontMatterUtils::is_in_front_matter(&content, i);
33
+ println!("Line {} (0-based={}): in_frontmatter={}", i + 1, i, in_frontmatter);
34
+ }
35
+
36
+ // Test also with 1-based indexing (what we pass from MD052)
37
+ println!("\nTesting is_in_front_matter with 1-based indexing:");
38
+ for i in 1..=line_count {
39
+ let in_frontmatter = FrontMatterUtils::is_in_front_matter(&content, i);
40
+ println!("Line {i}: in_frontmatter={in_frontmatter}");
41
+ }
42
+ }
@@ -7,6 +7,15 @@ use crate::utils::emphasis_utils::{
7
7
  EmphasisSpan, find_emphasis_markers, find_emphasis_spans, has_doc_patterns, replace_inline_code,
8
8
  };
9
9
  use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
10
+ use lazy_static::lazy_static;
11
+ use regex::Regex;
12
+
13
+ lazy_static! {
14
+ // Reference definition pattern - matches [ref]: url "title"
15
+ static ref REF_DEF_REGEX: Regex = Regex::new(
16
+ r#"(?m)^[ ]{0,3}\[([^\]]+)\]:\s*([^\s]+)(?:\s+(?:"([^"]*)"|'([^']*)'))?$"#
17
+ ).unwrap();
18
+ }
10
19
 
11
20
  /// Check if an emphasis span has spacing issues that should be flagged
12
21
  #[inline]
@@ -24,6 +33,34 @@ impl Default for MD037NoSpaceInEmphasis {
24
33
  }
25
34
  }
26
35
 
36
+ impl MD037NoSpaceInEmphasis {
37
+ /// Check if a byte position is within a link (inline links, reference links, or reference definitions)
38
+ fn is_in_link(&self, ctx: &crate::lint_context::LintContext, byte_pos: usize) -> bool {
39
+ // Check inline and reference links
40
+ for link in &ctx.links {
41
+ if link.byte_offset <= byte_pos && byte_pos < link.byte_end {
42
+ return true;
43
+ }
44
+ }
45
+
46
+ // Check images (which use similar syntax)
47
+ for image in &ctx.images {
48
+ if image.byte_offset <= byte_pos && byte_pos < image.byte_end {
49
+ return true;
50
+ }
51
+ }
52
+
53
+ // Check reference definitions [ref]: url "title" using regex pattern
54
+ for m in REF_DEF_REGEX.find_iter(ctx.content) {
55
+ if m.start() <= byte_pos && byte_pos < m.end() {
56
+ return true;
57
+ }
58
+ }
59
+
60
+ false
61
+ }
62
+ }
63
+
27
64
  impl Rule for MD037NoSpaceInEmphasis {
28
65
  fn name(&self) -> &'static str {
29
66
  "MD037"
@@ -83,7 +120,30 @@ impl Rule for MD037NoSpaceInEmphasis {
83
120
  self.check_line_for_emphasis_issues_fast(&line_no_code, line_num + 1, &mut warnings);
84
121
  }
85
122
 
86
- Ok(warnings)
123
+ // Filter out warnings for emphasis markers that are inside links
124
+ let mut filtered_warnings = Vec::new();
125
+ let mut line_start_pos = 0;
126
+
127
+ for (line_idx, line) in content.lines().enumerate() {
128
+ let line_num = line_idx + 1;
129
+
130
+ // Find warnings for this line
131
+ for warning in &warnings {
132
+ if warning.line == line_num {
133
+ // Calculate byte position of the warning
134
+ let byte_pos = line_start_pos + (warning.column - 1);
135
+
136
+ // Only keep warnings that are not inside links
137
+ if !self.is_in_link(ctx, byte_pos) {
138
+ filtered_warnings.push(warning.clone());
139
+ }
140
+ }
141
+ }
142
+
143
+ line_start_pos += line.len() + 1; // +1 for newline
144
+ }
145
+
146
+ Ok(filtered_warnings)
87
147
  }
88
148
 
89
149
  fn fix(&self, ctx: &crate::lint_context::LintContext) -> Result<String, LintError> {
@@ -367,4 +427,43 @@ mod tests {
367
427
  "Expected warnings for spaces in emphasis outside code block"
368
428
  );
369
429
  }
430
+
431
+ #[test]
432
+ fn test_emphasis_in_links_not_flagged() {
433
+ let rule = MD037NoSpaceInEmphasis;
434
+ let content = r#"Check this [* spaced asterisk *](https://example.com/*test*) link.
435
+
436
+ This has * real spaced emphasis * that should be flagged."#;
437
+ let ctx = crate::lint_context::LintContext::new(content);
438
+ let result = rule.check(&ctx).unwrap();
439
+
440
+ // Test passed - emphasis inside links are filtered out correctly
441
+
442
+ // Only the real emphasis outside links should be flagged
443
+ assert_eq!(
444
+ result.len(),
445
+ 1,
446
+ "Expected exactly 1 warning, but got: {:?}",
447
+ result.len()
448
+ );
449
+ assert!(result[0].message.contains("Spaces inside emphasis markers"));
450
+ // Should flag "* real spaced emphasis *" but not emphasis patterns inside links
451
+ assert!(result[0].line == 3); // Line with "* real spaced emphasis *"
452
+ }
453
+
454
+ #[test]
455
+ fn test_emphasis_in_links_vs_outside_links() {
456
+ let rule = MD037NoSpaceInEmphasis;
457
+ let content = r#"Check [* spaced *](https://example.com/*test*) and inline * real spaced * text.
458
+
459
+ [* link *]: https://example.com/*path*"#;
460
+ let ctx = crate::lint_context::LintContext::new(content);
461
+ let result = rule.check(&ctx).unwrap();
462
+
463
+ // Only the actual emphasis outside links should be flagged
464
+ assert_eq!(result.len(), 1);
465
+ assert!(result[0].message.contains("Spaces inside emphasis markers"));
466
+ // Should be the "* real spaced *" text on line 1
467
+ assert!(result[0].line == 1);
468
+ }
370
469
  }
@@ -13,6 +13,10 @@ use md044_config::MD044Config;
13
13
 
14
14
  lazy_static! {
15
15
  static ref HTML_COMMENT_REGEX: Regex = Regex::new(r"<!--([\s\S]*?)-->").unwrap();
16
+ // Reference definition pattern - matches [ref]: url "title"
17
+ static ref REF_DEF_REGEX: regex::Regex = regex::Regex::new(
18
+ r#"(?m)^[ ]{0,3}\[([^\]]+)\]:\s*([^\s]+)(?:\s+(?:"([^"]*)"|'([^']*)'))?$"#
19
+ ).unwrap();
16
20
  }
17
21
 
18
22
  type WarningPosition = (usize, usize, String); // (line, column, found_name)
@@ -304,6 +308,12 @@ impl MD044ProperNames {
304
308
  }
305
309
  }
306
310
 
311
+ // Skip if in link (inline links, reference links, or reference definitions)
312
+ let byte_pos = line_info.byte_offset + cap.start();
313
+ if self.is_in_link(ctx, byte_pos) {
314
+ continue;
315
+ }
316
+
307
317
  // Find which proper name this matches
308
318
  if let Some(proper_name) = self.get_proper_name_for(found_name) {
309
319
  // Only flag if it's not already correct
@@ -334,6 +344,32 @@ impl MD044ProperNames {
334
344
  false
335
345
  }
336
346
 
347
+ /// Check if a byte position is within a link (inline links, reference links, or reference definitions)
348
+ fn is_in_link(&self, ctx: &crate::lint_context::LintContext, byte_pos: usize) -> bool {
349
+ // Check inline and reference links
350
+ for link in &ctx.links {
351
+ if link.byte_offset <= byte_pos && byte_pos < link.byte_end {
352
+ return true;
353
+ }
354
+ }
355
+
356
+ // Check images (which use similar syntax)
357
+ for image in &ctx.images {
358
+ if image.byte_offset <= byte_pos && byte_pos < image.byte_end {
359
+ return true;
360
+ }
361
+ }
362
+
363
+ // Check reference definitions [ref]: url "title" using regex pattern
364
+ for m in REF_DEF_REGEX.find_iter(ctx.content) {
365
+ if m.start() <= byte_pos && byte_pos < m.end() {
366
+ return true;
367
+ }
368
+ }
369
+
370
+ false
371
+ }
372
+
337
373
  // Check if a character is a word boundary (handles Unicode)
338
374
  fn is_word_boundary_char(c: char) -> bool {
339
375
  !c.is_alphanumeric()
@@ -1003,4 +1039,75 @@ More JavaScript."#;
1003
1039
  "Should not fix names inside HTML comments when disabled"
1004
1040
  );
1005
1041
  }
1042
+
1043
+ #[test]
1044
+ fn test_proper_names_in_links_not_flagged() {
1045
+ let rule = MD044ProperNames::new(
1046
+ vec!["JavaScript".to_string(), "Node.js".to_string(), "Python".to_string()],
1047
+ true,
1048
+ );
1049
+
1050
+ let content = r#"Check this [javascript documentation](https://javascript.info) for info.
1051
+
1052
+ Visit [node.js homepage](https://nodejs.org) and [python tutorial](https://python.org).
1053
+
1054
+ Real javascript should be flagged.
1055
+
1056
+ Also see the [typescript guide][ts-ref] for more.
1057
+
1058
+ Real python should be flagged too.
1059
+
1060
+ [ts-ref]: https://typescript.org/handbook"#;
1061
+
1062
+ let ctx = create_context(content);
1063
+ let result = rule.check(&ctx).unwrap();
1064
+
1065
+ // Only the real standalone proper names should be flagged
1066
+ assert_eq!(
1067
+ result.len(),
1068
+ 2,
1069
+ "Expected exactly 2 warnings for standalone proper names"
1070
+ );
1071
+ assert!(result[0].message.contains("'javascript' should be 'JavaScript'"));
1072
+ assert!(result[1].message.contains("'python' should be 'Python'"));
1073
+ // Should be on lines with standalone instances
1074
+ assert!(result[0].line == 5); // "Real javascript should be flagged."
1075
+ assert!(result[1].line == 9); // "Real python should be flagged too."
1076
+ }
1077
+
1078
+ #[test]
1079
+ fn test_proper_names_in_images_not_flagged() {
1080
+ let rule = MD044ProperNames::new(vec!["JavaScript".to_string()], true);
1081
+
1082
+ let content = r#"Here is a ![javascript logo](javascript.png "javascript icon") image.
1083
+
1084
+ Real javascript should be flagged."#;
1085
+
1086
+ let ctx = create_context(content);
1087
+ let result = rule.check(&ctx).unwrap();
1088
+
1089
+ // Only the standalone proper name should be flagged
1090
+ assert_eq!(result.len(), 1, "Expected exactly 1 warning for standalone proper name");
1091
+ assert!(result[0].message.contains("'javascript' should be 'JavaScript'"));
1092
+ assert!(result[0].line == 3); // "Real javascript should be flagged."
1093
+ }
1094
+
1095
+ #[test]
1096
+ fn test_proper_names_in_reference_definitions_not_flagged() {
1097
+ let rule = MD044ProperNames::new(vec!["JavaScript".to_string(), "TypeScript".to_string()], true);
1098
+
1099
+ let content = r#"Check the [javascript guide][js-ref] for details.
1100
+
1101
+ Real javascript should be flagged.
1102
+
1103
+ [js-ref]: https://javascript.info/typescript/guide"#;
1104
+
1105
+ let ctx = create_context(content);
1106
+ let result = rule.check(&ctx).unwrap();
1107
+
1108
+ // Only the standalone proper name should be flagged
1109
+ assert_eq!(result.len(), 1, "Expected exactly 1 warning for standalone proper name");
1110
+ assert!(result[0].message.contains("'javascript' should be 'JavaScript'"));
1111
+ assert!(result[0].line == 3); // "Real javascript should be flagged."
1112
+ }
1006
1113
  }
@@ -2,6 +2,15 @@ use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, Severity};
2
2
  use crate::rules::emphasis_style::EmphasisStyle;
3
3
  use crate::utils::document_structure::DocumentStructure;
4
4
  use crate::utils::emphasis_utils::{find_emphasis_markers, find_single_emphasis_spans, replace_inline_code};
5
+ use lazy_static::lazy_static;
6
+ use regex::Regex;
7
+
8
+ lazy_static! {
9
+ // Reference definition pattern - matches [ref]: url "title"
10
+ static ref REF_DEF_REGEX: Regex = Regex::new(
11
+ r#"(?m)^[ ]{0,3}\[([^\]]+)\]:\s*([^\s]+)(?:\s+(?:"([^"]*)"|'([^']*)'))?$"#
12
+ ).unwrap();
13
+ }
5
14
 
6
15
  mod md049_config;
7
16
  use md049_config::MD049Config;
@@ -32,6 +41,32 @@ impl MD049EmphasisStyle {
32
41
  Self { config }
33
42
  }
34
43
 
44
+ /// Check if a byte position is within a link (inline links, reference links, or reference definitions)
45
+ fn is_in_link(&self, ctx: &crate::lint_context::LintContext, byte_pos: usize) -> bool {
46
+ // Check inline and reference links
47
+ for link in &ctx.links {
48
+ if link.byte_offset <= byte_pos && byte_pos < link.byte_end {
49
+ return true;
50
+ }
51
+ }
52
+
53
+ // Check images (which use similar syntax)
54
+ for image in &ctx.images {
55
+ if image.byte_offset <= byte_pos && byte_pos < image.byte_end {
56
+ return true;
57
+ }
58
+ }
59
+
60
+ // Check reference definitions [ref]: url "title" using regex pattern
61
+ for m in REF_DEF_REGEX.find_iter(ctx.content) {
62
+ if m.start() <= byte_pos && byte_pos < m.end() {
63
+ return true;
64
+ }
65
+ }
66
+
67
+ false
68
+ }
69
+
35
70
  // Collect emphasis from a single line
36
71
  fn collect_emphasis_from_line(
37
72
  &self,
@@ -121,6 +156,9 @@ impl Rule for MD049EmphasisStyle {
121
156
  abs_pos += line.len() + 1;
122
157
  }
123
158
 
159
+ // Filter out emphasis markers that are inside links
160
+ emphasis_info.retain(|(_, abs_col, _, _)| !self.is_in_link(ctx, *abs_col));
161
+
124
162
  match self.config.style {
125
163
  EmphasisStyle::Consistent => {
126
164
  // If we have less than 2 emphasis nodes, no need to check consistency
@@ -271,4 +309,40 @@ mod tests {
271
309
  assert_eq!(EmphasisStyle::from("underscore"), EmphasisStyle::Underscore);
272
310
  assert_eq!(EmphasisStyle::from("other"), EmphasisStyle::Consistent);
273
311
  }
312
+
313
+ #[test]
314
+ fn test_emphasis_in_links_not_flagged() {
315
+ let rule = MD049EmphasisStyle::new(EmphasisStyle::Asterisk);
316
+ let content = r#"Check this [*asterisk*](https://example.com/*pattern*) link and [_underscore_](https://example.com/_private_).
317
+
318
+ Also see the [`__init__`][__init__] reference.
319
+
320
+ This should be _flagged_ since we're using asterisk style.
321
+
322
+ [__init__]: https://example.com/__init__.py"#;
323
+ let ctx = crate::lint_context::LintContext::new(content);
324
+ let result = rule.check(&ctx).unwrap();
325
+
326
+ // Only the real emphasis outside links should be flagged
327
+ assert_eq!(result.len(), 1);
328
+ assert!(result[0].message.contains("Emphasis should use * instead of _"));
329
+ // Should flag "_flagged_" but not emphasis patterns inside links
330
+ assert!(result[0].line == 5); // Line with "_flagged_"
331
+ }
332
+
333
+ #[test]
334
+ fn test_emphasis_in_links_vs_outside_links() {
335
+ let rule = MD049EmphasisStyle::new(EmphasisStyle::Underscore);
336
+ let content = r#"Check [*emphasis*](https://example.com/*test*) and inline *real emphasis* text.
337
+
338
+ [*link*]: https://example.com/*path*"#;
339
+ let ctx = crate::lint_context::LintContext::new(content);
340
+ let result = rule.check(&ctx).unwrap();
341
+
342
+ // Only the actual emphasis outside links should be flagged
343
+ assert_eq!(result.len(), 1);
344
+ assert!(result[0].message.contains("Emphasis should use _ instead of *"));
345
+ // Should be the "real emphasis" text on line 1
346
+ assert!(result[0].line == 1);
347
+ }
274
348
  }