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.
- {rumdl-0.0.85 → rumdl-0.0.86}/CHANGELOG.md +4 -1
- {rumdl-0.0.85 → rumdl-0.0.86}/Cargo.lock +1 -1
- {rumdl-0.0.85 → rumdl-0.0.86}/Cargo.toml +1 -1
- {rumdl-0.0.85 → rumdl-0.0.86}/PKG-INFO +34 -1
- {rumdl-0.0.85 → rumdl-0.0.86}/README.md +33 -0
- rumdl-0.0.86/docs/vscode-extension.md +94 -0
- rumdl-0.0.86/src/inline_config.rs +363 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/lib.rs +8 -4
- {rumdl-0.0.85 → rumdl-0.0.86}/src/main.rs +79 -2
- rumdl-0.0.86/src/vscode.rs +127 -0
- rumdl-0.0.86/tests/inline_config_test.rs +261 -0
- rumdl-0.0.86/tests/markdownlintignore_test.rs +181 -0
- rumdl-0.0.86/tests/vscode_test.rs +38 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/.config/nextest.toml +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/.mise.toml +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/.rumdl.toml +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/MANIFEST.in +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/Makefile +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/assets/logo.png +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/benches/fix_performance.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/benches/range_performance.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/benches/range_utils_benchmark.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/benches/rule_performance.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/benches/simple_fix_bench.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/RULES.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/global-settings.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md001.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md002.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md003.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md004.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md005.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md006.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md007.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md009.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md010.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md011.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md012.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md013.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md014.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md018.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md019.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md020.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md021.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md022.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md023.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md024.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md025.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md026.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md027.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md028.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md029.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md030.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md031.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md032.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md033.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md034.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md035.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md036.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md037.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md038.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md039.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md040.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md041.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md042.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md043.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md044.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md045.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md046.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md047.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md048.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md049.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md050.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md051.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md052.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md053.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md054.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md055.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md056.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md057.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/docs/md058.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/issues/plan-rule-parity-with-markdownlint.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/parity_check.py +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/pyproject.toml +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/python/MANIFEST.in +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/python/PYTHON-README.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/python/rumdl/__init__.py +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/python/rumdl/__main__.py +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/python/rumdl/py.typed +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/rumdl.toml.example +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/rust-toolchain.toml +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/scripts/extract-changelog.sh +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/scripts/prepare-release.sh +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/init.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/lint_context.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/lsp/mod.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/lsp/server.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/lsp/types.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/markdownlint_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/parallel.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/performance.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/profiling.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/python.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rule.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rule_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rule_config_serde.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/blockquote_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/code_block_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/code_fence_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/emphasis_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/front_matter_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/heading_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/list_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md001_heading_increment.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md002_first_heading_h1/md002_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md002_first_heading_h1.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md003_heading_style/md003_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md003_heading_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md004_unordered_list_style/md004_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md004_unordered_list_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md005_list_indent.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md006_start_bullets.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md007_ul_indent/md007_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md007_ul_indent.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md009_trailing_spaces/md009_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md009_trailing_spaces.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md010_no_hard_tabs/md010_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md010_no_hard_tabs.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md011_no_reversed_links.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md012_no_multiple_blanks/md012_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md012_no_multiple_blanks.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md013_line_length/md013_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md013_line_length.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md014_commands_show_output/md014_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md014_commands_show_output.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md018_no_missing_space_atx.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md019_no_multiple_space_atx.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md020_no_missing_space_closed_atx.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md021_no_multiple_space_closed_atx.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md022_blanks_around_headings/md022_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md022_blanks_around_headings.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md023_heading_start_left.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md024_no_duplicate_heading/md024_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md024_no_duplicate_heading.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md025_single_title/md025_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md025_single_title.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md026_no_trailing_punctuation/md026_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md026_no_trailing_punctuation.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md027_multiple_spaces_blockquote.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md028_no_blanks_blockquote.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md029_ordered_list_prefix.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md030_list_marker_space/md030_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md030_list_marker_space.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md031_blanks_around_fences.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md032_blanks_around_lists.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md033_no_inline_html/md033_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md033_no_inline_html.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md034_no_bare_urls.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md035_hr_style/md035_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md035_hr_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md036_no_emphasis_only_first/md036_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md036_no_emphasis_only_first.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md037_spaces_around_emphasis.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md038_no_space_in_code.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md039_no_space_in_links.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md040_fenced_code_language.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md041_first_line_heading.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md042_no_empty_links.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md043_required_headings.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md044_proper_names/md044_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md044_proper_names.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md045_no_alt_text.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md046_code_block_style/md046_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md046_code_block_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md047_single_trailing_newline.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md048_code_fence_style/md048_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md048_code_fence_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md049_emphasis_style/md049_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md049_emphasis_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md050_strong_style/md050_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md050_strong_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md051_link_fragments.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md052_reference_links_images.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md053_link_image_reference_definitions.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md054_link_image_style/md054_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md054_link_image_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md055_table_pipe_style/md055_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md055_table_pipe_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md056_table_column_count.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md057_existing_relative_links/md057_config.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md057_existing_relative_links.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/md058_blanks_around_tables.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/mod.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/rules/strong_style.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/ast_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/code_block_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/document_structure.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/early_returns.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/element_cache.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/fix_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/markdown_elements.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/mod.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/range_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/regex_cache.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/string_interner.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/src/utils/table_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/advanced_integration_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/additional_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/basic_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/comprehensive_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/extended_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/mod.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/character_ranges/unicode_utils.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/cli_duplication_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/cli_integration_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/cli_lsp_fix_consistency.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/commonmark_compliance_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/comprehensive_integration_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/config_application_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/config_file_command_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/config_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/configuration_inheritance_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/consistency_regression_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/cross_platform_compatibility_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/final_confidence_assessment.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/init_command_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/init_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/integration_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/json_output_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/lib.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_editor_integration_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_integration_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_memory_leak_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/lsp_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/malformed_markdown_stress_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/markdownlint_cli_integration.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/markdownlint_config_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/md030_edge_cases.md +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/output_format_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/perf_check.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/performance_validation_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/pyproject_config_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/real_world_repository_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/regression_prevention_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md001_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md001_unicode_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md002_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md003_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md004_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md005_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md006_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md006_unicode_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md007_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md009_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md010_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md011_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md012_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md013_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md014_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md018_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md019_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md020_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md021_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md022_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md023_extended_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md023_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md024_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md025_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md026_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md027_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md028_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md029_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md030_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md031_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md032_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md033_extended_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md033_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md034_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md035_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md036_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md037_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md038_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md039_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md040_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md041_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md042_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md043_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md044_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md045_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md046_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md047_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md048_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md049_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md050_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md051_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md052_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md053_additional_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md053_proptest.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md053_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md054_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md054_unicode_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md055_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md056_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md057_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/md058_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/rules/mod.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/thread_safety_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/unicode_edge_case_tests.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/blockquote_utils_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/code_block_utils_extended_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/code_block_utils_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/core_utils_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/front_matter_utils_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/line_index_test.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils/mod.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils_markdown_edge_cases.rs +0 -0
- {rumdl-0.0.85 → rumdl-0.0.86}/tests/utils_tests.rs +0 -0
- {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.
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rumdl
|
|
3
|
-
Version: 0.0.
|
|
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
|
-
!
|
|
194
|
-
content,
|
|
198
|
+
!inline_config.is_rule_disabled(
|
|
195
199
|
rule.name(),
|
|
196
|
-
warning.line
|
|
200
|
+
warning.line, // Already 1-indexed
|
|
197
201
|
)
|
|
198
202
|
})
|
|
199
203
|
.collect();
|