rumdl 0.0.111__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 (382) hide show
  1. {rumdl-0.0.111 → rumdl-0.0.112}/CHANGELOG.md +4 -1
  2. {rumdl-0.0.111 → rumdl-0.0.112}/Cargo.lock +1 -1
  3. {rumdl-0.0.111 → rumdl-0.0.112}/Cargo.toml +3 -1
  4. {rumdl-0.0.111 → rumdl-0.0.112}/PKG-INFO +1 -1
  5. rumdl-0.0.112/scripts/generate-downloads-table.sh +70 -0
  6. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation.rs +50 -6
  7. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md033_no_inline_html.rs +62 -4
  8. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md037_spaces_around_emphasis.rs +11 -0
  9. rumdl-0.0.112/src/utils/kramdown_utils.rs +252 -0
  10. rumdl-0.0.112/tests/kramdown_integration_test.rs +365 -0
  11. rumdl-0.0.112/tests/rules/md026_kramdown_test.rs +105 -0
  12. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md033_extended_test.rs +44 -44
  13. rumdl-0.0.112/tests/rules/md033_kramdown_test.rs +140 -0
  14. rumdl-0.0.112/tests/rules/md037_kramdown_test.rs +94 -0
  15. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/mod.rs +4 -0
  16. rumdl-0.0.111/src/bin/debug_frontmatter.rs +0 -42
  17. rumdl-0.0.111/src/utils/kramdown_utils.rs +0 -94
  18. {rumdl-0.0.111 → rumdl-0.0.112}/.config/nextest.toml +0 -0
  19. {rumdl-0.0.111 → rumdl-0.0.112}/.mise.toml +0 -0
  20. {rumdl-0.0.111 → rumdl-0.0.112}/.pre-commit-config.yaml +0 -0
  21. {rumdl-0.0.111 → rumdl-0.0.112}/.rumdl.toml +0 -0
  22. {rumdl-0.0.111 → rumdl-0.0.112}/.rustfmt.toml +0 -0
  23. {rumdl-0.0.111 → rumdl-0.0.112}/LICENSE +0 -0
  24. {rumdl-0.0.111 → rumdl-0.0.112}/MANIFEST.in +0 -0
  25. {rumdl-0.0.111 → rumdl-0.0.112}/Makefile +0 -0
  26. {rumdl-0.0.111 → rumdl-0.0.112}/README.md +0 -0
  27. {rumdl-0.0.111 → rumdl-0.0.112}/assets/logo.png +0 -0
  28. {rumdl-0.0.111 → rumdl-0.0.112}/benches/fix_performance.rs +0 -0
  29. {rumdl-0.0.111 → rumdl-0.0.112}/benches/range_performance.rs +0 -0
  30. {rumdl-0.0.111 → rumdl-0.0.112}/benches/range_utils_benchmark.rs +0 -0
  31. {rumdl-0.0.111 → rumdl-0.0.112}/benches/rule_performance.rs +0 -0
  32. {rumdl-0.0.111 → rumdl-0.0.112}/benches/simple_fix_bench.rs +0 -0
  33. {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/bench_lint_context.rs +0 -0
  34. {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/benchmark.rs +0 -0
  35. {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/benchmark_rule.rs +0 -0
  36. {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/file_parallel_benchmark.rs +0 -0
  37. {rumdl-0.0.111 → rumdl-0.0.112}/benchmark/bin/measure_code_span_performance.rs +0 -0
  38. {rumdl-0.0.111 → rumdl-0.0.112}/docs/RULES.md +0 -0
  39. {rumdl-0.0.111 → rumdl-0.0.112}/docs/global-settings.md +0 -0
  40. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md001.md +0 -0
  41. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md002.md +0 -0
  42. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md003.md +0 -0
  43. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md004.md +0 -0
  44. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md005.md +0 -0
  45. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md006.md +0 -0
  46. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md007.md +0 -0
  47. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md009.md +0 -0
  48. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md010.md +0 -0
  49. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md011.md +0 -0
  50. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md012.md +0 -0
  51. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md013.md +0 -0
  52. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md014.md +0 -0
  53. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md018.md +0 -0
  54. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md019.md +0 -0
  55. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md020.md +0 -0
  56. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md021.md +0 -0
  57. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md022.md +0 -0
  58. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md023.md +0 -0
  59. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md024.md +0 -0
  60. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md025.md +0 -0
  61. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md026.md +0 -0
  62. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md027.md +0 -0
  63. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md028.md +0 -0
  64. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md029.md +0 -0
  65. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md030.md +0 -0
  66. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md031.md +0 -0
  67. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md032.md +0 -0
  68. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md033.md +0 -0
  69. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md034.md +0 -0
  70. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md035.md +0 -0
  71. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md036.md +0 -0
  72. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md037.md +0 -0
  73. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md038.md +0 -0
  74. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md039.md +0 -0
  75. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md040.md +0 -0
  76. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md041.md +0 -0
  77. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md042.md +0 -0
  78. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md043.md +0 -0
  79. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md044.md +0 -0
  80. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md045.md +0 -0
  81. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md046.md +0 -0
  82. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md047.md +0 -0
  83. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md048.md +0 -0
  84. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md049.md +0 -0
  85. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md050.md +0 -0
  86. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md051.md +0 -0
  87. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md052.md +0 -0
  88. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md053.md +0 -0
  89. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md054.md +0 -0
  90. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md055.md +0 -0
  91. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md056.md +0 -0
  92. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md057.md +0 -0
  93. {rumdl-0.0.111 → rumdl-0.0.112}/docs/md058.md +0 -0
  94. {rumdl-0.0.111 → rumdl-0.0.112}/docs/vscode-extension.md +0 -0
  95. {rumdl-0.0.111 → rumdl-0.0.112}/parity_check.py +0 -0
  96. {rumdl-0.0.111 → rumdl-0.0.112}/pyproject.toml +0 -0
  97. {rumdl-0.0.111 → rumdl-0.0.112}/python/MANIFEST.in +0 -0
  98. {rumdl-0.0.111 → rumdl-0.0.112}/python/PYTHON-README.md +0 -0
  99. {rumdl-0.0.111 → rumdl-0.0.112}/python/rumdl/__init__.py +0 -0
  100. {rumdl-0.0.111 → rumdl-0.0.112}/python/rumdl/__main__.py +0 -0
  101. {rumdl-0.0.111 → rumdl-0.0.112}/python/rumdl/py.typed +0 -0
  102. {rumdl-0.0.111 → rumdl-0.0.112}/rumdl.toml.example +0 -0
  103. {rumdl-0.0.111 → rumdl-0.0.112}/rust-toolchain.toml +0 -0
  104. {rumdl-0.0.111 → rumdl-0.0.112}/scripts/extract-changelog.sh +0 -0
  105. {rumdl-0.0.111 → rumdl-0.0.112}/scripts/prepare-release.sh +0 -0
  106. {rumdl-0.0.111 → rumdl-0.0.112}/scripts/setup-pre-commit.sh +0 -0
  107. {rumdl-0.0.111 → rumdl-0.0.112}/scripts/update-pre-commit-docs.sh +0 -0
  108. {rumdl-0.0.111 → rumdl-0.0.112}/src/config.rs +0 -0
  109. {rumdl-0.0.111 → rumdl-0.0.112}/src/exit_codes.rs +0 -0
  110. {rumdl-0.0.111 → rumdl-0.0.112}/src/inline_config.rs +0 -0
  111. {rumdl-0.0.111 → rumdl-0.0.112}/src/lib.rs +0 -0
  112. {rumdl-0.0.111 → rumdl-0.0.112}/src/lint_context.rs +0 -0
  113. {rumdl-0.0.111 → rumdl-0.0.112}/src/lsp/mod.rs +0 -0
  114. {rumdl-0.0.111 → rumdl-0.0.112}/src/lsp/server.rs +0 -0
  115. {rumdl-0.0.111 → rumdl-0.0.112}/src/lsp/types.rs +0 -0
  116. {rumdl-0.0.111 → rumdl-0.0.112}/src/main.rs +0 -0
  117. {rumdl-0.0.111 → rumdl-0.0.112}/src/markdownlint_config.rs +0 -0
  118. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/azure.rs +0 -0
  119. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/concise.rs +0 -0
  120. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/github.rs +0 -0
  121. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/gitlab.rs +0 -0
  122. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/grouped.rs +0 -0
  123. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/json.rs +0 -0
  124. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/json_lines.rs +0 -0
  125. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/junit.rs +0 -0
  126. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/mod.rs +0 -0
  127. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/pylint.rs +0 -0
  128. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/sarif.rs +0 -0
  129. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/formatters/text.rs +0 -0
  130. {rumdl-0.0.111 → rumdl-0.0.112}/src/output/mod.rs +0 -0
  131. {rumdl-0.0.111 → rumdl-0.0.112}/src/parallel.rs +0 -0
  132. {rumdl-0.0.111 → rumdl-0.0.112}/src/performance.rs +0 -0
  133. {rumdl-0.0.111 → rumdl-0.0.112}/src/profiling.rs +0 -0
  134. {rumdl-0.0.111 → rumdl-0.0.112}/src/python.rs +0 -0
  135. {rumdl-0.0.111 → rumdl-0.0.112}/src/rule.rs +0 -0
  136. {rumdl-0.0.111 → rumdl-0.0.112}/src/rule_config.rs +0 -0
  137. {rumdl-0.0.111 → rumdl-0.0.112}/src/rule_config_serde.rs +0 -0
  138. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/blockquote_utils.rs +0 -0
  139. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/code_block_utils.rs +0 -0
  140. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/code_fence_utils.rs +0 -0
  141. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/emphasis_style.rs +0 -0
  142. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/front_matter_utils.rs +0 -0
  143. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/heading_utils.rs +0 -0
  144. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/list_utils.rs +0 -0
  145. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md001_heading_increment.rs +0 -0
  146. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  147. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md002_first_heading_h1.rs +0 -0
  148. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md003_heading_style/md003_config.rs +0 -0
  149. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md003_heading_style.rs +0 -0
  150. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  151. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md004_unordered_list_style.rs +0 -0
  152. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md005_list_indent.rs +0 -0
  153. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md006_start_bullets.rs +0 -0
  154. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  155. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md007_ul_indent.rs +0 -0
  156. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  157. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md009_trailing_spaces.rs +0 -0
  158. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  159. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md010_no_hard_tabs.rs +0 -0
  160. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md011_no_reversed_links.rs +0 -0
  161. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  162. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md012_no_multiple_blanks.rs +0 -0
  163. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md013_line_length/md013_config.rs +0 -0
  164. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md013_line_length.rs +0 -0
  165. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  166. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md014_commands_show_output.rs +0 -0
  167. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md018_no_missing_space_atx.rs +0 -0
  168. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  169. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  170. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  171. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  172. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md022_blanks_around_headings.rs +0 -0
  173. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md023_heading_start_left.rs +0 -0
  174. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  175. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md024_no_duplicate_heading.rs +0 -0
  176. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md025_single_title/md025_config.rs +0 -0
  177. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md025_single_title.rs +0 -0
  178. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  179. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  180. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  181. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix/md029_config.rs +0 -0
  182. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md029_ordered_list_prefix.rs +0 -0
  183. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  184. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md030_list_marker_space.rs +0 -0
  185. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md031_blanks_around_fences.rs +0 -0
  186. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md032_blanks_around_lists.rs +0 -0
  187. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  188. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md034_no_bare_urls.rs +0 -0
  189. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md035_hr_style/md035_config.rs +0 -0
  190. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md035_hr_style.rs +0 -0
  191. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  192. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  193. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md038_no_space_in_code.rs +0 -0
  194. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md039_no_space_in_links.rs +0 -0
  195. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md040_fenced_code_language.rs +0 -0
  196. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md041_first_line_heading.rs +0 -0
  197. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md042_no_empty_links.rs +0 -0
  198. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md043_required_headings.rs +0 -0
  199. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md044_proper_names/md044_config.rs +0 -0
  200. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md044_proper_names.rs +0 -0
  201. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md045_no_alt_text/md045_config.rs +0 -0
  202. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md045_no_alt_text.rs +0 -0
  203. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  204. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md046_code_block_style.rs +0 -0
  205. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md047_single_trailing_newline.rs +0 -0
  206. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  207. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md048_code_fence_style.rs +0 -0
  208. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  209. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md049_emphasis_style.rs +0 -0
  210. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md050_strong_style/md050_config.rs +0 -0
  211. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md050_strong_style.rs +0 -0
  212. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md051_link_fragments.rs +0 -0
  213. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md052_reference_links_images.rs +0 -0
  214. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  215. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  216. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md054_link_image_style.rs +0 -0
  217. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  218. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md055_table_pipe_style.rs +0 -0
  219. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md056_table_column_count.rs +0 -0
  220. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  221. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md057_existing_relative_links.rs +0 -0
  222. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/md058_blanks_around_tables.rs +0 -0
  223. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/mod.rs +0 -0
  224. {rumdl-0.0.111 → rumdl-0.0.112}/src/rules/strong_style.rs +0 -0
  225. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/ast_utils.rs +0 -0
  226. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/code_block_utils.rs +0 -0
  227. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/document_structure.rs +0 -0
  228. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/early_returns.rs +0 -0
  229. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/element_cache.rs +0 -0
  230. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/emphasis_utils.rs +0 -0
  231. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/fix_utils.rs +0 -0
  232. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/markdown_elements.rs +0 -0
  233. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/mod.rs +0 -0
  234. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/range_utils.rs +0 -0
  235. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/regex_cache.rs +0 -0
  236. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/string_interner.rs +0 -0
  237. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/table_utils.rs +0 -0
  238. {rumdl-0.0.111 → rumdl-0.0.112}/src/utils/text_reflow.rs +0 -0
  239. {rumdl-0.0.111 → rumdl-0.0.112}/src/vscode.rs +0 -0
  240. {rumdl-0.0.111 → rumdl-0.0.112}/tests/advanced_integration_tests.rs +0 -0
  241. {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/additional_tests.rs +0 -0
  242. {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/basic_tests.rs +0 -0
  243. {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/comprehensive_tests.rs +0 -0
  244. {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/extended_tests.rs +0 -0
  245. {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/mod.rs +0 -0
  246. {rumdl-0.0.111 → rumdl-0.0.112}/tests/character_ranges/unicode_utils.rs +0 -0
  247. {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_duplication_test.rs +0 -0
  248. {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_explain_test.rs +0 -0
  249. {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_flag_precedence_test.rs +0 -0
  250. {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_integration_tests.rs +0 -0
  251. {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_lsp_fix_consistency.rs +0 -0
  252. {rumdl-0.0.111 → rumdl-0.0.112}/tests/cli_statistics_test.rs +0 -0
  253. {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/cli_test_utils.rs +0 -0
  254. {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/fixtures.rs +0 -0
  255. {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/mod.rs +0 -0
  256. {rumdl-0.0.111 → rumdl-0.0.112}/tests/common/test_utils.rs +0 -0
  257. {rumdl-0.0.111 → rumdl-0.0.112}/tests/commonmark_compliance_tests.rs +0 -0
  258. {rumdl-0.0.111 → rumdl-0.0.112}/tests/comprehensive_integration_tests.rs +0 -0
  259. {rumdl-0.0.111 → rumdl-0.0.112}/tests/comprehensive_output_format_tests.rs +0 -0
  260. {rumdl-0.0.111 → rumdl-0.0.112}/tests/config_application_tests.rs +0 -0
  261. {rumdl-0.0.111 → rumdl-0.0.112}/tests/config_file_command_test.rs +0 -0
  262. {rumdl-0.0.111 → rumdl-0.0.112}/tests/config_tests.rs +0 -0
  263. {rumdl-0.0.111 → rumdl-0.0.112}/tests/configuration_inheritance_tests.rs +0 -0
  264. {rumdl-0.0.111 → rumdl-0.0.112}/tests/consistency_regression_tests.rs +0 -0
  265. {rumdl-0.0.111 → rumdl-0.0.112}/tests/cross_platform_compatibility_tests.rs +0 -0
  266. {rumdl-0.0.111 → rumdl-0.0.112}/tests/deeply_nested_lists_performance_test.rs +0 -0
  267. {rumdl-0.0.111 → rumdl-0.0.112}/tests/escaped_brackets_test.rs +0 -0
  268. {rumdl-0.0.111 → rumdl-0.0.112}/tests/final_confidence_assessment.rs +0 -0
  269. {rumdl-0.0.111 → rumdl-0.0.112}/tests/init_command_test.rs +0 -0
  270. {rumdl-0.0.111 → rumdl-0.0.112}/tests/init_tests.rs +0 -0
  271. {rumdl-0.0.111 → rumdl-0.0.112}/tests/inline_config_blocks_test.rs +0 -0
  272. {rumdl-0.0.111 → rumdl-0.0.112}/tests/inline_config_test.rs +0 -0
  273. {rumdl-0.0.111 → rumdl-0.0.112}/tests/integration_tests.rs +0 -0
  274. {rumdl-0.0.111 → rumdl-0.0.112}/tests/json_output_test.rs +0 -0
  275. {rumdl-0.0.111 → rumdl-0.0.112}/tests/lib.rs +0 -0
  276. {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_editor_integration_tests.rs +0 -0
  277. {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_integration_tests.rs +0 -0
  278. {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_memory_leak_tests.rs +0 -0
  279. {rumdl-0.0.111 → rumdl-0.0.112}/tests/lsp_tests.rs +0 -0
  280. {rumdl-0.0.111 → rumdl-0.0.112}/tests/malformed_markdown_stress_tests.rs +0 -0
  281. {rumdl-0.0.111 → rumdl-0.0.112}/tests/markdownlint_cli_integration.rs +0 -0
  282. {rumdl-0.0.111 → rumdl-0.0.112}/tests/markdownlint_config_test.rs +0 -0
  283. {rumdl-0.0.111 → rumdl-0.0.112}/tests/markdownlintignore_test.rs +0 -0
  284. {rumdl-0.0.111 → rumdl-0.0.112}/tests/md013_reflow_integration_test.rs +0 -0
  285. {rumdl-0.0.111 → rumdl-0.0.112}/tests/nested_code_block_test.rs +0 -0
  286. {rumdl-0.0.111 → rumdl-0.0.112}/tests/output_format_integration_tests.rs +0 -0
  287. {rumdl-0.0.111 → rumdl-0.0.112}/tests/output_format_tests.rs +0 -0
  288. {rumdl-0.0.111 → rumdl-0.0.112}/tests/perf_check.rs +0 -0
  289. {rumdl-0.0.111 → rumdl-0.0.112}/tests/performance_validation_tests.rs +0 -0
  290. {rumdl-0.0.111 → rumdl-0.0.112}/tests/pyproject_config_tests.rs +0 -0
  291. {rumdl-0.0.111 → rumdl-0.0.112}/tests/python_bindings_test.rs +0 -0
  292. {rumdl-0.0.111 → rumdl-0.0.112}/tests/real_world_repository_tests.rs +0 -0
  293. {rumdl-0.0.111 → rumdl-0.0.112}/tests/regression_prevention_tests.rs +0 -0
  294. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/emphasis_edge_cases_test.rs +0 -0
  295. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/heading_edge_cases_test.rs +0 -0
  296. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/inline_content_edge_cases_test.rs +0 -0
  297. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/link_edge_cases_test.rs +0 -0
  298. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/list_rules_integration_test.rs +0 -0
  299. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md001_test.rs +0 -0
  300. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md001_unicode_test.rs +0 -0
  301. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md002_test.rs +0 -0
  302. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md003_test.rs +0 -0
  303. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md004_test.rs +0 -0
  304. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md005_test.rs +0 -0
  305. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md005_unicode_test.rs +0 -0
  306. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md006_test.rs +0 -0
  307. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md006_unicode_test.rs +0 -0
  308. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md007_test.rs +0 -0
  309. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md009_test.rs +0 -0
  310. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md010_test.rs +0 -0
  311. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md011_test.rs +0 -0
  312. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md012_test.rs +0 -0
  313. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md013_test.rs +0 -0
  314. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md014_test.rs +0 -0
  315. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md018_test.rs +0 -0
  316. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md019_test.rs +0 -0
  317. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md020_test.rs +0 -0
  318. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md021_test.rs +0 -0
  319. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md022_test.rs +0 -0
  320. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md023_extended_test.rs +0 -0
  321. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md023_test.rs +0 -0
  322. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md024_test.rs +0 -0
  323. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md025_test.rs +0 -0
  324. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md026_test.rs +0 -0
  325. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md027_test.rs +0 -0
  326. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md028_test.rs +0 -0
  327. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md029_test.rs +0 -0
  328. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md029_unicode_test.rs +0 -0
  329. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md030_test.rs +0 -0
  330. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md031_kramdown_test.rs +0 -0
  331. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md031_test.rs +0 -0
  332. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md032_test.rs +0 -0
  333. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md033_test.rs +0 -0
  334. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md034_ipv6_test.rs +0 -0
  335. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md034_test.rs +0 -0
  336. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md035_test.rs +0 -0
  337. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md036_test.rs +0 -0
  338. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md037_test.rs +0 -0
  339. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md038_nested_backticks_test.rs +0 -0
  340. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md038_test.rs +0 -0
  341. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md039_test.rs +0 -0
  342. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md040_test.rs +0 -0
  343. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md041_test.rs +0 -0
  344. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md042_test.rs +0 -0
  345. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md043_test.rs +0 -0
  346. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md044_test.rs +0 -0
  347. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md045_test.rs +0 -0
  348. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md046_test.rs +0 -0
  349. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md047_test.rs +0 -0
  350. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md048_test.rs +0 -0
  351. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md049_test.rs +0 -0
  352. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md050_test.rs +0 -0
  353. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md051_test.rs +0 -0
  354. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md051_unicode_test.rs +0 -0
  355. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md052_test.rs +0 -0
  356. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md053_additional_test.rs +0 -0
  357. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md053_proptest.rs +0 -0
  358. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md053_test.rs +0 -0
  359. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md054_test.rs +0 -0
  360. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md054_unicode_test.rs +0 -0
  361. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md055_test.rs +0 -0
  362. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md056_test.rs +0 -0
  363. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md057_test.rs +0 -0
  364. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md058_kramdown_test.rs +0 -0
  365. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules/md058_test.rs +0 -0
  366. {rumdl-0.0.111 → rumdl-0.0.112}/tests/rules_mod_test.rs +0 -0
  367. {rumdl-0.0.111 → rumdl-0.0.112}/tests/thread_safety_tests.rs +0 -0
  368. {rumdl-0.0.111 → rumdl-0.0.112}/tests/unicode_edge_case_tests.rs +0 -0
  369. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/blockquote_utils_test.rs +0 -0
  370. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/code_block_utils_extended_test.rs +0 -0
  371. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/code_block_utils_test.rs +0 -0
  372. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/core_utils_test.rs +0 -0
  373. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/front_matter_utils_test.rs +0 -0
  374. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/line_index_test.rs +0 -0
  375. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils/mod.rs +0 -0
  376. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils_markdown_edge_cases.rs +0 -0
  377. {rumdl-0.0.111 → rumdl-0.0.112}/tests/utils_tests.rs +0 -0
  378. {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_extension_fixes.rs +0 -0
  379. {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_test.rs +0 -0
  380. {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_tests.rs +0 -0
  381. {rumdl-0.0.111 → rumdl-0.0.112}/tests/vscode_windows_comprehensive_test.rs +0 -0
  382. {rumdl-0.0.111 → 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.111"
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.111"
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.111
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."
@@ -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 {
@@ -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 {
@@ -0,0 +1,252 @@
1
+ //! Utilities for handling Kramdown-specific syntax
2
+ //!
3
+ //! Kramdown is a superset of Markdown that adds additional features like
4
+ //! Inline Attribute Lists (IAL) for adding attributes to elements.
5
+
6
+ use lazy_static::lazy_static;
7
+ use regex::Regex;
8
+
9
+ lazy_static! {
10
+ /// Pattern for Kramdown span IAL: text{:.class #id key="value"}
11
+ static ref SPAN_IAL_PATTERN: Regex = Regex::new(r"\{[:\.#][^}]*\}$").unwrap();
12
+
13
+ /// Pattern for Kramdown header IDs: # Header {#custom-id}
14
+ static ref HEADER_ID_PATTERN: Regex = Regex::new(r"\s*\{#[a-zA-Z][\w\-:.]*\}\s*$").unwrap();
15
+
16
+ /// Pattern for Kramdown extensions opening: {::comment}, {::nomarkdown}, etc.
17
+ static ref EXTENSION_OPEN_PATTERN: Regex = Regex::new(r"^\s*\{::([a-z]+)(?:\s+[^}]*)?\}\s*$").unwrap();
18
+
19
+ /// Pattern for Kramdown extensions closing: {:/comment}, {:/}, etc.
20
+ static ref EXTENSION_CLOSE_PATTERN: Regex = Regex::new(r"^\s*\{:/([a-z]+)?\}\s*$").unwrap();
21
+
22
+ /// Pattern for Kramdown options: {::options key="value" /}
23
+ static ref OPTIONS_PATTERN: Regex = Regex::new(r"^\s*\{::options\s+[^}]+/\}\s*$").unwrap();
24
+
25
+ /// Pattern for footnote references: [^footnote]
26
+ static ref FOOTNOTE_REF_PATTERN: Regex = Regex::new(r"\[\^[a-zA-Z0-9_\-]+\]").unwrap();
27
+
28
+ /// Pattern for footnote definitions: [^footnote]: definition
29
+ static ref FOOTNOTE_DEF_PATTERN: Regex = Regex::new(r"^\[\^[a-zA-Z0-9_\-]+\]:").unwrap();
30
+
31
+ /// Pattern for abbreviations: *[HTML]: HyperText Markup Language
32
+ static ref ABBREVIATION_PATTERN: Regex = Regex::new(r"^\*\[[^\]]+\]:").unwrap();
33
+
34
+ /// Pattern for math blocks: $$ or $
35
+ static ref MATH_BLOCK_PATTERN: Regex = Regex::new(r"^\$\$").unwrap();
36
+ static ref MATH_INLINE_PATTERN: Regex = Regex::new(r"\$[^$]+\$").unwrap();
37
+ }
38
+
39
+ /// Check if a line is a Kramdown block attribute (IAL - Inline Attribute List)
40
+ ///
41
+ /// Kramdown IAL syntax allows adding attributes to block elements:
42
+ /// - `{:.class}` - CSS class
43
+ /// - `{:#id}` - Element ID
44
+ /// - `{:attribute="value"}` - Generic attributes
45
+ /// - `{:.class #id attribute="value"}` - Combinations
46
+ ///
47
+ /// # Examples
48
+ ///
49
+ /// ```
50
+ /// use rumdl::utils::kramdown_utils::is_kramdown_block_attribute;
51
+ ///
52
+ /// assert!(is_kramdown_block_attribute("{:.wrap}"));
53
+ /// assert!(is_kramdown_block_attribute("{:#my-id}"));
54
+ /// assert!(is_kramdown_block_attribute("{:.class #id}"));
55
+ /// assert!(is_kramdown_block_attribute("{:style=\"color: red\"}"));
56
+ ///
57
+ /// assert!(!is_kramdown_block_attribute("{just text}"));
58
+ /// assert!(!is_kramdown_block_attribute("{}"));
59
+ /// assert!(!is_kramdown_block_attribute("{"));
60
+ /// ```
61
+ pub fn is_kramdown_block_attribute(line: &str) -> bool {
62
+ let trimmed = line.trim();
63
+
64
+ // Must start with { and end with }
65
+ if !trimmed.starts_with('{') || !trimmed.ends_with('}') || trimmed.len() < 3 {
66
+ return false;
67
+ }
68
+
69
+ // Check if it matches Kramdown IAL patterns
70
+ // Valid patterns start with {: or {# or {.
71
+ let second_char = trimmed.chars().nth(1);
72
+ matches!(second_char, Some(':') | Some('#') | Some('.'))
73
+ }
74
+
75
+ /// Check if text ends with a Kramdown span IAL (inline attribute)
76
+ ///
77
+ /// # Examples
78
+ /// ```
79
+ /// use rumdl::utils::kramdown_utils::has_span_ial;
80
+ ///
81
+ /// assert!(has_span_ial("*emphasized*{:.highlight}"));
82
+ /// assert!(has_span_ial("[link](url){:target=\"_blank\"}"));
83
+ /// assert!(!has_span_ial("regular text"));
84
+ /// ```
85
+ pub fn has_span_ial(text: &str) -> bool {
86
+ SPAN_IAL_PATTERN.is_match(text.trim())
87
+ }
88
+
89
+ /// Remove span IAL from text if present
90
+ pub fn remove_span_ial(text: &str) -> &str {
91
+ if let Some(captures) = SPAN_IAL_PATTERN.find(text) {
92
+ &text[..captures.start()]
93
+ } else {
94
+ text
95
+ }
96
+ }
97
+
98
+ /// Check if a heading line has a Kramdown header ID
99
+ ///
100
+ /// # Examples
101
+ /// ```
102
+ /// use rumdl::utils::kramdown_utils::has_header_id;
103
+ ///
104
+ /// assert!(has_header_id("# Header {#custom-id}"));
105
+ /// assert!(has_header_id("## Section {#section-1}"));
106
+ /// assert!(!has_header_id("# Regular Header"));
107
+ /// ```
108
+ pub fn has_header_id(line: &str) -> bool {
109
+ HEADER_ID_PATTERN.is_match(line)
110
+ }
111
+
112
+ /// Remove header ID from a heading line if present
113
+ pub fn remove_header_id(line: &str) -> String {
114
+ HEADER_ID_PATTERN.replace(line, "").to_string()
115
+ }
116
+
117
+ /// Check if a line is a Kramdown extension opening tag
118
+ ///
119
+ /// Extensions include: comment, nomarkdown, options
120
+ pub fn is_kramdown_extension_open(line: &str) -> bool {
121
+ EXTENSION_OPEN_PATTERN.is_match(line)
122
+ }
123
+
124
+ /// Check if a line is a Kramdown extension closing tag
125
+ pub fn is_kramdown_extension_close(line: &str) -> bool {
126
+ EXTENSION_CLOSE_PATTERN.is_match(line)
127
+ }
128
+
129
+ /// Check if a line is a Kramdown options directive
130
+ pub fn is_kramdown_options(line: &str) -> bool {
131
+ OPTIONS_PATTERN.is_match(line)
132
+ }
133
+
134
+ /// Check if a line is a Kramdown extension (any type)
135
+ pub fn is_kramdown_extension(line: &str) -> bool {
136
+ is_kramdown_extension_open(line) || is_kramdown_extension_close(line) || is_kramdown_options(line)
137
+ }
138
+
139
+ /// Check if a line is an End-of-Block (EOB) marker
140
+ ///
141
+ /// In Kramdown, a line containing only `^` ends the current block
142
+ pub fn is_eob_marker(line: &str) -> bool {
143
+ line.trim() == "^"
144
+ }
145
+
146
+ /// Check if text contains a footnote reference
147
+ pub fn has_footnote_reference(text: &str) -> bool {
148
+ FOOTNOTE_REF_PATTERN.is_match(text)
149
+ }
150
+
151
+ /// Check if a line is a footnote definition
152
+ pub fn is_footnote_definition(line: &str) -> bool {
153
+ FOOTNOTE_DEF_PATTERN.is_match(line.trim_start())
154
+ }
155
+
156
+ /// Check if a line is an abbreviation definition
157
+ pub fn is_abbreviation_definition(line: &str) -> bool {
158
+ ABBREVIATION_PATTERN.is_match(line.trim_start())
159
+ }
160
+
161
+ /// Check if a line starts a math block
162
+ pub fn is_math_block_delimiter(line: &str) -> bool {
163
+ let trimmed = line.trim();
164
+ trimmed == "$$" || MATH_BLOCK_PATTERN.is_match(trimmed)
165
+ }
166
+
167
+ /// Check if text contains inline math
168
+ pub fn has_inline_math(text: &str) -> bool {
169
+ MATH_INLINE_PATTERN.is_match(text)
170
+ }
171
+
172
+ /// Check if a line is a definition list item
173
+ ///
174
+ /// Definition lists in Kramdown use the pattern:
175
+ /// ```
176
+ /// Term
177
+ /// : Definition
178
+ /// ```
179
+ pub fn is_definition_list_item(line: &str) -> bool {
180
+ let trimmed = line.trim_start();
181
+ trimmed.starts_with(": ")
182
+ || (trimmed.starts_with(':') && trimmed.len() > 1 && trimmed.chars().nth(1).is_some_and(|c| c.is_whitespace()))
183
+ }
184
+
185
+ /// Check if a line contains any Kramdown-specific syntax
186
+ pub fn has_kramdown_syntax(line: &str) -> bool {
187
+ is_kramdown_block_attribute(line)
188
+ || has_span_ial(line)
189
+ || has_header_id(line)
190
+ || is_kramdown_extension(line)
191
+ || is_eob_marker(line)
192
+ || is_footnote_definition(line)
193
+ || is_abbreviation_definition(line)
194
+ || is_math_block_delimiter(line)
195
+ || is_definition_list_item(line)
196
+ || has_footnote_reference(line)
197
+ || has_inline_math(line)
198
+ }
199
+
200
+ #[cfg(test)]
201
+ mod tests {
202
+ use super::*;
203
+
204
+ #[test]
205
+ fn test_kramdown_class_attributes() {
206
+ assert!(is_kramdown_block_attribute("{:.wrap}"));
207
+ assert!(is_kramdown_block_attribute("{:.class-name}"));
208
+ assert!(is_kramdown_block_attribute("{:.multiple .classes}"));
209
+ }
210
+
211
+ #[test]
212
+ fn test_kramdown_id_attributes() {
213
+ assert!(is_kramdown_block_attribute("{:#my-id}"));
214
+ assert!(is_kramdown_block_attribute("{:#section-1}"));
215
+ }
216
+
217
+ #[test]
218
+ fn test_kramdown_generic_attributes() {
219
+ assert!(is_kramdown_block_attribute("{:style=\"color: red\"}"));
220
+ assert!(is_kramdown_block_attribute("{:data-value=\"123\"}"));
221
+ }
222
+
223
+ #[test]
224
+ fn test_kramdown_combined_attributes() {
225
+ assert!(is_kramdown_block_attribute("{:.class #id}"));
226
+ assert!(is_kramdown_block_attribute("{:#id .class style=\"color: blue\"}"));
227
+ assert!(is_kramdown_block_attribute("{:.wrap #my-code .highlight}"));
228
+ }
229
+
230
+ #[test]
231
+ fn test_non_kramdown_braces() {
232
+ assert!(!is_kramdown_block_attribute("{just some text}"));
233
+ assert!(!is_kramdown_block_attribute("{not kramdown}"));
234
+ assert!(!is_kramdown_block_attribute("{ spaces }"));
235
+ }
236
+
237
+ #[test]
238
+ fn test_edge_cases() {
239
+ assert!(!is_kramdown_block_attribute("{}"));
240
+ assert!(!is_kramdown_block_attribute("{"));
241
+ assert!(!is_kramdown_block_attribute("}"));
242
+ assert!(!is_kramdown_block_attribute(""));
243
+ assert!(!is_kramdown_block_attribute("not braces"));
244
+ }
245
+
246
+ #[test]
247
+ fn test_whitespace_handling() {
248
+ assert!(is_kramdown_block_attribute(" {:.wrap} "));
249
+ assert!(is_kramdown_block_attribute("\t{:#id}\t"));
250
+ assert!(is_kramdown_block_attribute(" {:.class #id} "));
251
+ }
252
+ }