rumdl 0.0.85__tar.gz → 0.0.86__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 (318) hide show
  1. {rumdl-0.0.85 → rumdl-0.0.86}/CHANGELOG.md +4 -1
  2. {rumdl-0.0.85 → rumdl-0.0.86}/Cargo.lock +1 -1
  3. {rumdl-0.0.85 → rumdl-0.0.86}/Cargo.toml +1 -1
  4. {rumdl-0.0.85 → rumdl-0.0.86}/PKG-INFO +34 -1
  5. {rumdl-0.0.85 → rumdl-0.0.86}/README.md +33 -0
  6. rumdl-0.0.86/docs/vscode-extension.md +94 -0
  7. rumdl-0.0.86/src/inline_config.rs +363 -0
  8. {rumdl-0.0.85 → rumdl-0.0.86}/src/lib.rs +8 -4
  9. {rumdl-0.0.85 → rumdl-0.0.86}/src/main.rs +79 -2
  10. rumdl-0.0.86/src/vscode.rs +127 -0
  11. rumdl-0.0.86/tests/inline_config_test.rs +261 -0
  12. rumdl-0.0.86/tests/markdownlintignore_test.rs +181 -0
  13. rumdl-0.0.86/tests/vscode_test.rs +38 -0
  14. {rumdl-0.0.85 → rumdl-0.0.86}/.config/nextest.toml +0 -0
  15. {rumdl-0.0.85 → rumdl-0.0.86}/.mise.toml +0 -0
  16. {rumdl-0.0.85 → rumdl-0.0.86}/.rumdl.toml +0 -0
  17. {rumdl-0.0.85 → rumdl-0.0.86}/MANIFEST.in +0 -0
  18. {rumdl-0.0.85 → rumdl-0.0.86}/Makefile +0 -0
  19. {rumdl-0.0.85 → rumdl-0.0.86}/assets/logo.png +0 -0
  20. {rumdl-0.0.85 → rumdl-0.0.86}/benches/fix_performance.rs +0 -0
  21. {rumdl-0.0.85 → rumdl-0.0.86}/benches/range_performance.rs +0 -0
  22. {rumdl-0.0.85 → rumdl-0.0.86}/benches/range_utils_benchmark.rs +0 -0
  23. {rumdl-0.0.85 → rumdl-0.0.86}/benches/rule_performance.rs +0 -0
  24. {rumdl-0.0.85 → rumdl-0.0.86}/benches/simple_fix_bench.rs +0 -0
  25. {rumdl-0.0.85 → rumdl-0.0.86}/docs/RULES.md +0 -0
  26. {rumdl-0.0.85 → rumdl-0.0.86}/docs/global-settings.md +0 -0
  27. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md001.md +0 -0
  28. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md002.md +0 -0
  29. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md003.md +0 -0
  30. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md004.md +0 -0
  31. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md005.md +0 -0
  32. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md006.md +0 -0
  33. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md007.md +0 -0
  34. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md009.md +0 -0
  35. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md010.md +0 -0
  36. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md011.md +0 -0
  37. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md012.md +0 -0
  38. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md013.md +0 -0
  39. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md014.md +0 -0
  40. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md018.md +0 -0
  41. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md019.md +0 -0
  42. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md020.md +0 -0
  43. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md021.md +0 -0
  44. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md022.md +0 -0
  45. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md023.md +0 -0
  46. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md024.md +0 -0
  47. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md025.md +0 -0
  48. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md026.md +0 -0
  49. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md027.md +0 -0
  50. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md028.md +0 -0
  51. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md029.md +0 -0
  52. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md030.md +0 -0
  53. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md031.md +0 -0
  54. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md032.md +0 -0
  55. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md033.md +0 -0
  56. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md034.md +0 -0
  57. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md035.md +0 -0
  58. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md036.md +0 -0
  59. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md037.md +0 -0
  60. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md038.md +0 -0
  61. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md039.md +0 -0
  62. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md040.md +0 -0
  63. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md041.md +0 -0
  64. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md042.md +0 -0
  65. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md043.md +0 -0
  66. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md044.md +0 -0
  67. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md045.md +0 -0
  68. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md046.md +0 -0
  69. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md047.md +0 -0
  70. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md048.md +0 -0
  71. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md049.md +0 -0
  72. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md050.md +0 -0
  73. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md051.md +0 -0
  74. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md052.md +0 -0
  75. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md053.md +0 -0
  76. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md054.md +0 -0
  77. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md055.md +0 -0
  78. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md056.md +0 -0
  79. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md057.md +0 -0
  80. {rumdl-0.0.85 → rumdl-0.0.86}/docs/md058.md +0 -0
  81. {rumdl-0.0.85 → rumdl-0.0.86}/issues/plan-rule-parity-with-markdownlint.md +0 -0
  82. {rumdl-0.0.85 → rumdl-0.0.86}/parity_check.py +0 -0
  83. {rumdl-0.0.85 → rumdl-0.0.86}/pyproject.toml +0 -0
  84. {rumdl-0.0.85 → rumdl-0.0.86}/python/MANIFEST.in +0 -0
  85. {rumdl-0.0.85 → rumdl-0.0.86}/python/PYTHON-README.md +0 -0
  86. {rumdl-0.0.85 → rumdl-0.0.86}/python/rumdl/__init__.py +0 -0
  87. {rumdl-0.0.85 → rumdl-0.0.86}/python/rumdl/__main__.py +0 -0
  88. {rumdl-0.0.85 → rumdl-0.0.86}/python/rumdl/py.typed +0 -0
  89. {rumdl-0.0.85 → rumdl-0.0.86}/rumdl.toml.example +0 -0
  90. {rumdl-0.0.85 → rumdl-0.0.86}/rust-toolchain.toml +0 -0
  91. {rumdl-0.0.85 → rumdl-0.0.86}/scripts/extract-changelog.sh +0 -0
  92. {rumdl-0.0.85 → rumdl-0.0.86}/scripts/prepare-release.sh +0 -0
  93. {rumdl-0.0.85 → rumdl-0.0.86}/src/config.rs +0 -0
  94. {rumdl-0.0.85 → rumdl-0.0.86}/src/init.rs +0 -0
  95. {rumdl-0.0.85 → rumdl-0.0.86}/src/lint_context.rs +0 -0
  96. {rumdl-0.0.85 → rumdl-0.0.86}/src/lsp/mod.rs +0 -0
  97. {rumdl-0.0.85 → rumdl-0.0.86}/src/lsp/server.rs +0 -0
  98. {rumdl-0.0.85 → rumdl-0.0.86}/src/lsp/types.rs +0 -0
  99. {rumdl-0.0.85 → rumdl-0.0.86}/src/markdownlint_config.rs +0 -0
  100. {rumdl-0.0.85 → rumdl-0.0.86}/src/parallel.rs +0 -0
  101. {rumdl-0.0.85 → rumdl-0.0.86}/src/performance.rs +0 -0
  102. {rumdl-0.0.85 → rumdl-0.0.86}/src/profiling.rs +0 -0
  103. {rumdl-0.0.85 → rumdl-0.0.86}/src/python.rs +0 -0
  104. {rumdl-0.0.85 → rumdl-0.0.86}/src/rule.rs +0 -0
  105. {rumdl-0.0.85 → rumdl-0.0.86}/src/rule_config.rs +0 -0
  106. {rumdl-0.0.85 → rumdl-0.0.86}/src/rule_config_serde.rs +0 -0
  107. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/blockquote_utils.rs +0 -0
  108. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/code_block_utils.rs +0 -0
  109. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/code_fence_utils.rs +0 -0
  110. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/emphasis_style.rs +0 -0
  111. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/front_matter_utils.rs +0 -0
  112. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/heading_utils.rs +0 -0
  113. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/list_utils.rs +0 -0
  114. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md001_heading_increment.rs +0 -0
  115. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
  116. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md002_first_heading_h1.rs +0 -0
  117. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md003_heading_style/md003_config.rs +0 -0
  118. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md003_heading_style.rs +0 -0
  119. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
  120. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md004_unordered_list_style.rs +0 -0
  121. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md005_list_indent.rs +0 -0
  122. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md006_start_bullets.rs +0 -0
  123. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md007_ul_indent/md007_config.rs +0 -0
  124. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md007_ul_indent.rs +0 -0
  125. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
  126. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md009_trailing_spaces.rs +0 -0
  127. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
  128. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md010_no_hard_tabs.rs +0 -0
  129. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md011_no_reversed_links.rs +0 -0
  130. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
  131. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md012_no_multiple_blanks.rs +0 -0
  132. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md013_line_length/md013_config.rs +0 -0
  133. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md013_line_length.rs +0 -0
  134. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
  135. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md014_commands_show_output.rs +0 -0
  136. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md018_no_missing_space_atx.rs +0 -0
  137. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md019_no_multiple_space_atx.rs +0 -0
  138. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
  139. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
  140. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
  141. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md022_blanks_around_headings.rs +0 -0
  142. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md023_heading_start_left.rs +0 -0
  143. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
  144. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md024_no_duplicate_heading.rs +0 -0
  145. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md025_single_title/md025_config.rs +0 -0
  146. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md025_single_title.rs +0 -0
  147. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
  148. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md026_no_trailing_punctuation.rs +0 -0
  149. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
  150. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md028_no_blanks_blockquote.rs +0 -0
  151. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md029_ordered_list_prefix.rs +0 -0
  152. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
  153. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md030_list_marker_space.rs +0 -0
  154. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md031_blanks_around_fences.rs +0 -0
  155. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md032_blanks_around_lists.rs +0 -0
  156. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
  157. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md033_no_inline_html.rs +0 -0
  158. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md034_no_bare_urls.rs +0 -0
  159. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md035_hr_style/md035_config.rs +0 -0
  160. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md035_hr_style.rs +0 -0
  161. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
  162. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md036_no_emphasis_only_first.rs +0 -0
  163. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md037_spaces_around_emphasis.rs +0 -0
  164. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md038_no_space_in_code.rs +0 -0
  165. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md039_no_space_in_links.rs +0 -0
  166. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md040_fenced_code_language.rs +0 -0
  167. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md041_first_line_heading.rs +0 -0
  168. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md042_no_empty_links.rs +0 -0
  169. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md043_required_headings.rs +0 -0
  170. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md044_proper_names/md044_config.rs +0 -0
  171. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md044_proper_names.rs +0 -0
  172. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md045_no_alt_text.rs +0 -0
  173. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md046_code_block_style/md046_config.rs +0 -0
  174. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md046_code_block_style.rs +0 -0
  175. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md047_single_trailing_newline.rs +0 -0
  176. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
  177. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md048_code_fence_style.rs +0 -0
  178. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
  179. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md049_emphasis_style.rs +0 -0
  180. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md050_strong_style/md050_config.rs +0 -0
  181. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md050_strong_style.rs +0 -0
  182. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md051_link_fragments.rs +0 -0
  183. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md052_reference_links_images.rs +0 -0
  184. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md053_link_image_reference_definitions.rs +0 -0
  185. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md054_link_image_style/md054_config.rs +0 -0
  186. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md054_link_image_style.rs +0 -0
  187. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
  188. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md055_table_pipe_style.rs +0 -0
  189. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md056_table_column_count.rs +0 -0
  190. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
  191. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md057_existing_relative_links.rs +0 -0
  192. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md058_blanks_around_tables.rs +0 -0
  193. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/mod.rs +0 -0
  194. {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/strong_style.rs +0 -0
  195. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/ast_utils.rs +0 -0
  196. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/code_block_utils.rs +0 -0
  197. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/document_structure.rs +0 -0
  198. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/early_returns.rs +0 -0
  199. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/element_cache.rs +0 -0
  200. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/fix_utils.rs +0 -0
  201. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/markdown_elements.rs +0 -0
  202. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/mod.rs +0 -0
  203. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/range_utils.rs +0 -0
  204. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/regex_cache.rs +0 -0
  205. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/string_interner.rs +0 -0
  206. {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/table_utils.rs +0 -0
  207. {rumdl-0.0.85 → rumdl-0.0.86}/tests/advanced_integration_tests.rs +0 -0
  208. {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/additional_tests.rs +0 -0
  209. {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/basic_tests.rs +0 -0
  210. {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/comprehensive_tests.rs +0 -0
  211. {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/extended_tests.rs +0 -0
  212. {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/mod.rs +0 -0
  213. {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/unicode_utils.rs +0 -0
  214. {rumdl-0.0.85 → rumdl-0.0.86}/tests/cli_duplication_test.rs +0 -0
  215. {rumdl-0.0.85 → rumdl-0.0.86}/tests/cli_integration_tests.rs +0 -0
  216. {rumdl-0.0.85 → rumdl-0.0.86}/tests/cli_lsp_fix_consistency.rs +0 -0
  217. {rumdl-0.0.85 → rumdl-0.0.86}/tests/commonmark_compliance_tests.rs +0 -0
  218. {rumdl-0.0.85 → rumdl-0.0.86}/tests/comprehensive_integration_tests.rs +0 -0
  219. {rumdl-0.0.85 → rumdl-0.0.86}/tests/config_application_tests.rs +0 -0
  220. {rumdl-0.0.85 → rumdl-0.0.86}/tests/config_file_command_test.rs +0 -0
  221. {rumdl-0.0.85 → rumdl-0.0.86}/tests/config_tests.rs +0 -0
  222. {rumdl-0.0.85 → rumdl-0.0.86}/tests/configuration_inheritance_tests.rs +0 -0
  223. {rumdl-0.0.85 → rumdl-0.0.86}/tests/consistency_regression_tests.rs +0 -0
  224. {rumdl-0.0.85 → rumdl-0.0.86}/tests/cross_platform_compatibility_tests.rs +0 -0
  225. {rumdl-0.0.85 → rumdl-0.0.86}/tests/final_confidence_assessment.rs +0 -0
  226. {rumdl-0.0.85 → rumdl-0.0.86}/tests/init_command_test.rs +0 -0
  227. {rumdl-0.0.85 → rumdl-0.0.86}/tests/init_tests.rs +0 -0
  228. {rumdl-0.0.85 → rumdl-0.0.86}/tests/integration_tests.rs +0 -0
  229. {rumdl-0.0.85 → rumdl-0.0.86}/tests/json_output_test.rs +0 -0
  230. {rumdl-0.0.85 → rumdl-0.0.86}/tests/lib.rs +0 -0
  231. {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_editor_integration_tests.rs +0 -0
  232. {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_integration_tests.rs +0 -0
  233. {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_memory_leak_tests.rs +0 -0
  234. {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_tests.rs +0 -0
  235. {rumdl-0.0.85 → rumdl-0.0.86}/tests/malformed_markdown_stress_tests.rs +0 -0
  236. {rumdl-0.0.85 → rumdl-0.0.86}/tests/markdownlint_cli_integration.rs +0 -0
  237. {rumdl-0.0.85 → rumdl-0.0.86}/tests/markdownlint_config_test.rs +0 -0
  238. {rumdl-0.0.85 → rumdl-0.0.86}/tests/md030_edge_cases.md +0 -0
  239. {rumdl-0.0.85 → rumdl-0.0.86}/tests/output_format_tests.rs +0 -0
  240. {rumdl-0.0.85 → rumdl-0.0.86}/tests/perf_check.rs +0 -0
  241. {rumdl-0.0.85 → rumdl-0.0.86}/tests/performance_validation_tests.rs +0 -0
  242. {rumdl-0.0.85 → rumdl-0.0.86}/tests/pyproject_config_tests.rs +0 -0
  243. {rumdl-0.0.85 → rumdl-0.0.86}/tests/real_world_repository_tests.rs +0 -0
  244. {rumdl-0.0.85 → rumdl-0.0.86}/tests/regression_prevention_tests.rs +0 -0
  245. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md001_test.rs +0 -0
  246. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md001_unicode_test.rs +0 -0
  247. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md002_test.rs +0 -0
  248. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md003_test.rs +0 -0
  249. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md004_test.rs +0 -0
  250. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md005_test.rs +0 -0
  251. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md006_test.rs +0 -0
  252. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md006_unicode_test.rs +0 -0
  253. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md007_test.rs +0 -0
  254. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md009_test.rs +0 -0
  255. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md010_test.rs +0 -0
  256. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md011_test.rs +0 -0
  257. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md012_test.rs +0 -0
  258. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md013_test.rs +0 -0
  259. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md014_test.rs +0 -0
  260. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md018_test.rs +0 -0
  261. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md019_test.rs +0 -0
  262. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md020_test.rs +0 -0
  263. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md021_test.rs +0 -0
  264. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md022_test.rs +0 -0
  265. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md023_extended_test.rs +0 -0
  266. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md023_test.rs +0 -0
  267. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md024_test.rs +0 -0
  268. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md025_test.rs +0 -0
  269. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md026_test.rs +0 -0
  270. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md027_test.rs +0 -0
  271. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md028_test.rs +0 -0
  272. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md029_test.rs +0 -0
  273. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md030_test.rs +0 -0
  274. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md031_test.rs +0 -0
  275. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md032_test.rs +0 -0
  276. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md033_extended_test.rs +0 -0
  277. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md033_test.rs +0 -0
  278. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md034_test.rs +0 -0
  279. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md035_test.rs +0 -0
  280. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md036_test.rs +0 -0
  281. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md037_test.rs +0 -0
  282. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md038_test.rs +0 -0
  283. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md039_test.rs +0 -0
  284. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md040_test.rs +0 -0
  285. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md041_test.rs +0 -0
  286. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md042_test.rs +0 -0
  287. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md043_test.rs +0 -0
  288. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md044_test.rs +0 -0
  289. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md045_test.rs +0 -0
  290. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md046_test.rs +0 -0
  291. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md047_test.rs +0 -0
  292. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md048_test.rs +0 -0
  293. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md049_test.rs +0 -0
  294. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md050_test.rs +0 -0
  295. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md051_test.rs +0 -0
  296. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md052_test.rs +0 -0
  297. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md053_additional_test.rs +0 -0
  298. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md053_proptest.rs +0 -0
  299. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md053_test.rs +0 -0
  300. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md054_test.rs +0 -0
  301. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md054_unicode_test.rs +0 -0
  302. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md055_test.rs +0 -0
  303. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md056_test.rs +0 -0
  304. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md057_test.rs +0 -0
  305. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md058_test.rs +0 -0
  306. {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/mod.rs +0 -0
  307. {rumdl-0.0.85 → rumdl-0.0.86}/tests/thread_safety_tests.rs +0 -0
  308. {rumdl-0.0.85 → rumdl-0.0.86}/tests/unicode_edge_case_tests.rs +0 -0
  309. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/blockquote_utils_test.rs +0 -0
  310. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/code_block_utils_extended_test.rs +0 -0
  311. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/code_block_utils_test.rs +0 -0
  312. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/core_utils_test.rs +0 -0
  313. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/front_matter_utils_test.rs +0 -0
  314. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/line_index_test.rs +0 -0
  315. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/mod.rs +0 -0
  316. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils_markdown_edge_cases.rs +0 -0
  317. {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils_tests.rs +0 -0
  318. {rumdl-0.0.85 → rumdl-0.0.86}/tests/vscode_extension_fixes.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.86] - 2025-06-14
11
+
10
12
  ## [0.0.85] - 2025-06-11
11
13
 
12
14
  ## [0.0.84] - 2025-06-10
@@ -57,7 +59,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
57
59
  ### Added
58
60
  - Initial implementation of remaining rules for markdownlint parity
59
61
 
60
- [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.85...HEAD
62
+ [Unreleased]: https://github.com/rvben/rumdl/compare/v0.0.86...HEAD
63
+ [0.0.86]: https://github.com/rvben/rumdl/compare/v0.0.85...v0.0.86
61
64
  [0.0.85]: https://github.com/rvben/rumdl/compare/v0.0.84...v0.0.85
62
65
  [0.0.84]: https://github.com/rvben/rumdl/compare/v0.0.83...v0.0.84
63
66
  [0.0.84]: https://github.com/rvben/rumdl/compare/v0.0.83...v0.0.84
@@ -1753,7 +1753,7 @@ dependencies = [
1753
1753
 
1754
1754
  [[package]]
1755
1755
  name = "rumdl"
1756
- version = "0.0.85"
1756
+ version = "0.0.86"
1757
1757
  dependencies = [
1758
1758
  "anyhow",
1759
1759
  "assert_cmd",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "rumdl"
3
- version = "0.0.85"
3
+ version = "0.0.86"
4
4
  edition = "2021"
5
5
  rust-version = "1.87.0"
6
6
  description = "A fast Markdown linter written in Rust (Ru(st) MarkDown Linter)"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rumdl
3
- Version: 0.0.85
3
+ Version: 0.0.86
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Environment :: Console
6
6
  Classifier: Intended Audience :: Developers
@@ -58,6 +58,7 @@ Project-URL: Repository, https://github.com/rvben/rumdl.git
58
58
  - [Using Cargo (Rust)](#using-cargo-rust)
59
59
  - [Using pip (Python)](#using-pip-python)
60
60
  - [Download binary](#download-binary)
61
+ - [VS Code Extension](#vs-code-extension)
61
62
  - [Usage](#usage)
62
63
  - [Pre-commit Integration](#pre-commit-integration)
63
64
  - [Rules](#rules)
@@ -137,6 +138,30 @@ Invoke-WebRequest -Uri "https://github.com/rvben/rumdl/releases/latest/download/
137
138
  Expand-Archive -Path "rumdl.zip" -DestinationPath "$env:USERPROFILE\.rumdl"
138
139
  ```
139
140
 
141
+ ### VS Code Extension
142
+
143
+ For the best development experience, install the rumdl VS Code extension directly from the command line:
144
+
145
+ ```bash
146
+ # Install the VS Code extension
147
+ rumdl vscode
148
+
149
+ # Check if the extension is installed
150
+ rumdl vscode --status
151
+
152
+ # Force reinstall the extension
153
+ rumdl vscode --force
154
+ ```
155
+
156
+ The extension provides:
157
+ - 🔍 Real-time linting as you type
158
+ - 💡 Quick fixes for common issues
159
+ - 🎨 Code formatting on save
160
+ - 📋 Hover tooltips with rule documentation
161
+ - ⚡ Lightning-fast performance with zero lag
162
+
163
+ The CLI will automatically detect VS Code, Cursor, or Windsurf and install the appropriate extension. See the [VS Code extension documentation](https://github.com/rvben/rumdl/blob/main/docs/vscode-extension.md) for more details.
164
+
140
165
  ## Usage
141
166
 
142
167
  Getting started with rumdl is simple:
@@ -303,6 +328,14 @@ Start the Language Server Protocol server for editor integration
303
328
  - `--stdio`: Use stdio for communication (default)
304
329
  - `-v, --verbose`: Enable verbose logging
305
330
 
331
+ #### `vscode [OPTIONS]`
332
+
333
+ Install the rumdl VS Code extension
334
+
335
+ **Options:**
336
+ - `--force`: Force reinstall even if already installed
337
+ - `--status`: Show installation status without installing
338
+
306
339
  #### `version`
307
340
 
308
341
  Show version information
@@ -28,6 +28,7 @@
28
28
  - [Using Cargo (Rust)](#using-cargo-rust)
29
29
  - [Using pip (Python)](#using-pip-python)
30
30
  - [Download binary](#download-binary)
31
+ - [VS Code Extension](#vs-code-extension)
31
32
  - [Usage](#usage)
32
33
  - [Pre-commit Integration](#pre-commit-integration)
33
34
  - [Rules](#rules)
@@ -107,6 +108,30 @@ Invoke-WebRequest -Uri "https://github.com/rvben/rumdl/releases/latest/download/
107
108
  Expand-Archive -Path "rumdl.zip" -DestinationPath "$env:USERPROFILE\.rumdl"
108
109
  ```
109
110
 
111
+ ### VS Code Extension
112
+
113
+ For the best development experience, install the rumdl VS Code extension directly from the command line:
114
+
115
+ ```bash
116
+ # Install the VS Code extension
117
+ rumdl vscode
118
+
119
+ # Check if the extension is installed
120
+ rumdl vscode --status
121
+
122
+ # Force reinstall the extension
123
+ rumdl vscode --force
124
+ ```
125
+
126
+ The extension provides:
127
+ - 🔍 Real-time linting as you type
128
+ - 💡 Quick fixes for common issues
129
+ - 🎨 Code formatting on save
130
+ - 📋 Hover tooltips with rule documentation
131
+ - ⚡ Lightning-fast performance with zero lag
132
+
133
+ The CLI will automatically detect VS Code, Cursor, or Windsurf and install the appropriate extension. See the [VS Code extension documentation](https://github.com/rvben/rumdl/blob/main/docs/vscode-extension.md) for more details.
134
+
110
135
  ## Usage
111
136
 
112
137
  Getting started with rumdl is simple:
@@ -273,6 +298,14 @@ Start the Language Server Protocol server for editor integration
273
298
  - `--stdio`: Use stdio for communication (default)
274
299
  - `-v, --verbose`: Enable verbose logging
275
300
 
301
+ #### `vscode [OPTIONS]`
302
+
303
+ Install the rumdl VS Code extension
304
+
305
+ **Options:**
306
+ - `--force`: Force reinstall even if already installed
307
+ - `--status`: Show installation status without installing
308
+
276
309
  #### `version`
277
310
 
278
311
  Show version information
@@ -0,0 +1,94 @@
1
+ # Rumdl VS Code Extension
2
+
3
+ The rumdl VS Code extension provides real-time Markdown linting directly in your editor, powered by the same fast Rust-based engine as the rumdl CLI. With the new `rumdl vscode` command, you can install and manage the extension directly from your terminal.
4
+
5
+ ## Installation
6
+
7
+ ### Method 1: Using the rumdl CLI (Recommended)
8
+
9
+ If you have rumdl installed, you can install the VS Code extension directly from the command line:
10
+
11
+ ```bash
12
+ # Install the extension
13
+ rumdl vscode
14
+
15
+ # Check installation status
16
+ rumdl vscode --status
17
+
18
+ # Force reinstall if needed
19
+ rumdl vscode --force
20
+ ```
21
+
22
+ ### Method 2: From VS Code Marketplace
23
+
24
+ 1. Open VS Code
25
+ 2. Go to Extensions (Ctrl/Cmd+Shift+X)
26
+ 3. Search for "rumdl"
27
+ 4. Click Install
28
+
29
+ ### Method 3: From Command Line
30
+
31
+ ```bash
32
+ code --install-extension rvben.rumdl
33
+ ```
34
+
35
+ ## Features
36
+
37
+ - **Real-time Linting**: Get instant feedback on Markdown issues as you type
38
+ - **Quick Fixes**: One-click fixes for auto-fixable violations
39
+ - **Full Rule Coverage**: All 50+ rumdl rules with proper categorization
40
+ - **High Performance**: 5x faster than markdownlint
41
+ - **Configuration Support**: Respects your `.rumdl.toml` configuration files
42
+ - **Easy Installation**: Install directly from the CLI with `rumdl vscode`
43
+ - **Multiple Editor Support**: Works with VS Code, Cursor, and Windsurf
44
+
45
+ ## Requirements
46
+
47
+ - VS Code 1.74.0 or higher
48
+ - rumdl CLI (optional, but recommended for full functionality)
49
+
50
+ ## Configuration
51
+
52
+ The extension will automatically detect and use your project's `.rumdl.toml` configuration file. You can also configure the extension through VS Code settings:
53
+
54
+ ```json
55
+ {
56
+ "rumdl.enable": true,
57
+ "rumdl.configPath": ".rumdl.toml",
58
+ "rumdl.server.logLevel": "info"
59
+ }
60
+ ```
61
+
62
+ ## Troubleshooting
63
+
64
+ ### Extension Not Working
65
+
66
+ 1. Check if the extension is installed:
67
+ ```bash
68
+ rumdl vscode --status
69
+ ```
70
+
71
+ 2. Ensure VS Code's `code` command is in your PATH:
72
+ - On macOS: Open VS Code, press Cmd+Shift+P, and run "Shell Command: Install 'code' command in PATH"
73
+ - On Windows: This should be automatic during VS Code installation
74
+ - On Linux: Add VS Code's bin directory to your PATH
75
+
76
+ 3. Check the extension logs:
77
+ - Open VS Code's Output panel (View → Output)
78
+ - Select "rumdl" from the dropdown
79
+
80
+ ### VS Code Not Found
81
+
82
+ If you get a "VS Code not found" error, make sure:
83
+
84
+ 1. VS Code is installed
85
+ 2. The `code` command is available in your terminal:
86
+ ```bash
87
+ code --version
88
+ ```
89
+
90
+ ## Related Links
91
+
92
+ - [rumdl GitHub Repository](https://github.com/rvben/rumdl)
93
+ - [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=rumdl.rumdl)
94
+ - [Configuration Guide](./global-settings.md)
@@ -0,0 +1,363 @@
1
+ //! Inline configuration comment handling for markdownlint compatibility
2
+ //!
3
+ //! Supports:
4
+ //! - `<!-- markdownlint-disable -->` - Disable all rules from this point
5
+ //! - `<!-- markdownlint-enable -->` - Re-enable all rules from this point
6
+ //! - `<!-- markdownlint-disable MD001 MD002 -->` - Disable specific rules
7
+ //! - `<!-- markdownlint-enable MD001 MD002 -->` - Re-enable specific rules
8
+ //! - `<!-- markdownlint-disable-line MD001 -->` - Disable rules for current line
9
+ //! - `<!-- markdownlint-disable-next-line MD001 -->` - Disable rules for next line
10
+ //! - `<!-- markdownlint-capture -->` - Capture current configuration state
11
+ //! - `<!-- markdownlint-restore -->` - Restore captured configuration state
12
+ //!
13
+ //! Also supports rumdl-specific syntax with same semantics.
14
+
15
+ use std::collections::{HashMap, HashSet};
16
+
17
+ #[derive(Debug, Clone)]
18
+ pub struct InlineConfig {
19
+ /// Rules that are disabled at each line (1-indexed line -> set of disabled rules)
20
+ disabled_at_line: HashMap<usize, HashSet<String>>,
21
+ /// Rules disabled for specific lines via disable-line (1-indexed)
22
+ line_disabled_rules: HashMap<usize, HashSet<String>>,
23
+ }
24
+
25
+ impl InlineConfig {
26
+ pub fn new() -> Self {
27
+ Self {
28
+ disabled_at_line: HashMap::new(),
29
+ line_disabled_rules: HashMap::new(),
30
+ }
31
+ }
32
+
33
+ /// Process all inline comments in the content and return the configuration state
34
+ pub fn from_content(content: &str) -> Self {
35
+ let mut config = Self::new();
36
+ let lines: Vec<&str> = content.lines().collect();
37
+
38
+ // Track current state of disabled rules
39
+ let mut currently_disabled = HashSet::new();
40
+ let mut capture_stack: Vec<HashSet<String>> = Vec::new();
41
+
42
+ for (idx, line) in lines.iter().enumerate() {
43
+ let line_num = idx + 1; // 1-indexed
44
+
45
+ // Store the current state for this line BEFORE processing comments
46
+ // This way, comments on a line don't affect that same line
47
+ config.disabled_at_line.insert(line_num, currently_disabled.clone());
48
+
49
+ // Process comments in order of specificity to avoid conflicts
50
+
51
+ // Check for disable-next-line first (more specific than disable)
52
+ if let Some(rules) = parse_disable_next_line_comment(line) {
53
+ let next_line = line_num + 1;
54
+ let line_rules = config.line_disabled_rules.entry(next_line).or_insert_with(HashSet::new);
55
+ if rules.is_empty() {
56
+ // Disable all rules for next line
57
+ line_rules.insert("*".to_string());
58
+ } else {
59
+ for rule in rules {
60
+ line_rules.insert(rule.to_string());
61
+ }
62
+ }
63
+ }
64
+ // Check for disable-line (more specific than disable)
65
+ else if let Some(rules) = parse_disable_line_comment(line) {
66
+ let line_rules = config.line_disabled_rules.entry(line_num).or_insert_with(HashSet::new);
67
+ if rules.is_empty() {
68
+ // Disable all rules for current line
69
+ line_rules.insert("*".to_string());
70
+ } else {
71
+ for rule in rules {
72
+ line_rules.insert(rule.to_string());
73
+ }
74
+ }
75
+ }
76
+ // Check for capture
77
+ else if is_capture_comment(line) {
78
+ capture_stack.push(currently_disabled.clone());
79
+ }
80
+ // Check for restore
81
+ else if is_restore_comment(line) {
82
+ if let Some(captured) = capture_stack.pop() {
83
+ currently_disabled = captured;
84
+ }
85
+ }
86
+ // Check for disable (persistent)
87
+ else if let Some(rules) = parse_disable_comment(line) {
88
+ if rules.is_empty() {
89
+ // Disable all rules - we'll use "*" as a marker
90
+ currently_disabled.clear();
91
+ currently_disabled.insert("*".to_string());
92
+ } else {
93
+ for rule in rules {
94
+ currently_disabled.insert(rule.to_string());
95
+ }
96
+ }
97
+ }
98
+ // Check for enable (persistent)
99
+ else if let Some(rules) = parse_enable_comment(line) {
100
+ if rules.is_empty() {
101
+ // Enable all rules
102
+ currently_disabled.clear();
103
+ } else {
104
+ // Enable specific rules
105
+ for rule in rules {
106
+ currently_disabled.remove(rule);
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ config
113
+ }
114
+
115
+ /// Check if a rule is disabled at a specific line
116
+ pub fn is_rule_disabled(&self, rule_name: &str, line_number: usize) -> bool {
117
+ // Check line-specific disables first (disable-line, disable-next-line)
118
+ if let Some(line_rules) = self.line_disabled_rules.get(&line_number) {
119
+ if line_rules.contains("*") || line_rules.contains(rule_name) {
120
+ return true;
121
+ }
122
+ }
123
+
124
+ // Check persistent disables at this line
125
+ if let Some(disabled_set) = self.disabled_at_line.get(&line_number) {
126
+ disabled_set.contains("*") || disabled_set.contains(rule_name)
127
+ } else {
128
+ false
129
+ }
130
+ }
131
+
132
+ /// Get all disabled rules at a specific line
133
+ pub fn get_disabled_rules(&self, line_number: usize) -> HashSet<String> {
134
+ let mut disabled = HashSet::new();
135
+
136
+ // Add persistent disables
137
+ if let Some(disabled_set) = self.disabled_at_line.get(&line_number) {
138
+ for rule in disabled_set {
139
+ disabled.insert(rule.clone());
140
+ }
141
+ }
142
+
143
+ // Add line-specific disables
144
+ if let Some(line_rules) = self.line_disabled_rules.get(&line_number) {
145
+ for rule in line_rules {
146
+ disabled.insert(rule.clone());
147
+ }
148
+ }
149
+
150
+ disabled
151
+ }
152
+ }
153
+
154
+ /// Parse a disable comment and return the list of rules (empty vec means all rules)
155
+ pub fn parse_disable_comment(line: &str) -> Option<Vec<&str>> {
156
+ // Check for both rumdl-disable and markdownlint-disable
157
+ for prefix in &["<!-- rumdl-disable", "<!-- markdownlint-disable"] {
158
+ if let Some(start) = line.find(prefix) {
159
+ let after_prefix = &line[start + prefix.len()..];
160
+
161
+ // Global disable: <!-- markdownlint-disable -->
162
+ if after_prefix.trim_start().starts_with("-->") {
163
+ return Some(Vec::new()); // Empty vec means all rules
164
+ }
165
+
166
+ // Rule-specific disable: <!-- markdownlint-disable MD001 MD002 -->
167
+ if let Some(end) = after_prefix.find("-->") {
168
+ let rules_str = after_prefix[..end].trim();
169
+ if !rules_str.is_empty() {
170
+ let rules: Vec<&str> = rules_str.split_whitespace().collect();
171
+ return Some(rules);
172
+ }
173
+ }
174
+ }
175
+ }
176
+
177
+ None
178
+ }
179
+
180
+ /// Parse an enable comment and return the list of rules (empty vec means all rules)
181
+ pub fn parse_enable_comment(line: &str) -> Option<Vec<&str>> {
182
+ // Check for both rumdl-enable and markdownlint-enable
183
+ for prefix in &["<!-- rumdl-enable", "<!-- markdownlint-enable"] {
184
+ if let Some(start) = line.find(prefix) {
185
+ let after_prefix = &line[start + prefix.len()..];
186
+
187
+ // Global enable: <!-- markdownlint-enable -->
188
+ if after_prefix.trim_start().starts_with("-->") {
189
+ return Some(Vec::new()); // Empty vec means all rules
190
+ }
191
+
192
+ // Rule-specific enable: <!-- markdownlint-enable MD001 MD002 -->
193
+ if let Some(end) = after_prefix.find("-->") {
194
+ let rules_str = after_prefix[..end].trim();
195
+ if !rules_str.is_empty() {
196
+ let rules: Vec<&str> = rules_str.split_whitespace().collect();
197
+ return Some(rules);
198
+ }
199
+ }
200
+ }
201
+ }
202
+
203
+ None
204
+ }
205
+
206
+ /// Parse a disable-line comment
207
+ pub fn parse_disable_line_comment(line: &str) -> Option<Vec<&str>> {
208
+ // Check for both rumdl and markdownlint variants
209
+ for prefix in &["<!-- rumdl-disable-line", "<!-- markdownlint-disable-line"] {
210
+ if let Some(start) = line.find(prefix) {
211
+ let after_prefix = &line[start + prefix.len()..];
212
+
213
+ // Global disable-line: <!-- markdownlint-disable-line -->
214
+ if after_prefix.trim_start().starts_with("-->") {
215
+ return Some(Vec::new()); // Empty vec means all rules
216
+ }
217
+
218
+ // Rule-specific disable-line: <!-- markdownlint-disable-line MD001 MD002 -->
219
+ if let Some(end) = after_prefix.find("-->") {
220
+ let rules_str = after_prefix[..end].trim();
221
+ if !rules_str.is_empty() {
222
+ let rules: Vec<&str> = rules_str.split_whitespace().collect();
223
+ return Some(rules);
224
+ }
225
+ }
226
+ }
227
+ }
228
+
229
+ None
230
+ }
231
+
232
+ /// Parse a disable-next-line comment
233
+ pub fn parse_disable_next_line_comment(line: &str) -> Option<Vec<&str>> {
234
+ // Check for both rumdl and markdownlint variants
235
+ for prefix in &["<!-- rumdl-disable-next-line", "<!-- markdownlint-disable-next-line"] {
236
+ if let Some(start) = line.find(prefix) {
237
+ let after_prefix = &line[start + prefix.len()..];
238
+
239
+ // Global disable-next-line: <!-- markdownlint-disable-next-line -->
240
+ if after_prefix.trim_start().starts_with("-->") {
241
+ return Some(Vec::new()); // Empty vec means all rules
242
+ }
243
+
244
+ // Rule-specific disable-next-line: <!-- markdownlint-disable-next-line MD001 MD002 -->
245
+ if let Some(end) = after_prefix.find("-->") {
246
+ let rules_str = after_prefix[..end].trim();
247
+ if !rules_str.is_empty() {
248
+ let rules: Vec<&str> = rules_str.split_whitespace().collect();
249
+ return Some(rules);
250
+ }
251
+ }
252
+ }
253
+ }
254
+
255
+ None
256
+ }
257
+
258
+ /// Check if line contains a capture comment
259
+ pub fn is_capture_comment(line: &str) -> bool {
260
+ line.contains("<!-- markdownlint-capture -->") || line.contains("<!-- rumdl-capture -->")
261
+ }
262
+
263
+ /// Check if line contains a restore comment
264
+ pub fn is_restore_comment(line: &str) -> bool {
265
+ line.contains("<!-- markdownlint-restore -->") || line.contains("<!-- rumdl-restore -->")
266
+ }
267
+
268
+ #[cfg(test)]
269
+ mod tests {
270
+ use super::*;
271
+
272
+ #[test]
273
+ fn test_parse_disable_comment() {
274
+ // Global disable
275
+ assert_eq!(parse_disable_comment("<!-- markdownlint-disable -->"), Some(vec![]));
276
+ assert_eq!(parse_disable_comment("<!-- rumdl-disable -->"), Some(vec![]));
277
+
278
+ // Specific rules
279
+ assert_eq!(
280
+ parse_disable_comment("<!-- markdownlint-disable MD001 MD002 -->"),
281
+ Some(vec!["MD001", "MD002"])
282
+ );
283
+
284
+ // No comment
285
+ assert_eq!(parse_disable_comment("Some regular text"), None);
286
+ }
287
+
288
+ #[test]
289
+ fn test_parse_disable_line_comment() {
290
+ // Global disable-line
291
+ assert_eq!(parse_disable_line_comment("<!-- markdownlint-disable-line -->"), Some(vec![]));
292
+
293
+ // Specific rules
294
+ assert_eq!(
295
+ parse_disable_line_comment("<!-- markdownlint-disable-line MD013 -->"),
296
+ Some(vec!["MD013"])
297
+ );
298
+
299
+ // No comment
300
+ assert_eq!(parse_disable_line_comment("Some regular text"), None);
301
+ }
302
+
303
+ #[test]
304
+ fn test_inline_config_from_content() {
305
+ let content = r#"# Test Document
306
+
307
+ <!-- markdownlint-disable MD013 -->
308
+ This is a very long line that would normally trigger MD013 but it's disabled
309
+
310
+ <!-- markdownlint-enable MD013 -->
311
+ This line will be checked again
312
+
313
+ <!-- markdownlint-disable-next-line MD001 -->
314
+ # This heading will not be checked for MD001
315
+ ## But this one will
316
+
317
+ Some text <!-- markdownlint-disable-line MD013 -->
318
+
319
+ <!-- markdownlint-capture -->
320
+ <!-- markdownlint-disable MD001 MD002 -->
321
+ # Heading with MD001 disabled
322
+ <!-- markdownlint-restore -->
323
+ # Heading with MD001 enabled again
324
+ "#;
325
+
326
+ let config = InlineConfig::from_content(content);
327
+
328
+ // Line 4 should have MD013 disabled (line after disable comment on line 3)
329
+ assert!(config.is_rule_disabled("MD013", 4));
330
+
331
+ // Line 7 should have MD013 enabled (line after enable comment on line 6)
332
+ assert!(!config.is_rule_disabled("MD013", 7));
333
+
334
+ // Line 10 should have MD001 disabled (from disable-next-line on line 9)
335
+ assert!(config.is_rule_disabled("MD001", 10));
336
+
337
+ // Line 11 should not have MD001 disabled
338
+ assert!(!config.is_rule_disabled("MD001", 11));
339
+
340
+ // Line 13 should have MD013 disabled (from disable-line)
341
+ assert!(config.is_rule_disabled("MD013", 13));
342
+
343
+ // After restore (line 18), MD001 should be enabled again on line 19
344
+ assert!(!config.is_rule_disabled("MD001", 19));
345
+ }
346
+
347
+ #[test]
348
+ fn test_capture_restore() {
349
+ let content = r#"<!-- markdownlint-disable MD001 -->
350
+ <!-- markdownlint-capture -->
351
+ <!-- markdownlint-disable MD002 MD003 -->
352
+ <!-- markdownlint-restore -->
353
+ Some content after restore
354
+ "#;
355
+
356
+ let config = InlineConfig::from_content(content);
357
+
358
+ // After restore (line 4), line 5 should only have MD001 disabled
359
+ assert!(config.is_rule_disabled("MD001", 5));
360
+ assert!(!config.is_rule_disabled("MD002", 5));
361
+ assert!(!config.is_rule_disabled("MD003", 5));
362
+ }
363
+ }
@@ -1,5 +1,6 @@
1
1
  pub mod config;
2
2
  pub mod init;
3
+ pub mod inline_config;
3
4
  pub mod lint_context;
4
5
  pub mod lsp;
5
6
  pub mod markdownlint_config;
@@ -7,6 +8,7 @@ pub mod parallel;
7
8
  pub mod performance;
8
9
  pub mod profiling;
9
10
  pub mod rule;
11
+ pub mod vscode;
10
12
  #[macro_use]
11
13
  pub mod rule_config;
12
14
  #[macro_use]
@@ -131,6 +133,9 @@ pub fn lint(content: &str, rules: &[Box<dyn Rule>], _verbose: bool) -> LintResul
131
133
  return Ok(warnings);
132
134
  }
133
135
 
136
+ // Parse inline configuration comments once
137
+ let inline_config = crate::inline_config::InlineConfig::from_content(content);
138
+
134
139
  // Analyze content characteristics for rule filtering
135
140
  let characteristics = ContentCharacteristics::analyze(content);
136
141
 
@@ -186,14 +191,13 @@ pub fn lint(content: &str, rules: &[Box<dyn Rule>], _verbose: bool) -> LintResul
186
191
 
187
192
  match result {
188
193
  Ok(rule_warnings) => {
189
- // Filter out warnings for rules disabled via comments
194
+ // Filter out warnings for rules disabled via inline comments
190
195
  let filtered_warnings: Vec<_> = rule_warnings
191
196
  .into_iter()
192
197
  .filter(|warning| {
193
- !crate::rule::is_rule_disabled_at_line(
194
- content,
198
+ !inline_config.is_rule_disabled(
195
199
  rule.name(),
196
- warning.line.saturating_sub(1), // Convert to 0-based line index
200
+ warning.line, // Already 1-indexed
197
201
  )
198
202
  })
199
203
  .collect();