rumdl 0.0.117__tar.gz → 0.0.118__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 (385) hide show
  1. {rumdl-0.0.117 → rumdl-0.0.118}/CHANGELOG.md +4 -1
  2. {rumdl-0.0.117 → rumdl-0.0.118}/Cargo.lock +3 -3
  3. {rumdl-0.0.117 → rumdl-0.0.118}/Cargo.toml +1 -1
  4. {rumdl-0.0.117 → rumdl-0.0.118}/PKG-INFO +1 -1
  5. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/kramdown_utils.rs +105 -9
  6. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md051_test.rs +54 -0
  7. {rumdl-0.0.117 → rumdl-0.0.118}/.config/nextest.toml +0 -0
  8. {rumdl-0.0.117 → rumdl-0.0.118}/.mise.toml +0 -0
  9. {rumdl-0.0.117 → rumdl-0.0.118}/.pre-commit-config.yaml +0 -0
  10. {rumdl-0.0.117 → rumdl-0.0.118}/.rumdl.toml +0 -0
  11. {rumdl-0.0.117 → rumdl-0.0.118}/.rustfmt.toml +0 -0
  12. {rumdl-0.0.117 → rumdl-0.0.118}/LICENSE +0 -0
  13. {rumdl-0.0.117 → rumdl-0.0.118}/MANIFEST.in +0 -0
  14. {rumdl-0.0.117 → rumdl-0.0.118}/Makefile +0 -0
  15. {rumdl-0.0.117 → rumdl-0.0.118}/README.md +0 -0
  16. {rumdl-0.0.117 → rumdl-0.0.118}/assets/logo.png +0 -0
  17. {rumdl-0.0.117 → rumdl-0.0.118}/benches/fix_performance.rs +0 -0
  18. {rumdl-0.0.117 → rumdl-0.0.118}/benches/range_performance.rs +0 -0
  19. {rumdl-0.0.117 → rumdl-0.0.118}/benches/range_utils_benchmark.rs +0 -0
  20. {rumdl-0.0.117 → rumdl-0.0.118}/benches/rule_performance.rs +0 -0
  21. {rumdl-0.0.117 → rumdl-0.0.118}/benches/simple_fix_bench.rs +0 -0
  22. {rumdl-0.0.117 → rumdl-0.0.118}/benchmark/bin/bench_lint_context.rs +0 -0
  23. {rumdl-0.0.117 → rumdl-0.0.118}/benchmark/bin/benchmark.rs +0 -0
  24. {rumdl-0.0.117 → rumdl-0.0.118}/benchmark/bin/benchmark_rule.rs +0 -0
  25. {rumdl-0.0.117 → rumdl-0.0.118}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  26. {rumdl-0.0.117 → rumdl-0.0.118}/benchmark/bin/measure_code_span_performance.rs +0 -0
  27. {rumdl-0.0.117 → rumdl-0.0.118}/docs/RULES.md +0 -0
  28. {rumdl-0.0.117 → rumdl-0.0.118}/docs/global-settings.md +0 -0
  29. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md001.md +0 -0
  30. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md002.md +0 -0
  31. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md003.md +0 -0
  32. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md004.md +0 -0
  33. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md005.md +0 -0
  34. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md006.md +0 -0
  35. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md007.md +0 -0
  36. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md009.md +0 -0
  37. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md010.md +0 -0
  38. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md011.md +0 -0
  39. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md012.md +0 -0
  40. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md013.md +0 -0
  41. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md014.md +0 -0
  42. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md018.md +0 -0
  43. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md019.md +0 -0
  44. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md020.md +0 -0
  45. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md021.md +0 -0
  46. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md022.md +0 -0
  47. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md023.md +0 -0
  48. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md024.md +0 -0
  49. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md025.md +0 -0
  50. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md026.md +0 -0
  51. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md027.md +0 -0
  52. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md028.md +0 -0
  53. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md029.md +0 -0
  54. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md030.md +0 -0
  55. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md031.md +0 -0
  56. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md032.md +0 -0
  57. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md033.md +0 -0
  58. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md034.md +0 -0
  59. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md035.md +0 -0
  60. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md036.md +0 -0
  61. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md037.md +0 -0
  62. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md038.md +0 -0
  63. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md039.md +0 -0
  64. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md040.md +0 -0
  65. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md041.md +0 -0
  66. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md042.md +0 -0
  67. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md043.md +0 -0
  68. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md044.md +0 -0
  69. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md045.md +0 -0
  70. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md046.md +0 -0
  71. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md047.md +0 -0
  72. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md048.md +0 -0
  73. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md049.md +0 -0
  74. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md050.md +0 -0
  75. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md051.md +0 -0
  76. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md052.md +0 -0
  77. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md053.md +0 -0
  78. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md054.md +0 -0
  79. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md055.md +0 -0
  80. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md056.md +0 -0
  81. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md057.md +0 -0
  82. {rumdl-0.0.117 → rumdl-0.0.118}/docs/md058.md +0 -0
  83. {rumdl-0.0.117 → rumdl-0.0.118}/docs/vscode-extension.md +0 -0
  84. {rumdl-0.0.117 → rumdl-0.0.118}/parity_check.py +0 -0
  85. {rumdl-0.0.117 → rumdl-0.0.118}/pyproject.toml +0 -0
  86. {rumdl-0.0.117 → rumdl-0.0.118}/python/MANIFEST.in +0 -0
  87. {rumdl-0.0.117 → rumdl-0.0.118}/python/PYTHON-README.md +0 -0
  88. {rumdl-0.0.117 → rumdl-0.0.118}/python/rumdl/__init__.py +0 -0
  89. {rumdl-0.0.117 → rumdl-0.0.118}/python/rumdl/__main__.py +0 -0
  90. {rumdl-0.0.117 → rumdl-0.0.118}/python/rumdl/py.typed +0 -0
  91. {rumdl-0.0.117 → rumdl-0.0.118}/rumdl.toml.example +0 -0
  92. {rumdl-0.0.117 → rumdl-0.0.118}/rust-toolchain.toml +0 -0
  93. {rumdl-0.0.117 → rumdl-0.0.118}/scripts/extract-changelog.sh +0 -0
  94. {rumdl-0.0.117 → rumdl-0.0.118}/scripts/generate-downloads-table.sh +0 -0
  95. {rumdl-0.0.117 → rumdl-0.0.118}/scripts/pre-release.sh +0 -0
  96. {rumdl-0.0.117 → rumdl-0.0.118}/scripts/prepare-release.sh +0 -0
  97. {rumdl-0.0.117 → rumdl-0.0.118}/scripts/setup-pre-commit.sh +0 -0
  98. {rumdl-0.0.117 → rumdl-0.0.118}/scripts/update-pre-commit-docs.sh +0 -0
  99. {rumdl-0.0.117 → rumdl-0.0.118}/src/config.rs +0 -0
  100. {rumdl-0.0.117 → rumdl-0.0.118}/src/exit_codes.rs +0 -0
  101. {rumdl-0.0.117 → rumdl-0.0.118}/src/inline_config.rs +0 -0
  102. {rumdl-0.0.117 → rumdl-0.0.118}/src/lib.rs +0 -0
  103. {rumdl-0.0.117 → rumdl-0.0.118}/src/lint_context.rs +0 -0
  104. {rumdl-0.0.117 → rumdl-0.0.118}/src/lsp/mod.rs +0 -0
  105. {rumdl-0.0.117 → rumdl-0.0.118}/src/lsp/server.rs +0 -0
  106. {rumdl-0.0.117 → rumdl-0.0.118}/src/lsp/types.rs +0 -0
  107. {rumdl-0.0.117 → rumdl-0.0.118}/src/main.rs +0 -0
  108. {rumdl-0.0.117 → rumdl-0.0.118}/src/markdownlint_config.rs +0 -0
  109. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/azure.rs +0 -0
  110. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/concise.rs +0 -0
  111. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/github.rs +0 -0
  112. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/gitlab.rs +0 -0
  113. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/grouped.rs +0 -0
  114. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/json.rs +0 -0
  115. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/json_lines.rs +0 -0
  116. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/junit.rs +0 -0
  117. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/mod.rs +0 -0
  118. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/pylint.rs +0 -0
  119. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/sarif.rs +0 -0
  120. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/formatters/text.rs +0 -0
  121. {rumdl-0.0.117 → rumdl-0.0.118}/src/output/mod.rs +0 -0
  122. {rumdl-0.0.117 → rumdl-0.0.118}/src/parallel.rs +0 -0
  123. {rumdl-0.0.117 → rumdl-0.0.118}/src/performance.rs +0 -0
  124. {rumdl-0.0.117 → rumdl-0.0.118}/src/profiling.rs +0 -0
  125. {rumdl-0.0.117 → rumdl-0.0.118}/src/python.rs +0 -0
  126. {rumdl-0.0.117 → rumdl-0.0.118}/src/rule.rs +0 -0
  127. {rumdl-0.0.117 → rumdl-0.0.118}/src/rule_config.rs +0 -0
  128. {rumdl-0.0.117 → rumdl-0.0.118}/src/rule_config_serde.rs +0 -0
  129. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/blockquote_utils.rs +0 -0
  130. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/code_block_utils.rs +0 -0
  131. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/code_fence_utils.rs +0 -0
  132. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/emphasis_style.rs +0 -0
  133. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/front_matter_utils.rs +0 -0
  134. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/heading_utils.rs +0 -0
  135. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/list_utils.rs +0 -0
  136. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md001_heading_increment.rs +0 -0
  137. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  138. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md002_first_heading_h1.rs +0 -0
  139. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md003_heading_style/md003_config.rs +0 -0
  140. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md003_heading_style.rs +0 -0
  141. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  142. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md004_unordered_list_style.rs +0 -0
  143. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md005_list_indent.rs +0 -0
  144. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md006_start_bullets.rs +0 -0
  145. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  146. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md007_ul_indent.rs +0 -0
  147. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  148. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md009_trailing_spaces.rs +0 -0
  149. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  150. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md010_no_hard_tabs.rs +0 -0
  151. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md011_no_reversed_links.rs +0 -0
  152. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  153. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md012_no_multiple_blanks.rs +0 -0
  154. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md013_line_length/md013_config.rs +0 -0
  155. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md013_line_length.rs +0 -0
  156. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  157. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md014_commands_show_output.rs +0 -0
  158. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md018_no_missing_space_atx.rs +0 -0
  159. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  160. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  161. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  162. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  163. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md022_blanks_around_headings.rs +0 -0
  164. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md023_heading_start_left.rs +0 -0
  165. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  166. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md024_no_duplicate_heading.rs +0 -0
  167. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md025_single_title/md025_config.rs +0 -0
  168. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md025_single_title.rs +0 -0
  169. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  170. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  171. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  172. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  173. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  174. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md029_ordered_list_prefix.rs +0 -0
  175. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  176. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md030_list_marker_space.rs +0 -0
  177. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md031_blanks_around_fences.rs +0 -0
  178. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md032_blanks_around_lists.rs +0 -0
  179. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  180. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md033_no_inline_html.rs +0 -0
  181. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md034_no_bare_urls.rs +0 -0
  182. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md035_hr_style/md035_config.rs +0 -0
  183. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md035_hr_style.rs +0 -0
  184. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  185. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  186. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  187. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md038_no_space_in_code.rs +0 -0
  188. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md039_no_space_in_links.rs +0 -0
  189. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md040_fenced_code_language.rs +0 -0
  190. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md041_first_line_heading.rs +0 -0
  191. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md042_no_empty_links.rs +0 -0
  192. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md043_required_headings.rs +0 -0
  193. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md044_proper_names/md044_config.rs +0 -0
  194. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md044_proper_names.rs +0 -0
  195. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  196. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md045_no_alt_text.rs +0 -0
  197. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  198. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md046_code_block_style.rs +0 -0
  199. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md047_single_trailing_newline.rs +0 -0
  200. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  201. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md048_code_fence_style.rs +0 -0
  202. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  203. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md049_emphasis_style.rs +0 -0
  204. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md050_strong_style/md050_config.rs +0 -0
  205. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md050_strong_style.rs +0 -0
  206. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md051_link_fragments.rs +0 -0
  207. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md052_reference_links_images.rs +0 -0
  208. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  209. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  210. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md054_link_image_style.rs +0 -0
  211. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  212. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md055_table_pipe_style.rs +0 -0
  213. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md056_table_column_count.rs +0 -0
  214. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  215. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md057_existing_relative_links.rs +0 -0
  216. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/md058_blanks_around_tables.rs +0 -0
  217. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/mod.rs +0 -0
  218. {rumdl-0.0.117 → rumdl-0.0.118}/src/rules/strong_style.rs +0 -0
  219. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/ast_utils.rs +0 -0
  220. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/code_block_utils.rs +0 -0
  221. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/document_structure.rs +0 -0
  222. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/early_returns.rs +0 -0
  223. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/element_cache.rs +0 -0
  224. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/emphasis_utils.rs +0 -0
  225. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/fix_utils.rs +0 -0
  226. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/markdown_elements.rs +0 -0
  227. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/mod.rs +0 -0
  228. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/range_utils.rs +0 -0
  229. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/regex_cache.rs +0 -0
  230. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/skip_context.rs +0 -0
  231. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/string_interner.rs +0 -0
  232. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/table_utils.rs +0 -0
  233. {rumdl-0.0.117 → rumdl-0.0.118}/src/utils/text_reflow.rs +0 -0
  234. {rumdl-0.0.117 → rumdl-0.0.118}/src/vscode.rs +0 -0
  235. {rumdl-0.0.117 → rumdl-0.0.118}/tests/advanced_integration_tests.rs +0 -0
  236. {rumdl-0.0.117 → rumdl-0.0.118}/tests/character_ranges/additional_tests.rs +0 -0
  237. {rumdl-0.0.117 → rumdl-0.0.118}/tests/character_ranges/basic_tests.rs +0 -0
  238. {rumdl-0.0.117 → rumdl-0.0.118}/tests/character_ranges/comprehensive_tests.rs +0 -0
  239. {rumdl-0.0.117 → rumdl-0.0.118}/tests/character_ranges/extended_tests.rs +0 -0
  240. {rumdl-0.0.117 → rumdl-0.0.118}/tests/character_ranges/mod.rs +0 -0
  241. {rumdl-0.0.117 → rumdl-0.0.118}/tests/character_ranges/unicode_utils.rs +0 -0
  242. {rumdl-0.0.117 → rumdl-0.0.118}/tests/cli_duplication_test.rs +0 -0
  243. {rumdl-0.0.117 → rumdl-0.0.118}/tests/cli_explain_test.rs +0 -0
  244. {rumdl-0.0.117 → rumdl-0.0.118}/tests/cli_flag_precedence_test.rs +0 -0
  245. {rumdl-0.0.117 → rumdl-0.0.118}/tests/cli_integration_tests.rs +0 -0
  246. {rumdl-0.0.117 → rumdl-0.0.118}/tests/cli_lsp_fix_consistency.rs +0 -0
  247. {rumdl-0.0.117 → rumdl-0.0.118}/tests/cli_statistics_test.rs +0 -0
  248. {rumdl-0.0.117 → rumdl-0.0.118}/tests/common/cli_test_utils.rs +0 -0
  249. {rumdl-0.0.117 → rumdl-0.0.118}/tests/common/fixtures.rs +0 -0
  250. {rumdl-0.0.117 → rumdl-0.0.118}/tests/common/mod.rs +0 -0
  251. {rumdl-0.0.117 → rumdl-0.0.118}/tests/common/test_utils.rs +0 -0
  252. {rumdl-0.0.117 → rumdl-0.0.118}/tests/commonmark_compliance_tests.rs +0 -0
  253. {rumdl-0.0.117 → rumdl-0.0.118}/tests/comprehensive_integration_tests.rs +0 -0
  254. {rumdl-0.0.117 → rumdl-0.0.118}/tests/comprehensive_output_format_tests.rs +0 -0
  255. {rumdl-0.0.117 → rumdl-0.0.118}/tests/config_application_tests.rs +0 -0
  256. {rumdl-0.0.117 → rumdl-0.0.118}/tests/config_file_command_test.rs +0 -0
  257. {rumdl-0.0.117 → rumdl-0.0.118}/tests/config_tests.rs +0 -0
  258. {rumdl-0.0.117 → rumdl-0.0.118}/tests/configuration_inheritance_tests.rs +0 -0
  259. {rumdl-0.0.117 → rumdl-0.0.118}/tests/consistency_regression_tests.rs +0 -0
  260. {rumdl-0.0.117 → rumdl-0.0.118}/tests/cross_platform_compatibility_tests.rs +0 -0
  261. {rumdl-0.0.117 → rumdl-0.0.118}/tests/deeply_nested_lists_performance_test.rs +0 -0
  262. {rumdl-0.0.117 → rumdl-0.0.118}/tests/escaped_brackets_test.rs +0 -0
  263. {rumdl-0.0.117 → rumdl-0.0.118}/tests/final_confidence_assessment.rs +0 -0
  264. {rumdl-0.0.117 → rumdl-0.0.118}/tests/fixable_unfixable_config_test.rs +0 -0
  265. {rumdl-0.0.117 → rumdl-0.0.118}/tests/init_command_test.rs +0 -0
  266. {rumdl-0.0.117 → rumdl-0.0.118}/tests/init_tests.rs +0 -0
  267. {rumdl-0.0.117 → rumdl-0.0.118}/tests/inline_config_blocks_test.rs +0 -0
  268. {rumdl-0.0.117 → rumdl-0.0.118}/tests/inline_config_test.rs +0 -0
  269. {rumdl-0.0.117 → rumdl-0.0.118}/tests/integration_tests.rs +0 -0
  270. {rumdl-0.0.117 → rumdl-0.0.118}/tests/json_output_test.rs +0 -0
  271. {rumdl-0.0.117 → rumdl-0.0.118}/tests/kramdown_integration_test.rs +0 -0
  272. {rumdl-0.0.117 → rumdl-0.0.118}/tests/lib.rs +0 -0
  273. {rumdl-0.0.117 → rumdl-0.0.118}/tests/lsp_editor_integration_tests.rs +0 -0
  274. {rumdl-0.0.117 → rumdl-0.0.118}/tests/lsp_integration_tests.rs +0 -0
  275. {rumdl-0.0.117 → rumdl-0.0.118}/tests/lsp_memory_leak_tests.rs +0 -0
  276. {rumdl-0.0.117 → rumdl-0.0.118}/tests/lsp_tests.rs +0 -0
  277. {rumdl-0.0.117 → rumdl-0.0.118}/tests/malformed_markdown_stress_tests.rs +0 -0
  278. {rumdl-0.0.117 → rumdl-0.0.118}/tests/markdownlint_cli_integration.rs +0 -0
  279. {rumdl-0.0.117 → rumdl-0.0.118}/tests/markdownlint_config_test.rs +0 -0
  280. {rumdl-0.0.117 → rumdl-0.0.118}/tests/markdownlintignore_test.rs +0 -0
  281. {rumdl-0.0.117 → rumdl-0.0.118}/tests/md013_reflow_integration_test.rs +0 -0
  282. {rumdl-0.0.117 → rumdl-0.0.118}/tests/nested_code_block_test.rs +0 -0
  283. {rumdl-0.0.117 → rumdl-0.0.118}/tests/output_format_integration_tests.rs +0 -0
  284. {rumdl-0.0.117 → rumdl-0.0.118}/tests/output_format_tests.rs +0 -0
  285. {rumdl-0.0.117 → rumdl-0.0.118}/tests/perf_check.rs +0 -0
  286. {rumdl-0.0.117 → rumdl-0.0.118}/tests/performance_validation_tests.rs +0 -0
  287. {rumdl-0.0.117 → rumdl-0.0.118}/tests/pyproject_config_tests.rs +0 -0
  288. {rumdl-0.0.117 → rumdl-0.0.118}/tests/python_bindings_test.rs +0 -0
  289. {rumdl-0.0.117 → rumdl-0.0.118}/tests/real_world_repository_tests.rs +0 -0
  290. {rumdl-0.0.117 → rumdl-0.0.118}/tests/regression_prevention_tests.rs +0 -0
  291. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  292. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/heading_edge_cases_test.rs +0 -0
  293. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  294. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/link_edge_cases_test.rs +0 -0
  295. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/list_rules_integration_test.rs +0 -0
  296. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md001_test.rs +0 -0
  297. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md001_unicode_test.rs +0 -0
  298. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md002_test.rs +0 -0
  299. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md003_test.rs +0 -0
  300. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md004_test.rs +0 -0
  301. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md005_test.rs +0 -0
  302. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md005_unicode_test.rs +0 -0
  303. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md006_test.rs +0 -0
  304. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md006_unicode_test.rs +0 -0
  305. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md007_test.rs +0 -0
  306. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md009_test.rs +0 -0
  307. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md010_test.rs +0 -0
  308. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md011_test.rs +0 -0
  309. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md012_test.rs +0 -0
  310. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md013_test.rs +0 -0
  311. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md014_test.rs +0 -0
  312. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md018_test.rs +0 -0
  313. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md019_test.rs +0 -0
  314. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md020_test.rs +0 -0
  315. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md021_test.rs +0 -0
  316. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md022_test.rs +0 -0
  317. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md023_extended_test.rs +0 -0
  318. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md023_test.rs +0 -0
  319. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md024_test.rs +0 -0
  320. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md025_test.rs +0 -0
  321. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md026_kramdown_test.rs +0 -0
  322. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md026_test.rs +0 -0
  323. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md027_test.rs +0 -0
  324. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md028_test.rs +0 -0
  325. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md029_issue42_test.rs +0 -0
  326. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md029_test.rs +0 -0
  327. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md029_unicode_test.rs +0 -0
  328. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md030_test.rs +0 -0
  329. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md031_kramdown_test.rs +0 -0
  330. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md031_test.rs +0 -0
  331. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md032_test.rs +0 -0
  332. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md033_extended_test.rs +0 -0
  333. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md033_kramdown_test.rs +0 -0
  334. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md033_test.rs +0 -0
  335. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md034_ipv6_test.rs +0 -0
  336. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md034_test.rs +0 -0
  337. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md035_test.rs +0 -0
  338. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md036_test.rs +0 -0
  339. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md037_kramdown_test.rs +0 -0
  340. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md037_test.rs +0 -0
  341. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md038_nested_backticks_test.rs +0 -0
  342. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md038_test.rs +0 -0
  343. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md039_test.rs +0 -0
  344. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md040_test.rs +0 -0
  345. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md041_test.rs +0 -0
  346. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md042_test.rs +0 -0
  347. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md043_test.rs +0 -0
  348. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md044_test.rs +0 -0
  349. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md045_test.rs +0 -0
  350. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md046_test.rs +0 -0
  351. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md047_test.rs +0 -0
  352. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md048_test.rs +0 -0
  353. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md049_test.rs +0 -0
  354. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md050_test.rs +0 -0
  355. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md051_unicode_test.rs +0 -0
  356. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md052_test.rs +0 -0
  357. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md053_additional_test.rs +0 -0
  358. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md053_proptest.rs +0 -0
  359. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md053_test.rs +0 -0
  360. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md054_test.rs +0 -0
  361. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md054_unicode_test.rs +0 -0
  362. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md055_test.rs +0 -0
  363. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md056_test.rs +0 -0
  364. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md057_test.rs +0 -0
  365. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md058_kramdown_test.rs +0 -0
  366. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/md058_test.rs +0 -0
  367. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules/mod.rs +0 -0
  368. {rumdl-0.0.117 → rumdl-0.0.118}/tests/rules_mod_test.rs +0 -0
  369. {rumdl-0.0.117 → rumdl-0.0.118}/tests/skip_context_tests.rs +0 -0
  370. {rumdl-0.0.117 → rumdl-0.0.118}/tests/thread_safety_tests.rs +0 -0
  371. {rumdl-0.0.117 → rumdl-0.0.118}/tests/unicode_edge_case_tests.rs +0 -0
  372. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils/blockquote_utils_test.rs +0 -0
  373. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils/code_block_utils_extended_test.rs +0 -0
  374. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils/code_block_utils_test.rs +0 -0
  375. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils/core_utils_test.rs +0 -0
  376. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils/front_matter_utils_test.rs +0 -0
  377. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils/line_index_test.rs +0 -0
  378. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils/mod.rs +0 -0
  379. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils_markdown_edge_cases.rs +0 -0
  380. {rumdl-0.0.117 → rumdl-0.0.118}/tests/utils_tests.rs +0 -0
  381. {rumdl-0.0.117 → rumdl-0.0.118}/tests/vscode_extension_fixes.rs +0 -0
  382. {rumdl-0.0.117 → rumdl-0.0.118}/tests/vscode_test.rs +0 -0
  383. {rumdl-0.0.117 → rumdl-0.0.118}/tests/vscode_tests.rs +0 -0
  384. {rumdl-0.0.117 → rumdl-0.0.118}/tests/vscode_windows_comprehensive_test.rs +0 -0
  385. {rumdl-0.0.117 → rumdl-0.0.118}/tests/vscode_windows_test.rs +0 -0
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.0.118] - 2025-08-14
11
+
10
12
  ## [0.0.117] - 2025-08-14
11
13
 
12
14
  ### Fixed
@@ -335,7 +337,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
335
337
 
336
338
  - Initial implementation of remaining rules for markdownlint parity
337
339
 
338
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.117...HEAD
340
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.118...HEAD
341
+ [0.0.118]: https://github.com/rvben/rumdl/compare/v0.0.117...v0.0.118
339
342
  [0.0.117]: https://github.com/rvben/rumdl/compare/v0.0.116...v0.0.117
340
343
  [0.0.116]: https://github.com/rvben/rumdl/compare/v0.0.115...v0.0.116
341
344
  [0.0.115]: https://github.com/rvben/rumdl/compare/v0.0.114...v0.0.115
@@ -121,9 +121,9 @@ dependencies = [
121
121
 
122
122
  [[package]]
123
123
  name = "async-trait"
124
- version = "0.1.88"
124
+ version = "0.1.89"
125
125
  source = "registry+https://github.com/rust-lang/crates.io-index"
126
- checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
126
+ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
127
127
  dependencies = [
128
128
  "proc-macro2",
129
129
  "quote",
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1493
1493
 
1494
1494
  [[package]]
1495
1495
  name = "rumdl"
1496
- version = "0.0.117"
1496
+ version = "0.0.118"
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.117"
3
+ version = "0.0.118"
4
4
  edition = "2024"
5
5
  rust-version = "1.89.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.117
3
+ Version: 0.0.118
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -10,10 +10,11 @@ lazy_static! {
10
10
  /// Pattern for Kramdown span IAL: text{:.class #id key="value"}
11
11
  static ref SPAN_IAL_PATTERN: Regex = Regex::new(r"\{[:\.#][^}]*\}$").unwrap();
12
12
 
13
- /// Pattern for Kramdown header IDs: # Header {#custom-id}
13
+ /// Pattern for custom header IDs supporting both kramdown and python-markdown attr-list formats
14
+ /// Supports: {#id}, { #id }, {:#id}, {: #id } (all variations with optional colon and spaces)
14
15
  /// Permissive but safe: Unicode letters/numbers, hyphens, underscores, colons (Kramdown allows)
15
- /// Rejects: spaces, quotes, brackets, HTML/CSS special chars
16
- static ref HEADER_ID_PATTERN: Regex = Regex::new(r"\s*\{#[\w\-:]+\}\s*$").unwrap();
16
+ /// Rejects: spaces in ID, quotes, brackets, HTML/CSS special chars
17
+ static ref HEADER_ID_PATTERN: Regex = Regex::new(r"\s*\{\s*:?\s*#\s*[\w\-:]+\s*\}\s*$").unwrap();
17
18
 
18
19
  /// Pattern for Kramdown extensions opening: {::comment}, {::nomarkdown}, etc.
19
20
  static ref EXTENSION_OPEN_PATTERN: Regex = Regex::new(r"^\s*\{::([a-z]+)(?:\s+[^}]*)?\}\s*$").unwrap();
@@ -119,6 +120,12 @@ pub fn remove_header_id(line: &str) -> String {
119
120
  /// Extract custom header ID from a heading line
120
121
  /// Returns a tuple of (clean_text, Option<custom_id>)
121
122
  ///
123
+ /// Supports both kramdown and python-markdown attr-list formats:
124
+ /// - `{#custom-id}` (kramdown style)
125
+ /// - `{ #custom-id }` (attr-list with spaces)
126
+ /// - `{:#custom-id}` (attr-list with colon)
127
+ /// - `{: #custom-id }` (attr-list with colon and spaces)
128
+ ///
122
129
  /// # Examples
123
130
  /// ```
124
131
  /// use rumdl::utils::kramdown_utils::extract_header_id;
@@ -127,6 +134,14 @@ pub fn remove_header_id(line: &str) -> String {
127
134
  /// assert_eq!(text, "## Header");
128
135
  /// assert_eq!(id, Some("custom-id".to_string()));
129
136
  ///
137
+ /// let (text, id) = extract_header_id("## Header { #spaced-id }");
138
+ /// assert_eq!(text, "## Header");
139
+ /// assert_eq!(id, Some("spaced-id".to_string()));
140
+ ///
141
+ /// let (text, id) = extract_header_id("## Header {: #colon-id }");
142
+ /// assert_eq!(text, "## Header");
143
+ /// assert_eq!(id, Some("colon-id".to_string()));
144
+ ///
130
145
  /// let (text, id) = extract_header_id("## Normal Header");
131
146
  /// assert_eq!(text, "## Normal Header");
132
147
  /// assert_eq!(id, None);
@@ -138,13 +153,21 @@ pub fn extract_header_id(line: &str) -> (String, Option<String>) {
138
153
  // Extract the clean text without the ID
139
154
  let clean_text = line[..id_match.start()].trim_end().to_string();
140
155
 
141
- // Extract the ID from {#custom-id} format
156
+ // Extract the ID from various formats: {#id}, { #id }, {:#id}, {: #id }
142
157
  let id_str = id_match.as_str().trim();
143
- let id = id_str
144
- .trim_start_matches('{')
145
- .trim_end_matches('}')
146
- .trim_start_matches('#')
147
- .to_string();
158
+
159
+ // Remove braces and extract content
160
+ let inner = id_str.trim_start_matches('{').trim_end_matches('}').trim();
161
+
162
+ // Handle optional colon and find the hash
163
+ let after_colon = if inner.starts_with(':') {
164
+ inner.trim_start_matches(':').trim()
165
+ } else {
166
+ inner
167
+ };
168
+
169
+ // Extract ID after hash
170
+ let id = after_colon.trim_start_matches('#').trim().to_string();
148
171
 
149
172
  return (clean_text, Some(id));
150
173
  }
@@ -286,4 +309,77 @@ mod tests {
286
309
  assert!(is_kramdown_block_attribute("\t{:#id}\t"));
287
310
  assert!(is_kramdown_block_attribute(" {:.class #id} "));
288
311
  }
312
+
313
+ #[test]
314
+ fn test_header_id_detection() {
315
+ // Kramdown style (original format)
316
+ assert!(has_header_id("# Header {#custom-id}"));
317
+ assert!(has_header_id("## Section {#section-1}"));
318
+
319
+ // Python-markdown attr-list with spaces
320
+ assert!(has_header_id("# Header { #spaced-id }"));
321
+ assert!(has_header_id("## Section { #section-with-spaces }"));
322
+
323
+ // Python-markdown attr-list with colon
324
+ assert!(has_header_id("# Header {:#colon-id}"));
325
+ assert!(has_header_id("## Section {: #colon-with-spaces }"));
326
+
327
+ // Combined colon and spaces
328
+ assert!(has_header_id("# Header {: #full-format }"));
329
+
330
+ // Should not match
331
+ assert!(!has_header_id("# Regular Header"));
332
+ assert!(!has_header_id("# Header { no hash }"));
333
+ assert!(!has_header_id("# Header {#}")); // Empty ID
334
+ }
335
+
336
+ #[test]
337
+ fn test_header_id_extraction() {
338
+ // Kramdown style (original format)
339
+ let (text, id) = extract_header_id("## Header {#test-id}");
340
+ assert_eq!(text, "## Header");
341
+ assert_eq!(id, Some("test-id".to_string()));
342
+
343
+ // Python-markdown attr-list with spaces
344
+ let (text, id) = extract_header_id("# Title { #spaced-id }");
345
+ assert_eq!(text, "# Title");
346
+ assert_eq!(id, Some("spaced-id".to_string()));
347
+
348
+ // Python-markdown attr-list with colon (no spaces)
349
+ let (text, id) = extract_header_id("### Subsection {:#compact-colon}");
350
+ assert_eq!(text, "### Subsection");
351
+ assert_eq!(id, Some("compact-colon".to_string()));
352
+
353
+ // Python-markdown attr-list with colon and spaces
354
+ let (text, id) = extract_header_id("#### Deep Section {: #colon-spaces }");
355
+ assert_eq!(text, "#### Deep Section");
356
+ assert_eq!(id, Some("colon-spaces".to_string()));
357
+
358
+ // No header ID
359
+ let (text, id) = extract_header_id("## Normal Header");
360
+ assert_eq!(text, "## Normal Header");
361
+ assert_eq!(id, None);
362
+
363
+ // Complex ID with allowed characters
364
+ let (text, id) = extract_header_id("# Header {#complex-id_with:colons}");
365
+ assert_eq!(text, "# Header");
366
+ assert_eq!(id, Some("complex-id_with:colons".to_string()));
367
+ }
368
+
369
+ #[test]
370
+ fn test_header_id_edge_cases() {
371
+ // Test that extra spaces are handled correctly
372
+ let (text, id) = extract_header_id("# Header { : # extra-spaces }");
373
+ assert_eq!(text, "# Header");
374
+ assert_eq!(id, Some("extra-spaces".to_string()));
375
+
376
+ // Test minimal format variations
377
+ let (text, id) = extract_header_id("# Header {#a}");
378
+ assert_eq!(text, "# Header");
379
+ assert_eq!(id, Some("a".to_string()));
380
+
381
+ let (text, id) = extract_header_id("# Header {:# b}");
382
+ assert_eq!(text, "# Header");
383
+ assert_eq!(id, Some("b".to_string()));
384
+ }
289
385
  }
@@ -1146,3 +1146,57 @@ fn test_performance_with_many_links() {
1146
1146
  ctx.links.len()
1147
1147
  );
1148
1148
  }
1149
+
1150
+ #[test]
1151
+ fn test_custom_header_id_formats() {
1152
+ // Test all supported custom header ID formats
1153
+ let content = r#"# Kramdown Style {#kramdown-id}
1154
+
1155
+ Some content here.
1156
+
1157
+ ## Python-markdown with spaces { #spaced-id }
1158
+
1159
+ More content.
1160
+
1161
+ ### Python-markdown with colon {:#colon-id}
1162
+
1163
+ Even more content.
1164
+
1165
+ #### Python-markdown full format {: #full-format }
1166
+
1167
+ Final content.
1168
+
1169
+ Links to test all formats:
1170
+ - [Link to kramdown](#kramdown-id)
1171
+ - [Link to spaced](#spaced-id)
1172
+ - [Link to colon](#colon-id)
1173
+ - [Link to full format](#full-format)
1174
+
1175
+ Links that should fail:
1176
+ - [Link to nonexistent](#nonexistent-id)
1177
+ "#;
1178
+
1179
+ let ctx = LintContext::new(content);
1180
+ let rule = MD051LinkFragments::new();
1181
+ let result = rule.check(&ctx).unwrap();
1182
+
1183
+ // Should only flag the nonexistent fragment
1184
+ assert_eq!(result.len(), 1, "Expected 1 warning for nonexistent fragment");
1185
+ assert!(
1186
+ result[0].message.contains("nonexistent-id"),
1187
+ "Warning should be about nonexistent fragment, got: {}",
1188
+ result[0].message
1189
+ );
1190
+
1191
+ // All valid custom ID formats should be recognized
1192
+ for warning in &result {
1193
+ assert!(
1194
+ !warning.message.contains("kramdown-id")
1195
+ && !warning.message.contains("spaced-id")
1196
+ && !warning.message.contains("colon-id")
1197
+ && !warning.message.contains("full-format"),
1198
+ "Valid custom ID format should not be flagged as missing: {}",
1199
+ warning.message
1200
+ );
1201
+ }
1202
+ }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes