rumdl 0.0.110__tar.gz → 0.0.112__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 (381) hide show
  1. {rumdl-0.0.110 → rumdl-0.0.112}/CHANGELOG.md +4 -1
  2. {rumdl-0.0.110 → rumdl-0.0.112}/Cargo.lock +1 -1
  3. {rumdl-0.0.110 → rumdl-0.0.112}/Cargo.toml +3 -1
  4. {rumdl-0.0.110 → rumdl-0.0.112}/PKG-INFO +1 -1
  5. rumdl-0.0.112/scripts/generate-downloads-table.sh +70 -0
  6. {rumdl-0.0.110 → rumdl-0.0.112}/src/lint_context.rs +15 -15
  7. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation.rs +50 -6
  8. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md031_blanks_around_fences.rs +5 -0
  9. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md033_no_inline_html.rs +62 -4
  10. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md037_spaces_around_emphasis.rs +11 -0
  11. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md058_blanks_around_tables.rs +35 -24
  12. rumdl-0.0.112/src/utils/kramdown_utils.rs +252 -0
  13. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/mod.rs +1 -0
  14. rumdl-0.0.112/tests/kramdown_integration_test.rs +365 -0
  15. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md005_test.rs +33 -0
  16. rumdl-0.0.112/tests/rules/md026_kramdown_test.rs +105 -0
  17. rumdl-0.0.112/tests/rules/md031_kramdown_test.rs +125 -0
  18. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md033_extended_test.rs +44 -44
  19. rumdl-0.0.112/tests/rules/md033_kramdown_test.rs +140 -0
  20. rumdl-0.0.112/tests/rules/md037_kramdown_test.rs +94 -0
  21. rumdl-0.0.112/tests/rules/md058_kramdown_test.rs +139 -0
  22. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/mod.rs +6 -0
  23. rumdl-0.0.110/src/bin/debug_frontmatter.rs +0 -42
  24. {rumdl-0.0.110 → rumdl-0.0.112}/.config/nextest.toml +0 -0
  25. {rumdl-0.0.110 → rumdl-0.0.112}/.mise.toml +0 -0
  26. {rumdl-0.0.110 → rumdl-0.0.112}/.pre-commit-config.yaml +0 -0
  27. {rumdl-0.0.110 → rumdl-0.0.112}/.rumdl.toml +0 -0
  28. {rumdl-0.0.110 → rumdl-0.0.112}/.rustfmt.toml +0 -0
  29. {rumdl-0.0.110 → rumdl-0.0.112}/LICENSE +0 -0
  30. {rumdl-0.0.110 → rumdl-0.0.112}/MANIFEST.in +0 -0
  31. {rumdl-0.0.110 → rumdl-0.0.112}/Makefile +0 -0
  32. {rumdl-0.0.110 → rumdl-0.0.112}/README.md +0 -0
  33. {rumdl-0.0.110 → rumdl-0.0.112}/assets/logo.png +0 -0
  34. {rumdl-0.0.110 → rumdl-0.0.112}/benches/fix_performance.rs +0 -0
  35. {rumdl-0.0.110 → rumdl-0.0.112}/benches/range_performance.rs +0 -0
  36. {rumdl-0.0.110 → rumdl-0.0.112}/benches/range_utils_benchmark.rs +0 -0
  37. {rumdl-0.0.110 → rumdl-0.0.112}/benches/rule_performance.rs +0 -0
  38. {rumdl-0.0.110 → rumdl-0.0.112}/benches/simple_fix_bench.rs +0 -0
  39. {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/bench_lint_context.rs +0 -0
  40. {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/benchmark.rs +0 -0
  41. {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/benchmark_rule.rs +0 -0
  42. {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  43. {rumdl-0.0.110 → rumdl-0.0.112}/benchmark/bin/measure_code_span_performance.rs +0 -0
  44. {rumdl-0.0.110 → rumdl-0.0.112}/docs/RULES.md +0 -0
  45. {rumdl-0.0.110 → rumdl-0.0.112}/docs/global-settings.md +0 -0
  46. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md001.md +0 -0
  47. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md002.md +0 -0
  48. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md003.md +0 -0
  49. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md004.md +0 -0
  50. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md005.md +0 -0
  51. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md006.md +0 -0
  52. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md007.md +0 -0
  53. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md009.md +0 -0
  54. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md010.md +0 -0
  55. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md011.md +0 -0
  56. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md012.md +0 -0
  57. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md013.md +0 -0
  58. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md014.md +0 -0
  59. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md018.md +0 -0
  60. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md019.md +0 -0
  61. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md020.md +0 -0
  62. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md021.md +0 -0
  63. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md022.md +0 -0
  64. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md023.md +0 -0
  65. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md024.md +0 -0
  66. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md025.md +0 -0
  67. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md026.md +0 -0
  68. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md027.md +0 -0
  69. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md028.md +0 -0
  70. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md029.md +0 -0
  71. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md030.md +0 -0
  72. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md031.md +0 -0
  73. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md032.md +0 -0
  74. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md033.md +0 -0
  75. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md034.md +0 -0
  76. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md035.md +0 -0
  77. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md036.md +0 -0
  78. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md037.md +0 -0
  79. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md038.md +0 -0
  80. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md039.md +0 -0
  81. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md040.md +0 -0
  82. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md041.md +0 -0
  83. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md042.md +0 -0
  84. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md043.md +0 -0
  85. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md044.md +0 -0
  86. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md045.md +0 -0
  87. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md046.md +0 -0
  88. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md047.md +0 -0
  89. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md048.md +0 -0
  90. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md049.md +0 -0
  91. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md050.md +0 -0
  92. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md051.md +0 -0
  93. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md052.md +0 -0
  94. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md053.md +0 -0
  95. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md054.md +0 -0
  96. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md055.md +0 -0
  97. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md056.md +0 -0
  98. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md057.md +0 -0
  99. {rumdl-0.0.110 → rumdl-0.0.112}/docs/md058.md +0 -0
  100. {rumdl-0.0.110 → rumdl-0.0.112}/docs/vscode-extension.md +0 -0
  101. {rumdl-0.0.110 → rumdl-0.0.112}/parity_check.py +0 -0
  102. {rumdl-0.0.110 → rumdl-0.0.112}/pyproject.toml +0 -0
  103. {rumdl-0.0.110 → rumdl-0.0.112}/python/MANIFEST.in +0 -0
  104. {rumdl-0.0.110 → rumdl-0.0.112}/python/PYTHON-README.md +0 -0
  105. {rumdl-0.0.110 → rumdl-0.0.112}/python/rumdl/__init__.py +0 -0
  106. {rumdl-0.0.110 → rumdl-0.0.112}/python/rumdl/__main__.py +0 -0
  107. {rumdl-0.0.110 → rumdl-0.0.112}/python/rumdl/py.typed +0 -0
  108. {rumdl-0.0.110 → rumdl-0.0.112}/rumdl.toml.example +0 -0
  109. {rumdl-0.0.110 → rumdl-0.0.112}/rust-toolchain.toml +0 -0
  110. {rumdl-0.0.110 → rumdl-0.0.112}/scripts/extract-changelog.sh +0 -0
  111. {rumdl-0.0.110 → rumdl-0.0.112}/scripts/prepare-release.sh +0 -0
  112. {rumdl-0.0.110 → rumdl-0.0.112}/scripts/setup-pre-commit.sh +0 -0
  113. {rumdl-0.0.110 → rumdl-0.0.112}/scripts/update-pre-commit-docs.sh +0 -0
  114. {rumdl-0.0.110 → rumdl-0.0.112}/src/config.rs +0 -0
  115. {rumdl-0.0.110 → rumdl-0.0.112}/src/exit_codes.rs +0 -0
  116. {rumdl-0.0.110 → rumdl-0.0.112}/src/inline_config.rs +0 -0
  117. {rumdl-0.0.110 → rumdl-0.0.112}/src/lib.rs +0 -0
  118. {rumdl-0.0.110 → rumdl-0.0.112}/src/lsp/mod.rs +0 -0
  119. {rumdl-0.0.110 → rumdl-0.0.112}/src/lsp/server.rs +0 -0
  120. {rumdl-0.0.110 → rumdl-0.0.112}/src/lsp/types.rs +0 -0
  121. {rumdl-0.0.110 → rumdl-0.0.112}/src/main.rs +0 -0
  122. {rumdl-0.0.110 → rumdl-0.0.112}/src/markdownlint_config.rs +0 -0
  123. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/azure.rs +0 -0
  124. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/concise.rs +0 -0
  125. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/github.rs +0 -0
  126. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/gitlab.rs +0 -0
  127. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/grouped.rs +0 -0
  128. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/json.rs +0 -0
  129. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/json_lines.rs +0 -0
  130. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/junit.rs +0 -0
  131. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/mod.rs +0 -0
  132. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/pylint.rs +0 -0
  133. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/sarif.rs +0 -0
  134. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/formatters/text.rs +0 -0
  135. {rumdl-0.0.110 → rumdl-0.0.112}/src/output/mod.rs +0 -0
  136. {rumdl-0.0.110 → rumdl-0.0.112}/src/parallel.rs +0 -0
  137. {rumdl-0.0.110 → rumdl-0.0.112}/src/performance.rs +0 -0
  138. {rumdl-0.0.110 → rumdl-0.0.112}/src/profiling.rs +0 -0
  139. {rumdl-0.0.110 → rumdl-0.0.112}/src/python.rs +0 -0
  140. {rumdl-0.0.110 → rumdl-0.0.112}/src/rule.rs +0 -0
  141. {rumdl-0.0.110 → rumdl-0.0.112}/src/rule_config.rs +0 -0
  142. {rumdl-0.0.110 → rumdl-0.0.112}/src/rule_config_serde.rs +0 -0
  143. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/blockquote_utils.rs +0 -0
  144. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/code_block_utils.rs +0 -0
  145. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/code_fence_utils.rs +0 -0
  146. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/emphasis_style.rs +0 -0
  147. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/front_matter_utils.rs +0 -0
  148. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/heading_utils.rs +0 -0
  149. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/list_utils.rs +0 -0
  150. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md001_heading_increment.rs +0 -0
  151. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  152. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md002_first_heading_h1.rs +0 -0
  153. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md003_heading_style/md003_config.rs +0 -0
  154. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md003_heading_style.rs +0 -0
  155. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  156. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md004_unordered_list_style.rs +0 -0
  157. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md005_list_indent.rs +0 -0
  158. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md006_start_bullets.rs +0 -0
  159. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  160. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md007_ul_indent.rs +0 -0
  161. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  162. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md009_trailing_spaces.rs +0 -0
  163. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  164. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs.rs +0 -0
  165. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md011_no_reversed_links.rs +0 -0
  166. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  167. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks.rs +0 -0
  168. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md013_line_length/md013_config.rs +0 -0
  169. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md013_line_length.rs +0 -0
  170. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  171. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md014_commands_show_output.rs +0 -0
  172. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md018_no_missing_space_atx.rs +0 -0
  173. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  174. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  175. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  176. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  177. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings.rs +0 -0
  178. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md023_heading_start_left.rs +0 -0
  179. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  180. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading.rs +0 -0
  181. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md025_single_title/md025_config.rs +0 -0
  182. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md025_single_title.rs +0 -0
  183. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  184. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  185. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  186. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  187. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix.rs +0 -0
  188. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  189. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md030_list_marker_space.rs +0 -0
  190. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md032_blanks_around_lists.rs +0 -0
  191. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  192. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md034_no_bare_urls.rs +0 -0
  193. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md035_hr_style/md035_config.rs +0 -0
  194. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md035_hr_style.rs +0 -0
  195. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  196. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  197. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md038_no_space_in_code.rs +0 -0
  198. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md039_no_space_in_links.rs +0 -0
  199. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md040_fenced_code_language.rs +0 -0
  200. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md041_first_line_heading.rs +0 -0
  201. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md042_no_empty_links.rs +0 -0
  202. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md043_required_headings.rs +0 -0
  203. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md044_proper_names/md044_config.rs +0 -0
  204. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md044_proper_names.rs +0 -0
  205. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  206. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md045_no_alt_text.rs +0 -0
  207. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  208. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md046_code_block_style.rs +0 -0
  209. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md047_single_trailing_newline.rs +0 -0
  210. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  211. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md048_code_fence_style.rs +0 -0
  212. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  213. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md049_emphasis_style.rs +0 -0
  214. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md050_strong_style/md050_config.rs +0 -0
  215. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md050_strong_style.rs +0 -0
  216. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md051_link_fragments.rs +0 -0
  217. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md052_reference_links_images.rs +0 -0
  218. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  219. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  220. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md054_link_image_style.rs +0 -0
  221. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  222. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md055_table_pipe_style.rs +0 -0
  223. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md056_table_column_count.rs +0 -0
  224. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  225. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/md057_existing_relative_links.rs +0 -0
  226. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/mod.rs +0 -0
  227. {rumdl-0.0.110 → rumdl-0.0.112}/src/rules/strong_style.rs +0 -0
  228. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/ast_utils.rs +0 -0
  229. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/code_block_utils.rs +0 -0
  230. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/document_structure.rs +0 -0
  231. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/early_returns.rs +0 -0
  232. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/element_cache.rs +0 -0
  233. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/emphasis_utils.rs +0 -0
  234. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/fix_utils.rs +0 -0
  235. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/markdown_elements.rs +0 -0
  236. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/range_utils.rs +0 -0
  237. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/regex_cache.rs +0 -0
  238. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/string_interner.rs +0 -0
  239. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/table_utils.rs +0 -0
  240. {rumdl-0.0.110 → rumdl-0.0.112}/src/utils/text_reflow.rs +0 -0
  241. {rumdl-0.0.110 → rumdl-0.0.112}/src/vscode.rs +0 -0
  242. {rumdl-0.0.110 → rumdl-0.0.112}/tests/advanced_integration_tests.rs +0 -0
  243. {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/additional_tests.rs +0 -0
  244. {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/basic_tests.rs +0 -0
  245. {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/comprehensive_tests.rs +0 -0
  246. {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/extended_tests.rs +0 -0
  247. {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/mod.rs +0 -0
  248. {rumdl-0.0.110 → rumdl-0.0.112}/tests/character_ranges/unicode_utils.rs +0 -0
  249. {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_duplication_test.rs +0 -0
  250. {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_explain_test.rs +0 -0
  251. {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_flag_precedence_test.rs +0 -0
  252. {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_integration_tests.rs +0 -0
  253. {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_lsp_fix_consistency.rs +0 -0
  254. {rumdl-0.0.110 → rumdl-0.0.112}/tests/cli_statistics_test.rs +0 -0
  255. {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/cli_test_utils.rs +0 -0
  256. {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/fixtures.rs +0 -0
  257. {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/mod.rs +0 -0
  258. {rumdl-0.0.110 → rumdl-0.0.112}/tests/common/test_utils.rs +0 -0
  259. {rumdl-0.0.110 → rumdl-0.0.112}/tests/commonmark_compliance_tests.rs +0 -0
  260. {rumdl-0.0.110 → rumdl-0.0.112}/tests/comprehensive_integration_tests.rs +0 -0
  261. {rumdl-0.0.110 → rumdl-0.0.112}/tests/comprehensive_output_format_tests.rs +0 -0
  262. {rumdl-0.0.110 → rumdl-0.0.112}/tests/config_application_tests.rs +0 -0
  263. {rumdl-0.0.110 → rumdl-0.0.112}/tests/config_file_command_test.rs +0 -0
  264. {rumdl-0.0.110 → rumdl-0.0.112}/tests/config_tests.rs +0 -0
  265. {rumdl-0.0.110 → rumdl-0.0.112}/tests/configuration_inheritance_tests.rs +0 -0
  266. {rumdl-0.0.110 → rumdl-0.0.112}/tests/consistency_regression_tests.rs +0 -0
  267. {rumdl-0.0.110 → rumdl-0.0.112}/tests/cross_platform_compatibility_tests.rs +0 -0
  268. {rumdl-0.0.110 → rumdl-0.0.112}/tests/deeply_nested_lists_performance_test.rs +0 -0
  269. {rumdl-0.0.110 → rumdl-0.0.112}/tests/escaped_brackets_test.rs +0 -0
  270. {rumdl-0.0.110 → rumdl-0.0.112}/tests/final_confidence_assessment.rs +0 -0
  271. {rumdl-0.0.110 → rumdl-0.0.112}/tests/init_command_test.rs +0 -0
  272. {rumdl-0.0.110 → rumdl-0.0.112}/tests/init_tests.rs +0 -0
  273. {rumdl-0.0.110 → rumdl-0.0.112}/tests/inline_config_blocks_test.rs +0 -0
  274. {rumdl-0.0.110 → rumdl-0.0.112}/tests/inline_config_test.rs +0 -0
  275. {rumdl-0.0.110 → rumdl-0.0.112}/tests/integration_tests.rs +0 -0
  276. {rumdl-0.0.110 → rumdl-0.0.112}/tests/json_output_test.rs +0 -0
  277. {rumdl-0.0.110 → rumdl-0.0.112}/tests/lib.rs +0 -0
  278. {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_editor_integration_tests.rs +0 -0
  279. {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_integration_tests.rs +0 -0
  280. {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_memory_leak_tests.rs +0 -0
  281. {rumdl-0.0.110 → rumdl-0.0.112}/tests/lsp_tests.rs +0 -0
  282. {rumdl-0.0.110 → rumdl-0.0.112}/tests/malformed_markdown_stress_tests.rs +0 -0
  283. {rumdl-0.0.110 → rumdl-0.0.112}/tests/markdownlint_cli_integration.rs +0 -0
  284. {rumdl-0.0.110 → rumdl-0.0.112}/tests/markdownlint_config_test.rs +0 -0
  285. {rumdl-0.0.110 → rumdl-0.0.112}/tests/markdownlintignore_test.rs +0 -0
  286. {rumdl-0.0.110 → rumdl-0.0.112}/tests/md013_reflow_integration_test.rs +0 -0
  287. {rumdl-0.0.110 → rumdl-0.0.112}/tests/nested_code_block_test.rs +0 -0
  288. {rumdl-0.0.110 → rumdl-0.0.112}/tests/output_format_integration_tests.rs +0 -0
  289. {rumdl-0.0.110 → rumdl-0.0.112}/tests/output_format_tests.rs +0 -0
  290. {rumdl-0.0.110 → rumdl-0.0.112}/tests/perf_check.rs +0 -0
  291. {rumdl-0.0.110 → rumdl-0.0.112}/tests/performance_validation_tests.rs +0 -0
  292. {rumdl-0.0.110 → rumdl-0.0.112}/tests/pyproject_config_tests.rs +0 -0
  293. {rumdl-0.0.110 → rumdl-0.0.112}/tests/python_bindings_test.rs +0 -0
  294. {rumdl-0.0.110 → rumdl-0.0.112}/tests/real_world_repository_tests.rs +0 -0
  295. {rumdl-0.0.110 → rumdl-0.0.112}/tests/regression_prevention_tests.rs +0 -0
  296. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  297. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/heading_edge_cases_test.rs +0 -0
  298. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  299. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/link_edge_cases_test.rs +0 -0
  300. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/list_rules_integration_test.rs +0 -0
  301. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md001_test.rs +0 -0
  302. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md001_unicode_test.rs +0 -0
  303. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md002_test.rs +0 -0
  304. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md003_test.rs +0 -0
  305. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md004_test.rs +0 -0
  306. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md005_unicode_test.rs +0 -0
  307. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md006_test.rs +0 -0
  308. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md006_unicode_test.rs +0 -0
  309. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md007_test.rs +0 -0
  310. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md009_test.rs +0 -0
  311. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md010_test.rs +0 -0
  312. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md011_test.rs +0 -0
  313. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md012_test.rs +0 -0
  314. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md013_test.rs +0 -0
  315. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md014_test.rs +0 -0
  316. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md018_test.rs +0 -0
  317. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md019_test.rs +0 -0
  318. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md020_test.rs +0 -0
  319. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md021_test.rs +0 -0
  320. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md022_test.rs +0 -0
  321. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md023_extended_test.rs +0 -0
  322. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md023_test.rs +0 -0
  323. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md024_test.rs +0 -0
  324. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md025_test.rs +0 -0
  325. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md026_test.rs +0 -0
  326. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md027_test.rs +0 -0
  327. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md028_test.rs +0 -0
  328. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md029_test.rs +0 -0
  329. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md029_unicode_test.rs +0 -0
  330. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md030_test.rs +0 -0
  331. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md031_test.rs +0 -0
  332. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md032_test.rs +0 -0
  333. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md033_test.rs +0 -0
  334. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md034_ipv6_test.rs +0 -0
  335. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md034_test.rs +0 -0
  336. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md035_test.rs +0 -0
  337. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md036_test.rs +0 -0
  338. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md037_test.rs +0 -0
  339. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md038_nested_backticks_test.rs +0 -0
  340. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md038_test.rs +0 -0
  341. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md039_test.rs +0 -0
  342. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md040_test.rs +0 -0
  343. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md041_test.rs +0 -0
  344. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md042_test.rs +0 -0
  345. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md043_test.rs +0 -0
  346. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md044_test.rs +0 -0
  347. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md045_test.rs +0 -0
  348. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md046_test.rs +0 -0
  349. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md047_test.rs +0 -0
  350. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md048_test.rs +0 -0
  351. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md049_test.rs +0 -0
  352. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md050_test.rs +0 -0
  353. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md051_test.rs +0 -0
  354. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md051_unicode_test.rs +0 -0
  355. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md052_test.rs +0 -0
  356. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md053_additional_test.rs +0 -0
  357. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md053_proptest.rs +0 -0
  358. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md053_test.rs +0 -0
  359. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md054_test.rs +0 -0
  360. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md054_unicode_test.rs +0 -0
  361. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md055_test.rs +0 -0
  362. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md056_test.rs +0 -0
  363. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md057_test.rs +0 -0
  364. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules/md058_test.rs +0 -0
  365. {rumdl-0.0.110 → rumdl-0.0.112}/tests/rules_mod_test.rs +0 -0
  366. {rumdl-0.0.110 → rumdl-0.0.112}/tests/thread_safety_tests.rs +0 -0
  367. {rumdl-0.0.110 → rumdl-0.0.112}/tests/unicode_edge_case_tests.rs +0 -0
  368. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/blockquote_utils_test.rs +0 -0
  369. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/code_block_utils_extended_test.rs +0 -0
  370. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/code_block_utils_test.rs +0 -0
  371. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/core_utils_test.rs +0 -0
  372. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/front_matter_utils_test.rs +0 -0
  373. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/line_index_test.rs +0 -0
  374. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils/mod.rs +0 -0
  375. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils_markdown_edge_cases.rs +0 -0
  376. {rumdl-0.0.110 → rumdl-0.0.112}/tests/utils_tests.rs +0 -0
  377. {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_extension_fixes.rs +0 -0
  378. {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_test.rs +0 -0
  379. {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_tests.rs +0 -0
  380. {rumdl-0.0.110 → rumdl-0.0.112}/tests/vscode_windows_comprehensive_test.rs +0 -0
  381. {rumdl-0.0.110 → rumdl-0.0.112}/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.112] - 2025-08-08
11
+
10
12
  ## [0.0.110] - 2025-08-08
11
13
 
12
14
  ## [0.0.110] - 2025-08-08
@@ -302,7 +304,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
302
304
 
303
305
  - Initial implementation of remaining rules for markdownlint parity
304
306
 
305
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.110...HEAD
307
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.112...HEAD
308
+ [0.0.112]: https://github.com/rvben/rumdl/compare/v0.0.111...v0.0.112
306
309
  [0.0.110]: https://github.com/rvben/rumdl/compare/v0.0.109...v0.0.110
307
310
  [0.0.110]: https://github.com/rvben/rumdl/compare/v0.0.109...v0.0.110
308
311
  [0.0.107]: https://github.com/rvben/rumdl/compare/v0.0.106...v0.0.107
@@ -1493,7 +1493,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1493
1493
 
1494
1494
  [[package]]
1495
1495
  name = "rumdl"
1496
- version = "0.0.110"
1496
+ version = "0.0.112"
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.110"
3
+ version = "0.0.112"
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)"
@@ -13,6 +13,8 @@ readme = "README.md"
13
13
  keywords = ["markdown", "linter", "markdown-linter", "static-analysis", "documentation"]
14
14
  categories = ["command-line-utilities", "development-tools", "text-processing"]
15
15
  exclude = [".github/", ".gitignore", "*.bak"]
16
+ autobins = false # Prevent automatic binary discovery in src/bin/
17
+ default-run = "rumdl" # Default binary for cargo run
16
18
 
17
19
  [lib]
18
20
  name = "rumdl"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.110
3
+ Version: 0.0.112
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -0,0 +1,70 @@
1
+ #!/bin/bash
2
+ # Generate a markdown table for release downloads
3
+
4
+ VERSION="${1:-}"
5
+ if [ -z "$VERSION" ]; then
6
+ echo "Usage: $0 <version>"
7
+ echo "Example: $0 v0.0.111"
8
+ exit 1
9
+ fi
10
+
11
+ # Start the markdown table
12
+ cat << 'EOF'
13
+ ## Downloads
14
+
15
+ | File | Platform | Checksum |
16
+ |------|----------|----------|
17
+ EOF
18
+
19
+ # Generate table rows for each platform
20
+ generate_row() {
21
+ local target="$1"
22
+ local platform="$2"
23
+
24
+ # Determine file extension based on platform
25
+ if [[ "$target" == *"windows"* ]]; then
26
+ ext="zip"
27
+ else
28
+ ext="tar.gz"
29
+ fi
30
+
31
+ filename="rumdl-${VERSION}-${target}.${ext}"
32
+ checksum_file="${filename}.sha256"
33
+
34
+ # Generate download URLs
35
+ download_url="https://github.com/rvben/rumdl/releases/download/${VERSION}/${filename}"
36
+ checksum_url="https://github.com/rvben/rumdl/releases/download/${VERSION}/${checksum_file}"
37
+
38
+ # Output table row
39
+ echo "| [${filename}](${download_url}) | ${platform} | [checksum](${checksum_url}) |"
40
+ }
41
+
42
+ # Generate rows for each platform
43
+ generate_row "x86_64-unknown-linux-gnu" "Linux x86_64"
44
+ generate_row "x86_64-unknown-linux-musl" "Linux x86_64 (musl)"
45
+ generate_row "aarch64-unknown-linux-gnu" "Linux ARM64"
46
+ generate_row "aarch64-unknown-linux-musl" "Linux ARM64 (musl)"
47
+ generate_row "x86_64-apple-darwin" "macOS x86_64"
48
+ generate_row "aarch64-apple-darwin" "macOS ARM64 (Apple Silicon)"
49
+ generate_row "x86_64-pc-windows-msvc" "Windows x86_64"
50
+
51
+ echo ""
52
+ echo "## Installation"
53
+ echo ""
54
+ echo "### Using uv (Recommended)"
55
+ echo '```bash'
56
+ echo 'uv tool install rumdl'
57
+ echo '```'
58
+ echo ""
59
+ echo "### Using pip"
60
+ echo '```bash'
61
+ echo 'pip install rumdl'
62
+ echo '```'
63
+ echo ""
64
+ echo "### Using pipx"
65
+ echo '```bash'
66
+ echo 'pipx install rumdl'
67
+ echo '```'
68
+ echo ""
69
+ echo "### Direct Download"
70
+ echo "Download the appropriate binary for your platform from the table above, extract it, and add it to your PATH."
@@ -906,6 +906,19 @@ impl<'a> LintContext<'a> {
906
906
  let content_lines: Vec<&str> = content.lines().collect();
907
907
  let mut lines = Vec::with_capacity(content_lines.len());
908
908
 
909
+ // Detect front matter boundaries FIRST, before any other parsing
910
+ let mut in_front_matter = false;
911
+ let mut front_matter_end = 0;
912
+ if content_lines.first().map(|l| l.trim()) == Some("---") {
913
+ in_front_matter = true;
914
+ for (idx, line) in content_lines.iter().enumerate().skip(1) {
915
+ if line.trim() == "---" {
916
+ front_matter_end = idx;
917
+ break;
918
+ }
919
+ }
920
+ }
921
+
909
922
  for (i, line) in content_lines.iter().enumerate() {
910
923
  let byte_offset = line_offsets.get(i).copied().unwrap_or(0);
911
924
  let indent = line.len() - line.trim_start().len();
@@ -933,8 +946,8 @@ impl<'a> LintContext<'a> {
933
946
  byte_offset >= start && byte_offset < end && (is_multiline || is_fenced || is_indented)
934
947
  });
935
948
 
936
- // Detect list items
937
- let list_item = if !in_code_block && !is_blank {
949
+ // Detect list items (skip if in frontmatter)
950
+ let list_item = if !(in_code_block || is_blank || in_front_matter && i <= front_matter_end) {
938
951
  // Strip blockquote prefix if present for list detection
939
952
  let (line_for_list_check, blockquote_prefix_len) = if let Some(caps) = BLOCKQUOTE_REGEX.captures(line) {
940
953
  let prefix = caps.get(1).unwrap().as_str();
@@ -1011,19 +1024,6 @@ impl<'a> LintContext<'a> {
1011
1024
  });
1012
1025
  }
1013
1026
 
1014
- // Detect front matter boundaries
1015
- let mut in_front_matter = false;
1016
- let mut front_matter_end = 0;
1017
- if content_lines.first().map(|l| l.trim()) == Some("---") {
1018
- in_front_matter = true;
1019
- for (idx, line) in content_lines.iter().enumerate().skip(1) {
1020
- if line.trim() == "---" {
1021
- front_matter_end = idx;
1022
- break;
1023
- }
1024
- }
1025
- }
1026
-
1027
1027
  // Second pass: detect headings (including Setext which needs look-ahead) and blockquotes
1028
1028
  for i in 0..content_lines.len() {
1029
1029
  if lines[i].in_code_block {
@@ -2,6 +2,7 @@
2
2
  ///
3
3
  /// See [docs/md026.md](../../docs/md026.md) for full documentation, configuration, and examples.
4
4
  use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, Severity};
5
+ use crate::utils::kramdown_utils::has_header_id;
5
6
  use crate::utils::range_utils::calculate_match_range;
6
7
  use lazy_static::lazy_static;
7
8
  use regex::Regex;
@@ -195,6 +196,16 @@ impl MD026NoTrailingPunctuation {
195
196
  let space = captures.get(3).unwrap().as_str();
196
197
  let content = captures.get(4).unwrap().as_str();
197
198
 
199
+ // If content has a valid Kramdown header ID, don't fix it
200
+ if has_header_id(content) {
201
+ // Return the line unchanged
202
+ if let Some(trailing) = captures.get(5) {
203
+ return format!("{}{}{}{}{}", indentation, hashes, space, content, trailing.as_str());
204
+ }
205
+ return format!("{indentation}{hashes}{space}{content}");
206
+ }
207
+
208
+ // Otherwise, remove trailing punctuation
198
209
  let fixed_content = self.remove_trailing_punctuation(content, re);
199
210
 
200
211
  // Preserve any trailing hashes if present
@@ -297,10 +308,26 @@ impl Rule for MD026NoTrailingPunctuation {
297
308
  continue;
298
309
  }
299
310
 
300
- // Check for trailing punctuation
301
- if self.has_trailing_punctuation(&heading.text, &re) {
311
+ // For headers with potential Kramdown syntax, we need to be more careful
312
+ let text_to_check = if has_header_id(&heading.text) {
313
+ // Valid Kramdown ID - skip this header entirely
314
+ continue;
315
+ } else if heading.text.contains("{") && heading.text.trim().ends_with("}") {
316
+ // Has curly braces but not a valid Kramdown ID
317
+ // Check for punctuation before the opening brace
318
+ if let Some(brace_pos) = heading.text.rfind('{') {
319
+ heading.text[..brace_pos].trim().to_string()
320
+ } else {
321
+ heading.text.clone()
322
+ }
323
+ } else {
324
+ // Regular header without Kramdown syntax
325
+ heading.text.clone()
326
+ };
327
+
328
+ if self.has_trailing_punctuation(&text_to_check, &re) {
302
329
  // Find the trailing punctuation
303
- if let Some(punctuation_match) = re.find(&heading.text) {
330
+ if let Some(punctuation_match) = re.find(&text_to_check) {
304
331
  let line = &line_info.content;
305
332
 
306
333
  // For ATX headings, find the punctuation position in the line
@@ -316,14 +343,14 @@ impl Rule for MD026NoTrailingPunctuation {
316
343
  punctuation_len,
317
344
  );
318
345
 
319
- let last_char = heading.text.chars().last().unwrap_or(' ');
346
+ let last_char = text_to_check.chars().last().unwrap_or(' ');
320
347
  warnings.push(LintWarning {
321
348
  rule_name: Some(self.name()),
322
349
  line: start_line,
323
350
  column: start_col,
324
351
  end_line,
325
352
  end_column: end_col,
326
- message: format!("Heading '{}' ends with punctuation '{}'", heading.text, last_char),
353
+ message: format!("Heading '{text_to_check}' ends with punctuation '{last_char}'"),
327
354
  severity: Severity::Warning,
328
355
  fix: Some(Fix {
329
356
  range: self.get_line_byte_range(content, line_num + 1),
@@ -386,8 +413,25 @@ impl Rule for MD026NoTrailingPunctuation {
386
413
  continue;
387
414
  }
388
415
 
416
+ // Handle headers with potential Kramdown syntax
417
+ let text_to_check = if has_header_id(&heading.text) {
418
+ // Valid Kramdown ID - skip this header entirely
419
+ continue;
420
+ } else if heading.text.contains("{") && heading.text.trim().ends_with("}") {
421
+ // Has curly braces but not a valid Kramdown ID
422
+ // Check for punctuation before the opening brace
423
+ if let Some(brace_pos) = heading.text.rfind('{') {
424
+ heading.text[..brace_pos].trim().to_string()
425
+ } else {
426
+ heading.text.clone()
427
+ }
428
+ } else {
429
+ // Regular header without Kramdown syntax
430
+ heading.text.clone()
431
+ };
432
+
389
433
  // Check and fix trailing punctuation
390
- if self.has_trailing_punctuation(&heading.text, &re) {
434
+ if self.has_trailing_punctuation(&text_to_check, &re) {
391
435
  fixed_lines[line_num] = if matches!(heading.style, crate::lint_context::HeadingStyle::ATX) {
392
436
  self.fix_atx_heading(&line_info.content, &re)
393
437
  } else {
@@ -4,6 +4,7 @@
4
4
  use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
5
5
  use crate::rule_config_serde::RuleConfig;
6
6
  use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
7
+ use crate::utils::kramdown_utils::is_kramdown_block_attribute;
7
8
  use crate::utils::range_utils::{LineIndex, calculate_line_range};
8
9
  use serde::{Deserialize, Serialize};
9
10
 
@@ -169,8 +170,10 @@ impl Rule for MD031BlanksAroundFences {
169
170
  current_fence_marker = None;
170
171
 
171
172
  // Check for blank line after closing fence
173
+ // Allow Kramdown block attributes if configured
172
174
  if i + 1 < lines.len()
173
175
  && !Self::is_empty_line(lines[i + 1])
176
+ && !is_kramdown_block_attribute(lines[i + 1])
174
177
  && self.should_require_blank_line(i, &lines)
175
178
  {
176
179
  let (start_line, start_col, end_line, end_col) = calculate_line_range(i + 1, lines[i]);
@@ -277,8 +280,10 @@ impl Rule for MD031BlanksAroundFences {
277
280
  current_fence_marker = None;
278
281
 
279
282
  // Add blank line after closing fence if needed
283
+ // Don't add if next line is a Kramdown block attribute
280
284
  if i + 1 < lines.len()
281
285
  && !Self::is_empty_line(lines[i + 1])
286
+ && !is_kramdown_block_attribute(lines[i + 1])
282
287
  && self.should_require_blank_line(i, &lines)
283
288
  {
284
289
  result.push(String::new());
@@ -5,6 +5,7 @@
5
5
 
6
6
  use crate::rule::{LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
7
7
  use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
8
+ use crate::utils::kramdown_utils::{is_kramdown_block_attribute, is_kramdown_extension};
8
9
  use crate::utils::range_utils::calculate_html_tag_range;
9
10
  use crate::utils::regex_cache::*;
10
11
  use lazy_static::lazy_static;
@@ -157,7 +158,13 @@ impl MD033NoInlineHtml {
157
158
  }
158
159
 
159
160
  /// Find HTML tags that span multiple lines
160
- fn find_multiline_html_tags(&self, content: &str, structure: &DocumentStructure, warnings: &mut Vec<LintWarning>) {
161
+ fn find_multiline_html_tags(
162
+ &self,
163
+ content: &str,
164
+ structure: &DocumentStructure,
165
+ nomarkdown_ranges: &[(usize, usize)],
166
+ warnings: &mut Vec<LintWarning>,
167
+ ) {
161
168
  // Early return: if content has no incomplete tags at line ends, skip processing
162
169
  if !content.contains('<') || !content.lines().any(|line| line.trim_end().ends_with('<')) {
163
170
  return;
@@ -178,6 +185,14 @@ impl MD033NoInlineHtml {
178
185
  continue;
179
186
  }
180
187
 
188
+ // Skip lines inside nomarkdown blocks
189
+ if nomarkdown_ranges
190
+ .iter()
191
+ .any(|(start, end)| line_num >= *start && line_num <= *end)
192
+ {
193
+ continue;
194
+ }
195
+
181
196
  // Early return: skip lines that don't end with incomplete tags
182
197
  if !line.contains('<') {
183
198
  continue;
@@ -288,7 +303,37 @@ impl Rule for MD033NoInlineHtml {
288
303
  let mut warnings = Vec::new();
289
304
  let lines: Vec<&str> = content.lines().collect();
290
305
 
291
- // First pass: find single-line HTML tags
306
+ // Track nomarkdown and comment blocks
307
+ let mut in_nomarkdown = false;
308
+ let mut in_comment = false;
309
+ let mut nomarkdown_ranges: Vec<(usize, usize)> = Vec::new();
310
+ let mut nomarkdown_start = 0;
311
+ let mut comment_start = 0;
312
+
313
+ // First pass: identify nomarkdown and comment blocks
314
+ for (i, line) in lines.iter().enumerate() {
315
+ let line_num = i + 1;
316
+
317
+ // Check for nomarkdown start
318
+ if line.trim() == "{::nomarkdown}" {
319
+ in_nomarkdown = true;
320
+ nomarkdown_start = line_num;
321
+ } else if line.trim() == "{:/nomarkdown}" && in_nomarkdown {
322
+ in_nomarkdown = false;
323
+ nomarkdown_ranges.push((nomarkdown_start, line_num));
324
+ }
325
+
326
+ // Check for comment blocks
327
+ if line.trim() == "{::comment}" {
328
+ in_comment = true;
329
+ comment_start = line_num;
330
+ } else if line.trim() == "{:/comment}" && in_comment {
331
+ in_comment = false;
332
+ nomarkdown_ranges.push((comment_start, line_num));
333
+ }
334
+ }
335
+
336
+ // Second pass: find single-line HTML tags
292
337
  // To match markdownlint behavior, report one warning per HTML tag
293
338
  for (i, line) in lines.iter().enumerate() {
294
339
  let line_num = i + 1;
@@ -305,6 +350,19 @@ impl Rule for MD033NoInlineHtml {
305
350
  continue;
306
351
  }
307
352
 
353
+ // Skip lines inside nomarkdown blocks
354
+ if nomarkdown_ranges
355
+ .iter()
356
+ .any(|(start, end)| line_num >= *start && line_num <= *end)
357
+ {
358
+ continue;
359
+ }
360
+
361
+ // Skip Kramdown extensions and block attributes
362
+ if is_kramdown_extension(line) || is_kramdown_block_attribute(line) {
363
+ continue;
364
+ }
365
+
308
366
  // Find all HTML tags in the line using regex
309
367
  for tag_match in HTML_TAG_FINDER.find_iter(line) {
310
368
  let tag = tag_match.as_str();
@@ -356,8 +414,8 @@ impl Rule for MD033NoInlineHtml {
356
414
  }
357
415
  }
358
416
 
359
- // Second pass: find multi-line HTML tags
360
- self.find_multiline_html_tags(ctx.content, structure, &mut warnings);
417
+ // Third pass: find multi-line HTML tags
418
+ self.find_multiline_html_tags(ctx.content, structure, &nomarkdown_ranges, &mut warnings);
361
419
 
362
420
  Ok(warnings)
363
421
  }
@@ -4,6 +4,7 @@
4
4
  use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, RuleCategory, Severity};
5
5
  use crate::utils::document_structure::{DocumentStructure, DocumentStructureExtensions};
6
6
  use crate::utils::emphasis_utils::{EmphasisSpan, find_emphasis_markers, find_emphasis_spans, has_doc_patterns};
7
+ use crate::utils::kramdown_utils::has_span_ial;
7
8
  use crate::utils::regex_cache::UNORDERED_LIST_MARKER_REGEX;
8
9
  use lazy_static::lazy_static;
9
10
  use regex::Regex;
@@ -330,6 +331,16 @@ impl MD037NoSpaceInEmphasis {
330
331
  let full_end = span.closing.end_pos();
331
332
  let full_text = &content[full_start..full_end];
332
333
 
334
+ // Skip if this emphasis has a Kramdown span IAL immediately after it
335
+ // (no space between emphasis and IAL)
336
+ if full_end < content.len() {
337
+ let remaining = &content[full_end..];
338
+ // Check if IAL starts immediately after the emphasis (no whitespace)
339
+ if remaining.starts_with('{') && has_span_ial(remaining.split_whitespace().next().unwrap_or("")) {
340
+ continue;
341
+ }
342
+ }
343
+
333
344
  // Create the marker string efficiently
334
345
  let marker_char = span.opening.as_char();
335
346
  let marker_str = if span.opening.count == 1 {
@@ -1,5 +1,6 @@
1
1
  use crate::rule::{Fix, LintError, LintResult, LintWarning, Rule, Severity};
2
2
  use crate::rule_config_serde::RuleConfig;
3
+ use crate::utils::kramdown_utils::is_kramdown_block_attribute;
3
4
  use crate::utils::range_utils::LineIndex;
4
5
  use crate::utils::table_utils::TableUtils;
5
6
  use serde::{Deserialize, Serialize};
@@ -149,31 +150,41 @@ impl Rule for MD058BlanksAroundTables {
149
150
 
150
151
  // Check for sufficient blank lines after table
151
152
  if table_block.end_line < lines.len() - 1 {
152
- let blank_lines_after = self.count_blank_lines_after(&lines, table_block.end_line);
153
- if blank_lines_after < self.config.minimum_after {
154
- let needed = self.config.minimum_after - blank_lines_after;
155
- let message = if self.config.minimum_after == 1 {
156
- "Missing blank line after table".to_string()
157
- } else {
158
- format!("Missing {needed} blank lines after table")
159
- };
153
+ // Check if the next line is a Kramdown block attribute
154
+ let next_line_is_attribute = if table_block.end_line + 1 < lines.len() {
155
+ is_kramdown_block_attribute(lines[table_block.end_line + 1])
156
+ } else {
157
+ false
158
+ };
160
159
 
161
- warnings.push(LintWarning {
162
- rule_name: Some(self.name()),
163
- message,
164
- line: table_block.end_line + 1,
165
- column: lines[table_block.end_line].len() + 1,
166
- end_line: table_block.end_line + 1,
167
- end_column: lines[table_block.end_line].len() + 2,
168
- severity: Severity::Warning,
169
- fix: Some(Fix {
170
- range: _line_index.line_col_to_byte_range(
171
- table_block.end_line + 1,
172
- lines[table_block.end_line].len() + 1,
173
- ),
174
- replacement: format!("{}{}", lines[table_block.end_line], "\n".repeat(needed)),
175
- }),
176
- });
160
+ // Skip check if next line is a block attribute
161
+ if !next_line_is_attribute {
162
+ let blank_lines_after = self.count_blank_lines_after(&lines, table_block.end_line);
163
+ if blank_lines_after < self.config.minimum_after {
164
+ let needed = self.config.minimum_after - blank_lines_after;
165
+ let message = if self.config.minimum_after == 1 {
166
+ "Missing blank line after table".to_string()
167
+ } else {
168
+ format!("Missing {needed} blank lines after table")
169
+ };
170
+
171
+ warnings.push(LintWarning {
172
+ rule_name: Some(self.name()),
173
+ message,
174
+ line: table_block.end_line + 1,
175
+ column: lines[table_block.end_line].len() + 1,
176
+ end_line: table_block.end_line + 1,
177
+ end_column: lines[table_block.end_line].len() + 2,
178
+ severity: Severity::Warning,
179
+ fix: Some(Fix {
180
+ range: _line_index.line_col_to_byte_range(
181
+ table_block.end_line + 1,
182
+ lines[table_block.end_line].len() + 1,
183
+ ),
184
+ replacement: format!("{}{}", lines[table_block.end_line], "\n".repeat(needed)),
185
+ }),
186
+ });
187
+ }
177
188
  }
178
189
  }
179
190
  }